21843 lines
1.5 MiB
21843 lines
1.5 MiB
var __create = Object.create;
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __getProtoOf = Object.getPrototypeOf;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
var __commonJS = (cb, mod) => function __require() {
|
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
};
|
|
var __export = (target, all) => {
|
|
for (var name in all)
|
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
};
|
|
var __copyProps = (to2, from2, except, desc) => {
|
|
if (from2 && typeof from2 === "object" || typeof from2 === "function") {
|
|
for (let key of __getOwnPropNames(from2))
|
|
if (!__hasOwnProp.call(to2, key) && key !== except)
|
|
__defProp(to2, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable });
|
|
}
|
|
return to2;
|
|
};
|
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
// If the importer is in node compatibility mode or this is not an ESM
|
|
// file that has been converted to a CommonJS file using a Babel-
|
|
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
mod
|
|
));
|
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
var __publicField = (obj, key, value) => {
|
|
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
return value;
|
|
};
|
|
|
|
// node_modules/.pnpm/pagerank.js@1.0.2/node_modules/pagerank.js/lib/index.js
|
|
var require_lib = __commonJS({
|
|
"node_modules/.pnpm/pagerank.js@1.0.2/node_modules/pagerank.js/lib/index.js"(exports, module2) {
|
|
"use strict";
|
|
function forOwn(object, callback2) {
|
|
if (typeof object === "object" && typeof callback2 === "function") {
|
|
for (var key in object) {
|
|
if (object.hasOwnProperty(key) === true) {
|
|
if (callback2(key, object[key]) === false) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
module2.exports = function() {
|
|
var self = {
|
|
count: 0,
|
|
edges: {},
|
|
nodes: {}
|
|
};
|
|
self.link = function(source, target, weight) {
|
|
if (isFinite(weight) !== true || weight === null) {
|
|
weight = 1;
|
|
}
|
|
weight = parseFloat(weight);
|
|
if (self.nodes.hasOwnProperty(source) !== true) {
|
|
self.count++;
|
|
self.nodes[source] = {
|
|
weight: 0,
|
|
outbound: 0
|
|
};
|
|
}
|
|
self.nodes[source].outbound += weight;
|
|
if (self.nodes.hasOwnProperty(target) !== true) {
|
|
self.count++;
|
|
self.nodes[target] = {
|
|
weight: 0,
|
|
outbound: 0
|
|
};
|
|
}
|
|
if (self.edges.hasOwnProperty(source) !== true) {
|
|
self.edges[source] = {};
|
|
}
|
|
if (self.edges[source].hasOwnProperty(target) !== true) {
|
|
self.edges[source][target] = 0;
|
|
}
|
|
self.edges[source][target] += weight;
|
|
};
|
|
self.rank = function(alpha2, epsilon, callback2) {
|
|
var delta = 1, inverse = 1 / self.count;
|
|
forOwn(self.edges, function(source) {
|
|
if (self.nodes[source].outbound > 0) {
|
|
forOwn(self.edges[source], function(target) {
|
|
self.edges[source][target] /= self.nodes[source].outbound;
|
|
});
|
|
}
|
|
});
|
|
forOwn(self.nodes, function(key) {
|
|
self.nodes[key].weight = inverse;
|
|
});
|
|
while (delta > epsilon) {
|
|
var leak = 0, nodes = {};
|
|
forOwn(self.nodes, function(key, value) {
|
|
nodes[key] = value.weight;
|
|
if (value.outbound === 0) {
|
|
leak += value.weight;
|
|
}
|
|
self.nodes[key].weight = 0;
|
|
});
|
|
leak *= alpha2;
|
|
forOwn(self.nodes, function(source) {
|
|
forOwn(self.edges[source], function(target, weight) {
|
|
self.nodes[target].weight += alpha2 * nodes[source] * weight;
|
|
});
|
|
self.nodes[source].weight += (1 - alpha2) * inverse + leak * inverse;
|
|
});
|
|
delta = 0;
|
|
forOwn(self.nodes, function(key, value) {
|
|
delta += Math.abs(value.weight - nodes[key]);
|
|
});
|
|
}
|
|
forOwn(self.nodes, function(key) {
|
|
return callback2(key, self.nodes[key].weight);
|
|
});
|
|
};
|
|
self.reset = function() {
|
|
self.count = 0;
|
|
self.edges = {};
|
|
self.nodes = {};
|
|
};
|
|
return self;
|
|
}();
|
|
}
|
|
});
|
|
|
|
// node_modules/.pnpm/vhtml@2.2.0/node_modules/vhtml/dist/vhtml.js
|
|
var require_vhtml = __commonJS({
|
|
"node_modules/.pnpm/vhtml@2.2.0/node_modules/vhtml/dist/vhtml.js"(exports, module2) {
|
|
(function(global, factory) {
|
|
typeof exports === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.vhtml = factory();
|
|
})(exports, function() {
|
|
"use strict";
|
|
var emptyTags = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"];
|
|
var esc = function esc2(str) {
|
|
return String(str).replace(/[&<>"']/g, function(s) {
|
|
return "&" + map3[s] + ";";
|
|
});
|
|
};
|
|
var map3 = { "&": "amp", "<": "lt", ">": "gt", '"': "quot", "'": "apos" };
|
|
var setInnerHTMLAttr = "dangerouslySetInnerHTML";
|
|
var DOMAttributeNames = {
|
|
className: "class",
|
|
htmlFor: "for"
|
|
};
|
|
var sanitized = {};
|
|
function h4(name, attrs) {
|
|
var stack = [], s = "";
|
|
attrs = attrs || {};
|
|
for (var i = arguments.length; i-- > 2; ) {
|
|
stack.push(arguments[i]);
|
|
}
|
|
if (typeof name === "function") {
|
|
attrs.children = stack.reverse();
|
|
return name(attrs);
|
|
}
|
|
if (name) {
|
|
s += "<" + name;
|
|
if (attrs)
|
|
for (var _i in attrs) {
|
|
if (attrs[_i] !== false && attrs[_i] != null && _i !== setInnerHTMLAttr) {
|
|
s += " " + (DOMAttributeNames[_i] ? DOMAttributeNames[_i] : esc(_i)) + '="' + esc(attrs[_i]) + '"';
|
|
}
|
|
}
|
|
s += ">";
|
|
}
|
|
if (emptyTags.indexOf(name) === -1) {
|
|
if (attrs[setInnerHTMLAttr]) {
|
|
s += attrs[setInnerHTMLAttr].__html;
|
|
} else
|
|
while (stack.length) {
|
|
var child = stack.pop();
|
|
if (child) {
|
|
if (child.pop) {
|
|
for (var _i2 = child.length; _i2--; ) {
|
|
stack.push(child[_i2]);
|
|
}
|
|
} else {
|
|
s += sanitized[child] === true ? child : esc(child);
|
|
}
|
|
}
|
|
}
|
|
s += name ? "</" + name + ">" : "";
|
|
}
|
|
sanitized[s] = true;
|
|
return s;
|
|
}
|
|
return h4;
|
|
});
|
|
}
|
|
});
|
|
|
|
// node_modules/.pnpm/moment@2.30.1/node_modules/moment/moment.js
|
|
var require_moment = __commonJS({
|
|
"node_modules/.pnpm/moment@2.30.1/node_modules/moment/moment.js"(exports, module2) {
|
|
(function(global, factory) {
|
|
typeof exports === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.moment = factory();
|
|
})(exports, function() {
|
|
"use strict";
|
|
var hookCallback;
|
|
function hooks() {
|
|
return hookCallback.apply(null, arguments);
|
|
}
|
|
function setHookCallback(callback2) {
|
|
hookCallback = callback2;
|
|
}
|
|
function isArray2(input) {
|
|
return input instanceof Array || Object.prototype.toString.call(input) === "[object Array]";
|
|
}
|
|
function isObject2(input) {
|
|
return input != null && Object.prototype.toString.call(input) === "[object Object]";
|
|
}
|
|
function hasOwnProp(a, b) {
|
|
return Object.prototype.hasOwnProperty.call(a, b);
|
|
}
|
|
function isObjectEmpty(obj) {
|
|
if (Object.getOwnPropertyNames) {
|
|
return Object.getOwnPropertyNames(obj).length === 0;
|
|
} else {
|
|
var k;
|
|
for (k in obj) {
|
|
if (hasOwnProp(obj, k)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
function isUndefined(input) {
|
|
return input === void 0;
|
|
}
|
|
function isNumber2(input) {
|
|
return typeof input === "number" || Object.prototype.toString.call(input) === "[object Number]";
|
|
}
|
|
function isDate(input) {
|
|
return input instanceof Date || Object.prototype.toString.call(input) === "[object Date]";
|
|
}
|
|
function map3(arr, fn) {
|
|
var res = [], i, arrLen = arr.length;
|
|
for (i = 0; i < arrLen; ++i) {
|
|
res.push(fn(arr[i], i));
|
|
}
|
|
return res;
|
|
}
|
|
function extend(a, b) {
|
|
for (var i in b) {
|
|
if (hasOwnProp(b, i)) {
|
|
a[i] = b[i];
|
|
}
|
|
}
|
|
if (hasOwnProp(b, "toString")) {
|
|
a.toString = b.toString;
|
|
}
|
|
if (hasOwnProp(b, "valueOf")) {
|
|
a.valueOf = b.valueOf;
|
|
}
|
|
return a;
|
|
}
|
|
function createUTC(input, format2, locale3, strict) {
|
|
return createLocalOrUTC(input, format2, locale3, strict, true).utc();
|
|
}
|
|
function defaultParsingFlags() {
|
|
return {
|
|
empty: false,
|
|
unusedTokens: [],
|
|
unusedInput: [],
|
|
overflow: -2,
|
|
charsLeftOver: 0,
|
|
nullInput: false,
|
|
invalidEra: null,
|
|
invalidMonth: null,
|
|
invalidFormat: false,
|
|
userInvalidated: false,
|
|
iso: false,
|
|
parsedDateParts: [],
|
|
era: null,
|
|
meridiem: null,
|
|
rfc2822: false,
|
|
weekdayMismatch: false
|
|
};
|
|
}
|
|
function getParsingFlags(m) {
|
|
if (m._pf == null) {
|
|
m._pf = defaultParsingFlags();
|
|
}
|
|
return m._pf;
|
|
}
|
|
var some;
|
|
if (Array.prototype.some) {
|
|
some = Array.prototype.some;
|
|
} else {
|
|
some = function(fun) {
|
|
var t2 = Object(this), len = t2.length >>> 0, i;
|
|
for (i = 0; i < len; i++) {
|
|
if (i in t2 && fun.call(this, t2[i], i, t2)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
}
|
|
function isValid(m) {
|
|
var flags = null, parsedParts = false, isNowValid = m._d && !isNaN(m._d.getTime());
|
|
if (isNowValid) {
|
|
flags = getParsingFlags(m);
|
|
parsedParts = some.call(flags.parsedDateParts, function(i) {
|
|
return i != null;
|
|
});
|
|
isNowValid = flags.overflow < 0 && !flags.empty && !flags.invalidEra && !flags.invalidMonth && !flags.invalidWeekday && !flags.weekdayMismatch && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || flags.meridiem && parsedParts);
|
|
if (m._strict) {
|
|
isNowValid = isNowValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === void 0;
|
|
}
|
|
}
|
|
if (Object.isFrozen == null || !Object.isFrozen(m)) {
|
|
m._isValid = isNowValid;
|
|
} else {
|
|
return isNowValid;
|
|
}
|
|
return m._isValid;
|
|
}
|
|
function createInvalid(flags) {
|
|
var m = createUTC(NaN);
|
|
if (flags != null) {
|
|
extend(getParsingFlags(m), flags);
|
|
} else {
|
|
getParsingFlags(m).userInvalidated = true;
|
|
}
|
|
return m;
|
|
}
|
|
var momentProperties = hooks.momentProperties = [], updateInProgress = false;
|
|
function copyConfig(to3, from3) {
|
|
var i, prop, val, momentPropertiesLen = momentProperties.length;
|
|
if (!isUndefined(from3._isAMomentObject)) {
|
|
to3._isAMomentObject = from3._isAMomentObject;
|
|
}
|
|
if (!isUndefined(from3._i)) {
|
|
to3._i = from3._i;
|
|
}
|
|
if (!isUndefined(from3._f)) {
|
|
to3._f = from3._f;
|
|
}
|
|
if (!isUndefined(from3._l)) {
|
|
to3._l = from3._l;
|
|
}
|
|
if (!isUndefined(from3._strict)) {
|
|
to3._strict = from3._strict;
|
|
}
|
|
if (!isUndefined(from3._tzm)) {
|
|
to3._tzm = from3._tzm;
|
|
}
|
|
if (!isUndefined(from3._isUTC)) {
|
|
to3._isUTC = from3._isUTC;
|
|
}
|
|
if (!isUndefined(from3._offset)) {
|
|
to3._offset = from3._offset;
|
|
}
|
|
if (!isUndefined(from3._pf)) {
|
|
to3._pf = getParsingFlags(from3);
|
|
}
|
|
if (!isUndefined(from3._locale)) {
|
|
to3._locale = from3._locale;
|
|
}
|
|
if (momentPropertiesLen > 0) {
|
|
for (i = 0; i < momentPropertiesLen; i++) {
|
|
prop = momentProperties[i];
|
|
val = from3[prop];
|
|
if (!isUndefined(val)) {
|
|
to3[prop] = val;
|
|
}
|
|
}
|
|
}
|
|
return to3;
|
|
}
|
|
function Moment(config) {
|
|
copyConfig(this, config);
|
|
this._d = new Date(config._d != null ? config._d.getTime() : NaN);
|
|
if (!this.isValid()) {
|
|
this._d = /* @__PURE__ */ new Date(NaN);
|
|
}
|
|
if (updateInProgress === false) {
|
|
updateInProgress = true;
|
|
hooks.updateOffset(this);
|
|
updateInProgress = false;
|
|
}
|
|
}
|
|
function isMoment(obj) {
|
|
return obj instanceof Moment || obj != null && obj._isAMomentObject != null;
|
|
}
|
|
function warn(msg) {
|
|
if (hooks.suppressDeprecationWarnings === false && typeof console !== "undefined" && console.warn) {
|
|
console.warn("Deprecation warning: " + msg);
|
|
}
|
|
}
|
|
function deprecate(msg, fn) {
|
|
var firstTime = true;
|
|
return extend(function() {
|
|
if (hooks.deprecationHandler != null) {
|
|
hooks.deprecationHandler(null, msg);
|
|
}
|
|
if (firstTime) {
|
|
var args = [], arg, i, key, argLen = arguments.length;
|
|
for (i = 0; i < argLen; i++) {
|
|
arg = "";
|
|
if (typeof arguments[i] === "object") {
|
|
arg += "\n[" + i + "] ";
|
|
for (key in arguments[0]) {
|
|
if (hasOwnProp(arguments[0], key)) {
|
|
arg += key + ": " + arguments[0][key] + ", ";
|
|
}
|
|
}
|
|
arg = arg.slice(0, -2);
|
|
} else {
|
|
arg = arguments[i];
|
|
}
|
|
args.push(arg);
|
|
}
|
|
warn(
|
|
msg + "\nArguments: " + Array.prototype.slice.call(args).join("") + "\n" + new Error().stack
|
|
);
|
|
firstTime = false;
|
|
}
|
|
return fn.apply(this, arguments);
|
|
}, fn);
|
|
}
|
|
var deprecations = {};
|
|
function deprecateSimple(name, msg) {
|
|
if (hooks.deprecationHandler != null) {
|
|
hooks.deprecationHandler(name, msg);
|
|
}
|
|
if (!deprecations[name]) {
|
|
warn(msg);
|
|
deprecations[name] = true;
|
|
}
|
|
}
|
|
hooks.suppressDeprecationWarnings = false;
|
|
hooks.deprecationHandler = null;
|
|
function isFunction2(input) {
|
|
return typeof Function !== "undefined" && input instanceof Function || Object.prototype.toString.call(input) === "[object Function]";
|
|
}
|
|
function set2(config) {
|
|
var prop, i;
|
|
for (i in config) {
|
|
if (hasOwnProp(config, i)) {
|
|
prop = config[i];
|
|
if (isFunction2(prop)) {
|
|
this[i] = prop;
|
|
} else {
|
|
this["_" + i] = prop;
|
|
}
|
|
}
|
|
}
|
|
this._config = config;
|
|
this._dayOfMonthOrdinalParseLenient = new RegExp(
|
|
(this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + "|" + /\d{1,2}/.source
|
|
);
|
|
}
|
|
function mergeConfigs(parentConfig, childConfig) {
|
|
var res = extend({}, parentConfig), prop;
|
|
for (prop in childConfig) {
|
|
if (hasOwnProp(childConfig, prop)) {
|
|
if (isObject2(parentConfig[prop]) && isObject2(childConfig[prop])) {
|
|
res[prop] = {};
|
|
extend(res[prop], parentConfig[prop]);
|
|
extend(res[prop], childConfig[prop]);
|
|
} else if (childConfig[prop] != null) {
|
|
res[prop] = childConfig[prop];
|
|
} else {
|
|
delete res[prop];
|
|
}
|
|
}
|
|
}
|
|
for (prop in parentConfig) {
|
|
if (hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject2(parentConfig[prop])) {
|
|
res[prop] = extend({}, res[prop]);
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
function Locale(config) {
|
|
if (config != null) {
|
|
this.set(config);
|
|
}
|
|
}
|
|
var keys;
|
|
if (Object.keys) {
|
|
keys = Object.keys;
|
|
} else {
|
|
keys = function(obj) {
|
|
var i, res = [];
|
|
for (i in obj) {
|
|
if (hasOwnProp(obj, i)) {
|
|
res.push(i);
|
|
}
|
|
}
|
|
return res;
|
|
};
|
|
}
|
|
var defaultCalendar = {
|
|
sameDay: "[Today at] LT",
|
|
nextDay: "[Tomorrow at] LT",
|
|
nextWeek: "dddd [at] LT",
|
|
lastDay: "[Yesterday at] LT",
|
|
lastWeek: "[Last] dddd [at] LT",
|
|
sameElse: "L"
|
|
};
|
|
function calendar(key, mom, now2) {
|
|
var output = this._calendar[key] || this._calendar["sameElse"];
|
|
return isFunction2(output) ? output.call(mom, now2) : output;
|
|
}
|
|
function zeroFill(number, targetLength, forceSign) {
|
|
var absNumber = "" + Math.abs(number), zerosToFill = targetLength - absNumber.length, sign3 = number >= 0;
|
|
return (sign3 ? forceSign ? "+" : "" : "-") + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
|
|
}
|
|
var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, formatFunctions = {}, formatTokenFunctions = {};
|
|
function addFormatToken(token2, padded, ordinal2, callback2) {
|
|
var func = callback2;
|
|
if (typeof callback2 === "string") {
|
|
func = function() {
|
|
return this[callback2]();
|
|
};
|
|
}
|
|
if (token2) {
|
|
formatTokenFunctions[token2] = func;
|
|
}
|
|
if (padded) {
|
|
formatTokenFunctions[padded[0]] = function() {
|
|
return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
|
|
};
|
|
}
|
|
if (ordinal2) {
|
|
formatTokenFunctions[ordinal2] = function() {
|
|
return this.localeData().ordinal(
|
|
func.apply(this, arguments),
|
|
token2
|
|
);
|
|
};
|
|
}
|
|
}
|
|
function removeFormattingTokens(input) {
|
|
if (input.match(/\[[\s\S]/)) {
|
|
return input.replace(/^\[|\]$/g, "");
|
|
}
|
|
return input.replace(/\\/g, "");
|
|
}
|
|
function makeFormatFunction(format2) {
|
|
var array = format2.match(formattingTokens), i, length;
|
|
for (i = 0, length = array.length; i < length; i++) {
|
|
if (formatTokenFunctions[array[i]]) {
|
|
array[i] = formatTokenFunctions[array[i]];
|
|
} else {
|
|
array[i] = removeFormattingTokens(array[i]);
|
|
}
|
|
}
|
|
return function(mom) {
|
|
var output = "", i2;
|
|
for (i2 = 0; i2 < length; i2++) {
|
|
output += isFunction2(array[i2]) ? array[i2].call(mom, format2) : array[i2];
|
|
}
|
|
return output;
|
|
};
|
|
}
|
|
function formatMoment(m, format2) {
|
|
if (!m.isValid()) {
|
|
return m.localeData().invalidDate();
|
|
}
|
|
format2 = expandFormat(format2, m.localeData());
|
|
formatFunctions[format2] = formatFunctions[format2] || makeFormatFunction(format2);
|
|
return formatFunctions[format2](m);
|
|
}
|
|
function expandFormat(format2, locale3) {
|
|
var i = 5;
|
|
function replaceLongDateFormatTokens(input) {
|
|
return locale3.longDateFormat(input) || input;
|
|
}
|
|
localFormattingTokens.lastIndex = 0;
|
|
while (i >= 0 && localFormattingTokens.test(format2)) {
|
|
format2 = format2.replace(
|
|
localFormattingTokens,
|
|
replaceLongDateFormatTokens
|
|
);
|
|
localFormattingTokens.lastIndex = 0;
|
|
i -= 1;
|
|
}
|
|
return format2;
|
|
}
|
|
var defaultLongDateFormat = {
|
|
LTS: "h:mm:ss A",
|
|
LT: "h:mm A",
|
|
L: "MM/DD/YYYY",
|
|
LL: "MMMM D, YYYY",
|
|
LLL: "MMMM D, YYYY h:mm A",
|
|
LLLL: "dddd, MMMM D, YYYY h:mm A"
|
|
};
|
|
function longDateFormat(key) {
|
|
var format2 = this._longDateFormat[key], formatUpper = this._longDateFormat[key.toUpperCase()];
|
|
if (format2 || !formatUpper) {
|
|
return format2;
|
|
}
|
|
this._longDateFormat[key] = formatUpper.match(formattingTokens).map(function(tok) {
|
|
if (tok === "MMMM" || tok === "MM" || tok === "DD" || tok === "dddd") {
|
|
return tok.slice(1);
|
|
}
|
|
return tok;
|
|
}).join("");
|
|
return this._longDateFormat[key];
|
|
}
|
|
var defaultInvalidDate = "Invalid date";
|
|
function invalidDate() {
|
|
return this._invalidDate;
|
|
}
|
|
var defaultOrdinal = "%d", defaultDayOfMonthOrdinalParse = /\d{1,2}/;
|
|
function ordinal(number) {
|
|
return this._ordinal.replace("%d", number);
|
|
}
|
|
var defaultRelativeTime = {
|
|
future: "in %s",
|
|
past: "%s ago",
|
|
s: "a few seconds",
|
|
ss: "%d seconds",
|
|
m: "a minute",
|
|
mm: "%d minutes",
|
|
h: "an hour",
|
|
hh: "%d hours",
|
|
d: "a day",
|
|
dd: "%d days",
|
|
w: "a week",
|
|
ww: "%d weeks",
|
|
M: "a month",
|
|
MM: "%d months",
|
|
y: "a year",
|
|
yy: "%d years"
|
|
};
|
|
function relativeTime(number, withoutSuffix, string, isFuture) {
|
|
var output = this._relativeTime[string];
|
|
return isFunction2(output) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number);
|
|
}
|
|
function pastFuture(diff2, output) {
|
|
var format2 = this._relativeTime[diff2 > 0 ? "future" : "past"];
|
|
return isFunction2(format2) ? format2(output) : format2.replace(/%s/i, output);
|
|
}
|
|
var aliases = {
|
|
D: "date",
|
|
dates: "date",
|
|
date: "date",
|
|
d: "day",
|
|
days: "day",
|
|
day: "day",
|
|
e: "weekday",
|
|
weekdays: "weekday",
|
|
weekday: "weekday",
|
|
E: "isoWeekday",
|
|
isoweekdays: "isoWeekday",
|
|
isoweekday: "isoWeekday",
|
|
DDD: "dayOfYear",
|
|
dayofyears: "dayOfYear",
|
|
dayofyear: "dayOfYear",
|
|
h: "hour",
|
|
hours: "hour",
|
|
hour: "hour",
|
|
ms: "millisecond",
|
|
milliseconds: "millisecond",
|
|
millisecond: "millisecond",
|
|
m: "minute",
|
|
minutes: "minute",
|
|
minute: "minute",
|
|
M: "month",
|
|
months: "month",
|
|
month: "month",
|
|
Q: "quarter",
|
|
quarters: "quarter",
|
|
quarter: "quarter",
|
|
s: "second",
|
|
seconds: "second",
|
|
second: "second",
|
|
gg: "weekYear",
|
|
weekyears: "weekYear",
|
|
weekyear: "weekYear",
|
|
GG: "isoWeekYear",
|
|
isoweekyears: "isoWeekYear",
|
|
isoweekyear: "isoWeekYear",
|
|
w: "week",
|
|
weeks: "week",
|
|
week: "week",
|
|
W: "isoWeek",
|
|
isoweeks: "isoWeek",
|
|
isoweek: "isoWeek",
|
|
y: "year",
|
|
years: "year",
|
|
year: "year"
|
|
};
|
|
function normalizeUnits(units) {
|
|
return typeof units === "string" ? aliases[units] || aliases[units.toLowerCase()] : void 0;
|
|
}
|
|
function normalizeObjectUnits(inputObject) {
|
|
var normalizedInput = {}, normalizedProp, prop;
|
|
for (prop in inputObject) {
|
|
if (hasOwnProp(inputObject, prop)) {
|
|
normalizedProp = normalizeUnits(prop);
|
|
if (normalizedProp) {
|
|
normalizedInput[normalizedProp] = inputObject[prop];
|
|
}
|
|
}
|
|
}
|
|
return normalizedInput;
|
|
}
|
|
var priorities = {
|
|
date: 9,
|
|
day: 11,
|
|
weekday: 11,
|
|
isoWeekday: 11,
|
|
dayOfYear: 4,
|
|
hour: 13,
|
|
millisecond: 16,
|
|
minute: 14,
|
|
month: 8,
|
|
quarter: 7,
|
|
second: 15,
|
|
weekYear: 1,
|
|
isoWeekYear: 1,
|
|
week: 5,
|
|
isoWeek: 5,
|
|
year: 1
|
|
};
|
|
function getPrioritizedUnits(unitsObj) {
|
|
var units = [], u;
|
|
for (u in unitsObj) {
|
|
if (hasOwnProp(unitsObj, u)) {
|
|
units.push({ unit: u, priority: priorities[u] });
|
|
}
|
|
}
|
|
units.sort(function(a, b) {
|
|
return a.priority - b.priority;
|
|
});
|
|
return units;
|
|
}
|
|
var match1 = /\d/, match2 = /\d\d/, match3 = /\d{3}/, match4 = /\d{4}/, match6 = /[+-]?\d{6}/, match1to2 = /\d\d?/, match3to4 = /\d\d\d\d?/, match5to6 = /\d\d\d\d\d\d?/, match1to3 = /\d{1,3}/, match1to4 = /\d{1,4}/, match1to6 = /[+-]?\d{1,6}/, matchUnsigned = /\d+/, matchSigned = /[+-]?\d+/, matchOffset = /Z|[+-]\d\d:?\d\d/gi, matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, match1to2NoLeadingZero = /^[1-9]\d?/, match1to2HasZero = /^([1-9]\d|\d)/, regexes;
|
|
regexes = {};
|
|
function addRegexToken(token2, regex, strictRegex) {
|
|
regexes[token2] = isFunction2(regex) ? regex : function(isStrict, localeData2) {
|
|
return isStrict && strictRegex ? strictRegex : regex;
|
|
};
|
|
}
|
|
function getParseRegexForToken(token2, config) {
|
|
if (!hasOwnProp(regexes, token2)) {
|
|
return new RegExp(unescapeFormat(token2));
|
|
}
|
|
return regexes[token2](config._strict, config._locale);
|
|
}
|
|
function unescapeFormat(s) {
|
|
return regexEscape(
|
|
s.replace("\\", "").replace(
|
|
/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,
|
|
function(matched, p1, p2, p3, p4) {
|
|
return p1 || p2 || p3 || p4;
|
|
}
|
|
)
|
|
);
|
|
}
|
|
function regexEscape(s) {
|
|
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
}
|
|
function absFloor(number) {
|
|
if (number < 0) {
|
|
return Math.ceil(number) || 0;
|
|
} else {
|
|
return Math.floor(number);
|
|
}
|
|
}
|
|
function toInt(argumentForCoercion) {
|
|
var coercedNumber = +argumentForCoercion, value = 0;
|
|
if (coercedNumber !== 0 && isFinite(coercedNumber)) {
|
|
value = absFloor(coercedNumber);
|
|
}
|
|
return value;
|
|
}
|
|
var tokens = {};
|
|
function addParseToken(token2, callback2) {
|
|
var i, func = callback2, tokenLen;
|
|
if (typeof token2 === "string") {
|
|
token2 = [token2];
|
|
}
|
|
if (isNumber2(callback2)) {
|
|
func = function(input, array) {
|
|
array[callback2] = toInt(input);
|
|
};
|
|
}
|
|
tokenLen = token2.length;
|
|
for (i = 0; i < tokenLen; i++) {
|
|
tokens[token2[i]] = func;
|
|
}
|
|
}
|
|
function addWeekParseToken(token2, callback2) {
|
|
addParseToken(token2, function(input, array, config, token3) {
|
|
config._w = config._w || {};
|
|
callback2(input, config._w, config, token3);
|
|
});
|
|
}
|
|
function addTimeToArrayFromToken(token2, input, config) {
|
|
if (input != null && hasOwnProp(tokens, token2)) {
|
|
tokens[token2](input, config._a, config, token2);
|
|
}
|
|
}
|
|
function isLeapYear(year) {
|
|
return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
|
|
}
|
|
var YEAR = 0, MONTH = 1, DATE = 2, HOUR = 3, MINUTE = 4, SECOND = 5, MILLISECOND = 6, WEEK = 7, WEEKDAY = 8;
|
|
addFormatToken("Y", 0, 0, function() {
|
|
var y = this.year();
|
|
return y <= 9999 ? zeroFill(y, 4) : "+" + y;
|
|
});
|
|
addFormatToken(0, ["YY", 2], 0, function() {
|
|
return this.year() % 100;
|
|
});
|
|
addFormatToken(0, ["YYYY", 4], 0, "year");
|
|
addFormatToken(0, ["YYYYY", 5], 0, "year");
|
|
addFormatToken(0, ["YYYYYY", 6, true], 0, "year");
|
|
addRegexToken("Y", matchSigned);
|
|
addRegexToken("YY", match1to2, match2);
|
|
addRegexToken("YYYY", match1to4, match4);
|
|
addRegexToken("YYYYY", match1to6, match6);
|
|
addRegexToken("YYYYYY", match1to6, match6);
|
|
addParseToken(["YYYYY", "YYYYYY"], YEAR);
|
|
addParseToken("YYYY", function(input, array) {
|
|
array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
|
|
});
|
|
addParseToken("YY", function(input, array) {
|
|
array[YEAR] = hooks.parseTwoDigitYear(input);
|
|
});
|
|
addParseToken("Y", function(input, array) {
|
|
array[YEAR] = parseInt(input, 10);
|
|
});
|
|
function daysInYear(year) {
|
|
return isLeapYear(year) ? 366 : 365;
|
|
}
|
|
hooks.parseTwoDigitYear = function(input) {
|
|
return toInt(input) + (toInt(input) > 68 ? 1900 : 2e3);
|
|
};
|
|
var getSetYear = makeGetSet("FullYear", true);
|
|
function getIsLeapYear() {
|
|
return isLeapYear(this.year());
|
|
}
|
|
function makeGetSet(unit, keepTime) {
|
|
return function(value) {
|
|
if (value != null) {
|
|
set$1(this, unit, value);
|
|
hooks.updateOffset(this, keepTime);
|
|
return this;
|
|
} else {
|
|
return get(this, unit);
|
|
}
|
|
};
|
|
}
|
|
function get(mom, unit) {
|
|
if (!mom.isValid()) {
|
|
return NaN;
|
|
}
|
|
var d = mom._d, isUTC = mom._isUTC;
|
|
switch (unit) {
|
|
case "Milliseconds":
|
|
return isUTC ? d.getUTCMilliseconds() : d.getMilliseconds();
|
|
case "Seconds":
|
|
return isUTC ? d.getUTCSeconds() : d.getSeconds();
|
|
case "Minutes":
|
|
return isUTC ? d.getUTCMinutes() : d.getMinutes();
|
|
case "Hours":
|
|
return isUTC ? d.getUTCHours() : d.getHours();
|
|
case "Date":
|
|
return isUTC ? d.getUTCDate() : d.getDate();
|
|
case "Day":
|
|
return isUTC ? d.getUTCDay() : d.getDay();
|
|
case "Month":
|
|
return isUTC ? d.getUTCMonth() : d.getMonth();
|
|
case "FullYear":
|
|
return isUTC ? d.getUTCFullYear() : d.getFullYear();
|
|
default:
|
|
return NaN;
|
|
}
|
|
}
|
|
function set$1(mom, unit, value) {
|
|
var d, isUTC, year, month, date;
|
|
if (!mom.isValid() || isNaN(value)) {
|
|
return;
|
|
}
|
|
d = mom._d;
|
|
isUTC = mom._isUTC;
|
|
switch (unit) {
|
|
case "Milliseconds":
|
|
return void (isUTC ? d.setUTCMilliseconds(value) : d.setMilliseconds(value));
|
|
case "Seconds":
|
|
return void (isUTC ? d.setUTCSeconds(value) : d.setSeconds(value));
|
|
case "Minutes":
|
|
return void (isUTC ? d.setUTCMinutes(value) : d.setMinutes(value));
|
|
case "Hours":
|
|
return void (isUTC ? d.setUTCHours(value) : d.setHours(value));
|
|
case "Date":
|
|
return void (isUTC ? d.setUTCDate(value) : d.setDate(value));
|
|
case "FullYear":
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
year = value;
|
|
month = mom.month();
|
|
date = mom.date();
|
|
date = date === 29 && month === 1 && !isLeapYear(year) ? 28 : date;
|
|
void (isUTC ? d.setUTCFullYear(year, month, date) : d.setFullYear(year, month, date));
|
|
}
|
|
function stringGet(units) {
|
|
units = normalizeUnits(units);
|
|
if (isFunction2(this[units])) {
|
|
return this[units]();
|
|
}
|
|
return this;
|
|
}
|
|
function stringSet(units, value) {
|
|
if (typeof units === "object") {
|
|
units = normalizeObjectUnits(units);
|
|
var prioritized = getPrioritizedUnits(units), i, prioritizedLen = prioritized.length;
|
|
for (i = 0; i < prioritizedLen; i++) {
|
|
this[prioritized[i].unit](units[prioritized[i].unit]);
|
|
}
|
|
} else {
|
|
units = normalizeUnits(units);
|
|
if (isFunction2(this[units])) {
|
|
return this[units](value);
|
|
}
|
|
}
|
|
return this;
|
|
}
|
|
function mod(n, x) {
|
|
return (n % x + x) % x;
|
|
}
|
|
var indexOf;
|
|
if (Array.prototype.indexOf) {
|
|
indexOf = Array.prototype.indexOf;
|
|
} else {
|
|
indexOf = function(o) {
|
|
var i;
|
|
for (i = 0; i < this.length; ++i) {
|
|
if (this[i] === o) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
};
|
|
}
|
|
function daysInMonth(year, month) {
|
|
if (isNaN(year) || isNaN(month)) {
|
|
return NaN;
|
|
}
|
|
var modMonth = mod(month, 12);
|
|
year += (month - modMonth) / 12;
|
|
return modMonth === 1 ? isLeapYear(year) ? 29 : 28 : 31 - modMonth % 7 % 2;
|
|
}
|
|
addFormatToken("M", ["MM", 2], "Mo", function() {
|
|
return this.month() + 1;
|
|
});
|
|
addFormatToken("MMM", 0, 0, function(format2) {
|
|
return this.localeData().monthsShort(this, format2);
|
|
});
|
|
addFormatToken("MMMM", 0, 0, function(format2) {
|
|
return this.localeData().months(this, format2);
|
|
});
|
|
addRegexToken("M", match1to2, match1to2NoLeadingZero);
|
|
addRegexToken("MM", match1to2, match2);
|
|
addRegexToken("MMM", function(isStrict, locale3) {
|
|
return locale3.monthsShortRegex(isStrict);
|
|
});
|
|
addRegexToken("MMMM", function(isStrict, locale3) {
|
|
return locale3.monthsRegex(isStrict);
|
|
});
|
|
addParseToken(["M", "MM"], function(input, array) {
|
|
array[MONTH] = toInt(input) - 1;
|
|
});
|
|
addParseToken(["MMM", "MMMM"], function(input, array, config, token2) {
|
|
var month = config._locale.monthsParse(input, token2, config._strict);
|
|
if (month != null) {
|
|
array[MONTH] = month;
|
|
} else {
|
|
getParsingFlags(config).invalidMonth = input;
|
|
}
|
|
});
|
|
var defaultLocaleMonths = "January_February_March_April_May_June_July_August_September_October_November_December".split(
|
|
"_"
|
|
), defaultLocaleMonthsShort = "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, defaultMonthsShortRegex = matchWord, defaultMonthsRegex = matchWord;
|
|
function localeMonths(m, format2) {
|
|
if (!m) {
|
|
return isArray2(this._months) ? this._months : this._months["standalone"];
|
|
}
|
|
return isArray2(this._months) ? this._months[m.month()] : this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format2) ? "format" : "standalone"][m.month()];
|
|
}
|
|
function localeMonthsShort(m, format2) {
|
|
if (!m) {
|
|
return isArray2(this._monthsShort) ? this._monthsShort : this._monthsShort["standalone"];
|
|
}
|
|
return isArray2(this._monthsShort) ? this._monthsShort[m.month()] : this._monthsShort[MONTHS_IN_FORMAT.test(format2) ? "format" : "standalone"][m.month()];
|
|
}
|
|
function handleStrictParse(monthName, format2, strict) {
|
|
var i, ii, mom, llc = monthName.toLocaleLowerCase();
|
|
if (!this._monthsParse) {
|
|
this._monthsParse = [];
|
|
this._longMonthsParse = [];
|
|
this._shortMonthsParse = [];
|
|
for (i = 0; i < 12; ++i) {
|
|
mom = createUTC([2e3, i]);
|
|
this._shortMonthsParse[i] = this.monthsShort(
|
|
mom,
|
|
""
|
|
).toLocaleLowerCase();
|
|
this._longMonthsParse[i] = this.months(mom, "").toLocaleLowerCase();
|
|
}
|
|
}
|
|
if (strict) {
|
|
if (format2 === "MMM") {
|
|
ii = indexOf.call(this._shortMonthsParse, llc);
|
|
return ii !== -1 ? ii : null;
|
|
} else {
|
|
ii = indexOf.call(this._longMonthsParse, llc);
|
|
return ii !== -1 ? ii : null;
|
|
}
|
|
} else {
|
|
if (format2 === "MMM") {
|
|
ii = indexOf.call(this._shortMonthsParse, llc);
|
|
if (ii !== -1) {
|
|
return ii;
|
|
}
|
|
ii = indexOf.call(this._longMonthsParse, llc);
|
|
return ii !== -1 ? ii : null;
|
|
} else {
|
|
ii = indexOf.call(this._longMonthsParse, llc);
|
|
if (ii !== -1) {
|
|
return ii;
|
|
}
|
|
ii = indexOf.call(this._shortMonthsParse, llc);
|
|
return ii !== -1 ? ii : null;
|
|
}
|
|
}
|
|
}
|
|
function localeMonthsParse(monthName, format2, strict) {
|
|
var i, mom, regex;
|
|
if (this._monthsParseExact) {
|
|
return handleStrictParse.call(this, monthName, format2, strict);
|
|
}
|
|
if (!this._monthsParse) {
|
|
this._monthsParse = [];
|
|
this._longMonthsParse = [];
|
|
this._shortMonthsParse = [];
|
|
}
|
|
for (i = 0; i < 12; i++) {
|
|
mom = createUTC([2e3, i]);
|
|
if (strict && !this._longMonthsParse[i]) {
|
|
this._longMonthsParse[i] = new RegExp(
|
|
"^" + this.months(mom, "").replace(".", "") + "$",
|
|
"i"
|
|
);
|
|
this._shortMonthsParse[i] = new RegExp(
|
|
"^" + this.monthsShort(mom, "").replace(".", "") + "$",
|
|
"i"
|
|
);
|
|
}
|
|
if (!strict && !this._monthsParse[i]) {
|
|
regex = "^" + this.months(mom, "") + "|^" + this.monthsShort(mom, "");
|
|
this._monthsParse[i] = new RegExp(regex.replace(".", ""), "i");
|
|
}
|
|
if (strict && format2 === "MMMM" && this._longMonthsParse[i].test(monthName)) {
|
|
return i;
|
|
} else if (strict && format2 === "MMM" && this._shortMonthsParse[i].test(monthName)) {
|
|
return i;
|
|
} else if (!strict && this._monthsParse[i].test(monthName)) {
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
function setMonth(mom, value) {
|
|
if (!mom.isValid()) {
|
|
return mom;
|
|
}
|
|
if (typeof value === "string") {
|
|
if (/^\d+$/.test(value)) {
|
|
value = toInt(value);
|
|
} else {
|
|
value = mom.localeData().monthsParse(value);
|
|
if (!isNumber2(value)) {
|
|
return mom;
|
|
}
|
|
}
|
|
}
|
|
var month = value, date = mom.date();
|
|
date = date < 29 ? date : Math.min(date, daysInMonth(mom.year(), month));
|
|
void (mom._isUTC ? mom._d.setUTCMonth(month, date) : mom._d.setMonth(month, date));
|
|
return mom;
|
|
}
|
|
function getSetMonth(value) {
|
|
if (value != null) {
|
|
setMonth(this, value);
|
|
hooks.updateOffset(this, true);
|
|
return this;
|
|
} else {
|
|
return get(this, "Month");
|
|
}
|
|
}
|
|
function getDaysInMonth() {
|
|
return daysInMonth(this.year(), this.month());
|
|
}
|
|
function monthsShortRegex(isStrict) {
|
|
if (this._monthsParseExact) {
|
|
if (!hasOwnProp(this, "_monthsRegex")) {
|
|
computeMonthsParse.call(this);
|
|
}
|
|
if (isStrict) {
|
|
return this._monthsShortStrictRegex;
|
|
} else {
|
|
return this._monthsShortRegex;
|
|
}
|
|
} else {
|
|
if (!hasOwnProp(this, "_monthsShortRegex")) {
|
|
this._monthsShortRegex = defaultMonthsShortRegex;
|
|
}
|
|
return this._monthsShortStrictRegex && isStrict ? this._monthsShortStrictRegex : this._monthsShortRegex;
|
|
}
|
|
}
|
|
function monthsRegex(isStrict) {
|
|
if (this._monthsParseExact) {
|
|
if (!hasOwnProp(this, "_monthsRegex")) {
|
|
computeMonthsParse.call(this);
|
|
}
|
|
if (isStrict) {
|
|
return this._monthsStrictRegex;
|
|
} else {
|
|
return this._monthsRegex;
|
|
}
|
|
} else {
|
|
if (!hasOwnProp(this, "_monthsRegex")) {
|
|
this._monthsRegex = defaultMonthsRegex;
|
|
}
|
|
return this._monthsStrictRegex && isStrict ? this._monthsStrictRegex : this._monthsRegex;
|
|
}
|
|
}
|
|
function computeMonthsParse() {
|
|
function cmpLenRev(a, b) {
|
|
return b.length - a.length;
|
|
}
|
|
var shortPieces = [], longPieces = [], mixedPieces = [], i, mom, shortP, longP;
|
|
for (i = 0; i < 12; i++) {
|
|
mom = createUTC([2e3, i]);
|
|
shortP = regexEscape(this.monthsShort(mom, ""));
|
|
longP = regexEscape(this.months(mom, ""));
|
|
shortPieces.push(shortP);
|
|
longPieces.push(longP);
|
|
mixedPieces.push(longP);
|
|
mixedPieces.push(shortP);
|
|
}
|
|
shortPieces.sort(cmpLenRev);
|
|
longPieces.sort(cmpLenRev);
|
|
mixedPieces.sort(cmpLenRev);
|
|
this._monthsRegex = new RegExp("^(" + mixedPieces.join("|") + ")", "i");
|
|
this._monthsShortRegex = this._monthsRegex;
|
|
this._monthsStrictRegex = new RegExp(
|
|
"^(" + longPieces.join("|") + ")",
|
|
"i"
|
|
);
|
|
this._monthsShortStrictRegex = new RegExp(
|
|
"^(" + shortPieces.join("|") + ")",
|
|
"i"
|
|
);
|
|
}
|
|
function createDate(y, m, d, h4, M, s, ms) {
|
|
var date;
|
|
if (y < 100 && y >= 0) {
|
|
date = new Date(y + 400, m, d, h4, M, s, ms);
|
|
if (isFinite(date.getFullYear())) {
|
|
date.setFullYear(y);
|
|
}
|
|
} else {
|
|
date = new Date(y, m, d, h4, M, s, ms);
|
|
}
|
|
return date;
|
|
}
|
|
function createUTCDate(y) {
|
|
var date, args;
|
|
if (y < 100 && y >= 0) {
|
|
args = Array.prototype.slice.call(arguments);
|
|
args[0] = y + 400;
|
|
date = new Date(Date.UTC.apply(null, args));
|
|
if (isFinite(date.getUTCFullYear())) {
|
|
date.setUTCFullYear(y);
|
|
}
|
|
} else {
|
|
date = new Date(Date.UTC.apply(null, arguments));
|
|
}
|
|
return date;
|
|
}
|
|
function firstWeekOffset(year, dow, doy) {
|
|
var fwd = 7 + dow - doy, fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
|
|
return -fwdlw + fwd - 1;
|
|
}
|
|
function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
|
|
var localWeekday = (7 + weekday - dow) % 7, weekOffset = firstWeekOffset(year, dow, doy), dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, resYear, resDayOfYear;
|
|
if (dayOfYear <= 0) {
|
|
resYear = year - 1;
|
|
resDayOfYear = daysInYear(resYear) + dayOfYear;
|
|
} else if (dayOfYear > daysInYear(year)) {
|
|
resYear = year + 1;
|
|
resDayOfYear = dayOfYear - daysInYear(year);
|
|
} else {
|
|
resYear = year;
|
|
resDayOfYear = dayOfYear;
|
|
}
|
|
return {
|
|
year: resYear,
|
|
dayOfYear: resDayOfYear
|
|
};
|
|
}
|
|
function weekOfYear(mom, dow, doy) {
|
|
var weekOffset = firstWeekOffset(mom.year(), dow, doy), week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, resWeek, resYear;
|
|
if (week < 1) {
|
|
resYear = mom.year() - 1;
|
|
resWeek = week + weeksInYear(resYear, dow, doy);
|
|
} else if (week > weeksInYear(mom.year(), dow, doy)) {
|
|
resWeek = week - weeksInYear(mom.year(), dow, doy);
|
|
resYear = mom.year() + 1;
|
|
} else {
|
|
resYear = mom.year();
|
|
resWeek = week;
|
|
}
|
|
return {
|
|
week: resWeek,
|
|
year: resYear
|
|
};
|
|
}
|
|
function weeksInYear(year, dow, doy) {
|
|
var weekOffset = firstWeekOffset(year, dow, doy), weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
|
|
return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
|
|
}
|
|
addFormatToken("w", ["ww", 2], "wo", "week");
|
|
addFormatToken("W", ["WW", 2], "Wo", "isoWeek");
|
|
addRegexToken("w", match1to2, match1to2NoLeadingZero);
|
|
addRegexToken("ww", match1to2, match2);
|
|
addRegexToken("W", match1to2, match1to2NoLeadingZero);
|
|
addRegexToken("WW", match1to2, match2);
|
|
addWeekParseToken(
|
|
["w", "ww", "W", "WW"],
|
|
function(input, week, config, token2) {
|
|
week[token2.substr(0, 1)] = toInt(input);
|
|
}
|
|
);
|
|
function localeWeek(mom) {
|
|
return weekOfYear(mom, this._week.dow, this._week.doy).week;
|
|
}
|
|
var defaultLocaleWeek = {
|
|
dow: 0,
|
|
// Sunday is the first day of the week.
|
|
doy: 6
|
|
// The week that contains Jan 6th is the first week of the year.
|
|
};
|
|
function localeFirstDayOfWeek() {
|
|
return this._week.dow;
|
|
}
|
|
function localeFirstDayOfYear() {
|
|
return this._week.doy;
|
|
}
|
|
function getSetWeek(input) {
|
|
var week = this.localeData().week(this);
|
|
return input == null ? week : this.add((input - week) * 7, "d");
|
|
}
|
|
function getSetISOWeek(input) {
|
|
var week = weekOfYear(this, 1, 4).week;
|
|
return input == null ? week : this.add((input - week) * 7, "d");
|
|
}
|
|
addFormatToken("d", 0, "do", "day");
|
|
addFormatToken("dd", 0, 0, function(format2) {
|
|
return this.localeData().weekdaysMin(this, format2);
|
|
});
|
|
addFormatToken("ddd", 0, 0, function(format2) {
|
|
return this.localeData().weekdaysShort(this, format2);
|
|
});
|
|
addFormatToken("dddd", 0, 0, function(format2) {
|
|
return this.localeData().weekdays(this, format2);
|
|
});
|
|
addFormatToken("e", 0, 0, "weekday");
|
|
addFormatToken("E", 0, 0, "isoWeekday");
|
|
addRegexToken("d", match1to2);
|
|
addRegexToken("e", match1to2);
|
|
addRegexToken("E", match1to2);
|
|
addRegexToken("dd", function(isStrict, locale3) {
|
|
return locale3.weekdaysMinRegex(isStrict);
|
|
});
|
|
addRegexToken("ddd", function(isStrict, locale3) {
|
|
return locale3.weekdaysShortRegex(isStrict);
|
|
});
|
|
addRegexToken("dddd", function(isStrict, locale3) {
|
|
return locale3.weekdaysRegex(isStrict);
|
|
});
|
|
addWeekParseToken(["dd", "ddd", "dddd"], function(input, week, config, token2) {
|
|
var weekday = config._locale.weekdaysParse(input, token2, config._strict);
|
|
if (weekday != null) {
|
|
week.d = weekday;
|
|
} else {
|
|
getParsingFlags(config).invalidWeekday = input;
|
|
}
|
|
});
|
|
addWeekParseToken(["d", "e", "E"], function(input, week, config, token2) {
|
|
week[token2] = toInt(input);
|
|
});
|
|
function parseWeekday(input, locale3) {
|
|
if (typeof input !== "string") {
|
|
return input;
|
|
}
|
|
if (!isNaN(input)) {
|
|
return parseInt(input, 10);
|
|
}
|
|
input = locale3.weekdaysParse(input);
|
|
if (typeof input === "number") {
|
|
return input;
|
|
}
|
|
return null;
|
|
}
|
|
function parseIsoWeekday(input, locale3) {
|
|
if (typeof input === "string") {
|
|
return locale3.weekdaysParse(input) % 7 || 7;
|
|
}
|
|
return isNaN(input) ? null : input;
|
|
}
|
|
function shiftWeekdays(ws, n) {
|
|
return ws.slice(n, 7).concat(ws.slice(0, n));
|
|
}
|
|
var defaultLocaleWeekdays = "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), defaultLocaleWeekdaysShort = "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), defaultLocaleWeekdaysMin = "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), defaultWeekdaysRegex = matchWord, defaultWeekdaysShortRegex = matchWord, defaultWeekdaysMinRegex = matchWord;
|
|
function localeWeekdays(m, format2) {
|
|
var weekdays = isArray2(this._weekdays) ? this._weekdays : this._weekdays[m && m !== true && this._weekdays.isFormat.test(format2) ? "format" : "standalone"];
|
|
return m === true ? shiftWeekdays(weekdays, this._week.dow) : m ? weekdays[m.day()] : weekdays;
|
|
}
|
|
function localeWeekdaysShort(m) {
|
|
return m === true ? shiftWeekdays(this._weekdaysShort, this._week.dow) : m ? this._weekdaysShort[m.day()] : this._weekdaysShort;
|
|
}
|
|
function localeWeekdaysMin(m) {
|
|
return m === true ? shiftWeekdays(this._weekdaysMin, this._week.dow) : m ? this._weekdaysMin[m.day()] : this._weekdaysMin;
|
|
}
|
|
function handleStrictParse$1(weekdayName, format2, strict) {
|
|
var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
|
|
if (!this._weekdaysParse) {
|
|
this._weekdaysParse = [];
|
|
this._shortWeekdaysParse = [];
|
|
this._minWeekdaysParse = [];
|
|
for (i = 0; i < 7; ++i) {
|
|
mom = createUTC([2e3, 1]).day(i);
|
|
this._minWeekdaysParse[i] = this.weekdaysMin(
|
|
mom,
|
|
""
|
|
).toLocaleLowerCase();
|
|
this._shortWeekdaysParse[i] = this.weekdaysShort(
|
|
mom,
|
|
""
|
|
).toLocaleLowerCase();
|
|
this._weekdaysParse[i] = this.weekdays(mom, "").toLocaleLowerCase();
|
|
}
|
|
}
|
|
if (strict) {
|
|
if (format2 === "dddd") {
|
|
ii = indexOf.call(this._weekdaysParse, llc);
|
|
return ii !== -1 ? ii : null;
|
|
} else if (format2 === "ddd") {
|
|
ii = indexOf.call(this._shortWeekdaysParse, llc);
|
|
return ii !== -1 ? ii : null;
|
|
} else {
|
|
ii = indexOf.call(this._minWeekdaysParse, llc);
|
|
return ii !== -1 ? ii : null;
|
|
}
|
|
} else {
|
|
if (format2 === "dddd") {
|
|
ii = indexOf.call(this._weekdaysParse, llc);
|
|
if (ii !== -1) {
|
|
return ii;
|
|
}
|
|
ii = indexOf.call(this._shortWeekdaysParse, llc);
|
|
if (ii !== -1) {
|
|
return ii;
|
|
}
|
|
ii = indexOf.call(this._minWeekdaysParse, llc);
|
|
return ii !== -1 ? ii : null;
|
|
} else if (format2 === "ddd") {
|
|
ii = indexOf.call(this._shortWeekdaysParse, llc);
|
|
if (ii !== -1) {
|
|
return ii;
|
|
}
|
|
ii = indexOf.call(this._weekdaysParse, llc);
|
|
if (ii !== -1) {
|
|
return ii;
|
|
}
|
|
ii = indexOf.call(this._minWeekdaysParse, llc);
|
|
return ii !== -1 ? ii : null;
|
|
} else {
|
|
ii = indexOf.call(this._minWeekdaysParse, llc);
|
|
if (ii !== -1) {
|
|
return ii;
|
|
}
|
|
ii = indexOf.call(this._weekdaysParse, llc);
|
|
if (ii !== -1) {
|
|
return ii;
|
|
}
|
|
ii = indexOf.call(this._shortWeekdaysParse, llc);
|
|
return ii !== -1 ? ii : null;
|
|
}
|
|
}
|
|
}
|
|
function localeWeekdaysParse(weekdayName, format2, strict) {
|
|
var i, mom, regex;
|
|
if (this._weekdaysParseExact) {
|
|
return handleStrictParse$1.call(this, weekdayName, format2, strict);
|
|
}
|
|
if (!this._weekdaysParse) {
|
|
this._weekdaysParse = [];
|
|
this._minWeekdaysParse = [];
|
|
this._shortWeekdaysParse = [];
|
|
this._fullWeekdaysParse = [];
|
|
}
|
|
for (i = 0; i < 7; i++) {
|
|
mom = createUTC([2e3, 1]).day(i);
|
|
if (strict && !this._fullWeekdaysParse[i]) {
|
|
this._fullWeekdaysParse[i] = new RegExp(
|
|
"^" + this.weekdays(mom, "").replace(".", "\\.?") + "$",
|
|
"i"
|
|
);
|
|
this._shortWeekdaysParse[i] = new RegExp(
|
|
"^" + this.weekdaysShort(mom, "").replace(".", "\\.?") + "$",
|
|
"i"
|
|
);
|
|
this._minWeekdaysParse[i] = new RegExp(
|
|
"^" + this.weekdaysMin(mom, "").replace(".", "\\.?") + "$",
|
|
"i"
|
|
);
|
|
}
|
|
if (!this._weekdaysParse[i]) {
|
|
regex = "^" + this.weekdays(mom, "") + "|^" + this.weekdaysShort(mom, "") + "|^" + this.weekdaysMin(mom, "");
|
|
this._weekdaysParse[i] = new RegExp(regex.replace(".", ""), "i");
|
|
}
|
|
if (strict && format2 === "dddd" && this._fullWeekdaysParse[i].test(weekdayName)) {
|
|
return i;
|
|
} else if (strict && format2 === "ddd" && this._shortWeekdaysParse[i].test(weekdayName)) {
|
|
return i;
|
|
} else if (strict && format2 === "dd" && this._minWeekdaysParse[i].test(weekdayName)) {
|
|
return i;
|
|
} else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
function getSetDayOfWeek(input) {
|
|
if (!this.isValid()) {
|
|
return input != null ? this : NaN;
|
|
}
|
|
var day = get(this, "Day");
|
|
if (input != null) {
|
|
input = parseWeekday(input, this.localeData());
|
|
return this.add(input - day, "d");
|
|
} else {
|
|
return day;
|
|
}
|
|
}
|
|
function getSetLocaleDayOfWeek(input) {
|
|
if (!this.isValid()) {
|
|
return input != null ? this : NaN;
|
|
}
|
|
var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
|
|
return input == null ? weekday : this.add(input - weekday, "d");
|
|
}
|
|
function getSetISODayOfWeek(input) {
|
|
if (!this.isValid()) {
|
|
return input != null ? this : NaN;
|
|
}
|
|
if (input != null) {
|
|
var weekday = parseIsoWeekday(input, this.localeData());
|
|
return this.day(this.day() % 7 ? weekday : weekday - 7);
|
|
} else {
|
|
return this.day() || 7;
|
|
}
|
|
}
|
|
function weekdaysRegex(isStrict) {
|
|
if (this._weekdaysParseExact) {
|
|
if (!hasOwnProp(this, "_weekdaysRegex")) {
|
|
computeWeekdaysParse.call(this);
|
|
}
|
|
if (isStrict) {
|
|
return this._weekdaysStrictRegex;
|
|
} else {
|
|
return this._weekdaysRegex;
|
|
}
|
|
} else {
|
|
if (!hasOwnProp(this, "_weekdaysRegex")) {
|
|
this._weekdaysRegex = defaultWeekdaysRegex;
|
|
}
|
|
return this._weekdaysStrictRegex && isStrict ? this._weekdaysStrictRegex : this._weekdaysRegex;
|
|
}
|
|
}
|
|
function weekdaysShortRegex(isStrict) {
|
|
if (this._weekdaysParseExact) {
|
|
if (!hasOwnProp(this, "_weekdaysRegex")) {
|
|
computeWeekdaysParse.call(this);
|
|
}
|
|
if (isStrict) {
|
|
return this._weekdaysShortStrictRegex;
|
|
} else {
|
|
return this._weekdaysShortRegex;
|
|
}
|
|
} else {
|
|
if (!hasOwnProp(this, "_weekdaysShortRegex")) {
|
|
this._weekdaysShortRegex = defaultWeekdaysShortRegex;
|
|
}
|
|
return this._weekdaysShortStrictRegex && isStrict ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
|
|
}
|
|
}
|
|
function weekdaysMinRegex(isStrict) {
|
|
if (this._weekdaysParseExact) {
|
|
if (!hasOwnProp(this, "_weekdaysRegex")) {
|
|
computeWeekdaysParse.call(this);
|
|
}
|
|
if (isStrict) {
|
|
return this._weekdaysMinStrictRegex;
|
|
} else {
|
|
return this._weekdaysMinRegex;
|
|
}
|
|
} else {
|
|
if (!hasOwnProp(this, "_weekdaysMinRegex")) {
|
|
this._weekdaysMinRegex = defaultWeekdaysMinRegex;
|
|
}
|
|
return this._weekdaysMinStrictRegex && isStrict ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
|
|
}
|
|
}
|
|
function computeWeekdaysParse() {
|
|
function cmpLenRev(a, b) {
|
|
return b.length - a.length;
|
|
}
|
|
var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], i, mom, minp, shortp, longp;
|
|
for (i = 0; i < 7; i++) {
|
|
mom = createUTC([2e3, 1]).day(i);
|
|
minp = regexEscape(this.weekdaysMin(mom, ""));
|
|
shortp = regexEscape(this.weekdaysShort(mom, ""));
|
|
longp = regexEscape(this.weekdays(mom, ""));
|
|
minPieces.push(minp);
|
|
shortPieces.push(shortp);
|
|
longPieces.push(longp);
|
|
mixedPieces.push(minp);
|
|
mixedPieces.push(shortp);
|
|
mixedPieces.push(longp);
|
|
}
|
|
minPieces.sort(cmpLenRev);
|
|
shortPieces.sort(cmpLenRev);
|
|
longPieces.sort(cmpLenRev);
|
|
mixedPieces.sort(cmpLenRev);
|
|
this._weekdaysRegex = new RegExp("^(" + mixedPieces.join("|") + ")", "i");
|
|
this._weekdaysShortRegex = this._weekdaysRegex;
|
|
this._weekdaysMinRegex = this._weekdaysRegex;
|
|
this._weekdaysStrictRegex = new RegExp(
|
|
"^(" + longPieces.join("|") + ")",
|
|
"i"
|
|
);
|
|
this._weekdaysShortStrictRegex = new RegExp(
|
|
"^(" + shortPieces.join("|") + ")",
|
|
"i"
|
|
);
|
|
this._weekdaysMinStrictRegex = new RegExp(
|
|
"^(" + minPieces.join("|") + ")",
|
|
"i"
|
|
);
|
|
}
|
|
function hFormat() {
|
|
return this.hours() % 12 || 12;
|
|
}
|
|
function kFormat() {
|
|
return this.hours() || 24;
|
|
}
|
|
addFormatToken("H", ["HH", 2], 0, "hour");
|
|
addFormatToken("h", ["hh", 2], 0, hFormat);
|
|
addFormatToken("k", ["kk", 2], 0, kFormat);
|
|
addFormatToken("hmm", 0, 0, function() {
|
|
return "" + hFormat.apply(this) + zeroFill(this.minutes(), 2);
|
|
});
|
|
addFormatToken("hmmss", 0, 0, function() {
|
|
return "" + hFormat.apply(this) + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2);
|
|
});
|
|
addFormatToken("Hmm", 0, 0, function() {
|
|
return "" + this.hours() + zeroFill(this.minutes(), 2);
|
|
});
|
|
addFormatToken("Hmmss", 0, 0, function() {
|
|
return "" + this.hours() + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2);
|
|
});
|
|
function meridiem(token2, lowercase) {
|
|
addFormatToken(token2, 0, 0, function() {
|
|
return this.localeData().meridiem(
|
|
this.hours(),
|
|
this.minutes(),
|
|
lowercase
|
|
);
|
|
});
|
|
}
|
|
meridiem("a", true);
|
|
meridiem("A", false);
|
|
function matchMeridiem(isStrict, locale3) {
|
|
return locale3._meridiemParse;
|
|
}
|
|
addRegexToken("a", matchMeridiem);
|
|
addRegexToken("A", matchMeridiem);
|
|
addRegexToken("H", match1to2, match1to2HasZero);
|
|
addRegexToken("h", match1to2, match1to2NoLeadingZero);
|
|
addRegexToken("k", match1to2, match1to2NoLeadingZero);
|
|
addRegexToken("HH", match1to2, match2);
|
|
addRegexToken("hh", match1to2, match2);
|
|
addRegexToken("kk", match1to2, match2);
|
|
addRegexToken("hmm", match3to4);
|
|
addRegexToken("hmmss", match5to6);
|
|
addRegexToken("Hmm", match3to4);
|
|
addRegexToken("Hmmss", match5to6);
|
|
addParseToken(["H", "HH"], HOUR);
|
|
addParseToken(["k", "kk"], function(input, array, config) {
|
|
var kInput = toInt(input);
|
|
array[HOUR] = kInput === 24 ? 0 : kInput;
|
|
});
|
|
addParseToken(["a", "A"], function(input, array, config) {
|
|
config._isPm = config._locale.isPM(input);
|
|
config._meridiem = input;
|
|
});
|
|
addParseToken(["h", "hh"], function(input, array, config) {
|
|
array[HOUR] = toInt(input);
|
|
getParsingFlags(config).bigHour = true;
|
|
});
|
|
addParseToken("hmm", function(input, array, config) {
|
|
var pos = input.length - 2;
|
|
array[HOUR] = toInt(input.substr(0, pos));
|
|
array[MINUTE] = toInt(input.substr(pos));
|
|
getParsingFlags(config).bigHour = true;
|
|
});
|
|
addParseToken("hmmss", function(input, array, config) {
|
|
var pos1 = input.length - 4, pos2 = input.length - 2;
|
|
array[HOUR] = toInt(input.substr(0, pos1));
|
|
array[MINUTE] = toInt(input.substr(pos1, 2));
|
|
array[SECOND] = toInt(input.substr(pos2));
|
|
getParsingFlags(config).bigHour = true;
|
|
});
|
|
addParseToken("Hmm", function(input, array, config) {
|
|
var pos = input.length - 2;
|
|
array[HOUR] = toInt(input.substr(0, pos));
|
|
array[MINUTE] = toInt(input.substr(pos));
|
|
});
|
|
addParseToken("Hmmss", function(input, array, config) {
|
|
var pos1 = input.length - 4, pos2 = input.length - 2;
|
|
array[HOUR] = toInt(input.substr(0, pos1));
|
|
array[MINUTE] = toInt(input.substr(pos1, 2));
|
|
array[SECOND] = toInt(input.substr(pos2));
|
|
});
|
|
function localeIsPM(input) {
|
|
return (input + "").toLowerCase().charAt(0) === "p";
|
|
}
|
|
var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i, getSetHour = makeGetSet("Hours", true);
|
|
function localeMeridiem(hours2, minutes2, isLower) {
|
|
if (hours2 > 11) {
|
|
return isLower ? "pm" : "PM";
|
|
} else {
|
|
return isLower ? "am" : "AM";
|
|
}
|
|
}
|
|
var baseConfig = {
|
|
calendar: defaultCalendar,
|
|
longDateFormat: defaultLongDateFormat,
|
|
invalidDate: defaultInvalidDate,
|
|
ordinal: defaultOrdinal,
|
|
dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
|
|
relativeTime: defaultRelativeTime,
|
|
months: defaultLocaleMonths,
|
|
monthsShort: defaultLocaleMonthsShort,
|
|
week: defaultLocaleWeek,
|
|
weekdays: defaultLocaleWeekdays,
|
|
weekdaysMin: defaultLocaleWeekdaysMin,
|
|
weekdaysShort: defaultLocaleWeekdaysShort,
|
|
meridiemParse: defaultLocaleMeridiemParse
|
|
};
|
|
var locales = {}, localeFamilies = {}, globalLocale;
|
|
function commonPrefix(arr1, arr2) {
|
|
var i, minl = Math.min(arr1.length, arr2.length);
|
|
for (i = 0; i < minl; i += 1) {
|
|
if (arr1[i] !== arr2[i]) {
|
|
return i;
|
|
}
|
|
}
|
|
return minl;
|
|
}
|
|
function normalizeLocale(key) {
|
|
return key ? key.toLowerCase().replace("_", "-") : key;
|
|
}
|
|
function chooseLocale(names2) {
|
|
var i = 0, j, next, locale3, split;
|
|
while (i < names2.length) {
|
|
split = normalizeLocale(names2[i]).split("-");
|
|
j = split.length;
|
|
next = normalizeLocale(names2[i + 1]);
|
|
next = next ? next.split("-") : null;
|
|
while (j > 0) {
|
|
locale3 = loadLocale(split.slice(0, j).join("-"));
|
|
if (locale3) {
|
|
return locale3;
|
|
}
|
|
if (next && next.length >= j && commonPrefix(split, next) >= j - 1) {
|
|
break;
|
|
}
|
|
j--;
|
|
}
|
|
i++;
|
|
}
|
|
return globalLocale;
|
|
}
|
|
function isLocaleNameSane(name) {
|
|
return !!(name && name.match("^[^/\\\\]*$"));
|
|
}
|
|
function loadLocale(name) {
|
|
var oldLocale = null, aliasedRequire;
|
|
if (locales[name] === void 0 && typeof module2 !== "undefined" && module2 && module2.exports && isLocaleNameSane(name)) {
|
|
try {
|
|
oldLocale = globalLocale._abbr;
|
|
aliasedRequire = require;
|
|
aliasedRequire("./locale/" + name);
|
|
getSetGlobalLocale(oldLocale);
|
|
} catch (e) {
|
|
locales[name] = null;
|
|
}
|
|
}
|
|
return locales[name];
|
|
}
|
|
function getSetGlobalLocale(key, values) {
|
|
var data;
|
|
if (key) {
|
|
if (isUndefined(values)) {
|
|
data = getLocale(key);
|
|
} else {
|
|
data = defineLocale(key, values);
|
|
}
|
|
if (data) {
|
|
globalLocale = data;
|
|
} else {
|
|
if (typeof console !== "undefined" && console.warn) {
|
|
console.warn(
|
|
"Locale " + key + " not found. Did you forget to load it?"
|
|
);
|
|
}
|
|
}
|
|
}
|
|
return globalLocale._abbr;
|
|
}
|
|
function defineLocale(name, config) {
|
|
if (config !== null) {
|
|
var locale3, parentConfig = baseConfig;
|
|
config.abbr = name;
|
|
if (locales[name] != null) {
|
|
deprecateSimple(
|
|
"defineLocaleOverride",
|
|
"use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."
|
|
);
|
|
parentConfig = locales[name]._config;
|
|
} else if (config.parentLocale != null) {
|
|
if (locales[config.parentLocale] != null) {
|
|
parentConfig = locales[config.parentLocale]._config;
|
|
} else {
|
|
locale3 = loadLocale(config.parentLocale);
|
|
if (locale3 != null) {
|
|
parentConfig = locale3._config;
|
|
} else {
|
|
if (!localeFamilies[config.parentLocale]) {
|
|
localeFamilies[config.parentLocale] = [];
|
|
}
|
|
localeFamilies[config.parentLocale].push({
|
|
name,
|
|
config
|
|
});
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
locales[name] = new Locale(mergeConfigs(parentConfig, config));
|
|
if (localeFamilies[name]) {
|
|
localeFamilies[name].forEach(function(x) {
|
|
defineLocale(x.name, x.config);
|
|
});
|
|
}
|
|
getSetGlobalLocale(name);
|
|
return locales[name];
|
|
} else {
|
|
delete locales[name];
|
|
return null;
|
|
}
|
|
}
|
|
function updateLocale(name, config) {
|
|
if (config != null) {
|
|
var locale3, tmpLocale, parentConfig = baseConfig;
|
|
if (locales[name] != null && locales[name].parentLocale != null) {
|
|
locales[name].set(mergeConfigs(locales[name]._config, config));
|
|
} else {
|
|
tmpLocale = loadLocale(name);
|
|
if (tmpLocale != null) {
|
|
parentConfig = tmpLocale._config;
|
|
}
|
|
config = mergeConfigs(parentConfig, config);
|
|
if (tmpLocale == null) {
|
|
config.abbr = name;
|
|
}
|
|
locale3 = new Locale(config);
|
|
locale3.parentLocale = locales[name];
|
|
locales[name] = locale3;
|
|
}
|
|
getSetGlobalLocale(name);
|
|
} else {
|
|
if (locales[name] != null) {
|
|
if (locales[name].parentLocale != null) {
|
|
locales[name] = locales[name].parentLocale;
|
|
if (name === getSetGlobalLocale()) {
|
|
getSetGlobalLocale(name);
|
|
}
|
|
} else if (locales[name] != null) {
|
|
delete locales[name];
|
|
}
|
|
}
|
|
}
|
|
return locales[name];
|
|
}
|
|
function getLocale(key) {
|
|
var locale3;
|
|
if (key && key._locale && key._locale._abbr) {
|
|
key = key._locale._abbr;
|
|
}
|
|
if (!key) {
|
|
return globalLocale;
|
|
}
|
|
if (!isArray2(key)) {
|
|
locale3 = loadLocale(key);
|
|
if (locale3) {
|
|
return locale3;
|
|
}
|
|
key = [key];
|
|
}
|
|
return chooseLocale(key);
|
|
}
|
|
function listLocales() {
|
|
return keys(locales);
|
|
}
|
|
function checkOverflow(m) {
|
|
var overflow, a = m._a;
|
|
if (a && getParsingFlags(m).overflow === -2) {
|
|
overflow = a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : a[HOUR] < 0 || a[HOUR] > 24 || a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0) ? HOUR : a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : -1;
|
|
if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
|
|
overflow = DATE;
|
|
}
|
|
if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
|
|
overflow = WEEK;
|
|
}
|
|
if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
|
|
overflow = WEEKDAY;
|
|
}
|
|
getParsingFlags(m).overflow = overflow;
|
|
}
|
|
return m;
|
|
}
|
|
var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, tzRegex = /Z|[+-]\d\d(?::?\d\d)?/, isoDates = [
|
|
["YYYYYY-MM-DD", /[+-]\d{6}-\d\d-\d\d/],
|
|
["YYYY-MM-DD", /\d{4}-\d\d-\d\d/],
|
|
["GGGG-[W]WW-E", /\d{4}-W\d\d-\d/],
|
|
["GGGG-[W]WW", /\d{4}-W\d\d/, false],
|
|
["YYYY-DDD", /\d{4}-\d{3}/],
|
|
["YYYY-MM", /\d{4}-\d\d/, false],
|
|
["YYYYYYMMDD", /[+-]\d{10}/],
|
|
["YYYYMMDD", /\d{8}/],
|
|
["GGGG[W]WWE", /\d{4}W\d{3}/],
|
|
["GGGG[W]WW", /\d{4}W\d{2}/, false],
|
|
["YYYYDDD", /\d{7}/],
|
|
["YYYYMM", /\d{6}/, false],
|
|
["YYYY", /\d{4}/, false]
|
|
], isoTimes = [
|
|
["HH:mm:ss.SSSS", /\d\d:\d\d:\d\d\.\d+/],
|
|
["HH:mm:ss,SSSS", /\d\d:\d\d:\d\d,\d+/],
|
|
["HH:mm:ss", /\d\d:\d\d:\d\d/],
|
|
["HH:mm", /\d\d:\d\d/],
|
|
["HHmmss.SSSS", /\d\d\d\d\d\d\.\d+/],
|
|
["HHmmss,SSSS", /\d\d\d\d\d\d,\d+/],
|
|
["HHmmss", /\d\d\d\d\d\d/],
|
|
["HHmm", /\d\d\d\d/],
|
|
["HH", /\d\d/]
|
|
], aspNetJsonRegex = /^\/?Date\((-?\d+)/i, rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, obsOffsets = {
|
|
UT: 0,
|
|
GMT: 0,
|
|
EDT: -4 * 60,
|
|
EST: -5 * 60,
|
|
CDT: -5 * 60,
|
|
CST: -6 * 60,
|
|
MDT: -6 * 60,
|
|
MST: -7 * 60,
|
|
PDT: -7 * 60,
|
|
PST: -8 * 60
|
|
};
|
|
function configFromISO(config) {
|
|
var i, l, string = config._i, match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), allowTime, dateFormat, timeFormat, tzFormat, isoDatesLen = isoDates.length, isoTimesLen = isoTimes.length;
|
|
if (match) {
|
|
getParsingFlags(config).iso = true;
|
|
for (i = 0, l = isoDatesLen; i < l; i++) {
|
|
if (isoDates[i][1].exec(match[1])) {
|
|
dateFormat = isoDates[i][0];
|
|
allowTime = isoDates[i][2] !== false;
|
|
break;
|
|
}
|
|
}
|
|
if (dateFormat == null) {
|
|
config._isValid = false;
|
|
return;
|
|
}
|
|
if (match[3]) {
|
|
for (i = 0, l = isoTimesLen; i < l; i++) {
|
|
if (isoTimes[i][1].exec(match[3])) {
|
|
timeFormat = (match[2] || " ") + isoTimes[i][0];
|
|
break;
|
|
}
|
|
}
|
|
if (timeFormat == null) {
|
|
config._isValid = false;
|
|
return;
|
|
}
|
|
}
|
|
if (!allowTime && timeFormat != null) {
|
|
config._isValid = false;
|
|
return;
|
|
}
|
|
if (match[4]) {
|
|
if (tzRegex.exec(match[4])) {
|
|
tzFormat = "Z";
|
|
} else {
|
|
config._isValid = false;
|
|
return;
|
|
}
|
|
}
|
|
config._f = dateFormat + (timeFormat || "") + (tzFormat || "");
|
|
configFromStringAndFormat(config);
|
|
} else {
|
|
config._isValid = false;
|
|
}
|
|
}
|
|
function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {
|
|
var result = [
|
|
untruncateYear(yearStr),
|
|
defaultLocaleMonthsShort.indexOf(monthStr),
|
|
parseInt(dayStr, 10),
|
|
parseInt(hourStr, 10),
|
|
parseInt(minuteStr, 10)
|
|
];
|
|
if (secondStr) {
|
|
result.push(parseInt(secondStr, 10));
|
|
}
|
|
return result;
|
|
}
|
|
function untruncateYear(yearStr) {
|
|
var year = parseInt(yearStr, 10);
|
|
if (year <= 49) {
|
|
return 2e3 + year;
|
|
} else if (year <= 999) {
|
|
return 1900 + year;
|
|
}
|
|
return year;
|
|
}
|
|
function preprocessRFC2822(s) {
|
|
return s.replace(/\([^()]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").replace(/^\s\s*/, "").replace(/\s\s*$/, "");
|
|
}
|
|
function checkWeekday(weekdayStr, parsedInput, config) {
|
|
if (weekdayStr) {
|
|
var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), weekdayActual = new Date(
|
|
parsedInput[0],
|
|
parsedInput[1],
|
|
parsedInput[2]
|
|
).getDay();
|
|
if (weekdayProvided !== weekdayActual) {
|
|
getParsingFlags(config).weekdayMismatch = true;
|
|
config._isValid = false;
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function calculateOffset(obsOffset, militaryOffset, numOffset) {
|
|
if (obsOffset) {
|
|
return obsOffsets[obsOffset];
|
|
} else if (militaryOffset) {
|
|
return 0;
|
|
} else {
|
|
var hm = parseInt(numOffset, 10), m = hm % 100, h4 = (hm - m) / 100;
|
|
return h4 * 60 + m;
|
|
}
|
|
}
|
|
function configFromRFC2822(config) {
|
|
var match = rfc2822.exec(preprocessRFC2822(config._i)), parsedArray;
|
|
if (match) {
|
|
parsedArray = extractFromRFC2822Strings(
|
|
match[4],
|
|
match[3],
|
|
match[2],
|
|
match[5],
|
|
match[6],
|
|
match[7]
|
|
);
|
|
if (!checkWeekday(match[1], parsedArray, config)) {
|
|
return;
|
|
}
|
|
config._a = parsedArray;
|
|
config._tzm = calculateOffset(match[8], match[9], match[10]);
|
|
config._d = createUTCDate.apply(null, config._a);
|
|
config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
|
|
getParsingFlags(config).rfc2822 = true;
|
|
} else {
|
|
config._isValid = false;
|
|
}
|
|
}
|
|
function configFromString(config) {
|
|
var matched = aspNetJsonRegex.exec(config._i);
|
|
if (matched !== null) {
|
|
config._d = /* @__PURE__ */ new Date(+matched[1]);
|
|
return;
|
|
}
|
|
configFromISO(config);
|
|
if (config._isValid === false) {
|
|
delete config._isValid;
|
|
} else {
|
|
return;
|
|
}
|
|
configFromRFC2822(config);
|
|
if (config._isValid === false) {
|
|
delete config._isValid;
|
|
} else {
|
|
return;
|
|
}
|
|
if (config._strict) {
|
|
config._isValid = false;
|
|
} else {
|
|
hooks.createFromInputFallback(config);
|
|
}
|
|
}
|
|
hooks.createFromInputFallback = deprecate(
|
|
"value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",
|
|
function(config) {
|
|
config._d = /* @__PURE__ */ new Date(config._i + (config._useUTC ? " UTC" : ""));
|
|
}
|
|
);
|
|
function defaults2(a, b, c) {
|
|
if (a != null) {
|
|
return a;
|
|
}
|
|
if (b != null) {
|
|
return b;
|
|
}
|
|
return c;
|
|
}
|
|
function currentDateArray(config) {
|
|
var nowValue = new Date(hooks.now());
|
|
if (config._useUTC) {
|
|
return [
|
|
nowValue.getUTCFullYear(),
|
|
nowValue.getUTCMonth(),
|
|
nowValue.getUTCDate()
|
|
];
|
|
}
|
|
return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
|
|
}
|
|
function configFromArray(config) {
|
|
var i, date, input = [], currentDate, expectedWeekday, yearToUse;
|
|
if (config._d) {
|
|
return;
|
|
}
|
|
currentDate = currentDateArray(config);
|
|
if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
|
|
dayOfYearFromWeekInfo(config);
|
|
}
|
|
if (config._dayOfYear != null) {
|
|
yearToUse = defaults2(config._a[YEAR], currentDate[YEAR]);
|
|
if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {
|
|
getParsingFlags(config)._overflowDayOfYear = true;
|
|
}
|
|
date = createUTCDate(yearToUse, 0, config._dayOfYear);
|
|
config._a[MONTH] = date.getUTCMonth();
|
|
config._a[DATE] = date.getUTCDate();
|
|
}
|
|
for (i = 0; i < 3 && config._a[i] == null; ++i) {
|
|
config._a[i] = input[i] = currentDate[i];
|
|
}
|
|
for (; i < 7; i++) {
|
|
config._a[i] = input[i] = config._a[i] == null ? i === 2 ? 1 : 0 : config._a[i];
|
|
}
|
|
if (config._a[HOUR] === 24 && config._a[MINUTE] === 0 && config._a[SECOND] === 0 && config._a[MILLISECOND] === 0) {
|
|
config._nextDay = true;
|
|
config._a[HOUR] = 0;
|
|
}
|
|
config._d = (config._useUTC ? createUTCDate : createDate).apply(
|
|
null,
|
|
input
|
|
);
|
|
expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();
|
|
if (config._tzm != null) {
|
|
config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
|
|
}
|
|
if (config._nextDay) {
|
|
config._a[HOUR] = 24;
|
|
}
|
|
if (config._w && typeof config._w.d !== "undefined" && config._w.d !== expectedWeekday) {
|
|
getParsingFlags(config).weekdayMismatch = true;
|
|
}
|
|
}
|
|
function dayOfYearFromWeekInfo(config) {
|
|
var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;
|
|
w = config._w;
|
|
if (w.GG != null || w.W != null || w.E != null) {
|
|
dow = 1;
|
|
doy = 4;
|
|
weekYear = defaults2(
|
|
w.GG,
|
|
config._a[YEAR],
|
|
weekOfYear(createLocal(), 1, 4).year
|
|
);
|
|
week = defaults2(w.W, 1);
|
|
weekday = defaults2(w.E, 1);
|
|
if (weekday < 1 || weekday > 7) {
|
|
weekdayOverflow = true;
|
|
}
|
|
} else {
|
|
dow = config._locale._week.dow;
|
|
doy = config._locale._week.doy;
|
|
curWeek = weekOfYear(createLocal(), dow, doy);
|
|
weekYear = defaults2(w.gg, config._a[YEAR], curWeek.year);
|
|
week = defaults2(w.w, curWeek.week);
|
|
if (w.d != null) {
|
|
weekday = w.d;
|
|
if (weekday < 0 || weekday > 6) {
|
|
weekdayOverflow = true;
|
|
}
|
|
} else if (w.e != null) {
|
|
weekday = w.e + dow;
|
|
if (w.e < 0 || w.e > 6) {
|
|
weekdayOverflow = true;
|
|
}
|
|
} else {
|
|
weekday = dow;
|
|
}
|
|
}
|
|
if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
|
|
getParsingFlags(config)._overflowWeeks = true;
|
|
} else if (weekdayOverflow != null) {
|
|
getParsingFlags(config)._overflowWeekday = true;
|
|
} else {
|
|
temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
|
|
config._a[YEAR] = temp.year;
|
|
config._dayOfYear = temp.dayOfYear;
|
|
}
|
|
}
|
|
hooks.ISO_8601 = function() {
|
|
};
|
|
hooks.RFC_2822 = function() {
|
|
};
|
|
function configFromStringAndFormat(config) {
|
|
if (config._f === hooks.ISO_8601) {
|
|
configFromISO(config);
|
|
return;
|
|
}
|
|
if (config._f === hooks.RFC_2822) {
|
|
configFromRFC2822(config);
|
|
return;
|
|
}
|
|
config._a = [];
|
|
getParsingFlags(config).empty = true;
|
|
var string = "" + config._i, i, parsedInput, tokens2, token2, skipped, stringLength = string.length, totalParsedInputLength = 0, era, tokenLen;
|
|
tokens2 = expandFormat(config._f, config._locale).match(formattingTokens) || [];
|
|
tokenLen = tokens2.length;
|
|
for (i = 0; i < tokenLen; i++) {
|
|
token2 = tokens2[i];
|
|
parsedInput = (string.match(getParseRegexForToken(token2, config)) || [])[0];
|
|
if (parsedInput) {
|
|
skipped = string.substr(0, string.indexOf(parsedInput));
|
|
if (skipped.length > 0) {
|
|
getParsingFlags(config).unusedInput.push(skipped);
|
|
}
|
|
string = string.slice(
|
|
string.indexOf(parsedInput) + parsedInput.length
|
|
);
|
|
totalParsedInputLength += parsedInput.length;
|
|
}
|
|
if (formatTokenFunctions[token2]) {
|
|
if (parsedInput) {
|
|
getParsingFlags(config).empty = false;
|
|
} else {
|
|
getParsingFlags(config).unusedTokens.push(token2);
|
|
}
|
|
addTimeToArrayFromToken(token2, parsedInput, config);
|
|
} else if (config._strict && !parsedInput) {
|
|
getParsingFlags(config).unusedTokens.push(token2);
|
|
}
|
|
}
|
|
getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
|
|
if (string.length > 0) {
|
|
getParsingFlags(config).unusedInput.push(string);
|
|
}
|
|
if (config._a[HOUR] <= 12 && getParsingFlags(config).bigHour === true && config._a[HOUR] > 0) {
|
|
getParsingFlags(config).bigHour = void 0;
|
|
}
|
|
getParsingFlags(config).parsedDateParts = config._a.slice(0);
|
|
getParsingFlags(config).meridiem = config._meridiem;
|
|
config._a[HOUR] = meridiemFixWrap(
|
|
config._locale,
|
|
config._a[HOUR],
|
|
config._meridiem
|
|
);
|
|
era = getParsingFlags(config).era;
|
|
if (era !== null) {
|
|
config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);
|
|
}
|
|
configFromArray(config);
|
|
checkOverflow(config);
|
|
}
|
|
function meridiemFixWrap(locale3, hour, meridiem2) {
|
|
var isPm;
|
|
if (meridiem2 == null) {
|
|
return hour;
|
|
}
|
|
if (locale3.meridiemHour != null) {
|
|
return locale3.meridiemHour(hour, meridiem2);
|
|
} else if (locale3.isPM != null) {
|
|
isPm = locale3.isPM(meridiem2);
|
|
if (isPm && hour < 12) {
|
|
hour += 12;
|
|
}
|
|
if (!isPm && hour === 12) {
|
|
hour = 0;
|
|
}
|
|
return hour;
|
|
} else {
|
|
return hour;
|
|
}
|
|
}
|
|
function configFromStringAndArray(config) {
|
|
var tempConfig, bestMoment, scoreToBeat, i, currentScore, validFormatFound, bestFormatIsValid = false, configfLen = config._f.length;
|
|
if (configfLen === 0) {
|
|
getParsingFlags(config).invalidFormat = true;
|
|
config._d = /* @__PURE__ */ new Date(NaN);
|
|
return;
|
|
}
|
|
for (i = 0; i < configfLen; i++) {
|
|
currentScore = 0;
|
|
validFormatFound = false;
|
|
tempConfig = copyConfig({}, config);
|
|
if (config._useUTC != null) {
|
|
tempConfig._useUTC = config._useUTC;
|
|
}
|
|
tempConfig._f = config._f[i];
|
|
configFromStringAndFormat(tempConfig);
|
|
if (isValid(tempConfig)) {
|
|
validFormatFound = true;
|
|
}
|
|
currentScore += getParsingFlags(tempConfig).charsLeftOver;
|
|
currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
|
|
getParsingFlags(tempConfig).score = currentScore;
|
|
if (!bestFormatIsValid) {
|
|
if (scoreToBeat == null || currentScore < scoreToBeat || validFormatFound) {
|
|
scoreToBeat = currentScore;
|
|
bestMoment = tempConfig;
|
|
if (validFormatFound) {
|
|
bestFormatIsValid = true;
|
|
}
|
|
}
|
|
} else {
|
|
if (currentScore < scoreToBeat) {
|
|
scoreToBeat = currentScore;
|
|
bestMoment = tempConfig;
|
|
}
|
|
}
|
|
}
|
|
extend(config, bestMoment || tempConfig);
|
|
}
|
|
function configFromObject(config) {
|
|
if (config._d) {
|
|
return;
|
|
}
|
|
var i = normalizeObjectUnits(config._i), dayOrDate = i.day === void 0 ? i.date : i.day;
|
|
config._a = map3(
|
|
[i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],
|
|
function(obj) {
|
|
return obj && parseInt(obj, 10);
|
|
}
|
|
);
|
|
configFromArray(config);
|
|
}
|
|
function createFromConfig(config) {
|
|
var res = new Moment(checkOverflow(prepareConfig(config)));
|
|
if (res._nextDay) {
|
|
res.add(1, "d");
|
|
res._nextDay = void 0;
|
|
}
|
|
return res;
|
|
}
|
|
function prepareConfig(config) {
|
|
var input = config._i, format2 = config._f;
|
|
config._locale = config._locale || getLocale(config._l);
|
|
if (input === null || format2 === void 0 && input === "") {
|
|
return createInvalid({ nullInput: true });
|
|
}
|
|
if (typeof input === "string") {
|
|
config._i = input = config._locale.preparse(input);
|
|
}
|
|
if (isMoment(input)) {
|
|
return new Moment(checkOverflow(input));
|
|
} else if (isDate(input)) {
|
|
config._d = input;
|
|
} else if (isArray2(format2)) {
|
|
configFromStringAndArray(config);
|
|
} else if (format2) {
|
|
configFromStringAndFormat(config);
|
|
} else {
|
|
configFromInput(config);
|
|
}
|
|
if (!isValid(config)) {
|
|
config._d = null;
|
|
}
|
|
return config;
|
|
}
|
|
function configFromInput(config) {
|
|
var input = config._i;
|
|
if (isUndefined(input)) {
|
|
config._d = new Date(hooks.now());
|
|
} else if (isDate(input)) {
|
|
config._d = new Date(input.valueOf());
|
|
} else if (typeof input === "string") {
|
|
configFromString(config);
|
|
} else if (isArray2(input)) {
|
|
config._a = map3(input.slice(0), function(obj) {
|
|
return parseInt(obj, 10);
|
|
});
|
|
configFromArray(config);
|
|
} else if (isObject2(input)) {
|
|
configFromObject(config);
|
|
} else if (isNumber2(input)) {
|
|
config._d = new Date(input);
|
|
} else {
|
|
hooks.createFromInputFallback(config);
|
|
}
|
|
}
|
|
function createLocalOrUTC(input, format2, locale3, strict, isUTC) {
|
|
var c = {};
|
|
if (format2 === true || format2 === false) {
|
|
strict = format2;
|
|
format2 = void 0;
|
|
}
|
|
if (locale3 === true || locale3 === false) {
|
|
strict = locale3;
|
|
locale3 = void 0;
|
|
}
|
|
if (isObject2(input) && isObjectEmpty(input) || isArray2(input) && input.length === 0) {
|
|
input = void 0;
|
|
}
|
|
c._isAMomentObject = true;
|
|
c._useUTC = c._isUTC = isUTC;
|
|
c._l = locale3;
|
|
c._i = input;
|
|
c._f = format2;
|
|
c._strict = strict;
|
|
return createFromConfig(c);
|
|
}
|
|
function createLocal(input, format2, locale3, strict) {
|
|
return createLocalOrUTC(input, format2, locale3, strict, false);
|
|
}
|
|
var prototypeMin = deprecate(
|
|
"moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",
|
|
function() {
|
|
var other = createLocal.apply(null, arguments);
|
|
if (this.isValid() && other.isValid()) {
|
|
return other < this ? this : other;
|
|
} else {
|
|
return createInvalid();
|
|
}
|
|
}
|
|
), prototypeMax = deprecate(
|
|
"moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",
|
|
function() {
|
|
var other = createLocal.apply(null, arguments);
|
|
if (this.isValid() && other.isValid()) {
|
|
return other > this ? this : other;
|
|
} else {
|
|
return createInvalid();
|
|
}
|
|
}
|
|
);
|
|
function pickBy(fn, moments) {
|
|
var res, i;
|
|
if (moments.length === 1 && isArray2(moments[0])) {
|
|
moments = moments[0];
|
|
}
|
|
if (!moments.length) {
|
|
return createLocal();
|
|
}
|
|
res = moments[0];
|
|
for (i = 1; i < moments.length; ++i) {
|
|
if (!moments[i].isValid() || moments[i][fn](res)) {
|
|
res = moments[i];
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
function min() {
|
|
var args = [].slice.call(arguments, 0);
|
|
return pickBy("isBefore", args);
|
|
}
|
|
function max() {
|
|
var args = [].slice.call(arguments, 0);
|
|
return pickBy("isAfter", args);
|
|
}
|
|
var now = function() {
|
|
return Date.now ? Date.now() : +/* @__PURE__ */ new Date();
|
|
};
|
|
var ordering = [
|
|
"year",
|
|
"quarter",
|
|
"month",
|
|
"week",
|
|
"day",
|
|
"hour",
|
|
"minute",
|
|
"second",
|
|
"millisecond"
|
|
];
|
|
function isDurationValid(m) {
|
|
var key, unitHasDecimal = false, i, orderLen = ordering.length;
|
|
for (key in m) {
|
|
if (hasOwnProp(m, key) && !(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {
|
|
return false;
|
|
}
|
|
}
|
|
for (i = 0; i < orderLen; ++i) {
|
|
if (m[ordering[i]]) {
|
|
if (unitHasDecimal) {
|
|
return false;
|
|
}
|
|
if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
|
|
unitHasDecimal = true;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function isValid$1() {
|
|
return this._isValid;
|
|
}
|
|
function createInvalid$1() {
|
|
return createDuration(NaN);
|
|
}
|
|
function Duration(duration) {
|
|
var normalizedInput = normalizeObjectUnits(duration), years2 = normalizedInput.year || 0, quarters = normalizedInput.quarter || 0, months2 = normalizedInput.month || 0, weeks2 = normalizedInput.week || normalizedInput.isoWeek || 0, days2 = normalizedInput.day || 0, hours2 = normalizedInput.hour || 0, minutes2 = normalizedInput.minute || 0, seconds2 = normalizedInput.second || 0, milliseconds2 = normalizedInput.millisecond || 0;
|
|
this._isValid = isDurationValid(normalizedInput);
|
|
this._milliseconds = +milliseconds2 + seconds2 * 1e3 + // 1000
|
|
minutes2 * 6e4 + // 1000 * 60
|
|
hours2 * 1e3 * 60 * 60;
|
|
this._days = +days2 + weeks2 * 7;
|
|
this._months = +months2 + quarters * 3 + years2 * 12;
|
|
this._data = {};
|
|
this._locale = getLocale();
|
|
this._bubble();
|
|
}
|
|
function isDuration(obj) {
|
|
return obj instanceof Duration;
|
|
}
|
|
function absRound(number) {
|
|
if (number < 0) {
|
|
return Math.round(-1 * number) * -1;
|
|
} else {
|
|
return Math.round(number);
|
|
}
|
|
}
|
|
function compareArrays(array1, array2, dontConvert) {
|
|
var len = Math.min(array1.length, array2.length), lengthDiff = Math.abs(array1.length - array2.length), diffs = 0, i;
|
|
for (i = 0; i < len; i++) {
|
|
if (dontConvert && array1[i] !== array2[i] || !dontConvert && toInt(array1[i]) !== toInt(array2[i])) {
|
|
diffs++;
|
|
}
|
|
}
|
|
return diffs + lengthDiff;
|
|
}
|
|
function offset(token2, separator) {
|
|
addFormatToken(token2, 0, 0, function() {
|
|
var offset2 = this.utcOffset(), sign3 = "+";
|
|
if (offset2 < 0) {
|
|
offset2 = -offset2;
|
|
sign3 = "-";
|
|
}
|
|
return sign3 + zeroFill(~~(offset2 / 60), 2) + separator + zeroFill(~~offset2 % 60, 2);
|
|
});
|
|
}
|
|
offset("Z", ":");
|
|
offset("ZZ", "");
|
|
addRegexToken("Z", matchShortOffset);
|
|
addRegexToken("ZZ", matchShortOffset);
|
|
addParseToken(["Z", "ZZ"], function(input, array, config) {
|
|
config._useUTC = true;
|
|
config._tzm = offsetFromString(matchShortOffset, input);
|
|
});
|
|
var chunkOffset = /([\+\-]|\d\d)/gi;
|
|
function offsetFromString(matcher, string) {
|
|
var matches = (string || "").match(matcher), chunk, parts, minutes2;
|
|
if (matches === null) {
|
|
return null;
|
|
}
|
|
chunk = matches[matches.length - 1] || [];
|
|
parts = (chunk + "").match(chunkOffset) || ["-", 0, 0];
|
|
minutes2 = +(parts[1] * 60) + toInt(parts[2]);
|
|
return minutes2 === 0 ? 0 : parts[0] === "+" ? minutes2 : -minutes2;
|
|
}
|
|
function cloneWithOffset(input, model) {
|
|
var res, diff2;
|
|
if (model._isUTC) {
|
|
res = model.clone();
|
|
diff2 = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();
|
|
res._d.setTime(res._d.valueOf() + diff2);
|
|
hooks.updateOffset(res, false);
|
|
return res;
|
|
} else {
|
|
return createLocal(input).local();
|
|
}
|
|
}
|
|
function getDateOffset(m) {
|
|
return -Math.round(m._d.getTimezoneOffset());
|
|
}
|
|
hooks.updateOffset = function() {
|
|
};
|
|
function getSetOffset(input, keepLocalTime, keepMinutes) {
|
|
var offset2 = this._offset || 0, localAdjust;
|
|
if (!this.isValid()) {
|
|
return input != null ? this : NaN;
|
|
}
|
|
if (input != null) {
|
|
if (typeof input === "string") {
|
|
input = offsetFromString(matchShortOffset, input);
|
|
if (input === null) {
|
|
return this;
|
|
}
|
|
} else if (Math.abs(input) < 16 && !keepMinutes) {
|
|
input = input * 60;
|
|
}
|
|
if (!this._isUTC && keepLocalTime) {
|
|
localAdjust = getDateOffset(this);
|
|
}
|
|
this._offset = input;
|
|
this._isUTC = true;
|
|
if (localAdjust != null) {
|
|
this.add(localAdjust, "m");
|
|
}
|
|
if (offset2 !== input) {
|
|
if (!keepLocalTime || this._changeInProgress) {
|
|
addSubtract(
|
|
this,
|
|
createDuration(input - offset2, "m"),
|
|
1,
|
|
false
|
|
);
|
|
} else if (!this._changeInProgress) {
|
|
this._changeInProgress = true;
|
|
hooks.updateOffset(this, true);
|
|
this._changeInProgress = null;
|
|
}
|
|
}
|
|
return this;
|
|
} else {
|
|
return this._isUTC ? offset2 : getDateOffset(this);
|
|
}
|
|
}
|
|
function getSetZone(input, keepLocalTime) {
|
|
if (input != null) {
|
|
if (typeof input !== "string") {
|
|
input = -input;
|
|
}
|
|
this.utcOffset(input, keepLocalTime);
|
|
return this;
|
|
} else {
|
|
return -this.utcOffset();
|
|
}
|
|
}
|
|
function setOffsetToUTC(keepLocalTime) {
|
|
return this.utcOffset(0, keepLocalTime);
|
|
}
|
|
function setOffsetToLocal(keepLocalTime) {
|
|
if (this._isUTC) {
|
|
this.utcOffset(0, keepLocalTime);
|
|
this._isUTC = false;
|
|
if (keepLocalTime) {
|
|
this.subtract(getDateOffset(this), "m");
|
|
}
|
|
}
|
|
return this;
|
|
}
|
|
function setOffsetToParsedOffset() {
|
|
if (this._tzm != null) {
|
|
this.utcOffset(this._tzm, false, true);
|
|
} else if (typeof this._i === "string") {
|
|
var tZone = offsetFromString(matchOffset, this._i);
|
|
if (tZone != null) {
|
|
this.utcOffset(tZone);
|
|
} else {
|
|
this.utcOffset(0, true);
|
|
}
|
|
}
|
|
return this;
|
|
}
|
|
function hasAlignedHourOffset(input) {
|
|
if (!this.isValid()) {
|
|
return false;
|
|
}
|
|
input = input ? createLocal(input).utcOffset() : 0;
|
|
return (this.utcOffset() - input) % 60 === 0;
|
|
}
|
|
function isDaylightSavingTime() {
|
|
return this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset();
|
|
}
|
|
function isDaylightSavingTimeShifted() {
|
|
if (!isUndefined(this._isDSTShifted)) {
|
|
return this._isDSTShifted;
|
|
}
|
|
var c = {}, other;
|
|
copyConfig(c, this);
|
|
c = prepareConfig(c);
|
|
if (c._a) {
|
|
other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
|
|
this._isDSTShifted = this.isValid() && compareArrays(c._a, other.toArray()) > 0;
|
|
} else {
|
|
this._isDSTShifted = false;
|
|
}
|
|
return this._isDSTShifted;
|
|
}
|
|
function isLocal() {
|
|
return this.isValid() ? !this._isUTC : false;
|
|
}
|
|
function isUtcOffset() {
|
|
return this.isValid() ? this._isUTC : false;
|
|
}
|
|
function isUtc() {
|
|
return this.isValid() ? this._isUTC && this._offset === 0 : false;
|
|
}
|
|
var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/, isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
|
|
function createDuration(input, key) {
|
|
var duration = input, match = null, sign3, ret, diffRes;
|
|
if (isDuration(input)) {
|
|
duration = {
|
|
ms: input._milliseconds,
|
|
d: input._days,
|
|
M: input._months
|
|
};
|
|
} else if (isNumber2(input) || !isNaN(+input)) {
|
|
duration = {};
|
|
if (key) {
|
|
duration[key] = +input;
|
|
} else {
|
|
duration.milliseconds = +input;
|
|
}
|
|
} else if (match = aspNetRegex.exec(input)) {
|
|
sign3 = match[1] === "-" ? -1 : 1;
|
|
duration = {
|
|
y: 0,
|
|
d: toInt(match[DATE]) * sign3,
|
|
h: toInt(match[HOUR]) * sign3,
|
|
m: toInt(match[MINUTE]) * sign3,
|
|
s: toInt(match[SECOND]) * sign3,
|
|
ms: toInt(absRound(match[MILLISECOND] * 1e3)) * sign3
|
|
// the millisecond decimal point is included in the match
|
|
};
|
|
} else if (match = isoRegex.exec(input)) {
|
|
sign3 = match[1] === "-" ? -1 : 1;
|
|
duration = {
|
|
y: parseIso(match[2], sign3),
|
|
M: parseIso(match[3], sign3),
|
|
w: parseIso(match[4], sign3),
|
|
d: parseIso(match[5], sign3),
|
|
h: parseIso(match[6], sign3),
|
|
m: parseIso(match[7], sign3),
|
|
s: parseIso(match[8], sign3)
|
|
};
|
|
} else if (duration == null) {
|
|
duration = {};
|
|
} else if (typeof duration === "object" && ("from" in duration || "to" in duration)) {
|
|
diffRes = momentsDifference(
|
|
createLocal(duration.from),
|
|
createLocal(duration.to)
|
|
);
|
|
duration = {};
|
|
duration.ms = diffRes.milliseconds;
|
|
duration.M = diffRes.months;
|
|
}
|
|
ret = new Duration(duration);
|
|
if (isDuration(input) && hasOwnProp(input, "_locale")) {
|
|
ret._locale = input._locale;
|
|
}
|
|
if (isDuration(input) && hasOwnProp(input, "_isValid")) {
|
|
ret._isValid = input._isValid;
|
|
}
|
|
return ret;
|
|
}
|
|
createDuration.fn = Duration.prototype;
|
|
createDuration.invalid = createInvalid$1;
|
|
function parseIso(inp, sign3) {
|
|
var res = inp && parseFloat(inp.replace(",", "."));
|
|
return (isNaN(res) ? 0 : res) * sign3;
|
|
}
|
|
function positiveMomentsDifference(base, other) {
|
|
var res = {};
|
|
res.months = other.month() - base.month() + (other.year() - base.year()) * 12;
|
|
if (base.clone().add(res.months, "M").isAfter(other)) {
|
|
--res.months;
|
|
}
|
|
res.milliseconds = +other - +base.clone().add(res.months, "M");
|
|
return res;
|
|
}
|
|
function momentsDifference(base, other) {
|
|
var res;
|
|
if (!(base.isValid() && other.isValid())) {
|
|
return { milliseconds: 0, months: 0 };
|
|
}
|
|
other = cloneWithOffset(other, base);
|
|
if (base.isBefore(other)) {
|
|
res = positiveMomentsDifference(base, other);
|
|
} else {
|
|
res = positiveMomentsDifference(other, base);
|
|
res.milliseconds = -res.milliseconds;
|
|
res.months = -res.months;
|
|
}
|
|
return res;
|
|
}
|
|
function createAdder(direction, name) {
|
|
return function(val, period) {
|
|
var dur, tmp;
|
|
if (period !== null && !isNaN(+period)) {
|
|
deprecateSimple(
|
|
name,
|
|
"moment()." + name + "(period, number) is deprecated. Please use moment()." + name + "(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."
|
|
);
|
|
tmp = val;
|
|
val = period;
|
|
period = tmp;
|
|
}
|
|
dur = createDuration(val, period);
|
|
addSubtract(this, dur, direction);
|
|
return this;
|
|
};
|
|
}
|
|
function addSubtract(mom, duration, isAdding, updateOffset) {
|
|
var milliseconds2 = duration._milliseconds, days2 = absRound(duration._days), months2 = absRound(duration._months);
|
|
if (!mom.isValid()) {
|
|
return;
|
|
}
|
|
updateOffset = updateOffset == null ? true : updateOffset;
|
|
if (months2) {
|
|
setMonth(mom, get(mom, "Month") + months2 * isAdding);
|
|
}
|
|
if (days2) {
|
|
set$1(mom, "Date", get(mom, "Date") + days2 * isAdding);
|
|
}
|
|
if (milliseconds2) {
|
|
mom._d.setTime(mom._d.valueOf() + milliseconds2 * isAdding);
|
|
}
|
|
if (updateOffset) {
|
|
hooks.updateOffset(mom, days2 || months2);
|
|
}
|
|
}
|
|
var add = createAdder(1, "add"), subtract = createAdder(-1, "subtract");
|
|
function isString(input) {
|
|
return typeof input === "string" || input instanceof String;
|
|
}
|
|
function isMomentInput(input) {
|
|
return isMoment(input) || isDate(input) || isString(input) || isNumber2(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === void 0;
|
|
}
|
|
function isMomentInputObject(input) {
|
|
var objectTest = isObject2(input) && !isObjectEmpty(input), propertyTest = false, properties = [
|
|
"years",
|
|
"year",
|
|
"y",
|
|
"months",
|
|
"month",
|
|
"M",
|
|
"days",
|
|
"day",
|
|
"d",
|
|
"dates",
|
|
"date",
|
|
"D",
|
|
"hours",
|
|
"hour",
|
|
"h",
|
|
"minutes",
|
|
"minute",
|
|
"m",
|
|
"seconds",
|
|
"second",
|
|
"s",
|
|
"milliseconds",
|
|
"millisecond",
|
|
"ms"
|
|
], i, property, propertyLen = properties.length;
|
|
for (i = 0; i < propertyLen; i += 1) {
|
|
property = properties[i];
|
|
propertyTest = propertyTest || hasOwnProp(input, property);
|
|
}
|
|
return objectTest && propertyTest;
|
|
}
|
|
function isNumberOrStringArray(input) {
|
|
var arrayTest = isArray2(input), dataTypeTest = false;
|
|
if (arrayTest) {
|
|
dataTypeTest = input.filter(function(item) {
|
|
return !isNumber2(item) && isString(input);
|
|
}).length === 0;
|
|
}
|
|
return arrayTest && dataTypeTest;
|
|
}
|
|
function isCalendarSpec(input) {
|
|
var objectTest = isObject2(input) && !isObjectEmpty(input), propertyTest = false, properties = [
|
|
"sameDay",
|
|
"nextDay",
|
|
"lastDay",
|
|
"nextWeek",
|
|
"lastWeek",
|
|
"sameElse"
|
|
], i, property;
|
|
for (i = 0; i < properties.length; i += 1) {
|
|
property = properties[i];
|
|
propertyTest = propertyTest || hasOwnProp(input, property);
|
|
}
|
|
return objectTest && propertyTest;
|
|
}
|
|
function getCalendarFormat(myMoment, now2) {
|
|
var diff2 = myMoment.diff(now2, "days", true);
|
|
return diff2 < -6 ? "sameElse" : diff2 < -1 ? "lastWeek" : diff2 < 0 ? "lastDay" : diff2 < 1 ? "sameDay" : diff2 < 2 ? "nextDay" : diff2 < 7 ? "nextWeek" : "sameElse";
|
|
}
|
|
function calendar$1(time, formats) {
|
|
if (arguments.length === 1) {
|
|
if (!arguments[0]) {
|
|
time = void 0;
|
|
formats = void 0;
|
|
} else if (isMomentInput(arguments[0])) {
|
|
time = arguments[0];
|
|
formats = void 0;
|
|
} else if (isCalendarSpec(arguments[0])) {
|
|
formats = arguments[0];
|
|
time = void 0;
|
|
}
|
|
}
|
|
var now2 = time || createLocal(), sod = cloneWithOffset(now2, this).startOf("day"), format2 = hooks.calendarFormat(this, sod) || "sameElse", output = formats && (isFunction2(formats[format2]) ? formats[format2].call(this, now2) : formats[format2]);
|
|
return this.format(
|
|
output || this.localeData().calendar(format2, this, createLocal(now2))
|
|
);
|
|
}
|
|
function clone3() {
|
|
return new Moment(this);
|
|
}
|
|
function isAfter(input, units) {
|
|
var localInput = isMoment(input) ? input : createLocal(input);
|
|
if (!(this.isValid() && localInput.isValid())) {
|
|
return false;
|
|
}
|
|
units = normalizeUnits(units) || "millisecond";
|
|
if (units === "millisecond") {
|
|
return this.valueOf() > localInput.valueOf();
|
|
} else {
|
|
return localInput.valueOf() < this.clone().startOf(units).valueOf();
|
|
}
|
|
}
|
|
function isBefore(input, units) {
|
|
var localInput = isMoment(input) ? input : createLocal(input);
|
|
if (!(this.isValid() && localInput.isValid())) {
|
|
return false;
|
|
}
|
|
units = normalizeUnits(units) || "millisecond";
|
|
if (units === "millisecond") {
|
|
return this.valueOf() < localInput.valueOf();
|
|
} else {
|
|
return this.clone().endOf(units).valueOf() < localInput.valueOf();
|
|
}
|
|
}
|
|
function isBetween(from3, to3, units, inclusivity) {
|
|
var localFrom = isMoment(from3) ? from3 : createLocal(from3), localTo = isMoment(to3) ? to3 : createLocal(to3);
|
|
if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
|
|
return false;
|
|
}
|
|
inclusivity = inclusivity || "()";
|
|
return (inclusivity[0] === "(" ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && (inclusivity[1] === ")" ? this.isBefore(localTo, units) : !this.isAfter(localTo, units));
|
|
}
|
|
function isSame(input, units) {
|
|
var localInput = isMoment(input) ? input : createLocal(input), inputMs;
|
|
if (!(this.isValid() && localInput.isValid())) {
|
|
return false;
|
|
}
|
|
units = normalizeUnits(units) || "millisecond";
|
|
if (units === "millisecond") {
|
|
return this.valueOf() === localInput.valueOf();
|
|
} else {
|
|
inputMs = localInput.valueOf();
|
|
return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
|
|
}
|
|
}
|
|
function isSameOrAfter(input, units) {
|
|
return this.isSame(input, units) || this.isAfter(input, units);
|
|
}
|
|
function isSameOrBefore(input, units) {
|
|
return this.isSame(input, units) || this.isBefore(input, units);
|
|
}
|
|
function diff(input, units, asFloat) {
|
|
var that, zoneDelta, output;
|
|
if (!this.isValid()) {
|
|
return NaN;
|
|
}
|
|
that = cloneWithOffset(input, this);
|
|
if (!that.isValid()) {
|
|
return NaN;
|
|
}
|
|
zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
|
|
units = normalizeUnits(units);
|
|
switch (units) {
|
|
case "year":
|
|
output = monthDiff(this, that) / 12;
|
|
break;
|
|
case "month":
|
|
output = monthDiff(this, that);
|
|
break;
|
|
case "quarter":
|
|
output = monthDiff(this, that) / 3;
|
|
break;
|
|
case "second":
|
|
output = (this - that) / 1e3;
|
|
break;
|
|
case "minute":
|
|
output = (this - that) / 6e4;
|
|
break;
|
|
case "hour":
|
|
output = (this - that) / 36e5;
|
|
break;
|
|
case "day":
|
|
output = (this - that - zoneDelta) / 864e5;
|
|
break;
|
|
case "week":
|
|
output = (this - that - zoneDelta) / 6048e5;
|
|
break;
|
|
default:
|
|
output = this - that;
|
|
}
|
|
return asFloat ? output : absFloor(output);
|
|
}
|
|
function monthDiff(a, b) {
|
|
if (a.date() < b.date()) {
|
|
return -monthDiff(b, a);
|
|
}
|
|
var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()), anchor = a.clone().add(wholeMonthDiff, "months"), anchor2, adjust;
|
|
if (b - anchor < 0) {
|
|
anchor2 = a.clone().add(wholeMonthDiff - 1, "months");
|
|
adjust = (b - anchor) / (anchor - anchor2);
|
|
} else {
|
|
anchor2 = a.clone().add(wholeMonthDiff + 1, "months");
|
|
adjust = (b - anchor) / (anchor2 - anchor);
|
|
}
|
|
return -(wholeMonthDiff + adjust) || 0;
|
|
}
|
|
hooks.defaultFormat = "YYYY-MM-DDTHH:mm:ssZ";
|
|
hooks.defaultFormatUtc = "YYYY-MM-DDTHH:mm:ss[Z]";
|
|
function toString() {
|
|
return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ");
|
|
}
|
|
function toISOString(keepOffset) {
|
|
if (!this.isValid()) {
|
|
return null;
|
|
}
|
|
var utc = keepOffset !== true, m = utc ? this.clone().utc() : this;
|
|
if (m.year() < 0 || m.year() > 9999) {
|
|
return formatMoment(
|
|
m,
|
|
utc ? "YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"
|
|
);
|
|
}
|
|
if (isFunction2(Date.prototype.toISOString)) {
|
|
if (utc) {
|
|
return this.toDate().toISOString();
|
|
} else {
|
|
return new Date(this.valueOf() + this.utcOffset() * 60 * 1e3).toISOString().replace("Z", formatMoment(m, "Z"));
|
|
}
|
|
}
|
|
return formatMoment(
|
|
m,
|
|
utc ? "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYY-MM-DD[T]HH:mm:ss.SSSZ"
|
|
);
|
|
}
|
|
function inspect() {
|
|
if (!this.isValid()) {
|
|
return "moment.invalid(/* " + this._i + " */)";
|
|
}
|
|
var func = "moment", zone = "", prefix, year, datetime, suffix;
|
|
if (!this.isLocal()) {
|
|
func = this.utcOffset() === 0 ? "moment.utc" : "moment.parseZone";
|
|
zone = "Z";
|
|
}
|
|
prefix = "[" + func + '("]';
|
|
year = 0 <= this.year() && this.year() <= 9999 ? "YYYY" : "YYYYYY";
|
|
datetime = "-MM-DD[T]HH:mm:ss.SSS";
|
|
suffix = zone + '[")]';
|
|
return this.format(prefix + year + datetime + suffix);
|
|
}
|
|
function format(inputString) {
|
|
if (!inputString) {
|
|
inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;
|
|
}
|
|
var output = formatMoment(this, inputString);
|
|
return this.localeData().postformat(output);
|
|
}
|
|
function from2(time, withoutSuffix) {
|
|
if (this.isValid() && (isMoment(time) && time.isValid() || createLocal(time).isValid())) {
|
|
return createDuration({ to: this, from: time }).locale(this.locale()).humanize(!withoutSuffix);
|
|
} else {
|
|
return this.localeData().invalidDate();
|
|
}
|
|
}
|
|
function fromNow(withoutSuffix) {
|
|
return this.from(createLocal(), withoutSuffix);
|
|
}
|
|
function to2(time, withoutSuffix) {
|
|
if (this.isValid() && (isMoment(time) && time.isValid() || createLocal(time).isValid())) {
|
|
return createDuration({ from: this, to: time }).locale(this.locale()).humanize(!withoutSuffix);
|
|
} else {
|
|
return this.localeData().invalidDate();
|
|
}
|
|
}
|
|
function toNow(withoutSuffix) {
|
|
return this.to(createLocal(), withoutSuffix);
|
|
}
|
|
function locale2(key) {
|
|
var newLocaleData;
|
|
if (key === void 0) {
|
|
return this._locale._abbr;
|
|
} else {
|
|
newLocaleData = getLocale(key);
|
|
if (newLocaleData != null) {
|
|
this._locale = newLocaleData;
|
|
}
|
|
return this;
|
|
}
|
|
}
|
|
var lang = deprecate(
|
|
"moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",
|
|
function(key) {
|
|
if (key === void 0) {
|
|
return this.localeData();
|
|
} else {
|
|
return this.locale(key);
|
|
}
|
|
}
|
|
);
|
|
function localeData() {
|
|
return this._locale;
|
|
}
|
|
var MS_PER_SECOND = 1e3, MS_PER_MINUTE = 60 * MS_PER_SECOND, MS_PER_HOUR = 60 * MS_PER_MINUTE, MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;
|
|
function mod$1(dividend, divisor) {
|
|
return (dividend % divisor + divisor) % divisor;
|
|
}
|
|
function localStartOfDate(y, m, d) {
|
|
if (y < 100 && y >= 0) {
|
|
return new Date(y + 400, m, d) - MS_PER_400_YEARS;
|
|
} else {
|
|
return new Date(y, m, d).valueOf();
|
|
}
|
|
}
|
|
function utcStartOfDate(y, m, d) {
|
|
if (y < 100 && y >= 0) {
|
|
return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
|
|
} else {
|
|
return Date.UTC(y, m, d);
|
|
}
|
|
}
|
|
function startOf(units) {
|
|
var time, startOfDate;
|
|
units = normalizeUnits(units);
|
|
if (units === void 0 || units === "millisecond" || !this.isValid()) {
|
|
return this;
|
|
}
|
|
startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
|
|
switch (units) {
|
|
case "year":
|
|
time = startOfDate(this.year(), 0, 1);
|
|
break;
|
|
case "quarter":
|
|
time = startOfDate(
|
|
this.year(),
|
|
this.month() - this.month() % 3,
|
|
1
|
|
);
|
|
break;
|
|
case "month":
|
|
time = startOfDate(this.year(), this.month(), 1);
|
|
break;
|
|
case "week":
|
|
time = startOfDate(
|
|
this.year(),
|
|
this.month(),
|
|
this.date() - this.weekday()
|
|
);
|
|
break;
|
|
case "isoWeek":
|
|
time = startOfDate(
|
|
this.year(),
|
|
this.month(),
|
|
this.date() - (this.isoWeekday() - 1)
|
|
);
|
|
break;
|
|
case "day":
|
|
case "date":
|
|
time = startOfDate(this.year(), this.month(), this.date());
|
|
break;
|
|
case "hour":
|
|
time = this._d.valueOf();
|
|
time -= mod$1(
|
|
time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
|
|
MS_PER_HOUR
|
|
);
|
|
break;
|
|
case "minute":
|
|
time = this._d.valueOf();
|
|
time -= mod$1(time, MS_PER_MINUTE);
|
|
break;
|
|
case "second":
|
|
time = this._d.valueOf();
|
|
time -= mod$1(time, MS_PER_SECOND);
|
|
break;
|
|
}
|
|
this._d.setTime(time);
|
|
hooks.updateOffset(this, true);
|
|
return this;
|
|
}
|
|
function endOf(units) {
|
|
var time, startOfDate;
|
|
units = normalizeUnits(units);
|
|
if (units === void 0 || units === "millisecond" || !this.isValid()) {
|
|
return this;
|
|
}
|
|
startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
|
|
switch (units) {
|
|
case "year":
|
|
time = startOfDate(this.year() + 1, 0, 1) - 1;
|
|
break;
|
|
case "quarter":
|
|
time = startOfDate(
|
|
this.year(),
|
|
this.month() - this.month() % 3 + 3,
|
|
1
|
|
) - 1;
|
|
break;
|
|
case "month":
|
|
time = startOfDate(this.year(), this.month() + 1, 1) - 1;
|
|
break;
|
|
case "week":
|
|
time = startOfDate(
|
|
this.year(),
|
|
this.month(),
|
|
this.date() - this.weekday() + 7
|
|
) - 1;
|
|
break;
|
|
case "isoWeek":
|
|
time = startOfDate(
|
|
this.year(),
|
|
this.month(),
|
|
this.date() - (this.isoWeekday() - 1) + 7
|
|
) - 1;
|
|
break;
|
|
case "day":
|
|
case "date":
|
|
time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
|
|
break;
|
|
case "hour":
|
|
time = this._d.valueOf();
|
|
time += MS_PER_HOUR - mod$1(
|
|
time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
|
|
MS_PER_HOUR
|
|
) - 1;
|
|
break;
|
|
case "minute":
|
|
time = this._d.valueOf();
|
|
time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;
|
|
break;
|
|
case "second":
|
|
time = this._d.valueOf();
|
|
time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;
|
|
break;
|
|
}
|
|
this._d.setTime(time);
|
|
hooks.updateOffset(this, true);
|
|
return this;
|
|
}
|
|
function valueOf() {
|
|
return this._d.valueOf() - (this._offset || 0) * 6e4;
|
|
}
|
|
function unix() {
|
|
return Math.floor(this.valueOf() / 1e3);
|
|
}
|
|
function toDate() {
|
|
return new Date(this.valueOf());
|
|
}
|
|
function toArray() {
|
|
var m = this;
|
|
return [
|
|
m.year(),
|
|
m.month(),
|
|
m.date(),
|
|
m.hour(),
|
|
m.minute(),
|
|
m.second(),
|
|
m.millisecond()
|
|
];
|
|
}
|
|
function toObject() {
|
|
var m = this;
|
|
return {
|
|
years: m.year(),
|
|
months: m.month(),
|
|
date: m.date(),
|
|
hours: m.hours(),
|
|
minutes: m.minutes(),
|
|
seconds: m.seconds(),
|
|
milliseconds: m.milliseconds()
|
|
};
|
|
}
|
|
function toJSON() {
|
|
return this.isValid() ? this.toISOString() : null;
|
|
}
|
|
function isValid$2() {
|
|
return isValid(this);
|
|
}
|
|
function parsingFlags() {
|
|
return extend({}, getParsingFlags(this));
|
|
}
|
|
function invalidAt() {
|
|
return getParsingFlags(this).overflow;
|
|
}
|
|
function creationData() {
|
|
return {
|
|
input: this._i,
|
|
format: this._f,
|
|
locale: this._locale,
|
|
isUTC: this._isUTC,
|
|
strict: this._strict
|
|
};
|
|
}
|
|
addFormatToken("N", 0, 0, "eraAbbr");
|
|
addFormatToken("NN", 0, 0, "eraAbbr");
|
|
addFormatToken("NNN", 0, 0, "eraAbbr");
|
|
addFormatToken("NNNN", 0, 0, "eraName");
|
|
addFormatToken("NNNNN", 0, 0, "eraNarrow");
|
|
addFormatToken("y", ["y", 1], "yo", "eraYear");
|
|
addFormatToken("y", ["yy", 2], 0, "eraYear");
|
|
addFormatToken("y", ["yyy", 3], 0, "eraYear");
|
|
addFormatToken("y", ["yyyy", 4], 0, "eraYear");
|
|
addRegexToken("N", matchEraAbbr);
|
|
addRegexToken("NN", matchEraAbbr);
|
|
addRegexToken("NNN", matchEraAbbr);
|
|
addRegexToken("NNNN", matchEraName);
|
|
addRegexToken("NNNNN", matchEraNarrow);
|
|
addParseToken(
|
|
["N", "NN", "NNN", "NNNN", "NNNNN"],
|
|
function(input, array, config, token2) {
|
|
var era = config._locale.erasParse(input, token2, config._strict);
|
|
if (era) {
|
|
getParsingFlags(config).era = era;
|
|
} else {
|
|
getParsingFlags(config).invalidEra = input;
|
|
}
|
|
}
|
|
);
|
|
addRegexToken("y", matchUnsigned);
|
|
addRegexToken("yy", matchUnsigned);
|
|
addRegexToken("yyy", matchUnsigned);
|
|
addRegexToken("yyyy", matchUnsigned);
|
|
addRegexToken("yo", matchEraYearOrdinal);
|
|
addParseToken(["y", "yy", "yyy", "yyyy"], YEAR);
|
|
addParseToken(["yo"], function(input, array, config, token2) {
|
|
var match;
|
|
if (config._locale._eraYearOrdinalRegex) {
|
|
match = input.match(config._locale._eraYearOrdinalRegex);
|
|
}
|
|
if (config._locale.eraYearOrdinalParse) {
|
|
array[YEAR] = config._locale.eraYearOrdinalParse(input, match);
|
|
} else {
|
|
array[YEAR] = parseInt(input, 10);
|
|
}
|
|
});
|
|
function localeEras(m, format2) {
|
|
var i, l, date, eras = this._eras || getLocale("en")._eras;
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
switch (typeof eras[i].since) {
|
|
case "string":
|
|
date = hooks(eras[i].since).startOf("day");
|
|
eras[i].since = date.valueOf();
|
|
break;
|
|
}
|
|
switch (typeof eras[i].until) {
|
|
case "undefined":
|
|
eras[i].until = Infinity;
|
|
break;
|
|
case "string":
|
|
date = hooks(eras[i].until).startOf("day").valueOf();
|
|
eras[i].until = date.valueOf();
|
|
break;
|
|
}
|
|
}
|
|
return eras;
|
|
}
|
|
function localeErasParse(eraName, format2, strict) {
|
|
var i, l, eras = this.eras(), name, abbr, narrow;
|
|
eraName = eraName.toUpperCase();
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
name = eras[i].name.toUpperCase();
|
|
abbr = eras[i].abbr.toUpperCase();
|
|
narrow = eras[i].narrow.toUpperCase();
|
|
if (strict) {
|
|
switch (format2) {
|
|
case "N":
|
|
case "NN":
|
|
case "NNN":
|
|
if (abbr === eraName) {
|
|
return eras[i];
|
|
}
|
|
break;
|
|
case "NNNN":
|
|
if (name === eraName) {
|
|
return eras[i];
|
|
}
|
|
break;
|
|
case "NNNNN":
|
|
if (narrow === eraName) {
|
|
return eras[i];
|
|
}
|
|
break;
|
|
}
|
|
} else if ([name, abbr, narrow].indexOf(eraName) >= 0) {
|
|
return eras[i];
|
|
}
|
|
}
|
|
}
|
|
function localeErasConvertYear(era, year) {
|
|
var dir = era.since <= era.until ? 1 : -1;
|
|
if (year === void 0) {
|
|
return hooks(era.since).year();
|
|
} else {
|
|
return hooks(era.since).year() + (year - era.offset) * dir;
|
|
}
|
|
}
|
|
function getEraName() {
|
|
var i, l, val, eras = this.localeData().eras();
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
val = this.clone().startOf("day").valueOf();
|
|
if (eras[i].since <= val && val <= eras[i].until) {
|
|
return eras[i].name;
|
|
}
|
|
if (eras[i].until <= val && val <= eras[i].since) {
|
|
return eras[i].name;
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
function getEraNarrow() {
|
|
var i, l, val, eras = this.localeData().eras();
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
val = this.clone().startOf("day").valueOf();
|
|
if (eras[i].since <= val && val <= eras[i].until) {
|
|
return eras[i].narrow;
|
|
}
|
|
if (eras[i].until <= val && val <= eras[i].since) {
|
|
return eras[i].narrow;
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
function getEraAbbr() {
|
|
var i, l, val, eras = this.localeData().eras();
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
val = this.clone().startOf("day").valueOf();
|
|
if (eras[i].since <= val && val <= eras[i].until) {
|
|
return eras[i].abbr;
|
|
}
|
|
if (eras[i].until <= val && val <= eras[i].since) {
|
|
return eras[i].abbr;
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
function getEraYear() {
|
|
var i, l, dir, val, eras = this.localeData().eras();
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
dir = eras[i].since <= eras[i].until ? 1 : -1;
|
|
val = this.clone().startOf("day").valueOf();
|
|
if (eras[i].since <= val && val <= eras[i].until || eras[i].until <= val && val <= eras[i].since) {
|
|
return (this.year() - hooks(eras[i].since).year()) * dir + eras[i].offset;
|
|
}
|
|
}
|
|
return this.year();
|
|
}
|
|
function erasNameRegex(isStrict) {
|
|
if (!hasOwnProp(this, "_erasNameRegex")) {
|
|
computeErasParse.call(this);
|
|
}
|
|
return isStrict ? this._erasNameRegex : this._erasRegex;
|
|
}
|
|
function erasAbbrRegex(isStrict) {
|
|
if (!hasOwnProp(this, "_erasAbbrRegex")) {
|
|
computeErasParse.call(this);
|
|
}
|
|
return isStrict ? this._erasAbbrRegex : this._erasRegex;
|
|
}
|
|
function erasNarrowRegex(isStrict) {
|
|
if (!hasOwnProp(this, "_erasNarrowRegex")) {
|
|
computeErasParse.call(this);
|
|
}
|
|
return isStrict ? this._erasNarrowRegex : this._erasRegex;
|
|
}
|
|
function matchEraAbbr(isStrict, locale3) {
|
|
return locale3.erasAbbrRegex(isStrict);
|
|
}
|
|
function matchEraName(isStrict, locale3) {
|
|
return locale3.erasNameRegex(isStrict);
|
|
}
|
|
function matchEraNarrow(isStrict, locale3) {
|
|
return locale3.erasNarrowRegex(isStrict);
|
|
}
|
|
function matchEraYearOrdinal(isStrict, locale3) {
|
|
return locale3._eraYearOrdinalRegex || matchUnsigned;
|
|
}
|
|
function computeErasParse() {
|
|
var abbrPieces = [], namePieces = [], narrowPieces = [], mixedPieces = [], i, l, erasName, erasAbbr, erasNarrow, eras = this.eras();
|
|
for (i = 0, l = eras.length; i < l; ++i) {
|
|
erasName = regexEscape(eras[i].name);
|
|
erasAbbr = regexEscape(eras[i].abbr);
|
|
erasNarrow = regexEscape(eras[i].narrow);
|
|
namePieces.push(erasName);
|
|
abbrPieces.push(erasAbbr);
|
|
narrowPieces.push(erasNarrow);
|
|
mixedPieces.push(erasName);
|
|
mixedPieces.push(erasAbbr);
|
|
mixedPieces.push(erasNarrow);
|
|
}
|
|
this._erasRegex = new RegExp("^(" + mixedPieces.join("|") + ")", "i");
|
|
this._erasNameRegex = new RegExp("^(" + namePieces.join("|") + ")", "i");
|
|
this._erasAbbrRegex = new RegExp("^(" + abbrPieces.join("|") + ")", "i");
|
|
this._erasNarrowRegex = new RegExp(
|
|
"^(" + narrowPieces.join("|") + ")",
|
|
"i"
|
|
);
|
|
}
|
|
addFormatToken(0, ["gg", 2], 0, function() {
|
|
return this.weekYear() % 100;
|
|
});
|
|
addFormatToken(0, ["GG", 2], 0, function() {
|
|
return this.isoWeekYear() % 100;
|
|
});
|
|
function addWeekYearFormatToken(token2, getter) {
|
|
addFormatToken(0, [token2, token2.length], 0, getter);
|
|
}
|
|
addWeekYearFormatToken("gggg", "weekYear");
|
|
addWeekYearFormatToken("ggggg", "weekYear");
|
|
addWeekYearFormatToken("GGGG", "isoWeekYear");
|
|
addWeekYearFormatToken("GGGGG", "isoWeekYear");
|
|
addRegexToken("G", matchSigned);
|
|
addRegexToken("g", matchSigned);
|
|
addRegexToken("GG", match1to2, match2);
|
|
addRegexToken("gg", match1to2, match2);
|
|
addRegexToken("GGGG", match1to4, match4);
|
|
addRegexToken("gggg", match1to4, match4);
|
|
addRegexToken("GGGGG", match1to6, match6);
|
|
addRegexToken("ggggg", match1to6, match6);
|
|
addWeekParseToken(
|
|
["gggg", "ggggg", "GGGG", "GGGGG"],
|
|
function(input, week, config, token2) {
|
|
week[token2.substr(0, 2)] = toInt(input);
|
|
}
|
|
);
|
|
addWeekParseToken(["gg", "GG"], function(input, week, config, token2) {
|
|
week[token2] = hooks.parseTwoDigitYear(input);
|
|
});
|
|
function getSetWeekYear(input) {
|
|
return getSetWeekYearHelper.call(
|
|
this,
|
|
input,
|
|
this.week(),
|
|
this.weekday() + this.localeData()._week.dow,
|
|
this.localeData()._week.dow,
|
|
this.localeData()._week.doy
|
|
);
|
|
}
|
|
function getSetISOWeekYear(input) {
|
|
return getSetWeekYearHelper.call(
|
|
this,
|
|
input,
|
|
this.isoWeek(),
|
|
this.isoWeekday(),
|
|
1,
|
|
4
|
|
);
|
|
}
|
|
function getISOWeeksInYear() {
|
|
return weeksInYear(this.year(), 1, 4);
|
|
}
|
|
function getISOWeeksInISOWeekYear() {
|
|
return weeksInYear(this.isoWeekYear(), 1, 4);
|
|
}
|
|
function getWeeksInYear() {
|
|
var weekInfo = this.localeData()._week;
|
|
return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
|
|
}
|
|
function getWeeksInWeekYear() {
|
|
var weekInfo = this.localeData()._week;
|
|
return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);
|
|
}
|
|
function getSetWeekYearHelper(input, week, weekday, dow, doy) {
|
|
var weeksTarget;
|
|
if (input == null) {
|
|
return weekOfYear(this, dow, doy).year;
|
|
} else {
|
|
weeksTarget = weeksInYear(input, dow, doy);
|
|
if (week > weeksTarget) {
|
|
week = weeksTarget;
|
|
}
|
|
return setWeekAll.call(this, input, week, weekday, dow, doy);
|
|
}
|
|
}
|
|
function setWeekAll(weekYear, week, weekday, dow, doy) {
|
|
var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
|
|
this.year(date.getUTCFullYear());
|
|
this.month(date.getUTCMonth());
|
|
this.date(date.getUTCDate());
|
|
return this;
|
|
}
|
|
addFormatToken("Q", 0, "Qo", "quarter");
|
|
addRegexToken("Q", match1);
|
|
addParseToken("Q", function(input, array) {
|
|
array[MONTH] = (toInt(input) - 1) * 3;
|
|
});
|
|
function getSetQuarter(input) {
|
|
return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
|
|
}
|
|
addFormatToken("D", ["DD", 2], "Do", "date");
|
|
addRegexToken("D", match1to2, match1to2NoLeadingZero);
|
|
addRegexToken("DD", match1to2, match2);
|
|
addRegexToken("Do", function(isStrict, locale3) {
|
|
return isStrict ? locale3._dayOfMonthOrdinalParse || locale3._ordinalParse : locale3._dayOfMonthOrdinalParseLenient;
|
|
});
|
|
addParseToken(["D", "DD"], DATE);
|
|
addParseToken("Do", function(input, array) {
|
|
array[DATE] = toInt(input.match(match1to2)[0]);
|
|
});
|
|
var getSetDayOfMonth = makeGetSet("Date", true);
|
|
addFormatToken("DDD", ["DDDD", 3], "DDDo", "dayOfYear");
|
|
addRegexToken("DDD", match1to3);
|
|
addRegexToken("DDDD", match3);
|
|
addParseToken(["DDD", "DDDD"], function(input, array, config) {
|
|
config._dayOfYear = toInt(input);
|
|
});
|
|
function getSetDayOfYear(input) {
|
|
var dayOfYear = Math.round(
|
|
(this.clone().startOf("day") - this.clone().startOf("year")) / 864e5
|
|
) + 1;
|
|
return input == null ? dayOfYear : this.add(input - dayOfYear, "d");
|
|
}
|
|
addFormatToken("m", ["mm", 2], 0, "minute");
|
|
addRegexToken("m", match1to2, match1to2HasZero);
|
|
addRegexToken("mm", match1to2, match2);
|
|
addParseToken(["m", "mm"], MINUTE);
|
|
var getSetMinute = makeGetSet("Minutes", false);
|
|
addFormatToken("s", ["ss", 2], 0, "second");
|
|
addRegexToken("s", match1to2, match1to2HasZero);
|
|
addRegexToken("ss", match1to2, match2);
|
|
addParseToken(["s", "ss"], SECOND);
|
|
var getSetSecond = makeGetSet("Seconds", false);
|
|
addFormatToken("S", 0, 0, function() {
|
|
return ~~(this.millisecond() / 100);
|
|
});
|
|
addFormatToken(0, ["SS", 2], 0, function() {
|
|
return ~~(this.millisecond() / 10);
|
|
});
|
|
addFormatToken(0, ["SSS", 3], 0, "millisecond");
|
|
addFormatToken(0, ["SSSS", 4], 0, function() {
|
|
return this.millisecond() * 10;
|
|
});
|
|
addFormatToken(0, ["SSSSS", 5], 0, function() {
|
|
return this.millisecond() * 100;
|
|
});
|
|
addFormatToken(0, ["SSSSSS", 6], 0, function() {
|
|
return this.millisecond() * 1e3;
|
|
});
|
|
addFormatToken(0, ["SSSSSSS", 7], 0, function() {
|
|
return this.millisecond() * 1e4;
|
|
});
|
|
addFormatToken(0, ["SSSSSSSS", 8], 0, function() {
|
|
return this.millisecond() * 1e5;
|
|
});
|
|
addFormatToken(0, ["SSSSSSSSS", 9], 0, function() {
|
|
return this.millisecond() * 1e6;
|
|
});
|
|
addRegexToken("S", match1to3, match1);
|
|
addRegexToken("SS", match1to3, match2);
|
|
addRegexToken("SSS", match1to3, match3);
|
|
var token, getSetMillisecond;
|
|
for (token = "SSSS"; token.length <= 9; token += "S") {
|
|
addRegexToken(token, matchUnsigned);
|
|
}
|
|
function parseMs(input, array) {
|
|
array[MILLISECOND] = toInt(("0." + input) * 1e3);
|
|
}
|
|
for (token = "S"; token.length <= 9; token += "S") {
|
|
addParseToken(token, parseMs);
|
|
}
|
|
getSetMillisecond = makeGetSet("Milliseconds", false);
|
|
addFormatToken("z", 0, 0, "zoneAbbr");
|
|
addFormatToken("zz", 0, 0, "zoneName");
|
|
function getZoneAbbr() {
|
|
return this._isUTC ? "UTC" : "";
|
|
}
|
|
function getZoneName() {
|
|
return this._isUTC ? "Coordinated Universal Time" : "";
|
|
}
|
|
var proto = Moment.prototype;
|
|
proto.add = add;
|
|
proto.calendar = calendar$1;
|
|
proto.clone = clone3;
|
|
proto.diff = diff;
|
|
proto.endOf = endOf;
|
|
proto.format = format;
|
|
proto.from = from2;
|
|
proto.fromNow = fromNow;
|
|
proto.to = to2;
|
|
proto.toNow = toNow;
|
|
proto.get = stringGet;
|
|
proto.invalidAt = invalidAt;
|
|
proto.isAfter = isAfter;
|
|
proto.isBefore = isBefore;
|
|
proto.isBetween = isBetween;
|
|
proto.isSame = isSame;
|
|
proto.isSameOrAfter = isSameOrAfter;
|
|
proto.isSameOrBefore = isSameOrBefore;
|
|
proto.isValid = isValid$2;
|
|
proto.lang = lang;
|
|
proto.locale = locale2;
|
|
proto.localeData = localeData;
|
|
proto.max = prototypeMax;
|
|
proto.min = prototypeMin;
|
|
proto.parsingFlags = parsingFlags;
|
|
proto.set = stringSet;
|
|
proto.startOf = startOf;
|
|
proto.subtract = subtract;
|
|
proto.toArray = toArray;
|
|
proto.toObject = toObject;
|
|
proto.toDate = toDate;
|
|
proto.toISOString = toISOString;
|
|
proto.inspect = inspect;
|
|
if (typeof Symbol !== "undefined" && Symbol.for != null) {
|
|
proto[Symbol.for("nodejs.util.inspect.custom")] = function() {
|
|
return "Moment<" + this.format() + ">";
|
|
};
|
|
}
|
|
proto.toJSON = toJSON;
|
|
proto.toString = toString;
|
|
proto.unix = unix;
|
|
proto.valueOf = valueOf;
|
|
proto.creationData = creationData;
|
|
proto.eraName = getEraName;
|
|
proto.eraNarrow = getEraNarrow;
|
|
proto.eraAbbr = getEraAbbr;
|
|
proto.eraYear = getEraYear;
|
|
proto.year = getSetYear;
|
|
proto.isLeapYear = getIsLeapYear;
|
|
proto.weekYear = getSetWeekYear;
|
|
proto.isoWeekYear = getSetISOWeekYear;
|
|
proto.quarter = proto.quarters = getSetQuarter;
|
|
proto.month = getSetMonth;
|
|
proto.daysInMonth = getDaysInMonth;
|
|
proto.week = proto.weeks = getSetWeek;
|
|
proto.isoWeek = proto.isoWeeks = getSetISOWeek;
|
|
proto.weeksInYear = getWeeksInYear;
|
|
proto.weeksInWeekYear = getWeeksInWeekYear;
|
|
proto.isoWeeksInYear = getISOWeeksInYear;
|
|
proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;
|
|
proto.date = getSetDayOfMonth;
|
|
proto.day = proto.days = getSetDayOfWeek;
|
|
proto.weekday = getSetLocaleDayOfWeek;
|
|
proto.isoWeekday = getSetISODayOfWeek;
|
|
proto.dayOfYear = getSetDayOfYear;
|
|
proto.hour = proto.hours = getSetHour;
|
|
proto.minute = proto.minutes = getSetMinute;
|
|
proto.second = proto.seconds = getSetSecond;
|
|
proto.millisecond = proto.milliseconds = getSetMillisecond;
|
|
proto.utcOffset = getSetOffset;
|
|
proto.utc = setOffsetToUTC;
|
|
proto.local = setOffsetToLocal;
|
|
proto.parseZone = setOffsetToParsedOffset;
|
|
proto.hasAlignedHourOffset = hasAlignedHourOffset;
|
|
proto.isDST = isDaylightSavingTime;
|
|
proto.isLocal = isLocal;
|
|
proto.isUtcOffset = isUtcOffset;
|
|
proto.isUtc = isUtc;
|
|
proto.isUTC = isUtc;
|
|
proto.zoneAbbr = getZoneAbbr;
|
|
proto.zoneName = getZoneName;
|
|
proto.dates = deprecate(
|
|
"dates accessor is deprecated. Use date instead.",
|
|
getSetDayOfMonth
|
|
);
|
|
proto.months = deprecate(
|
|
"months accessor is deprecated. Use month instead",
|
|
getSetMonth
|
|
);
|
|
proto.years = deprecate(
|
|
"years accessor is deprecated. Use year instead",
|
|
getSetYear
|
|
);
|
|
proto.zone = deprecate(
|
|
"moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",
|
|
getSetZone
|
|
);
|
|
proto.isDSTShifted = deprecate(
|
|
"isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",
|
|
isDaylightSavingTimeShifted
|
|
);
|
|
function createUnix(input) {
|
|
return createLocal(input * 1e3);
|
|
}
|
|
function createInZone() {
|
|
return createLocal.apply(null, arguments).parseZone();
|
|
}
|
|
function preParsePostFormat(string) {
|
|
return string;
|
|
}
|
|
var proto$1 = Locale.prototype;
|
|
proto$1.calendar = calendar;
|
|
proto$1.longDateFormat = longDateFormat;
|
|
proto$1.invalidDate = invalidDate;
|
|
proto$1.ordinal = ordinal;
|
|
proto$1.preparse = preParsePostFormat;
|
|
proto$1.postformat = preParsePostFormat;
|
|
proto$1.relativeTime = relativeTime;
|
|
proto$1.pastFuture = pastFuture;
|
|
proto$1.set = set2;
|
|
proto$1.eras = localeEras;
|
|
proto$1.erasParse = localeErasParse;
|
|
proto$1.erasConvertYear = localeErasConvertYear;
|
|
proto$1.erasAbbrRegex = erasAbbrRegex;
|
|
proto$1.erasNameRegex = erasNameRegex;
|
|
proto$1.erasNarrowRegex = erasNarrowRegex;
|
|
proto$1.months = localeMonths;
|
|
proto$1.monthsShort = localeMonthsShort;
|
|
proto$1.monthsParse = localeMonthsParse;
|
|
proto$1.monthsRegex = monthsRegex;
|
|
proto$1.monthsShortRegex = monthsShortRegex;
|
|
proto$1.week = localeWeek;
|
|
proto$1.firstDayOfYear = localeFirstDayOfYear;
|
|
proto$1.firstDayOfWeek = localeFirstDayOfWeek;
|
|
proto$1.weekdays = localeWeekdays;
|
|
proto$1.weekdaysMin = localeWeekdaysMin;
|
|
proto$1.weekdaysShort = localeWeekdaysShort;
|
|
proto$1.weekdaysParse = localeWeekdaysParse;
|
|
proto$1.weekdaysRegex = weekdaysRegex;
|
|
proto$1.weekdaysShortRegex = weekdaysShortRegex;
|
|
proto$1.weekdaysMinRegex = weekdaysMinRegex;
|
|
proto$1.isPM = localeIsPM;
|
|
proto$1.meridiem = localeMeridiem;
|
|
function get$1(format2, index, field, setter) {
|
|
var locale3 = getLocale(), utc = createUTC().set(setter, index);
|
|
return locale3[field](utc, format2);
|
|
}
|
|
function listMonthsImpl(format2, index, field) {
|
|
if (isNumber2(format2)) {
|
|
index = format2;
|
|
format2 = void 0;
|
|
}
|
|
format2 = format2 || "";
|
|
if (index != null) {
|
|
return get$1(format2, index, field, "month");
|
|
}
|
|
var i, out = [];
|
|
for (i = 0; i < 12; i++) {
|
|
out[i] = get$1(format2, i, field, "month");
|
|
}
|
|
return out;
|
|
}
|
|
function listWeekdaysImpl(localeSorted, format2, index, field) {
|
|
if (typeof localeSorted === "boolean") {
|
|
if (isNumber2(format2)) {
|
|
index = format2;
|
|
format2 = void 0;
|
|
}
|
|
format2 = format2 || "";
|
|
} else {
|
|
format2 = localeSorted;
|
|
index = format2;
|
|
localeSorted = false;
|
|
if (isNumber2(format2)) {
|
|
index = format2;
|
|
format2 = void 0;
|
|
}
|
|
format2 = format2 || "";
|
|
}
|
|
var locale3 = getLocale(), shift = localeSorted ? locale3._week.dow : 0, i, out = [];
|
|
if (index != null) {
|
|
return get$1(format2, (index + shift) % 7, field, "day");
|
|
}
|
|
for (i = 0; i < 7; i++) {
|
|
out[i] = get$1(format2, (i + shift) % 7, field, "day");
|
|
}
|
|
return out;
|
|
}
|
|
function listMonths(format2, index) {
|
|
return listMonthsImpl(format2, index, "months");
|
|
}
|
|
function listMonthsShort(format2, index) {
|
|
return listMonthsImpl(format2, index, "monthsShort");
|
|
}
|
|
function listWeekdays(localeSorted, format2, index) {
|
|
return listWeekdaysImpl(localeSorted, format2, index, "weekdays");
|
|
}
|
|
function listWeekdaysShort(localeSorted, format2, index) {
|
|
return listWeekdaysImpl(localeSorted, format2, index, "weekdaysShort");
|
|
}
|
|
function listWeekdaysMin(localeSorted, format2, index) {
|
|
return listWeekdaysImpl(localeSorted, format2, index, "weekdaysMin");
|
|
}
|
|
getSetGlobalLocale("en", {
|
|
eras: [
|
|
{
|
|
since: "0001-01-01",
|
|
until: Infinity,
|
|
offset: 1,
|
|
name: "Anno Domini",
|
|
narrow: "AD",
|
|
abbr: "AD"
|
|
},
|
|
{
|
|
since: "0000-12-31",
|
|
until: -Infinity,
|
|
offset: 1,
|
|
name: "Before Christ",
|
|
narrow: "BC",
|
|
abbr: "BC"
|
|
}
|
|
],
|
|
dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
|
|
ordinal: function(number) {
|
|
var b = number % 10, output = toInt(number % 100 / 10) === 1 ? "th" : b === 1 ? "st" : b === 2 ? "nd" : b === 3 ? "rd" : "th";
|
|
return number + output;
|
|
}
|
|
});
|
|
hooks.lang = deprecate(
|
|
"moment.lang is deprecated. Use moment.locale instead.",
|
|
getSetGlobalLocale
|
|
);
|
|
hooks.langData = deprecate(
|
|
"moment.langData is deprecated. Use moment.localeData instead.",
|
|
getLocale
|
|
);
|
|
var mathAbs = Math.abs;
|
|
function abs() {
|
|
var data = this._data;
|
|
this._milliseconds = mathAbs(this._milliseconds);
|
|
this._days = mathAbs(this._days);
|
|
this._months = mathAbs(this._months);
|
|
data.milliseconds = mathAbs(data.milliseconds);
|
|
data.seconds = mathAbs(data.seconds);
|
|
data.minutes = mathAbs(data.minutes);
|
|
data.hours = mathAbs(data.hours);
|
|
data.months = mathAbs(data.months);
|
|
data.years = mathAbs(data.years);
|
|
return this;
|
|
}
|
|
function addSubtract$1(duration, input, value, direction) {
|
|
var other = createDuration(input, value);
|
|
duration._milliseconds += direction * other._milliseconds;
|
|
duration._days += direction * other._days;
|
|
duration._months += direction * other._months;
|
|
return duration._bubble();
|
|
}
|
|
function add$1(input, value) {
|
|
return addSubtract$1(this, input, value, 1);
|
|
}
|
|
function subtract$1(input, value) {
|
|
return addSubtract$1(this, input, value, -1);
|
|
}
|
|
function absCeil(number) {
|
|
if (number < 0) {
|
|
return Math.floor(number);
|
|
} else {
|
|
return Math.ceil(number);
|
|
}
|
|
}
|
|
function bubble() {
|
|
var milliseconds2 = this._milliseconds, days2 = this._days, months2 = this._months, data = this._data, seconds2, minutes2, hours2, years2, monthsFromDays;
|
|
if (!(milliseconds2 >= 0 && days2 >= 0 && months2 >= 0 || milliseconds2 <= 0 && days2 <= 0 && months2 <= 0)) {
|
|
milliseconds2 += absCeil(monthsToDays(months2) + days2) * 864e5;
|
|
days2 = 0;
|
|
months2 = 0;
|
|
}
|
|
data.milliseconds = milliseconds2 % 1e3;
|
|
seconds2 = absFloor(milliseconds2 / 1e3);
|
|
data.seconds = seconds2 % 60;
|
|
minutes2 = absFloor(seconds2 / 60);
|
|
data.minutes = minutes2 % 60;
|
|
hours2 = absFloor(minutes2 / 60);
|
|
data.hours = hours2 % 24;
|
|
days2 += absFloor(hours2 / 24);
|
|
monthsFromDays = absFloor(daysToMonths(days2));
|
|
months2 += monthsFromDays;
|
|
days2 -= absCeil(monthsToDays(monthsFromDays));
|
|
years2 = absFloor(months2 / 12);
|
|
months2 %= 12;
|
|
data.days = days2;
|
|
data.months = months2;
|
|
data.years = years2;
|
|
return this;
|
|
}
|
|
function daysToMonths(days2) {
|
|
return days2 * 4800 / 146097;
|
|
}
|
|
function monthsToDays(months2) {
|
|
return months2 * 146097 / 4800;
|
|
}
|
|
function as(units) {
|
|
if (!this.isValid()) {
|
|
return NaN;
|
|
}
|
|
var days2, months2, milliseconds2 = this._milliseconds;
|
|
units = normalizeUnits(units);
|
|
if (units === "month" || units === "quarter" || units === "year") {
|
|
days2 = this._days + milliseconds2 / 864e5;
|
|
months2 = this._months + daysToMonths(days2);
|
|
switch (units) {
|
|
case "month":
|
|
return months2;
|
|
case "quarter":
|
|
return months2 / 3;
|
|
case "year":
|
|
return months2 / 12;
|
|
}
|
|
} else {
|
|
days2 = this._days + Math.round(monthsToDays(this._months));
|
|
switch (units) {
|
|
case "week":
|
|
return days2 / 7 + milliseconds2 / 6048e5;
|
|
case "day":
|
|
return days2 + milliseconds2 / 864e5;
|
|
case "hour":
|
|
return days2 * 24 + milliseconds2 / 36e5;
|
|
case "minute":
|
|
return days2 * 1440 + milliseconds2 / 6e4;
|
|
case "second":
|
|
return days2 * 86400 + milliseconds2 / 1e3;
|
|
case "millisecond":
|
|
return Math.floor(days2 * 864e5) + milliseconds2;
|
|
default:
|
|
throw new Error("Unknown unit " + units);
|
|
}
|
|
}
|
|
}
|
|
function makeAs(alias) {
|
|
return function() {
|
|
return this.as(alias);
|
|
};
|
|
}
|
|
var asMilliseconds = makeAs("ms"), asSeconds = makeAs("s"), asMinutes = makeAs("m"), asHours = makeAs("h"), asDays = makeAs("d"), asWeeks = makeAs("w"), asMonths = makeAs("M"), asQuarters = makeAs("Q"), asYears = makeAs("y"), valueOf$1 = asMilliseconds;
|
|
function clone$1() {
|
|
return createDuration(this);
|
|
}
|
|
function get$2(units) {
|
|
units = normalizeUnits(units);
|
|
return this.isValid() ? this[units + "s"]() : NaN;
|
|
}
|
|
function makeGetter(name) {
|
|
return function() {
|
|
return this.isValid() ? this._data[name] : NaN;
|
|
};
|
|
}
|
|
var milliseconds = makeGetter("milliseconds"), seconds = makeGetter("seconds"), minutes = makeGetter("minutes"), hours = makeGetter("hours"), days = makeGetter("days"), months = makeGetter("months"), years = makeGetter("years");
|
|
function weeks() {
|
|
return absFloor(this.days() / 7);
|
|
}
|
|
var round2 = Math.round, thresholds = {
|
|
ss: 44,
|
|
// a few seconds to seconds
|
|
s: 45,
|
|
// seconds to minute
|
|
m: 45,
|
|
// minutes to hour
|
|
h: 22,
|
|
// hours to day
|
|
d: 26,
|
|
// days to month/week
|
|
w: null,
|
|
// weeks to month
|
|
M: 11
|
|
// months to year
|
|
};
|
|
function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale3) {
|
|
return locale3.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
|
|
}
|
|
function relativeTime$1(posNegDuration, withoutSuffix, thresholds2, locale3) {
|
|
var duration = createDuration(posNegDuration).abs(), seconds2 = round2(duration.as("s")), minutes2 = round2(duration.as("m")), hours2 = round2(duration.as("h")), days2 = round2(duration.as("d")), months2 = round2(duration.as("M")), weeks2 = round2(duration.as("w")), years2 = round2(duration.as("y")), a = seconds2 <= thresholds2.ss && ["s", seconds2] || seconds2 < thresholds2.s && ["ss", seconds2] || minutes2 <= 1 && ["m"] || minutes2 < thresholds2.m && ["mm", minutes2] || hours2 <= 1 && ["h"] || hours2 < thresholds2.h && ["hh", hours2] || days2 <= 1 && ["d"] || days2 < thresholds2.d && ["dd", days2];
|
|
if (thresholds2.w != null) {
|
|
a = a || weeks2 <= 1 && ["w"] || weeks2 < thresholds2.w && ["ww", weeks2];
|
|
}
|
|
a = a || months2 <= 1 && ["M"] || months2 < thresholds2.M && ["MM", months2] || years2 <= 1 && ["y"] || ["yy", years2];
|
|
a[2] = withoutSuffix;
|
|
a[3] = +posNegDuration > 0;
|
|
a[4] = locale3;
|
|
return substituteTimeAgo.apply(null, a);
|
|
}
|
|
function getSetRelativeTimeRounding(roundingFunction) {
|
|
if (roundingFunction === void 0) {
|
|
return round2;
|
|
}
|
|
if (typeof roundingFunction === "function") {
|
|
round2 = roundingFunction;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function getSetRelativeTimeThreshold(threshold, limit) {
|
|
if (thresholds[threshold] === void 0) {
|
|
return false;
|
|
}
|
|
if (limit === void 0) {
|
|
return thresholds[threshold];
|
|
}
|
|
thresholds[threshold] = limit;
|
|
if (threshold === "s") {
|
|
thresholds.ss = limit - 1;
|
|
}
|
|
return true;
|
|
}
|
|
function humanize(argWithSuffix, argThresholds) {
|
|
if (!this.isValid()) {
|
|
return this.localeData().invalidDate();
|
|
}
|
|
var withSuffix = false, th = thresholds, locale3, output;
|
|
if (typeof argWithSuffix === "object") {
|
|
argThresholds = argWithSuffix;
|
|
argWithSuffix = false;
|
|
}
|
|
if (typeof argWithSuffix === "boolean") {
|
|
withSuffix = argWithSuffix;
|
|
}
|
|
if (typeof argThresholds === "object") {
|
|
th = Object.assign({}, thresholds, argThresholds);
|
|
if (argThresholds.s != null && argThresholds.ss == null) {
|
|
th.ss = argThresholds.s - 1;
|
|
}
|
|
}
|
|
locale3 = this.localeData();
|
|
output = relativeTime$1(this, !withSuffix, th, locale3);
|
|
if (withSuffix) {
|
|
output = locale3.pastFuture(+this, output);
|
|
}
|
|
return locale3.postformat(output);
|
|
}
|
|
var abs$1 = Math.abs;
|
|
function sign2(x) {
|
|
return (x > 0) - (x < 0) || +x;
|
|
}
|
|
function toISOString$1() {
|
|
if (!this.isValid()) {
|
|
return this.localeData().invalidDate();
|
|
}
|
|
var seconds2 = abs$1(this._milliseconds) / 1e3, days2 = abs$1(this._days), months2 = abs$1(this._months), minutes2, hours2, years2, s, total = this.asSeconds(), totalSign, ymSign, daysSign, hmsSign;
|
|
if (!total) {
|
|
return "P0D";
|
|
}
|
|
minutes2 = absFloor(seconds2 / 60);
|
|
hours2 = absFloor(minutes2 / 60);
|
|
seconds2 %= 60;
|
|
minutes2 %= 60;
|
|
years2 = absFloor(months2 / 12);
|
|
months2 %= 12;
|
|
s = seconds2 ? seconds2.toFixed(3).replace(/\.?0+$/, "") : "";
|
|
totalSign = total < 0 ? "-" : "";
|
|
ymSign = sign2(this._months) !== sign2(total) ? "-" : "";
|
|
daysSign = sign2(this._days) !== sign2(total) ? "-" : "";
|
|
hmsSign = sign2(this._milliseconds) !== sign2(total) ? "-" : "";
|
|
return totalSign + "P" + (years2 ? ymSign + years2 + "Y" : "") + (months2 ? ymSign + months2 + "M" : "") + (days2 ? daysSign + days2 + "D" : "") + (hours2 || minutes2 || seconds2 ? "T" : "") + (hours2 ? hmsSign + hours2 + "H" : "") + (minutes2 ? hmsSign + minutes2 + "M" : "") + (seconds2 ? hmsSign + s + "S" : "");
|
|
}
|
|
var proto$2 = Duration.prototype;
|
|
proto$2.isValid = isValid$1;
|
|
proto$2.abs = abs;
|
|
proto$2.add = add$1;
|
|
proto$2.subtract = subtract$1;
|
|
proto$2.as = as;
|
|
proto$2.asMilliseconds = asMilliseconds;
|
|
proto$2.asSeconds = asSeconds;
|
|
proto$2.asMinutes = asMinutes;
|
|
proto$2.asHours = asHours;
|
|
proto$2.asDays = asDays;
|
|
proto$2.asWeeks = asWeeks;
|
|
proto$2.asMonths = asMonths;
|
|
proto$2.asQuarters = asQuarters;
|
|
proto$2.asYears = asYears;
|
|
proto$2.valueOf = valueOf$1;
|
|
proto$2._bubble = bubble;
|
|
proto$2.clone = clone$1;
|
|
proto$2.get = get$2;
|
|
proto$2.milliseconds = milliseconds;
|
|
proto$2.seconds = seconds;
|
|
proto$2.minutes = minutes;
|
|
proto$2.hours = hours;
|
|
proto$2.days = days;
|
|
proto$2.weeks = weeks;
|
|
proto$2.months = months;
|
|
proto$2.years = years;
|
|
proto$2.humanize = humanize;
|
|
proto$2.toISOString = toISOString$1;
|
|
proto$2.toString = toISOString$1;
|
|
proto$2.toJSON = toISOString$1;
|
|
proto$2.locale = locale2;
|
|
proto$2.localeData = localeData;
|
|
proto$2.toIsoString = deprecate(
|
|
"toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",
|
|
toISOString$1
|
|
);
|
|
proto$2.lang = lang;
|
|
addFormatToken("X", 0, 0, "unix");
|
|
addFormatToken("x", 0, 0, "valueOf");
|
|
addRegexToken("x", matchSigned);
|
|
addRegexToken("X", matchTimestamp);
|
|
addParseToken("X", function(input, array, config) {
|
|
config._d = new Date(parseFloat(input) * 1e3);
|
|
});
|
|
addParseToken("x", function(input, array, config) {
|
|
config._d = new Date(toInt(input));
|
|
});
|
|
hooks.version = "2.30.1";
|
|
setHookCallback(createLocal);
|
|
hooks.fn = proto;
|
|
hooks.min = min;
|
|
hooks.max = max;
|
|
hooks.now = now;
|
|
hooks.utc = createUTC;
|
|
hooks.unix = createUnix;
|
|
hooks.months = listMonths;
|
|
hooks.isDate = isDate;
|
|
hooks.locale = getSetGlobalLocale;
|
|
hooks.invalid = createInvalid;
|
|
hooks.duration = createDuration;
|
|
hooks.isMoment = isMoment;
|
|
hooks.weekdays = listWeekdays;
|
|
hooks.parseZone = createInZone;
|
|
hooks.localeData = getLocale;
|
|
hooks.isDuration = isDuration;
|
|
hooks.monthsShort = listMonthsShort;
|
|
hooks.weekdaysMin = listWeekdaysMin;
|
|
hooks.defineLocale = defineLocale;
|
|
hooks.updateLocale = updateLocale;
|
|
hooks.locales = listLocales;
|
|
hooks.weekdaysShort = listWeekdaysShort;
|
|
hooks.normalizeUnits = normalizeUnits;
|
|
hooks.relativeTimeRounding = getSetRelativeTimeRounding;
|
|
hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
|
|
hooks.calendarFormat = getCalendarFormat;
|
|
hooks.prototype = proto;
|
|
hooks.HTML5_FMT = {
|
|
DATETIME_LOCAL: "YYYY-MM-DDTHH:mm",
|
|
// <input type="datetime-local" />
|
|
DATETIME_LOCAL_SECONDS: "YYYY-MM-DDTHH:mm:ss",
|
|
// <input type="datetime-local" step="1" />
|
|
DATETIME_LOCAL_MS: "YYYY-MM-DDTHH:mm:ss.SSS",
|
|
// <input type="datetime-local" step="0.001" />
|
|
DATE: "YYYY-MM-DD",
|
|
// <input type="date" />
|
|
TIME: "HH:mm",
|
|
// <input type="time" />
|
|
TIME_SECONDS: "HH:mm:ss",
|
|
// <input type="time" step="1" />
|
|
TIME_MS: "HH:mm:ss.SSS",
|
|
// <input type="time" step="0.001" />
|
|
WEEK: "GGGG-[W]WW",
|
|
// <input type="week" />
|
|
MONTH: "YYYY-MM"
|
|
// <input type="month" />
|
|
};
|
|
return hooks;
|
|
});
|
|
}
|
|
});
|
|
|
|
// src/main.ts
|
|
var main_exports = {};
|
|
__export(main_exports, {
|
|
default: () => SRPlugin
|
|
});
|
|
module.exports = __toCommonJS(main_exports);
|
|
var import_obsidian11 = require("obsidian");
|
|
var graph = __toESM(require_lib());
|
|
|
|
// src/settings.ts
|
|
var import_obsidian2 = require("obsidian");
|
|
|
|
// src/lang/helpers.ts
|
|
var import_obsidian = require("obsidian");
|
|
|
|
// src/lang/locale/af.ts
|
|
var af_default = {};
|
|
|
|
// src/lang/locale/ar.ts
|
|
var ar_default = {
|
|
// flashcard-modal.tsx
|
|
DECKS: "\u0627\u0644\u0631\u064F\u0632\u0645\u064E\u0627\u062A",
|
|
DUE_CARDS: "\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u064F\u0633\u062A\u062D\u0642\u0629",
|
|
NEW_CARDS: "\u0628\u0637\u0627\u0642\u0627\u062A \u062C\u062F\u064A\u062F\u0629",
|
|
TOTAL_CARDS: "\u0625\u062C\u0645\u0627\u0644\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A",
|
|
BACK: "\u0631\u062C\u0648\u0639",
|
|
SKIP: "Skip",
|
|
EDIT_CARD: "\u062A\u0639\u062F\u064A\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0629",
|
|
RESET_CARD_PROGRESS: "\u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u062A\u0642\u062F\u0651\u064F\u0645\u0652 \u0627\u0644\u0628\u0637\u0627\u0642\u0629",
|
|
HARD: "\u0635\u0639\u0628",
|
|
GOOD: "\u062C\u064A\u062F",
|
|
EASY: "\u0633\u0647\u0644",
|
|
SHOW_ANSWER: "\u0623\u0638\u0647\u0650\u0631 \u0627\u0644\u0625\u062C\u0627\u0628\u0629",
|
|
CARD_PROGRESS_RESET: ".\u062A\u0645\u0651\u064E\u062A \u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u062A\u0642\u062F\u0651\u064F\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0629",
|
|
SAVE: "\u062D\u0641\u0638",
|
|
CANCEL: "\u0625\u0644\u063A\u0627\u0621",
|
|
NO_INPUT: ".\u0644\u0645 \u064A\u062A\u0650\u0645 \u062A\u0642\u062F\u064A\u0645 \u0623\u064A \u0645\u064F\u062F\u062E\u0644\u0627\u062A",
|
|
CURRENT_EASE_HELP_TEXT: ":\u0627\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u062D\u0627\u0644\u064A\u0629",
|
|
CURRENT_INTERVAL_HELP_TEXT: ":\u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u0627\u0644\u062D\u0627\u0644\u064A",
|
|
CARD_GENERATED_FROM: "${notePath} :\u062A\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646",
|
|
// main.ts
|
|
OPEN_NOTE_FOR_REVIEW: "\u0627\u0641\u062A\u062D \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629",
|
|
REVIEW_CARDS: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A",
|
|
REVIEW_EASY_FILE_MENU: "\u0645\u0631\u0627\u062C\u0639\u0629: \u0633\u0647\u0644",
|
|
REVIEW_GOOD_FILE_MENU: "\u0645\u0631\u0627\u062C\u0639\u0629: \u062C\u064A\u062F",
|
|
REVIEW_HARD_FILE_MENU: "\u0645\u0631\u0627\u062C\u0639\u0629: \u0635\u0639\u0628",
|
|
REVIEW_NOTE_EASY_CMD: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0643\u0640 \u0633\u0647\u0644\u0629",
|
|
REVIEW_NOTE_GOOD_CMD: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0643\u0640 \u062C\u064A\u062F\u0629",
|
|
REVIEW_NOTE_HARD_CMD: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0643\u0640 \u0635\u0639\u0628\u0629",
|
|
CRAM_ALL_CARDS: "\u062D\u062F\u062F \u0631\u064F\u0632\u0645\u064E\u0629 \u0644\u0644\u062D\u0634\u0631",
|
|
REVIEW_ALL_CARDS: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u0646 \u062C\u0645\u064A\u0639 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A",
|
|
REVIEW_CARDS_IN_NOTE: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u0646 \u0647\u0630\u0647 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629",
|
|
CRAM_CARDS_IN_NOTE: "\u0623\u062D\u0634\u0631 \u062C\u0645\u064A\u0639 \u0628\u0637\u0627\u0642\u0627\u062A \u0647\u0630\u0647 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629",
|
|
VIEW_STATS: "\u0639\u0631\u0636 \u0627\u0644\u0625\u062D\u0635\u0627\u0626\u064A\u0627\u062A",
|
|
STATUS_BAR: "\u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u062D\u0642\u0629 ${dueFlashcardsCount},\u0645\u0644\u0627\u062D\u0638\u0627\u062A ${dueNotesCount}:\u0645\u0631\u0627\u062C\u0639\u0629",
|
|
SYNC_TIME_TAKEN: "${t}ms \u0627\u0633\u062A\u063A\u0631\u0627\u0642 \u0627\u0644\u0645\u0632\u0627\u0645\u0646\u0629",
|
|
NOTE_IN_IGNORED_FOLDER: ".\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u064A\u062A\u0645 \u062D\u0641\u0638\u0647\u0627 \u0636\u0645\u0646 \u0627\u0644\u0645\u062C\u0644\u062F \u0627\u0644\u0630\u064A \u062A\u0645 \u062A\u062C\u0627\u0647\u0644\u0647 (\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A)",
|
|
PLEASE_TAG_NOTE: ".\u064A\u0631\u062C\u0649 \u0648\u0636\u0639 \u0648\u0633\u0645 \u0639\u0644\u0649 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0628\u0634\u0643\u0644 \u0645\u0646\u0627\u0633\u0628 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629 (\u0641\u064A \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A)",
|
|
RESPONSE_RECEIVED: ".\u0627\u0633\u062A\u064F\u0644\u0645\u062A \u0627\u0644\u0627\u0633\u062A\u062C\u0627\u0628\u0629",
|
|
NO_DECK_EXISTS: "${deckName} \u0644\u0627 \u064A\u0648\u062C\u062F \u0631\u064F\u0632\u0645\u064E\u0629",
|
|
ALL_CAUGHT_UP: "\u{1F606} \u0644\u0642\u062F \u062A\u0645 \u0627\u0644\u0642\u0628\u0636 \u0639\u0644\u064A\u0643\u0645 \u062C\u0645\u064A\u0639\u0627 \u0627\u0644\u0622\u0646",
|
|
// scheduling.ts
|
|
DAYS_STR_IVL: "\u064A\u0648\u0645/\u0623\u064A\u0627\u0645 ${interval}",
|
|
MONTHS_STR_IVL: "\u0634\u0647\u0631/\u0623\u0634\u0647\u0631 ${interval}",
|
|
YEARS_STR_IVL: "\u0633\u0646\u0629/\u0633\u0646\u0648\u0627\u062A ${interval}",
|
|
DAYS_STR_IVL_MOBILE: "\u064A${interval}",
|
|
MONTHS_STR_IVL_MOBILE: "\u0634${interval}",
|
|
YEARS_STR_IVL_MOBILE: "\u0633${interval}",
|
|
// settings.ts
|
|
SETTINGS_HEADER: "Spaced Repetition Plugin - Settings",
|
|
CHECK_WIKI: '.<a href="${wiki_url}">wiki</a> \u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u060C \u062A\u062D\u0642\u0642 \u0645\u0646',
|
|
FOLDERS_TO_IGNORE: "\u0645\u062C\u0644\u062F\u0627\u062A \u0644\u062A\u062C\u0627\u0647\u0644\u0647\u0627",
|
|
FOLDERS_TO_IGNORE_DESC: "Templates Meta/Scripts : \u0623\u062F\u062E\u0644 \u0645\u0633\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u062C\u0644\u062F \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0648\u0627\u0633\u0637\u0629 \u0633\u0637\u0648\u0631 \u062C\u062F\u064A\u062F\u0629,\u0645\u062B\u0627\u0644",
|
|
FLASHCARDS: "\u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A",
|
|
FLASHCARD_EASY_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u0633\u0647\u0644",
|
|
FLASHCARD_GOOD_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u062C\u064A\u062F",
|
|
FLASHCARD_HARD_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u0635\u0639\u0628",
|
|
FLASHCARD_EASY_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u0633\u0647\u0644',
|
|
FLASHCARD_GOOD_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u062C\u064A\u062F',
|
|
FLASHCARD_HARD_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u0635\u0639\u0628',
|
|
FLASHCARD_TAGS: "\u0648\u064F\u0633\u0648\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A",
|
|
FLASHCARD_TAGS_DESC: "#2\u0623\u062F\u062E\u0644 \u0627\u0644\u0648\u064F\u0633\u0648\u0645 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0645\u0633\u0627\u0641\u0627\u062A \u0623\u0648 \u0623\u0633\u0637\u0631 \u062C\u062F\u064A\u062F\u0629 \u060C \u0623\u064A \u0628\u0637\u0627\u0642\u0627\u062A# \u0631\u0632\u0645\u06293# \u0631\u0632\u0645\u0629",
|
|
CONVERT_FOLDERS_TO_DECKS: "\u062A\u062D\u0648\u064A\u0644 \u0627\u0644\u0645\u062C\u0644\u062F\u0627\u062A \u0625\u0644\u0649 \u0645\u0644\u0641\u0627\u062A \u0623\u0635\u0644\u064A\u0629 \u0648 \u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0641\u0631\u0639\u064A\u0629\u061F",
|
|
CONVERT_FOLDERS_TO_DECKS_DESC: ".\u0647\u0630\u0627 \u0647\u0648 \u0628\u062F\u064A\u0644 \u0644\u062E\u064A\u0627\u0631 \u0648\u0633\u0648\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 \u0623\u0639\u0644\u0627\u0647",
|
|
INLINE_SCHEDULING_COMMENTS: "\u062D\u0641\u0638 \u062A\u0639\u0644\u064A\u0642 \u0627\u0644\u062C\u062F\u0648\u0644\u0629 \u0639\u0644\u0649 \u0646\u0641\u0633 \u0627\u0644\u0633\u0637\u0631 \u0645\u062B\u0644 \u0627\u0644\u0633\u0637\u0631 \u0627\u0644\u0623\u062E\u064A\u0631 \u0644\u0644\u0628\u0637\u0627\u0642\u0629 \u061F",
|
|
INLINE_SCHEDULING_COMMENTS_DESC: "\u0644\u0627 \u062A\u0643\u0633\u0631 \u062A\u0646\u0633\u064A\u0642 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 HTML \u0633\u064A\u0624\u062F\u064A \u062A\u0634\u063A\u064A\u0644 \u0647\u0630\u0627 \u0625\u0644\u0649 \u062C\u0639\u0644 \u062A\u0639\u0644\u064A\u0642\u0627\u062A",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY: "\u0623\u062E\u0641\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0634\u0642\u064A\u0642\u0629 \u062D\u062A\u0649 \u0627\u0644\u064A\u0648\u0645 \u0627\u0644\u062A\u0627\u0644\u064A",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "cloze deletions : \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0634\u0642\u064A\u0642\u0629 \u0647\u064A \u0628\u0637\u0627\u0642\u0627\u062A \u062A\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646 \u0646\u0641\u0633 \u0646\u0635 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 \u0643\u0640",
|
|
SHOW_CARD_CONTEXT: "\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0633\u064A\u0627\u0642 \u0641\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A\u061F",
|
|
SHOW_CARD_CONTEXT_DESC: "i.e. Title > Heading 1 > Subheading > ... > Subheading",
|
|
CARD_MODAL_HEIGHT_PERCENT: "\u0646\u0633\u0628\u0629 \u0627\u0631\u062A\u0641\u0627\u0639 \u0627\u0644\u0628\u0637\u0627\u0642\u0629",
|
|
CARD_MODAL_SIZE_PERCENT_DESC: "\u064A\u062C\u0628 \u0636\u0628\u0637\u0647\u0627 \u0639\u0644\u0649 100 \u066A \u0639\u0644\u0649 \u0627\u0644\u0647\u0627\u062A\u0641 \u0627\u0644\u0645\u062D\u0645\u0648\u0644 \u0623\u0648 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062F\u064A\u0643 \u0635\u0648\u0631 \u0643\u0628\u064A\u0631\u0629 \u062C\u062F\u064B\u0627",
|
|
RESET_DEFAULT: "\u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u0625\u0644\u0649 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A",
|
|
CARD_MODAL_WIDTH_PERCENT: "\u0646\u0633\u0628\u0629 \u0639\u0631\u0636 \u0627\u0644\u0628\u0637\u0627\u0642\u0629",
|
|
RANDOMIZE_CARD_ORDER: "\u062A\u0631\u062A\u064A\u0628 \u0628\u0637\u0627\u0642\u0629 \u0639\u0634\u0648\u0627\u0626\u064A \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629\u061F",
|
|
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
REVIEW_DECK_ORDER: "Order decks are displayed during review",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
DISABLE_CLOZE_CARDS: "\u061Fcloze \u062A\u0639\u0637\u064A\u0644 \u0628\u0637\u0627\u0642\u0627\u062A",
|
|
CONVERT_HIGHLIGHTS_TO_CLOZES: "Convert ==hightlights== to clozes?",
|
|
CONVERT_BOLD_TEXT_TO_CLOZES: "Convert **bolded text** to clozes?",
|
|
CONVERT_CURLY_BRACKETS_TO_CLOZES: "Convert {{curly brackets}} to clozes?",
|
|
INLINE_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0636\u0645\u0646\u0629",
|
|
FIX_SEPARATORS_MANUALLY_WARNING: "\u0636\u0639 \u0641\u064A \u062D\u0633\u0627\u0628\u0643 \u0623\u0646\u0647 \u0628\u0639\u062F \u062A\u063A\u064A\u064A\u0631 \u0647\u0630\u0627 \u060C \u064A\u062C\u0628 \u0639\u0644\u064A\u0643 \u062A\u0639\u062F\u064A\u0644 \u0623\u064A \u0628\u0637\u0627\u0642\u0627\u062A \u0644\u062F\u064A\u0643 \u0628\u0627\u0644\u0641\u0639\u0644 \u064A\u062F\u0648\u064A\u064B\u0627",
|
|
INLINE_REVERSED_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0639\u0643\u0633\u064A\u0629 \u0627\u0644\u0645\u0636\u0645\u0646\u0629",
|
|
MULTILINE_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u062A\u0639\u062F\u062F\u0629",
|
|
MULTILINE_REVERSED_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0639\u0643\u0633\u064A\u0629 \u0627\u0644\u0645\u062A\u0639\u062F\u062F\u0629",
|
|
NOTES: "\u0645\u0644\u0627\u062D\u0638\u0627\u062A",
|
|
REVIEW_PANE_ON_STARTUP: "\u062A\u0645\u0643\u064A\u0646 \u062C\u0632\u0621 \u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0639\u0646\u062F \u0628\u062F\u0621 \u0627\u0644\u062A\u0634\u063A\u064A\u0644",
|
|
TAGS_TO_REVIEW: "\u0648\u0633\u0648\u0645 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629",
|
|
TAGS_TO_REVIEW_DESC: "#\u0623\u062F\u062E\u0644 \u0627\u0644\u0648\u0633\u0648\u0645 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0645\u0633\u0627\u0641\u0627\u062A \u0623\u0648 \u062E\u0637\u0648\u0637 \u062C\u062F\u064A\u062F\u0629 \u060C \u0623\u064A : \u0645\u0631\u0627\u062C\u0639\u0629# \u0648\u0633\u06452# \u0648\u0633\u06453",
|
|
OPEN_RANDOM_NOTE: "\u0627\u0641\u062A\u062D \u0645\u0644\u0627\u062D\u0638\u0629 \u0639\u0634\u0648\u0627\u0626\u064A\u0629 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629",
|
|
OPEN_RANDOM_NOTE_DESC: "(Pagerank) \u0639\u0646\u062F \u062A\u0639\u0637\u064A\u0644 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u060C\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0633\u064A\u062A\u0645 \u062A\u0631\u062A\u064A\u0628\u064F\u0647\u0627 \u062D\u0633\u0628 \u0627\u0644\u0623\u0647\u0645\u064A\u0629",
|
|
AUTO_NEXT_NOTE: "\u0627\u0641\u062A\u062D \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627 \u0628\u0639\u062F \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u062A\u0639\u0637\u064A\u0644 \u062E\u064A\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u0641\u064A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u060C \u0623\u064A \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629:\u0627\u0644\u0633\u0647\u0644 \u0627\u0644\u0635\u0639\u0628 \u0627\u0644\u062C\u064A\u062F",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u0639\u0646\u062F \u062A\u063A\u064A\u064A\u0631 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 Obsidian \u0623\u0639\u062F \u062A\u0634\u063A\u064A\u0644 , command hotkeys. \u0628\u0639\u062F \u0627\u0644\u062A\u0639\u0637\u064A\u0644 \u060C \u064A\u0645\u0643\u0646\u0643 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645",
|
|
MAX_N_DAYS_REVIEW_QUEUE: "\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0639\u062F\u062F \u0627\u0644\u0623\u064A\u0627\u0645 \u0627\u0644\u062A\u064A \u064A\u062C\u0628 \u0639\u0631\u0636\u0647\u0627 \u0639\u0644\u0649 \u0627\u0644\u0644\u0648\u062D\u0629 \u0627\u0644\u064A\u0645\u0646\u0649",
|
|
MIN_ONE_DAY: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0639\u062F\u062F \u0627\u0644\u0623\u064A\u0627\u0645 1 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644",
|
|
VALID_NUMBER_WARNING: "\u064A\u0631\u062C\u0649 \u062A\u0642\u062F\u064A\u0645 \u0631\u0642\u0645 \u0635\u0627\u0644\u062D",
|
|
UI_PREFERENCES: "\u062A\u0641\u0636\u064A\u0644\u0627\u062A \u0648\u0627\u062C\u0647\u0629 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0627\u0644\u0639\u0631\u0636 \u0627\u0644\u0634\u062C\u0631\u064A \u0644\u0644\u0631\u064F\u0632\u0645 \u0645\u0648\u0633\u0639 \u0628\u062D\u064A\u062B \u062A\u0637\u0647\u0631 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0641\u0631\u0639\u064A\u0629 \u0643\u0644\u0647\u0627",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: " \u0639\u0637\u0644 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u0644\u0637\u064A \u0627\u0644\u0631\u064F\u0632\u0645 \u0627\u0644\u0645\u062A\u062F\u0627\u062E\u0644\u0629 \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 , \u0645\u0641\u064A\u062F \u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062F\u064A\u0643 \u0628\u0637\u0627\u0642\u0627\u062A \u062A\u0646\u062A\u0645\u064A \u0625\u0644\u0649 \u0627\u0644\u0639\u062F\u064A\u062F \u0645\u0646 \u0627\u0644\u0631\u064F\u0632\u0645 \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0645\u0644\u0641",
|
|
ALGORITHM: "\u062E\u0648\u0627\u0631\u0632\u0645\u064A\u0629",
|
|
CHECK_ALGORITHM_WIKI: '<a href="${algo_url}">algorithm implementation</a> :\u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u062A\u062D\u0642\u0642 \u0645\u0646',
|
|
BASE_EASE: "\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0642\u0627\u0639\u062F\u0629",
|
|
BASE_EASE_DESC: "\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 = 130 \u060C \u0648\u064A\u0641\u0636\u0644 \u062D\u0648\u0627\u0644\u064A 250.",
|
|
BASE_EASE_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0642\u0627\u0639\u062F\u0629 130 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.",
|
|
LAPSE_INTERVAL_CHANGE: "\u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u064A\u062A\u063A\u064A\u0631 \u0639\u0646\u062F \u0645\u0631\u0627\u062C\u0639\u0629 \u0628\u0637\u0627\u0642\u0629/\u0645\u0644\u0627\u062D\u0638\u0629 \u0635\u0639\u0628\u0629",
|
|
LAPSE_INTERVAL_CHANGE_DESC: "newInterval = oldInterval * intervalChange / 100.",
|
|
EASY_BONUS: "\u0645\u0643\u0627\u0641\u0623\u0629 \u0633\u0647\u0644\u0629",
|
|
EASY_BONUS_DESC: "\u062A\u062A\u064A\u062D \u0644\u0643 \u0627\u0644\u0645\u0643\u0627\u0641\u0623\u0629 \u0627\u0644\u0633\u0647\u0644\u0629 \u0636\u0628\u0637 \u0627\u0644\u0641\u0631\u0642 \u0641\u064A \u0627\u0644\u0641\u0648\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A\u0629 \u0628\u064A\u0646 \u0627\u0644\u0631\u062F \u0627\u0644\u062C\u064A\u062F \u0648\u0627\u0644\u0633\u0647\u0644 \u0639\u0644\u0649 \u0628\u0637\u0627\u0642\u0629/\u0645\u0644\u0627\u062D\u0638\u0629 (\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 = 100 \u066A).",
|
|
EASY_BONUS_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0627\u0644\u0645\u0643\u0627\u0641\u0623\u0629 \u0627\u0644\u0633\u0647\u0644\u0629 100 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.",
|
|
MAX_INTERVAL: "Maximum interval in days",
|
|
MAX_INTERVAL_DESC: "\u064A\u062A\u064A\u062D \u0644\u0643 \u0648\u0636\u0639 \u062D\u062F \u0623\u0639\u0644\u0649 \u0644\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A (\u0627\u0641\u062A\u0631\u0627\u0636\u064A = 100 \u0639\u0627\u0645).",
|
|
MAX_INTERVAL_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u0644\u0645\u062F\u0629 \u064A\u0648\u0645 \u0648\u0627\u062D\u062F \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.",
|
|
MAX_LINK_CONTRIB: "\u0623\u0642\u0635\u0649 \u0645\u0633\u0627\u0647\u0645\u0629 \u0627\u0631\u062A\u0628\u0627\u0637",
|
|
MAX_LINK_CONTRIB_DESC: "\u0623\u0642\u0635\u0649 \u0645\u0633\u0627\u0647\u0645\u0629 \u0644\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0645\u0631\u062C\u062D\u0629 \u0644\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u0645\u0631\u062A\u0628\u0637\u0629 \u0628\u0627\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0623\u0648\u0644\u064A\u0629.",
|
|
LOGGING: "\u062A\u0633\u062C\u064A\u0644",
|
|
DISPLAY_DEBUG_INFO: "\u0639\u0631\u0636 \u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0627\u0644\u062A\u0635\u062D\u064A\u062D \u0639\u0644\u0649 \u0648\u062D\u062F\u0629 \u062A\u062D\u0643\u0645 \u0627\u0644\u0645\u0637\u0648\u0631\u061F",
|
|
// sidebar.ts
|
|
NOTES_REVIEW_QUEUE: "\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629",
|
|
CLOSE: "\u0623\u063A\u0644\u0642",
|
|
NEW: "\u062C\u062F\u064A\u062F",
|
|
YESTERDAY: "\u0627\u0644\u0628\u0627\u0631\u062D\u0629",
|
|
TODAY: "\u0627\u0644\u064A\u0648\u0645",
|
|
TOMORROW: "\u0627\u0644\u063A\u062F",
|
|
// stats-modal.tsx
|
|
STATS_TITLE: "\u0625\u062D\u0635\u0627\u0626\u064A\u0627\u062A",
|
|
MONTH: "\u0634\u0647\u0631",
|
|
QUARTER: "\u0631\u0628\u0639 \u0627\u0644\u0633\u0646\u0629",
|
|
YEAR: "\u0633\u0646\u0629",
|
|
LIFETIME: "",
|
|
FORECAST: "",
|
|
FORECAST_DESC: "\u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u062D\u0642\u0629 \u0641\u064A \u0627\u0644\u0645\u0633\u062A\u0642\u0628\u0644",
|
|
SCHEDULED: "\u0627\u0644\u0645\u0642\u0631\u0631",
|
|
DAYS: "\u0623\u064A\u0627\u0645",
|
|
NUMBER_OF_CARDS: "\u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A",
|
|
REVIEWS_PER_DAY: "\u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0627\u062A/\u0627\u0644\u064A\u0648\u0645 ${avg} :\u0645\u062A\u0648\u0633\u0637",
|
|
INTERVALS: "\u0641\u0648\u0627\u0635\u0644 \u0632\u0645\u0646\u064A\u0629",
|
|
INTERVALS_DESC: "\u0627\u0644\u062A\u0623\u062E\u064A\u0631 \u062D\u062A\u0649 \u064A\u062A\u0645 \u0639\u0631\u0636 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0627\u062A \u0645\u0631\u0629 \u0623\u062E\u0631\u0649",
|
|
COUNT: "\u0639\u062F\u062F",
|
|
INTERVALS_SUMMARY: "${longest} : \u0623\u0637\u0648\u0644 \u0641\u0627\u0635\u0644 \u0632\u0645\u0646\u064A ,${avg} :\u0645\u062A\u0648\u0633\u0637 \u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A",
|
|
EASES: "\u0627\u0644\u0633\u0647\u0648\u0644\u0629",
|
|
EASES_SUMMARY: "${avgEase} :\u0645\u062A\u0648\u0633\u0637 \u0627\u0644\u0633\u0647\u0648\u0644\u0629",
|
|
CARD_TYPES: "\u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A",
|
|
CARD_TYPES_DESC: "\u0648\u0647\u0630\u0627 \u064A\u0634\u0645\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629 \u0643\u0630\u0644\u0643 \u060C \u0625\u0646 \u0648\u062C\u062F\u062A",
|
|
CARD_TYPE_NEW: "\u062C\u062F\u064A\u062F\u0629",
|
|
CARD_TYPE_YOUNG: "\u0635\u063A\u064A\u0631\u0629",
|
|
CARD_TYPE_MATURE: "\u0646\u0627\u0636\u062C\u0629",
|
|
CARD_TYPES_SUMMARY: " ${totalCardsCount} :\u0625\u062C\u0645\u0627\u0644\u064A \u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A"
|
|
};
|
|
|
|
// src/lang/locale/cz.ts
|
|
var cz_default = {
|
|
// flashcard-modal.tsx
|
|
DECKS: "Bal\xED\u010Dky",
|
|
DUE_CARDS: "Karti\u010Dky po term\xEDnu",
|
|
NEW_CARDS: "Nov\xE9 karti\u010Dky",
|
|
TOTAL_CARDS: "Karti\u010Dek celkem",
|
|
BACK: "Back",
|
|
SKIP: "Skip",
|
|
EDIT_CARD: "Edit Card",
|
|
RESET_CARD_PROGRESS: "Vynulovat pokrok karti\u010Dky",
|
|
HARD: "Te\u017Ek\xE9",
|
|
GOOD: "Dobr\xE9",
|
|
EASY: "Jednoduch\xE9",
|
|
SHOW_ANSWER: "Uk\xE1zat odpov\u011B\u010F",
|
|
CARD_PROGRESS_RESET: "Pokrok karti\u010Dky byl vynulov\xE1n.",
|
|
SAVE: "Save",
|
|
CANCEL: "Cancel",
|
|
NO_INPUT: "No input provided.",
|
|
CURRENT_EASE_HELP_TEXT: "Current Ease: ",
|
|
CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ",
|
|
CARD_GENERATED_FROM: "Generated from: ${notePath}",
|
|
// main.ts
|
|
OPEN_NOTE_FOR_REVIEW: "Otev\u0159\xEDt pozn\xE1mku k revizi",
|
|
REVIEW_CARDS: "Pozn\xE1mek k revizi",
|
|
REVIEW_EASY_FILE_MENU: "Revize: Jednoduch\xE9",
|
|
REVIEW_GOOD_FILE_MENU: "Revize: Dobr\xE9",
|
|
REVIEW_HARD_FILE_MENU: "Revize: T\u011B\u017Ek\xE9",
|
|
REVIEW_NOTE_EASY_CMD: "Ozna\u010Dit pozn\xE1mku jako jednoduchou",
|
|
REVIEW_NOTE_GOOD_CMD: "Ozna\u010Dit pozn\xE1mku jako dobrou",
|
|
REVIEW_NOTE_HARD_CMD: "Ozna\u010Dit pozn\xE1mku jako te\u017Ekou",
|
|
REVIEW_ALL_CARDS: "Revidovat karti\u010Dky ve v\u0161ech pozn\xE1mk\xE1ch",
|
|
CRAM_ALL_CARDS: "Select a deck to cram",
|
|
REVIEW_CARDS_IN_NOTE: "Revidovat karti\u010Dky v t\xE9to pozn\xE1mce.",
|
|
CRAM_CARDS_IN_NOTE: "Cram karti\u010Dky v t\xE9to pozn\xE1mce.",
|
|
VIEW_STATS: "Uk\xE1zat statistiky",
|
|
STATUS_BAR: "Revize: ${dueNotesCount} pozn\xE1mek, ${dueFlashcardsCount} karti\u010Dek po term\xEDnu",
|
|
SYNC_TIME_TAKEN: "Synchronizace trvala ${t}ms",
|
|
NOTE_IN_IGNORED_FOLDER: "Pozn\xE1mka je ulo\u017Eena v ignorovan\xE9 slo\u017Ece (zkontrolujte nastaven\xED).",
|
|
PLEASE_TAG_NOTE: "Pros\xEDm ozna\u010Dne pozn\xE1mku odpov\xEDdaj\xEDc\xEDm tagem pro revizi (v nastaven\xED).",
|
|
RESPONSE_RECEIVED: "Odpov\u011B\u010F p\u0159ijata.",
|
|
NO_DECK_EXISTS: "Neexistuje \u017E\xE1dn\xFD bal\xED\u010Dek pro ${deckName}",
|
|
ALL_CAUGHT_UP: "V\u0161e zrevidov\xE1no",
|
|
// scheduling.ts
|
|
DAYS_STR_IVL: "${interval} den/dn\xED",
|
|
MONTHS_STR_IVL: "${interval} m\u011Bs\xEDc(\u016F)",
|
|
YEARS_STR_IVL: "${interval} rok(\u016F)",
|
|
DAYS_STR_IVL_MOBILE: "${interval}d",
|
|
MONTHS_STR_IVL_MOBILE: "${interval}m",
|
|
YEARS_STR_IVL_MOBILE: "${interval}r",
|
|
// settings.ts
|
|
SETTINGS_HEADER: "Spaced Repetition Plugin - Nastaven\xED",
|
|
CHECK_WIKI: 'Pro v\xEDce informac\xED jd\u011Bte na <a href="${wiki_url}">wiki</a>.',
|
|
FOLDERS_TO_IGNORE: "Ignorovan\xE9 slo\u017Eky",
|
|
FOLDERS_TO_IGNORE_DESC: "Zadejte cesty ke slo\u017Ek\xE1m odd\u011Blen\xE9 od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDkad. \u0160ablony Meta/Scripts",
|
|
FLASHCARDS: "Karti\u010Dky",
|
|
FLASHCARD_EASY_LABEL: "Easy Button Text",
|
|
FLASHCARD_GOOD_LABEL: "Good Button Text",
|
|
FLASHCARD_HARD_LABEL: "Hard Button Text",
|
|
FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button',
|
|
FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button',
|
|
FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button',
|
|
FLASHCARD_TAGS: "Tag pro karti\u010Dky",
|
|
FLASHCARD_TAGS_DESC: "Zadete tagy ood\u011Blen\xE9 mezerou nebo od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDklad. #karti\u010Dky #bal\xED\u010Dke2 #bal\xED\u010Dek3.",
|
|
CONVERT_FOLDERS_TO_DECKS: "P\u0159ev\xE9st slo\u017Eky na bal\xED\u010Dky a podbal\xED\u010Dky?",
|
|
CONVERT_FOLDERS_TO_DECKS_DESC: "Toto je alternativa k tag\u016Fm karti\u010Dek viz nastaven\xED v\xFD\u0161e.",
|
|
INLINE_SCHEDULING_COMMENTS: "Ulo\u017Eit pl\xE1novac\xED koment\xE1\u0159 na stejn\xFD \u0159\xE1dek jako posledn\xED polo\u017Eka karti\u010Dky?",
|
|
INLINE_SCHEDULING_COMMENTS_DESC: "Zapnut\xED t\xE9to volby zp\u016Fsob\xED, \u017Ee HTML koment\xE1\u0159e nebudou rozb\xEDjet form\xE1tov\xE1n\xED list\u016F.",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY: "Odlo\u017Eit p\u0159\xEDbuzn\xE9 karti\u010Dky na dal\u0161\xED den?",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "P\u0159\xEDbuzn\xE9 karti\u010Dky jsou karti\u010Dky generovan\xE9 z textu stejn\xE9 pozn\xE1mky nap\u0159\xEDklad cloze smaz\xE1n\xED",
|
|
SHOW_CARD_CONTEXT: "Uk\xE1zat kontext v karti\u010Dce?",
|
|
SHOW_CARD_CONTEXT_DESC: "nap\u0159\xEDklad Titulek > Nadpis1 > Podnadpis > ... > Podnadpis",
|
|
CARD_MODAL_HEIGHT_PERCENT: "V\xFD\u0161ka karti\u010Dek v procentech",
|
|
CARD_MODAL_SIZE_PERCENT_DESC: "M\u011Blo by b\xFDt nastaveno na 100% na mobilu nebo kdy\u017E pou\u017E\xEDv\xE1te velk\xE9 obr\xE1zky",
|
|
RESET_DEFAULT: "Resetovat v\xFDchoz\xED nastaven\xED",
|
|
CARD_MODAL_WIDTH_PERCENT: "\u0160\xED\u0159ka karti\u010Dek v procentech",
|
|
RANDOMIZE_CARD_ORDER: "N\xE1hodn\u011B zm\u011Bnit po\u0159ad\xED karti\u010Dek b\u011Bhem revize?",
|
|
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
REVIEW_DECK_ORDER: "Order decks are displayed during review",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
DISABLE_CLOZE_CARDS: "Vypnout cloze karti\u010Dky?",
|
|
CONVERT_HIGHLIGHTS_TO_CLOZES: "P\u0159ev\xE9st ==zv\xFDrazn\u011Bn\xED== na clozes?",
|
|
CONVERT_BOLD_TEXT_TO_CLOZES: "P\u0159ev\xE9st **tu\u010Dn\xFD text** na clozes?",
|
|
CONVERT_CURLY_BRACKETS_TO_CLOZES: "P\u0159ev\xE9st {{slo\u017Een\xE9 z\xE1vorky}} na clozes?",
|
|
INLINE_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro inline karti\u010Dky",
|
|
FIX_SEPARATORS_MANUALLY_WARNING: "Pozor. Jakmile toto zm\u011Bn\xEDte, budete muset ru\u010Dn\u011B upravit v\u0161echny existuj\xEDc\xED karti\u010Dky.",
|
|
INLINE_REVERSED_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro oto\u010Den\xE9 inline karti\u010Dky",
|
|
MULTILINE_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro v\xEDce\u0159\xE1dkov\xE9 karti\u010Dky",
|
|
MULTILINE_REVERSED_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro v\xEDce\u0159\xE1dkove oto\u010Den\xE9 karti\u010Dky",
|
|
NOTES: "Pozn\xE1mky",
|
|
REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup",
|
|
TAGS_TO_REVIEW: "Tag pro revizi",
|
|
TAGS_TO_REVIEW_DESC: "Zadejte tagy odd\u011Blen\xE9 mezerami nebo od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDklad #review #tag2 #tag3.",
|
|
OPEN_RANDOM_NOTE: "Otev\u0159\xEDt n\xE1hodnou pozn\xE1mku pro revizi",
|
|
OPEN_RANDOM_NOTE_DESC: "Pokud toto vypnete, pozn\xE1mky budou \u0159azeny dle d\u016Fle\u017Eitosti (PageRank).",
|
|
AUTO_NEXT_NOTE: "Otev\u0159\xEDt automaticky dal\u0161\xED pozn\xE1mku po dokon\u010Den\xED revize",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS: "Vypnout volby revize v menu souboru nap\u0159\xEDklad 'Revize: Jednoduch\xE9'",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Po vypnut\xED m\u016F\u017Eete pou\u017E\xEDvat kl\xE1vesov\xE9 zkratky. Restartujte Obsidian po zm\u011Bn\u011B nastaven\xED.",
|
|
MAX_N_DAYS_REVIEW_QUEUE: "Maxim\xE1ln\xED po\u010Det dn\xED zobrazen\xFDch v prav\xE9m panelu",
|
|
MIN_ONE_DAY: "Po\u010Det dn\xED mus\xED b\xFDt minim\xE1ln\u011B 1.",
|
|
VALID_NUMBER_WARNING: "Pros\xEDm zadejte validn\xED \u010D\xEDslo.",
|
|
UI_PREFERENCES: "P\u0159edvolby u\u017Eivatelsk\xE9ho rozhran\xED",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Stromy bal\xED\u010Dky by m\u011Bly b\xFDt zpo\u010D\xE1tku zobrazeny jako rozbalen\xE9",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Vypn\u011Bte toto, chcete-li sbalit vno\u0159en\xE9 bal\xED\u010Dky na stejn\xE9 kart\u011B. To je u\u017Eite\u010Dn\xE9, pokud m\xE1te karti\u010Dky, kter\xE9 pat\u0159\xED k mnoha bal\xED\u010Dk\u016Fm ve stejn\xE9m souboru.",
|
|
ALGORITHM: "Algoritmus",
|
|
CHECK_ALGORITHM_WIKI: 'Pro v\xEDce informac\xED jd\u011Bte na <a href="${algo_url}">popis algoritmu</a>.',
|
|
BASE_EASE: "Z\xE1kladn\xED slo\u017Eitost",
|
|
BASE_EASE_DESC: "minimum = 130, nejl\xE9pe p\u0159ibli\u017En\u011B 250.",
|
|
BASE_EASE_MIN_WARNING: "Z\xE1kladn\xED slo\u017Eitost mus\xED b\xFDt minim\xE1ln\u011B 130.",
|
|
LAPSE_INTERVAL_CHANGE: "Zm\u011Bna intervalu pokud karti\u010Dku/pozn\xE1mku ozna\u010D\xEDte jako slo\u017Eitou",
|
|
LAPSE_INTERVAL_CHANGE_DESC: "nov\xFD_inteval = star\xFD_interval * zm\u011Bna_intevalu / 100.",
|
|
EASY_BONUS: "Bonus pro jednoduch\xE9",
|
|
EASY_BONUS_DESC: "Tento bonus umo\u017E\u0148uje nastavit rozd\xEDl intervalu mezi jednoduch\xFDmi a dobr\xFDmi karti\u010Dkami/pozn\xE1mkami (minimum = 100%).",
|
|
EASY_BONUS_MIN_WARNING: "Bonus pro jednoduchost mus\xED b\xFDt minim\xE1ln\u011B 100.",
|
|
MAX_INTERVAL: "Maximum interval in days",
|
|
MAX_INTERVAL_DESC: "Umo\u017E\u0148uje nastavit horn\xED limit pro interval (defaultn\u011B = 100 let).",
|
|
MAX_INTERVAL_MIN_WARNING: "Maxim\xE1ln\xED interval mus\xED b\xFDt alespo\u0148 1 den.",
|
|
MAX_LINK_CONTRIB: "Maxim\xE1ln\xED p\u0159\xEDsp\u011Bv\u011Bk prolinkov\xE1n\xED",
|
|
MAX_LINK_CONTRIB_DESC: "Maxim\xE1ln\xED p\u0159\xEDsp\u011Bvek v\xE1\u017Een\xE9 slo\u017Eitosti prolinkovan\xFDch pozn\xE1mek pou\u017Eit\xFD pro ur\u010Den\xED po\u010D\xE1te\u010Dn\xED slo\u017Eitosti.",
|
|
LOGGING: "Zaznamen\xE1v\xE1m",
|
|
DISPLAY_DEBUG_INFO: "Zobrazit informace pro lad\u011Bn\xED na v\xFDvoj\xE1\u0159sk\xE9 konzoli?",
|
|
// sidebar.ts
|
|
NOTES_REVIEW_QUEUE: "Fronta pozn\xE1mek k revizi",
|
|
CLOSE: "Uzav\u0159en\xE9",
|
|
NEW: "Nov\xE9",
|
|
YESTERDAY: "V\u010Dera",
|
|
TODAY: "Dnes",
|
|
TOMORROW: "Z\xEDtra",
|
|
// stats-modal.tsx
|
|
STATS_TITLE: "Statistiky",
|
|
MONTH: "M\u011Bs\xEDc",
|
|
QUARTER: "\u010Ctvrtlet\xED",
|
|
YEAR: "Rok",
|
|
LIFETIME: "Celkov\u011B",
|
|
FORECAST: "P\u0159edpov\u011B\u010F",
|
|
FORECAST_DESC: "Celkov\xFD po\u010Det karti\u010Dek, kter\xFDm vypr\u0161\xED term\xEDn",
|
|
SCHEDULED: "Napl\xE1nov\xE1no",
|
|
DAYS: "Dn\xED",
|
|
NUMBER_OF_CARDS: "Po\u010Det karti\u010Dek",
|
|
REVIEWS_PER_DAY: "Pr\u016Fm\u011Br: ${avg} revize/den",
|
|
INTERVALS: "Intervaly",
|
|
INTERVALS_DESC: "Doba, za kterou bude znovu zobrazeno k revize",
|
|
COUNT: "Po\u010Det",
|
|
INTERVALS_SUMMARY: "Pr\u016Fm\u011Brn\xFD interval: ${avg}, Nejdel\u0161\xED interval: ${longest}",
|
|
EASES: "Slo\u017Eitost",
|
|
EASES_SUMMARY: "Pr\u016Fm\u011Brn\xE1 slo\u017Eitost: ${avgEase}",
|
|
CARD_TYPES: "Typy karti\u010Dek",
|
|
CARD_TYPES_DESC: "Obsahuje i odlo\u017Een\xE9 karti\u010Dky (pokud existuj\xED)",
|
|
CARD_TYPE_NEW: "Nov\xE1",
|
|
CARD_TYPE_YOUNG: "Mlad\xE1",
|
|
CARD_TYPE_MATURE: "Dosp\u011Bl\xE1",
|
|
CARD_TYPES_SUMMARY: "Karti\u010Dek celkem: ${totalCardsCount}"
|
|
};
|
|
|
|
// src/lang/locale/bn.ts
|
|
var bn_default = {};
|
|
|
|
// src/lang/locale/da.ts
|
|
var da_default = {};
|
|
|
|
// src/lang/locale/de.ts
|
|
var de_default = {
|
|
// flashcard-modal.tsx
|
|
DECKS: "Stapel",
|
|
DUE_CARDS: "Anstehende Karten",
|
|
NEW_CARDS: "Neue Karten",
|
|
TOTAL_CARDS: "Alle Karten",
|
|
BACK: "Back",
|
|
SKIP: "Skip",
|
|
EDIT_CARD: "Edit Card",
|
|
RESET_CARD_PROGRESS: "Kartenfortschritt zur\xFCcksetzten",
|
|
HARD: "Schwer",
|
|
GOOD: "Gut",
|
|
EASY: "Einfach",
|
|
SHOW_ANSWER: "Zeige Antwort",
|
|
CARD_PROGRESS_RESET: "Kartenfortschritt wurde zur\xFCckgesetzt.",
|
|
SAVE: "Save",
|
|
CANCEL: "Cancel",
|
|
NO_INPUT: "No input provided.",
|
|
CURRENT_EASE_HELP_TEXT: "Current Ease: ",
|
|
CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ",
|
|
CARD_GENERATED_FROM: "Generated from: ${notePath}",
|
|
// main.ts
|
|
OPEN_NOTE_FOR_REVIEW: "Notiz zur Wiederholung \xF6ffnen",
|
|
REVIEW_CARDS: "Lernkarten wiederholen",
|
|
REVIEW_EASY_FILE_MENU: "Notiz abschliessen als: Einfach",
|
|
REVIEW_GOOD_FILE_MENU: "Notiz abschliessen als: Gut",
|
|
REVIEW_HARD_FILE_MENU: "Notiz abschliessen als: Schwer",
|
|
REVIEW_NOTE_EASY_CMD: "Notiz abschliessen als: Einfach",
|
|
REVIEW_NOTE_GOOD_CMD: "Notiz abschliessen als: Gut",
|
|
REVIEW_NOTE_HARD_CMD: "Notiz abschliessen als: Schwer",
|
|
REVIEW_ALL_CARDS: "Alle Lernkarten wiederholen",
|
|
CRAM_ALL_CARDS: "Select a deck to cram",
|
|
REVIEW_CARDS_IN_NOTE: "Lernkarten in dieser Notiz wiederholen",
|
|
CRAM_CARDS_IN_NOTE: "Lernkarten in dieser Notiz pauken.",
|
|
VIEW_STATS: "Statistiken anzeigen",
|
|
STATUS_BAR: "Wiederholung: ${dueNotesCount} Notiz(en), ${dueFlashcardsCount} Karte(n) anstehend",
|
|
SYNC_TIME_TAKEN: "Sync dauerte ${t}ms",
|
|
NOTE_IN_IGNORED_FOLDER: "Notiz befindet sich in einem ausgeschlossenen Ordner (siehe Einstellungen).",
|
|
PLEASE_TAG_NOTE: "Bitte die Notiz f\xFCr Wiederholungen entsprechend taggen (siehe Einstellungen).",
|
|
RESPONSE_RECEIVED: "Antwort erhalten.",
|
|
NO_DECK_EXISTS: "Kein Stapel f\xFCr ${deckName} gefunden.",
|
|
ALL_CAUGHT_UP: "Yuhu! Alles geschafft! :D.",
|
|
// scheduling.ts
|
|
DAYS_STR_IVL: "${interval} Tag(e)",
|
|
MONTHS_STR_IVL: "${interval} Monat(e)",
|
|
YEARS_STR_IVL: "${interval} Jahr(e)",
|
|
DAYS_STR_IVL_MOBILE: "${interval}d",
|
|
MONTHS_STR_IVL_MOBILE: "${interval}m",
|
|
YEARS_STR_IVL_MOBILE: "${interval}y",
|
|
// settings.ts
|
|
SETTINGS_HEADER: "Spaced Repetition Plugin - Einstellungen",
|
|
CHECK_WIKI: 'Weitere Informationen gibt es im <a href="${wiki_url}">Wiki</a> (english).',
|
|
FOLDERS_TO_IGNORE: "Ausgeschlossene Ordner",
|
|
FOLDERS_TO_IGNORE_DESC: "Mehrere Ordner mit Zeilenumbr\xFCchen getrennt angeben. Bsp. OrdnerA[Zeilenumbruch]OrdnerB/Unterordner",
|
|
FLASHCARDS: "Lernkarten",
|
|
FLASHCARD_EASY_LABEL: "Easy Button Text",
|
|
FLASHCARD_GOOD_LABEL: "Good Button Text",
|
|
FLASHCARD_HARD_LABEL: "Hard Button Text",
|
|
FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button',
|
|
FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button',
|
|
FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button',
|
|
FLASHCARD_TAGS: "Lernkarten Tags",
|
|
FLASHCARD_TAGS_DESC: "Mehrere Tags mit Leerzeichen oder Zeilenumbr\xFCchen getrennt angeben. Bsp. #karte #stapel2 #stapel3.",
|
|
CONVERT_FOLDERS_TO_DECKS: "Ordner in Stapel und Substapel umwandeln?",
|
|
CONVERT_FOLDERS_TO_DECKS_DESC: 'Eine Alternative zur oberen "Lernkarten Tags" Option.',
|
|
INLINE_SCHEDULING_COMMENTS: "Den Fortschritt in der gleichen Zeile wie die letzte Zeile einer Lernkartei speichern?",
|
|
INLINE_SCHEDULING_COMMENTS_DESC: "Wenn aktiviert, wird der HTML Kommentar die umgebende Liste nicht aufbrechen.",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY: "Verwandte Karten auf den n\xE4chsten Tag verlegen?",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Verwandte Karten sind aus der gleichen Karte generiert worden (z.B. L\xFCckentextkarten oder beidseitige Karten).",
|
|
SHOW_CARD_CONTEXT: "Kontext in den Karten anzeigen?",
|
|
SHOW_CARD_CONTEXT_DESC: "Bsp. Titel > \xDCberschrift 1 > Sektion > ... > Untersektion",
|
|
CARD_MODAL_HEIGHT_PERCENT: "H\xF6he der Lernkartei in Prozent",
|
|
CARD_MODAL_SIZE_PERCENT_DESC: "Auf kleinen Bildschirmen (z.B. Smartphones) oder bei sehr grossen Bildern sollte dieser Wert auf 100% gesetzt werden.",
|
|
RESET_DEFAULT: "Standardeinstellung wiederherstellen",
|
|
CARD_MODAL_WIDTH_PERCENT: "Breite einer Lernkarte in Prozent",
|
|
RANDOMIZE_CARD_ORDER: "W\xE4hrend der Wiederhoung die Reihenfolge zuf\xE4llig mischen?",
|
|
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
REVIEW_DECK_ORDER: "Order decks are displayed during review",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
DISABLE_CLOZE_CARDS: "L\xFCckentextkarten (cloze deletions) deaktivieren?",
|
|
CONVERT_HIGHLIGHTS_TO_CLOZES: "==Hervorgehobenen== Text in L\xFCckentextkarten umwandeln?",
|
|
CONVERT_BOLD_TEXT_TO_CLOZES: "**Fettgedruckten** Text in L\xFCckentextkarten umwandeln?",
|
|
CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{Geschweifte Klammern}} Text in L\xFCckentextkarten umwandeln?",
|
|
INLINE_CARDS_SEPARATOR: "Trennzeichen f\xFCr einzeilige Lernkarten",
|
|
FIX_SEPARATORS_MANUALLY_WARNING: "Wenn diese Einstellung ge\xE4ndert wird, dann m\xFCssen die entsprechenden Lernkarten manuell angepasst werden.",
|
|
INLINE_REVERSED_CARDS_SEPARATOR: "Trennzeichen f\xFCr einzeilige beidseitige Lernkarten",
|
|
MULTILINE_CARDS_SEPARATOR: "Trennzeichen f\xFCr mehrzeilige Lernkarten",
|
|
MULTILINE_REVERSED_CARDS_SEPARATOR: "Trennzeichen f\xFCr mehrzeilige beidseitige Lernkarten",
|
|
NOTES: "Notizen",
|
|
REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup",
|
|
TAGS_TO_REVIEW: "Zu wiederholende Tags",
|
|
TAGS_TO_REVIEW_DESC: "Mehrere Tags k\xF6nnen mit Leerzeichen oder Zeilenumbr\xFCchen getrennt angegeben werden. Bsp. #karte #tag1 #tag2.",
|
|
OPEN_RANDOM_NOTE: "Zuf\xE4llige Karten wiederholen",
|
|
OPEN_RANDOM_NOTE_DESC: "Wenn dies deaktiviert wird, dann werden die Notizen nach Wichtigkeit wiederholt (PageRank).",
|
|
AUTO_NEXT_NOTE: "Nach einer Wiederholung automatisch die n\xE4chste Karte \xF6ffnen",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS: "Optionen zur Wiederholung im Men\xFC einer Datei deaktivieren. Bsp. Wiederholen: Einfach Gut Schwer",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Nach dem Deaktivieren k\xF6nnen die Tastenk\xFCrzel zur Wiederholung verwendet werden. Obsidian muss nach einer \xC4nderung neu geladen weren.",
|
|
MAX_N_DAYS_REVIEW_QUEUE: "Maximale Anzahl anstehender Notizen, die im rechten Fensterbereich angezeigt werden",
|
|
MIN_ONE_DAY: "Anzahl der Tage muss mindestens 1 sein.",
|
|
VALID_NUMBER_WARNING: "Bitte eine g\xFCltige Zahl eingeben.",
|
|
UI_PREFERENCES: "Einstellungen der Benutzeroberfl\xE4che",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Deckb\xE4ume sollten anf\xE4nglich erweitert angezeigt werden",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Deaktivieren Sie dies, um verschachtelte Decks in derselben Karte zu reduzieren. N\xFCtzlich, wenn Sie Karten haben, die zu vielen Decks in derselben Datei geh\xF6ren.",
|
|
ALGORITHM: "Algorithmus",
|
|
CHECK_ALGORITHM_WIKI: 'Weiterf\xFChrende Informationen: <a href="${algo_url}">Implementierung des Algorithmus</a> (english).',
|
|
BASE_EASE: "Basis der Einfachheit",
|
|
BASE_EASE_DESC: "Minimum ist 130. Empfohlen wird ca. 250.",
|
|
BASE_EASE_MIN_WARNING: "Basis der Einfachheit muss mindestens 130 sein.",
|
|
LAPSE_INTERVAL_CHANGE: "Anpassungsfaktor des Intervalls wenn eine Notiz / Karte 'Schwer' abgeschlossen wird",
|
|
LAPSE_INTERVAL_CHANGE_DESC: "neuesIntervall = altesIntervall * anpassungsfaktor / 100.",
|
|
EASY_BONUS: "Einfachheit-Bonus",
|
|
EASY_BONUS_DESC: "Der Einfachheit-Bonus gibt an um welchen Faktor (in Prozent) das Intervall l\xE4nger sein soll, wenn eine Notiz / Karte 'Einfach' statt 'Gut' abgeschlossen wird. Minimum ist 100%.",
|
|
EASY_BONUS_MIN_WARNING: "Der Einfachheit-Bonus muss mindestens 100 sein.",
|
|
MAX_INTERVAL: "Maximum interval in days",
|
|
MAX_INTERVAL_DESC: "Das maximale Intervall (in Tagen) f\xFCr Wiederholungen. Standard sind 100 Jahre.",
|
|
MAX_INTERVAL_MIN_WARNING: "Das maximale Interall muss mindestens ein Tag sein.",
|
|
MAX_LINK_CONTRIB: "Maximaler Einfluss von Links",
|
|
MAX_LINK_CONTRIB_DESC: "Maximaler Einfluss der Einfachheiten verlinkter Notizen zur gewichteten initialen Einfachheit einer neuen Lernkarte.",
|
|
LOGGING: "Logging",
|
|
DISPLAY_DEBUG_INFO: "Informationen zum Debugging in der Entwicklerkonsole anzeigen?",
|
|
// sidebar.ts
|
|
NOTES_REVIEW_QUEUE: "Anstehende Notizen zur Wiederholung",
|
|
CLOSE: "Schliessen",
|
|
NEW: "Neu",
|
|
YESTERDAY: "Gestern",
|
|
TODAY: "Heute",
|
|
TOMORROW: "Morgen",
|
|
// stats-modal.tsx
|
|
STATS_TITLE: "Statistiken",
|
|
MONTH: "Month",
|
|
QUARTER: "Quarter",
|
|
YEAR: "Year",
|
|
LIFETIME: "Lifetime",
|
|
FORECAST: "Prognose",
|
|
FORECAST_DESC: "Anzahl der k\xFCnftig anstehenden Karten",
|
|
SCHEDULED: "Anstehend",
|
|
DAYS: "Tage",
|
|
NUMBER_OF_CARDS: "Anzahl der Karten",
|
|
REVIEWS_PER_DAY: "Durchschnitt: ${avg} Wiederholungen/Tag",
|
|
INTERVALS: "Intervalle",
|
|
INTERVALS_DESC: "Intervalle bis Wiederholungen anstehen",
|
|
COUNT: "Anzahl",
|
|
INTERVALS_SUMMARY: "Durchschnittliches Intervall: ${avg}, L\xE4ngstes Intervall: ${longest}",
|
|
EASES: "Einfachheit",
|
|
EASES_SUMMARY: "Durchschnittliche Einfachheit: ${avgEase}",
|
|
CARD_TYPES: "Kategorisierung",
|
|
CARD_TYPES_DESC: "Verlegte Karten eingeschlossen",
|
|
CARD_TYPE_NEW: "Neu",
|
|
CARD_TYPE_YOUNG: "Jung",
|
|
CARD_TYPE_MATURE: "Ausgereift",
|
|
CARD_TYPES_SUMMARY: "Insgesamt ${totalCardsCount} Karten"
|
|
};
|
|
|
|
// src/lang/locale/en.ts
|
|
var en_default = {
|
|
// flashcard-modal.tsx
|
|
DECKS: "Decks",
|
|
DUE_CARDS: "Due Cards",
|
|
NEW_CARDS: "New Cards",
|
|
TOTAL_CARDS: "Total Cards",
|
|
BACK: "Back",
|
|
SKIP: "Skip",
|
|
EDIT_CARD: "Edit Card",
|
|
RESET_CARD_PROGRESS: "Reset card's progress",
|
|
HARD: "Hard",
|
|
GOOD: "Good",
|
|
EASY: "Easy",
|
|
SHOW_ANSWER: "Show Answer",
|
|
CARD_PROGRESS_RESET: "Card's progress has been reset.",
|
|
SAVE: "Save",
|
|
CANCEL: "Cancel",
|
|
NO_INPUT: "No input provided.",
|
|
CURRENT_EASE_HELP_TEXT: "Current Ease: ",
|
|
CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ",
|
|
CARD_GENERATED_FROM: "Generated from: ${notePath}",
|
|
// main.ts
|
|
OPEN_NOTE_FOR_REVIEW: "Open a note for review",
|
|
REVIEW_CARDS: "Review flashcards",
|
|
REVIEW_EASY_FILE_MENU: "Review: Easy",
|
|
REVIEW_GOOD_FILE_MENU: "Review: Good",
|
|
REVIEW_HARD_FILE_MENU: "Review: Hard",
|
|
REVIEW_NOTE_EASY_CMD: "Review note as easy",
|
|
REVIEW_NOTE_GOOD_CMD: "Review note as good",
|
|
REVIEW_NOTE_HARD_CMD: "Review note as hard",
|
|
CRAM_ALL_CARDS: "Select a deck to cram",
|
|
REVIEW_ALL_CARDS: "Review flashcards from all notes",
|
|
REVIEW_CARDS_IN_NOTE: "Review flashcards in this note",
|
|
CRAM_CARDS_IN_NOTE: "Cram flashcards in this note",
|
|
VIEW_STATS: "View statistics",
|
|
STATUS_BAR: "Review: ${dueNotesCount} note(s), ${dueFlashcardsCount} card(s) due",
|
|
SYNC_TIME_TAKEN: "Sync took ${t}ms",
|
|
NOTE_IN_IGNORED_FOLDER: "Note is saved under ignored folder (check settings).",
|
|
PLEASE_TAG_NOTE: "Please tag the note appropriately for reviewing (in settings).",
|
|
RESPONSE_RECEIVED: "Response received.",
|
|
NO_DECK_EXISTS: "No deck exists for ${deckName}",
|
|
ALL_CAUGHT_UP: "You're all caught up now :D.",
|
|
// scheduling.ts
|
|
DAYS_STR_IVL: "${interval} day(s)",
|
|
MONTHS_STR_IVL: "${interval} month(s)",
|
|
YEARS_STR_IVL: "${interval} year(s)",
|
|
DAYS_STR_IVL_MOBILE: "${interval}d",
|
|
MONTHS_STR_IVL_MOBILE: "${interval}m",
|
|
YEARS_STR_IVL_MOBILE: "${interval}y",
|
|
// settings.ts
|
|
SETTINGS_HEADER: "Spaced Repetition Plugin - Settings",
|
|
CHECK_WIKI: 'For more information, check the <a href="${wiki_url}">wiki</a>.',
|
|
FOLDERS_TO_IGNORE: "Folders to ignore",
|
|
FOLDERS_TO_IGNORE_DESC: "Enter folder paths separated by newlines i.e. Templates Meta/Scripts",
|
|
FLASHCARDS: "Flashcards",
|
|
FLASHCARD_EASY_LABEL: "Easy Button Text",
|
|
FLASHCARD_GOOD_LABEL: "Good Button Text",
|
|
FLASHCARD_HARD_LABEL: "Hard Button Text",
|
|
FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button',
|
|
FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button',
|
|
FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button',
|
|
FLASHCARD_TAGS: "Flashcard tags",
|
|
FLASHCARD_TAGS_DESC: "Enter tags separated by spaces or newlines i.e. #flashcards #deck2 #deck3.",
|
|
CONVERT_FOLDERS_TO_DECKS: "Convert folders to decks and subdecks?",
|
|
CONVERT_FOLDERS_TO_DECKS_DESC: "This is an alternative to the Flashcard tags option above.",
|
|
INLINE_SCHEDULING_COMMENTS: "Save scheduling comment on the same line as the flashcard's last line?",
|
|
INLINE_SCHEDULING_COMMENTS_DESC: "Turning this on will make the HTML comments not break list formatting.",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY: "Bury sibling cards until the next day?",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Siblings are cards generated from the same card text i.e. cloze deletions",
|
|
SHOW_CARD_CONTEXT: "Show context in cards?",
|
|
SHOW_CARD_CONTEXT_DESC: "i.e. Title > Heading 1 > Subheading > ... > Subheading",
|
|
CARD_MODAL_HEIGHT_PERCENT: "Flashcard Height Percentage",
|
|
CARD_MODAL_SIZE_PERCENT_DESC: "Should be set to 100% on mobile or if you have very large images",
|
|
RESET_DEFAULT: "Reset to default",
|
|
CARD_MODAL_WIDTH_PERCENT: "Flashcard Width Percentage",
|
|
RANDOMIZE_CARD_ORDER: "Randomize card order during review?",
|
|
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
REVIEW_DECK_ORDER: "Order decks are displayed during review",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
DISABLE_CLOZE_CARDS: "Disable cloze cards?",
|
|
CONVERT_HIGHLIGHTS_TO_CLOZES: "Convert ==hightlights== to clozes?",
|
|
CONVERT_BOLD_TEXT_TO_CLOZES: "Convert **bolded text** to clozes?",
|
|
CONVERT_CURLY_BRACKETS_TO_CLOZES: "Convert {{curly brackets}} to clozes?",
|
|
INLINE_CARDS_SEPARATOR: "Separator for inline flashcards",
|
|
FIX_SEPARATORS_MANUALLY_WARNING: "Note that after changing this you have to manually edit any flashcards you already have.",
|
|
INLINE_REVERSED_CARDS_SEPARATOR: "Separator for inline reversed flashcards",
|
|
MULTILINE_CARDS_SEPARATOR: "Separator for multiline flashcards",
|
|
MULTILINE_REVERSED_CARDS_SEPARATOR: "Separator for multiline reversed flashcards",
|
|
NOTES: "Notes",
|
|
REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup",
|
|
TAGS_TO_REVIEW: "Tags to review",
|
|
TAGS_TO_REVIEW_DESC: "Enter tags separated by spaces or newlines i.e. #review #tag2 #tag3.",
|
|
OPEN_RANDOM_NOTE: "Open a random note for review",
|
|
OPEN_RANDOM_NOTE_DESC: "When you turn this off, notes are ordered by importance (PageRank).",
|
|
AUTO_NEXT_NOTE: "Open next note automatically after a review",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS: "Disable review options in the file menu i.e. Review: Easy Good Hard",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "After disabling, you can review using the command hotkeys. Reload Obsidian after changing this.",
|
|
MAX_N_DAYS_REVIEW_QUEUE: "Maximum number of days to display on right panel",
|
|
MIN_ONE_DAY: "The number of days must be at least 1.",
|
|
VALID_NUMBER_WARNING: "Please provide a valid number.",
|
|
UI_PREFERENCES: "UI Preferences",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Deck trees should be initially displayed as expanded",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Turn this off to collapse nested decks in the same card. Useful if you have cards which belong to many decks in the same file.",
|
|
ALGORITHM: "Algorithm",
|
|
CHECK_ALGORITHM_WIKI: 'For more information, check the <a href="${algo_url}">algorithm implementation</a>.',
|
|
BASE_EASE: "Base ease",
|
|
BASE_EASE_DESC: "minimum = 130, preferrably approximately 250.",
|
|
BASE_EASE_MIN_WARNING: "The base ease must be at least 130.",
|
|
LAPSE_INTERVAL_CHANGE: "Interval change when you review a flashcard/note as hard",
|
|
LAPSE_INTERVAL_CHANGE_DESC: "newInterval = oldInterval * intervalChange / 100.",
|
|
EASY_BONUS: "Easy Bonus",
|
|
EASY_BONUS_DESC: "The easy bonus allows you to set the difference in intervals between answering Good and Easy on a flashcard/note (minimum = 100%).",
|
|
EASY_BONUS_MIN_WARNING: "The easy bonus must be at least 100.",
|
|
MAX_INTERVAL: "Maximum interval in days",
|
|
MAX_INTERVAL_DESC: "Allows you to place an upper limit on the interval (default = 100 years).",
|
|
MAX_INTERVAL_MIN_WARNING: "The maximum interval must be at least 1 day.",
|
|
MAX_LINK_CONTRIB: "Maximum link contribution",
|
|
MAX_LINK_CONTRIB_DESC: "Maximum contribution of the weighted ease of linked notes to the initial ease.",
|
|
LOGGING: "Logging",
|
|
DISPLAY_DEBUG_INFO: "Display debugging information on the developer console?",
|
|
// sidebar.ts
|
|
NOTES_REVIEW_QUEUE: "Notes Review Queue",
|
|
CLOSE: "Close",
|
|
NEW: "New",
|
|
YESTERDAY: "Yesterday",
|
|
TODAY: "Today",
|
|
TOMORROW: "Tomorrow",
|
|
// stats-modal.tsx
|
|
STATS_TITLE: "Statistics",
|
|
MONTH: "Month",
|
|
QUARTER: "Quarter",
|
|
YEAR: "Year",
|
|
LIFETIME: "Lifetime",
|
|
FORECAST: "Forecast",
|
|
FORECAST_DESC: "The number of cards due in the future",
|
|
SCHEDULED: "Scheduled",
|
|
DAYS: "Days",
|
|
NUMBER_OF_CARDS: "Number of cards",
|
|
REVIEWS_PER_DAY: "Average: ${avg} reviews/day",
|
|
INTERVALS: "Intervals",
|
|
INTERVALS_DESC: "Delays until reviews are shown again",
|
|
COUNT: "Count",
|
|
INTERVALS_SUMMARY: "Average interval: ${avg}, Longest interval: ${longest}",
|
|
EASES: "Eases",
|
|
EASES_SUMMARY: "Average ease: ${avgEase}",
|
|
CARD_TYPES: "Card Types",
|
|
CARD_TYPES_DESC: "This includes buried cards as well, if any",
|
|
CARD_TYPE_NEW: "New",
|
|
CARD_TYPE_YOUNG: "Young",
|
|
CARD_TYPE_MATURE: "Mature",
|
|
CARD_TYPES_SUMMARY: "Total cards: ${totalCardsCount}"
|
|
};
|
|
|
|
// src/lang/locale/en-gb.ts
|
|
var en_gb_default = {};
|
|
|
|
// src/lang/locale/es.ts
|
|
var es_default = {
|
|
// flashcard-modal.tsx
|
|
DECKS: "Mazos",
|
|
DUE_CARDS: "Tarjetas Vencidas",
|
|
NEW_CARDS: "Tarjetas Nuevas",
|
|
TOTAL_CARDS: "Tarjetas Totales",
|
|
BACK: "Atr\xE1s",
|
|
SKIP: "Saltar",
|
|
EDIT_CARD: "Editar Tarjeta",
|
|
RESET_CARD_PROGRESS: "Reiniciar progreso de la tarjeta",
|
|
HARD: "Dif\xEDcil",
|
|
GOOD: "Bien",
|
|
EASY: "F\xE1cil",
|
|
SHOW_ANSWER: "Mostrar Respuesta",
|
|
CARD_PROGRESS_RESET: "El progreso de la tarjeta se ha reiniciado.",
|
|
SAVE: "Guardar",
|
|
CANCEL: "Cancelar",
|
|
NO_INPUT: "Se ha prove\xEDdo entrada.",
|
|
CURRENT_EASE_HELP_TEXT: "Facilidad Actual: ",
|
|
CURRENT_INTERVAL_HELP_TEXT: "Intervalo Actual: ",
|
|
CARD_GENERATED_FROM: "Generado Desde: ${notePath}",
|
|
// main.ts
|
|
OPEN_NOTE_FOR_REVIEW: "Abrir nota para revisi\xF3n",
|
|
REVIEW_CARDS: "Revisar Tarjetas",
|
|
REVIEW_EASY_FILE_MENU: "Revisar: F\xE1cil",
|
|
REVIEW_GOOD_FILE_MENU: "Revisar: Bien",
|
|
REVIEW_HARD_FILE_MENU: "Revisar: Dif\xEDcil",
|
|
REVIEW_NOTE_EASY_CMD: "Revisar nota como f\xE1cil",
|
|
REVIEW_NOTE_GOOD_CMD: "Revisar nota como bien",
|
|
REVIEW_NOTE_HARD_CMD: "Revisar nota como dif\xEDcil",
|
|
CRAM_ALL_CARDS: "Selecciona un mazo a memorizar",
|
|
REVIEW_ALL_CARDS: "Revisar tarjetas de todas las notas",
|
|
REVIEW_CARDS_IN_NOTE: "Revisar tarjetas en esta nota",
|
|
CRAM_CARDS_IN_NOTE: "Memorizar tarjetas en esta nota",
|
|
VIEW_STATS: "Ver estad\xEDsticas",
|
|
STATUS_BAR: "Revisar: ${dueNotesCount} nota(s), ${dueFlashcardsCount} tarjetas vencidas",
|
|
SYNC_TIME_TAKEN: "La sincronizaci\xF3n tom\xF3 ${t} milisegundos",
|
|
NOTE_IN_IGNORED_FOLDER: "La nota est\xE1 guardada en un directorio ignorado (revisa los ajustes).",
|
|
PLEASE_TAG_NOTE: "Por favor etiquete apropiadamente la nota para revisi\xF3n (en los ajustes).",
|
|
RESPONSE_RECEIVED: "Respuesta Recibida",
|
|
NO_DECK_EXISTS: "No existen mazos para: ${deckName}",
|
|
ALL_CAUGHT_UP: "\xA1Est\xE1s al d\xEDa! \u{1F603}",
|
|
// scheduling.ts
|
|
DAYS_STR_IVL: "${interval} d\xEDa(s)",
|
|
MONTHS_STR_IVL: "${interval} mes(es)",
|
|
YEARS_STR_IVL: "${interval} a\xF1o(s)",
|
|
DAYS_STR_IVL_MOBILE: "${interval}d",
|
|
MONTHS_STR_IVL_MOBILE: "${interval}m",
|
|
YEARS_STR_IVL_MOBILE: "${interval}a",
|
|
// settings.ts
|
|
SETTINGS_HEADER: "Extensi\xF3n de Repetici\xF3n Espaciada - Ajustes",
|
|
CHECK_WIKI: 'Para m\xE1s informaci\xF3n revisa la <a href="${wiki_url}">wiki</a>.',
|
|
FOLDERS_TO_IGNORE: "Directorios a ignorar",
|
|
FOLDERS_TO_IGNORE_DESC: "Escriba las rutas de los directorios separadas por saltos de l\xEDnea, por ejemplo, Plantillas Extra/Guiones",
|
|
FLASHCARDS: "Tarjetas de Memorizaci\xF3n",
|
|
FLASHCARD_EASY_LABEL: "Texto del bot\xF3n: F\xE1cil",
|
|
FLASHCARD_GOOD_LABEL: "Texto del bot\xF3n: Bien",
|
|
FLASHCARD_HARD_LABEL: "Texto del bot\xF3n: Dif\xEDcil",
|
|
FLASHCARD_EASY_DESC: "Personalize la etiqueta para el bot\xF3n: F\xE1cil",
|
|
FLASHCARD_GOOD_DESC: "Personalize la etiqueta para el bot\xF3n: Bien",
|
|
FLASHCARD_HARD_DESC: "Personalize la etiqueta para el bot\xF3n: Dif\xEDcil",
|
|
FLASHCARD_TAGS: "Etiquetas de las Tarjetas de Memorizaci\xF3n",
|
|
FLASHCARD_TAGS_DESC: "Escriba las etiquetas separadas por espacios o saltos de l\xEDnea, por ejemplo, #memorizar #mazo2 #mazo3",
|
|
CONVERT_FOLDERS_TO_DECKS: "\xBFConvertir directorios a mazos y submazos?",
|
|
CONVERT_FOLDERS_TO_DECKS_DESC: "Esta es una opci\xF3n alternativa a las etiquetas de las Tarjetas de Memorizaci\xF3n.",
|
|
INLINE_SCHEDULING_COMMENTS: "\xBFGuardar el comentario para programaci\xF3n de las tarjetas en la \xFAltima l\xEDnea?",
|
|
INLINE_SCHEDULING_COMMENTS_DESC: "Activar esto har\xE1 que los comentarios HTML no rompan el formato de las listas.",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY: "\xBFEnterrar tarjetas hermanas hasta el siguiente d\xEDa?",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Los hermanos son tarjetas generadas del mismo texto de la tarjeta, por ejemplo, deletreos de huecos (cloze deletions en ingl\xE9s)",
|
|
SHOW_CARD_CONTEXT: "\xBFMostrar contexto en las tarjetas?",
|
|
SHOW_CARD_CONTEXT_DESC: "Por Ejemplo: T\xEDtulo > Cabecera > Sub-Cabecera > ... > Sub-Cabecera",
|
|
CARD_MODAL_HEIGHT_PERCENT: "Porcentaje de la altura de las tarjetas de memoria",
|
|
CARD_MODAL_SIZE_PERCENT_DESC: "Deber\xEDa ser establecido en 100% si tienes im\xE1genes grandes",
|
|
RESET_DEFAULT: "Reiniciar a la configuraci\xF3n por defecto",
|
|
CARD_MODAL_WIDTH_PERCENT: "Porcentaje del ancho de las tarjetas de memoria",
|
|
RANDOMIZE_CARD_ORDER: "\xBFAleatorizar el orden de las tarjetas para revisi\xF3n?",
|
|
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
REVIEW_DECK_ORDER: "Order decks are displayed during review",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
DISABLE_CLOZE_CARDS: "\xBFDeshabilitar deletreo de huecos en las tarjetas?",
|
|
CONVERT_HIGHLIGHTS_TO_CLOZES: "\xBFConvertir ==resaltados== a deletreo de huecos?",
|
|
CONVERT_BOLD_TEXT_TO_CLOZES: "\xBFConvertir **texto en negrita** a deletreo de huecos?",
|
|
CONVERT_CURLY_BRACKETS_TO_CLOZES: "\xBFConvertir {{llaves rizadas}} a deletreo de huecos?",
|
|
INLINE_CARDS_SEPARATOR: "Separador de tarjetas de memorizaci\xF3n en l\xEDnea",
|
|
FIX_SEPARATORS_MANUALLY_WARNING: "Note que despu\xE9s de cambiar este ajuste, tendr\xE1 que cambiar manualmente todas las notas que tenga.",
|
|
INLINE_REVERSED_CARDS_SEPARATOR: "Separador de tarjetas de memorizaci\xF3n para tarjetas de notas invertidas",
|
|
MULTILINE_CARDS_SEPARATOR: "Separador para tarjetas de memorizaci\xF3n multil\xEDnea",
|
|
MULTILINE_REVERSED_CARDS_SEPARATOR: "Separador para tarjetas de memorizaci\xF3n multil\xEDnea invertidas",
|
|
NOTES: "Notes",
|
|
REVIEW_PANE_ON_STARTUP: "Activar panel de revisi\xF3n de notas al arrancar",
|
|
TAGS_TO_REVIEW: "Etiquetas a revisar",
|
|
TAGS_TO_REVIEW_DESC: "Escriba las etiquetas separadas por espacios o saltos de l\xEDneas, por ejemplo, #revisi\xF3n #etiqueta2 #etiqueta3.",
|
|
OPEN_RANDOM_NOTE: "Abrir una nota al azar para revisar",
|
|
OPEN_RANDOM_NOTE_DESC: "Cuando deshabilita esto, las notas son ordenadas por importancia (Algoritmo PageRank).",
|
|
AUTO_NEXT_NOTE: "Abrir la siguiente nota autom\xE1ticamente despu\xE9s de una revisi\xF3n",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS: "Deshabilitar opciones de revisi\xF3n en el men\xFA de archivo, por ejemplo, Revisi\xF3n: F\xE1cil Bien Dif\xEDcil",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Despu\xE9s de deshabilitarlo, puede hacer las revisiones utilizando atajos de teclado. Reinicie Obsidian despu\xE9s de cambiar esto.",
|
|
MAX_N_DAYS_REVIEW_QUEUE: "N\xFAmero m\xE1ximo de d\xEDas a mostrar en el panel derecho.",
|
|
MIN_ONE_DAY: "El n\xFAmero de d\xEDas debe ser al menos uno.",
|
|
VALID_NUMBER_WARNING: "Por favor especifique un n\xFAmero v\xE1lido.",
|
|
UI_PREFERENCES: "Preferencias de la interfaz de usuario.",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Los \xE1rboles de mazos deber\xEDan ser expandidos al inicio.",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Desactiva esto para contraer mazos anidados en la misma tarjeta. \xDAtil si tienes tarjetas que pertenecen a muchos mazos en el mismo archivo.",
|
|
ALGORITHM: "Algoritmo",
|
|
CHECK_ALGORITHM_WIKI: 'Para m\xE1s informaci\xF3n, revisa la <a href="${algo_url}">implementaci\xF3n del algoritmo</a>.',
|
|
BASE_EASE: "Base ease",
|
|
BASE_EASE_DESC: "El m\xEDnimo es 130, es preferible que est\xE9 aproximado a 250.",
|
|
BASE_EASE_MIN_WARNING: "La facilidad base de las tarjetas debe ser al menos 130.",
|
|
LAPSE_INTERVAL_CHANGE: "El intervalo cambiar\xE1 cuando se revise una tarjeta o nota como Dif\xEDcil.",
|
|
LAPSE_INTERVAL_CHANGE_DESC: "NuevoInterval = ViejoIntervalo * CambioDeIntervalo / 100.",
|
|
EASY_BONUS: "Bonificaci\xF3n para F\xE1cil",
|
|
EASY_BONUS_DESC: "La bonificaci\xF3n para F\xE1cil te permite establecer la diferencia entre intervalos al responder Bien y F\xE1cil en las tarjetas o notas (m\xEDnimo = 100%).",
|
|
EASY_BONUS_MIN_WARNING: "El bono de facilidad debe ser al menos 100.",
|
|
MAX_INTERVAL: "Intervalo m\xE1ximo en d\xEDas",
|
|
MAX_INTERVAL_DESC: "Te permite establecer un l\xEDmite mayor en el intervalo (por defecto es de 100 a\xF1os).",
|
|
MAX_INTERVAL_MIN_WARNING: "El intervalo m\xE1ximo debe ser de al menos un d\xEDa.",
|
|
MAX_LINK_CONTRIB: "Contribuci\xF3n m\xE1xima de las notas vinculadas.",
|
|
MAX_LINK_CONTRIB_DESC: "Contribuci\xF3n m\xE1xima de la facilidad ponderada de las notas vinculadas a la facilidad inicial.",
|
|
LOGGING: "Registro",
|
|
DISPLAY_DEBUG_INFO: "\xBFMostrar informaci\xF3n de depuraci\xF3n en la consola de desarrollador?",
|
|
// sidebar.ts
|
|
NOTES_REVIEW_QUEUE: "Cola de notas a revisar",
|
|
CLOSE: "Cerrar",
|
|
NEW: "Nuevo",
|
|
YESTERDAY: "Ayer",
|
|
TODAY: "Hoy",
|
|
TOMORROW: "Ma\xF1ana",
|
|
// stats-modal.tsx
|
|
STATS_TITLE: "Estad\xEDsticas",
|
|
MONTH: "Mes",
|
|
QUARTER: "Trimestre o Cuatrimestre",
|
|
// En Inglés: Quarter.
|
|
YEAR: "A\xF1o",
|
|
LIFETIME: "Tiempo de Vida",
|
|
FORECAST: "Pron\xF3stico",
|
|
FORECAST_DESC: "El n\xFAmero de tarjetas vencidas en el futuro",
|
|
SCHEDULED: "Programado",
|
|
DAYS: "D\xEDas",
|
|
NUMBER_OF_CARDS: "N\xFAmero de tarjetas",
|
|
REVIEWS_PER_DAY: "Carga: ${avg} Revisiones por d\xEDa",
|
|
INTERVALS: "Intervalos",
|
|
INTERVALS_DESC: "Retrasos hasta que las revisiones se muestren de nuevo",
|
|
COUNT: "Conteo",
|
|
INTERVALS_SUMMARY: "Intervalo de carga: ${avg}, Intervalo mayor: ${longest}",
|
|
EASES: "Facilidad",
|
|
EASES_SUMMARY: "Carga de Facilidad: ${avgEase}",
|
|
CARD_TYPES: "Tipos de tarjetas",
|
|
CARD_TYPES_DESC: "Esto incluye tambi\xE9n a las tarjetas enterradas, si las hay",
|
|
CARD_TYPE_NEW: "Nueva",
|
|
CARD_TYPE_YOUNG: "Joven",
|
|
CARD_TYPE_MATURE: "Madura",
|
|
CARD_TYPES_SUMMARY: "Tarjetas Totales: ${totalCardsCount}"
|
|
};
|
|
|
|
// src/lang/locale/fr.ts
|
|
var fr_default = {};
|
|
|
|
// src/lang/locale/hi.ts
|
|
var hi_default = {};
|
|
|
|
// src/lang/locale/id.ts
|
|
var id_default = {};
|
|
|
|
// src/lang/locale/it.ts
|
|
var it_default = {};
|
|
|
|
// src/lang/locale/ja.ts
|
|
var ja_default = {
|
|
// flashcard-modal.tsx
|
|
DECKS: "\u30C7\u30C3\u30AD",
|
|
DUE_CARDS: "\u671F\u65E5\u306E\u30AB\u30FC\u30C9",
|
|
NEW_CARDS: "\u65B0\u898F\u306E\u30AB\u30FC\u30C9",
|
|
TOTAL_CARDS: "\u30AB\u30FC\u30C9\u5408\u8A08",
|
|
BACK: "Back",
|
|
SKIP: "Skip",
|
|
EDIT_CARD: "Edit Card",
|
|
RESET_CARD_PROGRESS: "\u30AB\u30FC\u30C9\u306E\u9032\u6357\u3092\u30EA\u30BB\u30C3\u30C8",
|
|
HARD: "Hard",
|
|
GOOD: "Good",
|
|
EASY: "Easy",
|
|
SHOW_ANSWER: "\u89E3\u7B54\u3092\u8868\u793A",
|
|
CARD_PROGRESS_RESET: "\u30AB\u30FC\u30C9\u306E\u9032\u6357\u304C\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u307E\u3057\u305F\u3002",
|
|
SAVE: "Save",
|
|
CANCEL: "Cancel",
|
|
NO_INPUT: "No input provided.",
|
|
CURRENT_EASE_HELP_TEXT: "Current Ease: ",
|
|
CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ",
|
|
CARD_GENERATED_FROM: "Generated from: ${notePath}",
|
|
// main.ts
|
|
OPEN_NOTE_FOR_REVIEW: "\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u30CE\u30FC\u30C8\u3092\u958B\u304F",
|
|
REVIEW_CARDS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u30EC\u30D3\u30E5\u30FC",
|
|
REVIEW_EASY_FILE_MENU: "\u30EC\u30D3\u30E5\u30FC: Easy",
|
|
REVIEW_GOOD_FILE_MENU: "\u30EC\u30D3\u30E5\u30FC: Good",
|
|
REVIEW_HARD_FILE_MENU: "\u30EC\u30D3\u30E5\u30FC: Hard",
|
|
REVIEW_NOTE_EASY_CMD: "\u30CE\u30FC\u30C8\u3092Easy\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B",
|
|
REVIEW_NOTE_GOOD_CMD: "\u30CE\u30FC\u30C8\u3092Good\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B",
|
|
REVIEW_NOTE_HARD_CMD: "\u30CE\u30FC\u30C8\u3092Hard\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B",
|
|
REVIEW_ALL_CARDS: "\u3059\u3079\u3066\u306E\u30CE\u30FC\u30C8\u304B\u3089\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u30EC\u30D3\u30E5\u30FC\u3059\u308B",
|
|
CRAM_ALL_CARDS: "Select a deck to cram",
|
|
REVIEW_CARDS_IN_NOTE: "\u3053\u306E\u30CE\u30FC\u30C8\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u30EC\u30D3\u30E5\u30FC\u3059\u308B",
|
|
CRAM_CARDS_IN_NOTE: "\u3053\u306E\u30CE\u30FC\u30C8\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u8A70\u3081\u8FBC\u307F\u5B66\u7FD2\u3059\u308B",
|
|
VIEW_STATS: "\u7D71\u8A08\u3092\u95B2\u89A7\u3059\u308B",
|
|
STATUS_BAR: "\u30EC\u30D3\u30E5\u30FC: ${dueNotesCount}\u30CE\u30FC\u30C8, ${dueFlashcardsCount}\u30AB\u30FC\u30C9\u304C\u671F\u65E5",
|
|
SYNC_TIME_TAKEN: "\u540C\u671F\u306B${t}ms\u304B\u304B\u308A\u307E\u3057\u305F\u3002",
|
|
NOTE_IN_IGNORED_FOLDER: "\u30CE\u30FC\u30C8\u304C\u7121\u8996\u3059\u308B\u30D5\u30A9\u30EB\u30C0\u306B\u4FDD\u5B58\u3055\u308C\u3066\u3044\u307E\u3059(\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044)\u3002",
|
|
PLEASE_TAG_NOTE: "\u30EC\u30D3\u30E5\u30FC\u3092\u884C\u3046\u306B\u306F\u30CE\u30FC\u30C8\u306B\u5BFE\u3057\u3066\u6B63\u3057\u304F\u30BF\u30B0\u4ED8\u3051\u3057\u3066\u304F\u3060\u3055\u3044(\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044)\u3002",
|
|
RESPONSE_RECEIVED: "\u7B54\u3048\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\u3002",
|
|
NO_DECK_EXISTS: "${deckName}\u306B\u306F\u30C7\u30C3\u30AD\u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002",
|
|
ALL_CAUGHT_UP: "\u4ECA\u65E5\u306E\u8AB2\u984C\u3092\u3059\u3079\u3066\u9054\u6210\u3057\u307E\u3057\u305F :D",
|
|
// scheduling.ts
|
|
DAYS_STR_IVL: "${interval}\u65E5\u5F8C",
|
|
MONTHS_STR_IVL: "${interval}\u6708\u5F8C",
|
|
YEARS_STR_IVL: "${interval}\u5E74\u5F8C",
|
|
DAYS_STR_IVL_MOBILE: "${interval}d",
|
|
MONTHS_STR_IVL_MOBILE: "${interval}m",
|
|
YEARS_STR_IVL_MOBILE: "${interval}y",
|
|
// settings.ts
|
|
SETTINGS_HEADER: "Spaced Repetition Plugin - \u8A2D\u5B9A",
|
|
CHECK_WIKI: '\u8A73\u7D30\u306B\u3064\u3044\u3066\u306F<a href="${wiki_url}">wiki</a>\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002',
|
|
FOLDERS_TO_IGNORE: "\u7121\u8996\u3059\u308B\u30D5\u30A9\u30EB\u30C0",
|
|
FOLDERS_TO_IGNORE_DESC: '\u30D5\u30A9\u30EB\u30C0\u30D1\u30B9\u3092\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"Templates Meta/Scripts" \u306E\u3088\u3046\u306A\u30B9\u30DA\u30FC\u30B9\u306B\u3088\u308B\u533A\u5207\u308A\u3067\u306E\u66F8\u304D\u65B9\u306F\u7121\u52B9\u3067\u3059\u3002',
|
|
FLASHCARDS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9",
|
|
FLASHCARD_EASY_LABEL: "Easy Button Text",
|
|
FLASHCARD_GOOD_LABEL: "Good Button Text",
|
|
FLASHCARD_HARD_LABEL: "Hard Button Text",
|
|
FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button',
|
|
FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button',
|
|
FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button',
|
|
FLASHCARD_TAGS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BF\u30B0",
|
|
FLASHCARD_TAGS_DESC: '\u30BF\u30B0\u3092\u30B9\u30DA\u30FC\u30B9\u307E\u305F\u306F\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u4F8B: "#flashcards #deck2 #deck3"',
|
|
CONVERT_FOLDERS_TO_DECKS: "\u30D5\u30A9\u30EB\u30C0\u3092\u30C7\u30C3\u30AD\u3068\u30B5\u30D6\u30C7\u30C3\u30AD\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F",
|
|
CONVERT_FOLDERS_TO_DECKS_DESC: "\u3053\u308C\u306F\u4E0A\u8A18\u306E\u30BF\u30B0\u3092\u4F7F\u7528\u3057\u305F\u30C7\u30C3\u30AD\u69CB\u7BC9\u306E\u4EE3\u66FF\u3068\u306A\u308B\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u3059\u3002",
|
|
INLINE_SCHEDULING_COMMENTS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u6700\u7D42\u884C\u3068\u540C\u4E00\u306E\u884C\u306B\u30B9\u30B1\u30B8\u30E5\u30FC\u30EA\u30F3\u30B0\u30B3\u30E1\u30F3\u30C8\u3092\u4FDD\u5B58\u3057\u307E\u3059\u304B\uFF1F",
|
|
INLINE_SCHEDULING_COMMENTS_DESC: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u5316\u3059\u308B\u3068\u3001HTML\u30B3\u30E1\u30F3\u30C8\u306B\u3088\u3063\u3066Markdown\u306E\u30EA\u30B9\u30C8\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u304C\u5D29\u308C\u306A\u304F\u306A\u308A\u307E\u3059\u3002",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY: "\u6B21\u306E\u30EC\u30D3\u30E5\u30FC\u307E\u3067\u30B7\u30D6\u30EA\u30F3\u30B0\u3092\u5EF6\u671F\u3057\u307E\u3059\u304B\uFF1F",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u30B7\u30D6\u30EA\u30F3\u30B0\u306F\u540C\u4E00\u306E\u30AB\u30FC\u30C9\u30C6\u30AD\u30B9\u30C8\u304B\u3089\u751F\u6210\u3055\u308C\u305F\u30AB\u30FC\u30C9\u3001\u3064\u307E\u308A\u7A74\u57CB\u3081\u554F\u984C\u306E\u6D3E\u751F\u30AB\u30FC\u30C9\u3067\u3059\u3002",
|
|
SHOW_CARD_CONTEXT: "\u30AB\u30FC\u30C9\u306B\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3092\u8868\u793A\u3057\u307E\u3059\u304B\uFF1F",
|
|
SHOW_CARD_CONTEXT_DESC: "\uFF62\u30BF\u30A4\u30C8\u30EB > \u898B\u51FA\u3057 1 > \u526F\u898B\u51FA\u3057 > ... > \u526F\u898B\u51FA\u3057\uFF63\u306E\u8868\u793A\u3092\u884C\u3046\u304B\u3069\u3046\u304B\u3092\u6C7A\u3081\u307E\u3059\u3002",
|
|
CARD_MODAL_HEIGHT_PERCENT: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u7E26\u30B5\u30A4\u30BA\u306E\u30D1\u30FC\u30BB\u30F3\u30C6\u30FC\u30B8",
|
|
CARD_MODAL_SIZE_PERCENT_DESC: "\u30E2\u30D0\u30A4\u30EB\u7248\u3001\u307E\u305F\u306F\u975E\u5E38\u306B\u5927\u304D\u306A\u30B5\u30A4\u30BA\u306E\u753B\u50CF\u304C\u3042\u308B\u5834\u5408\u306B\u306F100%\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002",
|
|
RESET_DEFAULT: "\u30C7\u30D5\u30A9\u30EB\u30C8\u5024\u306B\u30EA\u30BB\u30C3\u30C8\u3059\u308B",
|
|
CARD_MODAL_WIDTH_PERCENT: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u6A2A\u30B5\u30A4\u30BA\u306E\u30D1\u30FC\u30BB\u30F3\u30C6\u30FC\u30B8",
|
|
RANDOMIZE_CARD_ORDER: "\u30EC\u30D3\u30E5\u30FC\u4E2D\u306E\u30AB\u30FC\u30C9\u306E\u9806\u756A\u3092\u30E9\u30F3\u30C0\u30E0\u306B\u3057\u307E\u3059\u304B\uFF1F",
|
|
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
REVIEW_DECK_ORDER: "Order decks are displayed during review",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
DISABLE_CLOZE_CARDS: "\u7A74\u57CB\u3081\u30AB\u30FC\u30C9\u3092\u7121\u52B9\u5316\u3057\u307E\u3059\u304B\uFF1F",
|
|
CONVERT_HIGHLIGHTS_TO_CLOZES: "==\u30CF\u30A4\u30E9\u30A4\u30C8==\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F",
|
|
CONVERT_BOLD_TEXT_TO_CLOZES: "**\u30DC\u30FC\u30EB\u30C9\u4F53**\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F",
|
|
CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{\u4E2D\u62EC\u5F27}}\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F",
|
|
INLINE_CARDS_SEPARATOR: "\u30A4\u30F3\u30E9\u30A4\u30F3\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC",
|
|
FIX_SEPARATORS_MANUALLY_WARNING: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u5909\u66F4\u3059\u308B\u5834\u5408\u306B\u306F\u3001\u4F5C\u6210\u6E08\u307F\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u624B\u52D5\u3067\u7DE8\u96C6\u3057\u76F4\u3059\u5FC5\u8981\u304C\u3042\u308B\u3053\u3068\u306B\u6CE8\u610F\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
INLINE_REVERSED_CARDS_SEPARATOR: "\u30A4\u30F3\u30E9\u30A4\u30F3\u306E\u8868\u88CF\u53CD\u8EE2\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC",
|
|
MULTILINE_CARDS_SEPARATOR: "\u8907\u6570\u884C\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC",
|
|
MULTILINE_REVERSED_CARDS_SEPARATOR: "\u8907\u6570\u884C\u306E\u8868\u88CF\u53CD\u8EE2\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC",
|
|
NOTES: "\u30CE\u30FC\u30C8",
|
|
REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup",
|
|
TAGS_TO_REVIEW: "\u30EC\u30D3\u30E5\u30FC\u306B\u4F7F\u7528\u3059\u308B\u30BF\u30B0",
|
|
TAGS_TO_REVIEW_DESC: '\u30BF\u30B0\u3092\u30B9\u30DA\u30FC\u30B9\u307E\u305F\u306F\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u4F8B: "#review #tag2 #tag3"',
|
|
OPEN_RANDOM_NOTE: "\u30E9\u30F3\u30C0\u30E0\u306B\u30CE\u30FC\u30C8\u3092\u958B\u3044\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B",
|
|
OPEN_RANDOM_NOTE_DESC: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u7121\u52B9\u5316\u3055\u308C\u3066\u3044\u308B\u72B6\u614B\u3067\u306F\u3001\u30CE\u30FC\u30C8\u306F\u91CD\u8981\u5EA6(\u30DA\u30FC\u30B8\u30E9\u30F3\u30AF)\u306B\u3088\u308B\u9806\u756A\u3067\u8868\u793A\u3055\u308C\u307E\u3059\u3002",
|
|
AUTO_NEXT_NOTE: "\u30EC\u30D3\u30E5\u30FC\u5F8C\u306B\u6B21\u306E\u30CE\u30FC\u30C8\u3092\u81EA\u52D5\u7684\u306B\u958B\u304F",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u30D5\u30A1\u30A4\u30EB\u30E1\u30CB\u30E5\u30FC\u3067\u306E\u30EC\u30D3\u30E5\u30FC\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u7121\u52B9\u5316(\uFF62\u30EC\u30D3\u30E5\u30FC: Easy\uFF63\u7B49\u306E\u9805\u76EE\u3092\u975E\u8868\u793A\u306B\u3059\u308B)",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u7121\u52B9\u5316\u3057\u305F\u5F8C\u3001\u30B3\u30DE\u30F3\u30C9\u30DB\u30C3\u30C8\u30AD\u30FC\u3092\u4F7F\u3063\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u3053\u3068\u304C\u53EF\u80FD\u306B\u306A\u308A\u307E\u3059\u3002\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u5909\u66F4\u3057\u305F\u5834\u5408\u306B\u306FObsidian\u3092\u30EA\u30ED\u30FC\u30C9\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u30D1\u30CD\u30EB\u306B\u8868\u793A\u3059\u308B\u6700\u5927\u306E\u65E5\u6570",
|
|
MIN_ONE_DAY: "\u65E5\u6570\u306B\u306F1\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
VALID_NUMBER_WARNING: "\u6709\u52B9\u306A\u6570\u5B57\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
UI_PREFERENCES: "\u30E6\u30FC\u30B6\u30FC \u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9\u306E\u8A2D\u5B9A",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u30C7\u30C3\u30AD \u30C4\u30EA\u30FC\u306F\u6700\u521D\u306F\u5C55\u958B\u3057\u3066\u8868\u793A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u3053\u308C\u3092\u30AA\u30D5\u306B\u3059\u308B\u3068\u3001\u540C\u3058\u30AB\u30FC\u30C9\u5185\u306E\u30CD\u30B9\u30C8\u3055\u308C\u305F\u30C7\u30C3\u30AD\u304C\u6298\u308A\u305F\u305F\u307E\u308C\u307E\u3059\u3002\u540C\u3058\u30D5\u30A1\u30A4\u30EB\u306B\u591A\u304F\u306E\u30C7\u30C3\u30AD\u306B\u5C5E\u3059\u308B\u30AB\u30FC\u30C9\u304C\u3042\u308B\u5834\u5408\u306B\u4FBF\u5229\u3067\u3059\u3002",
|
|
ALGORITHM: "\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0",
|
|
CHECK_ALGORITHM_WIKI: '\u8A73\u7D30\u306B\u3064\u3044\u3066\u306F<a href="${algo_url}">\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u306E\u5B9F\u88C5</a>\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002',
|
|
BASE_EASE: "\u30D9\u30FC\u30B9\u306E\u6613\u3057\u3055",
|
|
BASE_EASE_DESC: "\u6700\u5C0F\u5024\u306F130\u3067\u3059\u304C\u3001 \u9069\u6B63\u5024\u306F\u304A\u304A\u3088\u305D250\u3067\u3059\u3002",
|
|
BASE_EASE_MIN_WARNING: "\u30D9\u30FC\u30B9\u306E\u6613\u3057\u3055\u306B\u306F130\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
LAPSE_INTERVAL_CHANGE: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9/\u30CE\u30FC\u30C8\u3092Hard\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3057\u305F\u969B\u306E\u9593\u9694\u5909\u66F4",
|
|
LAPSE_INTERVAL_CHANGE_DESC: '"\u65B0\u3057\u3044\u9593\u9694 = \u4EE5\u524D\u306E\u9593\u9694 * \u9593\u9694\u5909\u66F4 / 100" \u3068\u3057\u3066\u8A08\u7B97\u3055\u308C\u307E\u3059\u3002',
|
|
EASY_BONUS: "Easy\u30DC\u30FC\u30CA\u30B9",
|
|
EASY_BONUS_DESC: "Easy\u30DC\u30FC\u30CA\u30B9\u306B\u3088\u3063\u3066\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9/\u30CE\u30FC\u30C8\u306B\u304A\u3051\u308B\u9593\u9694\u306E\u5DEE\u5206\u3092\u8A2D\u5B9A\u3067\u304D\u307E\u3059(\u6700\u5C0F\u5024 = 100%)\u3002",
|
|
EASY_BONUS_MIN_WARNING: "Easy\u30DC\u30FC\u30CA\u30B9\u306B\u306F100\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
MAX_INTERVAL: "Maximum interval in days",
|
|
MAX_INTERVAL_DESC: "\u9593\u9694\u306B\u4E0A\u9650\u5024\u3092\u8A2D\u5B9A\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059(\u30C7\u30D5\u30A9\u30EB\u30C8\u5024 = 100\u5E74)\u3002",
|
|
MAX_INTERVAL_MIN_WARNING: "\u9593\u9694\u306E\u6700\u5927\u5024\u306B\u306F1\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
MAX_LINK_CONTRIB: "\u30EA\u30F3\u30AF\u30B3\u30F3\u30C8\u30EA\u30D3\u30E5\u30FC\u30B7\u30E7\u30F3\u306E\u6700\u5927\u5024",
|
|
MAX_LINK_CONTRIB_DESC: "\u6700\u521D\u306E\u6613\u3057\u3055\u306B\u5BFE\u3057\u3066\u3001\u30EA\u30F3\u30AF\u3055\u308C\u305F\u30CE\u30FC\u30C8\u306E\u91CD\u307F\u4ED8\u3051\u3055\u308C\u305F\u6613\u3057\u3055\u304C\u5BC4\u4E0E\u3059\u308B\u6700\u5927\u5024\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
LOGGING: "\u30ED\u30B0\u7BA1\u7406",
|
|
DISPLAY_DEBUG_INFO: "\u30C7\u30D9\u30ED\u30C3\u30D1\u30FC\u30B3\u30F3\u30BD\u30FC\u30EB\u306B\u3066\u30C7\u30D0\u30C3\u30B0\u60C5\u5831\u3092\u8868\u793A\u3057\u307E\u3059\u304B\uFF1F",
|
|
// sidebar.ts
|
|
NOTES_REVIEW_QUEUE: "\u30CE\u30FC\u30C8\u30EC\u30D3\u30E5\u30FC\u306E\u30AD\u30E5\u30FC",
|
|
CLOSE: "\u9589\u3058\u308B",
|
|
NEW: "\u65B0\u898F",
|
|
YESTERDAY: "\u6628\u65E5",
|
|
TODAY: "\u4ECA\u65E5",
|
|
TOMORROW: "\u660E\u65E5",
|
|
// stats-modal.tsx
|
|
STATS_TITLE: "\u7D71\u8A08",
|
|
MONTH: "Month",
|
|
QUARTER: "Quarter",
|
|
YEAR: "Year",
|
|
LIFETIME: "Lifetime",
|
|
FORECAST: "\u4E88\u6E2C",
|
|
FORECAST_DESC: "\u5FA9\u7FD2\u671F\u65E5\u304C\u6765\u308B\u30AB\u30FC\u30C9\u306E\u679A\u6570",
|
|
SCHEDULED: "\u30B9\u30B1\u30B8\u30E5\u30FC\u30EA\u30F3\u30B0\u6E08\u307F",
|
|
DAYS: "\u65E5",
|
|
NUMBER_OF_CARDS: "\u30AB\u30FC\u30C9\u6570",
|
|
REVIEWS_PER_DAY: "\u5E73\u5747: ${avg}\u30EC\u30D3\u30E5\u30FC/\u65E5",
|
|
INTERVALS: "\u9593\u9694",
|
|
INTERVALS_DESC: "\u6B21\u306E\u30EC\u30D3\u30E5\u30FC\u4E88\u5B9A\u65E5",
|
|
COUNT: "\u30AB\u30A6\u30F3\u30C8",
|
|
INTERVALS_SUMMARY: "\u9593\u9694\u306E\u5E73\u5747\u5024: ${avg}, \u6700\u9577\u306E\u9593\u9694: ${longest}",
|
|
EASES: "\u6613\u3057\u3055",
|
|
EASES_SUMMARY: "\u6613\u3057\u3055\u306E\u5E73\u5747\u5024: ${avgEase}",
|
|
CARD_TYPES: "\u30AB\u30FC\u30C9\u30BF\u30A4\u30D7",
|
|
CARD_TYPES_DESC: "\u5EF6\u671F\u306E\u30AB\u30FC\u30C9\u304C\u3042\u308B\u5834\u5408\u306B\u306F\u3053\u308C\u306B\u542B\u307E\u308C\u307E\u3059",
|
|
CARD_TYPE_NEW: "\u65B0\u898F",
|
|
CARD_TYPE_YOUNG: "\u5FA9\u7FD2(\u521D\u671F)",
|
|
CARD_TYPE_MATURE: "\u5FA9\u7FD2(\u5F8C\u671F)",
|
|
CARD_TYPES_SUMMARY: "\u30AB\u30FC\u30C9\u306E\u5408\u8A08: ${totalCardsCount}\u679A"
|
|
};
|
|
|
|
// src/lang/locale/ko.ts
|
|
var ko_default = {
|
|
// flashcard-modal.tsx
|
|
DECKS: "\uB371",
|
|
DUE_CARDS: "\uB2E4\uC2DC \uBCFC \uCE74\uB4DC\uB4E4",
|
|
NEW_CARDS: "\uC0C8\uB85C\uC6B4 \uCE74\uB4DC\uB4E4",
|
|
TOTAL_CARDS: "\uC804\uCCB4 \uCE74\uB4DC\uB4E4",
|
|
BACK: "Back",
|
|
SKIP: "Skip",
|
|
EDIT_CARD: "Edit Card",
|
|
RESET_CARD_PROGRESS: "\uCE74\uB4DC\uC758 \uC9C4\uD589\uC0C1\uD669\uC744 \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4.",
|
|
HARD: "\uC5B4\uB824\uC6C0(Hard)",
|
|
GOOD: "\uC88B\uC74C(Good)",
|
|
EASY: "\uC26C\uC6C0(Easy)",
|
|
SHOW_ANSWER: "\uC815\uB2F5 \uD655\uC778\uD558\uAE30",
|
|
CARD_PROGRESS_RESET: "\uCE74\uB4DC\uC758 \uC9C4\uD589\uC0C1\uD669\uC774 \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
|
|
SAVE: "Save",
|
|
CANCEL: "Cancel",
|
|
NO_INPUT: "No input provided.",
|
|
CURRENT_EASE_HELP_TEXT: "Current Ease: ",
|
|
CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ",
|
|
CARD_GENERATED_FROM: "Generated from: ${notePath}",
|
|
// main.ts
|
|
OPEN_NOTE_FOR_REVIEW: "\uB9AC\uBDF0\uD560 \uB178\uD2B8 \uC5F4\uAE30",
|
|
REVIEW_CARDS: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB9AC\uBDF0",
|
|
REVIEW_EASY_FILE_MENU: "\uB9AC\uBDF0: \uC26C\uC6C0(Easy)",
|
|
REVIEW_GOOD_FILE_MENU: "\uB9AC\uBDF0: \uC88B\uC74C(Good)",
|
|
REVIEW_HARD_FILE_MENU: "\uB9AC\uBDF0: \uC5B4\uB824\uC6C0(Hard)",
|
|
REVIEW_NOTE_EASY_CMD: "\uB178\uD2B8\uB97C \uC26C\uC6C0(easy)\uC73C\uB85C \uB9AC\uBDF0\uD569\uB2C8\uB2E4",
|
|
REVIEW_NOTE_GOOD_CMD: "\uB178\uD2B8\uB97C \uC88B\uC74C(good)\uC73C\uB85C \uB9AC\uBDF0\uD569\uB2C8\uB2E4",
|
|
REVIEW_NOTE_HARD_CMD: "\uB178\uD2B8\uB97C \uC5B4\uB824\uC6C0(hard)\uC73C\uB85C \uB9AC\uBDF0\uD569\uB2C8\uB2E4",
|
|
REVIEW_ALL_CARDS: "\uBAA8\uB4E0 \uB178\uD2B8\uB4E4\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uB9AC\uBDF0\uD569\uB2C8\uB2E4",
|
|
CRAM_ALL_CARDS: "Select a deck to cram",
|
|
REVIEW_CARDS_IN_NOTE: "\uC774 \uB178\uD2B8\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uB9AC\uBDF0\uD569\uB2C8\uB2E4",
|
|
CRAM_CARDS_IN_NOTE: "\uC774 \uB178\uD2B8\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uBCBC\uB77D\uCE58\uAE30\uD569\uB2C8\uB2E4.",
|
|
VIEW_STATS: "\uD1B5\uACC4 \uD655\uC778",
|
|
STATUS_BAR: "--\uB9AC\uBDF0: ${dueNotesCount} \uB178\uD2B8, ${dueFlashcardsCount} \uCE74\uB4DC \uB0A8\uC558\uC2B5\uB2C8\uB2E4.",
|
|
SYNC_TIME_TAKEN: "\uB3D9\uAE30\uD654\uC5D0 ${t}\uBC00\uB9AC\uCD08 \uAC78\uB838\uC2B5\uB2C8\uB2E4",
|
|
NOTE_IN_IGNORED_FOLDER: "\uB178\uD2B8\uAC00 \uBB34\uC2DC\uB41C \uD3F4\uB354 \uC544\uB798\uC5D0 \uC800\uC7A5\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. (\uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694)",
|
|
PLEASE_TAG_NOTE: "\uB9AC\uBDF0\uB97C \uD558\uAE30\uC704\uD574 \uB178\uD2B8\uC5D0 \uC801\uC808\uD788 \uD0DC\uADF8\uD574\uC8FC\uC138\uC694. (\uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694)",
|
|
RESPONSE_RECEIVED: "\uC694\uCCAD\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
|
|
NO_DECK_EXISTS: "${deckName}\uC774\uB77C\uB294 \uC774\uB984\uC758 \uB371\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
|
|
ALL_CAUGHT_UP: "\uBAA8\uB450 \uD655\uC778\uD588\uC2B5\uB2C8\uB2E4. :D",
|
|
// scheduling.ts
|
|
DAYS_STR_IVL: "${interval} \uC77C \uD6C4",
|
|
MONTHS_STR_IVL: "${interval} \uAC1C\uC6D4 \uD6C4",
|
|
YEARS_STR_IVL: "${interval} \uB144 \uD6C4",
|
|
DAYS_STR_IVL_MOBILE: "${interval}d",
|
|
MONTHS_STR_IVL_MOBILE: "${interval}m",
|
|
YEARS_STR_IVL_MOBILE: "${interval}y",
|
|
// settings.ts
|
|
SETTINGS_HEADER: "Spaced Repetition Plugin - \uC124\uC815",
|
|
CHECK_WIKI: '\uB354 \uB9CE\uC740 \uC815\uBCF4\uB97C \uC6D0\uD558\uC2DC\uBA74, <a href="${wiki_url}">wiki</a>\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.',
|
|
FOLDERS_TO_IGNORE: "\uBB34\uC2DC\uD560 \uD3F4\uB354\uB4E4",
|
|
FOLDERS_TO_IGNORE_DESC: "\uD3F4\uB354 \uACBD\uB85C\uB97C \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. 'Templates Meta/Scripts' \uC640 \uAC19\uC774 \uC785\uB825\uD558\uB294 \uAC83\uC740 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
|
|
FLASHCARDS: "\uD50C\uB798\uC2DC\uCE74\uB4DC",
|
|
FLASHCARD_EASY_LABEL: "Easy Button Text",
|
|
FLASHCARD_GOOD_LABEL: "Good Button Text",
|
|
FLASHCARD_HARD_LABEL: "Hard Button Text",
|
|
FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button',
|
|
FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button',
|
|
FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button',
|
|
FLASHCARD_TAGS: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uD0DC\uADF8",
|
|
FLASHCARD_TAGS_DESC: "\uD0DC\uADF8\uB97C \uACF5\uBC31 \uB610\uB294 \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. \uC608) '#flashcards #deck2 #deck3'",
|
|
CONVERT_FOLDERS_TO_DECKS: "\uD3F4\uB354\uB97C \uB371\uACFC \uC11C\uBE0C\uB371\uC73C\uB85C \uC0AC\uC6A9\uD560\uAE4C\uC694?",
|
|
CONVERT_FOLDERS_TO_DECKS_DESC: "\uC774 \uAE30\uB2A5\uC740 \uC704\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC \uD0DC\uADF8 \uC635\uC158\uC744 \uB300\uCCB4\uD569\uB2C8\uB2E4.",
|
|
INLINE_SCHEDULING_COMMENTS: "\uD50C\uB798\uC2DC\uCE74\uB4DC\uC758 \uB9C8\uC9C0\uB9C9 \uC904\uACFC \uB3D9\uC77C\uD55C \uC904\uC5D0 \uC2A4\uCF00\uC904\uB9C1 \uCF54\uBA58\uD2B8\uB97C \uC800\uC7A5\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
INLINE_SCHEDULING_COMMENTS_DESC: "\uC774 \uC635\uC158\uC744 \uC0AC\uC6A9\uD558\uBA74 HTML \uC8FC\uC11D\uC774 \uBAA9\uB85D\uC758 \uD3EC\uB9E4\uD305\uC744 \uBB34\uB108\uD2B8\uB9AC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY: "Sibling \uCE74\uB4DC\uB97C \uB2E4\uC74C\uB0A0\uAE4C\uC9C0 \uBB3B\uC5B4\uB450\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Sibling \uCE74\uB4DC\uB294 \uB3D9\uC77C\uD55C \uCE74\uB4DC \uD14D\uC2A4\uD2B8\uC5D0\uC11C \uC0DD\uC131\uB41C \uCE74\uB4DC\uC785\uB2C8\uB2E4. i.e. cloze deletions",
|
|
SHOW_CARD_CONTEXT: "\uCE74\uB4DC\uC758 \uBB38\uB9E5(context)\uC744 \uD45C\uC2DC\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
SHOW_CARD_CONTEXT_DESC: "\uCE74\uB4DC\uC5D0\uC11C 'Title > Heading 1 > Subheading > ... > Subheading' \uC758 \uD45C\uC2DC\uB97C \uD560\uC9C0 \uC124\uC815\uD569\uB2C8\uB2E4.",
|
|
CARD_MODAL_HEIGHT_PERCENT: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB192\uC774 \uBE44\uC728",
|
|
CARD_MODAL_SIZE_PERCENT_DESC: "\uBAA8\uBC14\uC77C \uBC84\uC804 \uD639\uC740 \uB9E4\uC6B0 \uD070 \uC774\uBBF8\uC9C0\uAC00 \uC788\uB294 \uACBD\uC6B0 100%\uB85C \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.",
|
|
RESET_DEFAULT: "\uAE30\uBCF8\uAC12\uC73C\uB85C \uCD08\uAE30\uD654",
|
|
CARD_MODAL_WIDTH_PERCENT: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB108\uBE44 \uBE44\uC728",
|
|
RANDOMIZE_CARD_ORDER: "\uB9AC\uBDF0\uC911\uC778 \uCE74\uB4DC\uC758 \uC21C\uC11C\uB97C \uB79C\uB364\uC73C\uB85C \uB450\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
REVIEW_DECK_ORDER: "Order decks are displayed during review",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
DISABLE_CLOZE_CARDS: "\uBE48 \uCE78 \uCC44\uC6B0\uAE30 \uCE74\uB4DC\uB97C \uBE44\uD65C\uC131\uD654\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
CONVERT_HIGHLIGHTS_TO_CLOZES: "==hightlights== \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
CONVERT_BOLD_TEXT_TO_CLOZES: "**bolded text** \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{curly brackets}} \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
INLINE_CARDS_SEPARATOR: "\uC778\uB77C\uC778 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790",
|
|
FIX_SEPARATORS_MANUALLY_WARNING: "\uC8FC\uC758: \uC774 \uC635\uC158\uC744 \uC218\uC815\uD55C \uD6C4\uC5D0\uB294 \uC774\uBBF8 \uC791\uC131\uB41C \uD50C\uB798\uC2DC\uCE74\uB4DC\uB97C \uC218\uB3D9\uC73C\uB85C \uC218\uC815\uD574\uC57C \uD568\uC744 \uC8FC\uC758\uD558\uC2ED\uC2DC\uC624.",
|
|
INLINE_REVERSED_CARDS_SEPARATOR: "\uC778\uB77C\uC778 \uBC18\uC804 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790",
|
|
MULTILINE_CARDS_SEPARATOR: "\uC5EC\uB7EC \uC904 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790",
|
|
MULTILINE_REVERSED_CARDS_SEPARATOR: "\uC5EC\uB7EC \uC904 \uBC18\uC804 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790",
|
|
NOTES: "\uB178\uD2B8",
|
|
REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup",
|
|
TAGS_TO_REVIEW: "\uB9AC\uBDF0\uC5D0 \uC0AC\uC6A9\uD560 \uD0DC\uADF8",
|
|
TAGS_TO_REVIEW_DESC: "\uD0DC\uADF8\uB97C \uACF5\uBC31 \uB610\uB294 \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. \uC608) '#review #tag2 #tag3'",
|
|
OPEN_RANDOM_NOTE: "\uB9AC\uBDF0\uB97C \uC704\uD574 \uB79C\uB364 \uB178\uD2B8\uB97C \uC5FD\uB2C8\uB2E4.",
|
|
OPEN_RANDOM_NOTE_DESC: "\uC774 \uC635\uC158\uC774 \uAEBC\uC838\uC788\uC73C\uBA74, \uB178\uD2B8\uB294 \uC911\uC694\uB3C4(\uD398\uC774\uC9C0 \uB7AD\uD06C)\uC5D0 \uB530\uB77C \uC815\uB82C\uB429\uB2C8\uB2E4.",
|
|
AUTO_NEXT_NOTE: "\uB9AC\uBDF0 \uD6C4\uC5D0 \uB2E4\uC74C \uB178\uD2B8\uB97C \uC790\uB3D9\uC73C\uB85C \uC5FD\uB2C8\uB2E4.",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS: "\uD30C\uC77C \uBA54\uB274\uC5D0\uC11C\uC758 \uB9AC\uBDF0 \uC635\uC158\uC744 \uBE44\uD65C\uC131\uD654 \uD569\uB2C8\uB2E4. \uC608) \uB9AC\uBDF0: Easy Good Hard",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\uC774 \uC635\uC158\uC744 \uBE44\uD65C\uC131\uD654 \uD55C \uD6C4, \uBA85\uB839 \uB2E8\uCD95\uD0A4\uB97C \uC774\uC6A9\uD574 \uB9AC\uBDF0\uD558\uC2E4 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uC635\uC158\uC744 \uBCC0\uACBD\uD55C \uD6C4\uC5D0 \uC635\uC2DC\uB514\uC5B8\uC744 \uC0C8\uB85C\uACE0\uCE68 \uD558\uC2ED\uC2DC\uC624.",
|
|
MAX_N_DAYS_REVIEW_QUEUE: "\uC624\uB978\uCABD \uD328\uB110\uC5D0 \uD45C\uC2DC\uD560 \uCD5C\uB300 \uC77C\uC218",
|
|
MIN_ONE_DAY: "\uC801\uC5B4\uB3C4 1\uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
|
|
VALID_NUMBER_WARNING: "\uC720\uD6A8\uD55C \uC22B\uC790\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694.",
|
|
UI_PREFERENCES: "\uC0AC\uC6A9\uC790 \uC778\uD130\uD398\uC774\uC2A4 \uAE30\uBCF8 \uC124\uC815",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\uB371 \uD2B8\uB9AC\uB294 \uCC98\uC74C\uC5D0 \uD655\uC7A5\uB41C \uAC83\uC73C\uB85C \uD45C\uC2DC\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\uAC19\uC740 \uCE74\uB4DC\uC5D0 \uC911\uCCA9\uB41C \uB371\uC744 \uC811\uC73C\uB824\uBA74 \uC774 \uC635\uC158\uC744 \uB044\uC2ED\uC2DC\uC624. \uAC19\uC740 \uD30C\uC77C\uC5D0 \uC5EC\uB7EC \uB371\uC5D0 \uC18D\uD55C \uCE74\uB4DC\uAC00 \uC788\uB294 \uACBD\uC6B0 \uC720\uC6A9\uD569\uB2C8\uB2E4.",
|
|
ALGORITHM: "\uC54C\uACE0\uB9AC\uC998",
|
|
CHECK_ALGORITHM_WIKI: '\uB354 \uB9CE\uC740 \uC815\uBCF4\uB97C \uC6D0\uD558\uC2DC\uBA74, <a href="${algo_url}">algorithm implementation</a>\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694.',
|
|
BASE_EASE: "\uAE30\uBCF8 ease",
|
|
BASE_EASE_DESC: "\uCD5C\uC19F\uAC12 = 130, \uC801\uC815\uCE58\uB294 \uB300\uB7B5 250\uC785\uB2C8\uB2E4.",
|
|
BASE_EASE_MIN_WARNING: "\uAE30\uBCF8 ease\uB294 \uC801\uC5B4\uB3C4 130 \uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
|
|
LAPSE_INTERVAL_CHANGE: "\uD50C\uB798\uC2DC\uCE74\uB4DC/\uB178\uD2B8\uB97C \uC5B4\uB824\uC6C0(Hard)\uC73C\uB85C \uB9AC\uBDF0\uD588\uC744 \uB54C\uC758 \uAC04\uACA9 \uBCC0\uACBD",
|
|
LAPSE_INTERVAL_CHANGE_DESC: "\uC0C8\uB85C\uC6B4 \uAC04\uACA9 = \uC774\uC804 \uAC04\uACA9 * \uAC04\uACA9\uBCC0\uACBD \uAC12 / 100.",
|
|
EASY_BONUS: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4",
|
|
EASY_BONUS_DESC: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4\uB294 \uD50C\uB798\uC2DC\uCE74\uB4DC/\uB178\uD2B8\uC5D0\uC11C \uC88B\uC74C(Good)\uACFC \uC26C\uC6C0(Easy) \uC0AC\uC774\uC758 \uAC04\uACA9 \uCC28\uC774\uB97C \uC124\uC815\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. (\uCD5C\uC18C = 100%)",
|
|
EASY_BONUS_MIN_WARNING: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4\uB294 \uC801\uC5B4\uB3C4 100\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
|
|
MAX_INTERVAL: "Maximum interval in days",
|
|
MAX_INTERVAL_DESC: "\uAC04\uACA9\uC758 \uC0C1\uD55C\uC120\uC744 \uB458 \uC218 \uC788\uC2B5\uB2C8\uB2E4. (\uAE30\uBCF8\uAC12 = 100\uB144)",
|
|
MAX_INTERVAL_MIN_WARNING: "\uCD5C\uB300 \uAC04\uACA9\uC740 \uC801\uC5B4\uB3C4 1\uC77C\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
|
|
MAX_LINK_CONTRIB: "\uCD5C\uB300 \uC5F0\uACB0 \uAE30\uC5EC\uB3C4",
|
|
MAX_LINK_CONTRIB_DESC: "\uB9C1\uD06C\uB41C \uB178\uD2B8\uC758 \uCD08\uAE30 ease\uC5D0 \uB300\uD55C \uAC00\uC911\uCE58\uAC00 \uC801\uC6A9\uB41C ease\uC758 \uCD5C\uB300 \uAE30\uC5EC\uB3C4\uC785\uB2C8\uB2E4.",
|
|
LOGGING: "\uB85C\uAE45",
|
|
DISPLAY_DEBUG_INFO: "\uB514\uBC84\uAE45 \uC815\uBCF4\uB97C \uAC1C\uBC1C\uC790 \uCF58\uC194\uC5D0 \uD45C\uC2DC\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
|
|
// sidebar.ts
|
|
NOTES_REVIEW_QUEUE: "\uB9AC\uBDF0\uD560 \uB178\uD2B8 \uB300\uAE30\uC5F4",
|
|
CLOSE: "\uB2EB\uAE30",
|
|
NEW: "New",
|
|
YESTERDAY: "\uC5B4\uC81C",
|
|
TODAY: "\uC624\uB298",
|
|
TOMORROW: "\uB0B4\uC77C",
|
|
// stats-modal.tsx
|
|
STATS_TITLE: "\uD1B5\uACC4",
|
|
MONTH: "\uC6D4",
|
|
QUARTER: "\uBD84\uAE30",
|
|
YEAR: "\uB144",
|
|
LIFETIME: "\uD3C9\uC0DD",
|
|
FORECAST: "\uC608\uCE21",
|
|
FORECAST_DESC: "\uC774\uD6C4\uC5D0 \uD559\uC2B5\uD560 \uCE74\uB4DC\uC758 \uC218",
|
|
SCHEDULED: "Scheduled",
|
|
DAYS: "\uC77C",
|
|
NUMBER_OF_CARDS: "\uCE74\uB4DC\uC758 \uC218",
|
|
REVIEWS_PER_DAY: "\uD3C9\uADE0: ${avg} \uB9AC\uBDF0/\uC77C",
|
|
INTERVALS: "\uAC04\uACA9",
|
|
INTERVALS_DESC: "\uB9AC\uBDF0\uB97C \uB2E4\uC2DC \uD560 \uB54C \uAE4C\uC9C0\uC758 \uAE30\uAC04",
|
|
COUNT: "Count",
|
|
INTERVALS_SUMMARY: "\uD3C9\uADE0 \uAC04\uACA9: ${avg}, \uAC00\uC7A5 \uAE34 \uAC04\uACA9: ${longest}",
|
|
EASES: "Eases",
|
|
EASES_SUMMARY: "Average ease: ${avgEase}",
|
|
CARD_TYPES: "\uCE74\uB4DC \uD0C0\uC785",
|
|
CARD_TYPES_DESC: "\uC5EC\uAE30\uC5D0\uB294 \uBB3B\uC5B4\uB454 \uCE74\uB4DC\uB3C4 \uD3EC\uD568\uB429\uB2C8\uB2E4.",
|
|
CARD_TYPE_NEW: "New",
|
|
CARD_TYPE_YOUNG: "Young",
|
|
CARD_TYPE_MATURE: "Mature",
|
|
CARD_TYPES_SUMMARY: "\uC804\uCCB4 \uCE74\uB4DC \uC218: ${totalCardsCount}"
|
|
};
|
|
|
|
// src/lang/locale/mr.ts
|
|
var mr_default = {};
|
|
|
|
// src/lang/locale/nl.ts
|
|
var nl_default = {};
|
|
|
|
// src/lang/locale/no.ts
|
|
var no_default = {};
|
|
|
|
// src/lang/locale/pl.ts
|
|
var pl_default = {};
|
|
|
|
// src/lang/locale/pt.ts
|
|
var pt_default = {};
|
|
|
|
// src/lang/locale/pt-br.ts
|
|
var pt_br_default = {
|
|
// flashcard-modal.tsx
|
|
DECKS: "Baralhos",
|
|
DUE_CARDS: "Cartas para Colocar em Dia",
|
|
NEW_CARDS: "Novas Cartas",
|
|
TOTAL_CARDS: "Total de Cartas",
|
|
BACK: "Back",
|
|
SKIP: "Skip",
|
|
EDIT_CARD: "Edit Card",
|
|
RESET_CARD_PROGRESS: "Reiniciar o Progresso da Carta",
|
|
HARD: "Dif\xEDcil",
|
|
GOOD: "OK",
|
|
EASY: "F\xE1cil",
|
|
SHOW_ANSWER: "Mostrar Resposta",
|
|
CARD_PROGRESS_RESET: "O Progresso da Carta foi reiniciado",
|
|
SAVE: "Save",
|
|
CANCEL: "Cancel",
|
|
NO_INPUT: "No input provided.",
|
|
CURRENT_EASE_HELP_TEXT: "Current Ease: ",
|
|
CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ",
|
|
CARD_GENERATED_FROM: "Generated from: ${notePath}",
|
|
// main.ts
|
|
OPEN_NOTE_FOR_REVIEW: "Abrir uma nota para revisar",
|
|
REVIEW_CARDS: "Revisar flashcards",
|
|
REVIEW_EASY_FILE_MENU: "Revis\xE3o: F\xE1cil",
|
|
REVIEW_GOOD_FILE_MENU: "Revis\xE3o: OK",
|
|
REVIEW_HARD_FILE_MENU: "Revis\xE3o: Dif\xEDcil",
|
|
REVIEW_NOTE_EASY_CMD: "Revisar nota como f\xE1cil",
|
|
REVIEW_NOTE_GOOD_CMD: "Revisar nota como OK",
|
|
REVIEW_NOTE_HARD_CMD: "Revisar nota como dif\xEDcil",
|
|
REVIEW_ALL_CARDS: "Revisar flashcards de todas as notas",
|
|
CRAM_ALL_CARDS: "Select a deck to cram",
|
|
REVIEW_CARDS_IN_NOTE: "Revisar flashcards nessa nota",
|
|
CRAM_CARDS_IN_NOTE: "Revisar todas as flashcards nessa nota",
|
|
VIEW_STATS: "Ver estat\xEDsticas",
|
|
STATUS_BAR: "Revis\xE3o: ${dueNotesCount} nota(s), ${dueFlashcardsCount} Carta(s) para colocar em dia",
|
|
SYNC_TIME_TAKEN: "Sicroniza\xE7\xE3o levou ${t}ms",
|
|
NOTE_IN_IGNORED_FOLDER: "Nota \xE9 salva na pasta ignorada (cheque as configura\xE7\xF5es).",
|
|
PLEASE_TAG_NOTE: "Por favor etiquete a nota apropriadamente para revisar (nas configura\xE7\xF5es).",
|
|
RESPONSE_RECEIVED: "Resposta recebida.",
|
|
NO_DECK_EXISTS: "Nenhum baralho existe para ${deckName}",
|
|
ALL_CAUGHT_UP: "Voc\xEA colocou tudo em prazo agora :D.",
|
|
// scheduling.ts
|
|
DAYS_STR_IVL: "${interval} dia(s)",
|
|
MONTHS_STR_IVL: "${interval} m\xEAs(es)",
|
|
YEARS_STR_IVL: "${interval} ano(s)",
|
|
DAYS_STR_IVL_MOBILE: "${interval}d",
|
|
MONTHS_STR_IVL_MOBILE: "${interval}m",
|
|
YEARS_STR_IVL_MOBILE: "${interval}a",
|
|
// settings.ts
|
|
SETTINGS_HEADER: "Plguin Spaced Repetition - Configura\xE7\xE3o",
|
|
CHECK_WIKI: 'Para mais informa\xE7\xF5es, checke o <a href="${wiki_url}">wiki</a>.',
|
|
FOLDERS_TO_IGNORE: "Pastas para ignorar",
|
|
FOLDERS_TO_IGNORE_DESC: "Ensira o caminho das pastas separado por quebras de linha ex: Templates Meta/Scripts",
|
|
FLASHCARDS: "Flashcards",
|
|
FLASHCARD_EASY_LABEL: "Texto do Bot\xE3o de F\xE1cil",
|
|
FLASHCARD_GOOD_LABEL: "Texto do Bot\xE3o de OK",
|
|
FLASHCARD_HARD_LABEL: "Texto do Bot\xE3o de Dif\xEDcil",
|
|
FLASHCARD_EASY_DESC: 'Costumize o r\xF3tulo para o bot\xE3o de "F\xE1cil"',
|
|
FLASHCARD_GOOD_DESC: 'Costumize o r\xF3tulo para o bot\xE3o de "OK"',
|
|
FLASHCARD_HARD_DESC: 'Customize o r\xF3tulo para o bot\xE3o de "Dif\xEDcil"',
|
|
FLASHCARD_TAGS: "Etiquetas dos Flashcards",
|
|
FLASHCARD_TAGS_DESC: "Ensira etiquetas separadas por espa\xE7os ou quebras de linha ex: #flashcards #baralho2 #baralho3.",
|
|
CONVERT_FOLDERS_TO_DECKS: "Converter pastas para baralhos e sub-baralhos?",
|
|
CONVERT_FOLDERS_TO_DECKS_DESC: "Isso \xE9 uma alternativa para a op\xE7\xE3o de etiqueta dos Flashcards em cima.",
|
|
INLINE_SCHEDULING_COMMENTS: "Salvar coment\xE1rios de agendamento na mesma linha que a \xFAltima linha do flashcard?",
|
|
INLINE_SCHEDULING_COMMENTS_DESC: "Ligar isso vai fazer com que os coment\xE1rios em HTML n\xE3o quebrem a formata\xE7\xE3o de listas.",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY: "Enterrar cartas irm\xE3s at\xE9 o pr\xF3ximo dia?",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Cartas irm\xE3s s\xE3o geradas pelo texto da mesma carta ex: omiss\xE3o de palavras",
|
|
SHOW_CARD_CONTEXT: "Mostrar conxtexto nas cartas?",
|
|
SHOW_CARD_CONTEXT_DESC: "ex: T\xEDtulo > Cabe\xE7alho 1 > Subcabe\xE7alho > ... > Subcabe\xE7alho",
|
|
CARD_MODAL_HEIGHT_PERCENT: "Porcentagem da Altura do Flashcard",
|
|
CARD_MODAL_SIZE_PERCENT_DESC: "Deveria estar configurado em 100% em dispositivos m\xF3veis ou se voc\xEA tem imagens muito grandes",
|
|
RESET_DEFAULT: "Reiniciar para a pr\xE9-defini\xE7\xE3o",
|
|
CARD_MODAL_WIDTH_PERCENT: "Porcentagem de Largura do Flashcard",
|
|
RANDOMIZE_CARD_ORDER: "Aleatorizar a ordem das cartas durante a revis\xE3o?",
|
|
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
REVIEW_DECK_ORDER: "Order decks are displayed during review",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
DISABLE_CLOZE_CARDS: "Desabilitar cartas que usam omiss\xE3o de palavras?",
|
|
CONVERT_HIGHLIGHTS_TO_CLOZES: "Converter ==marca-texto== em omiss\xF5es?",
|
|
CONVERT_BOLD_TEXT_TO_CLOZES: "Converter **texto em negrito** em omiss\xF5es?",
|
|
CONVERT_CURLY_BRACKETS_TO_CLOZES: "Converter {{chaves}} em omiss\xF5es?",
|
|
INLINE_CARDS_SEPARATOR: "Separador para flashcards inline",
|
|
FIX_SEPARATORS_MANUALLY_WARNING: "Note que depois de mudar isso voc\xEA vai ter que manualmente mudar quaisquer flashcards que voc\xEA tenha.",
|
|
INLINE_REVERSED_CARDS_SEPARATOR: "Separador para flashcards inline reversos",
|
|
MULTILINE_CARDS_SEPARATOR: "Separador para flashcards de m\xFAltiplas linhas",
|
|
MULTILINE_REVERSED_CARDS_SEPARATOR: "Separador para flashcards de m\xFAltiplas linhas reversos",
|
|
NOTES: "Notas",
|
|
REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup",
|
|
TAGS_TO_REVIEW: "Etiquetas para revisar",
|
|
TAGS_TO_REVIEW_DESC: "Ensira etiquetas separadas por espa\xE7os ou quebra de linhas ex: #revisar #etiqueta2 #etiqueta3.",
|
|
OPEN_RANDOM_NOTE: "Abrir uma nota aleat\xF3ria para revisar",
|
|
OPEN_RANDOM_NOTE_DESC: "Quando voc\xEA desabilitar isso, as notas v\xE3o ser ordenadas por import\xE2ncia (PageRank).",
|
|
AUTO_NEXT_NOTE: "Abrir a pr\xF3xima nota automaticamente depois de uma revis\xE3o",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS: "Desabilitar op\xE7\xF5es de revis\xE3o no menu de arquivos ex: Revis\xE3o: F\xE1cil OK Dif\xEDcil",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Depois de desabilitar, voc\xEA pode revisar usando os atalhos de comando. Reinicie Obsidian depois de mudar isso.",
|
|
MAX_N_DAYS_REVIEW_QUEUE: "N\xFAmero m\xE1ximo de dias para exibir no painel direito",
|
|
MIN_ONE_DAY: "O n\xFAmero de dias deve ser pelo menos 1.",
|
|
VALID_NUMBER_WARNING: "Por favor ensira um n\xFAmero v\xE1lido.",
|
|
UI_PREFERENCES: "Prefer\xEAncias de UI",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\xC1rvores de baralhos devem inicialmente serem exibidas como expandidas",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Desabilite isso para colapsar baralhos que est\xE3o um dentro do outro na mesma carta. \xDAtil se voc\xEA tem cartas que pertencem a muitos baralhos em um mesmo arquivo.",
|
|
ALGORITHM: "Algor\xEDtmo",
|
|
CHECK_ALGORITHM_WIKI: 'Para mais informa\xE7\xF5es, cheque a <a href="${algo_url}">implementa\xE7\xE3o do algor\xEDtmo</a>.',
|
|
BASE_EASE: "Facilidade base",
|
|
BASE_EASE_DESC: "m\xEDnimo = 130, preferivelmente aproximadamente 250.",
|
|
BASE_EASE_MIN_WARNING: "A facilidade base deve ser pelo menos 130.",
|
|
LAPSE_INTERVAL_CHANGE: "Mudan\xE7a de intervalo quando voc\xEA revisa um(a) flashcard/nota como dif\xEDcil",
|
|
LAPSE_INTERVAL_CHANGE_DESC: "novoIntervalo = velhoIntervalo * mudancaIntervalo / 100.",
|
|
EASY_BONUS: "B\xF4nus de F\xE1cil",
|
|
EASY_BONUS_DESC: "O b\xF4nus de f\xE1cil te permite mudar a difer\xEAncia entre intervalos de responder OK e F\xE1cil em um(a) flashcard/nota (m\xEDnimo = 100%).",
|
|
EASY_BONUS_MIN_WARNING: "O b\xF4nus de f\xE1cil deve ser pelo menos 100.",
|
|
MAX_INTERVAL: "Maximum interval in days",
|
|
MAX_INTERVAL_DESC: "Te permite colocar um limite m\xE1ximo no intervalo (pr\xE9-defini\xE7\xE3o = 100 anos).",
|
|
MAX_INTERVAL_MIN_WARNING: "O intervalo m\xE1ximo deve ser pelo menos 1 dia.",
|
|
MAX_LINK_CONTRIB: "Contribui\xE7\xE3o M\xE1xima de Links",
|
|
MAX_LINK_CONTRIB_DESC: "Contribui\xE7\xE3o m\xE1xima da facilidade ponderada das notas linkadas \xE0 facilidade inicial.",
|
|
LOGGING: "Logging",
|
|
DISPLAY_DEBUG_INFO: "Mostrar informa\xE7\xE3o de debugging no console de desenvolvimento?",
|
|
// sidebar.ts
|
|
NOTES_REVIEW_QUEUE: "Fila de Notas para Revisar",
|
|
CLOSE: "Fechar",
|
|
NEW: "Novo",
|
|
YESTERDAY: "Ontem",
|
|
TODAY: "Hoje",
|
|
TOMORROW: "Amanh\xE3",
|
|
// stats-modal.tsx
|
|
STATS_TITLE: "Estat\xEDsticas",
|
|
MONTH: "M\xEAs",
|
|
QUARTER: "Quarto",
|
|
YEAR: "Ano",
|
|
LIFETIME: "Tempo Total",
|
|
FORECAST: "Previs\xE3o",
|
|
FORECAST_DESC: "O n\xFAmero de cartas a serem colocadas em dia no futuro",
|
|
SCHEDULED: "Agendado",
|
|
DAYS: "Dias",
|
|
NUMBER_OF_CARDS: "N\xFAmero de cartas",
|
|
REVIEWS_PER_DAY: "M\xE9dia: ${avg} revis\xF5es/dia",
|
|
INTERVALS: "Intervalos",
|
|
INTERVALS_DESC: "Atrasos at\xE9 que as revis\xF5es sejam exibidas de novo",
|
|
COUNT: "Contagem",
|
|
INTERVALS_SUMMARY: "Intervalo em m\xE9dia: ${avg}, Maior intervalo: ${longest}",
|
|
EASES: "Facilidades",
|
|
EASES_SUMMARY: "Facilidade em m\xE9dia: ${avgEase}",
|
|
CARD_TYPES: "Tipos de Cartas",
|
|
CARD_TYPES_DESC: "Isso tamb\xE9m inclui cartas enterrados, caso existam",
|
|
CARD_TYPE_NEW: "Novo",
|
|
CARD_TYPE_YOUNG: "Jovem",
|
|
CARD_TYPE_MATURE: "Amadurecido",
|
|
CARD_TYPES_SUMMARY: "Total de cartas: ${totalCardsCount}"
|
|
};
|
|
|
|
// src/lang/locale/ro.ts
|
|
var ro_default = {};
|
|
|
|
// src/lang/locale/ru.ts
|
|
var ru_default = {
|
|
// flashcard-modal.tsx
|
|
DECKS: "\u041A\u043E\u043B\u043E\u0434\u044B",
|
|
DUE_CARDS: "\u041F\u0440\u0435\u0434\u0441\u0442\u043E\u044F\u0449\u0438\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
|
|
NEW_CARDS: "\u041D\u043E\u0432\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
|
|
TOTAL_CARDS: "\u0412\u0441\u0435\u0433\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
|
|
BACK: "\u041D\u0430\u0437\u0430\u0434",
|
|
SKIP: "\u041F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u0442\u044C",
|
|
EDIT_CARD: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0443",
|
|
RESET_CARD_PROGRESS: "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
|
|
HARD: "\u0421\u043B\u043E\u0436\u043D\u043E",
|
|
GOOD: "\u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E",
|
|
EASY: "\u041B\u0435\u0433\u043A\u043E",
|
|
SHOW_ANSWER: "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043E\u0442\u0432\u0435\u0442",
|
|
CARD_PROGRESS_RESET: "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
|
|
SAVE: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C",
|
|
CANCEL: "\u041E\u0442\u043C\u0435\u043D\u0430",
|
|
NO_INPUT: "\u041F\u0443\u0441\u0442\u043E\u0439 \u0432\u0432\u043E\u0434.",
|
|
CURRENT_EASE_HELP_TEXT: "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u041B\u0435\u0433\u043A\u043E\u0441\u0442\u044C: ",
|
|
CURRENT_INTERVAL_HELP_TEXT: "\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B: ",
|
|
CARD_GENERATED_FROM: "\u0421\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E \u0438\u0437: ${notePath}",
|
|
// main.ts
|
|
OPEN_NOTE_FOR_REVIEW: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F",
|
|
REVIEW_CARDS: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
|
|
REVIEW_EASY_FILE_MENU: "\u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435: \u041B\u0435\u0433\u043A\u043E",
|
|
REVIEW_GOOD_FILE_MENU: "\u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435: \u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E",
|
|
REVIEW_HARD_FILE_MENU: "\u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435: \u0421\u043B\u043E\u0436\u043D\u043E",
|
|
REVIEW_NOTE_EASY_CMD: "\u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A \u041B\u0451\u0433\u043A\u0443\u044E",
|
|
REVIEW_NOTE_GOOD_CMD: "\u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A \u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u0443\u044E",
|
|
REVIEW_NOTE_HARD_CMD: "\u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A \u0421\u043B\u043E\u0436\u043D\u0443\u044E",
|
|
CRAM_ALL_CARDS: "\u0417\u0443\u0431\u0440\u0438\u0442\u044C \u0432\u0441\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u043A\u043E\u043B\u043E\u0434\u0435",
|
|
REVIEW_ALL_CARDS: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0432\u0441\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432\u043E \u0432\u0441\u0435\u0445 \u0437\u0430\u043C\u0435\u0442\u043A\u0430\u0445",
|
|
REVIEW_CARDS_IN_NOTE: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u0437\u0430\u043C\u0435\u0442\u043A\u0435",
|
|
CRAM_CARDS_IN_NOTE: "\u0417\u0443\u0431\u0440\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u0437\u0430\u043C\u0435\u0442\u043A\u0435",
|
|
VIEW_STATS: "\u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0443",
|
|
STATUS_BAR: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C: ${dueNotesCount} \u0437\u0430\u043C\u0435\u0442\u043E\u043A(-\u043A\u0438), ${dueFlashcardsCount} \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A(-\u043A\u0438) \u043F\u0440\u0435\u0434\u0441\u0442\u043E\u0438\u0442",
|
|
SYNC_TIME_TAKEN: "\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044F \u0437\u0430\u043D\u044F\u043B\u0430 ${t}\u043C\u0441",
|
|
NOTE_IN_IGNORED_FOLDER: "\u0417\u0430\u043C\u0435\u0442\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0430 \u0432 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u043C\u0443\u044E \u043F\u0430\u043F\u043A\u0443 (\u0441\u043C. \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438).",
|
|
PLEASE_TAG_NOTE: "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u043F\u043E\u043C\u0435\u0442\u044C\u0442\u0435 \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A \u043D\u0430\u0434\u043E \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F (\u0441\u043C. \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438).",
|
|
RESPONSE_RECEIVED: "\u041E\u0442\u0432\u0435\u0442 \u043F\u043E\u043B\u0443\u0447\u0435\u043D.",
|
|
NO_DECK_EXISTS: "\u041D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u0440\u043E\u0432\u043D\u044F ${deckName}",
|
|
ALL_CAUGHT_UP: "\u041C\u043E\u043B\u043E\u0434\u0435\u0446! \u0422\u044B \u0441\u043F\u0440\u0430\u0432\u0438\u043B\u0441\u044F \u0438 \u0434\u043E\u0448\u0435\u043B \u0434\u043E \u043A\u043E\u043D\u0446\u0430! :D",
|
|
// scheduling.ts
|
|
DAYS_STR_IVL: "${interval} \u0434\u043D\u0435\u0439",
|
|
MONTHS_STR_IVL: "${interval} \u043C\u0435\u0441\u044F\u0446\u043E\u0432",
|
|
YEARS_STR_IVL: "${interval} \u0433\u043E\u0434\u0430 (\u043B\u0435\u0442)",
|
|
DAYS_STR_IVL_MOBILE: "${interval}\u0434.",
|
|
MONTHS_STR_IVL_MOBILE: "${interval}\u043C.",
|
|
YEARS_STR_IVL_MOBILE: "${interval}\u0433.",
|
|
// settings.ts
|
|
SETTINGS_HEADER: "\u041F\u043B\u0430\u0433\u0438\u043D Spaced Repetition - \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438",
|
|
CHECK_WIKI: '\u0414\u043B\u044F \u0434\u043E\u043F. \u0438\u043D\u0444\u044B, \u0441\u043C\u043E\u0442\u0440\u0438 <a href="${wiki_url}">wiki</a>.',
|
|
FOLDERS_TO_IGNORE: "\u0418\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u043C\u044B\u0435 \u043F\u0430\u043F\u043A\u0438",
|
|
FOLDERS_TO_IGNORE_DESC: "\u0412\u0435\u0434\u0438\u0442\u0435 \u043F\u0443\u0442\u0438 \u043F\u0430\u043F\u043E\u043A, \u043A\u0430\u0436\u0434\u0430\u044F \u043D\u0430 \u0441\u0432\u043E\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0435, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: Templates Meta/Scripts",
|
|
FLASHCARDS: "\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
|
|
FLASHCARD_EASY_LABEL: "\u0422\u0435\u043A\u0441\u0442 \u043A\u043D\u043E\u043F\u043A\u0438 \u041B\u0435\u0433\u043A\u043E",
|
|
FLASHCARD_GOOD_LABEL: "\u0422\u0435\u043A\u0441\u0442 \u043A\u043D\u043E\u043F\u043A\u0438 \u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E",
|
|
FLASHCARD_HARD_LABEL: "\u0422\u0435\u043A\u0441\u0442 \u043A\u043D\u043E\u043F\u043A\u0438 \u0421\u043B\u043E\u0436\u043D\u043E",
|
|
FLASHCARD_EASY_DESC: '\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u044F\u0440\u043B\u044B\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041B\u0435\u0433\u043A\u043E"',
|
|
FLASHCARD_GOOD_DESC: '\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u044F\u0440\u043B\u044B\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E"',
|
|
FLASHCARD_HARD_DESC: '\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u044F\u0440\u043B\u044B\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0421\u043B\u043E\u0436\u043D\u043E"',
|
|
FLASHCARD_TAGS: "\u0422\u044D\u0433\u0438 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
|
|
FLASHCARD_TAGS_DESC: "\u0412\u0435\u0434\u0438\u0442\u0435 \u0442\u044D\u0433\u0438 \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 Enter-\u043E\u043C \u0438\u043B\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u043C, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: #flashcards #deck2 #deck3.",
|
|
CONVERT_FOLDERS_TO_DECKS: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0430\u043F\u043A\u0438 \u0432 \u0443\u0440\u043E\u0432\u043D\u0438 \u0438 \u043F\u043E\u0434\u0443\u0440\u043E\u0432\u043D\u0438?",
|
|
CONVERT_FOLDERS_TO_DECKS_DESC: "\u042D\u0442\u043E \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u0430 \u0442\u044D\u0433\u0430\u043C \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A, \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0441\u0432\u0435\u0440\u0445\u0443.",
|
|
INLINE_SCHEDULING_COMMENTS: "\u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043F\u043B\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438?",
|
|
INLINE_SCHEDULING_COMMENTS_DESC: "\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u044D\u0442\u043E\u0439 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0441\u0434\u0435\u043B\u0430\u0435\u0442 \u0442\u0430\u043A, \u0447\u0442\u043E HTML \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u043B\u043E\u043C\u0430\u0442\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0441\u043F\u0438\u0441\u043A\u0430.",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY: "\u041F\u0440\u044F\u0442\u0430\u0442\u044C \u0440\u043E\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0434\u043E \u0441\u043B\u0435\u0434. \u0434\u043D\u044F?",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u0420\u043E\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 - \u0442\u0435, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u044B \u0438\u0437 \u043E\u0434\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430, \u043F\u0440\u0438\u043C\u0435\u0440: \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0441 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u043C\u0438 ([...])",
|
|
SHOW_CARD_CONTEXT: "\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442(\u0443\u0440\u043E\u0432\u0435\u043D\u044C) \u0432 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430\u0445(\u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F)?",
|
|
SHOW_CARD_CONTEXT_DESC: "\u043F\u0440\u0438\u043C\u0435\u0440: Title > Heading 1 > Subheading > ... > Subheading",
|
|
CARD_MODAL_HEIGHT_PERCENT: "\u0412\u044B\u0441\u043E\u0442\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432\u043F\u0440\u043E\u0446\u0435\u043D\u0442\u0430\u0445",
|
|
CARD_MODAL_SIZE_PERCENT_DESC: "\u0415\u0441\u043B\u0438 \u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435\u0441\u044C \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u043E\u043C, \u0432\u044B\u0441\u0442\u0430\u0432\u044C\u0442\u0435 100% \u0438\u043B\u0438 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u043E\u0433\u0440\u043E\u043C\u043D\u044B\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",
|
|
RESET_DEFAULT: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E",
|
|
CARD_MODAL_WIDTH_PERCENT: "\u0428\u0438\u0440\u0438\u043D\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u043F\u0440\u043E\u0446\u0435\u043D\u0442\u0430\u0445",
|
|
RANDOMIZE_CARD_ORDER: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u044B\u0439 \u043F\u043E\u0440\u044F\u0434\u043E\u043A \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F?",
|
|
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
REVIEW_DECK_ORDER: "Order decks are displayed during review",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
DISABLE_CLOZE_CARDS: "\u0412\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u044B \u0441 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u043C\u0438 (\u043F\u0440\u0438\u043C\u0435\u0440: [...])?",
|
|
CONVERT_HIGHLIGHTS_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C ==\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442== \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438 (\u043F\u0440\u0438\u043C\u0435\u0440: [...])?",
|
|
CONVERT_BOLD_TEXT_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C **\u0436\u0438\u0440\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442** \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438 (\u043F\u0440\u0438\u043C\u0435\u0440: [...])?",
|
|
CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C {{\u0444\u0438\u0433\u0443\u0440\u043D\u044B\u0435 \u0441\u043A\u043E\u0431\u043A\u0438}} \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438 (\u043F\u0440\u0438\u043C\u0435\u0440: [...])?",
|
|
INLINE_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u0432\u043D\u0443\u0442\u0440\u0438\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
|
|
FIX_SEPARATORS_MANUALLY_WARNING: "\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435! \u041F\u043E\u0441\u043B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0433\u043E \u0432\u0430\u043C \u043F\u0440\u0438\u0434\u0451\u0442\u0441\u044F \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
|
|
INLINE_REVERSED_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043E\u0431\u0440\u0430\u0442\u043D\u044B\u0445 \u0432\u043D\u0443\u0442\u0440\u0438\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
|
|
MULTILINE_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043C\u043D\u043E\u0433\u043E\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
|
|
MULTILINE_REVERSED_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043E\u0431\u0440\u0430\u0442\u043D\u044B\u0445 \u043C\u043D\u043E\u0433\u043E\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
|
|
NOTES: "\u0417\u0430\u043C\u0435\u0442\u043A\u0438",
|
|
REVIEW_PANE_ON_STARTUP: "\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B",
|
|
TAGS_TO_REVIEW: "\u0422\u044D\u0433\u0438 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F",
|
|
TAGS_TO_REVIEW_DESC: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u044D\u0433\u0438, \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 Enter-\u0430\u043C\u0438 \u0438\u043B\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u0430\u043C\u0438, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: #review #tag2 #tag3.",
|
|
OPEN_RANDOM_NOTE: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u0443\u044E \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F",
|
|
OPEN_RANDOM_NOTE_DESC: "\u0415\u0441\u043B\u0438 \u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C, \u0442\u043E \u0437\u0430\u043C\u0435\u0442\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u044C \u043F\u043E \u0432\u0430\u0436\u043D\u043E\u0441\u0442\u0438 (PageRank).",
|
|
AUTO_NEXT_NOTE: "\u041F\u043E\u0441\u043B\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E \u0437\u0430\u043C\u0435\u0442\u043A\u0443",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u0412\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0431\u043E\u0440 \u0441\u043B\u043E\u0436\u043D\u043E\u0441\u0442\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F \u0432 \u043C\u0435\u043D\u044E \u0444\u0430\u0439\u043B\u0430, \u0442.\u0435.: \u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435: \u041B\u0435\u0433\u043A\u043E \u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E \u0421\u043B\u043E\u0436\u043D\u043E",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u041F\u043E\u0441\u043B\u0435 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0432\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C \u043F\u0440\u0438 \u043F\u043E\u043C\u043E\u0449\u0438 \u0445\u043E\u0442\u043A\u0435\u0435\u0432. \u041F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 Obsidian \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0433\u043E.",
|
|
MAX_N_DAYS_REVIEW_QUEUE: "\u041D\u0430\u0438\u0431\u043E\u043B\u044C\u0448\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043D\u0435\u0439 \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u0438 \u0441\u043F\u0440\u0430\u0432\u0430",
|
|
MIN_ONE_DAY: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043D\u0435\u0439 \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 1.",
|
|
VALID_NUMBER_WARNING: "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0435\u0435 \u0447\u0438\u0441\u043B\u043E.",
|
|
UI_PREFERENCES: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u0414\u0435\u0440\u0435\u0432\u044C\u044F \u043A\u043E\u043B\u043E\u0434 \u0434\u043E\u043B\u0436\u043D\u044B \u0438\u0437\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043A\u0430\u043A \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0435",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440, \u0447\u0442\u043E\u0431\u044B \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043A\u043E\u043B\u043E\u0434\u044B \u043D\u0430 \u043E\u0434\u043D\u043E\u0439 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435. \u041F\u043E\u043B\u0435\u0437\u043D\u043E, \u0435\u0441\u043B\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C \u043A\u0430\u0440\u0442\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043F\u0440\u0438\u043D\u0430\u0434\u043B\u0435\u0436\u0430\u0442 \u043C\u043D\u043E\u0433\u0438\u043C \u043A\u043E\u043B\u043E\u0434\u0430\u043C \u0432 \u043E\u0434\u043D\u043E\u043C \u0444\u0430\u0439\u043B\u0435.",
|
|
ALGORITHM: "\u0410\u043B\u0433\u043E\u0440\u0438\u0442\u043C",
|
|
CHECK_ALGORITHM_WIKI: '\u0417\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0435\u0439 \u043E\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435\u0441\u044C \u043A <a href="${algo_url}">\u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0430</a>.',
|
|
BASE_EASE: "\u0411\u0430\u0437\u043E\u0432\u0430\u044F \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C",
|
|
BASE_EASE_DESC: "\u043C\u0438\u043D\u0438\u043C\u0443\u043C = 130, \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043E\u043A\u043E\u043B\u043E 250.",
|
|
BASE_EASE_MIN_WARNING: "\u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u043C\u0438\u043D\u0438\u043C\u0443\u043C 130.",
|
|
LAPSE_INTERVAL_CHANGE: "\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0430 \u043A\u043E\u0433\u0434\u0430 \u0432\u044B \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442\u0435 \u0421\u043B\u043E\u0436\u043D\u043E \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438/\u0437\u0430\u043C\u0435\u0442\u043A\u0438",
|
|
LAPSE_INTERVAL_CHANGE_DESC: "\u043D\u043E\u0432\u044B\u0439\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A = \u0441\u0442\u0430\u0440\u044B\u0439\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A * \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0430 / 100.",
|
|
EASY_BONUS: "\u041B\u0435\u0433\u043A\u043E: \u0431\u043E\u043D\u0443\u0441",
|
|
EASY_BONUS_DESC: "\u0411\u043E\u043D\u0443\u0441 \u0437\u0430 \u041B\u0435\u0433\u043A\u043E \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0432\u0430\u043C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u043D\u0438\u0446\u0443 \u0432 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0430\u0445 \u043C\u0435\u0436\u0434\u0443 \u043E\u0442\u0432\u0435\u0442\u0430\u043C\u0438 \u0425\u043E\u0440\u043E\u0448\u043E \u0438 \u041B\u0435\u0433\u043A\u043E \u043D\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435/\u0437\u0430\u043C\u0435\u0442\u043A\u0435 (\u043C\u0438\u043D. = 100%).",
|
|
EASY_BONUS_MIN_WARNING: "\u0411\u043E\u043D\u0443\u0441 \u0437\u0430 \u041B\u0435\u0433\u043A\u043E \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 100.",
|
|
MAX_INTERVAL: "Maximum interval in days",
|
|
MAX_INTERVAL_DESC: "\u041F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0432\u0430\u043C \u0443\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0442\u044C \u0432\u0435\u0440\u0445\u043D\u044E\u044E \u0433\u0440\u0430\u043D\u0438\u0446\u0443 \u043D\u0430 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E = 100 \u043B\u0435\u0442).",
|
|
MAX_INTERVAL_MIN_WARNING: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 1.",
|
|
MAX_LINK_CONTRIB: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u043A\u043B\u0430\u0434 \u0441\u0432\u044F\u0437\u0438 (\u0441\u0441\u044B\u043B\u043A\u0438)",
|
|
MAX_LINK_CONTRIB_DESC: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u043A\u043B\u0430\u0434 \u0432\u0437\u0432\u0435\u0448\u0435\u043D\u043D\u043E\u0439 \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u0438 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0445 \u0437\u0430\u043C\u0435\u0442\u043E\u043A \u0432 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C.",
|
|
LOGGING: "\u0412\u0435\u0434\u0435\u043D\u0438\u0435 \u043B\u043E\u0433\u0430",
|
|
DISPLAY_DEBUG_INFO: "\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430 (developer console)?",
|
|
// sidebar.ts
|
|
NOTES_REVIEW_QUEUE: "\u041E\u0447\u0435\u0440\u0435\u0434\u044C \u0437\u0430\u043C\u0435\u0442\u043E\u043A \u043D\u0430 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435",
|
|
CLOSE: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
|
|
NEW: "\u041D\u043E\u0432\u044B\u0435",
|
|
YESTERDAY: "\u0412\u0447\u0435\u0440\u0430\u0448\u043D\u0438\u0435",
|
|
TODAY: "\u0421\u0435\u0433\u043E\u0434\u043D\u044F\u0448\u043D\u0438\u0435",
|
|
TOMORROW: "\u0417\u0430\u0432\u0442\u0440\u0430\u0448\u043D\u0438\u0435",
|
|
// stats-modal.tsx
|
|
STATS_TITLE: "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430",
|
|
MONTH: "\u041C\u0435\u0441\u044F\u0446",
|
|
QUARTER: "\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044C",
|
|
YEAR: "\u0413\u043E\u0434",
|
|
LIFETIME: "\u0412\u0441\u0451 \u0432\u0440\u0435\u043C\u044F",
|
|
FORECAST: "\u041F\u0440\u043E\u0433\u043D\u043E\u0437",
|
|
FORECAST_DESC: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u043F\u0440\u0435\u0434\u0441\u0442\u043E\u044F\u0449\u0438\u0445 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043C",
|
|
SCHEDULED: "\u0417\u0430\u043F\u043B\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043E",
|
|
DAYS: "\u0414\u043D\u0435\u0439",
|
|
NUMBER_OF_CARDS: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
|
|
REVIEWS_PER_DAY: "\u0421\u0440\u0435\u0434\u043D\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E: ${avg} \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0439 \u0432 \u0434\u0435\u043D\u044C",
|
|
//!!!
|
|
INTERVALS: "\u0418\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u044B",
|
|
INTERVALS_DESC: "\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0438 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0434\u043E \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E \u043F\u043E\u043A\u0430\u0437\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F",
|
|
COUNT: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E",
|
|
INTERVALS_SUMMARY: "\u0421\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A: ${avg}, \u0421\u0430\u043C\u044B\u0439 \u0434\u043B\u0438\u043D\u043D\u044B\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A: ${longest}",
|
|
EASES: "\u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C (\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0435, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u043B\u0438\u044F\u0435\u0442 \u043D\u0430 \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442 \u0438 \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u043A\u0430\u0437\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A) \n (\u043E\u0442 \u0430\u043D\u0433\u043B. ease, \u0441\u043C. \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0430)",
|
|
EASES_SUMMARY: "\u0421\u0440\u0435\u0434\u043D\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u0438: ${avgEase}",
|
|
CARD_TYPES: "\u0422\u0438\u043F\u044B \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
|
|
CARD_TYPES_DESC: "\u0412\u043A\u043B\u044E\u0447\u0430\u044F \u0441\u043F\u0440\u044F\u0442\u0430\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438, \u0435\u0441\u043B\u0438 \u0442\u0430\u043A\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0442.",
|
|
CARD_TYPE_NEW: "\u041D\u043E\u0432\u044B\u0445",
|
|
CARD_TYPE_YOUNG: "\u041C\u043E\u043B\u043E\u0434\u044B\u0445",
|
|
CARD_TYPE_MATURE: "\u0412\u0437\u0440\u043E\u0441\u043B\u044B\u0445",
|
|
CARD_TYPES_SUMMARY: "\u0412\u0441\u0435\u0433\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A: ${totalCardsCount}"
|
|
};
|
|
|
|
// src/lang/locale/ta.ts
|
|
var ta_default = {};
|
|
|
|
// src/lang/locale/te.ts
|
|
var te_default = {};
|
|
|
|
// src/lang/locale/th.ts
|
|
var th_default = {};
|
|
|
|
// src/lang/locale/tr.ts
|
|
var tr_default = {};
|
|
|
|
// src/lang/locale/uk.ts
|
|
var uk_default = {};
|
|
|
|
// src/lang/locale/ur.ts
|
|
var ur_default = {};
|
|
|
|
// src/lang/locale/vi.ts
|
|
var vi_default = {};
|
|
|
|
// src/lang/locale/zh-cn.ts
|
|
var zh_cn_default = {
|
|
// flashcard-modal.tsx
|
|
DECKS: "\u5361\u7EC4",
|
|
DUE_CARDS: "\u5230\u671F\u5361\u7247",
|
|
NEW_CARDS: "\u65B0\u5361\u7247",
|
|
TOTAL_CARDS: "\u5168\u90E8\u5361\u7247",
|
|
BACK: "\u8FD4\u56DE",
|
|
SKIP: "\u7565\u8FC7",
|
|
EDIT_CARD: "\u7F16\u8F91\u5361\u7247",
|
|
RESET_CARD_PROGRESS: "\u91CD\u7F6E\u5361\u7247",
|
|
HARD: "\u8F83\u96BE",
|
|
GOOD: "\u8BB0\u5F97",
|
|
EASY: "\u7B80\u5355",
|
|
SHOW_ANSWER: "\u663E\u793A\u7B54\u6848",
|
|
CARD_PROGRESS_RESET: "\u5361\u7247\u5DF2\u88AB\u91CD\u7F6E\u3002",
|
|
SAVE: "\u50A8\u5B58",
|
|
CANCEL: "\u53D6\u6D88",
|
|
NO_INPUT: "\u6CA1\u6709\u63D0\u4F9B\u8F93\u5165\u3002",
|
|
CURRENT_EASE_HELP_TEXT: "\u76EE\u524D\u638C\u63E1\u7A0B\u5EA6\uFF1A",
|
|
CURRENT_INTERVAL_HELP_TEXT: "\u76EE\u524D\u95F4\u9694\uFF1A",
|
|
CARD_GENERATED_FROM: "\u751F\u6210\u81EA\uFF1A${notePath}",
|
|
// main.ts
|
|
OPEN_NOTE_FOR_REVIEW: "\u6253\u5F00\u4E00\u4E2A\u7B14\u8BB0\u5F00\u59CB\u590D\u4E60",
|
|
REVIEW_CARDS: "\u590D\u4E60\u5361\u7247",
|
|
REVIEW_EASY_FILE_MENU: "\u590D\u4E60\uFF1A\u7B80\u5355",
|
|
REVIEW_GOOD_FILE_MENU: "\u590D\u4E60\uFF1A\u8BB0\u5F97",
|
|
REVIEW_HARD_FILE_MENU: "\u590D\u4E60\uFF1A\u8F83\u96BE",
|
|
REVIEW_NOTE_EASY_CMD: "\u6807\u8BB0\u4E3A\u201C\u7B80\u5355\u201D",
|
|
REVIEW_NOTE_GOOD_CMD: "\u6807\u8BB0\u4E3A\u201C\u8BB0\u5F97\u201D",
|
|
REVIEW_NOTE_HARD_CMD: "\u6807\u8BB0\u4E3A\u201C\u8F83\u96BE\u201D",
|
|
REVIEW_ALL_CARDS: "\u590D\u4E60\u6240\u6709\u7B14\u8BB0\u4E2D\u7684\u5361\u7247",
|
|
CRAM_ALL_CARDS: "\u9009\u62E9\u8981\u96C6\u4E2D\u590D\u4E60\u7684\u5361\u7EC4",
|
|
REVIEW_CARDS_IN_NOTE: "\u590D\u4E60\u6B64\u7B14\u8BB0\u4E2D\u7684\u5361\u7247",
|
|
CRAM_CARDS_IN_NOTE: "\u96C6\u4E2D\u590D\u4E60\u6B64\u7B14\u8BB0\u4E2D\u7684\u5361\u7247",
|
|
VIEW_STATS: "\u67E5\u770B\u6570\u636E",
|
|
STATUS_BAR: "\u590D\u4E60: ${dueNotesCount} \u7B14\u8BB0, ${dueFlashcardsCount} \u5361\u7247\u5DF2\u5230\u671F",
|
|
SYNC_TIME_TAKEN: "\u540C\u6B65\u65F6\u95F4 ${t}ms",
|
|
NOTE_IN_IGNORED_FOLDER: "\u7B14\u8BB0\u4FDD\u5B58\u5728\u5DF2\u88AB\u5FFD\u7565\u7684\u8DEF\u5F84\u4E2D\uFF08\u68C0\u67E5\u8BBE\u7F6E\u9009\u9879\uFF09\u3002",
|
|
PLEASE_TAG_NOTE: "\u8BF7\u5C06\u9700\u8981\u590D\u4E60\u7684\u7B14\u8BB0\u4E2D\u52A0\u5165\u6B63\u786E\u7684\u6807\u7B7E\uFF08\u68C0\u67E5\u8BBE\u7F6E\u9009\u9879\uFF09\u3002",
|
|
RESPONSE_RECEIVED: "\u53CD\u9988\u5DF2\u6536\u5230",
|
|
NO_DECK_EXISTS: "\u6CA1\u6709 ${deckName} \u5361\u7EC4",
|
|
ALL_CAUGHT_UP: "\u90FD\u590D\u4E60\u5B8C\u5566\uFF0C\u4F60\u771F\u68D2\uFF01",
|
|
// scheduling.ts
|
|
DAYS_STR_IVL: "${interval}\u5929",
|
|
MONTHS_STR_IVL: "${interval}\u6708",
|
|
YEARS_STR_IVL: "${interval}\u5E74",
|
|
DAYS_STR_IVL_MOBILE: "${interval}\u5929",
|
|
MONTHS_STR_IVL_MOBILE: "${interval}\u6708",
|
|
YEARS_STR_IVL_MOBILE: "${interval}\u5E74",
|
|
// settings.ts
|
|
SETTINGS_HEADER: "\u95F4\u9694\u91CD\u590D\u63D2\u4EF6 - \u8BBE\u7F6E",
|
|
CHECK_WIKI: '\u4E86\u89E3\u66F4\u591A, \u8BF7\u70B9\u51FB<a href="${wiki_url}">wiki</a>.',
|
|
FOLDERS_TO_IGNORE: "\u5FFD\u7565\u6B64\u6587\u4EF6\u5939",
|
|
FOLDERS_TO_IGNORE_DESC: "\u8F93\u5165\u6587\u4EF6\u5939\u8DEF\u5F84\uFF0C\u7528\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1ATemplates Meta/Scripts",
|
|
FLASHCARDS: "\u5361\u7247",
|
|
FLASHCARD_EASY_LABEL: "\u201C\u7B80\u5355\u201D\u6309\u94AE\u6587\u672C",
|
|
FLASHCARD_GOOD_LABEL: "\u201C\u8BB0\u5F97\u201D\u6309\u94AE\u6587\u672C",
|
|
FLASHCARD_HARD_LABEL: "\u201C\u8F83\u96BE\u201D\u6309\u94AE\u6587\u672C",
|
|
FLASHCARD_EASY_DESC: "\u81EA\u5B9A\u4E49\u201C\u7B80\u5355\u201D\u6309\u94AE\u7684\u6807\u7B7E",
|
|
FLASHCARD_GOOD_DESC: "\u81EA\u5B9A\u4E49\u201C\u8BB0\u5F97\u201D\u6309\u94AE\u7684\u6807\u7B7E",
|
|
FLASHCARD_HARD_DESC: "\u81EA\u5B9A\u4E49\u201C\u8F83\u96BE\u201D\u6309\u94AE\u7684\u6807\u7B7E",
|
|
FLASHCARD_TAGS: "\u5361\u7247\u6807\u7B7E",
|
|
FLASHCARD_TAGS_DESC: "\u8F93\u5165\u6807\u7B7E\uFF0C\u7528\u7A7A\u683C\u6216\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#flashcards #deck2 #deck3.",
|
|
CONVERT_FOLDERS_TO_DECKS: "\u662F\u5426\u5C06\u6587\u4EF6\u5939\u5185\u5BB9\u8F6C\u6362\u4E3A\u5361\u7247\u7EC4\u548C\u5B50\u5361\u7247\u7EC4\uFF1F",
|
|
CONVERT_FOLDERS_TO_DECKS_DESC: "\u6B64\u9009\u9879\u4E3A\u5361\u7247\u6807\u7B7E\u9009\u9879\u7684\u66FF\u4EE3\u9009\u9879\u3002",
|
|
INLINE_SCHEDULING_COMMENTS: "\u662F\u5426\u5C06\u8BA1\u5212\u91CD\u590D\u65F6\u95F4\u4FDD\u5B58\u5728\u5361\u7247\u6700\u540E\u4E00\u884C\u7684\u540C\u4E00\u884C\uFF1F",
|
|
INLINE_SCHEDULING_COMMENTS_DESC: "HTML\u6CE8\u91CA\u4E0D\u518D\u7834\u574F\u5217\u8868\u683C\u5F0F",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY: "\u5C06\u5173\u8054\u5361\u7247\u9690\u85CF\u81F3\u4E0B\u4E00\u5929\uFF1F",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u5173\u8054\u5361\u7247\u662F\u6765\u81EA\u540C\u4E00\u5361\u7247\u7684\u4E0D\u540C\u5F62\u5F0F\uFF0C \u4F8B\u5982\uFF1A\u5B8C\u5F62\u586B\u7A7A\u5361\u7247",
|
|
SHOW_CARD_CONTEXT: "\u5728\u5361\u7247\u4E2D\u663E\u793A\u4E0A\u4E0B\u6587\uFF1F",
|
|
SHOW_CARD_CONTEXT_DESC: "\u4F8B\u5982\uFF1A\u6807\u9898 > \u526F\u6807\u9898 > \u5C0F\u6807\u9898 > ... > \u5C0F\u6807\u9898",
|
|
CARD_MODAL_HEIGHT_PERCENT: "\u5361\u7247\u9AD8\u5EA6\u767E\u5206\u6BD4",
|
|
CARD_MODAL_SIZE_PERCENT_DESC: "\u8BF7\u5728\u79FB\u52A8\u7AEF\u4F7F\u7528\u5E76\u9700\u8981\u6D4F\u89C8\u8F83\u5927\u56FE\u7247\u65F6\u8BBE\u4E3A100%",
|
|
RESET_DEFAULT: "\u91CD\u7F6E\u4E3A\u9ED8\u8BA4",
|
|
CARD_MODAL_WIDTH_PERCENT: "\u5361\u7247\u5BBD\u5EA6\u767E\u5206\u6BD4",
|
|
RANDOMIZE_CARD_ORDER: "\u590D\u4E60\u65F6\u968F\u673A\u663E\u793A\u5361\u7247\uFF1F",
|
|
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
REVIEW_DECK_ORDER: "Order decks are displayed during review",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
DISABLE_CLOZE_CARDS: "\u4E0D\u8FDB\u884C\u5B8C\u5F62\u586B\u7A7A\uFF1F",
|
|
CONVERT_HIGHLIGHTS_TO_CLOZES: "\u5C06 ==\u9AD8\u4EAE== \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A\uFF1F",
|
|
CONVERT_BOLD_TEXT_TO_CLOZES: "\u5C06 **\u7C97\u4F53** \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A\uFF1F",
|
|
CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u5C06 {{\u5927\u62EC\u53F7}} \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A\uFF1F",
|
|
INLINE_CARDS_SEPARATOR: "\u5355\u884C\u5361\u7247\u7684\u5206\u9694\u7B26",
|
|
FIX_SEPARATORS_MANUALLY_WARNING: "\u6CE8\u610F\uFF1A\u66F4\u6539\u6B64\u9009\u9879\u540E\u4F60\u5C06\u9700\u8981\u81EA\u884C\u66F4\u6539\u5DF2\u5B58\u5728\u5361\u7247\u7684\u5206\u9694\u7B26\u3002",
|
|
INLINE_REVERSED_CARDS_SEPARATOR: "\u5355\u884C\u7FFB\u8F6C\u5361\u7247\u7684\u5206\u9694\u7B26",
|
|
MULTILINE_CARDS_SEPARATOR: "\u591A\u884C\u5361\u7247\u7684\u5206\u9694\u7B26",
|
|
MULTILINE_REVERSED_CARDS_SEPARATOR: "\u591A\u884C\u7FFB\u8F6C\u5361\u7247\u7684\u5206\u9694\u7B26",
|
|
NOTES: "\u7B14\u8BB0",
|
|
REVIEW_PANE_ON_STARTUP: "\u542F\u52A8\u65F6\u5F00\u542F\u7B14\u8BB0\u590D\u4E60\u7A97\u683C",
|
|
TAGS_TO_REVIEW: "\u590D\u4E60\u6807\u7B7E",
|
|
TAGS_TO_REVIEW_DESC: "\u8F93\u5165\u6807\u7B7E\uFF0C\u7528\u7A7A\u683C\u6216\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#review #tag2 #tag3.",
|
|
OPEN_RANDOM_NOTE: "\u590D\u4E60\u968F\u673A\u7B14\u8BB0",
|
|
OPEN_RANDOM_NOTE_DESC: "\u5173\u95ED\u6B64\u9009\u9879\uFF0C\u7B14\u8BB0\u5C06\u4EE5\u91CD\u8981\u5EA6(PageRank)\u6392\u5E8F\u3002",
|
|
AUTO_NEXT_NOTE: "\u590D\u4E60\u540E\u81EA\u52A8\u6253\u5F00\u4E0B\u4E00\u4E2A\u7B14\u8BB0",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u5173\u95ED\u6587\u4EF6\u9009\u5355\u4E2D\u7684\u590D\u4E60\u9009\u9879 \u4F8B\u5982\uFF1A\u590D\u4E60\uFF1A\u7B80\u5355 \u8BB0\u5F97 \u8F83\u96BE",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u5173\u95ED\u6B64\u9009\u9879\u540E\u4F60\u53EF\u4EE5\u4F7F\u7528\u5FEB\u6377\u952E\u5F00\u59CB\u590D\u4E60\u3002\u91CD\u65B0\u542F\u52A8Obsidian\u4F7F\u672C\u9009\u9879\u751F\u6548\u3002",
|
|
MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u8FB9\u680F\u4E2D\u663E\u793A\u7684\u6700\u5927\u5929\u6570",
|
|
MIN_ONE_DAY: "\u5929\u6570\u6700\u5C0F\u503C\u4E3A1",
|
|
VALID_NUMBER_WARNING: "\u8BF7\u8F93\u5165\u6709\u6548\u7684\u6570\u5B57\u3002",
|
|
UI_PREFERENCES: "\u7528\u6237\u754C\u9762\u9996\u9009\u9879",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u7532\u677F\u6811\u6700\u521D\u5E94\u663E\u793A\u4E3A\u5C55\u5F00",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u5173\u95ED\u6B64\u9009\u9879\u53EF\u6298\u53E0\u540C\u4E00\u5F20\u5361\u7247\u4E2D\u7684\u5D4C\u5957\u724C\u7EC4\u3002\u5982\u679C\u60A8\u7684\u5361\u7247\u5C5E\u4E8E\u540C\u4E00\u6587\u4EF6\u4E2D\u7684\u8BB8\u591A\u5957\u724C\uFF0C\u5219\u5F88\u6709\u7528\u3002",
|
|
ALGORITHM: "\u7B97\u6CD5",
|
|
CHECK_ALGORITHM_WIKI: '\u4E86\u89E3\u66F4\u591A, \u8BF7\u70B9\u51FB<a href="${algo_url}">\u7B97\u6CD5\u5B9E\u73B0</a>.',
|
|
BASE_EASE: "\u57FA\u7840\u638C\u63E1\u7A0B\u5EA6",
|
|
BASE_EASE_DESC: "\u6700\u5C0F\u503C130\uFF0C\u63A8\u8350\u503C\u7EA6250.",
|
|
BASE_EASE_MIN_WARNING: "\u57FA\u7840\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5C0F\u503C\u4E3A130\u3002",
|
|
LAPSE_INTERVAL_CHANGE: "\u5C06\u590D\u4E60\u65F6\u6807\u6CE8\u4E3A\u201C\u8F83\u96BE\u201D\u7684\u5361\u7247\u6216\u7B14\u8BB0\u590D\u4E60\u95F4\u9694\u7F29\u77ED",
|
|
LAPSE_INTERVAL_CHANGE_DESC: "\u65B0\u590D\u4E60\u95F4\u9694 = \u539F\u590D\u4E60\u95F4\u9694 * \u95F4\u9694\u6539\u53D8\u7CFB\u6570 / 100.",
|
|
EASY_BONUS: "\u7B80\u5355\u5956\u52B1",
|
|
EASY_BONUS_DESC: "\u7B80\u5355\u5956\u52B1\u8BBE\u5B9A\u201C\u8BB0\u5F97\u201D\u548C\u201C\u7B80\u5355\u201D\u5361\u7247\u6216\u7B14\u8BB0\u7684\u590D\u4E60\u95F4\u9694\u5DEE\u8DDD\uFF08\u6700\u5C0F\u503C100%\uFF09\u3002",
|
|
EASY_BONUS_MIN_WARNING: "\u7B80\u5355\u5956\u52B1\u81F3\u5C11\u4E3A100\u3002",
|
|
MAX_INTERVAL: "\u6700\u5927\u95F4\u9694\uFF08\u5929\uFF09",
|
|
MAX_INTERVAL_DESC: "\u8BBE\u5B9A\u590D\u4E60\u7684\u6700\u5927\u95F4\u9694\u65F6\u95F4\uFF08\u9ED8\u8BA4\u503C100\u5E74\uFF09\u3002",
|
|
MAX_INTERVAL_MIN_WARNING: "\u6700\u5927\u95F4\u9694\u81F3\u5C11\u4E3A1\u5929",
|
|
MAX_LINK_CONTRIB: "\u6700\u5927\u94FE\u63A5\u6536\u76CA",
|
|
MAX_LINK_CONTRIB_DESC: "\u94FE\u63A5\u7B14\u8BB0\u7684\u52A0\u6743\u638C\u63E1\u7A0B\u5EA6\u5BF9\u539F\u59CB\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5927\u8D21\u732E\u3002",
|
|
LOGGING: "\u8BB0\u5F55\u4E2D",
|
|
DISPLAY_DEBUG_INFO: "\u5728\u5F00\u53D1\u8005\u63A7\u5236\u53F0\u4E2D\u663E\u793A\u8C03\u8BD5\u4FE1\u606F\uFF1F",
|
|
// sidebar.ts
|
|
NOTES_REVIEW_QUEUE: "\u7B14\u8BB0\u590D\u4E60\u5E8F\u5217",
|
|
CLOSE: "\u4E34\u8FD1",
|
|
NEW: "\u65B0",
|
|
YESTERDAY: "\u6628\u5929",
|
|
TODAY: "\u4ECA\u5929",
|
|
TOMORROW: "\u660E\u5929",
|
|
// stats-modal.tsx
|
|
STATS_TITLE: "\u6570\u636E",
|
|
MONTH: "\u6708",
|
|
QUARTER: "\u5B63",
|
|
YEAR: "\u5E74",
|
|
LIFETIME: "\u5168\u90E8",
|
|
FORECAST: "\u9884\u671F",
|
|
FORECAST_DESC: "\u5C06\u8981\u5230\u671F\u7684\u5361\u7247\u6570\u91CF",
|
|
SCHEDULED: "\u5DF2\u6392\u671F",
|
|
DAYS: "\u5929",
|
|
NUMBER_OF_CARDS: "\u5361\u7247\u6570\u91CF",
|
|
REVIEWS_PER_DAY: "\u5E73\u5747: \u590D\u4E60${avg} /\u5929",
|
|
INTERVALS: "\u95F4\u9694",
|
|
INTERVALS_DESC: "\u5230\u4E0B\u4E00\u6B21\u590D\u4E60\u7684\u65F6\u95F4\u95F4\u9694",
|
|
COUNT: "\u8BA1\u6570",
|
|
INTERVALS_SUMMARY: "\u5E73\u5747\u95F4\u9694\u65F6\u95F4: ${avg}, \u6700\u957F\u95F4\u9694\u65F6\u95F4: ${longest}",
|
|
EASES: "\u638C\u63E1\u7A0B\u5EA6",
|
|
EASES_SUMMARY: "\u5E73\u5747\u638C\u63E1\u7A0B\u5EA6: ${avgEase}",
|
|
CARD_TYPES: "\u5361\u7247\u7C7B\u578B",
|
|
CARD_TYPES_DESC: "\u5982\u6709\uFF0C\u5C06\u663E\u793A\u9690\u85CF\u7684\u5361\u7247",
|
|
CARD_TYPE_NEW: "\u65B0",
|
|
CARD_TYPE_YOUNG: "\u8F83\u65B0",
|
|
CARD_TYPE_MATURE: "\u719F\u6089",
|
|
CARD_TYPES_SUMMARY: "\u603B\u5361\u7247\u6570: ${totalCardsCount}"
|
|
};
|
|
|
|
// src/lang/locale/zh-tw.ts
|
|
var zh_tw_default = {
|
|
// flashcard-modal.tsx
|
|
DECKS: "\u724C\u7D44",
|
|
DUE_CARDS: "\u5230\u671F\u5361\u7247",
|
|
NEW_CARDS: "\u65B0\u5361\u7247",
|
|
TOTAL_CARDS: "\u5168\u90E8\u5361\u7247",
|
|
BACK: "\u8FD4\u56DE",
|
|
SKIP: "\u7565\u904E",
|
|
EDIT_CARD: "\u7DE8\u8F2F\u5361\u7247",
|
|
RESET_CARD_PROGRESS: "\u91CD\u7F6E\u5361\u7247",
|
|
HARD: "\u8F03\u96E3",
|
|
GOOD: "\u8A18\u5F97",
|
|
EASY: "\u7C21\u55AE",
|
|
SHOW_ANSWER: "\u986F\u793A\u7B54\u6848",
|
|
CARD_PROGRESS_RESET: "\u5361\u7247\u5DF2\u88AB\u91CD\u7F6E\u3002",
|
|
SAVE: "\u5132\u5B58",
|
|
CANCEL: "\u53D6\u6D88",
|
|
NO_INPUT: "\u6C92\u6709\u63D0\u4F9B\u8F38\u5165\u3002",
|
|
CURRENT_EASE_HELP_TEXT: "\u76EE\u524D\u638C\u63E1\u7A0B\u5EA6\uFF1A",
|
|
CURRENT_INTERVAL_HELP_TEXT: "\u76EE\u524D\u9593\u9694\u6642\u9593\uFF1A",
|
|
CARD_GENERATED_FROM: "\u751F\u6210\u81EA\uFF1A${notePath}",
|
|
// main.ts
|
|
OPEN_NOTE_FOR_REVIEW: "\u6253\u958B\u4E00\u500B\u7B46\u8A18\u958B\u59CB\u5FA9\u7FD2",
|
|
REVIEW_CARDS: "\u5FA9\u7FD2\u5361\u7247",
|
|
REVIEW_EASY_FILE_MENU: "\u5FA9\u7FD2\uFF1A\u7C21\u55AE",
|
|
REVIEW_GOOD_FILE_MENU: "\u5FA9\u7FD2\uFF1A\u8A18\u5F97",
|
|
REVIEW_HARD_FILE_MENU: "\u5FA9\u7FD2\uFF1A\u8F03\u96E3",
|
|
REVIEW_NOTE_EASY_CMD: "\u6A19\u8A18\u70BA\u300C\u7C21\u55AE\u300D",
|
|
REVIEW_NOTE_GOOD_CMD: "\u6A19\u8A18\u70BA\u300C\u8A18\u5F97\u300D",
|
|
REVIEW_NOTE_HARD_CMD: "\u6A19\u8A18\u70BA\u300C\u8F03\u96E3\u300D",
|
|
REVIEW_CARDS_IN_NOTE: "\u5FA9\u7FD2\u6B64\u7B46\u8A18\u4E2D\u7684\u5361\u7247",
|
|
CRAM_ALL_CARDS: "\u9078\u64C7\u8981\u4E0D\u8A08\u96E3\u6613\u5EA6\u5FA9\u7FD2\u7684\u724C\u7D44",
|
|
REVIEW_ALL_CARDS: "\u5FA9\u7FD2\u6240\u6709\u7B46\u8A18\u4E2D\u7684\u5361\u7247",
|
|
CRAM_CARDS_IN_NOTE: "\u4E0D\u8A08\u96E3\u6613\u5EA6\u5FA9\u7FD2\u6B64\u7B46\u8A18\u4E2D\u7684\u5361\u7247",
|
|
VIEW_STATS: "\u6AA2\u8996\u6578\u64DA",
|
|
STATUS_BAR: "\u5FA9\u7FD2: ${dueNotesCount} \u7B46\u8A18, ${dueFlashcardsCount} \u5361\u7247\u5DF2\u5230\u671F",
|
|
SYNC_TIME_TAKEN: "\u540C\u6B65\u6642\u9593 ${t}ms",
|
|
NOTE_IN_IGNORED_FOLDER: "\u7B46\u8A18\u5132\u5B58\u5728\u5DF2\u88AB\u5FFD\u7565\u7684\u8DEF\u5F91\u4E2D\uFF08\u6AA2\u67E5\u8A2D\u5B9A\u9078\u9805\uFF09\u3002",
|
|
PLEASE_TAG_NOTE: "\u8ACB\u5C07\u9700\u8981\u5FA9\u7FD2\u7684\u7B46\u8A18\u4E2D\u52A0\u5165\u6B63\u78BA\u7684\u6A19\u7C64\uFF08\u6AA2\u67E5\u8A2D\u5B9A\u9078\u9805\uFF09\u3002",
|
|
RESPONSE_RECEIVED: "\u56DE\u994B\u5DF2\u6536\u5230",
|
|
NO_DECK_EXISTS: "\u6C92\u6709 ${deckName} \u724C\u7D44",
|
|
ALL_CAUGHT_UP: "\u90FD\u5FA9\u7FD2\u5B8C\u5566\uFF0C\u4F60\u771F\u68D2\uFF01",
|
|
// scheduling.ts
|
|
DAYS_STR_IVL: "${interval}\u5929",
|
|
MONTHS_STR_IVL: "${interval}\u6708",
|
|
YEARS_STR_IVL: "${interval}\u5E74",
|
|
DAYS_STR_IVL_MOBILE: "${interval}\u5929",
|
|
MONTHS_STR_IVL_MOBILE: "${interval}\u6708",
|
|
YEARS_STR_IVL_MOBILE: "${interval}\u5E74",
|
|
// settings.ts
|
|
SETTINGS_HEADER: "\u9593\u9694\u91CD\u8907\u5916\u639B - \u8A2D\u5B9A",
|
|
CHECK_WIKI: '\u77AD\u89E3\u66F4\u591A, \u8ACB\u9EDE\u9078<a href="${wiki_url}">wiki</a>.',
|
|
FOLDERS_TO_IGNORE: "\u5FFD\u7565\u6B64\u8CC7\u6599\u593E",
|
|
FOLDERS_TO_IGNORE_DESC: "\u8F38\u5165\u8CC7\u6599\u593E\u8DEF\u5F91\uFF08\u7528\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF09\uFF0C\u4F8B\u5982\uFF1ATemplates Meta/Scripts",
|
|
FLASHCARDS: "\u5361\u7247",
|
|
FLASHCARD_EASY_LABEL: "\u7C21\u55AE\u6309\u9215\u6587\u5B57",
|
|
FLASHCARD_GOOD_LABEL: "\u8A18\u5F97\u6309\u9215\u6587\u5B57",
|
|
FLASHCARD_HARD_LABEL: "\u8F03\u96E3\u6309\u9215\u6587\u5B57",
|
|
FLASHCARD_EASY_DESC: "\u81EA\u8A02\u300C\u7C21\u55AE\u300D\u6309\u9215\u7684\u6A19\u7C64",
|
|
FLASHCARD_GOOD_DESC: "\u81EA\u8A02\u300C\u8A18\u5F97\u300D\u6309\u9215\u7684\u6A19\u7C64",
|
|
FLASHCARD_HARD_DESC: "\u81EA\u8A02\u300C\u8F03\u96E3\u300D\u6309\u9215\u7684\u6A19\u7C64",
|
|
FLASHCARD_TAGS: "\u5361\u7247\u6A19\u7C64",
|
|
FLASHCARD_TAGS_DESC: "\u8F38\u5165\u6A19\u7C64\uFF08\u7528\u7A7A\u767D\u6216\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF09\uFF0C\u4F8B\u5982\uFF1A#flashcards #deck2 #deck3.",
|
|
CONVERT_FOLDERS_TO_DECKS: "\u662F\u5426\u5C07\u8CC7\u6599\u593E\u5167\u5BB9\u8F49\u63DB\u70BA\u724C\u7D44\u548C\u5B50\u724C\u7D44\uFF1F",
|
|
CONVERT_FOLDERS_TO_DECKS_DESC: "\u6B64\u9078\u9805\u70BA\u5361\u7247\u6A19\u7C64\u9078\u9805\u7684\u66FF\u4EE3\u9078\u9805\u3002",
|
|
INLINE_SCHEDULING_COMMENTS: "\u662F\u5426\u5C07\u8A08\u5283\u91CD\u8907\u6642\u9593\u5132\u5B58\u5728\u5361\u7247\u6700\u5F8C\u4E00\u884C\u7684\u540C\u4E00\u884C\uFF1F",
|
|
INLINE_SCHEDULING_COMMENTS_DESC: "\u52FE\u9078\u5F8CHTML\u8A3B\u89E3\u4E0D\u6703\u7834\u58DE\u5217\u8868\u683C\u5F0F\u554F\u984C\u3002",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY: "\u5C07\u53CD\u8F49\u5361\u7247\u96B1\u85CF\u81F3\u4E0B\u4E00\u5929\uFF1F",
|
|
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u53CD\u8F49\u5361\u7247\u7531\u540C\u4E00\u5361\u7247\u6587\u5B57\u7522\u751F\uFF0C\u4F8B\u5982\uFF1A\u586B\u7A7A\u514B\u6F0F\u5B57",
|
|
SHOW_CARD_CONTEXT: "\u5728\u5361\u7247\u4E2D\u986F\u793A\u4E0A\u4E0B\u6587\uFF1F",
|
|
SHOW_CARD_CONTEXT_DESC: "\u4F8B\u5982\uFF1A\u6A19\u984C > \u526F\u6A19\u984C > \u5C0F\u6A19\u984C > ... > \u5C0F\u6A19\u984C",
|
|
CARD_MODAL_HEIGHT_PERCENT: "\u5361\u7247\u9AD8\u5EA6\u767E\u5206\u6BD4",
|
|
CARD_MODAL_SIZE_PERCENT_DESC: "\u5728\u79FB\u52D5\u7AEF\u6216\u9700\u8981\u8F03\u5927\u5716\u7247\u6642\u61C9\u8A2D\u5B9A\u70BA100%",
|
|
RESET_DEFAULT: "\u91CD\u7F6E\u70BA\u9810\u8A2D\u503C",
|
|
CARD_MODAL_WIDTH_PERCENT: "\u5361\u7247\u5BEC\u5EA6\u767E\u5206\u6BD4",
|
|
RANDOMIZE_CARD_ORDER: "\u5FA9\u7FD2\u6642\u96A8\u6A5F\u986F\u793A\u5361\u7247\uFF1F",
|
|
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
|
|
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
|
|
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
REVIEW_DECK_ORDER: "Order decks are displayed during review",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
|
|
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
|
|
DISABLE_CLOZE_CARDS: "\u505C\u7528\u586B\u7A7A\u514B\u6F0F\u5B57\u5361\u7247\uFF1F",
|
|
CONVERT_HIGHLIGHTS_TO_CLOZES: "\u5C07 ==\u9AD8\u4EAE== \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F",
|
|
CONVERT_BOLD_TEXT_TO_CLOZES: "\u5C07 **\u7C97\u9AD4** \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F",
|
|
CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u5C07 {{\u5927\u62EC\u865F}} \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F",
|
|
INLINE_CARDS_SEPARATOR: "\u55AE\u884C\u5361\u7247\u7684\u5206\u9694\u5B57\u5143",
|
|
FIX_SEPARATORS_MANUALLY_WARNING: "\u6CE8\u610F\uFF1A\u66F4\u6539\u6B64\u9078\u9805\u5F8C\u4F60\u5C07\u9700\u8981\u81EA\u884C\u66F4\u6539\u5DF2\u5B58\u5728\u5361\u7247\u7684\u5206\u9694\u5B57\u5143\u3002",
|
|
INLINE_REVERSED_CARDS_SEPARATOR: "\u55AE\u884C\u53CD\u8F49\u5361\u7247\u7684\u5206\u9694\u5B57\u5143",
|
|
MULTILINE_CARDS_SEPARATOR: "\u591A\u884C\u5361\u7247\u7684\u5206\u9694\u5B57\u5143",
|
|
MULTILINE_REVERSED_CARDS_SEPARATOR: "\u591A\u884C\u7FFB\u8F49\u5361\u7247\u7684\u5206\u9694\u5B57\u5143",
|
|
NOTES: "\u7B46\u8A18",
|
|
REVIEW_PANE_ON_STARTUP: "\u555F\u52D5\u6642\u958B\u555F\u7B46\u8A18\u5FA9\u7FD2\u7A97\u683C",
|
|
TAGS_TO_REVIEW: "\u5FA9\u7FD2\u6A19\u7C64",
|
|
TAGS_TO_REVIEW_DESC: "\u8F38\u5165\u6A19\u7C64\uFF0C\u7528\u7A7A\u683C\u6216\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#review #tag2 #tag3.",
|
|
OPEN_RANDOM_NOTE: "\u5FA9\u7FD2\u96A8\u6A5F\u7B46\u8A18",
|
|
OPEN_RANDOM_NOTE_DESC: "\u95DC\u9589\u6B64\u9078\u9805\uFF0C\u7B46\u8A18\u5C07\u4EE5\u91CD\u8981\u5EA6(PageRank)\u6392\u5E8F\u3002",
|
|
AUTO_NEXT_NOTE: "\u5FA9\u7FD2\u5F8C\u81EA\u52D5\u6253\u958B\u4E0B\u4E00\u500B\u7B46\u8A18",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u95DC\u9589\u6A94\u6848\u9078\u55AE\u4E2D\u7684\u5FA9\u7FD2\u9078\u9805 \u4F8B\u5982\uFF1A\u5FA9\u7FD2\uFF1A\u7C21\u55AE \u8A18\u5F97 \u8F03\u96E3",
|
|
DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u95DC\u9589\u6A94\u6848\u9078\u55AE\u7684\u5FA9\u7FD2\u9078\u9805\uFF0C\u4F8B\u5982\uFF1A\u5FA9\u7FD2: \u7C21\u55AE \u8A18\u5F97 \u8F03\u96E3\u3002",
|
|
MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u908A\u9762\u677F\u986F\u793A\u7684\u6700\u5927\u5929\u6578",
|
|
MIN_ONE_DAY: "\u5929\u6578\u6700\u5C0F\u503C\u70BA1",
|
|
VALID_NUMBER_WARNING: "\u8ACB\u8F38\u5165\u6709\u6548\u7684\u6578\u5B57\u3002",
|
|
UI_PREFERENCES: "\u7528\u6236\u4ECB\u9762\u9996\u9078\u9805",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u724C\u7D44\u6A39\u6700\u521D\u61C9\u986F\u793A\u70BA\u5C55\u958B",
|
|
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u95DC\u9589\u6B64\u9078\u9805\u53EF\u647A\u758A\u540C\u4E00\u5F35\u5361\u7247\u4E2D\u7684\u5DE2\u72C0\u724C\u7D44\u3002\u5982\u679C\u60A8\u7684\u5361\u7247\u5C6C\u65BC\u540C\u4E00\u6A94\u6848\u4E2D\u7684\u8A31\u591A\u5957\u724C\uFF0C\u5247\u5F88\u6709\u7528\u3002",
|
|
ALGORITHM: "\u6F14\u7B97\u6CD5",
|
|
CHECK_ALGORITHM_WIKI: '\u77AD\u89E3\u66F4\u591A, \u8ACB\u9EDE\u9078<a href="${algo_url}">\u7B97\u6CD5\u5BE6\u73FE</a>.',
|
|
BASE_EASE: "\u57FA\u790E\u638C\u63E1\u7A0B\u5EA6",
|
|
BASE_EASE_DESC: "\u6700\u5C0F\u503C130\uFF0C\u63A8\u85A6\u503C\u7D04250.",
|
|
BASE_EASE_MIN_WARNING: "\u57FA\u790E\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5C0F\u503C\u70BA130\u3002",
|
|
LAPSE_INTERVAL_CHANGE: "\u5C07\u5FA9\u7FD2\u6642\u6A19\u8A3B\u70BA\u300C\u8F03\u96E3\u300D\u7684\u5361\u7247\u6216\u7B46\u8A18\u5FA9\u7FD2\u9593\u9694\u7E2E\u77ED",
|
|
LAPSE_INTERVAL_CHANGE_DESC: "\u65B0\u5FA9\u7FD2\u9593\u9694 = \u539F\u5FA9\u7FD2\u9593\u9694 * \u9593\u9694\u6539\u8B8A\u4FC2\u6578 / 100.",
|
|
EASY_BONUS: "\u7C21\u55AE\u734E\u52F5",
|
|
EASY_BONUS_DESC: "\u7C21\u55AE\u734E\u52F5\u8A2D\u5B9A\u300C\u8A18\u5F97\u300D\u548C\u300C\u7C21\u55AE\u300D\u5361\u7247\u6216\u7B46\u8A18\u7684\u5FA9\u7FD2\u9593\u9694\u5DEE\u8DDD\uFF08\u6700\u5C0F\u503C100%\uFF09\u3002",
|
|
EASY_BONUS_MIN_WARNING: "\u7C21\u55AE\u734E\u52F5\u81F3\u5C11\u70BA100\u3002",
|
|
MAX_INTERVAL: "\u6700\u5927\u9593\u9694\uFF08\u5929\uFF09",
|
|
MAX_INTERVAL_DESC: "\u8A2D\u5B9A\u5FA9\u7FD2\u7684\u6700\u5927\u9593\u9694\u6642\u9593\uFF08\u9810\u8A2D\u503C100\u5E74\uFF09\u3002",
|
|
MAX_INTERVAL_MIN_WARNING: "\u6700\u5927\u9593\u9694\u81F3\u5C11\u70BA1\u5929",
|
|
MAX_LINK_CONTRIB: "\u6700\u5927\u93C8\u63A5\u8CA2\u737B",
|
|
MAX_LINK_CONTRIB_DESC: "\u93C8\u63A5\u7B46\u8A18\u7684\u52A0\u6B0A\u638C\u63E1\u7A0B\u5EA6\u5C0D\u539F\u59CB\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5927\u8CA2\u737B\u3002",
|
|
LOGGING: "\u8A18\u9304\u4E2D",
|
|
DISPLAY_DEBUG_INFO: "\u5728\u958B\u767C\u8005\u63A7\u5236\u53F0\u4E2D\u986F\u793A\u9664\u932F\u8CC7\u8A0A\uFF1F",
|
|
// sidebar.ts
|
|
NOTES_REVIEW_QUEUE: "\u7B46\u8A18\u5FA9\u7FD2\u5E8F\u5217",
|
|
CLOSE: "\u81E8\u8FD1",
|
|
NEW: "\u65B0",
|
|
YESTERDAY: "\u6628\u5929",
|
|
TODAY: "\u4ECA\u5929",
|
|
TOMORROW: "\u660E\u5929",
|
|
// stats-modal.tsx
|
|
STATS_TITLE: "\u7D71\u8A08",
|
|
MONTH: "\u6708",
|
|
QUARTER: "\u5B63",
|
|
YEAR: "\u5E74",
|
|
LIFETIME: "\u5168\u90E8",
|
|
FORECAST: "\u9810\u6E2C",
|
|
FORECAST_DESC: "\u5C07\u8981\u5230\u671F\u7684\u5361\u7247\u6578\u91CF",
|
|
SCHEDULED: "\u5DF2\u6392\u7A0B",
|
|
DAYS: "\u5929",
|
|
NUMBER_OF_CARDS: "\u5361\u7247\u6578\u91CF",
|
|
REVIEWS_PER_DAY: "\u5E73\u5747: \u5FA9\u7FD2${avg} /\u5929",
|
|
INTERVALS: "\u9593\u9694",
|
|
INTERVALS_DESC: "\u5230\u4E0B\u4E00\u6B21\u5FA9\u7FD2\u7684\u6642\u9593\u9593\u9694",
|
|
COUNT: "\u8A08\u6578",
|
|
INTERVALS_SUMMARY: "\u5E73\u5747\u9593\u9694\u6642\u9593: ${avg}, \u6700\u9577\u9593\u9694\u6642\u9593: ${longest}",
|
|
EASES: "\u638C\u63E1\u7A0B\u5EA6",
|
|
EASES_SUMMARY: "\u5E73\u5747\u638C\u63E1\u7A0B\u5EA6: ${avgEase}",
|
|
CARD_TYPES: "\u5361\u7247\u578B\u5225",
|
|
CARD_TYPES_DESC: "\u5982\u6709\uFF0C\u5C07\u986F\u793A\u96B1\u85CF\u7684\u5361\u7247",
|
|
CARD_TYPE_NEW: "\u65B0",
|
|
CARD_TYPE_YOUNG: "\u8F03\u65B0",
|
|
CARD_TYPE_MATURE: "\u719F\u6089",
|
|
CARD_TYPES_SUMMARY: "\u7E3D\u5361\u7247\u6578: ${totalCardsCount}"
|
|
};
|
|
|
|
// src/lang/helpers.ts
|
|
var localeMap = {
|
|
af: af_default,
|
|
ar: ar_default,
|
|
bn: bn_default,
|
|
cs: cz_default,
|
|
da: da_default,
|
|
de: de_default,
|
|
en: en_default,
|
|
"en-gb": en_gb_default,
|
|
es: es_default,
|
|
fr: fr_default,
|
|
hi: hi_default,
|
|
id: id_default,
|
|
it: it_default,
|
|
ja: ja_default,
|
|
ko: ko_default,
|
|
mr: mr_default,
|
|
nl: nl_default,
|
|
nn: no_default,
|
|
pl: pl_default,
|
|
pt: pt_default,
|
|
"pt-br": pt_br_default,
|
|
ro: ro_default,
|
|
ru: ru_default,
|
|
ta: ta_default,
|
|
te: te_default,
|
|
th: th_default,
|
|
tr: tr_default,
|
|
uk: uk_default,
|
|
ur: ur_default,
|
|
vi: vi_default,
|
|
"zh-cn": zh_cn_default,
|
|
"zh-tw": zh_tw_default
|
|
};
|
|
var locale = localeMap[import_obsidian.moment.locale()];
|
|
function interpolate(str, params) {
|
|
const names2 = Object.keys(params);
|
|
const vals = Object.values(params);
|
|
return new Function(...names2, `return \`${str}\`;`)(...vals);
|
|
}
|
|
function t(str, params) {
|
|
if (!locale) {
|
|
console.error(`SRS error: Locale ${import_obsidian.moment.locale()} not found.`);
|
|
}
|
|
const result = locale && locale[str] || en_default[str];
|
|
if (params) {
|
|
return interpolate(result, params);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
// src/settings.ts
|
|
var DEFAULT_SETTINGS = {
|
|
// flashcards
|
|
flashcardEasyText: t("EASY"),
|
|
flashcardGoodText: t("GOOD"),
|
|
flashcardHardText: t("HARD"),
|
|
flashcardTags: ["#flashcards"],
|
|
convertFoldersToDecks: false,
|
|
cardCommentOnSameLine: false,
|
|
burySiblingCards: false,
|
|
showContextInCards: true,
|
|
flashcardHeightPercentage: import_obsidian2.Platform.isMobile ? 100 : 80,
|
|
flashcardWidthPercentage: import_obsidian2.Platform.isMobile ? 100 : 40,
|
|
randomizeCardOrder: null,
|
|
flashcardCardOrder: "DueFirstRandom",
|
|
flashcardDeckOrder: "PrevDeckComplete_Sequential",
|
|
convertHighlightsToClozes: true,
|
|
convertBoldTextToClozes: false,
|
|
convertCurlyBracketsToClozes: false,
|
|
singleLineCardSeparator: "::",
|
|
singleLineReversedCardSeparator: ":::",
|
|
multilineCardSeparator: "?",
|
|
multilineReversedCardSeparator: "??",
|
|
editLaterTag: "#edit-later",
|
|
// notes
|
|
enableNoteReviewPaneOnStartup: true,
|
|
tagsToReview: ["#review"],
|
|
noteFoldersToIgnore: [],
|
|
openRandomNote: false,
|
|
autoNextNote: false,
|
|
disableFileMenuReviewOptions: false,
|
|
maxNDaysNotesReviewQueue: 365,
|
|
// UI settings
|
|
initiallyExpandAllSubdecksInTree: false,
|
|
// algorithm
|
|
baseEase: 250,
|
|
lapsesIntervalChange: 0.5,
|
|
easyBonus: 1.3,
|
|
maximumInterval: 36525,
|
|
maxLinkFactor: 1,
|
|
// logging
|
|
showDebugMessages: false
|
|
};
|
|
function upgradeSettings(settings) {
|
|
if (settings.randomizeCardOrder != null && settings.flashcardCardOrder == null && settings.flashcardDeckOrder == null) {
|
|
console.log(`loadPluginData: Upgrading settings: ${settings.randomizeCardOrder}`);
|
|
settings.flashcardCardOrder = settings.randomizeCardOrder ? "DueFirstRandom" : "DueFirstSequential";
|
|
settings.flashcardDeckOrder = "PrevDeckComplete_Sequential";
|
|
settings.randomizeCardOrder = null;
|
|
}
|
|
}
|
|
var applyDebounceTimer = 0;
|
|
function applySettingsUpdate(callback2) {
|
|
clearTimeout(applyDebounceTimer);
|
|
applyDebounceTimer = window.setTimeout(callback2, 512);
|
|
}
|
|
var SRSettingTab = class extends import_obsidian2.PluginSettingTab {
|
|
constructor(app2, plugin) {
|
|
super(app2, plugin);
|
|
this.plugin = plugin;
|
|
}
|
|
display() {
|
|
const { containerEl } = this;
|
|
containerEl.empty();
|
|
const header = containerEl.createEl("h1", { text: `${t("SETTINGS_HEADER")}` });
|
|
header.addClass("sr-centered");
|
|
containerEl.createDiv().innerHTML = t("CHECK_WIKI", {
|
|
wiki_url: "https://www.stephenmwangi.com/obsidian-spaced-repetition/"
|
|
});
|
|
new import_obsidian2.Setting(containerEl).setName(t("FOLDERS_TO_IGNORE")).setDesc(t("FOLDERS_TO_IGNORE_DESC")).addTextArea(
|
|
(text) => text.setValue(this.plugin.data.settings.noteFoldersToIgnore.join("\n")).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
this.plugin.data.settings.noteFoldersToIgnore = value.split(/\n+/).map((v) => v.trim()).filter((v) => v);
|
|
await this.plugin.savePluginData();
|
|
});
|
|
})
|
|
);
|
|
containerEl.createEl("h3", { text: `${t("FLASHCARDS")}` });
|
|
new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_TAGS")).setDesc(t("FLASHCARD_TAGS_DESC")).addTextArea(
|
|
(text) => text.setValue(this.plugin.data.settings.flashcardTags.join(" ")).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
this.plugin.data.settings.flashcardTags = value.split(/\s+/);
|
|
await this.plugin.savePluginData();
|
|
});
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("CONVERT_FOLDERS_TO_DECKS")).setDesc(t("CONVERT_FOLDERS_TO_DECKS_DESC")).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.data.settings.convertFoldersToDecks).onChange(async (value) => {
|
|
this.plugin.data.settings.convertFoldersToDecks = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("INLINE_SCHEDULING_COMMENTS")).setDesc(t("INLINE_SCHEDULING_COMMENTS_DESC")).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.data.settings.cardCommentOnSameLine).onChange(async (value) => {
|
|
this.plugin.data.settings.cardCommentOnSameLine = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("BURY_SIBLINGS_TILL_NEXT_DAY")).setDesc(t("BURY_SIBLINGS_TILL_NEXT_DAY_DESC")).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.data.settings.burySiblingCards).onChange(async (value) => {
|
|
this.plugin.data.settings.burySiblingCards = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("SHOW_CARD_CONTEXT")).setDesc(t("SHOW_CARD_CONTEXT_DESC")).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.data.settings.showContextInCards).onChange(async (value) => {
|
|
this.plugin.data.settings.showContextInCards = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("CARD_MODAL_HEIGHT_PERCENT")).setDesc(t("CARD_MODAL_SIZE_PERCENT_DESC")).addSlider(
|
|
(slider) => slider.setLimits(10, 100, 5).setValue(this.plugin.data.settings.flashcardHeightPercentage).setDynamicTooltip().onChange(async (value) => {
|
|
this.plugin.data.settings.flashcardHeightPercentage = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.flashcardHeightPercentage = DEFAULT_SETTINGS.flashcardHeightPercentage;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
new import_obsidian2.Setting(containerEl).setName(t("CARD_MODAL_WIDTH_PERCENT")).setDesc(t("CARD_MODAL_SIZE_PERCENT_DESC")).addSlider(
|
|
(slider) => slider.setLimits(10, 100, 5).setValue(this.plugin.data.settings.flashcardWidthPercentage).setDynamicTooltip().onChange(async (value) => {
|
|
this.plugin.data.settings.flashcardWidthPercentage = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.flashcardWidthPercentage = DEFAULT_SETTINGS.flashcardWidthPercentage;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
new import_obsidian2.Setting(this.containerEl).setName(t("REVIEW_CARD_ORDER_WITHIN_DECK")).addDropdown(
|
|
(dropdown) => dropdown.addOptions({
|
|
NewFirstSequential: t("REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL"),
|
|
DueFirstSequential: t("REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL"),
|
|
NewFirstRandom: t("REVIEW_CARD_ORDER_NEW_FIRST_RANDOM"),
|
|
DueFirstRandom: t("REVIEW_CARD_ORDER_DUE_FIRST_RANDOM"),
|
|
EveryCardRandomDeckAndCard: t("REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD")
|
|
}).setValue(this.plugin.data.settings.flashcardCardOrder).onChange(async (value) => {
|
|
this.plugin.data.settings.flashcardCardOrder = value;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
})
|
|
);
|
|
const deckOrderEnabled = this.plugin.data.settings.flashcardCardOrder != "EveryCardRandomDeckAndCard";
|
|
new import_obsidian2.Setting(this.containerEl).setName(t("REVIEW_DECK_ORDER")).addDropdown(
|
|
(dropdown) => dropdown.addOptions(
|
|
deckOrderEnabled ? {
|
|
PrevDeckComplete_Sequential: t(
|
|
"REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL"
|
|
),
|
|
PrevDeckComplete_Random: t(
|
|
"REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM"
|
|
)
|
|
} : {
|
|
EveryCardRandomDeckAndCard: t(
|
|
"REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD"
|
|
)
|
|
}
|
|
).setValue(
|
|
deckOrderEnabled ? this.plugin.data.settings.flashcardDeckOrder : "EveryCardRandomDeckAndCard"
|
|
).setDisabled(!deckOrderEnabled).onChange(async (value) => {
|
|
this.plugin.data.settings.flashcardDeckOrder = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("CONVERT_HIGHLIGHTS_TO_CLOZES")).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.data.settings.convertHighlightsToClozes).onChange(async (value) => {
|
|
this.plugin.data.settings.convertHighlightsToClozes = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("CONVERT_BOLD_TEXT_TO_CLOZES")).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.data.settings.convertBoldTextToClozes).onChange(async (value) => {
|
|
this.plugin.data.settings.convertBoldTextToClozes = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("CONVERT_CURLY_BRACKETS_TO_CLOZES")).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.data.settings.convertCurlyBracketsToClozes).onChange(async (value) => {
|
|
this.plugin.data.settings.convertCurlyBracketsToClozes = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("INLINE_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText(
|
|
(text) => text.setValue(this.plugin.data.settings.singleLineCardSeparator).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
this.plugin.data.settings.singleLineCardSeparator = value;
|
|
await this.plugin.savePluginData();
|
|
});
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.singleLineCardSeparator = DEFAULT_SETTINGS.singleLineCardSeparator;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
new import_obsidian2.Setting(containerEl).setName(t("INLINE_REVERSED_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText(
|
|
(text) => text.setValue(this.plugin.data.settings.singleLineReversedCardSeparator).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
this.plugin.data.settings.singleLineReversedCardSeparator = value;
|
|
await this.plugin.savePluginData();
|
|
});
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.singleLineReversedCardSeparator = DEFAULT_SETTINGS.singleLineReversedCardSeparator;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
new import_obsidian2.Setting(containerEl).setName(t("MULTILINE_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText(
|
|
(text) => text.setValue(this.plugin.data.settings.multilineCardSeparator).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
this.plugin.data.settings.multilineCardSeparator = value;
|
|
await this.plugin.savePluginData();
|
|
});
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.multilineCardSeparator = DEFAULT_SETTINGS.multilineCardSeparator;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
new import_obsidian2.Setting(containerEl).setName(t("MULTILINE_REVERSED_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText(
|
|
(text) => text.setValue(this.plugin.data.settings.multilineReversedCardSeparator).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
this.plugin.data.settings.multilineReversedCardSeparator = value;
|
|
await this.plugin.savePluginData();
|
|
});
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.multilineReversedCardSeparator = DEFAULT_SETTINGS.multilineReversedCardSeparator;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_EASY_LABEL")).setDesc(t("FLASHCARD_EASY_DESC")).addText(
|
|
(text) => text.setValue(this.plugin.data.settings.flashcardEasyText).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
this.plugin.data.settings.flashcardEasyText = value;
|
|
await this.plugin.savePluginData();
|
|
});
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.flashcardEasyText = DEFAULT_SETTINGS.flashcardEasyText;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_GOOD_LABEL")).setDesc(t("FLASHCARD_GOOD_DESC")).addText(
|
|
(text) => text.setValue(this.plugin.data.settings.flashcardGoodText).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
this.plugin.data.settings.flashcardGoodText = value;
|
|
await this.plugin.savePluginData();
|
|
});
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.flashcardGoodText = DEFAULT_SETTINGS.flashcardGoodText;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_HARD_LABEL")).setDesc(t("FLASHCARD_HARD_DESC")).addText(
|
|
(text) => text.setValue(this.plugin.data.settings.flashcardHardText).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
this.plugin.data.settings.flashcardHardText = value;
|
|
await this.plugin.savePluginData();
|
|
});
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.flashcardHardText = DEFAULT_SETTINGS.flashcardHardText;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
containerEl.createEl("h3", { text: `${t("NOTES")}` });
|
|
new import_obsidian2.Setting(containerEl).setName(t("REVIEW_PANE_ON_STARTUP")).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.data.settings.enableNoteReviewPaneOnStartup).onChange(async (value) => {
|
|
this.plugin.data.settings.enableNoteReviewPaneOnStartup = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("TAGS_TO_REVIEW")).setDesc(t("TAGS_TO_REVIEW_DESC")).addTextArea(
|
|
(text) => text.setValue(this.plugin.data.settings.tagsToReview.join(" ")).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
this.plugin.data.settings.tagsToReview = value.split(/\s+/);
|
|
await this.plugin.savePluginData();
|
|
});
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("OPEN_RANDOM_NOTE")).setDesc(t("OPEN_RANDOM_NOTE_DESC")).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.data.settings.openRandomNote).onChange(async (value) => {
|
|
this.plugin.data.settings.openRandomNote = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("AUTO_NEXT_NOTE")).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.data.settings.autoNextNote).onChange(async (value) => {
|
|
this.plugin.data.settings.autoNextNote = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("DISABLE_FILE_MENU_REVIEW_OPTIONS")).setDesc(t("DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC")).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.data.settings.disableFileMenuReviewOptions).onChange(async (value) => {
|
|
this.plugin.data.settings.disableFileMenuReviewOptions = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
new import_obsidian2.Setting(containerEl).setName(t("MAX_N_DAYS_REVIEW_QUEUE")).addText(
|
|
(text) => text.setValue(this.plugin.data.settings.maxNDaysNotesReviewQueue.toString()).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
const numValue = Number.parseInt(value);
|
|
if (!isNaN(numValue)) {
|
|
if (numValue < 1) {
|
|
new import_obsidian2.Notice(t("MIN_ONE_DAY"));
|
|
text.setValue(
|
|
this.plugin.data.settings.maxNDaysNotesReviewQueue.toString()
|
|
);
|
|
return;
|
|
}
|
|
this.plugin.data.settings.maxNDaysNotesReviewQueue = numValue;
|
|
await this.plugin.savePluginData();
|
|
} else {
|
|
new import_obsidian2.Notice(t("VALID_NUMBER_WARNING"));
|
|
}
|
|
});
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.maxNDaysNotesReviewQueue = DEFAULT_SETTINGS.maxNDaysNotesReviewQueue;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
containerEl.createEl("h3", { text: `${t("UI_PREFERENCES")}` });
|
|
new import_obsidian2.Setting(containerEl).setName(t("INITIALLY_EXPAND_SUBDECKS_IN_TREE")).setDesc(t("INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC")).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.data.settings.initiallyExpandAllSubdecksInTree).onChange(async (value) => {
|
|
this.plugin.data.settings.initiallyExpandAllSubdecksInTree = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
containerEl.createEl("h3", { text: `${t("ALGORITHM")}` });
|
|
containerEl.createDiv().innerHTML = t("CHECK_ALGORITHM_WIKI", {
|
|
algo_url: "https://www.stephenmwangi.com/obsidian-spaced-repetition/algorithms/"
|
|
});
|
|
new import_obsidian2.Setting(containerEl).setName(t("BASE_EASE")).setDesc(t("BASE_EASE_DESC")).addText(
|
|
(text) => text.setValue(this.plugin.data.settings.baseEase.toString()).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
const numValue = Number.parseInt(value);
|
|
if (!isNaN(numValue)) {
|
|
if (numValue < 130) {
|
|
new import_obsidian2.Notice(t("BASE_EASE_MIN_WARNING"));
|
|
text.setValue(this.plugin.data.settings.baseEase.toString());
|
|
return;
|
|
}
|
|
this.plugin.data.settings.baseEase = numValue;
|
|
await this.plugin.savePluginData();
|
|
} else {
|
|
new import_obsidian2.Notice(t("VALID_NUMBER_WARNING"));
|
|
}
|
|
});
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.baseEase = DEFAULT_SETTINGS.baseEase;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
new import_obsidian2.Setting(containerEl).setName(t("LAPSE_INTERVAL_CHANGE")).setDesc(t("LAPSE_INTERVAL_CHANGE_DESC")).addSlider(
|
|
(slider) => slider.setLimits(1, 99, 1).setValue(this.plugin.data.settings.lapsesIntervalChange * 100).setDynamicTooltip().onChange(async (value) => {
|
|
this.plugin.data.settings.lapsesIntervalChange = value / 100;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.lapsesIntervalChange = DEFAULT_SETTINGS.lapsesIntervalChange;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
new import_obsidian2.Setting(containerEl).setName(t("EASY_BONUS")).setDesc(t("EASY_BONUS_DESC")).addText(
|
|
(text) => text.setValue((this.plugin.data.settings.easyBonus * 100).toString()).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
const numValue = Number.parseInt(value) / 100;
|
|
if (!isNaN(numValue)) {
|
|
if (numValue < 1) {
|
|
new import_obsidian2.Notice(t("EASY_BONUS_MIN_WARNING"));
|
|
text.setValue(
|
|
(this.plugin.data.settings.easyBonus * 100).toString()
|
|
);
|
|
return;
|
|
}
|
|
this.plugin.data.settings.easyBonus = numValue;
|
|
await this.plugin.savePluginData();
|
|
} else {
|
|
new import_obsidian2.Notice(t("VALID_NUMBER_WARNING"));
|
|
}
|
|
});
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.easyBonus = DEFAULT_SETTINGS.easyBonus;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
new import_obsidian2.Setting(containerEl).setName(t("MAX_INTERVAL")).setDesc(t("MAX_INTERVAL_DESC")).addText(
|
|
(text) => text.setValue(this.plugin.data.settings.maximumInterval.toString()).onChange((value) => {
|
|
applySettingsUpdate(async () => {
|
|
const numValue = Number.parseInt(value);
|
|
if (!isNaN(numValue)) {
|
|
if (numValue < 1) {
|
|
new import_obsidian2.Notice(t("MAX_INTERVAL_MIN_WARNING"));
|
|
text.setValue(
|
|
this.plugin.data.settings.maximumInterval.toString()
|
|
);
|
|
return;
|
|
}
|
|
this.plugin.data.settings.maximumInterval = numValue;
|
|
await this.plugin.savePluginData();
|
|
} else {
|
|
new import_obsidian2.Notice(t("VALID_NUMBER_WARNING"));
|
|
}
|
|
});
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.maximumInterval = DEFAULT_SETTINGS.maximumInterval;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
new import_obsidian2.Setting(containerEl).setName(t("MAX_LINK_CONTRIB")).setDesc(t("MAX_LINK_CONTRIB_DESC")).addSlider(
|
|
(slider) => slider.setLimits(0, 100, 1).setValue(this.plugin.data.settings.maxLinkFactor * 100).setDynamicTooltip().onChange(async (value) => {
|
|
this.plugin.data.settings.maxLinkFactor = value / 100;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
).addExtraButton((button) => {
|
|
button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => {
|
|
this.plugin.data.settings.maxLinkFactor = DEFAULT_SETTINGS.maxLinkFactor;
|
|
await this.plugin.savePluginData();
|
|
this.display();
|
|
});
|
|
});
|
|
containerEl.createEl("h3", { text: `${t("LOGGING")}` });
|
|
new import_obsidian2.Setting(containerEl).setName(t("DISPLAY_DEBUG_INFO")).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.data.settings.showDebugMessages).onChange(async (value) => {
|
|
this.plugin.data.settings.showDebugMessages = value;
|
|
await this.plugin.savePluginData();
|
|
})
|
|
);
|
|
}
|
|
};
|
|
|
|
// src/gui/flashcard-modal.tsx
|
|
var import_obsidian5 = require("obsidian");
|
|
var import_vhtml = __toESM(require_vhtml());
|
|
|
|
// src/scheduling.ts
|
|
function schedule(response, interval, ease, delayBeforeReview, settingsObj, dueDates) {
|
|
delayBeforeReview = Math.max(0, Math.floor(delayBeforeReview / (24 * 3600 * 1e3)));
|
|
if (response === 0 /* Easy */) {
|
|
ease += 20;
|
|
interval = (interval + delayBeforeReview) * ease / 100;
|
|
interval *= settingsObj.easyBonus;
|
|
} else if (response === 1 /* Good */) {
|
|
interval = (interval + delayBeforeReview / 2) * ease / 100;
|
|
} else if (response === 2 /* Hard */) {
|
|
ease = Math.max(130, ease - 20);
|
|
interval = Math.max(
|
|
1,
|
|
(interval + delayBeforeReview / 4) * settingsObj.lapsesIntervalChange
|
|
);
|
|
}
|
|
if (dueDates !== void 0) {
|
|
interval = Math.round(interval);
|
|
if (!Object.prototype.hasOwnProperty.call(dueDates, interval)) {
|
|
dueDates[interval] = 0;
|
|
} else {
|
|
if (interval > 4) {
|
|
let fuzz = 0;
|
|
if (interval < 7)
|
|
fuzz = 1;
|
|
else if (interval < 30)
|
|
fuzz = Math.max(2, Math.floor(interval * 0.15));
|
|
else
|
|
fuzz = Math.max(4, Math.floor(interval * 0.05));
|
|
const originalInterval = interval;
|
|
outer:
|
|
for (let i = 1; i <= fuzz; i++) {
|
|
for (const ivl of [originalInterval - i, originalInterval + i]) {
|
|
if (!Object.prototype.hasOwnProperty.call(dueDates, ivl)) {
|
|
dueDates[ivl] = 0;
|
|
interval = ivl;
|
|
break outer;
|
|
}
|
|
if (dueDates[ivl] < dueDates[interval])
|
|
interval = ivl;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
dueDates[interval]++;
|
|
}
|
|
interval = Math.min(interval, settingsObj.maximumInterval);
|
|
return { interval: Math.round(interval * 10) / 10, ease };
|
|
}
|
|
function textInterval(interval, isMobile) {
|
|
if (interval === void 0) {
|
|
return t("NEW");
|
|
}
|
|
const m = Math.round(interval / 3.04375) / 10, y = Math.round(interval / 36.525) / 10;
|
|
if (isMobile) {
|
|
if (m < 1)
|
|
return t("DAYS_STR_IVL_MOBILE", { interval });
|
|
else if (y < 1)
|
|
return t("MONTHS_STR_IVL_MOBILE", { interval: m });
|
|
else
|
|
return t("YEARS_STR_IVL_MOBILE", { interval: y });
|
|
} else {
|
|
if (m < 1)
|
|
return t("DAYS_STR_IVL", { interval });
|
|
else if (y < 1)
|
|
return t("MONTHS_STR_IVL", { interval: m });
|
|
else
|
|
return t("YEARS_STR_IVL", { interval: y });
|
|
}
|
|
}
|
|
|
|
// src/constants.ts
|
|
var SCHEDULING_INFO_REGEX = /^---\r?\n((?:.*\r?\n)*)sr-due: (.+)\r?\nsr-interval: (\d+)\r?\nsr-ease: (\d+)\r?\n((?:.*\r?\n)?)---/;
|
|
var YAML_FRONT_MATTER_REGEX = /^---\r?\n((?:.*\r?\n)*?)---/;
|
|
var MULTI_SCHEDULING_EXTRACTOR = /!([\d-]+),(\d+),(\d+)/gm;
|
|
var LEGACY_SCHEDULING_EXTRACTOR = /<!--SR:([\d-]+),(\d+),(\d+)-->/gm;
|
|
var OBSIDIAN_TAG_AT_STARTOFLINE_REGEX = /^#[^\s#]+/gi;
|
|
var PREFERRED_DATE_FORMAT = "YYYY-MM-DD";
|
|
var ALLOWED_DATE_FORMATS = [PREFERRED_DATE_FORMAT, "DD-MM-YYYY", "ddd MMM DD YYYY"];
|
|
var IMAGE_FORMATS = [
|
|
"jpg",
|
|
"jpeg",
|
|
"gif",
|
|
"png",
|
|
"svg",
|
|
"webp",
|
|
"apng",
|
|
"avif",
|
|
"jfif",
|
|
"pjpeg",
|
|
"pjp",
|
|
"bmp"
|
|
];
|
|
var AUDIO_FORMATS = ["mp3", "webm", "m4a", "wav", "ogg"];
|
|
var VIDEO_FORMATS = ["mp4", "mkv", "avi", "mov"];
|
|
var COLLAPSE_ICON = '<svg viewBox="0 0 100 100" width="8" height="8" class="right-triangle"><path fill="currentColor" stroke="currentColor" d="M94.9,20.8c-1.4-2.5-4.1-4.1-7.1-4.1H12.2c-3,0-5.7,1.6-7.1,4.1c-1.3,2.4-1.2,5.2,0.2,7.6L43.1,88c1.5,2.3,4,3.7,6.9,3.7 s5.4-1.4,6.9-3.7l37.8-59.6C96.1,26,96.2,23.2,94.9,20.8L94.9,20.8z"></path></svg>';
|
|
var TICKS_PER_DAY = 24 * 3600 * 1e3;
|
|
var SR_HTML_COMMENT_BEGIN = "<!--SR:";
|
|
var SR_HTML_COMMENT_END = "-->";
|
|
|
|
// src/TopicPath.ts
|
|
var TopicPath = class _TopicPath {
|
|
constructor(path) {
|
|
if (path == null)
|
|
throw "null path";
|
|
if (path.some((str) => str.includes("/")))
|
|
throw "path entries must not contain '/'";
|
|
this.path = path;
|
|
}
|
|
get hasPath() {
|
|
return this.path.length > 0;
|
|
}
|
|
get isEmptyPath() {
|
|
return !this.hasPath;
|
|
}
|
|
static get emptyPath() {
|
|
return new _TopicPath([]);
|
|
}
|
|
shift() {
|
|
if (this.isEmptyPath)
|
|
throw "can't shift an empty path";
|
|
return this.path.shift();
|
|
}
|
|
clone() {
|
|
return new _TopicPath([...this.path]);
|
|
}
|
|
formatAsTag() {
|
|
if (this.isEmptyPath)
|
|
throw "Empty path";
|
|
const result = "#" + this.path.join("/");
|
|
return result;
|
|
}
|
|
static getTopicPathOfFile(noteFile, settings) {
|
|
let deckPath = [];
|
|
let result = _TopicPath.emptyPath;
|
|
if (settings.convertFoldersToDecks) {
|
|
deckPath = noteFile.path.split("/");
|
|
deckPath.pop();
|
|
if (deckPath.length != 0) {
|
|
result = new _TopicPath(deckPath);
|
|
}
|
|
} else {
|
|
const tagList = this.getTopicPathsFromTagList(noteFile.getAllTags());
|
|
outer:
|
|
for (const tagToReview of this.getTopicPathsFromTagList(
|
|
settings.flashcardTags
|
|
)) {
|
|
for (const tag of tagList) {
|
|
if (tagToReview.isSameOrAncestorOf(tag)) {
|
|
result = tag;
|
|
break outer;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
isSameOrAncestorOf(topicPath) {
|
|
if (this.isEmptyPath)
|
|
return topicPath.isEmptyPath;
|
|
if (this.path.length > topicPath.path.length)
|
|
return false;
|
|
for (let i = 0; i < this.path.length; i++) {
|
|
if (this.path[i] != topicPath.path[i])
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
static getTopicPathFromCardText(cardText) {
|
|
var _a;
|
|
const path = (_a = cardText.trimStart().match(OBSIDIAN_TAG_AT_STARTOFLINE_REGEX)) == null ? void 0 : _a.slice(-1)[0];
|
|
return (path == null ? void 0 : path.length) > 0 ? _TopicPath.getTopicPathFromTag(path) : null;
|
|
}
|
|
static getTopicPathsFromTagList(tagList) {
|
|
const result = [];
|
|
for (const tag of tagList) {
|
|
if (this.isValidTag(tag))
|
|
result.push(_TopicPath.getTopicPathFromTag(tag));
|
|
}
|
|
return result;
|
|
}
|
|
static isValidTag(tag) {
|
|
if (tag == null || tag.length == 0)
|
|
return false;
|
|
if (tag[0] != "#")
|
|
return false;
|
|
if (tag.length == 1)
|
|
return false;
|
|
return true;
|
|
}
|
|
static getTopicPathFromTag(tag) {
|
|
if (tag == null || tag.length == 0)
|
|
throw "Null/empty tag";
|
|
if (tag[0] != "#")
|
|
throw "Tag must start with #";
|
|
if (tag.length == 1)
|
|
throw "Invalid tag";
|
|
const path = tag.replace("#", "").split("/").filter((str) => str);
|
|
return new _TopicPath(path);
|
|
}
|
|
};
|
|
var TopicPathWithWs = class {
|
|
constructor(topicPath, preWhitespace, postWhitespace) {
|
|
if (!topicPath || topicPath.isEmptyPath)
|
|
throw "topicPath null";
|
|
this.topicPath = topicPath;
|
|
this.preWhitespace = preWhitespace;
|
|
this.postWhitespace = postWhitespace;
|
|
}
|
|
formatWithWs() {
|
|
return `${this.preWhitespace}${this.topicPath.formatAsTag()}${this.postWhitespace}`;
|
|
}
|
|
};
|
|
|
|
// src/FlashcardReviewSequencer.ts
|
|
var DeckStats = class {
|
|
constructor(dueCount, newCount, totalCount) {
|
|
this.dueCount = dueCount;
|
|
this.newCount = newCount;
|
|
this.totalCount = totalCount;
|
|
}
|
|
};
|
|
var FlashcardReviewSequencer = class {
|
|
constructor(reviewMode, cardSequencer, settings, cardScheduleCalculator, questionPostponementList) {
|
|
this.reviewMode = reviewMode;
|
|
this.cardSequencer = cardSequencer;
|
|
this.settings = settings;
|
|
this.cardScheduleCalculator = cardScheduleCalculator;
|
|
this.questionPostponementList = questionPostponementList;
|
|
}
|
|
get hasCurrentCard() {
|
|
return this.cardSequencer.currentCard != null;
|
|
}
|
|
get currentCard() {
|
|
return this.cardSequencer.currentCard;
|
|
}
|
|
get currentQuestion() {
|
|
var _a;
|
|
return (_a = this.currentCard) == null ? void 0 : _a.question;
|
|
}
|
|
get currentDeck() {
|
|
return this.cardSequencer.currentDeck;
|
|
}
|
|
get currentNote() {
|
|
return this.currentQuestion.note;
|
|
}
|
|
setDeckTree(originalDeckTree, remainingDeckTree) {
|
|
this._originalDeckTree = originalDeckTree;
|
|
this.remainingDeckTree = remainingDeckTree;
|
|
this.setCurrentDeck(TopicPath.emptyPath);
|
|
}
|
|
setCurrentDeck(topicPath) {
|
|
const deck = this.remainingDeckTree.getDeck(topicPath);
|
|
this.cardSequencer.setDeck(deck);
|
|
this.cardSequencer.nextCard();
|
|
}
|
|
get originalDeckTree() {
|
|
return this._originalDeckTree;
|
|
}
|
|
getDeckStats(topicPath) {
|
|
const totalCount = this._originalDeckTree.getDeck(topicPath).getCardCount(2 /* All */, true);
|
|
const remainingDeck = this.remainingDeckTree.getDeck(topicPath);
|
|
const newCount = remainingDeck.getCardCount(0 /* NewCard */, true);
|
|
const dueCount = remainingDeck.getCardCount(1 /* DueCard */, true);
|
|
return new DeckStats(dueCount, newCount, totalCount);
|
|
}
|
|
skipCurrentCard() {
|
|
this.cardSequencer.deleteCurrentQuestion();
|
|
}
|
|
deleteCurrentCard() {
|
|
this.cardSequencer.deleteCurrentCard();
|
|
}
|
|
async processReview(response) {
|
|
switch (this.reviewMode) {
|
|
case 1 /* Review */:
|
|
await this.processReview_ReviewMode(response);
|
|
break;
|
|
case 0 /* Cram */:
|
|
await this.processReview_CramMode(response);
|
|
break;
|
|
}
|
|
}
|
|
async processReview_ReviewMode(response) {
|
|
this.currentCard.scheduleInfo = this.determineCardSchedule(response, this.currentCard);
|
|
await this.currentQuestion.writeQuestion(this.settings);
|
|
if (response == 3 /* Reset */) {
|
|
this.cardSequencer.moveCurrentCardToEndOfList();
|
|
this.cardSequencer.nextCard();
|
|
} else {
|
|
if (this.settings.burySiblingCards) {
|
|
await this.burySiblingCards();
|
|
this.cardSequencer.deleteCurrentQuestion();
|
|
} else {
|
|
this.deleteCurrentCard();
|
|
}
|
|
}
|
|
}
|
|
async burySiblingCards() {
|
|
const remaining = this.currentDeck.getQuestionCardCount(this.currentQuestion);
|
|
if (remaining > 1) {
|
|
this.questionPostponementList.add(this.currentQuestion);
|
|
await this.questionPostponementList.write();
|
|
}
|
|
}
|
|
async processReview_CramMode(response) {
|
|
if (response == 0 /* Easy */)
|
|
this.deleteCurrentCard();
|
|
else {
|
|
this.cardSequencer.moveCurrentCardToEndOfList();
|
|
this.cardSequencer.nextCard();
|
|
}
|
|
}
|
|
determineCardSchedule(response, card) {
|
|
let result;
|
|
if (response == 3 /* Reset */) {
|
|
result = this.cardScheduleCalculator.getResetCardSchedule();
|
|
} else {
|
|
if (card.hasSchedule) {
|
|
result = this.cardScheduleCalculator.calcUpdatedSchedule(
|
|
response,
|
|
card.scheduleInfo
|
|
);
|
|
} else {
|
|
const currentNote = card.question.note;
|
|
result = this.cardScheduleCalculator.getNewCardSchedule(
|
|
response,
|
|
currentNote.filePath
|
|
);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
async updateCurrentQuestionText(text) {
|
|
const q = this.currentQuestion.questionText;
|
|
q.actualQuestion = text;
|
|
await this.currentQuestion.writeQuestion(this.settings);
|
|
}
|
|
};
|
|
|
|
// src/Deck.ts
|
|
var Deck2 = class _Deck {
|
|
constructor(deckName, parent) {
|
|
this.deckName = deckName;
|
|
this.newFlashcards = [];
|
|
this.dueFlashcards = [];
|
|
this.subdecks = [];
|
|
this.parent = parent;
|
|
}
|
|
getCardCount(cardListType, includeSubdeckCounts) {
|
|
let result = 0;
|
|
if (cardListType == 0 /* NewCard */ || cardListType == 2 /* All */)
|
|
result += this.newFlashcards.length;
|
|
if (cardListType == 1 /* DueCard */ || cardListType == 2 /* All */)
|
|
result += this.dueFlashcards.length;
|
|
if (includeSubdeckCounts) {
|
|
for (const deck of this.subdecks) {
|
|
result += deck.getCardCount(cardListType, includeSubdeckCounts);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
//
|
|
// Returns a count of the number of this question's cards are present in this deck.
|
|
// (The returned value would be <= question.cards.length)
|
|
//
|
|
getQuestionCardCount(question) {
|
|
let result = 0;
|
|
result += this.getQuestionCardCountForCardListType(question, this.newFlashcards);
|
|
result += this.getQuestionCardCountForCardListType(question, this.dueFlashcards);
|
|
return result;
|
|
}
|
|
getQuestionCardCountForCardListType(question, cards) {
|
|
let result = 0;
|
|
for (let i = 0; i < cards.length; i++) {
|
|
if (Object.is(question, cards[i].question))
|
|
result++;
|
|
}
|
|
return result;
|
|
}
|
|
static get emptyDeck() {
|
|
return new _Deck("Root", null);
|
|
}
|
|
get isRootDeck() {
|
|
return this.parent == null;
|
|
}
|
|
getDeck(topicPath) {
|
|
return this._getOrCreateDeck(topicPath, false);
|
|
}
|
|
getOrCreateDeck(topicPath) {
|
|
return this._getOrCreateDeck(topicPath, true);
|
|
}
|
|
_getOrCreateDeck(topicPath, createAllowed) {
|
|
if (!topicPath.hasPath) {
|
|
return this;
|
|
}
|
|
const t2 = topicPath.clone();
|
|
const deckName = t2.shift();
|
|
for (const subdeck of this.subdecks) {
|
|
if (deckName === subdeck.deckName) {
|
|
return subdeck._getOrCreateDeck(t2, createAllowed);
|
|
}
|
|
}
|
|
let result = null;
|
|
if (createAllowed) {
|
|
const subdeck = new _Deck(
|
|
deckName,
|
|
this
|
|
/* parent */
|
|
);
|
|
this.subdecks.push(subdeck);
|
|
result = subdeck._getOrCreateDeck(t2, createAllowed);
|
|
}
|
|
return result;
|
|
}
|
|
getTopicPath() {
|
|
const list = [];
|
|
let deck = this;
|
|
while (!deck.isRootDeck) {
|
|
list.push(deck.deckName);
|
|
deck = deck.parent;
|
|
}
|
|
return new TopicPath(list.reverse());
|
|
}
|
|
getRootDeck() {
|
|
let deck = this;
|
|
while (!deck.isRootDeck) {
|
|
deck = deck.parent;
|
|
}
|
|
return deck;
|
|
}
|
|
getCard(index, cardListType) {
|
|
const cardList = this.getCardListForCardType(cardListType);
|
|
return cardList[index];
|
|
}
|
|
getCardListForCardType(cardListType) {
|
|
return cardListType == 1 /* DueCard */ ? this.dueFlashcards : this.newFlashcards;
|
|
}
|
|
appendCard(topicPath, cardObj) {
|
|
const deck = this.getOrCreateDeck(topicPath);
|
|
const cardList = deck.getCardListForCardType(cardObj.cardListType);
|
|
cardList.push(cardObj);
|
|
}
|
|
deleteCard(card) {
|
|
const cardList = this.getCardListForCardType(card.cardListType);
|
|
const idx = cardList.indexOf(card);
|
|
if (idx != -1)
|
|
cardList.splice(idx, 1);
|
|
}
|
|
deleteCardAtIndex(index, cardListType) {
|
|
const cardList = this.getCardListForCardType(cardListType);
|
|
cardList.splice(index, 1);
|
|
}
|
|
toDeckArray() {
|
|
const result = [];
|
|
result.push(this);
|
|
for (const subdeck of this.subdecks) {
|
|
result.push(...subdeck.toDeckArray());
|
|
}
|
|
return result;
|
|
}
|
|
sortSubdecksList() {
|
|
this.subdecks.sort((a, b) => {
|
|
if (a.deckName < b.deckName) {
|
|
return -1;
|
|
} else if (a.deckName > b.deckName) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
});
|
|
for (const deck of this.subdecks) {
|
|
deck.sortSubdecksList();
|
|
}
|
|
}
|
|
debugLogToConsole(desc = null) {
|
|
let str = desc != null ? `${desc}: ` : "";
|
|
console.log(str += this.toString());
|
|
}
|
|
toString(indent = 0) {
|
|
let result = "";
|
|
let indentStr = " ".repeat(indent * 4);
|
|
result += `${indentStr}${this.deckName}\r
|
|
`;
|
|
indentStr += " ";
|
|
for (let i = 0; i < this.newFlashcards.length; i++) {
|
|
const card = this.newFlashcards[i];
|
|
result += `${indentStr}New: ${i}: ${card.front}::${card.back}\r
|
|
`;
|
|
}
|
|
for (let i = 0; i < this.dueFlashcards.length; i++) {
|
|
const card = this.dueFlashcards[i];
|
|
const s = card.isDue ? "Due" : "Not due";
|
|
result += `${indentStr}${s}: ${i}: ${card.front}::${card.back}\r
|
|
`;
|
|
}
|
|
for (const subdeck of this.subdecks) {
|
|
result += subdeck.toString(indent + 1);
|
|
}
|
|
return result;
|
|
}
|
|
clone() {
|
|
return this.copyWithCardFilter(() => true);
|
|
}
|
|
copyWithCardFilter(predicate, parent = null) {
|
|
const result = new _Deck(this.deckName, parent);
|
|
result.newFlashcards = [...this.newFlashcards.filter((card) => predicate(card))];
|
|
result.dueFlashcards = [...this.dueFlashcards.filter((card) => predicate(card))];
|
|
for (const s of this.subdecks) {
|
|
const newParent = result;
|
|
const newDeck = s.copyWithCardFilter(predicate, newParent);
|
|
result.subdecks.push(newDeck);
|
|
}
|
|
return result;
|
|
}
|
|
static otherListType(cardListType) {
|
|
let result;
|
|
if (cardListType == 0 /* NewCard */)
|
|
result = 1 /* DueCard */;
|
|
else if (cardListType == 1 /* DueCard */)
|
|
result = 0 /* NewCard */;
|
|
else
|
|
throw "Invalid cardListType";
|
|
return result;
|
|
}
|
|
};
|
|
var DeckTreeFilter = class {
|
|
static filterForReviewableCards(reviewableDeckTree) {
|
|
return reviewableDeckTree.copyWithCardFilter((card) => !card.question.hasEditLaterTag);
|
|
}
|
|
static filterForRemainingCards(questionPostponementList, deckTree, reviewMode) {
|
|
return deckTree.copyWithCardFilter(
|
|
(card) => (reviewMode == 0 /* Cram */ || card.isNew || card.isDue) && !questionPostponementList.includes(card.question)
|
|
);
|
|
}
|
|
};
|
|
|
|
// src/util/utils.ts
|
|
var import_moment = __toESM(require_moment());
|
|
function getTypedObjectEntries(obj) {
|
|
return Object.entries(obj);
|
|
}
|
|
var getKeysPreserveType = Object.keys;
|
|
function literalStringReplace(text, searchStr, replacementStr) {
|
|
let result = text;
|
|
const startIdx = text.indexOf(searchStr);
|
|
if (startIdx >= 0) {
|
|
const startStr = text.substring(0, startIdx);
|
|
const endIdx = startIdx + searchStr.length;
|
|
const endStr = text.substring(endIdx);
|
|
result = startStr + replacementStr + endStr;
|
|
}
|
|
return result;
|
|
}
|
|
function cyrb53(str, seed = 0) {
|
|
let h12 = 3735928559 ^ seed, h22 = 1103547991 ^ seed;
|
|
for (let i = 0, ch; i < str.length; i++) {
|
|
ch = str.charCodeAt(i);
|
|
h12 = Math.imul(h12 ^ ch, 2654435761);
|
|
h22 = Math.imul(h22 ^ ch, 1597334677);
|
|
}
|
|
h12 = Math.imul(h12 ^ h12 >>> 16, 2246822507) ^ Math.imul(h22 ^ h22 >>> 13, 3266489909);
|
|
h22 = Math.imul(h22 ^ h22 >>> 16, 2246822507) ^ Math.imul(h12 ^ h12 >>> 13, 3266489909);
|
|
return (4294967296 * (2097151 & h22) + (h12 >>> 0)).toString(16);
|
|
}
|
|
function formatDate_YYYY_MM_DD(ticks) {
|
|
return ticks.format(PREFERRED_DATE_FORMAT);
|
|
}
|
|
function splitTextIntoLineArray(text) {
|
|
return text.replaceAll("\r\n", "\n").split("\n");
|
|
}
|
|
function stringTrimStart(str) {
|
|
const trimmed = str.trimStart();
|
|
const wsCount = str.length - trimmed.length;
|
|
const ws = str.substring(0, wsCount);
|
|
return [ws, trimmed];
|
|
}
|
|
|
|
// src/util/DateProvider.ts
|
|
var import_moment2 = __toESM(require_moment());
|
|
var LiveDateProvider = class {
|
|
get today() {
|
|
return (0, import_moment2.default)().startOf("day");
|
|
}
|
|
};
|
|
var DateUtil = class {
|
|
static dateStrToMoment(str) {
|
|
return (0, import_moment2.default)(str, ALLOWED_DATE_FORMATS);
|
|
}
|
|
};
|
|
var globalDateProvider = new LiveDateProvider();
|
|
|
|
// src/CardSchedule.ts
|
|
var _CardScheduleInfo = class _CardScheduleInfo {
|
|
constructor(dueDate, interval, ease, delayBeforeReviewTicks) {
|
|
this.dueDate = dueDate;
|
|
this.interval = interval;
|
|
this.ease = ease;
|
|
this.delayBeforeReviewTicks = delayBeforeReviewTicks;
|
|
}
|
|
get delayBeforeReviewDaysInt() {
|
|
return Math.ceil(this.delayBeforeReviewTicks / TICKS_PER_DAY);
|
|
}
|
|
isDue() {
|
|
return this.dueDate.isSameOrBefore(globalDateProvider.today);
|
|
}
|
|
isDummyScheduleForNewCard() {
|
|
return this.formatDueDate() == _CardScheduleInfo.dummyDueDateForNewCard;
|
|
}
|
|
static getDummyScheduleForNewCard(settings) {
|
|
return _CardScheduleInfo.fromDueDateStr(
|
|
_CardScheduleInfo.dummyDueDateForNewCard,
|
|
_CardScheduleInfo.initialInterval,
|
|
settings.baseEase,
|
|
0
|
|
);
|
|
}
|
|
static fromDueDateStr(dueDateStr, interval, ease, delayBeforeReviewTicks) {
|
|
const dueDateTicks = DateUtil.dateStrToMoment(dueDateStr);
|
|
return new _CardScheduleInfo(dueDateTicks, interval, ease, delayBeforeReviewTicks);
|
|
}
|
|
static fromDueDateMoment(dueDateTicks, interval, ease, delayBeforeReviewTicks) {
|
|
return new _CardScheduleInfo(dueDateTicks, interval, ease, delayBeforeReviewTicks);
|
|
}
|
|
static get initialInterval() {
|
|
return 1;
|
|
}
|
|
formatDueDate() {
|
|
return formatDate_YYYY_MM_DD(this.dueDate);
|
|
}
|
|
formatSchedule() {
|
|
return `!${this.formatDueDate()},${this.interval},${this.ease}`;
|
|
}
|
|
};
|
|
// A question can have multiple cards. The schedule info for all sibling cards are formatted together
|
|
// in a single <!--SR: --> comment, such as:
|
|
// <!--SR:!2023-09-02,4,270!2023-09-02,5,270!2023-09-02,6,270!2023-09-02,7,270-->
|
|
//
|
|
// However, not all sibling cards may have been reviewed. Therefore we need a method of indicating that a particular card
|
|
// has not been reviewed, and should be considered "new"
|
|
// This is done by using this magic value for the date
|
|
_CardScheduleInfo.dummyDueDateForNewCard = "2000-01-01";
|
|
var CardScheduleInfo = _CardScheduleInfo;
|
|
var CardScheduleCalculator = class {
|
|
// Record<# of days in future, due count>
|
|
constructor(settings, noteEaseList) {
|
|
this.dueDatesFlashcards = {};
|
|
this.settings = settings;
|
|
this.noteEaseList = noteEaseList;
|
|
}
|
|
getResetCardSchedule() {
|
|
const interval = CardScheduleInfo.initialInterval;
|
|
const ease = this.settings.baseEase;
|
|
const dueDate = globalDateProvider.today.add(interval, "d");
|
|
const delayBeforeReview = 0;
|
|
return CardScheduleInfo.fromDueDateMoment(dueDate, interval, ease, delayBeforeReview);
|
|
}
|
|
getNewCardSchedule(response, notePath) {
|
|
let initial_ease = this.settings.baseEase;
|
|
if (this.noteEaseList.hasEaseForPath(notePath)) {
|
|
initial_ease = Math.round(this.noteEaseList.getEaseByPath(notePath));
|
|
}
|
|
const delayBeforeReview = 0;
|
|
const schedObj = schedule(
|
|
response,
|
|
CardScheduleInfo.initialInterval,
|
|
initial_ease,
|
|
delayBeforeReview,
|
|
this.settings,
|
|
this.dueDatesFlashcards
|
|
);
|
|
const interval = schedObj.interval;
|
|
const ease = schedObj.ease;
|
|
const dueDate = globalDateProvider.today.add(interval, "d");
|
|
return CardScheduleInfo.fromDueDateMoment(dueDate, interval, ease, delayBeforeReview);
|
|
}
|
|
calcUpdatedSchedule(response, cardSchedule) {
|
|
const schedObj = schedule(
|
|
response,
|
|
cardSchedule.interval,
|
|
cardSchedule.ease,
|
|
cardSchedule.delayBeforeReviewTicks,
|
|
this.settings,
|
|
this.dueDatesFlashcards
|
|
);
|
|
const interval = schedObj.interval;
|
|
const ease = schedObj.ease;
|
|
const dueDate = globalDateProvider.today.add(interval, "d");
|
|
const delayBeforeReview = 0;
|
|
return CardScheduleInfo.fromDueDateMoment(dueDate, interval, ease, delayBeforeReview);
|
|
}
|
|
};
|
|
var NoteCardScheduleParser = class {
|
|
static createCardScheduleInfoList(questionText) {
|
|
let scheduling = [...questionText.matchAll(MULTI_SCHEDULING_EXTRACTOR)];
|
|
if (scheduling.length === 0)
|
|
scheduling = [...questionText.matchAll(LEGACY_SCHEDULING_EXTRACTOR)];
|
|
const result = [];
|
|
for (let i = 0; i < scheduling.length; i++) {
|
|
const match = scheduling[i];
|
|
const dueDateStr = match[1];
|
|
const interval = parseInt(match[2]);
|
|
const ease = parseInt(match[3]);
|
|
const dueDate = DateUtil.dateStrToMoment(dueDateStr);
|
|
const delayBeforeReviewTicks = dueDate.valueOf() - globalDateProvider.today.valueOf();
|
|
const info = new CardScheduleInfo(
|
|
dueDate,
|
|
interval,
|
|
ease,
|
|
delayBeforeReviewTicks
|
|
);
|
|
result.push(info);
|
|
}
|
|
return result;
|
|
}
|
|
static removeCardScheduleInfo(questionText) {
|
|
return questionText.replace(/<!--SR:.+-->/gm, "");
|
|
}
|
|
};
|
|
|
|
// src/util/MultiLineTextFinder.ts
|
|
var MultiLineTextFinder = class _MultiLineTextFinder {
|
|
static findAndReplace(sourceText, searchText, replacementText) {
|
|
let result = null;
|
|
if (sourceText.includes(searchText)) {
|
|
result = literalStringReplace(sourceText, searchText, replacementText);
|
|
} else {
|
|
const sourceTextArray = splitTextIntoLineArray(sourceText);
|
|
const searchTextArray = splitTextIntoLineArray(searchText);
|
|
const lineNo = _MultiLineTextFinder.find(sourceTextArray, searchTextArray);
|
|
if (lineNo) {
|
|
const replacementTextArray = splitTextIntoLineArray(replacementText);
|
|
const linesToRemove = searchTextArray.length;
|
|
sourceTextArray.splice(lineNo, linesToRemove, ...replacementTextArray);
|
|
result = sourceTextArray.join("\n");
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
static find(sourceText, searchText) {
|
|
let result = null;
|
|
let searchIdx = 0;
|
|
const maxSearchIdx = searchText.length - 1;
|
|
for (let sourceIdx = 0; sourceIdx < sourceText.length; sourceIdx++) {
|
|
const sourceLine = sourceText[sourceIdx].trim();
|
|
const searchLine = searchText[searchIdx].trim();
|
|
if (searchLine == sourceLine) {
|
|
if (searchIdx == maxSearchIdx) {
|
|
result = sourceIdx - searchIdx;
|
|
break;
|
|
}
|
|
searchIdx++;
|
|
} else {
|
|
searchIdx = 0;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
|
|
// src/Question.ts
|
|
var QuestionText = class _QuestionText {
|
|
constructor(original, topicPathWithWs, actualQuestion) {
|
|
this.original = original;
|
|
this.topicPathWithWs = topicPathWithWs;
|
|
this.actualQuestion = actualQuestion;
|
|
this.textHash = cyrb53(this.formatForNote());
|
|
}
|
|
endsWithCodeBlock() {
|
|
return this.actualQuestion.endsWith("```");
|
|
}
|
|
static create(original, settings) {
|
|
const [topicPathWithWs, actualQuestion] = this.splitText(original, settings);
|
|
return new _QuestionText(original, topicPathWithWs, actualQuestion);
|
|
}
|
|
static splitText(original, settings) {
|
|
const originalWithoutSR = NoteCardScheduleParser.removeCardScheduleInfo(original);
|
|
let actualQuestion = originalWithoutSR.trimEnd();
|
|
let topicPathWithWs = null;
|
|
if (!settings.convertFoldersToDecks) {
|
|
const topicPath = TopicPath.getTopicPathFromCardText(originalWithoutSR);
|
|
if (topicPath == null ? void 0 : topicPath.hasPath) {
|
|
const [preTopicPathWs, cardText1] = stringTrimStart(originalWithoutSR);
|
|
const actualQuestionWithWs = cardText1.replaceAll(
|
|
OBSIDIAN_TAG_AT_STARTOFLINE_REGEX,
|
|
""
|
|
);
|
|
let postTopicPathWs;
|
|
[postTopicPathWs, actualQuestion] = stringTrimStart(actualQuestionWithWs);
|
|
topicPathWithWs = new TopicPathWithWs(topicPath, preTopicPathWs, postTopicPathWs);
|
|
}
|
|
}
|
|
return [topicPathWithWs, actualQuestion];
|
|
}
|
|
formatForNote() {
|
|
let result = "";
|
|
if (this.topicPathWithWs) {
|
|
result += this.topicPathWithWs.formatWithWs();
|
|
}
|
|
result += this.actualQuestion;
|
|
return result;
|
|
}
|
|
};
|
|
var Question = class _Question {
|
|
constructor(init) {
|
|
Object.assign(this, init);
|
|
}
|
|
getHtmlCommentSeparator(settings) {
|
|
let sep = settings.cardCommentOnSameLine ? " " : "\n";
|
|
if (this.questionText.endsWithCodeBlock() && sep !== "\n") {
|
|
sep = "\n";
|
|
}
|
|
return sep;
|
|
}
|
|
setCardList(cards) {
|
|
this.cards = cards;
|
|
this.cards.forEach((card) => card.question = this);
|
|
}
|
|
formatScheduleAsHtmlComment(settings) {
|
|
let result = SR_HTML_COMMENT_BEGIN;
|
|
for (let i = 0; i < this.cards.length; i++) {
|
|
const card = this.cards[i];
|
|
const schedule2 = card.hasSchedule ? card.scheduleInfo : CardScheduleInfo.getDummyScheduleForNewCard(settings);
|
|
result += schedule2.formatSchedule();
|
|
}
|
|
result += SR_HTML_COMMENT_END;
|
|
return result;
|
|
}
|
|
formatForNote(settings) {
|
|
let result = this.questionText.formatForNote();
|
|
if (this.cards.some((card) => card.hasSchedule)) {
|
|
result = result.trimEnd() + this.getHtmlCommentSeparator(settings) + this.formatScheduleAsHtmlComment(settings);
|
|
}
|
|
return result;
|
|
}
|
|
updateQuestionText(noteText, settings) {
|
|
const originalText = this.questionText.original;
|
|
const replacementText = this.formatForNote(settings);
|
|
let newText = MultiLineTextFinder.findAndReplace(noteText, originalText, replacementText);
|
|
if (newText) {
|
|
this.questionText = QuestionText.create(replacementText, settings);
|
|
} else {
|
|
console.error(
|
|
`updateQuestionText: Text not found: ${originalText.substring(
|
|
0,
|
|
100
|
|
)} in note: ${noteText.substring(0, 100)}`
|
|
);
|
|
newText = noteText;
|
|
}
|
|
return newText;
|
|
}
|
|
async writeQuestion(settings) {
|
|
const fileText = await this.note.file.read();
|
|
const newText = this.updateQuestionText(fileText, settings);
|
|
await this.note.file.write(newText);
|
|
this.hasChanged = false;
|
|
}
|
|
static Create(settings, questionType, noteTopicPath, originalText, lineNo, context) {
|
|
const hasEditLaterTag = originalText.includes(settings.editLaterTag);
|
|
const questionText = QuestionText.create(originalText, settings);
|
|
let topicPath = noteTopicPath;
|
|
if (questionText.topicPathWithWs) {
|
|
topicPath = questionText.topicPathWithWs.topicPath;
|
|
}
|
|
const result = new _Question({
|
|
questionType,
|
|
topicPath,
|
|
questionText,
|
|
lineNo,
|
|
hasEditLaterTag,
|
|
questionContext: context,
|
|
cards: null,
|
|
hasChanged: false
|
|
});
|
|
return result;
|
|
}
|
|
};
|
|
|
|
// src/gui/flashcards-edit-modal.ts
|
|
var import_obsidian3 = require("obsidian");
|
|
var FlashcardEditModal = class _FlashcardEditModal extends import_obsidian3.Modal {
|
|
constructor(app2, existingText) {
|
|
super(app2);
|
|
this.didSubmit = false;
|
|
this.submitClickCallback = (_) => this.submit();
|
|
this.cancelClickCallback = (_) => this.cancel();
|
|
this.submitEnterCallback = (evt) => {
|
|
if ((evt.ctrlKey || evt.metaKey) && evt.key === "Enter") {
|
|
evt.preventDefault();
|
|
this.submit();
|
|
}
|
|
};
|
|
this.titleEl.setText(t("EDIT_CARD"));
|
|
this.titleEl.addClass("sr-centered");
|
|
this.modalText = existingText;
|
|
this.input = existingText;
|
|
this.waitForClose = new Promise((resolve2, reject) => {
|
|
this.resolvePromise = resolve2;
|
|
this.rejectPromise = reject;
|
|
});
|
|
this.display();
|
|
this.open();
|
|
}
|
|
static Prompt(app2, placeholder) {
|
|
const newPromptModal = new _FlashcardEditModal(app2, placeholder);
|
|
return newPromptModal.waitForClose;
|
|
}
|
|
display() {
|
|
this.contentEl.empty();
|
|
this.modalEl.addClass("sr-flashcard-input-modal");
|
|
const mainContentContainer = this.contentEl.createDiv();
|
|
mainContentContainer.addClass("sr-flashcard-input-area");
|
|
this.inputComponent = this.createInputField(mainContentContainer, this.modalText);
|
|
this.createButtonBar(mainContentContainer);
|
|
}
|
|
createButton(container, text, callback2) {
|
|
const btn = new import_obsidian3.ButtonComponent(container);
|
|
btn.setButtonText(text).onClick(callback2);
|
|
return btn;
|
|
}
|
|
createButtonBar(mainContentContainer) {
|
|
const buttonBarContainer = mainContentContainer.createDiv();
|
|
buttonBarContainer.addClass("sr-flashcard-edit-button-bar");
|
|
this.createButton(
|
|
buttonBarContainer,
|
|
t("SAVE"),
|
|
this.submitClickCallback
|
|
).setCta().buttonEl.style.marginRight = "0";
|
|
this.createButton(buttonBarContainer, t("CANCEL"), this.cancelClickCallback);
|
|
}
|
|
createInputField(container, value) {
|
|
const textComponent = new import_obsidian3.TextAreaComponent(container);
|
|
textComponent.inputEl.style.width = "100%";
|
|
textComponent.setValue(value != null ? value : "").inputEl.addEventListener("keydown", this.submitEnterCallback);
|
|
return textComponent;
|
|
}
|
|
submit() {
|
|
this.didSubmit = true;
|
|
this.input = this.inputComponent.getValue();
|
|
this.close();
|
|
}
|
|
cancel() {
|
|
this.close();
|
|
}
|
|
onOpen() {
|
|
super.onOpen();
|
|
this.inputComponent.inputEl.focus();
|
|
}
|
|
onClose() {
|
|
super.onClose();
|
|
this.resolveInput();
|
|
this.removeInputListener();
|
|
}
|
|
resolveInput() {
|
|
if (!this.didSubmit)
|
|
this.rejectPromise(t("NO_INPUT"));
|
|
else
|
|
this.resolvePromise(this.input);
|
|
}
|
|
removeInputListener() {
|
|
this.inputComponent.inputEl.removeEventListener("keydown", this.submitEnterCallback);
|
|
}
|
|
};
|
|
|
|
// src/util/RenderMarkdownWrapper.ts
|
|
var import_obsidian4 = require("obsidian");
|
|
var RenderMarkdownWrapper = class {
|
|
constructor(app2, plugin, notePath) {
|
|
this.app = app2;
|
|
this.notePath = notePath;
|
|
this.plugin = plugin;
|
|
}
|
|
// slightly modified version of the renderMarkdown function in
|
|
// https://github.com/mgmeyers/obsidian-kanban/blob/main/src/KanbanView.tsx
|
|
async renderMarkdownWrapper(markdownString, containerEl, recursiveDepth = 0) {
|
|
if (recursiveDepth > 4)
|
|
return;
|
|
import_obsidian4.MarkdownRenderer.renderMarkdown(markdownString, containerEl, this.notePath, this.plugin);
|
|
containerEl.findAll(".internal-embed").forEach((el) => {
|
|
const link2 = this.parseLink(el.getAttribute("src"));
|
|
if (!link2.target) {
|
|
el.innerText = link2.text;
|
|
} else if (link2.target instanceof import_obsidian4.TFile) {
|
|
if (link2.target.extension !== "md") {
|
|
this.embedMediaFile(el, link2.target);
|
|
} else {
|
|
el.innerText = "";
|
|
this.renderTransclude(el, link2, recursiveDepth);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
parseLink(src) {
|
|
const linkComponentsRegex = /^(?<file>[^#^]+)?(?:#(?!\^)(?<heading>.+)|#\^(?<blockId>.+)|#)?$/;
|
|
const matched = typeof src === "string" && src.match(linkComponentsRegex);
|
|
const file = matched.groups.file || this.notePath;
|
|
const target = this.plugin.app.metadataCache.getFirstLinkpathDest(file, this.notePath);
|
|
return {
|
|
text: matched[0],
|
|
file: matched.groups.file,
|
|
heading: matched.groups.heading,
|
|
blockId: matched.groups.blockId,
|
|
target
|
|
};
|
|
}
|
|
embedMediaFile(el, target) {
|
|
el.innerText = "";
|
|
if (IMAGE_FORMATS.includes(target.extension)) {
|
|
el.createEl(
|
|
"img",
|
|
{
|
|
attr: {
|
|
src: this.plugin.app.vault.getResourcePath(target)
|
|
}
|
|
},
|
|
(img) => {
|
|
if (el.hasAttribute("width"))
|
|
img.setAttribute("width", el.getAttribute("width"));
|
|
else
|
|
img.setAttribute("width", "100%");
|
|
if (el.hasAttribute("alt"))
|
|
img.setAttribute("alt", el.getAttribute("alt"));
|
|
el.addEventListener(
|
|
"click",
|
|
(ev) => ev.target.style.minWidth = ev.target.style.minWidth === "100%" ? null : "100%"
|
|
);
|
|
}
|
|
);
|
|
el.addClasses(["image-embed", "is-loaded"]);
|
|
} else if (AUDIO_FORMATS.includes(target.extension) || VIDEO_FORMATS.includes(target.extension)) {
|
|
el.createEl(
|
|
AUDIO_FORMATS.includes(target.extension) ? "audio" : "video",
|
|
{
|
|
attr: {
|
|
controls: "",
|
|
src: this.plugin.app.vault.getResourcePath(target)
|
|
}
|
|
},
|
|
(audio) => {
|
|
if (el.hasAttribute("alt"))
|
|
audio.setAttribute("alt", el.getAttribute("alt"));
|
|
}
|
|
);
|
|
el.addClasses(["media-embed", "is-loaded"]);
|
|
} else {
|
|
el.innerText = target.path;
|
|
}
|
|
}
|
|
async renderTransclude(el, link2, recursiveDepth) {
|
|
var _a, _b, _c, _d;
|
|
const cache = this.app.metadataCache.getCache(link2.target.path);
|
|
const text = await this.app.vault.cachedRead(link2.target);
|
|
let blockText;
|
|
if (link2.heading) {
|
|
const clean = (s) => s.replace(/[\W\s]/g, "");
|
|
const headingIndex = (_a = cache.headings) == null ? void 0 : _a.findIndex(
|
|
(h4) => clean(h4.heading) === clean(link2.heading)
|
|
);
|
|
const heading = cache.headings[headingIndex];
|
|
const startAt = heading.position.start.offset;
|
|
const endAt = ((_d = (_c = (_b = cache.headings.slice(headingIndex + 1).find((h4) => h4.level <= heading.level)) == null ? void 0 : _b.position) == null ? void 0 : _c.start) == null ? void 0 : _d.offset) || text.length;
|
|
blockText = text.substring(startAt, endAt);
|
|
} else if (link2.blockId) {
|
|
const block = cache.blocks[link2.blockId];
|
|
const startAt = block.position.start.offset;
|
|
const endAt = block.position.end.offset;
|
|
blockText = text.substring(startAt, endAt);
|
|
} else {
|
|
blockText = text;
|
|
}
|
|
this.renderMarkdownWrapper(blockText, el, recursiveDepth + 1);
|
|
}
|
|
};
|
|
|
|
// src/gui/flashcard-modal.tsx
|
|
var FlashcardModal = class extends import_obsidian5.Modal {
|
|
get currentCard() {
|
|
return this.reviewSequencer.currentCard;
|
|
}
|
|
get currentQuestion() {
|
|
return this.reviewSequencer.currentQuestion;
|
|
}
|
|
get currentNote() {
|
|
return this.reviewSequencer.currentNote;
|
|
}
|
|
constructor(app2, plugin, settings, reviewSequencer, reviewMode) {
|
|
super(app2);
|
|
this.plugin = plugin;
|
|
this.settings = settings;
|
|
this.reviewSequencer = reviewSequencer;
|
|
this.reviewMode = reviewMode;
|
|
this.titleEl.setText(t("DECKS"));
|
|
this.titleEl.addClass("sr-centered");
|
|
if (import_obsidian5.Platform.isMobile) {
|
|
this.contentEl.style.display = "block";
|
|
}
|
|
this.modalEl.style.height = this.settings.flashcardHeightPercentage + "%";
|
|
this.modalEl.style.width = this.settings.flashcardWidthPercentage + "%";
|
|
this.contentEl.style.position = "relative";
|
|
this.contentEl.style.height = "92%";
|
|
this.contentEl.addClass("sr-modal-content");
|
|
document.body.onkeydown = (e) => {
|
|
if (document.activeElement.nodeName !== "TEXTAREA" && this.mode !== 0 /* DecksList */) {
|
|
const consume = () => {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
};
|
|
if (this.mode !== 3 /* Closed */ && e.code === "KeyS") {
|
|
this.skipCurrentCard();
|
|
consume();
|
|
} else if (this.mode === 1 /* Front */ && (e.code === "Space" || e.code === "Enter" || e.code === "NumpadEnter")) {
|
|
this.showAnswer();
|
|
consume();
|
|
} else if (this.mode === 2 /* Back */) {
|
|
if (e.code === "Numpad1" || e.code === "Digit1") {
|
|
this.processReview(2 /* Hard */);
|
|
consume();
|
|
} else if (e.code === "Numpad2" || e.code === "Digit2" || e.code === "Space") {
|
|
this.processReview(1 /* Good */);
|
|
consume();
|
|
} else if (e.code === "Numpad3" || e.code === "Digit3") {
|
|
this.processReview(0 /* Easy */);
|
|
consume();
|
|
} else if (e.code === "Numpad0" || e.code === "Digit0") {
|
|
this.processReview(3 /* Reset */);
|
|
consume();
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
onOpen() {
|
|
this.renderDecksList();
|
|
}
|
|
onClose() {
|
|
this.mode = 3 /* Closed */;
|
|
}
|
|
renderDecksList() {
|
|
this.mode = 0 /* DecksList */;
|
|
const stats = this.reviewSequencer.getDeckStats(TopicPath.emptyPath);
|
|
this.titleEl.setText(t("DECKS"));
|
|
this.titleEl.innerHTML += /* @__PURE__ */ (0, import_vhtml.default)("p", { style: "margin:0px;line-height:12px;" }, /* @__PURE__ */ (0, import_vhtml.default)(
|
|
"span",
|
|
{
|
|
style: "background-color:#4caf50;color:#ffffff;",
|
|
"aria-label": t("DUE_CARDS"),
|
|
class: "tag-pane-tag-count tree-item-flair sr-deck-counts"
|
|
},
|
|
stats.dueCount.toString()
|
|
), /* @__PURE__ */ (0, import_vhtml.default)(
|
|
"span",
|
|
{
|
|
style: "background-color:#2196f3;",
|
|
"aria-label": t("NEW_CARDS"),
|
|
class: "tag-pane-tag-count tree-item-flair sr-deck-counts"
|
|
},
|
|
stats.newCount.toString()
|
|
), /* @__PURE__ */ (0, import_vhtml.default)(
|
|
"span",
|
|
{
|
|
style: "background-color:#ff7043;",
|
|
"aria-label": t("TOTAL_CARDS"),
|
|
class: "tag-pane-tag-count tree-item-flair sr-deck-counts"
|
|
},
|
|
stats.totalCount.toString()
|
|
));
|
|
this.contentEl.empty();
|
|
this.contentEl.setAttribute("id", "sr-flashcard-view");
|
|
for (const deck of this.reviewSequencer.originalDeckTree.subdecks) {
|
|
this.renderDeck(deck, this.contentEl, this);
|
|
}
|
|
}
|
|
renderDeck(deck, containerEl, modal) {
|
|
const deckView = containerEl.createDiv("tree-item");
|
|
const deckViewSelf = deckView.createDiv(
|
|
"tree-item-self tag-pane-tag is-clickable"
|
|
);
|
|
const shouldBeInitiallyExpanded = modal.settings.initiallyExpandAllSubdecksInTree;
|
|
let collapsed = !shouldBeInitiallyExpanded;
|
|
let collapseIconEl = null;
|
|
if (deck.subdecks.length > 0) {
|
|
collapseIconEl = deckViewSelf.createDiv("tree-item-icon collapse-icon");
|
|
collapseIconEl.innerHTML = COLLAPSE_ICON;
|
|
collapseIconEl.childNodes[0].style.transform = collapsed ? "rotate(-90deg)" : "";
|
|
}
|
|
const deckViewInner = deckViewSelf.createDiv("tree-item-inner");
|
|
const deckViewInnerText = deckViewInner.createDiv("tag-pane-tag-text");
|
|
deckViewInnerText.innerHTML += /* @__PURE__ */ (0, import_vhtml.default)("span", { class: "tag-pane-tag-self" }, deck.deckName);
|
|
const deckViewOuter = deckViewSelf.createDiv("tree-item-flair-outer");
|
|
const deckStats = this.reviewSequencer.getDeckStats(deck.getTopicPath());
|
|
deckViewOuter.innerHTML += /* @__PURE__ */ (0, import_vhtml.default)("span", null, /* @__PURE__ */ (0, import_vhtml.default)(
|
|
"span",
|
|
{
|
|
style: "background-color:#4caf50;",
|
|
class: "tag-pane-tag-count tree-item-flair sr-deck-counts"
|
|
},
|
|
deckStats.dueCount.toString()
|
|
), /* @__PURE__ */ (0, import_vhtml.default)(
|
|
"span",
|
|
{
|
|
style: "background-color:#2196f3;",
|
|
class: "tag-pane-tag-count tree-item-flair sr-deck-counts"
|
|
},
|
|
deckStats.newCount.toString()
|
|
), /* @__PURE__ */ (0, import_vhtml.default)(
|
|
"span",
|
|
{
|
|
style: "background-color:#ff7043;",
|
|
class: "tag-pane-tag-count tree-item-flair sr-deck-counts"
|
|
},
|
|
deckStats.totalCount.toString()
|
|
));
|
|
const deckViewChildren = deckView.createDiv("tree-item-children");
|
|
deckViewChildren.style.display = collapsed ? "none" : "block";
|
|
if (deck.subdecks.length > 0) {
|
|
collapseIconEl.addEventListener("click", (e) => {
|
|
if (collapsed) {
|
|
collapseIconEl.childNodes[0].style.transform = "";
|
|
deckViewChildren.style.display = "block";
|
|
} else {
|
|
collapseIconEl.childNodes[0].style.transform = "rotate(-90deg)";
|
|
deckViewChildren.style.display = "none";
|
|
}
|
|
e.stopPropagation();
|
|
collapsed = !collapsed;
|
|
});
|
|
}
|
|
deckViewSelf.addEventListener("click", () => {
|
|
this.startReviewOfDeck(deck);
|
|
});
|
|
for (const subdeck of deck.subdecks) {
|
|
this.renderDeck(subdeck, deckViewChildren, modal);
|
|
}
|
|
}
|
|
startReviewOfDeck(deck) {
|
|
this.reviewSequencer.setCurrentDeck(deck.getTopicPath());
|
|
if (this.reviewSequencer.hasCurrentCard) {
|
|
this.setupCardsView();
|
|
this.showCurrentCard();
|
|
} else
|
|
this.renderDecksList();
|
|
}
|
|
setupCardsView() {
|
|
this.contentEl.empty();
|
|
this.flashCardMenu = this.contentEl.createDiv("sr-flashcard-menu");
|
|
this.createBackButton();
|
|
this.createEditButton();
|
|
this.createResetButton();
|
|
this.createCardInfoButton();
|
|
this.createSkipButton();
|
|
if (this.settings.showContextInCards) {
|
|
this.contextView = this.contentEl.createDiv();
|
|
this.contextView.setAttribute("id", "sr-context");
|
|
}
|
|
this.flashcardView = this.contentEl.createDiv("div");
|
|
this.flashcardView.setAttribute("id", "sr-flashcard-view");
|
|
this.createResponseButtons();
|
|
this.createShowAnswerButton();
|
|
if (this.reviewMode == 0 /* Cram */) {
|
|
this.goodBtn.style.display = "none";
|
|
this.responseDiv.addClass("sr-ignorestats-response");
|
|
this.easyBtn.addClass("sr-ignorestats-btn");
|
|
this.hardBtn.addClass("sr-ignorestats-btn");
|
|
}
|
|
}
|
|
createShowAnswerButton() {
|
|
this.answerBtn = this.contentEl.createDiv();
|
|
this.answerBtn.setAttribute("id", "sr-show-answer");
|
|
this.answerBtn.setText(t("SHOW_ANSWER"));
|
|
this.answerBtn.addEventListener("click", () => {
|
|
this.showAnswer();
|
|
});
|
|
}
|
|
createResponseButtons() {
|
|
this.responseDiv = this.contentEl.createDiv("sr-flashcard-response");
|
|
this.hardBtn = document.createElement("button");
|
|
this.hardBtn.setAttribute("id", "sr-hard-btn");
|
|
this.hardBtn.setText(this.settings.flashcardHardText);
|
|
this.hardBtn.addEventListener("click", () => {
|
|
this.processReview(2 /* Hard */);
|
|
});
|
|
this.responseDiv.appendChild(this.hardBtn);
|
|
this.goodBtn = document.createElement("button");
|
|
this.goodBtn.setAttribute("id", "sr-good-btn");
|
|
this.goodBtn.setText(this.settings.flashcardGoodText);
|
|
this.goodBtn.addEventListener("click", () => {
|
|
this.processReview(1 /* Good */);
|
|
});
|
|
this.responseDiv.appendChild(this.goodBtn);
|
|
this.easyBtn = document.createElement("button");
|
|
this.easyBtn.setAttribute("id", "sr-easy-btn");
|
|
this.easyBtn.setText(this.settings.flashcardEasyText);
|
|
this.easyBtn.addEventListener("click", () => {
|
|
this.processReview(0 /* Easy */);
|
|
});
|
|
this.responseDiv.appendChild(this.easyBtn);
|
|
this.responseDiv.style.display = "none";
|
|
}
|
|
createSkipButton() {
|
|
const skipButton = this.flashCardMenu.createEl("button");
|
|
skipButton.addClass("sr-flashcard-menu-item");
|
|
(0, import_obsidian5.setIcon)(skipButton, "chevrons-right");
|
|
skipButton.setAttribute("aria-label", t("SKIP"));
|
|
skipButton.addEventListener("click", () => {
|
|
this.skipCurrentCard();
|
|
});
|
|
}
|
|
createCardInfoButton() {
|
|
const cardInfo = this.flashCardMenu.createEl("button");
|
|
cardInfo.addClass("sr-flashcard-menu-item");
|
|
(0, import_obsidian5.setIcon)(cardInfo, "info");
|
|
cardInfo.setAttribute("aria-label", "View Card Info");
|
|
cardInfo.addEventListener("click", async () => {
|
|
this.displayCurrentCardInfoNotice();
|
|
});
|
|
}
|
|
displayCurrentCardInfoNotice() {
|
|
var _a;
|
|
const schedule2 = this.currentCard.scheduleInfo;
|
|
const currentEaseStr = t("CURRENT_EASE_HELP_TEXT") + ((_a = schedule2 == null ? void 0 : schedule2.ease) != null ? _a : t("NEW"));
|
|
const currentIntervalStr = t("CURRENT_INTERVAL_HELP_TEXT") + textInterval(schedule2 == null ? void 0 : schedule2.interval, false);
|
|
const generatedFromStr = t("CARD_GENERATED_FROM", {
|
|
notePath: this.currentQuestion.note.filePath
|
|
});
|
|
new import_obsidian5.Notice(currentEaseStr + "\n" + currentIntervalStr + "\n" + generatedFromStr);
|
|
}
|
|
createBackButton() {
|
|
const backButton = this.flashCardMenu.createEl("button");
|
|
backButton.addClass("sr-flashcard-menu-item");
|
|
(0, import_obsidian5.setIcon)(backButton, "arrow-left");
|
|
backButton.setAttribute("aria-label", t("BACK"));
|
|
backButton.addEventListener("click", () => {
|
|
this.renderDecksList();
|
|
});
|
|
}
|
|
createResetButton() {
|
|
this.resetButton = this.flashCardMenu.createEl("button");
|
|
this.resetButton.addClass("sr-flashcard-menu-item");
|
|
(0, import_obsidian5.setIcon)(this.resetButton, "refresh-cw");
|
|
this.resetButton.setAttribute("aria-label", t("RESET_CARD_PROGRESS"));
|
|
this.resetButton.addEventListener("click", () => {
|
|
this.processReview(3 /* Reset */);
|
|
});
|
|
}
|
|
createEditButton() {
|
|
this.editButton = this.flashCardMenu.createEl("button");
|
|
this.editButton.addClass("sr-flashcard-menu-item");
|
|
(0, import_obsidian5.setIcon)(this.editButton, "edit");
|
|
this.editButton.setAttribute("aria-label", t("EDIT_CARD"));
|
|
this.editButton.addEventListener("click", async () => {
|
|
this.doEditQuestionText();
|
|
});
|
|
}
|
|
async doEditQuestionText() {
|
|
const currentQ = this.reviewSequencer.currentQuestion;
|
|
const textPrompt = currentQ.questionText.actualQuestion;
|
|
const editModal = FlashcardEditModal.Prompt(this.app, textPrompt);
|
|
editModal.then(async (modifiedCardText) => {
|
|
this.reviewSequencer.updateCurrentQuestionText(modifiedCardText);
|
|
}).catch((reason) => console.log(reason));
|
|
}
|
|
showAnswer() {
|
|
this.mode = 2 /* Back */;
|
|
this.answerBtn.style.display = "none";
|
|
this.responseDiv.style.display = "grid";
|
|
if (this.currentCard.hasSchedule) {
|
|
this.resetButton.disabled = false;
|
|
}
|
|
if (this.currentQuestion.questionType !== 4 /* Cloze */) {
|
|
const hr = document.createElement("hr");
|
|
hr.setAttribute("id", "sr-hr-card-divide");
|
|
this.flashcardView.appendChild(hr);
|
|
} else {
|
|
this.flashcardView.empty();
|
|
}
|
|
const wrapper = new RenderMarkdownWrapper(
|
|
this.app,
|
|
this.plugin,
|
|
this.currentNote.filePath
|
|
);
|
|
wrapper.renderMarkdownWrapper(this.currentCard.back, this.flashcardView);
|
|
}
|
|
async processReview(response) {
|
|
await this.reviewSequencer.processReview(response);
|
|
await this.handleNextCard();
|
|
}
|
|
async skipCurrentCard() {
|
|
this.reviewSequencer.skipCurrentCard();
|
|
await this.handleNextCard();
|
|
}
|
|
async handleNextCard() {
|
|
if (this.currentCard != null)
|
|
await this.showCurrentCard();
|
|
else
|
|
this.renderDecksList();
|
|
}
|
|
async showCurrentCard() {
|
|
const deck = this.reviewSequencer.currentDeck;
|
|
this.responseDiv.style.display = "none";
|
|
this.resetButton.disabled = true;
|
|
this.titleEl.setText(`${deck.deckName}: ${deck.getCardCount(2 /* All */, true)}`);
|
|
this.answerBtn.style.display = "initial";
|
|
this.flashcardView.empty();
|
|
this.mode = 1 /* Front */;
|
|
const wrapper = new RenderMarkdownWrapper(
|
|
this.app,
|
|
this.plugin,
|
|
this.currentNote.filePath
|
|
);
|
|
await wrapper.renderMarkdownWrapper(this.currentCard.front, this.flashcardView);
|
|
if (this.reviewMode == 0 /* Cram */) {
|
|
this.hardBtn.setText(`${this.settings.flashcardHardText}`);
|
|
this.easyBtn.setText(`${this.settings.flashcardEasyText}`);
|
|
} else {
|
|
this.setupEaseButton(
|
|
this.hardBtn,
|
|
this.settings.flashcardHardText,
|
|
2 /* Hard */
|
|
);
|
|
this.setupEaseButton(
|
|
this.goodBtn,
|
|
this.settings.flashcardGoodText,
|
|
1 /* Good */
|
|
);
|
|
this.setupEaseButton(
|
|
this.easyBtn,
|
|
this.settings.flashcardEasyText,
|
|
0 /* Easy */
|
|
);
|
|
}
|
|
if (this.settings.showContextInCards)
|
|
this.contextView.setText(
|
|
this.formatQuestionContextText(this.currentQuestion.questionContext)
|
|
);
|
|
}
|
|
formatQuestionContextText(questionContext) {
|
|
const result = `${this.currentNote.file.basename} > ${questionContext.join(" > ")}`;
|
|
return result;
|
|
}
|
|
setupEaseButton(button, buttonName, reviewResponse) {
|
|
const schedule2 = this.reviewSequencer.determineCardSchedule(
|
|
reviewResponse,
|
|
this.currentCard
|
|
);
|
|
const interval = schedule2.interval;
|
|
if (import_obsidian5.Platform.isMobile) {
|
|
button.setText(textInterval(interval, true));
|
|
} else {
|
|
button.setText(`${buttonName} - ${textInterval(interval, false)}`);
|
|
}
|
|
}
|
|
};
|
|
|
|
// src/gui/stats-modal.tsx
|
|
var import_obsidian6 = require("obsidian");
|
|
var import_vhtml2 = __toESM(require_vhtml());
|
|
|
|
// node_modules/.pnpm/@kurkle+color@0.3.2/node_modules/@kurkle/color/dist/color.esm.js
|
|
function round(v) {
|
|
return v + 0.5 | 0;
|
|
}
|
|
var lim = (v, l, h4) => Math.max(Math.min(v, h4), l);
|
|
function p2b(v) {
|
|
return lim(round(v * 2.55), 0, 255);
|
|
}
|
|
function n2b(v) {
|
|
return lim(round(v * 255), 0, 255);
|
|
}
|
|
function b2n(v) {
|
|
return lim(round(v / 2.55) / 100, 0, 1);
|
|
}
|
|
function n2p(v) {
|
|
return lim(round(v * 100), 0, 100);
|
|
}
|
|
var map$1 = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15 };
|
|
var hex = [..."0123456789ABCDEF"];
|
|
var h1 = (b) => hex[b & 15];
|
|
var h2 = (b) => hex[(b & 240) >> 4] + hex[b & 15];
|
|
var eq = (b) => (b & 240) >> 4 === (b & 15);
|
|
var isShort = (v) => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);
|
|
function hexParse(str) {
|
|
var len = str.length;
|
|
var ret;
|
|
if (str[0] === "#") {
|
|
if (len === 4 || len === 5) {
|
|
ret = {
|
|
r: 255 & map$1[str[1]] * 17,
|
|
g: 255 & map$1[str[2]] * 17,
|
|
b: 255 & map$1[str[3]] * 17,
|
|
a: len === 5 ? map$1[str[4]] * 17 : 255
|
|
};
|
|
} else if (len === 7 || len === 9) {
|
|
ret = {
|
|
r: map$1[str[1]] << 4 | map$1[str[2]],
|
|
g: map$1[str[3]] << 4 | map$1[str[4]],
|
|
b: map$1[str[5]] << 4 | map$1[str[6]],
|
|
a: len === 9 ? map$1[str[7]] << 4 | map$1[str[8]] : 255
|
|
};
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
var alpha = (a, f) => a < 255 ? f(a) : "";
|
|
function hexString(v) {
|
|
var f = isShort(v) ? h1 : h2;
|
|
return v ? "#" + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f) : void 0;
|
|
}
|
|
var HUE_RE = /^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;
|
|
function hsl2rgbn(h4, s, l) {
|
|
const a = s * Math.min(l, 1 - l);
|
|
const f = (n, k = (n + h4 / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
|
|
return [f(0), f(8), f(4)];
|
|
}
|
|
function hsv2rgbn(h4, s, v) {
|
|
const f = (n, k = (n + h4 / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);
|
|
return [f(5), f(3), f(1)];
|
|
}
|
|
function hwb2rgbn(h4, w, b) {
|
|
const rgb = hsl2rgbn(h4, 1, 0.5);
|
|
let i;
|
|
if (w + b > 1) {
|
|
i = 1 / (w + b);
|
|
w *= i;
|
|
b *= i;
|
|
}
|
|
for (i = 0; i < 3; i++) {
|
|
rgb[i] *= 1 - w - b;
|
|
rgb[i] += w;
|
|
}
|
|
return rgb;
|
|
}
|
|
function hueValue(r, g, b, d, max) {
|
|
if (r === max) {
|
|
return (g - b) / d + (g < b ? 6 : 0);
|
|
}
|
|
if (g === max) {
|
|
return (b - r) / d + 2;
|
|
}
|
|
return (r - g) / d + 4;
|
|
}
|
|
function rgb2hsl(v) {
|
|
const range = 255;
|
|
const r = v.r / range;
|
|
const g = v.g / range;
|
|
const b = v.b / range;
|
|
const max = Math.max(r, g, b);
|
|
const min = Math.min(r, g, b);
|
|
const l = (max + min) / 2;
|
|
let h4, s, d;
|
|
if (max !== min) {
|
|
d = max - min;
|
|
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
h4 = hueValue(r, g, b, d, max);
|
|
h4 = h4 * 60 + 0.5;
|
|
}
|
|
return [h4 | 0, s || 0, l];
|
|
}
|
|
function calln(f, a, b, c) {
|
|
return (Array.isArray(a) ? f(a[0], a[1], a[2]) : f(a, b, c)).map(n2b);
|
|
}
|
|
function hsl2rgb(h4, s, l) {
|
|
return calln(hsl2rgbn, h4, s, l);
|
|
}
|
|
function hwb2rgb(h4, w, b) {
|
|
return calln(hwb2rgbn, h4, w, b);
|
|
}
|
|
function hsv2rgb(h4, s, v) {
|
|
return calln(hsv2rgbn, h4, s, v);
|
|
}
|
|
function hue(h4) {
|
|
return (h4 % 360 + 360) % 360;
|
|
}
|
|
function hueParse(str) {
|
|
const m = HUE_RE.exec(str);
|
|
let a = 255;
|
|
let v;
|
|
if (!m) {
|
|
return;
|
|
}
|
|
if (m[5] !== v) {
|
|
a = m[6] ? p2b(+m[5]) : n2b(+m[5]);
|
|
}
|
|
const h4 = hue(+m[2]);
|
|
const p1 = +m[3] / 100;
|
|
const p2 = +m[4] / 100;
|
|
if (m[1] === "hwb") {
|
|
v = hwb2rgb(h4, p1, p2);
|
|
} else if (m[1] === "hsv") {
|
|
v = hsv2rgb(h4, p1, p2);
|
|
} else {
|
|
v = hsl2rgb(h4, p1, p2);
|
|
}
|
|
return {
|
|
r: v[0],
|
|
g: v[1],
|
|
b: v[2],
|
|
a
|
|
};
|
|
}
|
|
function rotate(v, deg) {
|
|
var h4 = rgb2hsl(v);
|
|
h4[0] = hue(h4[0] + deg);
|
|
h4 = hsl2rgb(h4);
|
|
v.r = h4[0];
|
|
v.g = h4[1];
|
|
v.b = h4[2];
|
|
}
|
|
function hslString(v) {
|
|
if (!v) {
|
|
return;
|
|
}
|
|
const a = rgb2hsl(v);
|
|
const h4 = a[0];
|
|
const s = n2p(a[1]);
|
|
const l = n2p(a[2]);
|
|
return v.a < 255 ? `hsla(${h4}, ${s}%, ${l}%, ${b2n(v.a)})` : `hsl(${h4}, ${s}%, ${l}%)`;
|
|
}
|
|
var map = {
|
|
x: "dark",
|
|
Z: "light",
|
|
Y: "re",
|
|
X: "blu",
|
|
W: "gr",
|
|
V: "medium",
|
|
U: "slate",
|
|
A: "ee",
|
|
T: "ol",
|
|
S: "or",
|
|
B: "ra",
|
|
C: "lateg",
|
|
D: "ights",
|
|
R: "in",
|
|
Q: "turquois",
|
|
E: "hi",
|
|
P: "ro",
|
|
O: "al",
|
|
N: "le",
|
|
M: "de",
|
|
L: "yello",
|
|
F: "en",
|
|
K: "ch",
|
|
G: "arks",
|
|
H: "ea",
|
|
I: "ightg",
|
|
J: "wh"
|
|
};
|
|
var names$1 = {
|
|
OiceXe: "f0f8ff",
|
|
antiquewEte: "faebd7",
|
|
aqua: "ffff",
|
|
aquamarRe: "7fffd4",
|
|
azuY: "f0ffff",
|
|
beige: "f5f5dc",
|
|
bisque: "ffe4c4",
|
|
black: "0",
|
|
blanKedOmond: "ffebcd",
|
|
Xe: "ff",
|
|
XeviTet: "8a2be2",
|
|
bPwn: "a52a2a",
|
|
burlywood: "deb887",
|
|
caMtXe: "5f9ea0",
|
|
KartYuse: "7fff00",
|
|
KocTate: "d2691e",
|
|
cSO: "ff7f50",
|
|
cSnflowerXe: "6495ed",
|
|
cSnsilk: "fff8dc",
|
|
crimson: "dc143c",
|
|
cyan: "ffff",
|
|
xXe: "8b",
|
|
xcyan: "8b8b",
|
|
xgTMnPd: "b8860b",
|
|
xWay: "a9a9a9",
|
|
xgYF: "6400",
|
|
xgYy: "a9a9a9",
|
|
xkhaki: "bdb76b",
|
|
xmagFta: "8b008b",
|
|
xTivegYF: "556b2f",
|
|
xSange: "ff8c00",
|
|
xScEd: "9932cc",
|
|
xYd: "8b0000",
|
|
xsOmon: "e9967a",
|
|
xsHgYF: "8fbc8f",
|
|
xUXe: "483d8b",
|
|
xUWay: "2f4f4f",
|
|
xUgYy: "2f4f4f",
|
|
xQe: "ced1",
|
|
xviTet: "9400d3",
|
|
dAppRk: "ff1493",
|
|
dApskyXe: "bfff",
|
|
dimWay: "696969",
|
|
dimgYy: "696969",
|
|
dodgerXe: "1e90ff",
|
|
fiYbrick: "b22222",
|
|
flSOwEte: "fffaf0",
|
|
foYstWAn: "228b22",
|
|
fuKsia: "ff00ff",
|
|
gaRsbSo: "dcdcdc",
|
|
ghostwEte: "f8f8ff",
|
|
gTd: "ffd700",
|
|
gTMnPd: "daa520",
|
|
Way: "808080",
|
|
gYF: "8000",
|
|
gYFLw: "adff2f",
|
|
gYy: "808080",
|
|
honeyMw: "f0fff0",
|
|
hotpRk: "ff69b4",
|
|
RdianYd: "cd5c5c",
|
|
Rdigo: "4b0082",
|
|
ivSy: "fffff0",
|
|
khaki: "f0e68c",
|
|
lavFMr: "e6e6fa",
|
|
lavFMrXsh: "fff0f5",
|
|
lawngYF: "7cfc00",
|
|
NmoncEffon: "fffacd",
|
|
ZXe: "add8e6",
|
|
ZcSO: "f08080",
|
|
Zcyan: "e0ffff",
|
|
ZgTMnPdLw: "fafad2",
|
|
ZWay: "d3d3d3",
|
|
ZgYF: "90ee90",
|
|
ZgYy: "d3d3d3",
|
|
ZpRk: "ffb6c1",
|
|
ZsOmon: "ffa07a",
|
|
ZsHgYF: "20b2aa",
|
|
ZskyXe: "87cefa",
|
|
ZUWay: "778899",
|
|
ZUgYy: "778899",
|
|
ZstAlXe: "b0c4de",
|
|
ZLw: "ffffe0",
|
|
lime: "ff00",
|
|
limegYF: "32cd32",
|
|
lRF: "faf0e6",
|
|
magFta: "ff00ff",
|
|
maPon: "800000",
|
|
VaquamarRe: "66cdaa",
|
|
VXe: "cd",
|
|
VScEd: "ba55d3",
|
|
VpurpN: "9370db",
|
|
VsHgYF: "3cb371",
|
|
VUXe: "7b68ee",
|
|
VsprRggYF: "fa9a",
|
|
VQe: "48d1cc",
|
|
VviTetYd: "c71585",
|
|
midnightXe: "191970",
|
|
mRtcYam: "f5fffa",
|
|
mistyPse: "ffe4e1",
|
|
moccasR: "ffe4b5",
|
|
navajowEte: "ffdead",
|
|
navy: "80",
|
|
Tdlace: "fdf5e6",
|
|
Tive: "808000",
|
|
TivedBb: "6b8e23",
|
|
Sange: "ffa500",
|
|
SangeYd: "ff4500",
|
|
ScEd: "da70d6",
|
|
pOegTMnPd: "eee8aa",
|
|
pOegYF: "98fb98",
|
|
pOeQe: "afeeee",
|
|
pOeviTetYd: "db7093",
|
|
papayawEp: "ffefd5",
|
|
pHKpuff: "ffdab9",
|
|
peru: "cd853f",
|
|
pRk: "ffc0cb",
|
|
plum: "dda0dd",
|
|
powMrXe: "b0e0e6",
|
|
purpN: "800080",
|
|
YbeccapurpN: "663399",
|
|
Yd: "ff0000",
|
|
Psybrown: "bc8f8f",
|
|
PyOXe: "4169e1",
|
|
saddNbPwn: "8b4513",
|
|
sOmon: "fa8072",
|
|
sandybPwn: "f4a460",
|
|
sHgYF: "2e8b57",
|
|
sHshell: "fff5ee",
|
|
siFna: "a0522d",
|
|
silver: "c0c0c0",
|
|
skyXe: "87ceeb",
|
|
UXe: "6a5acd",
|
|
UWay: "708090",
|
|
UgYy: "708090",
|
|
snow: "fffafa",
|
|
sprRggYF: "ff7f",
|
|
stAlXe: "4682b4",
|
|
tan: "d2b48c",
|
|
teO: "8080",
|
|
tEstN: "d8bfd8",
|
|
tomato: "ff6347",
|
|
Qe: "40e0d0",
|
|
viTet: "ee82ee",
|
|
JHt: "f5deb3",
|
|
wEte: "ffffff",
|
|
wEtesmoke: "f5f5f5",
|
|
Lw: "ffff00",
|
|
LwgYF: "9acd32"
|
|
};
|
|
function unpack() {
|
|
const unpacked = {};
|
|
const keys = Object.keys(names$1);
|
|
const tkeys = Object.keys(map);
|
|
let i, j, k, ok, nk;
|
|
for (i = 0; i < keys.length; i++) {
|
|
ok = nk = keys[i];
|
|
for (j = 0; j < tkeys.length; j++) {
|
|
k = tkeys[j];
|
|
nk = nk.replace(k, map[k]);
|
|
}
|
|
k = parseInt(names$1[ok], 16);
|
|
unpacked[nk] = [k >> 16 & 255, k >> 8 & 255, k & 255];
|
|
}
|
|
return unpacked;
|
|
}
|
|
var names;
|
|
function nameParse(str) {
|
|
if (!names) {
|
|
names = unpack();
|
|
names.transparent = [0, 0, 0, 0];
|
|
}
|
|
const a = names[str.toLowerCase()];
|
|
return a && {
|
|
r: a[0],
|
|
g: a[1],
|
|
b: a[2],
|
|
a: a.length === 4 ? a[3] : 255
|
|
};
|
|
}
|
|
var RGB_RE = /^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;
|
|
function rgbParse(str) {
|
|
const m = RGB_RE.exec(str);
|
|
let a = 255;
|
|
let r, g, b;
|
|
if (!m) {
|
|
return;
|
|
}
|
|
if (m[7] !== r) {
|
|
const v = +m[7];
|
|
a = m[8] ? p2b(v) : lim(v * 255, 0, 255);
|
|
}
|
|
r = +m[1];
|
|
g = +m[3];
|
|
b = +m[5];
|
|
r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));
|
|
g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));
|
|
b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));
|
|
return {
|
|
r,
|
|
g,
|
|
b,
|
|
a
|
|
};
|
|
}
|
|
function rgbString(v) {
|
|
return v && (v.a < 255 ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})` : `rgb(${v.r}, ${v.g}, ${v.b})`);
|
|
}
|
|
var to = (v) => v <= 31308e-7 ? v * 12.92 : Math.pow(v, 1 / 2.4) * 1.055 - 0.055;
|
|
var from = (v) => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
|
|
function interpolate2(rgb1, rgb2, t2) {
|
|
const r = from(b2n(rgb1.r));
|
|
const g = from(b2n(rgb1.g));
|
|
const b = from(b2n(rgb1.b));
|
|
return {
|
|
r: n2b(to(r + t2 * (from(b2n(rgb2.r)) - r))),
|
|
g: n2b(to(g + t2 * (from(b2n(rgb2.g)) - g))),
|
|
b: n2b(to(b + t2 * (from(b2n(rgb2.b)) - b))),
|
|
a: rgb1.a + t2 * (rgb2.a - rgb1.a)
|
|
};
|
|
}
|
|
function modHSL(v, i, ratio) {
|
|
if (v) {
|
|
let tmp = rgb2hsl(v);
|
|
tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));
|
|
tmp = hsl2rgb(tmp);
|
|
v.r = tmp[0];
|
|
v.g = tmp[1];
|
|
v.b = tmp[2];
|
|
}
|
|
}
|
|
function clone(v, proto) {
|
|
return v ? Object.assign(proto || {}, v) : v;
|
|
}
|
|
function fromObject(input) {
|
|
var v = { r: 0, g: 0, b: 0, a: 255 };
|
|
if (Array.isArray(input)) {
|
|
if (input.length >= 3) {
|
|
v = { r: input[0], g: input[1], b: input[2], a: 255 };
|
|
if (input.length > 3) {
|
|
v.a = n2b(input[3]);
|
|
}
|
|
}
|
|
} else {
|
|
v = clone(input, { r: 0, g: 0, b: 0, a: 1 });
|
|
v.a = n2b(v.a);
|
|
}
|
|
return v;
|
|
}
|
|
function functionParse(str) {
|
|
if (str.charAt(0) === "r") {
|
|
return rgbParse(str);
|
|
}
|
|
return hueParse(str);
|
|
}
|
|
var Color = class _Color {
|
|
constructor(input) {
|
|
if (input instanceof _Color) {
|
|
return input;
|
|
}
|
|
const type = typeof input;
|
|
let v;
|
|
if (type === "object") {
|
|
v = fromObject(input);
|
|
} else if (type === "string") {
|
|
v = hexParse(input) || nameParse(input) || functionParse(input);
|
|
}
|
|
this._rgb = v;
|
|
this._valid = !!v;
|
|
}
|
|
get valid() {
|
|
return this._valid;
|
|
}
|
|
get rgb() {
|
|
var v = clone(this._rgb);
|
|
if (v) {
|
|
v.a = b2n(v.a);
|
|
}
|
|
return v;
|
|
}
|
|
set rgb(obj) {
|
|
this._rgb = fromObject(obj);
|
|
}
|
|
rgbString() {
|
|
return this._valid ? rgbString(this._rgb) : void 0;
|
|
}
|
|
hexString() {
|
|
return this._valid ? hexString(this._rgb) : void 0;
|
|
}
|
|
hslString() {
|
|
return this._valid ? hslString(this._rgb) : void 0;
|
|
}
|
|
mix(color2, weight) {
|
|
if (color2) {
|
|
const c1 = this.rgb;
|
|
const c2 = color2.rgb;
|
|
let w2;
|
|
const p = weight === w2 ? 0.5 : weight;
|
|
const w = 2 * p - 1;
|
|
const a = c1.a - c2.a;
|
|
const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2;
|
|
w2 = 1 - w1;
|
|
c1.r = 255 & w1 * c1.r + w2 * c2.r + 0.5;
|
|
c1.g = 255 & w1 * c1.g + w2 * c2.g + 0.5;
|
|
c1.b = 255 & w1 * c1.b + w2 * c2.b + 0.5;
|
|
c1.a = p * c1.a + (1 - p) * c2.a;
|
|
this.rgb = c1;
|
|
}
|
|
return this;
|
|
}
|
|
interpolate(color2, t2) {
|
|
if (color2) {
|
|
this._rgb = interpolate2(this._rgb, color2._rgb, t2);
|
|
}
|
|
return this;
|
|
}
|
|
clone() {
|
|
return new _Color(this.rgb);
|
|
}
|
|
alpha(a) {
|
|
this._rgb.a = n2b(a);
|
|
return this;
|
|
}
|
|
clearer(ratio) {
|
|
const rgb = this._rgb;
|
|
rgb.a *= 1 - ratio;
|
|
return this;
|
|
}
|
|
greyscale() {
|
|
const rgb = this._rgb;
|
|
const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);
|
|
rgb.r = rgb.g = rgb.b = val;
|
|
return this;
|
|
}
|
|
opaquer(ratio) {
|
|
const rgb = this._rgb;
|
|
rgb.a *= 1 + ratio;
|
|
return this;
|
|
}
|
|
negate() {
|
|
const v = this._rgb;
|
|
v.r = 255 - v.r;
|
|
v.g = 255 - v.g;
|
|
v.b = 255 - v.b;
|
|
return this;
|
|
}
|
|
lighten(ratio) {
|
|
modHSL(this._rgb, 2, ratio);
|
|
return this;
|
|
}
|
|
darken(ratio) {
|
|
modHSL(this._rgb, 2, -ratio);
|
|
return this;
|
|
}
|
|
saturate(ratio) {
|
|
modHSL(this._rgb, 1, ratio);
|
|
return this;
|
|
}
|
|
desaturate(ratio) {
|
|
modHSL(this._rgb, 1, -ratio);
|
|
return this;
|
|
}
|
|
rotate(deg) {
|
|
rotate(this._rgb, deg);
|
|
return this;
|
|
}
|
|
};
|
|
|
|
// node_modules/.pnpm/chart.js@4.4.1/node_modules/chart.js/dist/chunks/helpers.segment.js
|
|
function noop() {
|
|
}
|
|
var uid = /* @__PURE__ */ (() => {
|
|
let id = 0;
|
|
return () => id++;
|
|
})();
|
|
function isNullOrUndef(value) {
|
|
return value === null || typeof value === "undefined";
|
|
}
|
|
function isArray(value) {
|
|
if (Array.isArray && Array.isArray(value)) {
|
|
return true;
|
|
}
|
|
const type = Object.prototype.toString.call(value);
|
|
if (type.slice(0, 7) === "[object" && type.slice(-6) === "Array]") {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function isObject(value) {
|
|
return value !== null && Object.prototype.toString.call(value) === "[object Object]";
|
|
}
|
|
function isNumberFinite(value) {
|
|
return (typeof value === "number" || value instanceof Number) && isFinite(+value);
|
|
}
|
|
function finiteOrDefault(value, defaultValue) {
|
|
return isNumberFinite(value) ? value : defaultValue;
|
|
}
|
|
function valueOrDefault(value, defaultValue) {
|
|
return typeof value === "undefined" ? defaultValue : value;
|
|
}
|
|
var toPercentage = (value, dimension) => typeof value === "string" && value.endsWith("%") ? parseFloat(value) / 100 : +value / dimension;
|
|
var toDimension = (value, dimension) => typeof value === "string" && value.endsWith("%") ? parseFloat(value) / 100 * dimension : +value;
|
|
function callback(fn, args, thisArg) {
|
|
if (fn && typeof fn.call === "function") {
|
|
return fn.apply(thisArg, args);
|
|
}
|
|
}
|
|
function each(loopable, fn, thisArg, reverse) {
|
|
let i, len, keys;
|
|
if (isArray(loopable)) {
|
|
len = loopable.length;
|
|
if (reverse) {
|
|
for (i = len - 1; i >= 0; i--) {
|
|
fn.call(thisArg, loopable[i], i);
|
|
}
|
|
} else {
|
|
for (i = 0; i < len; i++) {
|
|
fn.call(thisArg, loopable[i], i);
|
|
}
|
|
}
|
|
} else if (isObject(loopable)) {
|
|
keys = Object.keys(loopable);
|
|
len = keys.length;
|
|
for (i = 0; i < len; i++) {
|
|
fn.call(thisArg, loopable[keys[i]], keys[i]);
|
|
}
|
|
}
|
|
}
|
|
function _elementsEqual(a0, a1) {
|
|
let i, ilen, v0, v1;
|
|
if (!a0 || !a1 || a0.length !== a1.length) {
|
|
return false;
|
|
}
|
|
for (i = 0, ilen = a0.length; i < ilen; ++i) {
|
|
v0 = a0[i];
|
|
v1 = a1[i];
|
|
if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function clone2(source) {
|
|
if (isArray(source)) {
|
|
return source.map(clone2);
|
|
}
|
|
if (isObject(source)) {
|
|
const target = /* @__PURE__ */ Object.create(null);
|
|
const keys = Object.keys(source);
|
|
const klen = keys.length;
|
|
let k = 0;
|
|
for (; k < klen; ++k) {
|
|
target[keys[k]] = clone2(source[keys[k]]);
|
|
}
|
|
return target;
|
|
}
|
|
return source;
|
|
}
|
|
function isValidKey(key) {
|
|
return [
|
|
"__proto__",
|
|
"prototype",
|
|
"constructor"
|
|
].indexOf(key) === -1;
|
|
}
|
|
function _merger(key, target, source, options) {
|
|
if (!isValidKey(key)) {
|
|
return;
|
|
}
|
|
const tval = target[key];
|
|
const sval = source[key];
|
|
if (isObject(tval) && isObject(sval)) {
|
|
merge(tval, sval, options);
|
|
} else {
|
|
target[key] = clone2(sval);
|
|
}
|
|
}
|
|
function merge(target, source, options) {
|
|
const sources = isArray(source) ? source : [
|
|
source
|
|
];
|
|
const ilen = sources.length;
|
|
if (!isObject(target)) {
|
|
return target;
|
|
}
|
|
options = options || {};
|
|
const merger = options.merger || _merger;
|
|
let current;
|
|
for (let i = 0; i < ilen; ++i) {
|
|
current = sources[i];
|
|
if (!isObject(current)) {
|
|
continue;
|
|
}
|
|
const keys = Object.keys(current);
|
|
for (let k = 0, klen = keys.length; k < klen; ++k) {
|
|
merger(keys[k], target, current, options);
|
|
}
|
|
}
|
|
return target;
|
|
}
|
|
function mergeIf(target, source) {
|
|
return merge(target, source, {
|
|
merger: _mergerIf
|
|
});
|
|
}
|
|
function _mergerIf(key, target, source) {
|
|
if (!isValidKey(key)) {
|
|
return;
|
|
}
|
|
const tval = target[key];
|
|
const sval = source[key];
|
|
if (isObject(tval) && isObject(sval)) {
|
|
mergeIf(tval, sval);
|
|
} else if (!Object.prototype.hasOwnProperty.call(target, key)) {
|
|
target[key] = clone2(sval);
|
|
}
|
|
}
|
|
var keyResolvers = {
|
|
// Chart.helpers.core resolveObjectKey should resolve empty key to root object
|
|
"": (v) => v,
|
|
// default resolvers
|
|
x: (o) => o.x,
|
|
y: (o) => o.y
|
|
};
|
|
function _splitKey(key) {
|
|
const parts = key.split(".");
|
|
const keys = [];
|
|
let tmp = "";
|
|
for (const part of parts) {
|
|
tmp += part;
|
|
if (tmp.endsWith("\\")) {
|
|
tmp = tmp.slice(0, -1) + ".";
|
|
} else {
|
|
keys.push(tmp);
|
|
tmp = "";
|
|
}
|
|
}
|
|
return keys;
|
|
}
|
|
function _getKeyResolver(key) {
|
|
const keys = _splitKey(key);
|
|
return (obj) => {
|
|
for (const k of keys) {
|
|
if (k === "") {
|
|
break;
|
|
}
|
|
obj = obj && obj[k];
|
|
}
|
|
return obj;
|
|
};
|
|
}
|
|
function resolveObjectKey(obj, key) {
|
|
const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));
|
|
return resolver(obj);
|
|
}
|
|
function _capitalize(str) {
|
|
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
}
|
|
var defined = (value) => typeof value !== "undefined";
|
|
var isFunction = (value) => typeof value === "function";
|
|
var setsEqual = (a, b) => {
|
|
if (a.size !== b.size) {
|
|
return false;
|
|
}
|
|
for (const item of a) {
|
|
if (!b.has(item)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
function _isClickEvent(e) {
|
|
return e.type === "mouseup" || e.type === "click" || e.type === "contextmenu";
|
|
}
|
|
var PI = Math.PI;
|
|
var TAU = 2 * PI;
|
|
var PITAU = TAU + PI;
|
|
var INFINITY = Number.POSITIVE_INFINITY;
|
|
var RAD_PER_DEG = PI / 180;
|
|
var HALF_PI = PI / 2;
|
|
var QUARTER_PI = PI / 4;
|
|
var TWO_THIRDS_PI = PI * 2 / 3;
|
|
var log10 = Math.log10;
|
|
var sign = Math.sign;
|
|
function almostEquals(x, y, epsilon) {
|
|
return Math.abs(x - y) < epsilon;
|
|
}
|
|
function niceNum(range) {
|
|
const roundedRange = Math.round(range);
|
|
range = almostEquals(range, roundedRange, range / 1e3) ? roundedRange : range;
|
|
const niceRange = Math.pow(10, Math.floor(log10(range)));
|
|
const fraction = range / niceRange;
|
|
const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;
|
|
return niceFraction * niceRange;
|
|
}
|
|
function _factorize(value) {
|
|
const result = [];
|
|
const sqrt = Math.sqrt(value);
|
|
let i;
|
|
for (i = 1; i < sqrt; i++) {
|
|
if (value % i === 0) {
|
|
result.push(i);
|
|
result.push(value / i);
|
|
}
|
|
}
|
|
if (sqrt === (sqrt | 0)) {
|
|
result.push(sqrt);
|
|
}
|
|
result.sort((a, b) => a - b).pop();
|
|
return result;
|
|
}
|
|
function isNumber(n) {
|
|
return !isNaN(parseFloat(n)) && isFinite(n);
|
|
}
|
|
function almostWhole(x, epsilon) {
|
|
const rounded = Math.round(x);
|
|
return rounded - epsilon <= x && rounded + epsilon >= x;
|
|
}
|
|
function _setMinAndMaxByKey(array, target, property) {
|
|
let i, ilen, value;
|
|
for (i = 0, ilen = array.length; i < ilen; i++) {
|
|
value = array[i][property];
|
|
if (!isNaN(value)) {
|
|
target.min = Math.min(target.min, value);
|
|
target.max = Math.max(target.max, value);
|
|
}
|
|
}
|
|
}
|
|
function toRadians(degrees) {
|
|
return degrees * (PI / 180);
|
|
}
|
|
function toDegrees(radians) {
|
|
return radians * (180 / PI);
|
|
}
|
|
function _decimalPlaces(x) {
|
|
if (!isNumberFinite(x)) {
|
|
return;
|
|
}
|
|
let e = 1;
|
|
let p = 0;
|
|
while (Math.round(x * e) / e !== x) {
|
|
e *= 10;
|
|
p++;
|
|
}
|
|
return p;
|
|
}
|
|
function getAngleFromPoint(centrePoint, anglePoint) {
|
|
const distanceFromXCenter = anglePoint.x - centrePoint.x;
|
|
const distanceFromYCenter = anglePoint.y - centrePoint.y;
|
|
const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);
|
|
let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);
|
|
if (angle < -0.5 * PI) {
|
|
angle += TAU;
|
|
}
|
|
return {
|
|
angle,
|
|
distance: radialDistanceFromCenter
|
|
};
|
|
}
|
|
function distanceBetweenPoints(pt1, pt2) {
|
|
return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));
|
|
}
|
|
function _normalizeAngle(a) {
|
|
return (a % TAU + TAU) % TAU;
|
|
}
|
|
function _angleBetween(angle, start, end, sameAngleIsFullCircle) {
|
|
const a = _normalizeAngle(angle);
|
|
const s = _normalizeAngle(start);
|
|
const e = _normalizeAngle(end);
|
|
const angleToStart = _normalizeAngle(s - a);
|
|
const angleToEnd = _normalizeAngle(e - a);
|
|
const startToAngle = _normalizeAngle(a - s);
|
|
const endToAngle = _normalizeAngle(a - e);
|
|
return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle;
|
|
}
|
|
function _limitValue(value, min, max) {
|
|
return Math.max(min, Math.min(max, value));
|
|
}
|
|
function _int16Range(value) {
|
|
return _limitValue(value, -32768, 32767);
|
|
}
|
|
function _isBetween(value, start, end, epsilon = 1e-6) {
|
|
return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;
|
|
}
|
|
function _lookup(table, value, cmp) {
|
|
cmp = cmp || ((index) => table[index] < value);
|
|
let hi = table.length - 1;
|
|
let lo = 0;
|
|
let mid;
|
|
while (hi - lo > 1) {
|
|
mid = lo + hi >> 1;
|
|
if (cmp(mid)) {
|
|
lo = mid;
|
|
} else {
|
|
hi = mid;
|
|
}
|
|
}
|
|
return {
|
|
lo,
|
|
hi
|
|
};
|
|
}
|
|
var _lookupByKey = (table, key, value, last) => _lookup(table, value, last ? (index) => {
|
|
const ti = table[index][key];
|
|
return ti < value || ti === value && table[index + 1][key] === value;
|
|
} : (index) => table[index][key] < value);
|
|
var _rlookupByKey = (table, key, value) => _lookup(table, value, (index) => table[index][key] >= value);
|
|
function _filterBetween(values, min, max) {
|
|
let start = 0;
|
|
let end = values.length;
|
|
while (start < end && values[start] < min) {
|
|
start++;
|
|
}
|
|
while (end > start && values[end - 1] > max) {
|
|
end--;
|
|
}
|
|
return start > 0 || end < values.length ? values.slice(start, end) : values;
|
|
}
|
|
var arrayEvents = [
|
|
"push",
|
|
"pop",
|
|
"shift",
|
|
"splice",
|
|
"unshift"
|
|
];
|
|
function listenArrayEvents(array, listener) {
|
|
if (array._chartjs) {
|
|
array._chartjs.listeners.push(listener);
|
|
return;
|
|
}
|
|
Object.defineProperty(array, "_chartjs", {
|
|
configurable: true,
|
|
enumerable: false,
|
|
value: {
|
|
listeners: [
|
|
listener
|
|
]
|
|
}
|
|
});
|
|
arrayEvents.forEach((key) => {
|
|
const method = "_onData" + _capitalize(key);
|
|
const base = array[key];
|
|
Object.defineProperty(array, key, {
|
|
configurable: true,
|
|
enumerable: false,
|
|
value(...args) {
|
|
const res = base.apply(this, args);
|
|
array._chartjs.listeners.forEach((object) => {
|
|
if (typeof object[method] === "function") {
|
|
object[method](...args);
|
|
}
|
|
});
|
|
return res;
|
|
}
|
|
});
|
|
});
|
|
}
|
|
function unlistenArrayEvents(array, listener) {
|
|
const stub = array._chartjs;
|
|
if (!stub) {
|
|
return;
|
|
}
|
|
const listeners = stub.listeners;
|
|
const index = listeners.indexOf(listener);
|
|
if (index !== -1) {
|
|
listeners.splice(index, 1);
|
|
}
|
|
if (listeners.length > 0) {
|
|
return;
|
|
}
|
|
arrayEvents.forEach((key) => {
|
|
delete array[key];
|
|
});
|
|
delete array._chartjs;
|
|
}
|
|
function _arrayUnique(items) {
|
|
const set2 = new Set(items);
|
|
if (set2.size === items.length) {
|
|
return items;
|
|
}
|
|
return Array.from(set2);
|
|
}
|
|
var requestAnimFrame = function() {
|
|
if (typeof window === "undefined") {
|
|
return function(callback2) {
|
|
return callback2();
|
|
};
|
|
}
|
|
return window.requestAnimationFrame;
|
|
}();
|
|
function throttled(fn, thisArg) {
|
|
let argsToUse = [];
|
|
let ticking = false;
|
|
return function(...args) {
|
|
argsToUse = args;
|
|
if (!ticking) {
|
|
ticking = true;
|
|
requestAnimFrame.call(window, () => {
|
|
ticking = false;
|
|
fn.apply(thisArg, argsToUse);
|
|
});
|
|
}
|
|
};
|
|
}
|
|
function debounce(fn, delay) {
|
|
let timeout;
|
|
return function(...args) {
|
|
if (delay) {
|
|
clearTimeout(timeout);
|
|
timeout = setTimeout(fn, delay, args);
|
|
} else {
|
|
fn.apply(this, args);
|
|
}
|
|
return delay;
|
|
};
|
|
}
|
|
var _toLeftRightCenter = (align) => align === "start" ? "left" : align === "end" ? "right" : "center";
|
|
var _alignStartEnd = (align, start, end) => align === "start" ? start : align === "end" ? end : (start + end) / 2;
|
|
var _textX = (align, left, right, rtl) => {
|
|
const check = rtl ? "left" : "right";
|
|
return align === check ? right : align === "center" ? (left + right) / 2 : left;
|
|
};
|
|
var atEdge = (t2) => t2 === 0 || t2 === 1;
|
|
var elasticIn = (t2, s, p) => -(Math.pow(2, 10 * (t2 -= 1)) * Math.sin((t2 - s) * TAU / p));
|
|
var elasticOut = (t2, s, p) => Math.pow(2, -10 * t2) * Math.sin((t2 - s) * TAU / p) + 1;
|
|
var effects = {
|
|
linear: (t2) => t2,
|
|
easeInQuad: (t2) => t2 * t2,
|
|
easeOutQuad: (t2) => -t2 * (t2 - 2),
|
|
easeInOutQuad: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 : -0.5 * (--t2 * (t2 - 2) - 1),
|
|
easeInCubic: (t2) => t2 * t2 * t2,
|
|
easeOutCubic: (t2) => (t2 -= 1) * t2 * t2 + 1,
|
|
easeInOutCubic: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 * t2 : 0.5 * ((t2 -= 2) * t2 * t2 + 2),
|
|
easeInQuart: (t2) => t2 * t2 * t2 * t2,
|
|
easeOutQuart: (t2) => -((t2 -= 1) * t2 * t2 * t2 - 1),
|
|
easeInOutQuart: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 * t2 * t2 : -0.5 * ((t2 -= 2) * t2 * t2 * t2 - 2),
|
|
easeInQuint: (t2) => t2 * t2 * t2 * t2 * t2,
|
|
easeOutQuint: (t2) => (t2 -= 1) * t2 * t2 * t2 * t2 + 1,
|
|
easeInOutQuint: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 * t2 * t2 * t2 : 0.5 * ((t2 -= 2) * t2 * t2 * t2 * t2 + 2),
|
|
easeInSine: (t2) => -Math.cos(t2 * HALF_PI) + 1,
|
|
easeOutSine: (t2) => Math.sin(t2 * HALF_PI),
|
|
easeInOutSine: (t2) => -0.5 * (Math.cos(PI * t2) - 1),
|
|
easeInExpo: (t2) => t2 === 0 ? 0 : Math.pow(2, 10 * (t2 - 1)),
|
|
easeOutExpo: (t2) => t2 === 1 ? 1 : -Math.pow(2, -10 * t2) + 1,
|
|
easeInOutExpo: (t2) => atEdge(t2) ? t2 : t2 < 0.5 ? 0.5 * Math.pow(2, 10 * (t2 * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t2 * 2 - 1)) + 2),
|
|
easeInCirc: (t2) => t2 >= 1 ? t2 : -(Math.sqrt(1 - t2 * t2) - 1),
|
|
easeOutCirc: (t2) => Math.sqrt(1 - (t2 -= 1) * t2),
|
|
easeInOutCirc: (t2) => (t2 /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t2 * t2) - 1) : 0.5 * (Math.sqrt(1 - (t2 -= 2) * t2) + 1),
|
|
easeInElastic: (t2) => atEdge(t2) ? t2 : elasticIn(t2, 0.075, 0.3),
|
|
easeOutElastic: (t2) => atEdge(t2) ? t2 : elasticOut(t2, 0.075, 0.3),
|
|
easeInOutElastic(t2) {
|
|
const s = 0.1125;
|
|
const p = 0.45;
|
|
return atEdge(t2) ? t2 : t2 < 0.5 ? 0.5 * elasticIn(t2 * 2, s, p) : 0.5 + 0.5 * elasticOut(t2 * 2 - 1, s, p);
|
|
},
|
|
easeInBack(t2) {
|
|
const s = 1.70158;
|
|
return t2 * t2 * ((s + 1) * t2 - s);
|
|
},
|
|
easeOutBack(t2) {
|
|
const s = 1.70158;
|
|
return (t2 -= 1) * t2 * ((s + 1) * t2 + s) + 1;
|
|
},
|
|
easeInOutBack(t2) {
|
|
let s = 1.70158;
|
|
if ((t2 /= 0.5) < 1) {
|
|
return 0.5 * (t2 * t2 * (((s *= 1.525) + 1) * t2 - s));
|
|
}
|
|
return 0.5 * ((t2 -= 2) * t2 * (((s *= 1.525) + 1) * t2 + s) + 2);
|
|
},
|
|
easeInBounce: (t2) => 1 - effects.easeOutBounce(1 - t2),
|
|
easeOutBounce(t2) {
|
|
const m = 7.5625;
|
|
const d = 2.75;
|
|
if (t2 < 1 / d) {
|
|
return m * t2 * t2;
|
|
}
|
|
if (t2 < 2 / d) {
|
|
return m * (t2 -= 1.5 / d) * t2 + 0.75;
|
|
}
|
|
if (t2 < 2.5 / d) {
|
|
return m * (t2 -= 2.25 / d) * t2 + 0.9375;
|
|
}
|
|
return m * (t2 -= 2.625 / d) * t2 + 0.984375;
|
|
},
|
|
easeInOutBounce: (t2) => t2 < 0.5 ? effects.easeInBounce(t2 * 2) * 0.5 : effects.easeOutBounce(t2 * 2 - 1) * 0.5 + 0.5
|
|
};
|
|
function isPatternOrGradient(value) {
|
|
if (value && typeof value === "object") {
|
|
const type = value.toString();
|
|
return type === "[object CanvasPattern]" || type === "[object CanvasGradient]";
|
|
}
|
|
return false;
|
|
}
|
|
function color(value) {
|
|
return isPatternOrGradient(value) ? value : new Color(value);
|
|
}
|
|
function getHoverColor(value) {
|
|
return isPatternOrGradient(value) ? value : new Color(value).saturate(0.5).darken(0.1).hexString();
|
|
}
|
|
var numbers = [
|
|
"x",
|
|
"y",
|
|
"borderWidth",
|
|
"radius",
|
|
"tension"
|
|
];
|
|
var colors = [
|
|
"color",
|
|
"borderColor",
|
|
"backgroundColor"
|
|
];
|
|
function applyAnimationsDefaults(defaults2) {
|
|
defaults2.set("animation", {
|
|
delay: void 0,
|
|
duration: 1e3,
|
|
easing: "easeOutQuart",
|
|
fn: void 0,
|
|
from: void 0,
|
|
loop: void 0,
|
|
to: void 0,
|
|
type: void 0
|
|
});
|
|
defaults2.describe("animation", {
|
|
_fallback: false,
|
|
_indexable: false,
|
|
_scriptable: (name) => name !== "onProgress" && name !== "onComplete" && name !== "fn"
|
|
});
|
|
defaults2.set("animations", {
|
|
colors: {
|
|
type: "color",
|
|
properties: colors
|
|
},
|
|
numbers: {
|
|
type: "number",
|
|
properties: numbers
|
|
}
|
|
});
|
|
defaults2.describe("animations", {
|
|
_fallback: "animation"
|
|
});
|
|
defaults2.set("transitions", {
|
|
active: {
|
|
animation: {
|
|
duration: 400
|
|
}
|
|
},
|
|
resize: {
|
|
animation: {
|
|
duration: 0
|
|
}
|
|
},
|
|
show: {
|
|
animations: {
|
|
colors: {
|
|
from: "transparent"
|
|
},
|
|
visible: {
|
|
type: "boolean",
|
|
duration: 0
|
|
}
|
|
}
|
|
},
|
|
hide: {
|
|
animations: {
|
|
colors: {
|
|
to: "transparent"
|
|
},
|
|
visible: {
|
|
type: "boolean",
|
|
easing: "linear",
|
|
fn: (v) => v | 0
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
function applyLayoutsDefaults(defaults2) {
|
|
defaults2.set("layout", {
|
|
autoPadding: true,
|
|
padding: {
|
|
top: 0,
|
|
right: 0,
|
|
bottom: 0,
|
|
left: 0
|
|
}
|
|
});
|
|
}
|
|
var intlCache = /* @__PURE__ */ new Map();
|
|
function getNumberFormat(locale2, options) {
|
|
options = options || {};
|
|
const cacheKey = locale2 + JSON.stringify(options);
|
|
let formatter = intlCache.get(cacheKey);
|
|
if (!formatter) {
|
|
formatter = new Intl.NumberFormat(locale2, options);
|
|
intlCache.set(cacheKey, formatter);
|
|
}
|
|
return formatter;
|
|
}
|
|
function formatNumber(num, locale2, options) {
|
|
return getNumberFormat(locale2, options).format(num);
|
|
}
|
|
var formatters = {
|
|
values(value) {
|
|
return isArray(value) ? value : "" + value;
|
|
},
|
|
numeric(tickValue, index, ticks) {
|
|
if (tickValue === 0) {
|
|
return "0";
|
|
}
|
|
const locale2 = this.chart.options.locale;
|
|
let notation;
|
|
let delta = tickValue;
|
|
if (ticks.length > 1) {
|
|
const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));
|
|
if (maxTick < 1e-4 || maxTick > 1e15) {
|
|
notation = "scientific";
|
|
}
|
|
delta = calculateDelta(tickValue, ticks);
|
|
}
|
|
const logDelta = log10(Math.abs(delta));
|
|
const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);
|
|
const options = {
|
|
notation,
|
|
minimumFractionDigits: numDecimal,
|
|
maximumFractionDigits: numDecimal
|
|
};
|
|
Object.assign(options, this.options.ticks.format);
|
|
return formatNumber(tickValue, locale2, options);
|
|
},
|
|
logarithmic(tickValue, index, ticks) {
|
|
if (tickValue === 0) {
|
|
return "0";
|
|
}
|
|
const remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue)));
|
|
if ([
|
|
1,
|
|
2,
|
|
3,
|
|
5,
|
|
10,
|
|
15
|
|
].includes(remain) || index > 0.8 * ticks.length) {
|
|
return formatters.numeric.call(this, tickValue, index, ticks);
|
|
}
|
|
return "";
|
|
}
|
|
};
|
|
function calculateDelta(tickValue, ticks) {
|
|
let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;
|
|
if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {
|
|
delta = tickValue - Math.floor(tickValue);
|
|
}
|
|
return delta;
|
|
}
|
|
var Ticks = {
|
|
formatters
|
|
};
|
|
function applyScaleDefaults(defaults2) {
|
|
defaults2.set("scale", {
|
|
display: true,
|
|
offset: false,
|
|
reverse: false,
|
|
beginAtZero: false,
|
|
bounds: "ticks",
|
|
clip: true,
|
|
grace: 0,
|
|
grid: {
|
|
display: true,
|
|
lineWidth: 1,
|
|
drawOnChartArea: true,
|
|
drawTicks: true,
|
|
tickLength: 8,
|
|
tickWidth: (_ctx, options) => options.lineWidth,
|
|
tickColor: (_ctx, options) => options.color,
|
|
offset: false
|
|
},
|
|
border: {
|
|
display: true,
|
|
dash: [],
|
|
dashOffset: 0,
|
|
width: 1
|
|
},
|
|
title: {
|
|
display: false,
|
|
text: "",
|
|
padding: {
|
|
top: 4,
|
|
bottom: 4
|
|
}
|
|
},
|
|
ticks: {
|
|
minRotation: 0,
|
|
maxRotation: 50,
|
|
mirror: false,
|
|
textStrokeWidth: 0,
|
|
textStrokeColor: "",
|
|
padding: 3,
|
|
display: true,
|
|
autoSkip: true,
|
|
autoSkipPadding: 3,
|
|
labelOffset: 0,
|
|
callback: Ticks.formatters.values,
|
|
minor: {},
|
|
major: {},
|
|
align: "center",
|
|
crossAlign: "near",
|
|
showLabelBackdrop: false,
|
|
backdropColor: "rgba(255, 255, 255, 0.75)",
|
|
backdropPadding: 2
|
|
}
|
|
});
|
|
defaults2.route("scale.ticks", "color", "", "color");
|
|
defaults2.route("scale.grid", "color", "", "borderColor");
|
|
defaults2.route("scale.border", "color", "", "borderColor");
|
|
defaults2.route("scale.title", "color", "", "color");
|
|
defaults2.describe("scale", {
|
|
_fallback: false,
|
|
_scriptable: (name) => !name.startsWith("before") && !name.startsWith("after") && name !== "callback" && name !== "parser",
|
|
_indexable: (name) => name !== "borderDash" && name !== "tickBorderDash" && name !== "dash"
|
|
});
|
|
defaults2.describe("scales", {
|
|
_fallback: "scale"
|
|
});
|
|
defaults2.describe("scale.ticks", {
|
|
_scriptable: (name) => name !== "backdropPadding" && name !== "callback",
|
|
_indexable: (name) => name !== "backdropPadding"
|
|
});
|
|
}
|
|
var overrides = /* @__PURE__ */ Object.create(null);
|
|
var descriptors = /* @__PURE__ */ Object.create(null);
|
|
function getScope$1(node, key) {
|
|
if (!key) {
|
|
return node;
|
|
}
|
|
const keys = key.split(".");
|
|
for (let i = 0, n = keys.length; i < n; ++i) {
|
|
const k = keys[i];
|
|
node = node[k] || (node[k] = /* @__PURE__ */ Object.create(null));
|
|
}
|
|
return node;
|
|
}
|
|
function set(root, scope, values) {
|
|
if (typeof scope === "string") {
|
|
return merge(getScope$1(root, scope), values);
|
|
}
|
|
return merge(getScope$1(root, ""), scope);
|
|
}
|
|
var Defaults = class {
|
|
constructor(_descriptors2, _appliers) {
|
|
this.animation = void 0;
|
|
this.backgroundColor = "rgba(0,0,0,0.1)";
|
|
this.borderColor = "rgba(0,0,0,0.1)";
|
|
this.color = "#666";
|
|
this.datasets = {};
|
|
this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();
|
|
this.elements = {};
|
|
this.events = [
|
|
"mousemove",
|
|
"mouseout",
|
|
"click",
|
|
"touchstart",
|
|
"touchmove"
|
|
];
|
|
this.font = {
|
|
family: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
|
|
size: 12,
|
|
style: "normal",
|
|
lineHeight: 1.2,
|
|
weight: null
|
|
};
|
|
this.hover = {};
|
|
this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);
|
|
this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);
|
|
this.hoverColor = (ctx, options) => getHoverColor(options.color);
|
|
this.indexAxis = "x";
|
|
this.interaction = {
|
|
mode: "nearest",
|
|
intersect: true,
|
|
includeInvisible: false
|
|
};
|
|
this.maintainAspectRatio = true;
|
|
this.onHover = null;
|
|
this.onClick = null;
|
|
this.parsing = true;
|
|
this.plugins = {};
|
|
this.responsive = true;
|
|
this.scale = void 0;
|
|
this.scales = {};
|
|
this.showLine = true;
|
|
this.drawActiveElementsOnTop = true;
|
|
this.describe(_descriptors2);
|
|
this.apply(_appliers);
|
|
}
|
|
set(scope, values) {
|
|
return set(this, scope, values);
|
|
}
|
|
get(scope) {
|
|
return getScope$1(this, scope);
|
|
}
|
|
describe(scope, values) {
|
|
return set(descriptors, scope, values);
|
|
}
|
|
override(scope, values) {
|
|
return set(overrides, scope, values);
|
|
}
|
|
route(scope, name, targetScope, targetName) {
|
|
const scopeObject = getScope$1(this, scope);
|
|
const targetScopeObject = getScope$1(this, targetScope);
|
|
const privateName = "_" + name;
|
|
Object.defineProperties(scopeObject, {
|
|
[privateName]: {
|
|
value: scopeObject[name],
|
|
writable: true
|
|
},
|
|
[name]: {
|
|
enumerable: true,
|
|
get() {
|
|
const local = this[privateName];
|
|
const target = targetScopeObject[targetName];
|
|
if (isObject(local)) {
|
|
return Object.assign({}, target, local);
|
|
}
|
|
return valueOrDefault(local, target);
|
|
},
|
|
set(value) {
|
|
this[privateName] = value;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
apply(appliers) {
|
|
appliers.forEach((apply) => apply(this));
|
|
}
|
|
};
|
|
var defaults = /* @__PURE__ */ new Defaults({
|
|
_scriptable: (name) => !name.startsWith("on"),
|
|
_indexable: (name) => name !== "events",
|
|
hover: {
|
|
_fallback: "interaction"
|
|
},
|
|
interaction: {
|
|
_scriptable: false,
|
|
_indexable: false
|
|
}
|
|
}, [
|
|
applyAnimationsDefaults,
|
|
applyLayoutsDefaults,
|
|
applyScaleDefaults
|
|
]);
|
|
function toFontString(font) {
|
|
if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {
|
|
return null;
|
|
}
|
|
return (font.style ? font.style + " " : "") + (font.weight ? font.weight + " " : "") + font.size + "px " + font.family;
|
|
}
|
|
function _measureText(ctx, data, gc, longest, string) {
|
|
let textWidth = data[string];
|
|
if (!textWidth) {
|
|
textWidth = data[string] = ctx.measureText(string).width;
|
|
gc.push(string);
|
|
}
|
|
if (textWidth > longest) {
|
|
longest = textWidth;
|
|
}
|
|
return longest;
|
|
}
|
|
function _longestText(ctx, font, arrayOfThings, cache) {
|
|
cache = cache || {};
|
|
let data = cache.data = cache.data || {};
|
|
let gc = cache.garbageCollect = cache.garbageCollect || [];
|
|
if (cache.font !== font) {
|
|
data = cache.data = {};
|
|
gc = cache.garbageCollect = [];
|
|
cache.font = font;
|
|
}
|
|
ctx.save();
|
|
ctx.font = font;
|
|
let longest = 0;
|
|
const ilen = arrayOfThings.length;
|
|
let i, j, jlen, thing, nestedThing;
|
|
for (i = 0; i < ilen; i++) {
|
|
thing = arrayOfThings[i];
|
|
if (thing !== void 0 && thing !== null && !isArray(thing)) {
|
|
longest = _measureText(ctx, data, gc, longest, thing);
|
|
} else if (isArray(thing)) {
|
|
for (j = 0, jlen = thing.length; j < jlen; j++) {
|
|
nestedThing = thing[j];
|
|
if (nestedThing !== void 0 && nestedThing !== null && !isArray(nestedThing)) {
|
|
longest = _measureText(ctx, data, gc, longest, nestedThing);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ctx.restore();
|
|
const gcLen = gc.length / 2;
|
|
if (gcLen > arrayOfThings.length) {
|
|
for (i = 0; i < gcLen; i++) {
|
|
delete data[gc[i]];
|
|
}
|
|
gc.splice(0, gcLen);
|
|
}
|
|
return longest;
|
|
}
|
|
function _alignPixel(chart, pixel, width) {
|
|
const devicePixelRatio = chart.currentDevicePixelRatio;
|
|
const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;
|
|
return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;
|
|
}
|
|
function clearCanvas(canvas, ctx) {
|
|
ctx = ctx || canvas.getContext("2d");
|
|
ctx.save();
|
|
ctx.resetTransform();
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
ctx.restore();
|
|
}
|
|
function drawPoint(ctx, options, x, y) {
|
|
drawPointLegend(ctx, options, x, y, null);
|
|
}
|
|
function drawPointLegend(ctx, options, x, y, w) {
|
|
let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW;
|
|
const style = options.pointStyle;
|
|
const rotation = options.rotation;
|
|
const radius = options.radius;
|
|
let rad = (rotation || 0) * RAD_PER_DEG;
|
|
if (style && typeof style === "object") {
|
|
type = style.toString();
|
|
if (type === "[object HTMLImageElement]" || type === "[object HTMLCanvasElement]") {
|
|
ctx.save();
|
|
ctx.translate(x, y);
|
|
ctx.rotate(rad);
|
|
ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
}
|
|
if (isNaN(radius) || radius <= 0) {
|
|
return;
|
|
}
|
|
ctx.beginPath();
|
|
switch (style) {
|
|
default:
|
|
if (w) {
|
|
ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);
|
|
} else {
|
|
ctx.arc(x, y, radius, 0, TAU);
|
|
}
|
|
ctx.closePath();
|
|
break;
|
|
case "triangle":
|
|
width = w ? w / 2 : radius;
|
|
ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);
|
|
rad += TWO_THIRDS_PI;
|
|
ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);
|
|
rad += TWO_THIRDS_PI;
|
|
ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);
|
|
ctx.closePath();
|
|
break;
|
|
case "rectRounded":
|
|
cornerRadius = radius * 0.516;
|
|
size = radius - cornerRadius;
|
|
xOffset = Math.cos(rad + QUARTER_PI) * size;
|
|
xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);
|
|
yOffset = Math.sin(rad + QUARTER_PI) * size;
|
|
yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);
|
|
ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);
|
|
ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);
|
|
ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);
|
|
ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);
|
|
ctx.closePath();
|
|
break;
|
|
case "rect":
|
|
if (!rotation) {
|
|
size = Math.SQRT1_2 * radius;
|
|
width = w ? w / 2 : size;
|
|
ctx.rect(x - width, y - size, 2 * width, 2 * size);
|
|
break;
|
|
}
|
|
rad += QUARTER_PI;
|
|
case "rectRot":
|
|
xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);
|
|
xOffset = Math.cos(rad) * radius;
|
|
yOffset = Math.sin(rad) * radius;
|
|
yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);
|
|
ctx.moveTo(x - xOffsetW, y - yOffset);
|
|
ctx.lineTo(x + yOffsetW, y - xOffset);
|
|
ctx.lineTo(x + xOffsetW, y + yOffset);
|
|
ctx.lineTo(x - yOffsetW, y + xOffset);
|
|
ctx.closePath();
|
|
break;
|
|
case "crossRot":
|
|
rad += QUARTER_PI;
|
|
case "cross":
|
|
xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);
|
|
xOffset = Math.cos(rad) * radius;
|
|
yOffset = Math.sin(rad) * radius;
|
|
yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);
|
|
ctx.moveTo(x - xOffsetW, y - yOffset);
|
|
ctx.lineTo(x + xOffsetW, y + yOffset);
|
|
ctx.moveTo(x + yOffsetW, y - xOffset);
|
|
ctx.lineTo(x - yOffsetW, y + xOffset);
|
|
break;
|
|
case "star":
|
|
xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);
|
|
xOffset = Math.cos(rad) * radius;
|
|
yOffset = Math.sin(rad) * radius;
|
|
yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);
|
|
ctx.moveTo(x - xOffsetW, y - yOffset);
|
|
ctx.lineTo(x + xOffsetW, y + yOffset);
|
|
ctx.moveTo(x + yOffsetW, y - xOffset);
|
|
ctx.lineTo(x - yOffsetW, y + xOffset);
|
|
rad += QUARTER_PI;
|
|
xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);
|
|
xOffset = Math.cos(rad) * radius;
|
|
yOffset = Math.sin(rad) * radius;
|
|
yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);
|
|
ctx.moveTo(x - xOffsetW, y - yOffset);
|
|
ctx.lineTo(x + xOffsetW, y + yOffset);
|
|
ctx.moveTo(x + yOffsetW, y - xOffset);
|
|
ctx.lineTo(x - yOffsetW, y + xOffset);
|
|
break;
|
|
case "line":
|
|
xOffset = w ? w / 2 : Math.cos(rad) * radius;
|
|
yOffset = Math.sin(rad) * radius;
|
|
ctx.moveTo(x - xOffset, y - yOffset);
|
|
ctx.lineTo(x + xOffset, y + yOffset);
|
|
break;
|
|
case "dash":
|
|
ctx.moveTo(x, y);
|
|
ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);
|
|
break;
|
|
case false:
|
|
ctx.closePath();
|
|
break;
|
|
}
|
|
ctx.fill();
|
|
if (options.borderWidth > 0) {
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
function _isPointInArea(point, area, margin) {
|
|
margin = margin || 0.5;
|
|
return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin;
|
|
}
|
|
function clipArea(ctx, area) {
|
|
ctx.save();
|
|
ctx.beginPath();
|
|
ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);
|
|
ctx.clip();
|
|
}
|
|
function unclipArea(ctx) {
|
|
ctx.restore();
|
|
}
|
|
function setRenderOpts(ctx, opts) {
|
|
if (opts.translation) {
|
|
ctx.translate(opts.translation[0], opts.translation[1]);
|
|
}
|
|
if (!isNullOrUndef(opts.rotation)) {
|
|
ctx.rotate(opts.rotation);
|
|
}
|
|
if (opts.color) {
|
|
ctx.fillStyle = opts.color;
|
|
}
|
|
if (opts.textAlign) {
|
|
ctx.textAlign = opts.textAlign;
|
|
}
|
|
if (opts.textBaseline) {
|
|
ctx.textBaseline = opts.textBaseline;
|
|
}
|
|
}
|
|
function decorateText(ctx, x, y, line, opts) {
|
|
if (opts.strikethrough || opts.underline) {
|
|
const metrics = ctx.measureText(line);
|
|
const left = x - metrics.actualBoundingBoxLeft;
|
|
const right = x + metrics.actualBoundingBoxRight;
|
|
const top = y - metrics.actualBoundingBoxAscent;
|
|
const bottom = y + metrics.actualBoundingBoxDescent;
|
|
const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;
|
|
ctx.strokeStyle = ctx.fillStyle;
|
|
ctx.beginPath();
|
|
ctx.lineWidth = opts.decorationWidth || 2;
|
|
ctx.moveTo(left, yDecoration);
|
|
ctx.lineTo(right, yDecoration);
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
function drawBackdrop(ctx, opts) {
|
|
const oldColor = ctx.fillStyle;
|
|
ctx.fillStyle = opts.color;
|
|
ctx.fillRect(opts.left, opts.top, opts.width, opts.height);
|
|
ctx.fillStyle = oldColor;
|
|
}
|
|
function renderText(ctx, text, x, y, font, opts = {}) {
|
|
const lines = isArray(text) ? text : [
|
|
text
|
|
];
|
|
const stroke = opts.strokeWidth > 0 && opts.strokeColor !== "";
|
|
let i, line;
|
|
ctx.save();
|
|
ctx.font = font.string;
|
|
setRenderOpts(ctx, opts);
|
|
for (i = 0; i < lines.length; ++i) {
|
|
line = lines[i];
|
|
if (opts.backdrop) {
|
|
drawBackdrop(ctx, opts.backdrop);
|
|
}
|
|
if (stroke) {
|
|
if (opts.strokeColor) {
|
|
ctx.strokeStyle = opts.strokeColor;
|
|
}
|
|
if (!isNullOrUndef(opts.strokeWidth)) {
|
|
ctx.lineWidth = opts.strokeWidth;
|
|
}
|
|
ctx.strokeText(line, x, y, opts.maxWidth);
|
|
}
|
|
ctx.fillText(line, x, y, opts.maxWidth);
|
|
decorateText(ctx, x, y, line, opts);
|
|
y += Number(font.lineHeight);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
function addRoundedRectPath(ctx, rect) {
|
|
const { x, y, w, h: h4, radius } = rect;
|
|
ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);
|
|
ctx.lineTo(x, y + h4 - radius.bottomLeft);
|
|
ctx.arc(x + radius.bottomLeft, y + h4 - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);
|
|
ctx.lineTo(x + w - radius.bottomRight, y + h4);
|
|
ctx.arc(x + w - radius.bottomRight, y + h4 - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);
|
|
ctx.lineTo(x + w, y + radius.topRight);
|
|
ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);
|
|
ctx.lineTo(x + radius.topLeft, y);
|
|
}
|
|
var LINE_HEIGHT = /^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/;
|
|
var FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;
|
|
function toLineHeight(value, size) {
|
|
const matches = ("" + value).match(LINE_HEIGHT);
|
|
if (!matches || matches[1] === "normal") {
|
|
return size * 1.2;
|
|
}
|
|
value = +matches[2];
|
|
switch (matches[3]) {
|
|
case "px":
|
|
return value;
|
|
case "%":
|
|
value /= 100;
|
|
break;
|
|
}
|
|
return size * value;
|
|
}
|
|
var numberOrZero = (v) => +v || 0;
|
|
function _readValueToProps(value, props) {
|
|
const ret = {};
|
|
const objProps = isObject(props);
|
|
const keys = objProps ? Object.keys(props) : props;
|
|
const read = isObject(value) ? objProps ? (prop) => valueOrDefault(value[prop], value[props[prop]]) : (prop) => value[prop] : () => value;
|
|
for (const prop of keys) {
|
|
ret[prop] = numberOrZero(read(prop));
|
|
}
|
|
return ret;
|
|
}
|
|
function toTRBL(value) {
|
|
return _readValueToProps(value, {
|
|
top: "y",
|
|
right: "x",
|
|
bottom: "y",
|
|
left: "x"
|
|
});
|
|
}
|
|
function toTRBLCorners(value) {
|
|
return _readValueToProps(value, [
|
|
"topLeft",
|
|
"topRight",
|
|
"bottomLeft",
|
|
"bottomRight"
|
|
]);
|
|
}
|
|
function toPadding(value) {
|
|
const obj = toTRBL(value);
|
|
obj.width = obj.left + obj.right;
|
|
obj.height = obj.top + obj.bottom;
|
|
return obj;
|
|
}
|
|
function toFont(options, fallback) {
|
|
options = options || {};
|
|
fallback = fallback || defaults.font;
|
|
let size = valueOrDefault(options.size, fallback.size);
|
|
if (typeof size === "string") {
|
|
size = parseInt(size, 10);
|
|
}
|
|
let style = valueOrDefault(options.style, fallback.style);
|
|
if (style && !("" + style).match(FONT_STYLE)) {
|
|
console.warn('Invalid font style specified: "' + style + '"');
|
|
style = void 0;
|
|
}
|
|
const font = {
|
|
family: valueOrDefault(options.family, fallback.family),
|
|
lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),
|
|
size,
|
|
style,
|
|
weight: valueOrDefault(options.weight, fallback.weight),
|
|
string: ""
|
|
};
|
|
font.string = toFontString(font);
|
|
return font;
|
|
}
|
|
function resolve(inputs, context, index, info) {
|
|
let cacheable = true;
|
|
let i, ilen, value;
|
|
for (i = 0, ilen = inputs.length; i < ilen; ++i) {
|
|
value = inputs[i];
|
|
if (value === void 0) {
|
|
continue;
|
|
}
|
|
if (context !== void 0 && typeof value === "function") {
|
|
value = value(context);
|
|
cacheable = false;
|
|
}
|
|
if (index !== void 0 && isArray(value)) {
|
|
value = value[index % value.length];
|
|
cacheable = false;
|
|
}
|
|
if (value !== void 0) {
|
|
if (info && !cacheable) {
|
|
info.cacheable = false;
|
|
}
|
|
return value;
|
|
}
|
|
}
|
|
}
|
|
function _addGrace(minmax, grace, beginAtZero) {
|
|
const { min, max } = minmax;
|
|
const change = toDimension(grace, (max - min) / 2);
|
|
const keepZero = (value, add) => beginAtZero && value === 0 ? 0 : value + add;
|
|
return {
|
|
min: keepZero(min, -Math.abs(change)),
|
|
max: keepZero(max, change)
|
|
};
|
|
}
|
|
function createContext(parentContext, context) {
|
|
return Object.assign(Object.create(parentContext), context);
|
|
}
|
|
function _createResolver(scopes, prefixes = [
|
|
""
|
|
], rootScopes, fallback, getTarget = () => scopes[0]) {
|
|
const finalRootScopes = rootScopes || scopes;
|
|
if (typeof fallback === "undefined") {
|
|
fallback = _resolve("_fallback", scopes);
|
|
}
|
|
const cache = {
|
|
[Symbol.toStringTag]: "Object",
|
|
_cacheable: true,
|
|
_scopes: scopes,
|
|
_rootScopes: finalRootScopes,
|
|
_fallback: fallback,
|
|
_getTarget: getTarget,
|
|
override: (scope) => _createResolver([
|
|
scope,
|
|
...scopes
|
|
], prefixes, finalRootScopes, fallback)
|
|
};
|
|
return new Proxy(cache, {
|
|
/**
|
|
* A trap for the delete operator.
|
|
*/
|
|
deleteProperty(target, prop) {
|
|
delete target[prop];
|
|
delete target._keys;
|
|
delete scopes[0][prop];
|
|
return true;
|
|
},
|
|
/**
|
|
* A trap for getting property values.
|
|
*/
|
|
get(target, prop) {
|
|
return _cached(target, prop, () => _resolveWithPrefixes(prop, prefixes, scopes, target));
|
|
},
|
|
/**
|
|
* A trap for Object.getOwnPropertyDescriptor.
|
|
* Also used by Object.hasOwnProperty.
|
|
*/
|
|
getOwnPropertyDescriptor(target, prop) {
|
|
return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);
|
|
},
|
|
/**
|
|
* A trap for Object.getPrototypeOf.
|
|
*/
|
|
getPrototypeOf() {
|
|
return Reflect.getPrototypeOf(scopes[0]);
|
|
},
|
|
/**
|
|
* A trap for the in operator.
|
|
*/
|
|
has(target, prop) {
|
|
return getKeysFromAllScopes(target).includes(prop);
|
|
},
|
|
/**
|
|
* A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.
|
|
*/
|
|
ownKeys(target) {
|
|
return getKeysFromAllScopes(target);
|
|
},
|
|
/**
|
|
* A trap for setting property values.
|
|
*/
|
|
set(target, prop, value) {
|
|
const storage = target._storage || (target._storage = getTarget());
|
|
target[prop] = storage[prop] = value;
|
|
delete target._keys;
|
|
return true;
|
|
}
|
|
});
|
|
}
|
|
function _attachContext(proxy, context, subProxy, descriptorDefaults) {
|
|
const cache = {
|
|
_cacheable: false,
|
|
_proxy: proxy,
|
|
_context: context,
|
|
_subProxy: subProxy,
|
|
_stack: /* @__PURE__ */ new Set(),
|
|
_descriptors: _descriptors(proxy, descriptorDefaults),
|
|
setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),
|
|
override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)
|
|
};
|
|
return new Proxy(cache, {
|
|
/**
|
|
* A trap for the delete operator.
|
|
*/
|
|
deleteProperty(target, prop) {
|
|
delete target[prop];
|
|
delete proxy[prop];
|
|
return true;
|
|
},
|
|
/**
|
|
* A trap for getting property values.
|
|
*/
|
|
get(target, prop, receiver) {
|
|
return _cached(target, prop, () => _resolveWithContext(target, prop, receiver));
|
|
},
|
|
/**
|
|
* A trap for Object.getOwnPropertyDescriptor.
|
|
* Also used by Object.hasOwnProperty.
|
|
*/
|
|
getOwnPropertyDescriptor(target, prop) {
|
|
return target._descriptors.allKeys ? Reflect.has(proxy, prop) ? {
|
|
enumerable: true,
|
|
configurable: true
|
|
} : void 0 : Reflect.getOwnPropertyDescriptor(proxy, prop);
|
|
},
|
|
/**
|
|
* A trap for Object.getPrototypeOf.
|
|
*/
|
|
getPrototypeOf() {
|
|
return Reflect.getPrototypeOf(proxy);
|
|
},
|
|
/**
|
|
* A trap for the in operator.
|
|
*/
|
|
has(target, prop) {
|
|
return Reflect.has(proxy, prop);
|
|
},
|
|
/**
|
|
* A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.
|
|
*/
|
|
ownKeys() {
|
|
return Reflect.ownKeys(proxy);
|
|
},
|
|
/**
|
|
* A trap for setting property values.
|
|
*/
|
|
set(target, prop, value) {
|
|
proxy[prop] = value;
|
|
delete target[prop];
|
|
return true;
|
|
}
|
|
});
|
|
}
|
|
function _descriptors(proxy, defaults2 = {
|
|
scriptable: true,
|
|
indexable: true
|
|
}) {
|
|
const { _scriptable = defaults2.scriptable, _indexable = defaults2.indexable, _allKeys = defaults2.allKeys } = proxy;
|
|
return {
|
|
allKeys: _allKeys,
|
|
scriptable: _scriptable,
|
|
indexable: _indexable,
|
|
isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,
|
|
isIndexable: isFunction(_indexable) ? _indexable : () => _indexable
|
|
};
|
|
}
|
|
var readKey = (prefix, name) => prefix ? prefix + _capitalize(name) : name;
|
|
var needsSubResolver = (prop, value) => isObject(value) && prop !== "adapters" && (Object.getPrototypeOf(value) === null || value.constructor === Object);
|
|
function _cached(target, prop, resolve2) {
|
|
if (Object.prototype.hasOwnProperty.call(target, prop)) {
|
|
return target[prop];
|
|
}
|
|
const value = resolve2();
|
|
target[prop] = value;
|
|
return value;
|
|
}
|
|
function _resolveWithContext(target, prop, receiver) {
|
|
const { _proxy, _context, _subProxy, _descriptors: descriptors2 } = target;
|
|
let value = _proxy[prop];
|
|
if (isFunction(value) && descriptors2.isScriptable(prop)) {
|
|
value = _resolveScriptable(prop, value, target, receiver);
|
|
}
|
|
if (isArray(value) && value.length) {
|
|
value = _resolveArray(prop, value, target, descriptors2.isIndexable);
|
|
}
|
|
if (needsSubResolver(prop, value)) {
|
|
value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors2);
|
|
}
|
|
return value;
|
|
}
|
|
function _resolveScriptable(prop, getValue, target, receiver) {
|
|
const { _proxy, _context, _subProxy, _stack } = target;
|
|
if (_stack.has(prop)) {
|
|
throw new Error("Recursion detected: " + Array.from(_stack).join("->") + "->" + prop);
|
|
}
|
|
_stack.add(prop);
|
|
let value = getValue(_context, _subProxy || receiver);
|
|
_stack.delete(prop);
|
|
if (needsSubResolver(prop, value)) {
|
|
value = createSubResolver(_proxy._scopes, _proxy, prop, value);
|
|
}
|
|
return value;
|
|
}
|
|
function _resolveArray(prop, value, target, isIndexable) {
|
|
const { _proxy, _context, _subProxy, _descriptors: descriptors2 } = target;
|
|
if (typeof _context.index !== "undefined" && isIndexable(prop)) {
|
|
return value[_context.index % value.length];
|
|
} else if (isObject(value[0])) {
|
|
const arr = value;
|
|
const scopes = _proxy._scopes.filter((s) => s !== arr);
|
|
value = [];
|
|
for (const item of arr) {
|
|
const resolver = createSubResolver(scopes, _proxy, prop, item);
|
|
value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors2));
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
function resolveFallback(fallback, prop, value) {
|
|
return isFunction(fallback) ? fallback(prop, value) : fallback;
|
|
}
|
|
var getScope = (key, parent) => key === true ? parent : typeof key === "string" ? resolveObjectKey(parent, key) : void 0;
|
|
function addScopes(set2, parentScopes, key, parentFallback, value) {
|
|
for (const parent of parentScopes) {
|
|
const scope = getScope(key, parent);
|
|
if (scope) {
|
|
set2.add(scope);
|
|
const fallback = resolveFallback(scope._fallback, key, value);
|
|
if (typeof fallback !== "undefined" && fallback !== key && fallback !== parentFallback) {
|
|
return fallback;
|
|
}
|
|
} else if (scope === false && typeof parentFallback !== "undefined" && key !== parentFallback) {
|
|
return null;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function createSubResolver(parentScopes, resolver, prop, value) {
|
|
const rootScopes = resolver._rootScopes;
|
|
const fallback = resolveFallback(resolver._fallback, prop, value);
|
|
const allScopes = [
|
|
...parentScopes,
|
|
...rootScopes
|
|
];
|
|
const set2 = /* @__PURE__ */ new Set();
|
|
set2.add(value);
|
|
let key = addScopesFromKey(set2, allScopes, prop, fallback || prop, value);
|
|
if (key === null) {
|
|
return false;
|
|
}
|
|
if (typeof fallback !== "undefined" && fallback !== prop) {
|
|
key = addScopesFromKey(set2, allScopes, fallback, key, value);
|
|
if (key === null) {
|
|
return false;
|
|
}
|
|
}
|
|
return _createResolver(Array.from(set2), [
|
|
""
|
|
], rootScopes, fallback, () => subGetTarget(resolver, prop, value));
|
|
}
|
|
function addScopesFromKey(set2, allScopes, key, fallback, item) {
|
|
while (key) {
|
|
key = addScopes(set2, allScopes, key, fallback, item);
|
|
}
|
|
return key;
|
|
}
|
|
function subGetTarget(resolver, prop, value) {
|
|
const parent = resolver._getTarget();
|
|
if (!(prop in parent)) {
|
|
parent[prop] = {};
|
|
}
|
|
const target = parent[prop];
|
|
if (isArray(target) && isObject(value)) {
|
|
return value;
|
|
}
|
|
return target || {};
|
|
}
|
|
function _resolveWithPrefixes(prop, prefixes, scopes, proxy) {
|
|
let value;
|
|
for (const prefix of prefixes) {
|
|
value = _resolve(readKey(prefix, prop), scopes);
|
|
if (typeof value !== "undefined") {
|
|
return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value;
|
|
}
|
|
}
|
|
}
|
|
function _resolve(key, scopes) {
|
|
for (const scope of scopes) {
|
|
if (!scope) {
|
|
continue;
|
|
}
|
|
const value = scope[key];
|
|
if (typeof value !== "undefined") {
|
|
return value;
|
|
}
|
|
}
|
|
}
|
|
function getKeysFromAllScopes(target) {
|
|
let keys = target._keys;
|
|
if (!keys) {
|
|
keys = target._keys = resolveKeysFromAllScopes(target._scopes);
|
|
}
|
|
return keys;
|
|
}
|
|
function resolveKeysFromAllScopes(scopes) {
|
|
const set2 = /* @__PURE__ */ new Set();
|
|
for (const scope of scopes) {
|
|
for (const key of Object.keys(scope).filter((k) => !k.startsWith("_"))) {
|
|
set2.add(key);
|
|
}
|
|
}
|
|
return Array.from(set2);
|
|
}
|
|
var EPSILON = Number.EPSILON || 1e-14;
|
|
function _isDomSupported() {
|
|
return typeof window !== "undefined" && typeof document !== "undefined";
|
|
}
|
|
function _getParentNode(domNode) {
|
|
let parent = domNode.parentNode;
|
|
if (parent && parent.toString() === "[object ShadowRoot]") {
|
|
parent = parent.host;
|
|
}
|
|
return parent;
|
|
}
|
|
function parseMaxStyle(styleValue, node, parentProperty) {
|
|
let valueInPixels;
|
|
if (typeof styleValue === "string") {
|
|
valueInPixels = parseInt(styleValue, 10);
|
|
if (styleValue.indexOf("%") !== -1) {
|
|
valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];
|
|
}
|
|
} else {
|
|
valueInPixels = styleValue;
|
|
}
|
|
return valueInPixels;
|
|
}
|
|
var getComputedStyle2 = (element) => element.ownerDocument.defaultView.getComputedStyle(element, null);
|
|
function getStyle(el, property) {
|
|
return getComputedStyle2(el).getPropertyValue(property);
|
|
}
|
|
var positions = [
|
|
"top",
|
|
"right",
|
|
"bottom",
|
|
"left"
|
|
];
|
|
function getPositionedStyle(styles, style, suffix) {
|
|
const result = {};
|
|
suffix = suffix ? "-" + suffix : "";
|
|
for (let i = 0; i < 4; i++) {
|
|
const pos = positions[i];
|
|
result[pos] = parseFloat(styles[style + "-" + pos + suffix]) || 0;
|
|
}
|
|
result.width = result.left + result.right;
|
|
result.height = result.top + result.bottom;
|
|
return result;
|
|
}
|
|
var useOffsetPos = (x, y, target) => (x > 0 || y > 0) && (!target || !target.shadowRoot);
|
|
function getCanvasPosition(e, canvas) {
|
|
const touches = e.touches;
|
|
const source = touches && touches.length ? touches[0] : e;
|
|
const { offsetX, offsetY } = source;
|
|
let box = false;
|
|
let x, y;
|
|
if (useOffsetPos(offsetX, offsetY, e.target)) {
|
|
x = offsetX;
|
|
y = offsetY;
|
|
} else {
|
|
const rect = canvas.getBoundingClientRect();
|
|
x = source.clientX - rect.left;
|
|
y = source.clientY - rect.top;
|
|
box = true;
|
|
}
|
|
return {
|
|
x,
|
|
y,
|
|
box
|
|
};
|
|
}
|
|
function getRelativePosition(event, chart) {
|
|
if ("native" in event) {
|
|
return event;
|
|
}
|
|
const { canvas, currentDevicePixelRatio } = chart;
|
|
const style = getComputedStyle2(canvas);
|
|
const borderBox = style.boxSizing === "border-box";
|
|
const paddings = getPositionedStyle(style, "padding");
|
|
const borders = getPositionedStyle(style, "border", "width");
|
|
const { x, y, box } = getCanvasPosition(event, canvas);
|
|
const xOffset = paddings.left + (box && borders.left);
|
|
const yOffset = paddings.top + (box && borders.top);
|
|
let { width, height } = chart;
|
|
if (borderBox) {
|
|
width -= paddings.width + borders.width;
|
|
height -= paddings.height + borders.height;
|
|
}
|
|
return {
|
|
x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),
|
|
y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)
|
|
};
|
|
}
|
|
function getContainerSize(canvas, width, height) {
|
|
let maxWidth, maxHeight;
|
|
if (width === void 0 || height === void 0) {
|
|
const container = _getParentNode(canvas);
|
|
if (!container) {
|
|
width = canvas.clientWidth;
|
|
height = canvas.clientHeight;
|
|
} else {
|
|
const rect = container.getBoundingClientRect();
|
|
const containerStyle = getComputedStyle2(container);
|
|
const containerBorder = getPositionedStyle(containerStyle, "border", "width");
|
|
const containerPadding = getPositionedStyle(containerStyle, "padding");
|
|
width = rect.width - containerPadding.width - containerBorder.width;
|
|
height = rect.height - containerPadding.height - containerBorder.height;
|
|
maxWidth = parseMaxStyle(containerStyle.maxWidth, container, "clientWidth");
|
|
maxHeight = parseMaxStyle(containerStyle.maxHeight, container, "clientHeight");
|
|
}
|
|
}
|
|
return {
|
|
width,
|
|
height,
|
|
maxWidth: maxWidth || INFINITY,
|
|
maxHeight: maxHeight || INFINITY
|
|
};
|
|
}
|
|
var round1 = (v) => Math.round(v * 10) / 10;
|
|
function getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {
|
|
const style = getComputedStyle2(canvas);
|
|
const margins = getPositionedStyle(style, "margin");
|
|
const maxWidth = parseMaxStyle(style.maxWidth, canvas, "clientWidth") || INFINITY;
|
|
const maxHeight = parseMaxStyle(style.maxHeight, canvas, "clientHeight") || INFINITY;
|
|
const containerSize = getContainerSize(canvas, bbWidth, bbHeight);
|
|
let { width, height } = containerSize;
|
|
if (style.boxSizing === "content-box") {
|
|
const borders = getPositionedStyle(style, "border", "width");
|
|
const paddings = getPositionedStyle(style, "padding");
|
|
width -= paddings.width + borders.width;
|
|
height -= paddings.height + borders.height;
|
|
}
|
|
width = Math.max(0, width - margins.width);
|
|
height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);
|
|
width = round1(Math.min(width, maxWidth, containerSize.maxWidth));
|
|
height = round1(Math.min(height, maxHeight, containerSize.maxHeight));
|
|
if (width && !height) {
|
|
height = round1(width / 2);
|
|
}
|
|
const maintainHeight = bbWidth !== void 0 || bbHeight !== void 0;
|
|
if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {
|
|
height = containerSize.height;
|
|
width = round1(Math.floor(height * aspectRatio));
|
|
}
|
|
return {
|
|
width,
|
|
height
|
|
};
|
|
}
|
|
function retinaScale(chart, forceRatio, forceStyle) {
|
|
const pixelRatio = forceRatio || 1;
|
|
const deviceHeight = Math.floor(chart.height * pixelRatio);
|
|
const deviceWidth = Math.floor(chart.width * pixelRatio);
|
|
chart.height = Math.floor(chart.height);
|
|
chart.width = Math.floor(chart.width);
|
|
const canvas = chart.canvas;
|
|
if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) {
|
|
canvas.style.height = `${chart.height}px`;
|
|
canvas.style.width = `${chart.width}px`;
|
|
}
|
|
if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) {
|
|
chart.currentDevicePixelRatio = pixelRatio;
|
|
canvas.height = deviceHeight;
|
|
canvas.width = deviceWidth;
|
|
chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
var supportsEventListenerOptions = function() {
|
|
let passiveSupported = false;
|
|
try {
|
|
const options = {
|
|
get passive() {
|
|
passiveSupported = true;
|
|
return false;
|
|
}
|
|
};
|
|
if (_isDomSupported()) {
|
|
window.addEventListener("test", null, options);
|
|
window.removeEventListener("test", null, options);
|
|
}
|
|
} catch (e) {
|
|
}
|
|
return passiveSupported;
|
|
}();
|
|
function readUsedSize(element, property) {
|
|
const value = getStyle(element, property);
|
|
const matches = value && value.match(/^(\d+)(\.\d+)?px$/);
|
|
return matches ? +matches[1] : void 0;
|
|
}
|
|
var getRightToLeftAdapter = function(rectX, width) {
|
|
return {
|
|
x(x) {
|
|
return rectX + rectX + width - x;
|
|
},
|
|
setWidth(w) {
|
|
width = w;
|
|
},
|
|
textAlign(align) {
|
|
if (align === "center") {
|
|
return align;
|
|
}
|
|
return align === "right" ? "left" : "right";
|
|
},
|
|
xPlus(x, value) {
|
|
return x - value;
|
|
},
|
|
leftForLtr(x, itemWidth) {
|
|
return x - itemWidth;
|
|
}
|
|
};
|
|
};
|
|
var getLeftToRightAdapter = function() {
|
|
return {
|
|
x(x) {
|
|
return x;
|
|
},
|
|
setWidth(w) {
|
|
},
|
|
textAlign(align) {
|
|
return align;
|
|
},
|
|
xPlus(x, value) {
|
|
return x + value;
|
|
},
|
|
leftForLtr(x, _itemWidth) {
|
|
return x;
|
|
}
|
|
};
|
|
};
|
|
function getRtlAdapter(rtl, rectX, width) {
|
|
return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();
|
|
}
|
|
function overrideTextDirection(ctx, direction) {
|
|
let style, original;
|
|
if (direction === "ltr" || direction === "rtl") {
|
|
style = ctx.canvas.style;
|
|
original = [
|
|
style.getPropertyValue("direction"),
|
|
style.getPropertyPriority("direction")
|
|
];
|
|
style.setProperty("direction", direction, "important");
|
|
ctx.prevTextDirection = original;
|
|
}
|
|
}
|
|
function restoreTextDirection(ctx, original) {
|
|
if (original !== void 0) {
|
|
delete ctx.prevTextDirection;
|
|
ctx.canvas.style.setProperty("direction", original[0], original[1]);
|
|
}
|
|
}
|
|
|
|
// node_modules/.pnpm/chart.js@4.4.1/node_modules/chart.js/dist/chart.js
|
|
var Animator = class {
|
|
constructor() {
|
|
this._request = null;
|
|
this._charts = /* @__PURE__ */ new Map();
|
|
this._running = false;
|
|
this._lastDate = void 0;
|
|
}
|
|
_notify(chart, anims, date, type) {
|
|
const callbacks = anims.listeners[type];
|
|
const numSteps = anims.duration;
|
|
callbacks.forEach((fn) => fn({
|
|
chart,
|
|
initial: anims.initial,
|
|
numSteps,
|
|
currentStep: Math.min(date - anims.start, numSteps)
|
|
}));
|
|
}
|
|
_refresh() {
|
|
if (this._request) {
|
|
return;
|
|
}
|
|
this._running = true;
|
|
this._request = requestAnimFrame.call(window, () => {
|
|
this._update();
|
|
this._request = null;
|
|
if (this._running) {
|
|
this._refresh();
|
|
}
|
|
});
|
|
}
|
|
_update(date = Date.now()) {
|
|
let remaining = 0;
|
|
this._charts.forEach((anims, chart) => {
|
|
if (!anims.running || !anims.items.length) {
|
|
return;
|
|
}
|
|
const items = anims.items;
|
|
let i = items.length - 1;
|
|
let draw = false;
|
|
let item;
|
|
for (; i >= 0; --i) {
|
|
item = items[i];
|
|
if (item._active) {
|
|
if (item._total > anims.duration) {
|
|
anims.duration = item._total;
|
|
}
|
|
item.tick(date);
|
|
draw = true;
|
|
} else {
|
|
items[i] = items[items.length - 1];
|
|
items.pop();
|
|
}
|
|
}
|
|
if (draw) {
|
|
chart.draw();
|
|
this._notify(chart, anims, date, "progress");
|
|
}
|
|
if (!items.length) {
|
|
anims.running = false;
|
|
this._notify(chart, anims, date, "complete");
|
|
anims.initial = false;
|
|
}
|
|
remaining += items.length;
|
|
});
|
|
this._lastDate = date;
|
|
if (remaining === 0) {
|
|
this._running = false;
|
|
}
|
|
}
|
|
_getAnims(chart) {
|
|
const charts = this._charts;
|
|
let anims = charts.get(chart);
|
|
if (!anims) {
|
|
anims = {
|
|
running: false,
|
|
initial: true,
|
|
items: [],
|
|
listeners: {
|
|
complete: [],
|
|
progress: []
|
|
}
|
|
};
|
|
charts.set(chart, anims);
|
|
}
|
|
return anims;
|
|
}
|
|
listen(chart, event, cb) {
|
|
this._getAnims(chart).listeners[event].push(cb);
|
|
}
|
|
add(chart, items) {
|
|
if (!items || !items.length) {
|
|
return;
|
|
}
|
|
this._getAnims(chart).items.push(...items);
|
|
}
|
|
has(chart) {
|
|
return this._getAnims(chart).items.length > 0;
|
|
}
|
|
start(chart) {
|
|
const anims = this._charts.get(chart);
|
|
if (!anims) {
|
|
return;
|
|
}
|
|
anims.running = true;
|
|
anims.start = Date.now();
|
|
anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);
|
|
this._refresh();
|
|
}
|
|
running(chart) {
|
|
if (!this._running) {
|
|
return false;
|
|
}
|
|
const anims = this._charts.get(chart);
|
|
if (!anims || !anims.running || !anims.items.length) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
stop(chart) {
|
|
const anims = this._charts.get(chart);
|
|
if (!anims || !anims.items.length) {
|
|
return;
|
|
}
|
|
const items = anims.items;
|
|
let i = items.length - 1;
|
|
for (; i >= 0; --i) {
|
|
items[i].cancel();
|
|
}
|
|
anims.items = [];
|
|
this._notify(chart, anims, Date.now(), "complete");
|
|
}
|
|
remove(chart) {
|
|
return this._charts.delete(chart);
|
|
}
|
|
};
|
|
var animator = /* @__PURE__ */ new Animator();
|
|
var transparent = "transparent";
|
|
var interpolators = {
|
|
boolean(from2, to2, factor) {
|
|
return factor > 0.5 ? to2 : from2;
|
|
},
|
|
color(from2, to2, factor) {
|
|
const c0 = color(from2 || transparent);
|
|
const c1 = c0.valid && color(to2 || transparent);
|
|
return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to2;
|
|
},
|
|
number(from2, to2, factor) {
|
|
return from2 + (to2 - from2) * factor;
|
|
}
|
|
};
|
|
var Animation = class {
|
|
constructor(cfg, target, prop, to2) {
|
|
const currentValue = target[prop];
|
|
to2 = resolve([
|
|
cfg.to,
|
|
to2,
|
|
currentValue,
|
|
cfg.from
|
|
]);
|
|
const from2 = resolve([
|
|
cfg.from,
|
|
currentValue,
|
|
to2
|
|
]);
|
|
this._active = true;
|
|
this._fn = cfg.fn || interpolators[cfg.type || typeof from2];
|
|
this._easing = effects[cfg.easing] || effects.linear;
|
|
this._start = Math.floor(Date.now() + (cfg.delay || 0));
|
|
this._duration = this._total = Math.floor(cfg.duration);
|
|
this._loop = !!cfg.loop;
|
|
this._target = target;
|
|
this._prop = prop;
|
|
this._from = from2;
|
|
this._to = to2;
|
|
this._promises = void 0;
|
|
}
|
|
active() {
|
|
return this._active;
|
|
}
|
|
update(cfg, to2, date) {
|
|
if (this._active) {
|
|
this._notify(false);
|
|
const currentValue = this._target[this._prop];
|
|
const elapsed = date - this._start;
|
|
const remain = this._duration - elapsed;
|
|
this._start = date;
|
|
this._duration = Math.floor(Math.max(remain, cfg.duration));
|
|
this._total += elapsed;
|
|
this._loop = !!cfg.loop;
|
|
this._to = resolve([
|
|
cfg.to,
|
|
to2,
|
|
currentValue,
|
|
cfg.from
|
|
]);
|
|
this._from = resolve([
|
|
cfg.from,
|
|
currentValue,
|
|
to2
|
|
]);
|
|
}
|
|
}
|
|
cancel() {
|
|
if (this._active) {
|
|
this.tick(Date.now());
|
|
this._active = false;
|
|
this._notify(false);
|
|
}
|
|
}
|
|
tick(date) {
|
|
const elapsed = date - this._start;
|
|
const duration = this._duration;
|
|
const prop = this._prop;
|
|
const from2 = this._from;
|
|
const loop = this._loop;
|
|
const to2 = this._to;
|
|
let factor;
|
|
this._active = from2 !== to2 && (loop || elapsed < duration);
|
|
if (!this._active) {
|
|
this._target[prop] = to2;
|
|
this._notify(true);
|
|
return;
|
|
}
|
|
if (elapsed < 0) {
|
|
this._target[prop] = from2;
|
|
return;
|
|
}
|
|
factor = elapsed / duration % 2;
|
|
factor = loop && factor > 1 ? 2 - factor : factor;
|
|
factor = this._easing(Math.min(1, Math.max(0, factor)));
|
|
this._target[prop] = this._fn(from2, to2, factor);
|
|
}
|
|
wait() {
|
|
const promises = this._promises || (this._promises = []);
|
|
return new Promise((res, rej) => {
|
|
promises.push({
|
|
res,
|
|
rej
|
|
});
|
|
});
|
|
}
|
|
_notify(resolved) {
|
|
const method = resolved ? "res" : "rej";
|
|
const promises = this._promises || [];
|
|
for (let i = 0; i < promises.length; i++) {
|
|
promises[i][method]();
|
|
}
|
|
}
|
|
};
|
|
var Animations = class {
|
|
constructor(chart, config) {
|
|
this._chart = chart;
|
|
this._properties = /* @__PURE__ */ new Map();
|
|
this.configure(config);
|
|
}
|
|
configure(config) {
|
|
if (!isObject(config)) {
|
|
return;
|
|
}
|
|
const animationOptions = Object.keys(defaults.animation);
|
|
const animatedProps = this._properties;
|
|
Object.getOwnPropertyNames(config).forEach((key) => {
|
|
const cfg = config[key];
|
|
if (!isObject(cfg)) {
|
|
return;
|
|
}
|
|
const resolved = {};
|
|
for (const option of animationOptions) {
|
|
resolved[option] = cfg[option];
|
|
}
|
|
(isArray(cfg.properties) && cfg.properties || [
|
|
key
|
|
]).forEach((prop) => {
|
|
if (prop === key || !animatedProps.has(prop)) {
|
|
animatedProps.set(prop, resolved);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
_animateOptions(target, values) {
|
|
const newOptions = values.options;
|
|
const options = resolveTargetOptions(target, newOptions);
|
|
if (!options) {
|
|
return [];
|
|
}
|
|
const animations = this._createAnimations(options, newOptions);
|
|
if (newOptions.$shared) {
|
|
awaitAll(target.options.$animations, newOptions).then(() => {
|
|
target.options = newOptions;
|
|
}, () => {
|
|
});
|
|
}
|
|
return animations;
|
|
}
|
|
_createAnimations(target, values) {
|
|
const animatedProps = this._properties;
|
|
const animations = [];
|
|
const running = target.$animations || (target.$animations = {});
|
|
const props = Object.keys(values);
|
|
const date = Date.now();
|
|
let i;
|
|
for (i = props.length - 1; i >= 0; --i) {
|
|
const prop = props[i];
|
|
if (prop.charAt(0) === "$") {
|
|
continue;
|
|
}
|
|
if (prop === "options") {
|
|
animations.push(...this._animateOptions(target, values));
|
|
continue;
|
|
}
|
|
const value = values[prop];
|
|
let animation = running[prop];
|
|
const cfg = animatedProps.get(prop);
|
|
if (animation) {
|
|
if (cfg && animation.active()) {
|
|
animation.update(cfg, value, date);
|
|
continue;
|
|
} else {
|
|
animation.cancel();
|
|
}
|
|
}
|
|
if (!cfg || !cfg.duration) {
|
|
target[prop] = value;
|
|
continue;
|
|
}
|
|
running[prop] = animation = new Animation(cfg, target, prop, value);
|
|
animations.push(animation);
|
|
}
|
|
return animations;
|
|
}
|
|
update(target, values) {
|
|
if (this._properties.size === 0) {
|
|
Object.assign(target, values);
|
|
return;
|
|
}
|
|
const animations = this._createAnimations(target, values);
|
|
if (animations.length) {
|
|
animator.add(this._chart, animations);
|
|
return true;
|
|
}
|
|
}
|
|
};
|
|
function awaitAll(animations, properties) {
|
|
const running = [];
|
|
const keys = Object.keys(properties);
|
|
for (let i = 0; i < keys.length; i++) {
|
|
const anim = animations[keys[i]];
|
|
if (anim && anim.active()) {
|
|
running.push(anim.wait());
|
|
}
|
|
}
|
|
return Promise.all(running);
|
|
}
|
|
function resolveTargetOptions(target, newOptions) {
|
|
if (!newOptions) {
|
|
return;
|
|
}
|
|
let options = target.options;
|
|
if (!options) {
|
|
target.options = newOptions;
|
|
return;
|
|
}
|
|
if (options.$shared) {
|
|
target.options = options = Object.assign({}, options, {
|
|
$shared: false,
|
|
$animations: {}
|
|
});
|
|
}
|
|
return options;
|
|
}
|
|
function scaleClip(scale, allowedOverflow) {
|
|
const opts = scale && scale.options || {};
|
|
const reverse = opts.reverse;
|
|
const min = opts.min === void 0 ? allowedOverflow : 0;
|
|
const max = opts.max === void 0 ? allowedOverflow : 0;
|
|
return {
|
|
start: reverse ? max : min,
|
|
end: reverse ? min : max
|
|
};
|
|
}
|
|
function defaultClip(xScale, yScale, allowedOverflow) {
|
|
if (allowedOverflow === false) {
|
|
return false;
|
|
}
|
|
const x = scaleClip(xScale, allowedOverflow);
|
|
const y = scaleClip(yScale, allowedOverflow);
|
|
return {
|
|
top: y.end,
|
|
right: x.end,
|
|
bottom: y.start,
|
|
left: x.start
|
|
};
|
|
}
|
|
function toClip(value) {
|
|
let t2, r, b, l;
|
|
if (isObject(value)) {
|
|
t2 = value.top;
|
|
r = value.right;
|
|
b = value.bottom;
|
|
l = value.left;
|
|
} else {
|
|
t2 = r = b = l = value;
|
|
}
|
|
return {
|
|
top: t2,
|
|
right: r,
|
|
bottom: b,
|
|
left: l,
|
|
disabled: value === false
|
|
};
|
|
}
|
|
function getSortedDatasetIndices(chart, filterVisible) {
|
|
const keys = [];
|
|
const metasets = chart._getSortedDatasetMetas(filterVisible);
|
|
let i, ilen;
|
|
for (i = 0, ilen = metasets.length; i < ilen; ++i) {
|
|
keys.push(metasets[i].index);
|
|
}
|
|
return keys;
|
|
}
|
|
function applyStack(stack, value, dsIndex, options = {}) {
|
|
const keys = stack.keys;
|
|
const singleMode = options.mode === "single";
|
|
let i, ilen, datasetIndex, otherValue;
|
|
if (value === null) {
|
|
return;
|
|
}
|
|
for (i = 0, ilen = keys.length; i < ilen; ++i) {
|
|
datasetIndex = +keys[i];
|
|
if (datasetIndex === dsIndex) {
|
|
if (options.all) {
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
otherValue = stack.values[datasetIndex];
|
|
if (isNumberFinite(otherValue) && (singleMode || value === 0 || sign(value) === sign(otherValue))) {
|
|
value += otherValue;
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
function convertObjectDataToArray(data) {
|
|
const keys = Object.keys(data);
|
|
const adata = new Array(keys.length);
|
|
let i, ilen, key;
|
|
for (i = 0, ilen = keys.length; i < ilen; ++i) {
|
|
key = keys[i];
|
|
adata[i] = {
|
|
x: key,
|
|
y: data[key]
|
|
};
|
|
}
|
|
return adata;
|
|
}
|
|
function isStacked(scale, meta) {
|
|
const stacked = scale && scale.options.stacked;
|
|
return stacked || stacked === void 0 && meta.stack !== void 0;
|
|
}
|
|
function getStackKey(indexScale, valueScale, meta) {
|
|
return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;
|
|
}
|
|
function getUserBounds(scale) {
|
|
const { min, max, minDefined, maxDefined } = scale.getUserBounds();
|
|
return {
|
|
min: minDefined ? min : Number.NEGATIVE_INFINITY,
|
|
max: maxDefined ? max : Number.POSITIVE_INFINITY
|
|
};
|
|
}
|
|
function getOrCreateStack(stacks, stackKey, indexValue) {
|
|
const subStack = stacks[stackKey] || (stacks[stackKey] = {});
|
|
return subStack[indexValue] || (subStack[indexValue] = {});
|
|
}
|
|
function getLastIndexInStack(stack, vScale, positive, type) {
|
|
for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {
|
|
const value = stack[meta.index];
|
|
if (positive && value > 0 || !positive && value < 0) {
|
|
return meta.index;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
function updateStacks(controller, parsed) {
|
|
const { chart, _cachedMeta: meta } = controller;
|
|
const stacks = chart._stacks || (chart._stacks = {});
|
|
const { iScale, vScale, index: datasetIndex } = meta;
|
|
const iAxis = iScale.axis;
|
|
const vAxis = vScale.axis;
|
|
const key = getStackKey(iScale, vScale, meta);
|
|
const ilen = parsed.length;
|
|
let stack;
|
|
for (let i = 0; i < ilen; ++i) {
|
|
const item = parsed[i];
|
|
const { [iAxis]: index, [vAxis]: value } = item;
|
|
const itemStacks = item._stacks || (item._stacks = {});
|
|
stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);
|
|
stack[datasetIndex] = value;
|
|
stack._top = getLastIndexInStack(stack, vScale, true, meta.type);
|
|
stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);
|
|
const visualValues = stack._visualValues || (stack._visualValues = {});
|
|
visualValues[datasetIndex] = value;
|
|
}
|
|
}
|
|
function getFirstScaleId(chart, axis) {
|
|
const scales = chart.scales;
|
|
return Object.keys(scales).filter((key) => scales[key].axis === axis).shift();
|
|
}
|
|
function createDatasetContext(parent, index) {
|
|
return createContext(parent, {
|
|
active: false,
|
|
dataset: void 0,
|
|
datasetIndex: index,
|
|
index,
|
|
mode: "default",
|
|
type: "dataset"
|
|
});
|
|
}
|
|
function createDataContext(parent, index, element) {
|
|
return createContext(parent, {
|
|
active: false,
|
|
dataIndex: index,
|
|
parsed: void 0,
|
|
raw: void 0,
|
|
element,
|
|
index,
|
|
mode: "default",
|
|
type: "data"
|
|
});
|
|
}
|
|
function clearStacks(meta, items) {
|
|
const datasetIndex = meta.controller.index;
|
|
const axis = meta.vScale && meta.vScale.axis;
|
|
if (!axis) {
|
|
return;
|
|
}
|
|
items = items || meta._parsed;
|
|
for (const parsed of items) {
|
|
const stacks = parsed._stacks;
|
|
if (!stacks || stacks[axis] === void 0 || stacks[axis][datasetIndex] === void 0) {
|
|
return;
|
|
}
|
|
delete stacks[axis][datasetIndex];
|
|
if (stacks[axis]._visualValues !== void 0 && stacks[axis]._visualValues[datasetIndex] !== void 0) {
|
|
delete stacks[axis]._visualValues[datasetIndex];
|
|
}
|
|
}
|
|
}
|
|
var isDirectUpdateMode = (mode) => mode === "reset" || mode === "none";
|
|
var cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);
|
|
var createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked && {
|
|
keys: getSortedDatasetIndices(chart, true),
|
|
values: null
|
|
};
|
|
var DatasetController = class {
|
|
constructor(chart, datasetIndex) {
|
|
this.chart = chart;
|
|
this._ctx = chart.ctx;
|
|
this.index = datasetIndex;
|
|
this._cachedDataOpts = {};
|
|
this._cachedMeta = this.getMeta();
|
|
this._type = this._cachedMeta.type;
|
|
this.options = void 0;
|
|
this._parsing = false;
|
|
this._data = void 0;
|
|
this._objectData = void 0;
|
|
this._sharedOptions = void 0;
|
|
this._drawStart = void 0;
|
|
this._drawCount = void 0;
|
|
this.enableOptionSharing = false;
|
|
this.supportsDecimation = false;
|
|
this.$context = void 0;
|
|
this._syncList = [];
|
|
this.datasetElementType = new.target.datasetElementType;
|
|
this.dataElementType = new.target.dataElementType;
|
|
this.initialize();
|
|
}
|
|
initialize() {
|
|
const meta = this._cachedMeta;
|
|
this.configure();
|
|
this.linkScales();
|
|
meta._stacked = isStacked(meta.vScale, meta);
|
|
this.addElements();
|
|
if (this.options.fill && !this.chart.isPluginEnabled("filler")) {
|
|
console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options");
|
|
}
|
|
}
|
|
updateIndex(datasetIndex) {
|
|
if (this.index !== datasetIndex) {
|
|
clearStacks(this._cachedMeta);
|
|
}
|
|
this.index = datasetIndex;
|
|
}
|
|
linkScales() {
|
|
const chart = this.chart;
|
|
const meta = this._cachedMeta;
|
|
const dataset = this.getDataset();
|
|
const chooseId = (axis, x, y, r) => axis === "x" ? x : axis === "r" ? r : y;
|
|
const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, "x"));
|
|
const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, "y"));
|
|
const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, "r"));
|
|
const indexAxis = meta.indexAxis;
|
|
const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);
|
|
const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);
|
|
meta.xScale = this.getScaleForId(xid);
|
|
meta.yScale = this.getScaleForId(yid);
|
|
meta.rScale = this.getScaleForId(rid);
|
|
meta.iScale = this.getScaleForId(iid);
|
|
meta.vScale = this.getScaleForId(vid);
|
|
}
|
|
getDataset() {
|
|
return this.chart.data.datasets[this.index];
|
|
}
|
|
getMeta() {
|
|
return this.chart.getDatasetMeta(this.index);
|
|
}
|
|
getScaleForId(scaleID) {
|
|
return this.chart.scales[scaleID];
|
|
}
|
|
_getOtherScale(scale) {
|
|
const meta = this._cachedMeta;
|
|
return scale === meta.iScale ? meta.vScale : meta.iScale;
|
|
}
|
|
reset() {
|
|
this._update("reset");
|
|
}
|
|
_destroy() {
|
|
const meta = this._cachedMeta;
|
|
if (this._data) {
|
|
unlistenArrayEvents(this._data, this);
|
|
}
|
|
if (meta._stacked) {
|
|
clearStacks(meta);
|
|
}
|
|
}
|
|
_dataCheck() {
|
|
const dataset = this.getDataset();
|
|
const data = dataset.data || (dataset.data = []);
|
|
const _data = this._data;
|
|
if (isObject(data)) {
|
|
this._data = convertObjectDataToArray(data);
|
|
} else if (_data !== data) {
|
|
if (_data) {
|
|
unlistenArrayEvents(_data, this);
|
|
const meta = this._cachedMeta;
|
|
clearStacks(meta);
|
|
meta._parsed = [];
|
|
}
|
|
if (data && Object.isExtensible(data)) {
|
|
listenArrayEvents(data, this);
|
|
}
|
|
this._syncList = [];
|
|
this._data = data;
|
|
}
|
|
}
|
|
addElements() {
|
|
const meta = this._cachedMeta;
|
|
this._dataCheck();
|
|
if (this.datasetElementType) {
|
|
meta.dataset = new this.datasetElementType();
|
|
}
|
|
}
|
|
buildOrUpdateElements(resetNewElements) {
|
|
const meta = this._cachedMeta;
|
|
const dataset = this.getDataset();
|
|
let stackChanged = false;
|
|
this._dataCheck();
|
|
const oldStacked = meta._stacked;
|
|
meta._stacked = isStacked(meta.vScale, meta);
|
|
if (meta.stack !== dataset.stack) {
|
|
stackChanged = true;
|
|
clearStacks(meta);
|
|
meta.stack = dataset.stack;
|
|
}
|
|
this._resyncElements(resetNewElements);
|
|
if (stackChanged || oldStacked !== meta._stacked) {
|
|
updateStacks(this, meta._parsed);
|
|
}
|
|
}
|
|
configure() {
|
|
const config = this.chart.config;
|
|
const scopeKeys = config.datasetScopeKeys(this._type);
|
|
const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);
|
|
this.options = config.createResolver(scopes, this.getContext());
|
|
this._parsing = this.options.parsing;
|
|
this._cachedDataOpts = {};
|
|
}
|
|
parse(start, count) {
|
|
const { _cachedMeta: meta, _data: data } = this;
|
|
const { iScale, _stacked } = meta;
|
|
const iAxis = iScale.axis;
|
|
let sorted = start === 0 && count === data.length ? true : meta._sorted;
|
|
let prev = start > 0 && meta._parsed[start - 1];
|
|
let i, cur, parsed;
|
|
if (this._parsing === false) {
|
|
meta._parsed = data;
|
|
meta._sorted = true;
|
|
parsed = data;
|
|
} else {
|
|
if (isArray(data[start])) {
|
|
parsed = this.parseArrayData(meta, data, start, count);
|
|
} else if (isObject(data[start])) {
|
|
parsed = this.parseObjectData(meta, data, start, count);
|
|
} else {
|
|
parsed = this.parsePrimitiveData(meta, data, start, count);
|
|
}
|
|
const isNotInOrderComparedToPrev = () => cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis];
|
|
for (i = 0; i < count; ++i) {
|
|
meta._parsed[i + start] = cur = parsed[i];
|
|
if (sorted) {
|
|
if (isNotInOrderComparedToPrev()) {
|
|
sorted = false;
|
|
}
|
|
prev = cur;
|
|
}
|
|
}
|
|
meta._sorted = sorted;
|
|
}
|
|
if (_stacked) {
|
|
updateStacks(this, parsed);
|
|
}
|
|
}
|
|
parsePrimitiveData(meta, data, start, count) {
|
|
const { iScale, vScale } = meta;
|
|
const iAxis = iScale.axis;
|
|
const vAxis = vScale.axis;
|
|
const labels = iScale.getLabels();
|
|
const singleScale = iScale === vScale;
|
|
const parsed = new Array(count);
|
|
let i, ilen, index;
|
|
for (i = 0, ilen = count; i < ilen; ++i) {
|
|
index = i + start;
|
|
parsed[i] = {
|
|
[iAxis]: singleScale || iScale.parse(labels[index], index),
|
|
[vAxis]: vScale.parse(data[index], index)
|
|
};
|
|
}
|
|
return parsed;
|
|
}
|
|
parseArrayData(meta, data, start, count) {
|
|
const { xScale, yScale } = meta;
|
|
const parsed = new Array(count);
|
|
let i, ilen, index, item;
|
|
for (i = 0, ilen = count; i < ilen; ++i) {
|
|
index = i + start;
|
|
item = data[index];
|
|
parsed[i] = {
|
|
x: xScale.parse(item[0], index),
|
|
y: yScale.parse(item[1], index)
|
|
};
|
|
}
|
|
return parsed;
|
|
}
|
|
parseObjectData(meta, data, start, count) {
|
|
const { xScale, yScale } = meta;
|
|
const { xAxisKey = "x", yAxisKey = "y" } = this._parsing;
|
|
const parsed = new Array(count);
|
|
let i, ilen, index, item;
|
|
for (i = 0, ilen = count; i < ilen; ++i) {
|
|
index = i + start;
|
|
item = data[index];
|
|
parsed[i] = {
|
|
x: xScale.parse(resolveObjectKey(item, xAxisKey), index),
|
|
y: yScale.parse(resolveObjectKey(item, yAxisKey), index)
|
|
};
|
|
}
|
|
return parsed;
|
|
}
|
|
getParsed(index) {
|
|
return this._cachedMeta._parsed[index];
|
|
}
|
|
getDataElement(index) {
|
|
return this._cachedMeta.data[index];
|
|
}
|
|
applyStack(scale, parsed, mode) {
|
|
const chart = this.chart;
|
|
const meta = this._cachedMeta;
|
|
const value = parsed[scale.axis];
|
|
const stack = {
|
|
keys: getSortedDatasetIndices(chart, true),
|
|
values: parsed._stacks[scale.axis]._visualValues
|
|
};
|
|
return applyStack(stack, value, meta.index, {
|
|
mode
|
|
});
|
|
}
|
|
updateRangeFromParsed(range, scale, parsed, stack) {
|
|
const parsedValue = parsed[scale.axis];
|
|
let value = parsedValue === null ? NaN : parsedValue;
|
|
const values = stack && parsed._stacks[scale.axis];
|
|
if (stack && values) {
|
|
stack.values = values;
|
|
value = applyStack(stack, parsedValue, this._cachedMeta.index);
|
|
}
|
|
range.min = Math.min(range.min, value);
|
|
range.max = Math.max(range.max, value);
|
|
}
|
|
getMinMax(scale, canStack) {
|
|
const meta = this._cachedMeta;
|
|
const _parsed = meta._parsed;
|
|
const sorted = meta._sorted && scale === meta.iScale;
|
|
const ilen = _parsed.length;
|
|
const otherScale = this._getOtherScale(scale);
|
|
const stack = createStack(canStack, meta, this.chart);
|
|
const range = {
|
|
min: Number.POSITIVE_INFINITY,
|
|
max: Number.NEGATIVE_INFINITY
|
|
};
|
|
const { min: otherMin, max: otherMax } = getUserBounds(otherScale);
|
|
let i, parsed;
|
|
function _skip() {
|
|
parsed = _parsed[i];
|
|
const otherValue = parsed[otherScale.axis];
|
|
return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;
|
|
}
|
|
for (i = 0; i < ilen; ++i) {
|
|
if (_skip()) {
|
|
continue;
|
|
}
|
|
this.updateRangeFromParsed(range, scale, parsed, stack);
|
|
if (sorted) {
|
|
break;
|
|
}
|
|
}
|
|
if (sorted) {
|
|
for (i = ilen - 1; i >= 0; --i) {
|
|
if (_skip()) {
|
|
continue;
|
|
}
|
|
this.updateRangeFromParsed(range, scale, parsed, stack);
|
|
break;
|
|
}
|
|
}
|
|
return range;
|
|
}
|
|
getAllParsedValues(scale) {
|
|
const parsed = this._cachedMeta._parsed;
|
|
const values = [];
|
|
let i, ilen, value;
|
|
for (i = 0, ilen = parsed.length; i < ilen; ++i) {
|
|
value = parsed[i][scale.axis];
|
|
if (isNumberFinite(value)) {
|
|
values.push(value);
|
|
}
|
|
}
|
|
return values;
|
|
}
|
|
getMaxOverflow() {
|
|
return false;
|
|
}
|
|
getLabelAndValue(index) {
|
|
const meta = this._cachedMeta;
|
|
const iScale = meta.iScale;
|
|
const vScale = meta.vScale;
|
|
const parsed = this.getParsed(index);
|
|
return {
|
|
label: iScale ? "" + iScale.getLabelForValue(parsed[iScale.axis]) : "",
|
|
value: vScale ? "" + vScale.getLabelForValue(parsed[vScale.axis]) : ""
|
|
};
|
|
}
|
|
_update(mode) {
|
|
const meta = this._cachedMeta;
|
|
this.update(mode || "default");
|
|
meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));
|
|
}
|
|
update(mode) {
|
|
}
|
|
draw() {
|
|
const ctx = this._ctx;
|
|
const chart = this.chart;
|
|
const meta = this._cachedMeta;
|
|
const elements = meta.data || [];
|
|
const area = chart.chartArea;
|
|
const active = [];
|
|
const start = this._drawStart || 0;
|
|
const count = this._drawCount || elements.length - start;
|
|
const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;
|
|
let i;
|
|
if (meta.dataset) {
|
|
meta.dataset.draw(ctx, area, start, count);
|
|
}
|
|
for (i = start; i < start + count; ++i) {
|
|
const element = elements[i];
|
|
if (element.hidden) {
|
|
continue;
|
|
}
|
|
if (element.active && drawActiveElementsOnTop) {
|
|
active.push(element);
|
|
} else {
|
|
element.draw(ctx, area);
|
|
}
|
|
}
|
|
for (i = 0; i < active.length; ++i) {
|
|
active[i].draw(ctx, area);
|
|
}
|
|
}
|
|
getStyle(index, active) {
|
|
const mode = active ? "active" : "default";
|
|
return index === void 0 && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode);
|
|
}
|
|
getContext(index, active, mode) {
|
|
const dataset = this.getDataset();
|
|
let context;
|
|
if (index >= 0 && index < this._cachedMeta.data.length) {
|
|
const element = this._cachedMeta.data[index];
|
|
context = element.$context || (element.$context = createDataContext(this.getContext(), index, element));
|
|
context.parsed = this.getParsed(index);
|
|
context.raw = dataset.data[index];
|
|
context.index = context.dataIndex = index;
|
|
} else {
|
|
context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index));
|
|
context.dataset = dataset;
|
|
context.index = context.datasetIndex = this.index;
|
|
}
|
|
context.active = !!active;
|
|
context.mode = mode;
|
|
return context;
|
|
}
|
|
resolveDatasetElementOptions(mode) {
|
|
return this._resolveElementOptions(this.datasetElementType.id, mode);
|
|
}
|
|
resolveDataElementOptions(index, mode) {
|
|
return this._resolveElementOptions(this.dataElementType.id, mode, index);
|
|
}
|
|
_resolveElementOptions(elementType, mode = "default", index) {
|
|
const active = mode === "active";
|
|
const cache = this._cachedDataOpts;
|
|
const cacheKey = elementType + "-" + mode;
|
|
const cached = cache[cacheKey];
|
|
const sharing = this.enableOptionSharing && defined(index);
|
|
if (cached) {
|
|
return cloneIfNotShared(cached, sharing);
|
|
}
|
|
const config = this.chart.config;
|
|
const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);
|
|
const prefixes = active ? [
|
|
`${elementType}Hover`,
|
|
"hover",
|
|
elementType,
|
|
""
|
|
] : [
|
|
elementType,
|
|
""
|
|
];
|
|
const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);
|
|
const names2 = Object.keys(defaults.elements[elementType]);
|
|
const context = () => this.getContext(index, active, mode);
|
|
const values = config.resolveNamedOptions(scopes, names2, context, prefixes);
|
|
if (values.$shared) {
|
|
values.$shared = sharing;
|
|
cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));
|
|
}
|
|
return values;
|
|
}
|
|
_resolveAnimations(index, transition, active) {
|
|
const chart = this.chart;
|
|
const cache = this._cachedDataOpts;
|
|
const cacheKey = `animation-${transition}`;
|
|
const cached = cache[cacheKey];
|
|
if (cached) {
|
|
return cached;
|
|
}
|
|
let options;
|
|
if (chart.options.animation !== false) {
|
|
const config = this.chart.config;
|
|
const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);
|
|
const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);
|
|
options = config.createResolver(scopes, this.getContext(index, active, transition));
|
|
}
|
|
const animations = new Animations(chart, options && options.animations);
|
|
if (options && options._cacheable) {
|
|
cache[cacheKey] = Object.freeze(animations);
|
|
}
|
|
return animations;
|
|
}
|
|
getSharedOptions(options) {
|
|
if (!options.$shared) {
|
|
return;
|
|
}
|
|
return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));
|
|
}
|
|
includeOptions(mode, sharedOptions) {
|
|
return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;
|
|
}
|
|
_getSharedOptions(start, mode) {
|
|
const firstOpts = this.resolveDataElementOptions(start, mode);
|
|
const previouslySharedOptions = this._sharedOptions;
|
|
const sharedOptions = this.getSharedOptions(firstOpts);
|
|
const includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions;
|
|
this.updateSharedOptions(sharedOptions, mode, firstOpts);
|
|
return {
|
|
sharedOptions,
|
|
includeOptions
|
|
};
|
|
}
|
|
updateElement(element, index, properties, mode) {
|
|
if (isDirectUpdateMode(mode)) {
|
|
Object.assign(element, properties);
|
|
} else {
|
|
this._resolveAnimations(index, mode).update(element, properties);
|
|
}
|
|
}
|
|
updateSharedOptions(sharedOptions, mode, newOptions) {
|
|
if (sharedOptions && !isDirectUpdateMode(mode)) {
|
|
this._resolveAnimations(void 0, mode).update(sharedOptions, newOptions);
|
|
}
|
|
}
|
|
_setStyle(element, index, mode, active) {
|
|
element.active = active;
|
|
const options = this.getStyle(index, active);
|
|
this._resolveAnimations(index, mode, active).update(element, {
|
|
options: !active && this.getSharedOptions(options) || options
|
|
});
|
|
}
|
|
removeHoverStyle(element, datasetIndex, index) {
|
|
this._setStyle(element, index, "active", false);
|
|
}
|
|
setHoverStyle(element, datasetIndex, index) {
|
|
this._setStyle(element, index, "active", true);
|
|
}
|
|
_removeDatasetHoverStyle() {
|
|
const element = this._cachedMeta.dataset;
|
|
if (element) {
|
|
this._setStyle(element, void 0, "active", false);
|
|
}
|
|
}
|
|
_setDatasetHoverStyle() {
|
|
const element = this._cachedMeta.dataset;
|
|
if (element) {
|
|
this._setStyle(element, void 0, "active", true);
|
|
}
|
|
}
|
|
_resyncElements(resetNewElements) {
|
|
const data = this._data;
|
|
const elements = this._cachedMeta.data;
|
|
for (const [method, arg1, arg2] of this._syncList) {
|
|
this[method](arg1, arg2);
|
|
}
|
|
this._syncList = [];
|
|
const numMeta = elements.length;
|
|
const numData = data.length;
|
|
const count = Math.min(numData, numMeta);
|
|
if (count) {
|
|
this.parse(0, count);
|
|
}
|
|
if (numData > numMeta) {
|
|
this._insertElements(numMeta, numData - numMeta, resetNewElements);
|
|
} else if (numData < numMeta) {
|
|
this._removeElements(numData, numMeta - numData);
|
|
}
|
|
}
|
|
_insertElements(start, count, resetNewElements = true) {
|
|
const meta = this._cachedMeta;
|
|
const data = meta.data;
|
|
const end = start + count;
|
|
let i;
|
|
const move = (arr) => {
|
|
arr.length += count;
|
|
for (i = arr.length - 1; i >= end; i--) {
|
|
arr[i] = arr[i - count];
|
|
}
|
|
};
|
|
move(data);
|
|
for (i = start; i < end; ++i) {
|
|
data[i] = new this.dataElementType();
|
|
}
|
|
if (this._parsing) {
|
|
move(meta._parsed);
|
|
}
|
|
this.parse(start, count);
|
|
if (resetNewElements) {
|
|
this.updateElements(data, start, count, "reset");
|
|
}
|
|
}
|
|
updateElements(element, start, count, mode) {
|
|
}
|
|
_removeElements(start, count) {
|
|
const meta = this._cachedMeta;
|
|
if (this._parsing) {
|
|
const removed = meta._parsed.splice(start, count);
|
|
if (meta._stacked) {
|
|
clearStacks(meta, removed);
|
|
}
|
|
}
|
|
meta.data.splice(start, count);
|
|
}
|
|
_sync(args) {
|
|
if (this._parsing) {
|
|
this._syncList.push(args);
|
|
} else {
|
|
const [method, arg1, arg2] = args;
|
|
this[method](arg1, arg2);
|
|
}
|
|
this.chart._dataChanges.push([
|
|
this.index,
|
|
...args
|
|
]);
|
|
}
|
|
_onDataPush() {
|
|
const count = arguments.length;
|
|
this._sync([
|
|
"_insertElements",
|
|
this.getDataset().data.length - count,
|
|
count
|
|
]);
|
|
}
|
|
_onDataPop() {
|
|
this._sync([
|
|
"_removeElements",
|
|
this._cachedMeta.data.length - 1,
|
|
1
|
|
]);
|
|
}
|
|
_onDataShift() {
|
|
this._sync([
|
|
"_removeElements",
|
|
0,
|
|
1
|
|
]);
|
|
}
|
|
_onDataSplice(start, count) {
|
|
if (count) {
|
|
this._sync([
|
|
"_removeElements",
|
|
start,
|
|
count
|
|
]);
|
|
}
|
|
const newCount = arguments.length - 2;
|
|
if (newCount) {
|
|
this._sync([
|
|
"_insertElements",
|
|
start,
|
|
newCount
|
|
]);
|
|
}
|
|
}
|
|
_onDataUnshift() {
|
|
this._sync([
|
|
"_insertElements",
|
|
0,
|
|
arguments.length
|
|
]);
|
|
}
|
|
};
|
|
__publicField(DatasetController, "defaults", {});
|
|
__publicField(DatasetController, "datasetElementType", null);
|
|
__publicField(DatasetController, "dataElementType", null);
|
|
function getAllScaleValues(scale, type) {
|
|
if (!scale._cache.$bar) {
|
|
const visibleMetas = scale.getMatchingVisibleMetas(type);
|
|
let values = [];
|
|
for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {
|
|
values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));
|
|
}
|
|
scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));
|
|
}
|
|
return scale._cache.$bar;
|
|
}
|
|
function computeMinSampleSize(meta) {
|
|
const scale = meta.iScale;
|
|
const values = getAllScaleValues(scale, meta.type);
|
|
let min = scale._length;
|
|
let i, ilen, curr, prev;
|
|
const updateMinAndPrev = () => {
|
|
if (curr === 32767 || curr === -32768) {
|
|
return;
|
|
}
|
|
if (defined(prev)) {
|
|
min = Math.min(min, Math.abs(curr - prev) || min);
|
|
}
|
|
prev = curr;
|
|
};
|
|
for (i = 0, ilen = values.length; i < ilen; ++i) {
|
|
curr = scale.getPixelForValue(values[i]);
|
|
updateMinAndPrev();
|
|
}
|
|
prev = void 0;
|
|
for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {
|
|
curr = scale.getPixelForTick(i);
|
|
updateMinAndPrev();
|
|
}
|
|
return min;
|
|
}
|
|
function computeFitCategoryTraits(index, ruler, options, stackCount) {
|
|
const thickness = options.barThickness;
|
|
let size, ratio;
|
|
if (isNullOrUndef(thickness)) {
|
|
size = ruler.min * options.categoryPercentage;
|
|
ratio = options.barPercentage;
|
|
} else {
|
|
size = thickness * stackCount;
|
|
ratio = 1;
|
|
}
|
|
return {
|
|
chunk: size / stackCount,
|
|
ratio,
|
|
start: ruler.pixels[index] - size / 2
|
|
};
|
|
}
|
|
function computeFlexCategoryTraits(index, ruler, options, stackCount) {
|
|
const pixels = ruler.pixels;
|
|
const curr = pixels[index];
|
|
let prev = index > 0 ? pixels[index - 1] : null;
|
|
let next = index < pixels.length - 1 ? pixels[index + 1] : null;
|
|
const percent = options.categoryPercentage;
|
|
if (prev === null) {
|
|
prev = curr - (next === null ? ruler.end - ruler.start : next - curr);
|
|
}
|
|
if (next === null) {
|
|
next = curr + curr - prev;
|
|
}
|
|
const start = curr - (curr - Math.min(prev, next)) / 2 * percent;
|
|
const size = Math.abs(next - prev) / 2 * percent;
|
|
return {
|
|
chunk: size / stackCount,
|
|
ratio: options.barPercentage,
|
|
start
|
|
};
|
|
}
|
|
function parseFloatBar(entry, item, vScale, i) {
|
|
const startValue = vScale.parse(entry[0], i);
|
|
const endValue = vScale.parse(entry[1], i);
|
|
const min = Math.min(startValue, endValue);
|
|
const max = Math.max(startValue, endValue);
|
|
let barStart = min;
|
|
let barEnd = max;
|
|
if (Math.abs(min) > Math.abs(max)) {
|
|
barStart = max;
|
|
barEnd = min;
|
|
}
|
|
item[vScale.axis] = barEnd;
|
|
item._custom = {
|
|
barStart,
|
|
barEnd,
|
|
start: startValue,
|
|
end: endValue,
|
|
min,
|
|
max
|
|
};
|
|
}
|
|
function parseValue(entry, item, vScale, i) {
|
|
if (isArray(entry)) {
|
|
parseFloatBar(entry, item, vScale, i);
|
|
} else {
|
|
item[vScale.axis] = vScale.parse(entry, i);
|
|
}
|
|
return item;
|
|
}
|
|
function parseArrayOrPrimitive(meta, data, start, count) {
|
|
const iScale = meta.iScale;
|
|
const vScale = meta.vScale;
|
|
const labels = iScale.getLabels();
|
|
const singleScale = iScale === vScale;
|
|
const parsed = [];
|
|
let i, ilen, item, entry;
|
|
for (i = start, ilen = start + count; i < ilen; ++i) {
|
|
entry = data[i];
|
|
item = {};
|
|
item[iScale.axis] = singleScale || iScale.parse(labels[i], i);
|
|
parsed.push(parseValue(entry, item, vScale, i));
|
|
}
|
|
return parsed;
|
|
}
|
|
function isFloatBar(custom) {
|
|
return custom && custom.barStart !== void 0 && custom.barEnd !== void 0;
|
|
}
|
|
function barSign(size, vScale, actualBase) {
|
|
if (size !== 0) {
|
|
return sign(size);
|
|
}
|
|
return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);
|
|
}
|
|
function borderProps(properties) {
|
|
let reverse, start, end, top, bottom;
|
|
if (properties.horizontal) {
|
|
reverse = properties.base > properties.x;
|
|
start = "left";
|
|
end = "right";
|
|
} else {
|
|
reverse = properties.base < properties.y;
|
|
start = "bottom";
|
|
end = "top";
|
|
}
|
|
if (reverse) {
|
|
top = "end";
|
|
bottom = "start";
|
|
} else {
|
|
top = "start";
|
|
bottom = "end";
|
|
}
|
|
return {
|
|
start,
|
|
end,
|
|
reverse,
|
|
top,
|
|
bottom
|
|
};
|
|
}
|
|
function setBorderSkipped(properties, options, stack, index) {
|
|
let edge = options.borderSkipped;
|
|
const res = {};
|
|
if (!edge) {
|
|
properties.borderSkipped = res;
|
|
return;
|
|
}
|
|
if (edge === true) {
|
|
properties.borderSkipped = {
|
|
top: true,
|
|
right: true,
|
|
bottom: true,
|
|
left: true
|
|
};
|
|
return;
|
|
}
|
|
const { start, end, reverse, top, bottom } = borderProps(properties);
|
|
if (edge === "middle" && stack) {
|
|
properties.enableBorderRadius = true;
|
|
if ((stack._top || 0) === index) {
|
|
edge = top;
|
|
} else if ((stack._bottom || 0) === index) {
|
|
edge = bottom;
|
|
} else {
|
|
res[parseEdge(bottom, start, end, reverse)] = true;
|
|
edge = top;
|
|
}
|
|
}
|
|
res[parseEdge(edge, start, end, reverse)] = true;
|
|
properties.borderSkipped = res;
|
|
}
|
|
function parseEdge(edge, a, b, reverse) {
|
|
if (reverse) {
|
|
edge = swap(edge, a, b);
|
|
edge = startEnd(edge, b, a);
|
|
} else {
|
|
edge = startEnd(edge, a, b);
|
|
}
|
|
return edge;
|
|
}
|
|
function swap(orig, v1, v2) {
|
|
return orig === v1 ? v2 : orig === v2 ? v1 : orig;
|
|
}
|
|
function startEnd(v, start, end) {
|
|
return v === "start" ? start : v === "end" ? end : v;
|
|
}
|
|
function setInflateAmount(properties, { inflateAmount }, ratio) {
|
|
properties.inflateAmount = inflateAmount === "auto" ? ratio === 1 ? 0.33 : 0 : inflateAmount;
|
|
}
|
|
var BarController = class extends DatasetController {
|
|
parsePrimitiveData(meta, data, start, count) {
|
|
return parseArrayOrPrimitive(meta, data, start, count);
|
|
}
|
|
parseArrayData(meta, data, start, count) {
|
|
return parseArrayOrPrimitive(meta, data, start, count);
|
|
}
|
|
parseObjectData(meta, data, start, count) {
|
|
const { iScale, vScale } = meta;
|
|
const { xAxisKey = "x", yAxisKey = "y" } = this._parsing;
|
|
const iAxisKey = iScale.axis === "x" ? xAxisKey : yAxisKey;
|
|
const vAxisKey = vScale.axis === "x" ? xAxisKey : yAxisKey;
|
|
const parsed = [];
|
|
let i, ilen, item, obj;
|
|
for (i = start, ilen = start + count; i < ilen; ++i) {
|
|
obj = data[i];
|
|
item = {};
|
|
item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);
|
|
parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));
|
|
}
|
|
return parsed;
|
|
}
|
|
updateRangeFromParsed(range, scale, parsed, stack) {
|
|
super.updateRangeFromParsed(range, scale, parsed, stack);
|
|
const custom = parsed._custom;
|
|
if (custom && scale === this._cachedMeta.vScale) {
|
|
range.min = Math.min(range.min, custom.min);
|
|
range.max = Math.max(range.max, custom.max);
|
|
}
|
|
}
|
|
getMaxOverflow() {
|
|
return 0;
|
|
}
|
|
getLabelAndValue(index) {
|
|
const meta = this._cachedMeta;
|
|
const { iScale, vScale } = meta;
|
|
const parsed = this.getParsed(index);
|
|
const custom = parsed._custom;
|
|
const value = isFloatBar(custom) ? "[" + custom.start + ", " + custom.end + "]" : "" + vScale.getLabelForValue(parsed[vScale.axis]);
|
|
return {
|
|
label: "" + iScale.getLabelForValue(parsed[iScale.axis]),
|
|
value
|
|
};
|
|
}
|
|
initialize() {
|
|
this.enableOptionSharing = true;
|
|
super.initialize();
|
|
const meta = this._cachedMeta;
|
|
meta.stack = this.getDataset().stack;
|
|
}
|
|
update(mode) {
|
|
const meta = this._cachedMeta;
|
|
this.updateElements(meta.data, 0, meta.data.length, mode);
|
|
}
|
|
updateElements(bars, start, count, mode) {
|
|
const reset2 = mode === "reset";
|
|
const { index, _cachedMeta: { vScale } } = this;
|
|
const base = vScale.getBasePixel();
|
|
const horizontal = vScale.isHorizontal();
|
|
const ruler = this._getRuler();
|
|
const { sharedOptions, includeOptions } = this._getSharedOptions(start, mode);
|
|
for (let i = start; i < start + count; i++) {
|
|
const parsed = this.getParsed(i);
|
|
const vpixels = reset2 || isNullOrUndef(parsed[vScale.axis]) ? {
|
|
base,
|
|
head: base
|
|
} : this._calculateBarValuePixels(i);
|
|
const ipixels = this._calculateBarIndexPixels(i, ruler);
|
|
const stack = (parsed._stacks || {})[vScale.axis];
|
|
const properties = {
|
|
horizontal,
|
|
base: vpixels.base,
|
|
enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom,
|
|
x: horizontal ? vpixels.head : ipixels.center,
|
|
y: horizontal ? ipixels.center : vpixels.head,
|
|
height: horizontal ? ipixels.size : Math.abs(vpixels.size),
|
|
width: horizontal ? Math.abs(vpixels.size) : ipixels.size
|
|
};
|
|
if (includeOptions) {
|
|
properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? "active" : mode);
|
|
}
|
|
const options = properties.options || bars[i].options;
|
|
setBorderSkipped(properties, options, stack, index);
|
|
setInflateAmount(properties, options, ruler.ratio);
|
|
this.updateElement(bars[i], i, properties, mode);
|
|
}
|
|
}
|
|
_getStacks(last, dataIndex) {
|
|
const { iScale } = this._cachedMeta;
|
|
const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta) => meta.controller.options.grouped);
|
|
const stacked = iScale.options.stacked;
|
|
const stacks = [];
|
|
const skipNull = (meta) => {
|
|
const parsed = meta.controller.getParsed(dataIndex);
|
|
const val = parsed && parsed[meta.vScale.axis];
|
|
if (isNullOrUndef(val) || isNaN(val)) {
|
|
return true;
|
|
}
|
|
};
|
|
for (const meta of metasets) {
|
|
if (dataIndex !== void 0 && skipNull(meta)) {
|
|
continue;
|
|
}
|
|
if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === void 0 && meta.stack === void 0) {
|
|
stacks.push(meta.stack);
|
|
}
|
|
if (meta.index === last) {
|
|
break;
|
|
}
|
|
}
|
|
if (!stacks.length) {
|
|
stacks.push(void 0);
|
|
}
|
|
return stacks;
|
|
}
|
|
_getStackCount(index) {
|
|
return this._getStacks(void 0, index).length;
|
|
}
|
|
_getStackIndex(datasetIndex, name, dataIndex) {
|
|
const stacks = this._getStacks(datasetIndex, dataIndex);
|
|
const index = name !== void 0 ? stacks.indexOf(name) : -1;
|
|
return index === -1 ? stacks.length - 1 : index;
|
|
}
|
|
_getRuler() {
|
|
const opts = this.options;
|
|
const meta = this._cachedMeta;
|
|
const iScale = meta.iScale;
|
|
const pixels = [];
|
|
let i, ilen;
|
|
for (i = 0, ilen = meta.data.length; i < ilen; ++i) {
|
|
pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));
|
|
}
|
|
const barThickness = opts.barThickness;
|
|
const min = barThickness || computeMinSampleSize(meta);
|
|
return {
|
|
min,
|
|
pixels,
|
|
start: iScale._startPixel,
|
|
end: iScale._endPixel,
|
|
stackCount: this._getStackCount(),
|
|
scale: iScale,
|
|
grouped: opts.grouped,
|
|
ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage
|
|
};
|
|
}
|
|
_calculateBarValuePixels(index) {
|
|
const { _cachedMeta: { vScale, _stacked, index: datasetIndex }, options: { base: baseValue, minBarLength } } = this;
|
|
const actualBase = baseValue || 0;
|
|
const parsed = this.getParsed(index);
|
|
const custom = parsed._custom;
|
|
const floating = isFloatBar(custom);
|
|
let value = parsed[vScale.axis];
|
|
let start = 0;
|
|
let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;
|
|
let head, size;
|
|
if (length !== value) {
|
|
start = length - value;
|
|
length = value;
|
|
}
|
|
if (floating) {
|
|
value = custom.barStart;
|
|
length = custom.barEnd - custom.barStart;
|
|
if (value !== 0 && sign(value) !== sign(custom.barEnd)) {
|
|
start = 0;
|
|
}
|
|
start += value;
|
|
}
|
|
const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;
|
|
let base = vScale.getPixelForValue(startValue);
|
|
if (this.chart.getDataVisibility(index)) {
|
|
head = vScale.getPixelForValue(start + length);
|
|
} else {
|
|
head = base;
|
|
}
|
|
size = head - base;
|
|
if (Math.abs(size) < minBarLength) {
|
|
size = barSign(size, vScale, actualBase) * minBarLength;
|
|
if (value === actualBase) {
|
|
base -= size / 2;
|
|
}
|
|
const startPixel = vScale.getPixelForDecimal(0);
|
|
const endPixel = vScale.getPixelForDecimal(1);
|
|
const min = Math.min(startPixel, endPixel);
|
|
const max = Math.max(startPixel, endPixel);
|
|
base = Math.max(Math.min(base, max), min);
|
|
head = base + size;
|
|
if (_stacked && !floating) {
|
|
parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);
|
|
}
|
|
}
|
|
if (base === vScale.getPixelForValue(actualBase)) {
|
|
const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;
|
|
base += halfGrid;
|
|
size -= halfGrid;
|
|
}
|
|
return {
|
|
size,
|
|
base,
|
|
head,
|
|
center: head + size / 2
|
|
};
|
|
}
|
|
_calculateBarIndexPixels(index, ruler) {
|
|
const scale = ruler.scale;
|
|
const options = this.options;
|
|
const skipNull = options.skipNull;
|
|
const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);
|
|
let center, size;
|
|
if (ruler.grouped) {
|
|
const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;
|
|
const range = options.barThickness === "flex" ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount);
|
|
const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : void 0);
|
|
center = range.start + range.chunk * stackIndex + range.chunk / 2;
|
|
size = Math.min(maxBarThickness, range.chunk * range.ratio);
|
|
} else {
|
|
center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);
|
|
size = Math.min(maxBarThickness, ruler.min * ruler.ratio);
|
|
}
|
|
return {
|
|
base: center - size / 2,
|
|
head: center + size / 2,
|
|
center,
|
|
size
|
|
};
|
|
}
|
|
draw() {
|
|
const meta = this._cachedMeta;
|
|
const vScale = meta.vScale;
|
|
const rects = meta.data;
|
|
const ilen = rects.length;
|
|
let i = 0;
|
|
for (; i < ilen; ++i) {
|
|
if (this.getParsed(i)[vScale.axis] !== null) {
|
|
rects[i].draw(this._ctx);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
__publicField(BarController, "id", "bar");
|
|
__publicField(BarController, "defaults", {
|
|
datasetElementType: false,
|
|
dataElementType: "bar",
|
|
categoryPercentage: 0.8,
|
|
barPercentage: 0.9,
|
|
grouped: true,
|
|
animations: {
|
|
numbers: {
|
|
type: "number",
|
|
properties: [
|
|
"x",
|
|
"y",
|
|
"base",
|
|
"width",
|
|
"height"
|
|
]
|
|
}
|
|
}
|
|
});
|
|
__publicField(BarController, "overrides", {
|
|
scales: {
|
|
_index_: {
|
|
type: "category",
|
|
offset: true,
|
|
grid: {
|
|
offset: true
|
|
}
|
|
},
|
|
_value_: {
|
|
type: "linear",
|
|
beginAtZero: true
|
|
}
|
|
}
|
|
});
|
|
function getRatioAndOffset(rotation, circumference, cutout) {
|
|
let ratioX = 1;
|
|
let ratioY = 1;
|
|
let offsetX = 0;
|
|
let offsetY = 0;
|
|
if (circumference < TAU) {
|
|
const startAngle = rotation;
|
|
const endAngle = startAngle + circumference;
|
|
const startX = Math.cos(startAngle);
|
|
const startY = Math.sin(startAngle);
|
|
const endX = Math.cos(endAngle);
|
|
const endY = Math.sin(endAngle);
|
|
const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);
|
|
const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);
|
|
const maxX = calcMax(0, startX, endX);
|
|
const maxY = calcMax(HALF_PI, startY, endY);
|
|
const minX = calcMin(PI, startX, endX);
|
|
const minY = calcMin(PI + HALF_PI, startY, endY);
|
|
ratioX = (maxX - minX) / 2;
|
|
ratioY = (maxY - minY) / 2;
|
|
offsetX = -(maxX + minX) / 2;
|
|
offsetY = -(maxY + minY) / 2;
|
|
}
|
|
return {
|
|
ratioX,
|
|
ratioY,
|
|
offsetX,
|
|
offsetY
|
|
};
|
|
}
|
|
var DoughnutController = class extends DatasetController {
|
|
constructor(chart, datasetIndex) {
|
|
super(chart, datasetIndex);
|
|
this.enableOptionSharing = true;
|
|
this.innerRadius = void 0;
|
|
this.outerRadius = void 0;
|
|
this.offsetX = void 0;
|
|
this.offsetY = void 0;
|
|
}
|
|
linkScales() {
|
|
}
|
|
parse(start, count) {
|
|
const data = this.getDataset().data;
|
|
const meta = this._cachedMeta;
|
|
if (this._parsing === false) {
|
|
meta._parsed = data;
|
|
} else {
|
|
let getter = (i2) => +data[i2];
|
|
if (isObject(data[start])) {
|
|
const { key = "value" } = this._parsing;
|
|
getter = (i2) => +resolveObjectKey(data[i2], key);
|
|
}
|
|
let i, ilen;
|
|
for (i = start, ilen = start + count; i < ilen; ++i) {
|
|
meta._parsed[i] = getter(i);
|
|
}
|
|
}
|
|
}
|
|
_getRotation() {
|
|
return toRadians(this.options.rotation - 90);
|
|
}
|
|
_getCircumference() {
|
|
return toRadians(this.options.circumference);
|
|
}
|
|
_getRotationExtents() {
|
|
let min = TAU;
|
|
let max = -TAU;
|
|
for (let i = 0; i < this.chart.data.datasets.length; ++i) {
|
|
if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {
|
|
const controller = this.chart.getDatasetMeta(i).controller;
|
|
const rotation = controller._getRotation();
|
|
const circumference = controller._getCircumference();
|
|
min = Math.min(min, rotation);
|
|
max = Math.max(max, rotation + circumference);
|
|
}
|
|
}
|
|
return {
|
|
rotation: min,
|
|
circumference: max - min
|
|
};
|
|
}
|
|
update(mode) {
|
|
const chart = this.chart;
|
|
const { chartArea } = chart;
|
|
const meta = this._cachedMeta;
|
|
const arcs = meta.data;
|
|
const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;
|
|
const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);
|
|
const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);
|
|
const chartWeight = this._getRingWeight(this.index);
|
|
const { circumference, rotation } = this._getRotationExtents();
|
|
const { ratioX, ratioY, offsetX, offsetY } = getRatioAndOffset(rotation, circumference, cutout);
|
|
const maxWidth = (chartArea.width - spacing) / ratioX;
|
|
const maxHeight = (chartArea.height - spacing) / ratioY;
|
|
const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);
|
|
const outerRadius = toDimension(this.options.radius, maxRadius);
|
|
const innerRadius = Math.max(outerRadius * cutout, 0);
|
|
const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();
|
|
this.offsetX = offsetX * outerRadius;
|
|
this.offsetY = offsetY * outerRadius;
|
|
meta.total = this.calculateTotal();
|
|
this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);
|
|
this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);
|
|
this.updateElements(arcs, 0, arcs.length, mode);
|
|
}
|
|
_circumference(i, reset2) {
|
|
const opts = this.options;
|
|
const meta = this._cachedMeta;
|
|
const circumference = this._getCircumference();
|
|
if (reset2 && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {
|
|
return 0;
|
|
}
|
|
return this.calculateCircumference(meta._parsed[i] * circumference / TAU);
|
|
}
|
|
updateElements(arcs, start, count, mode) {
|
|
const reset2 = mode === "reset";
|
|
const chart = this.chart;
|
|
const chartArea = chart.chartArea;
|
|
const opts = chart.options;
|
|
const animationOpts = opts.animation;
|
|
const centerX = (chartArea.left + chartArea.right) / 2;
|
|
const centerY = (chartArea.top + chartArea.bottom) / 2;
|
|
const animateScale = reset2 && animationOpts.animateScale;
|
|
const innerRadius = animateScale ? 0 : this.innerRadius;
|
|
const outerRadius = animateScale ? 0 : this.outerRadius;
|
|
const { sharedOptions, includeOptions } = this._getSharedOptions(start, mode);
|
|
let startAngle = this._getRotation();
|
|
let i;
|
|
for (i = 0; i < start; ++i) {
|
|
startAngle += this._circumference(i, reset2);
|
|
}
|
|
for (i = start; i < start + count; ++i) {
|
|
const circumference = this._circumference(i, reset2);
|
|
const arc = arcs[i];
|
|
const properties = {
|
|
x: centerX + this.offsetX,
|
|
y: centerY + this.offsetY,
|
|
startAngle,
|
|
endAngle: startAngle + circumference,
|
|
circumference,
|
|
outerRadius,
|
|
innerRadius
|
|
};
|
|
if (includeOptions) {
|
|
properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? "active" : mode);
|
|
}
|
|
startAngle += circumference;
|
|
this.updateElement(arc, i, properties, mode);
|
|
}
|
|
}
|
|
calculateTotal() {
|
|
const meta = this._cachedMeta;
|
|
const metaData = meta.data;
|
|
let total = 0;
|
|
let i;
|
|
for (i = 0; i < metaData.length; i++) {
|
|
const value = meta._parsed[i];
|
|
if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {
|
|
total += Math.abs(value);
|
|
}
|
|
}
|
|
return total;
|
|
}
|
|
calculateCircumference(value) {
|
|
const total = this._cachedMeta.total;
|
|
if (total > 0 && !isNaN(value)) {
|
|
return TAU * (Math.abs(value) / total);
|
|
}
|
|
return 0;
|
|
}
|
|
getLabelAndValue(index) {
|
|
const meta = this._cachedMeta;
|
|
const chart = this.chart;
|
|
const labels = chart.data.labels || [];
|
|
const value = formatNumber(meta._parsed[index], chart.options.locale);
|
|
return {
|
|
label: labels[index] || "",
|
|
value
|
|
};
|
|
}
|
|
getMaxBorderWidth(arcs) {
|
|
let max = 0;
|
|
const chart = this.chart;
|
|
let i, ilen, meta, controller, options;
|
|
if (!arcs) {
|
|
for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {
|
|
if (chart.isDatasetVisible(i)) {
|
|
meta = chart.getDatasetMeta(i);
|
|
arcs = meta.data;
|
|
controller = meta.controller;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (!arcs) {
|
|
return 0;
|
|
}
|
|
for (i = 0, ilen = arcs.length; i < ilen; ++i) {
|
|
options = controller.resolveDataElementOptions(i);
|
|
if (options.borderAlign !== "inner") {
|
|
max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);
|
|
}
|
|
}
|
|
return max;
|
|
}
|
|
getMaxOffset(arcs) {
|
|
let max = 0;
|
|
for (let i = 0, ilen = arcs.length; i < ilen; ++i) {
|
|
const options = this.resolveDataElementOptions(i);
|
|
max = Math.max(max, options.offset || 0, options.hoverOffset || 0);
|
|
}
|
|
return max;
|
|
}
|
|
_getRingWeightOffset(datasetIndex) {
|
|
let ringWeightOffset = 0;
|
|
for (let i = 0; i < datasetIndex; ++i) {
|
|
if (this.chart.isDatasetVisible(i)) {
|
|
ringWeightOffset += this._getRingWeight(i);
|
|
}
|
|
}
|
|
return ringWeightOffset;
|
|
}
|
|
_getRingWeight(datasetIndex) {
|
|
return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);
|
|
}
|
|
_getVisibleDatasetWeightTotal() {
|
|
return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;
|
|
}
|
|
};
|
|
__publicField(DoughnutController, "id", "doughnut");
|
|
__publicField(DoughnutController, "defaults", {
|
|
datasetElementType: false,
|
|
dataElementType: "arc",
|
|
animation: {
|
|
animateRotate: true,
|
|
animateScale: false
|
|
},
|
|
animations: {
|
|
numbers: {
|
|
type: "number",
|
|
properties: [
|
|
"circumference",
|
|
"endAngle",
|
|
"innerRadius",
|
|
"outerRadius",
|
|
"startAngle",
|
|
"x",
|
|
"y",
|
|
"offset",
|
|
"borderWidth",
|
|
"spacing"
|
|
]
|
|
}
|
|
},
|
|
cutout: "50%",
|
|
rotation: 0,
|
|
circumference: 360,
|
|
radius: "100%",
|
|
spacing: 0,
|
|
indexAxis: "r"
|
|
});
|
|
__publicField(DoughnutController, "descriptors", {
|
|
_scriptable: (name) => name !== "spacing",
|
|
_indexable: (name) => name !== "spacing" && !name.startsWith("borderDash") && !name.startsWith("hoverBorderDash")
|
|
});
|
|
__publicField(DoughnutController, "overrides", {
|
|
aspectRatio: 1,
|
|
plugins: {
|
|
legend: {
|
|
labels: {
|
|
generateLabels(chart) {
|
|
const data = chart.data;
|
|
if (data.labels.length && data.datasets.length) {
|
|
const { labels: { pointStyle, color: color2 } } = chart.legend.options;
|
|
return data.labels.map((label, i) => {
|
|
const meta = chart.getDatasetMeta(0);
|
|
const style = meta.controller.getStyle(i);
|
|
return {
|
|
text: label,
|
|
fillStyle: style.backgroundColor,
|
|
strokeStyle: style.borderColor,
|
|
fontColor: color2,
|
|
lineWidth: style.borderWidth,
|
|
pointStyle,
|
|
hidden: !chart.getDataVisibility(i),
|
|
index: i
|
|
};
|
|
});
|
|
}
|
|
return [];
|
|
}
|
|
},
|
|
onClick(e, legendItem, legend) {
|
|
legend.chart.toggleDataVisibility(legendItem.index);
|
|
legend.chart.update();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
var PieController = class extends DoughnutController {
|
|
};
|
|
__publicField(PieController, "id", "pie");
|
|
__publicField(PieController, "defaults", {
|
|
cutout: 0,
|
|
rotation: 0,
|
|
circumference: 360,
|
|
radius: "100%"
|
|
});
|
|
function abstract() {
|
|
throw new Error("This method is not implemented: Check that a complete date adapter is provided.");
|
|
}
|
|
var DateAdapterBase = class _DateAdapterBase {
|
|
constructor(options) {
|
|
__publicField(this, "options");
|
|
this.options = options || {};
|
|
}
|
|
/**
|
|
* Override default date adapter methods.
|
|
* Accepts type parameter to define options type.
|
|
* @example
|
|
* Chart._adapters._date.override<{myAdapterOption: string}>({
|
|
* init() {
|
|
* console.log(this.options.myAdapterOption);
|
|
* }
|
|
* })
|
|
*/
|
|
static override(members) {
|
|
Object.assign(_DateAdapterBase.prototype, members);
|
|
}
|
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
init() {
|
|
}
|
|
formats() {
|
|
return abstract();
|
|
}
|
|
parse() {
|
|
return abstract();
|
|
}
|
|
format() {
|
|
return abstract();
|
|
}
|
|
add() {
|
|
return abstract();
|
|
}
|
|
diff() {
|
|
return abstract();
|
|
}
|
|
startOf() {
|
|
return abstract();
|
|
}
|
|
endOf() {
|
|
return abstract();
|
|
}
|
|
};
|
|
var adapters = {
|
|
_date: DateAdapterBase
|
|
};
|
|
function binarySearch(metaset, axis, value, intersect) {
|
|
const { controller, data, _sorted } = metaset;
|
|
const iScale = controller._cachedMeta.iScale;
|
|
if (iScale && axis === iScale.axis && axis !== "r" && _sorted && data.length) {
|
|
const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;
|
|
if (!intersect) {
|
|
return lookupMethod(data, axis, value);
|
|
} else if (controller._sharedOptions) {
|
|
const el = data[0];
|
|
const range = typeof el.getRange === "function" && el.getRange(axis);
|
|
if (range) {
|
|
const start = lookupMethod(data, axis, value - range);
|
|
const end = lookupMethod(data, axis, value + range);
|
|
return {
|
|
lo: start.lo,
|
|
hi: end.hi
|
|
};
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
lo: 0,
|
|
hi: data.length - 1
|
|
};
|
|
}
|
|
function evaluateInteractionItems(chart, axis, position, handler, intersect) {
|
|
const metasets = chart.getSortedVisibleDatasetMetas();
|
|
const value = position[axis];
|
|
for (let i = 0, ilen = metasets.length; i < ilen; ++i) {
|
|
const { index, data } = metasets[i];
|
|
const { lo, hi } = binarySearch(metasets[i], axis, value, intersect);
|
|
for (let j = lo; j <= hi; ++j) {
|
|
const element = data[j];
|
|
if (!element.skip) {
|
|
handler(element, index, j);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function getDistanceMetricForAxis(axis) {
|
|
const useX = axis.indexOf("x") !== -1;
|
|
const useY = axis.indexOf("y") !== -1;
|
|
return function(pt1, pt2) {
|
|
const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;
|
|
const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;
|
|
return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));
|
|
};
|
|
}
|
|
function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {
|
|
const items = [];
|
|
if (!includeInvisible && !chart.isPointInArea(position)) {
|
|
return items;
|
|
}
|
|
const evaluationFunc = function(element, datasetIndex, index) {
|
|
if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {
|
|
return;
|
|
}
|
|
if (element.inRange(position.x, position.y, useFinalPosition)) {
|
|
items.push({
|
|
element,
|
|
datasetIndex,
|
|
index
|
|
});
|
|
}
|
|
};
|
|
evaluateInteractionItems(chart, axis, position, evaluationFunc, true);
|
|
return items;
|
|
}
|
|
function getNearestRadialItems(chart, position, axis, useFinalPosition) {
|
|
let items = [];
|
|
function evaluationFunc(element, datasetIndex, index) {
|
|
const { startAngle, endAngle } = element.getProps([
|
|
"startAngle",
|
|
"endAngle"
|
|
], useFinalPosition);
|
|
const { angle } = getAngleFromPoint(element, {
|
|
x: position.x,
|
|
y: position.y
|
|
});
|
|
if (_angleBetween(angle, startAngle, endAngle)) {
|
|
items.push({
|
|
element,
|
|
datasetIndex,
|
|
index
|
|
});
|
|
}
|
|
}
|
|
evaluateInteractionItems(chart, axis, position, evaluationFunc);
|
|
return items;
|
|
}
|
|
function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {
|
|
let items = [];
|
|
const distanceMetric = getDistanceMetricForAxis(axis);
|
|
let minDistance = Number.POSITIVE_INFINITY;
|
|
function evaluationFunc(element, datasetIndex, index) {
|
|
const inRange2 = element.inRange(position.x, position.y, useFinalPosition);
|
|
if (intersect && !inRange2) {
|
|
return;
|
|
}
|
|
const center = element.getCenterPoint(useFinalPosition);
|
|
const pointInArea = !!includeInvisible || chart.isPointInArea(center);
|
|
if (!pointInArea && !inRange2) {
|
|
return;
|
|
}
|
|
const distance = distanceMetric(position, center);
|
|
if (distance < minDistance) {
|
|
items = [
|
|
{
|
|
element,
|
|
datasetIndex,
|
|
index
|
|
}
|
|
];
|
|
minDistance = distance;
|
|
} else if (distance === minDistance) {
|
|
items.push({
|
|
element,
|
|
datasetIndex,
|
|
index
|
|
});
|
|
}
|
|
}
|
|
evaluateInteractionItems(chart, axis, position, evaluationFunc);
|
|
return items;
|
|
}
|
|
function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {
|
|
if (!includeInvisible && !chart.isPointInArea(position)) {
|
|
return [];
|
|
}
|
|
return axis === "r" && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);
|
|
}
|
|
function getAxisItems(chart, position, axis, intersect, useFinalPosition) {
|
|
const items = [];
|
|
const rangeMethod = axis === "x" ? "inXRange" : "inYRange";
|
|
let intersectsItem = false;
|
|
evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {
|
|
if (element[rangeMethod](position[axis], useFinalPosition)) {
|
|
items.push({
|
|
element,
|
|
datasetIndex,
|
|
index
|
|
});
|
|
intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);
|
|
}
|
|
});
|
|
if (intersect && !intersectsItem) {
|
|
return [];
|
|
}
|
|
return items;
|
|
}
|
|
var Interaction = {
|
|
evaluateInteractionItems,
|
|
modes: {
|
|
index(chart, e, options, useFinalPosition) {
|
|
const position = getRelativePosition(e, chart);
|
|
const axis = options.axis || "x";
|
|
const includeInvisible = options.includeInvisible || false;
|
|
const items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);
|
|
const elements = [];
|
|
if (!items.length) {
|
|
return [];
|
|
}
|
|
chart.getSortedVisibleDatasetMetas().forEach((meta) => {
|
|
const index = items[0].index;
|
|
const element = meta.data[index];
|
|
if (element && !element.skip) {
|
|
elements.push({
|
|
element,
|
|
datasetIndex: meta.index,
|
|
index
|
|
});
|
|
}
|
|
});
|
|
return elements;
|
|
},
|
|
dataset(chart, e, options, useFinalPosition) {
|
|
const position = getRelativePosition(e, chart);
|
|
const axis = options.axis || "xy";
|
|
const includeInvisible = options.includeInvisible || false;
|
|
let items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);
|
|
if (items.length > 0) {
|
|
const datasetIndex = items[0].datasetIndex;
|
|
const data = chart.getDatasetMeta(datasetIndex).data;
|
|
items = [];
|
|
for (let i = 0; i < data.length; ++i) {
|
|
items.push({
|
|
element: data[i],
|
|
datasetIndex,
|
|
index: i
|
|
});
|
|
}
|
|
}
|
|
return items;
|
|
},
|
|
point(chart, e, options, useFinalPosition) {
|
|
const position = getRelativePosition(e, chart);
|
|
const axis = options.axis || "xy";
|
|
const includeInvisible = options.includeInvisible || false;
|
|
return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);
|
|
},
|
|
nearest(chart, e, options, useFinalPosition) {
|
|
const position = getRelativePosition(e, chart);
|
|
const axis = options.axis || "xy";
|
|
const includeInvisible = options.includeInvisible || false;
|
|
return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);
|
|
},
|
|
x(chart, e, options, useFinalPosition) {
|
|
const position = getRelativePosition(e, chart);
|
|
return getAxisItems(chart, position, "x", options.intersect, useFinalPosition);
|
|
},
|
|
y(chart, e, options, useFinalPosition) {
|
|
const position = getRelativePosition(e, chart);
|
|
return getAxisItems(chart, position, "y", options.intersect, useFinalPosition);
|
|
}
|
|
}
|
|
};
|
|
var STATIC_POSITIONS = [
|
|
"left",
|
|
"top",
|
|
"right",
|
|
"bottom"
|
|
];
|
|
function filterByPosition(array, position) {
|
|
return array.filter((v) => v.pos === position);
|
|
}
|
|
function filterDynamicPositionByAxis(array, axis) {
|
|
return array.filter((v) => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);
|
|
}
|
|
function sortByWeight(array, reverse) {
|
|
return array.sort((a, b) => {
|
|
const v0 = reverse ? b : a;
|
|
const v1 = reverse ? a : b;
|
|
return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight;
|
|
});
|
|
}
|
|
function wrapBoxes(boxes) {
|
|
const layoutBoxes = [];
|
|
let i, ilen, box, pos, stack, stackWeight;
|
|
for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {
|
|
box = boxes[i];
|
|
({ position: pos, options: { stack, stackWeight = 1 } } = box);
|
|
layoutBoxes.push({
|
|
index: i,
|
|
box,
|
|
pos,
|
|
horizontal: box.isHorizontal(),
|
|
weight: box.weight,
|
|
stack: stack && pos + stack,
|
|
stackWeight
|
|
});
|
|
}
|
|
return layoutBoxes;
|
|
}
|
|
function buildStacks(layouts2) {
|
|
const stacks = {};
|
|
for (const wrap of layouts2) {
|
|
const { stack, pos, stackWeight } = wrap;
|
|
if (!stack || !STATIC_POSITIONS.includes(pos)) {
|
|
continue;
|
|
}
|
|
const _stack = stacks[stack] || (stacks[stack] = {
|
|
count: 0,
|
|
placed: 0,
|
|
weight: 0,
|
|
size: 0
|
|
});
|
|
_stack.count++;
|
|
_stack.weight += stackWeight;
|
|
}
|
|
return stacks;
|
|
}
|
|
function setLayoutDims(layouts2, params) {
|
|
const stacks = buildStacks(layouts2);
|
|
const { vBoxMaxWidth, hBoxMaxHeight } = params;
|
|
let i, ilen, layout;
|
|
for (i = 0, ilen = layouts2.length; i < ilen; ++i) {
|
|
layout = layouts2[i];
|
|
const { fullSize } = layout.box;
|
|
const stack = stacks[layout.stack];
|
|
const factor = stack && layout.stackWeight / stack.weight;
|
|
if (layout.horizontal) {
|
|
layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;
|
|
layout.height = hBoxMaxHeight;
|
|
} else {
|
|
layout.width = vBoxMaxWidth;
|
|
layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;
|
|
}
|
|
}
|
|
return stacks;
|
|
}
|
|
function buildLayoutBoxes(boxes) {
|
|
const layoutBoxes = wrapBoxes(boxes);
|
|
const fullSize = sortByWeight(layoutBoxes.filter((wrap) => wrap.box.fullSize), true);
|
|
const left = sortByWeight(filterByPosition(layoutBoxes, "left"), true);
|
|
const right = sortByWeight(filterByPosition(layoutBoxes, "right"));
|
|
const top = sortByWeight(filterByPosition(layoutBoxes, "top"), true);
|
|
const bottom = sortByWeight(filterByPosition(layoutBoxes, "bottom"));
|
|
const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, "x");
|
|
const centerVertical = filterDynamicPositionByAxis(layoutBoxes, "y");
|
|
return {
|
|
fullSize,
|
|
leftAndTop: left.concat(top),
|
|
rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),
|
|
chartArea: filterByPosition(layoutBoxes, "chartArea"),
|
|
vertical: left.concat(right).concat(centerVertical),
|
|
horizontal: top.concat(bottom).concat(centerHorizontal)
|
|
};
|
|
}
|
|
function getCombinedMax(maxPadding, chartArea, a, b) {
|
|
return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);
|
|
}
|
|
function updateMaxPadding(maxPadding, boxPadding) {
|
|
maxPadding.top = Math.max(maxPadding.top, boxPadding.top);
|
|
maxPadding.left = Math.max(maxPadding.left, boxPadding.left);
|
|
maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);
|
|
maxPadding.right = Math.max(maxPadding.right, boxPadding.right);
|
|
}
|
|
function updateDims(chartArea, params, layout, stacks) {
|
|
const { pos, box } = layout;
|
|
const maxPadding = chartArea.maxPadding;
|
|
if (!isObject(pos)) {
|
|
if (layout.size) {
|
|
chartArea[pos] -= layout.size;
|
|
}
|
|
const stack = stacks[layout.stack] || {
|
|
size: 0,
|
|
count: 1
|
|
};
|
|
stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);
|
|
layout.size = stack.size / stack.count;
|
|
chartArea[pos] += layout.size;
|
|
}
|
|
if (box.getPadding) {
|
|
updateMaxPadding(maxPadding, box.getPadding());
|
|
}
|
|
const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, "left", "right"));
|
|
const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, "top", "bottom"));
|
|
const widthChanged = newWidth !== chartArea.w;
|
|
const heightChanged = newHeight !== chartArea.h;
|
|
chartArea.w = newWidth;
|
|
chartArea.h = newHeight;
|
|
return layout.horizontal ? {
|
|
same: widthChanged,
|
|
other: heightChanged
|
|
} : {
|
|
same: heightChanged,
|
|
other: widthChanged
|
|
};
|
|
}
|
|
function handleMaxPadding(chartArea) {
|
|
const maxPadding = chartArea.maxPadding;
|
|
function updatePos(pos) {
|
|
const change = Math.max(maxPadding[pos] - chartArea[pos], 0);
|
|
chartArea[pos] += change;
|
|
return change;
|
|
}
|
|
chartArea.y += updatePos("top");
|
|
chartArea.x += updatePos("left");
|
|
updatePos("right");
|
|
updatePos("bottom");
|
|
}
|
|
function getMargins(horizontal, chartArea) {
|
|
const maxPadding = chartArea.maxPadding;
|
|
function marginForPositions(positions2) {
|
|
const margin = {
|
|
left: 0,
|
|
top: 0,
|
|
right: 0,
|
|
bottom: 0
|
|
};
|
|
positions2.forEach((pos) => {
|
|
margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);
|
|
});
|
|
return margin;
|
|
}
|
|
return horizontal ? marginForPositions([
|
|
"left",
|
|
"right"
|
|
]) : marginForPositions([
|
|
"top",
|
|
"bottom"
|
|
]);
|
|
}
|
|
function fitBoxes(boxes, chartArea, params, stacks) {
|
|
const refitBoxes = [];
|
|
let i, ilen, layout, box, refit, changed;
|
|
for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {
|
|
layout = boxes[i];
|
|
box = layout.box;
|
|
box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea));
|
|
const { same, other } = updateDims(chartArea, params, layout, stacks);
|
|
refit |= same && refitBoxes.length;
|
|
changed = changed || other;
|
|
if (!box.fullSize) {
|
|
refitBoxes.push(layout);
|
|
}
|
|
}
|
|
return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;
|
|
}
|
|
function setBoxDims(box, left, top, width, height) {
|
|
box.top = top;
|
|
box.left = left;
|
|
box.right = left + width;
|
|
box.bottom = top + height;
|
|
box.width = width;
|
|
box.height = height;
|
|
}
|
|
function placeBoxes(boxes, chartArea, params, stacks) {
|
|
const userPadding = params.padding;
|
|
let { x, y } = chartArea;
|
|
for (const layout of boxes) {
|
|
const box = layout.box;
|
|
const stack = stacks[layout.stack] || {
|
|
count: 1,
|
|
placed: 0,
|
|
weight: 1
|
|
};
|
|
const weight = layout.stackWeight / stack.weight || 1;
|
|
if (layout.horizontal) {
|
|
const width = chartArea.w * weight;
|
|
const height = stack.size || box.height;
|
|
if (defined(stack.start)) {
|
|
y = stack.start;
|
|
}
|
|
if (box.fullSize) {
|
|
setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);
|
|
} else {
|
|
setBoxDims(box, chartArea.left + stack.placed, y, width, height);
|
|
}
|
|
stack.start = y;
|
|
stack.placed += width;
|
|
y = box.bottom;
|
|
} else {
|
|
const height = chartArea.h * weight;
|
|
const width = stack.size || box.width;
|
|
if (defined(stack.start)) {
|
|
x = stack.start;
|
|
}
|
|
if (box.fullSize) {
|
|
setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);
|
|
} else {
|
|
setBoxDims(box, x, chartArea.top + stack.placed, width, height);
|
|
}
|
|
stack.start = x;
|
|
stack.placed += height;
|
|
x = box.right;
|
|
}
|
|
}
|
|
chartArea.x = x;
|
|
chartArea.y = y;
|
|
}
|
|
var layouts = {
|
|
addBox(chart, item) {
|
|
if (!chart.boxes) {
|
|
chart.boxes = [];
|
|
}
|
|
item.fullSize = item.fullSize || false;
|
|
item.position = item.position || "top";
|
|
item.weight = item.weight || 0;
|
|
item._layers = item._layers || function() {
|
|
return [
|
|
{
|
|
z: 0,
|
|
draw(chartArea) {
|
|
item.draw(chartArea);
|
|
}
|
|
}
|
|
];
|
|
};
|
|
chart.boxes.push(item);
|
|
},
|
|
removeBox(chart, layoutItem) {
|
|
const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;
|
|
if (index !== -1) {
|
|
chart.boxes.splice(index, 1);
|
|
}
|
|
},
|
|
configure(chart, item, options) {
|
|
item.fullSize = options.fullSize;
|
|
item.position = options.position;
|
|
item.weight = options.weight;
|
|
},
|
|
update(chart, width, height, minPadding) {
|
|
if (!chart) {
|
|
return;
|
|
}
|
|
const padding = toPadding(chart.options.layout.padding);
|
|
const availableWidth = Math.max(width - padding.width, 0);
|
|
const availableHeight = Math.max(height - padding.height, 0);
|
|
const boxes = buildLayoutBoxes(chart.boxes);
|
|
const verticalBoxes = boxes.vertical;
|
|
const horizontalBoxes = boxes.horizontal;
|
|
each(chart.boxes, (box) => {
|
|
if (typeof box.beforeLayout === "function") {
|
|
box.beforeLayout();
|
|
}
|
|
});
|
|
const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) => wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;
|
|
const params = Object.freeze({
|
|
outerWidth: width,
|
|
outerHeight: height,
|
|
padding,
|
|
availableWidth,
|
|
availableHeight,
|
|
vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,
|
|
hBoxMaxHeight: availableHeight / 2
|
|
});
|
|
const maxPadding = Object.assign({}, padding);
|
|
updateMaxPadding(maxPadding, toPadding(minPadding));
|
|
const chartArea = Object.assign({
|
|
maxPadding,
|
|
w: availableWidth,
|
|
h: availableHeight,
|
|
x: padding.left,
|
|
y: padding.top
|
|
}, padding);
|
|
const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);
|
|
fitBoxes(boxes.fullSize, chartArea, params, stacks);
|
|
fitBoxes(verticalBoxes, chartArea, params, stacks);
|
|
if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {
|
|
fitBoxes(verticalBoxes, chartArea, params, stacks);
|
|
}
|
|
handleMaxPadding(chartArea);
|
|
placeBoxes(boxes.leftAndTop, chartArea, params, stacks);
|
|
chartArea.x += chartArea.w;
|
|
chartArea.y += chartArea.h;
|
|
placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);
|
|
chart.chartArea = {
|
|
left: chartArea.left,
|
|
top: chartArea.top,
|
|
right: chartArea.left + chartArea.w,
|
|
bottom: chartArea.top + chartArea.h,
|
|
height: chartArea.h,
|
|
width: chartArea.w
|
|
};
|
|
each(boxes.chartArea, (layout) => {
|
|
const box = layout.box;
|
|
Object.assign(box, chart.chartArea);
|
|
box.update(chartArea.w, chartArea.h, {
|
|
left: 0,
|
|
top: 0,
|
|
right: 0,
|
|
bottom: 0
|
|
});
|
|
});
|
|
}
|
|
};
|
|
var BasePlatform = class {
|
|
acquireContext(canvas, aspectRatio) {
|
|
}
|
|
releaseContext(context) {
|
|
return false;
|
|
}
|
|
addEventListener(chart, type, listener) {
|
|
}
|
|
removeEventListener(chart, type, listener) {
|
|
}
|
|
getDevicePixelRatio() {
|
|
return 1;
|
|
}
|
|
getMaximumSize(element, width, height, aspectRatio) {
|
|
width = Math.max(0, width || element.width);
|
|
height = height || element.height;
|
|
return {
|
|
width,
|
|
height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)
|
|
};
|
|
}
|
|
isAttached(canvas) {
|
|
return true;
|
|
}
|
|
updateConfig(config) {
|
|
}
|
|
};
|
|
var BasicPlatform = class extends BasePlatform {
|
|
acquireContext(item) {
|
|
return item && item.getContext && item.getContext("2d") || null;
|
|
}
|
|
updateConfig(config) {
|
|
config.options.animation = false;
|
|
}
|
|
};
|
|
var EXPANDO_KEY = "$chartjs";
|
|
var EVENT_TYPES = {
|
|
touchstart: "mousedown",
|
|
touchmove: "mousemove",
|
|
touchend: "mouseup",
|
|
pointerenter: "mouseenter",
|
|
pointerdown: "mousedown",
|
|
pointermove: "mousemove",
|
|
pointerup: "mouseup",
|
|
pointerleave: "mouseout",
|
|
pointerout: "mouseout"
|
|
};
|
|
var isNullOrEmpty = (value) => value === null || value === "";
|
|
function initCanvas(canvas, aspectRatio) {
|
|
const style = canvas.style;
|
|
const renderHeight = canvas.getAttribute("height");
|
|
const renderWidth = canvas.getAttribute("width");
|
|
canvas[EXPANDO_KEY] = {
|
|
initial: {
|
|
height: renderHeight,
|
|
width: renderWidth,
|
|
style: {
|
|
display: style.display,
|
|
height: style.height,
|
|
width: style.width
|
|
}
|
|
}
|
|
};
|
|
style.display = style.display || "block";
|
|
style.boxSizing = style.boxSizing || "border-box";
|
|
if (isNullOrEmpty(renderWidth)) {
|
|
const displayWidth = readUsedSize(canvas, "width");
|
|
if (displayWidth !== void 0) {
|
|
canvas.width = displayWidth;
|
|
}
|
|
}
|
|
if (isNullOrEmpty(renderHeight)) {
|
|
if (canvas.style.height === "") {
|
|
canvas.height = canvas.width / (aspectRatio || 2);
|
|
} else {
|
|
const displayHeight = readUsedSize(canvas, "height");
|
|
if (displayHeight !== void 0) {
|
|
canvas.height = displayHeight;
|
|
}
|
|
}
|
|
}
|
|
return canvas;
|
|
}
|
|
var eventListenerOptions = supportsEventListenerOptions ? {
|
|
passive: true
|
|
} : false;
|
|
function addListener(node, type, listener) {
|
|
node.addEventListener(type, listener, eventListenerOptions);
|
|
}
|
|
function removeListener(chart, type, listener) {
|
|
chart.canvas.removeEventListener(type, listener, eventListenerOptions);
|
|
}
|
|
function fromNativeEvent(event, chart) {
|
|
const type = EVENT_TYPES[event.type] || event.type;
|
|
const { x, y } = getRelativePosition(event, chart);
|
|
return {
|
|
type,
|
|
chart,
|
|
native: event,
|
|
x: x !== void 0 ? x : null,
|
|
y: y !== void 0 ? y : null
|
|
};
|
|
}
|
|
function nodeListContains(nodeList, canvas) {
|
|
for (const node of nodeList) {
|
|
if (node === canvas || node.contains(canvas)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
function createAttachObserver(chart, type, listener) {
|
|
const canvas = chart.canvas;
|
|
const observer = new MutationObserver((entries) => {
|
|
let trigger = false;
|
|
for (const entry of entries) {
|
|
trigger = trigger || nodeListContains(entry.addedNodes, canvas);
|
|
trigger = trigger && !nodeListContains(entry.removedNodes, canvas);
|
|
}
|
|
if (trigger) {
|
|
listener();
|
|
}
|
|
});
|
|
observer.observe(document, {
|
|
childList: true,
|
|
subtree: true
|
|
});
|
|
return observer;
|
|
}
|
|
function createDetachObserver(chart, type, listener) {
|
|
const canvas = chart.canvas;
|
|
const observer = new MutationObserver((entries) => {
|
|
let trigger = false;
|
|
for (const entry of entries) {
|
|
trigger = trigger || nodeListContains(entry.removedNodes, canvas);
|
|
trigger = trigger && !nodeListContains(entry.addedNodes, canvas);
|
|
}
|
|
if (trigger) {
|
|
listener();
|
|
}
|
|
});
|
|
observer.observe(document, {
|
|
childList: true,
|
|
subtree: true
|
|
});
|
|
return observer;
|
|
}
|
|
var drpListeningCharts = /* @__PURE__ */ new Map();
|
|
var oldDevicePixelRatio = 0;
|
|
function onWindowResize() {
|
|
const dpr = window.devicePixelRatio;
|
|
if (dpr === oldDevicePixelRatio) {
|
|
return;
|
|
}
|
|
oldDevicePixelRatio = dpr;
|
|
drpListeningCharts.forEach((resize, chart) => {
|
|
if (chart.currentDevicePixelRatio !== dpr) {
|
|
resize();
|
|
}
|
|
});
|
|
}
|
|
function listenDevicePixelRatioChanges(chart, resize) {
|
|
if (!drpListeningCharts.size) {
|
|
window.addEventListener("resize", onWindowResize);
|
|
}
|
|
drpListeningCharts.set(chart, resize);
|
|
}
|
|
function unlistenDevicePixelRatioChanges(chart) {
|
|
drpListeningCharts.delete(chart);
|
|
if (!drpListeningCharts.size) {
|
|
window.removeEventListener("resize", onWindowResize);
|
|
}
|
|
}
|
|
function createResizeObserver(chart, type, listener) {
|
|
const canvas = chart.canvas;
|
|
const container = canvas && _getParentNode(canvas);
|
|
if (!container) {
|
|
return;
|
|
}
|
|
const resize = throttled((width, height) => {
|
|
const w = container.clientWidth;
|
|
listener(width, height);
|
|
if (w < container.clientWidth) {
|
|
listener();
|
|
}
|
|
}, window);
|
|
const observer = new ResizeObserver((entries) => {
|
|
const entry = entries[0];
|
|
const width = entry.contentRect.width;
|
|
const height = entry.contentRect.height;
|
|
if (width === 0 && height === 0) {
|
|
return;
|
|
}
|
|
resize(width, height);
|
|
});
|
|
observer.observe(container);
|
|
listenDevicePixelRatioChanges(chart, resize);
|
|
return observer;
|
|
}
|
|
function releaseObserver(chart, type, observer) {
|
|
if (observer) {
|
|
observer.disconnect();
|
|
}
|
|
if (type === "resize") {
|
|
unlistenDevicePixelRatioChanges(chart);
|
|
}
|
|
}
|
|
function createProxyAndListen(chart, type, listener) {
|
|
const canvas = chart.canvas;
|
|
const proxy = throttled((event) => {
|
|
if (chart.ctx !== null) {
|
|
listener(fromNativeEvent(event, chart));
|
|
}
|
|
}, chart);
|
|
addListener(canvas, type, proxy);
|
|
return proxy;
|
|
}
|
|
var DomPlatform = class extends BasePlatform {
|
|
acquireContext(canvas, aspectRatio) {
|
|
const context = canvas && canvas.getContext && canvas.getContext("2d");
|
|
if (context && context.canvas === canvas) {
|
|
initCanvas(canvas, aspectRatio);
|
|
return context;
|
|
}
|
|
return null;
|
|
}
|
|
releaseContext(context) {
|
|
const canvas = context.canvas;
|
|
if (!canvas[EXPANDO_KEY]) {
|
|
return false;
|
|
}
|
|
const initial = canvas[EXPANDO_KEY].initial;
|
|
[
|
|
"height",
|
|
"width"
|
|
].forEach((prop) => {
|
|
const value = initial[prop];
|
|
if (isNullOrUndef(value)) {
|
|
canvas.removeAttribute(prop);
|
|
} else {
|
|
canvas.setAttribute(prop, value);
|
|
}
|
|
});
|
|
const style = initial.style || {};
|
|
Object.keys(style).forEach((key) => {
|
|
canvas.style[key] = style[key];
|
|
});
|
|
canvas.width = canvas.width;
|
|
delete canvas[EXPANDO_KEY];
|
|
return true;
|
|
}
|
|
addEventListener(chart, type, listener) {
|
|
this.removeEventListener(chart, type);
|
|
const proxies = chart.$proxies || (chart.$proxies = {});
|
|
const handlers = {
|
|
attach: createAttachObserver,
|
|
detach: createDetachObserver,
|
|
resize: createResizeObserver
|
|
};
|
|
const handler = handlers[type] || createProxyAndListen;
|
|
proxies[type] = handler(chart, type, listener);
|
|
}
|
|
removeEventListener(chart, type) {
|
|
const proxies = chart.$proxies || (chart.$proxies = {});
|
|
const proxy = proxies[type];
|
|
if (!proxy) {
|
|
return;
|
|
}
|
|
const handlers = {
|
|
attach: releaseObserver,
|
|
detach: releaseObserver,
|
|
resize: releaseObserver
|
|
};
|
|
const handler = handlers[type] || removeListener;
|
|
handler(chart, type, proxy);
|
|
proxies[type] = void 0;
|
|
}
|
|
getDevicePixelRatio() {
|
|
return window.devicePixelRatio;
|
|
}
|
|
getMaximumSize(canvas, width, height, aspectRatio) {
|
|
return getMaximumSize(canvas, width, height, aspectRatio);
|
|
}
|
|
isAttached(canvas) {
|
|
const container = _getParentNode(canvas);
|
|
return !!(container && container.isConnected);
|
|
}
|
|
};
|
|
function _detectPlatform(canvas) {
|
|
if (!_isDomSupported() || typeof OffscreenCanvas !== "undefined" && canvas instanceof OffscreenCanvas) {
|
|
return BasicPlatform;
|
|
}
|
|
return DomPlatform;
|
|
}
|
|
var Element = class {
|
|
constructor() {
|
|
__publicField(this, "x");
|
|
__publicField(this, "y");
|
|
__publicField(this, "active", false);
|
|
__publicField(this, "options");
|
|
__publicField(this, "$animations");
|
|
}
|
|
tooltipPosition(useFinalPosition) {
|
|
const { x, y } = this.getProps([
|
|
"x",
|
|
"y"
|
|
], useFinalPosition);
|
|
return {
|
|
x,
|
|
y
|
|
};
|
|
}
|
|
hasValue() {
|
|
return isNumber(this.x) && isNumber(this.y);
|
|
}
|
|
getProps(props, final) {
|
|
const anims = this.$animations;
|
|
if (!final || !anims) {
|
|
return this;
|
|
}
|
|
const ret = {};
|
|
props.forEach((prop) => {
|
|
ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop];
|
|
});
|
|
return ret;
|
|
}
|
|
};
|
|
__publicField(Element, "defaults", {});
|
|
__publicField(Element, "defaultRoutes");
|
|
function autoSkip(scale, ticks) {
|
|
const tickOpts = scale.options.ticks;
|
|
const determinedMaxTicks = determineMaxTicks(scale);
|
|
const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);
|
|
const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];
|
|
const numMajorIndices = majorIndices.length;
|
|
const first = majorIndices[0];
|
|
const last = majorIndices[numMajorIndices - 1];
|
|
const newTicks = [];
|
|
if (numMajorIndices > ticksLimit) {
|
|
skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);
|
|
return newTicks;
|
|
}
|
|
const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);
|
|
if (numMajorIndices > 0) {
|
|
let i, ilen;
|
|
const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;
|
|
skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);
|
|
for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {
|
|
skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);
|
|
}
|
|
skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);
|
|
return newTicks;
|
|
}
|
|
skip(ticks, newTicks, spacing);
|
|
return newTicks;
|
|
}
|
|
function determineMaxTicks(scale) {
|
|
const offset = scale.options.offset;
|
|
const tickLength = scale._tickSize();
|
|
const maxScale = scale._length / tickLength + (offset ? 0 : 1);
|
|
const maxChart = scale._maxLength / tickLength;
|
|
return Math.floor(Math.min(maxScale, maxChart));
|
|
}
|
|
function calculateSpacing(majorIndices, ticks, ticksLimit) {
|
|
const evenMajorSpacing = getEvenSpacing(majorIndices);
|
|
const spacing = ticks.length / ticksLimit;
|
|
if (!evenMajorSpacing) {
|
|
return Math.max(spacing, 1);
|
|
}
|
|
const factors = _factorize(evenMajorSpacing);
|
|
for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {
|
|
const factor = factors[i];
|
|
if (factor > spacing) {
|
|
return factor;
|
|
}
|
|
}
|
|
return Math.max(spacing, 1);
|
|
}
|
|
function getMajorIndices(ticks) {
|
|
const result = [];
|
|
let i, ilen;
|
|
for (i = 0, ilen = ticks.length; i < ilen; i++) {
|
|
if (ticks[i].major) {
|
|
result.push(i);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function skipMajors(ticks, newTicks, majorIndices, spacing) {
|
|
let count = 0;
|
|
let next = majorIndices[0];
|
|
let i;
|
|
spacing = Math.ceil(spacing);
|
|
for (i = 0; i < ticks.length; i++) {
|
|
if (i === next) {
|
|
newTicks.push(ticks[i]);
|
|
count++;
|
|
next = majorIndices[count * spacing];
|
|
}
|
|
}
|
|
}
|
|
function skip(ticks, newTicks, spacing, majorStart, majorEnd) {
|
|
const start = valueOrDefault(majorStart, 0);
|
|
const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);
|
|
let count = 0;
|
|
let length, i, next;
|
|
spacing = Math.ceil(spacing);
|
|
if (majorEnd) {
|
|
length = majorEnd - majorStart;
|
|
spacing = length / Math.floor(length / spacing);
|
|
}
|
|
next = start;
|
|
while (next < 0) {
|
|
count++;
|
|
next = Math.round(start + count * spacing);
|
|
}
|
|
for (i = Math.max(start, 0); i < end; i++) {
|
|
if (i === next) {
|
|
newTicks.push(ticks[i]);
|
|
count++;
|
|
next = Math.round(start + count * spacing);
|
|
}
|
|
}
|
|
}
|
|
function getEvenSpacing(arr) {
|
|
const len = arr.length;
|
|
let i, diff;
|
|
if (len < 2) {
|
|
return false;
|
|
}
|
|
for (diff = arr[0], i = 1; i < len; ++i) {
|
|
if (arr[i] - arr[i - 1] !== diff) {
|
|
return false;
|
|
}
|
|
}
|
|
return diff;
|
|
}
|
|
var reverseAlign = (align) => align === "left" ? "right" : align === "right" ? "left" : align;
|
|
var offsetFromEdge = (scale, edge, offset) => edge === "top" || edge === "left" ? scale[edge] + offset : scale[edge] - offset;
|
|
var getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);
|
|
function sample(arr, numItems) {
|
|
const result = [];
|
|
const increment = arr.length / numItems;
|
|
const len = arr.length;
|
|
let i = 0;
|
|
for (; i < len; i += increment) {
|
|
result.push(arr[Math.floor(i)]);
|
|
}
|
|
return result;
|
|
}
|
|
function getPixelForGridLine(scale, index, offsetGridLines) {
|
|
const length = scale.ticks.length;
|
|
const validIndex2 = Math.min(index, length - 1);
|
|
const start = scale._startPixel;
|
|
const end = scale._endPixel;
|
|
const epsilon = 1e-6;
|
|
let lineValue = scale.getPixelForTick(validIndex2);
|
|
let offset;
|
|
if (offsetGridLines) {
|
|
if (length === 1) {
|
|
offset = Math.max(lineValue - start, end - lineValue);
|
|
} else if (index === 0) {
|
|
offset = (scale.getPixelForTick(1) - lineValue) / 2;
|
|
} else {
|
|
offset = (lineValue - scale.getPixelForTick(validIndex2 - 1)) / 2;
|
|
}
|
|
lineValue += validIndex2 < index ? offset : -offset;
|
|
if (lineValue < start - epsilon || lineValue > end + epsilon) {
|
|
return;
|
|
}
|
|
}
|
|
return lineValue;
|
|
}
|
|
function garbageCollect(caches, length) {
|
|
each(caches, (cache) => {
|
|
const gc = cache.gc;
|
|
const gcLen = gc.length / 2;
|
|
let i;
|
|
if (gcLen > length) {
|
|
for (i = 0; i < gcLen; ++i) {
|
|
delete cache.data[gc[i]];
|
|
}
|
|
gc.splice(0, gcLen);
|
|
}
|
|
});
|
|
}
|
|
function getTickMarkLength(options) {
|
|
return options.drawTicks ? options.tickLength : 0;
|
|
}
|
|
function getTitleHeight(options, fallback) {
|
|
if (!options.display) {
|
|
return 0;
|
|
}
|
|
const font = toFont(options.font, fallback);
|
|
const padding = toPadding(options.padding);
|
|
const lines = isArray(options.text) ? options.text.length : 1;
|
|
return lines * font.lineHeight + padding.height;
|
|
}
|
|
function createScaleContext(parent, scale) {
|
|
return createContext(parent, {
|
|
scale,
|
|
type: "scale"
|
|
});
|
|
}
|
|
function createTickContext(parent, index, tick) {
|
|
return createContext(parent, {
|
|
tick,
|
|
index,
|
|
type: "tick"
|
|
});
|
|
}
|
|
function titleAlign(align, position, reverse) {
|
|
let ret = _toLeftRightCenter(align);
|
|
if (reverse && position !== "right" || !reverse && position === "right") {
|
|
ret = reverseAlign(ret);
|
|
}
|
|
return ret;
|
|
}
|
|
function titleArgs(scale, offset, position, align) {
|
|
const { top, left, bottom, right, chart } = scale;
|
|
const { chartArea, scales } = chart;
|
|
let rotation = 0;
|
|
let maxWidth, titleX, titleY;
|
|
const height = bottom - top;
|
|
const width = right - left;
|
|
if (scale.isHorizontal()) {
|
|
titleX = _alignStartEnd(align, left, right);
|
|
if (isObject(position)) {
|
|
const positionAxisID = Object.keys(position)[0];
|
|
const value = position[positionAxisID];
|
|
titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;
|
|
} else if (position === "center") {
|
|
titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;
|
|
} else {
|
|
titleY = offsetFromEdge(scale, position, offset);
|
|
}
|
|
maxWidth = right - left;
|
|
} else {
|
|
if (isObject(position)) {
|
|
const positionAxisID = Object.keys(position)[0];
|
|
const value = position[positionAxisID];
|
|
titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;
|
|
} else if (position === "center") {
|
|
titleX = (chartArea.left + chartArea.right) / 2 - width + offset;
|
|
} else {
|
|
titleX = offsetFromEdge(scale, position, offset);
|
|
}
|
|
titleY = _alignStartEnd(align, bottom, top);
|
|
rotation = position === "left" ? -HALF_PI : HALF_PI;
|
|
}
|
|
return {
|
|
titleX,
|
|
titleY,
|
|
maxWidth,
|
|
rotation
|
|
};
|
|
}
|
|
var Scale = class _Scale extends Element {
|
|
constructor(cfg) {
|
|
super();
|
|
this.id = cfg.id;
|
|
this.type = cfg.type;
|
|
this.options = void 0;
|
|
this.ctx = cfg.ctx;
|
|
this.chart = cfg.chart;
|
|
this.top = void 0;
|
|
this.bottom = void 0;
|
|
this.left = void 0;
|
|
this.right = void 0;
|
|
this.width = void 0;
|
|
this.height = void 0;
|
|
this._margins = {
|
|
left: 0,
|
|
right: 0,
|
|
top: 0,
|
|
bottom: 0
|
|
};
|
|
this.maxWidth = void 0;
|
|
this.maxHeight = void 0;
|
|
this.paddingTop = void 0;
|
|
this.paddingBottom = void 0;
|
|
this.paddingLeft = void 0;
|
|
this.paddingRight = void 0;
|
|
this.axis = void 0;
|
|
this.labelRotation = void 0;
|
|
this.min = void 0;
|
|
this.max = void 0;
|
|
this._range = void 0;
|
|
this.ticks = [];
|
|
this._gridLineItems = null;
|
|
this._labelItems = null;
|
|
this._labelSizes = null;
|
|
this._length = 0;
|
|
this._maxLength = 0;
|
|
this._longestTextCache = {};
|
|
this._startPixel = void 0;
|
|
this._endPixel = void 0;
|
|
this._reversePixels = false;
|
|
this._userMax = void 0;
|
|
this._userMin = void 0;
|
|
this._suggestedMax = void 0;
|
|
this._suggestedMin = void 0;
|
|
this._ticksLength = 0;
|
|
this._borderValue = 0;
|
|
this._cache = {};
|
|
this._dataLimitsCached = false;
|
|
this.$context = void 0;
|
|
}
|
|
init(options) {
|
|
this.options = options.setContext(this.getContext());
|
|
this.axis = options.axis;
|
|
this._userMin = this.parse(options.min);
|
|
this._userMax = this.parse(options.max);
|
|
this._suggestedMin = this.parse(options.suggestedMin);
|
|
this._suggestedMax = this.parse(options.suggestedMax);
|
|
}
|
|
parse(raw, index) {
|
|
return raw;
|
|
}
|
|
getUserBounds() {
|
|
let { _userMin, _userMax, _suggestedMin, _suggestedMax } = this;
|
|
_userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);
|
|
_userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);
|
|
_suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);
|
|
_suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);
|
|
return {
|
|
min: finiteOrDefault(_userMin, _suggestedMin),
|
|
max: finiteOrDefault(_userMax, _suggestedMax),
|
|
minDefined: isNumberFinite(_userMin),
|
|
maxDefined: isNumberFinite(_userMax)
|
|
};
|
|
}
|
|
getMinMax(canStack) {
|
|
let { min, max, minDefined, maxDefined } = this.getUserBounds();
|
|
let range;
|
|
if (minDefined && maxDefined) {
|
|
return {
|
|
min,
|
|
max
|
|
};
|
|
}
|
|
const metas = this.getMatchingVisibleMetas();
|
|
for (let i = 0, ilen = metas.length; i < ilen; ++i) {
|
|
range = metas[i].controller.getMinMax(this, canStack);
|
|
if (!minDefined) {
|
|
min = Math.min(min, range.min);
|
|
}
|
|
if (!maxDefined) {
|
|
max = Math.max(max, range.max);
|
|
}
|
|
}
|
|
min = maxDefined && min > max ? max : min;
|
|
max = minDefined && min > max ? min : max;
|
|
return {
|
|
min: finiteOrDefault(min, finiteOrDefault(max, min)),
|
|
max: finiteOrDefault(max, finiteOrDefault(min, max))
|
|
};
|
|
}
|
|
getPadding() {
|
|
return {
|
|
left: this.paddingLeft || 0,
|
|
top: this.paddingTop || 0,
|
|
right: this.paddingRight || 0,
|
|
bottom: this.paddingBottom || 0
|
|
};
|
|
}
|
|
getTicks() {
|
|
return this.ticks;
|
|
}
|
|
getLabels() {
|
|
const data = this.chart.data;
|
|
return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];
|
|
}
|
|
getLabelItems(chartArea = this.chart.chartArea) {
|
|
const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));
|
|
return items;
|
|
}
|
|
beforeLayout() {
|
|
this._cache = {};
|
|
this._dataLimitsCached = false;
|
|
}
|
|
beforeUpdate() {
|
|
callback(this.options.beforeUpdate, [
|
|
this
|
|
]);
|
|
}
|
|
update(maxWidth, maxHeight, margins) {
|
|
const { beginAtZero, grace, ticks: tickOpts } = this.options;
|
|
const sampleSize = tickOpts.sampleSize;
|
|
this.beforeUpdate();
|
|
this.maxWidth = maxWidth;
|
|
this.maxHeight = maxHeight;
|
|
this._margins = margins = Object.assign({
|
|
left: 0,
|
|
right: 0,
|
|
top: 0,
|
|
bottom: 0
|
|
}, margins);
|
|
this.ticks = null;
|
|
this._labelSizes = null;
|
|
this._gridLineItems = null;
|
|
this._labelItems = null;
|
|
this.beforeSetDimensions();
|
|
this.setDimensions();
|
|
this.afterSetDimensions();
|
|
this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom;
|
|
if (!this._dataLimitsCached) {
|
|
this.beforeDataLimits();
|
|
this.determineDataLimits();
|
|
this.afterDataLimits();
|
|
this._range = _addGrace(this, grace, beginAtZero);
|
|
this._dataLimitsCached = true;
|
|
}
|
|
this.beforeBuildTicks();
|
|
this.ticks = this.buildTicks() || [];
|
|
this.afterBuildTicks();
|
|
const samplingEnabled = sampleSize < this.ticks.length;
|
|
this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);
|
|
this.configure();
|
|
this.beforeCalculateLabelRotation();
|
|
this.calculateLabelRotation();
|
|
this.afterCalculateLabelRotation();
|
|
if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === "auto")) {
|
|
this.ticks = autoSkip(this, this.ticks);
|
|
this._labelSizes = null;
|
|
this.afterAutoSkip();
|
|
}
|
|
if (samplingEnabled) {
|
|
this._convertTicksToLabels(this.ticks);
|
|
}
|
|
this.beforeFit();
|
|
this.fit();
|
|
this.afterFit();
|
|
this.afterUpdate();
|
|
}
|
|
configure() {
|
|
let reversePixels = this.options.reverse;
|
|
let startPixel, endPixel;
|
|
if (this.isHorizontal()) {
|
|
startPixel = this.left;
|
|
endPixel = this.right;
|
|
} else {
|
|
startPixel = this.top;
|
|
endPixel = this.bottom;
|
|
reversePixels = !reversePixels;
|
|
}
|
|
this._startPixel = startPixel;
|
|
this._endPixel = endPixel;
|
|
this._reversePixels = reversePixels;
|
|
this._length = endPixel - startPixel;
|
|
this._alignToPixels = this.options.alignToPixels;
|
|
}
|
|
afterUpdate() {
|
|
callback(this.options.afterUpdate, [
|
|
this
|
|
]);
|
|
}
|
|
beforeSetDimensions() {
|
|
callback(this.options.beforeSetDimensions, [
|
|
this
|
|
]);
|
|
}
|
|
setDimensions() {
|
|
if (this.isHorizontal()) {
|
|
this.width = this.maxWidth;
|
|
this.left = 0;
|
|
this.right = this.width;
|
|
} else {
|
|
this.height = this.maxHeight;
|
|
this.top = 0;
|
|
this.bottom = this.height;
|
|
}
|
|
this.paddingLeft = 0;
|
|
this.paddingTop = 0;
|
|
this.paddingRight = 0;
|
|
this.paddingBottom = 0;
|
|
}
|
|
afterSetDimensions() {
|
|
callback(this.options.afterSetDimensions, [
|
|
this
|
|
]);
|
|
}
|
|
_callHooks(name) {
|
|
this.chart.notifyPlugins(name, this.getContext());
|
|
callback(this.options[name], [
|
|
this
|
|
]);
|
|
}
|
|
beforeDataLimits() {
|
|
this._callHooks("beforeDataLimits");
|
|
}
|
|
determineDataLimits() {
|
|
}
|
|
afterDataLimits() {
|
|
this._callHooks("afterDataLimits");
|
|
}
|
|
beforeBuildTicks() {
|
|
this._callHooks("beforeBuildTicks");
|
|
}
|
|
buildTicks() {
|
|
return [];
|
|
}
|
|
afterBuildTicks() {
|
|
this._callHooks("afterBuildTicks");
|
|
}
|
|
beforeTickToLabelConversion() {
|
|
callback(this.options.beforeTickToLabelConversion, [
|
|
this
|
|
]);
|
|
}
|
|
generateTickLabels(ticks) {
|
|
const tickOpts = this.options.ticks;
|
|
let i, ilen, tick;
|
|
for (i = 0, ilen = ticks.length; i < ilen; i++) {
|
|
tick = ticks[i];
|
|
tick.label = callback(tickOpts.callback, [
|
|
tick.value,
|
|
i,
|
|
ticks
|
|
], this);
|
|
}
|
|
}
|
|
afterTickToLabelConversion() {
|
|
callback(this.options.afterTickToLabelConversion, [
|
|
this
|
|
]);
|
|
}
|
|
beforeCalculateLabelRotation() {
|
|
callback(this.options.beforeCalculateLabelRotation, [
|
|
this
|
|
]);
|
|
}
|
|
calculateLabelRotation() {
|
|
const options = this.options;
|
|
const tickOpts = options.ticks;
|
|
const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);
|
|
const minRotation = tickOpts.minRotation || 0;
|
|
const maxRotation = tickOpts.maxRotation;
|
|
let labelRotation = minRotation;
|
|
let tickWidth, maxHeight, maxLabelDiagonal;
|
|
if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {
|
|
this.labelRotation = minRotation;
|
|
return;
|
|
}
|
|
const labelSizes = this._getLabelSizes();
|
|
const maxLabelWidth = labelSizes.widest.width;
|
|
const maxLabelHeight = labelSizes.highest.height;
|
|
const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);
|
|
tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);
|
|
if (maxLabelWidth + 6 > tickWidth) {
|
|
tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));
|
|
maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);
|
|
maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);
|
|
labelRotation = toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))));
|
|
labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));
|
|
}
|
|
this.labelRotation = labelRotation;
|
|
}
|
|
afterCalculateLabelRotation() {
|
|
callback(this.options.afterCalculateLabelRotation, [
|
|
this
|
|
]);
|
|
}
|
|
afterAutoSkip() {
|
|
}
|
|
beforeFit() {
|
|
callback(this.options.beforeFit, [
|
|
this
|
|
]);
|
|
}
|
|
fit() {
|
|
const minSize = {
|
|
width: 0,
|
|
height: 0
|
|
};
|
|
const { chart, options: { ticks: tickOpts, title: titleOpts, grid: gridOpts } } = this;
|
|
const display = this._isVisible();
|
|
const isHorizontal = this.isHorizontal();
|
|
if (display) {
|
|
const titleHeight = getTitleHeight(titleOpts, chart.options.font);
|
|
if (isHorizontal) {
|
|
minSize.width = this.maxWidth;
|
|
minSize.height = getTickMarkLength(gridOpts) + titleHeight;
|
|
} else {
|
|
minSize.height = this.maxHeight;
|
|
minSize.width = getTickMarkLength(gridOpts) + titleHeight;
|
|
}
|
|
if (tickOpts.display && this.ticks.length) {
|
|
const { first, last, widest, highest } = this._getLabelSizes();
|
|
const tickPadding = tickOpts.padding * 2;
|
|
const angleRadians = toRadians(this.labelRotation);
|
|
const cos = Math.cos(angleRadians);
|
|
const sin = Math.sin(angleRadians);
|
|
if (isHorizontal) {
|
|
const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;
|
|
minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);
|
|
} else {
|
|
const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;
|
|
minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);
|
|
}
|
|
this._calculatePadding(first, last, sin, cos);
|
|
}
|
|
}
|
|
this._handleMargins();
|
|
if (isHorizontal) {
|
|
this.width = this._length = chart.width - this._margins.left - this._margins.right;
|
|
this.height = minSize.height;
|
|
} else {
|
|
this.width = minSize.width;
|
|
this.height = this._length = chart.height - this._margins.top - this._margins.bottom;
|
|
}
|
|
}
|
|
_calculatePadding(first, last, sin, cos) {
|
|
const { ticks: { align, padding }, position } = this.options;
|
|
const isRotated = this.labelRotation !== 0;
|
|
const labelsBelowTicks = position !== "top" && this.axis === "x";
|
|
if (this.isHorizontal()) {
|
|
const offsetLeft = this.getPixelForTick(0) - this.left;
|
|
const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);
|
|
let paddingLeft = 0;
|
|
let paddingRight = 0;
|
|
if (isRotated) {
|
|
if (labelsBelowTicks) {
|
|
paddingLeft = cos * first.width;
|
|
paddingRight = sin * last.height;
|
|
} else {
|
|
paddingLeft = sin * first.height;
|
|
paddingRight = cos * last.width;
|
|
}
|
|
} else if (align === "start") {
|
|
paddingRight = last.width;
|
|
} else if (align === "end") {
|
|
paddingLeft = first.width;
|
|
} else if (align !== "inner") {
|
|
paddingLeft = first.width / 2;
|
|
paddingRight = last.width / 2;
|
|
}
|
|
this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);
|
|
this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);
|
|
} else {
|
|
let paddingTop = last.height / 2;
|
|
let paddingBottom = first.height / 2;
|
|
if (align === "start") {
|
|
paddingTop = 0;
|
|
paddingBottom = first.height;
|
|
} else if (align === "end") {
|
|
paddingTop = last.height;
|
|
paddingBottom = 0;
|
|
}
|
|
this.paddingTop = paddingTop + padding;
|
|
this.paddingBottom = paddingBottom + padding;
|
|
}
|
|
}
|
|
_handleMargins() {
|
|
if (this._margins) {
|
|
this._margins.left = Math.max(this.paddingLeft, this._margins.left);
|
|
this._margins.top = Math.max(this.paddingTop, this._margins.top);
|
|
this._margins.right = Math.max(this.paddingRight, this._margins.right);
|
|
this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);
|
|
}
|
|
}
|
|
afterFit() {
|
|
callback(this.options.afterFit, [
|
|
this
|
|
]);
|
|
}
|
|
isHorizontal() {
|
|
const { axis, position } = this.options;
|
|
return position === "top" || position === "bottom" || axis === "x";
|
|
}
|
|
isFullSize() {
|
|
return this.options.fullSize;
|
|
}
|
|
_convertTicksToLabels(ticks) {
|
|
this.beforeTickToLabelConversion();
|
|
this.generateTickLabels(ticks);
|
|
let i, ilen;
|
|
for (i = 0, ilen = ticks.length; i < ilen; i++) {
|
|
if (isNullOrUndef(ticks[i].label)) {
|
|
ticks.splice(i, 1);
|
|
ilen--;
|
|
i--;
|
|
}
|
|
}
|
|
this.afterTickToLabelConversion();
|
|
}
|
|
_getLabelSizes() {
|
|
let labelSizes = this._labelSizes;
|
|
if (!labelSizes) {
|
|
const sampleSize = this.options.ticks.sampleSize;
|
|
let ticks = this.ticks;
|
|
if (sampleSize < ticks.length) {
|
|
ticks = sample(ticks, sampleSize);
|
|
}
|
|
this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);
|
|
}
|
|
return labelSizes;
|
|
}
|
|
_computeLabelSizes(ticks, length, maxTicksLimit) {
|
|
const { ctx, _longestTextCache: caches } = this;
|
|
const widths = [];
|
|
const heights = [];
|
|
const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));
|
|
let widestLabelSize = 0;
|
|
let highestLabelSize = 0;
|
|
let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;
|
|
for (i = 0; i < length; i += increment) {
|
|
label = ticks[i].label;
|
|
tickFont = this._resolveTickFontOptions(i);
|
|
ctx.font = fontString = tickFont.string;
|
|
cache = caches[fontString] = caches[fontString] || {
|
|
data: {},
|
|
gc: []
|
|
};
|
|
lineHeight = tickFont.lineHeight;
|
|
width = height = 0;
|
|
if (!isNullOrUndef(label) && !isArray(label)) {
|
|
width = _measureText(ctx, cache.data, cache.gc, width, label);
|
|
height = lineHeight;
|
|
} else if (isArray(label)) {
|
|
for (j = 0, jlen = label.length; j < jlen; ++j) {
|
|
nestedLabel = label[j];
|
|
if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {
|
|
width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);
|
|
height += lineHeight;
|
|
}
|
|
}
|
|
}
|
|
widths.push(width);
|
|
heights.push(height);
|
|
widestLabelSize = Math.max(width, widestLabelSize);
|
|
highestLabelSize = Math.max(height, highestLabelSize);
|
|
}
|
|
garbageCollect(caches, length);
|
|
const widest = widths.indexOf(widestLabelSize);
|
|
const highest = heights.indexOf(highestLabelSize);
|
|
const valueAt = (idx) => ({
|
|
width: widths[idx] || 0,
|
|
height: heights[idx] || 0
|
|
});
|
|
return {
|
|
first: valueAt(0),
|
|
last: valueAt(length - 1),
|
|
widest: valueAt(widest),
|
|
highest: valueAt(highest),
|
|
widths,
|
|
heights
|
|
};
|
|
}
|
|
getLabelForValue(value) {
|
|
return value;
|
|
}
|
|
getPixelForValue(value, index) {
|
|
return NaN;
|
|
}
|
|
getValueForPixel(pixel) {
|
|
}
|
|
getPixelForTick(index) {
|
|
const ticks = this.ticks;
|
|
if (index < 0 || index > ticks.length - 1) {
|
|
return null;
|
|
}
|
|
return this.getPixelForValue(ticks[index].value);
|
|
}
|
|
getPixelForDecimal(decimal) {
|
|
if (this._reversePixels) {
|
|
decimal = 1 - decimal;
|
|
}
|
|
const pixel = this._startPixel + decimal * this._length;
|
|
return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);
|
|
}
|
|
getDecimalForPixel(pixel) {
|
|
const decimal = (pixel - this._startPixel) / this._length;
|
|
return this._reversePixels ? 1 - decimal : decimal;
|
|
}
|
|
getBasePixel() {
|
|
return this.getPixelForValue(this.getBaseValue());
|
|
}
|
|
getBaseValue() {
|
|
const { min, max } = this;
|
|
return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;
|
|
}
|
|
getContext(index) {
|
|
const ticks = this.ticks || [];
|
|
if (index >= 0 && index < ticks.length) {
|
|
const tick = ticks[index];
|
|
return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick));
|
|
}
|
|
return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this));
|
|
}
|
|
_tickSize() {
|
|
const optionTicks = this.options.ticks;
|
|
const rot = toRadians(this.labelRotation);
|
|
const cos = Math.abs(Math.cos(rot));
|
|
const sin = Math.abs(Math.sin(rot));
|
|
const labelSizes = this._getLabelSizes();
|
|
const padding = optionTicks.autoSkipPadding || 0;
|
|
const w = labelSizes ? labelSizes.widest.width + padding : 0;
|
|
const h4 = labelSizes ? labelSizes.highest.height + padding : 0;
|
|
return this.isHorizontal() ? h4 * cos > w * sin ? w / cos : h4 / sin : h4 * sin < w * cos ? h4 / cos : w / sin;
|
|
}
|
|
_isVisible() {
|
|
const display = this.options.display;
|
|
if (display !== "auto") {
|
|
return !!display;
|
|
}
|
|
return this.getMatchingVisibleMetas().length > 0;
|
|
}
|
|
_computeGridLineItems(chartArea) {
|
|
const axis = this.axis;
|
|
const chart = this.chart;
|
|
const options = this.options;
|
|
const { grid, position, border } = options;
|
|
const offset = grid.offset;
|
|
const isHorizontal = this.isHorizontal();
|
|
const ticks = this.ticks;
|
|
const ticksLength = ticks.length + (offset ? 1 : 0);
|
|
const tl = getTickMarkLength(grid);
|
|
const items = [];
|
|
const borderOpts = border.setContext(this.getContext());
|
|
const axisWidth = borderOpts.display ? borderOpts.width : 0;
|
|
const axisHalfWidth = axisWidth / 2;
|
|
const alignBorderValue = function(pixel) {
|
|
return _alignPixel(chart, pixel, axisWidth);
|
|
};
|
|
let borderValue, i, lineValue, alignedLineValue;
|
|
let tx1, ty1, tx2, ty2, x1, y1, x2, y2;
|
|
if (position === "top") {
|
|
borderValue = alignBorderValue(this.bottom);
|
|
ty1 = this.bottom - tl;
|
|
ty2 = borderValue - axisHalfWidth;
|
|
y1 = alignBorderValue(chartArea.top) + axisHalfWidth;
|
|
y2 = chartArea.bottom;
|
|
} else if (position === "bottom") {
|
|
borderValue = alignBorderValue(this.top);
|
|
y1 = chartArea.top;
|
|
y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;
|
|
ty1 = borderValue + axisHalfWidth;
|
|
ty2 = this.top + tl;
|
|
} else if (position === "left") {
|
|
borderValue = alignBorderValue(this.right);
|
|
tx1 = this.right - tl;
|
|
tx2 = borderValue - axisHalfWidth;
|
|
x1 = alignBorderValue(chartArea.left) + axisHalfWidth;
|
|
x2 = chartArea.right;
|
|
} else if (position === "right") {
|
|
borderValue = alignBorderValue(this.left);
|
|
x1 = chartArea.left;
|
|
x2 = alignBorderValue(chartArea.right) - axisHalfWidth;
|
|
tx1 = borderValue + axisHalfWidth;
|
|
tx2 = this.left + tl;
|
|
} else if (axis === "x") {
|
|
if (position === "center") {
|
|
borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);
|
|
} else if (isObject(position)) {
|
|
const positionAxisID = Object.keys(position)[0];
|
|
const value = position[positionAxisID];
|
|
borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));
|
|
}
|
|
y1 = chartArea.top;
|
|
y2 = chartArea.bottom;
|
|
ty1 = borderValue + axisHalfWidth;
|
|
ty2 = ty1 + tl;
|
|
} else if (axis === "y") {
|
|
if (position === "center") {
|
|
borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);
|
|
} else if (isObject(position)) {
|
|
const positionAxisID = Object.keys(position)[0];
|
|
const value = position[positionAxisID];
|
|
borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));
|
|
}
|
|
tx1 = borderValue - axisHalfWidth;
|
|
tx2 = tx1 - tl;
|
|
x1 = chartArea.left;
|
|
x2 = chartArea.right;
|
|
}
|
|
const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);
|
|
const step = Math.max(1, Math.ceil(ticksLength / limit));
|
|
for (i = 0; i < ticksLength; i += step) {
|
|
const context = this.getContext(i);
|
|
const optsAtIndex = grid.setContext(context);
|
|
const optsAtIndexBorder = border.setContext(context);
|
|
const lineWidth = optsAtIndex.lineWidth;
|
|
const lineColor = optsAtIndex.color;
|
|
const borderDash = optsAtIndexBorder.dash || [];
|
|
const borderDashOffset = optsAtIndexBorder.dashOffset;
|
|
const tickWidth = optsAtIndex.tickWidth;
|
|
const tickColor = optsAtIndex.tickColor;
|
|
const tickBorderDash = optsAtIndex.tickBorderDash || [];
|
|
const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;
|
|
lineValue = getPixelForGridLine(this, i, offset);
|
|
if (lineValue === void 0) {
|
|
continue;
|
|
}
|
|
alignedLineValue = _alignPixel(chart, lineValue, lineWidth);
|
|
if (isHorizontal) {
|
|
tx1 = tx2 = x1 = x2 = alignedLineValue;
|
|
} else {
|
|
ty1 = ty2 = y1 = y2 = alignedLineValue;
|
|
}
|
|
items.push({
|
|
tx1,
|
|
ty1,
|
|
tx2,
|
|
ty2,
|
|
x1,
|
|
y1,
|
|
x2,
|
|
y2,
|
|
width: lineWidth,
|
|
color: lineColor,
|
|
borderDash,
|
|
borderDashOffset,
|
|
tickWidth,
|
|
tickColor,
|
|
tickBorderDash,
|
|
tickBorderDashOffset
|
|
});
|
|
}
|
|
this._ticksLength = ticksLength;
|
|
this._borderValue = borderValue;
|
|
return items;
|
|
}
|
|
_computeLabelItems(chartArea) {
|
|
const axis = this.axis;
|
|
const options = this.options;
|
|
const { position, ticks: optionTicks } = options;
|
|
const isHorizontal = this.isHorizontal();
|
|
const ticks = this.ticks;
|
|
const { align, crossAlign, padding, mirror } = optionTicks;
|
|
const tl = getTickMarkLength(options.grid);
|
|
const tickAndPadding = tl + padding;
|
|
const hTickAndPadding = mirror ? -padding : tickAndPadding;
|
|
const rotation = -toRadians(this.labelRotation);
|
|
const items = [];
|
|
let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;
|
|
let textBaseline = "middle";
|
|
if (position === "top") {
|
|
y = this.bottom - hTickAndPadding;
|
|
textAlign = this._getXAxisLabelAlignment();
|
|
} else if (position === "bottom") {
|
|
y = this.top + hTickAndPadding;
|
|
textAlign = this._getXAxisLabelAlignment();
|
|
} else if (position === "left") {
|
|
const ret = this._getYAxisLabelAlignment(tl);
|
|
textAlign = ret.textAlign;
|
|
x = ret.x;
|
|
} else if (position === "right") {
|
|
const ret = this._getYAxisLabelAlignment(tl);
|
|
textAlign = ret.textAlign;
|
|
x = ret.x;
|
|
} else if (axis === "x") {
|
|
if (position === "center") {
|
|
y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding;
|
|
} else if (isObject(position)) {
|
|
const positionAxisID = Object.keys(position)[0];
|
|
const value = position[positionAxisID];
|
|
y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;
|
|
}
|
|
textAlign = this._getXAxisLabelAlignment();
|
|
} else if (axis === "y") {
|
|
if (position === "center") {
|
|
x = (chartArea.left + chartArea.right) / 2 - tickAndPadding;
|
|
} else if (isObject(position)) {
|
|
const positionAxisID = Object.keys(position)[0];
|
|
const value = position[positionAxisID];
|
|
x = this.chart.scales[positionAxisID].getPixelForValue(value);
|
|
}
|
|
textAlign = this._getYAxisLabelAlignment(tl).textAlign;
|
|
}
|
|
if (axis === "y") {
|
|
if (align === "start") {
|
|
textBaseline = "top";
|
|
} else if (align === "end") {
|
|
textBaseline = "bottom";
|
|
}
|
|
}
|
|
const labelSizes = this._getLabelSizes();
|
|
for (i = 0, ilen = ticks.length; i < ilen; ++i) {
|
|
tick = ticks[i];
|
|
label = tick.label;
|
|
const optsAtIndex = optionTicks.setContext(this.getContext(i));
|
|
pixel = this.getPixelForTick(i) + optionTicks.labelOffset;
|
|
font = this._resolveTickFontOptions(i);
|
|
lineHeight = font.lineHeight;
|
|
lineCount = isArray(label) ? label.length : 1;
|
|
const halfCount = lineCount / 2;
|
|
const color2 = optsAtIndex.color;
|
|
const strokeColor = optsAtIndex.textStrokeColor;
|
|
const strokeWidth = optsAtIndex.textStrokeWidth;
|
|
let tickTextAlign = textAlign;
|
|
if (isHorizontal) {
|
|
x = pixel;
|
|
if (textAlign === "inner") {
|
|
if (i === ilen - 1) {
|
|
tickTextAlign = !this.options.reverse ? "right" : "left";
|
|
} else if (i === 0) {
|
|
tickTextAlign = !this.options.reverse ? "left" : "right";
|
|
} else {
|
|
tickTextAlign = "center";
|
|
}
|
|
}
|
|
if (position === "top") {
|
|
if (crossAlign === "near" || rotation !== 0) {
|
|
textOffset = -lineCount * lineHeight + lineHeight / 2;
|
|
} else if (crossAlign === "center") {
|
|
textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;
|
|
} else {
|
|
textOffset = -labelSizes.highest.height + lineHeight / 2;
|
|
}
|
|
} else {
|
|
if (crossAlign === "near" || rotation !== 0) {
|
|
textOffset = lineHeight / 2;
|
|
} else if (crossAlign === "center") {
|
|
textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;
|
|
} else {
|
|
textOffset = labelSizes.highest.height - lineCount * lineHeight;
|
|
}
|
|
}
|
|
if (mirror) {
|
|
textOffset *= -1;
|
|
}
|
|
if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {
|
|
x += lineHeight / 2 * Math.sin(rotation);
|
|
}
|
|
} else {
|
|
y = pixel;
|
|
textOffset = (1 - lineCount) * lineHeight / 2;
|
|
}
|
|
let backdrop;
|
|
if (optsAtIndex.showLabelBackdrop) {
|
|
const labelPadding = toPadding(optsAtIndex.backdropPadding);
|
|
const height = labelSizes.heights[i];
|
|
const width = labelSizes.widths[i];
|
|
let top = textOffset - labelPadding.top;
|
|
let left = 0 - labelPadding.left;
|
|
switch (textBaseline) {
|
|
case "middle":
|
|
top -= height / 2;
|
|
break;
|
|
case "bottom":
|
|
top -= height;
|
|
break;
|
|
}
|
|
switch (textAlign) {
|
|
case "center":
|
|
left -= width / 2;
|
|
break;
|
|
case "right":
|
|
left -= width;
|
|
break;
|
|
case "inner":
|
|
if (i === ilen - 1) {
|
|
left -= width;
|
|
} else if (i > 0) {
|
|
left -= width / 2;
|
|
}
|
|
break;
|
|
}
|
|
backdrop = {
|
|
left,
|
|
top,
|
|
width: width + labelPadding.width,
|
|
height: height + labelPadding.height,
|
|
color: optsAtIndex.backdropColor
|
|
};
|
|
}
|
|
items.push({
|
|
label,
|
|
font,
|
|
textOffset,
|
|
options: {
|
|
rotation,
|
|
color: color2,
|
|
strokeColor,
|
|
strokeWidth,
|
|
textAlign: tickTextAlign,
|
|
textBaseline,
|
|
translation: [
|
|
x,
|
|
y
|
|
],
|
|
backdrop
|
|
}
|
|
});
|
|
}
|
|
return items;
|
|
}
|
|
_getXAxisLabelAlignment() {
|
|
const { position, ticks } = this.options;
|
|
const rotation = -toRadians(this.labelRotation);
|
|
if (rotation) {
|
|
return position === "top" ? "left" : "right";
|
|
}
|
|
let align = "center";
|
|
if (ticks.align === "start") {
|
|
align = "left";
|
|
} else if (ticks.align === "end") {
|
|
align = "right";
|
|
} else if (ticks.align === "inner") {
|
|
align = "inner";
|
|
}
|
|
return align;
|
|
}
|
|
_getYAxisLabelAlignment(tl) {
|
|
const { position, ticks: { crossAlign, mirror, padding } } = this.options;
|
|
const labelSizes = this._getLabelSizes();
|
|
const tickAndPadding = tl + padding;
|
|
const widest = labelSizes.widest.width;
|
|
let textAlign;
|
|
let x;
|
|
if (position === "left") {
|
|
if (mirror) {
|
|
x = this.right + padding;
|
|
if (crossAlign === "near") {
|
|
textAlign = "left";
|
|
} else if (crossAlign === "center") {
|
|
textAlign = "center";
|
|
x += widest / 2;
|
|
} else {
|
|
textAlign = "right";
|
|
x += widest;
|
|
}
|
|
} else {
|
|
x = this.right - tickAndPadding;
|
|
if (crossAlign === "near") {
|
|
textAlign = "right";
|
|
} else if (crossAlign === "center") {
|
|
textAlign = "center";
|
|
x -= widest / 2;
|
|
} else {
|
|
textAlign = "left";
|
|
x = this.left;
|
|
}
|
|
}
|
|
} else if (position === "right") {
|
|
if (mirror) {
|
|
x = this.left + padding;
|
|
if (crossAlign === "near") {
|
|
textAlign = "right";
|
|
} else if (crossAlign === "center") {
|
|
textAlign = "center";
|
|
x -= widest / 2;
|
|
} else {
|
|
textAlign = "left";
|
|
x -= widest;
|
|
}
|
|
} else {
|
|
x = this.left + tickAndPadding;
|
|
if (crossAlign === "near") {
|
|
textAlign = "left";
|
|
} else if (crossAlign === "center") {
|
|
textAlign = "center";
|
|
x += widest / 2;
|
|
} else {
|
|
textAlign = "right";
|
|
x = this.right;
|
|
}
|
|
}
|
|
} else {
|
|
textAlign = "right";
|
|
}
|
|
return {
|
|
textAlign,
|
|
x
|
|
};
|
|
}
|
|
_computeLabelArea() {
|
|
if (this.options.ticks.mirror) {
|
|
return;
|
|
}
|
|
const chart = this.chart;
|
|
const position = this.options.position;
|
|
if (position === "left" || position === "right") {
|
|
return {
|
|
top: 0,
|
|
left: this.left,
|
|
bottom: chart.height,
|
|
right: this.right
|
|
};
|
|
}
|
|
if (position === "top" || position === "bottom") {
|
|
return {
|
|
top: this.top,
|
|
left: 0,
|
|
bottom: this.bottom,
|
|
right: chart.width
|
|
};
|
|
}
|
|
}
|
|
drawBackground() {
|
|
const { ctx, options: { backgroundColor }, left, top, width, height } = this;
|
|
if (backgroundColor) {
|
|
ctx.save();
|
|
ctx.fillStyle = backgroundColor;
|
|
ctx.fillRect(left, top, width, height);
|
|
ctx.restore();
|
|
}
|
|
}
|
|
getLineWidthForValue(value) {
|
|
const grid = this.options.grid;
|
|
if (!this._isVisible() || !grid.display) {
|
|
return 0;
|
|
}
|
|
const ticks = this.ticks;
|
|
const index = ticks.findIndex((t2) => t2.value === value);
|
|
if (index >= 0) {
|
|
const opts = grid.setContext(this.getContext(index));
|
|
return opts.lineWidth;
|
|
}
|
|
return 0;
|
|
}
|
|
drawGrid(chartArea) {
|
|
const grid = this.options.grid;
|
|
const ctx = this.ctx;
|
|
const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));
|
|
let i, ilen;
|
|
const drawLine = (p1, p2, style) => {
|
|
if (!style.width || !style.color) {
|
|
return;
|
|
}
|
|
ctx.save();
|
|
ctx.lineWidth = style.width;
|
|
ctx.strokeStyle = style.color;
|
|
ctx.setLineDash(style.borderDash || []);
|
|
ctx.lineDashOffset = style.borderDashOffset;
|
|
ctx.beginPath();
|
|
ctx.moveTo(p1.x, p1.y);
|
|
ctx.lineTo(p2.x, p2.y);
|
|
ctx.stroke();
|
|
ctx.restore();
|
|
};
|
|
if (grid.display) {
|
|
for (i = 0, ilen = items.length; i < ilen; ++i) {
|
|
const item = items[i];
|
|
if (grid.drawOnChartArea) {
|
|
drawLine({
|
|
x: item.x1,
|
|
y: item.y1
|
|
}, {
|
|
x: item.x2,
|
|
y: item.y2
|
|
}, item);
|
|
}
|
|
if (grid.drawTicks) {
|
|
drawLine({
|
|
x: item.tx1,
|
|
y: item.ty1
|
|
}, {
|
|
x: item.tx2,
|
|
y: item.ty2
|
|
}, {
|
|
color: item.tickColor,
|
|
width: item.tickWidth,
|
|
borderDash: item.tickBorderDash,
|
|
borderDashOffset: item.tickBorderDashOffset
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
drawBorder() {
|
|
const { chart, ctx, options: { border, grid } } = this;
|
|
const borderOpts = border.setContext(this.getContext());
|
|
const axisWidth = border.display ? borderOpts.width : 0;
|
|
if (!axisWidth) {
|
|
return;
|
|
}
|
|
const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;
|
|
const borderValue = this._borderValue;
|
|
let x1, x2, y1, y2;
|
|
if (this.isHorizontal()) {
|
|
x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;
|
|
x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;
|
|
y1 = y2 = borderValue;
|
|
} else {
|
|
y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;
|
|
y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;
|
|
x1 = x2 = borderValue;
|
|
}
|
|
ctx.save();
|
|
ctx.lineWidth = borderOpts.width;
|
|
ctx.strokeStyle = borderOpts.color;
|
|
ctx.beginPath();
|
|
ctx.moveTo(x1, y1);
|
|
ctx.lineTo(x2, y2);
|
|
ctx.stroke();
|
|
ctx.restore();
|
|
}
|
|
drawLabels(chartArea) {
|
|
const optionTicks = this.options.ticks;
|
|
if (!optionTicks.display) {
|
|
return;
|
|
}
|
|
const ctx = this.ctx;
|
|
const area = this._computeLabelArea();
|
|
if (area) {
|
|
clipArea(ctx, area);
|
|
}
|
|
const items = this.getLabelItems(chartArea);
|
|
for (const item of items) {
|
|
const renderTextOptions = item.options;
|
|
const tickFont = item.font;
|
|
const label = item.label;
|
|
const y = item.textOffset;
|
|
renderText(ctx, label, 0, y, tickFont, renderTextOptions);
|
|
}
|
|
if (area) {
|
|
unclipArea(ctx);
|
|
}
|
|
}
|
|
drawTitle() {
|
|
const { ctx, options: { position, title, reverse } } = this;
|
|
if (!title.display) {
|
|
return;
|
|
}
|
|
const font = toFont(title.font);
|
|
const padding = toPadding(title.padding);
|
|
const align = title.align;
|
|
let offset = font.lineHeight / 2;
|
|
if (position === "bottom" || position === "center" || isObject(position)) {
|
|
offset += padding.bottom;
|
|
if (isArray(title.text)) {
|
|
offset += font.lineHeight * (title.text.length - 1);
|
|
}
|
|
} else {
|
|
offset += padding.top;
|
|
}
|
|
const { titleX, titleY, maxWidth, rotation } = titleArgs(this, offset, position, align);
|
|
renderText(ctx, title.text, 0, 0, font, {
|
|
color: title.color,
|
|
maxWidth,
|
|
rotation,
|
|
textAlign: titleAlign(align, position, reverse),
|
|
textBaseline: "middle",
|
|
translation: [
|
|
titleX,
|
|
titleY
|
|
]
|
|
});
|
|
}
|
|
draw(chartArea) {
|
|
if (!this._isVisible()) {
|
|
return;
|
|
}
|
|
this.drawBackground();
|
|
this.drawGrid(chartArea);
|
|
this.drawBorder();
|
|
this.drawTitle();
|
|
this.drawLabels(chartArea);
|
|
}
|
|
_layers() {
|
|
const opts = this.options;
|
|
const tz = opts.ticks && opts.ticks.z || 0;
|
|
const gz = valueOrDefault(opts.grid && opts.grid.z, -1);
|
|
const bz = valueOrDefault(opts.border && opts.border.z, 0);
|
|
if (!this._isVisible() || this.draw !== _Scale.prototype.draw) {
|
|
return [
|
|
{
|
|
z: tz,
|
|
draw: (chartArea) => {
|
|
this.draw(chartArea);
|
|
}
|
|
}
|
|
];
|
|
}
|
|
return [
|
|
{
|
|
z: gz,
|
|
draw: (chartArea) => {
|
|
this.drawBackground();
|
|
this.drawGrid(chartArea);
|
|
this.drawTitle();
|
|
}
|
|
},
|
|
{
|
|
z: bz,
|
|
draw: () => {
|
|
this.drawBorder();
|
|
}
|
|
},
|
|
{
|
|
z: tz,
|
|
draw: (chartArea) => {
|
|
this.drawLabels(chartArea);
|
|
}
|
|
}
|
|
];
|
|
}
|
|
getMatchingVisibleMetas(type) {
|
|
const metas = this.chart.getSortedVisibleDatasetMetas();
|
|
const axisID = this.axis + "AxisID";
|
|
const result = [];
|
|
let i, ilen;
|
|
for (i = 0, ilen = metas.length; i < ilen; ++i) {
|
|
const meta = metas[i];
|
|
if (meta[axisID] === this.id && (!type || meta.type === type)) {
|
|
result.push(meta);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
_resolveTickFontOptions(index) {
|
|
const opts = this.options.ticks.setContext(this.getContext(index));
|
|
return toFont(opts.font);
|
|
}
|
|
_maxDigits() {
|
|
const fontSize = this._resolveTickFontOptions(0).lineHeight;
|
|
return (this.isHorizontal() ? this.width : this.height) / fontSize;
|
|
}
|
|
};
|
|
var TypedRegistry = class {
|
|
constructor(type, scope, override) {
|
|
this.type = type;
|
|
this.scope = scope;
|
|
this.override = override;
|
|
this.items = /* @__PURE__ */ Object.create(null);
|
|
}
|
|
isForType(type) {
|
|
return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);
|
|
}
|
|
register(item) {
|
|
const proto = Object.getPrototypeOf(item);
|
|
let parentScope;
|
|
if (isIChartComponent(proto)) {
|
|
parentScope = this.register(proto);
|
|
}
|
|
const items = this.items;
|
|
const id = item.id;
|
|
const scope = this.scope + "." + id;
|
|
if (!id) {
|
|
throw new Error("class does not have id: " + item);
|
|
}
|
|
if (id in items) {
|
|
return scope;
|
|
}
|
|
items[id] = item;
|
|
registerDefaults(item, scope, parentScope);
|
|
if (this.override) {
|
|
defaults.override(item.id, item.overrides);
|
|
}
|
|
return scope;
|
|
}
|
|
get(id) {
|
|
return this.items[id];
|
|
}
|
|
unregister(item) {
|
|
const items = this.items;
|
|
const id = item.id;
|
|
const scope = this.scope;
|
|
if (id in items) {
|
|
delete items[id];
|
|
}
|
|
if (scope && id in defaults[scope]) {
|
|
delete defaults[scope][id];
|
|
if (this.override) {
|
|
delete overrides[id];
|
|
}
|
|
}
|
|
}
|
|
};
|
|
function registerDefaults(item, scope, parentScope) {
|
|
const itemDefaults = merge(/* @__PURE__ */ Object.create(null), [
|
|
parentScope ? defaults.get(parentScope) : {},
|
|
defaults.get(scope),
|
|
item.defaults
|
|
]);
|
|
defaults.set(scope, itemDefaults);
|
|
if (item.defaultRoutes) {
|
|
routeDefaults(scope, item.defaultRoutes);
|
|
}
|
|
if (item.descriptors) {
|
|
defaults.describe(scope, item.descriptors);
|
|
}
|
|
}
|
|
function routeDefaults(scope, routes) {
|
|
Object.keys(routes).forEach((property) => {
|
|
const propertyParts = property.split(".");
|
|
const sourceName = propertyParts.pop();
|
|
const sourceScope = [
|
|
scope
|
|
].concat(propertyParts).join(".");
|
|
const parts = routes[property].split(".");
|
|
const targetName = parts.pop();
|
|
const targetScope = parts.join(".");
|
|
defaults.route(sourceScope, sourceName, targetScope, targetName);
|
|
});
|
|
}
|
|
function isIChartComponent(proto) {
|
|
return "id" in proto && "defaults" in proto;
|
|
}
|
|
var Registry = class {
|
|
constructor() {
|
|
this.controllers = new TypedRegistry(DatasetController, "datasets", true);
|
|
this.elements = new TypedRegistry(Element, "elements");
|
|
this.plugins = new TypedRegistry(Object, "plugins");
|
|
this.scales = new TypedRegistry(Scale, "scales");
|
|
this._typedRegistries = [
|
|
this.controllers,
|
|
this.scales,
|
|
this.elements
|
|
];
|
|
}
|
|
add(...args) {
|
|
this._each("register", args);
|
|
}
|
|
remove(...args) {
|
|
this._each("unregister", args);
|
|
}
|
|
addControllers(...args) {
|
|
this._each("register", args, this.controllers);
|
|
}
|
|
addElements(...args) {
|
|
this._each("register", args, this.elements);
|
|
}
|
|
addPlugins(...args) {
|
|
this._each("register", args, this.plugins);
|
|
}
|
|
addScales(...args) {
|
|
this._each("register", args, this.scales);
|
|
}
|
|
getController(id) {
|
|
return this._get(id, this.controllers, "controller");
|
|
}
|
|
getElement(id) {
|
|
return this._get(id, this.elements, "element");
|
|
}
|
|
getPlugin(id) {
|
|
return this._get(id, this.plugins, "plugin");
|
|
}
|
|
getScale(id) {
|
|
return this._get(id, this.scales, "scale");
|
|
}
|
|
removeControllers(...args) {
|
|
this._each("unregister", args, this.controllers);
|
|
}
|
|
removeElements(...args) {
|
|
this._each("unregister", args, this.elements);
|
|
}
|
|
removePlugins(...args) {
|
|
this._each("unregister", args, this.plugins);
|
|
}
|
|
removeScales(...args) {
|
|
this._each("unregister", args, this.scales);
|
|
}
|
|
_each(method, args, typedRegistry) {
|
|
[
|
|
...args
|
|
].forEach((arg) => {
|
|
const reg = typedRegistry || this._getRegistryForType(arg);
|
|
if (typedRegistry || reg.isForType(arg) || reg === this.plugins && arg.id) {
|
|
this._exec(method, reg, arg);
|
|
} else {
|
|
each(arg, (item) => {
|
|
const itemReg = typedRegistry || this._getRegistryForType(item);
|
|
this._exec(method, itemReg, item);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
_exec(method, registry2, component) {
|
|
const camelMethod = _capitalize(method);
|
|
callback(component["before" + camelMethod], [], component);
|
|
registry2[method](component);
|
|
callback(component["after" + camelMethod], [], component);
|
|
}
|
|
_getRegistryForType(type) {
|
|
for (let i = 0; i < this._typedRegistries.length; i++) {
|
|
const reg = this._typedRegistries[i];
|
|
if (reg.isForType(type)) {
|
|
return reg;
|
|
}
|
|
}
|
|
return this.plugins;
|
|
}
|
|
_get(id, typedRegistry, type) {
|
|
const item = typedRegistry.get(id);
|
|
if (item === void 0) {
|
|
throw new Error('"' + id + '" is not a registered ' + type + ".");
|
|
}
|
|
return item;
|
|
}
|
|
};
|
|
var registry = /* @__PURE__ */ new Registry();
|
|
var PluginService = class {
|
|
constructor() {
|
|
this._init = [];
|
|
}
|
|
notify(chart, hook, args, filter) {
|
|
if (hook === "beforeInit") {
|
|
this._init = this._createDescriptors(chart, true);
|
|
this._notify(this._init, chart, "install");
|
|
}
|
|
const descriptors2 = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);
|
|
const result = this._notify(descriptors2, chart, hook, args);
|
|
if (hook === "afterDestroy") {
|
|
this._notify(descriptors2, chart, "stop");
|
|
this._notify(this._init, chart, "uninstall");
|
|
}
|
|
return result;
|
|
}
|
|
_notify(descriptors2, chart, hook, args) {
|
|
args = args || {};
|
|
for (const descriptor of descriptors2) {
|
|
const plugin = descriptor.plugin;
|
|
const method = plugin[hook];
|
|
const params = [
|
|
chart,
|
|
args,
|
|
descriptor.options
|
|
];
|
|
if (callback(method, params, plugin) === false && args.cancelable) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
invalidate() {
|
|
if (!isNullOrUndef(this._cache)) {
|
|
this._oldCache = this._cache;
|
|
this._cache = void 0;
|
|
}
|
|
}
|
|
_descriptors(chart) {
|
|
if (this._cache) {
|
|
return this._cache;
|
|
}
|
|
const descriptors2 = this._cache = this._createDescriptors(chart);
|
|
this._notifyStateChanges(chart);
|
|
return descriptors2;
|
|
}
|
|
_createDescriptors(chart, all) {
|
|
const config = chart && chart.config;
|
|
const options = valueOrDefault(config.options && config.options.plugins, {});
|
|
const plugins = allPlugins(config);
|
|
return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);
|
|
}
|
|
_notifyStateChanges(chart) {
|
|
const previousDescriptors = this._oldCache || [];
|
|
const descriptors2 = this._cache;
|
|
const diff = (a, b) => a.filter((x) => !b.some((y) => x.plugin.id === y.plugin.id));
|
|
this._notify(diff(previousDescriptors, descriptors2), chart, "stop");
|
|
this._notify(diff(descriptors2, previousDescriptors), chart, "start");
|
|
}
|
|
};
|
|
function allPlugins(config) {
|
|
const localIds = {};
|
|
const plugins = [];
|
|
const keys = Object.keys(registry.plugins.items);
|
|
for (let i = 0; i < keys.length; i++) {
|
|
plugins.push(registry.getPlugin(keys[i]));
|
|
}
|
|
const local = config.plugins || [];
|
|
for (let i = 0; i < local.length; i++) {
|
|
const plugin = local[i];
|
|
if (plugins.indexOf(plugin) === -1) {
|
|
plugins.push(plugin);
|
|
localIds[plugin.id] = true;
|
|
}
|
|
}
|
|
return {
|
|
plugins,
|
|
localIds
|
|
};
|
|
}
|
|
function getOpts(options, all) {
|
|
if (!all && options === false) {
|
|
return null;
|
|
}
|
|
if (options === true) {
|
|
return {};
|
|
}
|
|
return options;
|
|
}
|
|
function createDescriptors(chart, { plugins, localIds }, options, all) {
|
|
const result = [];
|
|
const context = chart.getContext();
|
|
for (const plugin of plugins) {
|
|
const id = plugin.id;
|
|
const opts = getOpts(options[id], all);
|
|
if (opts === null) {
|
|
continue;
|
|
}
|
|
result.push({
|
|
plugin,
|
|
options: pluginOpts(chart.config, {
|
|
plugin,
|
|
local: localIds[id]
|
|
}, opts, context)
|
|
});
|
|
}
|
|
return result;
|
|
}
|
|
function pluginOpts(config, { plugin, local }, opts, context) {
|
|
const keys = config.pluginScopeKeys(plugin);
|
|
const scopes = config.getOptionScopes(opts, keys);
|
|
if (local && plugin.defaults) {
|
|
scopes.push(plugin.defaults);
|
|
}
|
|
return config.createResolver(scopes, context, [
|
|
""
|
|
], {
|
|
scriptable: false,
|
|
indexable: false,
|
|
allKeys: true
|
|
});
|
|
}
|
|
function getIndexAxis(type, options) {
|
|
const datasetDefaults = defaults.datasets[type] || {};
|
|
const datasetOptions = (options.datasets || {})[type] || {};
|
|
return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || "x";
|
|
}
|
|
function getAxisFromDefaultScaleID(id, indexAxis) {
|
|
let axis = id;
|
|
if (id === "_index_") {
|
|
axis = indexAxis;
|
|
} else if (id === "_value_") {
|
|
axis = indexAxis === "x" ? "y" : "x";
|
|
}
|
|
return axis;
|
|
}
|
|
function getDefaultScaleIDFromAxis(axis, indexAxis) {
|
|
return axis === indexAxis ? "_index_" : "_value_";
|
|
}
|
|
function idMatchesAxis(id) {
|
|
if (id === "x" || id === "y" || id === "r") {
|
|
return id;
|
|
}
|
|
}
|
|
function axisFromPosition(position) {
|
|
if (position === "top" || position === "bottom") {
|
|
return "x";
|
|
}
|
|
if (position === "left" || position === "right") {
|
|
return "y";
|
|
}
|
|
}
|
|
function determineAxis(id, ...scaleOptions) {
|
|
if (idMatchesAxis(id)) {
|
|
return id;
|
|
}
|
|
for (const opts of scaleOptions) {
|
|
const axis = opts.axis || axisFromPosition(opts.position) || id.length > 1 && idMatchesAxis(id[0].toLowerCase());
|
|
if (axis) {
|
|
return axis;
|
|
}
|
|
}
|
|
throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);
|
|
}
|
|
function getAxisFromDataset(id, axis, dataset) {
|
|
if (dataset[axis + "AxisID"] === id) {
|
|
return {
|
|
axis
|
|
};
|
|
}
|
|
}
|
|
function retrieveAxisFromDatasets(id, config) {
|
|
if (config.data && config.data.datasets) {
|
|
const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);
|
|
if (boundDs.length) {
|
|
return getAxisFromDataset(id, "x", boundDs[0]) || getAxisFromDataset(id, "y", boundDs[0]);
|
|
}
|
|
}
|
|
return {};
|
|
}
|
|
function mergeScaleConfig(config, options) {
|
|
const chartDefaults = overrides[config.type] || {
|
|
scales: {}
|
|
};
|
|
const configScales = options.scales || {};
|
|
const chartIndexAxis = getIndexAxis(config.type, options);
|
|
const scales = /* @__PURE__ */ Object.create(null);
|
|
Object.keys(configScales).forEach((id) => {
|
|
const scaleConf = configScales[id];
|
|
if (!isObject(scaleConf)) {
|
|
return console.error(`Invalid scale configuration for scale: ${id}`);
|
|
}
|
|
if (scaleConf._proxy) {
|
|
return console.warn(`Ignoring resolver passed as options for scale: ${id}`);
|
|
}
|
|
const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);
|
|
const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);
|
|
const defaultScaleOptions = chartDefaults.scales || {};
|
|
scales[id] = mergeIf(/* @__PURE__ */ Object.create(null), [
|
|
{
|
|
axis
|
|
},
|
|
scaleConf,
|
|
defaultScaleOptions[axis],
|
|
defaultScaleOptions[defaultId]
|
|
]);
|
|
});
|
|
config.data.datasets.forEach((dataset) => {
|
|
const type = dataset.type || config.type;
|
|
const indexAxis = dataset.indexAxis || getIndexAxis(type, options);
|
|
const datasetDefaults = overrides[type] || {};
|
|
const defaultScaleOptions = datasetDefaults.scales || {};
|
|
Object.keys(defaultScaleOptions).forEach((defaultID) => {
|
|
const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);
|
|
const id = dataset[axis + "AxisID"] || axis;
|
|
scales[id] = scales[id] || /* @__PURE__ */ Object.create(null);
|
|
mergeIf(scales[id], [
|
|
{
|
|
axis
|
|
},
|
|
configScales[id],
|
|
defaultScaleOptions[defaultID]
|
|
]);
|
|
});
|
|
});
|
|
Object.keys(scales).forEach((key) => {
|
|
const scale = scales[key];
|
|
mergeIf(scale, [
|
|
defaults.scales[scale.type],
|
|
defaults.scale
|
|
]);
|
|
});
|
|
return scales;
|
|
}
|
|
function initOptions(config) {
|
|
const options = config.options || (config.options = {});
|
|
options.plugins = valueOrDefault(options.plugins, {});
|
|
options.scales = mergeScaleConfig(config, options);
|
|
}
|
|
function initData(data) {
|
|
data = data || {};
|
|
data.datasets = data.datasets || [];
|
|
data.labels = data.labels || [];
|
|
return data;
|
|
}
|
|
function initConfig(config) {
|
|
config = config || {};
|
|
config.data = initData(config.data);
|
|
initOptions(config);
|
|
return config;
|
|
}
|
|
var keyCache = /* @__PURE__ */ new Map();
|
|
var keysCached = /* @__PURE__ */ new Set();
|
|
function cachedKeys(cacheKey, generate) {
|
|
let keys = keyCache.get(cacheKey);
|
|
if (!keys) {
|
|
keys = generate();
|
|
keyCache.set(cacheKey, keys);
|
|
keysCached.add(keys);
|
|
}
|
|
return keys;
|
|
}
|
|
var addIfFound = (set2, obj, key) => {
|
|
const opts = resolveObjectKey(obj, key);
|
|
if (opts !== void 0) {
|
|
set2.add(opts);
|
|
}
|
|
};
|
|
var Config = class {
|
|
constructor(config) {
|
|
this._config = initConfig(config);
|
|
this._scopeCache = /* @__PURE__ */ new Map();
|
|
this._resolverCache = /* @__PURE__ */ new Map();
|
|
}
|
|
get platform() {
|
|
return this._config.platform;
|
|
}
|
|
get type() {
|
|
return this._config.type;
|
|
}
|
|
set type(type) {
|
|
this._config.type = type;
|
|
}
|
|
get data() {
|
|
return this._config.data;
|
|
}
|
|
set data(data) {
|
|
this._config.data = initData(data);
|
|
}
|
|
get options() {
|
|
return this._config.options;
|
|
}
|
|
set options(options) {
|
|
this._config.options = options;
|
|
}
|
|
get plugins() {
|
|
return this._config.plugins;
|
|
}
|
|
update() {
|
|
const config = this._config;
|
|
this.clearCache();
|
|
initOptions(config);
|
|
}
|
|
clearCache() {
|
|
this._scopeCache.clear();
|
|
this._resolverCache.clear();
|
|
}
|
|
datasetScopeKeys(datasetType) {
|
|
return cachedKeys(datasetType, () => [
|
|
[
|
|
`datasets.${datasetType}`,
|
|
""
|
|
]
|
|
]);
|
|
}
|
|
datasetAnimationScopeKeys(datasetType, transition) {
|
|
return cachedKeys(`${datasetType}.transition.${transition}`, () => [
|
|
[
|
|
`datasets.${datasetType}.transitions.${transition}`,
|
|
`transitions.${transition}`
|
|
],
|
|
[
|
|
`datasets.${datasetType}`,
|
|
""
|
|
]
|
|
]);
|
|
}
|
|
datasetElementScopeKeys(datasetType, elementType) {
|
|
return cachedKeys(`${datasetType}-${elementType}`, () => [
|
|
[
|
|
`datasets.${datasetType}.elements.${elementType}`,
|
|
`datasets.${datasetType}`,
|
|
`elements.${elementType}`,
|
|
""
|
|
]
|
|
]);
|
|
}
|
|
pluginScopeKeys(plugin) {
|
|
const id = plugin.id;
|
|
const type = this.type;
|
|
return cachedKeys(`${type}-plugin-${id}`, () => [
|
|
[
|
|
`plugins.${id}`,
|
|
...plugin.additionalOptionScopes || []
|
|
]
|
|
]);
|
|
}
|
|
_cachedScopes(mainScope, resetCache) {
|
|
const _scopeCache = this._scopeCache;
|
|
let cache = _scopeCache.get(mainScope);
|
|
if (!cache || resetCache) {
|
|
cache = /* @__PURE__ */ new Map();
|
|
_scopeCache.set(mainScope, cache);
|
|
}
|
|
return cache;
|
|
}
|
|
getOptionScopes(mainScope, keyLists, resetCache) {
|
|
const { options, type } = this;
|
|
const cache = this._cachedScopes(mainScope, resetCache);
|
|
const cached = cache.get(keyLists);
|
|
if (cached) {
|
|
return cached;
|
|
}
|
|
const scopes = /* @__PURE__ */ new Set();
|
|
keyLists.forEach((keys) => {
|
|
if (mainScope) {
|
|
scopes.add(mainScope);
|
|
keys.forEach((key) => addIfFound(scopes, mainScope, key));
|
|
}
|
|
keys.forEach((key) => addIfFound(scopes, options, key));
|
|
keys.forEach((key) => addIfFound(scopes, overrides[type] || {}, key));
|
|
keys.forEach((key) => addIfFound(scopes, defaults, key));
|
|
keys.forEach((key) => addIfFound(scopes, descriptors, key));
|
|
});
|
|
const array = Array.from(scopes);
|
|
if (array.length === 0) {
|
|
array.push(/* @__PURE__ */ Object.create(null));
|
|
}
|
|
if (keysCached.has(keyLists)) {
|
|
cache.set(keyLists, array);
|
|
}
|
|
return array;
|
|
}
|
|
chartOptionScopes() {
|
|
const { options, type } = this;
|
|
return [
|
|
options,
|
|
overrides[type] || {},
|
|
defaults.datasets[type] || {},
|
|
{
|
|
type
|
|
},
|
|
defaults,
|
|
descriptors
|
|
];
|
|
}
|
|
resolveNamedOptions(scopes, names2, context, prefixes = [
|
|
""
|
|
]) {
|
|
const result = {
|
|
$shared: true
|
|
};
|
|
const { resolver, subPrefixes } = getResolver(this._resolverCache, scopes, prefixes);
|
|
let options = resolver;
|
|
if (needContext(resolver, names2)) {
|
|
result.$shared = false;
|
|
context = isFunction(context) ? context() : context;
|
|
const subResolver = this.createResolver(scopes, context, subPrefixes);
|
|
options = _attachContext(resolver, context, subResolver);
|
|
}
|
|
for (const prop of names2) {
|
|
result[prop] = options[prop];
|
|
}
|
|
return result;
|
|
}
|
|
createResolver(scopes, context, prefixes = [
|
|
""
|
|
], descriptorDefaults) {
|
|
const { resolver } = getResolver(this._resolverCache, scopes, prefixes);
|
|
return isObject(context) ? _attachContext(resolver, context, void 0, descriptorDefaults) : resolver;
|
|
}
|
|
};
|
|
function getResolver(resolverCache, scopes, prefixes) {
|
|
let cache = resolverCache.get(scopes);
|
|
if (!cache) {
|
|
cache = /* @__PURE__ */ new Map();
|
|
resolverCache.set(scopes, cache);
|
|
}
|
|
const cacheKey = prefixes.join();
|
|
let cached = cache.get(cacheKey);
|
|
if (!cached) {
|
|
const resolver = _createResolver(scopes, prefixes);
|
|
cached = {
|
|
resolver,
|
|
subPrefixes: prefixes.filter((p) => !p.toLowerCase().includes("hover"))
|
|
};
|
|
cache.set(cacheKey, cached);
|
|
}
|
|
return cached;
|
|
}
|
|
var hasFunction = (value) => isObject(value) && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));
|
|
function needContext(proxy, names2) {
|
|
const { isScriptable, isIndexable } = _descriptors(proxy);
|
|
for (const prop of names2) {
|
|
const scriptable = isScriptable(prop);
|
|
const indexable = isIndexable(prop);
|
|
const value = (indexable || scriptable) && proxy[prop];
|
|
if (scriptable && (isFunction(value) || hasFunction(value)) || indexable && isArray(value)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
var version = "4.4.1";
|
|
var KNOWN_POSITIONS = [
|
|
"top",
|
|
"bottom",
|
|
"left",
|
|
"right",
|
|
"chartArea"
|
|
];
|
|
function positionIsHorizontal(position, axis) {
|
|
return position === "top" || position === "bottom" || KNOWN_POSITIONS.indexOf(position) === -1 && axis === "x";
|
|
}
|
|
function compare2Level(l1, l2) {
|
|
return function(a, b) {
|
|
return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1];
|
|
};
|
|
}
|
|
function onAnimationsComplete(context) {
|
|
const chart = context.chart;
|
|
const animationOptions = chart.options.animation;
|
|
chart.notifyPlugins("afterRender");
|
|
callback(animationOptions && animationOptions.onComplete, [
|
|
context
|
|
], chart);
|
|
}
|
|
function onAnimationProgress(context) {
|
|
const chart = context.chart;
|
|
const animationOptions = chart.options.animation;
|
|
callback(animationOptions && animationOptions.onProgress, [
|
|
context
|
|
], chart);
|
|
}
|
|
function getCanvas(item) {
|
|
if (_isDomSupported() && typeof item === "string") {
|
|
item = document.getElementById(item);
|
|
} else if (item && item.length) {
|
|
item = item[0];
|
|
}
|
|
if (item && item.canvas) {
|
|
item = item.canvas;
|
|
}
|
|
return item;
|
|
}
|
|
var instances = {};
|
|
var getChart = (key) => {
|
|
const canvas = getCanvas(key);
|
|
return Object.values(instances).filter((c) => c.canvas === canvas).pop();
|
|
};
|
|
function moveNumericKeys(obj, start, move) {
|
|
const keys = Object.keys(obj);
|
|
for (const key of keys) {
|
|
const intKey = +key;
|
|
if (intKey >= start) {
|
|
const value = obj[key];
|
|
delete obj[key];
|
|
if (move > 0 || intKey > start) {
|
|
obj[intKey + move] = value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function determineLastEvent(e, lastEvent, inChartArea, isClick) {
|
|
if (!inChartArea || e.type === "mouseout") {
|
|
return null;
|
|
}
|
|
if (isClick) {
|
|
return lastEvent;
|
|
}
|
|
return e;
|
|
}
|
|
function getSizeForArea(scale, chartArea, field) {
|
|
return scale.options.clip ? scale[field] : chartArea[field];
|
|
}
|
|
function getDatasetArea(meta, chartArea) {
|
|
const { xScale, yScale } = meta;
|
|
if (xScale && yScale) {
|
|
return {
|
|
left: getSizeForArea(xScale, chartArea, "left"),
|
|
right: getSizeForArea(xScale, chartArea, "right"),
|
|
top: getSizeForArea(yScale, chartArea, "top"),
|
|
bottom: getSizeForArea(yScale, chartArea, "bottom")
|
|
};
|
|
}
|
|
return chartArea;
|
|
}
|
|
var Chart = class {
|
|
static register(...items) {
|
|
registry.add(...items);
|
|
invalidatePlugins();
|
|
}
|
|
static unregister(...items) {
|
|
registry.remove(...items);
|
|
invalidatePlugins();
|
|
}
|
|
constructor(item, userConfig) {
|
|
const config = this.config = new Config(userConfig);
|
|
const initialCanvas = getCanvas(item);
|
|
const existingChart = getChart(initialCanvas);
|
|
if (existingChart) {
|
|
throw new Error("Canvas is already in use. Chart with ID '" + existingChart.id + "' must be destroyed before the canvas with ID '" + existingChart.canvas.id + "' can be reused.");
|
|
}
|
|
const options = config.createResolver(config.chartOptionScopes(), this.getContext());
|
|
this.platform = new (config.platform || _detectPlatform(initialCanvas))();
|
|
this.platform.updateConfig(config);
|
|
const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);
|
|
const canvas = context && context.canvas;
|
|
const height = canvas && canvas.height;
|
|
const width = canvas && canvas.width;
|
|
this.id = uid();
|
|
this.ctx = context;
|
|
this.canvas = canvas;
|
|
this.width = width;
|
|
this.height = height;
|
|
this._options = options;
|
|
this._aspectRatio = this.aspectRatio;
|
|
this._layers = [];
|
|
this._metasets = [];
|
|
this._stacks = void 0;
|
|
this.boxes = [];
|
|
this.currentDevicePixelRatio = void 0;
|
|
this.chartArea = void 0;
|
|
this._active = [];
|
|
this._lastEvent = void 0;
|
|
this._listeners = {};
|
|
this._responsiveListeners = void 0;
|
|
this._sortedMetasets = [];
|
|
this.scales = {};
|
|
this._plugins = new PluginService();
|
|
this.$proxies = {};
|
|
this._hiddenIndices = {};
|
|
this.attached = false;
|
|
this._animationsDisabled = void 0;
|
|
this.$context = void 0;
|
|
this._doResize = debounce((mode) => this.update(mode), options.resizeDelay || 0);
|
|
this._dataChanges = [];
|
|
instances[this.id] = this;
|
|
if (!context || !canvas) {
|
|
console.error("Failed to create chart: can't acquire context from the given item");
|
|
return;
|
|
}
|
|
animator.listen(this, "complete", onAnimationsComplete);
|
|
animator.listen(this, "progress", onAnimationProgress);
|
|
this._initialize();
|
|
if (this.attached) {
|
|
this.update();
|
|
}
|
|
}
|
|
get aspectRatio() {
|
|
const { options: { aspectRatio, maintainAspectRatio }, width, height, _aspectRatio } = this;
|
|
if (!isNullOrUndef(aspectRatio)) {
|
|
return aspectRatio;
|
|
}
|
|
if (maintainAspectRatio && _aspectRatio) {
|
|
return _aspectRatio;
|
|
}
|
|
return height ? width / height : null;
|
|
}
|
|
get data() {
|
|
return this.config.data;
|
|
}
|
|
set data(data) {
|
|
this.config.data = data;
|
|
}
|
|
get options() {
|
|
return this._options;
|
|
}
|
|
set options(options) {
|
|
this.config.options = options;
|
|
}
|
|
get registry() {
|
|
return registry;
|
|
}
|
|
_initialize() {
|
|
this.notifyPlugins("beforeInit");
|
|
if (this.options.responsive) {
|
|
this.resize();
|
|
} else {
|
|
retinaScale(this, this.options.devicePixelRatio);
|
|
}
|
|
this.bindEvents();
|
|
this.notifyPlugins("afterInit");
|
|
return this;
|
|
}
|
|
clear() {
|
|
clearCanvas(this.canvas, this.ctx);
|
|
return this;
|
|
}
|
|
stop() {
|
|
animator.stop(this);
|
|
return this;
|
|
}
|
|
resize(width, height) {
|
|
if (!animator.running(this)) {
|
|
this._resize(width, height);
|
|
} else {
|
|
this._resizeBeforeDraw = {
|
|
width,
|
|
height
|
|
};
|
|
}
|
|
}
|
|
_resize(width, height) {
|
|
const options = this.options;
|
|
const canvas = this.canvas;
|
|
const aspectRatio = options.maintainAspectRatio && this.aspectRatio;
|
|
const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);
|
|
const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();
|
|
const mode = this.width ? "resize" : "attach";
|
|
this.width = newSize.width;
|
|
this.height = newSize.height;
|
|
this._aspectRatio = this.aspectRatio;
|
|
if (!retinaScale(this, newRatio, true)) {
|
|
return;
|
|
}
|
|
this.notifyPlugins("resize", {
|
|
size: newSize
|
|
});
|
|
callback(options.onResize, [
|
|
this,
|
|
newSize
|
|
], this);
|
|
if (this.attached) {
|
|
if (this._doResize(mode)) {
|
|
this.render();
|
|
}
|
|
}
|
|
}
|
|
ensureScalesHaveIDs() {
|
|
const options = this.options;
|
|
const scalesOptions = options.scales || {};
|
|
each(scalesOptions, (axisOptions, axisID) => {
|
|
axisOptions.id = axisID;
|
|
});
|
|
}
|
|
buildOrUpdateScales() {
|
|
const options = this.options;
|
|
const scaleOpts = options.scales;
|
|
const scales = this.scales;
|
|
const updated = Object.keys(scales).reduce((obj, id) => {
|
|
obj[id] = false;
|
|
return obj;
|
|
}, {});
|
|
let items = [];
|
|
if (scaleOpts) {
|
|
items = items.concat(Object.keys(scaleOpts).map((id) => {
|
|
const scaleOptions = scaleOpts[id];
|
|
const axis = determineAxis(id, scaleOptions);
|
|
const isRadial = axis === "r";
|
|
const isHorizontal = axis === "x";
|
|
return {
|
|
options: scaleOptions,
|
|
dposition: isRadial ? "chartArea" : isHorizontal ? "bottom" : "left",
|
|
dtype: isRadial ? "radialLinear" : isHorizontal ? "category" : "linear"
|
|
};
|
|
}));
|
|
}
|
|
each(items, (item) => {
|
|
const scaleOptions = item.options;
|
|
const id = scaleOptions.id;
|
|
const axis = determineAxis(id, scaleOptions);
|
|
const scaleType = valueOrDefault(scaleOptions.type, item.dtype);
|
|
if (scaleOptions.position === void 0 || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {
|
|
scaleOptions.position = item.dposition;
|
|
}
|
|
updated[id] = true;
|
|
let scale = null;
|
|
if (id in scales && scales[id].type === scaleType) {
|
|
scale = scales[id];
|
|
} else {
|
|
const scaleClass = registry.getScale(scaleType);
|
|
scale = new scaleClass({
|
|
id,
|
|
type: scaleType,
|
|
ctx: this.ctx,
|
|
chart: this
|
|
});
|
|
scales[scale.id] = scale;
|
|
}
|
|
scale.init(scaleOptions, options);
|
|
});
|
|
each(updated, (hasUpdated, id) => {
|
|
if (!hasUpdated) {
|
|
delete scales[id];
|
|
}
|
|
});
|
|
each(scales, (scale) => {
|
|
layouts.configure(this, scale, scale.options);
|
|
layouts.addBox(this, scale);
|
|
});
|
|
}
|
|
_updateMetasets() {
|
|
const metasets = this._metasets;
|
|
const numData = this.data.datasets.length;
|
|
const numMeta = metasets.length;
|
|
metasets.sort((a, b) => a.index - b.index);
|
|
if (numMeta > numData) {
|
|
for (let i = numData; i < numMeta; ++i) {
|
|
this._destroyDatasetMeta(i);
|
|
}
|
|
metasets.splice(numData, numMeta - numData);
|
|
}
|
|
this._sortedMetasets = metasets.slice(0).sort(compare2Level("order", "index"));
|
|
}
|
|
_removeUnreferencedMetasets() {
|
|
const { _metasets: metasets, data: { datasets } } = this;
|
|
if (metasets.length > datasets.length) {
|
|
delete this._stacks;
|
|
}
|
|
metasets.forEach((meta, index) => {
|
|
if (datasets.filter((x) => x === meta._dataset).length === 0) {
|
|
this._destroyDatasetMeta(index);
|
|
}
|
|
});
|
|
}
|
|
buildOrUpdateControllers() {
|
|
const newControllers = [];
|
|
const datasets = this.data.datasets;
|
|
let i, ilen;
|
|
this._removeUnreferencedMetasets();
|
|
for (i = 0, ilen = datasets.length; i < ilen; i++) {
|
|
const dataset = datasets[i];
|
|
let meta = this.getDatasetMeta(i);
|
|
const type = dataset.type || this.config.type;
|
|
if (meta.type && meta.type !== type) {
|
|
this._destroyDatasetMeta(i);
|
|
meta = this.getDatasetMeta(i);
|
|
}
|
|
meta.type = type;
|
|
meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);
|
|
meta.order = dataset.order || 0;
|
|
meta.index = i;
|
|
meta.label = "" + dataset.label;
|
|
meta.visible = this.isDatasetVisible(i);
|
|
if (meta.controller) {
|
|
meta.controller.updateIndex(i);
|
|
meta.controller.linkScales();
|
|
} else {
|
|
const ControllerClass = registry.getController(type);
|
|
const { datasetElementType, dataElementType } = defaults.datasets[type];
|
|
Object.assign(ControllerClass, {
|
|
dataElementType: registry.getElement(dataElementType),
|
|
datasetElementType: datasetElementType && registry.getElement(datasetElementType)
|
|
});
|
|
meta.controller = new ControllerClass(this, i);
|
|
newControllers.push(meta.controller);
|
|
}
|
|
}
|
|
this._updateMetasets();
|
|
return newControllers;
|
|
}
|
|
_resetElements() {
|
|
each(this.data.datasets, (dataset, datasetIndex) => {
|
|
this.getDatasetMeta(datasetIndex).controller.reset();
|
|
}, this);
|
|
}
|
|
reset() {
|
|
this._resetElements();
|
|
this.notifyPlugins("reset");
|
|
}
|
|
update(mode) {
|
|
const config = this.config;
|
|
config.update();
|
|
const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());
|
|
const animsDisabled = this._animationsDisabled = !options.animation;
|
|
this._updateScales();
|
|
this._checkEventBindings();
|
|
this._updateHiddenIndices();
|
|
this._plugins.invalidate();
|
|
if (this.notifyPlugins("beforeUpdate", {
|
|
mode,
|
|
cancelable: true
|
|
}) === false) {
|
|
return;
|
|
}
|
|
const newControllers = this.buildOrUpdateControllers();
|
|
this.notifyPlugins("beforeElementsUpdate");
|
|
let minPadding = 0;
|
|
for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {
|
|
const { controller } = this.getDatasetMeta(i);
|
|
const reset2 = !animsDisabled && newControllers.indexOf(controller) === -1;
|
|
controller.buildOrUpdateElements(reset2);
|
|
minPadding = Math.max(+controller.getMaxOverflow(), minPadding);
|
|
}
|
|
minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;
|
|
this._updateLayout(minPadding);
|
|
if (!animsDisabled) {
|
|
each(newControllers, (controller) => {
|
|
controller.reset();
|
|
});
|
|
}
|
|
this._updateDatasets(mode);
|
|
this.notifyPlugins("afterUpdate", {
|
|
mode
|
|
});
|
|
this._layers.sort(compare2Level("z", "_idx"));
|
|
const { _active, _lastEvent } = this;
|
|
if (_lastEvent) {
|
|
this._eventHandler(_lastEvent, true);
|
|
} else if (_active.length) {
|
|
this._updateHoverStyles(_active, _active, true);
|
|
}
|
|
this.render();
|
|
}
|
|
_updateScales() {
|
|
each(this.scales, (scale) => {
|
|
layouts.removeBox(this, scale);
|
|
});
|
|
this.ensureScalesHaveIDs();
|
|
this.buildOrUpdateScales();
|
|
}
|
|
_checkEventBindings() {
|
|
const options = this.options;
|
|
const existingEvents = new Set(Object.keys(this._listeners));
|
|
const newEvents = new Set(options.events);
|
|
if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {
|
|
this.unbindEvents();
|
|
this.bindEvents();
|
|
}
|
|
}
|
|
_updateHiddenIndices() {
|
|
const { _hiddenIndices } = this;
|
|
const changes = this._getUniformDataChanges() || [];
|
|
for (const { method, start, count } of changes) {
|
|
const move = method === "_removeElements" ? -count : count;
|
|
moveNumericKeys(_hiddenIndices, start, move);
|
|
}
|
|
}
|
|
_getUniformDataChanges() {
|
|
const _dataChanges = this._dataChanges;
|
|
if (!_dataChanges || !_dataChanges.length) {
|
|
return;
|
|
}
|
|
this._dataChanges = [];
|
|
const datasetCount = this.data.datasets.length;
|
|
const makeSet = (idx) => new Set(_dataChanges.filter((c) => c[0] === idx).map((c, i) => i + "," + c.splice(1).join(",")));
|
|
const changeSet = makeSet(0);
|
|
for (let i = 1; i < datasetCount; i++) {
|
|
if (!setsEqual(changeSet, makeSet(i))) {
|
|
return;
|
|
}
|
|
}
|
|
return Array.from(changeSet).map((c) => c.split(",")).map((a) => ({
|
|
method: a[1],
|
|
start: +a[2],
|
|
count: +a[3]
|
|
}));
|
|
}
|
|
_updateLayout(minPadding) {
|
|
if (this.notifyPlugins("beforeLayout", {
|
|
cancelable: true
|
|
}) === false) {
|
|
return;
|
|
}
|
|
layouts.update(this, this.width, this.height, minPadding);
|
|
const area = this.chartArea;
|
|
const noArea = area.width <= 0 || area.height <= 0;
|
|
this._layers = [];
|
|
each(this.boxes, (box) => {
|
|
if (noArea && box.position === "chartArea") {
|
|
return;
|
|
}
|
|
if (box.configure) {
|
|
box.configure();
|
|
}
|
|
this._layers.push(...box._layers());
|
|
}, this);
|
|
this._layers.forEach((item, index) => {
|
|
item._idx = index;
|
|
});
|
|
this.notifyPlugins("afterLayout");
|
|
}
|
|
_updateDatasets(mode) {
|
|
if (this.notifyPlugins("beforeDatasetsUpdate", {
|
|
mode,
|
|
cancelable: true
|
|
}) === false) {
|
|
return;
|
|
}
|
|
for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {
|
|
this.getDatasetMeta(i).controller.configure();
|
|
}
|
|
for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {
|
|
this._updateDataset(i, isFunction(mode) ? mode({
|
|
datasetIndex: i
|
|
}) : mode);
|
|
}
|
|
this.notifyPlugins("afterDatasetsUpdate", {
|
|
mode
|
|
});
|
|
}
|
|
_updateDataset(index, mode) {
|
|
const meta = this.getDatasetMeta(index);
|
|
const args = {
|
|
meta,
|
|
index,
|
|
mode,
|
|
cancelable: true
|
|
};
|
|
if (this.notifyPlugins("beforeDatasetUpdate", args) === false) {
|
|
return;
|
|
}
|
|
meta.controller._update(mode);
|
|
args.cancelable = false;
|
|
this.notifyPlugins("afterDatasetUpdate", args);
|
|
}
|
|
render() {
|
|
if (this.notifyPlugins("beforeRender", {
|
|
cancelable: true
|
|
}) === false) {
|
|
return;
|
|
}
|
|
if (animator.has(this)) {
|
|
if (this.attached && !animator.running(this)) {
|
|
animator.start(this);
|
|
}
|
|
} else {
|
|
this.draw();
|
|
onAnimationsComplete({
|
|
chart: this
|
|
});
|
|
}
|
|
}
|
|
draw() {
|
|
let i;
|
|
if (this._resizeBeforeDraw) {
|
|
const { width, height } = this._resizeBeforeDraw;
|
|
this._resize(width, height);
|
|
this._resizeBeforeDraw = null;
|
|
}
|
|
this.clear();
|
|
if (this.width <= 0 || this.height <= 0) {
|
|
return;
|
|
}
|
|
if (this.notifyPlugins("beforeDraw", {
|
|
cancelable: true
|
|
}) === false) {
|
|
return;
|
|
}
|
|
const layers = this._layers;
|
|
for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {
|
|
layers[i].draw(this.chartArea);
|
|
}
|
|
this._drawDatasets();
|
|
for (; i < layers.length; ++i) {
|
|
layers[i].draw(this.chartArea);
|
|
}
|
|
this.notifyPlugins("afterDraw");
|
|
}
|
|
_getSortedDatasetMetas(filterVisible) {
|
|
const metasets = this._sortedMetasets;
|
|
const result = [];
|
|
let i, ilen;
|
|
for (i = 0, ilen = metasets.length; i < ilen; ++i) {
|
|
const meta = metasets[i];
|
|
if (!filterVisible || meta.visible) {
|
|
result.push(meta);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
getSortedVisibleDatasetMetas() {
|
|
return this._getSortedDatasetMetas(true);
|
|
}
|
|
_drawDatasets() {
|
|
if (this.notifyPlugins("beforeDatasetsDraw", {
|
|
cancelable: true
|
|
}) === false) {
|
|
return;
|
|
}
|
|
const metasets = this.getSortedVisibleDatasetMetas();
|
|
for (let i = metasets.length - 1; i >= 0; --i) {
|
|
this._drawDataset(metasets[i]);
|
|
}
|
|
this.notifyPlugins("afterDatasetsDraw");
|
|
}
|
|
_drawDataset(meta) {
|
|
const ctx = this.ctx;
|
|
const clip = meta._clip;
|
|
const useClip = !clip.disabled;
|
|
const area = getDatasetArea(meta, this.chartArea);
|
|
const args = {
|
|
meta,
|
|
index: meta.index,
|
|
cancelable: true
|
|
};
|
|
if (this.notifyPlugins("beforeDatasetDraw", args) === false) {
|
|
return;
|
|
}
|
|
if (useClip) {
|
|
clipArea(ctx, {
|
|
left: clip.left === false ? 0 : area.left - clip.left,
|
|
right: clip.right === false ? this.width : area.right + clip.right,
|
|
top: clip.top === false ? 0 : area.top - clip.top,
|
|
bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom
|
|
});
|
|
}
|
|
meta.controller.draw();
|
|
if (useClip) {
|
|
unclipArea(ctx);
|
|
}
|
|
args.cancelable = false;
|
|
this.notifyPlugins("afterDatasetDraw", args);
|
|
}
|
|
isPointInArea(point) {
|
|
return _isPointInArea(point, this.chartArea, this._minPadding);
|
|
}
|
|
getElementsAtEventForMode(e, mode, options, useFinalPosition) {
|
|
const method = Interaction.modes[mode];
|
|
if (typeof method === "function") {
|
|
return method(this, e, options, useFinalPosition);
|
|
}
|
|
return [];
|
|
}
|
|
getDatasetMeta(datasetIndex) {
|
|
const dataset = this.data.datasets[datasetIndex];
|
|
const metasets = this._metasets;
|
|
let meta = metasets.filter((x) => x && x._dataset === dataset).pop();
|
|
if (!meta) {
|
|
meta = {
|
|
type: null,
|
|
data: [],
|
|
dataset: null,
|
|
controller: null,
|
|
hidden: null,
|
|
xAxisID: null,
|
|
yAxisID: null,
|
|
order: dataset && dataset.order || 0,
|
|
index: datasetIndex,
|
|
_dataset: dataset,
|
|
_parsed: [],
|
|
_sorted: false
|
|
};
|
|
metasets.push(meta);
|
|
}
|
|
return meta;
|
|
}
|
|
getContext() {
|
|
return this.$context || (this.$context = createContext(null, {
|
|
chart: this,
|
|
type: "chart"
|
|
}));
|
|
}
|
|
getVisibleDatasetCount() {
|
|
return this.getSortedVisibleDatasetMetas().length;
|
|
}
|
|
isDatasetVisible(datasetIndex) {
|
|
const dataset = this.data.datasets[datasetIndex];
|
|
if (!dataset) {
|
|
return false;
|
|
}
|
|
const meta = this.getDatasetMeta(datasetIndex);
|
|
return typeof meta.hidden === "boolean" ? !meta.hidden : !dataset.hidden;
|
|
}
|
|
setDatasetVisibility(datasetIndex, visible) {
|
|
const meta = this.getDatasetMeta(datasetIndex);
|
|
meta.hidden = !visible;
|
|
}
|
|
toggleDataVisibility(index) {
|
|
this._hiddenIndices[index] = !this._hiddenIndices[index];
|
|
}
|
|
getDataVisibility(index) {
|
|
return !this._hiddenIndices[index];
|
|
}
|
|
_updateVisibility(datasetIndex, dataIndex, visible) {
|
|
const mode = visible ? "show" : "hide";
|
|
const meta = this.getDatasetMeta(datasetIndex);
|
|
const anims = meta.controller._resolveAnimations(void 0, mode);
|
|
if (defined(dataIndex)) {
|
|
meta.data[dataIndex].hidden = !visible;
|
|
this.update();
|
|
} else {
|
|
this.setDatasetVisibility(datasetIndex, visible);
|
|
anims.update(meta, {
|
|
visible
|
|
});
|
|
this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : void 0);
|
|
}
|
|
}
|
|
hide(datasetIndex, dataIndex) {
|
|
this._updateVisibility(datasetIndex, dataIndex, false);
|
|
}
|
|
show(datasetIndex, dataIndex) {
|
|
this._updateVisibility(datasetIndex, dataIndex, true);
|
|
}
|
|
_destroyDatasetMeta(datasetIndex) {
|
|
const meta = this._metasets[datasetIndex];
|
|
if (meta && meta.controller) {
|
|
meta.controller._destroy();
|
|
}
|
|
delete this._metasets[datasetIndex];
|
|
}
|
|
_stop() {
|
|
let i, ilen;
|
|
this.stop();
|
|
animator.remove(this);
|
|
for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {
|
|
this._destroyDatasetMeta(i);
|
|
}
|
|
}
|
|
destroy() {
|
|
this.notifyPlugins("beforeDestroy");
|
|
const { canvas, ctx } = this;
|
|
this._stop();
|
|
this.config.clearCache();
|
|
if (canvas) {
|
|
this.unbindEvents();
|
|
clearCanvas(canvas, ctx);
|
|
this.platform.releaseContext(ctx);
|
|
this.canvas = null;
|
|
this.ctx = null;
|
|
}
|
|
delete instances[this.id];
|
|
this.notifyPlugins("afterDestroy");
|
|
}
|
|
toBase64Image(...args) {
|
|
return this.canvas.toDataURL(...args);
|
|
}
|
|
bindEvents() {
|
|
this.bindUserEvents();
|
|
if (this.options.responsive) {
|
|
this.bindResponsiveEvents();
|
|
} else {
|
|
this.attached = true;
|
|
}
|
|
}
|
|
bindUserEvents() {
|
|
const listeners = this._listeners;
|
|
const platform = this.platform;
|
|
const _add = (type, listener2) => {
|
|
platform.addEventListener(this, type, listener2);
|
|
listeners[type] = listener2;
|
|
};
|
|
const listener = (e, x, y) => {
|
|
e.offsetX = x;
|
|
e.offsetY = y;
|
|
this._eventHandler(e);
|
|
};
|
|
each(this.options.events, (type) => _add(type, listener));
|
|
}
|
|
bindResponsiveEvents() {
|
|
if (!this._responsiveListeners) {
|
|
this._responsiveListeners = {};
|
|
}
|
|
const listeners = this._responsiveListeners;
|
|
const platform = this.platform;
|
|
const _add = (type, listener2) => {
|
|
platform.addEventListener(this, type, listener2);
|
|
listeners[type] = listener2;
|
|
};
|
|
const _remove = (type, listener2) => {
|
|
if (listeners[type]) {
|
|
platform.removeEventListener(this, type, listener2);
|
|
delete listeners[type];
|
|
}
|
|
};
|
|
const listener = (width, height) => {
|
|
if (this.canvas) {
|
|
this.resize(width, height);
|
|
}
|
|
};
|
|
let detached;
|
|
const attached = () => {
|
|
_remove("attach", attached);
|
|
this.attached = true;
|
|
this.resize();
|
|
_add("resize", listener);
|
|
_add("detach", detached);
|
|
};
|
|
detached = () => {
|
|
this.attached = false;
|
|
_remove("resize", listener);
|
|
this._stop();
|
|
this._resize(0, 0);
|
|
_add("attach", attached);
|
|
};
|
|
if (platform.isAttached(this.canvas)) {
|
|
attached();
|
|
} else {
|
|
detached();
|
|
}
|
|
}
|
|
unbindEvents() {
|
|
each(this._listeners, (listener, type) => {
|
|
this.platform.removeEventListener(this, type, listener);
|
|
});
|
|
this._listeners = {};
|
|
each(this._responsiveListeners, (listener, type) => {
|
|
this.platform.removeEventListener(this, type, listener);
|
|
});
|
|
this._responsiveListeners = void 0;
|
|
}
|
|
updateHoverStyle(items, mode, enabled) {
|
|
const prefix = enabled ? "set" : "remove";
|
|
let meta, item, i, ilen;
|
|
if (mode === "dataset") {
|
|
meta = this.getDatasetMeta(items[0].datasetIndex);
|
|
meta.controller["_" + prefix + "DatasetHoverStyle"]();
|
|
}
|
|
for (i = 0, ilen = items.length; i < ilen; ++i) {
|
|
item = items[i];
|
|
const controller = item && this.getDatasetMeta(item.datasetIndex).controller;
|
|
if (controller) {
|
|
controller[prefix + "HoverStyle"](item.element, item.datasetIndex, item.index);
|
|
}
|
|
}
|
|
}
|
|
getActiveElements() {
|
|
return this._active || [];
|
|
}
|
|
setActiveElements(activeElements) {
|
|
const lastActive = this._active || [];
|
|
const active = activeElements.map(({ datasetIndex, index }) => {
|
|
const meta = this.getDatasetMeta(datasetIndex);
|
|
if (!meta) {
|
|
throw new Error("No dataset found at index " + datasetIndex);
|
|
}
|
|
return {
|
|
datasetIndex,
|
|
element: meta.data[index],
|
|
index
|
|
};
|
|
});
|
|
const changed = !_elementsEqual(active, lastActive);
|
|
if (changed) {
|
|
this._active = active;
|
|
this._lastEvent = null;
|
|
this._updateHoverStyles(active, lastActive);
|
|
}
|
|
}
|
|
notifyPlugins(hook, args, filter) {
|
|
return this._plugins.notify(this, hook, args, filter);
|
|
}
|
|
isPluginEnabled(pluginId) {
|
|
return this._plugins._cache.filter((p) => p.plugin.id === pluginId).length === 1;
|
|
}
|
|
_updateHoverStyles(active, lastActive, replay) {
|
|
const hoverOptions = this.options.hover;
|
|
const diff = (a, b) => a.filter((x) => !b.some((y) => x.datasetIndex === y.datasetIndex && x.index === y.index));
|
|
const deactivated = diff(lastActive, active);
|
|
const activated = replay ? active : diff(active, lastActive);
|
|
if (deactivated.length) {
|
|
this.updateHoverStyle(deactivated, hoverOptions.mode, false);
|
|
}
|
|
if (activated.length && hoverOptions.mode) {
|
|
this.updateHoverStyle(activated, hoverOptions.mode, true);
|
|
}
|
|
}
|
|
_eventHandler(e, replay) {
|
|
const args = {
|
|
event: e,
|
|
replay,
|
|
cancelable: true,
|
|
inChartArea: this.isPointInArea(e)
|
|
};
|
|
const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);
|
|
if (this.notifyPlugins("beforeEvent", args, eventFilter) === false) {
|
|
return;
|
|
}
|
|
const changed = this._handleEvent(e, replay, args.inChartArea);
|
|
args.cancelable = false;
|
|
this.notifyPlugins("afterEvent", args, eventFilter);
|
|
if (changed || args.changed) {
|
|
this.render();
|
|
}
|
|
return this;
|
|
}
|
|
_handleEvent(e, replay, inChartArea) {
|
|
const { _active: lastActive = [], options } = this;
|
|
const useFinalPosition = replay;
|
|
const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);
|
|
const isClick = _isClickEvent(e);
|
|
const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);
|
|
if (inChartArea) {
|
|
this._lastEvent = null;
|
|
callback(options.onHover, [
|
|
e,
|
|
active,
|
|
this
|
|
], this);
|
|
if (isClick) {
|
|
callback(options.onClick, [
|
|
e,
|
|
active,
|
|
this
|
|
], this);
|
|
}
|
|
}
|
|
const changed = !_elementsEqual(active, lastActive);
|
|
if (changed || replay) {
|
|
this._active = active;
|
|
this._updateHoverStyles(active, lastActive, replay);
|
|
}
|
|
this._lastEvent = lastEvent;
|
|
return changed;
|
|
}
|
|
_getActiveElements(e, lastActive, inChartArea, useFinalPosition) {
|
|
if (e.type === "mouseout") {
|
|
return [];
|
|
}
|
|
if (!inChartArea) {
|
|
return lastActive;
|
|
}
|
|
const hoverOptions = this.options.hover;
|
|
return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);
|
|
}
|
|
};
|
|
__publicField(Chart, "defaults", defaults);
|
|
__publicField(Chart, "instances", instances);
|
|
__publicField(Chart, "overrides", overrides);
|
|
__publicField(Chart, "registry", registry);
|
|
__publicField(Chart, "version", version);
|
|
__publicField(Chart, "getChart", getChart);
|
|
function invalidatePlugins() {
|
|
return each(Chart.instances, (chart) => chart._plugins.invalidate());
|
|
}
|
|
function clipArc(ctx, element, endAngle) {
|
|
const { startAngle, pixelMargin, x, y, outerRadius, innerRadius } = element;
|
|
let angleMargin = pixelMargin / outerRadius;
|
|
ctx.beginPath();
|
|
ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);
|
|
if (innerRadius > pixelMargin) {
|
|
angleMargin = pixelMargin / innerRadius;
|
|
ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);
|
|
} else {
|
|
ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);
|
|
}
|
|
ctx.closePath();
|
|
ctx.clip();
|
|
}
|
|
function toRadiusCorners(value) {
|
|
return _readValueToProps(value, [
|
|
"outerStart",
|
|
"outerEnd",
|
|
"innerStart",
|
|
"innerEnd"
|
|
]);
|
|
}
|
|
function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {
|
|
const o = toRadiusCorners(arc.options.borderRadius);
|
|
const halfThickness = (outerRadius - innerRadius) / 2;
|
|
const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);
|
|
const computeOuterLimit = (val) => {
|
|
const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;
|
|
return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));
|
|
};
|
|
return {
|
|
outerStart: computeOuterLimit(o.outerStart),
|
|
outerEnd: computeOuterLimit(o.outerEnd),
|
|
innerStart: _limitValue(o.innerStart, 0, innerLimit),
|
|
innerEnd: _limitValue(o.innerEnd, 0, innerLimit)
|
|
};
|
|
}
|
|
function rThetaToXY(r, theta, x, y) {
|
|
return {
|
|
x: x + r * Math.cos(theta),
|
|
y: y + r * Math.sin(theta)
|
|
};
|
|
}
|
|
function pathArc(ctx, element, offset, spacing, end, circular) {
|
|
const { x, y, startAngle: start, pixelMargin, innerRadius: innerR } = element;
|
|
const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);
|
|
const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;
|
|
let spacingOffset = 0;
|
|
const alpha2 = end - start;
|
|
if (spacing) {
|
|
const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;
|
|
const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;
|
|
const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;
|
|
const adjustedAngle = avNogSpacingRadius !== 0 ? alpha2 * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha2;
|
|
spacingOffset = (alpha2 - adjustedAngle) / 2;
|
|
}
|
|
const beta = Math.max(1e-3, alpha2 * outerRadius - offset / PI) / outerRadius;
|
|
const angleOffset = (alpha2 - beta) / 2;
|
|
const startAngle = start + angleOffset + spacingOffset;
|
|
const endAngle = end - angleOffset - spacingOffset;
|
|
const { outerStart, outerEnd, innerStart, innerEnd } = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);
|
|
const outerStartAdjustedRadius = outerRadius - outerStart;
|
|
const outerEndAdjustedRadius = outerRadius - outerEnd;
|
|
const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;
|
|
const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;
|
|
const innerStartAdjustedRadius = innerRadius + innerStart;
|
|
const innerEndAdjustedRadius = innerRadius + innerEnd;
|
|
const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;
|
|
const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;
|
|
ctx.beginPath();
|
|
if (circular) {
|
|
const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;
|
|
ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);
|
|
ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);
|
|
if (outerEnd > 0) {
|
|
const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);
|
|
ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);
|
|
}
|
|
const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);
|
|
ctx.lineTo(p4.x, p4.y);
|
|
if (innerEnd > 0) {
|
|
const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);
|
|
ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);
|
|
}
|
|
const innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2;
|
|
ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true);
|
|
ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true);
|
|
if (innerStart > 0) {
|
|
const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);
|
|
ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);
|
|
}
|
|
const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);
|
|
ctx.lineTo(p8.x, p8.y);
|
|
if (outerStart > 0) {
|
|
const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);
|
|
ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);
|
|
}
|
|
} else {
|
|
ctx.moveTo(x, y);
|
|
const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;
|
|
const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;
|
|
ctx.lineTo(outerStartX, outerStartY);
|
|
const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;
|
|
const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;
|
|
ctx.lineTo(outerEndX, outerEndY);
|
|
}
|
|
ctx.closePath();
|
|
}
|
|
function drawArc(ctx, element, offset, spacing, circular) {
|
|
const { fullCircles, startAngle, circumference } = element;
|
|
let endAngle = element.endAngle;
|
|
if (fullCircles) {
|
|
pathArc(ctx, element, offset, spacing, endAngle, circular);
|
|
for (let i = 0; i < fullCircles; ++i) {
|
|
ctx.fill();
|
|
}
|
|
if (!isNaN(circumference)) {
|
|
endAngle = startAngle + (circumference % TAU || TAU);
|
|
}
|
|
}
|
|
pathArc(ctx, element, offset, spacing, endAngle, circular);
|
|
ctx.fill();
|
|
return endAngle;
|
|
}
|
|
function drawBorder(ctx, element, offset, spacing, circular) {
|
|
const { fullCircles, startAngle, circumference, options } = element;
|
|
const { borderWidth, borderJoinStyle, borderDash, borderDashOffset } = options;
|
|
const inner = options.borderAlign === "inner";
|
|
if (!borderWidth) {
|
|
return;
|
|
}
|
|
ctx.setLineDash(borderDash || []);
|
|
ctx.lineDashOffset = borderDashOffset;
|
|
if (inner) {
|
|
ctx.lineWidth = borderWidth * 2;
|
|
ctx.lineJoin = borderJoinStyle || "round";
|
|
} else {
|
|
ctx.lineWidth = borderWidth;
|
|
ctx.lineJoin = borderJoinStyle || "bevel";
|
|
}
|
|
let endAngle = element.endAngle;
|
|
if (fullCircles) {
|
|
pathArc(ctx, element, offset, spacing, endAngle, circular);
|
|
for (let i = 0; i < fullCircles; ++i) {
|
|
ctx.stroke();
|
|
}
|
|
if (!isNaN(circumference)) {
|
|
endAngle = startAngle + (circumference % TAU || TAU);
|
|
}
|
|
}
|
|
if (inner) {
|
|
clipArc(ctx, element, endAngle);
|
|
}
|
|
if (!fullCircles) {
|
|
pathArc(ctx, element, offset, spacing, endAngle, circular);
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
var ArcElement = class extends Element {
|
|
constructor(cfg) {
|
|
super();
|
|
__publicField(this, "circumference");
|
|
__publicField(this, "endAngle");
|
|
__publicField(this, "fullCircles");
|
|
__publicField(this, "innerRadius");
|
|
__publicField(this, "outerRadius");
|
|
__publicField(this, "pixelMargin");
|
|
__publicField(this, "startAngle");
|
|
this.options = void 0;
|
|
this.circumference = void 0;
|
|
this.startAngle = void 0;
|
|
this.endAngle = void 0;
|
|
this.innerRadius = void 0;
|
|
this.outerRadius = void 0;
|
|
this.pixelMargin = 0;
|
|
this.fullCircles = 0;
|
|
if (cfg) {
|
|
Object.assign(this, cfg);
|
|
}
|
|
}
|
|
inRange(chartX, chartY, useFinalPosition) {
|
|
const point = this.getProps([
|
|
"x",
|
|
"y"
|
|
], useFinalPosition);
|
|
const { angle, distance } = getAngleFromPoint(point, {
|
|
x: chartX,
|
|
y: chartY
|
|
});
|
|
const { startAngle, endAngle, innerRadius, outerRadius, circumference } = this.getProps([
|
|
"startAngle",
|
|
"endAngle",
|
|
"innerRadius",
|
|
"outerRadius",
|
|
"circumference"
|
|
], useFinalPosition);
|
|
const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;
|
|
const _circumference = valueOrDefault(circumference, endAngle - startAngle);
|
|
const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle);
|
|
const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);
|
|
return betweenAngles && withinRadius;
|
|
}
|
|
getCenterPoint(useFinalPosition) {
|
|
const { x, y, startAngle, endAngle, innerRadius, outerRadius } = this.getProps([
|
|
"x",
|
|
"y",
|
|
"startAngle",
|
|
"endAngle",
|
|
"innerRadius",
|
|
"outerRadius"
|
|
], useFinalPosition);
|
|
const { offset, spacing } = this.options;
|
|
const halfAngle = (startAngle + endAngle) / 2;
|
|
const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;
|
|
return {
|
|
x: x + Math.cos(halfAngle) * halfRadius,
|
|
y: y + Math.sin(halfAngle) * halfRadius
|
|
};
|
|
}
|
|
tooltipPosition(useFinalPosition) {
|
|
return this.getCenterPoint(useFinalPosition);
|
|
}
|
|
draw(ctx) {
|
|
const { options, circumference } = this;
|
|
const offset = (options.offset || 0) / 4;
|
|
const spacing = (options.spacing || 0) / 2;
|
|
const circular = options.circular;
|
|
this.pixelMargin = options.borderAlign === "inner" ? 0.33 : 0;
|
|
this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;
|
|
if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {
|
|
return;
|
|
}
|
|
ctx.save();
|
|
const halfAngle = (this.startAngle + this.endAngle) / 2;
|
|
ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);
|
|
const fix = 1 - Math.sin(Math.min(PI, circumference || 0));
|
|
const radiusOffset = offset * fix;
|
|
ctx.fillStyle = options.backgroundColor;
|
|
ctx.strokeStyle = options.borderColor;
|
|
drawArc(ctx, this, radiusOffset, spacing, circular);
|
|
drawBorder(ctx, this, radiusOffset, spacing, circular);
|
|
ctx.restore();
|
|
}
|
|
};
|
|
__publicField(ArcElement, "id", "arc");
|
|
__publicField(ArcElement, "defaults", {
|
|
borderAlign: "center",
|
|
borderColor: "#fff",
|
|
borderDash: [],
|
|
borderDashOffset: 0,
|
|
borderJoinStyle: void 0,
|
|
borderRadius: 0,
|
|
borderWidth: 2,
|
|
offset: 0,
|
|
spacing: 0,
|
|
angle: void 0,
|
|
circular: true
|
|
});
|
|
__publicField(ArcElement, "defaultRoutes", {
|
|
backgroundColor: "backgroundColor"
|
|
});
|
|
__publicField(ArcElement, "descriptors", {
|
|
_scriptable: true,
|
|
_indexable: (name) => name !== "borderDash"
|
|
});
|
|
function getBarBounds(bar, useFinalPosition) {
|
|
const { x, y, base, width, height } = bar.getProps([
|
|
"x",
|
|
"y",
|
|
"base",
|
|
"width",
|
|
"height"
|
|
], useFinalPosition);
|
|
let left, right, top, bottom, half;
|
|
if (bar.horizontal) {
|
|
half = height / 2;
|
|
left = Math.min(x, base);
|
|
right = Math.max(x, base);
|
|
top = y - half;
|
|
bottom = y + half;
|
|
} else {
|
|
half = width / 2;
|
|
left = x - half;
|
|
right = x + half;
|
|
top = Math.min(y, base);
|
|
bottom = Math.max(y, base);
|
|
}
|
|
return {
|
|
left,
|
|
top,
|
|
right,
|
|
bottom
|
|
};
|
|
}
|
|
function skipOrLimit(skip2, value, min, max) {
|
|
return skip2 ? 0 : _limitValue(value, min, max);
|
|
}
|
|
function parseBorderWidth(bar, maxW, maxH) {
|
|
const value = bar.options.borderWidth;
|
|
const skip2 = bar.borderSkipped;
|
|
const o = toTRBL(value);
|
|
return {
|
|
t: skipOrLimit(skip2.top, o.top, 0, maxH),
|
|
r: skipOrLimit(skip2.right, o.right, 0, maxW),
|
|
b: skipOrLimit(skip2.bottom, o.bottom, 0, maxH),
|
|
l: skipOrLimit(skip2.left, o.left, 0, maxW)
|
|
};
|
|
}
|
|
function parseBorderRadius(bar, maxW, maxH) {
|
|
const { enableBorderRadius } = bar.getProps([
|
|
"enableBorderRadius"
|
|
]);
|
|
const value = bar.options.borderRadius;
|
|
const o = toTRBLCorners(value);
|
|
const maxR = Math.min(maxW, maxH);
|
|
const skip2 = bar.borderSkipped;
|
|
const enableBorder = enableBorderRadius || isObject(value);
|
|
return {
|
|
topLeft: skipOrLimit(!enableBorder || skip2.top || skip2.left, o.topLeft, 0, maxR),
|
|
topRight: skipOrLimit(!enableBorder || skip2.top || skip2.right, o.topRight, 0, maxR),
|
|
bottomLeft: skipOrLimit(!enableBorder || skip2.bottom || skip2.left, o.bottomLeft, 0, maxR),
|
|
bottomRight: skipOrLimit(!enableBorder || skip2.bottom || skip2.right, o.bottomRight, 0, maxR)
|
|
};
|
|
}
|
|
function boundingRects(bar) {
|
|
const bounds = getBarBounds(bar);
|
|
const width = bounds.right - bounds.left;
|
|
const height = bounds.bottom - bounds.top;
|
|
const border = parseBorderWidth(bar, width / 2, height / 2);
|
|
const radius = parseBorderRadius(bar, width / 2, height / 2);
|
|
return {
|
|
outer: {
|
|
x: bounds.left,
|
|
y: bounds.top,
|
|
w: width,
|
|
h: height,
|
|
radius
|
|
},
|
|
inner: {
|
|
x: bounds.left + border.l,
|
|
y: bounds.top + border.t,
|
|
w: width - border.l - border.r,
|
|
h: height - border.t - border.b,
|
|
radius: {
|
|
topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),
|
|
topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),
|
|
bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),
|
|
bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r))
|
|
}
|
|
}
|
|
};
|
|
}
|
|
function inRange(bar, x, y, useFinalPosition) {
|
|
const skipX = x === null;
|
|
const skipY = y === null;
|
|
const skipBoth = skipX && skipY;
|
|
const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);
|
|
return bounds && (skipX || _isBetween(x, bounds.left, bounds.right)) && (skipY || _isBetween(y, bounds.top, bounds.bottom));
|
|
}
|
|
function hasRadius(radius) {
|
|
return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;
|
|
}
|
|
function addNormalRectPath(ctx, rect) {
|
|
ctx.rect(rect.x, rect.y, rect.w, rect.h);
|
|
}
|
|
function inflateRect(rect, amount, refRect = {}) {
|
|
const x = rect.x !== refRect.x ? -amount : 0;
|
|
const y = rect.y !== refRect.y ? -amount : 0;
|
|
const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;
|
|
const h4 = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;
|
|
return {
|
|
x: rect.x + x,
|
|
y: rect.y + y,
|
|
w: rect.w + w,
|
|
h: rect.h + h4,
|
|
radius: rect.radius
|
|
};
|
|
}
|
|
var BarElement = class extends Element {
|
|
constructor(cfg) {
|
|
super();
|
|
this.options = void 0;
|
|
this.horizontal = void 0;
|
|
this.base = void 0;
|
|
this.width = void 0;
|
|
this.height = void 0;
|
|
this.inflateAmount = void 0;
|
|
if (cfg) {
|
|
Object.assign(this, cfg);
|
|
}
|
|
}
|
|
draw(ctx) {
|
|
const { inflateAmount, options: { borderColor, backgroundColor } } = this;
|
|
const { inner, outer } = boundingRects(this);
|
|
const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;
|
|
ctx.save();
|
|
if (outer.w !== inner.w || outer.h !== inner.h) {
|
|
ctx.beginPath();
|
|
addRectPath(ctx, inflateRect(outer, inflateAmount, inner));
|
|
ctx.clip();
|
|
addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));
|
|
ctx.fillStyle = borderColor;
|
|
ctx.fill("evenodd");
|
|
}
|
|
ctx.beginPath();
|
|
addRectPath(ctx, inflateRect(inner, inflateAmount));
|
|
ctx.fillStyle = backgroundColor;
|
|
ctx.fill();
|
|
ctx.restore();
|
|
}
|
|
inRange(mouseX, mouseY, useFinalPosition) {
|
|
return inRange(this, mouseX, mouseY, useFinalPosition);
|
|
}
|
|
inXRange(mouseX, useFinalPosition) {
|
|
return inRange(this, mouseX, null, useFinalPosition);
|
|
}
|
|
inYRange(mouseY, useFinalPosition) {
|
|
return inRange(this, null, mouseY, useFinalPosition);
|
|
}
|
|
getCenterPoint(useFinalPosition) {
|
|
const { x, y, base, horizontal } = this.getProps([
|
|
"x",
|
|
"y",
|
|
"base",
|
|
"horizontal"
|
|
], useFinalPosition);
|
|
return {
|
|
x: horizontal ? (x + base) / 2 : x,
|
|
y: horizontal ? y : (y + base) / 2
|
|
};
|
|
}
|
|
getRange(axis) {
|
|
return axis === "x" ? this.width / 2 : this.height / 2;
|
|
}
|
|
};
|
|
__publicField(BarElement, "id", "bar");
|
|
__publicField(BarElement, "defaults", {
|
|
borderSkipped: "start",
|
|
borderWidth: 0,
|
|
borderRadius: 0,
|
|
inflateAmount: "auto",
|
|
pointStyle: void 0
|
|
});
|
|
__publicField(BarElement, "defaultRoutes", {
|
|
backgroundColor: "backgroundColor",
|
|
borderColor: "borderColor"
|
|
});
|
|
var getBoxSize = (labelOpts, fontSize) => {
|
|
let { boxHeight = fontSize, boxWidth = fontSize } = labelOpts;
|
|
if (labelOpts.usePointStyle) {
|
|
boxHeight = Math.min(boxHeight, fontSize);
|
|
boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);
|
|
}
|
|
return {
|
|
boxWidth,
|
|
boxHeight,
|
|
itemHeight: Math.max(fontSize, boxHeight)
|
|
};
|
|
};
|
|
var itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;
|
|
var Legend = class extends Element {
|
|
constructor(config) {
|
|
super();
|
|
this._added = false;
|
|
this.legendHitBoxes = [];
|
|
this._hoveredItem = null;
|
|
this.doughnutMode = false;
|
|
this.chart = config.chart;
|
|
this.options = config.options;
|
|
this.ctx = config.ctx;
|
|
this.legendItems = void 0;
|
|
this.columnSizes = void 0;
|
|
this.lineWidths = void 0;
|
|
this.maxHeight = void 0;
|
|
this.maxWidth = void 0;
|
|
this.top = void 0;
|
|
this.bottom = void 0;
|
|
this.left = void 0;
|
|
this.right = void 0;
|
|
this.height = void 0;
|
|
this.width = void 0;
|
|
this._margins = void 0;
|
|
this.position = void 0;
|
|
this.weight = void 0;
|
|
this.fullSize = void 0;
|
|
}
|
|
update(maxWidth, maxHeight, margins) {
|
|
this.maxWidth = maxWidth;
|
|
this.maxHeight = maxHeight;
|
|
this._margins = margins;
|
|
this.setDimensions();
|
|
this.buildLabels();
|
|
this.fit();
|
|
}
|
|
setDimensions() {
|
|
if (this.isHorizontal()) {
|
|
this.width = this.maxWidth;
|
|
this.left = this._margins.left;
|
|
this.right = this.width;
|
|
} else {
|
|
this.height = this.maxHeight;
|
|
this.top = this._margins.top;
|
|
this.bottom = this.height;
|
|
}
|
|
}
|
|
buildLabels() {
|
|
const labelOpts = this.options.labels || {};
|
|
let legendItems = callback(labelOpts.generateLabels, [
|
|
this.chart
|
|
], this) || [];
|
|
if (labelOpts.filter) {
|
|
legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));
|
|
}
|
|
if (labelOpts.sort) {
|
|
legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));
|
|
}
|
|
if (this.options.reverse) {
|
|
legendItems.reverse();
|
|
}
|
|
this.legendItems = legendItems;
|
|
}
|
|
fit() {
|
|
const { options, ctx } = this;
|
|
if (!options.display) {
|
|
this.width = this.height = 0;
|
|
return;
|
|
}
|
|
const labelOpts = options.labels;
|
|
const labelFont = toFont(labelOpts.font);
|
|
const fontSize = labelFont.size;
|
|
const titleHeight = this._computeTitleHeight();
|
|
const { boxWidth, itemHeight } = getBoxSize(labelOpts, fontSize);
|
|
let width, height;
|
|
ctx.font = labelFont.string;
|
|
if (this.isHorizontal()) {
|
|
width = this.maxWidth;
|
|
height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;
|
|
} else {
|
|
height = this.maxHeight;
|
|
width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;
|
|
}
|
|
this.width = Math.min(width, options.maxWidth || this.maxWidth);
|
|
this.height = Math.min(height, options.maxHeight || this.maxHeight);
|
|
}
|
|
_fitRows(titleHeight, fontSize, boxWidth, itemHeight) {
|
|
const { ctx, maxWidth, options: { labels: { padding } } } = this;
|
|
const hitboxes = this.legendHitBoxes = [];
|
|
const lineWidths = this.lineWidths = [
|
|
0
|
|
];
|
|
const lineHeight = itemHeight + padding;
|
|
let totalHeight = titleHeight;
|
|
ctx.textAlign = "left";
|
|
ctx.textBaseline = "middle";
|
|
let row = -1;
|
|
let top = -lineHeight;
|
|
this.legendItems.forEach((legendItem, i) => {
|
|
const itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;
|
|
if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {
|
|
totalHeight += lineHeight;
|
|
lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;
|
|
top += lineHeight;
|
|
row++;
|
|
}
|
|
hitboxes[i] = {
|
|
left: 0,
|
|
top,
|
|
row,
|
|
width: itemWidth,
|
|
height: itemHeight
|
|
};
|
|
lineWidths[lineWidths.length - 1] += itemWidth + padding;
|
|
});
|
|
return totalHeight;
|
|
}
|
|
_fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {
|
|
const { ctx, maxHeight, options: { labels: { padding } } } = this;
|
|
const hitboxes = this.legendHitBoxes = [];
|
|
const columnSizes = this.columnSizes = [];
|
|
const heightLimit = maxHeight - titleHeight;
|
|
let totalWidth = padding;
|
|
let currentColWidth = 0;
|
|
let currentColHeight = 0;
|
|
let left = 0;
|
|
let col = 0;
|
|
this.legendItems.forEach((legendItem, i) => {
|
|
const { itemWidth, itemHeight } = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);
|
|
if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {
|
|
totalWidth += currentColWidth + padding;
|
|
columnSizes.push({
|
|
width: currentColWidth,
|
|
height: currentColHeight
|
|
});
|
|
left += currentColWidth + padding;
|
|
col++;
|
|
currentColWidth = currentColHeight = 0;
|
|
}
|
|
hitboxes[i] = {
|
|
left,
|
|
top: currentColHeight,
|
|
col,
|
|
width: itemWidth,
|
|
height: itemHeight
|
|
};
|
|
currentColWidth = Math.max(currentColWidth, itemWidth);
|
|
currentColHeight += itemHeight + padding;
|
|
});
|
|
totalWidth += currentColWidth;
|
|
columnSizes.push({
|
|
width: currentColWidth,
|
|
height: currentColHeight
|
|
});
|
|
return totalWidth;
|
|
}
|
|
adjustHitBoxes() {
|
|
if (!this.options.display) {
|
|
return;
|
|
}
|
|
const titleHeight = this._computeTitleHeight();
|
|
const { legendHitBoxes: hitboxes, options: { align, labels: { padding }, rtl } } = this;
|
|
const rtlHelper = getRtlAdapter(rtl, this.left, this.width);
|
|
if (this.isHorizontal()) {
|
|
let row = 0;
|
|
let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);
|
|
for (const hitbox of hitboxes) {
|
|
if (row !== hitbox.row) {
|
|
row = hitbox.row;
|
|
left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);
|
|
}
|
|
hitbox.top += this.top + titleHeight + padding;
|
|
hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);
|
|
left += hitbox.width + padding;
|
|
}
|
|
} else {
|
|
let col = 0;
|
|
let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);
|
|
for (const hitbox of hitboxes) {
|
|
if (hitbox.col !== col) {
|
|
col = hitbox.col;
|
|
top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);
|
|
}
|
|
hitbox.top = top;
|
|
hitbox.left += this.left + padding;
|
|
hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);
|
|
top += hitbox.height + padding;
|
|
}
|
|
}
|
|
}
|
|
isHorizontal() {
|
|
return this.options.position === "top" || this.options.position === "bottom";
|
|
}
|
|
draw() {
|
|
if (this.options.display) {
|
|
const ctx = this.ctx;
|
|
clipArea(ctx, this);
|
|
this._draw();
|
|
unclipArea(ctx);
|
|
}
|
|
}
|
|
_draw() {
|
|
const { options: opts, columnSizes, lineWidths, ctx } = this;
|
|
const { align, labels: labelOpts } = opts;
|
|
const defaultColor = defaults.color;
|
|
const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);
|
|
const labelFont = toFont(labelOpts.font);
|
|
const { padding } = labelOpts;
|
|
const fontSize = labelFont.size;
|
|
const halfFontSize = fontSize / 2;
|
|
let cursor;
|
|
this.drawTitle();
|
|
ctx.textAlign = rtlHelper.textAlign("left");
|
|
ctx.textBaseline = "middle";
|
|
ctx.lineWidth = 0.5;
|
|
ctx.font = labelFont.string;
|
|
const { boxWidth, boxHeight, itemHeight } = getBoxSize(labelOpts, fontSize);
|
|
const drawLegendBox = function(x, y, legendItem) {
|
|
if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {
|
|
return;
|
|
}
|
|
ctx.save();
|
|
const lineWidth = valueOrDefault(legendItem.lineWidth, 1);
|
|
ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);
|
|
ctx.lineCap = valueOrDefault(legendItem.lineCap, "butt");
|
|
ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);
|
|
ctx.lineJoin = valueOrDefault(legendItem.lineJoin, "miter");
|
|
ctx.lineWidth = lineWidth;
|
|
ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);
|
|
ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));
|
|
if (labelOpts.usePointStyle) {
|
|
const drawOptions = {
|
|
radius: boxHeight * Math.SQRT2 / 2,
|
|
pointStyle: legendItem.pointStyle,
|
|
rotation: legendItem.rotation,
|
|
borderWidth: lineWidth
|
|
};
|
|
const centerX = rtlHelper.xPlus(x, boxWidth / 2);
|
|
const centerY = y + halfFontSize;
|
|
drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);
|
|
} else {
|
|
const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);
|
|
const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);
|
|
const borderRadius = toTRBLCorners(legendItem.borderRadius);
|
|
ctx.beginPath();
|
|
if (Object.values(borderRadius).some((v) => v !== 0)) {
|
|
addRoundedRectPath(ctx, {
|
|
x: xBoxLeft,
|
|
y: yBoxTop,
|
|
w: boxWidth,
|
|
h: boxHeight,
|
|
radius: borderRadius
|
|
});
|
|
} else {
|
|
ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);
|
|
}
|
|
ctx.fill();
|
|
if (lineWidth !== 0) {
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
ctx.restore();
|
|
};
|
|
const fillText = function(x, y, legendItem) {
|
|
renderText(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, {
|
|
strikethrough: legendItem.hidden,
|
|
textAlign: rtlHelper.textAlign(legendItem.textAlign)
|
|
});
|
|
};
|
|
const isHorizontal = this.isHorizontal();
|
|
const titleHeight = this._computeTitleHeight();
|
|
if (isHorizontal) {
|
|
cursor = {
|
|
x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),
|
|
y: this.top + padding + titleHeight,
|
|
line: 0
|
|
};
|
|
} else {
|
|
cursor = {
|
|
x: this.left + padding,
|
|
y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),
|
|
line: 0
|
|
};
|
|
}
|
|
overrideTextDirection(this.ctx, opts.textDirection);
|
|
const lineHeight = itemHeight + padding;
|
|
this.legendItems.forEach((legendItem, i) => {
|
|
ctx.strokeStyle = legendItem.fontColor;
|
|
ctx.fillStyle = legendItem.fontColor;
|
|
const textWidth = ctx.measureText(legendItem.text).width;
|
|
const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));
|
|
const width = boxWidth + halfFontSize + textWidth;
|
|
let x = cursor.x;
|
|
let y = cursor.y;
|
|
rtlHelper.setWidth(this.width);
|
|
if (isHorizontal) {
|
|
if (i > 0 && x + width + padding > this.right) {
|
|
y = cursor.y += lineHeight;
|
|
cursor.line++;
|
|
x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);
|
|
}
|
|
} else if (i > 0 && y + lineHeight > this.bottom) {
|
|
x = cursor.x = x + columnSizes[cursor.line].width + padding;
|
|
cursor.line++;
|
|
y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);
|
|
}
|
|
const realX = rtlHelper.x(x);
|
|
drawLegendBox(realX, y, legendItem);
|
|
x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);
|
|
fillText(rtlHelper.x(x), y, legendItem);
|
|
if (isHorizontal) {
|
|
cursor.x += width + padding;
|
|
} else if (typeof legendItem.text !== "string") {
|
|
const fontLineHeight = labelFont.lineHeight;
|
|
cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;
|
|
} else {
|
|
cursor.y += lineHeight;
|
|
}
|
|
});
|
|
restoreTextDirection(this.ctx, opts.textDirection);
|
|
}
|
|
drawTitle() {
|
|
const opts = this.options;
|
|
const titleOpts = opts.title;
|
|
const titleFont = toFont(titleOpts.font);
|
|
const titlePadding = toPadding(titleOpts.padding);
|
|
if (!titleOpts.display) {
|
|
return;
|
|
}
|
|
const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);
|
|
const ctx = this.ctx;
|
|
const position = titleOpts.position;
|
|
const halfFontSize = titleFont.size / 2;
|
|
const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;
|
|
let y;
|
|
let left = this.left;
|
|
let maxWidth = this.width;
|
|
if (this.isHorizontal()) {
|
|
maxWidth = Math.max(...this.lineWidths);
|
|
y = this.top + topPaddingPlusHalfFontSize;
|
|
left = _alignStartEnd(opts.align, left, this.right - maxWidth);
|
|
} else {
|
|
const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);
|
|
y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());
|
|
}
|
|
const x = _alignStartEnd(position, left, left + maxWidth);
|
|
ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));
|
|
ctx.textBaseline = "middle";
|
|
ctx.strokeStyle = titleOpts.color;
|
|
ctx.fillStyle = titleOpts.color;
|
|
ctx.font = titleFont.string;
|
|
renderText(ctx, titleOpts.text, x, y, titleFont);
|
|
}
|
|
_computeTitleHeight() {
|
|
const titleOpts = this.options.title;
|
|
const titleFont = toFont(titleOpts.font);
|
|
const titlePadding = toPadding(titleOpts.padding);
|
|
return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;
|
|
}
|
|
_getLegendItemAt(x, y) {
|
|
let i, hitBox, lh;
|
|
if (_isBetween(x, this.left, this.right) && _isBetween(y, this.top, this.bottom)) {
|
|
lh = this.legendHitBoxes;
|
|
for (i = 0; i < lh.length; ++i) {
|
|
hitBox = lh[i];
|
|
if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width) && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {
|
|
return this.legendItems[i];
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
handleEvent(e) {
|
|
const opts = this.options;
|
|
if (!isListened(e.type, opts)) {
|
|
return;
|
|
}
|
|
const hoveredItem = this._getLegendItemAt(e.x, e.y);
|
|
if (e.type === "mousemove" || e.type === "mouseout") {
|
|
const previous = this._hoveredItem;
|
|
const sameItem = itemsEqual(previous, hoveredItem);
|
|
if (previous && !sameItem) {
|
|
callback(opts.onLeave, [
|
|
e,
|
|
previous,
|
|
this
|
|
], this);
|
|
}
|
|
this._hoveredItem = hoveredItem;
|
|
if (hoveredItem && !sameItem) {
|
|
callback(opts.onHover, [
|
|
e,
|
|
hoveredItem,
|
|
this
|
|
], this);
|
|
}
|
|
} else if (hoveredItem) {
|
|
callback(opts.onClick, [
|
|
e,
|
|
hoveredItem,
|
|
this
|
|
], this);
|
|
}
|
|
}
|
|
};
|
|
function calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {
|
|
const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);
|
|
const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);
|
|
return {
|
|
itemWidth,
|
|
itemHeight
|
|
};
|
|
}
|
|
function calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {
|
|
let legendItemText = legendItem.text;
|
|
if (legendItemText && typeof legendItemText !== "string") {
|
|
legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);
|
|
}
|
|
return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width;
|
|
}
|
|
function calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {
|
|
let itemHeight = _itemHeight;
|
|
if (typeof legendItem.text !== "string") {
|
|
itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);
|
|
}
|
|
return itemHeight;
|
|
}
|
|
function calculateLegendItemHeight(legendItem, fontLineHeight) {
|
|
const labelHeight = legendItem.text ? legendItem.text.length : 0;
|
|
return fontLineHeight * labelHeight;
|
|
}
|
|
function isListened(type, opts) {
|
|
if ((type === "mousemove" || type === "mouseout") && (opts.onHover || opts.onLeave)) {
|
|
return true;
|
|
}
|
|
if (opts.onClick && (type === "click" || type === "mouseup")) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
var plugin_legend = {
|
|
id: "legend",
|
|
_element: Legend,
|
|
start(chart, _args, options) {
|
|
const legend = chart.legend = new Legend({
|
|
ctx: chart.ctx,
|
|
options,
|
|
chart
|
|
});
|
|
layouts.configure(chart, legend, options);
|
|
layouts.addBox(chart, legend);
|
|
},
|
|
stop(chart) {
|
|
layouts.removeBox(chart, chart.legend);
|
|
delete chart.legend;
|
|
},
|
|
beforeUpdate(chart, _args, options) {
|
|
const legend = chart.legend;
|
|
layouts.configure(chart, legend, options);
|
|
legend.options = options;
|
|
},
|
|
afterUpdate(chart) {
|
|
const legend = chart.legend;
|
|
legend.buildLabels();
|
|
legend.adjustHitBoxes();
|
|
},
|
|
afterEvent(chart, args) {
|
|
if (!args.replay) {
|
|
chart.legend.handleEvent(args.event);
|
|
}
|
|
},
|
|
defaults: {
|
|
display: true,
|
|
position: "top",
|
|
align: "center",
|
|
fullSize: true,
|
|
reverse: false,
|
|
weight: 1e3,
|
|
onClick(e, legendItem, legend) {
|
|
const index = legendItem.datasetIndex;
|
|
const ci = legend.chart;
|
|
if (ci.isDatasetVisible(index)) {
|
|
ci.hide(index);
|
|
legendItem.hidden = true;
|
|
} else {
|
|
ci.show(index);
|
|
legendItem.hidden = false;
|
|
}
|
|
},
|
|
onHover: null,
|
|
onLeave: null,
|
|
labels: {
|
|
color: (ctx) => ctx.chart.options.color,
|
|
boxWidth: 40,
|
|
padding: 10,
|
|
generateLabels(chart) {
|
|
const datasets = chart.data.datasets;
|
|
const { labels: { usePointStyle, pointStyle, textAlign, color: color2, useBorderRadius, borderRadius } } = chart.legend.options;
|
|
return chart._getSortedDatasetMetas().map((meta) => {
|
|
const style = meta.controller.getStyle(usePointStyle ? 0 : void 0);
|
|
const borderWidth = toPadding(style.borderWidth);
|
|
return {
|
|
text: datasets[meta.index].label,
|
|
fillStyle: style.backgroundColor,
|
|
fontColor: color2,
|
|
hidden: !meta.visible,
|
|
lineCap: style.borderCapStyle,
|
|
lineDash: style.borderDash,
|
|
lineDashOffset: style.borderDashOffset,
|
|
lineJoin: style.borderJoinStyle,
|
|
lineWidth: (borderWidth.width + borderWidth.height) / 4,
|
|
strokeStyle: style.borderColor,
|
|
pointStyle: pointStyle || style.pointStyle,
|
|
rotation: style.rotation,
|
|
textAlign: textAlign || style.textAlign,
|
|
borderRadius: useBorderRadius && (borderRadius || style.borderRadius),
|
|
datasetIndex: meta.index
|
|
};
|
|
}, this);
|
|
}
|
|
},
|
|
title: {
|
|
color: (ctx) => ctx.chart.options.color,
|
|
display: false,
|
|
position: "center",
|
|
text: ""
|
|
}
|
|
},
|
|
descriptors: {
|
|
_scriptable: (name) => !name.startsWith("on"),
|
|
labels: {
|
|
_scriptable: (name) => ![
|
|
"generateLabels",
|
|
"filter",
|
|
"sort"
|
|
].includes(name)
|
|
}
|
|
}
|
|
};
|
|
var Title = class extends Element {
|
|
constructor(config) {
|
|
super();
|
|
this.chart = config.chart;
|
|
this.options = config.options;
|
|
this.ctx = config.ctx;
|
|
this._padding = void 0;
|
|
this.top = void 0;
|
|
this.bottom = void 0;
|
|
this.left = void 0;
|
|
this.right = void 0;
|
|
this.width = void 0;
|
|
this.height = void 0;
|
|
this.position = void 0;
|
|
this.weight = void 0;
|
|
this.fullSize = void 0;
|
|
}
|
|
update(maxWidth, maxHeight) {
|
|
const opts = this.options;
|
|
this.left = 0;
|
|
this.top = 0;
|
|
if (!opts.display) {
|
|
this.width = this.height = this.right = this.bottom = 0;
|
|
return;
|
|
}
|
|
this.width = this.right = maxWidth;
|
|
this.height = this.bottom = maxHeight;
|
|
const lineCount = isArray(opts.text) ? opts.text.length : 1;
|
|
this._padding = toPadding(opts.padding);
|
|
const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;
|
|
if (this.isHorizontal()) {
|
|
this.height = textSize;
|
|
} else {
|
|
this.width = textSize;
|
|
}
|
|
}
|
|
isHorizontal() {
|
|
const pos = this.options.position;
|
|
return pos === "top" || pos === "bottom";
|
|
}
|
|
_drawArgs(offset) {
|
|
const { top, left, bottom, right, options } = this;
|
|
const align = options.align;
|
|
let rotation = 0;
|
|
let maxWidth, titleX, titleY;
|
|
if (this.isHorizontal()) {
|
|
titleX = _alignStartEnd(align, left, right);
|
|
titleY = top + offset;
|
|
maxWidth = right - left;
|
|
} else {
|
|
if (options.position === "left") {
|
|
titleX = left + offset;
|
|
titleY = _alignStartEnd(align, bottom, top);
|
|
rotation = PI * -0.5;
|
|
} else {
|
|
titleX = right - offset;
|
|
titleY = _alignStartEnd(align, top, bottom);
|
|
rotation = PI * 0.5;
|
|
}
|
|
maxWidth = bottom - top;
|
|
}
|
|
return {
|
|
titleX,
|
|
titleY,
|
|
maxWidth,
|
|
rotation
|
|
};
|
|
}
|
|
draw() {
|
|
const ctx = this.ctx;
|
|
const opts = this.options;
|
|
if (!opts.display) {
|
|
return;
|
|
}
|
|
const fontOpts = toFont(opts.font);
|
|
const lineHeight = fontOpts.lineHeight;
|
|
const offset = lineHeight / 2 + this._padding.top;
|
|
const { titleX, titleY, maxWidth, rotation } = this._drawArgs(offset);
|
|
renderText(ctx, opts.text, 0, 0, fontOpts, {
|
|
color: opts.color,
|
|
maxWidth,
|
|
rotation,
|
|
textAlign: _toLeftRightCenter(opts.align),
|
|
textBaseline: "middle",
|
|
translation: [
|
|
titleX,
|
|
titleY
|
|
]
|
|
});
|
|
}
|
|
};
|
|
function createTitle(chart, titleOpts) {
|
|
const title = new Title({
|
|
ctx: chart.ctx,
|
|
options: titleOpts,
|
|
chart
|
|
});
|
|
layouts.configure(chart, title, titleOpts);
|
|
layouts.addBox(chart, title);
|
|
chart.titleBlock = title;
|
|
}
|
|
var plugin_title = {
|
|
id: "title",
|
|
_element: Title,
|
|
start(chart, _args, options) {
|
|
createTitle(chart, options);
|
|
},
|
|
stop(chart) {
|
|
const titleBlock = chart.titleBlock;
|
|
layouts.removeBox(chart, titleBlock);
|
|
delete chart.titleBlock;
|
|
},
|
|
beforeUpdate(chart, _args, options) {
|
|
const title = chart.titleBlock;
|
|
layouts.configure(chart, title, options);
|
|
title.options = options;
|
|
},
|
|
defaults: {
|
|
align: "center",
|
|
display: false,
|
|
font: {
|
|
weight: "bold"
|
|
},
|
|
fullSize: true,
|
|
padding: 10,
|
|
position: "top",
|
|
text: "",
|
|
weight: 2e3
|
|
},
|
|
defaultRoutes: {
|
|
color: "color"
|
|
},
|
|
descriptors: {
|
|
_scriptable: true,
|
|
_indexable: false
|
|
}
|
|
};
|
|
var map2 = /* @__PURE__ */ new WeakMap();
|
|
var plugin_subtitle = {
|
|
id: "subtitle",
|
|
start(chart, _args, options) {
|
|
const title = new Title({
|
|
ctx: chart.ctx,
|
|
options,
|
|
chart
|
|
});
|
|
layouts.configure(chart, title, options);
|
|
layouts.addBox(chart, title);
|
|
map2.set(chart, title);
|
|
},
|
|
stop(chart) {
|
|
layouts.removeBox(chart, map2.get(chart));
|
|
map2.delete(chart);
|
|
},
|
|
beforeUpdate(chart, _args, options) {
|
|
const title = map2.get(chart);
|
|
layouts.configure(chart, title, options);
|
|
title.options = options;
|
|
},
|
|
defaults: {
|
|
align: "center",
|
|
display: false,
|
|
font: {
|
|
weight: "normal"
|
|
},
|
|
fullSize: true,
|
|
padding: 0,
|
|
position: "top",
|
|
text: "",
|
|
weight: 1500
|
|
},
|
|
defaultRoutes: {
|
|
color: "color"
|
|
},
|
|
descriptors: {
|
|
_scriptable: true,
|
|
_indexable: false
|
|
}
|
|
};
|
|
var positioners = {
|
|
average(items) {
|
|
if (!items.length) {
|
|
return false;
|
|
}
|
|
let i, len;
|
|
let x = 0;
|
|
let y = 0;
|
|
let count = 0;
|
|
for (i = 0, len = items.length; i < len; ++i) {
|
|
const el = items[i].element;
|
|
if (el && el.hasValue()) {
|
|
const pos = el.tooltipPosition();
|
|
x += pos.x;
|
|
y += pos.y;
|
|
++count;
|
|
}
|
|
}
|
|
return {
|
|
x: x / count,
|
|
y: y / count
|
|
};
|
|
},
|
|
nearest(items, eventPosition) {
|
|
if (!items.length) {
|
|
return false;
|
|
}
|
|
let x = eventPosition.x;
|
|
let y = eventPosition.y;
|
|
let minDistance = Number.POSITIVE_INFINITY;
|
|
let i, len, nearestElement;
|
|
for (i = 0, len = items.length; i < len; ++i) {
|
|
const el = items[i].element;
|
|
if (el && el.hasValue()) {
|
|
const center = el.getCenterPoint();
|
|
const d = distanceBetweenPoints(eventPosition, center);
|
|
if (d < minDistance) {
|
|
minDistance = d;
|
|
nearestElement = el;
|
|
}
|
|
}
|
|
}
|
|
if (nearestElement) {
|
|
const tp = nearestElement.tooltipPosition();
|
|
x = tp.x;
|
|
y = tp.y;
|
|
}
|
|
return {
|
|
x,
|
|
y
|
|
};
|
|
}
|
|
};
|
|
function pushOrConcat(base, toPush) {
|
|
if (toPush) {
|
|
if (isArray(toPush)) {
|
|
Array.prototype.push.apply(base, toPush);
|
|
} else {
|
|
base.push(toPush);
|
|
}
|
|
}
|
|
return base;
|
|
}
|
|
function splitNewlines(str) {
|
|
if ((typeof str === "string" || str instanceof String) && str.indexOf("\n") > -1) {
|
|
return str.split("\n");
|
|
}
|
|
return str;
|
|
}
|
|
function createTooltipItem(chart, item) {
|
|
const { element, datasetIndex, index } = item;
|
|
const controller = chart.getDatasetMeta(datasetIndex).controller;
|
|
const { label, value } = controller.getLabelAndValue(index);
|
|
return {
|
|
chart,
|
|
label,
|
|
parsed: controller.getParsed(index),
|
|
raw: chart.data.datasets[datasetIndex].data[index],
|
|
formattedValue: value,
|
|
dataset: controller.getDataset(),
|
|
dataIndex: index,
|
|
datasetIndex,
|
|
element
|
|
};
|
|
}
|
|
function getTooltipSize(tooltip, options) {
|
|
const ctx = tooltip.chart.ctx;
|
|
const { body, footer, title } = tooltip;
|
|
const { boxWidth, boxHeight } = options;
|
|
const bodyFont = toFont(options.bodyFont);
|
|
const titleFont = toFont(options.titleFont);
|
|
const footerFont = toFont(options.footerFont);
|
|
const titleLineCount = title.length;
|
|
const footerLineCount = footer.length;
|
|
const bodyLineItemCount = body.length;
|
|
const padding = toPadding(options.padding);
|
|
let height = padding.height;
|
|
let width = 0;
|
|
let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);
|
|
combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;
|
|
if (titleLineCount) {
|
|
height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom;
|
|
}
|
|
if (combinedBodyLength) {
|
|
const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;
|
|
height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing;
|
|
}
|
|
if (footerLineCount) {
|
|
height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing;
|
|
}
|
|
let widthPadding = 0;
|
|
const maxLineWidth = function(line) {
|
|
width = Math.max(width, ctx.measureText(line).width + widthPadding);
|
|
};
|
|
ctx.save();
|
|
ctx.font = titleFont.string;
|
|
each(tooltip.title, maxLineWidth);
|
|
ctx.font = bodyFont.string;
|
|
each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);
|
|
widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0;
|
|
each(body, (bodyItem) => {
|
|
each(bodyItem.before, maxLineWidth);
|
|
each(bodyItem.lines, maxLineWidth);
|
|
each(bodyItem.after, maxLineWidth);
|
|
});
|
|
widthPadding = 0;
|
|
ctx.font = footerFont.string;
|
|
each(tooltip.footer, maxLineWidth);
|
|
ctx.restore();
|
|
width += padding.width;
|
|
return {
|
|
width,
|
|
height
|
|
};
|
|
}
|
|
function determineYAlign(chart, size) {
|
|
const { y, height } = size;
|
|
if (y < height / 2) {
|
|
return "top";
|
|
} else if (y > chart.height - height / 2) {
|
|
return "bottom";
|
|
}
|
|
return "center";
|
|
}
|
|
function doesNotFitWithAlign(xAlign, chart, options, size) {
|
|
const { x, width } = size;
|
|
const caret = options.caretSize + options.caretPadding;
|
|
if (xAlign === "left" && x + width + caret > chart.width) {
|
|
return true;
|
|
}
|
|
if (xAlign === "right" && x - width - caret < 0) {
|
|
return true;
|
|
}
|
|
}
|
|
function determineXAlign(chart, options, size, yAlign) {
|
|
const { x, width } = size;
|
|
const { width: chartWidth, chartArea: { left, right } } = chart;
|
|
let xAlign = "center";
|
|
if (yAlign === "center") {
|
|
xAlign = x <= (left + right) / 2 ? "left" : "right";
|
|
} else if (x <= width / 2) {
|
|
xAlign = "left";
|
|
} else if (x >= chartWidth - width / 2) {
|
|
xAlign = "right";
|
|
}
|
|
if (doesNotFitWithAlign(xAlign, chart, options, size)) {
|
|
xAlign = "center";
|
|
}
|
|
return xAlign;
|
|
}
|
|
function determineAlignment(chart, options, size) {
|
|
const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);
|
|
return {
|
|
xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),
|
|
yAlign
|
|
};
|
|
}
|
|
function alignX(size, xAlign) {
|
|
let { x, width } = size;
|
|
if (xAlign === "right") {
|
|
x -= width;
|
|
} else if (xAlign === "center") {
|
|
x -= width / 2;
|
|
}
|
|
return x;
|
|
}
|
|
function alignY(size, yAlign, paddingAndSize) {
|
|
let { y, height } = size;
|
|
if (yAlign === "top") {
|
|
y += paddingAndSize;
|
|
} else if (yAlign === "bottom") {
|
|
y -= height + paddingAndSize;
|
|
} else {
|
|
y -= height / 2;
|
|
}
|
|
return y;
|
|
}
|
|
function getBackgroundPoint(options, size, alignment, chart) {
|
|
const { caretSize, caretPadding, cornerRadius } = options;
|
|
const { xAlign, yAlign } = alignment;
|
|
const paddingAndSize = caretSize + caretPadding;
|
|
const { topLeft, topRight, bottomLeft, bottomRight } = toTRBLCorners(cornerRadius);
|
|
let x = alignX(size, xAlign);
|
|
const y = alignY(size, yAlign, paddingAndSize);
|
|
if (yAlign === "center") {
|
|
if (xAlign === "left") {
|
|
x += paddingAndSize;
|
|
} else if (xAlign === "right") {
|
|
x -= paddingAndSize;
|
|
}
|
|
} else if (xAlign === "left") {
|
|
x -= Math.max(topLeft, bottomLeft) + caretSize;
|
|
} else if (xAlign === "right") {
|
|
x += Math.max(topRight, bottomRight) + caretSize;
|
|
}
|
|
return {
|
|
x: _limitValue(x, 0, chart.width - size.width),
|
|
y: _limitValue(y, 0, chart.height - size.height)
|
|
};
|
|
}
|
|
function getAlignedX(tooltip, align, options) {
|
|
const padding = toPadding(options.padding);
|
|
return align === "center" ? tooltip.x + tooltip.width / 2 : align === "right" ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left;
|
|
}
|
|
function getBeforeAfterBodyLines(callback2) {
|
|
return pushOrConcat([], splitNewlines(callback2));
|
|
}
|
|
function createTooltipContext(parent, tooltip, tooltipItems) {
|
|
return createContext(parent, {
|
|
tooltip,
|
|
tooltipItems,
|
|
type: "tooltip"
|
|
});
|
|
}
|
|
function overrideCallbacks(callbacks, context) {
|
|
const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;
|
|
return override ? callbacks.override(override) : callbacks;
|
|
}
|
|
var defaultCallbacks = {
|
|
beforeTitle: noop,
|
|
title(tooltipItems) {
|
|
if (tooltipItems.length > 0) {
|
|
const item = tooltipItems[0];
|
|
const labels = item.chart.data.labels;
|
|
const labelCount = labels ? labels.length : 0;
|
|
if (this && this.options && this.options.mode === "dataset") {
|
|
return item.dataset.label || "";
|
|
} else if (item.label) {
|
|
return item.label;
|
|
} else if (labelCount > 0 && item.dataIndex < labelCount) {
|
|
return labels[item.dataIndex];
|
|
}
|
|
}
|
|
return "";
|
|
},
|
|
afterTitle: noop,
|
|
beforeBody: noop,
|
|
beforeLabel: noop,
|
|
label(tooltipItem) {
|
|
if (this && this.options && this.options.mode === "dataset") {
|
|
return tooltipItem.label + ": " + tooltipItem.formattedValue || tooltipItem.formattedValue;
|
|
}
|
|
let label = tooltipItem.dataset.label || "";
|
|
if (label) {
|
|
label += ": ";
|
|
}
|
|
const value = tooltipItem.formattedValue;
|
|
if (!isNullOrUndef(value)) {
|
|
label += value;
|
|
}
|
|
return label;
|
|
},
|
|
labelColor(tooltipItem) {
|
|
const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);
|
|
const options = meta.controller.getStyle(tooltipItem.dataIndex);
|
|
return {
|
|
borderColor: options.borderColor,
|
|
backgroundColor: options.backgroundColor,
|
|
borderWidth: options.borderWidth,
|
|
borderDash: options.borderDash,
|
|
borderDashOffset: options.borderDashOffset,
|
|
borderRadius: 0
|
|
};
|
|
},
|
|
labelTextColor() {
|
|
return this.options.bodyColor;
|
|
},
|
|
labelPointStyle(tooltipItem) {
|
|
const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);
|
|
const options = meta.controller.getStyle(tooltipItem.dataIndex);
|
|
return {
|
|
pointStyle: options.pointStyle,
|
|
rotation: options.rotation
|
|
};
|
|
},
|
|
afterLabel: noop,
|
|
afterBody: noop,
|
|
beforeFooter: noop,
|
|
footer: noop,
|
|
afterFooter: noop
|
|
};
|
|
function invokeCallbackWithFallback(callbacks, name, ctx, arg) {
|
|
const result = callbacks[name].call(ctx, arg);
|
|
if (typeof result === "undefined") {
|
|
return defaultCallbacks[name].call(ctx, arg);
|
|
}
|
|
return result;
|
|
}
|
|
var Tooltip = class extends Element {
|
|
constructor(config) {
|
|
super();
|
|
this.opacity = 0;
|
|
this._active = [];
|
|
this._eventPosition = void 0;
|
|
this._size = void 0;
|
|
this._cachedAnimations = void 0;
|
|
this._tooltipItems = [];
|
|
this.$animations = void 0;
|
|
this.$context = void 0;
|
|
this.chart = config.chart;
|
|
this.options = config.options;
|
|
this.dataPoints = void 0;
|
|
this.title = void 0;
|
|
this.beforeBody = void 0;
|
|
this.body = void 0;
|
|
this.afterBody = void 0;
|
|
this.footer = void 0;
|
|
this.xAlign = void 0;
|
|
this.yAlign = void 0;
|
|
this.x = void 0;
|
|
this.y = void 0;
|
|
this.height = void 0;
|
|
this.width = void 0;
|
|
this.caretX = void 0;
|
|
this.caretY = void 0;
|
|
this.labelColors = void 0;
|
|
this.labelPointStyles = void 0;
|
|
this.labelTextColors = void 0;
|
|
}
|
|
initialize(options) {
|
|
this.options = options;
|
|
this._cachedAnimations = void 0;
|
|
this.$context = void 0;
|
|
}
|
|
_resolveAnimations() {
|
|
const cached = this._cachedAnimations;
|
|
if (cached) {
|
|
return cached;
|
|
}
|
|
const chart = this.chart;
|
|
const options = this.options.setContext(this.getContext());
|
|
const opts = options.enabled && chart.options.animation && options.animations;
|
|
const animations = new Animations(this.chart, opts);
|
|
if (opts._cacheable) {
|
|
this._cachedAnimations = Object.freeze(animations);
|
|
}
|
|
return animations;
|
|
}
|
|
getContext() {
|
|
return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));
|
|
}
|
|
getTitle(context, options) {
|
|
const { callbacks } = options;
|
|
const beforeTitle = invokeCallbackWithFallback(callbacks, "beforeTitle", this, context);
|
|
const title = invokeCallbackWithFallback(callbacks, "title", this, context);
|
|
const afterTitle = invokeCallbackWithFallback(callbacks, "afterTitle", this, context);
|
|
let lines = [];
|
|
lines = pushOrConcat(lines, splitNewlines(beforeTitle));
|
|
lines = pushOrConcat(lines, splitNewlines(title));
|
|
lines = pushOrConcat(lines, splitNewlines(afterTitle));
|
|
return lines;
|
|
}
|
|
getBeforeBody(tooltipItems, options) {
|
|
return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, "beforeBody", this, tooltipItems));
|
|
}
|
|
getBody(tooltipItems, options) {
|
|
const { callbacks } = options;
|
|
const bodyItems = [];
|
|
each(tooltipItems, (context) => {
|
|
const bodyItem = {
|
|
before: [],
|
|
lines: [],
|
|
after: []
|
|
};
|
|
const scoped = overrideCallbacks(callbacks, context);
|
|
pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, "beforeLabel", this, context)));
|
|
pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, "label", this, context));
|
|
pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, "afterLabel", this, context)));
|
|
bodyItems.push(bodyItem);
|
|
});
|
|
return bodyItems;
|
|
}
|
|
getAfterBody(tooltipItems, options) {
|
|
return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, "afterBody", this, tooltipItems));
|
|
}
|
|
getFooter(tooltipItems, options) {
|
|
const { callbacks } = options;
|
|
const beforeFooter = invokeCallbackWithFallback(callbacks, "beforeFooter", this, tooltipItems);
|
|
const footer = invokeCallbackWithFallback(callbacks, "footer", this, tooltipItems);
|
|
const afterFooter = invokeCallbackWithFallback(callbacks, "afterFooter", this, tooltipItems);
|
|
let lines = [];
|
|
lines = pushOrConcat(lines, splitNewlines(beforeFooter));
|
|
lines = pushOrConcat(lines, splitNewlines(footer));
|
|
lines = pushOrConcat(lines, splitNewlines(afterFooter));
|
|
return lines;
|
|
}
|
|
_createItems(options) {
|
|
const active = this._active;
|
|
const data = this.chart.data;
|
|
const labelColors = [];
|
|
const labelPointStyles = [];
|
|
const labelTextColors = [];
|
|
let tooltipItems = [];
|
|
let i, len;
|
|
for (i = 0, len = active.length; i < len; ++i) {
|
|
tooltipItems.push(createTooltipItem(this.chart, active[i]));
|
|
}
|
|
if (options.filter) {
|
|
tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));
|
|
}
|
|
if (options.itemSort) {
|
|
tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));
|
|
}
|
|
each(tooltipItems, (context) => {
|
|
const scoped = overrideCallbacks(options.callbacks, context);
|
|
labelColors.push(invokeCallbackWithFallback(scoped, "labelColor", this, context));
|
|
labelPointStyles.push(invokeCallbackWithFallback(scoped, "labelPointStyle", this, context));
|
|
labelTextColors.push(invokeCallbackWithFallback(scoped, "labelTextColor", this, context));
|
|
});
|
|
this.labelColors = labelColors;
|
|
this.labelPointStyles = labelPointStyles;
|
|
this.labelTextColors = labelTextColors;
|
|
this.dataPoints = tooltipItems;
|
|
return tooltipItems;
|
|
}
|
|
update(changed, replay) {
|
|
const options = this.options.setContext(this.getContext());
|
|
const active = this._active;
|
|
let properties;
|
|
let tooltipItems = [];
|
|
if (!active.length) {
|
|
if (this.opacity !== 0) {
|
|
properties = {
|
|
opacity: 0
|
|
};
|
|
}
|
|
} else {
|
|
const position = positioners[options.position].call(this, active, this._eventPosition);
|
|
tooltipItems = this._createItems(options);
|
|
this.title = this.getTitle(tooltipItems, options);
|
|
this.beforeBody = this.getBeforeBody(tooltipItems, options);
|
|
this.body = this.getBody(tooltipItems, options);
|
|
this.afterBody = this.getAfterBody(tooltipItems, options);
|
|
this.footer = this.getFooter(tooltipItems, options);
|
|
const size = this._size = getTooltipSize(this, options);
|
|
const positionAndSize = Object.assign({}, position, size);
|
|
const alignment = determineAlignment(this.chart, options, positionAndSize);
|
|
const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);
|
|
this.xAlign = alignment.xAlign;
|
|
this.yAlign = alignment.yAlign;
|
|
properties = {
|
|
opacity: 1,
|
|
x: backgroundPoint.x,
|
|
y: backgroundPoint.y,
|
|
width: size.width,
|
|
height: size.height,
|
|
caretX: position.x,
|
|
caretY: position.y
|
|
};
|
|
}
|
|
this._tooltipItems = tooltipItems;
|
|
this.$context = void 0;
|
|
if (properties) {
|
|
this._resolveAnimations().update(this, properties);
|
|
}
|
|
if (changed && options.external) {
|
|
options.external.call(this, {
|
|
chart: this.chart,
|
|
tooltip: this,
|
|
replay
|
|
});
|
|
}
|
|
}
|
|
drawCaret(tooltipPoint, ctx, size, options) {
|
|
const caretPosition = this.getCaretPosition(tooltipPoint, size, options);
|
|
ctx.lineTo(caretPosition.x1, caretPosition.y1);
|
|
ctx.lineTo(caretPosition.x2, caretPosition.y2);
|
|
ctx.lineTo(caretPosition.x3, caretPosition.y3);
|
|
}
|
|
getCaretPosition(tooltipPoint, size, options) {
|
|
const { xAlign, yAlign } = this;
|
|
const { caretSize, cornerRadius } = options;
|
|
const { topLeft, topRight, bottomLeft, bottomRight } = toTRBLCorners(cornerRadius);
|
|
const { x: ptX, y: ptY } = tooltipPoint;
|
|
const { width, height } = size;
|
|
let x1, x2, x3, y1, y2, y3;
|
|
if (yAlign === "center") {
|
|
y2 = ptY + height / 2;
|
|
if (xAlign === "left") {
|
|
x1 = ptX;
|
|
x2 = x1 - caretSize;
|
|
y1 = y2 + caretSize;
|
|
y3 = y2 - caretSize;
|
|
} else {
|
|
x1 = ptX + width;
|
|
x2 = x1 + caretSize;
|
|
y1 = y2 - caretSize;
|
|
y3 = y2 + caretSize;
|
|
}
|
|
x3 = x1;
|
|
} else {
|
|
if (xAlign === "left") {
|
|
x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize;
|
|
} else if (xAlign === "right") {
|
|
x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;
|
|
} else {
|
|
x2 = this.caretX;
|
|
}
|
|
if (yAlign === "top") {
|
|
y1 = ptY;
|
|
y2 = y1 - caretSize;
|
|
x1 = x2 - caretSize;
|
|
x3 = x2 + caretSize;
|
|
} else {
|
|
y1 = ptY + height;
|
|
y2 = y1 + caretSize;
|
|
x1 = x2 + caretSize;
|
|
x3 = x2 - caretSize;
|
|
}
|
|
y3 = y1;
|
|
}
|
|
return {
|
|
x1,
|
|
x2,
|
|
x3,
|
|
y1,
|
|
y2,
|
|
y3
|
|
};
|
|
}
|
|
drawTitle(pt, ctx, options) {
|
|
const title = this.title;
|
|
const length = title.length;
|
|
let titleFont, titleSpacing, i;
|
|
if (length) {
|
|
const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);
|
|
pt.x = getAlignedX(this, options.titleAlign, options);
|
|
ctx.textAlign = rtlHelper.textAlign(options.titleAlign);
|
|
ctx.textBaseline = "middle";
|
|
titleFont = toFont(options.titleFont);
|
|
titleSpacing = options.titleSpacing;
|
|
ctx.fillStyle = options.titleColor;
|
|
ctx.font = titleFont.string;
|
|
for (i = 0; i < length; ++i) {
|
|
ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);
|
|
pt.y += titleFont.lineHeight + titleSpacing;
|
|
if (i + 1 === length) {
|
|
pt.y += options.titleMarginBottom - titleSpacing;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_drawColorBox(ctx, pt, i, rtlHelper, options) {
|
|
const labelColor = this.labelColors[i];
|
|
const labelPointStyle = this.labelPointStyles[i];
|
|
const { boxHeight, boxWidth } = options;
|
|
const bodyFont = toFont(options.bodyFont);
|
|
const colorX = getAlignedX(this, "left", options);
|
|
const rtlColorX = rtlHelper.x(colorX);
|
|
const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;
|
|
const colorY = pt.y + yOffSet;
|
|
if (options.usePointStyle) {
|
|
const drawOptions = {
|
|
radius: Math.min(boxWidth, boxHeight) / 2,
|
|
pointStyle: labelPointStyle.pointStyle,
|
|
rotation: labelPointStyle.rotation,
|
|
borderWidth: 1
|
|
};
|
|
const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;
|
|
const centerY = colorY + boxHeight / 2;
|
|
ctx.strokeStyle = options.multiKeyBackground;
|
|
ctx.fillStyle = options.multiKeyBackground;
|
|
drawPoint(ctx, drawOptions, centerX, centerY);
|
|
ctx.strokeStyle = labelColor.borderColor;
|
|
ctx.fillStyle = labelColor.backgroundColor;
|
|
drawPoint(ctx, drawOptions, centerX, centerY);
|
|
} else {
|
|
ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : labelColor.borderWidth || 1;
|
|
ctx.strokeStyle = labelColor.borderColor;
|
|
ctx.setLineDash(labelColor.borderDash || []);
|
|
ctx.lineDashOffset = labelColor.borderDashOffset || 0;
|
|
const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);
|
|
const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);
|
|
const borderRadius = toTRBLCorners(labelColor.borderRadius);
|
|
if (Object.values(borderRadius).some((v) => v !== 0)) {
|
|
ctx.beginPath();
|
|
ctx.fillStyle = options.multiKeyBackground;
|
|
addRoundedRectPath(ctx, {
|
|
x: outerX,
|
|
y: colorY,
|
|
w: boxWidth,
|
|
h: boxHeight,
|
|
radius: borderRadius
|
|
});
|
|
ctx.fill();
|
|
ctx.stroke();
|
|
ctx.fillStyle = labelColor.backgroundColor;
|
|
ctx.beginPath();
|
|
addRoundedRectPath(ctx, {
|
|
x: innerX,
|
|
y: colorY + 1,
|
|
w: boxWidth - 2,
|
|
h: boxHeight - 2,
|
|
radius: borderRadius
|
|
});
|
|
ctx.fill();
|
|
} else {
|
|
ctx.fillStyle = options.multiKeyBackground;
|
|
ctx.fillRect(outerX, colorY, boxWidth, boxHeight);
|
|
ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);
|
|
ctx.fillStyle = labelColor.backgroundColor;
|
|
ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);
|
|
}
|
|
}
|
|
ctx.fillStyle = this.labelTextColors[i];
|
|
}
|
|
drawBody(pt, ctx, options) {
|
|
const { body } = this;
|
|
const { bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding } = options;
|
|
const bodyFont = toFont(options.bodyFont);
|
|
let bodyLineHeight = bodyFont.lineHeight;
|
|
let xLinePadding = 0;
|
|
const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);
|
|
const fillLineOfText = function(line) {
|
|
ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);
|
|
pt.y += bodyLineHeight + bodySpacing;
|
|
};
|
|
const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);
|
|
let bodyItem, textColor, lines, i, j, ilen, jlen;
|
|
ctx.textAlign = bodyAlign;
|
|
ctx.textBaseline = "middle";
|
|
ctx.font = bodyFont.string;
|
|
pt.x = getAlignedX(this, bodyAlignForCalculation, options);
|
|
ctx.fillStyle = options.bodyColor;
|
|
each(this.beforeBody, fillLineOfText);
|
|
xLinePadding = displayColors && bodyAlignForCalculation !== "right" ? bodyAlign === "center" ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0;
|
|
for (i = 0, ilen = body.length; i < ilen; ++i) {
|
|
bodyItem = body[i];
|
|
textColor = this.labelTextColors[i];
|
|
ctx.fillStyle = textColor;
|
|
each(bodyItem.before, fillLineOfText);
|
|
lines = bodyItem.lines;
|
|
if (displayColors && lines.length) {
|
|
this._drawColorBox(ctx, pt, i, rtlHelper, options);
|
|
bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);
|
|
}
|
|
for (j = 0, jlen = lines.length; j < jlen; ++j) {
|
|
fillLineOfText(lines[j]);
|
|
bodyLineHeight = bodyFont.lineHeight;
|
|
}
|
|
each(bodyItem.after, fillLineOfText);
|
|
}
|
|
xLinePadding = 0;
|
|
bodyLineHeight = bodyFont.lineHeight;
|
|
each(this.afterBody, fillLineOfText);
|
|
pt.y -= bodySpacing;
|
|
}
|
|
drawFooter(pt, ctx, options) {
|
|
const footer = this.footer;
|
|
const length = footer.length;
|
|
let footerFont, i;
|
|
if (length) {
|
|
const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);
|
|
pt.x = getAlignedX(this, options.footerAlign, options);
|
|
pt.y += options.footerMarginTop;
|
|
ctx.textAlign = rtlHelper.textAlign(options.footerAlign);
|
|
ctx.textBaseline = "middle";
|
|
footerFont = toFont(options.footerFont);
|
|
ctx.fillStyle = options.footerColor;
|
|
ctx.font = footerFont.string;
|
|
for (i = 0; i < length; ++i) {
|
|
ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);
|
|
pt.y += footerFont.lineHeight + options.footerSpacing;
|
|
}
|
|
}
|
|
}
|
|
drawBackground(pt, ctx, tooltipSize, options) {
|
|
const { xAlign, yAlign } = this;
|
|
const { x, y } = pt;
|
|
const { width, height } = tooltipSize;
|
|
const { topLeft, topRight, bottomLeft, bottomRight } = toTRBLCorners(options.cornerRadius);
|
|
ctx.fillStyle = options.backgroundColor;
|
|
ctx.strokeStyle = options.borderColor;
|
|
ctx.lineWidth = options.borderWidth;
|
|
ctx.beginPath();
|
|
ctx.moveTo(x + topLeft, y);
|
|
if (yAlign === "top") {
|
|
this.drawCaret(pt, ctx, tooltipSize, options);
|
|
}
|
|
ctx.lineTo(x + width - topRight, y);
|
|
ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);
|
|
if (yAlign === "center" && xAlign === "right") {
|
|
this.drawCaret(pt, ctx, tooltipSize, options);
|
|
}
|
|
ctx.lineTo(x + width, y + height - bottomRight);
|
|
ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);
|
|
if (yAlign === "bottom") {
|
|
this.drawCaret(pt, ctx, tooltipSize, options);
|
|
}
|
|
ctx.lineTo(x + bottomLeft, y + height);
|
|
ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);
|
|
if (yAlign === "center" && xAlign === "left") {
|
|
this.drawCaret(pt, ctx, tooltipSize, options);
|
|
}
|
|
ctx.lineTo(x, y + topLeft);
|
|
ctx.quadraticCurveTo(x, y, x + topLeft, y);
|
|
ctx.closePath();
|
|
ctx.fill();
|
|
if (options.borderWidth > 0) {
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
_updateAnimationTarget(options) {
|
|
const chart = this.chart;
|
|
const anims = this.$animations;
|
|
const animX = anims && anims.x;
|
|
const animY = anims && anims.y;
|
|
if (animX || animY) {
|
|
const position = positioners[options.position].call(this, this._active, this._eventPosition);
|
|
if (!position) {
|
|
return;
|
|
}
|
|
const size = this._size = getTooltipSize(this, options);
|
|
const positionAndSize = Object.assign({}, position, this._size);
|
|
const alignment = determineAlignment(chart, options, positionAndSize);
|
|
const point = getBackgroundPoint(options, positionAndSize, alignment, chart);
|
|
if (animX._to !== point.x || animY._to !== point.y) {
|
|
this.xAlign = alignment.xAlign;
|
|
this.yAlign = alignment.yAlign;
|
|
this.width = size.width;
|
|
this.height = size.height;
|
|
this.caretX = position.x;
|
|
this.caretY = position.y;
|
|
this._resolveAnimations().update(this, point);
|
|
}
|
|
}
|
|
}
|
|
_willRender() {
|
|
return !!this.opacity;
|
|
}
|
|
draw(ctx) {
|
|
const options = this.options.setContext(this.getContext());
|
|
let opacity = this.opacity;
|
|
if (!opacity) {
|
|
return;
|
|
}
|
|
this._updateAnimationTarget(options);
|
|
const tooltipSize = {
|
|
width: this.width,
|
|
height: this.height
|
|
};
|
|
const pt = {
|
|
x: this.x,
|
|
y: this.y
|
|
};
|
|
opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;
|
|
const padding = toPadding(options.padding);
|
|
const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;
|
|
if (options.enabled && hasTooltipContent) {
|
|
ctx.save();
|
|
ctx.globalAlpha = opacity;
|
|
this.drawBackground(pt, ctx, tooltipSize, options);
|
|
overrideTextDirection(ctx, options.textDirection);
|
|
pt.y += padding.top;
|
|
this.drawTitle(pt, ctx, options);
|
|
this.drawBody(pt, ctx, options);
|
|
this.drawFooter(pt, ctx, options);
|
|
restoreTextDirection(ctx, options.textDirection);
|
|
ctx.restore();
|
|
}
|
|
}
|
|
getActiveElements() {
|
|
return this._active || [];
|
|
}
|
|
setActiveElements(activeElements, eventPosition) {
|
|
const lastActive = this._active;
|
|
const active = activeElements.map(({ datasetIndex, index }) => {
|
|
const meta = this.chart.getDatasetMeta(datasetIndex);
|
|
if (!meta) {
|
|
throw new Error("Cannot find a dataset at index " + datasetIndex);
|
|
}
|
|
return {
|
|
datasetIndex,
|
|
element: meta.data[index],
|
|
index
|
|
};
|
|
});
|
|
const changed = !_elementsEqual(lastActive, active);
|
|
const positionChanged = this._positionChanged(active, eventPosition);
|
|
if (changed || positionChanged) {
|
|
this._active = active;
|
|
this._eventPosition = eventPosition;
|
|
this._ignoreReplayEvents = true;
|
|
this.update(true);
|
|
}
|
|
}
|
|
handleEvent(e, replay, inChartArea = true) {
|
|
if (replay && this._ignoreReplayEvents) {
|
|
return false;
|
|
}
|
|
this._ignoreReplayEvents = false;
|
|
const options = this.options;
|
|
const lastActive = this._active || [];
|
|
const active = this._getActiveElements(e, lastActive, replay, inChartArea);
|
|
const positionChanged = this._positionChanged(active, e);
|
|
const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;
|
|
if (changed) {
|
|
this._active = active;
|
|
if (options.enabled || options.external) {
|
|
this._eventPosition = {
|
|
x: e.x,
|
|
y: e.y
|
|
};
|
|
this.update(true, replay);
|
|
}
|
|
}
|
|
return changed;
|
|
}
|
|
_getActiveElements(e, lastActive, replay, inChartArea) {
|
|
const options = this.options;
|
|
if (e.type === "mouseout") {
|
|
return [];
|
|
}
|
|
if (!inChartArea) {
|
|
return lastActive.filter((i) => this.chart.data.datasets[i.datasetIndex] && this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== void 0);
|
|
}
|
|
const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);
|
|
if (options.reverse) {
|
|
active.reverse();
|
|
}
|
|
return active;
|
|
}
|
|
_positionChanged(active, e) {
|
|
const { caretX, caretY, options } = this;
|
|
const position = positioners[options.position].call(this, active, e);
|
|
return position !== false && (caretX !== position.x || caretY !== position.y);
|
|
}
|
|
};
|
|
__publicField(Tooltip, "positioners", positioners);
|
|
var plugin_tooltip = {
|
|
id: "tooltip",
|
|
_element: Tooltip,
|
|
positioners,
|
|
afterInit(chart, _args, options) {
|
|
if (options) {
|
|
chart.tooltip = new Tooltip({
|
|
chart,
|
|
options
|
|
});
|
|
}
|
|
},
|
|
beforeUpdate(chart, _args, options) {
|
|
if (chart.tooltip) {
|
|
chart.tooltip.initialize(options);
|
|
}
|
|
},
|
|
reset(chart, _args, options) {
|
|
if (chart.tooltip) {
|
|
chart.tooltip.initialize(options);
|
|
}
|
|
},
|
|
afterDraw(chart) {
|
|
const tooltip = chart.tooltip;
|
|
if (tooltip && tooltip._willRender()) {
|
|
const args = {
|
|
tooltip
|
|
};
|
|
if (chart.notifyPlugins("beforeTooltipDraw", {
|
|
...args,
|
|
cancelable: true
|
|
}) === false) {
|
|
return;
|
|
}
|
|
tooltip.draw(chart.ctx);
|
|
chart.notifyPlugins("afterTooltipDraw", args);
|
|
}
|
|
},
|
|
afterEvent(chart, args) {
|
|
if (chart.tooltip) {
|
|
const useFinalPosition = args.replay;
|
|
if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {
|
|
args.changed = true;
|
|
}
|
|
}
|
|
},
|
|
defaults: {
|
|
enabled: true,
|
|
external: null,
|
|
position: "average",
|
|
backgroundColor: "rgba(0,0,0,0.8)",
|
|
titleColor: "#fff",
|
|
titleFont: {
|
|
weight: "bold"
|
|
},
|
|
titleSpacing: 2,
|
|
titleMarginBottom: 6,
|
|
titleAlign: "left",
|
|
bodyColor: "#fff",
|
|
bodySpacing: 2,
|
|
bodyFont: {},
|
|
bodyAlign: "left",
|
|
footerColor: "#fff",
|
|
footerSpacing: 2,
|
|
footerMarginTop: 6,
|
|
footerFont: {
|
|
weight: "bold"
|
|
},
|
|
footerAlign: "left",
|
|
padding: 6,
|
|
caretPadding: 2,
|
|
caretSize: 5,
|
|
cornerRadius: 6,
|
|
boxHeight: (ctx, opts) => opts.bodyFont.size,
|
|
boxWidth: (ctx, opts) => opts.bodyFont.size,
|
|
multiKeyBackground: "#fff",
|
|
displayColors: true,
|
|
boxPadding: 0,
|
|
borderColor: "rgba(0,0,0,0)",
|
|
borderWidth: 0,
|
|
animation: {
|
|
duration: 400,
|
|
easing: "easeOutQuart"
|
|
},
|
|
animations: {
|
|
numbers: {
|
|
type: "number",
|
|
properties: [
|
|
"x",
|
|
"y",
|
|
"width",
|
|
"height",
|
|
"caretX",
|
|
"caretY"
|
|
]
|
|
},
|
|
opacity: {
|
|
easing: "linear",
|
|
duration: 200
|
|
}
|
|
},
|
|
callbacks: defaultCallbacks
|
|
},
|
|
defaultRoutes: {
|
|
bodyFont: "font",
|
|
footerFont: "font",
|
|
titleFont: "font"
|
|
},
|
|
descriptors: {
|
|
_scriptable: (name) => name !== "filter" && name !== "itemSort" && name !== "external",
|
|
_indexable: false,
|
|
callbacks: {
|
|
_scriptable: false,
|
|
_indexable: false
|
|
},
|
|
animation: {
|
|
_fallback: false
|
|
},
|
|
animations: {
|
|
_fallback: "animation"
|
|
}
|
|
},
|
|
additionalOptionScopes: [
|
|
"interaction"
|
|
]
|
|
};
|
|
var addIfString = (labels, raw, index, addedLabels) => {
|
|
if (typeof raw === "string") {
|
|
index = labels.push(raw) - 1;
|
|
addedLabels.unshift({
|
|
index,
|
|
label: raw
|
|
});
|
|
} else if (isNaN(raw)) {
|
|
index = null;
|
|
}
|
|
return index;
|
|
};
|
|
function findOrAddLabel(labels, raw, index, addedLabels) {
|
|
const first = labels.indexOf(raw);
|
|
if (first === -1) {
|
|
return addIfString(labels, raw, index, addedLabels);
|
|
}
|
|
const last = labels.lastIndexOf(raw);
|
|
return first !== last ? index : first;
|
|
}
|
|
var validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);
|
|
function _getLabelForValue(value) {
|
|
const labels = this.getLabels();
|
|
if (value >= 0 && value < labels.length) {
|
|
return labels[value];
|
|
}
|
|
return value;
|
|
}
|
|
var CategoryScale = class extends Scale {
|
|
constructor(cfg) {
|
|
super(cfg);
|
|
this._startValue = void 0;
|
|
this._valueRange = 0;
|
|
this._addedLabels = [];
|
|
}
|
|
init(scaleOptions) {
|
|
const added = this._addedLabels;
|
|
if (added.length) {
|
|
const labels = this.getLabels();
|
|
for (const { index, label } of added) {
|
|
if (labels[index] === label) {
|
|
labels.splice(index, 1);
|
|
}
|
|
}
|
|
this._addedLabels = [];
|
|
}
|
|
super.init(scaleOptions);
|
|
}
|
|
parse(raw, index) {
|
|
if (isNullOrUndef(raw)) {
|
|
return null;
|
|
}
|
|
const labels = this.getLabels();
|
|
index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);
|
|
return validIndex(index, labels.length - 1);
|
|
}
|
|
determineDataLimits() {
|
|
const { minDefined, maxDefined } = this.getUserBounds();
|
|
let { min, max } = this.getMinMax(true);
|
|
if (this.options.bounds === "ticks") {
|
|
if (!minDefined) {
|
|
min = 0;
|
|
}
|
|
if (!maxDefined) {
|
|
max = this.getLabels().length - 1;
|
|
}
|
|
}
|
|
this.min = min;
|
|
this.max = max;
|
|
}
|
|
buildTicks() {
|
|
const min = this.min;
|
|
const max = this.max;
|
|
const offset = this.options.offset;
|
|
const ticks = [];
|
|
let labels = this.getLabels();
|
|
labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1);
|
|
this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);
|
|
this._startValue = this.min - (offset ? 0.5 : 0);
|
|
for (let value = min; value <= max; value++) {
|
|
ticks.push({
|
|
value
|
|
});
|
|
}
|
|
return ticks;
|
|
}
|
|
getLabelForValue(value) {
|
|
return _getLabelForValue.call(this, value);
|
|
}
|
|
configure() {
|
|
super.configure();
|
|
if (!this.isHorizontal()) {
|
|
this._reversePixels = !this._reversePixels;
|
|
}
|
|
}
|
|
getPixelForValue(value) {
|
|
if (typeof value !== "number") {
|
|
value = this.parse(value);
|
|
}
|
|
return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);
|
|
}
|
|
getPixelForTick(index) {
|
|
const ticks = this.ticks;
|
|
if (index < 0 || index > ticks.length - 1) {
|
|
return null;
|
|
}
|
|
return this.getPixelForValue(ticks[index].value);
|
|
}
|
|
getValueForPixel(pixel) {
|
|
return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);
|
|
}
|
|
getBasePixel() {
|
|
return this.bottom;
|
|
}
|
|
};
|
|
__publicField(CategoryScale, "id", "category");
|
|
__publicField(CategoryScale, "defaults", {
|
|
ticks: {
|
|
callback: _getLabelForValue
|
|
}
|
|
});
|
|
function generateTicks$1(generationOptions, dataRange) {
|
|
const ticks = [];
|
|
const MIN_SPACING = 1e-14;
|
|
const { bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds } = generationOptions;
|
|
const unit = step || 1;
|
|
const maxSpaces = maxTicks - 1;
|
|
const { min: rmin, max: rmax } = dataRange;
|
|
const minDefined = !isNullOrUndef(min);
|
|
const maxDefined = !isNullOrUndef(max);
|
|
const countDefined = !isNullOrUndef(count);
|
|
const minSpacing = (rmax - rmin) / (maxDigits + 1);
|
|
let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;
|
|
let factor, niceMin, niceMax, numSpaces;
|
|
if (spacing < MIN_SPACING && !minDefined && !maxDefined) {
|
|
return [
|
|
{
|
|
value: rmin
|
|
},
|
|
{
|
|
value: rmax
|
|
}
|
|
];
|
|
}
|
|
numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);
|
|
if (numSpaces > maxSpaces) {
|
|
spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;
|
|
}
|
|
if (!isNullOrUndef(precision)) {
|
|
factor = Math.pow(10, precision);
|
|
spacing = Math.ceil(spacing * factor) / factor;
|
|
}
|
|
if (bounds === "ticks") {
|
|
niceMin = Math.floor(rmin / spacing) * spacing;
|
|
niceMax = Math.ceil(rmax / spacing) * spacing;
|
|
} else {
|
|
niceMin = rmin;
|
|
niceMax = rmax;
|
|
}
|
|
if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1e3)) {
|
|
numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));
|
|
spacing = (max - min) / numSpaces;
|
|
niceMin = min;
|
|
niceMax = max;
|
|
} else if (countDefined) {
|
|
niceMin = minDefined ? min : niceMin;
|
|
niceMax = maxDefined ? max : niceMax;
|
|
numSpaces = count - 1;
|
|
spacing = (niceMax - niceMin) / numSpaces;
|
|
} else {
|
|
numSpaces = (niceMax - niceMin) / spacing;
|
|
if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1e3)) {
|
|
numSpaces = Math.round(numSpaces);
|
|
} else {
|
|
numSpaces = Math.ceil(numSpaces);
|
|
}
|
|
}
|
|
const decimalPlaces = Math.max(_decimalPlaces(spacing), _decimalPlaces(niceMin));
|
|
factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);
|
|
niceMin = Math.round(niceMin * factor) / factor;
|
|
niceMax = Math.round(niceMax * factor) / factor;
|
|
let j = 0;
|
|
if (minDefined) {
|
|
if (includeBounds && niceMin !== min) {
|
|
ticks.push({
|
|
value: min
|
|
});
|
|
if (niceMin < min) {
|
|
j++;
|
|
}
|
|
if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {
|
|
j++;
|
|
}
|
|
} else if (niceMin < min) {
|
|
j++;
|
|
}
|
|
}
|
|
for (; j < numSpaces; ++j) {
|
|
const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;
|
|
if (maxDefined && tickValue > max) {
|
|
break;
|
|
}
|
|
ticks.push({
|
|
value: tickValue
|
|
});
|
|
}
|
|
if (maxDefined && includeBounds && niceMax !== max) {
|
|
if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {
|
|
ticks[ticks.length - 1].value = max;
|
|
} else {
|
|
ticks.push({
|
|
value: max
|
|
});
|
|
}
|
|
} else if (!maxDefined || niceMax === max) {
|
|
ticks.push({
|
|
value: niceMax
|
|
});
|
|
}
|
|
return ticks;
|
|
}
|
|
function relativeLabelSize(value, minSpacing, { horizontal, minRotation }) {
|
|
const rad = toRadians(minRotation);
|
|
const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 1e-3;
|
|
const length = 0.75 * minSpacing * ("" + value).length;
|
|
return Math.min(minSpacing / ratio, length);
|
|
}
|
|
var LinearScaleBase = class extends Scale {
|
|
constructor(cfg) {
|
|
super(cfg);
|
|
this.start = void 0;
|
|
this.end = void 0;
|
|
this._startValue = void 0;
|
|
this._endValue = void 0;
|
|
this._valueRange = 0;
|
|
}
|
|
parse(raw, index) {
|
|
if (isNullOrUndef(raw)) {
|
|
return null;
|
|
}
|
|
if ((typeof raw === "number" || raw instanceof Number) && !isFinite(+raw)) {
|
|
return null;
|
|
}
|
|
return +raw;
|
|
}
|
|
handleTickRangeOptions() {
|
|
const { beginAtZero } = this.options;
|
|
const { minDefined, maxDefined } = this.getUserBounds();
|
|
let { min, max } = this;
|
|
const setMin = (v) => min = minDefined ? min : v;
|
|
const setMax = (v) => max = maxDefined ? max : v;
|
|
if (beginAtZero) {
|
|
const minSign = sign(min);
|
|
const maxSign = sign(max);
|
|
if (minSign < 0 && maxSign < 0) {
|
|
setMax(0);
|
|
} else if (minSign > 0 && maxSign > 0) {
|
|
setMin(0);
|
|
}
|
|
}
|
|
if (min === max) {
|
|
let offset = max === 0 ? 1 : Math.abs(max * 0.05);
|
|
setMax(max + offset);
|
|
if (!beginAtZero) {
|
|
setMin(min - offset);
|
|
}
|
|
}
|
|
this.min = min;
|
|
this.max = max;
|
|
}
|
|
getTickLimit() {
|
|
const tickOpts = this.options.ticks;
|
|
let { maxTicksLimit, stepSize } = tickOpts;
|
|
let maxTicks;
|
|
if (stepSize) {
|
|
maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;
|
|
if (maxTicks > 1e3) {
|
|
console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);
|
|
maxTicks = 1e3;
|
|
}
|
|
} else {
|
|
maxTicks = this.computeTickLimit();
|
|
maxTicksLimit = maxTicksLimit || 11;
|
|
}
|
|
if (maxTicksLimit) {
|
|
maxTicks = Math.min(maxTicksLimit, maxTicks);
|
|
}
|
|
return maxTicks;
|
|
}
|
|
computeTickLimit() {
|
|
return Number.POSITIVE_INFINITY;
|
|
}
|
|
buildTicks() {
|
|
const opts = this.options;
|
|
const tickOpts = opts.ticks;
|
|
let maxTicks = this.getTickLimit();
|
|
maxTicks = Math.max(2, maxTicks);
|
|
const numericGeneratorOptions = {
|
|
maxTicks,
|
|
bounds: opts.bounds,
|
|
min: opts.min,
|
|
max: opts.max,
|
|
precision: tickOpts.precision,
|
|
step: tickOpts.stepSize,
|
|
count: tickOpts.count,
|
|
maxDigits: this._maxDigits(),
|
|
horizontal: this.isHorizontal(),
|
|
minRotation: tickOpts.minRotation || 0,
|
|
includeBounds: tickOpts.includeBounds !== false
|
|
};
|
|
const dataRange = this._range || this;
|
|
const ticks = generateTicks$1(numericGeneratorOptions, dataRange);
|
|
if (opts.bounds === "ticks") {
|
|
_setMinAndMaxByKey(ticks, this, "value");
|
|
}
|
|
if (opts.reverse) {
|
|
ticks.reverse();
|
|
this.start = this.max;
|
|
this.end = this.min;
|
|
} else {
|
|
this.start = this.min;
|
|
this.end = this.max;
|
|
}
|
|
return ticks;
|
|
}
|
|
configure() {
|
|
const ticks = this.ticks;
|
|
let start = this.min;
|
|
let end = this.max;
|
|
super.configure();
|
|
if (this.options.offset && ticks.length) {
|
|
const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;
|
|
start -= offset;
|
|
end += offset;
|
|
}
|
|
this._startValue = start;
|
|
this._endValue = end;
|
|
this._valueRange = end - start;
|
|
}
|
|
getLabelForValue(value) {
|
|
return formatNumber(value, this.chart.options.locale, this.options.ticks.format);
|
|
}
|
|
};
|
|
var LinearScale = class extends LinearScaleBase {
|
|
determineDataLimits() {
|
|
const { min, max } = this.getMinMax(true);
|
|
this.min = isNumberFinite(min) ? min : 0;
|
|
this.max = isNumberFinite(max) ? max : 1;
|
|
this.handleTickRangeOptions();
|
|
}
|
|
computeTickLimit() {
|
|
const horizontal = this.isHorizontal();
|
|
const length = horizontal ? this.width : this.height;
|
|
const minRotation = toRadians(this.options.ticks.minRotation);
|
|
const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 1e-3;
|
|
const tickFont = this._resolveTickFontOptions(0);
|
|
return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));
|
|
}
|
|
getPixelForValue(value) {
|
|
return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);
|
|
}
|
|
getValueForPixel(pixel) {
|
|
return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;
|
|
}
|
|
};
|
|
__publicField(LinearScale, "id", "linear");
|
|
__publicField(LinearScale, "defaults", {
|
|
ticks: {
|
|
callback: Ticks.formatters.numeric
|
|
}
|
|
});
|
|
var log10Floor = (v) => Math.floor(log10(v));
|
|
var changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);
|
|
function isMajor(tickVal) {
|
|
const remain = tickVal / Math.pow(10, log10Floor(tickVal));
|
|
return remain === 1;
|
|
}
|
|
function steps(min, max, rangeExp) {
|
|
const rangeStep = Math.pow(10, rangeExp);
|
|
const start = Math.floor(min / rangeStep);
|
|
const end = Math.ceil(max / rangeStep);
|
|
return end - start;
|
|
}
|
|
function startExp(min, max) {
|
|
const range = max - min;
|
|
let rangeExp = log10Floor(range);
|
|
while (steps(min, max, rangeExp) > 10) {
|
|
rangeExp++;
|
|
}
|
|
while (steps(min, max, rangeExp) < 10) {
|
|
rangeExp--;
|
|
}
|
|
return Math.min(rangeExp, log10Floor(min));
|
|
}
|
|
function generateTicks(generationOptions, { min, max }) {
|
|
min = finiteOrDefault(generationOptions.min, min);
|
|
const ticks = [];
|
|
const minExp = log10Floor(min);
|
|
let exp = startExp(min, max);
|
|
let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;
|
|
const stepSize = Math.pow(10, exp);
|
|
const base = minExp > exp ? Math.pow(10, minExp) : 0;
|
|
const start = Math.round((min - base) * precision) / precision;
|
|
const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;
|
|
let significand = Math.floor((start - offset) / Math.pow(10, exp));
|
|
let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);
|
|
while (value < max) {
|
|
ticks.push({
|
|
value,
|
|
major: isMajor(value),
|
|
significand
|
|
});
|
|
if (significand >= 10) {
|
|
significand = significand < 15 ? 15 : 20;
|
|
} else {
|
|
significand++;
|
|
}
|
|
if (significand >= 20) {
|
|
exp++;
|
|
significand = 2;
|
|
precision = exp >= 0 ? 1 : precision;
|
|
}
|
|
value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;
|
|
}
|
|
const lastTick = finiteOrDefault(generationOptions.max, value);
|
|
ticks.push({
|
|
value: lastTick,
|
|
major: isMajor(lastTick),
|
|
significand
|
|
});
|
|
return ticks;
|
|
}
|
|
var LogarithmicScale = class extends Scale {
|
|
constructor(cfg) {
|
|
super(cfg);
|
|
this.start = void 0;
|
|
this.end = void 0;
|
|
this._startValue = void 0;
|
|
this._valueRange = 0;
|
|
}
|
|
parse(raw, index) {
|
|
const value = LinearScaleBase.prototype.parse.apply(this, [
|
|
raw,
|
|
index
|
|
]);
|
|
if (value === 0) {
|
|
this._zero = true;
|
|
return void 0;
|
|
}
|
|
return isNumberFinite(value) && value > 0 ? value : null;
|
|
}
|
|
determineDataLimits() {
|
|
const { min, max } = this.getMinMax(true);
|
|
this.min = isNumberFinite(min) ? Math.max(0, min) : null;
|
|
this.max = isNumberFinite(max) ? Math.max(0, max) : null;
|
|
if (this.options.beginAtZero) {
|
|
this._zero = true;
|
|
}
|
|
if (this._zero && this.min !== this._suggestedMin && !isNumberFinite(this._userMin)) {
|
|
this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);
|
|
}
|
|
this.handleTickRangeOptions();
|
|
}
|
|
handleTickRangeOptions() {
|
|
const { minDefined, maxDefined } = this.getUserBounds();
|
|
let min = this.min;
|
|
let max = this.max;
|
|
const setMin = (v) => min = minDefined ? min : v;
|
|
const setMax = (v) => max = maxDefined ? max : v;
|
|
if (min === max) {
|
|
if (min <= 0) {
|
|
setMin(1);
|
|
setMax(10);
|
|
} else {
|
|
setMin(changeExponent(min, -1));
|
|
setMax(changeExponent(max, 1));
|
|
}
|
|
}
|
|
if (min <= 0) {
|
|
setMin(changeExponent(max, -1));
|
|
}
|
|
if (max <= 0) {
|
|
setMax(changeExponent(min, 1));
|
|
}
|
|
this.min = min;
|
|
this.max = max;
|
|
}
|
|
buildTicks() {
|
|
const opts = this.options;
|
|
const generationOptions = {
|
|
min: this._userMin,
|
|
max: this._userMax
|
|
};
|
|
const ticks = generateTicks(generationOptions, this);
|
|
if (opts.bounds === "ticks") {
|
|
_setMinAndMaxByKey(ticks, this, "value");
|
|
}
|
|
if (opts.reverse) {
|
|
ticks.reverse();
|
|
this.start = this.max;
|
|
this.end = this.min;
|
|
} else {
|
|
this.start = this.min;
|
|
this.end = this.max;
|
|
}
|
|
return ticks;
|
|
}
|
|
getLabelForValue(value) {
|
|
return value === void 0 ? "0" : formatNumber(value, this.chart.options.locale, this.options.ticks.format);
|
|
}
|
|
configure() {
|
|
const start = this.min;
|
|
super.configure();
|
|
this._startValue = log10(start);
|
|
this._valueRange = log10(this.max) - log10(start);
|
|
}
|
|
getPixelForValue(value) {
|
|
if (value === void 0 || value === 0) {
|
|
value = this.min;
|
|
}
|
|
if (value === null || isNaN(value)) {
|
|
return NaN;
|
|
}
|
|
return this.getPixelForDecimal(value === this.min ? 0 : (log10(value) - this._startValue) / this._valueRange);
|
|
}
|
|
getValueForPixel(pixel) {
|
|
const decimal = this.getDecimalForPixel(pixel);
|
|
return Math.pow(10, this._startValue + decimal * this._valueRange);
|
|
}
|
|
};
|
|
__publicField(LogarithmicScale, "id", "logarithmic");
|
|
__publicField(LogarithmicScale, "defaults", {
|
|
ticks: {
|
|
callback: Ticks.formatters.logarithmic,
|
|
major: {
|
|
enabled: true
|
|
}
|
|
}
|
|
});
|
|
function getTickBackdropHeight(opts) {
|
|
const tickOpts = opts.ticks;
|
|
if (tickOpts.display && opts.display) {
|
|
const padding = toPadding(tickOpts.backdropPadding);
|
|
return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;
|
|
}
|
|
return 0;
|
|
}
|
|
function measureLabelSize(ctx, font, label) {
|
|
label = isArray(label) ? label : [
|
|
label
|
|
];
|
|
return {
|
|
w: _longestText(ctx, font.string, label),
|
|
h: label.length * font.lineHeight
|
|
};
|
|
}
|
|
function determineLimits(angle, pos, size, min, max) {
|
|
if (angle === min || angle === max) {
|
|
return {
|
|
start: pos - size / 2,
|
|
end: pos + size / 2
|
|
};
|
|
} else if (angle < min || angle > max) {
|
|
return {
|
|
start: pos - size,
|
|
end: pos
|
|
};
|
|
}
|
|
return {
|
|
start: pos,
|
|
end: pos + size
|
|
};
|
|
}
|
|
function fitWithPointLabels(scale) {
|
|
const orig = {
|
|
l: scale.left + scale._padding.left,
|
|
r: scale.right - scale._padding.right,
|
|
t: scale.top + scale._padding.top,
|
|
b: scale.bottom - scale._padding.bottom
|
|
};
|
|
const limits = Object.assign({}, orig);
|
|
const labelSizes = [];
|
|
const padding = [];
|
|
const valueCount = scale._pointLabels.length;
|
|
const pointLabelOpts = scale.options.pointLabels;
|
|
const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;
|
|
for (let i = 0; i < valueCount; i++) {
|
|
const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));
|
|
padding[i] = opts.padding;
|
|
const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);
|
|
const plFont = toFont(opts.font);
|
|
const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);
|
|
labelSizes[i] = textSize;
|
|
const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);
|
|
const angle = Math.round(toDegrees(angleRadians));
|
|
const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);
|
|
const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);
|
|
updateLimits(limits, orig, angleRadians, hLimits, vLimits);
|
|
}
|
|
scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b);
|
|
scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);
|
|
}
|
|
function updateLimits(limits, orig, angle, hLimits, vLimits) {
|
|
const sin = Math.abs(Math.sin(angle));
|
|
const cos = Math.abs(Math.cos(angle));
|
|
let x = 0;
|
|
let y = 0;
|
|
if (hLimits.start < orig.l) {
|
|
x = (orig.l - hLimits.start) / sin;
|
|
limits.l = Math.min(limits.l, orig.l - x);
|
|
} else if (hLimits.end > orig.r) {
|
|
x = (hLimits.end - orig.r) / sin;
|
|
limits.r = Math.max(limits.r, orig.r + x);
|
|
}
|
|
if (vLimits.start < orig.t) {
|
|
y = (orig.t - vLimits.start) / cos;
|
|
limits.t = Math.min(limits.t, orig.t - y);
|
|
} else if (vLimits.end > orig.b) {
|
|
y = (vLimits.end - orig.b) / cos;
|
|
limits.b = Math.max(limits.b, orig.b + y);
|
|
}
|
|
}
|
|
function createPointLabelItem(scale, index, itemOpts) {
|
|
const outerDistance = scale.drawingArea;
|
|
const { extra, additionalAngle, padding, size } = itemOpts;
|
|
const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);
|
|
const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));
|
|
const y = yForAngle(pointLabelPosition.y, size.h, angle);
|
|
const textAlign = getTextAlignForAngle(angle);
|
|
const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);
|
|
return {
|
|
visible: true,
|
|
x: pointLabelPosition.x,
|
|
y,
|
|
textAlign,
|
|
left,
|
|
top: y,
|
|
right: left + size.w,
|
|
bottom: y + size.h
|
|
};
|
|
}
|
|
function isNotOverlapped(item, area) {
|
|
if (!area) {
|
|
return true;
|
|
}
|
|
const { left, top, right, bottom } = item;
|
|
const apexesInArea = _isPointInArea({
|
|
x: left,
|
|
y: top
|
|
}, area) || _isPointInArea({
|
|
x: left,
|
|
y: bottom
|
|
}, area) || _isPointInArea({
|
|
x: right,
|
|
y: top
|
|
}, area) || _isPointInArea({
|
|
x: right,
|
|
y: bottom
|
|
}, area);
|
|
return !apexesInArea;
|
|
}
|
|
function buildPointLabelItems(scale, labelSizes, padding) {
|
|
const items = [];
|
|
const valueCount = scale._pointLabels.length;
|
|
const opts = scale.options;
|
|
const { centerPointLabels, display } = opts.pointLabels;
|
|
const itemOpts = {
|
|
extra: getTickBackdropHeight(opts) / 2,
|
|
additionalAngle: centerPointLabels ? PI / valueCount : 0
|
|
};
|
|
let area;
|
|
for (let i = 0; i < valueCount; i++) {
|
|
itemOpts.padding = padding[i];
|
|
itemOpts.size = labelSizes[i];
|
|
const item = createPointLabelItem(scale, i, itemOpts);
|
|
items.push(item);
|
|
if (display === "auto") {
|
|
item.visible = isNotOverlapped(item, area);
|
|
if (item.visible) {
|
|
area = item;
|
|
}
|
|
}
|
|
}
|
|
return items;
|
|
}
|
|
function getTextAlignForAngle(angle) {
|
|
if (angle === 0 || angle === 180) {
|
|
return "center";
|
|
} else if (angle < 180) {
|
|
return "left";
|
|
}
|
|
return "right";
|
|
}
|
|
function leftForTextAlign(x, w, align) {
|
|
if (align === "right") {
|
|
x -= w;
|
|
} else if (align === "center") {
|
|
x -= w / 2;
|
|
}
|
|
return x;
|
|
}
|
|
function yForAngle(y, h4, angle) {
|
|
if (angle === 90 || angle === 270) {
|
|
y -= h4 / 2;
|
|
} else if (angle > 270 || angle < 90) {
|
|
y -= h4;
|
|
}
|
|
return y;
|
|
}
|
|
function drawPointLabelBox(ctx, opts, item) {
|
|
const { left, top, right, bottom } = item;
|
|
const { backdropColor } = opts;
|
|
if (!isNullOrUndef(backdropColor)) {
|
|
const borderRadius = toTRBLCorners(opts.borderRadius);
|
|
const padding = toPadding(opts.backdropPadding);
|
|
ctx.fillStyle = backdropColor;
|
|
const backdropLeft = left - padding.left;
|
|
const backdropTop = top - padding.top;
|
|
const backdropWidth = right - left + padding.width;
|
|
const backdropHeight = bottom - top + padding.height;
|
|
if (Object.values(borderRadius).some((v) => v !== 0)) {
|
|
ctx.beginPath();
|
|
addRoundedRectPath(ctx, {
|
|
x: backdropLeft,
|
|
y: backdropTop,
|
|
w: backdropWidth,
|
|
h: backdropHeight,
|
|
radius: borderRadius
|
|
});
|
|
ctx.fill();
|
|
} else {
|
|
ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);
|
|
}
|
|
}
|
|
}
|
|
function drawPointLabels(scale, labelCount) {
|
|
const { ctx, options: { pointLabels } } = scale;
|
|
for (let i = labelCount - 1; i >= 0; i--) {
|
|
const item = scale._pointLabelItems[i];
|
|
if (!item.visible) {
|
|
continue;
|
|
}
|
|
const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));
|
|
drawPointLabelBox(ctx, optsAtIndex, item);
|
|
const plFont = toFont(optsAtIndex.font);
|
|
const { x, y, textAlign } = item;
|
|
renderText(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, {
|
|
color: optsAtIndex.color,
|
|
textAlign,
|
|
textBaseline: "middle"
|
|
});
|
|
}
|
|
}
|
|
function pathRadiusLine(scale, radius, circular, labelCount) {
|
|
const { ctx } = scale;
|
|
if (circular) {
|
|
ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);
|
|
} else {
|
|
let pointPosition = scale.getPointPosition(0, radius);
|
|
ctx.moveTo(pointPosition.x, pointPosition.y);
|
|
for (let i = 1; i < labelCount; i++) {
|
|
pointPosition = scale.getPointPosition(i, radius);
|
|
ctx.lineTo(pointPosition.x, pointPosition.y);
|
|
}
|
|
}
|
|
}
|
|
function drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {
|
|
const ctx = scale.ctx;
|
|
const circular = gridLineOpts.circular;
|
|
const { color: color2, lineWidth } = gridLineOpts;
|
|
if (!circular && !labelCount || !color2 || !lineWidth || radius < 0) {
|
|
return;
|
|
}
|
|
ctx.save();
|
|
ctx.strokeStyle = color2;
|
|
ctx.lineWidth = lineWidth;
|
|
ctx.setLineDash(borderOpts.dash);
|
|
ctx.lineDashOffset = borderOpts.dashOffset;
|
|
ctx.beginPath();
|
|
pathRadiusLine(scale, radius, circular, labelCount);
|
|
ctx.closePath();
|
|
ctx.stroke();
|
|
ctx.restore();
|
|
}
|
|
function createPointLabelContext(parent, index, label) {
|
|
return createContext(parent, {
|
|
label,
|
|
index,
|
|
type: "pointLabel"
|
|
});
|
|
}
|
|
var RadialLinearScale = class extends LinearScaleBase {
|
|
constructor(cfg) {
|
|
super(cfg);
|
|
this.xCenter = void 0;
|
|
this.yCenter = void 0;
|
|
this.drawingArea = void 0;
|
|
this._pointLabels = [];
|
|
this._pointLabelItems = [];
|
|
}
|
|
setDimensions() {
|
|
const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);
|
|
const w = this.width = this.maxWidth - padding.width;
|
|
const h4 = this.height = this.maxHeight - padding.height;
|
|
this.xCenter = Math.floor(this.left + w / 2 + padding.left);
|
|
this.yCenter = Math.floor(this.top + h4 / 2 + padding.top);
|
|
this.drawingArea = Math.floor(Math.min(w, h4) / 2);
|
|
}
|
|
determineDataLimits() {
|
|
const { min, max } = this.getMinMax(false);
|
|
this.min = isNumberFinite(min) && !isNaN(min) ? min : 0;
|
|
this.max = isNumberFinite(max) && !isNaN(max) ? max : 0;
|
|
this.handleTickRangeOptions();
|
|
}
|
|
computeTickLimit() {
|
|
return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));
|
|
}
|
|
generateTickLabels(ticks) {
|
|
LinearScaleBase.prototype.generateTickLabels.call(this, ticks);
|
|
this._pointLabels = this.getLabels().map((value, index) => {
|
|
const label = callback(this.options.pointLabels.callback, [
|
|
value,
|
|
index
|
|
], this);
|
|
return label || label === 0 ? label : "";
|
|
}).filter((v, i) => this.chart.getDataVisibility(i));
|
|
}
|
|
fit() {
|
|
const opts = this.options;
|
|
if (opts.display && opts.pointLabels.display) {
|
|
fitWithPointLabels(this);
|
|
} else {
|
|
this.setCenterPoint(0, 0, 0, 0);
|
|
}
|
|
}
|
|
setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {
|
|
this.xCenter += Math.floor((leftMovement - rightMovement) / 2);
|
|
this.yCenter += Math.floor((topMovement - bottomMovement) / 2);
|
|
this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));
|
|
}
|
|
getIndexAngle(index) {
|
|
const angleMultiplier = TAU / (this._pointLabels.length || 1);
|
|
const startAngle = this.options.startAngle || 0;
|
|
return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));
|
|
}
|
|
getDistanceFromCenterForValue(value) {
|
|
if (isNullOrUndef(value)) {
|
|
return NaN;
|
|
}
|
|
const scalingFactor = this.drawingArea / (this.max - this.min);
|
|
if (this.options.reverse) {
|
|
return (this.max - value) * scalingFactor;
|
|
}
|
|
return (value - this.min) * scalingFactor;
|
|
}
|
|
getValueForDistanceFromCenter(distance) {
|
|
if (isNullOrUndef(distance)) {
|
|
return NaN;
|
|
}
|
|
const scaledDistance = distance / (this.drawingArea / (this.max - this.min));
|
|
return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;
|
|
}
|
|
getPointLabelContext(index) {
|
|
const pointLabels = this._pointLabels || [];
|
|
if (index >= 0 && index < pointLabels.length) {
|
|
const pointLabel = pointLabels[index];
|
|
return createPointLabelContext(this.getContext(), index, pointLabel);
|
|
}
|
|
}
|
|
getPointPosition(index, distanceFromCenter, additionalAngle = 0) {
|
|
const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;
|
|
return {
|
|
x: Math.cos(angle) * distanceFromCenter + this.xCenter,
|
|
y: Math.sin(angle) * distanceFromCenter + this.yCenter,
|
|
angle
|
|
};
|
|
}
|
|
getPointPositionForValue(index, value) {
|
|
return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));
|
|
}
|
|
getBasePosition(index) {
|
|
return this.getPointPositionForValue(index || 0, this.getBaseValue());
|
|
}
|
|
getPointLabelPosition(index) {
|
|
const { left, top, right, bottom } = this._pointLabelItems[index];
|
|
return {
|
|
left,
|
|
top,
|
|
right,
|
|
bottom
|
|
};
|
|
}
|
|
drawBackground() {
|
|
const { backgroundColor, grid: { circular } } = this.options;
|
|
if (backgroundColor) {
|
|
const ctx = this.ctx;
|
|
ctx.save();
|
|
ctx.beginPath();
|
|
pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);
|
|
ctx.closePath();
|
|
ctx.fillStyle = backgroundColor;
|
|
ctx.fill();
|
|
ctx.restore();
|
|
}
|
|
}
|
|
drawGrid() {
|
|
const ctx = this.ctx;
|
|
const opts = this.options;
|
|
const { angleLines, grid, border } = opts;
|
|
const labelCount = this._pointLabels.length;
|
|
let i, offset, position;
|
|
if (opts.pointLabels.display) {
|
|
drawPointLabels(this, labelCount);
|
|
}
|
|
if (grid.display) {
|
|
this.ticks.forEach((tick, index) => {
|
|
if (index !== 0) {
|
|
offset = this.getDistanceFromCenterForValue(tick.value);
|
|
const context = this.getContext(index);
|
|
const optsAtIndex = grid.setContext(context);
|
|
const optsAtIndexBorder = border.setContext(context);
|
|
drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);
|
|
}
|
|
});
|
|
}
|
|
if (angleLines.display) {
|
|
ctx.save();
|
|
for (i = labelCount - 1; i >= 0; i--) {
|
|
const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));
|
|
const { color: color2, lineWidth } = optsAtIndex;
|
|
if (!lineWidth || !color2) {
|
|
continue;
|
|
}
|
|
ctx.lineWidth = lineWidth;
|
|
ctx.strokeStyle = color2;
|
|
ctx.setLineDash(optsAtIndex.borderDash);
|
|
ctx.lineDashOffset = optsAtIndex.borderDashOffset;
|
|
offset = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max);
|
|
position = this.getPointPosition(i, offset);
|
|
ctx.beginPath();
|
|
ctx.moveTo(this.xCenter, this.yCenter);
|
|
ctx.lineTo(position.x, position.y);
|
|
ctx.stroke();
|
|
}
|
|
ctx.restore();
|
|
}
|
|
}
|
|
drawBorder() {
|
|
}
|
|
drawLabels() {
|
|
const ctx = this.ctx;
|
|
const opts = this.options;
|
|
const tickOpts = opts.ticks;
|
|
if (!tickOpts.display) {
|
|
return;
|
|
}
|
|
const startAngle = this.getIndexAngle(0);
|
|
let offset, width;
|
|
ctx.save();
|
|
ctx.translate(this.xCenter, this.yCenter);
|
|
ctx.rotate(startAngle);
|
|
ctx.textAlign = "center";
|
|
ctx.textBaseline = "middle";
|
|
this.ticks.forEach((tick, index) => {
|
|
if (index === 0 && !opts.reverse) {
|
|
return;
|
|
}
|
|
const optsAtIndex = tickOpts.setContext(this.getContext(index));
|
|
const tickFont = toFont(optsAtIndex.font);
|
|
offset = this.getDistanceFromCenterForValue(this.ticks[index].value);
|
|
if (optsAtIndex.showLabelBackdrop) {
|
|
ctx.font = tickFont.string;
|
|
width = ctx.measureText(tick.label).width;
|
|
ctx.fillStyle = optsAtIndex.backdropColor;
|
|
const padding = toPadding(optsAtIndex.backdropPadding);
|
|
ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height);
|
|
}
|
|
renderText(ctx, tick.label, 0, -offset, tickFont, {
|
|
color: optsAtIndex.color,
|
|
strokeColor: optsAtIndex.textStrokeColor,
|
|
strokeWidth: optsAtIndex.textStrokeWidth
|
|
});
|
|
});
|
|
ctx.restore();
|
|
}
|
|
drawTitle() {
|
|
}
|
|
};
|
|
__publicField(RadialLinearScale, "id", "radialLinear");
|
|
__publicField(RadialLinearScale, "defaults", {
|
|
display: true,
|
|
animate: true,
|
|
position: "chartArea",
|
|
angleLines: {
|
|
display: true,
|
|
lineWidth: 1,
|
|
borderDash: [],
|
|
borderDashOffset: 0
|
|
},
|
|
grid: {
|
|
circular: false
|
|
},
|
|
startAngle: 0,
|
|
ticks: {
|
|
showLabelBackdrop: true,
|
|
callback: Ticks.formatters.numeric
|
|
},
|
|
pointLabels: {
|
|
backdropColor: void 0,
|
|
backdropPadding: 2,
|
|
display: true,
|
|
font: {
|
|
size: 10
|
|
},
|
|
callback(label) {
|
|
return label;
|
|
},
|
|
padding: 5,
|
|
centerPointLabels: false
|
|
}
|
|
});
|
|
__publicField(RadialLinearScale, "defaultRoutes", {
|
|
"angleLines.color": "borderColor",
|
|
"pointLabels.color": "color",
|
|
"ticks.color": "color"
|
|
});
|
|
__publicField(RadialLinearScale, "descriptors", {
|
|
angleLines: {
|
|
_fallback: "grid"
|
|
}
|
|
});
|
|
var INTERVALS = {
|
|
millisecond: {
|
|
common: true,
|
|
size: 1,
|
|
steps: 1e3
|
|
},
|
|
second: {
|
|
common: true,
|
|
size: 1e3,
|
|
steps: 60
|
|
},
|
|
minute: {
|
|
common: true,
|
|
size: 6e4,
|
|
steps: 60
|
|
},
|
|
hour: {
|
|
common: true,
|
|
size: 36e5,
|
|
steps: 24
|
|
},
|
|
day: {
|
|
common: true,
|
|
size: 864e5,
|
|
steps: 30
|
|
},
|
|
week: {
|
|
common: false,
|
|
size: 6048e5,
|
|
steps: 4
|
|
},
|
|
month: {
|
|
common: true,
|
|
size: 2628e6,
|
|
steps: 12
|
|
},
|
|
quarter: {
|
|
common: false,
|
|
size: 7884e6,
|
|
steps: 4
|
|
},
|
|
year: {
|
|
common: true,
|
|
size: 3154e7
|
|
}
|
|
};
|
|
var UNITS = /* @__PURE__ */ Object.keys(INTERVALS);
|
|
function sorter(a, b) {
|
|
return a - b;
|
|
}
|
|
function parse(scale, input) {
|
|
if (isNullOrUndef(input)) {
|
|
return null;
|
|
}
|
|
const adapter = scale._adapter;
|
|
const { parser, round: round2, isoWeekday } = scale._parseOpts;
|
|
let value = input;
|
|
if (typeof parser === "function") {
|
|
value = parser(value);
|
|
}
|
|
if (!isNumberFinite(value)) {
|
|
value = typeof parser === "string" ? adapter.parse(value, parser) : adapter.parse(value);
|
|
}
|
|
if (value === null) {
|
|
return null;
|
|
}
|
|
if (round2) {
|
|
value = round2 === "week" && (isNumber(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, "isoWeek", isoWeekday) : adapter.startOf(value, round2);
|
|
}
|
|
return +value;
|
|
}
|
|
function determineUnitForAutoTicks(minUnit, min, max, capacity) {
|
|
const ilen = UNITS.length;
|
|
for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {
|
|
const interval = INTERVALS[UNITS[i]];
|
|
const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;
|
|
if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {
|
|
return UNITS[i];
|
|
}
|
|
}
|
|
return UNITS[ilen - 1];
|
|
}
|
|
function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {
|
|
for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {
|
|
const unit = UNITS[i];
|
|
if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {
|
|
return unit;
|
|
}
|
|
}
|
|
return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];
|
|
}
|
|
function determineMajorUnit(unit) {
|
|
for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {
|
|
if (INTERVALS[UNITS[i]].common) {
|
|
return UNITS[i];
|
|
}
|
|
}
|
|
}
|
|
function addTick(ticks, time, timestamps) {
|
|
if (!timestamps) {
|
|
ticks[time] = true;
|
|
} else if (timestamps.length) {
|
|
const { lo, hi } = _lookup(timestamps, time);
|
|
const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];
|
|
ticks[timestamp] = true;
|
|
}
|
|
}
|
|
function setMajorTicks(scale, ticks, map3, majorUnit) {
|
|
const adapter = scale._adapter;
|
|
const first = +adapter.startOf(ticks[0].value, majorUnit);
|
|
const last = ticks[ticks.length - 1].value;
|
|
let major, index;
|
|
for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {
|
|
index = map3[major];
|
|
if (index >= 0) {
|
|
ticks[index].major = true;
|
|
}
|
|
}
|
|
return ticks;
|
|
}
|
|
function ticksFromTimestamps(scale, values, majorUnit) {
|
|
const ticks = [];
|
|
const map3 = {};
|
|
const ilen = values.length;
|
|
let i, value;
|
|
for (i = 0; i < ilen; ++i) {
|
|
value = values[i];
|
|
map3[value] = i;
|
|
ticks.push({
|
|
value,
|
|
major: false
|
|
});
|
|
}
|
|
return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map3, majorUnit);
|
|
}
|
|
var TimeScale = class extends Scale {
|
|
constructor(props) {
|
|
super(props);
|
|
this._cache = {
|
|
data: [],
|
|
labels: [],
|
|
all: []
|
|
};
|
|
this._unit = "day";
|
|
this._majorUnit = void 0;
|
|
this._offsets = {};
|
|
this._normalized = false;
|
|
this._parseOpts = void 0;
|
|
}
|
|
init(scaleOpts, opts = {}) {
|
|
const time = scaleOpts.time || (scaleOpts.time = {});
|
|
const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);
|
|
adapter.init(opts);
|
|
mergeIf(time.displayFormats, adapter.formats());
|
|
this._parseOpts = {
|
|
parser: time.parser,
|
|
round: time.round,
|
|
isoWeekday: time.isoWeekday
|
|
};
|
|
super.init(scaleOpts);
|
|
this._normalized = opts.normalized;
|
|
}
|
|
parse(raw, index) {
|
|
if (raw === void 0) {
|
|
return null;
|
|
}
|
|
return parse(this, raw);
|
|
}
|
|
beforeLayout() {
|
|
super.beforeLayout();
|
|
this._cache = {
|
|
data: [],
|
|
labels: [],
|
|
all: []
|
|
};
|
|
}
|
|
determineDataLimits() {
|
|
const options = this.options;
|
|
const adapter = this._adapter;
|
|
const unit = options.time.unit || "day";
|
|
let { min, max, minDefined, maxDefined } = this.getUserBounds();
|
|
function _applyBounds(bounds) {
|
|
if (!minDefined && !isNaN(bounds.min)) {
|
|
min = Math.min(min, bounds.min);
|
|
}
|
|
if (!maxDefined && !isNaN(bounds.max)) {
|
|
max = Math.max(max, bounds.max);
|
|
}
|
|
}
|
|
if (!minDefined || !maxDefined) {
|
|
_applyBounds(this._getLabelBounds());
|
|
if (options.bounds !== "ticks" || options.ticks.source !== "labels") {
|
|
_applyBounds(this.getMinMax(false));
|
|
}
|
|
}
|
|
min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);
|
|
max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;
|
|
this.min = Math.min(min, max - 1);
|
|
this.max = Math.max(min + 1, max);
|
|
}
|
|
_getLabelBounds() {
|
|
const arr = this.getLabelTimestamps();
|
|
let min = Number.POSITIVE_INFINITY;
|
|
let max = Number.NEGATIVE_INFINITY;
|
|
if (arr.length) {
|
|
min = arr[0];
|
|
max = arr[arr.length - 1];
|
|
}
|
|
return {
|
|
min,
|
|
max
|
|
};
|
|
}
|
|
buildTicks() {
|
|
const options = this.options;
|
|
const timeOpts = options.time;
|
|
const tickOpts = options.ticks;
|
|
const timestamps = tickOpts.source === "labels" ? this.getLabelTimestamps() : this._generate();
|
|
if (options.bounds === "ticks" && timestamps.length) {
|
|
this.min = this._userMin || timestamps[0];
|
|
this.max = this._userMax || timestamps[timestamps.length - 1];
|
|
}
|
|
const min = this.min;
|
|
const max = this.max;
|
|
const ticks = _filterBetween(timestamps, min, max);
|
|
this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));
|
|
this._majorUnit = !tickOpts.major.enabled || this._unit === "year" ? void 0 : determineMajorUnit(this._unit);
|
|
this.initOffsets(timestamps);
|
|
if (options.reverse) {
|
|
ticks.reverse();
|
|
}
|
|
return ticksFromTimestamps(this, ticks, this._majorUnit);
|
|
}
|
|
afterAutoSkip() {
|
|
if (this.options.offsetAfterAutoskip) {
|
|
this.initOffsets(this.ticks.map((tick) => +tick.value));
|
|
}
|
|
}
|
|
initOffsets(timestamps = []) {
|
|
let start = 0;
|
|
let end = 0;
|
|
let first, last;
|
|
if (this.options.offset && timestamps.length) {
|
|
first = this.getDecimalForValue(timestamps[0]);
|
|
if (timestamps.length === 1) {
|
|
start = 1 - first;
|
|
} else {
|
|
start = (this.getDecimalForValue(timestamps[1]) - first) / 2;
|
|
}
|
|
last = this.getDecimalForValue(timestamps[timestamps.length - 1]);
|
|
if (timestamps.length === 1) {
|
|
end = last;
|
|
} else {
|
|
end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;
|
|
}
|
|
}
|
|
const limit = timestamps.length < 3 ? 0.5 : 0.25;
|
|
start = _limitValue(start, 0, limit);
|
|
end = _limitValue(end, 0, limit);
|
|
this._offsets = {
|
|
start,
|
|
end,
|
|
factor: 1 / (start + 1 + end)
|
|
};
|
|
}
|
|
_generate() {
|
|
const adapter = this._adapter;
|
|
const min = this.min;
|
|
const max = this.max;
|
|
const options = this.options;
|
|
const timeOpts = options.time;
|
|
const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));
|
|
const stepSize = valueOrDefault(options.ticks.stepSize, 1);
|
|
const weekday = minor === "week" ? timeOpts.isoWeekday : false;
|
|
const hasWeekday = isNumber(weekday) || weekday === true;
|
|
const ticks = {};
|
|
let first = min;
|
|
let time, count;
|
|
if (hasWeekday) {
|
|
first = +adapter.startOf(first, "isoWeek", weekday);
|
|
}
|
|
first = +adapter.startOf(first, hasWeekday ? "day" : minor);
|
|
if (adapter.diff(max, min, minor) > 1e5 * stepSize) {
|
|
throw new Error(min + " and " + max + " are too far apart with stepSize of " + stepSize + " " + minor);
|
|
}
|
|
const timestamps = options.ticks.source === "data" && this.getDataTimestamps();
|
|
for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {
|
|
addTick(ticks, time, timestamps);
|
|
}
|
|
if (time === max || options.bounds === "ticks" || count === 1) {
|
|
addTick(ticks, time, timestamps);
|
|
}
|
|
return Object.keys(ticks).sort(sorter).map((x) => +x);
|
|
}
|
|
getLabelForValue(value) {
|
|
const adapter = this._adapter;
|
|
const timeOpts = this.options.time;
|
|
if (timeOpts.tooltipFormat) {
|
|
return adapter.format(value, timeOpts.tooltipFormat);
|
|
}
|
|
return adapter.format(value, timeOpts.displayFormats.datetime);
|
|
}
|
|
format(value, format) {
|
|
const options = this.options;
|
|
const formats = options.time.displayFormats;
|
|
const unit = this._unit;
|
|
const fmt = format || formats[unit];
|
|
return this._adapter.format(value, fmt);
|
|
}
|
|
_tickFormatFunction(time, index, ticks, format) {
|
|
const options = this.options;
|
|
const formatter = options.ticks.callback;
|
|
if (formatter) {
|
|
return callback(formatter, [
|
|
time,
|
|
index,
|
|
ticks
|
|
], this);
|
|
}
|
|
const formats = options.time.displayFormats;
|
|
const unit = this._unit;
|
|
const majorUnit = this._majorUnit;
|
|
const minorFormat = unit && formats[unit];
|
|
const majorFormat = majorUnit && formats[majorUnit];
|
|
const tick = ticks[index];
|
|
const major = majorUnit && majorFormat && tick && tick.major;
|
|
return this._adapter.format(time, format || (major ? majorFormat : minorFormat));
|
|
}
|
|
generateTickLabels(ticks) {
|
|
let i, ilen, tick;
|
|
for (i = 0, ilen = ticks.length; i < ilen; ++i) {
|
|
tick = ticks[i];
|
|
tick.label = this._tickFormatFunction(tick.value, i, ticks);
|
|
}
|
|
}
|
|
getDecimalForValue(value) {
|
|
return value === null ? NaN : (value - this.min) / (this.max - this.min);
|
|
}
|
|
getPixelForValue(value) {
|
|
const offsets = this._offsets;
|
|
const pos = this.getDecimalForValue(value);
|
|
return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);
|
|
}
|
|
getValueForPixel(pixel) {
|
|
const offsets = this._offsets;
|
|
const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;
|
|
return this.min + pos * (this.max - this.min);
|
|
}
|
|
_getLabelSize(label) {
|
|
const ticksOpts = this.options.ticks;
|
|
const tickLabelWidth = this.ctx.measureText(label).width;
|
|
const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);
|
|
const cosRotation = Math.cos(angle);
|
|
const sinRotation = Math.sin(angle);
|
|
const tickFontSize = this._resolveTickFontOptions(0).size;
|
|
return {
|
|
w: tickLabelWidth * cosRotation + tickFontSize * sinRotation,
|
|
h: tickLabelWidth * sinRotation + tickFontSize * cosRotation
|
|
};
|
|
}
|
|
_getLabelCapacity(exampleTime) {
|
|
const timeOpts = this.options.time;
|
|
const displayFormats = timeOpts.displayFormats;
|
|
const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;
|
|
const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [
|
|
exampleTime
|
|
], this._majorUnit), format);
|
|
const size = this._getLabelSize(exampleLabel);
|
|
const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;
|
|
return capacity > 0 ? capacity : 1;
|
|
}
|
|
getDataTimestamps() {
|
|
let timestamps = this._cache.data || [];
|
|
let i, ilen;
|
|
if (timestamps.length) {
|
|
return timestamps;
|
|
}
|
|
const metas = this.getMatchingVisibleMetas();
|
|
if (this._normalized && metas.length) {
|
|
return this._cache.data = metas[0].controller.getAllParsedValues(this);
|
|
}
|
|
for (i = 0, ilen = metas.length; i < ilen; ++i) {
|
|
timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));
|
|
}
|
|
return this._cache.data = this.normalize(timestamps);
|
|
}
|
|
getLabelTimestamps() {
|
|
const timestamps = this._cache.labels || [];
|
|
let i, ilen;
|
|
if (timestamps.length) {
|
|
return timestamps;
|
|
}
|
|
const labels = this.getLabels();
|
|
for (i = 0, ilen = labels.length; i < ilen; ++i) {
|
|
timestamps.push(parse(this, labels[i]));
|
|
}
|
|
return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps);
|
|
}
|
|
normalize(values) {
|
|
return _arrayUnique(values.sort(sorter));
|
|
}
|
|
};
|
|
__publicField(TimeScale, "id", "time");
|
|
__publicField(TimeScale, "defaults", {
|
|
bounds: "data",
|
|
adapters: {},
|
|
time: {
|
|
parser: false,
|
|
unit: false,
|
|
round: false,
|
|
isoWeekday: false,
|
|
minUnit: "millisecond",
|
|
displayFormats: {}
|
|
},
|
|
ticks: {
|
|
source: "auto",
|
|
callback: false,
|
|
major: {
|
|
enabled: false
|
|
}
|
|
}
|
|
});
|
|
function interpolate3(table, val, reverse) {
|
|
let lo = 0;
|
|
let hi = table.length - 1;
|
|
let prevSource, nextSource, prevTarget, nextTarget;
|
|
if (reverse) {
|
|
if (val >= table[lo].pos && val <= table[hi].pos) {
|
|
({ lo, hi } = _lookupByKey(table, "pos", val));
|
|
}
|
|
({ pos: prevSource, time: prevTarget } = table[lo]);
|
|
({ pos: nextSource, time: nextTarget } = table[hi]);
|
|
} else {
|
|
if (val >= table[lo].time && val <= table[hi].time) {
|
|
({ lo, hi } = _lookupByKey(table, "time", val));
|
|
}
|
|
({ time: prevSource, pos: prevTarget } = table[lo]);
|
|
({ time: nextSource, pos: nextTarget } = table[hi]);
|
|
}
|
|
const span = nextSource - prevSource;
|
|
return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;
|
|
}
|
|
var TimeSeriesScale = class extends TimeScale {
|
|
constructor(props) {
|
|
super(props);
|
|
this._table = [];
|
|
this._minPos = void 0;
|
|
this._tableRange = void 0;
|
|
}
|
|
initOffsets() {
|
|
const timestamps = this._getTimestampsForTable();
|
|
const table = this._table = this.buildLookupTable(timestamps);
|
|
this._minPos = interpolate3(table, this.min);
|
|
this._tableRange = interpolate3(table, this.max) - this._minPos;
|
|
super.initOffsets(timestamps);
|
|
}
|
|
buildLookupTable(timestamps) {
|
|
const { min, max } = this;
|
|
const items = [];
|
|
const table = [];
|
|
let i, ilen, prev, curr, next;
|
|
for (i = 0, ilen = timestamps.length; i < ilen; ++i) {
|
|
curr = timestamps[i];
|
|
if (curr >= min && curr <= max) {
|
|
items.push(curr);
|
|
}
|
|
}
|
|
if (items.length < 2) {
|
|
return [
|
|
{
|
|
time: min,
|
|
pos: 0
|
|
},
|
|
{
|
|
time: max,
|
|
pos: 1
|
|
}
|
|
];
|
|
}
|
|
for (i = 0, ilen = items.length; i < ilen; ++i) {
|
|
next = items[i + 1];
|
|
prev = items[i - 1];
|
|
curr = items[i];
|
|
if (Math.round((next + prev) / 2) !== curr) {
|
|
table.push({
|
|
time: curr,
|
|
pos: i / (ilen - 1)
|
|
});
|
|
}
|
|
}
|
|
return table;
|
|
}
|
|
_generate() {
|
|
const min = this.min;
|
|
const max = this.max;
|
|
let timestamps = super.getDataTimestamps();
|
|
if (!timestamps.includes(min) || !timestamps.length) {
|
|
timestamps.splice(0, 0, min);
|
|
}
|
|
if (!timestamps.includes(max) || timestamps.length === 1) {
|
|
timestamps.push(max);
|
|
}
|
|
return timestamps.sort((a, b) => a - b);
|
|
}
|
|
_getTimestampsForTable() {
|
|
let timestamps = this._cache.all || [];
|
|
if (timestamps.length) {
|
|
return timestamps;
|
|
}
|
|
const data = this.getDataTimestamps();
|
|
const label = this.getLabelTimestamps();
|
|
if (data.length && label.length) {
|
|
timestamps = this.normalize(data.concat(label));
|
|
} else {
|
|
timestamps = data.length ? data : label;
|
|
}
|
|
timestamps = this._cache.all = timestamps;
|
|
return timestamps;
|
|
}
|
|
getDecimalForValue(value) {
|
|
return (interpolate3(this._table, value) - this._minPos) / this._tableRange;
|
|
}
|
|
getValueForPixel(pixel) {
|
|
const offsets = this._offsets;
|
|
const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;
|
|
return interpolate3(this._table, decimal * this._tableRange + this._minPos, true);
|
|
}
|
|
};
|
|
__publicField(TimeSeriesScale, "id", "timeseries");
|
|
__publicField(TimeSeriesScale, "defaults", TimeScale.defaults);
|
|
|
|
// src/gui/stats-modal.tsx
|
|
Chart.register(
|
|
BarElement,
|
|
BarController,
|
|
plugin_legend,
|
|
plugin_title,
|
|
plugin_tooltip,
|
|
plugin_subtitle,
|
|
CategoryScale,
|
|
LinearScale,
|
|
PieController,
|
|
ArcElement
|
|
);
|
|
var StatsModal = class extends import_obsidian6.Modal {
|
|
constructor(app2, plugin) {
|
|
super(app2);
|
|
this.plugin = plugin;
|
|
this.titleEl.setText(`${t("STATS_TITLE")} `);
|
|
this.titleEl.addClass("sr-centered");
|
|
this.titleEl.innerHTML += /* @__PURE__ */ (0, import_vhtml2.default)("select", { id: "sr-chart-period" }, /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "month", selected: true }, t("MONTH")), /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "quarter" }, t("QUARTER")), /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "year" }, t("YEAR")), /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "lifetime" }, t("LIFETIME")));
|
|
this.modalEl.style.height = "100%";
|
|
this.modalEl.style.width = "100%";
|
|
if (import_obsidian6.Platform.isMobile) {
|
|
this.contentEl.style.display = "block";
|
|
}
|
|
}
|
|
onOpen() {
|
|
const { contentEl } = this;
|
|
contentEl.style.textAlign = "center";
|
|
const cardStats = this.plugin.cardStats;
|
|
let maxN = cardStats.delayedDays.getMaxValue();
|
|
for (let dueOffset = 0; dueOffset <= maxN; dueOffset++) {
|
|
cardStats.delayedDays.clearCountIfMissing(dueOffset);
|
|
}
|
|
const dueDatesFlashcardsCopy = { 0: 0 };
|
|
for (const [dueOffset, dueCount] of getTypedObjectEntries(cardStats.delayedDays.dict)) {
|
|
if (dueOffset <= 0) {
|
|
dueDatesFlashcardsCopy[0] += dueCount;
|
|
} else {
|
|
dueDatesFlashcardsCopy[dueOffset] = dueCount;
|
|
}
|
|
}
|
|
const scheduledCount = cardStats.youngCount + cardStats.matureCount;
|
|
maxN = Math.max(maxN, 1);
|
|
contentEl.innerHTML += /* @__PURE__ */ (0, import_vhtml2.default)("div", null, /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "forecastChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "forecastChartSummary" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "intervalsChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "intervalsChartSummary" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "easesChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "easesChartSummary" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "cardTypesChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "cardTypesChartSummary" }));
|
|
createStatsChart(
|
|
"bar",
|
|
"forecastChart",
|
|
t("FORECAST"),
|
|
t("FORECAST_DESC"),
|
|
Object.keys(dueDatesFlashcardsCopy),
|
|
Object.values(dueDatesFlashcardsCopy),
|
|
t("REVIEWS_PER_DAY", { avg: (scheduledCount / maxN).toFixed(1) }),
|
|
t("SCHEDULED"),
|
|
t("DAYS"),
|
|
t("NUMBER_OF_CARDS")
|
|
);
|
|
maxN = cardStats.intervals.getMaxValue();
|
|
for (let interval = 0; interval <= maxN; interval++) {
|
|
cardStats.intervals.clearCountIfMissing(interval);
|
|
}
|
|
const average_interval = textInterval(
|
|
Math.round(
|
|
cardStats.intervals.getTotalOfValueMultiplyCount() / scheduledCount * 10
|
|
) / 10 || 0,
|
|
false
|
|
), longest_interval = textInterval(cardStats.intervals.getMaxValue(), false);
|
|
createStatsChart(
|
|
"bar",
|
|
"intervalsChart",
|
|
t("INTERVALS"),
|
|
t("INTERVALS_DESC"),
|
|
Object.keys(cardStats.intervals.dict),
|
|
Object.values(cardStats.intervals.dict),
|
|
t("INTERVALS_SUMMARY", { avg: average_interval, longest: longest_interval }),
|
|
t("COUNT"),
|
|
t("DAYS"),
|
|
t("NUMBER_OF_CARDS")
|
|
);
|
|
const eases = getKeysPreserveType(cardStats.eases.dict);
|
|
for (let ease = Math.min(...eases); ease <= Math.max(...eases); ease++) {
|
|
cardStats.eases.clearCountIfMissing(ease);
|
|
}
|
|
const average_ease = Math.round(cardStats.eases.getTotalOfValueMultiplyCount() / scheduledCount) || 0;
|
|
createStatsChart(
|
|
"bar",
|
|
"easesChart",
|
|
t("EASES"),
|
|
"",
|
|
Object.keys(cardStats.eases.dict),
|
|
Object.values(cardStats.eases.dict),
|
|
t("EASES_SUMMARY", { avgEase: average_ease }),
|
|
t("COUNT"),
|
|
t("EASES"),
|
|
t("NUMBER_OF_CARDS")
|
|
);
|
|
const totalCardsCount = this.plugin.deckTree.getCardCount(2 /* All */, true);
|
|
createStatsChart(
|
|
"pie",
|
|
"cardTypesChart",
|
|
t("CARD_TYPES"),
|
|
t("CARD_TYPES_DESC"),
|
|
[
|
|
`${t("CARD_TYPE_NEW")} - ${Math.round(
|
|
cardStats.newCount / totalCardsCount * 100
|
|
)}%`,
|
|
`${t("CARD_TYPE_YOUNG")} - ${Math.round(
|
|
cardStats.youngCount / totalCardsCount * 100
|
|
)}%`,
|
|
`${t("CARD_TYPE_MATURE")} - ${Math.round(
|
|
cardStats.matureCount / totalCardsCount * 100
|
|
)}%`
|
|
],
|
|
[cardStats.newCount, cardStats.youngCount, cardStats.matureCount],
|
|
t("CARD_TYPES_SUMMARY", { totalCardsCount })
|
|
);
|
|
}
|
|
onClose() {
|
|
const { contentEl } = this;
|
|
contentEl.empty();
|
|
}
|
|
};
|
|
function createStatsChart(type, canvasId, title, subtitle, labels, data, summary, seriesTitle = "", xAxisTitle = "", yAxisTitle = "") {
|
|
const style = getComputedStyle(document.body);
|
|
const textColor = style.getPropertyValue("--text-normal");
|
|
let scales = {}, backgroundColor = ["#2196f3"];
|
|
if (type !== "pie") {
|
|
scales = {
|
|
x: {
|
|
title: {
|
|
display: true,
|
|
text: xAxisTitle,
|
|
color: textColor
|
|
}
|
|
},
|
|
y: {
|
|
title: {
|
|
display: true,
|
|
text: yAxisTitle,
|
|
color: textColor
|
|
}
|
|
}
|
|
};
|
|
} else {
|
|
backgroundColor = ["#2196f3", "#4caf50", "green"];
|
|
}
|
|
const shouldFilter = canvasId === "forecastChart" || canvasId === "intervalsChart";
|
|
const statsChart = new Chart(document.getElementById(canvasId), {
|
|
type,
|
|
data: {
|
|
labels: shouldFilter ? labels.slice(0, 31) : labels,
|
|
datasets: [
|
|
{
|
|
label: seriesTitle,
|
|
backgroundColor,
|
|
data: shouldFilter ? data.slice(0, 31) : data
|
|
}
|
|
]
|
|
},
|
|
options: {
|
|
scales,
|
|
plugins: {
|
|
title: {
|
|
display: true,
|
|
text: title,
|
|
font: {
|
|
size: 22
|
|
},
|
|
color: textColor
|
|
},
|
|
subtitle: {
|
|
display: true,
|
|
text: subtitle,
|
|
font: {
|
|
size: 16,
|
|
style: "italic"
|
|
},
|
|
color: textColor
|
|
},
|
|
legend: {
|
|
display: false
|
|
}
|
|
},
|
|
aspectRatio: 2
|
|
}
|
|
});
|
|
if (shouldFilter) {
|
|
const chartPeriodEl = document.getElementById("sr-chart-period");
|
|
chartPeriodEl.addEventListener("click", () => {
|
|
let filteredLabels, filteredData;
|
|
const chartPeriod = chartPeriodEl.value;
|
|
if (chartPeriod === "month") {
|
|
filteredLabels = labels.slice(0, 31);
|
|
filteredData = data.slice(0, 31);
|
|
} else if (chartPeriod === "quarter") {
|
|
filteredLabels = labels.slice(0, 91);
|
|
filteredData = data.slice(0, 91);
|
|
} else if (chartPeriod === "year") {
|
|
filteredLabels = labels.slice(0, 366);
|
|
filteredData = data.slice(0, 366);
|
|
} else {
|
|
filteredLabels = labels;
|
|
filteredData = data;
|
|
}
|
|
statsChart.data.labels = filteredLabels;
|
|
statsChart.data.datasets[0] = {
|
|
label: seriesTitle,
|
|
backgroundColor,
|
|
data: filteredData
|
|
};
|
|
statsChart.update();
|
|
});
|
|
}
|
|
document.getElementById(`${canvasId}Summary`).innerText = summary;
|
|
}
|
|
|
|
// src/gui/sidebar.ts
|
|
var import_obsidian7 = require("obsidian");
|
|
var REVIEW_QUEUE_VIEW_TYPE = "review-queue-list-view";
|
|
var ReviewQueueListView = class extends import_obsidian7.ItemView {
|
|
constructor(leaf, plugin) {
|
|
super(leaf);
|
|
this.plugin = plugin;
|
|
this.registerEvent(this.app.workspace.on("file-open", () => this.redraw()));
|
|
this.registerEvent(this.app.vault.on("rename", () => this.redraw()));
|
|
}
|
|
getViewType() {
|
|
return REVIEW_QUEUE_VIEW_TYPE;
|
|
}
|
|
getDisplayText() {
|
|
return t("NOTES_REVIEW_QUEUE");
|
|
}
|
|
getIcon() {
|
|
return "SpacedRepIcon";
|
|
}
|
|
onHeaderMenu(menu) {
|
|
menu.addItem((item) => {
|
|
item.setTitle(t("CLOSE")).setIcon("cross").onClick(() => {
|
|
this.app.workspace.detachLeavesOfType(REVIEW_QUEUE_VIEW_TYPE);
|
|
});
|
|
});
|
|
}
|
|
redraw() {
|
|
const activeFile = this.app.workspace.getActiveFile();
|
|
const rootEl = createDiv("nav-folder mod-root");
|
|
const childrenEl = rootEl.createDiv("nav-folder-children");
|
|
for (const deckKey in this.plugin.reviewDecks) {
|
|
const deck = this.plugin.reviewDecks[deckKey];
|
|
const deckCollapsed = !deck.activeFolders.has(deck.deckName);
|
|
const deckFolderEl = this.createRightPaneFolder(
|
|
childrenEl,
|
|
deckKey,
|
|
deckCollapsed,
|
|
false,
|
|
deck
|
|
).getElementsByClassName("nav-folder-children")[0];
|
|
if (deck.newNotes.length > 0) {
|
|
const newNotesFolderEl = this.createRightPaneFolder(
|
|
deckFolderEl,
|
|
t("NEW"),
|
|
!deck.activeFolders.has(t("NEW")),
|
|
deckCollapsed,
|
|
deck
|
|
);
|
|
for (const newFile of deck.newNotes) {
|
|
const fileIsOpen = activeFile && newFile.path === activeFile.path;
|
|
if (fileIsOpen) {
|
|
deck.activeFolders.add(deck.deckName);
|
|
deck.activeFolders.add(t("NEW"));
|
|
this.changeFolderIconToExpanded(newNotesFolderEl);
|
|
this.changeFolderIconToExpanded(deckFolderEl);
|
|
}
|
|
this.createRightPaneFile(
|
|
newNotesFolderEl,
|
|
newFile,
|
|
fileIsOpen,
|
|
!deck.activeFolders.has(t("NEW")),
|
|
deck,
|
|
this.plugin
|
|
);
|
|
}
|
|
}
|
|
if (deck.scheduledNotes.length > 0) {
|
|
const now = Date.now();
|
|
let currUnix = -1;
|
|
let schedFolderEl = null, folderTitle = "";
|
|
const maxDaysToRender = this.plugin.data.settings.maxNDaysNotesReviewQueue;
|
|
for (const sNote of deck.scheduledNotes) {
|
|
if (sNote.dueUnix != currUnix) {
|
|
const nDays = Math.ceil((sNote.dueUnix - now) / (24 * 3600 * 1e3));
|
|
if (nDays > maxDaysToRender) {
|
|
break;
|
|
}
|
|
if (nDays === -1) {
|
|
folderTitle = t("YESTERDAY");
|
|
} else if (nDays === 0) {
|
|
folderTitle = t("TODAY");
|
|
} else if (nDays === 1) {
|
|
folderTitle = t("TOMORROW");
|
|
} else {
|
|
folderTitle = new Date(sNote.dueUnix).toDateString();
|
|
}
|
|
schedFolderEl = this.createRightPaneFolder(
|
|
deckFolderEl,
|
|
folderTitle,
|
|
!deck.activeFolders.has(folderTitle),
|
|
deckCollapsed,
|
|
deck
|
|
);
|
|
currUnix = sNote.dueUnix;
|
|
}
|
|
const fileIsOpen = activeFile && sNote.note.path === activeFile.path;
|
|
if (fileIsOpen) {
|
|
deck.activeFolders.add(deck.deckName);
|
|
deck.activeFolders.add(folderTitle);
|
|
this.changeFolderIconToExpanded(schedFolderEl);
|
|
this.changeFolderIconToExpanded(deckFolderEl);
|
|
}
|
|
this.createRightPaneFile(
|
|
schedFolderEl,
|
|
sNote.note,
|
|
fileIsOpen,
|
|
!deck.activeFolders.has(folderTitle),
|
|
deck,
|
|
this.plugin
|
|
);
|
|
}
|
|
}
|
|
}
|
|
const contentEl = this.containerEl.children[1];
|
|
contentEl.empty();
|
|
contentEl.appendChild(rootEl);
|
|
}
|
|
createRightPaneFolder(parentEl, folderTitle, collapsed, hidden, deck) {
|
|
const folderEl = parentEl.createDiv("nav-folder");
|
|
const folderTitleEl = folderEl.createDiv("nav-folder-title");
|
|
const childrenEl = folderEl.createDiv("nav-folder-children");
|
|
const collapseIconEl = folderTitleEl.createDiv(
|
|
"nav-folder-collapse-indicator collapse-icon"
|
|
);
|
|
collapseIconEl.innerHTML = COLLAPSE_ICON;
|
|
if (collapsed) {
|
|
collapseIconEl.childNodes[0].style.transform = "rotate(-90deg)";
|
|
}
|
|
folderTitleEl.createDiv("nav-folder-title-content").setText(folderTitle);
|
|
if (hidden) {
|
|
folderEl.style.display = "none";
|
|
}
|
|
folderTitleEl.onClickEvent(() => {
|
|
for (const child of childrenEl.childNodes) {
|
|
if (child.style.display === "block" || child.style.display === "") {
|
|
child.style.display = "none";
|
|
collapseIconEl.childNodes[0].style.transform = "rotate(-90deg)";
|
|
deck.activeFolders.delete(folderTitle);
|
|
} else {
|
|
child.style.display = "block";
|
|
collapseIconEl.childNodes[0].style.transform = "";
|
|
deck.activeFolders.add(folderTitle);
|
|
}
|
|
}
|
|
});
|
|
return folderEl;
|
|
}
|
|
createRightPaneFile(folderEl, file, fileElActive, hidden, deck, plugin) {
|
|
const navFileEl = folderEl.getElementsByClassName("nav-folder-children")[0].createDiv("nav-file");
|
|
if (hidden) {
|
|
navFileEl.style.display = "none";
|
|
}
|
|
const navFileTitle = navFileEl.createDiv("nav-file-title");
|
|
if (fileElActive) {
|
|
navFileTitle.addClass("is-active");
|
|
}
|
|
navFileTitle.createDiv("nav-file-title-content").setText(file.basename);
|
|
navFileTitle.addEventListener(
|
|
"click",
|
|
async (event) => {
|
|
event.preventDefault();
|
|
plugin.lastSelectedReviewDeck = deck.deckName;
|
|
await this.app.workspace.getLeaf().openFile(file);
|
|
return false;
|
|
},
|
|
false
|
|
);
|
|
navFileTitle.addEventListener(
|
|
"contextmenu",
|
|
(event) => {
|
|
event.preventDefault();
|
|
const fileMenu = new import_obsidian7.Menu();
|
|
this.app.workspace.trigger("file-menu", fileMenu, file, "my-context-menu", null);
|
|
fileMenu.showAtPosition({
|
|
x: event.pageX,
|
|
y: event.pageY
|
|
});
|
|
return false;
|
|
},
|
|
false
|
|
);
|
|
}
|
|
changeFolderIconToExpanded(folderEl) {
|
|
const collapseIconEl = folderEl.find("div.nav-folder-collapse-indicator");
|
|
collapseIconEl.childNodes[0].style.transform = "";
|
|
}
|
|
};
|
|
|
|
// src/ReviewDeck.ts
|
|
var import_obsidian8 = require("obsidian");
|
|
var ReviewDeck = class {
|
|
constructor(name) {
|
|
this.newNotes = [];
|
|
this.scheduledNotes = [];
|
|
this.dueNotesCount = 0;
|
|
this.deckName = name;
|
|
this.activeFolders = /* @__PURE__ */ new Set([this.deckName, t("TODAY")]);
|
|
}
|
|
sortNotes(pageranks) {
|
|
this.newNotes = this.newNotes.sort(
|
|
(a, b) => (pageranks[b.path] || 0) - (pageranks[a.path] || 0)
|
|
);
|
|
this.scheduledNotes = this.scheduledNotes.sort((a, b) => {
|
|
const result = a.dueUnix - b.dueUnix;
|
|
if (result != 0) {
|
|
return result;
|
|
}
|
|
return (pageranks[b.note.path] || 0) - (pageranks[a.note.path] || 0);
|
|
});
|
|
}
|
|
};
|
|
var ReviewDeckSelectionModal = class extends import_obsidian8.FuzzySuggestModal {
|
|
constructor(app2, deckKeys) {
|
|
super(app2);
|
|
this.deckKeys = [];
|
|
this.deckKeys = deckKeys;
|
|
}
|
|
getItems() {
|
|
return this.deckKeys;
|
|
}
|
|
getItemText(item) {
|
|
return item;
|
|
}
|
|
onChooseItem(deckKey, _) {
|
|
this.close();
|
|
this.submitCallback(deckKey);
|
|
}
|
|
};
|
|
|
|
// src/icons/appicon.ts
|
|
var import_obsidian9 = require("obsidian");
|
|
function appIcon() {
|
|
(0, import_obsidian9.addIcon)(
|
|
"SpacedRepIcon",
|
|
`<path fill="currentColor" stroke="currentColor" d="M 88.960938 17.257812 L 47.457031 17.257812 C 45.679688 17.257812 44.230469 18.703125 44.230469 20.484375 L 44.230469 86.558594 C 44.230469 88.335938 45.679688 89.785156 47.457031 89.785156 L 88.960938 89.785156 C 90.738281 89.785156 92.1875 88.335938 92.1875 86.558594 L 92.1875 20.484375 C 92.1875 18.703125 90.738281 17.257812 88.960938 17.257812 Z M 88.28125 85.878906 L 48.136719 85.878906 L 48.136719 21.164062 L 88.28125 21.164062 Z M 88.28125 85.878906 "/>
|
|
<path fill="currentColor" stroke="currentColor" d="M 88.960938 9.445312 L 61.667969 9.445312 C 59.925781 3.816406 54.011719 0.515625 48.269531 2.054688 L 8.183594 12.796875 C 2.304688 14.371094 -1.199219 20.4375 0.378906 26.316406 L 17.476562 90.140625 C 18.796875 95.066406 23.269531 98.324219 28.144531 98.324219 C 29.085938 98.324219 30.046875 98.199219 31 97.945312 L 40.765625 95.328125 C 42.625 96.75 44.941406 97.597656 47.457031 97.597656 L 88.960938 97.597656 C 95.046875 97.597656 100 92.644531 100 86.558594 L 100 20.484375 C 100 14.398438 95.046875 9.445312 88.960938 9.445312 Z M 29.988281 94.171875 C 26.1875 95.191406 22.269531 92.925781 21.25 89.128906 L 4.152344 25.304688 C 3.132812 21.507812 5.394531 17.585938 9.195312 16.570312 L 49.28125 5.828125 C 52.578125 4.945312 55.960938 6.53125 57.464844 9.445312 L 47.457031 9.445312 C 41.371094 9.445312 36.417969 14.398438 36.417969 20.484375 L 36.417969 86.558594 C 36.417969 88.558594 36.957031 90.433594 37.890625 92.054688 Z M 96.09375 86.558594 C 96.09375 90.492188 92.894531 93.691406 88.960938 93.691406 L 47.457031 93.691406 C 43.523438 93.691406 40.324219 90.492188 40.324219 86.558594 L 40.324219 20.484375 C 40.324219 16.550781 43.523438 13.351562 47.457031 13.351562 L 88.960938 13.351562 C 92.894531 13.351562 96.09375 16.550781 96.09375 20.484375 Z M 96.09375 86.558594 "/>
|
|
<path fill="currentColor" stroke="currentColor" d="M 54.101562 53.09375 L 60.070312 57.410156 L 57.789062 64.378906 C 56.90625 67.074219 59.996094 69.320312 62.285156 67.648438 L 68.210938 63.324219 L 74.132812 67.648438 C 76.421875 69.320312 79.511719 67.074219 78.628906 64.378906 L 76.347656 57.410156 L 82.320312 53.09375 C 84.613281 51.433594 83.441406 47.804688 80.605469 47.804688 L 73.242188 47.804688 L 70.988281 40.839844 C 70.117188 38.144531 66.300781 38.144531 65.429688 40.839844 L 63.179688 47.804688 L 55.8125 47.804688 C 52.980469 47.804688 51.804688 51.433594 54.101562 53.09375 Z M 54.101562 53.09375 "/>
|
|
`
|
|
);
|
|
}
|
|
|
|
// src/util/RandomNumberProvider.ts
|
|
var RandomNumberProvider = class {
|
|
getInteger(lowerBound, upperBound) {
|
|
const range = upperBound - lowerBound + 1;
|
|
return Math.floor(Math.random() * range) + lowerBound;
|
|
}
|
|
};
|
|
var StaticRandomNumberProvider = class {
|
|
getInteger(lowerBound, upperBound) {
|
|
if (lowerBound != this.expectedLowerBound || upperBound != this.expectedUpperBound)
|
|
throw `lowerBound: A${lowerBound}/E${this.expectedLowerBound}, upperBound: A${upperBound}/E${this.expectedUpperBound}`;
|
|
return this.next;
|
|
}
|
|
};
|
|
var WeightedRandomNumber = class _WeightedRandomNumber {
|
|
constructor(provider) {
|
|
this.provider = provider;
|
|
}
|
|
static create() {
|
|
return new _WeightedRandomNumber(globalRandomNumberProvider);
|
|
}
|
|
//
|
|
// weights is a dictionary:
|
|
// first number - a key that can be returned
|
|
// second number - the "bucket size" - this is a weight that influences the probability of the
|
|
// first number being returned
|
|
//
|
|
// returns:
|
|
// first number - one of the keys from the weights parameter
|
|
// second number - an "index" value; 0 <= index < bucketSize
|
|
getRandomValues(weights) {
|
|
const total = _WeightedRandomNumber.calcTotalOfCount(weights);
|
|
if (Object.values(weights).some((i) => !Number.isInteger(i) || i < 0))
|
|
throw "All weights must be positive integers";
|
|
const v = this.provider.getInteger(0, total - 1);
|
|
let x = 0;
|
|
for (const kvp in weights) {
|
|
const [value, count] = [Number(kvp), weights[kvp]];
|
|
if (v < x + count) {
|
|
const index = v - x;
|
|
return [value, index];
|
|
}
|
|
x += count;
|
|
}
|
|
throw "";
|
|
}
|
|
static calcTotalOfCount(weights) {
|
|
const total = getTypedObjectEntries(weights).map(([_, count]) => count).reduce((a, b) => a + b, 0) || 0;
|
|
return total;
|
|
}
|
|
};
|
|
var globalRandomNumberProvider = new RandomNumberProvider();
|
|
var staticRandomNumberProvider = new StaticRandomNumberProvider();
|
|
|
|
// src/DeckTreeIterator.ts
|
|
var CardOrder = /* @__PURE__ */ ((CardOrder2) => {
|
|
CardOrder2[CardOrder2["NewFirstSequential"] = 0] = "NewFirstSequential";
|
|
CardOrder2[CardOrder2["NewFirstRandom"] = 1] = "NewFirstRandom";
|
|
CardOrder2[CardOrder2["DueFirstSequential"] = 2] = "DueFirstSequential";
|
|
CardOrder2[CardOrder2["DueFirstRandom"] = 3] = "DueFirstRandom";
|
|
CardOrder2[CardOrder2["EveryCardRandomDeckAndCard"] = 4] = "EveryCardRandomDeckAndCard";
|
|
return CardOrder2;
|
|
})(CardOrder || {});
|
|
var DeckOrder = /* @__PURE__ */ ((DeckOrder2) => {
|
|
DeckOrder2[DeckOrder2["PrevDeckComplete_Sequential"] = 0] = "PrevDeckComplete_Sequential";
|
|
DeckOrder2[DeckOrder2["PrevDeckComplete_Random"] = 1] = "PrevDeckComplete_Random";
|
|
return DeckOrder2;
|
|
})(DeckOrder || {});
|
|
var SingleDeckIterator = class _SingleDeckIterator {
|
|
get hasCurrentCard() {
|
|
return this.cardIdx != null;
|
|
}
|
|
get currentCard() {
|
|
let result = null;
|
|
if (this.cardIdx != null)
|
|
result = this.deck.getCard(this.cardIdx, this.cardListType);
|
|
return result;
|
|
}
|
|
constructor(iteratorOrder) {
|
|
this.iteratorOrder = iteratorOrder;
|
|
this.preferredCardListType = _SingleDeckIterator.getCardListTypeForIterator(
|
|
this.iteratorOrder
|
|
);
|
|
this.weightedRandomNumber = WeightedRandomNumber.create();
|
|
}
|
|
setDeck(deck) {
|
|
this.deck = deck;
|
|
this.setCardListType(null);
|
|
}
|
|
//
|
|
// 0 <= cardIndex < newFlashcards.length + dueFlashcards.length
|
|
//
|
|
setNewOrDueCardIdx(cardIndex) {
|
|
let cardListType = 0 /* NewCard */;
|
|
let index = cardIndex;
|
|
if (cardIndex >= this.deck.newFlashcards.length) {
|
|
cardListType = 1 /* DueCard */;
|
|
index = cardIndex - this.deck.newFlashcards.length;
|
|
}
|
|
this.setCardListType(cardListType, index);
|
|
}
|
|
setCardListType(cardListType, cardIdx = null) {
|
|
this.cardListType = cardListType;
|
|
this.cardIdx = cardIdx;
|
|
}
|
|
nextCard() {
|
|
if (this.iteratorOrder.cardOrder == 4 /* EveryCardRandomDeckAndCard */) {
|
|
this.nextRandomCard();
|
|
} else {
|
|
if (this.cardListType == null) {
|
|
this.setCardListType(this.preferredCardListType);
|
|
}
|
|
if (!this.nextCardWithinCurrentList()) {
|
|
if (this.cardListType == this.preferredCardListType) {
|
|
this.setCardListType(Deck2.otherListType(this.cardListType));
|
|
if (!this.nextCardWithinCurrentList()) {
|
|
this.setCardListType(null);
|
|
}
|
|
} else {
|
|
this.cardIdx = null;
|
|
}
|
|
}
|
|
}
|
|
return this.cardIdx != null;
|
|
}
|
|
nextRandomCard() {
|
|
const newCount = this.deck.newFlashcards.length;
|
|
const dueCount = this.deck.dueFlashcards.length;
|
|
if (newCount + dueCount > 0) {
|
|
const weights = {};
|
|
if (newCount > 0)
|
|
weights[0 /* NewCard */] = newCount;
|
|
if (dueCount > 0)
|
|
weights[1 /* DueCard */] = dueCount;
|
|
const [cardListType, index] = this.weightedRandomNumber.getRandomValues(weights);
|
|
this.setCardListType(cardListType, index);
|
|
} else {
|
|
this.setCardListType(null);
|
|
}
|
|
}
|
|
nextCardWithinCurrentList() {
|
|
const cardList = this.deck.getCardListForCardType(this.cardListType);
|
|
const result = cardList.length > 0;
|
|
if (result) {
|
|
switch (this.iteratorOrder.cardOrder) {
|
|
case 2 /* DueFirstSequential */:
|
|
case 0 /* NewFirstSequential */:
|
|
this.cardIdx = 0;
|
|
break;
|
|
case 3 /* DueFirstRandom */:
|
|
case 1 /* NewFirstRandom */:
|
|
this.cardIdx = globalRandomNumberProvider.getInteger(0, cardList.length - 1);
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
deleteCurrentQuestion() {
|
|
this.ensureCurrentCard();
|
|
const q = this.currentCard.question;
|
|
this.deleteQuestionFromList(q, 0 /* NewCard */);
|
|
this.deleteQuestionFromList(q, 1 /* DueCard */);
|
|
this.setNoCurrentCard();
|
|
}
|
|
deleteQuestionFromList(q, cardListType) {
|
|
const cards = this.deck.getCardListForCardType(cardListType);
|
|
for (let i = cards.length - 1; i >= 0; i--) {
|
|
if (Object.is(q, cards[i].question))
|
|
this.deck.deleteCardAtIndex(i, cardListType);
|
|
}
|
|
}
|
|
deleteCurrentCard() {
|
|
this.ensureCurrentCard();
|
|
this.deck.deleteCardAtIndex(this.cardIdx, this.cardListType);
|
|
this.setNoCurrentCard();
|
|
}
|
|
moveCurrentCardToEndOfList() {
|
|
this.ensureCurrentCard();
|
|
const cardList = this.deck.getCardListForCardType(this.cardListType);
|
|
if (cardList.length <= 1)
|
|
return;
|
|
const card = this.currentCard;
|
|
this.deck.deleteCardAtIndex(this.cardIdx, this.cardListType);
|
|
this.deck.appendCard(TopicPath.emptyPath, card);
|
|
this.setNoCurrentCard();
|
|
}
|
|
setNoCurrentCard() {
|
|
this.cardIdx = null;
|
|
}
|
|
ensureCurrentCard() {
|
|
if (this.cardIdx == null || this.cardListType == null)
|
|
throw "no current card";
|
|
}
|
|
static getCardListTypeForIterator(iteratorOrder) {
|
|
let result = null;
|
|
switch (iteratorOrder.cardOrder) {
|
|
case 3 /* DueFirstRandom */:
|
|
case 2 /* DueFirstSequential */:
|
|
result = 1 /* DueCard */;
|
|
break;
|
|
case 1 /* NewFirstRandom */:
|
|
case 0 /* NewFirstSequential */:
|
|
result = 0 /* NewCard */;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
var DeckTreeIterator = class _DeckTreeIterator {
|
|
get hasCurrentCard() {
|
|
return this.deckIdx != null && this.singleDeckIterator.hasCurrentCard;
|
|
}
|
|
get currentDeck() {
|
|
if (this.deckIdx == null)
|
|
return null;
|
|
return this.deckArray[this.deckIdx];
|
|
}
|
|
get currentCard() {
|
|
let result = null;
|
|
if (this.deckIdx != null && this.singleDeckIterator.hasCurrentCard)
|
|
result = this.singleDeckIterator.currentCard;
|
|
return result;
|
|
}
|
|
constructor(iteratorOrder, deckSource) {
|
|
this.singleDeckIterator = new SingleDeckIterator(iteratorOrder);
|
|
this.iteratorOrder = iteratorOrder;
|
|
this.deckSource = deckSource;
|
|
this.weightedRandomNumber = WeightedRandomNumber.create();
|
|
}
|
|
setDeck(deck) {
|
|
if (this.deckSource == 1 /* CloneBeforeUse */)
|
|
deck = deck.clone();
|
|
this.deckArray = _DeckTreeIterator.filterForDecksWithCards(deck.toDeckArray());
|
|
this.setDeckIdx(null);
|
|
}
|
|
static filterForDecksWithCards(sourceArray) {
|
|
const result = [];
|
|
for (let idx = 0; idx < sourceArray.length; idx++) {
|
|
const deck = sourceArray[idx];
|
|
const hasAnyCards = deck.getCardCount(2 /* All */, false) > 0;
|
|
if (hasAnyCards) {
|
|
result.push(deck);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
setDeckIdx(deckIdx) {
|
|
this.deckIdx = deckIdx;
|
|
if (deckIdx != null)
|
|
this.singleDeckIterator.setDeck(this.deckArray[deckIdx]);
|
|
}
|
|
nextCard() {
|
|
let result = false;
|
|
if (this.hasCurrentCard) {
|
|
this.singleDeckIterator.deleteCurrentCard();
|
|
}
|
|
if (this.iteratorOrder.cardOrder == 4 /* EveryCardRandomDeckAndCard */) {
|
|
result = this.nextCard_EveryCardRandomDeck();
|
|
} else {
|
|
if (this.deckIdx == null) {
|
|
this.chooseNextDeck(true);
|
|
}
|
|
while (this.deckIdx < this.deckArray.length) {
|
|
if (this.singleDeckIterator.nextCard()) {
|
|
result = true;
|
|
break;
|
|
}
|
|
this.chooseNextDeck(false);
|
|
}
|
|
}
|
|
if (!result)
|
|
this.deckIdx = null;
|
|
return result;
|
|
}
|
|
chooseNextDeck(firstTime) {
|
|
switch (this.iteratorOrder.deckOrder) {
|
|
case 0 /* PrevDeckComplete_Sequential */:
|
|
this.deckIdx = firstTime ? 0 : this.deckIdx + 1;
|
|
break;
|
|
case 1 /* PrevDeckComplete_Random */: {
|
|
const weights = {};
|
|
let hasDeck = false;
|
|
for (let i = 0; i < this.deckArray.length; i++) {
|
|
if (this.deckArray[i].getCardCount(2 /* All */, false)) {
|
|
weights[i] = 1;
|
|
hasDeck = true;
|
|
}
|
|
}
|
|
if (hasDeck) {
|
|
const [deckIdx, _] = this.weightedRandomNumber.getRandomValues(weights);
|
|
this.deckIdx = deckIdx;
|
|
} else {
|
|
this.deckIdx = this.deckArray.length;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (this.deckIdx < this.deckArray.length) {
|
|
this.singleDeckIterator.setDeck(this.deckArray[this.deckIdx]);
|
|
}
|
|
}
|
|
nextCard_EveryCardRandomDeck() {
|
|
const weights = {};
|
|
for (let i = 0; i < this.deckArray.length; i++) {
|
|
const cardCount = this.deckArray[i].getCardCount(2 /* All */, false);
|
|
if (cardCount) {
|
|
weights[i] = cardCount;
|
|
}
|
|
}
|
|
if (Object.keys(weights).length == 0)
|
|
return false;
|
|
const [deckIdx, cardIdx] = this.weightedRandomNumber.getRandomValues(weights);
|
|
this.setDeckIdx(deckIdx);
|
|
this.singleDeckIterator.setNewOrDueCardIdx(cardIdx);
|
|
return true;
|
|
}
|
|
deleteCurrentQuestion() {
|
|
this.singleDeckIterator.deleteCurrentQuestion();
|
|
return this.nextCard();
|
|
}
|
|
deleteCurrentCard() {
|
|
this.singleDeckIterator.deleteCurrentCard();
|
|
return this.nextCard();
|
|
}
|
|
moveCurrentCardToEndOfList() {
|
|
this.singleDeckIterator.moveCurrentCardToEndOfList();
|
|
}
|
|
removeCurrentDeckIfEmpty() {
|
|
if (this.currentDeck.getCardCount(2 /* All */, false) == 0) {
|
|
this.deckArray.splice(this.deckIdx, 1);
|
|
if (this.deckIdx < this.deckArray.length)
|
|
this.setDeckIdx(this.deckIdx);
|
|
}
|
|
}
|
|
};
|
|
|
|
// src/Note.ts
|
|
var Note = class {
|
|
get hasChanged() {
|
|
return this.questionList.some((question) => question.hasChanged);
|
|
}
|
|
get filePath() {
|
|
return this.file.path;
|
|
}
|
|
constructor(file, questionList) {
|
|
this.file = file;
|
|
this.questionList = questionList;
|
|
questionList.forEach((question) => question.note = this);
|
|
}
|
|
appendCardsToDeck(deck) {
|
|
for (const question of this.questionList) {
|
|
for (const card of question.cards) {
|
|
deck.appendCard(question.topicPath, card);
|
|
}
|
|
}
|
|
}
|
|
debugLogToConsole(desc = "") {
|
|
var _a;
|
|
let str = `Note: ${desc}: ${this.questionList.length} questions\r
|
|
`;
|
|
for (let i = 0; i < this.questionList.length; i++) {
|
|
const q = this.questionList[i];
|
|
str += `[${i}]: ${q.questionType}: ${q.lineNo}: ${(_a = q.topicPath) == null ? void 0 : _a.path}: ${q.questionText.original}\r
|
|
`;
|
|
}
|
|
console.debug(str);
|
|
}
|
|
async writeNoteFile(settings) {
|
|
let fileText = await this.file.read();
|
|
for (const question of this.questionList) {
|
|
if (question.hasChanged) {
|
|
fileText = question.updateQuestionText(fileText, settings);
|
|
}
|
|
}
|
|
await this.file.write(fileText);
|
|
this.questionList.forEach((question) => question.hasChanged = false);
|
|
}
|
|
};
|
|
|
|
// src/Card.ts
|
|
var Card = class {
|
|
// scheduling
|
|
get hasSchedule() {
|
|
return this.scheduleInfo != null;
|
|
}
|
|
constructor(init) {
|
|
Object.assign(this, init);
|
|
}
|
|
get cardListType() {
|
|
return this.hasSchedule ? 1 /* DueCard */ : 0 /* NewCard */;
|
|
}
|
|
get isNew() {
|
|
return !this.hasSchedule;
|
|
}
|
|
get isDue() {
|
|
return this.hasSchedule && this.scheduleInfo.isDue();
|
|
}
|
|
formatSchedule() {
|
|
let result = "";
|
|
if (this.hasSchedule)
|
|
result = this.scheduleInfo.formatSchedule();
|
|
else
|
|
result = "New";
|
|
return result;
|
|
}
|
|
};
|
|
|
|
// src/parser.ts
|
|
function parse2(text, singlelineCardSeparator, singlelineReversedCardSeparator, multilineCardSeparator, multilineReversedCardSeparator, convertHighlightsToClozes, convertBoldTextToClozes, convertCurlyBracketsToClozes) {
|
|
let cardText = "";
|
|
const cards = [];
|
|
let cardType = null;
|
|
let lineNo = 0;
|
|
const lines = text.replaceAll("\r\n", "\n").split("\n");
|
|
for (let i = 0; i < lines.length; i++) {
|
|
const currentLine = lines[i];
|
|
if (currentLine.length === 0) {
|
|
if (cardType) {
|
|
cards.push([cardType, cardText, lineNo]);
|
|
cardType = null;
|
|
}
|
|
cardText = "";
|
|
continue;
|
|
} else if (currentLine.startsWith("<!--") && !currentLine.startsWith("<!--SR:")) {
|
|
while (i + 1 < lines.length && !currentLine.includes("-->"))
|
|
i++;
|
|
i++;
|
|
continue;
|
|
}
|
|
if (cardText.length > 0) {
|
|
cardText += "\n";
|
|
}
|
|
cardText += currentLine.trimEnd();
|
|
if (currentLine.includes(singlelineReversedCardSeparator) || currentLine.includes(singlelineCardSeparator)) {
|
|
cardType = lines[i].includes(singlelineReversedCardSeparator) ? 1 /* SingleLineReversed */ : 0 /* SingleLineBasic */;
|
|
cardText = lines[i];
|
|
lineNo = i;
|
|
if (i + 1 < lines.length && lines[i + 1].startsWith("<!--SR:")) {
|
|
cardText += "\n" + lines[i + 1];
|
|
i++;
|
|
}
|
|
cards.push([cardType, cardText, lineNo]);
|
|
cardType = null;
|
|
cardText = "";
|
|
} else if (cardType === null && (convertHighlightsToClozes && /==.*?==/gm.test(currentLine) || convertBoldTextToClozes && /\*\*.*?\*\*/gm.test(currentLine) || convertCurlyBracketsToClozes && /{{.*?}}/gm.test(currentLine))) {
|
|
cardType = 4 /* Cloze */;
|
|
lineNo = i;
|
|
} else if (currentLine.trim() === multilineCardSeparator) {
|
|
cardType = 2 /* MultiLineBasic */;
|
|
lineNo = i;
|
|
} else if (currentLine.trim() === multilineReversedCardSeparator) {
|
|
cardType = 3 /* MultiLineReversed */;
|
|
lineNo = i;
|
|
} else if (currentLine.startsWith("```") || currentLine.startsWith("~~~")) {
|
|
const codeBlockClose = currentLine.match(/`+|~+/)[0];
|
|
while (i + 1 < lines.length && !lines[i + 1].startsWith(codeBlockClose)) {
|
|
i++;
|
|
cardText += "\n" + lines[i];
|
|
}
|
|
cardText += "\n" + codeBlockClose;
|
|
i++;
|
|
}
|
|
}
|
|
if (cardType && cardText) {
|
|
cards.push([cardType, cardText, lineNo]);
|
|
}
|
|
return cards;
|
|
}
|
|
|
|
// src/QuestionType.ts
|
|
var CardFrontBack = class {
|
|
// The caller is responsible for any required trimming of leading/trailing spaces
|
|
constructor(front, back) {
|
|
this.front = front;
|
|
this.back = back;
|
|
}
|
|
};
|
|
var CardFrontBackUtil = class {
|
|
static expand(questionType, questionText, settings) {
|
|
const handler = QuestionTypeFactory.create(questionType);
|
|
return handler.expand(questionText, settings);
|
|
}
|
|
};
|
|
var QuestionType_SingleLineBasic = class {
|
|
expand(questionText, settings) {
|
|
const idx = questionText.indexOf(settings.singleLineCardSeparator);
|
|
const item = new CardFrontBack(
|
|
questionText.substring(0, idx),
|
|
questionText.substring(idx + settings.singleLineCardSeparator.length)
|
|
);
|
|
const result = [item];
|
|
return result;
|
|
}
|
|
};
|
|
var QuestionType_SingleLineReversed = class {
|
|
expand(questionText, settings) {
|
|
const idx = questionText.indexOf(settings.singleLineReversedCardSeparator);
|
|
const side1 = questionText.substring(0, idx), side2 = questionText.substring(
|
|
idx + settings.singleLineReversedCardSeparator.length
|
|
);
|
|
const result = [
|
|
new CardFrontBack(side1, side2),
|
|
new CardFrontBack(side2, side1)
|
|
];
|
|
return result;
|
|
}
|
|
};
|
|
var QuestionType_MultiLineBasic = class {
|
|
expand(questionText, settings) {
|
|
const idx = questionText.indexOf("\n" + settings.multilineCardSeparator + "\n");
|
|
const item = new CardFrontBack(
|
|
questionText.substring(0, idx),
|
|
questionText.substring(idx + 2 + settings.multilineCardSeparator.length)
|
|
);
|
|
const result = [item];
|
|
return result;
|
|
}
|
|
};
|
|
var QuestionType_MultiLineReversed = class {
|
|
expand(questionText, settings) {
|
|
const idx = questionText.indexOf("\n" + settings.multilineReversedCardSeparator + "\n");
|
|
const side1 = questionText.substring(0, idx), side2 = questionText.substring(
|
|
idx + 2 + settings.multilineReversedCardSeparator.length
|
|
);
|
|
const result = [
|
|
new CardFrontBack(side1, side2),
|
|
new CardFrontBack(side2, side1)
|
|
];
|
|
return result;
|
|
}
|
|
};
|
|
var QuestionType_Cloze = class {
|
|
expand(questionText, settings) {
|
|
const siblings = [];
|
|
if (settings.convertHighlightsToClozes) {
|
|
siblings.push(...questionText.matchAll(/==(.*?)==/gm));
|
|
}
|
|
if (settings.convertBoldTextToClozes) {
|
|
siblings.push(...questionText.matchAll(/\*\*(.*?)\*\*/gm));
|
|
}
|
|
if (settings.convertCurlyBracketsToClozes) {
|
|
siblings.push(...questionText.matchAll(/{{(.*?)}}/gm));
|
|
}
|
|
siblings.sort((a, b) => {
|
|
if (a.index < b.index) {
|
|
return -1;
|
|
}
|
|
if (a.index > b.index) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
});
|
|
let front, back;
|
|
const result = [];
|
|
for (const m of siblings) {
|
|
const deletionStart = m.index, deletionEnd = deletionStart + m[0].length;
|
|
front = questionText.substring(0, deletionStart) + QuestionType_ClozeUtil.renderClozeFront() + questionText.substring(deletionEnd);
|
|
front = QuestionType_ClozeUtil.removeClozeTokens(front, settings);
|
|
back = questionText.substring(0, deletionStart) + QuestionType_ClozeUtil.renderClozeBack(
|
|
questionText.substring(deletionStart, deletionEnd)
|
|
) + questionText.substring(deletionEnd);
|
|
back = QuestionType_ClozeUtil.removeClozeTokens(back, settings);
|
|
result.push(new CardFrontBack(front, back));
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
var QuestionType_ClozeUtil = class {
|
|
static renderClozeFront() {
|
|
return "<span style='color:#2196f3'>[...]</span>";
|
|
}
|
|
static renderClozeBack(str) {
|
|
return "<span style='color:#2196f3'>" + str + "</span>";
|
|
}
|
|
static removeClozeTokens(text, settings) {
|
|
let result = text;
|
|
if (settings.convertHighlightsToClozes)
|
|
result = result.replace(/==/gm, "");
|
|
if (settings.convertBoldTextToClozes)
|
|
result = result.replace(/\*\*/gm, "");
|
|
if (settings.convertCurlyBracketsToClozes) {
|
|
result = result.replace(/{{/gm, "").replace(/}}/gm, "");
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
var QuestionTypeFactory = class {
|
|
static create(questionType) {
|
|
let handler;
|
|
switch (questionType) {
|
|
case 0 /* SingleLineBasic */:
|
|
handler = new QuestionType_SingleLineBasic();
|
|
break;
|
|
case 1 /* SingleLineReversed */:
|
|
handler = new QuestionType_SingleLineReversed();
|
|
break;
|
|
case 2 /* MultiLineBasic */:
|
|
handler = new QuestionType_MultiLineBasic();
|
|
break;
|
|
case 3 /* MultiLineReversed */:
|
|
handler = new QuestionType_MultiLineReversed();
|
|
break;
|
|
case 4 /* Cloze */:
|
|
handler = new QuestionType_Cloze();
|
|
break;
|
|
}
|
|
return handler;
|
|
}
|
|
};
|
|
|
|
// src/NoteQuestionParser.ts
|
|
var ParsedQuestionInfo = class {
|
|
constructor(cardType, cardText, lineNo) {
|
|
this.cardType = cardType;
|
|
this.cardText = cardText;
|
|
this.lineNo = lineNo;
|
|
}
|
|
};
|
|
var NoteQuestionParser = class {
|
|
constructor(settings) {
|
|
this.settings = settings;
|
|
}
|
|
async createQuestionList(noteFile, folderTopicPath) {
|
|
this.noteFile = noteFile;
|
|
const noteText = await noteFile.read();
|
|
let noteTopicPath;
|
|
if (this.settings.convertFoldersToDecks) {
|
|
noteTopicPath = folderTopicPath;
|
|
} else {
|
|
const tagList = noteFile.getAllTags();
|
|
noteTopicPath = this.determineTopicPathFromTags(tagList);
|
|
}
|
|
const result = this.doCreateQuestionList(noteText, noteTopicPath);
|
|
return result;
|
|
}
|
|
doCreateQuestionList(noteText, noteTopicPath) {
|
|
this.noteText = noteText;
|
|
this.noteTopicPath = noteTopicPath;
|
|
const result = [];
|
|
const parsedQuestionInfoList = this.parseQuestions();
|
|
for (const t2 of parsedQuestionInfoList) {
|
|
const parsedQuestionInfo = new ParsedQuestionInfo(t2[0], t2[1], t2[2]);
|
|
const question = this.createQuestionObject(parsedQuestionInfo);
|
|
const cardFrontBackList = CardFrontBackUtil.expand(
|
|
question.questionType,
|
|
question.questionText.actualQuestion,
|
|
this.settings
|
|
);
|
|
let cardScheduleInfoList = NoteCardScheduleParser.createCardScheduleInfoList(question.questionText.original);
|
|
const correctLength = cardFrontBackList.length;
|
|
if (cardScheduleInfoList.length > correctLength) {
|
|
question.hasChanged = true;
|
|
cardScheduleInfoList = cardScheduleInfoList.slice(0, correctLength);
|
|
}
|
|
const cardList = this.createCardList(cardFrontBackList, cardScheduleInfoList);
|
|
question.setCardList(cardList);
|
|
result.push(question);
|
|
}
|
|
return result;
|
|
}
|
|
parseQuestions() {
|
|
const settings = this.settings;
|
|
const result = parse2(
|
|
this.noteText,
|
|
settings.singleLineCardSeparator,
|
|
settings.singleLineReversedCardSeparator,
|
|
settings.multilineCardSeparator,
|
|
settings.multilineReversedCardSeparator,
|
|
settings.convertHighlightsToClozes,
|
|
settings.convertBoldTextToClozes,
|
|
settings.convertCurlyBracketsToClozes
|
|
);
|
|
return result;
|
|
}
|
|
createQuestionObject(parsedQuestionInfo) {
|
|
const { cardType, cardText, lineNo } = parsedQuestionInfo;
|
|
const questionContext = this.noteFile.getQuestionContext(lineNo);
|
|
const result = Question.Create(
|
|
this.settings,
|
|
cardType,
|
|
this.noteTopicPath,
|
|
cardText,
|
|
lineNo,
|
|
questionContext
|
|
);
|
|
return result;
|
|
}
|
|
createCardList(cardFrontBackList, cardScheduleInfoList) {
|
|
const siblings = [];
|
|
for (let i = 0; i < cardFrontBackList.length; i++) {
|
|
const { front, back } = cardFrontBackList[i];
|
|
const hasScheduleInfo = i < cardScheduleInfoList.length;
|
|
const schedule2 = cardScheduleInfoList[i];
|
|
const cardObj = new Card({
|
|
front,
|
|
back,
|
|
cardIdx: i
|
|
});
|
|
cardObj.scheduleInfo = hasScheduleInfo && !schedule2.isDummyScheduleForNewCard() ? schedule2 : null;
|
|
siblings.push(cardObj);
|
|
}
|
|
return siblings;
|
|
}
|
|
determineTopicPathFromTags(tagList) {
|
|
let result = TopicPath.emptyPath;
|
|
outer:
|
|
for (const tagToReview of this.settings.flashcardTags) {
|
|
for (const tag of tagList) {
|
|
if (tag === tagToReview || tag.startsWith(tagToReview + "/")) {
|
|
result = TopicPath.getTopicPathFromTag(tag);
|
|
break outer;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
|
|
// src/NoteFileLoader.ts
|
|
var NoteFileLoader = class {
|
|
constructor(settings) {
|
|
this.settings = settings;
|
|
}
|
|
async load(noteFile, noteTopicPath) {
|
|
this.noteFile = noteFile;
|
|
const questionParser = new NoteQuestionParser(this.settings);
|
|
const questionList = await questionParser.createQuestionList(
|
|
noteFile,
|
|
noteTopicPath
|
|
);
|
|
const result = new Note(noteFile, questionList);
|
|
return result;
|
|
}
|
|
};
|
|
|
|
// src/SRFile.ts
|
|
var import_obsidian10 = require("obsidian");
|
|
var SrTFile = class {
|
|
constructor(vault, metadataCache, file) {
|
|
this.vault = vault;
|
|
this.metadataCache = metadataCache;
|
|
this.file = file;
|
|
}
|
|
get path() {
|
|
return this.file.path;
|
|
}
|
|
get basename() {
|
|
return this.file.basename;
|
|
}
|
|
getAllTags() {
|
|
const fileCachedData = this.metadataCache.getFileCache(this.file) || {};
|
|
return (0, import_obsidian10.getAllTags)(fileCachedData) || [];
|
|
}
|
|
getQuestionContext(cardLine) {
|
|
const fileCachedData = this.metadataCache.getFileCache(this.file) || {};
|
|
const headings = fileCachedData.headings || [];
|
|
const stack = [];
|
|
for (const heading of headings) {
|
|
if (heading.position.start.line > cardLine) {
|
|
break;
|
|
}
|
|
while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) {
|
|
stack.pop();
|
|
}
|
|
stack.push(heading);
|
|
}
|
|
const result = [];
|
|
for (const headingObj of stack) {
|
|
headingObj.heading = headingObj.heading.replace(/\[\^\d+\]/gm, "").trim();
|
|
result.push(headingObj.heading);
|
|
}
|
|
return result;
|
|
}
|
|
async read() {
|
|
return await this.vault.read(this.file);
|
|
}
|
|
async write(content) {
|
|
await this.vault.modify(this.file, content);
|
|
}
|
|
};
|
|
|
|
// src/NoteEaseCalculator.ts
|
|
var NoteEaseCalculator = class {
|
|
static Calculate(note, settings) {
|
|
let totalEase = 0;
|
|
let scheduledCount = 0;
|
|
note.questionList.forEach((question) => {
|
|
question.cards.filter((card) => card.hasSchedule).forEach((card) => {
|
|
totalEase += card.scheduleInfo.ease;
|
|
scheduledCount++;
|
|
});
|
|
});
|
|
let result = 0;
|
|
if (scheduledCount > 0) {
|
|
const flashcardsInNoteAvgEase = totalEase / scheduledCount;
|
|
const flashcardContribution = Math.min(
|
|
1,
|
|
Math.log(scheduledCount + 0.5) / Math.log(64)
|
|
);
|
|
result = flashcardsInNoteAvgEase * flashcardContribution + settings.baseEase * (1 - flashcardContribution);
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
|
|
// src/util/NumberCountDict.ts
|
|
var ValueCountDict = class {
|
|
constructor() {
|
|
this.dict = {};
|
|
}
|
|
// Record<value, count>
|
|
clearCountIfMissing(value) {
|
|
if (!this.hasValue(value))
|
|
this.dict[value] = 0;
|
|
}
|
|
hasValue(value) {
|
|
return Object.prototype.hasOwnProperty.call(this.dict, value);
|
|
}
|
|
incrementCount(value) {
|
|
this.clearCountIfMissing(value);
|
|
this.dict[value]++;
|
|
}
|
|
getMaxValue() {
|
|
return Math.max(...getKeysPreserveType(this.dict)) || 0;
|
|
}
|
|
getTotalOfValueMultiplyCount() {
|
|
const v = getTypedObjectEntries(this.dict).map(([value, count]) => value * count).reduce((a, b) => a + b, 0) || 0;
|
|
return v;
|
|
}
|
|
};
|
|
|
|
// src/stats.ts
|
|
var Stats = class {
|
|
constructor() {
|
|
this.eases = new ValueCountDict();
|
|
this.intervals = new ValueCountDict();
|
|
this.delayedDays = new ValueCountDict();
|
|
this.newCount = 0;
|
|
this.youngCount = 0;
|
|
this.matureCount = 0;
|
|
}
|
|
get totalCount() {
|
|
return this.youngCount + this.matureCount;
|
|
}
|
|
incrementNew() {
|
|
this.newCount++;
|
|
}
|
|
update(delayedDays, interval, ease) {
|
|
this.intervals.incrementCount(interval);
|
|
this.eases.incrementCount(ease);
|
|
this.delayedDays.incrementCount(delayedDays);
|
|
if (interval >= 32) {
|
|
this.matureCount++;
|
|
} else {
|
|
this.youngCount++;
|
|
}
|
|
}
|
|
getMaxInterval() {
|
|
return this.intervals.getMaxValue();
|
|
}
|
|
getAverageInterval() {
|
|
return this.intervals.getTotalOfValueMultiplyCount() / this.totalCount;
|
|
}
|
|
getAverageEases() {
|
|
return this.eases.getTotalOfValueMultiplyCount() / this.totalCount;
|
|
}
|
|
};
|
|
|
|
// src/DeckTreeStatsCalculator.ts
|
|
var DeckTreeStatsCalculator = class {
|
|
calculate(deckTree) {
|
|
const iteratorOrder = {
|
|
deckOrder: 0 /* PrevDeckComplete_Sequential */,
|
|
cardOrder: 2 /* DueFirstSequential */
|
|
};
|
|
const iterator = new DeckTreeIterator(
|
|
iteratorOrder,
|
|
1 /* CloneBeforeUse */
|
|
);
|
|
const result = new Stats();
|
|
iterator.setDeck(deckTree);
|
|
while (iterator.nextCard()) {
|
|
const card = iterator.currentCard;
|
|
if (card.hasSchedule) {
|
|
const schedule2 = card.scheduleInfo;
|
|
result.update(schedule2.delayBeforeReviewDaysInt, schedule2.interval, schedule2.ease);
|
|
} else {
|
|
result.incrementNew();
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
|
|
// src/NoteEaseList.ts
|
|
var NoteEaseList = class {
|
|
constructor(settings) {
|
|
this.dict = {};
|
|
this.settings = settings;
|
|
}
|
|
get baseEase() {
|
|
return this.settings.baseEase;
|
|
}
|
|
hasEaseForPath(path) {
|
|
return Object.prototype.hasOwnProperty.call(this.dict, path);
|
|
}
|
|
getEaseByPath(path) {
|
|
let ease = null;
|
|
if (this.hasEaseForPath(path)) {
|
|
ease = Math.round(this.dict[path]);
|
|
}
|
|
return ease;
|
|
}
|
|
setEaseForPath(path, ease) {
|
|
this.dict[path] = ease;
|
|
}
|
|
};
|
|
|
|
// src/QuestionPostponementList.ts
|
|
var QuestionPostponementList = class {
|
|
constructor(plugin, settings, list) {
|
|
this.plugin = plugin;
|
|
this.settings = settings;
|
|
this.list = list;
|
|
}
|
|
clear() {
|
|
this.list.splice(0);
|
|
}
|
|
add(question) {
|
|
if (!this.includes(question))
|
|
this.list.push(question.questionText.textHash);
|
|
}
|
|
includes(question) {
|
|
return this.list.includes(question.questionText.textHash);
|
|
}
|
|
async write() {
|
|
if (this.plugin == null)
|
|
return;
|
|
await this.plugin.savePluginData();
|
|
}
|
|
};
|
|
|
|
// src/main.ts
|
|
var DEFAULT_DATA = {
|
|
settings: DEFAULT_SETTINGS,
|
|
buryDate: "",
|
|
buryList: [],
|
|
historyDeck: null
|
|
};
|
|
var SRPlugin = class _SRPlugin extends import_obsidian11.Plugin {
|
|
constructor() {
|
|
super(...arguments);
|
|
this.syncLock = false;
|
|
this.reviewDecks = {};
|
|
this.incomingLinks = {};
|
|
this.pageranks = {};
|
|
this.dueNotesCount = 0;
|
|
this.dueDatesNotes = {};
|
|
// Record<# of days in future, due count>
|
|
this.deckTree = new Deck2("root", null);
|
|
}
|
|
async onload() {
|
|
await this.loadPluginData();
|
|
this.easeByPath = new NoteEaseList(this.data.settings);
|
|
this.questionPostponementList = new QuestionPostponementList(
|
|
this,
|
|
this.data.settings,
|
|
this.data.buryList
|
|
);
|
|
appIcon();
|
|
this.statusBar = this.addStatusBarItem();
|
|
this.statusBar.classList.add("mod-clickable");
|
|
this.statusBar.setAttribute("aria-label", t("OPEN_NOTE_FOR_REVIEW"));
|
|
this.statusBar.setAttribute("aria-label-position", "top");
|
|
this.statusBar.addEventListener("click", async () => {
|
|
if (!this.syncLock) {
|
|
await this.sync();
|
|
this.reviewNextNoteModal();
|
|
}
|
|
});
|
|
this.addRibbonIcon("SpacedRepIcon", t("REVIEW_CARDS"), async () => {
|
|
if (!this.syncLock) {
|
|
await this.sync();
|
|
this.openFlashcardModal(
|
|
this.deckTree,
|
|
this.remainingDeckTree,
|
|
1 /* Review */
|
|
);
|
|
}
|
|
});
|
|
if (!this.data.settings.disableFileMenuReviewOptions) {
|
|
this.registerEvent(
|
|
this.app.workspace.on("file-menu", (menu, fileish) => {
|
|
if (fileish instanceof import_obsidian11.TFile && fileish.extension === "md") {
|
|
menu.addItem((item) => {
|
|
item.setTitle(t("REVIEW_EASY_FILE_MENU")).setIcon("SpacedRepIcon").onClick(() => {
|
|
this.saveReviewResponse(fileish, 0 /* Easy */);
|
|
});
|
|
});
|
|
menu.addItem((item) => {
|
|
item.setTitle(t("REVIEW_GOOD_FILE_MENU")).setIcon("SpacedRepIcon").onClick(() => {
|
|
this.saveReviewResponse(fileish, 1 /* Good */);
|
|
});
|
|
});
|
|
menu.addItem((item) => {
|
|
item.setTitle(t("REVIEW_HARD_FILE_MENU")).setIcon("SpacedRepIcon").onClick(() => {
|
|
this.saveReviewResponse(fileish, 2 /* Hard */);
|
|
});
|
|
});
|
|
}
|
|
})
|
|
);
|
|
}
|
|
this.addCommand({
|
|
id: "srs-note-review-open-note",
|
|
name: t("OPEN_NOTE_FOR_REVIEW"),
|
|
callback: async () => {
|
|
if (!this.syncLock) {
|
|
await this.sync();
|
|
this.reviewNextNoteModal();
|
|
}
|
|
}
|
|
});
|
|
this.addCommand({
|
|
id: "srs-note-review-easy",
|
|
name: t("REVIEW_NOTE_EASY_CMD"),
|
|
callback: () => {
|
|
const openFile = this.app.workspace.getActiveFile();
|
|
if (openFile && openFile.extension === "md") {
|
|
this.saveReviewResponse(openFile, 0 /* Easy */);
|
|
}
|
|
}
|
|
});
|
|
this.addCommand({
|
|
id: "srs-note-review-good",
|
|
name: t("REVIEW_NOTE_GOOD_CMD"),
|
|
callback: () => {
|
|
const openFile = this.app.workspace.getActiveFile();
|
|
if (openFile && openFile.extension === "md") {
|
|
this.saveReviewResponse(openFile, 1 /* Good */);
|
|
}
|
|
}
|
|
});
|
|
this.addCommand({
|
|
id: "srs-note-review-hard",
|
|
name: t("REVIEW_NOTE_HARD_CMD"),
|
|
callback: () => {
|
|
const openFile = this.app.workspace.getActiveFile();
|
|
if (openFile && openFile.extension === "md") {
|
|
this.saveReviewResponse(openFile, 2 /* Hard */);
|
|
}
|
|
}
|
|
});
|
|
this.addCommand({
|
|
id: "srs-review-flashcards",
|
|
name: t("REVIEW_ALL_CARDS"),
|
|
callback: async () => {
|
|
if (!this.syncLock) {
|
|
await this.sync();
|
|
this.openFlashcardModal(
|
|
this.deckTree,
|
|
this.remainingDeckTree,
|
|
1 /* Review */
|
|
);
|
|
}
|
|
}
|
|
});
|
|
this.addCommand({
|
|
id: "srs-cram-flashcards",
|
|
name: t("CRAM_ALL_CARDS"),
|
|
callback: async () => {
|
|
await this.sync();
|
|
this.openFlashcardModal(this.deckTree, this.deckTree, 0 /* Cram */);
|
|
}
|
|
});
|
|
this.addCommand({
|
|
id: "srs-review-flashcards-in-note",
|
|
name: t("REVIEW_CARDS_IN_NOTE"),
|
|
callback: async () => {
|
|
const openFile = this.app.workspace.getActiveFile();
|
|
if (openFile && openFile.extension === "md") {
|
|
this.openFlashcardModalForSingleNote(openFile, 1 /* Review */);
|
|
}
|
|
}
|
|
});
|
|
this.addCommand({
|
|
id: "srs-cram-flashcards-in-note",
|
|
name: t("CRAM_CARDS_IN_NOTE"),
|
|
callback: async () => {
|
|
const openFile = this.app.workspace.getActiveFile();
|
|
if (openFile && openFile.extension === "md") {
|
|
this.openFlashcardModalForSingleNote(openFile, 0 /* Cram */);
|
|
}
|
|
}
|
|
});
|
|
this.addCommand({
|
|
id: "srs-view-stats",
|
|
name: t("VIEW_STATS"),
|
|
callback: async () => {
|
|
if (!this.syncLock) {
|
|
await this.sync();
|
|
new StatsModal(this.app, this).open();
|
|
}
|
|
}
|
|
});
|
|
this.addSettingTab(new SRSettingTab(this.app, this));
|
|
this.app.workspace.onLayoutReady(() => {
|
|
this.initView();
|
|
setTimeout(async () => {
|
|
if (!this.syncLock) {
|
|
await this.sync();
|
|
}
|
|
}, 2e3);
|
|
});
|
|
}
|
|
onunload() {
|
|
this.app.workspace.getLeavesOfType(REVIEW_QUEUE_VIEW_TYPE).forEach((leaf) => leaf.detach());
|
|
}
|
|
async openFlashcardModalForSingleNote(noteFile, reviewMode) {
|
|
const topicPath = this.findTopicPath(this.createSrTFile(noteFile));
|
|
const note = await this.loadNote(noteFile, topicPath);
|
|
const deckTree = new Deck2("root", null);
|
|
note.appendCardsToDeck(deckTree);
|
|
const remainingDeckTree = DeckTreeFilter.filterForRemainingCards(
|
|
this.questionPostponementList,
|
|
deckTree,
|
|
reviewMode
|
|
);
|
|
this.openFlashcardModal(deckTree, remainingDeckTree, reviewMode);
|
|
}
|
|
openFlashcardModal(fullDeckTree, remainingDeckTree, reviewMode) {
|
|
const deckIterator = _SRPlugin.createDeckTreeIterator(this.data.settings);
|
|
const cardScheduleCalculator = new CardScheduleCalculator(
|
|
this.data.settings,
|
|
this.easeByPath
|
|
);
|
|
const reviewSequencer = new FlashcardReviewSequencer(
|
|
reviewMode,
|
|
deckIterator,
|
|
this.data.settings,
|
|
cardScheduleCalculator,
|
|
this.questionPostponementList
|
|
);
|
|
reviewSequencer.setDeckTree(fullDeckTree, remainingDeckTree);
|
|
new FlashcardModal(this.app, this, this.data.settings, reviewSequencer, reviewMode).open();
|
|
}
|
|
static createDeckTreeIterator(settings) {
|
|
let cardOrder = CardOrder[settings.flashcardCardOrder];
|
|
if (cardOrder === void 0)
|
|
cardOrder = 2 /* DueFirstSequential */;
|
|
let deckOrder = DeckOrder[settings.flashcardDeckOrder];
|
|
if (deckOrder === void 0)
|
|
deckOrder = 0 /* PrevDeckComplete_Sequential */;
|
|
console.log(`createDeckTreeIterator: CardOrder: ${cardOrder}, DeckOrder: ${deckOrder}`);
|
|
const iteratorOrder = {
|
|
deckOrder,
|
|
cardOrder
|
|
};
|
|
return new DeckTreeIterator(iteratorOrder, 0 /* UpdatedByIterator */);
|
|
}
|
|
async sync() {
|
|
if (this.syncLock) {
|
|
return;
|
|
}
|
|
this.syncLock = true;
|
|
graph.reset();
|
|
this.easeByPath = new NoteEaseList(this.data.settings);
|
|
this.incomingLinks = {};
|
|
this.pageranks = {};
|
|
this.dueNotesCount = 0;
|
|
this.dueDatesNotes = {};
|
|
this.reviewDecks = {};
|
|
const fullDeckTree = new Deck2("root", null);
|
|
const now = window.moment(Date.now());
|
|
const todayDate = now.format("YYYY-MM-DD");
|
|
if (todayDate !== this.data.buryDate) {
|
|
this.data.buryDate = todayDate;
|
|
this.questionPostponementList.clear();
|
|
await this.savePluginData();
|
|
}
|
|
const notes = this.app.vault.getMarkdownFiles();
|
|
for (const noteFile of notes) {
|
|
if (this.data.settings.noteFoldersToIgnore.some(
|
|
(folder) => noteFile.path.startsWith(folder)
|
|
)) {
|
|
continue;
|
|
}
|
|
if (this.incomingLinks[noteFile.path] === void 0) {
|
|
this.incomingLinks[noteFile.path] = [];
|
|
}
|
|
const links = this.app.metadataCache.resolvedLinks[noteFile.path] || {};
|
|
for (const targetPath in links) {
|
|
if (this.incomingLinks[targetPath] === void 0)
|
|
this.incomingLinks[targetPath] = [];
|
|
if (targetPath.split(".").pop().toLowerCase() === "md") {
|
|
this.incomingLinks[targetPath].push({
|
|
sourcePath: noteFile.path,
|
|
linkCount: links[targetPath]
|
|
});
|
|
graph.link(noteFile.path, targetPath, links[targetPath]);
|
|
}
|
|
}
|
|
const topicPath = this.findTopicPath(this.createSrTFile(noteFile));
|
|
if (topicPath.hasPath) {
|
|
const note = await this.loadNote(noteFile, topicPath);
|
|
const flashcardsInNoteAvgEase = NoteEaseCalculator.Calculate(
|
|
note,
|
|
this.data.settings
|
|
);
|
|
note.appendCardsToDeck(fullDeckTree);
|
|
if (flashcardsInNoteAvgEase > 0) {
|
|
this.easeByPath.setEaseForPath(note.filePath, flashcardsInNoteAvgEase);
|
|
}
|
|
}
|
|
const fileCachedData = this.app.metadataCache.getFileCache(noteFile) || {};
|
|
const frontmatter = fileCachedData.frontmatter || {};
|
|
const tags = (0, import_obsidian11.getAllTags)(fileCachedData) || [];
|
|
let shouldIgnore = true;
|
|
const matchedNoteTags = [];
|
|
for (const tagToReview of this.data.settings.tagsToReview) {
|
|
if (tags.some((tag) => tag === tagToReview || tag.startsWith(tagToReview + "/"))) {
|
|
if (!Object.prototype.hasOwnProperty.call(this.reviewDecks, tagToReview)) {
|
|
this.reviewDecks[tagToReview] = new ReviewDeck(tagToReview);
|
|
}
|
|
matchedNoteTags.push(tagToReview);
|
|
shouldIgnore = false;
|
|
break;
|
|
}
|
|
}
|
|
if (shouldIgnore) {
|
|
continue;
|
|
}
|
|
if (!(Object.prototype.hasOwnProperty.call(frontmatter, "sr-due") && Object.prototype.hasOwnProperty.call(frontmatter, "sr-interval") && Object.prototype.hasOwnProperty.call(frontmatter, "sr-ease"))) {
|
|
for (const matchedNoteTag of matchedNoteTags) {
|
|
this.reviewDecks[matchedNoteTag].newNotes.push(noteFile);
|
|
}
|
|
continue;
|
|
}
|
|
const dueUnix = window.moment(frontmatter["sr-due"], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]).valueOf();
|
|
for (const matchedNoteTag of matchedNoteTags) {
|
|
this.reviewDecks[matchedNoteTag].scheduledNotes.push({ note: noteFile, dueUnix });
|
|
if (dueUnix <= now.valueOf()) {
|
|
this.reviewDecks[matchedNoteTag].dueNotesCount++;
|
|
}
|
|
}
|
|
let ease;
|
|
if (this.easeByPath.hasEaseForPath(noteFile.path)) {
|
|
ease = (this.easeByPath.getEaseByPath(noteFile.path) + frontmatter["sr-ease"]) / 2;
|
|
} else {
|
|
ease = frontmatter["sr-ease"];
|
|
}
|
|
this.easeByPath.setEaseForPath(noteFile.path, ease);
|
|
if (dueUnix <= now.valueOf()) {
|
|
this.dueNotesCount++;
|
|
}
|
|
const nDays = Math.ceil((dueUnix - now.valueOf()) / (24 * 3600 * 1e3));
|
|
if (!Object.prototype.hasOwnProperty.call(this.dueDatesNotes, nDays)) {
|
|
this.dueDatesNotes[nDays] = 0;
|
|
}
|
|
this.dueDatesNotes[nDays]++;
|
|
}
|
|
graph.rank(0.85, 1e-6, (node, rank2) => {
|
|
this.pageranks[node] = rank2 * 1e4;
|
|
});
|
|
this.deckTree = DeckTreeFilter.filterForReviewableCards(fullDeckTree);
|
|
this.deckTree.sortSubdecksList();
|
|
this.remainingDeckTree = DeckTreeFilter.filterForRemainingCards(
|
|
this.questionPostponementList,
|
|
this.deckTree,
|
|
1 /* Review */
|
|
);
|
|
const calc = new DeckTreeStatsCalculator();
|
|
this.cardStats = calc.calculate(this.deckTree);
|
|
if (this.data.settings.showDebugMessages) {
|
|
console.log(`SR: ${t("EASES")}`, this.easeByPath.dict);
|
|
console.log(`SR: ${t("DECKS")}`, this.deckTree);
|
|
}
|
|
for (const deckKey in this.reviewDecks) {
|
|
this.reviewDecks[deckKey].sortNotes(this.pageranks);
|
|
}
|
|
if (this.data.settings.showDebugMessages) {
|
|
console.log(
|
|
"SR: " + t("SYNC_TIME_TAKEN", {
|
|
t: Date.now() - now.valueOf()
|
|
})
|
|
);
|
|
}
|
|
this.statusBar.setText(
|
|
t("STATUS_BAR", {
|
|
dueNotesCount: this.dueNotesCount,
|
|
dueFlashcardsCount: this.remainingDeckTree.getCardCount(2 /* All */, true)
|
|
})
|
|
);
|
|
if (this.data.settings.enableNoteReviewPaneOnStartup)
|
|
this.reviewQueueView.redraw();
|
|
this.syncLock = false;
|
|
}
|
|
async loadNote(noteFile, topicPath) {
|
|
const loader = new NoteFileLoader(this.data.settings);
|
|
const note = await loader.load(this.createSrTFile(noteFile), topicPath);
|
|
if (note.hasChanged)
|
|
note.writeNoteFile(this.data.settings);
|
|
return note;
|
|
}
|
|
async saveReviewResponse(note, response) {
|
|
const fileCachedData = this.app.metadataCache.getFileCache(note) || {};
|
|
const frontmatter = fileCachedData.frontmatter || {};
|
|
const tags = (0, import_obsidian11.getAllTags)(fileCachedData) || [];
|
|
if (this.data.settings.noteFoldersToIgnore.some((folder) => note.path.startsWith(folder))) {
|
|
new import_obsidian11.Notice(t("NOTE_IN_IGNORED_FOLDER"));
|
|
return;
|
|
}
|
|
let shouldIgnore = true;
|
|
for (const tag of tags) {
|
|
if (this.data.settings.tagsToReview.some(
|
|
(tagToReview) => tag === tagToReview || tag.startsWith(tagToReview + "/")
|
|
)) {
|
|
shouldIgnore = false;
|
|
break;
|
|
}
|
|
}
|
|
if (shouldIgnore) {
|
|
new import_obsidian11.Notice(t("PLEASE_TAG_NOTE"));
|
|
return;
|
|
}
|
|
let fileText = await this.app.vault.read(note);
|
|
let ease, interval, delayBeforeReview;
|
|
const now = Date.now();
|
|
if (!(Object.prototype.hasOwnProperty.call(frontmatter, "sr-due") && Object.prototype.hasOwnProperty.call(frontmatter, "sr-interval") && Object.prototype.hasOwnProperty.call(frontmatter, "sr-ease"))) {
|
|
let linkTotal = 0, linkPGTotal = 0, totalLinkCount = 0;
|
|
for (const statObj of this.incomingLinks[note.path] || []) {
|
|
const ease2 = this.easeByPath.getEaseByPath(statObj.sourcePath);
|
|
if (ease2) {
|
|
linkTotal += statObj.linkCount * this.pageranks[statObj.sourcePath] * ease2;
|
|
linkPGTotal += this.pageranks[statObj.sourcePath] * statObj.linkCount;
|
|
totalLinkCount += statObj.linkCount;
|
|
}
|
|
}
|
|
const outgoingLinks = this.app.metadataCache.resolvedLinks[note.path] || {};
|
|
for (const linkedFilePath in outgoingLinks) {
|
|
const ease2 = this.easeByPath.getEaseByPath(linkedFilePath);
|
|
if (ease2) {
|
|
linkTotal += outgoingLinks[linkedFilePath] * this.pageranks[linkedFilePath] * ease2;
|
|
linkPGTotal += this.pageranks[linkedFilePath] * outgoingLinks[linkedFilePath];
|
|
totalLinkCount += outgoingLinks[linkedFilePath];
|
|
}
|
|
}
|
|
const linkContribution = this.data.settings.maxLinkFactor * Math.min(1, Math.log(totalLinkCount + 0.5) / Math.log(64));
|
|
ease = (1 - linkContribution) * this.data.settings.baseEase + (totalLinkCount > 0 ? linkContribution * linkTotal / linkPGTotal : linkContribution * this.data.settings.baseEase);
|
|
if (this.easeByPath.hasEaseForPath(note.path)) {
|
|
ease = (ease + this.easeByPath.getEaseByPath(note.path)) / 2;
|
|
}
|
|
ease = Math.round(ease);
|
|
interval = 1;
|
|
delayBeforeReview = 0;
|
|
} else {
|
|
interval = frontmatter["sr-interval"];
|
|
ease = frontmatter["sr-ease"];
|
|
delayBeforeReview = now - window.moment(frontmatter["sr-due"], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]).valueOf();
|
|
}
|
|
const schedObj = schedule(
|
|
response,
|
|
interval,
|
|
ease,
|
|
delayBeforeReview,
|
|
this.data.settings,
|
|
this.dueDatesNotes
|
|
);
|
|
interval = schedObj.interval;
|
|
ease = schedObj.ease;
|
|
const due = window.moment(now + interval * 24 * 3600 * 1e3);
|
|
const dueString = due.format("YYYY-MM-DD");
|
|
if (SCHEDULING_INFO_REGEX.test(fileText)) {
|
|
const schedulingInfo = SCHEDULING_INFO_REGEX.exec(fileText);
|
|
fileText = fileText.replace(
|
|
SCHEDULING_INFO_REGEX,
|
|
`---
|
|
${schedulingInfo[1]}sr-due: ${dueString}
|
|
sr-interval: ${interval}
|
|
sr-ease: ${ease}
|
|
${schedulingInfo[5]}---`
|
|
);
|
|
} else if (YAML_FRONT_MATTER_REGEX.test(fileText)) {
|
|
const existingYaml = YAML_FRONT_MATTER_REGEX.exec(fileText);
|
|
fileText = fileText.replace(
|
|
YAML_FRONT_MATTER_REGEX,
|
|
`---
|
|
${existingYaml[1]}sr-due: ${dueString}
|
|
sr-interval: ${interval}
|
|
sr-ease: ${ease}
|
|
---`
|
|
);
|
|
} else {
|
|
fileText = `---
|
|
sr-due: ${dueString}
|
|
sr-interval: ${interval}
|
|
sr-ease: ${ease}
|
|
---
|
|
|
|
${fileText}`;
|
|
}
|
|
if (this.data.settings.burySiblingCards) {
|
|
const topicPath = this.findTopicPath(this.createSrTFile(note));
|
|
const noteX = await this.loadNote(note, topicPath);
|
|
for (const question of noteX.questionList) {
|
|
this.data.buryList.push(question.questionText.textHash);
|
|
}
|
|
await this.savePluginData();
|
|
}
|
|
await this.app.vault.modify(note, fileText);
|
|
new import_obsidian11.Notice(t("RESPONSE_RECEIVED"));
|
|
await this.sync();
|
|
if (this.data.settings.autoNextNote) {
|
|
this.reviewNextNote(this.lastSelectedReviewDeck);
|
|
}
|
|
}
|
|
async reviewNextNoteModal() {
|
|
const reviewDeckNames = Object.keys(this.reviewDecks);
|
|
if (reviewDeckNames.length === 1) {
|
|
this.reviewNextNote(reviewDeckNames[0]);
|
|
} else {
|
|
const deckSelectionModal = new ReviewDeckSelectionModal(this.app, reviewDeckNames);
|
|
deckSelectionModal.submitCallback = (deckKey) => this.reviewNextNote(deckKey);
|
|
deckSelectionModal.open();
|
|
}
|
|
}
|
|
async reviewNextNote(deckKey) {
|
|
if (!Object.prototype.hasOwnProperty.call(this.reviewDecks, deckKey)) {
|
|
new import_obsidian11.Notice(t("NO_DECK_EXISTS", { deckName: deckKey }));
|
|
return;
|
|
}
|
|
this.lastSelectedReviewDeck = deckKey;
|
|
const deck = this.reviewDecks[deckKey];
|
|
if (deck.dueNotesCount > 0) {
|
|
const index = this.data.settings.openRandomNote ? Math.floor(Math.random() * deck.dueNotesCount) : 0;
|
|
await this.app.workspace.getLeaf().openFile(deck.scheduledNotes[index].note);
|
|
return;
|
|
}
|
|
if (deck.newNotes.length > 0) {
|
|
const index = this.data.settings.openRandomNote ? Math.floor(Math.random() * deck.newNotes.length) : 0;
|
|
this.app.workspace.getLeaf().openFile(deck.newNotes[index]);
|
|
return;
|
|
}
|
|
new import_obsidian11.Notice(t("ALL_CAUGHT_UP"));
|
|
}
|
|
createSrTFile(note) {
|
|
return new SrTFile(this.app.vault, this.app.metadataCache, note);
|
|
}
|
|
findTopicPath(note) {
|
|
return TopicPath.getTopicPathOfFile(note, this.data.settings);
|
|
}
|
|
async loadPluginData() {
|
|
const loadedData = await this.loadData();
|
|
if (loadedData == null ? void 0 : loadedData.settings)
|
|
upgradeSettings(loadedData.settings);
|
|
this.data = Object.assign({}, DEFAULT_DATA, loadedData);
|
|
this.data.settings = Object.assign({}, DEFAULT_SETTINGS, this.data.settings);
|
|
}
|
|
async savePluginData() {
|
|
await this.saveData(this.data);
|
|
}
|
|
initView() {
|
|
this.registerView(
|
|
REVIEW_QUEUE_VIEW_TYPE,
|
|
(leaf) => this.reviewQueueView = new ReviewQueueListView(leaf, this)
|
|
);
|
|
if (this.data.settings.enableNoteReviewPaneOnStartup && app.workspace.getLeavesOfType(REVIEW_QUEUE_VIEW_TYPE).length == 0) {
|
|
this.app.workspace.getRightLeaf(false).setViewState({
|
|
type: REVIEW_QUEUE_VIEW_TYPE,
|
|
active: true
|
|
});
|
|
}
|
|
}
|
|
};
|
|
/*! Bundled license information:
|
|
|
|
moment/moment.js:
|
|
(*! moment.js *)
|
|
(*! version : 2.30.1 *)
|
|
(*! authors : Tim Wood, Iskren Chernev, Moment.js contributors *)
|
|
(*! license : MIT *)
|
|
(*! momentjs.com *)
|
|
|
|
@kurkle/color/dist/color.esm.js:
|
|
(*!
|
|
* @kurkle/color v0.3.2
|
|
* https://github.com/kurkle/color#readme
|
|
* (c) 2023 Jukka Kurkela
|
|
* Released under the MIT License
|
|
*)
|
|
|
|
chart.js/dist/chunks/helpers.segment.js:
|
|
(*!
|
|
* Chart.js v4.4.1
|
|
* https://www.chartjs.org
|
|
* (c) 2023 Chart.js Contributors
|
|
* Released under the MIT License
|
|
*)
|
|
|
|
chart.js/dist/chart.js:
|
|
(*!
|
|
* Chart.js v4.4.1
|
|
* https://www.chartjs.org
|
|
* (c) 2023 Chart.js Contributors
|
|
* Released under the MIT License
|
|
*)
|
|
*/
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3BhZ2VyYW5rLmpzQDEuMC4yL25vZGVfbW9kdWxlcy9wYWdlcmFuay5qcy9saWIvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ZodG1sQDIuMi4wL25vZGVfbW9kdWxlcy92aHRtbC9zcmMvZW1wdHktdGFncy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vdmh0bWxAMi4yLjAvbm9kZV9tb2R1bGVzL3ZodG1sL3NyYy92aHRtbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbW9tZW50QDIuMzAuMS9ub2RlX21vZHVsZXMvbW9tZW50L21vbWVudC5qcyIsICIuLi9zcmMvbWFpbi50cyIsICIuLi9zcmMvc2V0dGluZ3MudHMiLCAiLi4vc3JjL2xhbmcvaGVscGVycy50cyIsICIuLi9zcmMvbGFuZy9sb2NhbGUvYWYudHMiLCAiLi4vc3JjL2xhbmcvbG9jYWxlL2FyLnRzIiwgIi4uL3NyYy9sYW5nL2xvY2FsZS9jei50cyIsICIuLi9zcmMvbGFuZy9sb2NhbGUvYm4udHMiLCAiLi4vc3JjL2xhbmcvbG9jYWxlL2RhLnRzIiwgIi4uL3NyYy9sYW5nL2xvY2FsZS9kZS50cyIsICIuLi9zcmMvbGFuZy9sb2NhbGUvZW4udHMiLCAiLi4vc3JjL2xhbmcvbG9jYWxlL2VuLWdiLnRzIiwgIi4uL3NyYy9sYW5nL2xvY2FsZS9lcy50cyIsICIuLi9zcmMvbGFuZy9sb2NhbGUvZnIudHMiLCAiLi4vc3JjL2xhbmcvbG9jYWxlL2hpLnRzIiwgIi4uL3NyYy9sYW5nL2xvY2FsZS9pZC50cyIsICIuLi9zcmMvbGFuZy9sb2NhbGUvaXQudHMiLCAiLi4vc3JjL2xhbmcvbG9jYWxlL2phLnRzIiwgIi4uL3NyYy9sYW5nL2xvY2FsZS9rby50cyIsICIuLi9zcmMvbGFuZy9sb2NhbGUvbXIudHMiLCAiLi4vc3JjL2xhbmcvbG9jYWxlL25sLnRzIiwgIi4uL3NyYy9sYW5nL2xvY2FsZS9uby50cyIsICIuLi9zcmMvbGFuZy9sb2NhbGUvcGwudHMiLCAiLi4vc3JjL2xhbmcvbG9jYWxlL3B0LnRzIiwgIi4uL3NyYy9sYW5nL2xvY2FsZS9wdC1ici50cyIsICIuLi9zcmMvbGFuZy9sb2NhbGUvcm8udHMiLCAiLi4vc3JjL2xhbmcvbG9jYWxlL3J1LnRzIiwgIi4uL3NyYy9sYW5nL2xvY2FsZS90YS50cyIsICIuLi9zcmMvbGFuZy9sb2NhbGUvdGUudHMiLCAiLi4vc3JjL2xhbmcvbG9jYWxlL3RoLnRzIiwgIi4uL3NyYy9sYW5nL2xvY2FsZS90ci50cyIsICIuLi9zcmMvbGFuZy9sb2NhbGUvdWsudHMiLCAiLi4vc3JjL2xhbmcvbG9jYWxlL3VyLnRzIiwgIi4uL3NyYy9sYW5nL2xvY2FsZS92aS50cyIsICIuLi9zcmMvbGFuZy9sb2NhbGUvemgtY24udHMiLCAiLi4vc3JjL2xhbmcvbG9jYWxlL3poLXR3LnRzIiwgIi4uL3NyYy9ndWkvZmxhc2hjYXJkLW1vZGFsLnRzeCIsICIuLi9zcmMvc2NoZWR1bGluZy50cyIsICIuLi9zcmMvY29uc3RhbnRzLnRzIiwgIi4uL3NyYy9Ub3BpY1BhdGgudHMiLCAiLi4vc3JjL0ZsYXNoY2FyZFJldmlld1NlcXVlbmNlci50cyIsICIuLi9zcmMvRGVjay50cyIsICIuLi9zcmMvdXRpbC91dGlscy50cyIsICIuLi9zcmMvdXRpbC9EYXRlUHJvdmlkZXIudHMiLCAiLi4vc3JjL0NhcmRTY2hlZHVsZS50cyIsICIuLi9zcmMvdXRpbC9NdWx0aUxpbmVUZXh0RmluZGVyLnRzIiwgIi4uL3NyYy9RdWVzdGlvbi50cyIsICIuLi9zcmMvZ3VpL2ZsYXNoY2FyZHMtZWRpdC1tb2RhbC50cyIsICIuLi9zcmMvdXRpbC9SZW5kZXJNYXJrZG93bldyYXBwZXIudHMiLCAiLi4vc3JjL2d1aS9zdGF0cy1tb2RhbC50c3giLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BrdXJrbGUrY29sb3JAMC4zLjIvbm9kZV9tb2R1bGVzL0BrdXJrbGUvY29sb3IvZGlzdC9jb2xvci5lc20uanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLmNvcmUudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLm1hdGgudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLmNvbGxlY3Rpb24udHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLmV4dHJhcy50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuZWFzaW5nLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2hlbHBlcnMvaGVscGVycy5jb2xvci50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuYW5pbWF0aW9ucy5kZWZhdWx0cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUubGF5b3V0cy5kZWZhdWx0cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuaW50bC50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUudGlja3MuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLnNjYWxlLmRlZmF1bHRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5kZWZhdWx0cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuY2FudmFzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2hlbHBlcnMvaGVscGVycy5vcHRpb25zLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2hlbHBlcnMvaGVscGVycy5jb25maWcudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLmN1cnZlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2hlbHBlcnMvaGVscGVycy5kb20udHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLmludGVycG9sYXRpb24udHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLnJ0bC50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuc2VnbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuYW5pbWF0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLmFuaW1hdGlvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuYW5pbWF0aW9ucy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuZGF0YXNldENvbnRyb2xsZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29udHJvbGxlcnMvY29udHJvbGxlci5iYXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29udHJvbGxlcnMvY29udHJvbGxlci5idWJibGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29udHJvbGxlcnMvY29udHJvbGxlci5kb3VnaG51dC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb250cm9sbGVycy9jb250cm9sbGVyLmxpbmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29udHJvbGxlcnMvY29udHJvbGxlci5wb2xhckFyZWEuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29udHJvbGxlcnMvY29udHJvbGxlci5waWUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29udHJvbGxlcnMvY29udHJvbGxlci5yYWRhci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb250cm9sbGVycy9jb250cm9sbGVyLnNjYXR0ZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLmFkYXB0ZXJzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5pbnRlcmFjdGlvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUubGF5b3V0cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbGF0Zm9ybS9wbGF0Zm9ybS5iYXNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3BsYXRmb3JtL3BsYXRmb3JtLmJhc2ljLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3BsYXRmb3JtL3BsYXRmb3JtLmRvbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbGF0Zm9ybS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuZWxlbWVudC50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuc2NhbGUuYXV0b3NraXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLnNjYWxlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS50eXBlZFJlZ2lzdHJ5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5yZWdpc3RyeS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUucGx1Z2lucy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuY29uZmlnLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5jb250cm9sbGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2VsZW1lbnRzL2VsZW1lbnQuYXJjLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2VsZW1lbnRzL2VsZW1lbnQubGluZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9lbGVtZW50cy9lbGVtZW50LnBvaW50LnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2VsZW1lbnRzL2VsZW1lbnQuYmFyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3BsdWdpbnMvcGx1Z2luLmNvbG9ycy50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5kZWNpbWF0aW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3BsdWdpbnMvcGx1Z2luLmZpbGxlci9maWxsZXIuc2VnbWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5maWxsZXIvZmlsbGVyLmhlbHBlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5maWxsZXIvZmlsbGVyLm9wdGlvbnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4uZmlsbGVyL2ZpbGxlci50YXJnZXQuc3RhY2suanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4uZmlsbGVyL3NpbXBsZUFyYy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5maWxsZXIvZmlsbGVyLnRhcmdldC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5maWxsZXIvZmlsbGVyLmRyYXdpbmcuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJ0LmpzQDQuNC4xL25vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4uZmlsbGVyL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3BsdWdpbnMvcGx1Z2luLmxlZ2VuZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi50aXRsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5zdWJ0aXRsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi50b29sdGlwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS5jYXRlZ29yeS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9zY2FsZXMvc2NhbGUubGluZWFyYmFzZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9zY2FsZXMvc2NhbGUubGluZWFyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS5sb2dhcml0aG1pYy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhcnQuanNANC40LjEvbm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9zY2FsZXMvc2NhbGUucmFkaWFsTGluZWFyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS50aW1lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS50aW1lc2VyaWVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFydC5qc0A0LjQuMS9ub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9ndWkvc2lkZWJhci50cyIsICIuLi9zcmMvUmV2aWV3RGVjay50cyIsICIuLi9zcmMvaWNvbnMvYXBwaWNvbi50cyIsICIuLi9zcmMvdXRpbC9SYW5kb21OdW1iZXJQcm92aWRlci50cyIsICIuLi9zcmMvRGVja1RyZWVJdGVyYXRvci50cyIsICIuLi9zcmMvTm90ZS50cyIsICIuLi9zcmMvQ2FyZC50cyIsICIuLi9zcmMvcGFyc2VyLnRzIiwgIi4uL3NyYy9RdWVzdGlvblR5cGUudHMiLCAiLi4vc3JjL05vdGVRdWVzdGlvblBhcnNlci50cyIsICIuLi9zcmMvTm90ZUZpbGVMb2FkZXIudHMiLCAiLi4vc3JjL1NSRmlsZS50cyIsICIuLi9zcmMvTm90ZUVhc2VDYWxjdWxhdG9yLnRzIiwgIi4uL3NyYy91dGlsL051bWJlckNvdW50RGljdC50cyIsICIuLi9zcmMvc3RhdHMudHMiLCAiLi4vc3JjL0RlY2tUcmVlU3RhdHNDYWxjdWxhdG9yLnRzIiwgIi4uL3NyYy9Ob3RlRWFzZUxpc3QudHMiLCAiLi4vc3JjL1F1ZXN0aW9uUG9zdHBvbmVtZW50TGlzdC50cyJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBLHdGQUFBQSxTQUFBO0FBQUE7QUFFQSxhQUFTLE9BQU8sUUFBUUMsV0FBVTtBQUM5QixVQUFLLE9BQU8sV0FBVyxZQUFjLE9BQU9BLGNBQWEsWUFBYTtBQUNsRSxpQkFBUyxPQUFPLFFBQVE7QUFDcEIsY0FBSSxPQUFPLGVBQWUsR0FBRyxNQUFNLE1BQU07QUFDckMsZ0JBQUlBLFVBQVMsS0FBSyxPQUFPLEdBQUcsQ0FBQyxNQUFNLE9BQU87QUFDdEM7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUVBLElBQUFELFFBQU8sVUFBVyxXQUFZO0FBQzFCLFVBQUksT0FBTztBQUFBLFFBQ1AsT0FBTztBQUFBLFFBQ1AsT0FBTyxDQUFDO0FBQUEsUUFDUixPQUFPLENBQUM7QUFBQSxNQUNaO0FBRUEsV0FBSyxPQUFPLFNBQVUsUUFBUSxRQUFRLFFBQVE7QUFDMUMsWUFBSyxTQUFTLE1BQU0sTUFBTSxRQUFVLFdBQVcsTUFBTztBQUNsRCxtQkFBUztBQUFBLFFBQ2I7QUFFQSxpQkFBUyxXQUFXLE1BQU07QUFFMUIsWUFBSSxLQUFLLE1BQU0sZUFBZSxNQUFNLE1BQU0sTUFBTTtBQUM1QyxlQUFLO0FBQ0wsZUFBSyxNQUFNLE1BQU0sSUFBSTtBQUFBLFlBQ2pCLFFBQVE7QUFBQSxZQUNSLFVBQVU7QUFBQSxVQUNkO0FBQUEsUUFDSjtBQUVBLGFBQUssTUFBTSxNQUFNLEVBQUUsWUFBWTtBQUUvQixZQUFJLEtBQUssTUFBTSxlQUFlLE1BQU0sTUFBTSxNQUFNO0FBQzVDLGVBQUs7QUFDTCxlQUFLLE1BQU0sTUFBTSxJQUFJO0FBQUEsWUFDakIsUUFBUTtBQUFBLFlBQ1IsVUFBVTtBQUFBLFVBQ2Q7QUFBQSxRQUNKO0FBRUEsWUFBSSxLQUFLLE1BQU0sZUFBZSxNQUFNLE1BQU0sTUFBTTtBQUM1QyxlQUFLLE1BQU0sTUFBTSxJQUFJLENBQUM7QUFBQSxRQUMxQjtBQUVBLFlBQUksS0FBSyxNQUFNLE1BQU0sRUFBRSxlQUFlLE1BQU0sTUFBTSxNQUFNO0FBQ3BELGVBQUssTUFBTSxNQUFNLEVBQUUsTUFBTSxJQUFJO0FBQUEsUUFDakM7QUFFQSxhQUFLLE1BQU0sTUFBTSxFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ2xDO0FBRUEsV0FBSyxPQUFPLFNBQVVFLFFBQU8sU0FBU0QsV0FBVTtBQUM1QyxZQUFJLFFBQVEsR0FDUixVQUFVLElBQUksS0FBSztBQUV2QixlQUFPLEtBQUssT0FBTyxTQUFVLFFBQVE7QUFDakMsY0FBSSxLQUFLLE1BQU0sTUFBTSxFQUFFLFdBQVcsR0FBRztBQUNqQyxtQkFBTyxLQUFLLE1BQU0sTUFBTSxHQUFHLFNBQVUsUUFBUTtBQUN6QyxtQkFBSyxNQUFNLE1BQU0sRUFBRSxNQUFNLEtBQUssS0FBSyxNQUFNLE1BQU0sRUFBRTtBQUFBLFlBQ3JELENBQUM7QUFBQSxVQUNMO0FBQUEsUUFDSixDQUFDO0FBRUQsZUFBTyxLQUFLLE9BQU8sU0FBVSxLQUFLO0FBQzlCLGVBQUssTUFBTSxHQUFHLEVBQUUsU0FBUztBQUFBLFFBQzdCLENBQUM7QUFFRCxlQUFPLFFBQVEsU0FBUztBQUNwQixjQUFJLE9BQU8sR0FDUCxRQUFRLENBQUM7QUFFYixpQkFBTyxLQUFLLE9BQU8sU0FBVSxLQUFLLE9BQU87QUFDckMsa0JBQU0sR0FBRyxJQUFJLE1BQU07QUFFbkIsZ0JBQUksTUFBTSxhQUFhLEdBQUc7QUFDdEIsc0JBQVEsTUFBTTtBQUFBLFlBQ2xCO0FBRUEsaUJBQUssTUFBTSxHQUFHLEVBQUUsU0FBUztBQUFBLFVBQzdCLENBQUM7QUFFRCxrQkFBUUM7QUFFUixpQkFBTyxLQUFLLE9BQU8sU0FBVSxRQUFRO0FBQ2pDLG1CQUFPLEtBQUssTUFBTSxNQUFNLEdBQUcsU0FBVSxRQUFRLFFBQVE7QUFDakQsbUJBQUssTUFBTSxNQUFNLEVBQUUsVUFBVUEsU0FBUSxNQUFNLE1BQU0sSUFBSTtBQUFBLFlBQ3pELENBQUM7QUFFRCxpQkFBSyxNQUFNLE1BQU0sRUFBRSxXQUFXLElBQUlBLFVBQVMsVUFBVSxPQUFPO0FBQUEsVUFDaEUsQ0FBQztBQUVELGtCQUFRO0FBRVIsaUJBQU8sS0FBSyxPQUFPLFNBQVUsS0FBSyxPQUFPO0FBQ3JDLHFCQUFTLEtBQUssSUFBSSxNQUFNLFNBQVMsTUFBTSxHQUFHLENBQUM7QUFBQSxVQUMvQyxDQUFDO0FBQUEsUUFDTDtBQUVBLGVBQU8sS0FBSyxPQUFPLFNBQVUsS0FBSztBQUM5QixpQkFBT0QsVUFBUyxLQUFLLEtBQUssTUFBTSxHQUFHLEVBQUUsTUFBTTtBQUFBLFFBQy9DLENBQUM7QUFBQSxNQUNMO0FBRUEsV0FBSyxRQUFRLFdBQVk7QUFDckIsYUFBSyxRQUFRO0FBQ2IsYUFBSyxRQUFRLENBQUM7QUFDZCxhQUFLLFFBQVEsQ0FBQztBQUFBLE1BQ2xCO0FBRUEsYUFBTztBQUFBLElBQ1gsRUFBRztBQUFBO0FBQUE7Ozs7Ozs7OztBQ3BISCxVQUFBLFlBQWUsQ0FDZCxRQUNBLFFBQ0EsTUFDQSxPQUNBLFdBQ0EsU0FDQSxNQUNBLE9BQ0EsU0FDQSxVQUNBLFFBQ0EsUUFDQSxTQUNBLFVBQ0EsU0FDQSxLQWhCYztBQ0dmLFVBQUlFLE1BQU0sU0FBTkEsS0FBTSxLQUFBO2VBQU9DLE9BQU9DLEdBQVAsRUFBWUMsUUFBUSxZQUFZLFNBQUEsR0FBQTt1QkFBT0MsS0FBSUMsQ0FBSixJQUFQO1NBQWhDOztBQUNqQixVQUFJRCxPQUFNLEVBQUMsS0FBSSxPQUFNLEtBQUksTUFBSyxLQUFJLE1BQUssS0FBSSxRQUFPLEtBQUksT0FBNUM7QUFDVixVQUFJRSxtQkFBbUI7QUFDdkIsVUFBSUMsb0JBQW9CO21CQUNaO2lCQUNGOztBQUdWLFVBQUlDLFlBQVksQ0FBQTtBQUdoQixlQUF3QkMsR0FBRUMsTUFBTUMsT0FBTztZQUNsQ0MsUUFBTSxDQUFBLEdBQUlQLElBQUk7Z0JBQ1ZNLFNBQVMsQ0FBQTtpQkFDUkUsSUFBRUMsVUFBVUMsUUFBUUYsTUFBTSxLQUFLO2dCQUNqQ0csS0FBS0YsVUFBVUQsQ0FBVixDQUFYOztZQUlHLE9BQU9ILFNBQU8sWUFBWTtnQkFDdkJPLFdBQVdMLE1BQU1NLFFBQU47aUJBQ1ZSLEtBQUtDLEtBQUw7O1lBSUpELE1BQU07ZUFDSixNQUFNQTtjQUNQQztBQUFPLHFCQUFTRSxNQUFLRixPQUFPO2tCQUMzQkEsTUFBTUUsRUFBTixNQUFXLFNBQVNGLE1BQU1FLEVBQU4sS0FBVSxRQUFRQSxPQUFNUCxrQkFBa0I7NEJBQ3hEQyxrQkFBa0JNLEVBQWxCLElBQXVCTixrQkFBa0JNLEVBQWxCLElBQXVCYixJQUFJYSxFQUFKLEtBQXZELE9BQWtFYixJQUFJVyxNQUFNRSxFQUFOLENBQUosSUFBbEU7OztlQUdHOztZQUdGTSxVQUFVQyxRQUFRVixJQUFsQixNQUE0QixJQUFJO2NBQy9CQyxNQUFNTCxnQkFBTixHQUF5QjtpQkFDdkJLLE1BQU1MLGdCQUFOLEVBQXdCZTs7QUFFekIsbUJBQU9ULE1BQU1HLFFBQVE7a0JBQ3JCTyxRQUFRVixNQUFNVyxJQUFOO2tCQUNSRCxPQUFPO29CQUNOQSxNQUFNQyxLQUFLOzJCQUNMVixNQUFFUyxNQUFNUCxRQUFRRixTQUF6QjswQkFBc0NHLEtBQUtNLE1BQU1ULEdBQU4sQ0FBWDs7dUJBRTVCO3VCQUNDTCxVQUFVYyxLQUFWLE1BQW1CLE9BQU9BLFFBQVF0QixJQUFJc0IsS0FBSjs7OztlQUtyQ1osT0FBQUEsT0FBWUEsT0FBWixNQUFzQjs7a0JBR2xCTCxDQUFWLElBQWU7ZUFDUkE7Ozs7Ozs7O0FDMURSO0FBQUEsNEVBQUFtQixTQUFBO0FBTUMsS0FBQyxTQUFVLFFBQVEsU0FBUztBQUN6QixhQUFPLFlBQVksWUFBWSxPQUFPQSxZQUFXLGNBQWNBLFFBQU8sVUFBVSxRQUFRLElBQ3hGLE9BQU8sV0FBVyxjQUFjLE9BQU8sTUFBTSxPQUFPLE9BQU8sSUFDM0QsT0FBTyxTQUFTLFFBQVE7QUFBQSxJQUM1QixHQUFFLFNBQU8sV0FBWTtBQUFFO0FBRW5CLFVBQUk7QUFFSixlQUFTLFFBQVE7QUFDYixlQUFPLGFBQWEsTUFBTSxNQUFNLFNBQVM7QUFBQSxNQUM3QztBQUlBLGVBQVMsZ0JBQWdCQyxXQUFVO0FBQy9CLHVCQUFlQTtBQUFBLE1BQ25CO0FBRUEsZUFBU0MsU0FBUSxPQUFPO0FBQ3BCLGVBQ0ksaUJBQWlCLFNBQ2pCLE9BQU8sVUFBVSxTQUFTLEtBQUssS0FBSyxNQUFNO0FBQUEsTUFFbEQ7QUFFQSxlQUFTQyxVQUFTLE9BQU87QUFHckIsZUFDSSxTQUFTLFFBQ1QsT0FBTyxVQUFVLFNBQVMsS0FBSyxLQUFLLE1BQU07QUFBQSxNQUVsRDtBQUVBLGVBQVMsV0FBVyxHQUFHLEdBQUc7QUFDdEIsZUFBTyxPQUFPLFVBQVUsZUFBZSxLQUFLLEdBQUcsQ0FBQztBQUFBLE1BQ3BEO0FBRUEsZUFBUyxjQUFjLEtBQUs7QUFDeEIsWUFBSSxPQUFPLHFCQUFxQjtBQUM1QixpQkFBTyxPQUFPLG9CQUFvQixHQUFHLEVBQUUsV0FBVztBQUFBLFFBQ3RELE9BQU87QUFDSCxjQUFJO0FBQ0osZUFBSyxLQUFLLEtBQUs7QUFDWCxnQkFBSSxXQUFXLEtBQUssQ0FBQyxHQUFHO0FBQ3BCLHFCQUFPO0FBQUEsWUFDWDtBQUFBLFVBQ0o7QUFDQSxpQkFBTztBQUFBLFFBQ1g7QUFBQSxNQUNKO0FBRUEsZUFBUyxZQUFZLE9BQU87QUFDeEIsZUFBTyxVQUFVO0FBQUEsTUFDckI7QUFFQSxlQUFTQyxVQUFTLE9BQU87QUFDckIsZUFDSSxPQUFPLFVBQVUsWUFDakIsT0FBTyxVQUFVLFNBQVMsS0FBSyxLQUFLLE1BQU07QUFBQSxNQUVsRDtBQUVBLGVBQVMsT0FBTyxPQUFPO0FBQ25CLGVBQ0ksaUJBQWlCLFFBQ2pCLE9BQU8sVUFBVSxTQUFTLEtBQUssS0FBSyxNQUFNO0FBQUEsTUFFbEQ7QUFFQSxlQUFTQyxLQUFJLEtBQUssSUFBSTtBQUNsQixZQUFJLE1BQU0sQ0FBQyxHQUNQLEdBQ0EsU0FBUyxJQUFJO0FBQ2pCLGFBQUssSUFBSSxHQUFHLElBQUksUUFBUSxFQUFFLEdBQUc7QUFDekIsY0FBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQUEsUUFDMUI7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUVBLGVBQVMsT0FBTyxHQUFHLEdBQUc7QUFDbEIsaUJBQVMsS0FBSyxHQUFHO0FBQ2IsY0FBSSxXQUFXLEdBQUcsQ0FBQyxHQUFHO0FBQ2xCLGNBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUFBLFVBQ2Q7QUFBQSxRQUNKO0FBRUEsWUFBSSxXQUFXLEdBQUcsVUFBVSxHQUFHO0FBQzNCLFlBQUUsV0FBVyxFQUFFO0FBQUEsUUFDbkI7QUFFQSxZQUFJLFdBQVcsR0FBRyxTQUFTLEdBQUc7QUFDMUIsWUFBRSxVQUFVLEVBQUU7QUFBQSxRQUNsQjtBQUVBLGVBQU87QUFBQSxNQUNYO0FBRUEsZUFBUyxVQUFVLE9BQU9DLFNBQVFDLFNBQVEsUUFBUTtBQUM5QyxlQUFPLGlCQUFpQixPQUFPRCxTQUFRQyxTQUFRLFFBQVEsSUFBSSxFQUFFLElBQUk7QUFBQSxNQUNyRTtBQUVBLGVBQVMsc0JBQXNCO0FBRTNCLGVBQU87QUFBQSxVQUNILE9BQU87QUFBQSxVQUNQLGNBQWMsQ0FBQztBQUFBLFVBQ2YsYUFBYSxDQUFDO0FBQUEsVUFDZCxVQUFVO0FBQUEsVUFDVixlQUFlO0FBQUEsVUFDZixXQUFXO0FBQUEsVUFDWCxZQUFZO0FBQUEsVUFDWixjQUFjO0FBQUEsVUFDZCxlQUFlO0FBQUEsVUFDZixpQkFBaUI7QUFBQSxVQUNqQixLQUFLO0FBQUEsVUFDTCxpQkFBaUIsQ0FBQztBQUFBLFVBQ2xCLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULGlCQUFpQjtBQUFBLFFBQ3JCO0FBQUEsTUFDSjtBQUVBLGVBQVMsZ0JBQWdCLEdBQUc7QUFDeEIsWUFBSSxFQUFFLE9BQU8sTUFBTTtBQUNmLFlBQUUsTUFBTSxvQkFBb0I7QUFBQSxRQUNoQztBQUNBLGVBQU8sRUFBRTtBQUFBLE1BQ2I7QUFFQSxVQUFJO0FBQ0osVUFBSSxNQUFNLFVBQVUsTUFBTTtBQUN0QixlQUFPLE1BQU0sVUFBVTtBQUFBLE1BQzNCLE9BQU87QUFDSCxlQUFPLFNBQVUsS0FBSztBQUNsQixjQUFJQyxLQUFJLE9BQU8sSUFBSSxHQUNmLE1BQU1BLEdBQUUsV0FBVyxHQUNuQjtBQUVKLGVBQUssSUFBSSxHQUFHLElBQUksS0FBSyxLQUFLO0FBQ3RCLGdCQUFJLEtBQUtBLE1BQUssSUFBSSxLQUFLLE1BQU1BLEdBQUUsQ0FBQyxHQUFHLEdBQUdBLEVBQUMsR0FBRztBQUN0QyxxQkFBTztBQUFBLFlBQ1g7QUFBQSxVQUNKO0FBRUEsaUJBQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUVBLGVBQVMsUUFBUSxHQUFHO0FBQ2hCLFlBQUksUUFBUSxNQUNSLGNBQWMsT0FDZCxhQUFhLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQztBQUM5QyxZQUFJLFlBQVk7QUFDWixrQkFBUSxnQkFBZ0IsQ0FBQztBQUN6Qix3QkFBYyxLQUFLLEtBQUssTUFBTSxpQkFBaUIsU0FBVSxHQUFHO0FBQ3hELG1CQUFPLEtBQUs7QUFBQSxVQUNoQixDQUFDO0FBQ0QsdUJBQ0ksTUFBTSxXQUFXLEtBQ2pCLENBQUMsTUFBTSxTQUNQLENBQUMsTUFBTSxjQUNQLENBQUMsTUFBTSxnQkFDUCxDQUFDLE1BQU0sa0JBQ1AsQ0FBQyxNQUFNLG1CQUNQLENBQUMsTUFBTSxhQUNQLENBQUMsTUFBTSxpQkFDUCxDQUFDLE1BQU0sb0JBQ04sQ0FBQyxNQUFNLFlBQWEsTUFBTSxZQUFZO0FBQzNDLGNBQUksRUFBRSxTQUFTO0FBQ1gseUJBQ0ksY0FDQSxNQUFNLGtCQUFrQixLQUN4QixNQUFNLGFBQWEsV0FBVyxLQUM5QixNQUFNLFlBQVk7QUFBQSxVQUMxQjtBQUFBLFFBQ0o7QUFDQSxZQUFJLE9BQU8sWUFBWSxRQUFRLENBQUMsT0FBTyxTQUFTLENBQUMsR0FBRztBQUNoRCxZQUFFLFdBQVc7QUFBQSxRQUNqQixPQUFPO0FBQ0gsaUJBQU87QUFBQSxRQUNYO0FBQ0EsZUFBTyxFQUFFO0FBQUEsTUFDYjtBQUVBLGVBQVMsY0FBYyxPQUFPO0FBQzFCLFlBQUksSUFBSSxVQUFVLEdBQUc7QUFDckIsWUFBSSxTQUFTLE1BQU07QUFDZixpQkFBTyxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUs7QUFBQSxRQUNwQyxPQUFPO0FBQ0gsMEJBQWdCLENBQUMsRUFBRSxrQkFBa0I7QUFBQSxRQUN6QztBQUVBLGVBQU87QUFBQSxNQUNYO0FBSUEsVUFBSSxtQkFBb0IsTUFBTSxtQkFBbUIsQ0FBQyxHQUM5QyxtQkFBbUI7QUFFdkIsZUFBUyxXQUFXQyxLQUFJQyxPQUFNO0FBQzFCLFlBQUksR0FDQSxNQUNBLEtBQ0Esc0JBQXNCLGlCQUFpQjtBQUUzQyxZQUFJLENBQUMsWUFBWUEsTUFBSyxnQkFBZ0IsR0FBRztBQUNyQyxVQUFBRCxJQUFHLG1CQUFtQkMsTUFBSztBQUFBLFFBQy9CO0FBQ0EsWUFBSSxDQUFDLFlBQVlBLE1BQUssRUFBRSxHQUFHO0FBQ3ZCLFVBQUFELElBQUcsS0FBS0MsTUFBSztBQUFBLFFBQ2pCO0FBQ0EsWUFBSSxDQUFDLFlBQVlBLE1BQUssRUFBRSxHQUFHO0FBQ3ZCLFVBQUFELElBQUcsS0FBS0MsTUFBSztBQUFBLFFBQ2pCO0FBQ0EsWUFBSSxDQUFDLFlBQVlBLE1BQUssRUFBRSxHQUFHO0FBQ3ZCLFVBQUFELElBQUcsS0FBS0MsTUFBSztBQUFBLFFBQ2pCO0FBQ0EsWUFBSSxDQUFDLFlBQVlBLE1BQUssT0FBTyxHQUFHO0FBQzVCLFVBQUFELElBQUcsVUFBVUMsTUFBSztBQUFBLFFBQ3RCO0FBQ0EsWUFBSSxDQUFDLFlBQVlBLE1BQUssSUFBSSxHQUFHO0FBQ3pCLFVBQUFELElBQUcsT0FBT0MsTUFBSztBQUFBLFFBQ25CO0FBQ0EsWUFBSSxDQUFDLFlBQVlBLE1BQUssTUFBTSxHQUFHO0FBQzNCLFVBQUFELElBQUcsU0FBU0MsTUFBSztBQUFBLFFBQ3JCO0FBQ0EsWUFBSSxDQUFDLFlBQVlBLE1BQUssT0FBTyxHQUFHO0FBQzVCLFVBQUFELElBQUcsVUFBVUMsTUFBSztBQUFBLFFBQ3RCO0FBQ0EsWUFBSSxDQUFDLFlBQVlBLE1BQUssR0FBRyxHQUFHO0FBQ3hCLFVBQUFELElBQUcsTUFBTSxnQkFBZ0JDLEtBQUk7QUFBQSxRQUNqQztBQUNBLFlBQUksQ0FBQyxZQUFZQSxNQUFLLE9BQU8sR0FBRztBQUM1QixVQUFBRCxJQUFHLFVBQVVDLE1BQUs7QUFBQSxRQUN0QjtBQUVBLFlBQUksc0JBQXNCLEdBQUc7QUFDekIsZUFBSyxJQUFJLEdBQUcsSUFBSSxxQkFBcUIsS0FBSztBQUN0QyxtQkFBTyxpQkFBaUIsQ0FBQztBQUN6QixrQkFBTUEsTUFBSyxJQUFJO0FBQ2YsZ0JBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRztBQUNuQixjQUFBRCxJQUFHLElBQUksSUFBSTtBQUFBLFlBQ2Y7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUVBLGVBQU9BO0FBQUEsTUFDWDtBQUdBLGVBQVMsT0FBTyxRQUFRO0FBQ3BCLG1CQUFXLE1BQU0sTUFBTTtBQUN2QixhQUFLLEtBQUssSUFBSSxLQUFLLE9BQU8sTUFBTSxPQUFPLE9BQU8sR0FBRyxRQUFRLElBQUksR0FBRztBQUNoRSxZQUFJLENBQUMsS0FBSyxRQUFRLEdBQUc7QUFDakIsZUFBSyxLQUFLLG9CQUFJLEtBQUssR0FBRztBQUFBLFFBQzFCO0FBR0EsWUFBSSxxQkFBcUIsT0FBTztBQUM1Qiw2QkFBbUI7QUFDbkIsZ0JBQU0sYUFBYSxJQUFJO0FBQ3ZCLDZCQUFtQjtBQUFBLFFBQ3ZCO0FBQUEsTUFDSjtBQUVBLGVBQVMsU0FBUyxLQUFLO0FBQ25CLGVBQ0ksZUFBZSxVQUFXLE9BQU8sUUFBUSxJQUFJLG9CQUFvQjtBQUFBLE1BRXpFO0FBRUEsZUFBUyxLQUFLLEtBQUs7QUFDZixZQUNJLE1BQU0sZ0NBQWdDLFNBQ3RDLE9BQU8sWUFBWSxlQUNuQixRQUFRLE1BQ1Y7QUFDRSxrQkFBUSxLQUFLLDBCQUEwQixHQUFHO0FBQUEsUUFDOUM7QUFBQSxNQUNKO0FBRUEsZUFBUyxVQUFVLEtBQUssSUFBSTtBQUN4QixZQUFJLFlBQVk7QUFFaEIsZUFBTyxPQUFPLFdBQVk7QUFDdEIsY0FBSSxNQUFNLHNCQUFzQixNQUFNO0FBQ2xDLGtCQUFNLG1CQUFtQixNQUFNLEdBQUc7QUFBQSxVQUN0QztBQUNBLGNBQUksV0FBVztBQUNYLGdCQUFJLE9BQU8sQ0FBQyxHQUNSLEtBQ0EsR0FDQSxLQUNBLFNBQVMsVUFBVTtBQUN2QixpQkFBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLEtBQUs7QUFDekIsb0JBQU07QUFDTixrQkFBSSxPQUFPLFVBQVUsQ0FBQyxNQUFNLFVBQVU7QUFDbEMsdUJBQU8sUUFBUSxJQUFJO0FBQ25CLHFCQUFLLE9BQU8sVUFBVSxDQUFDLEdBQUc7QUFDdEIsc0JBQUksV0FBVyxVQUFVLENBQUMsR0FBRyxHQUFHLEdBQUc7QUFDL0IsMkJBQU8sTUFBTSxPQUFPLFVBQVUsQ0FBQyxFQUFFLEdBQUcsSUFBSTtBQUFBLGtCQUM1QztBQUFBLGdCQUNKO0FBQ0Esc0JBQU0sSUFBSSxNQUFNLEdBQUcsRUFBRTtBQUFBLGNBQ3pCLE9BQU87QUFDSCxzQkFBTSxVQUFVLENBQUM7QUFBQSxjQUNyQjtBQUNBLG1CQUFLLEtBQUssR0FBRztBQUFBLFlBQ2pCO0FBQ0E7QUFBQSxjQUNJLE1BQ0ksa0JBQ0EsTUFBTSxVQUFVLE1BQU0sS0FBSyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQ3hDLE9BQ0EsSUFBSSxNQUFNLEVBQUU7QUFBQSxZQUNwQjtBQUNBLHdCQUFZO0FBQUEsVUFDaEI7QUFDQSxpQkFBTyxHQUFHLE1BQU0sTUFBTSxTQUFTO0FBQUEsUUFDbkMsR0FBRyxFQUFFO0FBQUEsTUFDVDtBQUVBLFVBQUksZUFBZSxDQUFDO0FBRXBCLGVBQVMsZ0JBQWdCLE1BQU0sS0FBSztBQUNoQyxZQUFJLE1BQU0sc0JBQXNCLE1BQU07QUFDbEMsZ0JBQU0sbUJBQW1CLE1BQU0sR0FBRztBQUFBLFFBQ3RDO0FBQ0EsWUFBSSxDQUFDLGFBQWEsSUFBSSxHQUFHO0FBQ3JCLGVBQUssR0FBRztBQUNSLHVCQUFhLElBQUksSUFBSTtBQUFBLFFBQ3pCO0FBQUEsTUFDSjtBQUVBLFlBQU0sOEJBQThCO0FBQ3BDLFlBQU0scUJBQXFCO0FBRTNCLGVBQVNFLFlBQVcsT0FBTztBQUN2QixlQUNLLE9BQU8sYUFBYSxlQUFlLGlCQUFpQixZQUNyRCxPQUFPLFVBQVUsU0FBUyxLQUFLLEtBQUssTUFBTTtBQUFBLE1BRWxEO0FBRUEsZUFBU0MsS0FBSSxRQUFRO0FBQ2pCLFlBQUksTUFBTTtBQUNWLGFBQUssS0FBSyxRQUFRO0FBQ2QsY0FBSSxXQUFXLFFBQVEsQ0FBQyxHQUFHO0FBQ3ZCLG1CQUFPLE9BQU8sQ0FBQztBQUNmLGdCQUFJRCxZQUFXLElBQUksR0FBRztBQUNsQixtQkFBSyxDQUFDLElBQUk7QUFBQSxZQUNkLE9BQU87QUFDSCxtQkFBSyxNQUFNLENBQUMsSUFBSTtBQUFBLFlBQ3BCO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFDQSxhQUFLLFVBQVU7QUFJZixhQUFLLGlDQUFpQyxJQUFJO0FBQUEsV0FDckMsS0FBSyx3QkFBd0IsVUFBVSxLQUFLLGNBQWMsVUFDdkQsTUFDQSxVQUFVO0FBQUEsUUFDbEI7QUFBQSxNQUNKO0FBRUEsZUFBUyxhQUFhLGNBQWMsYUFBYTtBQUM3QyxZQUFJLE1BQU0sT0FBTyxDQUFDLEdBQUcsWUFBWSxHQUM3QjtBQUNKLGFBQUssUUFBUSxhQUFhO0FBQ3RCLGNBQUksV0FBVyxhQUFhLElBQUksR0FBRztBQUMvQixnQkFBSVIsVUFBUyxhQUFhLElBQUksQ0FBQyxLQUFLQSxVQUFTLFlBQVksSUFBSSxDQUFDLEdBQUc7QUFDN0Qsa0JBQUksSUFBSSxJQUFJLENBQUM7QUFDYixxQkFBTyxJQUFJLElBQUksR0FBRyxhQUFhLElBQUksQ0FBQztBQUNwQyxxQkFBTyxJQUFJLElBQUksR0FBRyxZQUFZLElBQUksQ0FBQztBQUFBLFlBQ3ZDLFdBQVcsWUFBWSxJQUFJLEtBQUssTUFBTTtBQUNsQyxrQkFBSSxJQUFJLElBQUksWUFBWSxJQUFJO0FBQUEsWUFDaEMsT0FBTztBQUNILHFCQUFPLElBQUksSUFBSTtBQUFBLFlBQ25CO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFDQSxhQUFLLFFBQVEsY0FBYztBQUN2QixjQUNJLFdBQVcsY0FBYyxJQUFJLEtBQzdCLENBQUMsV0FBVyxhQUFhLElBQUksS0FDN0JBLFVBQVMsYUFBYSxJQUFJLENBQUMsR0FDN0I7QUFFRSxnQkFBSSxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUM7QUFBQSxVQUNwQztBQUFBLFFBQ0o7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUVBLGVBQVMsT0FBTyxRQUFRO0FBQ3BCLFlBQUksVUFBVSxNQUFNO0FBQ2hCLGVBQUssSUFBSSxNQUFNO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBRUEsVUFBSTtBQUVKLFVBQUksT0FBTyxNQUFNO0FBQ2IsZUFBTyxPQUFPO0FBQUEsTUFDbEIsT0FBTztBQUNILGVBQU8sU0FBVSxLQUFLO0FBQ2xCLGNBQUksR0FDQSxNQUFNLENBQUM7QUFDWCxlQUFLLEtBQUssS0FBSztBQUNYLGdCQUFJLFdBQVcsS0FBSyxDQUFDLEdBQUc7QUFDcEIsa0JBQUksS0FBSyxDQUFDO0FBQUEsWUFDZDtBQUFBLFVBQ0o7QUFDQSxpQkFBTztBQUFBLFFBQ1g7QUFBQSxNQUNKO0FBRUEsVUFBSSxrQkFBa0I7QUFBQSxRQUNsQixTQUFTO0FBQUEsUUFDVCxTQUFTO0FBQUEsUUFDVCxVQUFVO0FBQUEsUUFDVixTQUFTO0FBQUEsUUFDVCxVQUFVO0FBQUEsUUFDVixVQUFVO0FBQUEsTUFDZDtBQUVBLGVBQVMsU0FBUyxLQUFLLEtBQUtVLE1BQUs7QUFDN0IsWUFBSSxTQUFTLEtBQUssVUFBVSxHQUFHLEtBQUssS0FBSyxVQUFVLFVBQVU7QUFDN0QsZUFBT0YsWUFBVyxNQUFNLElBQUksT0FBTyxLQUFLLEtBQUtFLElBQUcsSUFBSTtBQUFBLE1BQ3hEO0FBRUEsZUFBUyxTQUFTLFFBQVEsY0FBYyxXQUFXO0FBQy9DLFlBQUksWUFBWSxLQUFLLEtBQUssSUFBSSxNQUFNLEdBQ2hDLGNBQWMsZUFBZSxVQUFVLFFBQ3ZDQyxRQUFPLFVBQVU7QUFDckIsZ0JBQ0tBLFFBQVEsWUFBWSxNQUFNLEtBQU0sT0FDakMsS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsV0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxJQUMxRDtBQUFBLE1BRVI7QUFFQSxVQUFJLG1CQUNJLDBNQUNKLHdCQUF3Qiw4Q0FDeEIsa0JBQWtCLENBQUMsR0FDbkIsdUJBQXVCLENBQUM7QUFNNUIsZUFBUyxlQUFlQyxRQUFPLFFBQVFDLFVBQVNmLFdBQVU7QUFDdEQsWUFBSSxPQUFPQTtBQUNYLFlBQUksT0FBT0EsY0FBYSxVQUFVO0FBQzlCLGlCQUFPLFdBQVk7QUFDZixtQkFBTyxLQUFLQSxTQUFRLEVBQUU7QUFBQSxVQUMxQjtBQUFBLFFBQ0o7QUFDQSxZQUFJYyxRQUFPO0FBQ1AsK0JBQXFCQSxNQUFLLElBQUk7QUFBQSxRQUNsQztBQUNBLFlBQUksUUFBUTtBQUNSLCtCQUFxQixPQUFPLENBQUMsQ0FBQyxJQUFJLFdBQVk7QUFDMUMsbUJBQU8sU0FBUyxLQUFLLE1BQU0sTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7QUFBQSxVQUNyRTtBQUFBLFFBQ0o7QUFDQSxZQUFJQyxVQUFTO0FBQ1QsK0JBQXFCQSxRQUFPLElBQUksV0FBWTtBQUN4QyxtQkFBTyxLQUFLLFdBQVcsRUFBRTtBQUFBLGNBQ3JCLEtBQUssTUFBTSxNQUFNLFNBQVM7QUFBQSxjQUMxQkQ7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBRUEsZUFBUyx1QkFBdUIsT0FBTztBQUNuQyxZQUFJLE1BQU0sTUFBTSxVQUFVLEdBQUc7QUFDekIsaUJBQU8sTUFBTSxRQUFRLFlBQVksRUFBRTtBQUFBLFFBQ3ZDO0FBQ0EsZUFBTyxNQUFNLFFBQVEsT0FBTyxFQUFFO0FBQUEsTUFDbEM7QUFFQSxlQUFTLG1CQUFtQlQsU0FBUTtBQUNoQyxZQUFJLFFBQVFBLFFBQU8sTUFBTSxnQkFBZ0IsR0FDckMsR0FDQTtBQUVKLGFBQUssSUFBSSxHQUFHLFNBQVMsTUFBTSxRQUFRLElBQUksUUFBUSxLQUFLO0FBQ2hELGNBQUkscUJBQXFCLE1BQU0sQ0FBQyxDQUFDLEdBQUc7QUFDaEMsa0JBQU0sQ0FBQyxJQUFJLHFCQUFxQixNQUFNLENBQUMsQ0FBQztBQUFBLFVBQzVDLE9BQU87QUFDSCxrQkFBTSxDQUFDLElBQUksdUJBQXVCLE1BQU0sQ0FBQyxDQUFDO0FBQUEsVUFDOUM7QUFBQSxRQUNKO0FBRUEsZUFBTyxTQUFVLEtBQUs7QUFDbEIsY0FBSSxTQUFTLElBQ1RXO0FBQ0osZUFBS0EsS0FBSSxHQUFHQSxLQUFJLFFBQVFBLE1BQUs7QUFDekIsc0JBQVVOLFlBQVcsTUFBTU0sRUFBQyxDQUFDLElBQ3ZCLE1BQU1BLEVBQUMsRUFBRSxLQUFLLEtBQUtYLE9BQU0sSUFDekIsTUFBTVcsRUFBQztBQUFBLFVBQ2pCO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUdBLGVBQVMsYUFBYSxHQUFHWCxTQUFRO0FBQzdCLFlBQUksQ0FBQyxFQUFFLFFBQVEsR0FBRztBQUNkLGlCQUFPLEVBQUUsV0FBVyxFQUFFLFlBQVk7QUFBQSxRQUN0QztBQUVBLFFBQUFBLFVBQVMsYUFBYUEsU0FBUSxFQUFFLFdBQVcsQ0FBQztBQUM1Qyx3QkFBZ0JBLE9BQU0sSUFDbEIsZ0JBQWdCQSxPQUFNLEtBQUssbUJBQW1CQSxPQUFNO0FBRXhELGVBQU8sZ0JBQWdCQSxPQUFNLEVBQUUsQ0FBQztBQUFBLE1BQ3BDO0FBRUEsZUFBUyxhQUFhQSxTQUFRQyxTQUFRO0FBQ2xDLFlBQUksSUFBSTtBQUVSLGlCQUFTLDRCQUE0QixPQUFPO0FBQ3hDLGlCQUFPQSxRQUFPLGVBQWUsS0FBSyxLQUFLO0FBQUEsUUFDM0M7QUFFQSw4QkFBc0IsWUFBWTtBQUNsQyxlQUFPLEtBQUssS0FBSyxzQkFBc0IsS0FBS0QsT0FBTSxHQUFHO0FBQ2pELFVBQUFBLFVBQVNBLFFBQU87QUFBQSxZQUNaO0FBQUEsWUFDQTtBQUFBLFVBQ0o7QUFDQSxnQ0FBc0IsWUFBWTtBQUNsQyxlQUFLO0FBQUEsUUFDVDtBQUVBLGVBQU9BO0FBQUEsTUFDWDtBQUVBLFVBQUksd0JBQXdCO0FBQUEsUUFDeEIsS0FBSztBQUFBLFFBQ0wsSUFBSTtBQUFBLFFBQ0osR0FBRztBQUFBLFFBQ0gsSUFBSTtBQUFBLFFBQ0osS0FBSztBQUFBLFFBQ0wsTUFBTTtBQUFBLE1BQ1Y7QUFFQSxlQUFTLGVBQWUsS0FBSztBQUN6QixZQUFJQSxVQUFTLEtBQUssZ0JBQWdCLEdBQUcsR0FDakMsY0FBYyxLQUFLLGdCQUFnQixJQUFJLFlBQVksQ0FBQztBQUV4RCxZQUFJQSxXQUFVLENBQUMsYUFBYTtBQUN4QixpQkFBT0E7QUFBQSxRQUNYO0FBRUEsYUFBSyxnQkFBZ0IsR0FBRyxJQUFJLFlBQ3ZCLE1BQU0sZ0JBQWdCLEVBQ3RCLElBQUksU0FBVSxLQUFLO0FBQ2hCLGNBQ0ksUUFBUSxVQUNSLFFBQVEsUUFDUixRQUFRLFFBQ1IsUUFBUSxRQUNWO0FBQ0UsbUJBQU8sSUFBSSxNQUFNLENBQUM7QUFBQSxVQUN0QjtBQUNBLGlCQUFPO0FBQUEsUUFDWCxDQUFDLEVBQ0EsS0FBSyxFQUFFO0FBRVosZUFBTyxLQUFLLGdCQUFnQixHQUFHO0FBQUEsTUFDbkM7QUFFQSxVQUFJLHFCQUFxQjtBQUV6QixlQUFTLGNBQWM7QUFDbkIsZUFBTyxLQUFLO0FBQUEsTUFDaEI7QUFFQSxVQUFJLGlCQUFpQixNQUNqQixnQ0FBZ0M7QUFFcEMsZUFBUyxRQUFRLFFBQVE7QUFDckIsZUFBTyxLQUFLLFNBQVMsUUFBUSxNQUFNLE1BQU07QUFBQSxNQUM3QztBQUVBLFVBQUksc0JBQXNCO0FBQUEsUUFDdEIsUUFBUTtBQUFBLFFBQ1IsTUFBTTtBQUFBLFFBQ04sR0FBRztBQUFBLFFBQ0gsSUFBSTtBQUFBLFFBQ0osR0FBRztBQUFBLFFBQ0gsSUFBSTtBQUFBLFFBQ0osR0FBRztBQUFBLFFBQ0gsSUFBSTtBQUFBLFFBQ0osR0FBRztBQUFBLFFBQ0gsSUFBSTtBQUFBLFFBQ0osR0FBRztBQUFBLFFBQ0gsSUFBSTtBQUFBLFFBQ0osR0FBRztBQUFBLFFBQ0gsSUFBSTtBQUFBLFFBQ0osR0FBRztBQUFBLFFBQ0gsSUFBSTtBQUFBLE1BQ1I7QUFFQSxlQUFTLGFBQWEsUUFBUSxlQUFlLFFBQVEsVUFBVTtBQUMzRCxZQUFJLFNBQVMsS0FBSyxjQUFjLE1BQU07QUFDdEMsZUFBT0ssWUFBVyxNQUFNLElBQ2xCLE9BQU8sUUFBUSxlQUFlLFFBQVEsUUFBUSxJQUM5QyxPQUFPLFFBQVEsT0FBTyxNQUFNO0FBQUEsTUFDdEM7QUFFQSxlQUFTLFdBQVdPLE9BQU0sUUFBUTtBQUM5QixZQUFJWixVQUFTLEtBQUssY0FBY1ksUUFBTyxJQUFJLFdBQVcsTUFBTTtBQUM1RCxlQUFPUCxZQUFXTCxPQUFNLElBQUlBLFFBQU8sTUFBTSxJQUFJQSxRQUFPLFFBQVEsT0FBTyxNQUFNO0FBQUEsTUFDN0U7QUFFQSxVQUFJLFVBQVU7QUFBQSxRQUNWLEdBQUc7QUFBQSxRQUNILE9BQU87QUFBQSxRQUNQLE1BQU07QUFBQSxRQUNOLEdBQUc7QUFBQSxRQUNILE1BQU07QUFBQSxRQUNOLEtBQUs7QUFBQSxRQUNMLEdBQUc7QUFBQSxRQUNILFVBQVU7QUFBQSxRQUNWLFNBQVM7QUFBQSxRQUNULEdBQUc7QUFBQSxRQUNILGFBQWE7QUFBQSxRQUNiLFlBQVk7QUFBQSxRQUNaLEtBQUs7QUFBQSxRQUNMLFlBQVk7QUFBQSxRQUNaLFdBQVc7QUFBQSxRQUNYLEdBQUc7QUFBQSxRQUNILE9BQU87QUFBQSxRQUNQLE1BQU07QUFBQSxRQUNOLElBQUk7QUFBQSxRQUNKLGNBQWM7QUFBQSxRQUNkLGFBQWE7QUFBQSxRQUNiLEdBQUc7QUFBQSxRQUNILFNBQVM7QUFBQSxRQUNULFFBQVE7QUFBQSxRQUNSLEdBQUc7QUFBQSxRQUNILFFBQVE7QUFBQSxRQUNSLE9BQU87QUFBQSxRQUNQLEdBQUc7QUFBQSxRQUNILFVBQVU7QUFBQSxRQUNWLFNBQVM7QUFBQSxRQUNULEdBQUc7QUFBQSxRQUNILFNBQVM7QUFBQSxRQUNULFFBQVE7QUFBQSxRQUNSLElBQUk7QUFBQSxRQUNKLFdBQVc7QUFBQSxRQUNYLFVBQVU7QUFBQSxRQUNWLElBQUk7QUFBQSxRQUNKLGNBQWM7QUFBQSxRQUNkLGFBQWE7QUFBQSxRQUNiLEdBQUc7QUFBQSxRQUNILE9BQU87QUFBQSxRQUNQLE1BQU07QUFBQSxRQUNOLEdBQUc7QUFBQSxRQUNILFVBQVU7QUFBQSxRQUNWLFNBQVM7QUFBQSxRQUNULEdBQUc7QUFBQSxRQUNILE9BQU87QUFBQSxRQUNQLE1BQU07QUFBQSxNQUNWO0FBRUEsZUFBUyxlQUFlLE9BQU87QUFDM0IsZUFBTyxPQUFPLFVBQVUsV0FDbEIsUUFBUSxLQUFLLEtBQUssUUFBUSxNQUFNLFlBQVksQ0FBQyxJQUM3QztBQUFBLE1BQ1Y7QUFFQSxlQUFTLHFCQUFxQixhQUFhO0FBQ3ZDLFlBQUksa0JBQWtCLENBQUMsR0FDbkIsZ0JBQ0E7QUFFSixhQUFLLFFBQVEsYUFBYTtBQUN0QixjQUFJLFdBQVcsYUFBYSxJQUFJLEdBQUc7QUFDL0IsNkJBQWlCLGVBQWUsSUFBSTtBQUNwQyxnQkFBSSxnQkFBZ0I7QUFDaEIsOEJBQWdCLGNBQWMsSUFBSSxZQUFZLElBQUk7QUFBQSxZQUN0RDtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBRUEsZUFBTztBQUFBLE1BQ1g7QUFFQSxVQUFJLGFBQWE7QUFBQSxRQUNiLE1BQU07QUFBQSxRQUNOLEtBQUs7QUFBQSxRQUNMLFNBQVM7QUFBQSxRQUNULFlBQVk7QUFBQSxRQUNaLFdBQVc7QUFBQSxRQUNYLE1BQU07QUFBQSxRQUNOLGFBQWE7QUFBQSxRQUNiLFFBQVE7QUFBQSxRQUNSLE9BQU87QUFBQSxRQUNQLFNBQVM7QUFBQSxRQUNULFFBQVE7QUFBQSxRQUNSLFVBQVU7QUFBQSxRQUNWLGFBQWE7QUFBQSxRQUNiLE1BQU07QUFBQSxRQUNOLFNBQVM7QUFBQSxRQUNULE1BQU07QUFBQSxNQUNWO0FBRUEsZUFBUyxvQkFBb0IsVUFBVTtBQUNuQyxZQUFJLFFBQVEsQ0FBQyxHQUNUO0FBQ0osYUFBSyxLQUFLLFVBQVU7QUFDaEIsY0FBSSxXQUFXLFVBQVUsQ0FBQyxHQUFHO0FBQ3pCLGtCQUFNLEtBQUssRUFBRSxNQUFNLEdBQUcsVUFBVSxXQUFXLENBQUMsRUFBRSxDQUFDO0FBQUEsVUFDbkQ7QUFBQSxRQUNKO0FBQ0EsY0FBTSxLQUFLLFNBQVUsR0FBRyxHQUFHO0FBQ3ZCLGlCQUFPLEVBQUUsV0FBVyxFQUFFO0FBQUEsUUFDMUIsQ0FBQztBQUNELGVBQU87QUFBQSxNQUNYO0FBRUEsVUFBSSxTQUFTLE1BQ1QsU0FBUyxRQUNULFNBQVMsU0FDVCxTQUFTLFNBQ1QsU0FBUyxjQUNULFlBQVksU0FDWixZQUFZLGFBQ1osWUFBWSxpQkFDWixZQUFZLFdBQ1osWUFBWSxXQUNaLFlBQVksZ0JBQ1osZ0JBQWdCLE9BQ2hCLGNBQWMsWUFDZCxjQUFjLHNCQUNkLG1CQUFtQiwyQkFDbkIsaUJBQWlCLHdCQUdqQixZQUNJLHlKQUNKLHlCQUF5QixhQUN6QixtQkFBbUIsaUJBQ25CO0FBRUosZ0JBQVUsQ0FBQztBQUVYLGVBQVMsY0FBY1MsUUFBTyxPQUFPLGFBQWE7QUFDOUMsZ0JBQVFBLE1BQUssSUFBSUosWUFBVyxLQUFLLElBQzNCLFFBQ0EsU0FBVSxVQUFVUSxhQUFZO0FBQzVCLGlCQUFPLFlBQVksY0FBYyxjQUFjO0FBQUEsUUFDbkQ7QUFBQSxNQUNWO0FBRUEsZUFBUyxzQkFBc0JKLFFBQU8sUUFBUTtBQUMxQyxZQUFJLENBQUMsV0FBVyxTQUFTQSxNQUFLLEdBQUc7QUFDN0IsaUJBQU8sSUFBSSxPQUFPLGVBQWVBLE1BQUssQ0FBQztBQUFBLFFBQzNDO0FBRUEsZUFBTyxRQUFRQSxNQUFLLEVBQUUsT0FBTyxTQUFTLE9BQU8sT0FBTztBQUFBLE1BQ3hEO0FBR0EsZUFBUyxlQUFlLEdBQUc7QUFDdkIsZUFBTztBQUFBLFVBQ0gsRUFDSyxRQUFRLE1BQU0sRUFBRSxFQUNoQjtBQUFBLFlBQ0c7QUFBQSxZQUNBLFNBQVUsU0FBUyxJQUFJLElBQUksSUFBSSxJQUFJO0FBQy9CLHFCQUFPLE1BQU0sTUFBTSxNQUFNO0FBQUEsWUFDN0I7QUFBQSxVQUNKO0FBQUEsUUFDUjtBQUFBLE1BQ0o7QUFFQSxlQUFTLFlBQVksR0FBRztBQUNwQixlQUFPLEVBQUUsUUFBUSwwQkFBMEIsTUFBTTtBQUFBLE1BQ3JEO0FBRUEsZUFBUyxTQUFTLFFBQVE7QUFDdEIsWUFBSSxTQUFTLEdBQUc7QUFFWixpQkFBTyxLQUFLLEtBQUssTUFBTSxLQUFLO0FBQUEsUUFDaEMsT0FBTztBQUNILGlCQUFPLEtBQUssTUFBTSxNQUFNO0FBQUEsUUFDNUI7QUFBQSxNQUNKO0FBRUEsZUFBUyxNQUFNLHFCQUFxQjtBQUNoQyxZQUFJLGdCQUFnQixDQUFDLHFCQUNqQixRQUFRO0FBRVosWUFBSSxrQkFBa0IsS0FBSyxTQUFTLGFBQWEsR0FBRztBQUNoRCxrQkFBUSxTQUFTLGFBQWE7QUFBQSxRQUNsQztBQUVBLGVBQU87QUFBQSxNQUNYO0FBRUEsVUFBSSxTQUFTLENBQUM7QUFFZCxlQUFTLGNBQWNBLFFBQU9kLFdBQVU7QUFDcEMsWUFBSSxHQUNBLE9BQU9BLFdBQ1A7QUFDSixZQUFJLE9BQU9jLFdBQVUsVUFBVTtBQUMzQixVQUFBQSxTQUFRLENBQUNBLE1BQUs7QUFBQSxRQUNsQjtBQUNBLFlBQUlYLFVBQVNILFNBQVEsR0FBRztBQUNwQixpQkFBTyxTQUFVLE9BQU8sT0FBTztBQUMzQixrQkFBTUEsU0FBUSxJQUFJLE1BQU0sS0FBSztBQUFBLFVBQ2pDO0FBQUEsUUFDSjtBQUNBLG1CQUFXYyxPQUFNO0FBQ2pCLGFBQUssSUFBSSxHQUFHLElBQUksVUFBVSxLQUFLO0FBQzNCLGlCQUFPQSxPQUFNLENBQUMsQ0FBQyxJQUFJO0FBQUEsUUFDdkI7QUFBQSxNQUNKO0FBRUEsZUFBUyxrQkFBa0JBLFFBQU9kLFdBQVU7QUFDeEMsc0JBQWNjLFFBQU8sU0FBVSxPQUFPLE9BQU8sUUFBUUEsUUFBTztBQUN4RCxpQkFBTyxLQUFLLE9BQU8sTUFBTSxDQUFDO0FBQzFCLFVBQUFkLFVBQVMsT0FBTyxPQUFPLElBQUksUUFBUWMsTUFBSztBQUFBLFFBQzVDLENBQUM7QUFBQSxNQUNMO0FBRUEsZUFBUyx3QkFBd0JBLFFBQU8sT0FBTyxRQUFRO0FBQ25ELFlBQUksU0FBUyxRQUFRLFdBQVcsUUFBUUEsTUFBSyxHQUFHO0FBQzVDLGlCQUFPQSxNQUFLLEVBQUUsT0FBTyxPQUFPLElBQUksUUFBUUEsTUFBSztBQUFBLFFBQ2pEO0FBQUEsTUFDSjtBQUVBLGVBQVMsV0FBVyxNQUFNO0FBQ3RCLGVBQVEsT0FBTyxNQUFNLEtBQUssT0FBTyxRQUFRLEtBQU0sT0FBTyxRQUFRO0FBQUEsTUFDbEU7QUFFQSxVQUFJLE9BQU8sR0FDUCxRQUFRLEdBQ1IsT0FBTyxHQUNQLE9BQU8sR0FDUCxTQUFTLEdBQ1QsU0FBUyxHQUNULGNBQWMsR0FDZCxPQUFPLEdBQ1AsVUFBVTtBQUlkLHFCQUFlLEtBQUssR0FBRyxHQUFHLFdBQVk7QUFDbEMsWUFBSSxJQUFJLEtBQUssS0FBSztBQUNsQixlQUFPLEtBQUssT0FBTyxTQUFTLEdBQUcsQ0FBQyxJQUFJLE1BQU07QUFBQSxNQUM5QyxDQUFDO0FBRUQscUJBQWUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsV0FBWTtBQUN4QyxlQUFPLEtBQUssS0FBSyxJQUFJO0FBQUEsTUFDekIsQ0FBQztBQUVELHFCQUFlLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLE1BQU07QUFDeEMscUJBQWUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsTUFBTTtBQUN6QyxxQkFBZSxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxHQUFHLE1BQU07QUFJaEQsb0JBQWMsS0FBSyxXQUFXO0FBQzlCLG9CQUFjLE1BQU0sV0FBVyxNQUFNO0FBQ3JDLG9CQUFjLFFBQVEsV0FBVyxNQUFNO0FBQ3ZDLG9CQUFjLFNBQVMsV0FBVyxNQUFNO0FBQ3hDLG9CQUFjLFVBQVUsV0FBVyxNQUFNO0FBRXpDLG9CQUFjLENBQUMsU0FBUyxRQUFRLEdBQUcsSUFBSTtBQUN2QyxvQkFBYyxRQUFRLFNBQVUsT0FBTyxPQUFPO0FBQzFDLGNBQU0sSUFBSSxJQUNOLE1BQU0sV0FBVyxJQUFJLE1BQU0sa0JBQWtCLEtBQUssSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUN6RSxDQUFDO0FBQ0Qsb0JBQWMsTUFBTSxTQUFVLE9BQU8sT0FBTztBQUN4QyxjQUFNLElBQUksSUFBSSxNQUFNLGtCQUFrQixLQUFLO0FBQUEsTUFDL0MsQ0FBQztBQUNELG9CQUFjLEtBQUssU0FBVSxPQUFPLE9BQU87QUFDdkMsY0FBTSxJQUFJLElBQUksU0FBUyxPQUFPLEVBQUU7QUFBQSxNQUNwQyxDQUFDO0FBSUQsZUFBUyxXQUFXLE1BQU07QUFDdEIsZUFBTyxXQUFXLElBQUksSUFBSSxNQUFNO0FBQUEsTUFDcEM7QUFJQSxZQUFNLG9CQUFvQixTQUFVLE9BQU87QUFDdkMsZUFBTyxNQUFNLEtBQUssS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLE9BQU87QUFBQSxNQUN0RDtBQUlBLFVBQUksYUFBYSxXQUFXLFlBQVksSUFBSTtBQUU1QyxlQUFTLGdCQUFnQjtBQUNyQixlQUFPLFdBQVcsS0FBSyxLQUFLLENBQUM7QUFBQSxNQUNqQztBQUVBLGVBQVMsV0FBVyxNQUFNLFVBQVU7QUFDaEMsZUFBTyxTQUFVLE9BQU87QUFDcEIsY0FBSSxTQUFTLE1BQU07QUFDZixrQkFBTSxNQUFNLE1BQU0sS0FBSztBQUN2QixrQkFBTSxhQUFhLE1BQU0sUUFBUTtBQUNqQyxtQkFBTztBQUFBLFVBQ1gsT0FBTztBQUNILG1CQUFPLElBQUksTUFBTSxJQUFJO0FBQUEsVUFDekI7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUVBLGVBQVMsSUFBSSxLQUFLLE1BQU07QUFDcEIsWUFBSSxDQUFDLElBQUksUUFBUSxHQUFHO0FBQ2hCLGlCQUFPO0FBQUEsUUFDWDtBQUVBLFlBQUksSUFBSSxJQUFJLElBQ1IsUUFBUSxJQUFJO0FBRWhCLGdCQUFRLE1BQU07QUFBQSxVQUNWLEtBQUs7QUFDRCxtQkFBTyxRQUFRLEVBQUUsbUJBQW1CLElBQUksRUFBRSxnQkFBZ0I7QUFBQSxVQUM5RCxLQUFLO0FBQ0QsbUJBQU8sUUFBUSxFQUFFLGNBQWMsSUFBSSxFQUFFLFdBQVc7QUFBQSxVQUNwRCxLQUFLO0FBQ0QsbUJBQU8sUUFBUSxFQUFFLGNBQWMsSUFBSSxFQUFFLFdBQVc7QUFBQSxVQUNwRCxLQUFLO0FBQ0QsbUJBQU8sUUFBUSxFQUFFLFlBQVksSUFBSSxFQUFFLFNBQVM7QUFBQSxVQUNoRCxLQUFLO0FBQ0QsbUJBQU8sUUFBUSxFQUFFLFdBQVcsSUFBSSxFQUFFLFFBQVE7QUFBQSxVQUM5QyxLQUFLO0FBQ0QsbUJBQU8sUUFBUSxFQUFFLFVBQVUsSUFBSSxFQUFFLE9BQU87QUFBQSxVQUM1QyxLQUFLO0FBQ0QsbUJBQU8sUUFBUSxFQUFFLFlBQVksSUFBSSxFQUFFLFNBQVM7QUFBQSxVQUNoRCxLQUFLO0FBQ0QsbUJBQU8sUUFBUSxFQUFFLGVBQWUsSUFBSSxFQUFFLFlBQVk7QUFBQSxVQUN0RDtBQUNJLG1CQUFPO0FBQUEsUUFDZjtBQUFBLE1BQ0o7QUFFQSxlQUFTLE1BQU0sS0FBSyxNQUFNLE9BQU87QUFDN0IsWUFBSSxHQUFHLE9BQU8sTUFBTSxPQUFPO0FBRTNCLFlBQUksQ0FBQyxJQUFJLFFBQVEsS0FBSyxNQUFNLEtBQUssR0FBRztBQUNoQztBQUFBLFFBQ0o7QUFFQSxZQUFJLElBQUk7QUFDUixnQkFBUSxJQUFJO0FBRVosZ0JBQVEsTUFBTTtBQUFBLFVBQ1YsS0FBSztBQUNELG1CQUFPLE1BQU0sUUFDUCxFQUFFLG1CQUFtQixLQUFLLElBQzFCLEVBQUUsZ0JBQWdCLEtBQUs7QUFBQSxVQUNqQyxLQUFLO0FBQ0QsbUJBQU8sTUFBTSxRQUFRLEVBQUUsY0FBYyxLQUFLLElBQUksRUFBRSxXQUFXLEtBQUs7QUFBQSxVQUNwRSxLQUFLO0FBQ0QsbUJBQU8sTUFBTSxRQUFRLEVBQUUsY0FBYyxLQUFLLElBQUksRUFBRSxXQUFXLEtBQUs7QUFBQSxVQUNwRSxLQUFLO0FBQ0QsbUJBQU8sTUFBTSxRQUFRLEVBQUUsWUFBWSxLQUFLLElBQUksRUFBRSxTQUFTLEtBQUs7QUFBQSxVQUNoRSxLQUFLO0FBQ0QsbUJBQU8sTUFBTSxRQUFRLEVBQUUsV0FBVyxLQUFLLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxVQUs5RCxLQUFLO0FBQ0Q7QUFBQSxVQUNKO0FBQ0k7QUFBQSxRQUNSO0FBRUEsZUFBTztBQUNQLGdCQUFRLElBQUksTUFBTTtBQUNsQixlQUFPLElBQUksS0FBSztBQUNoQixlQUFPLFNBQVMsTUFBTSxVQUFVLEtBQUssQ0FBQyxXQUFXLElBQUksSUFBSSxLQUFLO0FBQzlELGNBQU0sUUFDQSxFQUFFLGVBQWUsTUFBTSxPQUFPLElBQUksSUFDbEMsRUFBRSxZQUFZLE1BQU0sT0FBTyxJQUFJO0FBQUEsTUFDekM7QUFJQSxlQUFTLFVBQVUsT0FBTztBQUN0QixnQkFBUSxlQUFlLEtBQUs7QUFDNUIsWUFBSUosWUFBVyxLQUFLLEtBQUssQ0FBQyxHQUFHO0FBQ3pCLGlCQUFPLEtBQUssS0FBSyxFQUFFO0FBQUEsUUFDdkI7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUVBLGVBQVMsVUFBVSxPQUFPLE9BQU87QUFDN0IsWUFBSSxPQUFPLFVBQVUsVUFBVTtBQUMzQixrQkFBUSxxQkFBcUIsS0FBSztBQUNsQyxjQUFJLGNBQWMsb0JBQW9CLEtBQUssR0FDdkMsR0FDQSxpQkFBaUIsWUFBWTtBQUNqQyxlQUFLLElBQUksR0FBRyxJQUFJLGdCQUFnQixLQUFLO0FBQ2pDLGlCQUFLLFlBQVksQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLFlBQVksQ0FBQyxFQUFFLElBQUksQ0FBQztBQUFBLFVBQ3hEO0FBQUEsUUFDSixPQUFPO0FBQ0gsa0JBQVEsZUFBZSxLQUFLO0FBQzVCLGNBQUlBLFlBQVcsS0FBSyxLQUFLLENBQUMsR0FBRztBQUN6QixtQkFBTyxLQUFLLEtBQUssRUFBRSxLQUFLO0FBQUEsVUFDNUI7QUFBQSxRQUNKO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFFQSxlQUFTLElBQUksR0FBRyxHQUFHO0FBQ2YsZ0JBQVMsSUFBSSxJQUFLLEtBQUs7QUFBQSxNQUMzQjtBQUVBLFVBQUk7QUFFSixVQUFJLE1BQU0sVUFBVSxTQUFTO0FBQ3pCLGtCQUFVLE1BQU0sVUFBVTtBQUFBLE1BQzlCLE9BQU87QUFDSCxrQkFBVSxTQUFVLEdBQUc7QUFFbkIsY0FBSTtBQUNKLGVBQUssSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEVBQUUsR0FBRztBQUM5QixnQkFBSSxLQUFLLENBQUMsTUFBTSxHQUFHO0FBQ2YscUJBQU87QUFBQSxZQUNYO0FBQUEsVUFDSjtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUFBLE1BQ0o7QUFFQSxlQUFTLFlBQVksTUFBTSxPQUFPO0FBQzlCLFlBQUksTUFBTSxJQUFJLEtBQUssTUFBTSxLQUFLLEdBQUc7QUFDN0IsaUJBQU87QUFBQSxRQUNYO0FBQ0EsWUFBSSxXQUFXLElBQUksT0FBTyxFQUFFO0FBQzVCLGlCQUFTLFFBQVEsWUFBWTtBQUM3QixlQUFPLGFBQWEsSUFDZCxXQUFXLElBQUksSUFDWCxLQUNBLEtBQ0osS0FBTyxXQUFXLElBQUs7QUFBQSxNQUNqQztBQUlBLHFCQUFlLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLFdBQVk7QUFDN0MsZUFBTyxLQUFLLE1BQU0sSUFBSTtBQUFBLE1BQzFCLENBQUM7QUFFRCxxQkFBZSxPQUFPLEdBQUcsR0FBRyxTQUFVTCxTQUFRO0FBQzFDLGVBQU8sS0FBSyxXQUFXLEVBQUUsWUFBWSxNQUFNQSxPQUFNO0FBQUEsTUFDckQsQ0FBQztBQUVELHFCQUFlLFFBQVEsR0FBRyxHQUFHLFNBQVVBLFNBQVE7QUFDM0MsZUFBTyxLQUFLLFdBQVcsRUFBRSxPQUFPLE1BQU1BLE9BQU07QUFBQSxNQUNoRCxDQUFDO0FBSUQsb0JBQWMsS0FBSyxXQUFXLHNCQUFzQjtBQUNwRCxvQkFBYyxNQUFNLFdBQVcsTUFBTTtBQUNyQyxvQkFBYyxPQUFPLFNBQVUsVUFBVUMsU0FBUTtBQUM3QyxlQUFPQSxRQUFPLGlCQUFpQixRQUFRO0FBQUEsTUFDM0MsQ0FBQztBQUNELG9CQUFjLFFBQVEsU0FBVSxVQUFVQSxTQUFRO0FBQzlDLGVBQU9BLFFBQU8sWUFBWSxRQUFRO0FBQUEsTUFDdEMsQ0FBQztBQUVELG9CQUFjLENBQUMsS0FBSyxJQUFJLEdBQUcsU0FBVSxPQUFPLE9BQU87QUFDL0MsY0FBTSxLQUFLLElBQUksTUFBTSxLQUFLLElBQUk7QUFBQSxNQUNsQyxDQUFDO0FBRUQsb0JBQWMsQ0FBQyxPQUFPLE1BQU0sR0FBRyxTQUFVLE9BQU8sT0FBTyxRQUFRUSxRQUFPO0FBQ2xFLFlBQUksUUFBUSxPQUFPLFFBQVEsWUFBWSxPQUFPQSxRQUFPLE9BQU8sT0FBTztBQUVuRSxZQUFJLFNBQVMsTUFBTTtBQUNmLGdCQUFNLEtBQUssSUFBSTtBQUFBLFFBQ25CLE9BQU87QUFDSCwwQkFBZ0IsTUFBTSxFQUFFLGVBQWU7QUFBQSxRQUMzQztBQUFBLE1BQ0osQ0FBQztBQUlELFVBQUksc0JBQ0ksd0ZBQXdGO0FBQUEsUUFDcEY7QUFBQSxNQUNKLEdBQ0osMkJBQ0ksa0RBQWtELE1BQU0sR0FBRyxHQUMvRCxtQkFBbUIsaUNBQ25CLDBCQUEwQixXQUMxQixxQkFBcUI7QUFFekIsZUFBUyxhQUFhLEdBQUdULFNBQVE7QUFDN0IsWUFBSSxDQUFDLEdBQUc7QUFDSixpQkFBT0osU0FBUSxLQUFLLE9BQU8sSUFDckIsS0FBSyxVQUNMLEtBQUssUUFBUSxZQUFZO0FBQUEsUUFDbkM7QUFDQSxlQUFPQSxTQUFRLEtBQUssT0FBTyxJQUNyQixLQUFLLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFDdEIsS0FBSyxTQUNBLEtBQUssUUFBUSxZQUFZLGtCQUFrQixLQUFLSSxPQUFNLElBQ2pELFdBQ0EsWUFDVixFQUFFLEVBQUUsTUFBTSxDQUFDO0FBQUEsTUFDckI7QUFFQSxlQUFTLGtCQUFrQixHQUFHQSxTQUFRO0FBQ2xDLFlBQUksQ0FBQyxHQUFHO0FBQ0osaUJBQU9KLFNBQVEsS0FBSyxZQUFZLElBQzFCLEtBQUssZUFDTCxLQUFLLGFBQWEsWUFBWTtBQUFBLFFBQ3hDO0FBQ0EsZUFBT0EsU0FBUSxLQUFLLFlBQVksSUFDMUIsS0FBSyxhQUFhLEVBQUUsTUFBTSxDQUFDLElBQzNCLEtBQUssYUFDRCxpQkFBaUIsS0FBS0ksT0FBTSxJQUFJLFdBQVcsWUFDL0MsRUFBRSxFQUFFLE1BQU0sQ0FBQztBQUFBLE1BQ3JCO0FBRUEsZUFBUyxrQkFBa0IsV0FBV0EsU0FBUSxRQUFRO0FBQ2xELFlBQUksR0FDQSxJQUNBLEtBQ0EsTUFBTSxVQUFVLGtCQUFrQjtBQUN0QyxZQUFJLENBQUMsS0FBSyxjQUFjO0FBRXBCLGVBQUssZUFBZSxDQUFDO0FBQ3JCLGVBQUssbUJBQW1CLENBQUM7QUFDekIsZUFBSyxvQkFBb0IsQ0FBQztBQUMxQixlQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxHQUFHO0FBQ3JCLGtCQUFNLFVBQVUsQ0FBQyxLQUFNLENBQUMsQ0FBQztBQUN6QixpQkFBSyxrQkFBa0IsQ0FBQyxJQUFJLEtBQUs7QUFBQSxjQUM3QjtBQUFBLGNBQ0E7QUFBQSxZQUNKLEVBQUUsa0JBQWtCO0FBQ3BCLGlCQUFLLGlCQUFpQixDQUFDLElBQUksS0FBSyxPQUFPLEtBQUssRUFBRSxFQUFFLGtCQUFrQjtBQUFBLFVBQ3RFO0FBQUEsUUFDSjtBQUVBLFlBQUksUUFBUTtBQUNSLGNBQUlBLFlBQVcsT0FBTztBQUNsQixpQkFBSyxRQUFRLEtBQUssS0FBSyxtQkFBbUIsR0FBRztBQUM3QyxtQkFBTyxPQUFPLEtBQUssS0FBSztBQUFBLFVBQzVCLE9BQU87QUFDSCxpQkFBSyxRQUFRLEtBQUssS0FBSyxrQkFBa0IsR0FBRztBQUM1QyxtQkFBTyxPQUFPLEtBQUssS0FBSztBQUFBLFVBQzVCO0FBQUEsUUFDSixPQUFPO0FBQ0gsY0FBSUEsWUFBVyxPQUFPO0FBQ2xCLGlCQUFLLFFBQVEsS0FBSyxLQUFLLG1CQUFtQixHQUFHO0FBQzdDLGdCQUFJLE9BQU8sSUFBSTtBQUNYLHFCQUFPO0FBQUEsWUFDWDtBQUNBLGlCQUFLLFFBQVEsS0FBSyxLQUFLLGtCQUFrQixHQUFHO0FBQzVDLG1CQUFPLE9BQU8sS0FBSyxLQUFLO0FBQUEsVUFDNUIsT0FBTztBQUNILGlCQUFLLFFBQVEsS0FBSyxLQUFLLGtCQUFrQixHQUFHO0FBQzVDLGdCQUFJLE9BQU8sSUFBSTtBQUNYLHFCQUFPO0FBQUEsWUFDWDtBQUNBLGlCQUFLLFFBQVEsS0FBSyxLQUFLLG1CQUFtQixHQUFHO0FBQzdDLG1CQUFPLE9BQU8sS0FBSyxLQUFLO0FBQUEsVUFDNUI7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUVBLGVBQVMsa0JBQWtCLFdBQVdBLFNBQVEsUUFBUTtBQUNsRCxZQUFJLEdBQUcsS0FBSztBQUVaLFlBQUksS0FBSyxtQkFBbUI7QUFDeEIsaUJBQU8sa0JBQWtCLEtBQUssTUFBTSxXQUFXQSxTQUFRLE1BQU07QUFBQSxRQUNqRTtBQUVBLFlBQUksQ0FBQyxLQUFLLGNBQWM7QUFDcEIsZUFBSyxlQUFlLENBQUM7QUFDckIsZUFBSyxtQkFBbUIsQ0FBQztBQUN6QixlQUFLLG9CQUFvQixDQUFDO0FBQUEsUUFDOUI7QUFLQSxhQUFLLElBQUksR0FBRyxJQUFJLElBQUksS0FBSztBQUVyQixnQkFBTSxVQUFVLENBQUMsS0FBTSxDQUFDLENBQUM7QUFDekIsY0FBSSxVQUFVLENBQUMsS0FBSyxpQkFBaUIsQ0FBQyxHQUFHO0FBQ3JDLGlCQUFLLGlCQUFpQixDQUFDLElBQUksSUFBSTtBQUFBLGNBQzNCLE1BQU0sS0FBSyxPQUFPLEtBQUssRUFBRSxFQUFFLFFBQVEsS0FBSyxFQUFFLElBQUk7QUFBQSxjQUM5QztBQUFBLFlBQ0o7QUFDQSxpQkFBSyxrQkFBa0IsQ0FBQyxJQUFJLElBQUk7QUFBQSxjQUM1QixNQUFNLEtBQUssWUFBWSxLQUFLLEVBQUUsRUFBRSxRQUFRLEtBQUssRUFBRSxJQUFJO0FBQUEsY0FDbkQ7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUNBLGNBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxhQUFhLENBQUMsR0FBRztBQUNsQyxvQkFDSSxNQUFNLEtBQUssT0FBTyxLQUFLLEVBQUUsSUFBSSxPQUFPLEtBQUssWUFBWSxLQUFLLEVBQUU7QUFDaEUsaUJBQUssYUFBYSxDQUFDLElBQUksSUFBSSxPQUFPLE1BQU0sUUFBUSxLQUFLLEVBQUUsR0FBRyxHQUFHO0FBQUEsVUFDakU7QUFFQSxjQUNJLFVBQ0FBLFlBQVcsVUFDWCxLQUFLLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxTQUFTLEdBQ3pDO0FBQ0UsbUJBQU87QUFBQSxVQUNYLFdBQ0ksVUFDQUEsWUFBVyxTQUNYLEtBQUssa0JBQWtCLENBQUMsRUFBRSxLQUFLLFNBQVMsR0FDMUM7QUFDRSxtQkFBTztBQUFBLFVBQ1gsV0FBVyxDQUFDLFVBQVUsS0FBSyxhQUFhLENBQUMsRUFBRSxLQUFLLFNBQVMsR0FBRztBQUN4RCxtQkFBTztBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUlBLGVBQVMsU0FBUyxLQUFLLE9BQU87QUFDMUIsWUFBSSxDQUFDLElBQUksUUFBUSxHQUFHO0FBRWhCLGlCQUFPO0FBQUEsUUFDWDtBQUVBLFlBQUksT0FBTyxVQUFVLFVBQVU7QUFDM0IsY0FBSSxRQUFRLEtBQUssS0FBSyxHQUFHO0FBQ3JCLG9CQUFRLE1BQU0sS0FBSztBQUFBLFVBQ3ZCLE9BQU87QUFDSCxvQkFBUSxJQUFJLFdBQVcsRUFBRSxZQUFZLEtBQUs7QUFFMUMsZ0JBQUksQ0FBQ0YsVUFBUyxLQUFLLEdBQUc7QUFDbEIscUJBQU87QUFBQSxZQUNYO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFFQSxZQUFJLFFBQVEsT0FDUixPQUFPLElBQUksS0FBSztBQUVwQixlQUFPLE9BQU8sS0FBSyxPQUFPLEtBQUssSUFBSSxNQUFNLFlBQVksSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3ZFLGNBQU0sSUFBSSxTQUNKLElBQUksR0FBRyxZQUFZLE9BQU8sSUFBSSxJQUM5QixJQUFJLEdBQUcsU0FBUyxPQUFPLElBQUk7QUFDakMsZUFBTztBQUFBLE1BQ1g7QUFFQSxlQUFTLFlBQVksT0FBTztBQUN4QixZQUFJLFNBQVMsTUFBTTtBQUNmLG1CQUFTLE1BQU0sS0FBSztBQUNwQixnQkFBTSxhQUFhLE1BQU0sSUFBSTtBQUM3QixpQkFBTztBQUFBLFFBQ1gsT0FBTztBQUNILGlCQUFPLElBQUksTUFBTSxPQUFPO0FBQUEsUUFDNUI7QUFBQSxNQUNKO0FBRUEsZUFBUyxpQkFBaUI7QUFDdEIsZUFBTyxZQUFZLEtBQUssS0FBSyxHQUFHLEtBQUssTUFBTSxDQUFDO0FBQUEsTUFDaEQ7QUFFQSxlQUFTLGlCQUFpQixVQUFVO0FBQ2hDLFlBQUksS0FBSyxtQkFBbUI7QUFDeEIsY0FBSSxDQUFDLFdBQVcsTUFBTSxjQUFjLEdBQUc7QUFDbkMsK0JBQW1CLEtBQUssSUFBSTtBQUFBLFVBQ2hDO0FBQ0EsY0FBSSxVQUFVO0FBQ1YsbUJBQU8sS0FBSztBQUFBLFVBQ2hCLE9BQU87QUFDSCxtQkFBTyxLQUFLO0FBQUEsVUFDaEI7QUFBQSxRQUNKLE9BQU87QUFDSCxjQUFJLENBQUMsV0FBVyxNQUFNLG1CQUFtQixHQUFHO0FBQ3hDLGlCQUFLLG9CQUFvQjtBQUFBLFVBQzdCO0FBQ0EsaUJBQU8sS0FBSywyQkFBMkIsV0FDakMsS0FBSywwQkFDTCxLQUFLO0FBQUEsUUFDZjtBQUFBLE1BQ0o7QUFFQSxlQUFTLFlBQVksVUFBVTtBQUMzQixZQUFJLEtBQUssbUJBQW1CO0FBQ3hCLGNBQUksQ0FBQyxXQUFXLE1BQU0sY0FBYyxHQUFHO0FBQ25DLCtCQUFtQixLQUFLLElBQUk7QUFBQSxVQUNoQztBQUNBLGNBQUksVUFBVTtBQUNWLG1CQUFPLEtBQUs7QUFBQSxVQUNoQixPQUFPO0FBQ0gsbUJBQU8sS0FBSztBQUFBLFVBQ2hCO0FBQUEsUUFDSixPQUFPO0FBQ0gsY0FBSSxDQUFDLFdBQVcsTUFBTSxjQUFjLEdBQUc7QUFDbkMsaUJBQUssZUFBZTtBQUFBLFVBQ3hCO0FBQ0EsaUJBQU8sS0FBSyxzQkFBc0IsV0FDNUIsS0FBSyxxQkFDTCxLQUFLO0FBQUEsUUFDZjtBQUFBLE1BQ0o7QUFFQSxlQUFTLHFCQUFxQjtBQUMxQixpQkFBUyxVQUFVLEdBQUcsR0FBRztBQUNyQixpQkFBTyxFQUFFLFNBQVMsRUFBRTtBQUFBLFFBQ3hCO0FBRUEsWUFBSSxjQUFjLENBQUMsR0FDZixhQUFhLENBQUMsR0FDZCxjQUFjLENBQUMsR0FDZixHQUNBLEtBQ0EsUUFDQTtBQUNKLGFBQUssSUFBSSxHQUFHLElBQUksSUFBSSxLQUFLO0FBRXJCLGdCQUFNLFVBQVUsQ0FBQyxLQUFNLENBQUMsQ0FBQztBQUN6QixtQkFBUyxZQUFZLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztBQUM5QyxrQkFBUSxZQUFZLEtBQUssT0FBTyxLQUFLLEVBQUUsQ0FBQztBQUN4QyxzQkFBWSxLQUFLLE1BQU07QUFDdkIscUJBQVcsS0FBSyxLQUFLO0FBQ3JCLHNCQUFZLEtBQUssS0FBSztBQUN0QixzQkFBWSxLQUFLLE1BQU07QUFBQSxRQUMzQjtBQUdBLG9CQUFZLEtBQUssU0FBUztBQUMxQixtQkFBVyxLQUFLLFNBQVM7QUFDekIsb0JBQVksS0FBSyxTQUFTO0FBRTFCLGFBQUssZUFBZSxJQUFJLE9BQU8sT0FBTyxZQUFZLEtBQUssR0FBRyxJQUFJLEtBQUssR0FBRztBQUN0RSxhQUFLLG9CQUFvQixLQUFLO0FBQzlCLGFBQUsscUJBQXFCLElBQUk7QUFBQSxVQUMxQixPQUFPLFdBQVcsS0FBSyxHQUFHLElBQUk7QUFBQSxVQUM5QjtBQUFBLFFBQ0o7QUFDQSxhQUFLLDBCQUEwQixJQUFJO0FBQUEsVUFDL0IsT0FBTyxZQUFZLEtBQUssR0FBRyxJQUFJO0FBQUEsVUFDL0I7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUVBLGVBQVMsV0FBVyxHQUFHLEdBQUcsR0FBR2dCLElBQUcsR0FBRyxHQUFHLElBQUk7QUFHdEMsWUFBSTtBQUVKLFlBQUksSUFBSSxPQUFPLEtBQUssR0FBRztBQUVuQixpQkFBTyxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsR0FBR0EsSUFBRyxHQUFHLEdBQUcsRUFBRTtBQUMxQyxjQUFJLFNBQVMsS0FBSyxZQUFZLENBQUMsR0FBRztBQUM5QixpQkFBSyxZQUFZLENBQUM7QUFBQSxVQUN0QjtBQUFBLFFBQ0osT0FBTztBQUNILGlCQUFPLElBQUksS0FBSyxHQUFHLEdBQUcsR0FBR0EsSUFBRyxHQUFHLEdBQUcsRUFBRTtBQUFBLFFBQ3hDO0FBRUEsZUFBTztBQUFBLE1BQ1g7QUFFQSxlQUFTLGNBQWMsR0FBRztBQUN0QixZQUFJLE1BQU07QUFFVixZQUFJLElBQUksT0FBTyxLQUFLLEdBQUc7QUFDbkIsaUJBQU8sTUFBTSxVQUFVLE1BQU0sS0FBSyxTQUFTO0FBRTNDLGVBQUssQ0FBQyxJQUFJLElBQUk7QUFDZCxpQkFBTyxJQUFJLEtBQUssS0FBSyxJQUFJLE1BQU0sTUFBTSxJQUFJLENBQUM7QUFDMUMsY0FBSSxTQUFTLEtBQUssZUFBZSxDQUFDLEdBQUc7QUFDakMsaUJBQUssZUFBZSxDQUFDO0FBQUEsVUFDekI7QUFBQSxRQUNKLE9BQU87QUFDSCxpQkFBTyxJQUFJLEtBQUssS0FBSyxJQUFJLE1BQU0sTUFBTSxTQUFTLENBQUM7QUFBQSxRQUNuRDtBQUVBLGVBQU87QUFBQSxNQUNYO0FBR0EsZUFBUyxnQkFBZ0IsTUFBTSxLQUFLLEtBQUs7QUFDckMsWUFDSSxNQUFNLElBQUksTUFBTSxLQUVoQixTQUFTLElBQUksY0FBYyxNQUFNLEdBQUcsR0FBRyxFQUFFLFVBQVUsSUFBSSxPQUFPO0FBRWxFLGVBQU8sQ0FBQyxRQUFRLE1BQU07QUFBQSxNQUMxQjtBQUdBLGVBQVMsbUJBQW1CLE1BQU0sTUFBTSxTQUFTLEtBQUssS0FBSztBQUN2RCxZQUFJLGdCQUFnQixJQUFJLFVBQVUsT0FBTyxHQUNyQyxhQUFhLGdCQUFnQixNQUFNLEtBQUssR0FBRyxHQUMzQyxZQUFZLElBQUksS0FBSyxPQUFPLEtBQUssZUFBZSxZQUNoRCxTQUNBO0FBRUosWUFBSSxhQUFhLEdBQUc7QUFDaEIsb0JBQVUsT0FBTztBQUNqQix5QkFBZSxXQUFXLE9BQU8sSUFBSTtBQUFBLFFBQ3pDLFdBQVcsWUFBWSxXQUFXLElBQUksR0FBRztBQUNyQyxvQkFBVSxPQUFPO0FBQ2pCLHlCQUFlLFlBQVksV0FBVyxJQUFJO0FBQUEsUUFDOUMsT0FBTztBQUNILG9CQUFVO0FBQ1YseUJBQWU7QUFBQSxRQUNuQjtBQUVBLGVBQU87QUFBQSxVQUNILE1BQU07QUFBQSxVQUNOLFdBQVc7QUFBQSxRQUNmO0FBQUEsTUFDSjtBQUVBLGVBQVMsV0FBVyxLQUFLLEtBQUssS0FBSztBQUMvQixZQUFJLGFBQWEsZ0JBQWdCLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxHQUNqRCxPQUFPLEtBQUssT0FBTyxJQUFJLFVBQVUsSUFBSSxhQUFhLEtBQUssQ0FBQyxJQUFJLEdBQzVELFNBQ0E7QUFFSixZQUFJLE9BQU8sR0FBRztBQUNWLG9CQUFVLElBQUksS0FBSyxJQUFJO0FBQ3ZCLG9CQUFVLE9BQU8sWUFBWSxTQUFTLEtBQUssR0FBRztBQUFBLFFBQ2xELFdBQVcsT0FBTyxZQUFZLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxHQUFHO0FBQ2pELG9CQUFVLE9BQU8sWUFBWSxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUc7QUFDakQsb0JBQVUsSUFBSSxLQUFLLElBQUk7QUFBQSxRQUMzQixPQUFPO0FBQ0gsb0JBQVUsSUFBSSxLQUFLO0FBQ25CLG9CQUFVO0FBQUEsUUFDZDtBQUVBLGVBQU87QUFBQSxVQUNILE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNWO0FBQUEsTUFDSjtBQUVBLGVBQVMsWUFBWSxNQUFNLEtBQUssS0FBSztBQUNqQyxZQUFJLGFBQWEsZ0JBQWdCLE1BQU0sS0FBSyxHQUFHLEdBQzNDLGlCQUFpQixnQkFBZ0IsT0FBTyxHQUFHLEtBQUssR0FBRztBQUN2RCxnQkFBUSxXQUFXLElBQUksSUFBSSxhQUFhLGtCQUFrQjtBQUFBLE1BQzlEO0FBSUEscUJBQWUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sTUFBTTtBQUMzQyxxQkFBZSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxTQUFTO0FBSTlDLG9CQUFjLEtBQUssV0FBVyxzQkFBc0I7QUFDcEQsb0JBQWMsTUFBTSxXQUFXLE1BQU07QUFDckMsb0JBQWMsS0FBSyxXQUFXLHNCQUFzQjtBQUNwRCxvQkFBYyxNQUFNLFdBQVcsTUFBTTtBQUVyQztBQUFBLFFBQ0ksQ0FBQyxLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQUEsUUFDckIsU0FBVSxPQUFPLE1BQU0sUUFBUUwsUUFBTztBQUNsQyxlQUFLQSxPQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLEtBQUs7QUFBQSxRQUMxQztBQUFBLE1BQ0o7QUFNQSxlQUFTLFdBQVcsS0FBSztBQUNyQixlQUFPLFdBQVcsS0FBSyxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU0sR0FBRyxFQUFFO0FBQUEsTUFDM0Q7QUFFQSxVQUFJLG9CQUFvQjtBQUFBLFFBQ3BCLEtBQUs7QUFBQTtBQUFBLFFBQ0wsS0FBSztBQUFBO0FBQUEsTUFDVDtBQUVBLGVBQVMsdUJBQXVCO0FBQzVCLGVBQU8sS0FBSyxNQUFNO0FBQUEsTUFDdEI7QUFFQSxlQUFTLHVCQUF1QjtBQUM1QixlQUFPLEtBQUssTUFBTTtBQUFBLE1BQ3RCO0FBSUEsZUFBUyxXQUFXLE9BQU87QUFDdkIsWUFBSSxPQUFPLEtBQUssV0FBVyxFQUFFLEtBQUssSUFBSTtBQUN0QyxlQUFPLFNBQVMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLFFBQVEsR0FBRyxHQUFHO0FBQUEsTUFDbEU7QUFFQSxlQUFTLGNBQWMsT0FBTztBQUMxQixZQUFJLE9BQU8sV0FBVyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ2xDLGVBQU8sU0FBUyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsUUFBUSxHQUFHLEdBQUc7QUFBQSxNQUNsRTtBQUlBLHFCQUFlLEtBQUssR0FBRyxNQUFNLEtBQUs7QUFFbEMscUJBQWUsTUFBTSxHQUFHLEdBQUcsU0FBVVQsU0FBUTtBQUN6QyxlQUFPLEtBQUssV0FBVyxFQUFFLFlBQVksTUFBTUEsT0FBTTtBQUFBLE1BQ3JELENBQUM7QUFFRCxxQkFBZSxPQUFPLEdBQUcsR0FBRyxTQUFVQSxTQUFRO0FBQzFDLGVBQU8sS0FBSyxXQUFXLEVBQUUsY0FBYyxNQUFNQSxPQUFNO0FBQUEsTUFDdkQsQ0FBQztBQUVELHFCQUFlLFFBQVEsR0FBRyxHQUFHLFNBQVVBLFNBQVE7QUFDM0MsZUFBTyxLQUFLLFdBQVcsRUFBRSxTQUFTLE1BQU1BLE9BQU07QUFBQSxNQUNsRCxDQUFDO0FBRUQscUJBQWUsS0FBSyxHQUFHLEdBQUcsU0FBUztBQUNuQyxxQkFBZSxLQUFLLEdBQUcsR0FBRyxZQUFZO0FBSXRDLG9CQUFjLEtBQUssU0FBUztBQUM1QixvQkFBYyxLQUFLLFNBQVM7QUFDNUIsb0JBQWMsS0FBSyxTQUFTO0FBQzVCLG9CQUFjLE1BQU0sU0FBVSxVQUFVQyxTQUFRO0FBQzVDLGVBQU9BLFFBQU8saUJBQWlCLFFBQVE7QUFBQSxNQUMzQyxDQUFDO0FBQ0Qsb0JBQWMsT0FBTyxTQUFVLFVBQVVBLFNBQVE7QUFDN0MsZUFBT0EsUUFBTyxtQkFBbUIsUUFBUTtBQUFBLE1BQzdDLENBQUM7QUFDRCxvQkFBYyxRQUFRLFNBQVUsVUFBVUEsU0FBUTtBQUM5QyxlQUFPQSxRQUFPLGNBQWMsUUFBUTtBQUFBLE1BQ3hDLENBQUM7QUFFRCx3QkFBa0IsQ0FBQyxNQUFNLE9BQU8sTUFBTSxHQUFHLFNBQVUsT0FBTyxNQUFNLFFBQVFRLFFBQU87QUFDM0UsWUFBSSxVQUFVLE9BQU8sUUFBUSxjQUFjLE9BQU9BLFFBQU8sT0FBTyxPQUFPO0FBRXZFLFlBQUksV0FBVyxNQUFNO0FBQ2pCLGVBQUssSUFBSTtBQUFBLFFBQ2IsT0FBTztBQUNILDBCQUFnQixNQUFNLEVBQUUsaUJBQWlCO0FBQUEsUUFDN0M7QUFBQSxNQUNKLENBQUM7QUFFRCx3QkFBa0IsQ0FBQyxLQUFLLEtBQUssR0FBRyxHQUFHLFNBQVUsT0FBTyxNQUFNLFFBQVFBLFFBQU87QUFDckUsYUFBS0EsTUFBSyxJQUFJLE1BQU0sS0FBSztBQUFBLE1BQzdCLENBQUM7QUFJRCxlQUFTLGFBQWEsT0FBT1IsU0FBUTtBQUNqQyxZQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzNCLGlCQUFPO0FBQUEsUUFDWDtBQUVBLFlBQUksQ0FBQyxNQUFNLEtBQUssR0FBRztBQUNmLGlCQUFPLFNBQVMsT0FBTyxFQUFFO0FBQUEsUUFDN0I7QUFFQSxnQkFBUUEsUUFBTyxjQUFjLEtBQUs7QUFDbEMsWUFBSSxPQUFPLFVBQVUsVUFBVTtBQUMzQixpQkFBTztBQUFBLFFBQ1g7QUFFQSxlQUFPO0FBQUEsTUFDWDtBQUVBLGVBQVMsZ0JBQWdCLE9BQU9BLFNBQVE7QUFDcEMsWUFBSSxPQUFPLFVBQVUsVUFBVTtBQUMzQixpQkFBT0EsUUFBTyxjQUFjLEtBQUssSUFBSSxLQUFLO0FBQUEsUUFDOUM7QUFDQSxlQUFPLE1BQU0sS0FBSyxJQUFJLE9BQU87QUFBQSxNQUNqQztBQUdBLGVBQVMsY0FBYyxJQUFJLEdBQUc7QUFDMUIsZUFBTyxHQUFHLE1BQU0sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFBQSxNQUMvQztBQUVBLFVBQUksd0JBQ0ksMkRBQTJELE1BQU0sR0FBRyxHQUN4RSw2QkFBNkIsOEJBQThCLE1BQU0sR0FBRyxHQUNwRSwyQkFBMkIsdUJBQXVCLE1BQU0sR0FBRyxHQUMzRCx1QkFBdUIsV0FDdkIsNEJBQTRCLFdBQzVCLDBCQUEwQjtBQUU5QixlQUFTLGVBQWUsR0FBR0QsU0FBUTtBQUMvQixZQUFJLFdBQVdKLFNBQVEsS0FBSyxTQUFTLElBQy9CLEtBQUssWUFDTCxLQUFLLFVBQ0QsS0FBSyxNQUFNLFFBQVEsS0FBSyxVQUFVLFNBQVMsS0FBS0ksT0FBTSxJQUNoRCxXQUNBLFlBQ1Y7QUFDTixlQUFPLE1BQU0sT0FDUCxjQUFjLFVBQVUsS0FBSyxNQUFNLEdBQUcsSUFDdEMsSUFDRSxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQ2hCO0FBQUEsTUFDWjtBQUVBLGVBQVMsb0JBQW9CLEdBQUc7QUFDNUIsZUFBTyxNQUFNLE9BQ1AsY0FBYyxLQUFLLGdCQUFnQixLQUFLLE1BQU0sR0FBRyxJQUNqRCxJQUNFLEtBQUssZUFBZSxFQUFFLElBQUksQ0FBQyxJQUMzQixLQUFLO0FBQUEsTUFDakI7QUFFQSxlQUFTLGtCQUFrQixHQUFHO0FBQzFCLGVBQU8sTUFBTSxPQUNQLGNBQWMsS0FBSyxjQUFjLEtBQUssTUFBTSxHQUFHLElBQy9DLElBQ0UsS0FBSyxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQ3pCLEtBQUs7QUFBQSxNQUNqQjtBQUVBLGVBQVMsb0JBQW9CLGFBQWFBLFNBQVEsUUFBUTtBQUN0RCxZQUFJLEdBQ0EsSUFDQSxLQUNBLE1BQU0sWUFBWSxrQkFBa0I7QUFDeEMsWUFBSSxDQUFDLEtBQUssZ0JBQWdCO0FBQ3RCLGVBQUssaUJBQWlCLENBQUM7QUFDdkIsZUFBSyxzQkFBc0IsQ0FBQztBQUM1QixlQUFLLG9CQUFvQixDQUFDO0FBRTFCLGVBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDcEIsa0JBQU0sVUFBVSxDQUFDLEtBQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQ2hDLGlCQUFLLGtCQUFrQixDQUFDLElBQUksS0FBSztBQUFBLGNBQzdCO0FBQUEsY0FDQTtBQUFBLFlBQ0osRUFBRSxrQkFBa0I7QUFDcEIsaUJBQUssb0JBQW9CLENBQUMsSUFBSSxLQUFLO0FBQUEsY0FDL0I7QUFBQSxjQUNBO0FBQUEsWUFDSixFQUFFLGtCQUFrQjtBQUNwQixpQkFBSyxlQUFlLENBQUMsSUFBSSxLQUFLLFNBQVMsS0FBSyxFQUFFLEVBQUUsa0JBQWtCO0FBQUEsVUFDdEU7QUFBQSxRQUNKO0FBRUEsWUFBSSxRQUFRO0FBQ1IsY0FBSUEsWUFBVyxRQUFRO0FBQ25CLGlCQUFLLFFBQVEsS0FBSyxLQUFLLGdCQUFnQixHQUFHO0FBQzFDLG1CQUFPLE9BQU8sS0FBSyxLQUFLO0FBQUEsVUFDNUIsV0FBV0EsWUFBVyxPQUFPO0FBQ3pCLGlCQUFLLFFBQVEsS0FBSyxLQUFLLHFCQUFxQixHQUFHO0FBQy9DLG1CQUFPLE9BQU8sS0FBSyxLQUFLO0FBQUEsVUFDNUIsT0FBTztBQUNILGlCQUFLLFFBQVEsS0FBSyxLQUFLLG1CQUFtQixHQUFHO0FBQzdDLG1CQUFPLE9BQU8sS0FBSyxLQUFLO0FBQUEsVUFDNUI7QUFBQSxRQUNKLE9BQU87QUFDSCxjQUFJQSxZQUFXLFFBQVE7QUFDbkIsaUJBQUssUUFBUSxLQUFLLEtBQUssZ0JBQWdCLEdBQUc7QUFDMUMsZ0JBQUksT0FBTyxJQUFJO0FBQ1gscUJBQU87QUFBQSxZQUNYO0FBQ0EsaUJBQUssUUFBUSxLQUFLLEtBQUsscUJBQXFCLEdBQUc7QUFDL0MsZ0JBQUksT0FBTyxJQUFJO0FBQ1gscUJBQU87QUFBQSxZQUNYO0FBQ0EsaUJBQUssUUFBUSxLQUFLLEtBQUssbUJBQW1CLEdBQUc7QUFDN0MsbUJBQU8sT0FBTyxLQUFLLEtBQUs7QUFBQSxVQUM1QixXQUFXQSxZQUFXLE9BQU87QUFDekIsaUJBQUssUUFBUSxLQUFLLEtBQUsscUJBQXFCLEdBQUc7QUFDL0MsZ0JBQUksT0FBTyxJQUFJO0FBQ1gscUJBQU87QUFBQSxZQUNYO0FBQ0EsaUJBQUssUUFBUSxLQUFLLEtBQUssZ0JBQWdCLEdBQUc7QUFDMUMsZ0JBQUksT0FBTyxJQUFJO0FBQ1gscUJBQU87QUFBQSxZQUNYO0FBQ0EsaUJBQUssUUFBUSxLQUFLLEtBQUssbUJBQW1CLEdBQUc7QUFDN0MsbUJBQU8sT0FBTyxLQUFLLEtBQUs7QUFBQSxVQUM1QixPQUFPO0FBQ0gsaUJBQUssUUFBUSxLQUFLLEtBQUssbUJBQW1CLEdBQUc7QUFDN0MsZ0JBQUksT0FBTyxJQUFJO0FBQ1gscUJBQU87QUFBQSxZQUNYO0FBQ0EsaUJBQUssUUFBUSxLQUFLLEtBQUssZ0JBQWdCLEdBQUc7QUFDMUMsZ0JBQUksT0FBTyxJQUFJO0FBQ1gscUJBQU87QUFBQSxZQUNYO0FBQ0EsaUJBQUssUUFBUSxLQUFLLEtBQUsscUJBQXFCLEdBQUc7QUFDL0MsbUJBQU8sT0FBTyxLQUFLLEtBQUs7QUFBQSxVQUM1QjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBRUEsZUFBUyxvQkFBb0IsYUFBYUEsU0FBUSxRQUFRO0FBQ3RELFlBQUksR0FBRyxLQUFLO0FBRVosWUFBSSxLQUFLLHFCQUFxQjtBQUMxQixpQkFBTyxvQkFBb0IsS0FBSyxNQUFNLGFBQWFBLFNBQVEsTUFBTTtBQUFBLFFBQ3JFO0FBRUEsWUFBSSxDQUFDLEtBQUssZ0JBQWdCO0FBQ3RCLGVBQUssaUJBQWlCLENBQUM7QUFDdkIsZUFBSyxvQkFBb0IsQ0FBQztBQUMxQixlQUFLLHNCQUFzQixDQUFDO0FBQzVCLGVBQUsscUJBQXFCLENBQUM7QUFBQSxRQUMvQjtBQUVBLGFBQUssSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLO0FBR3BCLGdCQUFNLFVBQVUsQ0FBQyxLQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUNoQyxjQUFJLFVBQVUsQ0FBQyxLQUFLLG1CQUFtQixDQUFDLEdBQUc7QUFDdkMsaUJBQUssbUJBQW1CLENBQUMsSUFBSSxJQUFJO0FBQUEsY0FDN0IsTUFBTSxLQUFLLFNBQVMsS0FBSyxFQUFFLEVBQUUsUUFBUSxLQUFLLE1BQU0sSUFBSTtBQUFBLGNBQ3BEO0FBQUEsWUFDSjtBQUNBLGlCQUFLLG9CQUFvQixDQUFDLElBQUksSUFBSTtBQUFBLGNBQzlCLE1BQU0sS0FBSyxjQUFjLEtBQUssRUFBRSxFQUFFLFFBQVEsS0FBSyxNQUFNLElBQUk7QUFBQSxjQUN6RDtBQUFBLFlBQ0o7QUFDQSxpQkFBSyxrQkFBa0IsQ0FBQyxJQUFJLElBQUk7QUFBQSxjQUM1QixNQUFNLEtBQUssWUFBWSxLQUFLLEVBQUUsRUFBRSxRQUFRLEtBQUssTUFBTSxJQUFJO0FBQUEsY0FDdkQ7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUNBLGNBQUksQ0FBQyxLQUFLLGVBQWUsQ0FBQyxHQUFHO0FBQ3pCLG9CQUNJLE1BQ0EsS0FBSyxTQUFTLEtBQUssRUFBRSxJQUNyQixPQUNBLEtBQUssY0FBYyxLQUFLLEVBQUUsSUFDMUIsT0FDQSxLQUFLLFlBQVksS0FBSyxFQUFFO0FBQzVCLGlCQUFLLGVBQWUsQ0FBQyxJQUFJLElBQUksT0FBTyxNQUFNLFFBQVEsS0FBSyxFQUFFLEdBQUcsR0FBRztBQUFBLFVBQ25FO0FBRUEsY0FDSSxVQUNBQSxZQUFXLFVBQ1gsS0FBSyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssV0FBVyxHQUM3QztBQUNFLG1CQUFPO0FBQUEsVUFDWCxXQUNJLFVBQ0FBLFlBQVcsU0FDWCxLQUFLLG9CQUFvQixDQUFDLEVBQUUsS0FBSyxXQUFXLEdBQzlDO0FBQ0UsbUJBQU87QUFBQSxVQUNYLFdBQ0ksVUFDQUEsWUFBVyxRQUNYLEtBQUssa0JBQWtCLENBQUMsRUFBRSxLQUFLLFdBQVcsR0FDNUM7QUFDRSxtQkFBTztBQUFBLFVBQ1gsV0FBVyxDQUFDLFVBQVUsS0FBSyxlQUFlLENBQUMsRUFBRSxLQUFLLFdBQVcsR0FBRztBQUM1RCxtQkFBTztBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUlBLGVBQVMsZ0JBQWdCLE9BQU87QUFDNUIsWUFBSSxDQUFDLEtBQUssUUFBUSxHQUFHO0FBQ2pCLGlCQUFPLFNBQVMsT0FBTyxPQUFPO0FBQUEsUUFDbEM7QUFFQSxZQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUs7QUFDekIsWUFBSSxTQUFTLE1BQU07QUFDZixrQkFBUSxhQUFhLE9BQU8sS0FBSyxXQUFXLENBQUM7QUFDN0MsaUJBQU8sS0FBSyxJQUFJLFFBQVEsS0FBSyxHQUFHO0FBQUEsUUFDcEMsT0FBTztBQUNILGlCQUFPO0FBQUEsUUFDWDtBQUFBLE1BQ0o7QUFFQSxlQUFTLHNCQUFzQixPQUFPO0FBQ2xDLFlBQUksQ0FBQyxLQUFLLFFBQVEsR0FBRztBQUNqQixpQkFBTyxTQUFTLE9BQU8sT0FBTztBQUFBLFFBQ2xDO0FBQ0EsWUFBSSxXQUFXLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxXQUFXLEVBQUUsTUFBTSxPQUFPO0FBQy9ELGVBQU8sU0FBUyxPQUFPLFVBQVUsS0FBSyxJQUFJLFFBQVEsU0FBUyxHQUFHO0FBQUEsTUFDbEU7QUFFQSxlQUFTLG1CQUFtQixPQUFPO0FBQy9CLFlBQUksQ0FBQyxLQUFLLFFBQVEsR0FBRztBQUNqQixpQkFBTyxTQUFTLE9BQU8sT0FBTztBQUFBLFFBQ2xDO0FBTUEsWUFBSSxTQUFTLE1BQU07QUFDZixjQUFJLFVBQVUsZ0JBQWdCLE9BQU8sS0FBSyxXQUFXLENBQUM7QUFDdEQsaUJBQU8sS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksVUFBVSxVQUFVLENBQUM7QUFBQSxRQUMxRCxPQUFPO0FBQ0gsaUJBQU8sS0FBSyxJQUFJLEtBQUs7QUFBQSxRQUN6QjtBQUFBLE1BQ0o7QUFFQSxlQUFTLGNBQWMsVUFBVTtBQUM3QixZQUFJLEtBQUsscUJBQXFCO0FBQzFCLGNBQUksQ0FBQyxXQUFXLE1BQU0sZ0JBQWdCLEdBQUc7QUFDckMsaUNBQXFCLEtBQUssSUFBSTtBQUFBLFVBQ2xDO0FBQ0EsY0FBSSxVQUFVO0FBQ1YsbUJBQU8sS0FBSztBQUFBLFVBQ2hCLE9BQU87QUFDSCxtQkFBTyxLQUFLO0FBQUEsVUFDaEI7QUFBQSxRQUNKLE9BQU87QUFDSCxjQUFJLENBQUMsV0FBVyxNQUFNLGdCQUFnQixHQUFHO0FBQ3JDLGlCQUFLLGlCQUFpQjtBQUFBLFVBQzFCO0FBQ0EsaUJBQU8sS0FBSyx3QkFBd0IsV0FDOUIsS0FBSyx1QkFDTCxLQUFLO0FBQUEsUUFDZjtBQUFBLE1BQ0o7QUFFQSxlQUFTLG1CQUFtQixVQUFVO0FBQ2xDLFlBQUksS0FBSyxxQkFBcUI7QUFDMUIsY0FBSSxDQUFDLFdBQVcsTUFBTSxnQkFBZ0IsR0FBRztBQUNyQyxpQ0FBcUIsS0FBSyxJQUFJO0FBQUEsVUFDbEM7QUFDQSxjQUFJLFVBQVU7QUFDVixtQkFBTyxLQUFLO0FBQUEsVUFDaEIsT0FBTztBQUNILG1CQUFPLEtBQUs7QUFBQSxVQUNoQjtBQUFBLFFBQ0osT0FBTztBQUNILGNBQUksQ0FBQyxXQUFXLE1BQU0scUJBQXFCLEdBQUc7QUFDMUMsaUJBQUssc0JBQXNCO0FBQUEsVUFDL0I7QUFDQSxpQkFBTyxLQUFLLDZCQUE2QixXQUNuQyxLQUFLLDRCQUNMLEtBQUs7QUFBQSxRQUNmO0FBQUEsTUFDSjtBQUVBLGVBQVMsaUJBQWlCLFVBQVU7QUFDaEMsWUFBSSxLQUFLLHFCQUFxQjtBQUMxQixjQUFJLENBQUMsV0FBVyxNQUFNLGdCQUFnQixHQUFHO0FBQ3JDLGlDQUFxQixLQUFLLElBQUk7QUFBQSxVQUNsQztBQUNBLGNBQUksVUFBVTtBQUNWLG1CQUFPLEtBQUs7QUFBQSxVQUNoQixPQUFPO0FBQ0gsbUJBQU8sS0FBSztBQUFBLFVBQ2hCO0FBQUEsUUFDSixPQUFPO0FBQ0gsY0FBSSxDQUFDLFdBQVcsTUFBTSxtQkFBbUIsR0FBRztBQUN4QyxpQkFBSyxvQkFBb0I7QUFBQSxVQUM3QjtBQUNBLGlCQUFPLEtBQUssMkJBQTJCLFdBQ2pDLEtBQUssMEJBQ0wsS0FBSztBQUFBLFFBQ2Y7QUFBQSxNQUNKO0FBRUEsZUFBUyx1QkFBdUI7QUFDNUIsaUJBQVMsVUFBVSxHQUFHLEdBQUc7QUFDckIsaUJBQU8sRUFBRSxTQUFTLEVBQUU7QUFBQSxRQUN4QjtBQUVBLFlBQUksWUFBWSxDQUFDLEdBQ2IsY0FBYyxDQUFDLEdBQ2YsYUFBYSxDQUFDLEdBQ2QsY0FBYyxDQUFDLEdBQ2YsR0FDQSxLQUNBLE1BQ0EsUUFDQTtBQUNKLGFBQUssSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLO0FBRXBCLGdCQUFNLFVBQVUsQ0FBQyxLQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUNoQyxpQkFBTyxZQUFZLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztBQUM1QyxtQkFBUyxZQUFZLEtBQUssY0FBYyxLQUFLLEVBQUUsQ0FBQztBQUNoRCxrQkFBUSxZQUFZLEtBQUssU0FBUyxLQUFLLEVBQUUsQ0FBQztBQUMxQyxvQkFBVSxLQUFLLElBQUk7QUFDbkIsc0JBQVksS0FBSyxNQUFNO0FBQ3ZCLHFCQUFXLEtBQUssS0FBSztBQUNyQixzQkFBWSxLQUFLLElBQUk7QUFDckIsc0JBQVksS0FBSyxNQUFNO0FBQ3ZCLHNCQUFZLEtBQUssS0FBSztBQUFBLFFBQzFCO0FBR0Esa0JBQVUsS0FBSyxTQUFTO0FBQ3hCLG9CQUFZLEtBQUssU0FBUztBQUMxQixtQkFBVyxLQUFLLFNBQVM7QUFDekIsb0JBQVksS0FBSyxTQUFTO0FBRTFCLGFBQUssaUJBQWlCLElBQUksT0FBTyxPQUFPLFlBQVksS0FBSyxHQUFHLElBQUksS0FBSyxHQUFHO0FBQ3hFLGFBQUssc0JBQXNCLEtBQUs7QUFDaEMsYUFBSyxvQkFBb0IsS0FBSztBQUU5QixhQUFLLHVCQUF1QixJQUFJO0FBQUEsVUFDNUIsT0FBTyxXQUFXLEtBQUssR0FBRyxJQUFJO0FBQUEsVUFDOUI7QUFBQSxRQUNKO0FBQ0EsYUFBSyw0QkFBNEIsSUFBSTtBQUFBLFVBQ2pDLE9BQU8sWUFBWSxLQUFLLEdBQUcsSUFBSTtBQUFBLFVBQy9CO0FBQUEsUUFDSjtBQUNBLGFBQUssMEJBQTBCLElBQUk7QUFBQSxVQUMvQixPQUFPLFVBQVUsS0FBSyxHQUFHLElBQUk7QUFBQSxVQUM3QjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBSUEsZUFBUyxVQUFVO0FBQ2YsZUFBTyxLQUFLLE1BQU0sSUFBSSxNQUFNO0FBQUEsTUFDaEM7QUFFQSxlQUFTLFVBQVU7QUFDZixlQUFPLEtBQUssTUFBTSxLQUFLO0FBQUEsTUFDM0I7QUFFQSxxQkFBZSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNO0FBQ3hDLHFCQUFlLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLE9BQU87QUFDekMscUJBQWUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsT0FBTztBQUV6QyxxQkFBZSxPQUFPLEdBQUcsR0FBRyxXQUFZO0FBQ3BDLGVBQU8sS0FBSyxRQUFRLE1BQU0sSUFBSSxJQUFJLFNBQVMsS0FBSyxRQUFRLEdBQUcsQ0FBQztBQUFBLE1BQ2hFLENBQUM7QUFFRCxxQkFBZSxTQUFTLEdBQUcsR0FBRyxXQUFZO0FBQ3RDLGVBQ0ksS0FDQSxRQUFRLE1BQU0sSUFBSSxJQUNsQixTQUFTLEtBQUssUUFBUSxHQUFHLENBQUMsSUFDMUIsU0FBUyxLQUFLLFFBQVEsR0FBRyxDQUFDO0FBQUEsTUFFbEMsQ0FBQztBQUVELHFCQUFlLE9BQU8sR0FBRyxHQUFHLFdBQVk7QUFDcEMsZUFBTyxLQUFLLEtBQUssTUFBTSxJQUFJLFNBQVMsS0FBSyxRQUFRLEdBQUcsQ0FBQztBQUFBLE1BQ3pELENBQUM7QUFFRCxxQkFBZSxTQUFTLEdBQUcsR0FBRyxXQUFZO0FBQ3RDLGVBQ0ksS0FDQSxLQUFLLE1BQU0sSUFDWCxTQUFTLEtBQUssUUFBUSxHQUFHLENBQUMsSUFDMUIsU0FBUyxLQUFLLFFBQVEsR0FBRyxDQUFDO0FBQUEsTUFFbEMsQ0FBQztBQUVELGVBQVMsU0FBU1MsUUFBTyxXQUFXO0FBQ2hDLHVCQUFlQSxRQUFPLEdBQUcsR0FBRyxXQUFZO0FBQ3BDLGlCQUFPLEtBQUssV0FBVyxFQUFFO0FBQUEsWUFDckIsS0FBSyxNQUFNO0FBQUEsWUFDWCxLQUFLLFFBQVE7QUFBQSxZQUNiO0FBQUEsVUFDSjtBQUFBLFFBQ0osQ0FBQztBQUFBLE1BQ0w7QUFFQSxlQUFTLEtBQUssSUFBSTtBQUNsQixlQUFTLEtBQUssS0FBSztBQUluQixlQUFTLGNBQWMsVUFBVVIsU0FBUTtBQUNyQyxlQUFPQSxRQUFPO0FBQUEsTUFDbEI7QUFFQSxvQkFBYyxLQUFLLGFBQWE7QUFDaEMsb0JBQWMsS0FBSyxhQUFhO0FBQ2hDLG9CQUFjLEtBQUssV0FBVyxnQkFBZ0I7QUFDOUMsb0JBQWMsS0FBSyxXQUFXLHNCQUFzQjtBQUNwRCxvQkFBYyxLQUFLLFdBQVcsc0JBQXNCO0FBQ3BELG9CQUFjLE1BQU0sV0FBVyxNQUFNO0FBQ3JDLG9CQUFjLE1BQU0sV0FBVyxNQUFNO0FBQ3JDLG9CQUFjLE1BQU0sV0FBVyxNQUFNO0FBRXJDLG9CQUFjLE9BQU8sU0FBUztBQUM5QixvQkFBYyxTQUFTLFNBQVM7QUFDaEMsb0JBQWMsT0FBTyxTQUFTO0FBQzlCLG9CQUFjLFNBQVMsU0FBUztBQUVoQyxvQkFBYyxDQUFDLEtBQUssSUFBSSxHQUFHLElBQUk7QUFDL0Isb0JBQWMsQ0FBQyxLQUFLLElBQUksR0FBRyxTQUFVLE9BQU8sT0FBTyxRQUFRO0FBQ3ZELFlBQUksU0FBUyxNQUFNLEtBQUs7QUFDeEIsY0FBTSxJQUFJLElBQUksV0FBVyxLQUFLLElBQUk7QUFBQSxNQUN0QyxDQUFDO0FBQ0Qsb0JBQWMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxTQUFVLE9BQU8sT0FBTyxRQUFRO0FBQ3RELGVBQU8sUUFBUSxPQUFPLFFBQVEsS0FBSyxLQUFLO0FBQ3hDLGVBQU8sWUFBWTtBQUFBLE1BQ3ZCLENBQUM7QUFDRCxvQkFBYyxDQUFDLEtBQUssSUFBSSxHQUFHLFNBQVUsT0FBTyxPQUFPLFFBQVE7QUFDdkQsY0FBTSxJQUFJLElBQUksTUFBTSxLQUFLO0FBQ3pCLHdCQUFnQixNQUFNLEVBQUUsVUFBVTtBQUFBLE1BQ3RDLENBQUM7QUFDRCxvQkFBYyxPQUFPLFNBQVUsT0FBTyxPQUFPLFFBQVE7QUFDakQsWUFBSSxNQUFNLE1BQU0sU0FBUztBQUN6QixjQUFNLElBQUksSUFBSSxNQUFNLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUN4QyxjQUFNLE1BQU0sSUFBSSxNQUFNLE1BQU0sT0FBTyxHQUFHLENBQUM7QUFDdkMsd0JBQWdCLE1BQU0sRUFBRSxVQUFVO0FBQUEsTUFDdEMsQ0FBQztBQUNELG9CQUFjLFNBQVMsU0FBVSxPQUFPLE9BQU8sUUFBUTtBQUNuRCxZQUFJLE9BQU8sTUFBTSxTQUFTLEdBQ3RCLE9BQU8sTUFBTSxTQUFTO0FBQzFCLGNBQU0sSUFBSSxJQUFJLE1BQU0sTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLGNBQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxPQUFPLE1BQU0sQ0FBQyxDQUFDO0FBQzNDLGNBQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxPQUFPLElBQUksQ0FBQztBQUN4Qyx3QkFBZ0IsTUFBTSxFQUFFLFVBQVU7QUFBQSxNQUN0QyxDQUFDO0FBQ0Qsb0JBQWMsT0FBTyxTQUFVLE9BQU8sT0FBTyxRQUFRO0FBQ2pELFlBQUksTUFBTSxNQUFNLFNBQVM7QUFDekIsY0FBTSxJQUFJLElBQUksTUFBTSxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFDeEMsY0FBTSxNQUFNLElBQUksTUFBTSxNQUFNLE9BQU8sR0FBRyxDQUFDO0FBQUEsTUFDM0MsQ0FBQztBQUNELG9CQUFjLFNBQVMsU0FBVSxPQUFPLE9BQU8sUUFBUTtBQUNuRCxZQUFJLE9BQU8sTUFBTSxTQUFTLEdBQ3RCLE9BQU8sTUFBTSxTQUFTO0FBQzFCLGNBQU0sSUFBSSxJQUFJLE1BQU0sTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLGNBQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxPQUFPLE1BQU0sQ0FBQyxDQUFDO0FBQzNDLGNBQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxPQUFPLElBQUksQ0FBQztBQUFBLE1BQzVDLENBQUM7QUFJRCxlQUFTLFdBQVcsT0FBTztBQUd2QixnQkFBUSxRQUFRLElBQUksWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNO0FBQUEsTUFDcEQ7QUFFQSxVQUFJLDZCQUE2QixpQkFLN0IsYUFBYSxXQUFXLFNBQVMsSUFBSTtBQUV6QyxlQUFTLGVBQWVjLFFBQU9DLFVBQVMsU0FBUztBQUM3QyxZQUFJRCxTQUFRLElBQUk7QUFDWixpQkFBTyxVQUFVLE9BQU87QUFBQSxRQUM1QixPQUFPO0FBQ0gsaUJBQU8sVUFBVSxPQUFPO0FBQUEsUUFDNUI7QUFBQSxNQUNKO0FBRUEsVUFBSSxhQUFhO0FBQUEsUUFDYixVQUFVO0FBQUEsUUFDVixnQkFBZ0I7QUFBQSxRQUNoQixhQUFhO0FBQUEsUUFDYixTQUFTO0FBQUEsUUFDVCx3QkFBd0I7QUFBQSxRQUN4QixjQUFjO0FBQUEsUUFFZCxRQUFRO0FBQUEsUUFDUixhQUFhO0FBQUEsUUFFYixNQUFNO0FBQUEsUUFFTixVQUFVO0FBQUEsUUFDVixhQUFhO0FBQUEsUUFDYixlQUFlO0FBQUEsUUFFZixlQUFlO0FBQUEsTUFDbkI7QUFHQSxVQUFJLFVBQVUsQ0FBQyxHQUNYLGlCQUFpQixDQUFDLEdBQ2xCO0FBRUosZUFBUyxhQUFhLE1BQU0sTUFBTTtBQUM5QixZQUFJLEdBQ0EsT0FBTyxLQUFLLElBQUksS0FBSyxRQUFRLEtBQUssTUFBTTtBQUM1QyxhQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHO0FBQzFCLGNBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUc7QUFDckIsbUJBQU87QUFBQSxVQUNYO0FBQUEsUUFDSjtBQUNBLGVBQU87QUFBQSxNQUNYO0FBRUEsZUFBUyxnQkFBZ0IsS0FBSztBQUMxQixlQUFPLE1BQU0sSUFBSSxZQUFZLEVBQUUsUUFBUSxLQUFLLEdBQUcsSUFBSTtBQUFBLE1BQ3ZEO0FBS0EsZUFBUyxhQUFhRSxRQUFPO0FBQ3pCLFlBQUksSUFBSSxHQUNKLEdBQ0EsTUFDQWhCLFNBQ0E7QUFFSixlQUFPLElBQUlnQixPQUFNLFFBQVE7QUFDckIsa0JBQVEsZ0JBQWdCQSxPQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRztBQUMzQyxjQUFJLE1BQU07QUFDVixpQkFBTyxnQkFBZ0JBLE9BQU0sSUFBSSxDQUFDLENBQUM7QUFDbkMsaUJBQU8sT0FBTyxLQUFLLE1BQU0sR0FBRyxJQUFJO0FBQ2hDLGlCQUFPLElBQUksR0FBRztBQUNWLFlBQUFoQixVQUFTLFdBQVcsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDO0FBQy9DLGdCQUFJQSxTQUFRO0FBQ1IscUJBQU9BO0FBQUEsWUFDWDtBQUNBLGdCQUNJLFFBQ0EsS0FBSyxVQUFVLEtBQ2YsYUFBYSxPQUFPLElBQUksS0FBSyxJQUFJLEdBQ25DO0FBRUU7QUFBQSxZQUNKO0FBQ0E7QUFBQSxVQUNKO0FBQ0E7QUFBQSxRQUNKO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFFQSxlQUFTLGlCQUFpQixNQUFNO0FBRzVCLGVBQU8sQ0FBQyxFQUFFLFFBQVEsS0FBSyxNQUFNLGFBQWE7QUFBQSxNQUM5QztBQUVBLGVBQVMsV0FBVyxNQUFNO0FBQ3RCLFlBQUksWUFBWSxNQUNaO0FBRUosWUFDSSxRQUFRLElBQUksTUFBTSxVQUNsQixPQUFPUCxZQUFXLGVBQ2xCQSxXQUNBQSxRQUFPLFdBQ1AsaUJBQWlCLElBQUksR0FDdkI7QUFDRSxjQUFJO0FBQ0Esd0JBQVksYUFBYTtBQUN6Qiw2QkFBaUI7QUFDakIsMkJBQWUsY0FBYyxJQUFJO0FBQ2pDLCtCQUFtQixTQUFTO0FBQUEsVUFDaEMsU0FBUyxHQUFHO0FBR1Isb0JBQVEsSUFBSSxJQUFJO0FBQUEsVUFDcEI7QUFBQSxRQUNKO0FBQ0EsZUFBTyxRQUFRLElBQUk7QUFBQSxNQUN2QjtBQUtBLGVBQVMsbUJBQW1CLEtBQUssUUFBUTtBQUNyQyxZQUFJO0FBQ0osWUFBSSxLQUFLO0FBQ0wsY0FBSSxZQUFZLE1BQU0sR0FBRztBQUNyQixtQkFBTyxVQUFVLEdBQUc7QUFBQSxVQUN4QixPQUFPO0FBQ0gsbUJBQU8sYUFBYSxLQUFLLE1BQU07QUFBQSxVQUNuQztBQUVBLGNBQUksTUFBTTtBQUVOLDJCQUFlO0FBQUEsVUFDbkIsT0FBTztBQUNILGdCQUFJLE9BQU8sWUFBWSxlQUFlLFFBQVEsTUFBTTtBQUVoRCxzQkFBUTtBQUFBLGdCQUNKLFlBQVksTUFBTTtBQUFBLGNBQ3RCO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBRUEsZUFBTyxhQUFhO0FBQUEsTUFDeEI7QUFFQSxlQUFTLGFBQWEsTUFBTSxRQUFRO0FBQ2hDLFlBQUksV0FBVyxNQUFNO0FBQ2pCLGNBQUlPLFNBQ0EsZUFBZTtBQUNuQixpQkFBTyxPQUFPO0FBQ2QsY0FBSSxRQUFRLElBQUksS0FBSyxNQUFNO0FBQ3ZCO0FBQUEsY0FDSTtBQUFBLGNBQ0E7QUFBQSxZQUlKO0FBQ0EsMkJBQWUsUUFBUSxJQUFJLEVBQUU7QUFBQSxVQUNqQyxXQUFXLE9BQU8sZ0JBQWdCLE1BQU07QUFDcEMsZ0JBQUksUUFBUSxPQUFPLFlBQVksS0FBSyxNQUFNO0FBQ3RDLDZCQUFlLFFBQVEsT0FBTyxZQUFZLEVBQUU7QUFBQSxZQUNoRCxPQUFPO0FBQ0gsY0FBQUEsVUFBUyxXQUFXLE9BQU8sWUFBWTtBQUN2QyxrQkFBSUEsV0FBVSxNQUFNO0FBQ2hCLCtCQUFlQSxRQUFPO0FBQUEsY0FDMUIsT0FBTztBQUNILG9CQUFJLENBQUMsZUFBZSxPQUFPLFlBQVksR0FBRztBQUN0QyxpQ0FBZSxPQUFPLFlBQVksSUFBSSxDQUFDO0FBQUEsZ0JBQzNDO0FBQ0EsK0JBQWUsT0FBTyxZQUFZLEVBQUUsS0FBSztBQUFBLGtCQUNyQztBQUFBLGtCQUNBO0FBQUEsZ0JBQ0osQ0FBQztBQUNELHVCQUFPO0FBQUEsY0FDWDtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQ0Esa0JBQVEsSUFBSSxJQUFJLElBQUksT0FBTyxhQUFhLGNBQWMsTUFBTSxDQUFDO0FBRTdELGNBQUksZUFBZSxJQUFJLEdBQUc7QUFDdEIsMkJBQWUsSUFBSSxFQUFFLFFBQVEsU0FBVSxHQUFHO0FBQ3RDLDJCQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU07QUFBQSxZQUNqQyxDQUFDO0FBQUEsVUFDTDtBQUtBLDZCQUFtQixJQUFJO0FBRXZCLGlCQUFPLFFBQVEsSUFBSTtBQUFBLFFBQ3ZCLE9BQU87QUFFSCxpQkFBTyxRQUFRLElBQUk7QUFDbkIsaUJBQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUVBLGVBQVMsYUFBYSxNQUFNLFFBQVE7QUFDaEMsWUFBSSxVQUFVLE1BQU07QUFDaEIsY0FBSUEsU0FDQSxXQUNBLGVBQWU7QUFFbkIsY0FBSSxRQUFRLElBQUksS0FBSyxRQUFRLFFBQVEsSUFBSSxFQUFFLGdCQUFnQixNQUFNO0FBRTdELG9CQUFRLElBQUksRUFBRSxJQUFJLGFBQWEsUUFBUSxJQUFJLEVBQUUsU0FBUyxNQUFNLENBQUM7QUFBQSxVQUNqRSxPQUFPO0FBRUgsd0JBQVksV0FBVyxJQUFJO0FBQzNCLGdCQUFJLGFBQWEsTUFBTTtBQUNuQiw2QkFBZSxVQUFVO0FBQUEsWUFDN0I7QUFDQSxxQkFBUyxhQUFhLGNBQWMsTUFBTTtBQUMxQyxnQkFBSSxhQUFhLE1BQU07QUFJbkIscUJBQU8sT0FBTztBQUFBLFlBQ2xCO0FBQ0EsWUFBQUEsVUFBUyxJQUFJLE9BQU8sTUFBTTtBQUMxQixZQUFBQSxRQUFPLGVBQWUsUUFBUSxJQUFJO0FBQ2xDLG9CQUFRLElBQUksSUFBSUE7QUFBQSxVQUNwQjtBQUdBLDZCQUFtQixJQUFJO0FBQUEsUUFDM0IsT0FBTztBQUVILGNBQUksUUFBUSxJQUFJLEtBQUssTUFBTTtBQUN2QixnQkFBSSxRQUFRLElBQUksRUFBRSxnQkFBZ0IsTUFBTTtBQUNwQyxzQkFBUSxJQUFJLElBQUksUUFBUSxJQUFJLEVBQUU7QUFDOUIsa0JBQUksU0FBUyxtQkFBbUIsR0FBRztBQUMvQixtQ0FBbUIsSUFBSTtBQUFBLGNBQzNCO0FBQUEsWUFDSixXQUFXLFFBQVEsSUFBSSxLQUFLLE1BQU07QUFDOUIscUJBQU8sUUFBUSxJQUFJO0FBQUEsWUFDdkI7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUNBLGVBQU8sUUFBUSxJQUFJO0FBQUEsTUFDdkI7QUFHQSxlQUFTLFVBQVUsS0FBSztBQUNwQixZQUFJQTtBQUVKLFlBQUksT0FBTyxJQUFJLFdBQVcsSUFBSSxRQUFRLE9BQU87QUFDekMsZ0JBQU0sSUFBSSxRQUFRO0FBQUEsUUFDdEI7QUFFQSxZQUFJLENBQUMsS0FBSztBQUNOLGlCQUFPO0FBQUEsUUFDWDtBQUVBLFlBQUksQ0FBQ0wsU0FBUSxHQUFHLEdBQUc7QUFFZixVQUFBSyxVQUFTLFdBQVcsR0FBRztBQUN2QixjQUFJQSxTQUFRO0FBQ1IsbUJBQU9BO0FBQUEsVUFDWDtBQUNBLGdCQUFNLENBQUMsR0FBRztBQUFBLFFBQ2Q7QUFFQSxlQUFPLGFBQWEsR0FBRztBQUFBLE1BQzNCO0FBRUEsZUFBUyxjQUFjO0FBQ25CLGVBQU8sS0FBSyxPQUFPO0FBQUEsTUFDdkI7QUFFQSxlQUFTLGNBQWMsR0FBRztBQUN0QixZQUFJLFVBQ0EsSUFBSSxFQUFFO0FBRVYsWUFBSSxLQUFLLGdCQUFnQixDQUFDLEVBQUUsYUFBYSxJQUFJO0FBQ3pDLHFCQUNJLEVBQUUsS0FBSyxJQUFJLEtBQUssRUFBRSxLQUFLLElBQUksS0FDckIsUUFDQSxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsSUFBSSxJQUFJLFlBQVksRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFDcEQsT0FDQSxFQUFFLElBQUksSUFBSSxLQUNSLEVBQUUsSUFBSSxJQUFJLE1BQ1QsRUFBRSxJQUFJLE1BQU0sT0FDUixFQUFFLE1BQU0sTUFBTSxLQUNYLEVBQUUsTUFBTSxNQUFNLEtBQ2QsRUFBRSxXQUFXLE1BQU0sS0FDM0IsT0FDQSxFQUFFLE1BQU0sSUFBSSxLQUFLLEVBQUUsTUFBTSxJQUFJLEtBQzNCLFNBQ0EsRUFBRSxNQUFNLElBQUksS0FBSyxFQUFFLE1BQU0sSUFBSSxLQUMzQixTQUNBLEVBQUUsV0FBVyxJQUFJLEtBQUssRUFBRSxXQUFXLElBQUksTUFDckMsY0FDQTtBQUVwQixjQUNJLGdCQUFnQixDQUFDLEVBQUUsdUJBQ2xCLFdBQVcsUUFBUSxXQUFXLE9BQ2pDO0FBQ0UsdUJBQVc7QUFBQSxVQUNmO0FBQ0EsY0FBSSxnQkFBZ0IsQ0FBQyxFQUFFLGtCQUFrQixhQUFhLElBQUk7QUFDdEQsdUJBQVc7QUFBQSxVQUNmO0FBQ0EsY0FBSSxnQkFBZ0IsQ0FBQyxFQUFFLG9CQUFvQixhQUFhLElBQUk7QUFDeEQsdUJBQVc7QUFBQSxVQUNmO0FBRUEsMEJBQWdCLENBQUMsRUFBRSxXQUFXO0FBQUEsUUFDbEM7QUFFQSxlQUFPO0FBQUEsTUFDWDtBQUlBLFVBQUksbUJBQ0ksa0pBQ0osZ0JBQ0ksOElBQ0osVUFBVSx5QkFDVixXQUFXO0FBQUEsUUFDUCxDQUFDLGdCQUFnQixxQkFBcUI7QUFBQSxRQUN0QyxDQUFDLGNBQWMsaUJBQWlCO0FBQUEsUUFDaEMsQ0FBQyxnQkFBZ0IsZ0JBQWdCO0FBQUEsUUFDakMsQ0FBQyxjQUFjLGVBQWUsS0FBSztBQUFBLFFBQ25DLENBQUMsWUFBWSxhQUFhO0FBQUEsUUFDMUIsQ0FBQyxXQUFXLGNBQWMsS0FBSztBQUFBLFFBQy9CLENBQUMsY0FBYyxZQUFZO0FBQUEsUUFDM0IsQ0FBQyxZQUFZLE9BQU87QUFBQSxRQUNwQixDQUFDLGNBQWMsYUFBYTtBQUFBLFFBQzVCLENBQUMsYUFBYSxlQUFlLEtBQUs7QUFBQSxRQUNsQyxDQUFDLFdBQVcsT0FBTztBQUFBLFFBQ25CLENBQUMsVUFBVSxTQUFTLEtBQUs7QUFBQSxRQUN6QixDQUFDLFFBQVEsU0FBUyxLQUFLO0FBQUEsTUFDM0IsR0FFQSxXQUFXO0FBQUEsUUFDUCxDQUFDLGlCQUFpQixxQkFBcUI7QUFBQSxRQUN2QyxDQUFDLGlCQUFpQixvQkFBb0I7QUFBQSxRQUN0QyxDQUFDLFlBQVksZ0JBQWdCO0FBQUEsUUFDN0IsQ0FBQyxTQUFTLFdBQVc7QUFBQSxRQUNyQixDQUFDLGVBQWUsbUJBQW1CO0FBQUEsUUFDbkMsQ0FBQyxlQUFlLGtCQUFrQjtBQUFBLFFBQ2xDLENBQUMsVUFBVSxjQUFjO0FBQUEsUUFDekIsQ0FBQyxRQUFRLFVBQVU7QUFBQSxRQUNuQixDQUFDLE1BQU0sTUFBTTtBQUFBLE1BQ2pCLEdBQ0Esa0JBQWtCLHNCQUVsQixVQUNJLDJMQUNKLGFBQWE7QUFBQSxRQUNULElBQUk7QUFBQSxRQUNKLEtBQUs7QUFBQSxRQUNMLEtBQUssS0FBSztBQUFBLFFBQ1YsS0FBSyxLQUFLO0FBQUEsUUFDVixLQUFLLEtBQUs7QUFBQSxRQUNWLEtBQUssS0FBSztBQUFBLFFBQ1YsS0FBSyxLQUFLO0FBQUEsUUFDVixLQUFLLEtBQUs7QUFBQSxRQUNWLEtBQUssS0FBSztBQUFBLFFBQ1YsS0FBSyxLQUFLO0FBQUEsTUFDZDtBQUdKLGVBQVMsY0FBYyxRQUFRO0FBQzNCLFlBQUksR0FDQSxHQUNBLFNBQVMsT0FBTyxJQUNoQixRQUFRLGlCQUFpQixLQUFLLE1BQU0sS0FBSyxjQUFjLEtBQUssTUFBTSxHQUNsRSxXQUNBLFlBQ0EsWUFDQSxVQUNBLGNBQWMsU0FBUyxRQUN2QixjQUFjLFNBQVM7QUFFM0IsWUFBSSxPQUFPO0FBQ1AsMEJBQWdCLE1BQU0sRUFBRSxNQUFNO0FBQzlCLGVBQUssSUFBSSxHQUFHLElBQUksYUFBYSxJQUFJLEdBQUcsS0FBSztBQUNyQyxnQkFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxHQUFHO0FBQy9CLDJCQUFhLFNBQVMsQ0FBQyxFQUFFLENBQUM7QUFDMUIsMEJBQVksU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNO0FBQy9CO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFDQSxjQUFJLGNBQWMsTUFBTTtBQUNwQixtQkFBTyxXQUFXO0FBQ2xCO0FBQUEsVUFDSjtBQUNBLGNBQUksTUFBTSxDQUFDLEdBQUc7QUFDVixpQkFBSyxJQUFJLEdBQUcsSUFBSSxhQUFhLElBQUksR0FBRyxLQUFLO0FBQ3JDLGtCQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEdBQUc7QUFFL0IsOEJBQWMsTUFBTSxDQUFDLEtBQUssT0FBTyxTQUFTLENBQUMsRUFBRSxDQUFDO0FBQzlDO0FBQUEsY0FDSjtBQUFBLFlBQ0o7QUFDQSxnQkFBSSxjQUFjLE1BQU07QUFDcEIscUJBQU8sV0FBVztBQUNsQjtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQ0EsY0FBSSxDQUFDLGFBQWEsY0FBYyxNQUFNO0FBQ2xDLG1CQUFPLFdBQVc7QUFDbEI7QUFBQSxVQUNKO0FBQ0EsY0FBSSxNQUFNLENBQUMsR0FBRztBQUNWLGdCQUFJLFFBQVEsS0FBSyxNQUFNLENBQUMsQ0FBQyxHQUFHO0FBQ3hCLHlCQUFXO0FBQUEsWUFDZixPQUFPO0FBQ0gscUJBQU8sV0FBVztBQUNsQjtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQ0EsaUJBQU8sS0FBSyxjQUFjLGNBQWMsT0FBTyxZQUFZO0FBQzNELG9DQUEwQixNQUFNO0FBQUEsUUFDcEMsT0FBTztBQUNILGlCQUFPLFdBQVc7QUFBQSxRQUN0QjtBQUFBLE1BQ0o7QUFFQSxlQUFTLDBCQUNMLFNBQ0EsVUFDQSxRQUNBLFNBQ0EsV0FDQSxXQUNGO0FBQ0UsWUFBSSxTQUFTO0FBQUEsVUFDVCxlQUFlLE9BQU87QUFBQSxVQUN0Qix5QkFBeUIsUUFBUSxRQUFRO0FBQUEsVUFDekMsU0FBUyxRQUFRLEVBQUU7QUFBQSxVQUNuQixTQUFTLFNBQVMsRUFBRTtBQUFBLFVBQ3BCLFNBQVMsV0FBVyxFQUFFO0FBQUEsUUFDMUI7QUFFQSxZQUFJLFdBQVc7QUFDWCxpQkFBTyxLQUFLLFNBQVMsV0FBVyxFQUFFLENBQUM7QUFBQSxRQUN2QztBQUVBLGVBQU87QUFBQSxNQUNYO0FBRUEsZUFBUyxlQUFlLFNBQVM7QUFDN0IsWUFBSSxPQUFPLFNBQVMsU0FBUyxFQUFFO0FBQy9CLFlBQUksUUFBUSxJQUFJO0FBQ1osaUJBQU8sTUFBTztBQUFBLFFBQ2xCLFdBQVcsUUFBUSxLQUFLO0FBQ3BCLGlCQUFPLE9BQU87QUFBQSxRQUNsQjtBQUNBLGVBQU87QUFBQSxNQUNYO0FBRUEsZUFBUyxrQkFBa0IsR0FBRztBQUUxQixlQUFPLEVBQ0YsUUFBUSxzQkFBc0IsR0FBRyxFQUNqQyxRQUFRLFlBQVksR0FBRyxFQUN2QixRQUFRLFVBQVUsRUFBRSxFQUNwQixRQUFRLFVBQVUsRUFBRTtBQUFBLE1BQzdCO0FBRUEsZUFBUyxhQUFhLFlBQVksYUFBYSxRQUFRO0FBQ25ELFlBQUksWUFBWTtBQUVaLGNBQUksa0JBQWtCLDJCQUEyQixRQUFRLFVBQVUsR0FDL0QsZ0JBQWdCLElBQUk7QUFBQSxZQUNoQixZQUFZLENBQUM7QUFBQSxZQUNiLFlBQVksQ0FBQztBQUFBLFlBQ2IsWUFBWSxDQUFDO0FBQUEsVUFDakIsRUFBRSxPQUFPO0FBQ2IsY0FBSSxvQkFBb0IsZUFBZTtBQUNuQyw0QkFBZ0IsTUFBTSxFQUFFLGtCQUFrQjtBQUMxQyxtQkFBTyxXQUFXO0FBQ2xCLG1CQUFPO0FBQUEsVUFDWDtBQUFBLFFBQ0o7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUVBLGVBQVMsZ0JBQWdCLFdBQVcsZ0JBQWdCLFdBQVc7QUFDM0QsWUFBSSxXQUFXO0FBQ1gsaUJBQU8sV0FBVyxTQUFTO0FBQUEsUUFDL0IsV0FBVyxnQkFBZ0I7QUFFdkIsaUJBQU87QUFBQSxRQUNYLE9BQU87QUFDSCxjQUFJLEtBQUssU0FBUyxXQUFXLEVBQUUsR0FDM0IsSUFBSSxLQUFLLEtBQ1RhLE1BQUssS0FBSyxLQUFLO0FBQ25CLGlCQUFPQSxLQUFJLEtBQUs7QUFBQSxRQUNwQjtBQUFBLE1BQ0o7QUFHQSxlQUFTLGtCQUFrQixRQUFRO0FBQy9CLFlBQUksUUFBUSxRQUFRLEtBQUssa0JBQWtCLE9BQU8sRUFBRSxDQUFDLEdBQ2pEO0FBQ0osWUFBSSxPQUFPO0FBQ1Asd0JBQWM7QUFBQSxZQUNWLE1BQU0sQ0FBQztBQUFBLFlBQ1AsTUFBTSxDQUFDO0FBQUEsWUFDUCxNQUFNLENBQUM7QUFBQSxZQUNQLE1BQU0sQ0FBQztBQUFBLFlBQ1AsTUFBTSxDQUFDO0FBQUEsWUFDUCxNQUFNLENBQUM7QUFBQSxVQUNYO0FBQ0EsY0FBSSxDQUFDLGFBQWEsTUFBTSxDQUFDLEdBQUcsYUFBYSxNQUFNLEdBQUc7QUFDOUM7QUFBQSxVQUNKO0FBRUEsaUJBQU8sS0FBSztBQUNaLGlCQUFPLE9BQU8sZ0JBQWdCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBRTNELGlCQUFPLEtBQUssY0FBYyxNQUFNLE1BQU0sT0FBTyxFQUFFO0FBQy9DLGlCQUFPLEdBQUcsY0FBYyxPQUFPLEdBQUcsY0FBYyxJQUFJLE9BQU8sSUFBSTtBQUUvRCwwQkFBZ0IsTUFBTSxFQUFFLFVBQVU7QUFBQSxRQUN0QyxPQUFPO0FBQ0gsaUJBQU8sV0FBVztBQUFBLFFBQ3RCO0FBQUEsTUFDSjtBQUdBLGVBQVMsaUJBQWlCLFFBQVE7QUFDOUIsWUFBSSxVQUFVLGdCQUFnQixLQUFLLE9BQU8sRUFBRTtBQUM1QyxZQUFJLFlBQVksTUFBTTtBQUNsQixpQkFBTyxLQUFLLG9CQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNoQztBQUFBLFFBQ0o7QUFFQSxzQkFBYyxNQUFNO0FBQ3BCLFlBQUksT0FBTyxhQUFhLE9BQU87QUFDM0IsaUJBQU8sT0FBTztBQUFBLFFBQ2xCLE9BQU87QUFDSDtBQUFBLFFBQ0o7QUFFQSwwQkFBa0IsTUFBTTtBQUN4QixZQUFJLE9BQU8sYUFBYSxPQUFPO0FBQzNCLGlCQUFPLE9BQU87QUFBQSxRQUNsQixPQUFPO0FBQ0g7QUFBQSxRQUNKO0FBRUEsWUFBSSxPQUFPLFNBQVM7QUFDaEIsaUJBQU8sV0FBVztBQUFBLFFBQ3RCLE9BQU87QUFFSCxnQkFBTSx3QkFBd0IsTUFBTTtBQUFBLFFBQ3hDO0FBQUEsTUFDSjtBQUVBLFlBQU0sMEJBQTBCO0FBQUEsUUFDNUI7QUFBQSxRQUdBLFNBQVUsUUFBUTtBQUNkLGlCQUFPLEtBQUssb0JBQUksS0FBSyxPQUFPLE1BQU0sT0FBTyxVQUFVLFNBQVMsR0FBRztBQUFBLFFBQ25FO0FBQUEsTUFDSjtBQUdBLGVBQVNJLFVBQVMsR0FBRyxHQUFHLEdBQUc7QUFDdkIsWUFBSSxLQUFLLE1BQU07QUFDWCxpQkFBTztBQUFBLFFBQ1g7QUFDQSxZQUFJLEtBQUssTUFBTTtBQUNYLGlCQUFPO0FBQUEsUUFDWDtBQUNBLGVBQU87QUFBQSxNQUNYO0FBRUEsZUFBUyxpQkFBaUIsUUFBUTtBQUU5QixZQUFJLFdBQVcsSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDO0FBQ25DLFlBQUksT0FBTyxTQUFTO0FBQ2hCLGlCQUFPO0FBQUEsWUFDSCxTQUFTLGVBQWU7QUFBQSxZQUN4QixTQUFTLFlBQVk7QUFBQSxZQUNyQixTQUFTLFdBQVc7QUFBQSxVQUN4QjtBQUFBLFFBQ0o7QUFDQSxlQUFPLENBQUMsU0FBUyxZQUFZLEdBQUcsU0FBUyxTQUFTLEdBQUcsU0FBUyxRQUFRLENBQUM7QUFBQSxNQUMzRTtBQU1BLGVBQVMsZ0JBQWdCLFFBQVE7QUFDN0IsWUFBSSxHQUNBLE1BQ0EsUUFBUSxDQUFDLEdBQ1QsYUFDQSxpQkFDQTtBQUVKLFlBQUksT0FBTyxJQUFJO0FBQ1g7QUFBQSxRQUNKO0FBRUEsc0JBQWMsaUJBQWlCLE1BQU07QUFHckMsWUFBSSxPQUFPLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxRQUFRLE9BQU8sR0FBRyxLQUFLLEtBQUssTUFBTTtBQUNsRSxnQ0FBc0IsTUFBTTtBQUFBLFFBQ2hDO0FBR0EsWUFBSSxPQUFPLGNBQWMsTUFBTTtBQUMzQixzQkFBWUEsVUFBUyxPQUFPLEdBQUcsSUFBSSxHQUFHLFlBQVksSUFBSSxDQUFDO0FBRXZELGNBQ0ksT0FBTyxhQUFhLFdBQVcsU0FBUyxLQUN4QyxPQUFPLGVBQWUsR0FDeEI7QUFDRSw0QkFBZ0IsTUFBTSxFQUFFLHFCQUFxQjtBQUFBLFVBQ2pEO0FBRUEsaUJBQU8sY0FBYyxXQUFXLEdBQUcsT0FBTyxVQUFVO0FBQ3BELGlCQUFPLEdBQUcsS0FBSyxJQUFJLEtBQUssWUFBWTtBQUNwQyxpQkFBTyxHQUFHLElBQUksSUFBSSxLQUFLLFdBQVc7QUFBQSxRQUN0QztBQU9BLGFBQUssSUFBSSxHQUFHLElBQUksS0FBSyxPQUFPLEdBQUcsQ0FBQyxLQUFLLE1BQU0sRUFBRSxHQUFHO0FBQzVDLGlCQUFPLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLFlBQVksQ0FBQztBQUFBLFFBQzNDO0FBR0EsZUFBTyxJQUFJLEdBQUcsS0FBSztBQUNmLGlCQUFPLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUNsQixPQUFPLEdBQUcsQ0FBQyxLQUFLLE9BQVEsTUFBTSxJQUFJLElBQUksSUFBSyxPQUFPLEdBQUcsQ0FBQztBQUFBLFFBQzlEO0FBR0EsWUFDSSxPQUFPLEdBQUcsSUFBSSxNQUFNLE1BQ3BCLE9BQU8sR0FBRyxNQUFNLE1BQU0sS0FDdEIsT0FBTyxHQUFHLE1BQU0sTUFBTSxLQUN0QixPQUFPLEdBQUcsV0FBVyxNQUFNLEdBQzdCO0FBQ0UsaUJBQU8sV0FBVztBQUNsQixpQkFBTyxHQUFHLElBQUksSUFBSTtBQUFBLFFBQ3RCO0FBRUEsZUFBTyxNQUFNLE9BQU8sVUFBVSxnQkFBZ0IsWUFBWTtBQUFBLFVBQ3REO0FBQUEsVUFDQTtBQUFBLFFBQ0o7QUFDQSwwQkFBa0IsT0FBTyxVQUNuQixPQUFPLEdBQUcsVUFBVSxJQUNwQixPQUFPLEdBQUcsT0FBTztBQUl2QixZQUFJLE9BQU8sUUFBUSxNQUFNO0FBQ3JCLGlCQUFPLEdBQUcsY0FBYyxPQUFPLEdBQUcsY0FBYyxJQUFJLE9BQU8sSUFBSTtBQUFBLFFBQ25FO0FBRUEsWUFBSSxPQUFPLFVBQVU7QUFDakIsaUJBQU8sR0FBRyxJQUFJLElBQUk7QUFBQSxRQUN0QjtBQUdBLFlBQ0ksT0FBTyxNQUNQLE9BQU8sT0FBTyxHQUFHLE1BQU0sZUFDdkIsT0FBTyxHQUFHLE1BQU0saUJBQ2xCO0FBQ0UsMEJBQWdCLE1BQU0sRUFBRSxrQkFBa0I7QUFBQSxRQUM5QztBQUFBLE1BQ0o7QUFFQSxlQUFTLHNCQUFzQixRQUFRO0FBQ25DLFlBQUksR0FBRyxVQUFVLE1BQU0sU0FBUyxLQUFLLEtBQUssTUFBTSxpQkFBaUI7QUFFakUsWUFBSSxPQUFPO0FBQ1gsWUFBSSxFQUFFLE1BQU0sUUFBUSxFQUFFLEtBQUssUUFBUSxFQUFFLEtBQUssTUFBTTtBQUM1QyxnQkFBTTtBQUNOLGdCQUFNO0FBTU4scUJBQVdBO0FBQUEsWUFDUCxFQUFFO0FBQUEsWUFDRixPQUFPLEdBQUcsSUFBSTtBQUFBLFlBQ2QsV0FBVyxZQUFZLEdBQUcsR0FBRyxDQUFDLEVBQUU7QUFBQSxVQUNwQztBQUNBLGlCQUFPQSxVQUFTLEVBQUUsR0FBRyxDQUFDO0FBQ3RCLG9CQUFVQSxVQUFTLEVBQUUsR0FBRyxDQUFDO0FBQ3pCLGNBQUksVUFBVSxLQUFLLFVBQVUsR0FBRztBQUM1Qiw4QkFBa0I7QUFBQSxVQUN0QjtBQUFBLFFBQ0osT0FBTztBQUNILGdCQUFNLE9BQU8sUUFBUSxNQUFNO0FBQzNCLGdCQUFNLE9BQU8sUUFBUSxNQUFNO0FBRTNCLG9CQUFVLFdBQVcsWUFBWSxHQUFHLEtBQUssR0FBRztBQUU1QyxxQkFBV0EsVUFBUyxFQUFFLElBQUksT0FBTyxHQUFHLElBQUksR0FBRyxRQUFRLElBQUk7QUFHdkQsaUJBQU9BLFVBQVMsRUFBRSxHQUFHLFFBQVEsSUFBSTtBQUVqQyxjQUFJLEVBQUUsS0FBSyxNQUFNO0FBRWIsc0JBQVUsRUFBRTtBQUNaLGdCQUFJLFVBQVUsS0FBSyxVQUFVLEdBQUc7QUFDNUIsZ0NBQWtCO0FBQUEsWUFDdEI7QUFBQSxVQUNKLFdBQVcsRUFBRSxLQUFLLE1BQU07QUFFcEIsc0JBQVUsRUFBRSxJQUFJO0FBQ2hCLGdCQUFJLEVBQUUsSUFBSSxLQUFLLEVBQUUsSUFBSSxHQUFHO0FBQ3BCLGdDQUFrQjtBQUFBLFlBQ3RCO0FBQUEsVUFDSixPQUFPO0FBRUgsc0JBQVU7QUFBQSxVQUNkO0FBQUEsUUFDSjtBQUNBLFlBQUksT0FBTyxLQUFLLE9BQU8sWUFBWSxVQUFVLEtBQUssR0FBRyxHQUFHO0FBQ3BELDBCQUFnQixNQUFNLEVBQUUsaUJBQWlCO0FBQUEsUUFDN0MsV0FBVyxtQkFBbUIsTUFBTTtBQUNoQywwQkFBZ0IsTUFBTSxFQUFFLG1CQUFtQjtBQUFBLFFBQy9DLE9BQU87QUFDSCxpQkFBTyxtQkFBbUIsVUFBVSxNQUFNLFNBQVMsS0FBSyxHQUFHO0FBQzNELGlCQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUs7QUFDdkIsaUJBQU8sYUFBYSxLQUFLO0FBQUEsUUFDN0I7QUFBQSxNQUNKO0FBR0EsWUFBTSxXQUFXLFdBQVk7QUFBQSxNQUFDO0FBRzlCLFlBQU0sV0FBVyxXQUFZO0FBQUEsTUFBQztBQUc5QixlQUFTLDBCQUEwQixRQUFRO0FBRXZDLFlBQUksT0FBTyxPQUFPLE1BQU0sVUFBVTtBQUM5Qix3QkFBYyxNQUFNO0FBQ3BCO0FBQUEsUUFDSjtBQUNBLFlBQUksT0FBTyxPQUFPLE1BQU0sVUFBVTtBQUM5Qiw0QkFBa0IsTUFBTTtBQUN4QjtBQUFBLFFBQ0o7QUFDQSxlQUFPLEtBQUssQ0FBQztBQUNiLHdCQUFnQixNQUFNLEVBQUUsUUFBUTtBQUdoQyxZQUFJLFNBQVMsS0FBSyxPQUFPLElBQ3JCLEdBQ0EsYUFDQUMsU0FDQVYsUUFDQSxTQUNBLGVBQWUsT0FBTyxRQUN0Qix5QkFBeUIsR0FDekIsS0FDQTtBQUVKLFFBQUFVLFVBQ0ksYUFBYSxPQUFPLElBQUksT0FBTyxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsS0FBSyxDQUFDO0FBQ3hFLG1CQUFXQSxRQUFPO0FBQ2xCLGFBQUssSUFBSSxHQUFHLElBQUksVUFBVSxLQUFLO0FBQzNCLFVBQUFWLFNBQVFVLFFBQU8sQ0FBQztBQUNoQix5QkFBZSxPQUFPLE1BQU0sc0JBQXNCVixRQUFPLE1BQU0sQ0FBQyxLQUM1RCxDQUFDLEdBQUcsQ0FBQztBQUNULGNBQUksYUFBYTtBQUNiLHNCQUFVLE9BQU8sT0FBTyxHQUFHLE9BQU8sUUFBUSxXQUFXLENBQUM7QUFDdEQsZ0JBQUksUUFBUSxTQUFTLEdBQUc7QUFDcEIsOEJBQWdCLE1BQU0sRUFBRSxZQUFZLEtBQUssT0FBTztBQUFBLFlBQ3BEO0FBQ0EscUJBQVMsT0FBTztBQUFBLGNBQ1osT0FBTyxRQUFRLFdBQVcsSUFBSSxZQUFZO0FBQUEsWUFDOUM7QUFDQSxzQ0FBMEIsWUFBWTtBQUFBLFVBQzFDO0FBRUEsY0FBSSxxQkFBcUJBLE1BQUssR0FBRztBQUM3QixnQkFBSSxhQUFhO0FBQ2IsOEJBQWdCLE1BQU0sRUFBRSxRQUFRO0FBQUEsWUFDcEMsT0FBTztBQUNILDhCQUFnQixNQUFNLEVBQUUsYUFBYSxLQUFLQSxNQUFLO0FBQUEsWUFDbkQ7QUFDQSxvQ0FBd0JBLFFBQU8sYUFBYSxNQUFNO0FBQUEsVUFDdEQsV0FBVyxPQUFPLFdBQVcsQ0FBQyxhQUFhO0FBQ3ZDLDRCQUFnQixNQUFNLEVBQUUsYUFBYSxLQUFLQSxNQUFLO0FBQUEsVUFDbkQ7QUFBQSxRQUNKO0FBR0Esd0JBQWdCLE1BQU0sRUFBRSxnQkFDcEIsZUFBZTtBQUNuQixZQUFJLE9BQU8sU0FBUyxHQUFHO0FBQ25CLDBCQUFnQixNQUFNLEVBQUUsWUFBWSxLQUFLLE1BQU07QUFBQSxRQUNuRDtBQUdBLFlBQ0ksT0FBTyxHQUFHLElBQUksS0FBSyxNQUNuQixnQkFBZ0IsTUFBTSxFQUFFLFlBQVksUUFDcEMsT0FBTyxHQUFHLElBQUksSUFBSSxHQUNwQjtBQUNFLDBCQUFnQixNQUFNLEVBQUUsVUFBVTtBQUFBLFFBQ3RDO0FBRUEsd0JBQWdCLE1BQU0sRUFBRSxrQkFBa0IsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUMzRCx3QkFBZ0IsTUFBTSxFQUFFLFdBQVcsT0FBTztBQUUxQyxlQUFPLEdBQUcsSUFBSSxJQUFJO0FBQUEsVUFDZCxPQUFPO0FBQUEsVUFDUCxPQUFPLEdBQUcsSUFBSTtBQUFBLFVBQ2QsT0FBTztBQUFBLFFBQ1g7QUFHQSxjQUFNLGdCQUFnQixNQUFNLEVBQUU7QUFDOUIsWUFBSSxRQUFRLE1BQU07QUFDZCxpQkFBTyxHQUFHLElBQUksSUFBSSxPQUFPLFFBQVEsZ0JBQWdCLEtBQUssT0FBTyxHQUFHLElBQUksQ0FBQztBQUFBLFFBQ3pFO0FBRUEsd0JBQWdCLE1BQU07QUFDdEIsc0JBQWMsTUFBTTtBQUFBLE1BQ3hCO0FBRUEsZUFBUyxnQkFBZ0JSLFNBQVEsTUFBTW1CLFdBQVU7QUFDN0MsWUFBSTtBQUVKLFlBQUlBLGFBQVksTUFBTTtBQUVsQixpQkFBTztBQUFBLFFBQ1g7QUFDQSxZQUFJbkIsUUFBTyxnQkFBZ0IsTUFBTTtBQUM3QixpQkFBT0EsUUFBTyxhQUFhLE1BQU1tQixTQUFRO0FBQUEsUUFDN0MsV0FBV25CLFFBQU8sUUFBUSxNQUFNO0FBRTVCLGlCQUFPQSxRQUFPLEtBQUttQixTQUFRO0FBQzNCLGNBQUksUUFBUSxPQUFPLElBQUk7QUFDbkIsb0JBQVE7QUFBQSxVQUNaO0FBQ0EsY0FBSSxDQUFDLFFBQVEsU0FBUyxJQUFJO0FBQ3RCLG1CQUFPO0FBQUEsVUFDWDtBQUNBLGlCQUFPO0FBQUEsUUFDWCxPQUFPO0FBRUgsaUJBQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUdBLGVBQVMseUJBQXlCLFFBQVE7QUFDdEMsWUFBSSxZQUNBLFlBQ0EsYUFDQSxHQUNBLGNBQ0Esa0JBQ0Esb0JBQW9CLE9BQ3BCLGFBQWEsT0FBTyxHQUFHO0FBRTNCLFlBQUksZUFBZSxHQUFHO0FBQ2xCLDBCQUFnQixNQUFNLEVBQUUsZ0JBQWdCO0FBQ3hDLGlCQUFPLEtBQUssb0JBQUksS0FBSyxHQUFHO0FBQ3hCO0FBQUEsUUFDSjtBQUVBLGFBQUssSUFBSSxHQUFHLElBQUksWUFBWSxLQUFLO0FBQzdCLHlCQUFlO0FBQ2YsNkJBQW1CO0FBQ25CLHVCQUFhLFdBQVcsQ0FBQyxHQUFHLE1BQU07QUFDbEMsY0FBSSxPQUFPLFdBQVcsTUFBTTtBQUN4Qix1QkFBVyxVQUFVLE9BQU87QUFBQSxVQUNoQztBQUNBLHFCQUFXLEtBQUssT0FBTyxHQUFHLENBQUM7QUFDM0Isb0NBQTBCLFVBQVU7QUFFcEMsY0FBSSxRQUFRLFVBQVUsR0FBRztBQUNyQiwrQkFBbUI7QUFBQSxVQUN2QjtBQUdBLDBCQUFnQixnQkFBZ0IsVUFBVSxFQUFFO0FBRzVDLDBCQUFnQixnQkFBZ0IsVUFBVSxFQUFFLGFBQWEsU0FBUztBQUVsRSwwQkFBZ0IsVUFBVSxFQUFFLFFBQVE7QUFFcEMsY0FBSSxDQUFDLG1CQUFtQjtBQUNwQixnQkFDSSxlQUFlLFFBQ2YsZUFBZSxlQUNmLGtCQUNGO0FBQ0UsNEJBQWM7QUFDZCwyQkFBYTtBQUNiLGtCQUFJLGtCQUFrQjtBQUNsQixvQ0FBb0I7QUFBQSxjQUN4QjtBQUFBLFlBQ0o7QUFBQSxVQUNKLE9BQU87QUFDSCxnQkFBSSxlQUFlLGFBQWE7QUFDNUIsNEJBQWM7QUFDZCwyQkFBYTtBQUFBLFlBQ2pCO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFFQSxlQUFPLFFBQVEsY0FBYyxVQUFVO0FBQUEsTUFDM0M7QUFFQSxlQUFTLGlCQUFpQixRQUFRO0FBQzlCLFlBQUksT0FBTyxJQUFJO0FBQ1g7QUFBQSxRQUNKO0FBRUEsWUFBSSxJQUFJLHFCQUFxQixPQUFPLEVBQUUsR0FDbEMsWUFBWSxFQUFFLFFBQVEsU0FBWSxFQUFFLE9BQU8sRUFBRTtBQUNqRCxlQUFPLEtBQUtyQjtBQUFBLFVBQ1IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXO0FBQUEsVUFDdEUsU0FBVSxLQUFLO0FBQ1gsbUJBQU8sT0FBTyxTQUFTLEtBQUssRUFBRTtBQUFBLFVBQ2xDO0FBQUEsUUFDSjtBQUVBLHdCQUFnQixNQUFNO0FBQUEsTUFDMUI7QUFFQSxlQUFTLGlCQUFpQixRQUFRO0FBQzlCLFlBQUksTUFBTSxJQUFJLE9BQU8sY0FBYyxjQUFjLE1BQU0sQ0FBQyxDQUFDO0FBQ3pELFlBQUksSUFBSSxVQUFVO0FBRWQsY0FBSSxJQUFJLEdBQUcsR0FBRztBQUNkLGNBQUksV0FBVztBQUFBLFFBQ25CO0FBRUEsZUFBTztBQUFBLE1BQ1g7QUFFQSxlQUFTLGNBQWMsUUFBUTtBQUMzQixZQUFJLFFBQVEsT0FBTyxJQUNmQyxVQUFTLE9BQU87QUFFcEIsZUFBTyxVQUFVLE9BQU8sV0FBVyxVQUFVLE9BQU8sRUFBRTtBQUV0RCxZQUFJLFVBQVUsUUFBU0EsWUFBVyxVQUFhLFVBQVUsSUFBSztBQUMxRCxpQkFBTyxjQUFjLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFBQSxRQUM1QztBQUVBLFlBQUksT0FBTyxVQUFVLFVBQVU7QUFDM0IsaUJBQU8sS0FBSyxRQUFRLE9BQU8sUUFBUSxTQUFTLEtBQUs7QUFBQSxRQUNyRDtBQUVBLFlBQUksU0FBUyxLQUFLLEdBQUc7QUFDakIsaUJBQU8sSUFBSSxPQUFPLGNBQWMsS0FBSyxDQUFDO0FBQUEsUUFDMUMsV0FBVyxPQUFPLEtBQUssR0FBRztBQUN0QixpQkFBTyxLQUFLO0FBQUEsUUFDaEIsV0FBV0osU0FBUUksT0FBTSxHQUFHO0FBQ3hCLG1DQUF5QixNQUFNO0FBQUEsUUFDbkMsV0FBV0EsU0FBUTtBQUNmLG9DQUEwQixNQUFNO0FBQUEsUUFDcEMsT0FBTztBQUNILDBCQUFnQixNQUFNO0FBQUEsUUFDMUI7QUFFQSxZQUFJLENBQUMsUUFBUSxNQUFNLEdBQUc7QUFDbEIsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBRUEsZUFBTztBQUFBLE1BQ1g7QUFFQSxlQUFTLGdCQUFnQixRQUFRO0FBQzdCLFlBQUksUUFBUSxPQUFPO0FBQ25CLFlBQUksWUFBWSxLQUFLLEdBQUc7QUFDcEIsaUJBQU8sS0FBSyxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUM7QUFBQSxRQUNwQyxXQUFXLE9BQU8sS0FBSyxHQUFHO0FBQ3RCLGlCQUFPLEtBQUssSUFBSSxLQUFLLE1BQU0sUUFBUSxDQUFDO0FBQUEsUUFDeEMsV0FBVyxPQUFPLFVBQVUsVUFBVTtBQUNsQywyQkFBaUIsTUFBTTtBQUFBLFFBQzNCLFdBQVdKLFNBQVEsS0FBSyxHQUFHO0FBQ3ZCLGlCQUFPLEtBQUtHLEtBQUksTUFBTSxNQUFNLENBQUMsR0FBRyxTQUFVLEtBQUs7QUFDM0MsbUJBQU8sU0FBUyxLQUFLLEVBQUU7QUFBQSxVQUMzQixDQUFDO0FBQ0QsMEJBQWdCLE1BQU07QUFBQSxRQUMxQixXQUFXRixVQUFTLEtBQUssR0FBRztBQUN4QiwyQkFBaUIsTUFBTTtBQUFBLFFBQzNCLFdBQVdDLFVBQVMsS0FBSyxHQUFHO0FBRXhCLGlCQUFPLEtBQUssSUFBSSxLQUFLLEtBQUs7QUFBQSxRQUM5QixPQUFPO0FBQ0gsZ0JBQU0sd0JBQXdCLE1BQU07QUFBQSxRQUN4QztBQUFBLE1BQ0o7QUFFQSxlQUFTLGlCQUFpQixPQUFPRSxTQUFRQyxTQUFRLFFBQVEsT0FBTztBQUM1RCxZQUFJLElBQUksQ0FBQztBQUVULFlBQUlELFlBQVcsUUFBUUEsWUFBVyxPQUFPO0FBQ3JDLG1CQUFTQTtBQUNULFVBQUFBLFVBQVM7QUFBQSxRQUNiO0FBRUEsWUFBSUMsWUFBVyxRQUFRQSxZQUFXLE9BQU87QUFDckMsbUJBQVNBO0FBQ1QsVUFBQUEsVUFBUztBQUFBLFFBQ2I7QUFFQSxZQUNLSixVQUFTLEtBQUssS0FBSyxjQUFjLEtBQUssS0FDdENELFNBQVEsS0FBSyxLQUFLLE1BQU0sV0FBVyxHQUN0QztBQUNFLGtCQUFRO0FBQUEsUUFDWjtBQUdBLFVBQUUsbUJBQW1CO0FBQ3JCLFVBQUUsVUFBVSxFQUFFLFNBQVM7QUFDdkIsVUFBRSxLQUFLSztBQUNQLFVBQUUsS0FBSztBQUNQLFVBQUUsS0FBS0Q7QUFDUCxVQUFFLFVBQVU7QUFFWixlQUFPLGlCQUFpQixDQUFDO0FBQUEsTUFDN0I7QUFFQSxlQUFTLFlBQVksT0FBT0EsU0FBUUMsU0FBUSxRQUFRO0FBQ2hELGVBQU8saUJBQWlCLE9BQU9ELFNBQVFDLFNBQVEsUUFBUSxLQUFLO0FBQUEsTUFDaEU7QUFFQSxVQUFJLGVBQWU7QUFBQSxRQUNYO0FBQUEsUUFDQSxXQUFZO0FBQ1IsY0FBSSxRQUFRLFlBQVksTUFBTSxNQUFNLFNBQVM7QUFDN0MsY0FBSSxLQUFLLFFBQVEsS0FBSyxNQUFNLFFBQVEsR0FBRztBQUNuQyxtQkFBTyxRQUFRLE9BQU8sT0FBTztBQUFBLFVBQ2pDLE9BQU87QUFDSCxtQkFBTyxjQUFjO0FBQUEsVUFDekI7QUFBQSxRQUNKO0FBQUEsTUFDSixHQUNBLGVBQWU7QUFBQSxRQUNYO0FBQUEsUUFDQSxXQUFZO0FBQ1IsY0FBSSxRQUFRLFlBQVksTUFBTSxNQUFNLFNBQVM7QUFDN0MsY0FBSSxLQUFLLFFBQVEsS0FBSyxNQUFNLFFBQVEsR0FBRztBQUNuQyxtQkFBTyxRQUFRLE9BQU8sT0FBTztBQUFBLFVBQ2pDLE9BQU87QUFDSCxtQkFBTyxjQUFjO0FBQUEsVUFDekI7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQU9KLGVBQVMsT0FBTyxJQUFJLFNBQVM7QUFDekIsWUFBSSxLQUFLO0FBQ1QsWUFBSSxRQUFRLFdBQVcsS0FBS0wsU0FBUSxRQUFRLENBQUMsQ0FBQyxHQUFHO0FBQzdDLG9CQUFVLFFBQVEsQ0FBQztBQUFBLFFBQ3ZCO0FBQ0EsWUFBSSxDQUFDLFFBQVEsUUFBUTtBQUNqQixpQkFBTyxZQUFZO0FBQUEsUUFDdkI7QUFDQSxjQUFNLFFBQVEsQ0FBQztBQUNmLGFBQUssSUFBSSxHQUFHLElBQUksUUFBUSxRQUFRLEVBQUUsR0FBRztBQUNqQyxjQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxLQUFLLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUc7QUFDOUMsa0JBQU0sUUFBUSxDQUFDO0FBQUEsVUFDbkI7QUFBQSxRQUNKO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFHQSxlQUFTLE1BQU07QUFDWCxZQUFJLE9BQU8sQ0FBQyxFQUFFLE1BQU0sS0FBSyxXQUFXLENBQUM7QUFFckMsZUFBTyxPQUFPLFlBQVksSUFBSTtBQUFBLE1BQ2xDO0FBRUEsZUFBUyxNQUFNO0FBQ1gsWUFBSSxPQUFPLENBQUMsRUFBRSxNQUFNLEtBQUssV0FBVyxDQUFDO0FBRXJDLGVBQU8sT0FBTyxXQUFXLElBQUk7QUFBQSxNQUNqQztBQUVBLFVBQUksTUFBTSxXQUFZO0FBQ2xCLGVBQU8sS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsb0JBQUksS0FBSztBQUFBLE1BQzdDO0FBRUEsVUFBSSxXQUFXO0FBQUEsUUFDWDtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUVBLGVBQVMsZ0JBQWdCLEdBQUc7QUFDeEIsWUFBSSxLQUNBLGlCQUFpQixPQUNqQixHQUNBLFdBQVcsU0FBUztBQUN4QixhQUFLLE9BQU8sR0FBRztBQUNYLGNBQ0ksV0FBVyxHQUFHLEdBQUcsS0FDakIsRUFDSSxRQUFRLEtBQUssVUFBVSxHQUFHLE1BQU0sT0FDL0IsRUFBRSxHQUFHLEtBQUssUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FFdEM7QUFDRSxtQkFBTztBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBRUEsYUFBSyxJQUFJLEdBQUcsSUFBSSxVQUFVLEVBQUUsR0FBRztBQUMzQixjQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRztBQUNoQixnQkFBSSxnQkFBZ0I7QUFDaEIscUJBQU87QUFBQSxZQUNYO0FBQ0EsZ0JBQUksV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHO0FBQ3RELCtCQUFpQjtBQUFBLFlBQ3JCO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFFQSxlQUFPO0FBQUEsTUFDWDtBQUVBLGVBQVMsWUFBWTtBQUNqQixlQUFPLEtBQUs7QUFBQSxNQUNoQjtBQUVBLGVBQVMsa0JBQWtCO0FBQ3ZCLGVBQU8sZUFBZSxHQUFHO0FBQUEsTUFDN0I7QUFFQSxlQUFTLFNBQVMsVUFBVTtBQUN4QixZQUFJLGtCQUFrQixxQkFBcUIsUUFBUSxHQUMvQ3lCLFNBQVEsZ0JBQWdCLFFBQVEsR0FDaEMsV0FBVyxnQkFBZ0IsV0FBVyxHQUN0Q0MsVUFBUyxnQkFBZ0IsU0FBUyxHQUNsQ0MsU0FBUSxnQkFBZ0IsUUFBUSxnQkFBZ0IsV0FBVyxHQUMzREMsUUFBTyxnQkFBZ0IsT0FBTyxHQUM5QlQsU0FBUSxnQkFBZ0IsUUFBUSxHQUNoQ0MsV0FBVSxnQkFBZ0IsVUFBVSxHQUNwQ1MsV0FBVSxnQkFBZ0IsVUFBVSxHQUNwQ0MsZ0JBQWUsZ0JBQWdCLGVBQWU7QUFFbEQsYUFBSyxXQUFXLGdCQUFnQixlQUFlO0FBRy9DLGFBQUssZ0JBQ0QsQ0FBQ0EsZ0JBQ0RELFdBQVU7QUFBQSxRQUNWVCxXQUFVO0FBQUEsUUFDVkQsU0FBUSxNQUFPLEtBQUs7QUFHeEIsYUFBSyxRQUFRLENBQUNTLFFBQU9ELFNBQVE7QUFJN0IsYUFBSyxVQUFVLENBQUNELFVBQVMsV0FBVyxJQUFJRCxTQUFRO0FBRWhELGFBQUssUUFBUSxDQUFDO0FBRWQsYUFBSyxVQUFVLFVBQVU7QUFFekIsYUFBSyxRQUFRO0FBQUEsTUFDakI7QUFFQSxlQUFTLFdBQVcsS0FBSztBQUNyQixlQUFPLGVBQWU7QUFBQSxNQUMxQjtBQUVBLGVBQVMsU0FBUyxRQUFRO0FBQ3RCLFlBQUksU0FBUyxHQUFHO0FBQ1osaUJBQU8sS0FBSyxNQUFNLEtBQUssTUFBTSxJQUFJO0FBQUEsUUFDckMsT0FBTztBQUNILGlCQUFPLEtBQUssTUFBTSxNQUFNO0FBQUEsUUFDNUI7QUFBQSxNQUNKO0FBR0EsZUFBUyxjQUFjLFFBQVEsUUFBUSxhQUFhO0FBQ2hELFlBQUksTUFBTSxLQUFLLElBQUksT0FBTyxRQUFRLE9BQU8sTUFBTSxHQUMzQyxhQUFhLEtBQUssSUFBSSxPQUFPLFNBQVMsT0FBTyxNQUFNLEdBQ25ELFFBQVEsR0FDUjtBQUNKLGFBQUssSUFBSSxHQUFHLElBQUksS0FBSyxLQUFLO0FBQ3RCLGNBQ0ssZUFBZSxPQUFPLENBQUMsTUFBTSxPQUFPLENBQUMsS0FDckMsQ0FBQyxlQUFlLE1BQU0sT0FBTyxDQUFDLENBQUMsTUFBTSxNQUFNLE9BQU8sQ0FBQyxDQUFDLEdBQ3ZEO0FBQ0U7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUNBLGVBQU8sUUFBUTtBQUFBLE1BQ25CO0FBSUEsZUFBUyxPQUFPWixRQUFPLFdBQVc7QUFDOUIsdUJBQWVBLFFBQU8sR0FBRyxHQUFHLFdBQVk7QUFDcEMsY0FBSWtCLFVBQVMsS0FBSyxVQUFVLEdBQ3hCbkIsUUFBTztBQUNYLGNBQUltQixVQUFTLEdBQUc7QUFDWixZQUFBQSxVQUFTLENBQUNBO0FBQ1YsWUFBQW5CLFFBQU87QUFBQSxVQUNYO0FBQ0EsaUJBQ0lBLFFBQ0EsU0FBUyxDQUFDLEVBQUVtQixVQUFTLEtBQUssQ0FBQyxJQUMzQixZQUNBLFNBQVMsQ0FBQyxDQUFDQSxVQUFTLElBQUksQ0FBQztBQUFBLFFBRWpDLENBQUM7QUFBQSxNQUNMO0FBRUEsYUFBTyxLQUFLLEdBQUc7QUFDZixhQUFPLE1BQU0sRUFBRTtBQUlmLG9CQUFjLEtBQUssZ0JBQWdCO0FBQ25DLG9CQUFjLE1BQU0sZ0JBQWdCO0FBQ3BDLG9CQUFjLENBQUMsS0FBSyxJQUFJLEdBQUcsU0FBVSxPQUFPLE9BQU8sUUFBUTtBQUN2RCxlQUFPLFVBQVU7QUFDakIsZUFBTyxPQUFPLGlCQUFpQixrQkFBa0IsS0FBSztBQUFBLE1BQzFELENBQUM7QUFPRCxVQUFJLGNBQWM7QUFFbEIsZUFBUyxpQkFBaUIsU0FBUyxRQUFRO0FBQ3ZDLFlBQUksV0FBVyxVQUFVLElBQUksTUFBTSxPQUFPLEdBQ3RDLE9BQ0EsT0FDQVg7QUFFSixZQUFJLFlBQVksTUFBTTtBQUNsQixpQkFBTztBQUFBLFFBQ1g7QUFFQSxnQkFBUSxRQUFRLFFBQVEsU0FBUyxDQUFDLEtBQUssQ0FBQztBQUN4QyxpQkFBUyxRQUFRLElBQUksTUFBTSxXQUFXLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQztBQUNyRCxRQUFBQSxXQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxNQUFNLE1BQU0sQ0FBQyxDQUFDO0FBRTNDLGVBQU9BLGFBQVksSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLE1BQU1BLFdBQVUsQ0FBQ0E7QUFBQSxNQUM3RDtBQUdBLGVBQVMsZ0JBQWdCLE9BQU8sT0FBTztBQUNuQyxZQUFJLEtBQUtKO0FBQ1QsWUFBSSxNQUFNLFFBQVE7QUFDZCxnQkFBTSxNQUFNLE1BQU07QUFDbEIsVUFBQUEsU0FDSyxTQUFTLEtBQUssS0FBSyxPQUFPLEtBQUssSUFDMUIsTUFBTSxRQUFRLElBQ2QsWUFBWSxLQUFLLEVBQUUsUUFBUSxLQUFLLElBQUksUUFBUTtBQUV0RCxjQUFJLEdBQUcsUUFBUSxJQUFJLEdBQUcsUUFBUSxJQUFJQSxLQUFJO0FBQ3RDLGdCQUFNLGFBQWEsS0FBSyxLQUFLO0FBQzdCLGlCQUFPO0FBQUEsUUFDWCxPQUFPO0FBQ0gsaUJBQU8sWUFBWSxLQUFLLEVBQUUsTUFBTTtBQUFBLFFBQ3BDO0FBQUEsTUFDSjtBQUVBLGVBQVMsY0FBYyxHQUFHO0FBR3RCLGVBQU8sQ0FBQyxLQUFLLE1BQU0sRUFBRSxHQUFHLGtCQUFrQixDQUFDO0FBQUEsTUFDL0M7QUFNQSxZQUFNLGVBQWUsV0FBWTtBQUFBLE1BQUM7QUFjbEMsZUFBUyxhQUFhLE9BQU8sZUFBZSxhQUFhO0FBQ3JELFlBQUllLFVBQVMsS0FBSyxXQUFXLEdBQ3pCO0FBQ0osWUFBSSxDQUFDLEtBQUssUUFBUSxHQUFHO0FBQ2pCLGlCQUFPLFNBQVMsT0FBTyxPQUFPO0FBQUEsUUFDbEM7QUFDQSxZQUFJLFNBQVMsTUFBTTtBQUNmLGNBQUksT0FBTyxVQUFVLFVBQVU7QUFDM0Isb0JBQVEsaUJBQWlCLGtCQUFrQixLQUFLO0FBQ2hELGdCQUFJLFVBQVUsTUFBTTtBQUNoQixxQkFBTztBQUFBLFlBQ1g7QUFBQSxVQUNKLFdBQVcsS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsYUFBYTtBQUM3QyxvQkFBUSxRQUFRO0FBQUEsVUFDcEI7QUFDQSxjQUFJLENBQUMsS0FBSyxVQUFVLGVBQWU7QUFDL0IsMEJBQWMsY0FBYyxJQUFJO0FBQUEsVUFDcEM7QUFDQSxlQUFLLFVBQVU7QUFDZixlQUFLLFNBQVM7QUFDZCxjQUFJLGVBQWUsTUFBTTtBQUNyQixpQkFBSyxJQUFJLGFBQWEsR0FBRztBQUFBLFVBQzdCO0FBQ0EsY0FBSUEsWUFBVyxPQUFPO0FBQ2xCLGdCQUFJLENBQUMsaUJBQWlCLEtBQUssbUJBQW1CO0FBQzFDO0FBQUEsZ0JBQ0k7QUFBQSxnQkFDQSxlQUFlLFFBQVFBLFNBQVEsR0FBRztBQUFBLGdCQUNsQztBQUFBLGdCQUNBO0FBQUEsY0FDSjtBQUFBLFlBQ0osV0FBVyxDQUFDLEtBQUssbUJBQW1CO0FBQ2hDLG1CQUFLLG9CQUFvQjtBQUN6QixvQkFBTSxhQUFhLE1BQU0sSUFBSTtBQUM3QixtQkFBSyxvQkFBb0I7QUFBQSxZQUM3QjtBQUFBLFVBQ0o7QUFDQSxpQkFBTztBQUFBLFFBQ1gsT0FBTztBQUNILGlCQUFPLEtBQUssU0FBU0EsVUFBUyxjQUFjLElBQUk7QUFBQSxRQUNwRDtBQUFBLE1BQ0o7QUFFQSxlQUFTLFdBQVcsT0FBTyxlQUFlO0FBQ3RDLFlBQUksU0FBUyxNQUFNO0FBQ2YsY0FBSSxPQUFPLFVBQVUsVUFBVTtBQUMzQixvQkFBUSxDQUFDO0FBQUEsVUFDYjtBQUVBLGVBQUssVUFBVSxPQUFPLGFBQWE7QUFFbkMsaUJBQU87QUFBQSxRQUNYLE9BQU87QUFDSCxpQkFBTyxDQUFDLEtBQUssVUFBVTtBQUFBLFFBQzNCO0FBQUEsTUFDSjtBQUVBLGVBQVMsZUFBZSxlQUFlO0FBQ25DLGVBQU8sS0FBSyxVQUFVLEdBQUcsYUFBYTtBQUFBLE1BQzFDO0FBRUEsZUFBUyxpQkFBaUIsZUFBZTtBQUNyQyxZQUFJLEtBQUssUUFBUTtBQUNiLGVBQUssVUFBVSxHQUFHLGFBQWE7QUFDL0IsZUFBSyxTQUFTO0FBRWQsY0FBSSxlQUFlO0FBQ2YsaUJBQUssU0FBUyxjQUFjLElBQUksR0FBRyxHQUFHO0FBQUEsVUFDMUM7QUFBQSxRQUNKO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFFQSxlQUFTLDBCQUEwQjtBQUMvQixZQUFJLEtBQUssUUFBUSxNQUFNO0FBQ25CLGVBQUssVUFBVSxLQUFLLE1BQU0sT0FBTyxJQUFJO0FBQUEsUUFDekMsV0FBVyxPQUFPLEtBQUssT0FBTyxVQUFVO0FBQ3BDLGNBQUksUUFBUSxpQkFBaUIsYUFBYSxLQUFLLEVBQUU7QUFDakQsY0FBSSxTQUFTLE1BQU07QUFDZixpQkFBSyxVQUFVLEtBQUs7QUFBQSxVQUN4QixPQUFPO0FBQ0gsaUJBQUssVUFBVSxHQUFHLElBQUk7QUFBQSxVQUMxQjtBQUFBLFFBQ0o7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUVBLGVBQVMscUJBQXFCLE9BQU87QUFDakMsWUFBSSxDQUFDLEtBQUssUUFBUSxHQUFHO0FBQ2pCLGlCQUFPO0FBQUEsUUFDWDtBQUNBLGdCQUFRLFFBQVEsWUFBWSxLQUFLLEVBQUUsVUFBVSxJQUFJO0FBRWpELGdCQUFRLEtBQUssVUFBVSxJQUFJLFNBQVMsT0FBTztBQUFBLE1BQy9DO0FBRUEsZUFBUyx1QkFBdUI7QUFDNUIsZUFDSSxLQUFLLFVBQVUsSUFBSSxLQUFLLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxVQUFVLEtBQ25ELEtBQUssVUFBVSxJQUFJLEtBQUssTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLFVBQVU7QUFBQSxNQUUzRDtBQUVBLGVBQVMsOEJBQThCO0FBQ25DLFlBQUksQ0FBQyxZQUFZLEtBQUssYUFBYSxHQUFHO0FBQ2xDLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUVBLFlBQUksSUFBSSxDQUFDLEdBQ0w7QUFFSixtQkFBVyxHQUFHLElBQUk7QUFDbEIsWUFBSSxjQUFjLENBQUM7QUFFbkIsWUFBSSxFQUFFLElBQUk7QUFDTixrQkFBUSxFQUFFLFNBQVMsVUFBVSxFQUFFLEVBQUUsSUFBSSxZQUFZLEVBQUUsRUFBRTtBQUNyRCxlQUFLLGdCQUNELEtBQUssUUFBUSxLQUFLLGNBQWMsRUFBRSxJQUFJLE1BQU0sUUFBUSxDQUFDLElBQUk7QUFBQSxRQUNqRSxPQUFPO0FBQ0gsZUFBSyxnQkFBZ0I7QUFBQSxRQUN6QjtBQUVBLGVBQU8sS0FBSztBQUFBLE1BQ2hCO0FBRUEsZUFBUyxVQUFVO0FBQ2YsZUFBTyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssU0FBUztBQUFBLE1BQzNDO0FBRUEsZUFBUyxjQUFjO0FBQ25CLGVBQU8sS0FBSyxRQUFRLElBQUksS0FBSyxTQUFTO0FBQUEsTUFDMUM7QUFFQSxlQUFTLFFBQVE7QUFDYixlQUFPLEtBQUssUUFBUSxJQUFJLEtBQUssVUFBVSxLQUFLLFlBQVksSUFBSTtBQUFBLE1BQ2hFO0FBR0EsVUFBSSxjQUFjLHlEQUlkLFdBQ0k7QUFFUixlQUFTLGVBQWUsT0FBTyxLQUFLO0FBQ2hDLFlBQUksV0FBVyxPQUVYLFFBQVEsTUFDUm5CLE9BQ0EsS0FDQTtBQUVKLFlBQUksV0FBVyxLQUFLLEdBQUc7QUFDbkIscUJBQVc7QUFBQSxZQUNQLElBQUksTUFBTTtBQUFBLFlBQ1YsR0FBRyxNQUFNO0FBQUEsWUFDVCxHQUFHLE1BQU07QUFBQSxVQUNiO0FBQUEsUUFDSixXQUFXVixVQUFTLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUc7QUFDMUMscUJBQVcsQ0FBQztBQUNaLGNBQUksS0FBSztBQUNMLHFCQUFTLEdBQUcsSUFBSSxDQUFDO0FBQUEsVUFDckIsT0FBTztBQUNILHFCQUFTLGVBQWUsQ0FBQztBQUFBLFVBQzdCO0FBQUEsUUFDSixXQUFZLFFBQVEsWUFBWSxLQUFLLEtBQUssR0FBSTtBQUMxQyxVQUFBVSxRQUFPLE1BQU0sQ0FBQyxNQUFNLE1BQU0sS0FBSztBQUMvQixxQkFBVztBQUFBLFlBQ1AsR0FBRztBQUFBLFlBQ0gsR0FBRyxNQUFNLE1BQU0sSUFBSSxDQUFDLElBQUlBO0FBQUEsWUFDeEIsR0FBRyxNQUFNLE1BQU0sSUFBSSxDQUFDLElBQUlBO0FBQUEsWUFDeEIsR0FBRyxNQUFNLE1BQU0sTUFBTSxDQUFDLElBQUlBO0FBQUEsWUFDMUIsR0FBRyxNQUFNLE1BQU0sTUFBTSxDQUFDLElBQUlBO0FBQUEsWUFDMUIsSUFBSSxNQUFNLFNBQVMsTUFBTSxXQUFXLElBQUksR0FBSSxDQUFDLElBQUlBO0FBQUE7QUFBQSxVQUNyRDtBQUFBLFFBQ0osV0FBWSxRQUFRLFNBQVMsS0FBSyxLQUFLLEdBQUk7QUFDdkMsVUFBQUEsUUFBTyxNQUFNLENBQUMsTUFBTSxNQUFNLEtBQUs7QUFDL0IscUJBQVc7QUFBQSxZQUNQLEdBQUcsU0FBUyxNQUFNLENBQUMsR0FBR0EsS0FBSTtBQUFBLFlBQzFCLEdBQUcsU0FBUyxNQUFNLENBQUMsR0FBR0EsS0FBSTtBQUFBLFlBQzFCLEdBQUcsU0FBUyxNQUFNLENBQUMsR0FBR0EsS0FBSTtBQUFBLFlBQzFCLEdBQUcsU0FBUyxNQUFNLENBQUMsR0FBR0EsS0FBSTtBQUFBLFlBQzFCLEdBQUcsU0FBUyxNQUFNLENBQUMsR0FBR0EsS0FBSTtBQUFBLFlBQzFCLEdBQUcsU0FBUyxNQUFNLENBQUMsR0FBR0EsS0FBSTtBQUFBLFlBQzFCLEdBQUcsU0FBUyxNQUFNLENBQUMsR0FBR0EsS0FBSTtBQUFBLFVBQzlCO0FBQUEsUUFDSixXQUFXLFlBQVksTUFBTTtBQUV6QixxQkFBVyxDQUFDO0FBQUEsUUFDaEIsV0FDSSxPQUFPLGFBQWEsYUFDbkIsVUFBVSxZQUFZLFFBQVEsV0FDakM7QUFDRSxvQkFBVTtBQUFBLFlBQ04sWUFBWSxTQUFTLElBQUk7QUFBQSxZQUN6QixZQUFZLFNBQVMsRUFBRTtBQUFBLFVBQzNCO0FBRUEscUJBQVcsQ0FBQztBQUNaLG1CQUFTLEtBQUssUUFBUTtBQUN0QixtQkFBUyxJQUFJLFFBQVE7QUFBQSxRQUN6QjtBQUVBLGNBQU0sSUFBSSxTQUFTLFFBQVE7QUFFM0IsWUFBSSxXQUFXLEtBQUssS0FBSyxXQUFXLE9BQU8sU0FBUyxHQUFHO0FBQ25ELGNBQUksVUFBVSxNQUFNO0FBQUEsUUFDeEI7QUFFQSxZQUFJLFdBQVcsS0FBSyxLQUFLLFdBQVcsT0FBTyxVQUFVLEdBQUc7QUFDcEQsY0FBSSxXQUFXLE1BQU07QUFBQSxRQUN6QjtBQUVBLGVBQU87QUFBQSxNQUNYO0FBRUEscUJBQWUsS0FBSyxTQUFTO0FBQzdCLHFCQUFlLFVBQVU7QUFFekIsZUFBUyxTQUFTLEtBQUtBLE9BQU07QUFJekIsWUFBSSxNQUFNLE9BQU8sV0FBVyxJQUFJLFFBQVEsS0FBSyxHQUFHLENBQUM7QUFFakQsZ0JBQVEsTUFBTSxHQUFHLElBQUksSUFBSSxPQUFPQTtBQUFBLE1BQ3BDO0FBRUEsZUFBUywwQkFBMEIsTUFBTSxPQUFPO0FBQzVDLFlBQUksTUFBTSxDQUFDO0FBRVgsWUFBSSxTQUNBLE1BQU0sTUFBTSxJQUFJLEtBQUssTUFBTSxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLO0FBQ2xFLFlBQUksS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLFFBQVEsR0FBRyxFQUFFLFFBQVEsS0FBSyxHQUFHO0FBQ2xELFlBQUUsSUFBSTtBQUFBLFFBQ1Y7QUFFQSxZQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLFFBQVEsR0FBRztBQUU3RCxlQUFPO0FBQUEsTUFDWDtBQUVBLGVBQVMsa0JBQWtCLE1BQU0sT0FBTztBQUNwQyxZQUFJO0FBQ0osWUFBSSxFQUFFLEtBQUssUUFBUSxLQUFLLE1BQU0sUUFBUSxJQUFJO0FBQ3RDLGlCQUFPLEVBQUUsY0FBYyxHQUFHLFFBQVEsRUFBRTtBQUFBLFFBQ3hDO0FBRUEsZ0JBQVEsZ0JBQWdCLE9BQU8sSUFBSTtBQUNuQyxZQUFJLEtBQUssU0FBUyxLQUFLLEdBQUc7QUFDdEIsZ0JBQU0sMEJBQTBCLE1BQU0sS0FBSztBQUFBLFFBQy9DLE9BQU87QUFDSCxnQkFBTSwwQkFBMEIsT0FBTyxJQUFJO0FBQzNDLGNBQUksZUFBZSxDQUFDLElBQUk7QUFDeEIsY0FBSSxTQUFTLENBQUMsSUFBSTtBQUFBLFFBQ3RCO0FBRUEsZUFBTztBQUFBLE1BQ1g7QUFHQSxlQUFTLFlBQVksV0FBVyxNQUFNO0FBQ2xDLGVBQU8sU0FBVSxLQUFLLFFBQVE7QUFDMUIsY0FBSSxLQUFLO0FBRVQsY0FBSSxXQUFXLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHO0FBQ3BDO0FBQUEsY0FDSTtBQUFBLGNBQ0EsY0FDSSxPQUNBLHlEQUNBLE9BQ0E7QUFBQSxZQUVSO0FBQ0Esa0JBQU07QUFDTixrQkFBTTtBQUNOLHFCQUFTO0FBQUEsVUFDYjtBQUVBLGdCQUFNLGVBQWUsS0FBSyxNQUFNO0FBQ2hDLHNCQUFZLE1BQU0sS0FBSyxTQUFTO0FBQ2hDLGlCQUFPO0FBQUEsUUFDWDtBQUFBLE1BQ0o7QUFFQSxlQUFTLFlBQVksS0FBSyxVQUFVLFVBQVUsY0FBYztBQUN4RCxZQUFJa0IsZ0JBQWUsU0FBUyxlQUN4QkYsUUFBTyxTQUFTLFNBQVMsS0FBSyxHQUM5QkYsVUFBUyxTQUFTLFNBQVMsT0FBTztBQUV0QyxZQUFJLENBQUMsSUFBSSxRQUFRLEdBQUc7QUFFaEI7QUFBQSxRQUNKO0FBRUEsdUJBQWUsZ0JBQWdCLE9BQU8sT0FBTztBQUU3QyxZQUFJQSxTQUFRO0FBQ1IsbUJBQVMsS0FBSyxJQUFJLEtBQUssT0FBTyxJQUFJQSxVQUFTLFFBQVE7QUFBQSxRQUN2RDtBQUNBLFlBQUlFLE9BQU07QUFDTixnQkFBTSxLQUFLLFFBQVEsSUFBSSxLQUFLLE1BQU0sSUFBSUEsUUFBTyxRQUFRO0FBQUEsUUFDekQ7QUFDQSxZQUFJRSxlQUFjO0FBQ2QsY0FBSSxHQUFHLFFBQVEsSUFBSSxHQUFHLFFBQVEsSUFBSUEsZ0JBQWUsUUFBUTtBQUFBLFFBQzdEO0FBQ0EsWUFBSSxjQUFjO0FBQ2QsZ0JBQU0sYUFBYSxLQUFLRixTQUFRRixPQUFNO0FBQUEsUUFDMUM7QUFBQSxNQUNKO0FBRUEsVUFBSSxNQUFNLFlBQVksR0FBRyxLQUFLLEdBQzFCLFdBQVcsWUFBWSxJQUFJLFVBQVU7QUFFekMsZUFBUyxTQUFTLE9BQU87QUFDckIsZUFBTyxPQUFPLFVBQVUsWUFBWSxpQkFBaUI7QUFBQSxNQUN6RDtBQUdBLGVBQVMsY0FBYyxPQUFPO0FBQzFCLGVBQ0ksU0FBUyxLQUFLLEtBQ2QsT0FBTyxLQUFLLEtBQ1osU0FBUyxLQUFLLEtBQ2R4QixVQUFTLEtBQUssS0FDZCxzQkFBc0IsS0FBSyxLQUMzQixvQkFBb0IsS0FBSyxLQUN6QixVQUFVLFFBQ1YsVUFBVTtBQUFBLE1BRWxCO0FBRUEsZUFBUyxvQkFBb0IsT0FBTztBQUNoQyxZQUFJLGFBQWFELFVBQVMsS0FBSyxLQUFLLENBQUMsY0FBYyxLQUFLLEdBQ3BELGVBQWUsT0FDZixhQUFhO0FBQUEsVUFDVDtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsUUFDSixHQUNBLEdBQ0EsVUFDQSxjQUFjLFdBQVc7QUFFN0IsYUFBSyxJQUFJLEdBQUcsSUFBSSxhQUFhLEtBQUssR0FBRztBQUNqQyxxQkFBVyxXQUFXLENBQUM7QUFDdkIseUJBQWUsZ0JBQWdCLFdBQVcsT0FBTyxRQUFRO0FBQUEsUUFDN0Q7QUFFQSxlQUFPLGNBQWM7QUFBQSxNQUN6QjtBQUVBLGVBQVMsc0JBQXNCLE9BQU87QUFDbEMsWUFBSSxZQUFZRCxTQUFRLEtBQUssR0FDekIsZUFBZTtBQUNuQixZQUFJLFdBQVc7QUFDWCx5QkFDSSxNQUFNLE9BQU8sU0FBVSxNQUFNO0FBQ3pCLG1CQUFPLENBQUNFLFVBQVMsSUFBSSxLQUFLLFNBQVMsS0FBSztBQUFBLFVBQzVDLENBQUMsRUFBRSxXQUFXO0FBQUEsUUFDdEI7QUFDQSxlQUFPLGFBQWE7QUFBQSxNQUN4QjtBQUVBLGVBQVMsZUFBZSxPQUFPO0FBQzNCLFlBQUksYUFBYUQsVUFBUyxLQUFLLEtBQUssQ0FBQyxjQUFjLEtBQUssR0FDcEQsZUFBZSxPQUNmLGFBQWE7QUFBQSxVQUNUO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxRQUNKLEdBQ0EsR0FDQTtBQUVKLGFBQUssSUFBSSxHQUFHLElBQUksV0FBVyxRQUFRLEtBQUssR0FBRztBQUN2QyxxQkFBVyxXQUFXLENBQUM7QUFDdkIseUJBQWUsZ0JBQWdCLFdBQVcsT0FBTyxRQUFRO0FBQUEsUUFDN0Q7QUFFQSxlQUFPLGNBQWM7QUFBQSxNQUN6QjtBQUVBLGVBQVMsa0JBQWtCLFVBQVVVLE1BQUs7QUFDdEMsWUFBSUssUUFBTyxTQUFTLEtBQUtMLE1BQUssUUFBUSxJQUFJO0FBQzFDLGVBQU9LLFFBQU8sS0FDUixhQUNBQSxRQUFPLEtBQ0wsYUFDQUEsUUFBTyxJQUNMLFlBQ0FBLFFBQU8sSUFDTCxZQUNBQSxRQUFPLElBQ0wsWUFDQUEsUUFBTyxJQUNMLGFBQ0E7QUFBQSxNQUNwQjtBQUVBLGVBQVMsV0FBVyxNQUFNLFNBQVM7QUFFL0IsWUFBSSxVQUFVLFdBQVcsR0FBRztBQUN4QixjQUFJLENBQUMsVUFBVSxDQUFDLEdBQUc7QUFDZixtQkFBTztBQUNQLHNCQUFVO0FBQUEsVUFDZCxXQUFXLGNBQWMsVUFBVSxDQUFDLENBQUMsR0FBRztBQUNwQyxtQkFBTyxVQUFVLENBQUM7QUFDbEIsc0JBQVU7QUFBQSxVQUNkLFdBQVcsZUFBZSxVQUFVLENBQUMsQ0FBQyxHQUFHO0FBQ3JDLHNCQUFVLFVBQVUsQ0FBQztBQUNyQixtQkFBTztBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBR0EsWUFBSUwsT0FBTSxRQUFRLFlBQVksR0FDMUIsTUFBTSxnQkFBZ0JBLE1BQUssSUFBSSxFQUFFLFFBQVEsS0FBSyxHQUM5Q1AsVUFBUyxNQUFNLGVBQWUsTUFBTSxHQUFHLEtBQUssWUFDNUMsU0FDSSxZQUNDSyxZQUFXLFFBQVFMLE9BQU0sQ0FBQyxJQUNyQixRQUFRQSxPQUFNLEVBQUUsS0FBSyxNQUFNTyxJQUFHLElBQzlCLFFBQVFQLE9BQU07QUFFNUIsZUFBTyxLQUFLO0FBQUEsVUFDUixVQUFVLEtBQUssV0FBVyxFQUFFLFNBQVNBLFNBQVEsTUFBTSxZQUFZTyxJQUFHLENBQUM7QUFBQSxRQUN2RTtBQUFBLE1BQ0o7QUFFQSxlQUFTcUIsU0FBUTtBQUNiLGVBQU8sSUFBSSxPQUFPLElBQUk7QUFBQSxNQUMxQjtBQUVBLGVBQVMsUUFBUSxPQUFPLE9BQU87QUFDM0IsWUFBSSxhQUFhLFNBQVMsS0FBSyxJQUFJLFFBQVEsWUFBWSxLQUFLO0FBQzVELFlBQUksRUFBRSxLQUFLLFFBQVEsS0FBSyxXQUFXLFFBQVEsSUFBSTtBQUMzQyxpQkFBTztBQUFBLFFBQ1g7QUFDQSxnQkFBUSxlQUFlLEtBQUssS0FBSztBQUNqQyxZQUFJLFVBQVUsZUFBZTtBQUN6QixpQkFBTyxLQUFLLFFBQVEsSUFBSSxXQUFXLFFBQVE7QUFBQSxRQUMvQyxPQUFPO0FBQ0gsaUJBQU8sV0FBVyxRQUFRLElBQUksS0FBSyxNQUFNLEVBQUUsUUFBUSxLQUFLLEVBQUUsUUFBUTtBQUFBLFFBQ3RFO0FBQUEsTUFDSjtBQUVBLGVBQVMsU0FBUyxPQUFPLE9BQU87QUFDNUIsWUFBSSxhQUFhLFNBQVMsS0FBSyxJQUFJLFFBQVEsWUFBWSxLQUFLO0FBQzVELFlBQUksRUFBRSxLQUFLLFFBQVEsS0FBSyxXQUFXLFFBQVEsSUFBSTtBQUMzQyxpQkFBTztBQUFBLFFBQ1g7QUFDQSxnQkFBUSxlQUFlLEtBQUssS0FBSztBQUNqQyxZQUFJLFVBQVUsZUFBZTtBQUN6QixpQkFBTyxLQUFLLFFBQVEsSUFBSSxXQUFXLFFBQVE7QUFBQSxRQUMvQyxPQUFPO0FBQ0gsaUJBQU8sS0FBSyxNQUFNLEVBQUUsTUFBTSxLQUFLLEVBQUUsUUFBUSxJQUFJLFdBQVcsUUFBUTtBQUFBLFFBQ3BFO0FBQUEsTUFDSjtBQUVBLGVBQVMsVUFBVXhCLE9BQU1ELEtBQUksT0FBTyxhQUFhO0FBQzdDLFlBQUksWUFBWSxTQUFTQyxLQUFJLElBQUlBLFFBQU8sWUFBWUEsS0FBSSxHQUNwRCxVQUFVLFNBQVNELEdBQUUsSUFBSUEsTUFBSyxZQUFZQSxHQUFFO0FBQ2hELFlBQUksRUFBRSxLQUFLLFFBQVEsS0FBSyxVQUFVLFFBQVEsS0FBSyxRQUFRLFFBQVEsSUFBSTtBQUMvRCxpQkFBTztBQUFBLFFBQ1g7QUFDQSxzQkFBYyxlQUFlO0FBQzdCLGdCQUNLLFlBQVksQ0FBQyxNQUFNLE1BQ2QsS0FBSyxRQUFRLFdBQVcsS0FBSyxJQUM3QixDQUFDLEtBQUssU0FBUyxXQUFXLEtBQUssT0FDcEMsWUFBWSxDQUFDLE1BQU0sTUFDZCxLQUFLLFNBQVMsU0FBUyxLQUFLLElBQzVCLENBQUMsS0FBSyxRQUFRLFNBQVMsS0FBSztBQUFBLE1BRTFDO0FBRUEsZUFBUyxPQUFPLE9BQU8sT0FBTztBQUMxQixZQUFJLGFBQWEsU0FBUyxLQUFLLElBQUksUUFBUSxZQUFZLEtBQUssR0FDeEQ7QUFDSixZQUFJLEVBQUUsS0FBSyxRQUFRLEtBQUssV0FBVyxRQUFRLElBQUk7QUFDM0MsaUJBQU87QUFBQSxRQUNYO0FBQ0EsZ0JBQVEsZUFBZSxLQUFLLEtBQUs7QUFDakMsWUFBSSxVQUFVLGVBQWU7QUFDekIsaUJBQU8sS0FBSyxRQUFRLE1BQU0sV0FBVyxRQUFRO0FBQUEsUUFDakQsT0FBTztBQUNILG9CQUFVLFdBQVcsUUFBUTtBQUM3QixpQkFDSSxLQUFLLE1BQU0sRUFBRSxRQUFRLEtBQUssRUFBRSxRQUFRLEtBQUssV0FDekMsV0FBVyxLQUFLLE1BQU0sRUFBRSxNQUFNLEtBQUssRUFBRSxRQUFRO0FBQUEsUUFFckQ7QUFBQSxNQUNKO0FBRUEsZUFBUyxjQUFjLE9BQU8sT0FBTztBQUNqQyxlQUFPLEtBQUssT0FBTyxPQUFPLEtBQUssS0FBSyxLQUFLLFFBQVEsT0FBTyxLQUFLO0FBQUEsTUFDakU7QUFFQSxlQUFTLGVBQWUsT0FBTyxPQUFPO0FBQ2xDLGVBQU8sS0FBSyxPQUFPLE9BQU8sS0FBSyxLQUFLLEtBQUssU0FBUyxPQUFPLEtBQUs7QUFBQSxNQUNsRTtBQUVBLGVBQVMsS0FBSyxPQUFPLE9BQU8sU0FBUztBQUNqQyxZQUFJLE1BQU0sV0FBVztBQUVyQixZQUFJLENBQUMsS0FBSyxRQUFRLEdBQUc7QUFDakIsaUJBQU87QUFBQSxRQUNYO0FBRUEsZUFBTyxnQkFBZ0IsT0FBTyxJQUFJO0FBRWxDLFlBQUksQ0FBQyxLQUFLLFFBQVEsR0FBRztBQUNqQixpQkFBTztBQUFBLFFBQ1g7QUFFQSxxQkFBYSxLQUFLLFVBQVUsSUFBSSxLQUFLLFVBQVUsS0FBSztBQUVwRCxnQkFBUSxlQUFlLEtBQUs7QUFFNUIsZ0JBQVEsT0FBTztBQUFBLFVBQ1gsS0FBSztBQUNELHFCQUFTLFVBQVUsTUFBTSxJQUFJLElBQUk7QUFDakM7QUFBQSxVQUNKLEtBQUs7QUFDRCxxQkFBUyxVQUFVLE1BQU0sSUFBSTtBQUM3QjtBQUFBLFVBQ0osS0FBSztBQUNELHFCQUFTLFVBQVUsTUFBTSxJQUFJLElBQUk7QUFDakM7QUFBQSxVQUNKLEtBQUs7QUFDRCxzQkFBVSxPQUFPLFFBQVE7QUFDekI7QUFBQSxVQUNKLEtBQUs7QUFDRCxzQkFBVSxPQUFPLFFBQVE7QUFDekI7QUFBQSxVQUNKLEtBQUs7QUFDRCxzQkFBVSxPQUFPLFFBQVE7QUFDekI7QUFBQSxVQUNKLEtBQUs7QUFDRCxzQkFBVSxPQUFPLE9BQU8sYUFBYTtBQUNyQztBQUFBLFVBQ0osS0FBSztBQUNELHNCQUFVLE9BQU8sT0FBTyxhQUFhO0FBQ3JDO0FBQUEsVUFDSjtBQUNJLHFCQUFTLE9BQU87QUFBQSxRQUN4QjtBQUVBLGVBQU8sVUFBVSxTQUFTLFNBQVMsTUFBTTtBQUFBLE1BQzdDO0FBRUEsZUFBUyxVQUFVLEdBQUcsR0FBRztBQUNyQixZQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsS0FBSyxHQUFHO0FBR3JCLGlCQUFPLENBQUMsVUFBVSxHQUFHLENBQUM7QUFBQSxRQUMxQjtBQUVBLFlBQUksa0JBQWtCLEVBQUUsS0FBSyxJQUFJLEVBQUUsS0FBSyxLQUFLLE1BQU0sRUFBRSxNQUFNLElBQUksRUFBRSxNQUFNLElBRW5FLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxnQkFBZ0IsUUFBUSxHQUMvQyxTQUNBO0FBRUosWUFBSSxJQUFJLFNBQVMsR0FBRztBQUNoQixvQkFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLGlCQUFpQixHQUFHLFFBQVE7QUFFcEQsb0JBQVUsSUFBSSxXQUFXLFNBQVM7QUFBQSxRQUN0QyxPQUFPO0FBQ0gsb0JBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxpQkFBaUIsR0FBRyxRQUFRO0FBRXBELG9CQUFVLElBQUksV0FBVyxVQUFVO0FBQUEsUUFDdkM7QUFHQSxlQUFPLEVBQUUsaUJBQWlCLFdBQVc7QUFBQSxNQUN6QztBQUVBLFlBQU0sZ0JBQWdCO0FBQ3RCLFlBQU0sbUJBQW1CO0FBRXpCLGVBQVMsV0FBVztBQUNoQixlQUFPLEtBQUssTUFBTSxFQUFFLE9BQU8sSUFBSSxFQUFFLE9BQU8sa0NBQWtDO0FBQUEsTUFDOUU7QUFFQSxlQUFTLFlBQVksWUFBWTtBQUM3QixZQUFJLENBQUMsS0FBSyxRQUFRLEdBQUc7QUFDakIsaUJBQU87QUFBQSxRQUNYO0FBQ0EsWUFBSSxNQUFNLGVBQWUsTUFDckIsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSTtBQUNuQyxZQUFJLEVBQUUsS0FBSyxJQUFJLEtBQUssRUFBRSxLQUFLLElBQUksTUFBTTtBQUNqQyxpQkFBTztBQUFBLFlBQ0g7QUFBQSxZQUNBLE1BQ00sbUNBQ0E7QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUNBLFlBQUlFLFlBQVcsS0FBSyxVQUFVLFdBQVcsR0FBRztBQUV4QyxjQUFJLEtBQUs7QUFDTCxtQkFBTyxLQUFLLE9BQU8sRUFBRSxZQUFZO0FBQUEsVUFDckMsT0FBTztBQUNILG1CQUFPLElBQUksS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLFVBQVUsSUFBSSxLQUFLLEdBQUksRUFDeEQsWUFBWSxFQUNaLFFBQVEsS0FBSyxhQUFhLEdBQUcsR0FBRyxDQUFDO0FBQUEsVUFDMUM7QUFBQSxRQUNKO0FBQ0EsZUFBTztBQUFBLFVBQ0g7QUFBQSxVQUNBLE1BQU0saUNBQWlDO0FBQUEsUUFDM0M7QUFBQSxNQUNKO0FBUUEsZUFBUyxVQUFVO0FBQ2YsWUFBSSxDQUFDLEtBQUssUUFBUSxHQUFHO0FBQ2pCLGlCQUFPLHVCQUF1QixLQUFLLEtBQUs7QUFBQSxRQUM1QztBQUNBLFlBQUksT0FBTyxVQUNQLE9BQU8sSUFDUCxRQUNBLE1BQ0EsVUFDQTtBQUNKLFlBQUksQ0FBQyxLQUFLLFFBQVEsR0FBRztBQUNqQixpQkFBTyxLQUFLLFVBQVUsTUFBTSxJQUFJLGVBQWU7QUFDL0MsaUJBQU87QUFBQSxRQUNYO0FBQ0EsaUJBQVMsTUFBTSxPQUFPO0FBQ3RCLGVBQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxPQUFPLFNBQVM7QUFDMUQsbUJBQVc7QUFDWCxpQkFBUyxPQUFPO0FBRWhCLGVBQU8sS0FBSyxPQUFPLFNBQVMsT0FBTyxXQUFXLE1BQU07QUFBQSxNQUN4RDtBQUVBLGVBQVMsT0FBTyxhQUFhO0FBQ3pCLFlBQUksQ0FBQyxhQUFhO0FBQ2Qsd0JBQWMsS0FBSyxNQUFNLElBQ25CLE1BQU0sbUJBQ04sTUFBTTtBQUFBLFFBQ2hCO0FBQ0EsWUFBSSxTQUFTLGFBQWEsTUFBTSxXQUFXO0FBQzNDLGVBQU8sS0FBSyxXQUFXLEVBQUUsV0FBVyxNQUFNO0FBQUEsTUFDOUM7QUFFQSxlQUFTRCxNQUFLLE1BQU0sZUFBZTtBQUMvQixZQUNJLEtBQUssUUFBUSxNQUNYLFNBQVMsSUFBSSxLQUFLLEtBQUssUUFBUSxLQUFNLFlBQVksSUFBSSxFQUFFLFFBQVEsSUFDbkU7QUFDRSxpQkFBTyxlQUFlLEVBQUUsSUFBSSxNQUFNLE1BQU0sS0FBSyxDQUFDLEVBQ3pDLE9BQU8sS0FBSyxPQUFPLENBQUMsRUFDcEIsU0FBUyxDQUFDLGFBQWE7QUFBQSxRQUNoQyxPQUFPO0FBQ0gsaUJBQU8sS0FBSyxXQUFXLEVBQUUsWUFBWTtBQUFBLFFBQ3pDO0FBQUEsTUFDSjtBQUVBLGVBQVMsUUFBUSxlQUFlO0FBQzVCLGVBQU8sS0FBSyxLQUFLLFlBQVksR0FBRyxhQUFhO0FBQUEsTUFDakQ7QUFFQSxlQUFTRCxJQUFHLE1BQU0sZUFBZTtBQUM3QixZQUNJLEtBQUssUUFBUSxNQUNYLFNBQVMsSUFBSSxLQUFLLEtBQUssUUFBUSxLQUFNLFlBQVksSUFBSSxFQUFFLFFBQVEsSUFDbkU7QUFDRSxpQkFBTyxlQUFlLEVBQUUsTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLEVBQ3pDLE9BQU8sS0FBSyxPQUFPLENBQUMsRUFDcEIsU0FBUyxDQUFDLGFBQWE7QUFBQSxRQUNoQyxPQUFPO0FBQ0gsaUJBQU8sS0FBSyxXQUFXLEVBQUUsWUFBWTtBQUFBLFFBQ3pDO0FBQUEsTUFDSjtBQUVBLGVBQVMsTUFBTSxlQUFlO0FBQzFCLGVBQU8sS0FBSyxHQUFHLFlBQVksR0FBRyxhQUFhO0FBQUEsTUFDL0M7QUFLQSxlQUFTRixRQUFPLEtBQUs7QUFDakIsWUFBSTtBQUVKLFlBQUksUUFBUSxRQUFXO0FBQ25CLGlCQUFPLEtBQUssUUFBUTtBQUFBLFFBQ3hCLE9BQU87QUFDSCwwQkFBZ0IsVUFBVSxHQUFHO0FBQzdCLGNBQUksaUJBQWlCLE1BQU07QUFDdkIsaUJBQUssVUFBVTtBQUFBLFVBQ25CO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUVBLFVBQUksT0FBTztBQUFBLFFBQ1A7QUFBQSxRQUNBLFNBQVUsS0FBSztBQUNYLGNBQUksUUFBUSxRQUFXO0FBQ25CLG1CQUFPLEtBQUssV0FBVztBQUFBLFVBQzNCLE9BQU87QUFDSCxtQkFBTyxLQUFLLE9BQU8sR0FBRztBQUFBLFVBQzFCO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFFQSxlQUFTLGFBQWE7QUFDbEIsZUFBTyxLQUFLO0FBQUEsTUFDaEI7QUFFQSxVQUFJLGdCQUFnQixLQUNoQixnQkFBZ0IsS0FBSyxlQUNyQixjQUFjLEtBQUssZUFDbkIsb0JBQW9CLE1BQU0sTUFBTSxNQUFNLEtBQUs7QUFHL0MsZUFBUyxNQUFNLFVBQVUsU0FBUztBQUM5QixnQkFBUyxXQUFXLFVBQVcsV0FBVztBQUFBLE1BQzlDO0FBRUEsZUFBUyxpQkFBaUIsR0FBRyxHQUFHLEdBQUc7QUFFL0IsWUFBSSxJQUFJLE9BQU8sS0FBSyxHQUFHO0FBRW5CLGlCQUFPLElBQUksS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUk7QUFBQSxRQUNyQyxPQUFPO0FBQ0gsaUJBQU8sSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEVBQUUsUUFBUTtBQUFBLFFBQ3JDO0FBQUEsTUFDSjtBQUVBLGVBQVMsZUFBZSxHQUFHLEdBQUcsR0FBRztBQUU3QixZQUFJLElBQUksT0FBTyxLQUFLLEdBQUc7QUFFbkIsaUJBQU8sS0FBSyxJQUFJLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSTtBQUFBLFFBQ3JDLE9BQU87QUFDSCxpQkFBTyxLQUFLLElBQUksR0FBRyxHQUFHLENBQUM7QUFBQSxRQUMzQjtBQUFBLE1BQ0o7QUFFQSxlQUFTLFFBQVEsT0FBTztBQUNwQixZQUFJLE1BQU07QUFDVixnQkFBUSxlQUFlLEtBQUs7QUFDNUIsWUFBSSxVQUFVLFVBQWEsVUFBVSxpQkFBaUIsQ0FBQyxLQUFLLFFBQVEsR0FBRztBQUNuRSxpQkFBTztBQUFBLFFBQ1g7QUFFQSxzQkFBYyxLQUFLLFNBQVMsaUJBQWlCO0FBRTdDLGdCQUFRLE9BQU87QUFBQSxVQUNYLEtBQUs7QUFDRCxtQkFBTyxZQUFZLEtBQUssS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUNwQztBQUFBLFVBQ0osS0FBSztBQUNELG1CQUFPO0FBQUEsY0FDSCxLQUFLLEtBQUs7QUFBQSxjQUNWLEtBQUssTUFBTSxJQUFLLEtBQUssTUFBTSxJQUFJO0FBQUEsY0FDL0I7QUFBQSxZQUNKO0FBQ0E7QUFBQSxVQUNKLEtBQUs7QUFDRCxtQkFBTyxZQUFZLEtBQUssS0FBSyxHQUFHLEtBQUssTUFBTSxHQUFHLENBQUM7QUFDL0M7QUFBQSxVQUNKLEtBQUs7QUFDRCxtQkFBTztBQUFBLGNBQ0gsS0FBSyxLQUFLO0FBQUEsY0FDVixLQUFLLE1BQU07QUFBQSxjQUNYLEtBQUssS0FBSyxJQUFJLEtBQUssUUFBUTtBQUFBLFlBQy9CO0FBQ0E7QUFBQSxVQUNKLEtBQUs7QUFDRCxtQkFBTztBQUFBLGNBQ0gsS0FBSyxLQUFLO0FBQUEsY0FDVixLQUFLLE1BQU07QUFBQSxjQUNYLEtBQUssS0FBSyxLQUFLLEtBQUssV0FBVyxJQUFJO0FBQUEsWUFDdkM7QUFDQTtBQUFBLFVBQ0osS0FBSztBQUFBLFVBQ0wsS0FBSztBQUNELG1CQUFPLFlBQVksS0FBSyxLQUFLLEdBQUcsS0FBSyxNQUFNLEdBQUcsS0FBSyxLQUFLLENBQUM7QUFDekQ7QUFBQSxVQUNKLEtBQUs7QUFDRCxtQkFBTyxLQUFLLEdBQUcsUUFBUTtBQUN2QixvQkFBUTtBQUFBLGNBQ0osUUFBUSxLQUFLLFNBQVMsSUFBSSxLQUFLLFVBQVUsSUFBSTtBQUFBLGNBQzdDO0FBQUEsWUFDSjtBQUNBO0FBQUEsVUFDSixLQUFLO0FBQ0QsbUJBQU8sS0FBSyxHQUFHLFFBQVE7QUFDdkIsb0JBQVEsTUFBTSxNQUFNLGFBQWE7QUFDakM7QUFBQSxVQUNKLEtBQUs7QUFDRCxtQkFBTyxLQUFLLEdBQUcsUUFBUTtBQUN2QixvQkFBUSxNQUFNLE1BQU0sYUFBYTtBQUNqQztBQUFBLFFBQ1I7QUFFQSxhQUFLLEdBQUcsUUFBUSxJQUFJO0FBQ3BCLGNBQU0sYUFBYSxNQUFNLElBQUk7QUFDN0IsZUFBTztBQUFBLE1BQ1g7QUFFQSxlQUFTLE1BQU0sT0FBTztBQUNsQixZQUFJLE1BQU07QUFDVixnQkFBUSxlQUFlLEtBQUs7QUFDNUIsWUFBSSxVQUFVLFVBQWEsVUFBVSxpQkFBaUIsQ0FBQyxLQUFLLFFBQVEsR0FBRztBQUNuRSxpQkFBTztBQUFBLFFBQ1g7QUFFQSxzQkFBYyxLQUFLLFNBQVMsaUJBQWlCO0FBRTdDLGdCQUFRLE9BQU87QUFBQSxVQUNYLEtBQUs7QUFDRCxtQkFBTyxZQUFZLEtBQUssS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUk7QUFDNUM7QUFBQSxVQUNKLEtBQUs7QUFDRCxtQkFDSTtBQUFBLGNBQ0ksS0FBSyxLQUFLO0FBQUEsY0FDVixLQUFLLE1BQU0sSUFBSyxLQUFLLE1BQU0sSUFBSSxJQUFLO0FBQUEsY0FDcEM7QUFBQSxZQUNKLElBQUk7QUFDUjtBQUFBLFVBQ0osS0FBSztBQUNELG1CQUFPLFlBQVksS0FBSyxLQUFLLEdBQUcsS0FBSyxNQUFNLElBQUksR0FBRyxDQUFDLElBQUk7QUFDdkQ7QUFBQSxVQUNKLEtBQUs7QUFDRCxtQkFDSTtBQUFBLGNBQ0ksS0FBSyxLQUFLO0FBQUEsY0FDVixLQUFLLE1BQU07QUFBQSxjQUNYLEtBQUssS0FBSyxJQUFJLEtBQUssUUFBUSxJQUFJO0FBQUEsWUFDbkMsSUFBSTtBQUNSO0FBQUEsVUFDSixLQUFLO0FBQ0QsbUJBQ0k7QUFBQSxjQUNJLEtBQUssS0FBSztBQUFBLGNBQ1YsS0FBSyxNQUFNO0FBQUEsY0FDWCxLQUFLLEtBQUssS0FBSyxLQUFLLFdBQVcsSUFBSSxLQUFLO0FBQUEsWUFDNUMsSUFBSTtBQUNSO0FBQUEsVUFDSixLQUFLO0FBQUEsVUFDTCxLQUFLO0FBQ0QsbUJBQU8sWUFBWSxLQUFLLEtBQUssR0FBRyxLQUFLLE1BQU0sR0FBRyxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUk7QUFDakU7QUFBQSxVQUNKLEtBQUs7QUFDRCxtQkFBTyxLQUFLLEdBQUcsUUFBUTtBQUN2QixvQkFDSSxjQUNBO0FBQUEsY0FDSSxRQUFRLEtBQUssU0FBUyxJQUFJLEtBQUssVUFBVSxJQUFJO0FBQUEsY0FDN0M7QUFBQSxZQUNKLElBQ0E7QUFDSjtBQUFBLFVBQ0osS0FBSztBQUNELG1CQUFPLEtBQUssR0FBRyxRQUFRO0FBQ3ZCLG9CQUFRLGdCQUFnQixNQUFNLE1BQU0sYUFBYSxJQUFJO0FBQ3JEO0FBQUEsVUFDSixLQUFLO0FBQ0QsbUJBQU8sS0FBSyxHQUFHLFFBQVE7QUFDdkIsb0JBQVEsZ0JBQWdCLE1BQU0sTUFBTSxhQUFhLElBQUk7QUFDckQ7QUFBQSxRQUNSO0FBRUEsYUFBSyxHQUFHLFFBQVEsSUFBSTtBQUNwQixjQUFNLGFBQWEsTUFBTSxJQUFJO0FBQzdCLGVBQU87QUFBQSxNQUNYO0FBRUEsZUFBUyxVQUFVO0FBQ2YsZUFBTyxLQUFLLEdBQUcsUUFBUSxLQUFLLEtBQUssV0FBVyxLQUFLO0FBQUEsTUFDckQ7QUFFQSxlQUFTLE9BQU87QUFDWixlQUFPLEtBQUssTUFBTSxLQUFLLFFBQVEsSUFBSSxHQUFJO0FBQUEsTUFDM0M7QUFFQSxlQUFTLFNBQVM7QUFDZCxlQUFPLElBQUksS0FBSyxLQUFLLFFBQVEsQ0FBQztBQUFBLE1BQ2xDO0FBRUEsZUFBUyxVQUFVO0FBQ2YsWUFBSSxJQUFJO0FBQ1IsZUFBTztBQUFBLFVBQ0gsRUFBRSxLQUFLO0FBQUEsVUFDUCxFQUFFLE1BQU07QUFBQSxVQUNSLEVBQUUsS0FBSztBQUFBLFVBQ1AsRUFBRSxLQUFLO0FBQUEsVUFDUCxFQUFFLE9BQU87QUFBQSxVQUNULEVBQUUsT0FBTztBQUFBLFVBQ1QsRUFBRSxZQUFZO0FBQUEsUUFDbEI7QUFBQSxNQUNKO0FBRUEsZUFBUyxXQUFXO0FBQ2hCLFlBQUksSUFBSTtBQUNSLGVBQU87QUFBQSxVQUNILE9BQU8sRUFBRSxLQUFLO0FBQUEsVUFDZCxRQUFRLEVBQUUsTUFBTTtBQUFBLFVBQ2hCLE1BQU0sRUFBRSxLQUFLO0FBQUEsVUFDYixPQUFPLEVBQUUsTUFBTTtBQUFBLFVBQ2YsU0FBUyxFQUFFLFFBQVE7QUFBQSxVQUNuQixTQUFTLEVBQUUsUUFBUTtBQUFBLFVBQ25CLGNBQWMsRUFBRSxhQUFhO0FBQUEsUUFDakM7QUFBQSxNQUNKO0FBRUEsZUFBUyxTQUFTO0FBRWQsZUFBTyxLQUFLLFFBQVEsSUFBSSxLQUFLLFlBQVksSUFBSTtBQUFBLE1BQ2pEO0FBRUEsZUFBUyxZQUFZO0FBQ2pCLGVBQU8sUUFBUSxJQUFJO0FBQUEsTUFDdkI7QUFFQSxlQUFTLGVBQWU7QUFDcEIsZUFBTyxPQUFPLENBQUMsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDO0FBQUEsTUFDM0M7QUFFQSxlQUFTLFlBQVk7QUFDakIsZUFBTyxnQkFBZ0IsSUFBSSxFQUFFO0FBQUEsTUFDakM7QUFFQSxlQUFTLGVBQWU7QUFDcEIsZUFBTztBQUFBLFVBQ0gsT0FBTyxLQUFLO0FBQUEsVUFDWixRQUFRLEtBQUs7QUFBQSxVQUNiLFFBQVEsS0FBSztBQUFBLFVBQ2IsT0FBTyxLQUFLO0FBQUEsVUFDWixRQUFRLEtBQUs7QUFBQSxRQUNqQjtBQUFBLE1BQ0o7QUFFQSxxQkFBZSxLQUFLLEdBQUcsR0FBRyxTQUFTO0FBQ25DLHFCQUFlLE1BQU0sR0FBRyxHQUFHLFNBQVM7QUFDcEMscUJBQWUsT0FBTyxHQUFHLEdBQUcsU0FBUztBQUNyQyxxQkFBZSxRQUFRLEdBQUcsR0FBRyxTQUFTO0FBQ3RDLHFCQUFlLFNBQVMsR0FBRyxHQUFHLFdBQVc7QUFFekMscUJBQWUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sU0FBUztBQUM3QyxxQkFBZSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxTQUFTO0FBQzNDLHFCQUFlLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLFNBQVM7QUFDNUMscUJBQWUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsU0FBUztBQUU3QyxvQkFBYyxLQUFLLFlBQVk7QUFDL0Isb0JBQWMsTUFBTSxZQUFZO0FBQ2hDLG9CQUFjLE9BQU8sWUFBWTtBQUNqQyxvQkFBYyxRQUFRLFlBQVk7QUFDbEMsb0JBQWMsU0FBUyxjQUFjO0FBRXJDO0FBQUEsUUFDSSxDQUFDLEtBQUssTUFBTSxPQUFPLFFBQVEsT0FBTztBQUFBLFFBQ2xDLFNBQVUsT0FBTyxPQUFPLFFBQVFRLFFBQU87QUFDbkMsY0FBSSxNQUFNLE9BQU8sUUFBUSxVQUFVLE9BQU9BLFFBQU8sT0FBTyxPQUFPO0FBQy9ELGNBQUksS0FBSztBQUNMLDRCQUFnQixNQUFNLEVBQUUsTUFBTTtBQUFBLFVBQ2xDLE9BQU87QUFDSCw0QkFBZ0IsTUFBTSxFQUFFLGFBQWE7QUFBQSxVQUN6QztBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBRUEsb0JBQWMsS0FBSyxhQUFhO0FBQ2hDLG9CQUFjLE1BQU0sYUFBYTtBQUNqQyxvQkFBYyxPQUFPLGFBQWE7QUFDbEMsb0JBQWMsUUFBUSxhQUFhO0FBQ25DLG9CQUFjLE1BQU0sbUJBQW1CO0FBRXZDLG9CQUFjLENBQUMsS0FBSyxNQUFNLE9BQU8sTUFBTSxHQUFHLElBQUk7QUFDOUMsb0JBQWMsQ0FBQyxJQUFJLEdBQUcsU0FBVSxPQUFPLE9BQU8sUUFBUUEsUUFBTztBQUN6RCxZQUFJO0FBQ0osWUFBSSxPQUFPLFFBQVEsc0JBQXNCO0FBQ3JDLGtCQUFRLE1BQU0sTUFBTSxPQUFPLFFBQVEsb0JBQW9CO0FBQUEsUUFDM0Q7QUFFQSxZQUFJLE9BQU8sUUFBUSxxQkFBcUI7QUFDcEMsZ0JBQU0sSUFBSSxJQUFJLE9BQU8sUUFBUSxvQkFBb0IsT0FBTyxLQUFLO0FBQUEsUUFDakUsT0FBTztBQUNILGdCQUFNLElBQUksSUFBSSxTQUFTLE9BQU8sRUFBRTtBQUFBLFFBQ3BDO0FBQUEsTUFDSixDQUFDO0FBRUQsZUFBUyxXQUFXLEdBQUdULFNBQVE7QUFDM0IsWUFBSSxHQUNBLEdBQ0EsTUFDQSxPQUFPLEtBQUssU0FBUyxVQUFVLElBQUksRUFBRTtBQUN6QyxhQUFLLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ3JDLGtCQUFRLE9BQU8sS0FBSyxDQUFDLEVBQUUsT0FBTztBQUFBLFlBQzFCLEtBQUs7QUFFRCxxQkFBTyxNQUFNLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEtBQUs7QUFDekMsbUJBQUssQ0FBQyxFQUFFLFFBQVEsS0FBSyxRQUFRO0FBQzdCO0FBQUEsVUFDUjtBQUVBLGtCQUFRLE9BQU8sS0FBSyxDQUFDLEVBQUUsT0FBTztBQUFBLFlBQzFCLEtBQUs7QUFDRCxtQkFBSyxDQUFDLEVBQUUsUUFBUTtBQUNoQjtBQUFBLFlBQ0osS0FBSztBQUVELHFCQUFPLE1BQU0sS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsS0FBSyxFQUFFLFFBQVE7QUFDbkQsbUJBQUssQ0FBQyxFQUFFLFFBQVEsS0FBSyxRQUFRO0FBQzdCO0FBQUEsVUFDUjtBQUFBLFFBQ0o7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUVBLGVBQVMsZ0JBQWdCLFNBQVNBLFNBQVEsUUFBUTtBQUM5QyxZQUFJLEdBQ0EsR0FDQSxPQUFPLEtBQUssS0FBSyxHQUNqQixNQUNBLE1BQ0E7QUFDSixrQkFBVSxRQUFRLFlBQVk7QUFFOUIsYUFBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNyQyxpQkFBTyxLQUFLLENBQUMsRUFBRSxLQUFLLFlBQVk7QUFDaEMsaUJBQU8sS0FBSyxDQUFDLEVBQUUsS0FBSyxZQUFZO0FBQ2hDLG1CQUFTLEtBQUssQ0FBQyxFQUFFLE9BQU8sWUFBWTtBQUVwQyxjQUFJLFFBQVE7QUFDUixvQkFBUUEsU0FBUTtBQUFBLGNBQ1osS0FBSztBQUFBLGNBQ0wsS0FBSztBQUFBLGNBQ0wsS0FBSztBQUNELG9CQUFJLFNBQVMsU0FBUztBQUNsQix5QkFBTyxLQUFLLENBQUM7QUFBQSxnQkFDakI7QUFDQTtBQUFBLGNBRUosS0FBSztBQUNELG9CQUFJLFNBQVMsU0FBUztBQUNsQix5QkFBTyxLQUFLLENBQUM7QUFBQSxnQkFDakI7QUFDQTtBQUFBLGNBRUosS0FBSztBQUNELG9CQUFJLFdBQVcsU0FBUztBQUNwQix5QkFBTyxLQUFLLENBQUM7QUFBQSxnQkFDakI7QUFDQTtBQUFBLFlBQ1I7QUFBQSxVQUNKLFdBQVcsQ0FBQyxNQUFNLE1BQU0sTUFBTSxFQUFFLFFBQVEsT0FBTyxLQUFLLEdBQUc7QUFDbkQsbUJBQU8sS0FBSyxDQUFDO0FBQUEsVUFDakI7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUVBLGVBQVMsc0JBQXNCLEtBQUssTUFBTTtBQUN0QyxZQUFJLE1BQU0sSUFBSSxTQUFTLElBQUksUUFBUSxJQUFLO0FBQ3hDLFlBQUksU0FBUyxRQUFXO0FBQ3BCLGlCQUFPLE1BQU0sSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLFFBQ2pDLE9BQU87QUFDSCxpQkFBTyxNQUFNLElBQUksS0FBSyxFQUFFLEtBQUssS0FBSyxPQUFPLElBQUksVUFBVTtBQUFBLFFBQzNEO0FBQUEsTUFDSjtBQUVBLGVBQVMsYUFBYTtBQUNsQixZQUFJLEdBQ0EsR0FDQSxLQUNBLE9BQU8sS0FBSyxXQUFXLEVBQUUsS0FBSztBQUNsQyxhQUFLLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBRXJDLGdCQUFNLEtBQUssTUFBTSxFQUFFLFFBQVEsS0FBSyxFQUFFLFFBQVE7QUFFMUMsY0FBSSxLQUFLLENBQUMsRUFBRSxTQUFTLE9BQU8sT0FBTyxLQUFLLENBQUMsRUFBRSxPQUFPO0FBQzlDLG1CQUFPLEtBQUssQ0FBQyxFQUFFO0FBQUEsVUFDbkI7QUFDQSxjQUFJLEtBQUssQ0FBQyxFQUFFLFNBQVMsT0FBTyxPQUFPLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFDOUMsbUJBQU8sS0FBSyxDQUFDLEVBQUU7QUFBQSxVQUNuQjtBQUFBLFFBQ0o7QUFFQSxlQUFPO0FBQUEsTUFDWDtBQUVBLGVBQVMsZUFBZTtBQUNwQixZQUFJLEdBQ0EsR0FDQSxLQUNBLE9BQU8sS0FBSyxXQUFXLEVBQUUsS0FBSztBQUNsQyxhQUFLLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBRXJDLGdCQUFNLEtBQUssTUFBTSxFQUFFLFFBQVEsS0FBSyxFQUFFLFFBQVE7QUFFMUMsY0FBSSxLQUFLLENBQUMsRUFBRSxTQUFTLE9BQU8sT0FBTyxLQUFLLENBQUMsRUFBRSxPQUFPO0FBQzlDLG1CQUFPLEtBQUssQ0FBQyxFQUFFO0FBQUEsVUFDbkI7QUFDQSxjQUFJLEtBQUssQ0FBQyxFQUFFLFNBQVMsT0FBTyxPQUFPLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFDOUMsbUJBQU8sS0FBSyxDQUFDLEVBQUU7QUFBQSxVQUNuQjtBQUFBLFFBQ0o7QUFFQSxlQUFPO0FBQUEsTUFDWDtBQUVBLGVBQVMsYUFBYTtBQUNsQixZQUFJLEdBQ0EsR0FDQSxLQUNBLE9BQU8sS0FBSyxXQUFXLEVBQUUsS0FBSztBQUNsQyxhQUFLLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBRXJDLGdCQUFNLEtBQUssTUFBTSxFQUFFLFFBQVEsS0FBSyxFQUFFLFFBQVE7QUFFMUMsY0FBSSxLQUFLLENBQUMsRUFBRSxTQUFTLE9BQU8sT0FBTyxLQUFLLENBQUMsRUFBRSxPQUFPO0FBQzlDLG1CQUFPLEtBQUssQ0FBQyxFQUFFO0FBQUEsVUFDbkI7QUFDQSxjQUFJLEtBQUssQ0FBQyxFQUFFLFNBQVMsT0FBTyxPQUFPLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFDOUMsbUJBQU8sS0FBSyxDQUFDLEVBQUU7QUFBQSxVQUNuQjtBQUFBLFFBQ0o7QUFFQSxlQUFPO0FBQUEsTUFDWDtBQUVBLGVBQVMsYUFBYTtBQUNsQixZQUFJLEdBQ0EsR0FDQSxLQUNBLEtBQ0EsT0FBTyxLQUFLLFdBQVcsRUFBRSxLQUFLO0FBQ2xDLGFBQUssSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDckMsZ0JBQU0sS0FBSyxDQUFDLEVBQUUsU0FBUyxLQUFLLENBQUMsRUFBRSxRQUFRLElBQUs7QUFHNUMsZ0JBQU0sS0FBSyxNQUFNLEVBQUUsUUFBUSxLQUFLLEVBQUUsUUFBUTtBQUUxQyxjQUNLLEtBQUssQ0FBQyxFQUFFLFNBQVMsT0FBTyxPQUFPLEtBQUssQ0FBQyxFQUFFLFNBQ3ZDLEtBQUssQ0FBQyxFQUFFLFNBQVMsT0FBTyxPQUFPLEtBQUssQ0FBQyxFQUFFLE9BQzFDO0FBQ0Usb0JBQ0ssS0FBSyxLQUFLLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxLQUFLLE1BQzlDLEtBQUssQ0FBQyxFQUFFO0FBQUEsVUFFaEI7QUFBQSxRQUNKO0FBRUEsZUFBTyxLQUFLLEtBQUs7QUFBQSxNQUNyQjtBQUVBLGVBQVMsY0FBYyxVQUFVO0FBQzdCLFlBQUksQ0FBQyxXQUFXLE1BQU0sZ0JBQWdCLEdBQUc7QUFDckMsMkJBQWlCLEtBQUssSUFBSTtBQUFBLFFBQzlCO0FBQ0EsZUFBTyxXQUFXLEtBQUssaUJBQWlCLEtBQUs7QUFBQSxNQUNqRDtBQUVBLGVBQVMsY0FBYyxVQUFVO0FBQzdCLFlBQUksQ0FBQyxXQUFXLE1BQU0sZ0JBQWdCLEdBQUc7QUFDckMsMkJBQWlCLEtBQUssSUFBSTtBQUFBLFFBQzlCO0FBQ0EsZUFBTyxXQUFXLEtBQUssaUJBQWlCLEtBQUs7QUFBQSxNQUNqRDtBQUVBLGVBQVMsZ0JBQWdCLFVBQVU7QUFDL0IsWUFBSSxDQUFDLFdBQVcsTUFBTSxrQkFBa0IsR0FBRztBQUN2QywyQkFBaUIsS0FBSyxJQUFJO0FBQUEsUUFDOUI7QUFDQSxlQUFPLFdBQVcsS0FBSyxtQkFBbUIsS0FBSztBQUFBLE1BQ25EO0FBRUEsZUFBUyxhQUFhLFVBQVVDLFNBQVE7QUFDcEMsZUFBT0EsUUFBTyxjQUFjLFFBQVE7QUFBQSxNQUN4QztBQUVBLGVBQVMsYUFBYSxVQUFVQSxTQUFRO0FBQ3BDLGVBQU9BLFFBQU8sY0FBYyxRQUFRO0FBQUEsTUFDeEM7QUFFQSxlQUFTLGVBQWUsVUFBVUEsU0FBUTtBQUN0QyxlQUFPQSxRQUFPLGdCQUFnQixRQUFRO0FBQUEsTUFDMUM7QUFFQSxlQUFTLG9CQUFvQixVQUFVQSxTQUFRO0FBQzNDLGVBQU9BLFFBQU8sd0JBQXdCO0FBQUEsTUFDMUM7QUFFQSxlQUFTLG1CQUFtQjtBQUN4QixZQUFJLGFBQWEsQ0FBQyxHQUNkLGFBQWEsQ0FBQyxHQUNkLGVBQWUsQ0FBQyxHQUNoQixjQUFjLENBQUMsR0FDZixHQUNBLEdBQ0EsVUFDQSxVQUNBLFlBQ0EsT0FBTyxLQUFLLEtBQUs7QUFFckIsYUFBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNyQyxxQkFBVyxZQUFZLEtBQUssQ0FBQyxFQUFFLElBQUk7QUFDbkMscUJBQVcsWUFBWSxLQUFLLENBQUMsRUFBRSxJQUFJO0FBQ25DLHVCQUFhLFlBQVksS0FBSyxDQUFDLEVBQUUsTUFBTTtBQUV2QyxxQkFBVyxLQUFLLFFBQVE7QUFDeEIscUJBQVcsS0FBSyxRQUFRO0FBQ3hCLHVCQUFhLEtBQUssVUFBVTtBQUM1QixzQkFBWSxLQUFLLFFBQVE7QUFDekIsc0JBQVksS0FBSyxRQUFRO0FBQ3pCLHNCQUFZLEtBQUssVUFBVTtBQUFBLFFBQy9CO0FBRUEsYUFBSyxhQUFhLElBQUksT0FBTyxPQUFPLFlBQVksS0FBSyxHQUFHLElBQUksS0FBSyxHQUFHO0FBQ3BFLGFBQUssaUJBQWlCLElBQUksT0FBTyxPQUFPLFdBQVcsS0FBSyxHQUFHLElBQUksS0FBSyxHQUFHO0FBQ3ZFLGFBQUssaUJBQWlCLElBQUksT0FBTyxPQUFPLFdBQVcsS0FBSyxHQUFHLElBQUksS0FBSyxHQUFHO0FBQ3ZFLGFBQUssbUJBQW1CLElBQUk7QUFBQSxVQUN4QixPQUFPLGFBQWEsS0FBSyxHQUFHLElBQUk7QUFBQSxVQUNoQztBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBSUEscUJBQWUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsV0FBWTtBQUN4QyxlQUFPLEtBQUssU0FBUyxJQUFJO0FBQUEsTUFDN0IsQ0FBQztBQUVELHFCQUFlLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLFdBQVk7QUFDeEMsZUFBTyxLQUFLLFlBQVksSUFBSTtBQUFBLE1BQ2hDLENBQUM7QUFFRCxlQUFTLHVCQUF1QlEsUUFBTyxRQUFRO0FBQzNDLHVCQUFlLEdBQUcsQ0FBQ0EsUUFBT0EsT0FBTSxNQUFNLEdBQUcsR0FBRyxNQUFNO0FBQUEsTUFDdEQ7QUFFQSw2QkFBdUIsUUFBUSxVQUFVO0FBQ3pDLDZCQUF1QixTQUFTLFVBQVU7QUFDMUMsNkJBQXVCLFFBQVEsYUFBYTtBQUM1Qyw2QkFBdUIsU0FBUyxhQUFhO0FBTTdDLG9CQUFjLEtBQUssV0FBVztBQUM5QixvQkFBYyxLQUFLLFdBQVc7QUFDOUIsb0JBQWMsTUFBTSxXQUFXLE1BQU07QUFDckMsb0JBQWMsTUFBTSxXQUFXLE1BQU07QUFDckMsb0JBQWMsUUFBUSxXQUFXLE1BQU07QUFDdkMsb0JBQWMsUUFBUSxXQUFXLE1BQU07QUFDdkMsb0JBQWMsU0FBUyxXQUFXLE1BQU07QUFDeEMsb0JBQWMsU0FBUyxXQUFXLE1BQU07QUFFeEM7QUFBQSxRQUNJLENBQUMsUUFBUSxTQUFTLFFBQVEsT0FBTztBQUFBLFFBQ2pDLFNBQVUsT0FBTyxNQUFNLFFBQVFBLFFBQU87QUFDbEMsZUFBS0EsT0FBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTSxLQUFLO0FBQUEsUUFDMUM7QUFBQSxNQUNKO0FBRUEsd0JBQWtCLENBQUMsTUFBTSxJQUFJLEdBQUcsU0FBVSxPQUFPLE1BQU0sUUFBUUEsUUFBTztBQUNsRSxhQUFLQSxNQUFLLElBQUksTUFBTSxrQkFBa0IsS0FBSztBQUFBLE1BQy9DLENBQUM7QUFJRCxlQUFTLGVBQWUsT0FBTztBQUMzQixlQUFPLHFCQUFxQjtBQUFBLFVBQ3hCO0FBQUEsVUFDQTtBQUFBLFVBQ0EsS0FBSyxLQUFLO0FBQUEsVUFDVixLQUFLLFFBQVEsSUFBSSxLQUFLLFdBQVcsRUFBRSxNQUFNO0FBQUEsVUFDekMsS0FBSyxXQUFXLEVBQUUsTUFBTTtBQUFBLFVBQ3hCLEtBQUssV0FBVyxFQUFFLE1BQU07QUFBQSxRQUM1QjtBQUFBLE1BQ0o7QUFFQSxlQUFTLGtCQUFrQixPQUFPO0FBQzlCLGVBQU8scUJBQXFCO0FBQUEsVUFDeEI7QUFBQSxVQUNBO0FBQUEsVUFDQSxLQUFLLFFBQVE7QUFBQSxVQUNiLEtBQUssV0FBVztBQUFBLFVBQ2hCO0FBQUEsVUFDQTtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBRUEsZUFBUyxvQkFBb0I7QUFDekIsZUFBTyxZQUFZLEtBQUssS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUFBLE1BQ3hDO0FBRUEsZUFBUywyQkFBMkI7QUFDaEMsZUFBTyxZQUFZLEtBQUssWUFBWSxHQUFHLEdBQUcsQ0FBQztBQUFBLE1BQy9DO0FBRUEsZUFBUyxpQkFBaUI7QUFDdEIsWUFBSSxXQUFXLEtBQUssV0FBVyxFQUFFO0FBQ2pDLGVBQU8sWUFBWSxLQUFLLEtBQUssR0FBRyxTQUFTLEtBQUssU0FBUyxHQUFHO0FBQUEsTUFDOUQ7QUFFQSxlQUFTLHFCQUFxQjtBQUMxQixZQUFJLFdBQVcsS0FBSyxXQUFXLEVBQUU7QUFDakMsZUFBTyxZQUFZLEtBQUssU0FBUyxHQUFHLFNBQVMsS0FBSyxTQUFTLEdBQUc7QUFBQSxNQUNsRTtBQUVBLGVBQVMscUJBQXFCLE9BQU8sTUFBTSxTQUFTLEtBQUssS0FBSztBQUMxRCxZQUFJO0FBQ0osWUFBSSxTQUFTLE1BQU07QUFDZixpQkFBTyxXQUFXLE1BQU0sS0FBSyxHQUFHLEVBQUU7QUFBQSxRQUN0QyxPQUFPO0FBQ0gsd0JBQWMsWUFBWSxPQUFPLEtBQUssR0FBRztBQUN6QyxjQUFJLE9BQU8sYUFBYTtBQUNwQixtQkFBTztBQUFBLFVBQ1g7QUFDQSxpQkFBTyxXQUFXLEtBQUssTUFBTSxPQUFPLE1BQU0sU0FBUyxLQUFLLEdBQUc7QUFBQSxRQUMvRDtBQUFBLE1BQ0o7QUFFQSxlQUFTLFdBQVcsVUFBVSxNQUFNLFNBQVMsS0FBSyxLQUFLO0FBQ25ELFlBQUksZ0JBQWdCLG1CQUFtQixVQUFVLE1BQU0sU0FBUyxLQUFLLEdBQUcsR0FDcEUsT0FBTyxjQUFjLGNBQWMsTUFBTSxHQUFHLGNBQWMsU0FBUztBQUV2RSxhQUFLLEtBQUssS0FBSyxlQUFlLENBQUM7QUFDL0IsYUFBSyxNQUFNLEtBQUssWUFBWSxDQUFDO0FBQzdCLGFBQUssS0FBSyxLQUFLLFdBQVcsQ0FBQztBQUMzQixlQUFPO0FBQUEsTUFDWDtBQUlBLHFCQUFlLEtBQUssR0FBRyxNQUFNLFNBQVM7QUFJdEMsb0JBQWMsS0FBSyxNQUFNO0FBQ3pCLG9CQUFjLEtBQUssU0FBVSxPQUFPLE9BQU87QUFDdkMsY0FBTSxLQUFLLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSztBQUFBLE1BQ3hDLENBQUM7QUFJRCxlQUFTLGNBQWMsT0FBTztBQUMxQixlQUFPLFNBQVMsT0FDVixLQUFLLE1BQU0sS0FBSyxNQUFNLElBQUksS0FBSyxDQUFDLElBQ2hDLEtBQUssT0FBTyxRQUFRLEtBQUssSUFBSyxLQUFLLE1BQU0sSUFBSSxDQUFFO0FBQUEsTUFDekQ7QUFJQSxxQkFBZSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxNQUFNO0FBSTNDLG9CQUFjLEtBQUssV0FBVyxzQkFBc0I7QUFDcEQsb0JBQWMsTUFBTSxXQUFXLE1BQU07QUFDckMsb0JBQWMsTUFBTSxTQUFVLFVBQVVSLFNBQVE7QUFFNUMsZUFBTyxXQUNEQSxRQUFPLDJCQUEyQkEsUUFBTyxnQkFDekNBLFFBQU87QUFBQSxNQUNqQixDQUFDO0FBRUQsb0JBQWMsQ0FBQyxLQUFLLElBQUksR0FBRyxJQUFJO0FBQy9CLG9CQUFjLE1BQU0sU0FBVSxPQUFPLE9BQU87QUFDeEMsY0FBTSxJQUFJLElBQUksTUFBTSxNQUFNLE1BQU0sU0FBUyxFQUFFLENBQUMsQ0FBQztBQUFBLE1BQ2pELENBQUM7QUFJRCxVQUFJLG1CQUFtQixXQUFXLFFBQVEsSUFBSTtBQUk5QyxxQkFBZSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxXQUFXO0FBSXRELG9CQUFjLE9BQU8sU0FBUztBQUM5QixvQkFBYyxRQUFRLE1BQU07QUFDNUIsb0JBQWMsQ0FBQyxPQUFPLE1BQU0sR0FBRyxTQUFVLE9BQU8sT0FBTyxRQUFRO0FBQzNELGVBQU8sYUFBYSxNQUFNLEtBQUs7QUFBQSxNQUNuQyxDQUFDO0FBTUQsZUFBUyxnQkFBZ0IsT0FBTztBQUM1QixZQUFJLFlBQ0EsS0FBSztBQUFBLFdBQ0EsS0FBSyxNQUFNLEVBQUUsUUFBUSxLQUFLLElBQUksS0FBSyxNQUFNLEVBQUUsUUFBUSxNQUFNLEtBQUs7QUFBQSxRQUNuRSxJQUFJO0FBQ1IsZUFBTyxTQUFTLE9BQU8sWUFBWSxLQUFLLElBQUksUUFBUSxXQUFXLEdBQUc7QUFBQSxNQUN0RTtBQUlBLHFCQUFlLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLFFBQVE7QUFJMUMsb0JBQWMsS0FBSyxXQUFXLGdCQUFnQjtBQUM5QyxvQkFBYyxNQUFNLFdBQVcsTUFBTTtBQUNyQyxvQkFBYyxDQUFDLEtBQUssSUFBSSxHQUFHLE1BQU07QUFJakMsVUFBSSxlQUFlLFdBQVcsV0FBVyxLQUFLO0FBSTlDLHFCQUFlLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLFFBQVE7QUFJMUMsb0JBQWMsS0FBSyxXQUFXLGdCQUFnQjtBQUM5QyxvQkFBYyxNQUFNLFdBQVcsTUFBTTtBQUNyQyxvQkFBYyxDQUFDLEtBQUssSUFBSSxHQUFHLE1BQU07QUFJakMsVUFBSSxlQUFlLFdBQVcsV0FBVyxLQUFLO0FBSTlDLHFCQUFlLEtBQUssR0FBRyxHQUFHLFdBQVk7QUFDbEMsZUFBTyxDQUFDLEVBQUUsS0FBSyxZQUFZLElBQUk7QUFBQSxNQUNuQyxDQUFDO0FBRUQscUJBQWUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsV0FBWTtBQUN4QyxlQUFPLENBQUMsRUFBRSxLQUFLLFlBQVksSUFBSTtBQUFBLE1BQ25DLENBQUM7QUFFRCxxQkFBZSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxhQUFhO0FBQzlDLHFCQUFlLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLFdBQVk7QUFDMUMsZUFBTyxLQUFLLFlBQVksSUFBSTtBQUFBLE1BQ2hDLENBQUM7QUFDRCxxQkFBZSxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxXQUFZO0FBQzNDLGVBQU8sS0FBSyxZQUFZLElBQUk7QUFBQSxNQUNoQyxDQUFDO0FBQ0QscUJBQWUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsV0FBWTtBQUM1QyxlQUFPLEtBQUssWUFBWSxJQUFJO0FBQUEsTUFDaEMsQ0FBQztBQUNELHFCQUFlLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLFdBQVk7QUFDN0MsZUFBTyxLQUFLLFlBQVksSUFBSTtBQUFBLE1BQ2hDLENBQUM7QUFDRCxxQkFBZSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxXQUFZO0FBQzlDLGVBQU8sS0FBSyxZQUFZLElBQUk7QUFBQSxNQUNoQyxDQUFDO0FBQ0QscUJBQWUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsV0FBWTtBQUMvQyxlQUFPLEtBQUssWUFBWSxJQUFJO0FBQUEsTUFDaEMsQ0FBQztBQUlELG9CQUFjLEtBQUssV0FBVyxNQUFNO0FBQ3BDLG9CQUFjLE1BQU0sV0FBVyxNQUFNO0FBQ3JDLG9CQUFjLE9BQU8sV0FBVyxNQUFNO0FBRXRDLFVBQUksT0FBTztBQUNYLFdBQUssUUFBUSxRQUFRLE1BQU0sVUFBVSxHQUFHLFNBQVMsS0FBSztBQUNsRCxzQkFBYyxPQUFPLGFBQWE7QUFBQSxNQUN0QztBQUVBLGVBQVMsUUFBUSxPQUFPLE9BQU87QUFDM0IsY0FBTSxXQUFXLElBQUksT0FBTyxPQUFPLFNBQVMsR0FBSTtBQUFBLE1BQ3BEO0FBRUEsV0FBSyxRQUFRLEtBQUssTUFBTSxVQUFVLEdBQUcsU0FBUyxLQUFLO0FBQy9DLHNCQUFjLE9BQU8sT0FBTztBQUFBLE1BQ2hDO0FBRUEsMEJBQW9CLFdBQVcsZ0JBQWdCLEtBQUs7QUFJcEQscUJBQWUsS0FBSyxHQUFHLEdBQUcsVUFBVTtBQUNwQyxxQkFBZSxNQUFNLEdBQUcsR0FBRyxVQUFVO0FBSXJDLGVBQVMsY0FBYztBQUNuQixlQUFPLEtBQUssU0FBUyxRQUFRO0FBQUEsTUFDakM7QUFFQSxlQUFTLGNBQWM7QUFDbkIsZUFBTyxLQUFLLFNBQVMsK0JBQStCO0FBQUEsTUFDeEQ7QUFFQSxVQUFJLFFBQVEsT0FBTztBQUVuQixZQUFNLE1BQU07QUFDWixZQUFNLFdBQVc7QUFDakIsWUFBTSxRQUFRMkI7QUFDZCxZQUFNLE9BQU87QUFDYixZQUFNLFFBQVE7QUFDZCxZQUFNLFNBQVM7QUFDZixZQUFNLE9BQU94QjtBQUNiLFlBQU0sVUFBVTtBQUNoQixZQUFNLEtBQUtEO0FBQ1gsWUFBTSxRQUFRO0FBQ2QsWUFBTSxNQUFNO0FBQ1osWUFBTSxZQUFZO0FBQ2xCLFlBQU0sVUFBVTtBQUNoQixZQUFNLFdBQVc7QUFDakIsWUFBTSxZQUFZO0FBQ2xCLFlBQU0sU0FBUztBQUNmLFlBQU0sZ0JBQWdCO0FBQ3RCLFlBQU0saUJBQWlCO0FBQ3ZCLFlBQU0sVUFBVTtBQUNoQixZQUFNLE9BQU87QUFDYixZQUFNLFNBQVNGO0FBQ2YsWUFBTSxhQUFhO0FBQ25CLFlBQU0sTUFBTTtBQUNaLFlBQU0sTUFBTTtBQUNaLFlBQU0sZUFBZTtBQUNyQixZQUFNLE1BQU07QUFDWixZQUFNLFVBQVU7QUFDaEIsWUFBTSxXQUFXO0FBQ2pCLFlBQU0sVUFBVTtBQUNoQixZQUFNLFdBQVc7QUFDakIsWUFBTSxTQUFTO0FBQ2YsWUFBTSxjQUFjO0FBQ3BCLFlBQU0sVUFBVTtBQUNoQixVQUFJLE9BQU8sV0FBVyxlQUFlLE9BQU8sT0FBTyxNQUFNO0FBQ3JELGNBQU0sT0FBTyxJQUFJLDRCQUE0QixDQUFDLElBQUksV0FBWTtBQUMxRCxpQkFBTyxZQUFZLEtBQUssT0FBTyxJQUFJO0FBQUEsUUFDdkM7QUFBQSxNQUNKO0FBQ0EsWUFBTSxTQUFTO0FBQ2YsWUFBTSxXQUFXO0FBQ2pCLFlBQU0sT0FBTztBQUNiLFlBQU0sVUFBVTtBQUNoQixZQUFNLGVBQWU7QUFDckIsWUFBTSxVQUFVO0FBQ2hCLFlBQU0sWUFBWTtBQUNsQixZQUFNLFVBQVU7QUFDaEIsWUFBTSxVQUFVO0FBQ2hCLFlBQU0sT0FBTztBQUNiLFlBQU0sYUFBYTtBQUNuQixZQUFNLFdBQVc7QUFDakIsWUFBTSxjQUFjO0FBQ3BCLFlBQU0sVUFBVSxNQUFNLFdBQVc7QUFDakMsWUFBTSxRQUFRO0FBQ2QsWUFBTSxjQUFjO0FBQ3BCLFlBQU0sT0FBTyxNQUFNLFFBQVE7QUFDM0IsWUFBTSxVQUFVLE1BQU0sV0FBVztBQUNqQyxZQUFNLGNBQWM7QUFDcEIsWUFBTSxrQkFBa0I7QUFDeEIsWUFBTSxpQkFBaUI7QUFDdkIsWUFBTSx3QkFBd0I7QUFDOUIsWUFBTSxPQUFPO0FBQ2IsWUFBTSxNQUFNLE1BQU0sT0FBTztBQUN6QixZQUFNLFVBQVU7QUFDaEIsWUFBTSxhQUFhO0FBQ25CLFlBQU0sWUFBWTtBQUNsQixZQUFNLE9BQU8sTUFBTSxRQUFRO0FBQzNCLFlBQU0sU0FBUyxNQUFNLFVBQVU7QUFDL0IsWUFBTSxTQUFTLE1BQU0sVUFBVTtBQUMvQixZQUFNLGNBQWMsTUFBTSxlQUFlO0FBQ3pDLFlBQU0sWUFBWTtBQUNsQixZQUFNLE1BQU07QUFDWixZQUFNLFFBQVE7QUFDZCxZQUFNLFlBQVk7QUFDbEIsWUFBTSx1QkFBdUI7QUFDN0IsWUFBTSxRQUFRO0FBQ2QsWUFBTSxVQUFVO0FBQ2hCLFlBQU0sY0FBYztBQUNwQixZQUFNLFFBQVE7QUFDZCxZQUFNLFFBQVE7QUFDZCxZQUFNLFdBQVc7QUFDakIsWUFBTSxXQUFXO0FBQ2pCLFlBQU0sUUFBUTtBQUFBLFFBQ1Y7QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUNBLFlBQU0sU0FBUztBQUFBLFFBQ1g7QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUNBLFlBQU0sUUFBUTtBQUFBLFFBQ1Y7QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUNBLFlBQU0sT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUNBLFlBQU0sZUFBZTtBQUFBLFFBQ2pCO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFFQSxlQUFTLFdBQVcsT0FBTztBQUN2QixlQUFPLFlBQVksUUFBUSxHQUFJO0FBQUEsTUFDbkM7QUFFQSxlQUFTLGVBQWU7QUFDcEIsZUFBTyxZQUFZLE1BQU0sTUFBTSxTQUFTLEVBQUUsVUFBVTtBQUFBLE1BQ3hEO0FBRUEsZUFBUyxtQkFBbUIsUUFBUTtBQUNoQyxlQUFPO0FBQUEsTUFDWDtBQUVBLFVBQUksVUFBVSxPQUFPO0FBRXJCLGNBQVEsV0FBVztBQUNuQixjQUFRLGlCQUFpQjtBQUN6QixjQUFRLGNBQWM7QUFDdEIsY0FBUSxVQUFVO0FBQ2xCLGNBQVEsV0FBVztBQUNuQixjQUFRLGFBQWE7QUFDckIsY0FBUSxlQUFlO0FBQ3ZCLGNBQVEsYUFBYTtBQUNyQixjQUFRLE1BQU1LO0FBQ2QsY0FBUSxPQUFPO0FBQ2YsY0FBUSxZQUFZO0FBQ3BCLGNBQVEsa0JBQWtCO0FBQzFCLGNBQVEsZ0JBQWdCO0FBQ3hCLGNBQVEsZ0JBQWdCO0FBQ3hCLGNBQVEsa0JBQWtCO0FBRTFCLGNBQVEsU0FBUztBQUNqQixjQUFRLGNBQWM7QUFDdEIsY0FBUSxjQUFjO0FBQ3RCLGNBQVEsY0FBYztBQUN0QixjQUFRLG1CQUFtQjtBQUMzQixjQUFRLE9BQU87QUFDZixjQUFRLGlCQUFpQjtBQUN6QixjQUFRLGlCQUFpQjtBQUV6QixjQUFRLFdBQVc7QUFDbkIsY0FBUSxjQUFjO0FBQ3RCLGNBQVEsZ0JBQWdCO0FBQ3hCLGNBQVEsZ0JBQWdCO0FBRXhCLGNBQVEsZ0JBQWdCO0FBQ3hCLGNBQVEscUJBQXFCO0FBQzdCLGNBQVEsbUJBQW1CO0FBRTNCLGNBQVEsT0FBTztBQUNmLGNBQVEsV0FBVztBQUVuQixlQUFTLE1BQU1OLFNBQVEsT0FBTyxPQUFPLFFBQVE7QUFDekMsWUFBSUMsVUFBUyxVQUFVLEdBQ25CLE1BQU0sVUFBVSxFQUFFLElBQUksUUFBUSxLQUFLO0FBQ3ZDLGVBQU9BLFFBQU8sS0FBSyxFQUFFLEtBQUtELE9BQU07QUFBQSxNQUNwQztBQUVBLGVBQVMsZUFBZUEsU0FBUSxPQUFPLE9BQU87QUFDMUMsWUFBSUYsVUFBU0UsT0FBTSxHQUFHO0FBQ2xCLGtCQUFRQTtBQUNSLFVBQUFBLFVBQVM7QUFBQSxRQUNiO0FBRUEsUUFBQUEsVUFBU0EsV0FBVTtBQUVuQixZQUFJLFNBQVMsTUFBTTtBQUNmLGlCQUFPLE1BQU1BLFNBQVEsT0FBTyxPQUFPLE9BQU87QUFBQSxRQUM5QztBQUVBLFlBQUksR0FDQSxNQUFNLENBQUM7QUFDWCxhQUFLLElBQUksR0FBRyxJQUFJLElBQUksS0FBSztBQUNyQixjQUFJLENBQUMsSUFBSSxNQUFNQSxTQUFRLEdBQUcsT0FBTyxPQUFPO0FBQUEsUUFDNUM7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQVVBLGVBQVMsaUJBQWlCLGNBQWNBLFNBQVEsT0FBTyxPQUFPO0FBQzFELFlBQUksT0FBTyxpQkFBaUIsV0FBVztBQUNuQyxjQUFJRixVQUFTRSxPQUFNLEdBQUc7QUFDbEIsb0JBQVFBO0FBQ1IsWUFBQUEsVUFBUztBQUFBLFVBQ2I7QUFFQSxVQUFBQSxVQUFTQSxXQUFVO0FBQUEsUUFDdkIsT0FBTztBQUNILFVBQUFBLFVBQVM7QUFDVCxrQkFBUUE7QUFDUix5QkFBZTtBQUVmLGNBQUlGLFVBQVNFLE9BQU0sR0FBRztBQUNsQixvQkFBUUE7QUFDUixZQUFBQSxVQUFTO0FBQUEsVUFDYjtBQUVBLFVBQUFBLFVBQVNBLFdBQVU7QUFBQSxRQUN2QjtBQUVBLFlBQUlDLFVBQVMsVUFBVSxHQUNuQixRQUFRLGVBQWVBLFFBQU8sTUFBTSxNQUFNLEdBQzFDLEdBQ0EsTUFBTSxDQUFDO0FBRVgsWUFBSSxTQUFTLE1BQU07QUFDZixpQkFBTyxNQUFNRCxVQUFTLFFBQVEsU0FBUyxHQUFHLE9BQU8sS0FBSztBQUFBLFFBQzFEO0FBRUEsYUFBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUs7QUFDcEIsY0FBSSxDQUFDLElBQUksTUFBTUEsVUFBUyxJQUFJLFNBQVMsR0FBRyxPQUFPLEtBQUs7QUFBQSxRQUN4RDtBQUNBLGVBQU87QUFBQSxNQUNYO0FBRUEsZUFBUyxXQUFXQSxTQUFRLE9BQU87QUFDL0IsZUFBTyxlQUFlQSxTQUFRLE9BQU8sUUFBUTtBQUFBLE1BQ2pEO0FBRUEsZUFBUyxnQkFBZ0JBLFNBQVEsT0FBTztBQUNwQyxlQUFPLGVBQWVBLFNBQVEsT0FBTyxhQUFhO0FBQUEsTUFDdEQ7QUFFQSxlQUFTLGFBQWEsY0FBY0EsU0FBUSxPQUFPO0FBQy9DLGVBQU8saUJBQWlCLGNBQWNBLFNBQVEsT0FBTyxVQUFVO0FBQUEsTUFDbkU7QUFFQSxlQUFTLGtCQUFrQixjQUFjQSxTQUFRLE9BQU87QUFDcEQsZUFBTyxpQkFBaUIsY0FBY0EsU0FBUSxPQUFPLGVBQWU7QUFBQSxNQUN4RTtBQUVBLGVBQVMsZ0JBQWdCLGNBQWNBLFNBQVEsT0FBTztBQUNsRCxlQUFPLGlCQUFpQixjQUFjQSxTQUFRLE9BQU8sYUFBYTtBQUFBLE1BQ3RFO0FBRUEseUJBQW1CLE1BQU07QUFBQSxRQUNyQixNQUFNO0FBQUEsVUFDRjtBQUFBLFlBQ0ksT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsUUFBUTtBQUFBLFlBQ1IsTUFBTTtBQUFBLFlBQ04sUUFBUTtBQUFBLFlBQ1IsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxVQUNBO0FBQUEsWUFDSSxPQUFPO0FBQUEsWUFDUCxPQUFPO0FBQUEsWUFDUCxRQUFRO0FBQUEsWUFDUixNQUFNO0FBQUEsWUFDTixRQUFRO0FBQUEsWUFDUixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHdCQUF3QjtBQUFBLFFBQ3hCLFNBQVMsU0FBVSxRQUFRO0FBQ3ZCLGNBQUksSUFBSSxTQUFTLElBQ2IsU0FDSSxNQUFPLFNBQVMsTUFBTyxFQUFFLE1BQU0sSUFDekIsT0FDQSxNQUFNLElBQ0osT0FDQSxNQUFNLElBQ0osT0FDQSxNQUFNLElBQ0osT0FDQTtBQUNwQixpQkFBTyxTQUFTO0FBQUEsUUFDcEI7QUFBQSxNQUNKLENBQUM7QUFJRCxZQUFNLE9BQU87QUFBQSxRQUNUO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFDQSxZQUFNLFdBQVc7QUFBQSxRQUNiO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFFQSxVQUFJLFVBQVUsS0FBSztBQUVuQixlQUFTLE1BQU07QUFDWCxZQUFJLE9BQU8sS0FBSztBQUVoQixhQUFLLGdCQUFnQixRQUFRLEtBQUssYUFBYTtBQUMvQyxhQUFLLFFBQVEsUUFBUSxLQUFLLEtBQUs7QUFDL0IsYUFBSyxVQUFVLFFBQVEsS0FBSyxPQUFPO0FBRW5DLGFBQUssZUFBZSxRQUFRLEtBQUssWUFBWTtBQUM3QyxhQUFLLFVBQVUsUUFBUSxLQUFLLE9BQU87QUFDbkMsYUFBSyxVQUFVLFFBQVEsS0FBSyxPQUFPO0FBQ25DLGFBQUssUUFBUSxRQUFRLEtBQUssS0FBSztBQUMvQixhQUFLLFNBQVMsUUFBUSxLQUFLLE1BQU07QUFDakMsYUFBSyxRQUFRLFFBQVEsS0FBSyxLQUFLO0FBRS9CLGVBQU87QUFBQSxNQUNYO0FBRUEsZUFBUyxjQUFjLFVBQVUsT0FBTyxPQUFPLFdBQVc7QUFDdEQsWUFBSSxRQUFRLGVBQWUsT0FBTyxLQUFLO0FBRXZDLGlCQUFTLGlCQUFpQixZQUFZLE1BQU07QUFDNUMsaUJBQVMsU0FBUyxZQUFZLE1BQU07QUFDcEMsaUJBQVMsV0FBVyxZQUFZLE1BQU07QUFFdEMsZUFBTyxTQUFTLFFBQVE7QUFBQSxNQUM1QjtBQUdBLGVBQVMsTUFBTSxPQUFPLE9BQU87QUFDekIsZUFBTyxjQUFjLE1BQU0sT0FBTyxPQUFPLENBQUM7QUFBQSxNQUM5QztBQUdBLGVBQVMsV0FBVyxPQUFPLE9BQU87QUFDOUIsZUFBTyxjQUFjLE1BQU0sT0FBTyxPQUFPLEVBQUU7QUFBQSxNQUMvQztBQUVBLGVBQVMsUUFBUSxRQUFRO0FBQ3JCLFlBQUksU0FBUyxHQUFHO0FBQ1osaUJBQU8sS0FBSyxNQUFNLE1BQU07QUFBQSxRQUM1QixPQUFPO0FBQ0gsaUJBQU8sS0FBSyxLQUFLLE1BQU07QUFBQSxRQUMzQjtBQUFBLE1BQ0o7QUFFQSxlQUFTLFNBQVM7QUFDZCxZQUFJMEIsZ0JBQWUsS0FBSyxlQUNwQkYsUUFBTyxLQUFLLE9BQ1pGLFVBQVMsS0FBSyxTQUNkLE9BQU8sS0FBSyxPQUNaRyxVQUNBVCxVQUNBRCxRQUNBTSxRQUNBO0FBSUosWUFDSSxFQUNLSyxpQkFBZ0IsS0FBS0YsU0FBUSxLQUFLRixXQUFVLEtBQzVDSSxpQkFBZ0IsS0FBS0YsU0FBUSxLQUFLRixXQUFVLElBRW5EO0FBQ0UsVUFBQUksaUJBQWdCLFFBQVEsYUFBYUosT0FBTSxJQUFJRSxLQUFJLElBQUk7QUFDdkQsVUFBQUEsUUFBTztBQUNQLFVBQUFGLFVBQVM7QUFBQSxRQUNiO0FBSUEsYUFBSyxlQUFlSSxnQkFBZTtBQUVuQyxRQUFBRCxXQUFVLFNBQVNDLGdCQUFlLEdBQUk7QUFDdEMsYUFBSyxVQUFVRCxXQUFVO0FBRXpCLFFBQUFULFdBQVUsU0FBU1MsV0FBVSxFQUFFO0FBQy9CLGFBQUssVUFBVVQsV0FBVTtBQUV6QixRQUFBRCxTQUFRLFNBQVNDLFdBQVUsRUFBRTtBQUM3QixhQUFLLFFBQVFELFNBQVE7QUFFckIsUUFBQVMsU0FBUSxTQUFTVCxTQUFRLEVBQUU7QUFHM0IseUJBQWlCLFNBQVMsYUFBYVMsS0FBSSxDQUFDO0FBQzVDLFFBQUFGLFdBQVU7QUFDVixRQUFBRSxTQUFRLFFBQVEsYUFBYSxjQUFjLENBQUM7QUFHNUMsUUFBQUgsU0FBUSxTQUFTQyxVQUFTLEVBQUU7QUFDNUIsUUFBQUEsV0FBVTtBQUVWLGFBQUssT0FBT0U7QUFDWixhQUFLLFNBQVNGO0FBQ2QsYUFBSyxRQUFRRDtBQUViLGVBQU87QUFBQSxNQUNYO0FBRUEsZUFBUyxhQUFhRyxPQUFNO0FBR3hCLGVBQVFBLFFBQU8sT0FBUTtBQUFBLE1BQzNCO0FBRUEsZUFBUyxhQUFhRixTQUFRO0FBRTFCLGVBQVFBLFVBQVMsU0FBVTtBQUFBLE1BQy9CO0FBRUEsZUFBUyxHQUFHLE9BQU87QUFDZixZQUFJLENBQUMsS0FBSyxRQUFRLEdBQUc7QUFDakIsaUJBQU87QUFBQSxRQUNYO0FBQ0EsWUFBSUUsT0FDQUYsU0FDQUksZ0JBQWUsS0FBSztBQUV4QixnQkFBUSxlQUFlLEtBQUs7QUFFNUIsWUFBSSxVQUFVLFdBQVcsVUFBVSxhQUFhLFVBQVUsUUFBUTtBQUM5RCxVQUFBRixRQUFPLEtBQUssUUFBUUUsZ0JBQWU7QUFDbkMsVUFBQUosVUFBUyxLQUFLLFVBQVUsYUFBYUUsS0FBSTtBQUN6QyxrQkFBUSxPQUFPO0FBQUEsWUFDWCxLQUFLO0FBQ0QscUJBQU9GO0FBQUEsWUFDWCxLQUFLO0FBQ0QscUJBQU9BLFVBQVM7QUFBQSxZQUNwQixLQUFLO0FBQ0QscUJBQU9BLFVBQVM7QUFBQSxVQUN4QjtBQUFBLFFBQ0osT0FBTztBQUVILFVBQUFFLFFBQU8sS0FBSyxRQUFRLEtBQUssTUFBTSxhQUFhLEtBQUssT0FBTyxDQUFDO0FBQ3pELGtCQUFRLE9BQU87QUFBQSxZQUNYLEtBQUs7QUFDRCxxQkFBT0EsUUFBTyxJQUFJRSxnQkFBZTtBQUFBLFlBQ3JDLEtBQUs7QUFDRCxxQkFBT0YsUUFBT0UsZ0JBQWU7QUFBQSxZQUNqQyxLQUFLO0FBQ0QscUJBQU9GLFFBQU8sS0FBS0UsZ0JBQWU7QUFBQSxZQUN0QyxLQUFLO0FBQ0QscUJBQU9GLFFBQU8sT0FBT0UsZ0JBQWU7QUFBQSxZQUN4QyxLQUFLO0FBQ0QscUJBQU9GLFFBQU8sUUFBUUUsZ0JBQWU7QUFBQSxZQUV6QyxLQUFLO0FBQ0QscUJBQU8sS0FBSyxNQUFNRixRQUFPLEtBQUssSUFBSUU7QUFBQSxZQUN0QztBQUNJLG9CQUFNLElBQUksTUFBTSxrQkFBa0IsS0FBSztBQUFBLFVBQy9DO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFFQSxlQUFTLE9BQU8sT0FBTztBQUNuQixlQUFPLFdBQVk7QUFDZixpQkFBTyxLQUFLLEdBQUcsS0FBSztBQUFBLFFBQ3hCO0FBQUEsTUFDSjtBQUVBLFVBQUksaUJBQWlCLE9BQU8sSUFBSSxHQUM1QixZQUFZLE9BQU8sR0FBRyxHQUN0QixZQUFZLE9BQU8sR0FBRyxHQUN0QixVQUFVLE9BQU8sR0FBRyxHQUNwQixTQUFTLE9BQU8sR0FBRyxHQUNuQixVQUFVLE9BQU8sR0FBRyxHQUNwQixXQUFXLE9BQU8sR0FBRyxHQUNyQixhQUFhLE9BQU8sR0FBRyxHQUN2QixVQUFVLE9BQU8sR0FBRyxHQUNwQixZQUFZO0FBRWhCLGVBQVMsVUFBVTtBQUNmLGVBQU8sZUFBZSxJQUFJO0FBQUEsTUFDOUI7QUFFQSxlQUFTLE1BQU0sT0FBTztBQUNsQixnQkFBUSxlQUFlLEtBQUs7QUFDNUIsZUFBTyxLQUFLLFFBQVEsSUFBSSxLQUFLLFFBQVEsR0FBRyxFQUFFLElBQUk7QUFBQSxNQUNsRDtBQUVBLGVBQVMsV0FBVyxNQUFNO0FBQ3RCLGVBQU8sV0FBWTtBQUNmLGlCQUFPLEtBQUssUUFBUSxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUk7QUFBQSxRQUMvQztBQUFBLE1BQ0o7QUFFQSxVQUFJLGVBQWUsV0FBVyxjQUFjLEdBQ3hDLFVBQVUsV0FBVyxTQUFTLEdBQzlCLFVBQVUsV0FBVyxTQUFTLEdBQzlCLFFBQVEsV0FBVyxPQUFPLEdBQzFCLE9BQU8sV0FBVyxNQUFNLEdBQ3hCLFNBQVMsV0FBVyxRQUFRLEdBQzVCLFFBQVEsV0FBVyxPQUFPO0FBRTlCLGVBQVMsUUFBUTtBQUNiLGVBQU8sU0FBUyxLQUFLLEtBQUssSUFBSSxDQUFDO0FBQUEsTUFDbkM7QUFFQSxVQUFJRyxTQUFRLEtBQUssT0FDYixhQUFhO0FBQUEsUUFDVCxJQUFJO0FBQUE7QUFBQSxRQUNKLEdBQUc7QUFBQTtBQUFBLFFBQ0gsR0FBRztBQUFBO0FBQUEsUUFDSCxHQUFHO0FBQUE7QUFBQSxRQUNILEdBQUc7QUFBQTtBQUFBLFFBQ0gsR0FBRztBQUFBO0FBQUEsUUFDSCxHQUFHO0FBQUE7QUFBQSxNQUNQO0FBR0osZUFBUyxrQkFBa0IsUUFBUSxRQUFRLGVBQWUsVUFBVTVCLFNBQVE7QUFDeEUsZUFBT0EsUUFBTyxhQUFhLFVBQVUsR0FBRyxDQUFDLENBQUMsZUFBZSxRQUFRLFFBQVE7QUFBQSxNQUM3RTtBQUVBLGVBQVMsZUFBZSxnQkFBZ0IsZUFBZTZCLGFBQVk3QixTQUFRO0FBQ3ZFLFlBQUksV0FBVyxlQUFlLGNBQWMsRUFBRSxJQUFJLEdBQzlDd0IsV0FBVUksT0FBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEdBQ2hDYixXQUFVYSxPQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsR0FDaENkLFNBQVFjLE9BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxHQUM5QkwsUUFBT0ssT0FBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEdBQzdCUCxVQUFTTyxPQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsR0FDL0JOLFNBQVFNLE9BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxHQUM5QlIsU0FBUVEsT0FBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEdBQzlCLElBQ0tKLFlBQVdLLFlBQVcsTUFBTSxDQUFDLEtBQUtMLFFBQU8sS0FDekNBLFdBQVVLLFlBQVcsS0FBSyxDQUFDLE1BQU1MLFFBQU8sS0FDeENULFlBQVcsS0FBSyxDQUFDLEdBQUcsS0FDcEJBLFdBQVVjLFlBQVcsS0FBSyxDQUFDLE1BQU1kLFFBQU8sS0FDeENELFVBQVMsS0FBSyxDQUFDLEdBQUcsS0FDbEJBLFNBQVFlLFlBQVcsS0FBSyxDQUFDLE1BQU1mLE1BQUssS0FDcENTLFNBQVEsS0FBSyxDQUFDLEdBQUcsS0FDakJBLFFBQU9NLFlBQVcsS0FBSyxDQUFDLE1BQU1OLEtBQUk7QUFFM0MsWUFBSU0sWUFBVyxLQUFLLE1BQU07QUFDdEIsY0FDSSxLQUNDUCxVQUFTLEtBQUssQ0FBQyxHQUFHLEtBQ2xCQSxTQUFRTyxZQUFXLEtBQUssQ0FBQyxNQUFNUCxNQUFLO0FBQUEsUUFDN0M7QUFDQSxZQUFJLEtBQ0NELFdBQVUsS0FBSyxDQUFDLEdBQUcsS0FDbkJBLFVBQVNRLFlBQVcsS0FBSyxDQUFDLE1BQU1SLE9BQU0sS0FDdENELFVBQVMsS0FBSyxDQUFDLEdBQUcsS0FBTSxDQUFDLE1BQU1BLE1BQUs7QUFFekMsVUFBRSxDQUFDLElBQUk7QUFDUCxVQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQjtBQUN6QixVQUFFLENBQUMsSUFBSXBCO0FBQ1AsZUFBTyxrQkFBa0IsTUFBTSxNQUFNLENBQUM7QUFBQSxNQUMxQztBQUdBLGVBQVMsMkJBQTJCLGtCQUFrQjtBQUNsRCxZQUFJLHFCQUFxQixRQUFXO0FBQ2hDLGlCQUFPNEI7QUFBQSxRQUNYO0FBQ0EsWUFBSSxPQUFPLHFCQUFxQixZQUFZO0FBQ3hDLFVBQUFBLFNBQVE7QUFDUixpQkFBTztBQUFBLFFBQ1g7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUdBLGVBQVMsNEJBQTRCLFdBQVcsT0FBTztBQUNuRCxZQUFJLFdBQVcsU0FBUyxNQUFNLFFBQVc7QUFDckMsaUJBQU87QUFBQSxRQUNYO0FBQ0EsWUFBSSxVQUFVLFFBQVc7QUFDckIsaUJBQU8sV0FBVyxTQUFTO0FBQUEsUUFDL0I7QUFDQSxtQkFBVyxTQUFTLElBQUk7QUFDeEIsWUFBSSxjQUFjLEtBQUs7QUFDbkIscUJBQVcsS0FBSyxRQUFRO0FBQUEsUUFDNUI7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUVBLGVBQVMsU0FBUyxlQUFlLGVBQWU7QUFDNUMsWUFBSSxDQUFDLEtBQUssUUFBUSxHQUFHO0FBQ2pCLGlCQUFPLEtBQUssV0FBVyxFQUFFLFlBQVk7QUFBQSxRQUN6QztBQUVBLFlBQUksYUFBYSxPQUNiLEtBQUssWUFDTDVCLFNBQ0E7QUFFSixZQUFJLE9BQU8sa0JBQWtCLFVBQVU7QUFDbkMsMEJBQWdCO0FBQ2hCLDBCQUFnQjtBQUFBLFFBQ3BCO0FBQ0EsWUFBSSxPQUFPLGtCQUFrQixXQUFXO0FBQ3BDLHVCQUFhO0FBQUEsUUFDakI7QUFDQSxZQUFJLE9BQU8sa0JBQWtCLFVBQVU7QUFDbkMsZUFBSyxPQUFPLE9BQU8sQ0FBQyxHQUFHLFlBQVksYUFBYTtBQUNoRCxjQUFJLGNBQWMsS0FBSyxRQUFRLGNBQWMsTUFBTSxNQUFNO0FBQ3JELGVBQUcsS0FBSyxjQUFjLElBQUk7QUFBQSxVQUM5QjtBQUFBLFFBQ0o7QUFFQSxRQUFBQSxVQUFTLEtBQUssV0FBVztBQUN6QixpQkFBUyxlQUFlLE1BQU0sQ0FBQyxZQUFZLElBQUlBLE9BQU07QUFFckQsWUFBSSxZQUFZO0FBQ1osbUJBQVNBLFFBQU8sV0FBVyxDQUFDLE1BQU0sTUFBTTtBQUFBLFFBQzVDO0FBRUEsZUFBT0EsUUFBTyxXQUFXLE1BQU07QUFBQSxNQUNuQztBQUVBLFVBQUksUUFBUSxLQUFLO0FBRWpCLGVBQVNPLE1BQUssR0FBRztBQUNiLGdCQUFRLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQztBQUFBLE1BQ2pDO0FBRUEsZUFBUyxnQkFBZ0I7QUFRckIsWUFBSSxDQUFDLEtBQUssUUFBUSxHQUFHO0FBQ2pCLGlCQUFPLEtBQUssV0FBVyxFQUFFLFlBQVk7QUFBQSxRQUN6QztBQUVBLFlBQUlpQixXQUFVLE1BQU0sS0FBSyxhQUFhLElBQUksS0FDdENELFFBQU8sTUFBTSxLQUFLLEtBQUssR0FDdkJGLFVBQVMsTUFBTSxLQUFLLE9BQU8sR0FDM0JOLFVBQ0FELFFBQ0FNLFFBQ0EsR0FDQSxRQUFRLEtBQUssVUFBVSxHQUN2QixXQUNBLFFBQ0EsVUFDQTtBQUVKLFlBQUksQ0FBQyxPQUFPO0FBR1IsaUJBQU87QUFBQSxRQUNYO0FBR0EsUUFBQUwsV0FBVSxTQUFTUyxXQUFVLEVBQUU7QUFDL0IsUUFBQVYsU0FBUSxTQUFTQyxXQUFVLEVBQUU7QUFDN0IsUUFBQVMsWUFBVztBQUNYLFFBQUFULFlBQVc7QUFHWCxRQUFBSyxTQUFRLFNBQVNDLFVBQVMsRUFBRTtBQUM1QixRQUFBQSxXQUFVO0FBR1YsWUFBSUcsV0FBVUEsU0FBUSxRQUFRLENBQUMsRUFBRSxRQUFRLFVBQVUsRUFBRSxJQUFJO0FBRXpELG9CQUFZLFFBQVEsSUFBSSxNQUFNO0FBQzlCLGlCQUFTakIsTUFBSyxLQUFLLE9BQU8sTUFBTUEsTUFBSyxLQUFLLElBQUksTUFBTTtBQUNwRCxtQkFBV0EsTUFBSyxLQUFLLEtBQUssTUFBTUEsTUFBSyxLQUFLLElBQUksTUFBTTtBQUNwRCxrQkFBVUEsTUFBSyxLQUFLLGFBQWEsTUFBTUEsTUFBSyxLQUFLLElBQUksTUFBTTtBQUUzRCxlQUNJLFlBQ0EsT0FDQ2EsU0FBUSxTQUFTQSxTQUFRLE1BQU0sT0FDL0JDLFVBQVMsU0FBU0EsVUFBUyxNQUFNLE9BQ2pDRSxRQUFPLFdBQVdBLFFBQU8sTUFBTSxPQUMvQlQsVUFBU0MsWUFBV1MsV0FBVSxNQUFNLE9BQ3BDVixTQUFRLFVBQVVBLFNBQVEsTUFBTSxPQUNoQ0MsV0FBVSxVQUFVQSxXQUFVLE1BQU0sT0FDcENTLFdBQVUsVUFBVSxJQUFJLE1BQU07QUFBQSxNQUV2QztBQUVBLFVBQUksVUFBVSxTQUFTO0FBRXZCLGNBQVEsVUFBVTtBQUNsQixjQUFRLE1BQU07QUFDZCxjQUFRLE1BQU07QUFDZCxjQUFRLFdBQVc7QUFDbkIsY0FBUSxLQUFLO0FBQ2IsY0FBUSxpQkFBaUI7QUFDekIsY0FBUSxZQUFZO0FBQ3BCLGNBQVEsWUFBWTtBQUNwQixjQUFRLFVBQVU7QUFDbEIsY0FBUSxTQUFTO0FBQ2pCLGNBQVEsVUFBVTtBQUNsQixjQUFRLFdBQVc7QUFDbkIsY0FBUSxhQUFhO0FBQ3JCLGNBQVEsVUFBVTtBQUNsQixjQUFRLFVBQVU7QUFDbEIsY0FBUSxVQUFVO0FBQ2xCLGNBQVEsUUFBUTtBQUNoQixjQUFRLE1BQU07QUFDZCxjQUFRLGVBQWU7QUFDdkIsY0FBUSxVQUFVO0FBQ2xCLGNBQVEsVUFBVTtBQUNsQixjQUFRLFFBQVE7QUFDaEIsY0FBUSxPQUFPO0FBQ2YsY0FBUSxRQUFRO0FBQ2hCLGNBQVEsU0FBUztBQUNqQixjQUFRLFFBQVE7QUFDaEIsY0FBUSxXQUFXO0FBQ25CLGNBQVEsY0FBYztBQUN0QixjQUFRLFdBQVc7QUFDbkIsY0FBUSxTQUFTO0FBQ2pCLGNBQVEsU0FBU3hCO0FBQ2pCLGNBQVEsYUFBYTtBQUVyQixjQUFRLGNBQWM7QUFBQSxRQUNsQjtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQ0EsY0FBUSxPQUFPO0FBSWYscUJBQWUsS0FBSyxHQUFHLEdBQUcsTUFBTTtBQUNoQyxxQkFBZSxLQUFLLEdBQUcsR0FBRyxTQUFTO0FBSW5DLG9CQUFjLEtBQUssV0FBVztBQUM5QixvQkFBYyxLQUFLLGNBQWM7QUFDakMsb0JBQWMsS0FBSyxTQUFVLE9BQU8sT0FBTyxRQUFRO0FBQy9DLGVBQU8sS0FBSyxJQUFJLEtBQUssV0FBVyxLQUFLLElBQUksR0FBSTtBQUFBLE1BQ2pELENBQUM7QUFDRCxvQkFBYyxLQUFLLFNBQVUsT0FBTyxPQUFPLFFBQVE7QUFDL0MsZUFBTyxLQUFLLElBQUksS0FBSyxNQUFNLEtBQUssQ0FBQztBQUFBLE1BQ3JDLENBQUM7QUFJRCxZQUFNLFVBQVU7QUFFaEIsc0JBQWdCLFdBQVc7QUFFM0IsWUFBTSxLQUFLO0FBQ1gsWUFBTSxNQUFNO0FBQ1osWUFBTSxNQUFNO0FBQ1osWUFBTSxNQUFNO0FBQ1osWUFBTSxNQUFNO0FBQ1osWUFBTSxPQUFPO0FBQ2IsWUFBTSxTQUFTO0FBQ2YsWUFBTSxTQUFTO0FBQ2YsWUFBTSxTQUFTO0FBQ2YsWUFBTSxVQUFVO0FBQ2hCLFlBQU0sV0FBVztBQUNqQixZQUFNLFdBQVc7QUFDakIsWUFBTSxXQUFXO0FBQ2pCLFlBQU0sWUFBWTtBQUNsQixZQUFNLGFBQWE7QUFDbkIsWUFBTSxhQUFhO0FBQ25CLFlBQU0sY0FBYztBQUNwQixZQUFNLGNBQWM7QUFDcEIsWUFBTSxlQUFlO0FBQ3JCLFlBQU0sZUFBZTtBQUNyQixZQUFNLFVBQVU7QUFDaEIsWUFBTSxnQkFBZ0I7QUFDdEIsWUFBTSxpQkFBaUI7QUFDdkIsWUFBTSx1QkFBdUI7QUFDN0IsWUFBTSx3QkFBd0I7QUFDOUIsWUFBTSxpQkFBaUI7QUFDdkIsWUFBTSxZQUFZO0FBR2xCLFlBQU0sWUFBWTtBQUFBLFFBQ2QsZ0JBQWdCO0FBQUE7QUFBQSxRQUNoQix3QkFBd0I7QUFBQTtBQUFBLFFBQ3hCLG1CQUFtQjtBQUFBO0FBQUEsUUFDbkIsTUFBTTtBQUFBO0FBQUEsUUFDTixNQUFNO0FBQUE7QUFBQSxRQUNOLGNBQWM7QUFBQTtBQUFBLFFBQ2QsU0FBUztBQUFBO0FBQUEsUUFDVCxNQUFNO0FBQUE7QUFBQSxRQUNOLE9BQU87QUFBQTtBQUFBLE1BQ1g7QUFFQSxhQUFPO0FBQUEsSUFFWCxDQUFFO0FBQUE7QUFBQTs7O0FDdmpMRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQThCLG9CQUFtRjtBQUNuRixZQUF1Qjs7O0FDRHZCLElBQUFDLG1CQUFpRTs7O0FDRWpFLHNCQUF1Qjs7O0FDQXZCLElBQU8sYUFBUSxDQUFDOzs7QUNBaEIsSUFBTyxhQUFRO0FBQUE7QUFBQSxFQUVYLE9BQU87QUFBQSxFQUNQLFdBQVc7QUFBQSxFQUNYLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLFdBQVc7QUFBQSxFQUNYLHFCQUFxQjtBQUFBLEVBQ3JCLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLGFBQWE7QUFBQSxFQUNiLHFCQUFxQjtBQUFBLEVBQ3JCLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFVBQVU7QUFBQSxFQUNWLHdCQUF3QjtBQUFBLEVBQ3hCLDRCQUE0QjtBQUFBLEVBQzVCLHFCQUFxQjtBQUFBO0FBQUEsRUFHckIsc0JBQXNCO0FBQUEsRUFDdEIsY0FBYztBQUFBLEVBQ2QsdUJBQXVCO0FBQUEsRUFDdkIsdUJBQXVCO0FBQUEsRUFDdkIsdUJBQXVCO0FBQUEsRUFDdkIsc0JBQXNCO0FBQUEsRUFDdEIsc0JBQXNCO0FBQUEsRUFDdEIsc0JBQXNCO0FBQUEsRUFDdEIsZ0JBQWdCO0FBQUEsRUFDaEIsa0JBQWtCO0FBQUEsRUFDbEIsc0JBQXNCO0FBQUEsRUFDdEIsb0JBQW9CO0FBQUEsRUFDcEIsWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBLEVBQ1osaUJBQWlCO0FBQUEsRUFDakIsd0JBQXdCO0FBQUEsRUFDeEIsaUJBQWlCO0FBQUEsRUFDakIsbUJBQW1CO0FBQUEsRUFDbkIsZ0JBQWdCO0FBQUEsRUFDaEIsZUFBZTtBQUFBO0FBQUEsRUFHZixjQUFjO0FBQUEsRUFDZCxnQkFBZ0I7QUFBQSxFQUNoQixlQUFlO0FBQUEsRUFDZixxQkFBcUI7QUFBQSxFQUNyQix1QkFBdUI7QUFBQSxFQUN2QixzQkFBc0I7QUFBQTtBQUFBLEVBR3RCLGlCQUFpQjtBQUFBLEVBQ2pCLFlBQVk7QUFBQSxFQUNaLG1CQUFtQjtBQUFBLEVBQ25CLHdCQUNJO0FBQUEsRUFDSixZQUFZO0FBQUEsRUFDWixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUNyQixnQkFBZ0I7QUFBQSxFQUNoQixxQkFBcUI7QUFBQSxFQUNyQiwwQkFBMEI7QUFBQSxFQUMxQiwrQkFBK0I7QUFBQSxFQUMvQiw0QkFBNEI7QUFBQSxFQUM1QixpQ0FBaUM7QUFBQSxFQUNqQyw2QkFBNkI7QUFBQSxFQUM3QixrQ0FDSTtBQUFBLEVBQ0osbUJBQW1CO0FBQUEsRUFDbkIsd0JBQXdCO0FBQUEsRUFDeEIsMkJBQTJCO0FBQUEsRUFDM0IsOEJBQ0k7QUFBQSxFQUNKLGVBQWU7QUFBQSxFQUNmLDBCQUEwQjtBQUFBLEVBQzFCLHNCQUFzQjtBQUFBLEVBQ3RCLCtCQUErQjtBQUFBLEVBQy9CLHdDQUF3QztBQUFBLEVBQ3hDLHdDQUF3QztBQUFBLEVBQ3hDLG9DQUFvQztBQUFBLEVBQ3BDLG9DQUFvQztBQUFBLEVBQ3BDLHdDQUF3QztBQUFBLEVBQ3hDLG1CQUFtQjtBQUFBLEVBQ25CLGlEQUNJO0FBQUEsRUFDSiw2Q0FDSTtBQUFBLEVBQ0osd0NBQXdDO0FBQUEsRUFDeEMscUJBQXFCO0FBQUEsRUFDckIsOEJBQThCO0FBQUEsRUFDOUIsNkJBQTZCO0FBQUEsRUFDN0Isa0NBQWtDO0FBQUEsRUFDbEMsd0JBQXdCO0FBQUEsRUFDeEIsaUNBQ0k7QUFBQSxFQUNKLGlDQUFpQztBQUFBLEVBQ2pDLDJCQUEyQjtBQUFBLEVBQzNCLG9DQUFvQztBQUFBLEVBQ3BDLE9BQU87QUFBQSxFQUNQLHdCQUF3QjtBQUFBLEVBQ3hCLGdCQUFnQjtBQUFBLEVBQ2hCLHFCQUFxQjtBQUFBLEVBQ3JCLGtCQUFrQjtBQUFBLEVBQ2xCLHVCQUF1QjtBQUFBLEVBQ3ZCLGdCQUFnQjtBQUFBLEVBQ2hCLGtDQUNJO0FBQUEsRUFDSix1Q0FDSTtBQUFBLEVBQ0oseUJBQXlCO0FBQUEsRUFDekIsYUFBYTtBQUFBLEVBQ2Isc0JBQXNCO0FBQUEsRUFDdEIsZ0JBQWdCO0FBQUEsRUFDaEIsbUNBQ0k7QUFBQSxFQUNKLHdDQUNJO0FBQUEsRUFDSixXQUFXO0FBQUEsRUFDWCxzQkFDSTtBQUFBLEVBQ0osV0FBVztBQUFBLEVBQ1gsZ0JBQWdCO0FBQUEsRUFDaEIsdUJBQXVCO0FBQUEsRUFDdkIsdUJBQXVCO0FBQUEsRUFDdkIsNEJBQTRCO0FBQUEsRUFDNUIsWUFBWTtBQUFBLEVBQ1osaUJBQ0k7QUFBQSxFQUNKLHdCQUF3QjtBQUFBLEVBQ3hCLGNBQWM7QUFBQSxFQUNkLG1CQUFtQjtBQUFBLEVBQ25CLDBCQUEwQjtBQUFBLEVBQzFCLGtCQUFrQjtBQUFBLEVBQ2xCLHVCQUF1QjtBQUFBLEVBQ3ZCLFNBQVM7QUFBQSxFQUNULG9CQUFvQjtBQUFBO0FBQUEsRUFHcEIsb0JBQW9CO0FBQUEsRUFDcEIsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsV0FBVztBQUFBLEVBQ1gsT0FBTztBQUFBLEVBQ1AsVUFBVTtBQUFBO0FBQUEsRUFHVixhQUFhO0FBQUEsRUFDYixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxNQUFNO0FBQUEsRUFDTixVQUFVO0FBQUEsRUFDVixVQUFVO0FBQUEsRUFDVixlQUFlO0FBQUEsRUFDZixXQUFXO0FBQUEsRUFDWCxNQUFNO0FBQUEsRUFDTixpQkFBaUI7QUFBQSxFQUNqQixpQkFBaUI7QUFBQSxFQUNqQixXQUFXO0FBQUEsRUFDWCxnQkFBZ0I7QUFBQSxFQUNoQixPQUFPO0FBQUEsRUFDUCxtQkFBbUI7QUFBQSxFQUNuQixPQUFPO0FBQUEsRUFDUCxlQUFlO0FBQUEsRUFDZixZQUFZO0FBQUEsRUFDWixpQkFBaUI7QUFBQSxFQUNqQixlQUFlO0FBQUEsRUFDZixpQkFBaUI7QUFBQSxFQUNqQixrQkFBa0I7QUFBQSxFQUNsQixvQkFBb0I7QUFDeEI7OztBQy9LQSxJQUFPLGFBQVE7QUFBQTtBQUFBLEVBRVgsT0FBTztBQUFBLEVBQ1AsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gscUJBQXFCO0FBQUEsRUFDckIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sYUFBYTtBQUFBLEVBQ2IscUJBQXFCO0FBQUEsRUFDckIsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1Ysd0JBQXdCO0FBQUEsRUFDeEIsNEJBQTRCO0FBQUEsRUFDNUIscUJBQXFCO0FBQUE7QUFBQSxFQUdyQixzQkFBc0I7QUFBQSxFQUN0QixjQUFjO0FBQUEsRUFDZCx1QkFBdUI7QUFBQSxFQUN2Qix1QkFBdUI7QUFBQSxFQUN2Qix1QkFBdUI7QUFBQSxFQUN2QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixrQkFBa0I7QUFBQSxFQUNsQixnQkFBZ0I7QUFBQSxFQUNoQixzQkFBc0I7QUFBQSxFQUN0QixvQkFBb0I7QUFBQSxFQUNwQixZQUFZO0FBQUEsRUFDWixZQUFZO0FBQUEsRUFDWixpQkFBaUI7QUFBQSxFQUNqQix3QkFBd0I7QUFBQSxFQUN4QixpQkFBaUI7QUFBQSxFQUNqQixtQkFBbUI7QUFBQSxFQUNuQixnQkFBZ0I7QUFBQSxFQUNoQixlQUFlO0FBQUE7QUFBQSxFQUdmLGNBQWM7QUFBQSxFQUNkLGdCQUFnQjtBQUFBLEVBQ2hCLGVBQWU7QUFBQSxFQUNmLHFCQUFxQjtBQUFBLEVBQ3JCLHVCQUF1QjtBQUFBLEVBQ3ZCLHNCQUFzQjtBQUFBO0FBQUEsRUFHdEIsaUJBQWlCO0FBQUEsRUFDakIsWUFBWTtBQUFBLEVBQ1osbUJBQW1CO0FBQUEsRUFDbkIsd0JBQ0k7QUFBQSxFQUNKLFlBQVk7QUFBQSxFQUNaLHNCQUFzQjtBQUFBLEVBQ3RCLHNCQUFzQjtBQUFBLEVBQ3RCLHNCQUFzQjtBQUFBLEVBQ3RCLHFCQUFxQjtBQUFBLEVBQ3JCLHFCQUFxQjtBQUFBLEVBQ3JCLHFCQUFxQjtBQUFBLEVBQ3JCLGdCQUFnQjtBQUFBLEVBQ2hCLHFCQUNJO0FBQUEsRUFDSiwwQkFBMEI7QUFBQSxFQUMxQiwrQkFBK0I7QUFBQSxFQUMvQiw0QkFDSTtBQUFBLEVBQ0osaUNBQ0k7QUFBQSxFQUNKLDZCQUE2QjtBQUFBLEVBQzdCLGtDQUNJO0FBQUEsRUFDSixtQkFBbUI7QUFBQSxFQUNuQix3QkFBd0I7QUFBQSxFQUN4QiwyQkFBMkI7QUFBQSxFQUMzQiw4QkFDSTtBQUFBLEVBQ0osZUFBZTtBQUFBLEVBQ2YsMEJBQTBCO0FBQUEsRUFDMUIsc0JBQXNCO0FBQUEsRUFDdEIsK0JBQStCO0FBQUEsRUFDL0Isd0NBQXdDO0FBQUEsRUFDeEMsd0NBQXdDO0FBQUEsRUFDeEMsb0NBQW9DO0FBQUEsRUFDcEMsb0NBQW9DO0FBQUEsRUFDcEMsd0NBQXdDO0FBQUEsRUFDeEMsbUJBQW1CO0FBQUEsRUFDbkIsaURBQ0k7QUFBQSxFQUNKLDZDQUNJO0FBQUEsRUFDSix3Q0FBd0M7QUFBQSxFQUN4QyxxQkFBcUI7QUFBQSxFQUNyQiw4QkFBOEI7QUFBQSxFQUM5Qiw2QkFBNkI7QUFBQSxFQUM3QixrQ0FBa0M7QUFBQSxFQUNsQyx3QkFBd0I7QUFBQSxFQUN4QixpQ0FDSTtBQUFBLEVBQ0osaUNBQWlDO0FBQUEsRUFDakMsMkJBQTJCO0FBQUEsRUFDM0Isb0NBQW9DO0FBQUEsRUFDcEMsT0FBTztBQUFBLEVBQ1Asd0JBQXdCO0FBQUEsRUFDeEIsZ0JBQWdCO0FBQUEsRUFDaEIscUJBQ0k7QUFBQSxFQUNKLGtCQUFrQjtBQUFBLEVBQ2xCLHVCQUF1QjtBQUFBLEVBQ3ZCLGdCQUFnQjtBQUFBLEVBQ2hCLGtDQUNJO0FBQUEsRUFDSix1Q0FDSTtBQUFBLEVBQ0oseUJBQXlCO0FBQUEsRUFDekIsYUFBYTtBQUFBLEVBQ2Isc0JBQXNCO0FBQUEsRUFDdEIsZ0JBQWdCO0FBQUEsRUFDaEIsbUNBQ0k7QUFBQSxFQUNKLHdDQUNJO0FBQUEsRUFDSixXQUFXO0FBQUEsRUFDWCxzQkFBc0I7QUFBQSxFQUN0QixXQUFXO0FBQUEsRUFDWCxnQkFBZ0I7QUFBQSxFQUNoQix1QkFBdUI7QUFBQSxFQUN2Qix1QkFBdUI7QUFBQSxFQUN2Qiw0QkFBNEI7QUFBQSxFQUM1QixZQUFZO0FBQUEsRUFDWixpQkFDSTtBQUFBLEVBQ0osd0JBQXdCO0FBQUEsRUFDeEIsY0FBYztBQUFBLEVBQ2QsbUJBQW1CO0FBQUEsRUFDbkIsMEJBQTBCO0FBQUEsRUFDMUIsa0JBQWtCO0FBQUEsRUFDbEIsdUJBQ0k7QUFBQSxFQUNKLFNBQVM7QUFBQSxFQUNULG9CQUFvQjtBQUFBO0FBQUEsRUFHcEIsb0JBQW9CO0FBQUEsRUFDcEIsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsV0FBVztBQUFBLEVBQ1gsT0FBTztBQUFBLEVBQ1AsVUFBVTtBQUFBO0FBQUEsRUFHVixhQUFhO0FBQUEsRUFDYixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxNQUFNO0FBQUEsRUFDTixVQUFVO0FBQUEsRUFDVixVQUFVO0FBQUEsRUFDVixlQUFlO0FBQUEsRUFDZixXQUFXO0FBQUEsRUFDWCxNQUFNO0FBQUEsRUFDTixpQkFBaUI7QUFBQSxFQUNqQixpQkFBaUI7QUFBQSxFQUNqQixXQUFXO0FBQUEsRUFDWCxnQkFBZ0I7QUFBQSxFQUNoQixPQUFPO0FBQUEsRUFDUCxtQkFBbUI7QUFBQSxFQUNuQixPQUFPO0FBQUEsRUFDUCxlQUFlO0FBQUEsRUFDZixZQUFZO0FBQUEsRUFDWixpQkFBaUI7QUFBQSxFQUNqQixlQUFlO0FBQUEsRUFDZixpQkFBaUI7QUFBQSxFQUNqQixrQkFBa0I7QUFBQSxFQUNsQixvQkFBb0I7QUFDeEI7OztBQ25MQSxJQUFPLGFBQVEsQ0FBQzs7O0FDQWhCLElBQU8sYUFBUSxDQUFDOzs7QUNHaEIsSUFBTyxhQUFRO0FBQUE7QUFBQSxFQUVYLE9BQU87QUFBQSxFQUNQLFdBQVc7QUFBQSxFQUNYLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLFdBQVc7QUFBQSxFQUNYLHFCQUFxQjtBQUFBLEVBQ3JCLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLGFBQWE7QUFBQSxFQUNiLHFCQUFxQjtBQUFBLEVBQ3JCLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFVBQVU7QUFBQSxFQUNWLHdCQUF3QjtBQUFBLEVBQ3hCLDRCQUE0QjtBQUFBLEVBQzVCLHFCQUFxQjtBQUFBO0FBQUEsRUFHckIsc0JBQXNCO0FBQUEsRUFDdEIsY0FBYztBQUFBLEVBQ2QsdUJBQXVCO0FBQUEsRUFDdkIsdUJBQXVCO0FBQUEsRUFDdkIsdUJBQXVCO0FBQUEsRUFDdkIsc0JBQXNCO0FBQUEsRUFDdEIsc0JBQXNCO0FBQUEsRUFDdEIsc0JBQXNCO0FBQUEsRUFDdEIsa0JBQWtCO0FBQUEsRUFDbEIsZ0JBQWdCO0FBQUEsRUFDaEIsc0JBQXNCO0FBQUEsRUFDdEIsb0JBQW9CO0FBQUEsRUFDcEIsWUFBWTtBQUFBLEVBQ1osWUFDSTtBQUFBLEVBQ0osaUJBQWlCO0FBQUEsRUFDakIsd0JBQ0k7QUFBQSxFQUNKLGlCQUNJO0FBQUEsRUFDSixtQkFBbUI7QUFBQSxFQUNuQixnQkFBZ0I7QUFBQSxFQUNoQixlQUFlO0FBQUE7QUFBQSxFQUdmLGNBQWM7QUFBQSxFQUNkLGdCQUFnQjtBQUFBLEVBQ2hCLGVBQWU7QUFBQSxFQUNmLHFCQUFxQjtBQUFBLEVBQ3JCLHVCQUF1QjtBQUFBLEVBQ3ZCLHNCQUFzQjtBQUFBO0FBQUEsRUFHdEIsaUJBQWlCO0FBQUEsRUFDakIsWUFBWTtBQUFBLEVBQ1osbUJBQW1CO0FBQUEsRUFDbkIsd0JBQ0k7QUFBQSxFQUNKLFlBQVk7QUFBQSxFQUNaLHNCQUFzQjtBQUFBLEVBQ3RCLHNCQUFzQjtBQUFBLEVBQ3RCLHNCQUFzQjtBQUFBLEVBQ3RCLHFCQUFxQjtBQUFBLEVBQ3JCLHFCQUFxQjtBQUFBLEVBQ3JCLHFCQUFxQjtBQUFBLEVBQ3JCLGdCQUFnQjtBQUFBLEVBQ2hCLHFCQUNJO0FBQUEsRUFDSiwwQkFBMEI7QUFBQSxFQUMxQiwrQkFBK0I7QUFBQSxFQUMvQiw0QkFDSTtBQUFBLEVBQ0osaUNBQ0k7QUFBQSxFQUNKLDZCQUE2QjtBQUFBLEVBQzdCLGtDQUNJO0FBQUEsRUFDSixtQkFBbUI7QUFBQSxFQUNuQix3QkFBd0I7QUFBQSxFQUN4QiwyQkFBMkI7QUFBQSxFQUMzQiw4QkFDSTtBQUFBLEVBQ0osZUFBZTtBQUFBLEVBQ2YsMEJBQTBCO0FBQUEsRUFDMUIsc0JBQXNCO0FBQUEsRUFDdEIsK0JBQStCO0FBQUEsRUFDL0Isd0NBQXdDO0FBQUEsRUFDeEMsd0NBQXdDO0FBQUEsRUFDeEMsb0NBQW9DO0FBQUEsRUFDcEMsb0NBQW9DO0FBQUEsRUFDcEMsd0NBQXdDO0FBQUEsRUFDeEMsbUJBQW1CO0FBQUEsRUFDbkIsaURBQ0k7QUFBQSxFQUNKLDZDQUNJO0FBQUEsRUFDSix3Q0FBd0M7QUFBQSxFQUN4QyxxQkFBcUI7QUFBQSxFQUNyQiw4QkFBOEI7QUFBQSxFQUM5Qiw2QkFBNkI7QUFBQSxFQUM3QixrQ0FDSTtBQUFBLEVBQ0osd0JBQXdCO0FBQUEsRUFDeEIsaUNBQ0k7QUFBQSxFQUNKLGlDQUFpQztBQUFBLEVBQ2pDLDJCQUEyQjtBQUFBLEVBQzNCLG9DQUFvQztBQUFBLEVBQ3BDLE9BQU87QUFBQSxFQUNQLHdCQUF3QjtBQUFBLEVBQ3hCLGdCQUFnQjtBQUFBLEVBQ2hCLHFCQUNJO0FBQUEsRUFDSixrQkFBa0I7QUFBQSxFQUNsQix1QkFDSTtBQUFBLEVBQ0osZ0JBQWdCO0FBQUEsRUFDaEIsa0NBQ0k7QUFBQSxFQUNKLHVDQUNJO0FBQUEsRUFDSix5QkFDSTtBQUFBLEVBQ0osYUFBYTtBQUFBLEVBQ2Isc0JBQXNCO0FBQUEsRUFDdEIsZ0JBQWdCO0FBQUEsRUFDaEIsbUNBQW1DO0FBQUEsRUFDbkMsd0NBQ0k7QUFBQSxFQUNKLFdBQVc7QUFBQSxFQUNYLHNCQUNJO0FBQUEsRUFDSixXQUFXO0FBQUEsRUFDWCxnQkFBZ0I7QUFBQSxFQUNoQix1QkFBdUI7QUFBQSxFQUN2Qix1QkFDSTtBQUFBLEVBQ0osNEJBQTRCO0FBQUEsRUFDNUIsWUFBWTtBQUFBLEVBQ1osaUJBQ0k7QUFBQSxFQUNKLHdCQUF3QjtBQUFBLEVBQ3hCLGNBQWM7QUFBQSxFQUNkLG1CQUNJO0FBQUEsRUFDSiwwQkFBMEI7QUFBQSxFQUMxQixrQkFBa0I7QUFBQSxFQUNsQix1QkFDSTtBQUFBLEVBQ0osU0FBUztBQUFBLEVBQ1Qsb0JBQW9CO0FBQUE7QUFBQSxFQUdwQixvQkFBb0I7QUFBQSxFQUNwQixPQUFPO0FBQUEsRUFDUCxLQUFLO0FBQUEsRUFDTCxXQUFXO0FBQUEsRUFDWCxPQUFPO0FBQUEsRUFDUCxVQUFVO0FBQUE7QUFBQSxFQUdWLGFBQWE7QUFBQSxFQUNiLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULE1BQU07QUFBQSxFQUNOLFVBQVU7QUFBQSxFQUNWLFVBQVU7QUFBQSxFQUNWLGVBQWU7QUFBQSxFQUNmLFdBQVc7QUFBQSxFQUNYLE1BQU07QUFBQSxFQUNOLGlCQUFpQjtBQUFBLEVBQ2pCLGlCQUFpQjtBQUFBLEVBQ2pCLFdBQVc7QUFBQSxFQUNYLGdCQUFnQjtBQUFBLEVBQ2hCLE9BQU87QUFBQSxFQUNQLG1CQUFtQjtBQUFBLEVBQ25CLE9BQU87QUFBQSxFQUNQLGVBQWU7QUFBQSxFQUNmLFlBQVk7QUFBQSxFQUNaLGlCQUFpQjtBQUFBLEVBQ2pCLGVBQWU7QUFBQSxFQUNmLGlCQUFpQjtBQUFBLEVBQ2pCLGtCQUFrQjtBQUFBLEVBQ2xCLG9CQUFvQjtBQUN4Qjs7O0FDOUxBLElBQU8sYUFBUTtBQUFBO0FBQUEsRUFFWCxPQUFPO0FBQUEsRUFDUCxXQUFXO0FBQUEsRUFDWCxXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQUEsRUFDYixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsRUFDTixXQUFXO0FBQUEsRUFDWCxxQkFBcUI7QUFBQSxFQUNyQixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsRUFDTixhQUFhO0FBQUEsRUFDYixxQkFBcUI7QUFBQSxFQUNyQixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixVQUFVO0FBQUEsRUFDVix3QkFBd0I7QUFBQSxFQUN4Qiw0QkFBNEI7QUFBQSxFQUM1QixxQkFBcUI7QUFBQTtBQUFBLEVBR3JCLHNCQUFzQjtBQUFBLEVBQ3RCLGNBQWM7QUFBQSxFQUNkLHVCQUF1QjtBQUFBLEVBQ3ZCLHVCQUF1QjtBQUFBLEVBQ3ZCLHVCQUF1QjtBQUFBLEVBQ3ZCLHNCQUFzQjtBQUFBLEVBQ3RCLHNCQUFzQjtBQUFBLEVBQ3RCLHNCQUFzQjtBQUFBLEVBQ3RCLGdCQUFnQjtBQUFBLEVBQ2hCLGtCQUFrQjtBQUFBLEVBQ2xCLHNCQUFzQjtBQUFBLEVBQ3RCLG9CQUFvQjtBQUFBLEVBQ3BCLFlBQVk7QUFBQSxFQUNaLFlBQVk7QUFBQSxFQUNaLGlCQUFpQjtBQUFBLEVBQ2pCLHdCQUF3QjtBQUFBLEVBQ3hCLGlCQUFpQjtBQUFBLEVBQ2pCLG1CQUFtQjtBQUFBLEVBQ25CLGdCQUFnQjtBQUFBLEVBQ2hCLGVBQWU7QUFBQTtBQUFBLEVBR2YsY0FBYztBQUFBLEVBQ2QsZ0JBQWdCO0FBQUEsRUFDaEIsZUFBZTtBQUFBLEVBQ2YscUJBQXFCO0FBQUEsRUFDckIsdUJBQXVCO0FBQUEsRUFDdkIsc0JBQXNCO0FBQUE7QUFBQSxFQUd0QixpQkFBaUI7QUFBQSxFQUNqQixZQUFZO0FBQUEsRUFDWixtQkFBbUI7QUFBQSxFQUNuQix3QkFBd0I7QUFBQSxFQUN4QixZQUFZO0FBQUEsRUFDWixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUNyQixnQkFBZ0I7QUFBQSxFQUNoQixxQkFDSTtBQUFBLEVBQ0osMEJBQTBCO0FBQUEsRUFDMUIsK0JBQStCO0FBQUEsRUFDL0IsNEJBQ0k7QUFBQSxFQUNKLGlDQUNJO0FBQUEsRUFDSiw2QkFBNkI7QUFBQSxFQUM3QixrQ0FDSTtBQUFBLEVBQ0osbUJBQW1CO0FBQUEsRUFDbkIsd0JBQXdCO0FBQUEsRUFDeEIsMkJBQTJCO0FBQUEsRUFDM0IsOEJBQ0k7QUFBQSxFQUNKLGVBQWU7QUFBQSxFQUNmLDBCQUEwQjtBQUFBLEVBQzFCLHNCQUFzQjtBQUFBLEVBQ3RCLCtCQUErQjtBQUFBLEVBQy9CLHdDQUF3QztBQUFBLEVBQ3hDLHdDQUF3QztBQUFBLEVBQ3hDLG9DQUFvQztBQUFBLEVBQ3BDLG9DQUFvQztBQUFBLEVBQ3BDLHdDQUF3QztBQUFBLEVBQ3hDLG1CQUFtQjtBQUFBLEVBQ25CLGlEQUNJO0FBQUEsRUFDSiw2Q0FDSTtBQUFBLEVBQ0osd0NBQXdDO0FBQUEsRUFDeEMscUJBQXFCO0FBQUEsRUFDckIsOEJBQThCO0FBQUEsRUFDOUIsNkJBQTZCO0FBQUEsRUFDN0Isa0NBQWtDO0FBQUEsRUFDbEMsd0JBQXdCO0FBQUEsRUFDeEIsaUNBQ0k7QUFBQSxFQUNKLGlDQUFpQztBQUFBLEVBQ2pDLDJCQUEyQjtBQUFBLEVBQzNCLG9DQUFvQztBQUFBLEVBQ3BDLE9BQU87QUFBQSxFQUNQLHdCQUF3QjtBQUFBLEVBQ3hCLGdCQUFnQjtBQUFBLEVBQ2hCLHFCQUFxQjtBQUFBLEVBQ3JCLGtCQUFrQjtBQUFBLEVBQ2xCLHVCQUF1QjtBQUFBLEVBQ3ZCLGdCQUFnQjtBQUFBLEVBQ2hCLGtDQUNJO0FBQUEsRUFDSix1Q0FDSTtBQUFBLEVBQ0oseUJBQXlCO0FBQUEsRUFDekIsYUFBYTtBQUFBLEVBQ2Isc0JBQXNCO0FBQUEsRUFDdEIsZ0JBQWdCO0FBQUEsRUFDaEIsbUNBQW1DO0FBQUEsRUFDbkMsd0NBQ0k7QUFBQSxFQUNKLFdBQVc7QUFBQSxFQUNYLHNCQUNJO0FBQUEsRUFDSixXQUFXO0FBQUEsRUFDWCxnQkFBZ0I7QUFBQSxFQUNoQix1QkFBdUI7QUFBQSxFQUN2Qix1QkFBdUI7QUFBQSxFQUN2Qiw0QkFBNEI7QUFBQSxFQUM1QixZQUFZO0FBQUEsRUFDWixpQkFDSTtBQUFBLEVBQ0osd0JBQXdCO0FBQUEsRUFDeEIsY0FBYztBQUFBLEVBQ2QsbUJBQW1CO0FBQUEsRUFDbkIsMEJBQTBCO0FBQUEsRUFDMUIsa0JBQWtCO0FBQUEsRUFDbEIsdUJBQ0k7QUFBQSxFQUNKLFNBQVM7QUFBQSxFQUNULG9CQUFvQjtBQUFBO0FBQUEsRUFHcEIsb0JBQW9CO0FBQUEsRUFDcEIsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsV0FBVztBQUFBLEVBQ1gsT0FBTztBQUFBLEVBQ1AsVUFBVTtBQUFBO0FBQUEsRUFHVixhQUFhO0FBQUEsRUFDYixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxNQUFNO0FBQUEsRUFDTixVQUFVO0FBQUEsRUFDVixVQUFVO0FBQUEsRUFDVixlQUFlO0FBQUEsRUFDZixXQUFXO0FBQUEsRUFDWCxNQUFNO0FBQUEsRUFDTixpQkFBaUI7QUFBQSxFQUNqQixpQkFBaUI7QUFBQSxFQUNqQixXQUFXO0FBQUEsRUFDWCxnQkFBZ0I7QUFBQSxFQUNoQixPQUFPO0FBQUEsRUFDUCxtQkFBbUI7QUFBQSxFQUNuQixPQUFPO0FBQUEsRUFDUCxlQUFlO0FBQUEsRUFDZixZQUFZO0FBQUEsRUFDWixpQkFBaUI7QUFBQSxFQUNqQixlQUFlO0FBQUEsRUFDZixpQkFBaUI7QUFBQSxFQUNqQixrQkFBa0I7QUFBQSxFQUNsQixvQkFBb0I7QUFDeEI7OztBQ2pMQSxJQUFPLGdCQUFRLENBQUM7OztBQ0FoQixJQUFPLGFBQVE7QUFBQTtBQUFBLEVBRVgsT0FBTztBQUFBLEVBQ1AsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gscUJBQXFCO0FBQUEsRUFDckIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sYUFBYTtBQUFBLEVBQ2IscUJBQXFCO0FBQUEsRUFDckIsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1Ysd0JBQXdCO0FBQUEsRUFDeEIsNEJBQTRCO0FBQUEsRUFDNUIscUJBQXFCO0FBQUE7QUFBQSxFQUdyQixzQkFBc0I7QUFBQSxFQUN0QixjQUFjO0FBQUEsRUFDZCx1QkFBdUI7QUFBQSxFQUN2Qix1QkFBdUI7QUFBQSxFQUN2Qix1QkFBdUI7QUFBQSxFQUN2QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixnQkFBZ0I7QUFBQSxFQUNoQixrQkFBa0I7QUFBQSxFQUNsQixzQkFBc0I7QUFBQSxFQUN0QixvQkFBb0I7QUFBQSxFQUNwQixZQUFZO0FBQUEsRUFDWixZQUFZO0FBQUEsRUFDWixpQkFBaUI7QUFBQSxFQUNqQix3QkFBd0I7QUFBQSxFQUN4QixpQkFBaUI7QUFBQSxFQUNqQixtQkFBbUI7QUFBQSxFQUNuQixnQkFBZ0I7QUFBQSxFQUNoQixlQUFlO0FBQUE7QUFBQSxFQUdmLGNBQWM7QUFBQSxFQUNkLGdCQUFnQjtBQUFBLEVBQ2hCLGVBQWU7QUFBQSxFQUNmLHFCQUFxQjtBQUFBLEVBQ3JCLHVCQUF1QjtBQUFBLEVBQ3ZCLHNCQUFzQjtBQUFBO0FBQUEsRUFHdEIsaUJBQWlCO0FBQUEsRUFDakIsWUFBWTtBQUFBLEVBQ1osbUJBQW1CO0FBQUEsRUFDbkIsd0JBQ0k7QUFBQSxFQUNKLFlBQVk7QUFBQSxFQUNaLHNCQUFzQjtBQUFBLEVBQ3RCLHNCQUFzQjtBQUFBLEVBQ3RCLHNCQUFzQjtBQUFBLEVBQ3RCLHFCQUFxQjtBQUFBLEVBQ3JCLHFCQUFxQjtBQUFBLEVBQ3JCLHFCQUFxQjtBQUFBLEVBQ3JCLGdCQUFnQjtBQUFBLEVBQ2hCLHFCQUNJO0FBQUEsRUFDSiwwQkFBMEI7QUFBQSxFQUMxQiwrQkFDSTtBQUFBLEVBQ0osNEJBQ0k7QUFBQSxFQUNKLGlDQUNJO0FBQUEsRUFDSiw2QkFBNkI7QUFBQSxFQUM3QixrQ0FDSTtBQUFBLEVBQ0osbUJBQW1CO0FBQUEsRUFDbkIsd0JBQXdCO0FBQUEsRUFDeEIsMkJBQTJCO0FBQUEsRUFDM0IsOEJBQThCO0FBQUEsRUFDOUIsZUFBZTtBQUFBLEVBQ2YsMEJBQTBCO0FBQUEsRUFDMUIsc0JBQXNCO0FBQUEsRUFDdEIsK0JBQStCO0FBQUEsRUFDL0Isd0NBQXdDO0FBQUEsRUFDeEMsd0NBQXdDO0FBQUEsRUFDeEMsb0NBQW9DO0FBQUEsRUFDcEMsb0NBQW9DO0FBQUEsRUFDcEMsd0NBQXdDO0FBQUEsRUFDeEMsbUJBQW1CO0FBQUEsRUFDbkIsaURBQ0k7QUFBQSxFQUNKLDZDQUNJO0FBQUEsRUFDSix3Q0FBd0M7QUFBQSxFQUN4QyxxQkFBcUI7QUFBQSxFQUNyQiw4QkFBOEI7QUFBQSxFQUM5Qiw2QkFBNkI7QUFBQSxFQUM3QixrQ0FBa0M7QUFBQSxFQUNsQyx3QkFBd0I7QUFBQSxFQUN4QixpQ0FDSTtBQUFBLEVBQ0osaUNBQ0k7QUFBQSxFQUNKLDJCQUEyQjtBQUFBLEVBQzNCLG9DQUNJO0FBQUEsRUFDSixPQUFPO0FBQUEsRUFDUCx3QkFBd0I7QUFBQSxFQUN4QixnQkFBZ0I7QUFBQSxFQUNoQixxQkFDSTtBQUFBLEVBQ0osa0JBQWtCO0FBQUEsRUFDbEIsdUJBQ0k7QUFBQSxFQUNKLGdCQUFnQjtBQUFBLEVBQ2hCLGtDQUNJO0FBQUEsRUFDSix1Q0FDSTtBQUFBLEVBQ0oseUJBQXlCO0FBQUEsRUFDekIsYUFBYTtBQUFBLEVBQ2Isc0JBQXNCO0FBQUEsRUFDdEIsZ0JBQWdCO0FBQUEsRUFDaEIsbUNBQW1DO0FBQUEsRUFDbkMsd0NBQ0k7QUFBQSxFQUNKLFdBQVc7QUFBQSxFQUNYLHNCQUNJO0FBQUEsRUFDSixXQUFXO0FBQUEsRUFDWCxnQkFBZ0I7QUFBQSxFQUNoQix1QkFBdUI7QUFBQSxFQUN2Qix1QkFDSTtBQUFBLEVBQ0osNEJBQTRCO0FBQUEsRUFDNUIsWUFBWTtBQUFBLEVBQ1osaUJBQ0k7QUFBQSxFQUNKLHdCQUF3QjtBQUFBLEVBQ3hCLGNBQWM7QUFBQSxFQUNkLG1CQUNJO0FBQUEsRUFDSiwwQkFBMEI7QUFBQSxFQUMxQixrQkFBa0I7QUFBQSxFQUNsQix1QkFDSTtBQUFBLEVBQ0osU0FBUztBQUFBLEVBQ1Qsb0JBQW9CO0FBQUE7QUFBQSxFQUdwQixvQkFBb0I7QUFBQSxFQUNwQixPQUFPO0FBQUEsRUFDUCxLQUFLO0FBQUEsRUFDTCxXQUFXO0FBQUEsRUFDWCxPQUFPO0FBQUEsRUFDUCxVQUFVO0FBQUE7QUFBQSxFQUdWLGFBQWE7QUFBQSxFQUNiLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQTtBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsZUFBZTtBQUFBLEVBQ2YsV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04saUJBQWlCO0FBQUEsRUFDakIsaUJBQWlCO0FBQUEsRUFDakIsV0FBVztBQUFBLEVBQ1gsZ0JBQWdCO0FBQUEsRUFDaEIsT0FBTztBQUFBLEVBQ1AsbUJBQW1CO0FBQUEsRUFDbkIsT0FBTztBQUFBLEVBQ1AsZUFBZTtBQUFBLEVBQ2YsWUFBWTtBQUFBLEVBQ1osaUJBQWlCO0FBQUEsRUFDakIsZUFBZTtBQUFBLEVBQ2YsaUJBQWlCO0FBQUEsRUFDakIsa0JBQWtCO0FBQUEsRUFDbEIsb0JBQW9CO0FBQ3hCOzs7QUN4TEEsSUFBTyxhQUFRLENBQUM7OztBQ0FoQixJQUFPLGFBQVEsQ0FBQzs7O0FDQWhCLElBQU8sYUFBUSxDQUFDOzs7QUNBaEIsSUFBTyxhQUFRLENBQUM7OztBQ0FoQixJQUFPLGFBQVE7QUFBQTtBQUFBLEVBRVgsT0FBTztBQUFBLEVBQ1AsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gscUJBQXFCO0FBQUEsRUFDckIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sYUFBYTtBQUFBLEVBQ2IscUJBQXFCO0FBQUEsRUFDckIsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1Ysd0JBQXdCO0FBQUEsRUFDeEIsNEJBQTRCO0FBQUEsRUFDNUIscUJBQXFCO0FBQUE7QUFBQSxFQUdyQixzQkFBc0I7QUFBQSxFQUN0QixjQUFjO0FBQUEsRUFDZCx1QkFBdUI7QUFBQSxFQUN2Qix1QkFBdUI7QUFBQSxFQUN2Qix1QkFBdUI7QUFBQSxFQUN2QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixrQkFBa0I7QUFBQSxFQUNsQixnQkFBZ0I7QUFBQSxFQUNoQixzQkFBc0I7QUFBQSxFQUN0QixvQkFBb0I7QUFBQSxFQUNwQixZQUFZO0FBQUEsRUFDWixZQUFZO0FBQUEsRUFDWixpQkFBaUI7QUFBQSxFQUNqQix3QkFBd0I7QUFBQSxFQUN4QixpQkFDSTtBQUFBLEVBQ0osbUJBQW1CO0FBQUEsRUFDbkIsZ0JBQWdCO0FBQUEsRUFDaEIsZUFBZTtBQUFBO0FBQUEsRUFHZixjQUFjO0FBQUEsRUFDZCxnQkFBZ0I7QUFBQSxFQUNoQixlQUFlO0FBQUEsRUFDZixxQkFBcUI7QUFBQSxFQUNyQix1QkFBdUI7QUFBQSxFQUN2QixzQkFBc0I7QUFBQTtBQUFBLEVBR3RCLGlCQUFpQjtBQUFBLEVBQ2pCLFlBQVk7QUFBQSxFQUNaLG1CQUFtQjtBQUFBLEVBQ25CLHdCQUNJO0FBQUEsRUFDSixZQUFZO0FBQUEsRUFDWixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUNyQixnQkFBZ0I7QUFBQSxFQUNoQixxQkFDSTtBQUFBLEVBQ0osMEJBQTBCO0FBQUEsRUFDMUIsK0JBQ0k7QUFBQSxFQUNKLDRCQUNJO0FBQUEsRUFDSixpQ0FDSTtBQUFBLEVBQ0osNkJBQTZCO0FBQUEsRUFDN0Isa0NBQ0k7QUFBQSxFQUNKLG1CQUFtQjtBQUFBLEVBQ25CLHdCQUNJO0FBQUEsRUFDSiwyQkFBMkI7QUFBQSxFQUMzQiw4QkFDSTtBQUFBLEVBQ0osZUFBZTtBQUFBLEVBQ2YsMEJBQTBCO0FBQUEsRUFDMUIsc0JBQXNCO0FBQUEsRUFDdEIsK0JBQStCO0FBQUEsRUFDL0Isd0NBQXdDO0FBQUEsRUFDeEMsd0NBQXdDO0FBQUEsRUFDeEMsb0NBQW9DO0FBQUEsRUFDcEMsb0NBQW9DO0FBQUEsRUFDcEMsd0NBQXdDO0FBQUEsRUFDeEMsbUJBQW1CO0FBQUEsRUFDbkIsaURBQ0k7QUFBQSxFQUNKLDZDQUNJO0FBQUEsRUFDSix3Q0FBd0M7QUFBQSxFQUN4QyxxQkFBcUI7QUFBQSxFQUNyQiw4QkFBOEI7QUFBQSxFQUM5Qiw2QkFBNkI7QUFBQSxFQUM3QixrQ0FBa0M7QUFBQSxFQUNsQyx3QkFBd0I7QUFBQSxFQUN4QixpQ0FDSTtBQUFBLEVBQ0osaUNBQWlDO0FBQUEsRUFDakMsMkJBQTJCO0FBQUEsRUFDM0Isb0NBQW9DO0FBQUEsRUFDcEMsT0FBTztBQUFBLEVBQ1Asd0JBQXdCO0FBQUEsRUFDeEIsZ0JBQWdCO0FBQUEsRUFDaEIscUJBQ0k7QUFBQSxFQUNKLGtCQUFrQjtBQUFBLEVBQ2xCLHVCQUNJO0FBQUEsRUFDSixnQkFBZ0I7QUFBQSxFQUNoQixrQ0FDSTtBQUFBLEVBQ0osdUNBQ0k7QUFBQSxFQUNKLHlCQUF5QjtBQUFBLEVBQ3pCLGFBQWE7QUFBQSxFQUNiLHNCQUFzQjtBQUFBLEVBQ3RCLGdCQUFnQjtBQUFBLEVBQ2hCLG1DQUFtQztBQUFBLEVBQ25DLHdDQUNJO0FBQUEsRUFDSixXQUFXO0FBQUEsRUFDWCxzQkFDSTtBQUFBLEVBQ0osV0FBVztBQUFBLEVBQ1gsZ0JBQWdCO0FBQUEsRUFDaEIsdUJBQXVCO0FBQUEsRUFDdkIsdUJBQXVCO0FBQUEsRUFDdkIsNEJBQTRCO0FBQUEsRUFDNUIsWUFBWTtBQUFBLEVBQ1osaUJBQ0k7QUFBQSxFQUNKLHdCQUF3QjtBQUFBLEVBQ3hCLGNBQWM7QUFBQSxFQUNkLG1CQUFtQjtBQUFBLEVBQ25CLDBCQUEwQjtBQUFBLEVBQzFCLGtCQUFrQjtBQUFBLEVBQ2xCLHVCQUNJO0FBQUEsRUFDSixTQUFTO0FBQUEsRUFDVCxvQkFBb0I7QUFBQTtBQUFBLEVBR3BCLG9CQUFvQjtBQUFBLEVBQ3BCLE9BQU87QUFBQSxFQUNQLEtBQUs7QUFBQSxFQUNMLFdBQVc7QUFBQSxFQUNYLE9BQU87QUFBQSxFQUNQLFVBQVU7QUFBQTtBQUFBLEVBR1YsYUFBYTtBQUFBLEVBQ2IsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsZUFBZTtBQUFBLEVBQ2YsV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04saUJBQWlCO0FBQUEsRUFDakIsaUJBQWlCO0FBQUEsRUFDakIsV0FBVztBQUFBLEVBQ1gsZ0JBQWdCO0FBQUEsRUFDaEIsT0FBTztBQUFBLEVBQ1AsbUJBQW1CO0FBQUEsRUFDbkIsT0FBTztBQUFBLEVBQ1AsZUFBZTtBQUFBLEVBQ2YsWUFBWTtBQUFBLEVBQ1osaUJBQWlCO0FBQUEsRUFDakIsZUFBZTtBQUFBLEVBQ2YsaUJBQWlCO0FBQUEsRUFDakIsa0JBQWtCO0FBQUEsRUFDbEIsb0JBQW9CO0FBQ3hCOzs7QUN2TEEsSUFBTyxhQUFRO0FBQUE7QUFBQSxFQUVYLE9BQU87QUFBQSxFQUNQLFdBQVc7QUFBQSxFQUNYLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLFdBQVc7QUFBQSxFQUNYLHFCQUFxQjtBQUFBLEVBQ3JCLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLGFBQWE7QUFBQSxFQUNiLHFCQUFxQjtBQUFBLEVBQ3JCLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFVBQVU7QUFBQSxFQUNWLHdCQUF3QjtBQUFBLEVBQ3hCLDRCQUE0QjtBQUFBLEVBQzVCLHFCQUFxQjtBQUFBO0FBQUEsRUFHckIsc0JBQXNCO0FBQUEsRUFDdEIsY0FBYztBQUFBLEVBQ2QsdUJBQXVCO0FBQUEsRUFDdkIsdUJBQXVCO0FBQUEsRUFDdkIsdUJBQXVCO0FBQUEsRUFDdkIsc0JBQXNCO0FBQUEsRUFDdEIsc0JBQXNCO0FBQUEsRUFDdEIsc0JBQXNCO0FBQUEsRUFDdEIsa0JBQWtCO0FBQUEsRUFDbEIsZ0JBQWdCO0FBQUEsRUFDaEIsc0JBQXNCO0FBQUEsRUFDdEIsb0JBQW9CO0FBQUEsRUFDcEIsWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBLEVBQ1osaUJBQWlCO0FBQUEsRUFDakIsd0JBQXdCO0FBQUEsRUFDeEIsaUJBQWlCO0FBQUEsRUFDakIsbUJBQW1CO0FBQUEsRUFDbkIsZ0JBQWdCO0FBQUEsRUFDaEIsZUFBZTtBQUFBO0FBQUEsRUFHZixjQUFjO0FBQUEsRUFDZCxnQkFBZ0I7QUFBQSxFQUNoQixlQUFlO0FBQUEsRUFDZixxQkFBcUI7QUFBQSxFQUNyQix1QkFBdUI7QUFBQSxFQUN2QixzQkFBc0I7QUFBQTtBQUFBLEVBR3RCLGlCQUFpQjtBQUFBLEVBQ2pCLFlBQVk7QUFBQSxFQUNaLG1CQUFtQjtBQUFBLEVBQ25CLHdCQUNJO0FBQUEsRUFDSixZQUFZO0FBQUEsRUFDWixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUNyQixnQkFBZ0I7QUFBQSxFQUNoQixxQkFDSTtBQUFBLEVBQ0osMEJBQTBCO0FBQUEsRUFDMUIsK0JBQStCO0FBQUEsRUFDL0IsNEJBQ0k7QUFBQSxFQUNKLGlDQUNJO0FBQUEsRUFDSiw2QkFBNkI7QUFBQSxFQUM3QixrQ0FDSTtBQUFBLEVBQ0osbUJBQW1CO0FBQUEsRUFDbkIsd0JBQ0k7QUFBQSxFQUNKLDJCQUEyQjtBQUFBLEVBQzNCLDhCQUNJO0FBQUEsRUFDSixlQUFlO0FBQUEsRUFDZiwwQkFBMEI7QUFBQSxFQUMxQixzQkFBc0I7QUFBQSxFQUN0QiwrQkFBK0I7QUFBQSxFQUMvQix3Q0FBd0M7QUFBQSxFQUN4Qyx3Q0FBd0M7QUFBQSxFQUN4QyxvQ0FBb0M7QUFBQSxFQUNwQyxvQ0FBb0M7QUFBQSxFQUNwQyx3Q0FBd0M7QUFBQSxFQUN4QyxtQkFBbUI7QUFBQSxFQUNuQixpREFDSTtBQUFBLEVBQ0osNkNBQ0k7QUFBQSxFQUNKLHdDQUF3QztBQUFBLEVBQ3hDLHFCQUFxQjtBQUFBLEVBQ3JCLDhCQUE4QjtBQUFBLEVBQzlCLDZCQUE2QjtBQUFBLEVBQzdCLGtDQUFrQztBQUFBLEVBQ2xDLHdCQUF3QjtBQUFBLEVBQ3hCLGlDQUNJO0FBQUEsRUFDSixpQ0FBaUM7QUFBQSxFQUNqQywyQkFBMkI7QUFBQSxFQUMzQixvQ0FBb0M7QUFBQSxFQUNwQyxPQUFPO0FBQUEsRUFDUCx3QkFBd0I7QUFBQSxFQUN4QixnQkFBZ0I7QUFBQSxFQUNoQixxQkFDSTtBQUFBLEVBQ0osa0JBQWtCO0FBQUEsRUFDbEIsdUJBQXVCO0FBQUEsRUFDdkIsZ0JBQWdCO0FBQUEsRUFDaEIsa0NBQ0k7QUFBQSxFQUNKLHVDQUNJO0FBQUEsRUFDSix5QkFBeUI7QUFBQSxFQUN6QixhQUFhO0FBQUEsRUFDYixzQkFBc0I7QUFBQSxFQUN0QixnQkFBZ0I7QUFBQSxFQUNoQixtQ0FBbUM7QUFBQSxFQUNuQyx3Q0FDSTtBQUFBLEVBQ0osV0FBVztBQUFBLEVBQ1gsc0JBQ0k7QUFBQSxFQUNKLFdBQVc7QUFBQSxFQUNYLGdCQUFnQjtBQUFBLEVBQ2hCLHVCQUF1QjtBQUFBLEVBQ3ZCLHVCQUF1QjtBQUFBLEVBQ3ZCLDRCQUE0QjtBQUFBLEVBQzVCLFlBQVk7QUFBQSxFQUNaLGlCQUNJO0FBQUEsRUFDSix3QkFBd0I7QUFBQSxFQUN4QixjQUFjO0FBQUEsRUFDZCxtQkFBbUI7QUFBQSxFQUNuQiwwQkFBMEI7QUFBQSxFQUMxQixrQkFBa0I7QUFBQSxFQUNsQix1QkFDSTtBQUFBLEVBQ0osU0FBUztBQUFBLEVBQ1Qsb0JBQW9CO0FBQUE7QUFBQSxFQUdwQixvQkFBb0I7QUFBQSxFQUNwQixPQUFPO0FBQUEsRUFDUCxLQUFLO0FBQUEsRUFDTCxXQUFXO0FBQUEsRUFDWCxPQUFPO0FBQUEsRUFDUCxVQUFVO0FBQUE7QUFBQSxFQUdWLGFBQWE7QUFBQSxFQUNiLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULE1BQU07QUFBQSxFQUNOLFVBQVU7QUFBQSxFQUNWLFVBQVU7QUFBQSxFQUNWLGVBQWU7QUFBQSxFQUNmLFdBQVc7QUFBQSxFQUNYLE1BQU07QUFBQSxFQUNOLGlCQUFpQjtBQUFBLEVBQ2pCLGlCQUFpQjtBQUFBLEVBQ2pCLFdBQVc7QUFBQSxFQUNYLGdCQUFnQjtBQUFBLEVBQ2hCLE9BQU87QUFBQSxFQUNQLG1CQUFtQjtBQUFBLEVBQ25CLE9BQU87QUFBQSxFQUNQLGVBQWU7QUFBQSxFQUNmLFlBQVk7QUFBQSxFQUNaLGlCQUFpQjtBQUFBLEVBQ2pCLGVBQWU7QUFBQSxFQUNmLGlCQUFpQjtBQUFBLEVBQ2pCLGtCQUFrQjtBQUFBLEVBQ2xCLG9CQUFvQjtBQUN4Qjs7O0FDcExBLElBQU8sYUFBUSxDQUFDOzs7QUNBaEIsSUFBTyxhQUFRLENBQUM7OztBQ0FoQixJQUFPLGFBQVEsQ0FBQzs7O0FDQWhCLElBQU8sYUFBUSxDQUFDOzs7QUNBaEIsSUFBTyxhQUFRLENBQUM7OztBQ0NoQixJQUFPLGdCQUFRO0FBQUE7QUFBQSxFQUVYLE9BQU87QUFBQSxFQUNQLFdBQVc7QUFBQSxFQUNYLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLFdBQVc7QUFBQSxFQUNYLHFCQUFxQjtBQUFBLEVBQ3JCLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLGFBQWE7QUFBQSxFQUNiLHFCQUFxQjtBQUFBLEVBQ3JCLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFVBQVU7QUFBQSxFQUNWLHdCQUF3QjtBQUFBLEVBQ3hCLDRCQUE0QjtBQUFBLEVBQzVCLHFCQUFxQjtBQUFBO0FBQUEsRUFHckIsc0JBQXNCO0FBQUEsRUFDdEIsY0FBYztBQUFBLEVBQ2QsdUJBQXVCO0FBQUEsRUFDdkIsdUJBQXVCO0FBQUEsRUFDdkIsdUJBQXVCO0FBQUEsRUFDdkIsc0JBQXNCO0FBQUEsRUFDdEIsc0JBQXNCO0FBQUEsRUFDdEIsc0JBQXNCO0FBQUEsRUFDdEIsa0JBQWtCO0FBQUEsRUFDbEIsZ0JBQWdCO0FBQUEsRUFDaEIsc0JBQXNCO0FBQUEsRUFDdEIsb0JBQW9CO0FBQUEsRUFDcEIsWUFBWTtBQUFBLEVBQ1osWUFDSTtBQUFBLEVBQ0osaUJBQWlCO0FBQUEsRUFDakIsd0JBQXdCO0FBQUEsRUFDeEIsaUJBQWlCO0FBQUEsRUFDakIsbUJBQW1CO0FBQUEsRUFDbkIsZ0JBQWdCO0FBQUEsRUFDaEIsZUFBZTtBQUFBO0FBQUEsRUFHZixjQUFjO0FBQUEsRUFDZCxnQkFBZ0I7QUFBQSxFQUNoQixlQUFlO0FBQUEsRUFDZixxQkFBcUI7QUFBQSxFQUNyQix1QkFBdUI7QUFBQSxFQUN2QixzQkFBc0I7QUFBQTtBQUFBLEVBR3RCLGlCQUFpQjtBQUFBLEVBQ2pCLFlBQVk7QUFBQSxFQUNaLG1CQUFtQjtBQUFBLEVBQ25CLHdCQUNJO0FBQUEsRUFDSixZQUFZO0FBQUEsRUFDWixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUNyQixnQkFBZ0I7QUFBQSxFQUNoQixxQkFDSTtBQUFBLEVBQ0osMEJBQTBCO0FBQUEsRUFDMUIsK0JBQ0k7QUFBQSxFQUNKLDRCQUNJO0FBQUEsRUFDSixpQ0FDSTtBQUFBLEVBQ0osNkJBQTZCO0FBQUEsRUFDN0Isa0NBQ0k7QUFBQSxFQUNKLG1CQUFtQjtBQUFBLEVBQ25CLHdCQUF3QjtBQUFBLEVBQ3hCLDJCQUEyQjtBQUFBLEVBQzNCLDhCQUNJO0FBQUEsRUFDSixlQUFlO0FBQUEsRUFDZiwwQkFBMEI7QUFBQSxFQUMxQixzQkFBc0I7QUFBQSxFQUN0QiwrQkFBK0I7QUFBQSxFQUMvQix3Q0FBd0M7QUFBQSxFQUN4Qyx3Q0FBd0M7QUFBQSxFQUN4QyxvQ0FBb0M7QUFBQSxFQUNwQyxvQ0FBb0M7QUFBQSxFQUNwQyx3Q0FBd0M7QUFBQSxFQUN4QyxtQkFBbUI7QUFBQSxFQUNuQixpREFDSTtBQUFBLEVBQ0osNkNBQ0k7QUFBQSxFQUNKLHdDQUF3QztBQUFBLEVBQ3hDLHFCQUFxQjtBQUFBLEVBQ3JCLDhCQUE4QjtBQUFBLEVBQzlCLDZCQUE2QjtBQUFBLEVBQzdCLGtDQUFrQztBQUFBLEVBQ2xDLHdCQUF3QjtBQUFBLEVBQ3hCLGlDQUNJO0FBQUEsRUFDSixpQ0FBaUM7QUFBQSxFQUNqQywyQkFBMkI7QUFBQSxFQUMzQixvQ0FBb0M7QUFBQSxFQUNwQyxPQUFPO0FBQUEsRUFDUCx3QkFBd0I7QUFBQSxFQUN4QixnQkFBZ0I7QUFBQSxFQUNoQixxQkFDSTtBQUFBLEVBQ0osa0JBQWtCO0FBQUEsRUFDbEIsdUJBQ0k7QUFBQSxFQUNKLGdCQUFnQjtBQUFBLEVBQ2hCLGtDQUNJO0FBQUEsRUFDSix1Q0FDSTtBQUFBLEVBQ0oseUJBQXlCO0FBQUEsRUFDekIsYUFBYTtBQUFBLEVBQ2Isc0JBQXNCO0FBQUEsRUFDdEIsZ0JBQWdCO0FBQUEsRUFDaEIsbUNBQ0k7QUFBQSxFQUNKLHdDQUNJO0FBQUEsRUFDSixXQUFXO0FBQUEsRUFDWCxzQkFDSTtBQUFBLEVBQ0osV0FBVztBQUFBLEVBQ1gsZ0JBQWdCO0FBQUEsRUFDaEIsdUJBQXVCO0FBQUEsRUFDdkIsdUJBQ0k7QUFBQSxFQUNKLDRCQUE0QjtBQUFBLEVBQzVCLFlBQVk7QUFBQSxFQUNaLGlCQUNJO0FBQUEsRUFDSix3QkFBd0I7QUFBQSxFQUN4QixjQUFjO0FBQUEsRUFDZCxtQkFDSTtBQUFBLEVBQ0osMEJBQTBCO0FBQUEsRUFDMUIsa0JBQWtCO0FBQUEsRUFDbEIsdUJBQ0k7QUFBQSxFQUNKLFNBQVM7QUFBQSxFQUNULG9CQUFvQjtBQUFBO0FBQUEsRUFHcEIsb0JBQW9CO0FBQUEsRUFDcEIsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsV0FBVztBQUFBLEVBQ1gsT0FBTztBQUFBLEVBQ1AsVUFBVTtBQUFBO0FBQUEsRUFHVixhQUFhO0FBQUEsRUFDYixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxNQUFNO0FBQUEsRUFDTixVQUFVO0FBQUEsRUFDVixVQUFVO0FBQUEsRUFDVixlQUFlO0FBQUEsRUFDZixXQUFXO0FBQUEsRUFDWCxNQUFNO0FBQUEsRUFDTixpQkFBaUI7QUFBQSxFQUNqQixpQkFBaUI7QUFBQSxFQUNqQixXQUFXO0FBQUEsRUFDWCxnQkFBZ0I7QUFBQSxFQUNoQixPQUFPO0FBQUEsRUFDUCxtQkFBbUI7QUFBQSxFQUNuQixPQUFPO0FBQUEsRUFDUCxlQUFlO0FBQUEsRUFDZixZQUFZO0FBQUEsRUFDWixpQkFBaUI7QUFBQSxFQUNqQixlQUFlO0FBQUEsRUFDZixpQkFBaUI7QUFBQSxFQUNqQixrQkFBa0I7QUFBQSxFQUNsQixvQkFBb0I7QUFDeEI7OztBQzFMQSxJQUFPLGFBQVEsQ0FBQzs7O0FDTWhCLElBQU8sYUFBUTtBQUFBO0FBQUEsRUFFWCxPQUFPO0FBQUEsRUFDUCxXQUFXO0FBQUEsRUFDWCxXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQUEsRUFDYixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsRUFDTixXQUFXO0FBQUEsRUFDWCxxQkFBcUI7QUFBQSxFQUNyQixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsRUFDTixhQUFhO0FBQUEsRUFDYixxQkFBcUI7QUFBQSxFQUNyQixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixVQUFVO0FBQUEsRUFDVix3QkFBd0I7QUFBQSxFQUN4Qiw0QkFBNEI7QUFBQSxFQUM1QixxQkFBcUI7QUFBQTtBQUFBLEVBR3JCLHNCQUFzQjtBQUFBLEVBQ3RCLGNBQWM7QUFBQSxFQUNkLHVCQUF1QjtBQUFBLEVBQ3ZCLHVCQUF1QjtBQUFBLEVBQ3ZCLHVCQUF1QjtBQUFBLEVBQ3ZCLHNCQUFzQjtBQUFBLEVBQ3RCLHNCQUFzQjtBQUFBLEVBQ3RCLHNCQUFzQjtBQUFBLEVBQ3RCLGdCQUFnQjtBQUFBLEVBQ2hCLGtCQUFrQjtBQUFBLEVBQ2xCLHNCQUFzQjtBQUFBLEVBQ3RCLG9CQUFvQjtBQUFBLEVBQ3BCLFlBQVk7QUFBQSxFQUNaLFlBQ0k7QUFBQSxFQUNKLGlCQUFpQjtBQUFBLEVBQ2pCLHdCQUF3QjtBQUFBLEVBQ3hCLGlCQUFpQjtBQUFBLEVBQ2pCLG1CQUFtQjtBQUFBLEVBQ25CLGdCQUFnQjtBQUFBLEVBQ2hCLGVBQWU7QUFBQTtBQUFBLEVBR2YsY0FBYztBQUFBLEVBQ2QsZ0JBQWdCO0FBQUEsRUFDaEIsZUFBZTtBQUFBLEVBQ2YscUJBQXFCO0FBQUEsRUFDckIsdUJBQXVCO0FBQUEsRUFDdkIsc0JBQXNCO0FBQUE7QUFBQSxFQUd0QixpQkFBaUI7QUFBQSxFQUNqQixZQUFZO0FBQUEsRUFDWixtQkFBbUI7QUFBQSxFQUNuQix3QkFDSTtBQUFBLEVBQ0osWUFBWTtBQUFBLEVBQ1osc0JBQXNCO0FBQUEsRUFDdEIsc0JBQXNCO0FBQUEsRUFDdEIsc0JBQXNCO0FBQUEsRUFDdEIscUJBQXFCO0FBQUEsRUFDckIscUJBQXFCO0FBQUEsRUFDckIscUJBQXFCO0FBQUEsRUFDckIsZ0JBQWdCO0FBQUEsRUFDaEIscUJBQ0k7QUFBQSxFQUNKLDBCQUEwQjtBQUFBLEVBQzFCLCtCQUErQjtBQUFBLEVBQy9CLDRCQUE0QjtBQUFBLEVBQzVCLGlDQUNJO0FBQUEsRUFDSiw2QkFBNkI7QUFBQSxFQUM3QixrQ0FDSTtBQUFBLEVBQ0osbUJBQW1CO0FBQUEsRUFDbkIsd0JBQXdCO0FBQUEsRUFDeEIsMkJBQTJCO0FBQUEsRUFDM0IsOEJBQ0k7QUFBQSxFQUNKLGVBQWU7QUFBQSxFQUNmLDBCQUEwQjtBQUFBLEVBQzFCLHNCQUFzQjtBQUFBLEVBQ3RCLCtCQUErQjtBQUFBLEVBQy9CLHdDQUF3QztBQUFBLEVBQ3hDLHdDQUF3QztBQUFBLEVBQ3hDLG9DQUFvQztBQUFBLEVBQ3BDLG9DQUFvQztBQUFBLEVBQ3BDLHdDQUF3QztBQUFBLEVBQ3hDLG1CQUFtQjtBQUFBLEVBQ25CLGlEQUNJO0FBQUEsRUFDSiw2Q0FDSTtBQUFBLEVBQ0osd0NBQXdDO0FBQUEsRUFDeEMscUJBQXFCO0FBQUEsRUFDckIsOEJBQThCO0FBQUEsRUFDOUIsNkJBQTZCO0FBQUEsRUFDN0Isa0NBQ0k7QUFBQSxFQUNKLHdCQUF3QjtBQUFBLEVBQ3hCLGlDQUNJO0FBQUEsRUFDSixpQ0FBaUM7QUFBQSxFQUNqQywyQkFBMkI7QUFBQSxFQUMzQixvQ0FBb0M7QUFBQSxFQUNwQyxPQUFPO0FBQUEsRUFDUCx3QkFBd0I7QUFBQSxFQUN4QixnQkFBZ0I7QUFBQSxFQUNoQixxQkFDSTtBQUFBLEVBQ0osa0JBQWtCO0FBQUEsRUFDbEIsdUJBQXVCO0FBQUEsRUFDdkIsZ0JBQWdCO0FBQUEsRUFDaEIsa0NBQ0k7QUFBQSxFQUNKLHVDQUNJO0FBQUEsRUFDSix5QkFBeUI7QUFBQSxFQUN6QixhQUFhO0FBQUEsRUFDYixzQkFBc0I7QUFBQSxFQUN0QixnQkFBZ0I7QUFBQSxFQUNoQixtQ0FDSTtBQUFBLEVBQ0osd0NBQ0k7QUFBQSxFQUNKLFdBQVc7QUFBQSxFQUNYLHNCQUNJO0FBQUEsRUFDSixXQUFXO0FBQUEsRUFDWCxnQkFBZ0I7QUFBQSxFQUNoQix1QkFBdUI7QUFBQSxFQUN2Qix1QkFDSTtBQUFBLEVBQ0osNEJBQTRCO0FBQUEsRUFDNUIsWUFBWTtBQUFBLEVBQ1osaUJBQ0k7QUFBQSxFQUNKLHdCQUF3QjtBQUFBLEVBQ3hCLGNBQWM7QUFBQSxFQUNkLG1CQUNJO0FBQUEsRUFDSiwwQkFBMEI7QUFBQSxFQUMxQixrQkFBa0I7QUFBQSxFQUNsQix1QkFDSTtBQUFBLEVBQ0osU0FBUztBQUFBLEVBQ1Qsb0JBQ0k7QUFBQTtBQUFBLEVBR0osb0JBQW9CO0FBQUEsRUFDcEIsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsV0FBVztBQUFBLEVBQ1gsT0FBTztBQUFBLEVBQ1AsVUFBVTtBQUFBO0FBQUEsRUFHVixhQUFhO0FBQUEsRUFDYixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxNQUFNO0FBQUEsRUFDTixVQUFVO0FBQUEsRUFDVixVQUFVO0FBQUEsRUFDVixlQUFlO0FBQUEsRUFDZixXQUFXO0FBQUEsRUFDWCxNQUFNO0FBQUEsRUFDTixpQkFBaUI7QUFBQSxFQUNqQixpQkFBaUI7QUFBQTtBQUFBLEVBQ2pCLFdBQVc7QUFBQSxFQUNYLGdCQUFnQjtBQUFBLEVBQ2hCLE9BQU87QUFBQSxFQUNQLG1CQUFtQjtBQUFBLEVBQ25CLE9BQU87QUFBQSxFQUNQLGVBQWU7QUFBQSxFQUNmLFlBQVk7QUFBQSxFQUNaLGlCQUFpQjtBQUFBLEVBQ2pCLGVBQWU7QUFBQSxFQUNmLGlCQUFpQjtBQUFBLEVBQ2pCLGtCQUFrQjtBQUFBLEVBQ2xCLG9CQUFvQjtBQUN4Qjs7O0FDOUxBLElBQU8sYUFBUSxDQUFDOzs7QUNBaEIsSUFBTyxhQUFRLENBQUM7OztBQ0FoQixJQUFPLGFBQVEsQ0FBQzs7O0FDQWhCLElBQU8sYUFBUSxDQUFDOzs7QUNBaEIsSUFBTyxhQUFRLENBQUM7OztBQ0FoQixJQUFPLGFBQVEsQ0FBQzs7O0FDQWhCLElBQU8sYUFBUSxDQUFDOzs7QUNBaEIsSUFBTyxnQkFBUTtBQUFBO0FBQUEsRUFFWCxPQUFPO0FBQUEsRUFDUCxXQUFXO0FBQUEsRUFDWCxXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQUEsRUFDYixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsRUFDTixXQUFXO0FBQUEsRUFDWCxxQkFBcUI7QUFBQSxFQUNyQixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsRUFDTixhQUFhO0FBQUEsRUFDYixxQkFBcUI7QUFBQSxFQUNyQixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixVQUFVO0FBQUEsRUFDVix3QkFBd0I7QUFBQSxFQUN4Qiw0QkFBNEI7QUFBQSxFQUM1QixxQkFBcUI7QUFBQTtBQUFBLEVBR3JCLHNCQUFzQjtBQUFBLEVBQ3RCLGNBQWM7QUFBQSxFQUNkLHVCQUF1QjtBQUFBLEVBQ3ZCLHVCQUF1QjtBQUFBLEVBQ3ZCLHVCQUF1QjtBQUFBLEVBQ3ZCLHNCQUFzQjtBQUFBLEVBQ3RCLHNCQUFzQjtBQUFBLEVBQ3RCLHNCQUFzQjtBQUFBLEVBQ3RCLGtCQUFrQjtBQUFBLEVBQ2xCLGdCQUFnQjtBQUFBLEVBQ2hCLHNCQUFzQjtBQUFBLEVBQ3RCLG9CQUFvQjtBQUFBLEVBQ3BCLFlBQVk7QUFBQSxFQUNaLFlBQVk7QUFBQSxFQUNaLGlCQUFpQjtBQUFBLEVBQ2pCLHdCQUF3QjtBQUFBLEVBQ3hCLGlCQUFpQjtBQUFBLEVBQ2pCLG1CQUFtQjtBQUFBLEVBQ25CLGdCQUFnQjtBQUFBLEVBQ2hCLGVBQWU7QUFBQTtBQUFBLEVBR2YsY0FBYztBQUFBLEVBQ2QsZ0JBQWdCO0FBQUEsRUFDaEIsZUFBZTtBQUFBLEVBQ2YscUJBQXFCO0FBQUEsRUFDckIsdUJBQXVCO0FBQUEsRUFDdkIsc0JBQXNCO0FBQUE7QUFBQSxFQUd0QixpQkFBaUI7QUFBQSxFQUNqQixZQUFZO0FBQUEsRUFDWixtQkFBbUI7QUFBQSxFQUNuQix3QkFBd0I7QUFBQSxFQUN4QixZQUFZO0FBQUEsRUFDWixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUNyQixnQkFBZ0I7QUFBQSxFQUNoQixxQkFBcUI7QUFBQSxFQUNyQiwwQkFBMEI7QUFBQSxFQUMxQiwrQkFBK0I7QUFBQSxFQUMvQiw0QkFBNEI7QUFBQSxFQUM1QixpQ0FBaUM7QUFBQSxFQUNqQyw2QkFBNkI7QUFBQSxFQUM3QixrQ0FBa0M7QUFBQSxFQUNsQyxtQkFBbUI7QUFBQSxFQUNuQix3QkFBd0I7QUFBQSxFQUN4QiwyQkFBMkI7QUFBQSxFQUMzQiw4QkFBOEI7QUFBQSxFQUM5QixlQUFlO0FBQUEsRUFDZiwwQkFBMEI7QUFBQSxFQUMxQixzQkFBc0I7QUFBQSxFQUN0QiwrQkFBK0I7QUFBQSxFQUMvQix3Q0FBd0M7QUFBQSxFQUN4Qyx3Q0FBd0M7QUFBQSxFQUN4QyxvQ0FBb0M7QUFBQSxFQUNwQyxvQ0FBb0M7QUFBQSxFQUNwQyx3Q0FBd0M7QUFBQSxFQUN4QyxtQkFBbUI7QUFBQSxFQUNuQixpREFDSTtBQUFBLEVBQ0osNkNBQ0k7QUFBQSxFQUNKLHdDQUF3QztBQUFBLEVBQ3hDLHFCQUFxQjtBQUFBLEVBQ3JCLDhCQUE4QjtBQUFBLEVBQzlCLDZCQUE2QjtBQUFBLEVBQzdCLGtDQUFrQztBQUFBLEVBQ2xDLHdCQUF3QjtBQUFBLEVBQ3hCLGlDQUFpQztBQUFBLEVBQ2pDLGlDQUFpQztBQUFBLEVBQ2pDLDJCQUEyQjtBQUFBLEVBQzNCLG9DQUFvQztBQUFBLEVBQ3BDLE9BQU87QUFBQSxFQUNQLHdCQUF3QjtBQUFBLEVBQ3hCLGdCQUFnQjtBQUFBLEVBQ2hCLHFCQUFxQjtBQUFBLEVBQ3JCLGtCQUFrQjtBQUFBLEVBQ2xCLHVCQUF1QjtBQUFBLEVBQ3ZCLGdCQUFnQjtBQUFBLEVBQ2hCLGtDQUFrQztBQUFBLEVBQ2xDLHVDQUNJO0FBQUEsRUFDSix5QkFBeUI7QUFBQSxFQUN6QixhQUFhO0FBQUEsRUFDYixzQkFBc0I7QUFBQSxFQUN0QixnQkFBZ0I7QUFBQSxFQUNoQixtQ0FBbUM7QUFBQSxFQUNuQyx3Q0FDSTtBQUFBLEVBQ0osV0FBVztBQUFBLEVBQ1gsc0JBQXNCO0FBQUEsRUFDdEIsV0FBVztBQUFBLEVBQ1gsZ0JBQWdCO0FBQUEsRUFDaEIsdUJBQXVCO0FBQUEsRUFDdkIsdUJBQXVCO0FBQUEsRUFDdkIsNEJBQTRCO0FBQUEsRUFDNUIsWUFBWTtBQUFBLEVBQ1osaUJBQWlCO0FBQUEsRUFDakIsd0JBQXdCO0FBQUEsRUFDeEIsY0FBYztBQUFBLEVBQ2QsbUJBQW1CO0FBQUEsRUFDbkIsMEJBQTBCO0FBQUEsRUFDMUIsa0JBQWtCO0FBQUEsRUFDbEIsdUJBQXVCO0FBQUEsRUFDdkIsU0FBUztBQUFBLEVBQ1Qsb0JBQW9CO0FBQUE7QUFBQSxFQUdwQixvQkFBb0I7QUFBQSxFQUNwQixPQUFPO0FBQUEsRUFDUCxLQUFLO0FBQUEsRUFDTCxXQUFXO0FBQUEsRUFDWCxPQUFPO0FBQUEsRUFDUCxVQUFVO0FBQUE7QUFBQSxFQUdWLGFBQWE7QUFBQSxFQUNiLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULE1BQU07QUFBQSxFQUNOLFVBQVU7QUFBQSxFQUNWLFVBQVU7QUFBQSxFQUNWLGVBQWU7QUFBQSxFQUNmLFdBQVc7QUFBQSxFQUNYLE1BQU07QUFBQSxFQUNOLGlCQUFpQjtBQUFBLEVBQ2pCLGlCQUFpQjtBQUFBLEVBQ2pCLFdBQVc7QUFBQSxFQUNYLGdCQUFnQjtBQUFBLEVBQ2hCLE9BQU87QUFBQSxFQUNQLG1CQUFtQjtBQUFBLEVBQ25CLE9BQU87QUFBQSxFQUNQLGVBQWU7QUFBQSxFQUNmLFlBQVk7QUFBQSxFQUNaLGlCQUFpQjtBQUFBLEVBQ2pCLGVBQWU7QUFBQSxFQUNmLGlCQUFpQjtBQUFBLEVBQ2pCLGtCQUFrQjtBQUFBLEVBQ2xCLG9CQUFvQjtBQUN4Qjs7O0FDdktBLElBQU8sZ0JBQVE7QUFBQTtBQUFBLEVBRVgsT0FBTztBQUFBLEVBQ1AsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gscUJBQXFCO0FBQUEsRUFDckIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sYUFBYTtBQUFBLEVBQ2IscUJBQXFCO0FBQUEsRUFDckIsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1Ysd0JBQXdCO0FBQUEsRUFDeEIsNEJBQTRCO0FBQUEsRUFDNUIscUJBQXFCO0FBQUE7QUFBQSxFQUdyQixzQkFBc0I7QUFBQSxFQUN0QixjQUFjO0FBQUEsRUFDZCx1QkFBdUI7QUFBQSxFQUN2Qix1QkFBdUI7QUFBQSxFQUN2Qix1QkFBdUI7QUFBQSxFQUN2QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixnQkFBZ0I7QUFBQSxFQUNoQixrQkFBa0I7QUFBQSxFQUNsQixvQkFBb0I7QUFBQSxFQUNwQixZQUFZO0FBQUEsRUFDWixZQUFZO0FBQUEsRUFDWixpQkFBaUI7QUFBQSxFQUNqQix3QkFBd0I7QUFBQSxFQUN4QixpQkFBaUI7QUFBQSxFQUNqQixtQkFBbUI7QUFBQSxFQUNuQixnQkFBZ0I7QUFBQSxFQUNoQixlQUFlO0FBQUE7QUFBQSxFQUdmLGNBQWM7QUFBQSxFQUNkLGdCQUFnQjtBQUFBLEVBQ2hCLGVBQWU7QUFBQSxFQUNmLHFCQUFxQjtBQUFBLEVBQ3JCLHVCQUF1QjtBQUFBLEVBQ3ZCLHNCQUFzQjtBQUFBO0FBQUEsRUFHdEIsaUJBQWlCO0FBQUEsRUFDakIsWUFBWTtBQUFBLEVBQ1osbUJBQW1CO0FBQUEsRUFDbkIsd0JBQXdCO0FBQUEsRUFDeEIsWUFBWTtBQUFBLEVBQ1osc0JBQXNCO0FBQUEsRUFDdEIsc0JBQXNCO0FBQUEsRUFDdEIsc0JBQXNCO0FBQUEsRUFDdEIscUJBQXFCO0FBQUEsRUFDckIscUJBQXFCO0FBQUEsRUFDckIscUJBQXFCO0FBQUEsRUFDckIsZ0JBQWdCO0FBQUEsRUFDaEIscUJBQXFCO0FBQUEsRUFDckIsMEJBQTBCO0FBQUEsRUFDMUIsK0JBQStCO0FBQUEsRUFDL0IsNEJBQTRCO0FBQUEsRUFDNUIsaUNBQWlDO0FBQUEsRUFDakMsNkJBQTZCO0FBQUEsRUFDN0Isa0NBQWtDO0FBQUEsRUFDbEMsbUJBQW1CO0FBQUEsRUFDbkIsd0JBQXdCO0FBQUEsRUFDeEIsMkJBQTJCO0FBQUEsRUFDM0IsOEJBQThCO0FBQUEsRUFDOUIsZUFBZTtBQUFBLEVBQ2YsMEJBQTBCO0FBQUEsRUFDMUIsc0JBQXNCO0FBQUEsRUFDdEIsK0JBQStCO0FBQUEsRUFDL0Isd0NBQXdDO0FBQUEsRUFDeEMsd0NBQXdDO0FBQUEsRUFDeEMsb0NBQW9DO0FBQUEsRUFDcEMsb0NBQW9DO0FBQUEsRUFDcEMsd0NBQXdDO0FBQUEsRUFDeEMsbUJBQW1CO0FBQUEsRUFDbkIsaURBQ0k7QUFBQSxFQUNKLDZDQUNJO0FBQUEsRUFDSix3Q0FBd0M7QUFBQSxFQUN4QyxxQkFBcUI7QUFBQSxFQUNyQiw4QkFBOEI7QUFBQSxFQUM5Qiw2QkFBNkI7QUFBQSxFQUM3QixrQ0FBa0M7QUFBQSxFQUNsQyx3QkFBd0I7QUFBQSxFQUN4QixpQ0FBaUM7QUFBQSxFQUNqQyxpQ0FBaUM7QUFBQSxFQUNqQywyQkFBMkI7QUFBQSxFQUMzQixvQ0FBb0M7QUFBQSxFQUNwQyxPQUFPO0FBQUEsRUFDUCx3QkFBd0I7QUFBQSxFQUN4QixnQkFBZ0I7QUFBQSxFQUNoQixxQkFBcUI7QUFBQSxFQUNyQixrQkFBa0I7QUFBQSxFQUNsQix1QkFBdUI7QUFBQSxFQUN2QixnQkFBZ0I7QUFBQSxFQUNoQixrQ0FBa0M7QUFBQSxFQUNsQyx1Q0FBdUM7QUFBQSxFQUN2Qyx5QkFBeUI7QUFBQSxFQUN6QixhQUFhO0FBQUEsRUFDYixzQkFBc0I7QUFBQSxFQUN0QixnQkFBZ0I7QUFBQSxFQUNoQixtQ0FBbUM7QUFBQSxFQUNuQyx3Q0FDSTtBQUFBLEVBQ0osV0FBVztBQUFBLEVBQ1gsc0JBQXNCO0FBQUEsRUFDdEIsV0FBVztBQUFBLEVBQ1gsZ0JBQWdCO0FBQUEsRUFDaEIsdUJBQXVCO0FBQUEsRUFDdkIsdUJBQXVCO0FBQUEsRUFDdkIsNEJBQTRCO0FBQUEsRUFDNUIsWUFBWTtBQUFBLEVBQ1osaUJBQWlCO0FBQUEsRUFDakIsd0JBQXdCO0FBQUEsRUFDeEIsY0FBYztBQUFBLEVBQ2QsbUJBQW1CO0FBQUEsRUFDbkIsMEJBQTBCO0FBQUEsRUFDMUIsa0JBQWtCO0FBQUEsRUFDbEIsdUJBQXVCO0FBQUEsRUFDdkIsU0FBUztBQUFBLEVBQ1Qsb0JBQW9CO0FBQUE7QUFBQSxFQUdwQixvQkFBb0I7QUFBQSxFQUNwQixPQUFPO0FBQUEsRUFDUCxLQUFLO0FBQUEsRUFDTCxXQUFXO0FBQUEsRUFDWCxPQUFPO0FBQUEsRUFDUCxVQUFVO0FBQUE7QUFBQSxFQUdWLGFBQWE7QUFBQSxFQUNiLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULE1BQU07QUFBQSxFQUNOLFVBQVU7QUFBQSxFQUNWLFVBQVU7QUFBQSxFQUNWLGVBQWU7QUFBQSxFQUNmLFdBQVc7QUFBQSxFQUNYLE1BQU07QUFBQSxFQUNOLGlCQUFpQjtBQUFBLEVBQ2pCLGlCQUFpQjtBQUFBLEVBQ2pCLFdBQVc7QUFBQSxFQUNYLGdCQUFnQjtBQUFBLEVBQ2hCLE9BQU87QUFBQSxFQUNQLG1CQUFtQjtBQUFBLEVBQ25CLE9BQU87QUFBQSxFQUNQLGVBQWU7QUFBQSxFQUNmLFlBQVk7QUFBQSxFQUNaLGlCQUFpQjtBQUFBLEVBQ2pCLGVBQWU7QUFBQSxFQUNmLGlCQUFpQjtBQUFBLEVBQ2pCLGtCQUFrQjtBQUFBLEVBQ2xCLG9CQUFvQjtBQUN4Qjs7O0FoQ3BJTyxJQUFNLFlBQWlEO0FBQUEsRUFDMUQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsSUFBSTtBQUFBLEVBQ0o7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsU0FBUztBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsSUFBSTtBQUFBLEVBQ0o7QUFBQSxFQUNBO0FBQUEsRUFDQSxTQUFTO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxTQUFTO0FBQUEsRUFDVCxTQUFTO0FBQ2I7QUFFQSxJQUFNLFNBQVMsVUFBVSx1QkFBTyxPQUFPLENBQUM7QUFHeEMsU0FBUyxZQUFZLEtBQWEsUUFBeUM7QUFDdkUsUUFBTUMsU0FBa0IsT0FBTyxLQUFLLE1BQU07QUFDMUMsUUFBTSxPQUFrQixPQUFPLE9BQU8sTUFBTTtBQUM1QyxTQUFPLElBQUksU0FBUyxHQUFHQSxRQUFPLFlBQVksR0FBRyxLQUFLLEVBQUUsR0FBRyxJQUFJO0FBQy9EO0FBRU8sU0FBUyxFQUFFLEtBQXNCLFFBQTBDO0FBQzlFLE1BQUksQ0FBQyxRQUFRO0FBQ1QsWUFBUSxNQUFNLHFCQUFxQix1QkFBTyxPQUFPLENBQUMsYUFBYTtBQUFBLEVBQ25FO0FBRUEsUUFBTSxTQUFVLFVBQVUsT0FBTyxHQUFHLEtBQU0sV0FBRyxHQUFHO0FBRWhELE1BQUksUUFBUTtBQUNSLFdBQU8sWUFBWSxRQUFRLE1BQU07QUFBQSxFQUNyQztBQUVBLFNBQU87QUFDWDs7O0FEN0NPLElBQU0sbUJBQStCO0FBQUE7QUFBQSxFQUV4QyxtQkFBbUIsRUFBRSxNQUFNO0FBQUEsRUFDM0IsbUJBQW1CLEVBQUUsTUFBTTtBQUFBLEVBQzNCLG1CQUFtQixFQUFFLE1BQU07QUFBQSxFQUMzQixlQUFlLENBQUMsYUFBYTtBQUFBLEVBQzdCLHVCQUF1QjtBQUFBLEVBQ3ZCLHVCQUF1QjtBQUFBLEVBQ3ZCLGtCQUFrQjtBQUFBLEVBQ2xCLG9CQUFvQjtBQUFBLEVBQ3BCLDJCQUEyQiwwQkFBUyxXQUFXLE1BQU07QUFBQSxFQUNyRCwwQkFBMEIsMEJBQVMsV0FBVyxNQUFNO0FBQUEsRUFDcEQsb0JBQW9CO0FBQUEsRUFDcEIsb0JBQW9CO0FBQUEsRUFDcEIsb0JBQW9CO0FBQUEsRUFFcEIsMkJBQTJCO0FBQUEsRUFDM0IseUJBQXlCO0FBQUEsRUFDekIsOEJBQThCO0FBQUEsRUFDOUIseUJBQXlCO0FBQUEsRUFDekIsaUNBQWlDO0FBQUEsRUFDakMsd0JBQXdCO0FBQUEsRUFDeEIsZ0NBQWdDO0FBQUEsRUFDaEMsY0FBYztBQUFBO0FBQUEsRUFFZCwrQkFBK0I7QUFBQSxFQUMvQixjQUFjLENBQUMsU0FBUztBQUFBLEVBQ3hCLHFCQUFxQixDQUFDO0FBQUEsRUFDdEIsZ0JBQWdCO0FBQUEsRUFDaEIsY0FBYztBQUFBLEVBQ2QsOEJBQThCO0FBQUEsRUFDOUIsMEJBQTBCO0FBQUE7QUFBQSxFQUUxQixrQ0FBa0M7QUFBQTtBQUFBLEVBRWxDLFVBQVU7QUFBQSxFQUNWLHNCQUFzQjtBQUFBLEVBQ3RCLFdBQVc7QUFBQSxFQUNYLGlCQUFpQjtBQUFBLEVBQ2pCLGVBQWU7QUFBQTtBQUFBLEVBRWYsbUJBQW1CO0FBQ3ZCO0FBRU8sU0FBUyxnQkFBZ0IsVUFBc0I7QUFDbEQsTUFDSSxTQUFTLHNCQUFzQixRQUMvQixTQUFTLHNCQUFzQixRQUMvQixTQUFTLHNCQUFzQixNQUNqQztBQUNFLFlBQVEsSUFBSSx1Q0FBdUMsU0FBUyxrQkFBa0IsRUFBRTtBQUNoRixhQUFTLHFCQUFxQixTQUFTLHFCQUNqQyxtQkFDQTtBQUNOLGFBQVMscUJBQXFCO0FBRzlCLGFBQVMscUJBQXFCO0FBQUEsRUFDbEM7QUFDSjtBQUdBLElBQUkscUJBQXFCO0FBQ3pCLFNBQVMsb0JBQW9CQyxXQUE0QjtBQUNyRCxlQUFhLGtCQUFrQjtBQUMvQix1QkFBcUIsT0FBTyxXQUFXQSxXQUFVLEdBQUc7QUFDeEQ7QUFFTyxJQUFNLGVBQU4sY0FBMkIsa0NBQWlCO0FBQUEsRUFHL0MsWUFBWUMsTUFBVSxRQUFrQjtBQUNwQyxVQUFNQSxNQUFLLE1BQU07QUFDakIsU0FBSyxTQUFTO0FBQUEsRUFDbEI7QUFBQSxFQUVBLFVBQWdCO0FBQ1osVUFBTSxFQUFFLFlBQVksSUFBSTtBQUV4QixnQkFBWSxNQUFNO0FBRWxCLFVBQU0sU0FBUyxZQUFZLFNBQVMsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLGlCQUFpQixDQUFDLEdBQUcsQ0FBQztBQUM3RSxXQUFPLFNBQVMsYUFBYTtBQUU3QixnQkFBWSxVQUFVLEVBQUUsWUFBWSxFQUFFLGNBQWM7QUFBQSxNQUNoRCxVQUFVO0FBQUEsSUFDZCxDQUFDO0FBRUQsUUFBSSx5QkFBUSxXQUFXLEVBQ2xCLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxFQUM5QixRQUFRLEVBQUUsd0JBQXdCLENBQUMsRUFDbkM7QUFBQSxNQUFZLENBQUMsU0FDVixLQUNLLFNBQVMsS0FBSyxPQUFPLEtBQUssU0FBUyxvQkFBb0IsS0FBSyxJQUFJLENBQUMsRUFDakUsU0FBUyxDQUFDLFVBQVU7QUFDakIsNEJBQW9CLFlBQVk7QUFDNUIsZUFBSyxPQUFPLEtBQUssU0FBUyxzQkFBc0IsTUFDM0MsTUFBTSxLQUFLLEVBQ1gsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFDbkIsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNwQixnQkFBTSxLQUFLLE9BQU8sZUFBZTtBQUFBLFFBQ3JDLENBQUM7QUFBQSxNQUNMLENBQUM7QUFBQSxJQUNUO0FBRUosZ0JBQVksU0FBUyxNQUFNLEVBQUUsTUFBTSxHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQztBQUV6RCxRQUFJLHlCQUFRLFdBQVcsRUFDbEIsUUFBUSxFQUFFLGdCQUFnQixDQUFDLEVBQzNCLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxFQUNoQztBQUFBLE1BQVksQ0FBQyxTQUNWLEtBQ0ssU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLGNBQWMsS0FBSyxHQUFHLENBQUMsRUFDMUQsU0FBUyxDQUFDLFVBQVU7QUFDakIsNEJBQW9CLFlBQVk7QUFDNUIsZUFBSyxPQUFPLEtBQUssU0FBUyxnQkFBZ0IsTUFBTSxNQUFNLEtBQUs7QUFDM0QsZ0JBQU0sS0FBSyxPQUFPLGVBQWU7QUFBQSxRQUNyQyxDQUFDO0FBQUEsTUFDTCxDQUFDO0FBQUEsSUFDVDtBQUVKLFFBQUkseUJBQVEsV0FBVyxFQUNsQixRQUFRLEVBQUUsMEJBQTBCLENBQUMsRUFDckMsUUFBUSxFQUFFLCtCQUErQixDQUFDLEVBQzFDO0FBQUEsTUFBVSxDQUFDLFdBQ1IsT0FDSyxTQUFTLEtBQUssT0FBTyxLQUFLLFNBQVMscUJBQXFCLEVBQ3hELFNBQVMsT0FBTyxVQUFVO0FBQ3ZCLGFBQUssT0FBTyxLQUFLLFNBQVMsd0JBQXdCO0FBQ2xELGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFBQSxNQUNyQyxDQUFDO0FBQUEsSUFDVDtBQUVKLFFBQUkseUJBQVEsV0FBVyxFQUNsQixRQUFRLEVBQUUsNEJBQTRCLENBQUMsRUFDdkMsUUFBUSxFQUFFLGlDQUFpQyxDQUFDLEVBQzVDO0FBQUEsTUFBVSxDQUFDLFdBQ1IsT0FDSyxTQUFTLEtBQUssT0FBTyxLQUFLLFNBQVMscUJBQXFCLEVBQ3hELFNBQVMsT0FBTyxVQUFVO0FBQ3ZCLGFBQUssT0FBTyxLQUFLLFNBQVMsd0JBQXdCO0FBQ2xELGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFBQSxNQUNyQyxDQUFDO0FBQUEsSUFDVDtBQUVKLFFBQUkseUJBQVEsV0FBVyxFQUNsQixRQUFRLEVBQUUsNkJBQTZCLENBQUMsRUFDeEMsUUFBUSxFQUFFLGtDQUFrQyxDQUFDLEVBQzdDO0FBQUEsTUFBVSxDQUFDLFdBQ1IsT0FDSyxTQUFTLEtBQUssT0FBTyxLQUFLLFNBQVMsZ0JBQWdCLEVBQ25ELFNBQVMsT0FBTyxVQUFVO0FBQ3ZCLGFBQUssT0FBTyxLQUFLLFNBQVMsbUJBQW1CO0FBQzdDLGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFBQSxNQUNyQyxDQUFDO0FBQUEsSUFDVDtBQUVKLFFBQUkseUJBQVEsV0FBVyxFQUNsQixRQUFRLEVBQUUsbUJBQW1CLENBQUMsRUFDOUIsUUFBUSxFQUFFLHdCQUF3QixDQUFDLEVBQ25DO0FBQUEsTUFBVSxDQUFDLFdBQ1IsT0FDSyxTQUFTLEtBQUssT0FBTyxLQUFLLFNBQVMsa0JBQWtCLEVBQ3JELFNBQVMsT0FBTyxVQUFVO0FBQ3ZCLGFBQUssT0FBTyxLQUFLLFNBQVMscUJBQXFCO0FBQy9DLGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFBQSxNQUNyQyxDQUFDO0FBQUEsSUFDVDtBQUVKLFFBQUkseUJBQVEsV0FBVyxFQUNsQixRQUFRLEVBQUUsMkJBQTJCLENBQUMsRUFDdEMsUUFBUSxFQUFFLDhCQUE4QixDQUFDLEVBQ3pDO0FBQUEsTUFBVSxDQUFDLFdBQ1IsT0FDSyxVQUFVLElBQUksS0FBSyxDQUFDLEVBQ3BCLFNBQVMsS0FBSyxPQUFPLEtBQUssU0FBUyx5QkFBeUIsRUFDNUQsa0JBQWtCLEVBQ2xCLFNBQVMsT0FBTyxVQUFVO0FBQ3ZCLGFBQUssT0FBTyxLQUFLLFNBQVMsNEJBQTRCO0FBQ3RELGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFBQSxNQUNyQyxDQUFDO0FBQUEsSUFDVCxFQUNDLGVBQWUsQ0FBQyxXQUFXO0FBQ3hCLGFBQ0ssUUFBUSxPQUFPLEVBQ2YsV0FBVyxFQUFFLGVBQWUsQ0FBQyxFQUM3QixRQUFRLFlBQVk7QUFDakIsYUFBSyxPQUFPLEtBQUssU0FBUyw0QkFDdEIsaUJBQWlCO0FBQ3JCLGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFDakMsYUFBSyxRQUFRO0FBQUEsTUFDakIsQ0FBQztBQUFBLElBQ1QsQ0FBQztBQUVMLFFBQUkseUJBQVEsV0FBVyxFQUNsQixRQUFRLEVBQUUsMEJBQTBCLENBQUMsRUFDckMsUUFBUSxFQUFFLDhCQUE4QixDQUFDLEVBQ3pDO0FBQUEsTUFBVSxDQUFDLFdBQ1IsT0FDSyxVQUFVLElBQUksS0FBSyxDQUFDLEVBQ3BCLFNBQVMsS0FBSyxPQUFPLEtBQUssU0FBUyx3QkFBd0IsRUFDM0Qsa0JBQWtCLEVBQ2xCLFNBQVMsT0FBTyxVQUFVO0FBQ3ZCLGFBQUssT0FBTyxLQUFLLFNBQVMsMkJBQTJCO0FBQ3JELGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFBQSxNQUNyQyxDQUFDO0FBQUEsSUFDVCxFQUNDLGVBQWUsQ0FBQyxXQUFXO0FBQ3hCLGFBQ0ssUUFBUSxPQUFPLEVBQ2YsV0FBVyxFQUFFLGVBQWUsQ0FBQyxFQUM3QixRQUFRLFlBQVk7QUFDakIsYUFBSyxPQUFPLEtBQUssU0FBUywyQkFDdEIsaUJBQWlCO0FBQ3JCLGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFDakMsYUFBSyxRQUFRO0FBQUEsTUFDakIsQ0FBQztBQUFBLElBQ1QsQ0FBQztBQUVMLFFBQUkseUJBQVEsS0FBSyxXQUFXLEVBQ3ZCLFFBQVEsRUFBRSwrQkFBK0IsQ0FBQyxFQUMxQztBQUFBLE1BQVksQ0FBQyxhQUNWLFNBQ0ssV0FBVztBQUFBLFFBQ1Isb0JBQW9CLEVBQUUsd0NBQXdDO0FBQUEsUUFDOUQsb0JBQW9CLEVBQUUsd0NBQXdDO0FBQUEsUUFDOUQsZ0JBQWdCLEVBQUUsb0NBQW9DO0FBQUEsUUFDdEQsZ0JBQWdCLEVBQUUsb0NBQW9DO0FBQUEsUUFDdEQsNEJBQTRCLEVBQUUsd0NBQXdDO0FBQUEsTUFDMUUsQ0FBQyxFQUNBLFNBQVMsS0FBSyxPQUFPLEtBQUssU0FBUyxrQkFBa0IsRUFDckQsU0FBUyxPQUFPLFVBQVU7QUFDdkIsYUFBSyxPQUFPLEtBQUssU0FBUyxxQkFBcUI7QUFDL0MsY0FBTSxLQUFLLE9BQU8sZUFBZTtBQUdqQyxhQUFLLFFBQVE7QUFBQSxNQUNqQixDQUFDO0FBQUEsSUFDVDtBQUVKLFVBQU0sbUJBQ0YsS0FBSyxPQUFPLEtBQUssU0FBUyxzQkFBc0I7QUFDcEQsUUFBSSx5QkFBUSxLQUFLLFdBQVcsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLENBQUMsRUFBRTtBQUFBLE1BQVksQ0FBQyxhQUN2RSxTQUNLO0FBQUEsUUFDRyxtQkFDTTtBQUFBLFVBQ0ksNkJBQTZCO0FBQUEsWUFDekI7QUFBQSxVQUNKO0FBQUEsVUFDQSx5QkFBeUI7QUFBQSxZQUNyQjtBQUFBLFVBQ0o7QUFBQSxRQUNKLElBQ0E7QUFBQSxVQUNJLDRCQUE0QjtBQUFBLFlBQ3hCO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxNQUNWLEVBQ0M7QUFBQSxRQUNHLG1CQUNNLEtBQUssT0FBTyxLQUFLLFNBQVMscUJBQzFCO0FBQUEsTUFDVixFQUNDLFlBQVksQ0FBQyxnQkFBZ0IsRUFDN0IsU0FBUyxPQUFPLFVBQVU7QUFDdkIsYUFBSyxPQUFPLEtBQUssU0FBUyxxQkFBcUI7QUFDL0MsY0FBTSxLQUFLLE9BQU8sZUFBZTtBQUFBLE1BQ3JDLENBQUM7QUFBQSxJQUNUO0FBRUEsUUFBSSx5QkFBUSxXQUFXLEVBQUUsUUFBUSxFQUFFLDhCQUE4QixDQUFDLEVBQUU7QUFBQSxNQUFVLENBQUMsV0FDM0UsT0FDSyxTQUFTLEtBQUssT0FBTyxLQUFLLFNBQVMseUJBQXlCLEVBQzVELFNBQVMsT0FBTyxVQUFVO0FBQ3ZCLGFBQUssT0FBTyxLQUFLLFNBQVMsNEJBQTRCO0FBQ3RELGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFBQSxNQUNyQyxDQUFDO0FBQUEsSUFDVDtBQUVBLFFBQUkseUJBQVEsV0FBVyxFQUFFLFFBQVEsRUFBRSw2QkFBNkIsQ0FBQyxFQUFFO0FBQUEsTUFBVSxDQUFDLFdBQzFFLE9BQ0ssU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLHVCQUF1QixFQUMxRCxTQUFTLE9BQU8sVUFBVTtBQUN2QixhQUFLLE9BQU8sS0FBSyxTQUFTLDBCQUEwQjtBQUNwRCxjQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsTUFDckMsQ0FBQztBQUFBLElBQ1Q7QUFFQSxRQUFJLHlCQUFRLFdBQVcsRUFDbEIsUUFBUSxFQUFFLGtDQUFrQyxDQUFDLEVBQzdDO0FBQUEsTUFBVSxDQUFDLFdBQ1IsT0FDSyxTQUFTLEtBQUssT0FBTyxLQUFLLFNBQVMsNEJBQTRCLEVBQy9ELFNBQVMsT0FBTyxVQUFVO0FBQ3ZCLGFBQUssT0FBTyxLQUFLLFNBQVMsK0JBQStCO0FBQ3pELGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFBQSxNQUNyQyxDQUFDO0FBQUEsSUFDVDtBQUVKLFFBQUkseUJBQVEsV0FBVyxFQUNsQixRQUFRLEVBQUUsd0JBQXdCLENBQUMsRUFDbkMsUUFBUSxFQUFFLGlDQUFpQyxDQUFDLEVBQzVDO0FBQUEsTUFBUSxDQUFDLFNBQ04sS0FDSyxTQUFTLEtBQUssT0FBTyxLQUFLLFNBQVMsdUJBQXVCLEVBQzFELFNBQVMsQ0FBQyxVQUFVO0FBQ2pCLDRCQUFvQixZQUFZO0FBQzVCLGVBQUssT0FBTyxLQUFLLFNBQVMsMEJBQTBCO0FBQ3BELGdCQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsUUFDckMsQ0FBQztBQUFBLE1BQ0wsQ0FBQztBQUFBLElBQ1QsRUFDQyxlQUFlLENBQUMsV0FBVztBQUN4QixhQUNLLFFBQVEsT0FBTyxFQUNmLFdBQVcsRUFBRSxlQUFlLENBQUMsRUFDN0IsUUFBUSxZQUFZO0FBQ2pCLGFBQUssT0FBTyxLQUFLLFNBQVMsMEJBQ3RCLGlCQUFpQjtBQUNyQixjQUFNLEtBQUssT0FBTyxlQUFlO0FBQ2pDLGFBQUssUUFBUTtBQUFBLE1BQ2pCLENBQUM7QUFBQSxJQUNULENBQUM7QUFFTCxRQUFJLHlCQUFRLFdBQVcsRUFDbEIsUUFBUSxFQUFFLGlDQUFpQyxDQUFDLEVBQzVDLFFBQVEsRUFBRSxpQ0FBaUMsQ0FBQyxFQUM1QztBQUFBLE1BQVEsQ0FBQyxTQUNOLEtBQ0ssU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLCtCQUErQixFQUNsRSxTQUFTLENBQUMsVUFBVTtBQUNqQiw0QkFBb0IsWUFBWTtBQUM1QixlQUFLLE9BQU8sS0FBSyxTQUFTLGtDQUFrQztBQUM1RCxnQkFBTSxLQUFLLE9BQU8sZUFBZTtBQUFBLFFBQ3JDLENBQUM7QUFBQSxNQUNMLENBQUM7QUFBQSxJQUNULEVBQ0MsZUFBZSxDQUFDLFdBQVc7QUFDeEIsYUFDSyxRQUFRLE9BQU8sRUFDZixXQUFXLEVBQUUsZUFBZSxDQUFDLEVBQzdCLFFBQVEsWUFBWTtBQUNqQixhQUFLLE9BQU8sS0FBSyxTQUFTLGtDQUN0QixpQkFBaUI7QUFDckIsY0FBTSxLQUFLLE9BQU8sZUFBZTtBQUNqQyxhQUFLLFFBQVE7QUFBQSxNQUNqQixDQUFDO0FBQUEsSUFDVCxDQUFDO0FBRUwsUUFBSSx5QkFBUSxXQUFXLEVBQ2xCLFFBQVEsRUFBRSwyQkFBMkIsQ0FBQyxFQUN0QyxRQUFRLEVBQUUsaUNBQWlDLENBQUMsRUFDNUM7QUFBQSxNQUFRLENBQUMsU0FDTixLQUNLLFNBQVMsS0FBSyxPQUFPLEtBQUssU0FBUyxzQkFBc0IsRUFDekQsU0FBUyxDQUFDLFVBQVU7QUFDakIsNEJBQW9CLFlBQVk7QUFDNUIsZUFBSyxPQUFPLEtBQUssU0FBUyx5QkFBeUI7QUFDbkQsZ0JBQU0sS0FBSyxPQUFPLGVBQWU7QUFBQSxRQUNyQyxDQUFDO0FBQUEsTUFDTCxDQUFDO0FBQUEsSUFDVCxFQUNDLGVBQWUsQ0FBQyxXQUFXO0FBQ3hCLGFBQ0ssUUFBUSxPQUFPLEVBQ2YsV0FBVyxFQUFFLGVBQWUsQ0FBQyxFQUM3QixRQUFRLFlBQVk7QUFDakIsYUFBSyxPQUFPLEtBQUssU0FBUyx5QkFDdEIsaUJBQWlCO0FBQ3JCLGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFDakMsYUFBSyxRQUFRO0FBQUEsTUFDakIsQ0FBQztBQUFBLElBQ1QsQ0FBQztBQUVMLFFBQUkseUJBQVEsV0FBVyxFQUNsQixRQUFRLEVBQUUsb0NBQW9DLENBQUMsRUFDL0MsUUFBUSxFQUFFLGlDQUFpQyxDQUFDLEVBQzVDO0FBQUEsTUFBUSxDQUFDLFNBQ04sS0FDSyxTQUFTLEtBQUssT0FBTyxLQUFLLFNBQVMsOEJBQThCLEVBQ2pFLFNBQVMsQ0FBQyxVQUFVO0FBQ2pCLDRCQUFvQixZQUFZO0FBQzVCLGVBQUssT0FBTyxLQUFLLFNBQVMsaUNBQWlDO0FBQzNELGdCQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsUUFDckMsQ0FBQztBQUFBLE1BQ0wsQ0FBQztBQUFBLElBQ1QsRUFDQyxlQUFlLENBQUMsV0FBVztBQUN4QixhQUNLLFFBQVEsT0FBTyxFQUNmLFdBQVcsRUFBRSxlQUFlLENBQUMsRUFDN0IsUUFBUSxZQUFZO0FBQ2pCLGFBQUssT0FBTyxLQUFLLFNBQVMsaUNBQ3RCLGlCQUFpQjtBQUNyQixjQUFNLEtBQUssT0FBTyxlQUFlO0FBQ2pDLGFBQUssUUFBUTtBQUFBLE1BQ2pCLENBQUM7QUFBQSxJQUNULENBQUM7QUFFTCxRQUFJLHlCQUFRLFdBQVcsRUFDbEIsUUFBUSxFQUFFLHNCQUFzQixDQUFDLEVBQ2pDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxFQUNoQztBQUFBLE1BQVEsQ0FBQyxTQUNOLEtBQUssU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxVQUFVO0FBQzNFLDRCQUFvQixZQUFZO0FBQzVCLGVBQUssT0FBTyxLQUFLLFNBQVMsb0JBQW9CO0FBQzlDLGdCQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsUUFDckMsQ0FBQztBQUFBLE1BQ0wsQ0FBQztBQUFBLElBQ0wsRUFDQyxlQUFlLENBQUMsV0FBVztBQUN4QixhQUNLLFFBQVEsT0FBTyxFQUNmLFdBQVcsRUFBRSxlQUFlLENBQUMsRUFDN0IsUUFBUSxZQUFZO0FBQ2pCLGFBQUssT0FBTyxLQUFLLFNBQVMsb0JBQ3RCLGlCQUFpQjtBQUNyQixjQUFNLEtBQUssT0FBTyxlQUFlO0FBQ2pDLGFBQUssUUFBUTtBQUFBLE1BQ2pCLENBQUM7QUFBQSxJQUNULENBQUM7QUFFTCxRQUFJLHlCQUFRLFdBQVcsRUFDbEIsUUFBUSxFQUFFLHNCQUFzQixDQUFDLEVBQ2pDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxFQUNoQztBQUFBLE1BQVEsQ0FBQyxTQUNOLEtBQUssU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxVQUFVO0FBQzNFLDRCQUFvQixZQUFZO0FBQzVCLGVBQUssT0FBTyxLQUFLLFNBQVMsb0JBQW9CO0FBQzlDLGdCQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsUUFDckMsQ0FBQztBQUFBLE1BQ0wsQ0FBQztBQUFBLElBQ0wsRUFDQyxlQUFlLENBQUMsV0FBVztBQUN4QixhQUNLLFFBQVEsT0FBTyxFQUNmLFdBQVcsRUFBRSxlQUFlLENBQUMsRUFDN0IsUUFBUSxZQUFZO0FBQ2pCLGFBQUssT0FBTyxLQUFLLFNBQVMsb0JBQ3RCLGlCQUFpQjtBQUNyQixjQUFNLEtBQUssT0FBTyxlQUFlO0FBQ2pDLGFBQUssUUFBUTtBQUFBLE1BQ2pCLENBQUM7QUFBQSxJQUNULENBQUM7QUFFTCxRQUFJLHlCQUFRLFdBQVcsRUFDbEIsUUFBUSxFQUFFLHNCQUFzQixDQUFDLEVBQ2pDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxFQUNoQztBQUFBLE1BQVEsQ0FBQyxTQUNOLEtBQUssU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxVQUFVO0FBQzNFLDRCQUFvQixZQUFZO0FBQzVCLGVBQUssT0FBTyxLQUFLLFNBQVMsb0JBQW9CO0FBQzlDLGdCQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsUUFDckMsQ0FBQztBQUFBLE1BQ0wsQ0FBQztBQUFBLElBQ0wsRUFDQyxlQUFlLENBQUMsV0FBVztBQUN4QixhQUNLLFFBQVEsT0FBTyxFQUNmLFdBQVcsRUFBRSxlQUFlLENBQUMsRUFDN0IsUUFBUSxZQUFZO0FBQ2pCLGFBQUssT0FBTyxLQUFLLFNBQVMsb0JBQ3RCLGlCQUFpQjtBQUNyQixjQUFNLEtBQUssT0FBTyxlQUFlO0FBQ2pDLGFBQUssUUFBUTtBQUFBLE1BQ2pCLENBQUM7QUFBQSxJQUNULENBQUM7QUFFTCxnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDO0FBRXBELFFBQUkseUJBQVEsV0FBVyxFQUFFLFFBQVEsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFO0FBQUEsTUFBVSxDQUFDLFdBQ3JFLE9BQ0ssU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLDZCQUE2QixFQUNoRSxTQUFTLE9BQU8sVUFBVTtBQUN2QixhQUFLLE9BQU8sS0FBSyxTQUFTLGdDQUFnQztBQUMxRCxjQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsTUFDckMsQ0FBQztBQUFBLElBQ1Q7QUFFQSxRQUFJLHlCQUFRLFdBQVcsRUFDbEIsUUFBUSxFQUFFLGdCQUFnQixDQUFDLEVBQzNCLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxFQUNoQztBQUFBLE1BQVksQ0FBQyxTQUNWLEtBQ0ssU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLGFBQWEsS0FBSyxHQUFHLENBQUMsRUFDekQsU0FBUyxDQUFDLFVBQVU7QUFDakIsNEJBQW9CLFlBQVk7QUFDNUIsZUFBSyxPQUFPLEtBQUssU0FBUyxlQUFlLE1BQU0sTUFBTSxLQUFLO0FBQzFELGdCQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsUUFDckMsQ0FBQztBQUFBLE1BQ0wsQ0FBQztBQUFBLElBQ1Q7QUFFSixRQUFJLHlCQUFRLFdBQVcsRUFDbEIsUUFBUSxFQUFFLGtCQUFrQixDQUFDLEVBQzdCLFFBQVEsRUFBRSx1QkFBdUIsQ0FBQyxFQUNsQztBQUFBLE1BQVUsQ0FBQyxXQUNSLE9BQ0ssU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLGNBQWMsRUFDakQsU0FBUyxPQUFPLFVBQVU7QUFDdkIsYUFBSyxPQUFPLEtBQUssU0FBUyxpQkFBaUI7QUFDM0MsY0FBTSxLQUFLLE9BQU8sZUFBZTtBQUFBLE1BQ3JDLENBQUM7QUFBQSxJQUNUO0FBRUosUUFBSSx5QkFBUSxXQUFXLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLEVBQUU7QUFBQSxNQUFVLENBQUMsV0FDN0QsT0FBTyxTQUFTLEtBQUssT0FBTyxLQUFLLFNBQVMsWUFBWSxFQUFFLFNBQVMsT0FBTyxVQUFVO0FBQzlFLGFBQUssT0FBTyxLQUFLLFNBQVMsZUFBZTtBQUN6QyxjQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsTUFDckMsQ0FBQztBQUFBLElBQ0w7QUFFQSxRQUFJLHlCQUFRLFdBQVcsRUFDbEIsUUFBUSxFQUFFLGtDQUFrQyxDQUFDLEVBQzdDLFFBQVEsRUFBRSx1Q0FBdUMsQ0FBQyxFQUNsRDtBQUFBLE1BQVUsQ0FBQyxXQUNSLE9BQ0ssU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLDRCQUE0QixFQUMvRCxTQUFTLE9BQU8sVUFBVTtBQUN2QixhQUFLLE9BQU8sS0FBSyxTQUFTLCtCQUErQjtBQUN6RCxjQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsTUFDckMsQ0FBQztBQUFBLElBQ1Q7QUFFSixRQUFJLHlCQUFRLFdBQVcsRUFDbEIsUUFBUSxFQUFFLHlCQUF5QixDQUFDLEVBQ3BDO0FBQUEsTUFBUSxDQUFDLFNBQ04sS0FDSyxTQUFTLEtBQUssT0FBTyxLQUFLLFNBQVMseUJBQXlCLFNBQVMsQ0FBQyxFQUN0RSxTQUFTLENBQUMsVUFBVTtBQUNqQiw0QkFBb0IsWUFBWTtBQUM1QixnQkFBTSxXQUFtQixPQUFPLFNBQVMsS0FBSztBQUM5QyxjQUFJLENBQUMsTUFBTSxRQUFRLEdBQUc7QUFDbEIsZ0JBQUksV0FBVyxHQUFHO0FBQ2Qsa0JBQUksd0JBQU8sRUFBRSxhQUFhLENBQUM7QUFDM0IsbUJBQUs7QUFBQSxnQkFDRCxLQUFLLE9BQU8sS0FBSyxTQUFTLHlCQUF5QixTQUFTO0FBQUEsY0FDaEU7QUFDQTtBQUFBLFlBQ0o7QUFFQSxpQkFBSyxPQUFPLEtBQUssU0FBUywyQkFBMkI7QUFDckQsa0JBQU0sS0FBSyxPQUFPLGVBQWU7QUFBQSxVQUNyQyxPQUFPO0FBQ0gsZ0JBQUksd0JBQU8sRUFBRSxzQkFBc0IsQ0FBQztBQUFBLFVBQ3hDO0FBQUEsUUFDSixDQUFDO0FBQUEsTUFDTCxDQUFDO0FBQUEsSUFDVCxFQUNDLGVBQWUsQ0FBQyxXQUFXO0FBQ3hCLGFBQ0ssUUFBUSxPQUFPLEVBQ2YsV0FBVyxFQUFFLGVBQWUsQ0FBQyxFQUM3QixRQUFRLFlBQVk7QUFDakIsYUFBSyxPQUFPLEtBQUssU0FBUywyQkFDdEIsaUJBQWlCO0FBQ3JCLGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFDakMsYUFBSyxRQUFRO0FBQUEsTUFDakIsQ0FBQztBQUFBLElBQ1QsQ0FBQztBQUVMLGdCQUFZLFNBQVMsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztBQUU3RCxRQUFJLHlCQUFRLFdBQVcsRUFDbEIsUUFBUSxFQUFFLG1DQUFtQyxDQUFDLEVBQzlDLFFBQVEsRUFBRSx3Q0FBd0MsQ0FBQyxFQUNuRDtBQUFBLE1BQVUsQ0FBQyxXQUNSLE9BQ0ssU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLGdDQUFnQyxFQUNuRSxTQUFTLE9BQU8sVUFBVTtBQUN2QixhQUFLLE9BQU8sS0FBSyxTQUFTLG1DQUFtQztBQUM3RCxjQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsTUFDckMsQ0FBQztBQUFBLElBQ1Q7QUFFSixnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDO0FBQ3hELGdCQUFZLFVBQVUsRUFBRSxZQUFZLEVBQUUsd0JBQXdCO0FBQUEsTUFDMUQsVUFBVTtBQUFBLElBQ2QsQ0FBQztBQUVELFFBQUkseUJBQVEsV0FBVyxFQUNsQixRQUFRLEVBQUUsV0FBVyxDQUFDLEVBQ3RCLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxFQUMzQjtBQUFBLE1BQVEsQ0FBQyxTQUNOLEtBQUssU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLFNBQVMsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLFVBQVU7QUFDN0UsNEJBQW9CLFlBQVk7QUFDNUIsZ0JBQU0sV0FBbUIsT0FBTyxTQUFTLEtBQUs7QUFDOUMsY0FBSSxDQUFDLE1BQU0sUUFBUSxHQUFHO0FBQ2xCLGdCQUFJLFdBQVcsS0FBSztBQUNoQixrQkFBSSx3QkFBTyxFQUFFLHVCQUF1QixDQUFDO0FBQ3JDLG1CQUFLLFNBQVMsS0FBSyxPQUFPLEtBQUssU0FBUyxTQUFTLFNBQVMsQ0FBQztBQUMzRDtBQUFBLFlBQ0o7QUFFQSxpQkFBSyxPQUFPLEtBQUssU0FBUyxXQUFXO0FBQ3JDLGtCQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsVUFDckMsT0FBTztBQUNILGdCQUFJLHdCQUFPLEVBQUUsc0JBQXNCLENBQUM7QUFBQSxVQUN4QztBQUFBLFFBQ0osQ0FBQztBQUFBLE1BQ0wsQ0FBQztBQUFBLElBQ0wsRUFDQyxlQUFlLENBQUMsV0FBVztBQUN4QixhQUNLLFFBQVEsT0FBTyxFQUNmLFdBQVcsRUFBRSxlQUFlLENBQUMsRUFDN0IsUUFBUSxZQUFZO0FBQ2pCLGFBQUssT0FBTyxLQUFLLFNBQVMsV0FBVyxpQkFBaUI7QUFDdEQsY0FBTSxLQUFLLE9BQU8sZUFBZTtBQUNqQyxhQUFLLFFBQVE7QUFBQSxNQUNqQixDQUFDO0FBQUEsSUFDVCxDQUFDO0FBRUwsUUFBSSx5QkFBUSxXQUFXLEVBQ2xCLFFBQVEsRUFBRSx1QkFBdUIsQ0FBQyxFQUNsQyxRQUFRLEVBQUUsNEJBQTRCLENBQUMsRUFDdkM7QUFBQSxNQUFVLENBQUMsV0FDUixPQUNLLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFDbEIsU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLHVCQUF1QixHQUFHLEVBQzdELGtCQUFrQixFQUNsQixTQUFTLE9BQU8sVUFBa0I7QUFDL0IsYUFBSyxPQUFPLEtBQUssU0FBUyx1QkFBdUIsUUFBUTtBQUN6RCxjQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsTUFDckMsQ0FBQztBQUFBLElBQ1QsRUFDQyxlQUFlLENBQUMsV0FBVztBQUN4QixhQUNLLFFBQVEsT0FBTyxFQUNmLFdBQVcsRUFBRSxlQUFlLENBQUMsRUFDN0IsUUFBUSxZQUFZO0FBQ2pCLGFBQUssT0FBTyxLQUFLLFNBQVMsdUJBQ3RCLGlCQUFpQjtBQUNyQixjQUFNLEtBQUssT0FBTyxlQUFlO0FBQ2pDLGFBQUssUUFBUTtBQUFBLE1BQ2pCLENBQUM7QUFBQSxJQUNULENBQUM7QUFFTCxRQUFJLHlCQUFRLFdBQVcsRUFDbEIsUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUN2QixRQUFRLEVBQUUsaUJBQWlCLENBQUMsRUFDNUI7QUFBQSxNQUFRLENBQUMsU0FDTixLQUNLLFVBQVUsS0FBSyxPQUFPLEtBQUssU0FBUyxZQUFZLEtBQUssU0FBUyxDQUFDLEVBQy9ELFNBQVMsQ0FBQyxVQUFVO0FBQ2pCLDRCQUFvQixZQUFZO0FBQzVCLGdCQUFNLFdBQW1CLE9BQU8sU0FBUyxLQUFLLElBQUk7QUFDbEQsY0FBSSxDQUFDLE1BQU0sUUFBUSxHQUFHO0FBQ2xCLGdCQUFJLFdBQVcsR0FBSztBQUNoQixrQkFBSSx3QkFBTyxFQUFFLHdCQUF3QixDQUFDO0FBQ3RDLG1CQUFLO0FBQUEsaUJBQ0EsS0FBSyxPQUFPLEtBQUssU0FBUyxZQUFZLEtBQUssU0FBUztBQUFBLGNBQ3pEO0FBQ0E7QUFBQSxZQUNKO0FBRUEsaUJBQUssT0FBTyxLQUFLLFNBQVMsWUFBWTtBQUN0QyxrQkFBTSxLQUFLLE9BQU8sZUFBZTtBQUFBLFVBQ3JDLE9BQU87QUFDSCxnQkFBSSx3QkFBTyxFQUFFLHNCQUFzQixDQUFDO0FBQUEsVUFDeEM7QUFBQSxRQUNKLENBQUM7QUFBQSxNQUNMLENBQUM7QUFBQSxJQUNULEVBQ0MsZUFBZSxDQUFDLFdBQVc7QUFDeEIsYUFDSyxRQUFRLE9BQU8sRUFDZixXQUFXLEVBQUUsZUFBZSxDQUFDLEVBQzdCLFFBQVEsWUFBWTtBQUNqQixhQUFLLE9BQU8sS0FBSyxTQUFTLFlBQVksaUJBQWlCO0FBQ3ZELGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFDakMsYUFBSyxRQUFRO0FBQUEsTUFDakIsQ0FBQztBQUFBLElBQ1QsQ0FBQztBQUVMLFFBQUkseUJBQVEsV0FBVyxFQUNsQixRQUFRLEVBQUUsY0FBYyxDQUFDLEVBQ3pCLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxFQUM5QjtBQUFBLE1BQVEsQ0FBQyxTQUNOLEtBQ0ssU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLGdCQUFnQixTQUFTLENBQUMsRUFDN0QsU0FBUyxDQUFDLFVBQVU7QUFDakIsNEJBQW9CLFlBQVk7QUFDNUIsZ0JBQU0sV0FBbUIsT0FBTyxTQUFTLEtBQUs7QUFDOUMsY0FBSSxDQUFDLE1BQU0sUUFBUSxHQUFHO0FBQ2xCLGdCQUFJLFdBQVcsR0FBRztBQUNkLGtCQUFJLHdCQUFPLEVBQUUsMEJBQTBCLENBQUM7QUFDeEMsbUJBQUs7QUFBQSxnQkFDRCxLQUFLLE9BQU8sS0FBSyxTQUFTLGdCQUFnQixTQUFTO0FBQUEsY0FDdkQ7QUFDQTtBQUFBLFlBQ0o7QUFFQSxpQkFBSyxPQUFPLEtBQUssU0FBUyxrQkFBa0I7QUFDNUMsa0JBQU0sS0FBSyxPQUFPLGVBQWU7QUFBQSxVQUNyQyxPQUFPO0FBQ0gsZ0JBQUksd0JBQU8sRUFBRSxzQkFBc0IsQ0FBQztBQUFBLFVBQ3hDO0FBQUEsUUFDSixDQUFDO0FBQUEsTUFDTCxDQUFDO0FBQUEsSUFDVCxFQUNDLGVBQWUsQ0FBQyxXQUFXO0FBQ3hCLGFBQ0ssUUFBUSxPQUFPLEVBQ2YsV0FBVyxFQUFFLGVBQWUsQ0FBQyxFQUM3QixRQUFRLFlBQVk7QUFDakIsYUFBSyxPQUFPLEtBQUssU0FBUyxrQkFDdEIsaUJBQWlCO0FBQ3JCLGNBQU0sS0FBSyxPQUFPLGVBQWU7QUFDakMsYUFBSyxRQUFRO0FBQUEsTUFDakIsQ0FBQztBQUFBLElBQ1QsQ0FBQztBQUVMLFFBQUkseUJBQVEsV0FBVyxFQUNsQixRQUFRLEVBQUUsa0JBQWtCLENBQUMsRUFDN0IsUUFBUSxFQUFFLHVCQUF1QixDQUFDLEVBQ2xDO0FBQUEsTUFBVSxDQUFDLFdBQ1IsT0FDSyxVQUFVLEdBQUcsS0FBSyxDQUFDLEVBQ25CLFNBQVMsS0FBSyxPQUFPLEtBQUssU0FBUyxnQkFBZ0IsR0FBRyxFQUN0RCxrQkFBa0IsRUFDbEIsU0FBUyxPQUFPLFVBQWtCO0FBQy9CLGFBQUssT0FBTyxLQUFLLFNBQVMsZ0JBQWdCLFFBQVE7QUFDbEQsY0FBTSxLQUFLLE9BQU8sZUFBZTtBQUFBLE1BQ3JDLENBQUM7QUFBQSxJQUNULEVBQ0MsZUFBZSxDQUFDLFdBQVc7QUFDeEIsYUFDSyxRQUFRLE9BQU8sRUFDZixXQUFXLEVBQUUsZUFBZSxDQUFDLEVBQzdCLFFBQVEsWUFBWTtBQUNqQixhQUFLLE9BQU8sS0FBSyxTQUFTLGdCQUFnQixpQkFBaUI7QUFDM0QsY0FBTSxLQUFLLE9BQU8sZUFBZTtBQUNqQyxhQUFLLFFBQVE7QUFBQSxNQUNqQixDQUFDO0FBQUEsSUFDVCxDQUFDO0FBRUwsZ0JBQVksU0FBUyxNQUFNLEVBQUUsTUFBTSxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQztBQUN0RCxRQUFJLHlCQUFRLFdBQVcsRUFBRSxRQUFRLEVBQUUsb0JBQW9CLENBQUMsRUFBRTtBQUFBLE1BQVUsQ0FBQyxXQUNqRSxPQUFPLFNBQVMsS0FBSyxPQUFPLEtBQUssU0FBUyxpQkFBaUIsRUFBRSxTQUFTLE9BQU8sVUFBVTtBQUNuRixhQUFLLE9BQU8sS0FBSyxTQUFTLG9CQUFvQjtBQUM5QyxjQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsTUFDckMsQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBQ0o7OztBa0MxeEJBLElBQUFDLG1CQUFzRDtBQUV0RCxtQkFBYzs7O0FDVVAsU0FBUyxTQUNaLFVBQ0EsVUFDQSxNQUNBLG1CQUNBLGFBQ0EsVUFDc0I7QUFDdEIsc0JBQW9CLEtBQUssSUFBSSxHQUFHLEtBQUssTUFBTSxxQkFBcUIsS0FBSyxPQUFPLElBQUssQ0FBQztBQUVsRixNQUFJLGFBQWEsY0FBcUI7QUFDbEMsWUFBUTtBQUNSLGdCQUFhLFdBQVcscUJBQXFCLE9BQVE7QUFDckQsZ0JBQVksWUFBWTtBQUFBLEVBQzVCLFdBQVcsYUFBYSxjQUFxQjtBQUN6QyxnQkFBYSxXQUFXLG9CQUFvQixLQUFLLE9BQVE7QUFBQSxFQUM3RCxXQUFXLGFBQWEsY0FBcUI7QUFDekMsV0FBTyxLQUFLLElBQUksS0FBSyxPQUFPLEVBQUU7QUFDOUIsZUFBVyxLQUFLO0FBQUEsTUFDWjtBQUFBLE9BQ0MsV0FBVyxvQkFBb0IsS0FBSyxZQUFZO0FBQUEsSUFDckQ7QUFBQSxFQUNKO0FBR0EsTUFBSSxhQUFhLFFBQVc7QUFDeEIsZUFBVyxLQUFLLE1BQU0sUUFBUTtBQUM5QixRQUFJLENBQUMsT0FBTyxVQUFVLGVBQWUsS0FBSyxVQUFVLFFBQVEsR0FBRztBQUMzRCxlQUFTLFFBQVEsSUFBSTtBQUFBLElBQ3pCLE9BQU87QUFFSCxVQUFJLFdBQVcsR0FBRztBQUNkLFlBQUksT0FBTztBQUNYLFlBQUksV0FBVztBQUFHLGlCQUFPO0FBQUEsaUJBQ2hCLFdBQVc7QUFBSSxpQkFBTyxLQUFLLElBQUksR0FBRyxLQUFLLE1BQU0sV0FBVyxJQUFJLENBQUM7QUFBQTtBQUNqRSxpQkFBTyxLQUFLLElBQUksR0FBRyxLQUFLLE1BQU0sV0FBVyxJQUFJLENBQUM7QUFFbkQsY0FBTSxtQkFBbUI7QUFDekI7QUFBTyxtQkFBUyxJQUFJLEdBQUcsS0FBSyxNQUFNLEtBQUs7QUFDbkMsdUJBQVcsT0FBTyxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDLEdBQUc7QUFDNUQsa0JBQUksQ0FBQyxPQUFPLFVBQVUsZUFBZSxLQUFLLFVBQVUsR0FBRyxHQUFHO0FBQ3RELHlCQUFTLEdBQUcsSUFBSTtBQUNoQiwyQkFBVztBQUNYLHNCQUFNO0FBQUEsY0FDVjtBQUNBLGtCQUFJLFNBQVMsR0FBRyxJQUFJLFNBQVMsUUFBUTtBQUFHLDJCQUFXO0FBQUEsWUFDdkQ7QUFBQSxVQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFFQSxhQUFTLFFBQVE7QUFBQSxFQUNyQjtBQUVBLGFBQVcsS0FBSyxJQUFJLFVBQVUsWUFBWSxlQUFlO0FBRXpELFNBQU8sRUFBRSxVQUFVLEtBQUssTUFBTSxXQUFXLEVBQUUsSUFBSSxJQUFJLEtBQUs7QUFDNUQ7QUFFTyxTQUFTLGFBQWEsVUFBa0IsVUFBMkI7QUFDdEUsTUFBSSxhQUFhLFFBQVc7QUFDeEIsV0FBTyxFQUFFLEtBQUs7QUFBQSxFQUNsQjtBQUVBLFFBQU0sSUFBWSxLQUFLLE1BQU0sV0FBVyxPQUFPLElBQUksSUFDL0MsSUFBWSxLQUFLLE1BQU0sV0FBVyxNQUFNLElBQUk7QUFFaEQsTUFBSSxVQUFVO0FBQ1YsUUFBSSxJQUFJO0FBQUssYUFBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsQ0FBQztBQUFBLGFBQ2hELElBQUk7QUFBSyxhQUFPLEVBQUUseUJBQXlCLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFBQTtBQUM5RCxhQUFPLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFBQSxFQUN6RCxPQUFPO0FBQ0gsUUFBSSxJQUFJO0FBQUssYUFBTyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsQ0FBQztBQUFBLGFBQ3pDLElBQUk7QUFBSyxhQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFBQTtBQUN2RCxhQUFPLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFBQSxFQUNsRDtBQUNKOzs7QUN0Rk8sSUFBTSx3QkFDVDtBQUNHLElBQU0sMEJBQTBCO0FBRWhDLElBQU0sNkJBQTZCO0FBQ25DLElBQU0sOEJBQThCO0FBQ3BDLElBQU0sb0NBQW9DO0FBQzFDLElBQU0sd0JBQXdCO0FBQzlCLElBQU0sdUJBQXVCLENBQUMsdUJBQXVCLGNBQWMsaUJBQWlCO0FBRXBGLElBQU0sZ0JBQWdCO0FBQUEsRUFDekI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNKO0FBQ08sSUFBTSxnQkFBZ0IsQ0FBQyxPQUFPLFFBQVEsT0FBTyxPQUFPLEtBQUs7QUFDekQsSUFBTSxnQkFBZ0IsQ0FBQyxPQUFPLE9BQU8sT0FBTyxLQUFLO0FBRWpELElBQU0sZ0JBQ1Q7QUFFRyxJQUFNLGdCQUFnQixLQUFLLE9BQU87QUFFbEMsSUFBTSx3QkFBd0I7QUFDOUIsSUFBTSxzQkFBc0I7OztBQzlCNUIsSUFBTSxZQUFOLE1BQU0sV0FBVTtBQUFBLEVBR25CLFlBQVksTUFBZ0I7QUFDeEIsUUFBSSxRQUFRO0FBQU0sWUFBTTtBQUN4QixRQUFJLEtBQUssS0FBSyxDQUFDLFFBQVEsSUFBSSxTQUFTLEdBQUcsQ0FBQztBQUFHLFlBQU07QUFDakQsU0FBSyxPQUFPO0FBQUEsRUFDaEI7QUFBQSxFQUVBLElBQUksVUFBbUI7QUFDbkIsV0FBTyxLQUFLLEtBQUssU0FBUztBQUFBLEVBQzlCO0FBQUEsRUFFQSxJQUFJLGNBQXVCO0FBQ3ZCLFdBQU8sQ0FBQyxLQUFLO0FBQUEsRUFDakI7QUFBQSxFQUVBLFdBQVcsWUFBdUI7QUFDOUIsV0FBTyxJQUFJLFdBQVUsQ0FBQyxDQUFDO0FBQUEsRUFDM0I7QUFBQSxFQUVBLFFBQWdCO0FBQ1osUUFBSSxLQUFLO0FBQWEsWUFBTTtBQUM1QixXQUFPLEtBQUssS0FBSyxNQUFNO0FBQUEsRUFDM0I7QUFBQSxFQUVBLFFBQW1CO0FBQ2YsV0FBTyxJQUFJLFdBQVUsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDO0FBQUEsRUFDdkM7QUFBQSxFQUVBLGNBQXNCO0FBQ2xCLFFBQUksS0FBSztBQUFhLFlBQU07QUFDNUIsVUFBTSxTQUFTLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUN2QyxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsT0FBTyxtQkFBbUIsVUFBbUIsVUFBaUM7QUFDMUUsUUFBSSxXQUFxQixDQUFDO0FBQzFCLFFBQUksU0FBb0IsV0FBVTtBQUVsQyxRQUFJLFNBQVMsdUJBQXVCO0FBQ2hDLGlCQUFXLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDbEMsZUFBUyxJQUFJO0FBQ2IsVUFBSSxTQUFTLFVBQVUsR0FBRztBQUN0QixpQkFBUyxJQUFJLFdBQVUsUUFBUTtBQUFBLE1BQ25DO0FBQUEsSUFDSixPQUFPO0FBQ0gsWUFBTSxVQUF1QixLQUFLLHlCQUF5QixTQUFTLFdBQVcsQ0FBQztBQUVoRjtBQUFPLG1CQUFXLGVBQWUsS0FBSztBQUFBLFVBQ2xDLFNBQVM7QUFBQSxRQUNiLEdBQUc7QUFDQyxxQkFBVyxPQUFPLFNBQVM7QUFDdkIsZ0JBQUksWUFBWSxtQkFBbUIsR0FBRyxHQUFHO0FBQ3JDLHVCQUFTO0FBQ1Qsb0JBQU07QUFBQSxZQUNWO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxJQUNKO0FBRUEsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLG1CQUFtQixXQUErQjtBQUM5QyxRQUFJLEtBQUs7QUFBYSxhQUFPLFVBQVU7QUFDdkMsUUFBSSxLQUFLLEtBQUssU0FBUyxVQUFVLEtBQUs7QUFBUSxhQUFPO0FBQ3JELGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxLQUFLLFFBQVEsS0FBSztBQUN2QyxVQUFJLEtBQUssS0FBSyxDQUFDLEtBQUssVUFBVSxLQUFLLENBQUM7QUFBRyxlQUFPO0FBQUEsSUFDbEQ7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsT0FBTyx5QkFBeUIsVUFBNkI7QUE5RWpFO0FBK0VRLFVBQU0sUUFBTyxjQUFTLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxNQUE1RCxtQkFBK0QsTUFBTSxJQUFJO0FBQ3RGLFlBQU8sNkJBQU0sVUFBUyxJQUFJLFdBQVUsb0JBQW9CLElBQUksSUFBSTtBQUFBLEVBQ3BFO0FBQUEsRUFFQSxPQUFPLHlCQUF5QixTQUFnQztBQUM1RCxVQUFNLFNBQXNCLENBQUM7QUFDN0IsZUFBVyxPQUFPLFNBQVM7QUFDdkIsVUFBSSxLQUFLLFdBQVcsR0FBRztBQUFHLGVBQU8sS0FBSyxXQUFVLG9CQUFvQixHQUFHLENBQUM7QUFBQSxJQUM1RTtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxPQUFPLFdBQVcsS0FBc0I7QUFDcEMsUUFBSSxPQUFPLFFBQVEsSUFBSSxVQUFVO0FBQUcsYUFBTztBQUMzQyxRQUFJLElBQUksQ0FBQyxLQUFLO0FBQUssYUFBTztBQUMxQixRQUFJLElBQUksVUFBVTtBQUFHLGFBQU87QUFFNUIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLE9BQU8sb0JBQW9CLEtBQXdCO0FBQy9DLFFBQUksT0FBTyxRQUFRLElBQUksVUFBVTtBQUFHLFlBQU07QUFDMUMsUUFBSSxJQUFJLENBQUMsS0FBSztBQUFLLFlBQU07QUFDekIsUUFBSSxJQUFJLFVBQVU7QUFBRyxZQUFNO0FBRTNCLFVBQU0sT0FBaUIsSUFDbEIsUUFBUSxLQUFLLEVBQUUsRUFDZixNQUFNLEdBQUcsRUFDVCxPQUFPLENBQUMsUUFBUSxHQUFHO0FBQ3hCLFdBQU8sSUFBSSxXQUFVLElBQUk7QUFBQSxFQUM3QjtBQUNKO0FBRU8sSUFBTSxrQkFBTixNQUFzQjtBQUFBLEVBU3pCLFlBQVksV0FBc0IsZUFBdUIsZ0JBQXdCO0FBQzdFLFFBQUksQ0FBQyxhQUFhLFVBQVU7QUFBYSxZQUFNO0FBRS9DLFNBQUssWUFBWTtBQUNqQixTQUFLLGdCQUFnQjtBQUNyQixTQUFLLGlCQUFpQjtBQUFBLEVBQzFCO0FBQUEsRUFFQSxlQUF1QjtBQUNuQixXQUFPLEdBQUcsS0FBSyxhQUFhLEdBQUcsS0FBSyxVQUFVLFlBQVksQ0FBQyxHQUFHLEtBQUssY0FBYztBQUFBLEVBQ3JGO0FBQ0o7OztBQ3hHTyxJQUFNLFlBQU4sTUFBZ0I7QUFBQSxFQUtuQixZQUFZLFVBQWtCLFVBQWtCLFlBQW9CO0FBQ2hFLFNBQUssV0FBVztBQUNoQixTQUFLLFdBQVc7QUFDaEIsU0FBSyxhQUFhO0FBQUEsRUFDdEI7QUFDSjtBQU9PLElBQU0sMkJBQU4sTUFBb0U7QUFBQSxFQVN2RSxZQUNJLFlBQ0EsZUFDQSxVQUNBLHdCQUNBLDBCQUNGO0FBQ0UsU0FBSyxhQUFhO0FBQ2xCLFNBQUssZ0JBQWdCO0FBQ3JCLFNBQUssV0FBVztBQUNoQixTQUFLLHlCQUF5QjtBQUM5QixTQUFLLDJCQUEyQjtBQUFBLEVBQ3BDO0FBQUEsRUFFQSxJQUFJLGlCQUEwQjtBQUMxQixXQUFPLEtBQUssY0FBYyxlQUFlO0FBQUEsRUFDN0M7QUFBQSxFQUVBLElBQUksY0FBb0I7QUFDcEIsV0FBTyxLQUFLLGNBQWM7QUFBQSxFQUM5QjtBQUFBLEVBRUEsSUFBSSxrQkFBNEI7QUE1RXBDO0FBNkVRLFlBQU8sVUFBSyxnQkFBTCxtQkFBa0I7QUFBQSxFQUM3QjtBQUFBLEVBRUEsSUFBSSxjQUFvQjtBQUNwQixXQUFPLEtBQUssY0FBYztBQUFBLEVBQzlCO0FBQUEsRUFFQSxJQUFJLGNBQW9CO0FBQ3BCLFdBQU8sS0FBSyxnQkFBZ0I7QUFBQSxFQUNoQztBQUFBLEVBRUEsWUFBWSxrQkFBd0IsbUJBQStCO0FBQy9ELFNBQUssb0JBQW9CO0FBQ3pCLFNBQUssb0JBQW9CO0FBQ3pCLFNBQUssZUFBZSxVQUFVLFNBQVM7QUFBQSxFQUMzQztBQUFBLEVBRUEsZUFBZSxXQUE0QjtBQUN2QyxVQUFNLE9BQWEsS0FBSyxrQkFBa0IsUUFBUSxTQUFTO0FBQzNELFNBQUssY0FBYyxRQUFRLElBQUk7QUFDL0IsU0FBSyxjQUFjLFNBQVM7QUFBQSxFQUNoQztBQUFBLEVBRUEsSUFBSSxtQkFBeUI7QUFDekIsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQSxFQUVBLGFBQWEsV0FBaUM7QUFDMUMsVUFBTSxhQUFxQixLQUFLLGtCQUMzQixRQUFRLFNBQVMsRUFDakIsMEJBQStCLElBQUk7QUFDeEMsVUFBTSxnQkFBc0IsS0FBSyxrQkFBa0IsUUFBUSxTQUFTO0FBQ3BFLFVBQU0sV0FBbUIsY0FBYyw4QkFBbUMsSUFBSTtBQUM5RSxVQUFNLFdBQW1CLGNBQWMsOEJBQW1DLElBQUk7QUFDOUUsV0FBTyxJQUFJLFVBQVUsVUFBVSxVQUFVLFVBQVU7QUFBQSxFQUN2RDtBQUFBLEVBRUEsa0JBQXdCO0FBQ3BCLFNBQUssY0FBYyxzQkFBc0I7QUFBQSxFQUM3QztBQUFBLEVBRVEsb0JBQTBCO0FBQzlCLFNBQUssY0FBYyxrQkFBa0I7QUFBQSxFQUN6QztBQUFBLEVBRUEsTUFBTSxjQUFjLFVBQXlDO0FBQ3pELFlBQVEsS0FBSyxZQUFZO0FBQUEsTUFDckIsS0FBSztBQUNELGNBQU0sS0FBSyx5QkFBeUIsUUFBUTtBQUM1QztBQUFBLE1BRUosS0FBSztBQUNELGNBQU0sS0FBSyx1QkFBdUIsUUFBUTtBQUMxQztBQUFBLElBQ1I7QUFBQSxFQUNKO0FBQUEsRUFFQSxNQUFNLHlCQUF5QixVQUF5QztBQUNwRSxTQUFLLFlBQVksZUFBZSxLQUFLLHNCQUFzQixVQUFVLEtBQUssV0FBVztBQUdyRixVQUFNLEtBQUssZ0JBQWdCLGNBQWMsS0FBSyxRQUFRO0FBR3RELFFBQUksMkJBQWtDO0FBQ2xDLFdBQUssY0FBYywyQkFBMkI7QUFDOUMsV0FBSyxjQUFjLFNBQVM7QUFBQSxJQUNoQyxPQUFPO0FBQ0gsVUFBSSxLQUFLLFNBQVMsa0JBQWtCO0FBQ2hDLGNBQU0sS0FBSyxpQkFBaUI7QUFDNUIsYUFBSyxjQUFjLHNCQUFzQjtBQUFBLE1BQzdDLE9BQU87QUFDSCxhQUFLLGtCQUFrQjtBQUFBLE1BQzNCO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUVBLE1BQWMsbUJBQWtDO0FBSTVDLFVBQU0sWUFBWSxLQUFLLFlBQVkscUJBQXFCLEtBQUssZUFBZTtBQUM1RSxRQUFJLFlBQVksR0FBRztBQUNmLFdBQUsseUJBQXlCLElBQUksS0FBSyxlQUFlO0FBQ3RELFlBQU0sS0FBSyx5QkFBeUIsTUFBTTtBQUFBLElBQzlDO0FBQUEsRUFDSjtBQUFBLEVBRUEsTUFBTSx1QkFBdUIsVUFBeUM7QUFDbEUsUUFBSTtBQUFpQyxXQUFLLGtCQUFrQjtBQUFBLFNBQ3ZEO0FBQ0QsV0FBSyxjQUFjLDJCQUEyQjtBQUM5QyxXQUFLLGNBQWMsU0FBUztBQUFBLElBQ2hDO0FBQUEsRUFDSjtBQUFBLEVBRUEsc0JBQXNCLFVBQTBCLE1BQThCO0FBQzFFLFFBQUk7QUFFSixRQUFJLDJCQUFrQztBQUVsQyxlQUFTLEtBQUssdUJBQXVCLHFCQUFxQjtBQUFBLElBQzlELE9BQU87QUFFSCxVQUFJLEtBQUssYUFBYTtBQUNsQixpQkFBUyxLQUFLLHVCQUF1QjtBQUFBLFVBQ2pDO0FBQUEsVUFDQSxLQUFLO0FBQUEsUUFDVDtBQUFBLE1BQ0osT0FBTztBQUNILGNBQU0sY0FBb0IsS0FBSyxTQUFTO0FBQ3hDLGlCQUFTLEtBQUssdUJBQXVCO0FBQUEsVUFDakM7QUFBQSxVQUNBLFlBQVk7QUFBQSxRQUNoQjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLE1BQU0sMEJBQTBCLE1BQTZCO0FBQ3pELFVBQU0sSUFBa0IsS0FBSyxnQkFBZ0I7QUFFN0MsTUFBRSxpQkFBaUI7QUFFbkIsVUFBTSxLQUFLLGdCQUFnQixjQUFjLEtBQUssUUFBUTtBQUFBLEVBQzFEO0FBQ0o7OztBQ2hNTyxJQUFNQyxRQUFOLE1BQU0sTUFBSztBQUFBLEVBT2QsWUFBWSxVQUFrQixRQUFxQjtBQUMvQyxTQUFLLFdBQVc7QUFDaEIsU0FBSyxnQkFBZ0IsQ0FBQztBQUN0QixTQUFLLGdCQUFnQixDQUFDO0FBQ3RCLFNBQUssV0FBVyxDQUFDO0FBQ2pCLFNBQUssU0FBUztBQUFBLEVBQ2xCO0FBQUEsRUFFTyxhQUFhLGNBQTRCLHNCQUF1QztBQUNuRixRQUFJLFNBQWlCO0FBQ3JCLFFBQUksZ0JBQWdCLG1CQUF3QixnQkFBZ0I7QUFDeEQsZ0JBQVUsS0FBSyxjQUFjO0FBQ2pDLFFBQUksZ0JBQWdCLG1CQUF3QixnQkFBZ0I7QUFDeEQsZ0JBQVUsS0FBSyxjQUFjO0FBRWpDLFFBQUksc0JBQXNCO0FBQ3RCLGlCQUFXLFFBQVEsS0FBSyxVQUFVO0FBQzlCLGtCQUFVLEtBQUssYUFBYSxjQUFjLG9CQUFvQjtBQUFBLE1BQ2xFO0FBQUEsSUFDSjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLHFCQUFxQixVQUE0QjtBQUNwRCxRQUFJLFNBQWlCO0FBQ3JCLGNBQVUsS0FBSyxvQ0FBb0MsVUFBVSxLQUFLLGFBQWE7QUFDL0UsY0FBVSxLQUFLLG9DQUFvQyxVQUFVLEtBQUssYUFBYTtBQUMvRSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRVEsb0NBQW9DLFVBQW9CLE9BQXVCO0FBQ25GLFFBQUksU0FBaUI7QUFDckIsYUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNuQyxVQUFJLE9BQU8sR0FBRyxVQUFVLE1BQU0sQ0FBQyxFQUFFLFFBQVE7QUFBRztBQUFBLElBQ2hEO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLFdBQVcsWUFBa0I7QUFDekIsV0FBTyxJQUFJLE1BQUssUUFBUSxJQUFJO0FBQUEsRUFDaEM7QUFBQSxFQUVBLElBQUksYUFBYTtBQUNiLFdBQU8sS0FBSyxVQUFVO0FBQUEsRUFDMUI7QUFBQSxFQUVBLFFBQVEsV0FBNEI7QUFDaEMsV0FBTyxLQUFLLGlCQUFpQixXQUFXLEtBQUs7QUFBQSxFQUNqRDtBQUFBLEVBRUEsZ0JBQWdCLFdBQTRCO0FBQ3hDLFdBQU8sS0FBSyxpQkFBaUIsV0FBVyxJQUFJO0FBQUEsRUFDaEQ7QUFBQSxFQUVRLGlCQUFpQixXQUFzQixlQUE4QjtBQUN6RSxRQUFJLENBQUMsVUFBVSxTQUFTO0FBQ3BCLGFBQU87QUFBQSxJQUNYO0FBQ0EsVUFBTUMsS0FBZSxVQUFVLE1BQU07QUFDckMsVUFBTSxXQUFtQkEsR0FBRSxNQUFNO0FBQ2pDLGVBQVcsV0FBVyxLQUFLLFVBQVU7QUFDakMsVUFBSSxhQUFhLFFBQVEsVUFBVTtBQUMvQixlQUFPLFFBQVEsaUJBQWlCQSxJQUFHLGFBQWE7QUFBQSxNQUNwRDtBQUFBLElBQ0o7QUFFQSxRQUFJLFNBQWU7QUFDbkIsUUFBSSxlQUFlO0FBQ2YsWUFBTSxVQUFnQixJQUFJO0FBQUEsUUFBSztBQUFBLFFBQVU7QUFBQTtBQUFBLE1BQWlCO0FBQzFELFdBQUssU0FBUyxLQUFLLE9BQU87QUFDMUIsZUFBUyxRQUFRLGlCQUFpQkEsSUFBRyxhQUFhO0FBQUEsSUFDdEQ7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsZUFBMEI7QUFDdEIsVUFBTSxPQUFpQixDQUFDO0FBRXhCLFFBQUksT0FBYTtBQUNqQixXQUFPLENBQUMsS0FBSyxZQUFZO0FBQ3JCLFdBQUssS0FBSyxLQUFLLFFBQVE7QUFDdkIsYUFBTyxLQUFLO0FBQUEsSUFDaEI7QUFDQSxXQUFPLElBQUksVUFBVSxLQUFLLFFBQVEsQ0FBQztBQUFBLEVBQ3ZDO0FBQUEsRUFFQSxjQUFvQjtBQUVoQixRQUFJLE9BQWE7QUFDakIsV0FBTyxDQUFDLEtBQUssWUFBWTtBQUNyQixhQUFPLEtBQUs7QUFBQSxJQUNoQjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxRQUFRLE9BQWUsY0FBa0M7QUFDckQsVUFBTSxXQUFtQixLQUFLLHVCQUF1QixZQUFZO0FBQ2pFLFdBQU8sU0FBUyxLQUFLO0FBQUEsRUFDekI7QUFBQSxFQUVBLHVCQUF1QixjQUFvQztBQUN2RCxXQUFPLGdCQUFnQixrQkFBdUIsS0FBSyxnQkFBZ0IsS0FBSztBQUFBLEVBQzVFO0FBQUEsRUFFQSxXQUFXLFdBQXNCLFNBQXFCO0FBQ2xELFVBQU0sT0FBYSxLQUFLLGdCQUFnQixTQUFTO0FBQ2pELFVBQU0sV0FBbUIsS0FBSyx1QkFBdUIsUUFBUSxZQUFZO0FBRXpFLGFBQVMsS0FBSyxPQUFPO0FBQUEsRUFDekI7QUFBQSxFQUVBLFdBQVcsTUFBa0I7QUFDekIsVUFBTSxXQUFtQixLQUFLLHVCQUF1QixLQUFLLFlBQVk7QUFDdEUsVUFBTSxNQUFNLFNBQVMsUUFBUSxJQUFJO0FBQ2pDLFFBQUksT0FBTztBQUFJLGVBQVMsT0FBTyxLQUFLLENBQUM7QUFBQSxFQUN6QztBQUFBLEVBRUEsa0JBQWtCLE9BQWUsY0FBa0M7QUFDL0QsVUFBTSxXQUFtQixLQUFLLHVCQUF1QixZQUFZO0FBQ2pFLGFBQVMsT0FBTyxPQUFPLENBQUM7QUFBQSxFQUM1QjtBQUFBLEVBRUEsY0FBc0I7QUFDbEIsVUFBTSxTQUFpQixDQUFDO0FBQ3hCLFdBQU8sS0FBSyxJQUFJO0FBQ2hCLGVBQVcsV0FBVyxLQUFLLFVBQVU7QUFDakMsYUFBTyxLQUFLLEdBQUcsUUFBUSxZQUFZLENBQUM7QUFBQSxJQUN4QztBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxtQkFBeUI7QUFDckIsU0FBSyxTQUFTLEtBQUssQ0FBQyxHQUFHLE1BQU07QUFDekIsVUFBSSxFQUFFLFdBQVcsRUFBRSxVQUFVO0FBQ3pCLGVBQU87QUFBQSxNQUNYLFdBQVcsRUFBRSxXQUFXLEVBQUUsVUFBVTtBQUNoQyxlQUFPO0FBQUEsTUFDWDtBQUNBLGFBQU87QUFBQSxJQUNYLENBQUM7QUFFRCxlQUFXLFFBQVEsS0FBSyxVQUFVO0FBQzlCLFdBQUssaUJBQWlCO0FBQUEsSUFDMUI7QUFBQSxFQUNKO0FBQUEsRUFFQSxrQkFBa0IsT0FBZSxNQUFNO0FBQ25DLFFBQUksTUFBYyxRQUFRLE9BQU8sR0FBRyxJQUFJLE9BQU87QUFDL0MsWUFBUSxJQUFLLE9BQU8sS0FBSyxTQUFTLENBQUU7QUFBQSxFQUN4QztBQUFBLEVBRUEsU0FBUyxTQUFpQixHQUFXO0FBQ2pDLFFBQUksU0FBaUI7QUFDckIsUUFBSSxZQUFvQixJQUFJLE9BQU8sU0FBUyxDQUFDO0FBRTdDLGNBQVUsR0FBRyxTQUFTLEdBQUcsS0FBSyxRQUFRO0FBQUE7QUFDdEMsaUJBQWE7QUFDYixhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssY0FBYyxRQUFRLEtBQUs7QUFDaEQsWUFBTSxPQUFPLEtBQUssY0FBYyxDQUFDO0FBQ2pDLGdCQUFVLEdBQUcsU0FBUyxRQUFRLENBQUMsS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLElBQUk7QUFBQTtBQUFBLElBQ2hFO0FBQ0EsYUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLGNBQWMsUUFBUSxLQUFLO0FBQ2hELFlBQU0sT0FBTyxLQUFLLGNBQWMsQ0FBQztBQUNqQyxZQUFNLElBQUksS0FBSyxRQUFRLFFBQVE7QUFDL0IsZ0JBQVUsR0FBRyxTQUFTLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLElBQUk7QUFBQTtBQUFBLElBQ2pFO0FBRUEsZUFBVyxXQUFXLEtBQUssVUFBVTtBQUNqQyxnQkFBVSxRQUFRLFNBQVMsU0FBUyxDQUFDO0FBQUEsSUFDekM7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsUUFBYztBQUNWLFdBQU8sS0FBSyxtQkFBbUIsTUFBTSxJQUFJO0FBQUEsRUFDN0M7QUFBQSxFQUVBLG1CQUFtQixXQUFxQyxTQUFlLE1BQVk7QUFDL0UsVUFBTSxTQUFlLElBQUksTUFBSyxLQUFLLFVBQVUsTUFBTTtBQUNuRCxXQUFPLGdCQUFnQixDQUFDLEdBQUcsS0FBSyxjQUFjLE9BQU8sQ0FBQyxTQUFTLFVBQVUsSUFBSSxDQUFDLENBQUM7QUFDL0UsV0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUssY0FBYyxPQUFPLENBQUMsU0FBUyxVQUFVLElBQUksQ0FBQyxDQUFDO0FBRS9FLGVBQVcsS0FBSyxLQUFLLFVBQVU7QUFDM0IsWUFBTSxZQUFZO0FBQ2xCLFlBQU0sVUFBVSxFQUFFLG1CQUFtQixXQUFXLFNBQVM7QUFDekQsYUFBTyxTQUFTLEtBQUssT0FBTztBQUFBLElBQ2hDO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLE9BQU8sY0FBYyxjQUEwQztBQUMzRCxRQUFJO0FBQ0osUUFBSSxnQkFBZ0I7QUFBc0IsZUFBUztBQUFBLGFBQzFDLGdCQUFnQjtBQUFzQixlQUFTO0FBQUE7QUFDbkQsWUFBTTtBQUNYLFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFFTyxJQUFNLGlCQUFOLE1BQXFCO0FBQUEsRUFDeEIsT0FBTyx5QkFBeUIsb0JBQWdDO0FBQzVELFdBQU8sbUJBQW1CLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsZUFBZTtBQUFBLEVBQ3pGO0FBQUEsRUFFQSxPQUFPLHdCQUNILDBCQUNBLFVBQ0EsWUFDSTtBQUNKLFdBQU8sU0FBUztBQUFBLE1BQ1osQ0FBQyxVQUNJLDhCQUEwQyxLQUFLLFNBQVMsS0FBSyxVQUM5RCxDQUFDLHlCQUF5QixTQUFTLEtBQUssUUFBUTtBQUFBLElBQ3hEO0FBQUEsRUFDSjtBQUNKOzs7QUM5T0Esb0JBQW1CO0FBWVosU0FBUyxzQkFBZ0QsS0FBa0M7QUFDOUYsU0FBTyxPQUFPLFFBQVEsR0FBRztBQUM3QjtBQVVPLElBQU0sc0JBQXNCLE9BQU87QUFnQm5DLFNBQVMscUJBQ1osTUFDQSxXQUNBLGdCQUNNO0FBQ04sTUFBSSxTQUFpQjtBQUNyQixRQUFNLFdBQW1CLEtBQUssUUFBUSxTQUFTO0FBQy9DLE1BQUksWUFBWSxHQUFHO0FBQ2YsVUFBTSxXQUFtQixLQUFLLFVBQVUsR0FBRyxRQUFRO0FBQ25ELFVBQU0sU0FBaUIsV0FBVyxVQUFVO0FBQzVDLFVBQU0sU0FBaUIsS0FBSyxVQUFVLE1BQU07QUFDNUMsYUFBUyxXQUFXLGlCQUFpQjtBQUFBLEVBQ3pDO0FBQ0EsU0FBTztBQUNYO0FBVU8sU0FBUyxPQUFPLEtBQWEsT0FBTyxHQUFXO0FBQ2xELE1BQUlDLE1BQVUsYUFBYSxNQUN2QkMsTUFBVSxhQUFhO0FBQzNCLFdBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLFFBQVEsS0FBSztBQUNyQyxTQUFLLElBQUksV0FBVyxDQUFDO0FBQ3JCLElBQUFELE1BQUssS0FBSyxLQUFLQSxNQUFLLElBQUksVUFBVTtBQUNsQyxJQUFBQyxNQUFLLEtBQUssS0FBS0EsTUFBSyxJQUFJLFVBQVU7QUFBQSxFQUN0QztBQUNBLEVBQUFELE1BQUssS0FBSyxLQUFLQSxNQUFNQSxRQUFPLElBQUssVUFBVSxJQUFJLEtBQUssS0FBS0MsTUFBTUEsUUFBTyxJQUFLLFVBQVU7QUFDckYsRUFBQUEsTUFBSyxLQUFLLEtBQUtBLE1BQU1BLFFBQU8sSUFBSyxVQUFVLElBQUksS0FBSyxLQUFLRCxNQUFNQSxRQUFPLElBQUssVUFBVTtBQUNyRixVQUFRLGNBQWMsVUFBVUMsUUFBT0QsUUFBTyxJQUFJLFNBQVMsRUFBRTtBQUNqRTtBQVFPLFNBQVMsc0JBQXNCLE9BQXVCO0FBQ3pELFNBQU8sTUFBTSxPQUFPLHFCQUFxQjtBQUM3QztBQVNPLFNBQVMsdUJBQXVCLE1BQXdCO0FBQzNELFNBQU8sS0FBSyxXQUFXLFFBQVEsSUFBSSxFQUFFLE1BQU0sSUFBSTtBQUNuRDtBQUVPLFNBQVMsZ0JBQWdCLEtBQStCO0FBQzNELFFBQU0sVUFBa0IsSUFBSSxVQUFVO0FBQ3RDLFFBQU0sVUFBa0IsSUFBSSxTQUFTLFFBQVE7QUFDN0MsUUFBTSxLQUFhLElBQUksVUFBVSxHQUFHLE9BQU87QUFDM0MsU0FBTyxDQUFDLElBQUksT0FBTztBQUN2Qjs7O0FDdkdBLElBQUFFLGlCQUFtQjtBQVFaLElBQU0sbUJBQU4sTUFBZ0Q7QUFBQSxFQUNuRCxJQUFJLFFBQWdCO0FBQ2hCLGVBQU8sZUFBQUMsU0FBTyxFQUFFLFFBQVEsS0FBSztBQUFBLEVBQ2pDO0FBQ0o7QUFrQk8sSUFBTSxXQUFOLE1BQWU7QUFBQSxFQUNsQixPQUFPLGdCQUFnQixLQUFxQjtBQUN4QyxlQUFPLGVBQUFDLFNBQU8sS0FBSyxvQkFBb0I7QUFBQSxFQUMzQztBQUNKO0FBRU8sSUFBSSxxQkFBb0MsSUFBSSxpQkFBaUI7OztBQ3hCN0QsSUFBTSxvQkFBTixNQUFNLGtCQUFpQjtBQUFBLEVBZTFCLFlBQVksU0FBaUIsVUFBa0IsTUFBYyx3QkFBZ0M7QUFDekYsU0FBSyxVQUFVO0FBQ2YsU0FBSyxXQUFXO0FBQ2hCLFNBQUssT0FBTztBQUNaLFNBQUsseUJBQXlCO0FBQUEsRUFDbEM7QUFBQSxFQUVBLElBQUksMkJBQW1DO0FBQ25DLFdBQU8sS0FBSyxLQUFLLEtBQUsseUJBQXlCLGFBQWE7QUFBQSxFQUNoRTtBQUFBLEVBRUEsUUFBaUI7QUFDYixXQUFPLEtBQUssUUFBUSxlQUFlLG1CQUFtQixLQUFLO0FBQUEsRUFDL0Q7QUFBQSxFQUVBLDRCQUFxQztBQUNqQyxXQUFPLEtBQUssY0FBYyxLQUFLLGtCQUFpQjtBQUFBLEVBQ3BEO0FBQUEsRUFFQSxPQUFPLDJCQUEyQixVQUF3QztBQUN0RSxXQUFPLGtCQUFpQjtBQUFBLE1BQ3BCLGtCQUFpQjtBQUFBLE1BQ2pCLGtCQUFpQjtBQUFBLE1BQ2pCLFNBQVM7QUFBQSxNQUNUO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUVBLE9BQU8sZUFDSCxZQUNBLFVBQ0EsTUFDQSx3QkFDRjtBQUNFLFVBQU0sZUFBdUIsU0FBUyxnQkFBZ0IsVUFBVTtBQUNoRSxXQUFPLElBQUksa0JBQWlCLGNBQWMsVUFBVSxNQUFNLHNCQUFzQjtBQUFBLEVBQ3BGO0FBQUEsRUFFQSxPQUFPLGtCQUNILGNBQ0EsVUFDQSxNQUNBLHdCQUNGO0FBQ0UsV0FBTyxJQUFJLGtCQUFpQixjQUFjLFVBQVUsTUFBTSxzQkFBc0I7QUFBQSxFQUNwRjtBQUFBLEVBRUEsV0FBVyxrQkFBMEI7QUFDakMsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLGdCQUF3QjtBQUNwQixXQUFPLHNCQUFzQixLQUFLLE9BQU87QUFBQSxFQUM3QztBQUFBLEVBRUEsaUJBQWlCO0FBQ2IsV0FBTyxJQUFJLEtBQUssY0FBYyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxJQUFJO0FBQUEsRUFDakU7QUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBekVhLGtCQWFNLHlCQUFpQztBQWI3QyxJQUFNLG1CQUFOO0FBaUZBLElBQU0seUJBQU4sTUFBNkI7QUFBQTtBQUFBLEVBS2hDLFlBQVksVUFBc0IsY0FBNkI7QUFGL0QsOEJBQTZDLENBQUM7QUFHMUMsU0FBSyxXQUFXO0FBQ2hCLFNBQUssZUFBZTtBQUFBLEVBQ3hCO0FBQUEsRUFFQSx1QkFBeUM7QUFDckMsVUFBTSxXQUFXLGlCQUFpQjtBQUNsQyxVQUFNLE9BQU8sS0FBSyxTQUFTO0FBQzNCLFVBQU0sVUFBVSxtQkFBbUIsTUFBTSxJQUFJLFVBQVUsR0FBRztBQUMxRCxVQUFNLG9CQUFvQjtBQUMxQixXQUFPLGlCQUFpQixrQkFBa0IsU0FBUyxVQUFVLE1BQU0saUJBQWlCO0FBQUEsRUFDeEY7QUFBQSxFQUVBLG1CQUFtQixVQUEwQixVQUFvQztBQUM3RSxRQUFJLGVBQXVCLEtBQUssU0FBUztBQUN6QyxRQUFJLEtBQUssYUFBYSxlQUFlLFFBQVEsR0FBRztBQUM1QyxxQkFBZSxLQUFLLE1BQU0sS0FBSyxhQUFhLGNBQWMsUUFBUSxDQUFDO0FBQUEsSUFDdkU7QUFDQSxVQUFNLG9CQUFvQjtBQUUxQixVQUFNLFdBQW1DO0FBQUEsTUFDckM7QUFBQSxNQUNBLGlCQUFpQjtBQUFBLE1BQ2pCO0FBQUEsTUFDQTtBQUFBLE1BQ0EsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLElBQ1Q7QUFFQSxVQUFNLFdBQVcsU0FBUztBQUMxQixVQUFNLE9BQU8sU0FBUztBQUN0QixVQUFNLFVBQVUsbUJBQW1CLE1BQU0sSUFBSSxVQUFVLEdBQUc7QUFDMUQsV0FBTyxpQkFBaUIsa0JBQWtCLFNBQVMsVUFBVSxNQUFNLGlCQUFpQjtBQUFBLEVBQ3hGO0FBQUEsRUFFQSxvQkFDSSxVQUNBLGNBQ2dCO0FBQ2hCLFVBQU0sV0FBbUM7QUFBQSxNQUNyQztBQUFBLE1BQ0EsYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLElBQ1Q7QUFDQSxVQUFNLFdBQVcsU0FBUztBQUMxQixVQUFNLE9BQU8sU0FBUztBQUN0QixVQUFNLFVBQVUsbUJBQW1CLE1BQU0sSUFBSSxVQUFVLEdBQUc7QUFDMUQsVUFBTSxvQkFBb0I7QUFDMUIsV0FBTyxpQkFBaUIsa0JBQWtCLFNBQVMsVUFBVSxNQUFNLGlCQUFpQjtBQUFBLEVBQ3hGO0FBQ0o7QUFFTyxJQUFNLHlCQUFOLE1BQTZCO0FBQUEsRUFDaEMsT0FBTywyQkFBMkIsY0FBMEM7QUFDeEUsUUFBSSxhQUFpQyxDQUFDLEdBQUcsYUFBYSxTQUFTLDBCQUEwQixDQUFDO0FBQzFGLFFBQUksV0FBVyxXQUFXO0FBQ3RCLG1CQUFhLENBQUMsR0FBRyxhQUFhLFNBQVMsMkJBQTJCLENBQUM7QUFFdkUsVUFBTSxTQUE2QixDQUFDO0FBQ3BDLGFBQVMsSUFBSSxHQUFHLElBQUksV0FBVyxRQUFRLEtBQUs7QUFDeEMsWUFBTSxRQUEwQixXQUFXLENBQUM7QUFDNUMsWUFBTSxhQUFhLE1BQU0sQ0FBQztBQUMxQixZQUFNLFdBQVcsU0FBUyxNQUFNLENBQUMsQ0FBQztBQUNsQyxZQUFNLE9BQU8sU0FBUyxNQUFNLENBQUMsQ0FBQztBQUM5QixZQUFNLFVBQWtCLFNBQVMsZ0JBQWdCLFVBQVU7QUFDM0QsWUFBTSx5QkFDRixRQUFRLFFBQVEsSUFBSSxtQkFBbUIsTUFBTSxRQUFRO0FBRXpELFlBQU0sT0FBeUIsSUFBSTtBQUFBLFFBQy9CO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUNBLGFBQU8sS0FBSyxJQUFJO0FBQUEsSUFDcEI7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsT0FBTyx1QkFBdUIsY0FBOEI7QUFDeEQsV0FBTyxhQUFhLFFBQVEsa0JBQWtCLEVBQUU7QUFBQSxFQUNwRDtBQUNKOzs7QUNyTE8sSUFBTSxzQkFBTixNQUFNLHFCQUFvQjtBQUFBLEVBQzdCLE9BQU8sZUFDSCxZQUNBLFlBQ0EsaUJBQ2E7QUFDYixRQUFJLFNBQWlCO0FBQ3JCLFFBQUksV0FBVyxTQUFTLFVBQVUsR0FBRztBQUNqQyxlQUFTLHFCQUFxQixZQUFZLFlBQVksZUFBZTtBQUFBLElBQ3pFLE9BQU87QUFDSCxZQUFNLGtCQUFrQix1QkFBdUIsVUFBVTtBQUN6RCxZQUFNLGtCQUFrQix1QkFBdUIsVUFBVTtBQUN6RCxZQUFNLFNBQWlCLHFCQUFvQixLQUFLLGlCQUFpQixlQUFlO0FBQ2hGLFVBQUksUUFBUTtBQUNSLGNBQU0sdUJBQXVCLHVCQUF1QixlQUFlO0FBQ25FLGNBQU0sZ0JBQXdCLGdCQUFnQjtBQUM5Qyx3QkFBZ0IsT0FBTyxRQUFRLGVBQWUsR0FBRyxvQkFBb0I7QUFDckUsaUJBQVMsZ0JBQWdCLEtBQUssSUFBSTtBQUFBLE1BQ3RDO0FBQUEsSUFDSjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxPQUFPLEtBQUssWUFBc0IsWUFBcUM7QUFDbkUsUUFBSSxTQUFpQjtBQUNyQixRQUFJLFlBQW9CO0FBQ3hCLFVBQU0sZUFBdUIsV0FBVyxTQUFTO0FBQ2pELGFBQVMsWUFBWSxHQUFHLFlBQVksV0FBVyxRQUFRLGFBQWE7QUFDaEUsWUFBTSxhQUFxQixXQUFXLFNBQVMsRUFBRSxLQUFLO0FBQ3RELFlBQU0sYUFBcUIsV0FBVyxTQUFTLEVBQUUsS0FBSztBQUN0RCxVQUFJLGNBQWMsWUFBWTtBQUMxQixZQUFJLGFBQWEsY0FBYztBQUMzQixtQkFBUyxZQUFZO0FBQ3JCO0FBQUEsUUFDSjtBQUNBO0FBQUEsTUFDSixPQUFPO0FBQ0gsb0JBQVk7QUFBQSxNQUNoQjtBQUFBLElBQ0o7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNKOzs7QUN3Qk8sSUFBTSxlQUFOLE1BQU0sY0FBYTtBQUFBLEVBZXRCLFlBQVksVUFBa0IsaUJBQWtDLGdCQUF3QjtBQUNwRixTQUFLLFdBQVc7QUFDaEIsU0FBSyxrQkFBa0I7QUFDdkIsU0FBSyxpQkFBaUI7QUFDdEIsU0FBSyxXQUFXLE9BQU8sS0FBSyxjQUFjLENBQUM7QUFBQSxFQUMvQztBQUFBLEVBRUEsb0JBQTZCO0FBQ3pCLFdBQU8sS0FBSyxlQUFlLFNBQVMsS0FBSztBQUFBLEVBQzdDO0FBQUEsRUFFQSxPQUFPLE9BQU8sVUFBa0IsVUFBb0M7QUFDaEUsVUFBTSxDQUFDLGlCQUFpQixjQUFjLElBQUksS0FBSyxVQUFVLFVBQVUsUUFBUTtBQUUzRSxXQUFPLElBQUksY0FBYSxVQUFVLGlCQUFpQixjQUFjO0FBQUEsRUFDckU7QUFBQSxFQUVBLE9BQU8sVUFBVSxVQUFrQixVQUFpRDtBQUNoRixVQUFNLG9CQUFvQix1QkFBdUIsdUJBQXVCLFFBQVE7QUFDaEYsUUFBSSxpQkFBeUIsa0JBQWtCLFFBQVE7QUFFdkQsUUFBSSxrQkFBbUM7QUFDdkMsUUFBSSxDQUFDLFNBQVMsdUJBQXVCO0FBQ2pDLFlBQU0sWUFBWSxVQUFVLHlCQUF5QixpQkFBaUI7QUFDdEUsVUFBSSx1Q0FBVyxTQUFTO0FBR3BCLGNBQU0sQ0FBQyxnQkFBZ0IsU0FBUyxJQUFJLGdCQUFnQixpQkFBaUI7QUFDckUsY0FBTSx1QkFBK0IsVUFBVTtBQUFBLFVBQzNDO0FBQUEsVUFDQTtBQUFBLFFBQ0o7QUFHQSxZQUFJO0FBQ0osU0FBQyxpQkFBaUIsY0FBYyxJQUFJLGdCQUFnQixvQkFBb0I7QUFDeEUsMEJBQWtCLElBQUksZ0JBQWdCLFdBQVcsZ0JBQWdCLGVBQWU7QUFBQSxNQUNwRjtBQUFBLElBQ0o7QUFFQSxXQUFPLENBQUMsaUJBQWlCLGNBQWM7QUFBQSxFQUMzQztBQUFBLEVBRUEsZ0JBQXdCO0FBQ3BCLFFBQUksU0FBaUI7QUFDckIsUUFBSSxLQUFLLGlCQUFpQjtBQUN0QixnQkFBVSxLQUFLLGdCQUFnQixhQUFhO0FBQUEsSUFDaEQ7QUFFQSxjQUFVLEtBQUs7QUFDZixXQUFPO0FBQUEsRUFDWDtBQUNKO0FBRU8sSUFBTSxXQUFOLE1BQU0sVUFBUztBQUFBLEVBV2xCLFlBQVksTUFBMEI7QUFDbEMsV0FBTyxPQUFPLE1BQU0sSUFBSTtBQUFBLEVBQzVCO0FBQUEsRUFFQSx3QkFBd0IsVUFBOEI7QUFDbEQsUUFBSSxNQUFjLFNBQVMsd0JBQXdCLE1BQU07QUFFekQsUUFBSSxLQUFLLGFBQWEsa0JBQWtCLEtBQUssUUFBUSxNQUFNO0FBQ3ZELFlBQU07QUFBQSxJQUNWO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLFlBQVksT0FBcUI7QUFDN0IsU0FBSyxRQUFRO0FBQ2IsU0FBSyxNQUFNLFFBQVEsQ0FBQyxTQUFVLEtBQUssV0FBVyxJQUFLO0FBQUEsRUFDdkQ7QUFBQSxFQUVBLDRCQUE0QixVQUE4QjtBQUN0RCxRQUFJLFNBQWlCO0FBSXJCLGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxNQUFNLFFBQVEsS0FBSztBQUN4QyxZQUFNLE9BQWEsS0FBSyxNQUFNLENBQUM7QUFDL0IsWUFBTUMsWUFBNkIsS0FBSyxjQUNsQyxLQUFLLGVBQ0wsaUJBQWlCLDJCQUEyQixRQUFRO0FBQzFELGdCQUFVQSxVQUFTLGVBQWU7QUFBQSxJQUN0QztBQUNBLGNBQVU7QUFDVixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsY0FBYyxVQUE4QjtBQUN4QyxRQUFJLFNBQWlCLEtBQUssYUFBYSxjQUFjO0FBQ3JELFFBQUksS0FBSyxNQUFNLEtBQUssQ0FBQyxTQUFTLEtBQUssV0FBVyxHQUFHO0FBQzdDLGVBQ0ksT0FBTyxRQUFRLElBQ2YsS0FBSyx3QkFBd0IsUUFBUSxJQUNyQyxLQUFLLDRCQUE0QixRQUFRO0FBQUEsSUFDakQ7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsbUJBQW1CLFVBQWtCLFVBQThCO0FBQy9ELFVBQU0sZUFBdUIsS0FBSyxhQUFhO0FBTS9DLFVBQU0sa0JBQWtCLEtBQUssY0FBYyxRQUFRO0FBRW5ELFFBQUksVUFBVSxvQkFBb0IsZUFBZSxVQUFVLGNBQWMsZUFBZTtBQUN4RixRQUFJLFNBQVM7QUFDVCxXQUFLLGVBQWUsYUFBYSxPQUFPLGlCQUFpQixRQUFRO0FBQUEsSUFDckUsT0FBTztBQUNILGNBQVE7QUFBQSxRQUNKLHVDQUF1QyxhQUFhO0FBQUEsVUFDaEQ7QUFBQSxVQUNBO0FBQUEsUUFDSixDQUFDLGFBQWEsU0FBUyxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBQUEsTUFDNUM7QUFDQSxnQkFBVTtBQUFBLElBQ2Q7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsTUFBTSxjQUFjLFVBQXFDO0FBQ3JELFVBQU0sV0FBbUIsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLO0FBRW5ELFVBQU0sVUFBa0IsS0FBSyxtQkFBbUIsVUFBVSxRQUFRO0FBQ2xFLFVBQU0sS0FBSyxLQUFLLEtBQUssTUFBTSxPQUFPO0FBQ2xDLFNBQUssYUFBYTtBQUFBLEVBQ3RCO0FBQUEsRUFFQSxPQUFPLE9BQ0gsVUFDQSxjQUNBLGVBQ0EsY0FDQSxRQUNBLFNBQ1E7QUFDUixVQUFNLGtCQUFrQixhQUFhLFNBQVMsU0FBUyxZQUFZO0FBQ25FLFVBQU0sZUFBNkIsYUFBYSxPQUFPLGNBQWMsUUFBUTtBQUU3RSxRQUFJLFlBQXVCO0FBQzNCLFFBQUksYUFBYSxpQkFBaUI7QUFDOUIsa0JBQVksYUFBYSxnQkFBZ0I7QUFBQSxJQUM3QztBQUVBLFVBQU0sU0FBbUIsSUFBSSxVQUFTO0FBQUEsTUFDbEM7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxpQkFBaUI7QUFBQSxNQUNqQixPQUFPO0FBQUEsTUFDUCxZQUFZO0FBQUEsSUFDaEIsQ0FBQztBQUVELFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQzlQQSxJQUFBQyxtQkFBK0Q7QUFJeEQsSUFBTSxxQkFBTixNQUFNLDRCQUEyQix1QkFBTTtBQUFBLEVBZTFDLFlBQVlDLE1BQVUsY0FBc0I7QUFDeEMsVUFBTUEsSUFBRztBQVRiLFNBQVEsWUFBWTtBQWlFcEIsU0FBUSxzQkFBc0IsQ0FBQyxNQUFrQixLQUFLLE9BQU87QUFDN0QsU0FBUSxzQkFBc0IsQ0FBQyxNQUFrQixLQUFLLE9BQU87QUFFN0QsU0FBUSxzQkFBc0IsQ0FBQyxRQUF1QjtBQUNsRCxXQUFLLElBQUksV0FBVyxJQUFJLFlBQVksSUFBSSxRQUFRLFNBQVM7QUFDckQsWUFBSSxlQUFlO0FBQ25CLGFBQUssT0FBTztBQUFBLE1BQ2hCO0FBQUEsSUFDSjtBQS9ESSxTQUFLLFFBQVEsUUFBUSxFQUFFLFdBQVcsQ0FBQztBQUNuQyxTQUFLLFFBQVEsU0FBUyxhQUFhO0FBQ25DLFNBQUssWUFBWTtBQUNqQixTQUFLLFFBQVE7QUFFYixTQUFLLGVBQWUsSUFBSSxRQUFnQixDQUFDQyxVQUFTLFdBQVc7QUFDekQsV0FBSyxpQkFBaUJBO0FBQ3RCLFdBQUssZ0JBQWdCO0FBQUEsSUFDekIsQ0FBQztBQUNELFNBQUssUUFBUTtBQUNiLFNBQUssS0FBSztBQUFBLEVBQ2Q7QUFBQSxFQWpCQSxPQUFjLE9BQU9ELE1BQVUsYUFBc0M7QUFDakUsVUFBTSxpQkFBaUIsSUFBSSxvQkFBbUJBLE1BQUssV0FBVztBQUM5RCxXQUFPLGVBQWU7QUFBQSxFQUMxQjtBQUFBLEVBZ0JRLFVBQVU7QUFDZCxTQUFLLFVBQVUsTUFBTTtBQUNyQixTQUFLLFFBQVEsU0FBUywwQkFBMEI7QUFFaEQsVUFBTSx1QkFBdUMsS0FBSyxVQUFVLFVBQVU7QUFDdEUseUJBQXFCLFNBQVMseUJBQXlCO0FBQ3ZELFNBQUssaUJBQWlCLEtBQUssaUJBQWlCLHNCQUFzQixLQUFLLFNBQVM7QUFDaEYsU0FBSyxnQkFBZ0Isb0JBQW9CO0FBQUEsRUFDN0M7QUFBQSxFQUVRLGFBQ0osV0FDQSxNQUNBRSxXQUNGO0FBQ0UsVUFBTSxNQUFNLElBQUksaUNBQWdCLFNBQVM7QUFDekMsUUFBSSxjQUFjLElBQUksRUFBRSxRQUFRQSxTQUFRO0FBQ3hDLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFUSxnQkFBZ0Isc0JBQXNDO0FBQzFELFVBQU0scUJBQXFDLHFCQUFxQixVQUFVO0FBQzFFLHVCQUFtQixTQUFTLDhCQUE4QjtBQUMxRCxTQUFLO0FBQUEsTUFDRDtBQUFBLE1BQ0EsRUFBRSxNQUFNO0FBQUEsTUFDUixLQUFLO0FBQUEsSUFDVCxFQUFFLE9BQU8sRUFBRSxTQUFTLE1BQU0sY0FBYztBQUN4QyxTQUFLLGFBQWEsb0JBQW9CLEVBQUUsUUFBUSxHQUFHLEtBQUssbUJBQW1CO0FBQUEsRUFDL0U7QUFBQSxFQUVVLGlCQUFpQixXQUF3QixPQUFlO0FBQzlELFVBQU0sZ0JBQWdCLElBQUksbUNBQWtCLFNBQVM7QUFFckQsa0JBQWMsUUFBUSxNQUFNLFFBQVE7QUFDcEMsa0JBQ0ssU0FBUyx3QkFBUyxFQUFFLEVBQ3BCLFFBQVEsaUJBQWlCLFdBQVcsS0FBSyxtQkFBbUI7QUFFakUsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQVlRLFNBQVM7QUFDYixTQUFLLFlBQVk7QUFDakIsU0FBSyxRQUFRLEtBQUssZUFBZSxTQUFTO0FBQzFDLFNBQUssTUFBTTtBQUFBLEVBQ2Y7QUFBQSxFQUVRLFNBQVM7QUFDYixTQUFLLE1BQU07QUFBQSxFQUNmO0FBQUEsRUFFQSxTQUFTO0FBQ0wsVUFBTSxPQUFPO0FBRWIsU0FBSyxlQUFlLFFBQVEsTUFBTTtBQUFBLEVBQ3RDO0FBQUEsRUFFQSxVQUFVO0FBQ04sVUFBTSxRQUFRO0FBQ2QsU0FBSyxhQUFhO0FBQ2xCLFNBQUssb0JBQW9CO0FBQUEsRUFDN0I7QUFBQSxFQUVRLGVBQWU7QUFDbkIsUUFBSSxDQUFDLEtBQUs7QUFBVyxXQUFLLGNBQWMsRUFBRSxVQUFVLENBQUM7QUFBQTtBQUNoRCxXQUFLLGVBQWUsS0FBSyxLQUFLO0FBQUEsRUFDdkM7QUFBQSxFQUVRLHNCQUFzQjtBQUMxQixTQUFLLGVBQWUsUUFBUSxvQkFBb0IsV0FBVyxLQUFLLG1CQUFtQjtBQUFBLEVBQ3ZGO0FBQ0o7OztBQ3BIQSxJQUFBQyxtQkFBNkM7QUFJdEMsSUFBTSx3QkFBTixNQUE0QjtBQUFBLEVBSy9CLFlBQVlDLE1BQVUsUUFBa0IsVUFBa0I7QUFDdEQsU0FBSyxNQUFNQTtBQUNYLFNBQUssV0FBVztBQUNoQixTQUFLLFNBQVM7QUFBQSxFQUNsQjtBQUFBO0FBQUE7QUFBQSxFQUlBLE1BQU0sc0JBQ0YsZ0JBQ0EsYUFDQSxpQkFBaUIsR0FDSjtBQUNiLFFBQUksaUJBQWlCO0FBQUc7QUFFeEIsc0NBQWlCLGVBQWUsZ0JBQWdCLGFBQWEsS0FBSyxVQUFVLEtBQUssTUFBTTtBQUV2RixnQkFBWSxRQUFRLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxPQUFPO0FBQ25ELFlBQU1DLFFBQU8sS0FBSyxVQUFVLEdBQUcsYUFBYSxLQUFLLENBQUM7QUFHbEQsVUFBSSxDQUFDQSxNQUFLLFFBQVE7QUFDZCxXQUFHLFlBQVlBLE1BQUs7QUFBQSxNQUN4QixXQUFXQSxNQUFLLGtCQUFrQix3QkFBTztBQUNyQyxZQUFJQSxNQUFLLE9BQU8sY0FBYyxNQUFNO0FBQ2hDLGVBQUssZUFBZSxJQUFJQSxNQUFLLE1BQU07QUFBQSxRQUN2QyxPQUFPO0FBQ0gsYUFBRyxZQUFZO0FBQ2YsZUFBSyxpQkFBaUIsSUFBSUEsT0FBTSxjQUFjO0FBQUEsUUFDbEQ7QUFBQSxNQUNKO0FBQUEsSUFDSixDQUFDO0FBQUEsRUFDTDtBQUFBLEVBRVEsVUFBVSxLQUFhO0FBQzNCLFVBQU0sc0JBQ0Y7QUFDSixVQUFNLFVBQVUsT0FBTyxRQUFRLFlBQVksSUFBSSxNQUFNLG1CQUFtQjtBQUN4RSxVQUFNLE9BQU8sUUFBUSxPQUFPLFFBQVEsS0FBSztBQUN6QyxVQUFNLFNBQVMsS0FBSyxPQUFPLElBQUksY0FBYyxxQkFBcUIsTUFBTSxLQUFLLFFBQVE7QUFDckYsV0FBTztBQUFBLE1BQ0gsTUFBTSxRQUFRLENBQUM7QUFBQSxNQUNmLE1BQU0sUUFBUSxPQUFPO0FBQUEsTUFDckIsU0FBUyxRQUFRLE9BQU87QUFBQSxNQUN4QixTQUFTLFFBQVEsT0FBTztBQUFBLE1BQ3hCO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUVRLGVBQWUsSUFBaUIsUUFBZTtBQUNuRCxPQUFHLFlBQVk7QUFDZixRQUFJLGNBQWMsU0FBUyxPQUFPLFNBQVMsR0FBRztBQUMxQyxTQUFHO0FBQUEsUUFDQztBQUFBLFFBQ0E7QUFBQSxVQUNJLE1BQU07QUFBQSxZQUNGLEtBQUssS0FBSyxPQUFPLElBQUksTUFBTSxnQkFBZ0IsTUFBTTtBQUFBLFVBQ3JEO0FBQUEsUUFDSjtBQUFBLFFBQ0EsQ0FBQyxRQUFRO0FBQ0wsY0FBSSxHQUFHLGFBQWEsT0FBTztBQUN2QixnQkFBSSxhQUFhLFNBQVMsR0FBRyxhQUFhLE9BQU8sQ0FBQztBQUFBO0FBQ2pELGdCQUFJLGFBQWEsU0FBUyxNQUFNO0FBQ3JDLGNBQUksR0FBRyxhQUFhLEtBQUs7QUFBRyxnQkFBSSxhQUFhLE9BQU8sR0FBRyxhQUFhLEtBQUssQ0FBQztBQUMxRSxhQUFHO0FBQUEsWUFDQztBQUFBLFlBQ0EsQ0FBQyxPQUNLLEdBQUcsT0FBdUIsTUFBTSxXQUM3QixHQUFHLE9BQXVCLE1BQU0sYUFBYSxTQUN4QyxPQUNBO0FBQUEsVUFDbEI7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLFNBQUcsV0FBVyxDQUFDLGVBQWUsV0FBVyxDQUFDO0FBQUEsSUFDOUMsV0FDSSxjQUFjLFNBQVMsT0FBTyxTQUFTLEtBQ3ZDLGNBQWMsU0FBUyxPQUFPLFNBQVMsR0FDekM7QUFDRSxTQUFHO0FBQUEsUUFDQyxjQUFjLFNBQVMsT0FBTyxTQUFTLElBQUksVUFBVTtBQUFBLFFBQ3JEO0FBQUEsVUFDSSxNQUFNO0FBQUEsWUFDRixVQUFVO0FBQUEsWUFDVixLQUFLLEtBQUssT0FBTyxJQUFJLE1BQU0sZ0JBQWdCLE1BQU07QUFBQSxVQUNyRDtBQUFBLFFBQ0o7QUFBQSxRQUNBLENBQUMsVUFBVTtBQUNQLGNBQUksR0FBRyxhQUFhLEtBQUs7QUFBRyxrQkFBTSxhQUFhLE9BQU8sR0FBRyxhQUFhLEtBQUssQ0FBQztBQUFBLFFBQ2hGO0FBQUEsTUFDSjtBQUNBLFNBQUcsV0FBVyxDQUFDLGVBQWUsV0FBVyxDQUFDO0FBQUEsSUFDOUMsT0FBTztBQUNILFNBQUcsWUFBWSxPQUFPO0FBQUEsSUFDMUI7QUFBQSxFQUNKO0FBQUEsRUFFQSxNQUFjLGlCQUNWLElBQ0FBLE9BT0EsZ0JBQ0Y7QUFwSE47QUFxSFEsVUFBTSxRQUFRLEtBQUssSUFBSSxjQUFjLFNBQVNBLE1BQUssT0FBTyxJQUFJO0FBQzlELFVBQU0sT0FBTyxNQUFNLEtBQUssSUFBSSxNQUFNLFdBQVdBLE1BQUssTUFBTTtBQUN4RCxRQUFJO0FBQ0osUUFBSUEsTUFBSyxTQUFTO0FBQ2QsWUFBTSxRQUFRLENBQUMsTUFBYyxFQUFFLFFBQVEsV0FBVyxFQUFFO0FBQ3BELFlBQU0sZ0JBQWUsV0FBTSxhQUFOLG1CQUFnQjtBQUFBLFFBQ2pDLENBQUNDLE9BQU0sTUFBTUEsR0FBRSxPQUFPLE1BQU0sTUFBTUQsTUFBSyxPQUFPO0FBQUE7QUFFbEQsWUFBTSxVQUFVLE1BQU0sU0FBUyxZQUFZO0FBRTNDLFlBQU0sVUFBVSxRQUFRLFNBQVMsTUFBTTtBQUN2QyxZQUFNLFVBQ0YsdUJBQU0sU0FBUyxNQUFNLGVBQWUsQ0FBQyxFQUFFLEtBQUssQ0FBQ0MsT0FBTUEsR0FBRSxTQUFTLFFBQVEsS0FBSyxNQUEzRSxtQkFDTSxhQUROLG1CQUNnQixVQURoQixtQkFDdUIsV0FBVSxLQUFLO0FBRTFDLGtCQUFZLEtBQUssVUFBVSxTQUFTLEtBQUs7QUFBQSxJQUM3QyxXQUFXRCxNQUFLLFNBQVM7QUFDckIsWUFBTSxRQUFRLE1BQU0sT0FBT0EsTUFBSyxPQUFPO0FBQ3ZDLFlBQU0sVUFBVSxNQUFNLFNBQVMsTUFBTTtBQUNyQyxZQUFNLFFBQVEsTUFBTSxTQUFTLElBQUk7QUFDakMsa0JBQVksS0FBSyxVQUFVLFNBQVMsS0FBSztBQUFBLElBQzdDLE9BQU87QUFDSCxrQkFBWTtBQUFBLElBQ2hCO0FBRUEsU0FBSyxzQkFBc0IsV0FBVyxJQUFJLGlCQUFpQixDQUFDO0FBQUEsRUFDaEU7QUFDSjs7O0FabEhPLElBQU0saUJBQU4sY0FBNkIsdUJBQU07QUFBQSxFQWtCdEMsSUFBWSxjQUFvQjtBQUM1QixXQUFPLEtBQUssZ0JBQWdCO0FBQUEsRUFDaEM7QUFBQSxFQUVBLElBQVksa0JBQTRCO0FBQ3BDLFdBQU8sS0FBSyxnQkFBZ0I7QUFBQSxFQUNoQztBQUFBLEVBRUEsSUFBWSxjQUFvQjtBQUM1QixXQUFPLEtBQUssZ0JBQWdCO0FBQUEsRUFDaEM7QUFBQSxFQUVBLFlBQ0lFLE1BQ0EsUUFDQSxVQUNBLGlCQUNBLFlBQ0Y7QUFDRSxVQUFNQSxJQUFHO0FBRVQsU0FBSyxTQUFTO0FBQ2QsU0FBSyxXQUFXO0FBQ2hCLFNBQUssa0JBQWtCO0FBQ3ZCLFNBQUssYUFBYTtBQUVsQixTQUFLLFFBQVEsUUFBUSxFQUFFLE9BQU8sQ0FBQztBQUMvQixTQUFLLFFBQVEsU0FBUyxhQUFhO0FBRW5DLFFBQUksMEJBQVMsVUFBVTtBQUNuQixXQUFLLFVBQVUsTUFBTSxVQUFVO0FBQUEsSUFDbkM7QUFDQSxTQUFLLFFBQVEsTUFBTSxTQUFTLEtBQUssU0FBUyw0QkFBNEI7QUFDdEUsU0FBSyxRQUFRLE1BQU0sUUFBUSxLQUFLLFNBQVMsMkJBQTJCO0FBRXBFLFNBQUssVUFBVSxNQUFNLFdBQVc7QUFDaEMsU0FBSyxVQUFVLE1BQU0sU0FBUztBQUM5QixTQUFLLFVBQVUsU0FBUyxrQkFBa0I7QUFHMUMsYUFBUyxLQUFLLFlBQVksQ0FBQyxNQUFNO0FBRzdCLFVBQ0ksU0FBUyxjQUFjLGFBQWEsY0FDcEMsS0FBSyxTQUFTLG1CQUNoQjtBQUNFLGNBQU0sVUFBVSxNQUFNO0FBQ2xCLFlBQUUsZUFBZTtBQUNqQixZQUFFLGdCQUFnQjtBQUFBLFFBQ3RCO0FBQ0EsWUFBSSxLQUFLLFNBQVMsa0JBQTZCLEVBQUUsU0FBUyxRQUFRO0FBQzlELGVBQUssZ0JBQWdCO0FBQ3JCLGtCQUFRO0FBQUEsUUFDWixXQUNJLEtBQUssU0FBUyxrQkFDYixFQUFFLFNBQVMsV0FBVyxFQUFFLFNBQVMsV0FBVyxFQUFFLFNBQVMsZ0JBQzFEO0FBQ0UsZUFBSyxXQUFXO0FBQ2hCLGtCQUFRO0FBQUEsUUFDWixXQUFXLEtBQUssU0FBUyxjQUF5QjtBQUM5QyxjQUFJLEVBQUUsU0FBUyxhQUFhLEVBQUUsU0FBUyxVQUFVO0FBQzdDLGlCQUFLLDBCQUFpQztBQUN0QyxvQkFBUTtBQUFBLFVBQ1osV0FBVyxFQUFFLFNBQVMsYUFBYSxFQUFFLFNBQVMsWUFBWSxFQUFFLFNBQVMsU0FBUztBQUMxRSxpQkFBSywwQkFBaUM7QUFDdEMsb0JBQVE7QUFBQSxVQUNaLFdBQVcsRUFBRSxTQUFTLGFBQWEsRUFBRSxTQUFTLFVBQVU7QUFDcEQsaUJBQUssMEJBQWlDO0FBQ3RDLG9CQUFRO0FBQUEsVUFDWixXQUFXLEVBQUUsU0FBUyxhQUFhLEVBQUUsU0FBUyxVQUFVO0FBQ3BELGlCQUFLLDJCQUFrQztBQUN2QyxvQkFBUTtBQUFBLFVBQ1o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUEsRUFFQSxTQUFlO0FBQ1gsU0FBSyxnQkFBZ0I7QUFBQSxFQUN6QjtBQUFBLEVBRUEsVUFBZ0I7QUFDWixTQUFLLE9BQU87QUFBQSxFQUNoQjtBQUFBLEVBRUEsa0JBQXdCO0FBQ3BCLFNBQUssT0FBTztBQUNaLFVBQU0sUUFBbUIsS0FBSyxnQkFBZ0IsYUFBYSxVQUFVLFNBQVM7QUFDOUUsU0FBSyxRQUFRLFFBQVEsRUFBRSxPQUFPLENBQUM7QUFDL0IsU0FBSyxRQUFRLGFBQ1QsaUNBQUFDLFNBQUMsT0FBRSxPQUFNLGtDQUNMLGlDQUFBQTtBQUFBLE1BQUM7QUFBQTtBQUFBLFFBQ0csT0FBTTtBQUFBLFFBQ04sY0FBWSxFQUFFLFdBQVc7QUFBQSxRQUN6QixPQUFNO0FBQUE7QUFBQSxNQUVMLE1BQU0sU0FBUyxTQUFTO0FBQUEsSUFDN0IsR0FDQSxpQ0FBQUE7QUFBQSxNQUFDO0FBQUE7QUFBQSxRQUNHLE9BQU07QUFBQSxRQUNOLGNBQVksRUFBRSxXQUFXO0FBQUEsUUFDekIsT0FBTTtBQUFBO0FBQUEsTUFFTCxNQUFNLFNBQVMsU0FBUztBQUFBLElBQzdCLEdBQ0EsaUNBQUFBO0FBQUEsTUFBQztBQUFBO0FBQUEsUUFDRyxPQUFNO0FBQUEsUUFDTixjQUFZLEVBQUUsYUFBYTtBQUFBLFFBQzNCLE9BQU07QUFBQTtBQUFBLE1BRUwsTUFBTSxXQUFXLFNBQVM7QUFBQSxJQUMvQixDQUNKO0FBRUosU0FBSyxVQUFVLE1BQU07QUFDckIsU0FBSyxVQUFVLGFBQWEsTUFBTSxtQkFBbUI7QUFFckQsZUFBVyxRQUFRLEtBQUssZ0JBQWdCLGlCQUFpQixVQUFVO0FBQy9ELFdBQUssV0FBVyxNQUFNLEtBQUssV0FBVyxJQUFJO0FBQUEsSUFDOUM7QUFBQSxFQUNKO0FBQUEsRUFFQSxXQUFXLE1BQVksYUFBMEIsT0FBNkI7QUFDMUUsVUFBTSxXQUF3QixZQUFZLFVBQVUsV0FBVztBQUUvRCxVQUFNLGVBQTRCLFNBQVM7QUFBQSxNQUN2QztBQUFBLElBQ0o7QUFDQSxVQUFNLDRCQUFxQyxNQUFNLFNBQVM7QUFDMUQsUUFBSSxZQUFZLENBQUM7QUFDakIsUUFBSSxpQkFBcUM7QUFDekMsUUFBSSxLQUFLLFNBQVMsU0FBUyxHQUFHO0FBQzFCLHVCQUFpQixhQUFhLFVBQVUsOEJBQThCO0FBQ3RFLHFCQUFlLFlBQVk7QUFDM0IsTUFBQyxlQUFlLFdBQVcsQ0FBQyxFQUFrQixNQUFNLFlBQVksWUFDMUQsbUJBQ0E7QUFBQSxJQUNWO0FBRUEsVUFBTSxnQkFBNkIsYUFBYSxVQUFVLGlCQUFpQjtBQUMzRSxVQUFNLG9CQUFpQyxjQUFjLFVBQVUsbUJBQW1CO0FBQ2xGLHNCQUFrQixhQUFhLGlDQUFBQSxTQUFDLFVBQUssT0FBTSx1QkFBcUIsS0FBSyxRQUFTO0FBQzlFLFVBQU0sZ0JBQTZCLGFBQWEsVUFBVSx1QkFBdUI7QUFDakYsVUFBTSxZQUFZLEtBQUssZ0JBQWdCLGFBQWEsS0FBSyxhQUFhLENBQUM7QUFDdkUsa0JBQWMsYUFDVixpQ0FBQUEsU0FBQyxjQUNHLGlDQUFBQTtBQUFBLE1BQUM7QUFBQTtBQUFBLFFBQ0csT0FBTTtBQUFBLFFBQ04sT0FBTTtBQUFBO0FBQUEsTUFFTCxVQUFVLFNBQVMsU0FBUztBQUFBLElBQ2pDLEdBQ0EsaUNBQUFBO0FBQUEsTUFBQztBQUFBO0FBQUEsUUFDRyxPQUFNO0FBQUEsUUFDTixPQUFNO0FBQUE7QUFBQSxNQUVMLFVBQVUsU0FBUyxTQUFTO0FBQUEsSUFDakMsR0FDQSxpQ0FBQUE7QUFBQSxNQUFDO0FBQUE7QUFBQSxRQUNHLE9BQU07QUFBQSxRQUNOLE9BQU07QUFBQTtBQUFBLE1BRUwsVUFBVSxXQUFXLFNBQVM7QUFBQSxJQUNuQyxDQUNKO0FBR0osVUFBTSxtQkFBZ0MsU0FBUyxVQUFVLG9CQUFvQjtBQUM3RSxxQkFBaUIsTUFBTSxVQUFVLFlBQVksU0FBUztBQUN0RCxRQUFJLEtBQUssU0FBUyxTQUFTLEdBQUc7QUFDMUIscUJBQWUsaUJBQWlCLFNBQVMsQ0FBQyxNQUFNO0FBQzVDLFlBQUksV0FBVztBQUNYLFVBQUMsZUFBZSxXQUFXLENBQUMsRUFBa0IsTUFBTSxZQUFZO0FBQ2hFLDJCQUFpQixNQUFNLFVBQVU7QUFBQSxRQUNyQyxPQUFPO0FBQ0gsVUFBQyxlQUFlLFdBQVcsQ0FBQyxFQUFrQixNQUFNLFlBQ2hEO0FBQ0osMkJBQWlCLE1BQU0sVUFBVTtBQUFBLFFBQ3JDO0FBSUEsVUFBRSxnQkFBZ0I7QUFDbEIsb0JBQVksQ0FBQztBQUFBLE1BQ2pCLENBQUM7QUFBQSxJQUNMO0FBS0EsaUJBQWEsaUJBQWlCLFNBQVMsTUFBTTtBQUN6QyxXQUFLLGtCQUFrQixJQUFJO0FBQUEsSUFDL0IsQ0FBQztBQUVELGVBQVcsV0FBVyxLQUFLLFVBQVU7QUFDakMsV0FBSyxXQUFXLFNBQVMsa0JBQWtCLEtBQUs7QUFBQSxJQUNwRDtBQUFBLEVBQ0o7QUFBQSxFQUVBLGtCQUFrQixNQUFZO0FBQzFCLFNBQUssZ0JBQWdCLGVBQWUsS0FBSyxhQUFhLENBQUM7QUFDdkQsUUFBSSxLQUFLLGdCQUFnQixnQkFBZ0I7QUFDckMsV0FBSyxlQUFlO0FBQ3BCLFdBQUssZ0JBQWdCO0FBQUEsSUFDekI7QUFBTyxXQUFLLGdCQUFnQjtBQUFBLEVBQ2hDO0FBQUEsRUFFQSxpQkFBdUI7QUFDbkIsU0FBSyxVQUFVLE1BQU07QUFFckIsU0FBSyxnQkFBZ0IsS0FBSyxVQUFVLFVBQVUsbUJBQW1CO0FBRWpFLFNBQUssaUJBQWlCO0FBQ3RCLFNBQUssaUJBQWlCO0FBQ3RCLFNBQUssa0JBQWtCO0FBQ3ZCLFNBQUsscUJBQXFCO0FBQzFCLFNBQUssaUJBQWlCO0FBRXRCLFFBQUksS0FBSyxTQUFTLG9CQUFvQjtBQUNsQyxXQUFLLGNBQWMsS0FBSyxVQUFVLFVBQVU7QUFDNUMsV0FBSyxZQUFZLGFBQWEsTUFBTSxZQUFZO0FBQUEsSUFDcEQ7QUFFQSxTQUFLLGdCQUFnQixLQUFLLFVBQVUsVUFBVSxLQUFLO0FBQ25ELFNBQUssY0FBYyxhQUFhLE1BQU0sbUJBQW1CO0FBRXpELFNBQUssc0JBQXNCO0FBRTNCLFNBQUssdUJBQXVCO0FBRTVCLFFBQUksS0FBSyw0QkFBd0M7QUFDN0MsV0FBSyxRQUFRLE1BQU0sVUFBVTtBQUU3QixXQUFLLFlBQVksU0FBUyx5QkFBeUI7QUFDbkQsV0FBSyxRQUFRLFNBQVMsb0JBQW9CO0FBQzFDLFdBQUssUUFBUSxTQUFTLG9CQUFvQjtBQUFBLElBQzlDO0FBQUEsRUFDSjtBQUFBLEVBRUEseUJBQXlCO0FBQ3JCLFNBQUssWUFBWSxLQUFLLFVBQVUsVUFBVTtBQUMxQyxTQUFLLFVBQVUsYUFBYSxNQUFNLGdCQUFnQjtBQUNsRCxTQUFLLFVBQVUsUUFBUSxFQUFFLGFBQWEsQ0FBQztBQUN2QyxTQUFLLFVBQVUsaUJBQWlCLFNBQVMsTUFBTTtBQUMzQyxXQUFLLFdBQVc7QUFBQSxJQUNwQixDQUFDO0FBQUEsRUFDTDtBQUFBLEVBRUEsd0JBQXdCO0FBQ3BCLFNBQUssY0FBYyxLQUFLLFVBQVUsVUFBVSx1QkFBdUI7QUFFbkUsU0FBSyxVQUFVLFNBQVMsY0FBYyxRQUFRO0FBQzlDLFNBQUssUUFBUSxhQUFhLE1BQU0sYUFBYTtBQUM3QyxTQUFLLFFBQVEsUUFBUSxLQUFLLFNBQVMsaUJBQWlCO0FBQ3BELFNBQUssUUFBUSxpQkFBaUIsU0FBUyxNQUFNO0FBQ3pDLFdBQUssMEJBQWlDO0FBQUEsSUFDMUMsQ0FBQztBQUNELFNBQUssWUFBWSxZQUFZLEtBQUssT0FBTztBQUV6QyxTQUFLLFVBQVUsU0FBUyxjQUFjLFFBQVE7QUFDOUMsU0FBSyxRQUFRLGFBQWEsTUFBTSxhQUFhO0FBQzdDLFNBQUssUUFBUSxRQUFRLEtBQUssU0FBUyxpQkFBaUI7QUFDcEQsU0FBSyxRQUFRLGlCQUFpQixTQUFTLE1BQU07QUFDekMsV0FBSywwQkFBaUM7QUFBQSxJQUMxQyxDQUFDO0FBQ0QsU0FBSyxZQUFZLFlBQVksS0FBSyxPQUFPO0FBRXpDLFNBQUssVUFBVSxTQUFTLGNBQWMsUUFBUTtBQUM5QyxTQUFLLFFBQVEsYUFBYSxNQUFNLGFBQWE7QUFDN0MsU0FBSyxRQUFRLFFBQVEsS0FBSyxTQUFTLGlCQUFpQjtBQUNwRCxTQUFLLFFBQVEsaUJBQWlCLFNBQVMsTUFBTTtBQUN6QyxXQUFLLDBCQUFpQztBQUFBLElBQzFDLENBQUM7QUFDRCxTQUFLLFlBQVksWUFBWSxLQUFLLE9BQU87QUFDekMsU0FBSyxZQUFZLE1BQU0sVUFBVTtBQUFBLEVBQ3JDO0FBQUEsRUFFQSxtQkFBbUI7QUFDZixVQUFNLGFBQWEsS0FBSyxjQUFjLFNBQVMsUUFBUTtBQUN2RCxlQUFXLFNBQVMsd0JBQXdCO0FBQzVDLGtDQUFRLFlBQVksZ0JBQWdCO0FBQ3BDLGVBQVcsYUFBYSxjQUFjLEVBQUUsTUFBTSxDQUFDO0FBQy9DLGVBQVcsaUJBQWlCLFNBQVMsTUFBTTtBQUN2QyxXQUFLLGdCQUFnQjtBQUFBLElBQ3pCLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFFQSx1QkFBdUI7QUFDbkIsVUFBTSxXQUFXLEtBQUssY0FBYyxTQUFTLFFBQVE7QUFDckQsYUFBUyxTQUFTLHdCQUF3QjtBQUMxQyxrQ0FBUSxVQUFVLE1BQU07QUFDeEIsYUFBUyxhQUFhLGNBQWMsZ0JBQWdCO0FBQ3BELGFBQVMsaUJBQWlCLFNBQVMsWUFBWTtBQUMzQyxXQUFLLDZCQUE2QjtBQUFBLElBQ3RDLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFFQSwrQkFBK0I7QUEzVm5DO0FBNFZRLFVBQU1DLFlBQVcsS0FBSyxZQUFZO0FBQ2xDLFVBQU0saUJBQWlCLEVBQUUsd0JBQXdCLE1BQUssS0FBQUEsYUFBQSxnQkFBQUEsVUFBVSxTQUFWLFlBQWtCLEVBQUUsS0FBSztBQUMvRSxVQUFNLHFCQUNGLEVBQUUsNEJBQTRCLElBQUksYUFBYUEsYUFBQSxnQkFBQUEsVUFBVSxVQUFVLEtBQUs7QUFDNUUsVUFBTSxtQkFBbUIsRUFBRSx1QkFBdUI7QUFBQSxNQUM5QyxVQUFVLEtBQUssZ0JBQWdCLEtBQUs7QUFBQSxJQUN4QyxDQUFDO0FBQ0QsUUFBSSx3QkFBTyxpQkFBaUIsT0FBTyxxQkFBcUIsT0FBTyxnQkFBZ0I7QUFBQSxFQUNuRjtBQUFBLEVBRUEsbUJBQW1CO0FBQ2YsVUFBTSxhQUFhLEtBQUssY0FBYyxTQUFTLFFBQVE7QUFDdkQsZUFBVyxTQUFTLHdCQUF3QjtBQUM1QyxrQ0FBUSxZQUFZLFlBQVk7QUFDaEMsZUFBVyxhQUFhLGNBQWMsRUFBRSxNQUFNLENBQUM7QUFDL0MsZUFBVyxpQkFBaUIsU0FBUyxNQUFNO0FBRXZDLFdBQUssZ0JBQWdCO0FBQUEsSUFDekIsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVBLG9CQUFvQjtBQUNoQixTQUFLLGNBQWMsS0FBSyxjQUFjLFNBQVMsUUFBUTtBQUN2RCxTQUFLLFlBQVksU0FBUyx3QkFBd0I7QUFDbEQsa0NBQVEsS0FBSyxhQUFhLFlBQVk7QUFDdEMsU0FBSyxZQUFZLGFBQWEsY0FBYyxFQUFFLHFCQUFxQixDQUFDO0FBQ3BFLFNBQUssWUFBWSxpQkFBaUIsU0FBUyxNQUFNO0FBQzdDLFdBQUssMkJBQWtDO0FBQUEsSUFDM0MsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVBLG1CQUFtQjtBQUNmLFNBQUssYUFBYSxLQUFLLGNBQWMsU0FBUyxRQUFRO0FBQ3RELFNBQUssV0FBVyxTQUFTLHdCQUF3QjtBQUNqRCxrQ0FBUSxLQUFLLFlBQVksTUFBTTtBQUMvQixTQUFLLFdBQVcsYUFBYSxjQUFjLEVBQUUsV0FBVyxDQUFDO0FBQ3pELFNBQUssV0FBVyxpQkFBaUIsU0FBUyxZQUFZO0FBQ2xELFdBQUssbUJBQW1CO0FBQUEsSUFDNUIsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVBLE1BQU0scUJBQW9DO0FBQ3RDLFVBQU0sV0FBcUIsS0FBSyxnQkFBZ0I7QUFHaEQsVUFBTSxhQUFhLFNBQVMsYUFBYTtBQUV6QyxVQUFNLFlBQVksbUJBQW1CLE9BQU8sS0FBSyxLQUFLLFVBQVU7QUFDaEUsY0FDSyxLQUFLLE9BQU8scUJBQXFCO0FBQzlCLFdBQUssZ0JBQWdCLDBCQUEwQixnQkFBZ0I7QUFBQSxJQUNuRSxDQUFDLEVBQ0EsTUFBTSxDQUFDLFdBQVcsUUFBUSxJQUFJLE1BQU0sQ0FBQztBQUFBLEVBQzlDO0FBQUEsRUFFUSxhQUFtQjtBQUN2QixTQUFLLE9BQU87QUFFWixTQUFLLFVBQVUsTUFBTSxVQUFVO0FBQy9CLFNBQUssWUFBWSxNQUFNLFVBQVU7QUFFakMsUUFBSSxLQUFLLFlBQVksYUFBYTtBQUM5QixXQUFLLFlBQVksV0FBVztBQUFBLElBQ2hDO0FBRUEsUUFBSSxLQUFLLGdCQUFnQixnQ0FBaUM7QUFDdEQsWUFBTSxLQUFrQixTQUFTLGNBQWMsSUFBSTtBQUNuRCxTQUFHLGFBQWEsTUFBTSxtQkFBbUI7QUFDekMsV0FBSyxjQUFjLFlBQVksRUFBRTtBQUFBLElBQ3JDLE9BQU87QUFDSCxXQUFLLGNBQWMsTUFBTTtBQUFBLElBQzdCO0FBRUEsVUFBTSxVQUFpQyxJQUFJO0FBQUEsTUFDdkMsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSyxZQUFZO0FBQUEsSUFDckI7QUFDQSxZQUFRLHNCQUFzQixLQUFLLFlBQVksTUFBTSxLQUFLLGFBQWE7QUFBQSxFQUMzRTtBQUFBLEVBRUEsTUFBYyxjQUFjLFVBQXlDO0FBQ2pFLFVBQU0sS0FBSyxnQkFBZ0IsY0FBYyxRQUFRO0FBRWpELFVBQU0sS0FBSyxlQUFlO0FBQUEsRUFDOUI7QUFBQSxFQUVBLE1BQWMsa0JBQWlDO0FBQzNDLFNBQUssZ0JBQWdCLGdCQUFnQjtBQUVyQyxVQUFNLEtBQUssZUFBZTtBQUFBLEVBQzlCO0FBQUEsRUFFQSxNQUFjLGlCQUFnQztBQUMxQyxRQUFJLEtBQUssZUFBZTtBQUFNLFlBQU0sS0FBSyxnQkFBZ0I7QUFBQTtBQUNwRCxXQUFLLGdCQUFnQjtBQUFBLEVBQzlCO0FBQUEsRUFFQSxNQUFjLGtCQUFpQztBQUMzQyxVQUFNLE9BQWEsS0FBSyxnQkFBZ0I7QUFFeEMsU0FBSyxZQUFZLE1BQU0sVUFBVTtBQUNqQyxTQUFLLFlBQVksV0FBVztBQUM1QixTQUFLLFFBQVEsUUFBUSxHQUFHLEtBQUssUUFBUSxLQUFLLEtBQUssMEJBQStCLElBQUksQ0FBQyxFQUFFO0FBRXJGLFNBQUssVUFBVSxNQUFNLFVBQVU7QUFDL0IsU0FBSyxjQUFjLE1BQU07QUFDekIsU0FBSyxPQUFPO0FBRVosVUFBTSxVQUFpQyxJQUFJO0FBQUEsTUFDdkMsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSyxZQUFZO0FBQUEsSUFDckI7QUFDQSxVQUFNLFFBQVEsc0JBQXNCLEtBQUssWUFBWSxPQUFPLEtBQUssYUFBYTtBQUU5RSxRQUFJLEtBQUssNEJBQXdDO0FBRTdDLFdBQUssUUFBUSxRQUFRLEdBQUcsS0FBSyxTQUFTLGlCQUFpQixFQUFFO0FBQ3pELFdBQUssUUFBUSxRQUFRLEdBQUcsS0FBSyxTQUFTLGlCQUFpQixFQUFFO0FBQUEsSUFDN0QsT0FBTztBQUNILFdBQUs7QUFBQSxRQUNELEtBQUs7QUFBQSxRQUNMLEtBQUssU0FBUztBQUFBO0FBQUEsTUFFbEI7QUFDQSxXQUFLO0FBQUEsUUFDRCxLQUFLO0FBQUEsUUFDTCxLQUFLLFNBQVM7QUFBQTtBQUFBLE1BRWxCO0FBQ0EsV0FBSztBQUFBLFFBQ0QsS0FBSztBQUFBLFFBQ0wsS0FBSyxTQUFTO0FBQUE7QUFBQSxNQUVsQjtBQUFBLElBQ0o7QUFFQSxRQUFJLEtBQUssU0FBUztBQUNkLFdBQUssWUFBWTtBQUFBLFFBQ2IsS0FBSywwQkFBMEIsS0FBSyxnQkFBZ0IsZUFBZTtBQUFBLE1BQ3ZFO0FBQUEsRUFDUjtBQUFBLEVBRVEsMEJBQTBCLGlCQUFtQztBQUNqRSxVQUFNLFNBQVMsR0FBRyxLQUFLLFlBQVksS0FBSyxRQUFRLE1BQU0sZ0JBQWdCLEtBQUssS0FBSyxDQUFDO0FBQ2pGLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFUSxnQkFDSixRQUNBLFlBQ0EsZ0JBQ0Y7QUFDRSxVQUFNQSxZQUE2QixLQUFLLGdCQUFnQjtBQUFBLE1BQ3BEO0FBQUEsTUFDQSxLQUFLO0FBQUEsSUFDVDtBQUNBLFVBQU0sV0FBbUJBLFVBQVM7QUFFbEMsUUFBSSwwQkFBUyxVQUFVO0FBQ25CLGFBQU8sUUFBUSxhQUFhLFVBQVUsSUFBSSxDQUFDO0FBQUEsSUFDL0MsT0FBTztBQUNILGFBQU8sUUFBUSxHQUFHLFVBQVUsTUFBTSxhQUFhLFVBQVUsS0FBSyxDQUFDLEVBQUU7QUFBQSxJQUNyRTtBQUFBLEVBQ0o7QUFDSjs7O0FhbGdCQSxJQUFBQyxtQkFBcUM7QUFFckMsSUFBQUMsZ0JBQWM7OztBQ0lkLFNBQVMsTUFBTSxHQUFHO0FBQ2hCLFNBQU8sSUFBSSxNQUFNO0FBQ25CO0FBQ0EsSUFBTSxNQUFNLENBQUMsR0FBRyxHQUFHQyxPQUFNLEtBQUssSUFBSSxLQUFLLElBQUksR0FBR0EsRUFBQyxHQUFHLENBQUM7QUFDbkQsU0FBUyxJQUFJLEdBQUc7QUFDZCxTQUFPLElBQUksTUFBTSxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUc7QUFDcEM7QUFJQSxTQUFTLElBQUksR0FBRztBQUNkLFNBQU8sSUFBSSxNQUFNLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRztBQUNuQztBQUNBLFNBQVMsSUFBSSxHQUFHO0FBQ2QsU0FBTyxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksS0FBSyxHQUFHLENBQUM7QUFDeEM7QUFDQSxTQUFTLElBQUksR0FBRztBQUNkLFNBQU8sSUFBSSxNQUFNLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRztBQUNuQztBQUVBLElBQU0sUUFBUSxFQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRTtBQUM3SixJQUFNLE1BQU0sQ0FBQyxHQUFHLGtCQUFrQjtBQUNsQyxJQUFNLEtBQUssT0FBSyxJQUFJLElBQUksRUFBRztBQUMzQixJQUFNLEtBQUssT0FBSyxLQUFLLElBQUksUUFBUyxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUc7QUFDbEQsSUFBTSxLQUFLLFFBQU8sSUFBSSxRQUFTLE9BQVEsSUFBSTtBQUMzQyxJQUFNLFVBQVUsT0FBSyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUM1RCxTQUFTLFNBQVMsS0FBSztBQUNyQixNQUFJLE1BQU0sSUFBSTtBQUNkLE1BQUk7QUFDSixNQUFJLElBQUksQ0FBQyxNQUFNLEtBQUs7QUFDbEIsUUFBSSxRQUFRLEtBQUssUUFBUSxHQUFHO0FBQzFCLFlBQU07QUFBQSxRQUNKLEdBQUcsTUFBTSxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUk7QUFBQSxRQUN6QixHQUFHLE1BQU0sTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJO0FBQUEsUUFDekIsR0FBRyxNQUFNLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSTtBQUFBLFFBQ3pCLEdBQUcsUUFBUSxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLO0FBQUEsTUFDdEM7QUFBQSxJQUNGLFdBQVcsUUFBUSxLQUFLLFFBQVEsR0FBRztBQUNqQyxZQUFNO0FBQUEsUUFDSixHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFBQSxRQUNwQyxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFBQSxRQUNwQyxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFBQSxRQUNwQyxHQUFHLFFBQVEsSUFBSyxNQUFNLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUs7QUFBQSxNQUN4RDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBQ0EsSUFBTSxRQUFRLENBQUMsR0FBRyxNQUFNLElBQUksTUFBTSxFQUFFLENBQUMsSUFBSTtBQUN6QyxTQUFTLFVBQVUsR0FBRztBQUNwQixNQUFJLElBQUksUUFBUSxDQUFDLElBQUksS0FBSztBQUMxQixTQUFPLElBQ0gsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQzdDO0FBQ047QUFFQSxJQUFNLFNBQVM7QUFDZixTQUFTLFNBQVNDLElBQUcsR0FBRyxHQUFHO0FBQ3pCLFFBQU0sSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQztBQUMvQixRQUFNLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSUEsS0FBSSxNQUFNLE9BQU8sSUFBSSxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRTtBQUN0RixTQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDMUI7QUFDQSxTQUFTLFNBQVNBLElBQUcsR0FBRyxHQUFHO0FBQ3pCLFFBQU0sSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJQSxLQUFJLE1BQU0sTUFBTSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ3BGLFNBQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUMxQjtBQUNBLFNBQVMsU0FBU0EsSUFBRyxHQUFHLEdBQUc7QUFDekIsUUFBTSxNQUFNLFNBQVNBLElBQUcsR0FBRyxHQUFHO0FBQzlCLE1BQUk7QUFDSixNQUFJLElBQUksSUFBSSxHQUFHO0FBQ2IsUUFBSSxLQUFLLElBQUk7QUFDYixTQUFLO0FBQ0wsU0FBSztBQUFBLEVBQ1A7QUFDQSxPQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSztBQUN0QixRQUFJLENBQUMsS0FBSyxJQUFJLElBQUk7QUFDbEIsUUFBSSxDQUFDLEtBQUs7QUFBQSxFQUNaO0FBQ0EsU0FBTztBQUNUO0FBQ0EsU0FBUyxTQUFTLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSztBQUNqQyxNQUFJLE1BQU0sS0FBSztBQUNiLFlBQVMsSUFBSSxLQUFLLEtBQU0sSUFBSSxJQUFJLElBQUk7QUFBQSxFQUN0QztBQUNBLE1BQUksTUFBTSxLQUFLO0FBQ2IsWUFBUSxJQUFJLEtBQUssSUFBSTtBQUFBLEVBQ3ZCO0FBQ0EsVUFBUSxJQUFJLEtBQUssSUFBSTtBQUN2QjtBQUNBLFNBQVMsUUFBUSxHQUFHO0FBQ2xCLFFBQU0sUUFBUTtBQUNkLFFBQU0sSUFBSSxFQUFFLElBQUk7QUFDaEIsUUFBTSxJQUFJLEVBQUUsSUFBSTtBQUNoQixRQUFNLElBQUksRUFBRSxJQUFJO0FBQ2hCLFFBQU0sTUFBTSxLQUFLLElBQUksR0FBRyxHQUFHLENBQUM7QUFDNUIsUUFBTSxNQUFNLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUM1QixRQUFNLEtBQUssTUFBTSxPQUFPO0FBQ3hCLE1BQUlBLElBQUcsR0FBRztBQUNWLE1BQUksUUFBUSxLQUFLO0FBQ2YsUUFBSSxNQUFNO0FBQ1YsUUFBSSxJQUFJLE1BQU0sS0FBSyxJQUFJLE1BQU0sT0FBTyxLQUFLLE1BQU07QUFDL0MsSUFBQUEsS0FBSSxTQUFTLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztBQUM1QixJQUFBQSxLQUFJQSxLQUFJLEtBQUs7QUFBQSxFQUNmO0FBQ0EsU0FBTyxDQUFDQSxLQUFJLEdBQUcsS0FBSyxHQUFHLENBQUM7QUFDMUI7QUFDQSxTQUFTLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRztBQUN6QixVQUNFLE1BQU0sUUFBUSxDQUFDLElBQ1gsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUNsQixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQ2IsSUFBSSxHQUFHO0FBQ1g7QUFDQSxTQUFTLFFBQVFBLElBQUcsR0FBRyxHQUFHO0FBQ3hCLFNBQU8sTUFBTSxVQUFVQSxJQUFHLEdBQUcsQ0FBQztBQUNoQztBQUNBLFNBQVMsUUFBUUEsSUFBRyxHQUFHLEdBQUc7QUFDeEIsU0FBTyxNQUFNLFVBQVVBLElBQUcsR0FBRyxDQUFDO0FBQ2hDO0FBQ0EsU0FBUyxRQUFRQSxJQUFHLEdBQUcsR0FBRztBQUN4QixTQUFPLE1BQU0sVUFBVUEsSUFBRyxHQUFHLENBQUM7QUFDaEM7QUFDQSxTQUFTLElBQUlBLElBQUc7QUFDZCxVQUFRQSxLQUFJLE1BQU0sT0FBTztBQUMzQjtBQUNBLFNBQVMsU0FBUyxLQUFLO0FBQ3JCLFFBQU0sSUFBSSxPQUFPLEtBQUssR0FBRztBQUN6QixNQUFJLElBQUk7QUFDUixNQUFJO0FBQ0osTUFBSSxDQUFDLEdBQUc7QUFDTjtBQUFBLEVBQ0Y7QUFDQSxNQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUc7QUFDZCxRQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUFBLEVBQ25DO0FBQ0EsUUFBTUEsS0FBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkIsUUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUk7QUFDbkIsUUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUk7QUFDbkIsTUFBSSxFQUFFLENBQUMsTUFBTSxPQUFPO0FBQ2xCLFFBQUksUUFBUUEsSUFBRyxJQUFJLEVBQUU7QUFBQSxFQUN2QixXQUFXLEVBQUUsQ0FBQyxNQUFNLE9BQU87QUFDekIsUUFBSSxRQUFRQSxJQUFHLElBQUksRUFBRTtBQUFBLEVBQ3ZCLE9BQU87QUFDTCxRQUFJLFFBQVFBLElBQUcsSUFBSSxFQUFFO0FBQUEsRUFDdkI7QUFDQSxTQUFPO0FBQUEsSUFDTCxHQUFHLEVBQUUsQ0FBQztBQUFBLElBQ04sR0FBRyxFQUFFLENBQUM7QUFBQSxJQUNOLEdBQUcsRUFBRSxDQUFDO0FBQUEsSUFDTjtBQUFBLEVBQ0Y7QUFDRjtBQUNBLFNBQVMsT0FBTyxHQUFHLEtBQUs7QUFDdEIsTUFBSUEsS0FBSSxRQUFRLENBQUM7QUFDakIsRUFBQUEsR0FBRSxDQUFDLElBQUksSUFBSUEsR0FBRSxDQUFDLElBQUksR0FBRztBQUNyQixFQUFBQSxLQUFJLFFBQVFBLEVBQUM7QUFDYixJQUFFLElBQUlBLEdBQUUsQ0FBQztBQUNULElBQUUsSUFBSUEsR0FBRSxDQUFDO0FBQ1QsSUFBRSxJQUFJQSxHQUFFLENBQUM7QUFDWDtBQUNBLFNBQVMsVUFBVSxHQUFHO0FBQ3BCLE1BQUksQ0FBQyxHQUFHO0FBQ047QUFBQSxFQUNGO0FBQ0EsUUFBTSxJQUFJLFFBQVEsQ0FBQztBQUNuQixRQUFNQSxLQUFJLEVBQUUsQ0FBQztBQUNiLFFBQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLFFBQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLFNBQU8sRUFBRSxJQUFJLE1BQ1QsUUFBUUEsRUFBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUNwQyxPQUFPQSxFQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDM0I7QUFFQSxJQUFNLE1BQU07QUFBQSxFQUNWLEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFDTDtBQUNBLElBQU0sVUFBVTtBQUFBLEVBQ2QsUUFBUTtBQUFBLEVBQ1IsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsY0FBYztBQUFBLEVBQ2QsSUFBSTtBQUFBLEVBQ0osU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1YsU0FBUztBQUFBLEVBQ1QsS0FBSztBQUFBLEVBQ0wsYUFBYTtBQUFBLEVBQ2IsU0FBUztBQUFBLEVBQ1QsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sS0FBSztBQUFBLEVBQ0wsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBQ1gsS0FBSztBQUFBLEVBQ0wsUUFBUTtBQUFBLEVBQ1IsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsV0FBVztBQUFBLEVBQ1gsU0FBUztBQUFBLEVBQ1QsWUFBWTtBQUFBLEVBQ1osS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1QsS0FBSztBQUFBLEVBQ0wsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsWUFBWTtBQUFBLEVBQ1osS0FBSztBQUFBLEVBQ0wsT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsS0FBSztBQUFBLEVBQ0wsVUFBVTtBQUFBLEVBQ1YsWUFBWTtBQUFBLEVBQ1osU0FBUztBQUFBLEVBQ1QsVUFBVTtBQUFBLEVBQ1YsU0FBUztBQUFBLEVBQ1QsWUFBWTtBQUFBLEVBQ1osTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsSUFBSTtBQUFBLEVBQ0osVUFBVTtBQUFBLEVBQ1YsT0FBTztBQUFBLEVBQ1AsV0FBVztBQUFBLEVBQ1gsT0FBTztBQUFBLEVBQ1AsV0FBVztBQUFBLEVBQ1gsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsSUFBSTtBQUFBLEVBQ0osT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsSUFBSTtBQUFBLEVBQ0osT0FBTztBQUNUO0FBQ0EsU0FBUyxTQUFTO0FBQ2hCLFFBQU0sV0FBVyxDQUFDO0FBQ2xCLFFBQU0sT0FBTyxPQUFPLEtBQUssT0FBTztBQUNoQyxRQUFNLFFBQVEsT0FBTyxLQUFLLEdBQUc7QUFDN0IsTUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJO0FBQ2pCLE9BQUssSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDaEMsU0FBSyxLQUFLLEtBQUssQ0FBQztBQUNoQixTQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQ2pDLFVBQUksTUFBTSxDQUFDO0FBQ1gsV0FBSyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUFBLElBQzNCO0FBQ0EsUUFBSSxTQUFTLFFBQVEsRUFBRSxHQUFHLEVBQUU7QUFDNUIsYUFBUyxFQUFFLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBTSxLQUFLLElBQUksS0FBTSxJQUFJLEdBQUk7QUFBQSxFQUN6RDtBQUNBLFNBQU87QUFDVDtBQUVBLElBQUk7QUFDSixTQUFTLFVBQVUsS0FBSztBQUN0QixNQUFJLENBQUMsT0FBTztBQUNWLFlBQVEsT0FBTztBQUNmLFVBQU0sY0FBYyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFBQSxFQUNqQztBQUNBLFFBQU0sSUFBSSxNQUFNLElBQUksWUFBWSxDQUFDO0FBQ2pDLFNBQU8sS0FBSztBQUFBLElBQ1YsR0FBRyxFQUFFLENBQUM7QUFBQSxJQUNOLEdBQUcsRUFBRSxDQUFDO0FBQUEsSUFDTixHQUFHLEVBQUUsQ0FBQztBQUFBLElBQ04sR0FBRyxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUMsSUFBSTtBQUFBLEVBQzdCO0FBQ0Y7QUFFQSxJQUFNLFNBQVM7QUFDZixTQUFTLFNBQVMsS0FBSztBQUNyQixRQUFNLElBQUksT0FBTyxLQUFLLEdBQUc7QUFDekIsTUFBSSxJQUFJO0FBQ1IsTUFBSSxHQUFHLEdBQUc7QUFDVixNQUFJLENBQUMsR0FBRztBQUNOO0FBQUEsRUFDRjtBQUNBLE1BQUksRUFBRSxDQUFDLE1BQU0sR0FBRztBQUNkLFVBQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNkLFFBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEtBQUssR0FBRyxHQUFHO0FBQUEsRUFDekM7QUFDQSxNQUFJLENBQUMsRUFBRSxDQUFDO0FBQ1IsTUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNSLE1BQUksQ0FBQyxFQUFFLENBQUM7QUFDUixNQUFJLE9BQU8sRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRztBQUN4QyxNQUFJLE9BQU8sRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRztBQUN4QyxNQUFJLE9BQU8sRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRztBQUN4QyxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRjtBQUNBLFNBQVMsVUFBVSxHQUFHO0FBQ3BCLFNBQU8sTUFDTCxFQUFFLElBQUksTUFDRixRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsTUFDeEMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFFbEM7QUFFQSxJQUFNLEtBQUssT0FBSyxLQUFLLFdBQVksSUFBSSxRQUFRLEtBQUssSUFBSSxHQUFHLElBQU0sR0FBRyxJQUFJLFFBQVE7QUFDOUUsSUFBTSxPQUFPLE9BQUssS0FBSyxVQUFVLElBQUksUUFBUSxLQUFLLEtBQUssSUFBSSxTQUFTLE9BQU8sR0FBRztBQUM5RSxTQUFTQyxhQUFZLE1BQU0sTUFBTUMsSUFBRztBQUNsQyxRQUFNLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDO0FBQzFCLFFBQU0sSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLENBQUM7QUFDMUIsUUFBTSxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQztBQUMxQixTQUFPO0FBQUEsSUFDTCxHQUFHLElBQUksR0FBRyxJQUFJQSxNQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUFBLElBQzFDLEdBQUcsSUFBSSxHQUFHLElBQUlBLE1BQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQUEsSUFDMUMsR0FBRyxJQUFJLEdBQUcsSUFBSUEsTUFBSyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFBQSxJQUMxQyxHQUFHLEtBQUssSUFBSUEsTUFBSyxLQUFLLElBQUksS0FBSztBQUFBLEVBQ2pDO0FBQ0Y7QUFFQSxTQUFTLE9BQU8sR0FBRyxHQUFHLE9BQU87QUFDM0IsTUFBSSxHQUFHO0FBQ0wsUUFBSSxNQUFNLFFBQVEsQ0FBQztBQUNuQixRQUFJLENBQUMsSUFBSSxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksT0FBTyxNQUFNLElBQUksTUFBTSxDQUFDLENBQUM7QUFDekUsVUFBTSxRQUFRLEdBQUc7QUFDakIsTUFBRSxJQUFJLElBQUksQ0FBQztBQUNYLE1BQUUsSUFBSSxJQUFJLENBQUM7QUFDWCxNQUFFLElBQUksSUFBSSxDQUFDO0FBQUEsRUFDYjtBQUNGO0FBQ0EsU0FBUyxNQUFNLEdBQUcsT0FBTztBQUN2QixTQUFPLElBQUksT0FBTyxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSTtBQUM3QztBQUNBLFNBQVMsV0FBVyxPQUFPO0FBQ3pCLE1BQUksSUFBSSxFQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBRztBQUNqQyxNQUFJLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFDeEIsUUFBSSxNQUFNLFVBQVUsR0FBRztBQUNyQixVQUFJLEVBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFHO0FBQ2xELFVBQUksTUFBTSxTQUFTLEdBQUc7QUFDcEIsVUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLENBQUM7QUFBQSxNQUNwQjtBQUFBLElBQ0Y7QUFBQSxFQUNGLE9BQU87QUFDTCxRQUFJLE1BQU0sT0FBTyxFQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBQyxDQUFDO0FBQ3pDLE1BQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUFBLEVBQ2Y7QUFDQSxTQUFPO0FBQ1Q7QUFDQSxTQUFTLGNBQWMsS0FBSztBQUMxQixNQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSztBQUN6QixXQUFPLFNBQVMsR0FBRztBQUFBLEVBQ3JCO0FBQ0EsU0FBTyxTQUFTLEdBQUc7QUFDckI7QUFDQSxJQUFNLFFBQU4sTUFBTSxPQUFNO0FBQUEsRUFDVixZQUFZLE9BQU87QUFDakIsUUFBSSxpQkFBaUIsUUFBTztBQUMxQixhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sT0FBTyxPQUFPO0FBQ3BCLFFBQUk7QUFDSixRQUFJLFNBQVMsVUFBVTtBQUNyQixVQUFJLFdBQVcsS0FBSztBQUFBLElBQ3RCLFdBQVcsU0FBUyxVQUFVO0FBQzVCLFVBQUksU0FBUyxLQUFLLEtBQUssVUFBVSxLQUFLLEtBQUssY0FBYyxLQUFLO0FBQUEsSUFDaEU7QUFDQSxTQUFLLE9BQU87QUFDWixTQUFLLFNBQVMsQ0FBQyxDQUFDO0FBQUEsRUFDbEI7QUFBQSxFQUNBLElBQUksUUFBUTtBQUNWLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQSxFQUNBLElBQUksTUFBTTtBQUNSLFFBQUksSUFBSSxNQUFNLEtBQUssSUFBSTtBQUN2QixRQUFJLEdBQUc7QUFDTCxRQUFFLElBQUksSUFBSSxFQUFFLENBQUM7QUFBQSxJQUNmO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLElBQUksSUFBSSxLQUFLO0FBQ1gsU0FBSyxPQUFPLFdBQVcsR0FBRztBQUFBLEVBQzVCO0FBQUEsRUFDQSxZQUFZO0FBQ1YsV0FBTyxLQUFLLFNBQVMsVUFBVSxLQUFLLElBQUksSUFBSTtBQUFBLEVBQzlDO0FBQUEsRUFDQSxZQUFZO0FBQ1YsV0FBTyxLQUFLLFNBQVMsVUFBVSxLQUFLLElBQUksSUFBSTtBQUFBLEVBQzlDO0FBQUEsRUFDQSxZQUFZO0FBQ1YsV0FBTyxLQUFLLFNBQVMsVUFBVSxLQUFLLElBQUksSUFBSTtBQUFBLEVBQzlDO0FBQUEsRUFDQSxJQUFJQyxRQUFPLFFBQVE7QUFDakIsUUFBSUEsUUFBTztBQUNULFlBQU0sS0FBSyxLQUFLO0FBQ2hCLFlBQU0sS0FBS0EsT0FBTTtBQUNqQixVQUFJO0FBQ0osWUFBTSxJQUFJLFdBQVcsS0FBSyxNQUFNO0FBQ2hDLFlBQU0sSUFBSSxJQUFJLElBQUk7QUFDbEIsWUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHO0FBQ3BCLFlBQU0sT0FBTyxJQUFJLE1BQU0sS0FBSyxLQUFLLElBQUksTUFBTSxJQUFJLElBQUksTUFBTSxLQUFLO0FBQzlELFdBQUssSUFBSTtBQUNULFNBQUcsSUFBSSxNQUFPLEtBQUssR0FBRyxJQUFJLEtBQUssR0FBRyxJQUFJO0FBQ3RDLFNBQUcsSUFBSSxNQUFPLEtBQUssR0FBRyxJQUFJLEtBQUssR0FBRyxJQUFJO0FBQ3RDLFNBQUcsSUFBSSxNQUFPLEtBQUssR0FBRyxJQUFJLEtBQUssR0FBRyxJQUFJO0FBQ3RDLFNBQUcsSUFBSSxJQUFJLEdBQUcsS0FBSyxJQUFJLEtBQUssR0FBRztBQUMvQixXQUFLLE1BQU07QUFBQSxJQUNiO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLFlBQVlBLFFBQU9ELElBQUc7QUFDcEIsUUFBSUMsUUFBTztBQUNULFdBQUssT0FBT0YsYUFBWSxLQUFLLE1BQU1FLE9BQU0sTUFBTUQsRUFBQztBQUFBLElBQ2xEO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLFFBQVE7QUFDTixXQUFPLElBQUksT0FBTSxLQUFLLEdBQUc7QUFBQSxFQUMzQjtBQUFBLEVBQ0EsTUFBTSxHQUFHO0FBQ1AsU0FBSyxLQUFLLElBQUksSUFBSSxDQUFDO0FBQ25CLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxRQUFRLE9BQU87QUFDYixVQUFNLE1BQU0sS0FBSztBQUNqQixRQUFJLEtBQUssSUFBSTtBQUNiLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxZQUFZO0FBQ1YsVUFBTSxNQUFNLEtBQUs7QUFDakIsVUFBTSxNQUFNLE1BQU0sSUFBSSxJQUFJLE1BQU0sSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLElBQUk7QUFDM0QsUUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUk7QUFDeEIsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLFFBQVEsT0FBTztBQUNiLFVBQU0sTUFBTSxLQUFLO0FBQ2pCLFFBQUksS0FBSyxJQUFJO0FBQ2IsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLFNBQVM7QUFDUCxVQUFNLElBQUksS0FBSztBQUNmLE1BQUUsSUFBSSxNQUFNLEVBQUU7QUFDZCxNQUFFLElBQUksTUFBTSxFQUFFO0FBQ2QsTUFBRSxJQUFJLE1BQU0sRUFBRTtBQUNkLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxRQUFRLE9BQU87QUFDYixXQUFPLEtBQUssTUFBTSxHQUFHLEtBQUs7QUFDMUIsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLE9BQU8sT0FBTztBQUNaLFdBQU8sS0FBSyxNQUFNLEdBQUcsQ0FBQyxLQUFLO0FBQzNCLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxTQUFTLE9BQU87QUFDZCxXQUFPLEtBQUssTUFBTSxHQUFHLEtBQUs7QUFDMUIsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLFdBQVcsT0FBTztBQUNoQixXQUFPLEtBQUssTUFBTSxHQUFHLENBQUMsS0FBSztBQUMzQixXQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ0EsT0FBTyxLQUFLO0FBQ1YsV0FBTyxLQUFLLE1BQU0sR0FBRztBQUNyQixXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUM1akJPLFNBQVNFLE9BQU87QUFDckI7QUFNSyxJQUFNQyxNQUFPLHVCQUFNO0FBQ3hCLE1BQUlDLEtBQUs7QUFDVCxTQUFPLE1BQU1BO0FBQ2YsR0FBQTtBQU9PLFNBQVNDLGNBQWNDLE9BQTJDO0FBQ3ZFLFNBQU9BLFVBQVUsUUFBUSxPQUFPQSxVQUFVO0FBQzVDO0FBT08sU0FBU0MsUUFBcUJELE9BQThCO0FBQ2pFLE1BQUlFLE1BQU1ELFdBQVdDLE1BQU1ELFFBQVFELEtBQVEsR0FBQTtBQUN6QyxXQUFPOztBQUVULFFBQU1HLE9BQU9DLE9BQU9DLFVBQVVDLFNBQVNDLEtBQUtQLEtBQUFBO0FBQzVDLE1BQUlHLEtBQUtLLE1BQU0sR0FBRyxDQUFBLE1BQU8sYUFBYUwsS0FBS0ssTUFBTSxFQUFDLE1BQU8sVUFBVTtBQUNqRSxXQUFPOztBQUVULFNBQU87QUFDVDtBQU9PLFNBQVNDLFNBQVNULE9BQW9DO0FBQzNELFNBQU9BLFVBQVUsUUFBUUksT0FBT0MsVUFBVUMsU0FBU0MsS0FBS1AsS0FBVyxNQUFBO0FBQ3JFO0FBTUEsU0FBU1UsZUFBZVYsT0FBaUM7QUFDdkQsVUFBUSxPQUFPQSxVQUFVLFlBQVlBLGlCQUFpQlcsV0FBV0MsU0FBUyxDQUFDWixLQUFBQTtBQUM3RTtBQVVPLFNBQVNhLGdCQUFnQmIsT0FBZ0JjLGNBQXNCO0FBQ3BFLFNBQU9KLGVBQWVWLEtBQVNBLElBQUFBLFFBQVFjO0FBQ3pDO0FBT08sU0FBU0MsZUFBa0JmLE9BQXNCYyxjQUFpQjtBQUN2RSxTQUFPLE9BQU9kLFVBQVUsY0FBY2MsZUFBZWQ7QUFDdkQ7SUFFYWdCLGVBQWUsQ0FBQ2hCLE9BQXdCaUIsY0FDbkQsT0FBT2pCLFVBQVUsWUFBWUEsTUFBTWtCLFNBQVMsR0FBQSxJQUMxQ0MsV0FBV25CLEtBQUFBLElBQVMsTUFDbEIsQ0FBQ0EsUUFBUWlCO0lBRUZHLGNBQWMsQ0FBQ3BCLE9BQXdCaUIsY0FDbEQsT0FBT2pCLFVBQVUsWUFBWUEsTUFBTWtCLFNBQVMsR0FBQSxJQUMxQ0MsV0FBV25CLEtBQUFBLElBQVMsTUFBTWlCLFlBQ3hCLENBQUNqQjtBQVNBLFNBQVNxQixTQUNkQyxJQUNBQyxNQUNBQyxTQUNlO0FBQ2YsTUFBSUYsTUFBTSxPQUFPQSxHQUFHZixTQUFTLFlBQVk7QUFDdkMsV0FBT2UsR0FBR0csTUFBTUQsU0FBU0QsSUFBQUE7O0FBRTdCO0FBdUJPLFNBQVNHLEtBQ2RDLFVBQ0FMLElBQ0FFLFNBQ0FJLFNBQ0E7QUFDQSxNQUFJQyxHQUFXQyxLQUFhQztBQUM1QixNQUFJOUIsUUFBUTBCLFFBQVcsR0FBQTtBQUNyQkcsVUFBTUgsU0FBU0s7QUFDZixRQUFJSixTQUFTO0FBQ1gsV0FBS0MsSUFBSUMsTUFBTSxHQUFHRCxLQUFLLEdBQUdBLEtBQUs7QUFDN0JQLFdBQUdmLEtBQUtpQixTQUFTRyxTQUFTRSxDQUFBQSxHQUFJQSxDQUFBQTtNQUNoQztXQUNLO0FBQ0wsV0FBS0EsSUFBSSxHQUFHQSxJQUFJQyxLQUFLRCxLQUFLO0FBQ3hCUCxXQUFHZixLQUFLaUIsU0FBU0csU0FBU0UsQ0FBQUEsR0FBSUEsQ0FBQUE7TUFDaEM7O2FBRU9wQixTQUFTa0IsUUFBVyxHQUFBO0FBQzdCSSxXQUFPM0IsT0FBTzJCLEtBQUtKLFFBQUFBO0FBQ25CRyxVQUFNQyxLQUFLQztBQUNYLFNBQUtILElBQUksR0FBR0EsSUFBSUMsS0FBS0QsS0FBSztBQUN4QlAsU0FBR2YsS0FBS2lCLFNBQVNHLFNBQVNJLEtBQUtGLENBQUFBLENBQUUsR0FBR0UsS0FBS0YsQ0FBRSxDQUFBO0lBQzdDOztBQUVKO0FBUU8sU0FBU0ksZUFBZUMsSUFBdUJDLElBQXVCO0FBQzNFLE1BQUlOLEdBQVdPLE1BQWNDLElBQXFCQztBQUVsRCxNQUFJLENBQUNKLE1BQU0sQ0FBQ0MsTUFBTUQsR0FBR0YsV0FBV0csR0FBR0gsUUFBUTtBQUN6QyxXQUFPOztBQUdULE9BQUtILElBQUksR0FBR08sT0FBT0YsR0FBR0YsUUFBUUgsSUFBSU8sTUFBTSxFQUFFUCxHQUFHO0FBQzNDUSxTQUFLSCxHQUFHTCxDQUFFO0FBQ1ZTLFNBQUtILEdBQUdOLENBQUU7QUFFVixRQUFJUSxHQUFHRSxpQkFBaUJELEdBQUdDLGdCQUFnQkYsR0FBR0csVUFBVUYsR0FBR0UsT0FBTztBQUNoRSxhQUFPOztFQUVYO0FBRUEsU0FBTztBQUNUO0FBTU8sU0FBU0MsT0FBU0MsUUFBYztBQUNyQyxNQUFJekMsUUFBUXlDLE1BQVMsR0FBQTtBQUNuQixXQUFPQSxPQUFPQyxJQUFJRixNQUFBQTs7QUFHcEIsTUFBSWhDLFNBQVNpQyxNQUFTLEdBQUE7QUFDcEIsVUFBTUUsU0FBU3hDLHVCQUFPeUMsT0FBTyxJQUFJO0FBQ2pDLFVBQU1kLE9BQU8zQixPQUFPMkIsS0FBS1csTUFBQUE7QUFDekIsVUFBTUksT0FBT2YsS0FBS0M7QUFDbEIsUUFBSWUsSUFBSTtBQUVSLFdBQU9BLElBQUlELE1BQU0sRUFBRUMsR0FBRztBQUNwQkgsYUFBT2IsS0FBS2dCLENBQUFBLENBQUUsSUFBSU4sT0FBTUMsT0FBT1gsS0FBS2dCLENBQUFBLENBQUUsQ0FBQztJQUN6QztBQUVBLFdBQU9IOztBQUdULFNBQU9GO0FBQ1Q7QUFFQSxTQUFTTSxXQUFXQyxLQUFhO0FBQy9CLFNBQU87SUFBQztJQUFhO0lBQWE7SUFBZUMsUUFBUUQsR0FBQUEsTUFBUztBQUNwRTtBQU9PLFNBQVNFLFFBQVFGLEtBQWFMLFFBQW1CRixRQUFtQlUsU0FBb0I7QUFDN0YsTUFBSSxDQUFDSixXQUFXQyxHQUFNLEdBQUE7QUFDcEI7O0FBR0YsUUFBTUksT0FBT1QsT0FBT0ssR0FBSTtBQUN4QixRQUFNSyxPQUFPWixPQUFPTyxHQUFJO0FBRXhCLE1BQUl4QyxTQUFTNEMsSUFBUzVDLEtBQUFBLFNBQVM2QyxJQUFPLEdBQUE7QUFFcENDLFVBQU1GLE1BQU1DLE1BQU1GLE9BQUFBO1NBQ2I7QUFDTFIsV0FBT0ssR0FBSSxJQUFHUixPQUFNYSxJQUFBQTs7QUFFeEI7QUEwQk8sU0FBU0MsTUFBU1gsUUFBV0YsUUFBcUJVLFNBQW1DO0FBQzFGLFFBQU1JLFVBQVV2RCxRQUFReUMsTUFBQUEsSUFBVUEsU0FBUztJQUFDQTtFQUFPO0FBQ25ELFFBQU1OLE9BQU9vQixRQUFReEI7QUFFckIsTUFBSSxDQUFDdkIsU0FBU21DLE1BQVMsR0FBQTtBQUNyQixXQUFPQTs7QUFHVFEsWUFBVUEsV0FBVyxDQUFBO0FBQ3JCLFFBQU1LLFNBQVNMLFFBQVFLLFVBQVVOO0FBQ2pDLE1BQUlPO0FBRUosV0FBUzdCLElBQUksR0FBR0EsSUFBSU8sTUFBTSxFQUFFUCxHQUFHO0FBQzdCNkIsY0FBVUYsUUFBUTNCLENBQUU7QUFDcEIsUUFBSSxDQUFDcEIsU0FBU2lELE9BQVUsR0FBQTtBQUN0Qjs7QUFHRixVQUFNM0IsT0FBTzNCLE9BQU8yQixLQUFLMkIsT0FBQUE7QUFDekIsYUFBU1gsSUFBSSxHQUFHRCxPQUFPZixLQUFLQyxRQUFRZSxJQUFJRCxNQUFNLEVBQUVDLEdBQUc7QUFDakRVLGFBQU8xQixLQUFLZ0IsQ0FBRSxHQUFFSCxRQUFRYyxTQUFTTixPQUFBQTtJQUNuQztFQUNGO0FBRUEsU0FBT1I7QUFDVDtBQWdCTyxTQUFTZSxRQUFXZixRQUFXRixRQUFnQztBQUVwRSxTQUFPYSxNQUFTWCxRQUFRRixRQUFRO0lBQUNlLFFBQVFHO0VBQVMsQ0FBQTtBQUNwRDtBQU1PLFNBQVNBLFVBQVVYLEtBQWFMLFFBQW1CRixRQUFtQjtBQUMzRSxNQUFJLENBQUNNLFdBQVdDLEdBQU0sR0FBQTtBQUNwQjs7QUFHRixRQUFNSSxPQUFPVCxPQUFPSyxHQUFJO0FBQ3hCLFFBQU1LLE9BQU9aLE9BQU9PLEdBQUk7QUFFeEIsTUFBSXhDLFNBQVM0QyxJQUFTNUMsS0FBQUEsU0FBUzZDLElBQU8sR0FBQTtBQUNwQ0ssWUFBUU4sTUFBTUMsSUFBQUE7YUFDTCxDQUFDbEQsT0FBT0MsVUFBVXdELGVBQWV0RCxLQUFLcUMsUUFBUUssR0FBTSxHQUFBO0FBQzdETCxXQUFPSyxHQUFJLElBQUdSLE9BQU1hLElBQUFBOztBQUV4QjtBQWFBLElBQU1RLGVBQWU7O0VBRW5CLElBQUlDLENBQUFBLE1BQUtBOztFQUVUQyxHQUFHQyxDQUFBQSxNQUFLQSxFQUFFRDtFQUNWRSxHQUFHRCxDQUFBQSxNQUFLQSxFQUFFQztBQUNaO0FBS08sU0FBU0MsVUFBVUMsS0FBYTtBQUNyQyxRQUFNQyxRQUFRRCxJQUFJRSxNQUFNLEdBQUE7QUFDeEIsUUFBTUMsT0FBaUIsQ0FBQTtBQUN2QixNQUFJQyxNQUFNO0FBQ1YsYUFBV0MsUUFBUUosT0FBTztBQUN4QkcsV0FBT0M7QUFDUCxRQUFJRCxJQUFJRSxTQUFTLElBQU8sR0FBQTtBQUN0QkYsWUFBTUEsSUFBSUcsTUFBTSxHQUFHLEVBQU0sSUFBQTtXQUNwQjtBQUNMSixXQUFLSyxLQUFLSixHQUFBQTtBQUNWQSxZQUFNOztFQUVWO0FBQ0EsU0FBT0Q7QUFDVDtBQUVBLFNBQVNNLGdCQUFnQlQsS0FBYTtBQUNwQyxRQUFNRyxPQUFPSixVQUFVQyxHQUFBQTtBQUN2QixTQUFPVSxDQUFBQSxRQUFPO0FBQ1osZUFBV0MsS0FBS1IsTUFBTTtBQUNwQixVQUFJUSxNQUFNLElBQUk7QUFHWjs7QUFFRkQsWUFBTUEsT0FBT0EsSUFBSUMsQ0FBRTtJQUNyQjtBQUNBLFdBQU9EO0VBQ1Q7QUFDRjtBQUVPLFNBQVNFLGlCQUFpQkYsS0FBZ0JWLEtBQWtCO0FBQ2pFLFFBQU1hLFdBQVduQixhQUFhTSxHQUFJLE1BQUtOLGFBQWFNLEdBQUFBLElBQU9TLGdCQUFnQlQsR0FBRztBQUM5RSxTQUFPYSxTQUFTSCxHQUFBQTtBQUNsQjtBQUtPLFNBQVNJLFlBQVlDLEtBQWE7QUFDdkMsU0FBT0EsSUFBSUMsT0FBTyxDQUFBLEVBQUdDLFlBQVcsSUFBS0YsSUFBSVIsTUFBTSxDQUFBO0FBQ2pEO0lBR2FXLFVBQVUsQ0FBQ0MsVUFBbUIsT0FBT0EsVUFBVTtJQUUvQ0MsYUFBYSxDQUFDRCxVQUFxRCxPQUFPQSxVQUFVO0FBR3BGRSxJQUFBQSxZQUFZLENBQUlDLEdBQVdDLE1BQWM7QUFDcEQsTUFBSUQsRUFBRUUsU0FBU0QsRUFBRUMsTUFBTTtBQUNyQixXQUFPOztBQUdULGFBQVdDLFFBQVFILEdBQUc7QUFDcEIsUUFBSSxDQUFDQyxFQUFFRyxJQUFJRCxJQUFPLEdBQUE7QUFDaEIsYUFBTzs7RUFFWDtBQUVBLFNBQU87QUFDVDtBQU1PLFNBQVNFLGNBQWNDLEdBQWU7QUFDM0MsU0FBT0EsRUFBRUMsU0FBUyxhQUFhRCxFQUFFQyxTQUFTLFdBQVdELEVBQUVDLFNBQVM7QUFDbEU7QUN2Wk8sSUFBTUMsS0FBS0MsS0FBS0Q7QUFDaEIsSUFBTUUsTUFBTSxJQUFJRjtBQUNoQixJQUFNRyxRQUFRRCxNQUFNRjtBQUNkSSxJQUFBQSxXQUFXQyxPQUFPQztBQUN4QixJQUFNQyxjQUFjUCxLQUFLO0FBQ3pCLElBQU1RLFVBQVVSLEtBQUs7QUFDckIsSUFBTVMsYUFBYVQsS0FBSztBQUNsQlUsSUFBQUEsZ0JBQWdCVixLQUFLLElBQUk7QUFFekJXLElBQUFBLFFBQVFWLEtBQUtVO0FBQ2JDLElBQUFBLE9BQU9YLEtBQUtXO0FBRWxCLFNBQVNDLGFBQWEvQyxHQUFXRSxHQUFXOEMsU0FBaUI7QUFDbEUsU0FBT2IsS0FBS2MsSUFBSWpELElBQUlFLENBQUs4QyxJQUFBQTtBQUMzQjtBQUtPLFNBQVNFLFFBQVFDLE9BQWU7QUFDckMsUUFBTUMsZUFBZWpCLEtBQUtrQixNQUFNRixLQUFBQTtBQUNoQ0EsVUFBUUosYUFBYUksT0FBT0MsY0FBY0QsUUFBUSxHQUFBLElBQVFDLGVBQWVEO0FBQ3pFLFFBQU1HLFlBQVluQixLQUFLb0IsSUFBSSxJQUFJcEIsS0FBS3FCLE1BQU1YLE1BQU1NLEtBQUFBLENBQUFBLENBQUFBO0FBQ2hELFFBQU1NLFdBQVdOLFFBQVFHO0FBQ3pCLFFBQU1JLGVBQWVELFlBQVksSUFBSSxJQUFJQSxZQUFZLElBQUksSUFBSUEsWUFBWSxJQUFJLElBQUk7QUFDakYsU0FBT0MsZUFBZUo7QUFDeEI7QUFNTyxTQUFTSyxXQUFXcEMsT0FBZTtBQUN4QyxRQUFNcUMsU0FBbUIsQ0FBQTtBQUN6QixRQUFNQyxPQUFPMUIsS0FBSzBCLEtBQUt0QyxLQUFBQTtBQUN2QixNQUFJdUM7QUFFSixPQUFLQSxJQUFJLEdBQUdBLElBQUlELE1BQU1DLEtBQUs7QUFDekIsUUFBSXZDLFFBQVF1QyxNQUFNLEdBQUc7QUFDbkJGLGFBQU9oRCxLQUFLa0QsQ0FBQUE7QUFDWkYsYUFBT2hELEtBQUtXLFFBQVF1QyxDQUFBQTs7RUFFeEI7QUFDQSxNQUFJRCxVQUFVQSxPQUFPLElBQUk7QUFDdkJELFdBQU9oRCxLQUFLaUQsSUFBQUE7O0FBR2RELFNBQU9HLEtBQUssQ0FBQ3JDLEdBQUdDLE1BQU1ELElBQUlDLENBQUFBLEVBQUdxQyxJQUFHO0FBQ2hDLFNBQU9KO0FBQ1Q7QUFFTyxTQUFTSyxTQUFTQyxHQUF5QjtBQUNoRCxTQUFPLENBQUNDLE1BQU1DLFdBQVdGLENBQUFBLENBQUFBLEtBQWlCRyxTQUFTSCxDQUFBQTtBQUNyRDtBQUVPLFNBQVNJLFlBQVl0RSxHQUFXZ0QsU0FBaUI7QUFDdEQsUUFBTXVCLFVBQVVwQyxLQUFLa0IsTUFBTXJELENBQUFBO0FBQzNCLFNBQU8sVUFBWWdELFdBQVloRCxLQUFRdUUsVUFBVXZCLFdBQVloRDtBQUMvRDtBQUtPLFNBQVN3RSxtQkFDZEMsT0FDQUMsUUFDQUMsVUFDQTtBQUNBLE1BQUliLEdBQVdjLE1BQWNyRDtBQUU3QixPQUFLdUMsSUFBSSxHQUFHYyxPQUFPSCxNQUFNSSxRQUFRZixJQUFJYyxNQUFNZCxLQUFLO0FBQzlDdkMsWUFBUWtELE1BQU1YLENBQUUsRUFBQ2EsUUFBUztBQUMxQixRQUFJLENBQUNSLE1BQU01QyxLQUFRLEdBQUE7QUFDakJtRCxhQUFPSSxNQUFNM0MsS0FBSzJDLElBQUlKLE9BQU9JLEtBQUt2RCxLQUFBQTtBQUNsQ21ELGFBQU9LLE1BQU01QyxLQUFLNEMsSUFBSUwsT0FBT0ssS0FBS3hELEtBQUFBOztFQUV0QztBQUNGO0FBRU8sU0FBU3lELFVBQVVDLFNBQWlCO0FBQ3pDLFNBQU9BLFdBQVcvQyxLQUFLO0FBQ3pCO0FBRU8sU0FBU2dELFVBQVVDLFNBQWlCO0FBQ3pDLFNBQU9BLFdBQVcsTUFBTWpEO0FBQzFCO0FBU08sU0FBU2tELGVBQWVwRixHQUFXO0FBQ3hDLE1BQUksQ0FBQ3FGLGVBQWVyRixDQUFJLEdBQUE7QUFDdEI7O0FBRUYsTUFBSWdDLElBQUk7QUFDUixNQUFJc0QsSUFBSTtBQUNSLFNBQU9uRCxLQUFLa0IsTUFBTXJELElBQUlnQyxDQUFBQSxJQUFLQSxNQUFNaEMsR0FBRztBQUNsQ2dDLFNBQUs7QUFDTHNEO0VBQ0Y7QUFDQSxTQUFPQTtBQUNUO0FBR08sU0FBU0Msa0JBQ2RDLGFBQ0FDLFlBQ0E7QUFDQSxRQUFNQyxzQkFBc0JELFdBQVd6RixJQUFJd0YsWUFBWXhGO0FBQ3ZELFFBQU0yRixzQkFBc0JGLFdBQVd2RixJQUFJc0YsWUFBWXRGO0FBQ3ZELFFBQU0wRiwyQkFBMkJ6RCxLQUFLMEIsS0FBSzZCLHNCQUFzQkEsc0JBQXNCQyxzQkFBc0JBLG1CQUFBQTtBQUU3RyxNQUFJRSxRQUFRMUQsS0FBSzJELE1BQU1ILHFCQUFxQkQsbUJBQUFBO0FBRTVDLE1BQUlHLFFBQVMsT0FBTzNELElBQUs7QUFDdkIyRCxhQUFTekQ7O0FBR1gsU0FBTztJQUNMeUQ7SUFDQUUsVUFBVUg7RUFDWjtBQUNGO0FBRU8sU0FBU0ksc0JBQXNCQyxLQUFZQyxLQUFZO0FBQzVELFNBQU8vRCxLQUFLMEIsS0FBSzFCLEtBQUtvQixJQUFJMkMsSUFBSWxHLElBQUlpRyxJQUFJakcsR0FBRyxDQUFBLElBQUttQyxLQUFLb0IsSUFBSTJDLElBQUloRyxJQUFJK0YsSUFBSS9GLEdBQUcsQ0FBQSxDQUFBO0FBQ3hFO0FBY08sU0FBU2lHLGdCQUFnQkMsR0FBVztBQUN6QyxVQUFRQSxJQUFJQyxNQUFNQSxPQUFPQTtBQUMzQjtBQUtPLFNBQVNDLGNBQWNDLE9BQWVDLE9BQWVDLEtBQWFDLHVCQUFpQztBQUN4RyxRQUFNTixJQUFJRCxnQkFBZ0JJLEtBQUFBO0FBQzFCLFFBQU1JLElBQUlSLGdCQUFnQkssS0FBQUE7QUFDMUIsUUFBTUksSUFBSVQsZ0JBQWdCTSxHQUFBQTtBQUMxQixRQUFNSSxlQUFlVixnQkFBZ0JRLElBQUlQLENBQUFBO0FBQ3pDLFFBQU1VLGFBQWFYLGdCQUFnQlMsSUFBSVIsQ0FBQUE7QUFDdkMsUUFBTVcsZUFBZVosZ0JBQWdCQyxJQUFJTyxDQUFBQTtBQUN6QyxRQUFNSyxhQUFhYixnQkFBZ0JDLElBQUlRLENBQUFBO0FBQ3ZDLFNBQU9SLE1BQU1PLEtBQUtQLE1BQU1RLEtBQU1GLHlCQUF5QkMsTUFBTUMsS0FDdkRDLGVBQWVDLGNBQWNDLGVBQWVDO0FBQ3BEO0FBU08sU0FBU0MsWUFBWUMsT0FBZUMsS0FBYUMsS0FBYTtBQUNuRSxTQUFPQyxLQUFLRCxJQUFJRCxLQUFLRSxLQUFLRixJQUFJQyxLQUFLRixLQUFBQSxDQUFBQTtBQUNyQztBQU1PLFNBQVNJLFlBQVlKLE9BQWU7QUFDekMsU0FBT0QsWUFBWUMsT0FBTyxRQUFRLEtBQUE7QUFDcEM7QUFTTyxTQUFTSyxXQUFXTCxPQUFlVixPQUFlQyxLQUFhZSxVQUFVLE1BQU07QUFDcEYsU0FBT04sU0FBU0csS0FBS0YsSUFBSVgsT0FBT0MsR0FBQUEsSUFBT2UsV0FBV04sU0FBU0csS0FBS0QsSUFBSVosT0FBT0MsR0FBT2UsSUFBQUE7QUFDcEY7QUNwTE8sU0FBU0MsUUFDZEMsT0FDQVIsT0FDQVMsS0FDQTtBQUNBQSxRQUFNQSxRQUFRLENBQUNDLFVBQVVGLE1BQU1FLEtBQUFBLElBQVNWO0FBQ3hDLE1BQUlXLEtBQUtILE1BQU1JLFNBQVM7QUFDeEIsTUFBSUMsS0FBSztBQUNULE1BQUlDO0FBRUosU0FBT0gsS0FBS0UsS0FBSyxHQUFHO0FBQ2xCQyxVQUFPRCxLQUFLRixNQUFPO0FBQ25CLFFBQUlGLElBQUlLLEdBQU0sR0FBQTtBQUNaRCxXQUFLQztXQUNBO0FBQ0xILFdBQUtHOztFQUVUO0FBRUEsU0FBTztJQUFDRDtJQUFJRjtFQUFFO0FBQ2hCO0FBVU8sSUFBTUksZUFBZSxDQUMxQlAsT0FDQVEsS0FDQWhCLE9BQ0FpQixTQUVBVixRQUFRQyxPQUFPUixPQUFPaUIsT0FDbEJQLENBQUFBLFVBQVM7QUFDVCxRQUFNUSxLQUFLVixNQUFNRSxLQUFBQSxFQUFPTSxHQUFJO0FBQzVCLFNBQU9FLEtBQUtsQixTQUFTa0IsT0FBT2xCLFNBQVNRLE1BQU1FLFFBQVEsQ0FBQSxFQUFHTSxHQUFBQSxNQUFTaEI7SUFFL0RVLENBQUFBLFVBQVNGLE1BQU1FLEtBQUFBLEVBQU9NLEdBQUFBLElBQU9oQixLQUFLO0FBUzNCbUIsSUFBQUEsZ0JBQWdCLENBQzNCWCxPQUNBUSxLQUNBaEIsVUFFQU8sUUFBUUMsT0FBT1IsT0FBT1UsQ0FBQUEsVUFBU0YsTUFBTUUsS0FBQUEsRUFBT00sR0FBQUEsS0FBUWhCLEtBQU87QUFTdEQsU0FBU29CLGVBQWVDLFFBQWtCcEIsS0FBYUMsS0FBYTtBQUN6RSxNQUFJWixRQUFRO0FBQ1osTUFBSUMsTUFBTThCLE9BQU9UO0FBRWpCLFNBQU90QixRQUFRQyxPQUFPOEIsT0FBTy9CLEtBQUFBLElBQVNXLEtBQUs7QUFDekNYO0VBQ0Y7QUFDQSxTQUFPQyxNQUFNRCxTQUFTK0IsT0FBTzlCLE1BQU0sQ0FBQSxJQUFLVyxLQUFLO0FBQzNDWDtFQUNGO0FBRUEsU0FBT0QsUUFBUSxLQUFLQyxNQUFNOEIsT0FBT1QsU0FDN0JTLE9BQU9DLE1BQU1oQyxPQUFPQyxHQUFBQSxJQUNwQjhCO0FBQ047QUFFQSxJQUFNRSxjQUFjO0VBQUM7RUFBUTtFQUFPO0VBQVM7RUFBVTtBQUFVO0FBZ0IxRCxTQUFTQyxrQkFBa0JDLE9BQU9DLFVBQVU7QUFDakQsTUFBSUQsTUFBTUUsVUFBVTtBQUNsQkYsVUFBTUUsU0FBU0MsVUFBVUMsS0FBS0gsUUFBQUE7QUFDOUI7O0FBR0ZJLFNBQU9DLGVBQWVOLE9BQU8sWUFBWTtJQUN2Q08sY0FBYztJQUNkQyxZQUFZO0lBQ1pqQyxPQUFPO01BQ0w0QixXQUFXO1FBQUNGO01BQVM7SUFDdkI7RUFDRixDQUFBO0FBRUFILGNBQVlXLFFBQVEsQ0FBQ2xCLFFBQVE7QUFDM0IsVUFBTW1CLFNBQVMsWUFBWUMsWUFBWXBCLEdBQUFBO0FBQ3ZDLFVBQU1xQixPQUFPWixNQUFNVCxHQUFJO0FBRXZCYyxXQUFPQyxlQUFlTixPQUFPVCxLQUFLO01BQ2hDZ0IsY0FBYztNQUNkQyxZQUFZO01BQ1pqQyxTQUFTc0MsTUFBTTtBQUNiLGNBQU1DLE1BQU1GLEtBQUtHLE1BQU0sTUFBTUYsSUFBQUE7QUFFN0JiLGNBQU1FLFNBQVNDLFVBQVVNLFFBQVEsQ0FBQ08sV0FBVztBQUMzQyxjQUFJLE9BQU9BLE9BQU9OLE1BQUFBLE1BQVksWUFBWTtBQUN4Q00sbUJBQU9OLE1BQUFBLEVBQVdHLEdBQUFBLElBQUFBOztRQUV0QixDQUFBO0FBRUEsZUFBT0M7TUFDVDtJQUNGLENBQUE7RUFDRixDQUFBO0FBQ0Y7QUFRTyxTQUFTRyxvQkFBb0JqQixPQUFPQyxVQUFVO0FBQ25ELFFBQU1pQixPQUFPbEIsTUFBTUU7QUFDbkIsTUFBSSxDQUFDZ0IsTUFBTTtBQUNUOztBQUdGLFFBQU1mLFlBQVllLEtBQUtmO0FBQ3ZCLFFBQU1sQixRQUFRa0IsVUFBVWdCLFFBQVFsQixRQUFBQTtBQUNoQyxNQUFJaEIsVUFBVSxJQUFJO0FBQ2hCa0IsY0FBVWlCLE9BQU9uQyxPQUFPLENBQUE7O0FBRzFCLE1BQUlrQixVQUFVaEIsU0FBUyxHQUFHO0FBQ3hCOztBQUdGVyxjQUFZVyxRQUFRLENBQUNsQixRQUFRO0FBQzNCLFdBQU9TLE1BQU1ULEdBQUk7RUFDbkIsQ0FBQTtBQUVBLFNBQU9TLE1BQU1FO0FBQ2Y7QUFLTyxTQUFTbUIsYUFBZ0JDLE9BQVk7QUFDMUMsUUFBTUMsT0FBTSxJQUFJQyxJQUFPRixLQUFBQTtBQUV2QixNQUFJQyxLQUFJRSxTQUFTSCxNQUFNbkMsUUFBUTtBQUM3QixXQUFPbUM7O0FBR1QsU0FBT0ksTUFBTUMsS0FBS0osSUFBQUE7QUFDcEI7QUNuTGFLLElBQUFBLG1CQUFvQixXQUFXO0FBQzFDLE1BQUksT0FBT0MsV0FBVyxhQUFhO0FBQ2pDLFdBQU8sU0FBU0MsV0FBVTtBQUN4QixhQUFPQSxVQUFBQTtJQUNUOztBQUVGLFNBQU9ELE9BQU9FO0FBQ2hCLEVBQUs7QUFNRSxTQUFTQyxVQUNkQyxJQUNBQyxTQUNBO0FBQ0EsTUFBSUMsWUFBWSxDQUFBO0FBQ2hCLE1BQUlDLFVBQVU7QUFFZCxTQUFPLFlBQVlDLE1BQWE7QUFFOUJGLGdCQUFZRTtBQUNaLFFBQUksQ0FBQ0QsU0FBUztBQUNaQSxnQkFBVTtBQUNWUix1QkFBaUJVLEtBQUtULFFBQVEsTUFBTTtBQUNsQ08sa0JBQVU7QUFDVkgsV0FBR00sTUFBTUwsU0FBU0MsU0FBQUE7TUFDcEIsQ0FBQTs7RUFFSjtBQUNGO0FBS08sU0FBU0ssU0FBbUNQLElBQThCUSxPQUFlO0FBQzlGLE1BQUlDO0FBQ0osU0FBTyxZQUFZTCxNQUFhO0FBQzlCLFFBQUlJLE9BQU87QUFDVEUsbUJBQWFELE9BQUFBO0FBQ2JBLGdCQUFVRSxXQUFXWCxJQUFJUSxPQUFPSixJQUFBQTtXQUMzQjtBQUNMSixTQUFHTSxNQUFNLE1BQU1GLElBQUFBOztBQUVqQixXQUFPSTtFQUNUO0FBQ0Y7QUFNTyxJQUFNSSxxQkFBcUIsQ0FBQ0MsVUFBc0NBLFVBQVUsVUFBVSxTQUFTQSxVQUFVLFFBQVEsVUFBVTtBQU1ySEMsSUFBQUEsaUJBQWlCLENBQUNELE9BQW1DRSxPQUFlQyxRQUFnQkgsVUFBVSxVQUFVRSxRQUFRRixVQUFVLFFBQVFHLE9BQU9ELFFBQVFDLE9BQU87QUFNeEpDLElBQUFBLFNBQVMsQ0FBQ0osT0FBb0NLLE1BQWNDLE9BQWVDLFFBQWlCO0FBQ3ZHLFFBQU1DLFFBQVFELE1BQU0sU0FBUztBQUM3QixTQUFPUCxVQUFVUSxRQUFRRixRQUFRTixVQUFVLFlBQVlLLE9BQU9DLFNBQVMsSUFBSUQ7QUFDN0U7QUM5RUEsSUFBTUksU0FBUyxDQUFDQyxPQUFjQSxPQUFNLEtBQUtBLE9BQU07QUFDL0MsSUFBTUMsWUFBWSxDQUFDRCxJQUFXRSxHQUFXQyxNQUFjLEVBQUVDLEtBQUtDLElBQUksR0FBRyxNQUFNTCxNQUFLLEVBQU1JLElBQUFBLEtBQUtFLEtBQUtOLEtBQUlFLEtBQUtLLE1BQU1KLENBQUM7QUFDaEgsSUFBTUssYUFBYSxDQUFDUixJQUFXRSxHQUFXQyxNQUFjQyxLQUFLQyxJQUFJLEdBQUcsTUFBTUwsRUFBS0ksSUFBQUEsS0FBS0UsS0FBS04sS0FBSUUsS0FBS0ssTUFBTUosQ0FBSyxJQUFBO0FBTTVHLElBQ0tNLFVBQVU7RUFDZEMsUUFBUSxDQUFDVixPQUFjQTtFQUV2QlcsWUFBWSxDQUFDWCxPQUFjQSxLQUFJQTtFQUUvQlksYUFBYSxDQUFDWixPQUFjLENBQUNBLE1BQUtBLEtBQUk7RUFFdENhLGVBQWUsQ0FBQ2IsUUFBZ0JBLE1BQUssT0FBTyxJQUN4QyxNQUFNQSxLQUFJQSxLQUNWLFFBQVMsRUFBRUEsTUFBTUEsS0FBSSxLQUFLO0VBRTlCYyxhQUFhLENBQUNkLE9BQWNBLEtBQUlBLEtBQUlBO0VBRXBDZSxjQUFjLENBQUNmLFFBQWVBLE1BQUssS0FBS0EsS0FBSUEsS0FBSTtFQUVoRGdCLGdCQUFnQixDQUFDaEIsUUFBZ0JBLE1BQUssT0FBTyxJQUN6QyxNQUFNQSxLQUFJQSxLQUFJQSxLQUNkLFFBQVFBLE1BQUssS0FBS0EsS0FBSUEsS0FBSTtFQUU5QmlCLGFBQWEsQ0FBQ2pCLE9BQWNBLEtBQUlBLEtBQUlBLEtBQUlBO0VBRXhDa0IsY0FBYyxDQUFDbEIsT0FBYyxHQUFHQSxNQUFLLEtBQUtBLEtBQUlBLEtBQUlBLEtBQUk7RUFFdERtQixnQkFBZ0IsQ0FBQ25CLFFBQWdCQSxNQUFLLE9BQU8sSUFDekMsTUFBTUEsS0FBSUEsS0FBSUEsS0FBSUEsS0FDbEIsU0FBU0EsTUFBSyxLQUFLQSxLQUFJQSxLQUFJQSxLQUFJO0VBRW5Db0IsYUFBYSxDQUFDcEIsT0FBY0EsS0FBSUEsS0FBSUEsS0FBSUEsS0FBSUE7RUFFNUNxQixjQUFjLENBQUNyQixRQUFlQSxNQUFLLEtBQUtBLEtBQUlBLEtBQUlBLEtBQUlBLEtBQUk7RUFFeERzQixnQkFBZ0IsQ0FBQ3RCLFFBQWdCQSxNQUFLLE9BQU8sSUFDekMsTUFBTUEsS0FBSUEsS0FBSUEsS0FBSUEsS0FBSUEsS0FDdEIsUUFBUUEsTUFBSyxLQUFLQSxLQUFJQSxLQUFJQSxLQUFJQSxLQUFJO0VBRXRDdUIsWUFBWSxDQUFDdkIsT0FBYyxDQUFDSSxLQUFLb0IsSUFBSXhCLEtBQUl5QixPQUFXLElBQUE7RUFFcERDLGFBQWEsQ0FBQzFCLE9BQWNJLEtBQUtFLElBQUlOLEtBQUl5QixPQUFBQTtFQUV6Q0UsZUFBZSxDQUFDM0IsT0FBYyxRQUFRSSxLQUFLb0IsSUFBSUksS0FBSzVCLEVBQUFBLElBQUs7RUFFekQ2QixZQUFZLENBQUM3QixPQUFjQSxPQUFPLElBQUssSUFBSUksS0FBS0MsSUFBSSxHQUFHLE1BQU1MLEtBQUksRUFBRztFQUVwRThCLGFBQWEsQ0FBQzlCLE9BQWNBLE9BQU8sSUFBSyxJQUFJLENBQUNJLEtBQUtDLElBQUksR0FBRyxNQUFNTCxFQUFBQSxJQUFLO0VBRXBFK0IsZUFBZSxDQUFDL0IsT0FBY0QsT0FBT0MsRUFBQUEsSUFBS0EsS0FBSUEsS0FBSSxNQUM5QyxNQUFNSSxLQUFLQyxJQUFJLEdBQUcsTUFBTUwsS0FBSSxJQUFJLEVBQUEsSUFDaEMsT0FBTyxDQUFDSSxLQUFLQyxJQUFJLEdBQUcsT0FBT0wsS0FBSSxJQUFJLEVBQUEsSUFBTTtFQUU3Q2dDLFlBQVksQ0FBQ2hDLE9BQWNBLE1BQU0sSUFBS0EsS0FBSSxFQUFFSSxLQUFLNkIsS0FBSyxJQUFJakMsS0FBSUEsRUFBQUEsSUFBSztFQUVuRWtDLGFBQWEsQ0FBQ2xDLE9BQWNJLEtBQUs2QixLQUFLLEtBQUtqQyxNQUFLLEtBQUtBLEVBQUFBO0VBRXJEbUMsZUFBZSxDQUFDbkMsUUFBZ0JBLE1BQUssT0FBTyxJQUN4QyxRQUFRSSxLQUFLNkIsS0FBSyxJQUFJakMsS0FBSUEsRUFBQUEsSUFBSyxLQUMvQixPQUFPSSxLQUFLNkIsS0FBSyxLQUFLakMsTUFBSyxLQUFLQSxFQUFBQSxJQUFLO0VBRXpDb0MsZUFBZSxDQUFDcEMsT0FBY0QsT0FBT0MsRUFBQUEsSUFBS0EsS0FBSUMsVUFBVUQsSUFBRyxPQUFPLEdBQUk7RUFFdEVxQyxnQkFBZ0IsQ0FBQ3JDLE9BQWNELE9BQU9DLEVBQUFBLElBQUtBLEtBQUlRLFdBQVdSLElBQUcsT0FBTyxHQUFJO0VBRXhFc0MsaUJBQWlCdEMsSUFBVztBQUMxQixVQUFNRSxJQUFJO0FBQ1YsVUFBTUMsSUFBSTtBQUNWLFdBQU9KLE9BQU9DLEVBQUtBLElBQUFBLEtBQ2pCQSxLQUFJLE1BQ0EsTUFBTUMsVUFBVUQsS0FBSSxHQUFHRSxHQUFHQyxDQUFBQSxJQUMxQixNQUFNLE1BQU1LLFdBQVdSLEtBQUksSUFBSSxHQUFHRSxHQUFHQyxDQUFFO0VBQy9DO0VBRUFvQyxXQUFXdkMsSUFBVztBQUNwQixVQUFNRSxJQUFJO0FBQ1YsV0FBT0YsS0FBSUEsT0FBTUUsSUFBSSxLQUFLRixLQUFJRTtFQUNoQztFQUVBc0MsWUFBWXhDLElBQVc7QUFDckIsVUFBTUUsSUFBSTtBQUNWLFlBQVFGLE1BQUssS0FBS0EsT0FBTUUsSUFBSSxLQUFLRixLQUFJRSxLQUFLO0VBQzVDO0VBRUF1QyxjQUFjekMsSUFBVztBQUN2QixRQUFJRSxJQUFJO0FBQ1IsU0FBS0YsTUFBSyxPQUFPLEdBQUc7QUFDbEIsYUFBTyxPQUFPQSxLQUFJQSxRQUFPRSxLQUFNLFNBQVUsS0FBS0YsS0FBSUU7O0FBRXBELFdBQU8sUUFBUUYsTUFBSyxLQUFLQSxRQUFPRSxLQUFNLFNBQVUsS0FBS0YsS0FBSUUsS0FBSztFQUNoRTtFQUVBd0MsY0FBYyxDQUFDMUMsT0FBYyxJQUFJUyxRQUFRa0MsY0FBYyxJQUFJM0MsRUFBQUE7RUFFM0QyQyxjQUFjM0MsSUFBVztBQUN2QixVQUFNNEMsSUFBSTtBQUNWLFVBQU1DLElBQUk7QUFDVixRQUFJN0MsS0FBSyxJQUFJNkMsR0FBSTtBQUNmLGFBQU9ELElBQUk1QyxLQUFJQTs7QUFFakIsUUFBSUEsS0FBSyxJQUFJNkMsR0FBSTtBQUNmLGFBQU9ELEtBQUs1QyxNQUFNLE1BQU02QyxLQUFNN0MsS0FBSTs7QUFFcEMsUUFBSUEsS0FBSyxNQUFNNkMsR0FBSTtBQUNqQixhQUFPRCxLQUFLNUMsTUFBTSxPQUFPNkMsS0FBTTdDLEtBQUk7O0FBRXJDLFdBQU80QyxLQUFLNUMsTUFBTSxRQUFRNkMsS0FBTTdDLEtBQUk7RUFDdEM7RUFFQThDLGlCQUFpQixDQUFDOUMsT0FBZUEsS0FBSSxNQUNqQ1MsUUFBUWlDLGFBQWExQyxLQUFJLENBQUssSUFBQSxNQUM5QlMsUUFBUWtDLGNBQWMzQyxLQUFJLElBQUksQ0FBQSxJQUFLLE1BQU07QUFDL0M7QUNySE8sU0FBUytDLG9CQUFvQkMsT0FBeUQ7QUFDM0YsTUFBSUEsU0FBUyxPQUFPQSxVQUFVLFVBQVU7QUFDdEMsVUFBTUMsT0FBT0QsTUFBTUUsU0FBUTtBQUMzQixXQUFPRCxTQUFTLDRCQUE0QkEsU0FBUzs7QUFHdkQsU0FBTztBQUNUO0FBV08sU0FBU0UsTUFBTUgsT0FBTztBQUMzQixTQUFPRCxvQkFBb0JDLEtBQUFBLElBQVNBLFFBQVEsSUFBSUksTUFBTUosS0FBTTtBQUM5RDtBQUtPLFNBQVNLLGNBQWNMLE9BQU87QUFDbkMsU0FBT0Qsb0JBQW9CQyxLQUFBQSxJQUN2QkEsUUFDQSxJQUFJSSxNQUFNSixLQUFBQSxFQUFPTSxTQUFTLEdBQUtDLEVBQUFBLE9BQU8sR0FBQSxFQUFLQyxVQUFTO0FBQzFEO0FDL0JBLElBQU1DLFVBQVU7RUFBQztFQUFLO0VBQUs7RUFBZTtFQUFVO0FBQVU7QUFDOUQsSUFBTUMsU0FBUztFQUFDO0VBQVM7RUFBZTtBQUFrQjtBQUVuRCxTQUFTQyx3QkFBd0JDLFdBQVU7QUFDaERBLEVBQUFBLFVBQVNDLElBQUksYUFBYTtJQUN4QkMsT0FBT0M7SUFDUEMsVUFBVTtJQUNWQyxRQUFRO0lBQ1JDLElBQUlIO0lBQ0pJLE1BQU1KO0lBQ05LLE1BQU1MO0lBQ05NLElBQUlOO0lBQ0pkLE1BQU1jO0VBQ1IsQ0FBQTtBQUVBSCxFQUFBQSxVQUFTVSxTQUFTLGFBQWE7SUFDN0JDLFdBQVc7SUFDWEMsWUFBWTtJQUNaQyxhQUFhLENBQUNDLFNBQVNBLFNBQVMsZ0JBQWdCQSxTQUFTLGdCQUFnQkEsU0FBUztFQUNwRixDQUFBO0FBRUFkLEVBQUFBLFVBQVNDLElBQUksY0FBYztJQUN6QkgsUUFBUTtNQUNOVCxNQUFNO01BQ04wQixZQUFZakI7SUFDZDtJQUNBRCxTQUFTO01BQ1BSLE1BQU07TUFDTjBCLFlBQVlsQjtJQUNkO0VBQ0YsQ0FBQTtBQUVBRyxFQUFBQSxVQUFTVSxTQUFTLGNBQWM7SUFDOUJDLFdBQVc7RUFDYixDQUFBO0FBRUFYLEVBQUFBLFVBQVNDLElBQUksZUFBZTtJQUMxQmUsUUFBUTtNQUNOQyxXQUFXO1FBQ1RiLFVBQVU7TUFDWjtJQUNGO0lBQ0FjLFFBQVE7TUFDTkQsV0FBVztRQUNUYixVQUFVO01BQ1o7SUFDRjtJQUNBZSxNQUFNO01BQ0pDLFlBQVk7UUFDVnRCLFFBQVE7VUFDTlMsTUFBTTtRQUNSO1FBQ0FjLFNBQVM7VUFDUGhDLE1BQU07VUFDTmUsVUFBVTtRQUNaO01BQ0Y7SUFDRjtJQUNBa0IsTUFBTTtNQUNKRixZQUFZO1FBQ1Z0QixRQUFRO1VBQ05XLElBQUk7UUFDTjtRQUNBWSxTQUFTO1VBQ1BoQyxNQUFNO1VBQ05nQixRQUFRO1VBQ1JDLElBQUlpQixDQUFBQSxNQUFLQSxJQUFJO1FBQ2Y7TUFDRjtJQUNGO0VBQ0YsQ0FBQTtBQUNGO0FDdkVPLFNBQVNDLHFCQUFxQnhCLFdBQVU7QUFDN0NBLEVBQUFBLFVBQVNDLElBQUksVUFBVTtJQUNyQndCLGFBQWE7SUFDYkMsU0FBUztNQUNQQyxLQUFLO01BQ0xDLE9BQU87TUFDUEMsUUFBUTtNQUNSQyxNQUFNO0lBQ1I7RUFDRixDQUFBO0FBQ0Y7QUNUQSxJQUFNQyxZQUFZLG9CQUFJQyxJQUFBQTtBQUV0QixTQUFTQyxnQkFBZ0JDLFNBQWdCQyxTQUFvQztBQUMzRUEsWUFBVUEsV0FBVyxDQUFBO0FBQ3JCLFFBQU1DLFdBQVdGLFVBQVNHLEtBQUtDLFVBQVVILE9BQUFBO0FBQ3pDLE1BQUlJLFlBQVlSLFVBQVVTLElBQUlKLFFBQUFBO0FBQzlCLE1BQUksQ0FBQ0csV0FBVztBQUNkQSxnQkFBWSxJQUFJRSxLQUFLQyxhQUFhUixTQUFRQyxPQUFBQTtBQUMxQ0osY0FBVTlCLElBQUltQyxVQUFVRyxTQUFBQTs7QUFFMUIsU0FBT0E7QUFDVDtBQUVPLFNBQVNJLGFBQWFDLEtBQWFWLFNBQWdCQyxTQUFvQztBQUM1RixTQUFPRixnQkFBZ0JDLFNBQVFDLE9BQVNVLEVBQUFBLE9BQU9ELEdBQUFBO0FBQ2pEO0FDUkEsSUFBTUUsYUFBYTtFQU9qQkMsT0FBTzNELE9BQU87QUFDWixXQUFPNEQsUUFBUTVELEtBQVMsSUFBeUJBLFFBQVMsS0FBS0E7RUFDakU7RUFVQTZELFFBQVFDLFdBQVdDLE9BQU9DLE9BQU87QUFDL0IsUUFBSUYsY0FBYyxHQUFHO0FBQ25CLGFBQU87O0FBR1QsVUFBTWhCLFVBQVMsS0FBS21CLE1BQU1sQixRQUFRRDtBQUNsQyxRQUFJb0I7QUFDSixRQUFJQyxRQUFRTDtBQUVaLFFBQUlFLE1BQU1JLFNBQVMsR0FBRztBQUVwQixZQUFNQyxVQUFVakgsS0FBS2tILElBQUlsSCxLQUFLbUgsSUFBSVAsTUFBTSxDQUFFLEVBQUNoRSxLQUFLLEdBQUc1QyxLQUFLbUgsSUFBSVAsTUFBTUEsTUFBTUksU0FBUyxDQUFFLEVBQUNwRSxLQUFLLENBQUE7QUFDekYsVUFBSXFFLFVBQVUsUUFBUUEsVUFBVSxNQUFPO0FBQ3JDSCxtQkFBVzs7QUFHYkMsY0FBUUssZUFBZVYsV0FBV0UsS0FBQUE7O0FBR3BDLFVBQU1TLFdBQVdDLE1BQU10SCxLQUFLbUgsSUFBSUosS0FBQUEsQ0FBQUE7QUFPaEMsVUFBTVEsYUFBYUMsTUFBTUgsUUFBQUEsSUFBWSxJQUFJckgsS0FBS2tILElBQUlsSCxLQUFLeUgsSUFBSSxLQUFLekgsS0FBSzBILE1BQU1MLFFBQUFBLEdBQVcsRUFBQSxHQUFLLENBQUU7QUFFN0YsVUFBTTFCLFVBQVU7TUFBQ21CO01BQVVhLHVCQUF1Qko7TUFBWUssdUJBQXVCTDtJQUFVO0FBQy9GTSxXQUFPQyxPQUFPbkMsU0FBUyxLQUFLQSxRQUFRaUIsTUFBTVAsTUFBTTtBQUVoRCxXQUFPRixhQUFhTyxXQUFXaEIsU0FBUUMsT0FBQUE7RUFDekM7RUFXQW9DLFlBQVlyQixXQUFXQyxPQUFPQyxPQUFPO0FBQ25DLFFBQUlGLGNBQWMsR0FBRztBQUNuQixhQUFPOztBQUVULFVBQU1zQixTQUFTcEIsTUFBTUQsS0FBQUEsRUFBT3NCLGVBQWdCdkIsWUFBYTFHLEtBQUtDLElBQUksSUFBSUQsS0FBSzBILE1BQU1KLE1BQU1aLFNBQUFBLENBQUFBLENBQUFBO0FBQ3ZGLFFBQUk7TUFBQztNQUFHO01BQUc7TUFBRztNQUFHO01BQUk7SUFBRyxFQUFDd0IsU0FBU0YsTUFBQUEsS0FBV3JCLFFBQVEsTUFBTUMsTUFBTUksUUFBUTtBQUN2RSxhQUFPVixXQUFXRyxRQUFRMEIsS0FBSyxNQUFNekIsV0FBV0MsT0FBT0MsS0FBQUE7O0FBRXpELFdBQU87RUFDVDtBQUVGO0FBR0EsU0FBU1EsZUFBZVYsV0FBV0UsT0FBTztBQUd4QyxNQUFJRyxRQUFRSCxNQUFNSSxTQUFTLElBQUlKLE1BQU0sQ0FBRSxFQUFDaEUsUUFBUWdFLE1BQU0sQ0FBRSxFQUFDaEUsUUFBUWdFLE1BQU0sQ0FBRSxFQUFDaEUsUUFBUWdFLE1BQU0sQ0FBRSxFQUFDaEU7QUFHM0YsTUFBSTVDLEtBQUttSCxJQUFJSixLQUFBQSxLQUFVLEtBQUtMLGNBQWMxRyxLQUFLMEgsTUFBTWhCLFNBQVksR0FBQTtBQUUvREssWUFBUUwsWUFBWTFHLEtBQUswSCxNQUFNaEIsU0FBQUE7O0FBRWpDLFNBQU9LO0FBQ1Q7QUFNQSxJQUFBLFFBQWU7RUFBQ1Q7QUFBVTtBQ25HbkIsU0FBUzhCLG1CQUFtQjVFLFdBQVU7QUFDM0NBLEVBQUFBLFVBQVNDLElBQUksU0FBUztJQUNwQjRFLFNBQVM7SUFDVEMsUUFBUTtJQUNSQyxTQUFTO0lBQ1RDLGFBQWE7SUFTYkMsUUFBUTtJQUVSQyxNQUFNO0lBTU5DLE9BQU87SUFHUEMsTUFBTTtNQUNKUCxTQUFTO01BQ1RRLFdBQVc7TUFDWEMsaUJBQWlCO01BQ2pCQyxXQUFXO01BQ1hDLFlBQVk7TUFDWkMsV0FBVyxDQUFDQyxNQUFNdkQsWUFBWUEsUUFBUWtEO01BQ3RDTSxXQUFXLENBQUNELE1BQU12RCxZQUFZQSxRQUFRNUM7TUFDdEN1RixRQUFRO0lBQ1Y7SUFFQWMsUUFBUTtNQUNOZixTQUFTO01BQ1RnQixNQUFNLENBQUE7TUFDTkMsWUFBWTtNQUNaQyxPQUFPO0lBQ1Q7SUFHQUMsT0FBTztNQUVMbkIsU0FBUztNQUdUb0IsTUFBTTtNQUdOdkUsU0FBUztRQUNQQyxLQUFLO1FBQ0xFLFFBQVE7TUFDVjtJQUNGO0lBR0F1QixPQUFPO01BQ0w4QyxhQUFhO01BQ2JDLGFBQWE7TUFDYkMsUUFBUTtNQUNSQyxpQkFBaUI7TUFDakJDLGlCQUFpQjtNQUNqQjVFLFNBQVM7TUFDVG1ELFNBQVM7TUFDVDBCLFVBQVU7TUFDVkMsaUJBQWlCO01BQ2pCQyxhQUFhO01BRWJDLFVBQVVDLE1BQU03RCxXQUFXQztNQUMzQjZELE9BQU8sQ0FBQTtNQUNQQyxPQUFPLENBQUE7TUFDUEMsT0FBTztNQUNQQyxZQUFZO01BRVpDLG1CQUFtQjtNQUNuQkMsZUFBZTtNQUNmQyxpQkFBaUI7SUFDbkI7RUFDRixDQUFBO0FBRUFsSCxFQUFBQSxVQUFTbUgsTUFBTSxlQUFlLFNBQVMsSUFBSSxPQUFBO0FBQzNDbkgsRUFBQUEsVUFBU21ILE1BQU0sY0FBYyxTQUFTLElBQUksYUFBQTtBQUMxQ25ILEVBQUFBLFVBQVNtSCxNQUFNLGdCQUFnQixTQUFTLElBQUksYUFBQTtBQUM1Q25ILEVBQUFBLFVBQVNtSCxNQUFNLGVBQWUsU0FBUyxJQUFJLE9BQUE7QUFFM0NuSCxFQUFBQSxVQUFTVSxTQUFTLFNBQVM7SUFDekJDLFdBQVc7SUFDWEUsYUFBYSxDQUFDQyxTQUFTLENBQUNBLEtBQUtzRyxXQUFXLFFBQUEsS0FBYSxDQUFDdEcsS0FBS3NHLFdBQVcsT0FBWXRHLEtBQUFBLFNBQVMsY0FBY0EsU0FBUztJQUNsSEYsWUFBWSxDQUFDRSxTQUFTQSxTQUFTLGdCQUFnQkEsU0FBUyxvQkFBb0JBLFNBQVM7RUFDdkYsQ0FBQTtBQUVBZCxFQUFBQSxVQUFTVSxTQUFTLFVBQVU7SUFDMUJDLFdBQVc7RUFDYixDQUFBO0FBRUFYLEVBQUFBLFVBQVNVLFNBQVMsZUFBZTtJQUMvQkcsYUFBYSxDQUFDQyxTQUFTQSxTQUFTLHFCQUFxQkEsU0FBUztJQUM5REYsWUFBWSxDQUFDRSxTQUFTQSxTQUFTO0VBQ2pDLENBQUE7QUFDRjtJQ2xHYXVHLFlBQVloRCx1QkFBT2lELE9BQU8sSUFBSTtJQUM5QkMsY0FBY2xELHVCQUFPaUQsT0FBTyxJQUFJO0FBTzdDLFNBQVNFLFdBQVNDLE1BQU1DLEtBQUs7QUFDM0IsTUFBSSxDQUFDQSxLQUFLO0FBQ1IsV0FBT0Q7O0FBRVQsUUFBTUUsT0FBT0QsSUFBSUUsTUFBTSxHQUFBO0FBQ3ZCLFdBQVNDLElBQUksR0FBR0MsSUFBSUgsS0FBS25FLFFBQVFxRSxJQUFJQyxHQUFHLEVBQUVELEdBQUc7QUFDM0MsVUFBTUUsSUFBSUosS0FBS0UsQ0FBRTtBQUNqQkosV0FBT0EsS0FBS00sQ0FBRSxNQUFLTixLQUFLTSxDQUFBQSxJQUFLMUQsdUJBQU9pRCxPQUFPLElBQUk7RUFDakQ7QUFDQSxTQUFPRztBQUNUO0FBRUEsU0FBU3hILElBQUkrSCxNQUFNQyxPQUFPbEYsUUFBUTtBQUNoQyxNQUFJLE9BQU9rRixVQUFVLFVBQVU7QUFDN0IsV0FBT0MsTUFBTVYsV0FBU1EsTUFBTUMsS0FBUWxGLEdBQUFBLE1BQUFBOztBQUV0QyxTQUFPbUYsTUFBTVYsV0FBU1EsTUFBTSxFQUFLQyxHQUFBQSxLQUFBQTtBQUNuQztBQU1PLElBQU1FLFdBQU4sTUFBTUE7RUFDWEMsWUFBWUMsZUFBY0MsV0FBVztBQUNuQyxTQUFLckgsWUFBWWQ7QUFDakIsU0FBS29JLGtCQUFrQjtBQUN2QixTQUFLQyxjQUFjO0FBQ25CLFNBQUtqSixRQUFRO0FBQ2IsU0FBS2tKLFdBQVcsQ0FBQTtBQUNoQixTQUFLQyxtQkFBbUIsQ0FBQ0MsWUFBWUEsUUFBUXRGLE1BQU11RixTQUFTQyxvQkFBbUI7QUFDL0UsU0FBS0MsV0FBVyxDQUFBO0FBQ2hCLFNBQUtDLFNBQVM7TUFDWjtNQUNBO01BQ0E7TUFDQTtNQUNBO0lBQ0Q7QUFDRCxTQUFLQyxPQUFPO01BQ1ZDLFFBQVE7TUFDUkMsTUFBTTtNQUNOQyxPQUFPO01BQ1BDLFlBQVk7TUFDWkMsUUFBUTtJQUNWO0FBQ0EsU0FBS0MsUUFBUSxDQUFBO0FBQ2IsU0FBS0MsdUJBQXVCLENBQUNDLEtBQUtySCxZQUFZMUMsY0FBYzBDLFFBQVFvRyxlQUFlO0FBQ25GLFNBQUtrQixtQkFBbUIsQ0FBQ0QsS0FBS3JILFlBQVkxQyxjQUFjMEMsUUFBUXFHLFdBQVc7QUFDM0UsU0FBS2tCLGFBQWEsQ0FBQ0YsS0FBS3JILFlBQVkxQyxjQUFjMEMsUUFBUTVDLEtBQUs7QUFDL0QsU0FBS29LLFlBQVk7QUFDakIsU0FBS0MsY0FBYztNQUNqQkMsTUFBTTtNQUNOQyxXQUFXO01BQ1hDLGtCQUFrQjtJQUNwQjtBQUNBLFNBQUtDLHNCQUFzQjtBQUMzQixTQUFLQyxVQUFVO0FBQ2YsU0FBS0MsVUFBVTtBQUNmLFNBQUtDLFVBQVU7QUFDZixTQUFLQyxVQUFVLENBQUE7QUFDZixTQUFLQyxhQUFhO0FBQ2xCLFNBQUtDLFFBQVFuSztBQUNiLFNBQUtvSyxTQUFTLENBQUE7QUFDZCxTQUFLQyxXQUFXO0FBQ2hCLFNBQUtDLDBCQUEwQjtBQUUvQixTQUFLL0osU0FBUzJILGFBQUFBO0FBQ2QsU0FBS3FDLE1BQU1wQyxTQUFBQTtFQUNiO0VBTUFySSxJQUFJZ0ksT0FBT2xGLFFBQVE7QUFDakIsV0FBTzlDLElBQUksTUFBTWdJLE9BQU9sRixNQUFBQTtFQUMxQjtFQUtBUCxJQUFJeUYsT0FBTztBQUNULFdBQU9ULFdBQVMsTUFBTVMsS0FBQUE7RUFDeEI7RUFNQXZILFNBQVN1SCxPQUFPbEYsUUFBUTtBQUN0QixXQUFPOUMsSUFBSXNILGFBQWFVLE9BQU9sRixNQUFBQTtFQUNqQztFQUVBNEgsU0FBUzFDLE9BQU9sRixRQUFRO0FBQ3RCLFdBQU85QyxJQUFJb0gsV0FBV1ksT0FBT2xGLE1BQUFBO0VBQy9CO0VBbUJBb0UsTUFBTWMsT0FBT25ILE1BQU04SixhQUFhQyxZQUFZO0FBQzFDLFVBQU1DLGNBQWN0RCxXQUFTLE1BQU1TLEtBQUFBO0FBQ25DLFVBQU04QyxvQkFBb0J2RCxXQUFTLE1BQU1vRCxXQUFBQTtBQUN6QyxVQUFNSSxjQUFjLE1BQU1sSztBQUUxQnVELFdBQU80RyxpQkFBaUJILGFBQWE7TUFFbkMsQ0FBQ0UsV0FBQUEsR0FBYztRQUNiNUwsT0FBTzBMLFlBQVloSyxJQUFLO1FBQ3hCb0ssVUFBVTtNQUNaO01BRUEsQ0FBQ3BLLElBQUFBLEdBQU87UUFDTnFLLFlBQVk7UUFDWjNJLE1BQU07QUFDSixnQkFBTTRJLFFBQVEsS0FBS0osV0FBWTtBQUMvQixnQkFBTUssU0FBU04sa0JBQWtCRixVQUFXO0FBQzVDLGNBQUlTLFNBQVNGLEtBQVEsR0FBQTtBQUNuQixtQkFBTy9HLE9BQU9DLE9BQU8sQ0FBQSxHQUFJK0csUUFBUUQsS0FBQUE7O0FBRW5DLGlCQUFPRyxlQUFlSCxPQUFPQyxNQUFBQTtRQUMvQjtRQUNBcEwsSUFBSWIsT0FBTztBQUNULGVBQUs0TCxXQUFBQSxJQUFlNUw7UUFDdEI7TUFDRjtJQUNGLENBQUE7RUFDRjtFQUVBc0wsTUFBTWMsVUFBVTtBQUNkQSxhQUFTQyxRQUFRLENBQUNmLFVBQVVBLE1BQU0sSUFBSSxDQUFBO0VBQ3hDO0FBQ0Y7QUFHQSxJQUFBLFdBQStCLG9CQUFJdkMsU0FBUztFQUMxQ3RILGFBQWEsQ0FBQ0MsU0FBUyxDQUFDQSxLQUFLc0csV0FBVyxJQUFBO0VBQ3hDeEcsWUFBWSxDQUFDRSxTQUFTQSxTQUFTO0VBQy9Cd0ksT0FBTztJQUNMM0ksV0FBVztFQUNiO0VBQ0FpSixhQUFhO0lBQ1gvSSxhQUFhO0lBQ2JELFlBQVk7RUFDZDtBQUNGLEdBQUc7RUFBQ2I7RUFBeUJ5QjtFQUFzQm9EO0NBQW1CO0FDdEovRCxTQUFTOEcsYUFBYTFDLE1BQWdCO0FBQzNDLE1BQUksQ0FBQ0EsUUFBUTJDLGNBQWMzQyxLQUFLRSxJQUFJLEtBQUt5QyxjQUFjM0MsS0FBS0MsTUFBTSxHQUFHO0FBQ25FLFdBQU87O0FBR1QsVUFBUUQsS0FBS0csUUFBUUgsS0FBS0csUUFBUSxNQUFNLE9BQ3JDSCxLQUFLSyxTQUFTTCxLQUFLSyxTQUFTLE1BQU0sTUFDbkNMLEtBQUtFLE9BQU8sUUFDWkYsS0FBS0M7QUFDVDtBQUtPLFNBQVMyQyxhQUNkcEMsS0FDQXFDLE1BQ0FDLElBQ0FDLFNBQ0FDLFFBQ0E7QUFDQSxNQUFJQyxZQUFZSixLQUFLRyxNQUFPO0FBQzVCLE1BQUksQ0FBQ0MsV0FBVztBQUNkQSxnQkFBWUosS0FBS0csTUFBTyxJQUFHeEMsSUFBSTBDLFlBQVlGLE1BQUFBLEVBQVFqRztBQUNuRCtGLE9BQUdLLEtBQUtILE1BQUFBOztBQUVWLE1BQUlDLFlBQVlGLFNBQVM7QUFDdkJBLGNBQVVFOztBQUVaLFNBQU9GO0FBQ1Q7QUFTTyxTQUFTSyxhQUNkNUMsS0FDQVIsTUFDQXFELGVBQ0FDLE9BQ0E7QUFDQUEsVUFBUUEsU0FBUyxDQUFBO0FBQ2pCLE1BQUlULE9BQU9TLE1BQU1ULE9BQU9TLE1BQU1ULFFBQVEsQ0FBQTtBQUN0QyxNQUFJQyxLQUFLUSxNQUFNQyxpQkFBaUJELE1BQU1DLGtCQUFrQixDQUFBO0FBRXhELE1BQUlELE1BQU10RCxTQUFTQSxNQUFNO0FBQ3ZCNkMsV0FBT1MsTUFBTVQsT0FBTyxDQUFBO0FBQ3BCQyxTQUFLUSxNQUFNQyxpQkFBaUIsQ0FBQTtBQUM1QkQsVUFBTXRELE9BQU9BOztBQUdmUSxNQUFJZ0QsS0FBSTtBQUVSaEQsTUFBSVIsT0FBT0E7QUFDWCxNQUFJK0MsVUFBVTtBQUNkLFFBQU1VLE9BQU9KLGNBQWM3STtBQUMzQixNQUFJcUUsR0FBVzZFLEdBQVdDLE1BQWNDLE9BQXdCQztBQUNoRSxPQUFLaEYsSUFBSSxHQUFHQSxJQUFJNEUsTUFBTTVFLEtBQUs7QUFDekIrRSxZQUFRUCxjQUFjeEUsQ0FBRTtBQUd4QixRQUFJK0UsVUFBVXpNLFVBQWF5TSxVQUFVLFFBQVEsQ0FBQzVKLFFBQVE0SixLQUFRLEdBQUE7QUFDNURiLGdCQUFVSCxhQUFhcEMsS0FBS3FDLE1BQU1DLElBQUlDLFNBQVNhLEtBQUFBO2VBQ3RDNUosUUFBUTRKLEtBQVEsR0FBQTtBQUd6QixXQUFLRixJQUFJLEdBQUdDLE9BQU9DLE1BQU1wSixRQUFRa0osSUFBSUMsTUFBTUQsS0FBSztBQUM5Q0csc0JBQWNELE1BQU1GLENBQUU7QUFFdEIsWUFBSUcsZ0JBQWdCMU0sVUFBYTBNLGdCQUFnQixRQUFRLENBQUM3SixRQUFRNkosV0FBYyxHQUFBO0FBQzlFZCxvQkFBVUgsYUFBYXBDLEtBQUtxQyxNQUFNQyxJQUFJQyxTQUFTYyxXQUFBQTs7TUFFbkQ7O0VBRUo7QUFFQXJELE1BQUlzRCxRQUFPO0FBRVgsUUFBTUMsUUFBUWpCLEdBQUd0SSxTQUFTO0FBQzFCLE1BQUl1SixRQUFRVixjQUFjN0ksUUFBUTtBQUNoQyxTQUFLcUUsSUFBSSxHQUFHQSxJQUFJa0YsT0FBT2xGLEtBQUs7QUFDMUIsYUFBT2dFLEtBQUtDLEdBQUdqRSxDQUFBQSxDQUFFO0lBQ25CO0FBQ0FpRSxPQUFHa0IsT0FBTyxHQUFHRCxLQUFBQTs7QUFFZixTQUFPaEI7QUFDVDtBQVVPLFNBQVNrQixZQUFZNUosT0FBYzZKLE9BQWVuSCxPQUFlO0FBQ3RFLFFBQU0yQyxtQkFBbUJyRixNQUFNOEo7QUFDL0IsUUFBTUMsWUFBWXJILFVBQVUsSUFBSXZKLEtBQUtrSCxJQUFJcUMsUUFBUSxHQUFHLEdBQUEsSUFBTztBQUMzRCxTQUFPdkosS0FBSzZRLE9BQU9ILFFBQVFFLGFBQWExRSxnQkFBQUEsSUFBb0JBLG1CQUFtQjBFO0FBQ2pGO0FBS08sU0FBU0UsWUFBWUMsUUFBMkIvRCxLQUFnQztBQUNyRkEsUUFBTUEsT0FBTytELE9BQU9DLFdBQVcsSUFBQTtBQUUvQmhFLE1BQUlnRCxLQUFJO0FBR1JoRCxNQUFJaUUsZUFBYztBQUNsQmpFLE1BQUlrRSxVQUFVLEdBQUcsR0FBR0gsT0FBT3hILE9BQU93SCxPQUFPSSxNQUFNO0FBQy9DbkUsTUFBSXNELFFBQU87QUFDYjtBQVNPLFNBQVNjLFVBQ2RwRSxLQUNBckgsU0FDQTBMLEdBQ0FDLEdBQ0E7QUFFQUMsa0JBQWdCdkUsS0FBS3JILFNBQVMwTCxHQUFHQyxHQUFHLElBQUk7QUFDMUM7QUFHTyxTQUFTQyxnQkFDZHZFLEtBQ0FySCxTQUNBMEwsR0FDQUMsR0FDQUUsR0FDQTtBQUNBLE1BQUkzTyxNQUFjNE8sU0FBaUJDLFNBQWlCaEYsTUFBY2lGLGNBQXNCcEksT0FBZXFJLFVBQWtCQztBQUN6SCxRQUFNbEYsUUFBUWhILFFBQVFtTTtBQUN0QixRQUFNQyxXQUFXcE0sUUFBUW9NO0FBQ3pCLFFBQU1DLFNBQVNyTSxRQUFRcU07QUFDdkIsTUFBSUMsT0FBT0YsWUFBWSxLQUFLRztBQUU1QixNQUFJdkYsU0FBUyxPQUFPQSxVQUFVLFVBQVU7QUFDdEM5SixXQUFPOEosTUFBTTdKLFNBQVE7QUFDckIsUUFBSUQsU0FBUywrQkFBK0JBLFNBQVMsOEJBQThCO0FBQ2pGbUssVUFBSWdELEtBQUk7QUFDUmhELFVBQUltRixVQUFVZCxHQUFHQyxDQUFBQTtBQUNqQnRFLFVBQUlvRixPQUFPSCxHQUFBQTtBQUNYakYsVUFBSXFGLFVBQVUxRixPQUFPLENBQUNBLE1BQU1wRCxRQUFRLEdBQUcsQ0FBQ29ELE1BQU13RSxTQUFTLEdBQUd4RSxNQUFNcEQsT0FBT29ELE1BQU13RSxNQUFNO0FBQ25GbkUsVUFBSXNELFFBQU87QUFDWDs7O0FBSUosTUFBSTlJLE1BQU13SyxNQUFXQSxLQUFBQSxVQUFVLEdBQUc7QUFDaEM7O0FBR0ZoRixNQUFJc0YsVUFBUztBQUViLFVBQVEzRixPQUFBQTtJQUVOO0FBQ0UsVUFBSTZFLEdBQUc7QUFDTHhFLFlBQUl1RixRQUFRbEIsR0FBR0MsR0FBR0UsSUFBSSxHQUFHUSxRQUFRLEdBQUcsR0FBRzdSLEdBQUFBO2FBQ2xDO0FBQ0w2TSxZQUFJd0YsSUFBSW5CLEdBQUdDLEdBQUdVLFFBQVEsR0FBRzdSLEdBQUFBOztBQUUzQjZNLFVBQUl5RixVQUFTO0FBQ2I7SUFDRixLQUFLO0FBQ0hsSixjQUFRaUksSUFBSUEsSUFBSSxJQUFJUTtBQUNwQmhGLFVBQUkwRixPQUFPckIsSUFBSXJSLEtBQUtFLElBQUkrUixHQUFPMUksSUFBQUEsT0FBTytILElBQUl0UixLQUFLb0IsSUFBSTZRLEdBQU9ELElBQUFBLE1BQUFBO0FBQzFEQyxhQUFPVTtBQUNQM0YsVUFBSTRGLE9BQU92QixJQUFJclIsS0FBS0UsSUFBSStSLEdBQU8xSSxJQUFBQSxPQUFPK0gsSUFBSXRSLEtBQUtvQixJQUFJNlEsR0FBT0QsSUFBQUEsTUFBQUE7QUFDMURDLGFBQU9VO0FBQ1AzRixVQUFJNEYsT0FBT3ZCLElBQUlyUixLQUFLRSxJQUFJK1IsR0FBTzFJLElBQUFBLE9BQU8rSCxJQUFJdFIsS0FBS29CLElBQUk2USxHQUFPRCxJQUFBQSxNQUFBQTtBQUMxRGhGLFVBQUl5RixVQUFTO0FBQ2I7SUFDRixLQUFLO0FBUUhkLHFCQUFlSyxTQUFTO0FBQ3hCdEYsYUFBT3NGLFNBQVNMO0FBQ2hCRixnQkFBVXpSLEtBQUtvQixJQUFJNlEsTUFBTVksVUFBY25HLElBQUFBO0FBQ3ZDa0YsaUJBQVc1UixLQUFLb0IsSUFBSTZRLE1BQU1ZLFVBQUFBLEtBQWVyQixJQUFJQSxJQUFJLElBQUlHLGVBQWVqRjtBQUNwRWdGLGdCQUFVMVIsS0FBS0UsSUFBSStSLE1BQU1ZLFVBQWNuRyxJQUFBQTtBQUN2Q21GLGlCQUFXN1IsS0FBS0UsSUFBSStSLE1BQU1ZLFVBQUFBLEtBQWVyQixJQUFJQSxJQUFJLElBQUlHLGVBQWVqRjtBQUNwRU0sVUFBSXdGLElBQUluQixJQUFJTyxVQUFVTixJQUFJSSxTQUFTQyxjQUFjTSxNQUFNelEsSUFBSXlRLE1BQU01USxPQUFBQTtBQUNqRTJMLFVBQUl3RixJQUFJbkIsSUFBSVEsVUFBVVAsSUFBSUcsU0FBU0UsY0FBY00sTUFBTTVRLFNBQVM0USxHQUFBQTtBQUNoRWpGLFVBQUl3RixJQUFJbkIsSUFBSU8sVUFBVU4sSUFBSUksU0FBU0MsY0FBY00sS0FBS0EsTUFBTTVRLE9BQUFBO0FBQzVEMkwsVUFBSXdGLElBQUluQixJQUFJUSxVQUFVUCxJQUFJRyxTQUFTRSxjQUFjTSxNQUFNNVEsU0FBUzRRLE1BQU16USxFQUFBQTtBQUN0RXdMLFVBQUl5RixVQUFTO0FBQ2I7SUFDRixLQUFLO0FBQ0gsVUFBSSxDQUFDVixVQUFVO0FBQ2JyRixlQUFPMU0sS0FBSzhTLFVBQVVkO0FBQ3RCekksZ0JBQVFpSSxJQUFJQSxJQUFJLElBQUk5RTtBQUNwQk0sWUFBSStGLEtBQUsxQixJQUFJOUgsT0FBTytILElBQUk1RSxNQUFNLElBQUluRCxPQUFPLElBQUltRCxJQUFBQTtBQUM3Qzs7QUFFRnVGLGFBQU9ZO0lBRVQsS0FBSztBQUNIakIsaUJBQVc1UixLQUFLb0IsSUFBSTZRLEdBQUFBLEtBQVFULElBQUlBLElBQUksSUFBSVE7QUFDeENQLGdCQUFVelIsS0FBS29CLElBQUk2USxHQUFPRCxJQUFBQTtBQUMxQk4sZ0JBQVUxUixLQUFLRSxJQUFJK1IsR0FBT0QsSUFBQUE7QUFDMUJILGlCQUFXN1IsS0FBS0UsSUFBSStSLEdBQUFBLEtBQVFULElBQUlBLElBQUksSUFBSVE7QUFDeENoRixVQUFJMEYsT0FBT3JCLElBQUlPLFVBQVVOLElBQUlJLE9BQUFBO0FBQzdCMUUsVUFBSTRGLE9BQU92QixJQUFJUSxVQUFVUCxJQUFJRyxPQUFBQTtBQUM3QnpFLFVBQUk0RixPQUFPdkIsSUFBSU8sVUFBVU4sSUFBSUksT0FBQUE7QUFDN0IxRSxVQUFJNEYsT0FBT3ZCLElBQUlRLFVBQVVQLElBQUlHLE9BQUFBO0FBQzdCekUsVUFBSXlGLFVBQVM7QUFDYjtJQUNGLEtBQUs7QUFDSFIsYUFBT1k7SUFFVCxLQUFLO0FBQ0hqQixpQkFBVzVSLEtBQUtvQixJQUFJNlEsR0FBQUEsS0FBUVQsSUFBSUEsSUFBSSxJQUFJUTtBQUN4Q1AsZ0JBQVV6UixLQUFLb0IsSUFBSTZRLEdBQU9ELElBQUFBO0FBQzFCTixnQkFBVTFSLEtBQUtFLElBQUkrUixHQUFPRCxJQUFBQTtBQUMxQkgsaUJBQVc3UixLQUFLRSxJQUFJK1IsR0FBQUEsS0FBUVQsSUFBSUEsSUFBSSxJQUFJUTtBQUN4Q2hGLFVBQUkwRixPQUFPckIsSUFBSU8sVUFBVU4sSUFBSUksT0FBQUE7QUFDN0IxRSxVQUFJNEYsT0FBT3ZCLElBQUlPLFVBQVVOLElBQUlJLE9BQUFBO0FBQzdCMUUsVUFBSTBGLE9BQU9yQixJQUFJUSxVQUFVUCxJQUFJRyxPQUFBQTtBQUM3QnpFLFVBQUk0RixPQUFPdkIsSUFBSVEsVUFBVVAsSUFBSUcsT0FBQUE7QUFDN0I7SUFDRixLQUFLO0FBQ0hHLGlCQUFXNVIsS0FBS29CLElBQUk2USxHQUFBQSxLQUFRVCxJQUFJQSxJQUFJLElBQUlRO0FBQ3hDUCxnQkFBVXpSLEtBQUtvQixJQUFJNlEsR0FBT0QsSUFBQUE7QUFDMUJOLGdCQUFVMVIsS0FBS0UsSUFBSStSLEdBQU9ELElBQUFBO0FBQzFCSCxpQkFBVzdSLEtBQUtFLElBQUkrUixHQUFBQSxLQUFRVCxJQUFJQSxJQUFJLElBQUlRO0FBQ3hDaEYsVUFBSTBGLE9BQU9yQixJQUFJTyxVQUFVTixJQUFJSSxPQUFBQTtBQUM3QjFFLFVBQUk0RixPQUFPdkIsSUFBSU8sVUFBVU4sSUFBSUksT0FBQUE7QUFDN0IxRSxVQUFJMEYsT0FBT3JCLElBQUlRLFVBQVVQLElBQUlHLE9BQUFBO0FBQzdCekUsVUFBSTRGLE9BQU92QixJQUFJUSxVQUFVUCxJQUFJRyxPQUFBQTtBQUM3QlEsYUFBT1k7QUFDUGpCLGlCQUFXNVIsS0FBS29CLElBQUk2USxHQUFBQSxLQUFRVCxJQUFJQSxJQUFJLElBQUlRO0FBQ3hDUCxnQkFBVXpSLEtBQUtvQixJQUFJNlEsR0FBT0QsSUFBQUE7QUFDMUJOLGdCQUFVMVIsS0FBS0UsSUFBSStSLEdBQU9ELElBQUFBO0FBQzFCSCxpQkFBVzdSLEtBQUtFLElBQUkrUixHQUFBQSxLQUFRVCxJQUFJQSxJQUFJLElBQUlRO0FBQ3hDaEYsVUFBSTBGLE9BQU9yQixJQUFJTyxVQUFVTixJQUFJSSxPQUFBQTtBQUM3QjFFLFVBQUk0RixPQUFPdkIsSUFBSU8sVUFBVU4sSUFBSUksT0FBQUE7QUFDN0IxRSxVQUFJMEYsT0FBT3JCLElBQUlRLFVBQVVQLElBQUlHLE9BQUFBO0FBQzdCekUsVUFBSTRGLE9BQU92QixJQUFJUSxVQUFVUCxJQUFJRyxPQUFBQTtBQUM3QjtJQUNGLEtBQUs7QUFDSEEsZ0JBQVVELElBQUlBLElBQUksSUFBSXhSLEtBQUtvQixJQUFJNlEsR0FBQUEsSUFBT0Q7QUFDdENOLGdCQUFVMVIsS0FBS0UsSUFBSStSLEdBQU9ELElBQUFBO0FBQzFCaEYsVUFBSTBGLE9BQU9yQixJQUFJSSxTQUFTSCxJQUFJSSxPQUFBQTtBQUM1QjFFLFVBQUk0RixPQUFPdkIsSUFBSUksU0FBU0gsSUFBSUksT0FBQUE7QUFDNUI7SUFDRixLQUFLO0FBQ0gxRSxVQUFJMEYsT0FBT3JCLEdBQUdDLENBQUFBO0FBQ2R0RSxVQUFJNEYsT0FBT3ZCLElBQUlyUixLQUFLb0IsSUFBSTZRLEdBQUFBLEtBQVFULElBQUlBLElBQUksSUFBSVEsU0FBU1YsSUFBSXRSLEtBQUtFLElBQUkrUixHQUFPRCxJQUFBQSxNQUFBQTtBQUN6RTtJQUNGLEtBQUs7QUFDSGhGLFVBQUl5RixVQUFTO0FBQ2I7RUFDSjtBQUVBekYsTUFBSWdHLEtBQUk7QUFDUixNQUFJck4sUUFBUXNOLGNBQWMsR0FBRztBQUMzQmpHLFFBQUlrRyxPQUFNOztBQUVkO0FBU08sU0FBU0MsZUFDZEMsT0FDQUMsTUFDQUMsUUFDQTtBQUNBQSxXQUFTQSxVQUFVO0FBRW5CLFNBQU8sQ0FBQ0QsUUFBU0QsU0FBU0EsTUFBTS9CLElBQUlnQyxLQUFLL04sT0FBT2dPLFVBQVVGLE1BQU0vQixJQUFJZ0MsS0FBS2pPLFFBQVFrTyxVQUNqRkYsTUFBTTlCLElBQUkrQixLQUFLbE8sTUFBTW1PLFVBQVVGLE1BQU05QixJQUFJK0IsS0FBS2hPLFNBQVNpTztBQUN6RDtBQUVPLFNBQVNDLFNBQVN2RyxLQUErQnFHLE1BQVk7QUFDbEVyRyxNQUFJZ0QsS0FBSTtBQUNSaEQsTUFBSXNGLFVBQVM7QUFDYnRGLE1BQUkrRixLQUFLTSxLQUFLL04sTUFBTStOLEtBQUtsTyxLQUFLa08sS0FBS2pPLFFBQVFpTyxLQUFLL04sTUFBTStOLEtBQUtoTyxTQUFTZ08sS0FBS2xPLEdBQUc7QUFDNUU2SCxNQUFJdEUsS0FBSTtBQUNWO0FBRU8sU0FBUzhLLFdBQVd4RyxLQUErQjtBQUN4REEsTUFBSXNELFFBQU87QUFDYjtBQWdEQSxTQUFTbUQsY0FBY0MsS0FBK0JDLE1BQXNCO0FBQzFFLE1BQUlBLEtBQUtDLGFBQWE7QUFDcEJGLFFBQUlHLFVBQVVGLEtBQUtDLFlBQVksQ0FBQSxHQUFJRCxLQUFLQyxZQUFZLENBQUUsQ0FBQTs7QUFHeEQsTUFBSSxDQUFDRSxjQUFjSCxLQUFLSSxRQUFRLEdBQUc7QUFDakNMLFFBQUlNLE9BQU9MLEtBQUtJLFFBQVE7O0FBRzFCLE1BQUlKLEtBQUtNLE9BQU87QUFDZFAsUUFBSVEsWUFBWVAsS0FBS007O0FBR3ZCLE1BQUlOLEtBQUtRLFdBQVc7QUFDbEJULFFBQUlTLFlBQVlSLEtBQUtROztBQUd2QixNQUFJUixLQUFLUyxjQUFjO0FBQ3JCVixRQUFJVSxlQUFlVCxLQUFLUzs7QUFFNUI7QUFFQSxTQUFTQyxhQUNQWCxLQUNBWSxHQUNBQyxHQUNBQyxNQUNBYixNQUNBO0FBQ0EsTUFBSUEsS0FBS2MsaUJBQWlCZCxLQUFLZSxXQUFXO0FBUXhDLFVBQU1DLFVBQVVqQixJQUFJa0IsWUFBWUosSUFBQUE7QUFDaEMsVUFBTUssT0FBT1AsSUFBSUssUUFBUUc7QUFDekIsVUFBTUMsUUFBUVQsSUFBSUssUUFBUUs7QUFDMUIsVUFBTUMsTUFBTVYsSUFBSUksUUFBUU87QUFDeEIsVUFBTUMsU0FBU1osSUFBSUksUUFBUVM7QUFDM0IsVUFBTUMsY0FBYzFCLEtBQUtjLGlCQUFpQlEsTUFBTUUsVUFBVSxJQUFJQTtBQUU5RHpCLFFBQUk0QixjQUFjNUIsSUFBSVE7QUFDdEJSLFFBQUk2QixVQUFTO0FBQ2I3QixRQUFJOEIsWUFBWTdCLEtBQUs4QixtQkFBbUI7QUFDeEMvQixRQUFJZ0MsT0FBT2IsTUFBTVEsV0FBQUE7QUFDakIzQixRQUFJaUMsT0FBT1osT0FBT00sV0FBQUE7QUFDbEIzQixRQUFJa0MsT0FBTTs7QUFFZDtBQUVBLFNBQVNDLGFBQWFuQyxLQUErQkMsTUFBdUI7QUFDMUUsUUFBTW1DLFdBQVdwQyxJQUFJUTtBQUVyQlIsTUFBSVEsWUFBWVAsS0FBS007QUFDckJQLE1BQUlxQyxTQUFTcEMsS0FBS2tCLE1BQU1sQixLQUFLc0IsS0FBS3RCLEtBQUtxQyxPQUFPckMsS0FBS3NDLE1BQU07QUFDekR2QyxNQUFJUSxZQUFZNEI7QUFDbEI7QUFLTyxTQUFTSSxXQUNkeEMsS0FDQXlDLE1BQ0E3QixHQUNBQyxHQUNBNkIsTUFDQXpDLE9BQXVCLENBQUEsR0FDdkI7QUFDQSxRQUFNMEMsUUFBUUMsUUFBUUgsSUFBQUEsSUFBUUEsT0FBTztJQUFDQTtFQUFLO0FBQzNDLFFBQU1QLFNBQVNqQyxLQUFLNEMsY0FBYyxLQUFLNUMsS0FBSzZDLGdCQUFnQjtBQUM1RCxNQUFJQyxHQUFXakM7QUFFZmQsTUFBSWdELEtBQUk7QUFDUmhELE1BQUkwQyxPQUFPQSxLQUFLTztBQUNoQmxELGdCQUFjQyxLQUFLQyxJQUFBQTtBQUVuQixPQUFLOEMsSUFBSSxHQUFHQSxJQUFJSixNQUFNTyxRQUFRLEVBQUVILEdBQUc7QUFDakNqQyxXQUFPNkIsTUFBTUksQ0FBRTtBQUVmLFFBQUk5QyxLQUFLa0QsVUFBVTtBQUNqQmhCLG1CQUFhbkMsS0FBS0MsS0FBS2tELFFBQVE7O0FBR2pDLFFBQUlqQixRQUFRO0FBQ1YsVUFBSWpDLEtBQUs2QyxhQUFhO0FBQ3BCOUMsWUFBSTRCLGNBQWMzQixLQUFLNkM7O0FBR3pCLFVBQUksQ0FBQzFDLGNBQWNILEtBQUs0QyxXQUFXLEdBQUc7QUFDcEM3QyxZQUFJOEIsWUFBWTdCLEtBQUs0Qzs7QUFHdkI3QyxVQUFJb0QsV0FBV3RDLE1BQU1GLEdBQUdDLEdBQUdaLEtBQUtvRCxRQUFROztBQUcxQ3JELFFBQUlzRCxTQUFTeEMsTUFBTUYsR0FBR0MsR0FBR1osS0FBS29ELFFBQVE7QUFDdEMxQyxpQkFBYVgsS0FBS1ksR0FBR0MsR0FBR0MsTUFBTWIsSUFBQUE7QUFFOUJZLFNBQUswQyxPQUFPYixLQUFLYyxVQUFVO0VBQzdCO0FBRUF4RCxNQUFJeUQsUUFBTztBQUNiO0FBT08sU0FBU0MsbUJBQ2QxRCxLQUNBMkQsTUFDQTtBQUNBLFFBQU0sRUFBQy9DLEdBQUdDLEdBQUcrQyxHQUFHQyxHQUFBQSxJQUFHQyxPQUFNLElBQUlIO0FBRzdCM0QsTUFBSStELElBQUluRCxJQUFJa0QsT0FBT0UsU0FBU25ELElBQUlpRCxPQUFPRSxTQUFTRixPQUFPRSxTQUFTLE1BQU1DLElBQUlBLElBQUksSUFBSTtBQUdsRmpFLE1BQUlpQyxPQUFPckIsR0FBR0MsSUFBSWdELEtBQUlDLE9BQU9JLFVBQVU7QUFHdkNsRSxNQUFJK0QsSUFBSW5ELElBQUlrRCxPQUFPSSxZQUFZckQsSUFBSWdELEtBQUlDLE9BQU9JLFlBQVlKLE9BQU9JLFlBQVlELElBQUlFLFNBQVMsSUFBSTtBQUc5Rm5FLE1BQUlpQyxPQUFPckIsSUFBSWdELElBQUlFLE9BQU9NLGFBQWF2RCxJQUFJZ0QsRUFBQUE7QUFHM0M3RCxNQUFJK0QsSUFBSW5ELElBQUlnRCxJQUFJRSxPQUFPTSxhQUFhdkQsSUFBSWdELEtBQUlDLE9BQU9NLGFBQWFOLE9BQU9NLGFBQWFELFNBQVMsR0FBRyxJQUFJO0FBR3BHbkUsTUFBSWlDLE9BQU9yQixJQUFJZ0QsR0FBRy9DLElBQUlpRCxPQUFPTyxRQUFRO0FBR3JDckUsTUFBSStELElBQUluRCxJQUFJZ0QsSUFBSUUsT0FBT08sVUFBVXhELElBQUlpRCxPQUFPTyxVQUFVUCxPQUFPTyxVQUFVLEdBQUcsQ0FBQ0YsU0FBUyxJQUFJO0FBR3hGbkUsTUFBSWlDLE9BQU9yQixJQUFJa0QsT0FBT0UsU0FBU25ELENBQUFBO0FBQ2pDO0FDcGdCQSxJQUFNeUQsY0FBYztBQUNwQixJQUFNQyxhQUFhO0FBY1osU0FBU0MsYUFBYUMsT0FBd0JDLE1BQXNCO0FBQ3pFLFFBQU1DLFdBQVcsS0FBS0YsT0FBT0csTUFBTU4sV0FBQUE7QUFDbkMsTUFBSSxDQUFDSyxXQUFXQSxRQUFRLENBQUEsTUFBTyxVQUFVO0FBQ3ZDLFdBQU9ELE9BQU87O0FBR2hCRCxVQUFRLENBQUNFLFFBQVEsQ0FBRTtBQUVuQixVQUFRQSxRQUFRLENBQUUsR0FBQTtJQUNoQixLQUFLO0FBQ0gsYUFBT0Y7SUFDVCxLQUFLO0FBQ0hBLGVBQVM7QUFDVDtFQUdKO0FBRUEsU0FBT0MsT0FBT0Q7QUFDaEI7QUFFQSxJQUFNSSxlQUFlLENBQUNDLE1BQWUsQ0FBQ0EsS0FBSztBQVFwQyxTQUFTQyxrQkFBa0JOLE9BQXdDTyxPQUEwQztBQUNsSCxRQUFNQyxNQUFNLENBQUE7QUFDWixRQUFNQyxXQUFXQyxTQUFTSCxLQUFBQTtBQUMxQixRQUFNSSxPQUFPRixXQUFXRyxPQUFPRCxLQUFLSixLQUFBQSxJQUFTQTtBQUM3QyxRQUFNTSxPQUFPSCxTQUFTVixLQUFBQSxJQUNsQlMsV0FDRUssQ0FBQUEsU0FBUUMsZUFBZWYsTUFBTWMsSUFBQUEsR0FBT2QsTUFBTU8sTUFBTU8sSUFBSyxDQUFBLENBQUMsSUFDdERBLENBQUFBLFNBQVFkLE1BQU1jLElBQUFBLElBQ2hCLE1BQU1kO0FBRVYsYUFBV2MsUUFBUUgsTUFBTTtBQUN2QkgsUUFBSU0sSUFBQUEsSUFBUVYsYUFBYVMsS0FBS0MsSUFBQUEsQ0FBQUE7RUFDaEM7QUFDQSxTQUFPTjtBQUNUO0FBVU8sU0FBU1EsT0FBT2hCLE9BQThCO0FBQ25ELFNBQU9NLGtCQUFrQk4sT0FBTztJQUFDbEQsS0FBSztJQUFLRixPQUFPO0lBQUtJLFFBQVE7SUFBS04sTUFBTTtFQUFHLENBQUE7QUFDL0U7QUFTTyxTQUFTdUUsY0FBY2pCLE9BQTZCO0FBQ3pELFNBQU9NLGtCQUFrQk4sT0FBTztJQUFDO0lBQVc7SUFBWTtJQUFjO0VBQWMsQ0FBQTtBQUN0RjtBQVVPLFNBQVNrQixVQUFVbEIsT0FBa0M7QUFDMUQsUUFBTW1CLE1BQU1ILE9BQU9oQixLQUFBQTtBQUVuQm1CLE1BQUl0RCxRQUFRc0QsSUFBSXpFLE9BQU95RSxJQUFJdkU7QUFDM0J1RSxNQUFJckQsU0FBU3FELElBQUlyRSxNQUFNcUUsSUFBSW5FO0FBRTNCLFNBQU9tRTtBQUNUO0FBVU8sU0FBU0MsT0FBT0MsU0FBNEJDLFVBQThCO0FBQy9FRCxZQUFVQSxXQUFXLENBQUE7QUFDckJDLGFBQVdBLFlBQVlDLFNBQVN0RDtBQUVoQyxNQUFJZ0MsT0FBT2MsZUFBZU0sUUFBUXBCLE1BQU1xQixTQUFTckIsSUFBSTtBQUVyRCxNQUFJLE9BQU9BLFNBQVMsVUFBVTtBQUM1QkEsV0FBT3VCLFNBQVN2QixNQUFNLEVBQUE7O0FBRXhCLE1BQUl3QixRQUFRVixlQUFlTSxRQUFRSSxPQUFPSCxTQUFTRyxLQUFLO0FBQ3hELE1BQUlBLFNBQVMsRUFBRSxLQUFLQSxPQUFPdEIsTUFBTUwsVUFBYSxHQUFBO0FBQzVDNEIsWUFBUUMsS0FBSyxvQ0FBb0NGLFFBQVEsR0FBQTtBQUN6REEsWUFBUUc7O0FBR1YsUUFBTTNELE9BQU87SUFDWDRELFFBQVFkLGVBQWVNLFFBQVFRLFFBQVFQLFNBQVNPLE1BQU07SUFDdEQ5QyxZQUFZZ0IsYUFBYWdCLGVBQWVNLFFBQVF0QyxZQUFZdUMsU0FBU3ZDLFVBQVUsR0FBR2tCLElBQUFBO0lBQ2xGQTtJQUNBd0I7SUFDQUssUUFBUWYsZUFBZU0sUUFBUVMsUUFBUVIsU0FBU1EsTUFBTTtJQUN0RHRELFFBQVE7RUFDVjtBQUVBUCxPQUFLTyxTQUFTdUQsYUFBYTlELElBQUFBO0FBQzNCLFNBQU9BO0FBQ1Q7QUFhTyxTQUFTK0QsUUFBUUMsUUFBd0JDLFNBQWtCQyxPQUFnQkMsTUFBK0I7QUFDL0csTUFBSUMsWUFBWTtBQUNoQixNQUFJL0QsR0FBV2dFLE1BQWN0QztBQUU3QixPQUFLMUIsSUFBSSxHQUFHZ0UsT0FBT0wsT0FBT3hELFFBQVFILElBQUlnRSxNQUFNLEVBQUVoRSxHQUFHO0FBQy9DMEIsWUFBUWlDLE9BQU8zRCxDQUFFO0FBQ2pCLFFBQUkwQixVQUFVNEIsUUFBVztBQUN2Qjs7QUFFRixRQUFJTSxZQUFZTixVQUFhLE9BQU81QixVQUFVLFlBQVk7QUFDeERBLGNBQVFBLE1BQU1rQyxPQUFBQTtBQUNkRyxrQkFBWTs7QUFFZCxRQUFJRixVQUFVUCxVQUFhekQsUUFBUTZCLEtBQVEsR0FBQTtBQUN6Q0EsY0FBUUEsTUFBTW1DLFFBQVFuQyxNQUFNdkIsTUFBTTtBQUNsQzRELGtCQUFZOztBQUVkLFFBQUlyQyxVQUFVNEIsUUFBVztBQUN2QixVQUFJUSxRQUFRLENBQUNDLFdBQVc7QUFDdEJELGFBQUtDLFlBQVk7O0FBRW5CLGFBQU9yQzs7RUFFWDtBQUNGO0FBUU8sU0FBU3VDLFVBQVVDLFFBQXVDQyxPQUF3QkMsYUFBc0I7QUFDN0csUUFBTSxFQUFDQyxLQUFLQyxJQUFBQSxJQUFPSjtBQUNuQixRQUFNSyxTQUFTQyxZQUFZTCxRQUFRRyxNQUFNRCxPQUFPLENBQUE7QUFDaEQsUUFBTUksV0FBVyxDQUFDL0MsT0FBZWdELFFBQWdCTixlQUFlMUMsVUFBVSxJQUFJLElBQUlBLFFBQVFnRDtBQUMxRixTQUFPO0lBQ0xMLEtBQUtJLFNBQVNKLEtBQUssQ0FBQ00sS0FBS0MsSUFBSUwsTUFBQUEsQ0FBQUE7SUFDN0JELEtBQUtHLFNBQVNILEtBQUtDLE1BQUFBO0VBQ3JCO0FBQ0Y7QUFVTyxTQUFTTSxjQUFjQyxlQUF1QmxCLFNBQWlCO0FBQ3BFLFNBQU90QixPQUFPeUMsT0FBT3pDLE9BQU8wQyxPQUFPRixhQUFnQmxCLEdBQUFBLE9BQUFBO0FBQ3JEO0FDbkxPLFNBQVNxQixnQkFJZEMsUUFDQUMsV0FBVztFQUFDO0dBQ1pDLFlBQ0FwQyxVQUNBcUMsWUFBWSxNQUFNSCxPQUFPLENBQUEsR0FDekI7QUFDQSxRQUFNSSxrQkFBa0JGLGNBQWNGO0FBQ3RDLE1BQUksT0FBT2xDLGFBQWEsYUFBYTtBQUNuQ0EsZUFBV3VDLFNBQVMsYUFBYUwsTUFBQUE7O0FBRW5DLFFBQU1NLFFBQTZCO0lBQ2pDLENBQUNDLE9BQU9DLFdBQVcsR0FBRztJQUN0QkMsWUFBWTtJQUNaQyxTQUFTVjtJQUNUVyxhQUFhUDtJQUNiUSxXQUFXOUM7SUFDWCtDLFlBQVlWO0lBQ1pXLFVBQVUsQ0FBQ0MsVUFBcUJoQixnQkFBZ0I7TUFBQ2dCO01BQVVmLEdBQUFBO0lBQU8sR0FBRUMsVUFBVUcsaUJBQWlCdEMsUUFBQUE7RUFDakc7QUFDQSxTQUFPLElBQUlrRCxNQUFNVixPQUFPOzs7O0lBSXRCVyxlQUFlQyxRQUFRNUQsTUFBYztBQUNuQyxhQUFPNEQsT0FBTzVELElBQUs7QUFDbkIsYUFBTzRELE9BQU9DO0FBQ2QsYUFBT25CLE9BQU8sQ0FBQSxFQUFHMUMsSUFBQUE7QUFDakIsYUFBTztJQUNUOzs7O0lBS0E4RCxJQUFJRixRQUFRNUQsTUFBYztBQUN4QixhQUFPK0QsUUFBUUgsUUFBUTVELE1BQ3JCLE1BQU1nRSxxQkFBcUJoRSxNQUFNMkMsVUFBVUQsUUFBUWtCLE1BQUFBLENBQUFBO0lBQ3ZEOzs7OztJQU1BSyx5QkFBeUJMLFFBQVE1RCxNQUFNO0FBQ3JDLGFBQU9rRSxRQUFRRCx5QkFBeUJMLE9BQU9SLFFBQVEsQ0FBQSxHQUFJcEQsSUFBQUE7SUFDN0Q7Ozs7SUFLQW1FLGlCQUFpQjtBQUNmLGFBQU9ELFFBQVFDLGVBQWV6QixPQUFPLENBQUUsQ0FBQTtJQUN6Qzs7OztJQUtBMEIsSUFBSVIsUUFBUTVELE1BQWM7QUFDeEIsYUFBT3FFLHFCQUFxQlQsTUFBUVUsRUFBQUEsU0FBU3RFLElBQUFBO0lBQy9DOzs7O0lBS0F1RSxRQUFRWCxRQUFRO0FBQ2QsYUFBT1MscUJBQXFCVCxNQUFBQTtJQUM5Qjs7OztJQUtBWSxJQUFJWixRQUFRNUQsTUFBY2QsT0FBTztBQUMvQixZQUFNdUYsVUFBVWIsT0FBT2MsYUFBYWQsT0FBT2MsV0FBVzdCLFVBQVU7QUFDaEVlLGFBQU81RCxJQUFBQSxJQUFReUUsUUFBUXpFLElBQUssSUFBR2Q7QUFDL0IsYUFBTzBFLE9BQU9DO0FBQ2QsYUFBTztJQUNUO0VBQ0YsQ0FBQTtBQUNGO0FBVU8sU0FBU2MsZUFJZEMsT0FDQXhELFNBQ0F5RCxVQUNBQyxvQkFDQTtBQUNBLFFBQU05QixRQUE0QjtJQUNoQ0csWUFBWTtJQUNaNEIsUUFBUUg7SUFDUkksVUFBVTVEO0lBQ1Y2RCxXQUFXSjtJQUNYSyxRQUFRLG9CQUFJQyxJQUFBQTtJQUNaQyxjQUFjQSxhQUFhUixPQUFPRSxrQkFBQUE7SUFDbENPLFlBQVksQ0FBQzVLLFFBQW1Ca0ssZUFBZUMsT0FBT25LLEtBQUtvSyxVQUFVQyxrQkFBQUE7SUFDckV0QixVQUFVLENBQUNDLFVBQXFCa0IsZUFBZUMsTUFBTXBCLFNBQVNDLEtBQUFBLEdBQVFyQyxTQUFTeUQsVUFBVUMsa0JBQUFBO0VBQzNGO0FBQ0EsU0FBTyxJQUFJcEIsTUFBTVYsT0FBTzs7OztJQUl0QlcsZUFBZUMsUUFBUTVELE1BQU07QUFDM0IsYUFBTzRELE9BQU81RCxJQUFLO0FBQ25CLGFBQU80RSxNQUFNNUUsSUFBSztBQUNsQixhQUFPO0lBQ1Q7Ozs7SUFLQThELElBQUlGLFFBQVE1RCxNQUFjc0YsVUFBVTtBQUNsQyxhQUFPdkIsUUFBUUgsUUFBUTVELE1BQ3JCLE1BQU11RixvQkFBb0IzQixRQUFRNUQsTUFBTXNGLFFBQUFBLENBQUFBO0lBQzVDOzs7OztJQU1BckIseUJBQXlCTCxRQUFRNUQsTUFBTTtBQUNyQyxhQUFPNEQsT0FBT3dCLGFBQWFJLFVBQ3ZCdEIsUUFBUUUsSUFBSVEsT0FBTzVFLElBQVEsSUFBQTtRQUFDeUYsWUFBWTtRQUFNQyxjQUFjO01BQUksSUFBSTVFLFNBQ3BFb0QsUUFBUUQseUJBQXlCVyxPQUFPNUUsSUFBSztJQUNuRDs7OztJQUtBbUUsaUJBQWlCO0FBQ2YsYUFBT0QsUUFBUUMsZUFBZVMsS0FBQUE7SUFDaEM7Ozs7SUFLQVIsSUFBSVIsUUFBUTVELE1BQU07QUFDaEIsYUFBT2tFLFFBQVFFLElBQUlRLE9BQU81RSxJQUFBQTtJQUM1Qjs7OztJQUtBdUUsVUFBVTtBQUNSLGFBQU9MLFFBQVFLLFFBQVFLLEtBQUFBO0lBQ3pCOzs7O0lBS0FKLElBQUlaLFFBQVE1RCxNQUFNZCxPQUFPO0FBQ3ZCMEYsWUFBTTVFLElBQUFBLElBQVFkO0FBQ2QsYUFBTzBFLE9BQU81RCxJQUFLO0FBQ25CLGFBQU87SUFDVDtFQUNGLENBQUE7QUFDRjtBQUtPLFNBQVNvRixhQUNkUixPQUNBbkUsWUFBK0I7RUFBQ2tGLFlBQVk7RUFBTUMsV0FBVztBQUFJLEdBQ3JEO0FBQ1osUUFBTSxFQUFDQyxjQUFjcEYsVUFBU2tGLFlBQVlHLGFBQWFyRixVQUFTbUYsV0FBV0csV0FBV3RGLFVBQVMrRSxRQUFPLElBQUlaO0FBQzFHLFNBQU87SUFDTFksU0FBU087SUFDVEosWUFBWUU7SUFDWkQsV0FBV0U7SUFDWEUsY0FBY0MsV0FBV0osV0FBQUEsSUFBZUEsY0FBYyxNQUFNQTtJQUM1REssYUFBYUQsV0FBV0gsVUFBQUEsSUFBY0EsYUFBYSxNQUFNQTtFQUMzRDtBQUNGO0FBRUEsSUFBTUssVUFBVSxDQUFDQyxRQUFnQkMsU0FBaUJELFNBQVNBLFNBQVNFLFlBQVlELElBQUFBLElBQVFBO0FBQ3hGLElBQU1FLG1CQUFtQixDQUFDdkcsTUFBY2QsVUFBbUJVLFNBQVNWLEtBQUFBLEtBQVVjLFNBQVMsZUFDcEZGLE9BQU9xRSxlQUFlakYsS0FBVyxNQUFBLFFBQVFBLE1BQU1zSCxnQkFBZ0IxRztBQUVsRSxTQUFTaUUsUUFDUEgsUUFDQTVELE1BQ0FrQixVQUNBO0FBQ0EsTUFBSXBCLE9BQU8yRyxVQUFVQyxlQUFlQyxLQUFLL0MsUUFBUTVELElBQU8sR0FBQTtBQUN0RCxXQUFPNEQsT0FBTzVELElBQUs7O0FBR3JCLFFBQU1kLFFBQVFnQyxTQUFBQTtBQUVkMEMsU0FBTzVELElBQUFBLElBQVFkO0FBQ2YsU0FBT0E7QUFDVDtBQUVBLFNBQVNxRyxvQkFDUDNCLFFBQ0E1RCxNQUNBc0YsVUFDQTtBQUNBLFFBQU0sRUFBQ1AsUUFBUUMsVUFBVUMsV0FBV0csY0FBY3dCLGFBQVcsSUFBSWhEO0FBQ2pFLE1BQUkxRSxRQUFRNkYsT0FBTy9FLElBQUFBO0FBR25CLE1BQUlpRyxXQUFXL0csS0FBQUEsS0FBVTBILGFBQVlaLGFBQWFoRyxJQUFPLEdBQUE7QUFDdkRkLFlBQVEySCxtQkFBbUI3RyxNQUFNZCxPQUFPMEUsUUFBUTBCLFFBQUFBOztBQUVsRCxNQUFJakksUUFBUTZCLEtBQUFBLEtBQVVBLE1BQU12QixRQUFRO0FBQ2xDdUIsWUFBUTRILGNBQWM5RyxNQUFNZCxPQUFPMEUsUUFBUWdELGFBQVlWLFdBQVc7O0FBRXBFLE1BQUlLLGlCQUFpQnZHLE1BQU1kLEtBQVEsR0FBQTtBQUVqQ0EsWUFBUXlGLGVBQWV6RixPQUFPOEYsVUFBVUMsYUFBYUEsVUFBVWpGLElBQUFBLEdBQU80RyxZQUFBQTs7QUFFeEUsU0FBTzFIO0FBQ1Q7QUFFQSxTQUFTMkgsbUJBQ1A3RyxNQUNBK0csVUFDQW5ELFFBQ0EwQixVQUNBO0FBQ0EsUUFBTSxFQUFDUCxRQUFRQyxVQUFVQyxXQUFXQyxPQUFNLElBQUl0QjtBQUM5QyxNQUFJc0IsT0FBT2QsSUFBSXBFLElBQU8sR0FBQTtBQUNwQixVQUFNLElBQUlnSCxNQUFNLHlCQUF5QkMsTUFBTUMsS0FBS2hDLE1BQUFBLEVBQVFpQyxLQUFLLElBQVEsSUFBQSxPQUFPbkgsSUFBTTs7QUFFeEZrRixTQUFPaEQsSUFBSWxDLElBQUFBO0FBQ1gsTUFBSWQsUUFBUTZILFNBQVMvQixVQUFVQyxhQUFhSyxRQUFBQTtBQUM1Q0osU0FBT2tDLE9BQU9wSCxJQUFBQTtBQUNkLE1BQUl1RyxpQkFBaUJ2RyxNQUFNZCxLQUFRLEdBQUE7QUFFakNBLFlBQVFtSSxrQkFBa0J0QyxPQUFPM0IsU0FBUzJCLFFBQVEvRSxNQUFNZCxLQUFBQTs7QUFFMUQsU0FBT0E7QUFDVDtBQUVBLFNBQVM0SCxjQUNQOUcsTUFDQWQsT0FDQTBFLFFBQ0FzQyxhQUNBO0FBQ0EsUUFBTSxFQUFDbkIsUUFBUUMsVUFBVUMsV0FBV0csY0FBY3dCLGFBQVcsSUFBSWhEO0FBRWpFLE1BQUksT0FBT29CLFNBQVMzRCxVQUFVLGVBQWU2RSxZQUFZbEcsSUFBTyxHQUFBO0FBQzlELFdBQU9kLE1BQU04RixTQUFTM0QsUUFBUW5DLE1BQU12QixNQUFNO0VBQzVDLFdBQVdpQyxTQUFTVixNQUFNLENBQUEsQ0FBRSxHQUFHO0FBRTdCLFVBQU1vSSxNQUFNcEk7QUFDWixVQUFNd0QsU0FBU3FDLE9BQU8zQixRQUFRbUUsT0FBT0MsQ0FBQUEsTUFBS0EsTUFBTUYsR0FBQUE7QUFDaERwSSxZQUFRLENBQUE7QUFDUixlQUFXdUksUUFBUUgsS0FBSztBQUN0QixZQUFNSSxXQUFXTCxrQkFBa0IzRSxRQUFRcUMsUUFBUS9FLE1BQU15SCxJQUFBQTtBQUN6RHZJLFlBQU15SSxLQUFLaEQsZUFBZStDLFVBQVUxQyxVQUFVQyxhQUFhQSxVQUFVakYsSUFBQUEsR0FBTzRHLFlBQUFBLENBQUFBO0lBQzlFOztBQUVGLFNBQU8xSDtBQUNUO0FBRUEsU0FBUzBJLGdCQUNQcEgsVUFDQVIsTUFDQWQsT0FDQTtBQUNBLFNBQU8rRyxXQUFXekYsUUFBQUEsSUFBWUEsU0FBU1IsTUFBTWQsS0FBQUEsSUFBU3NCO0FBQ3hEO0FBRUEsSUFBTXFILFdBQVcsQ0FBQ0MsS0FBd0JDLFdBQXNCRCxRQUFRLE9BQU9DLFNBQzNFLE9BQU9ELFFBQVEsV0FBV0UsaUJBQWlCRCxRQUFRRCxHQUFBQSxJQUFPaEg7QUFFOUQsU0FBU21ILFVBQ1B6RCxNQUNBMEQsY0FDQUosS0FDQUssZ0JBQ0FqSixPQUNBO0FBQ0EsYUFBVzZJLFVBQVVHLGNBQWM7QUFDakMsVUFBTXpFLFFBQVFvRSxTQUFTQyxLQUFLQyxNQUFBQTtBQUM1QixRQUFJdEUsT0FBTztBQUNUZSxNQUFBQSxLQUFJdEMsSUFBSXVCLEtBQUFBO0FBQ1IsWUFBTWpELFdBQVdvSCxnQkFBZ0JuRSxNQUFNSCxXQUFXd0UsS0FBSzVJLEtBQUFBO0FBQ3ZELFVBQUksT0FBT3NCLGFBQWEsZUFBZUEsYUFBYXNILE9BQU90SCxhQUFhMkgsZ0JBQWdCO0FBR3RGLGVBQU8zSDs7ZUFFQWlELFVBQVUsU0FBUyxPQUFPMEUsbUJBQW1CLGVBQWVMLFFBQVFLLGdCQUFnQjtBQUc3RixhQUFPOztFQUVYO0FBQ0EsU0FBTztBQUNUO0FBRUEsU0FBU2Qsa0JBQ1BhLGNBQ0FSLFVBQ0ExSCxNQUNBZCxPQUNBO0FBQ0EsUUFBTTBELGFBQWE4RSxTQUFTckU7QUFDNUIsUUFBTTdDLFdBQVdvSCxnQkFBZ0JGLFNBQVNwRSxXQUFXdEQsTUFBTWQsS0FBQUE7QUFDM0QsUUFBTWtKLFlBQVk7SUFBSUYsR0FBQUE7SUFBaUJ0RixHQUFBQTtFQUFXO0FBQ2xELFFBQU00QixPQUFNLG9CQUFJVyxJQUFBQTtBQUNoQlgsRUFBQUEsS0FBSXRDLElBQUloRCxLQUFBQTtBQUNSLE1BQUk0SSxNQUFNTyxpQkFBaUI3RCxNQUFLNEQsV0FBV3BJLE1BQU1RLFlBQVlSLE1BQU1kLEtBQUFBO0FBQ25FLE1BQUk0SSxRQUFRLE1BQU07QUFDaEIsV0FBTzs7QUFFVCxNQUFJLE9BQU90SCxhQUFhLGVBQWVBLGFBQWFSLE1BQU07QUFDeEQ4SCxVQUFNTyxpQkFBaUI3RCxNQUFLNEQsV0FBVzVILFVBQVVzSCxLQUFLNUksS0FBQUE7QUFDdEQsUUFBSTRJLFFBQVEsTUFBTTtBQUNoQixhQUFPOzs7QUFHWCxTQUFPckYsZ0JBQWdCd0UsTUFBTUMsS0FBSzFDLElBQU0sR0FBQTtJQUFDO0VBQUcsR0FBRTVCLFlBQVlwQyxVQUN4RCxNQUFNOEgsYUFBYVosVUFBVTFILE1BQWdCZCxLQUFBQSxDQUFBQTtBQUNqRDtBQUVBLFNBQVNtSixpQkFDUDdELE1BQ0E0RCxXQUNBTixLQUNBdEgsVUFDQWlILE1BQ0E7QUFDQSxTQUFPSyxLQUFLO0FBQ1ZBLFVBQU1HLFVBQVV6RCxNQUFLNEQsV0FBV04sS0FBS3RILFVBQVVpSCxJQUFBQTtFQUNqRDtBQUNBLFNBQU9LO0FBQ1Q7QUFFQSxTQUFTUSxhQUNQWixVQUNBMUgsTUFDQWQsT0FDQTtBQUNBLFFBQU02SSxTQUFTTCxTQUFTbkUsV0FBVTtBQUNsQyxNQUFJLEVBQUV2RCxRQUFRK0gsU0FBUztBQUNyQkEsV0FBTy9ILElBQUssSUFBRyxDQUFBOztBQUVqQixRQUFNNEQsU0FBU21FLE9BQU8vSCxJQUFLO0FBQzNCLE1BQUkzQyxRQUFRdUcsTUFBV2hFLEtBQUFBLFNBQVNWLEtBQVEsR0FBQTtBQUV0QyxXQUFPQTs7QUFFVCxTQUFPMEUsVUFBVSxDQUFBO0FBQ25CO0FBRUEsU0FBU0kscUJBQ1BoRSxNQUNBMkMsVUFDQUQsUUFDQWtDLE9BQ0E7QUFDQSxNQUFJMUY7QUFDSixhQUFXa0gsVUFBVXpELFVBQVU7QUFDN0J6RCxZQUFRNkQsU0FBU29ELFFBQVFDLFFBQVFwRyxJQUFPMEMsR0FBQUEsTUFBQUE7QUFDeEMsUUFBSSxPQUFPeEQsVUFBVSxhQUFhO0FBQ2hDLGFBQU9xSCxpQkFBaUJ2RyxNQUFNZCxLQUMxQm1JLElBQUFBLGtCQUFrQjNFLFFBQVFrQyxPQUFPNUUsTUFBTWQsS0FBQUEsSUFDdkNBOztFQUVSO0FBQ0Y7QUFFQSxTQUFTNkQsU0FBUytFLEtBQWFwRixRQUFxQjtBQUNsRCxhQUFXZSxTQUFTZixRQUFRO0FBQzFCLFFBQUksQ0FBQ2UsT0FBTztBQUNWOztBQUVGLFVBQU12RSxRQUFRdUUsTUFBTXFFLEdBQUk7QUFDeEIsUUFBSSxPQUFPNUksVUFBVSxhQUFhO0FBQ2hDLGFBQU9BOztFQUVYO0FBQ0Y7QUFFQSxTQUFTbUYscUJBQXFCVCxRQUF1QjtBQUNuRCxNQUFJL0QsT0FBTytELE9BQU9DO0FBQ2xCLE1BQUksQ0FBQ2hFLE1BQU07QUFDVEEsV0FBTytELE9BQU9DLFFBQVEwRSx5QkFBeUIzRSxPQUFPUixPQUFPOztBQUUvRCxTQUFPdkQ7QUFDVDtBQUVBLFNBQVMwSSx5QkFBeUI3RixRQUFxQjtBQUNyRCxRQUFNOEIsT0FBTSxvQkFBSVcsSUFBQUE7QUFDaEIsYUFBVzFCLFNBQVNmLFFBQVE7QUFDMUIsZUFBV29GLE9BQU9oSSxPQUFPRCxLQUFLNEQsS0FBTzhELEVBQUFBLE9BQU9pQixDQUFBQSxNQUFLLENBQUNBLEVBQUVDLFdBQVcsR0FBTyxDQUFBLEdBQUE7QUFDcEVqRSxNQUFBQSxLQUFJdEMsSUFBSTRGLEdBQUFBO0lBQ1Y7RUFDRjtBQUNBLFNBQU9iLE1BQU1DLEtBQUsxQyxJQUFBQTtBQUNwQjtBQzdhQSxJQUFNa0UsVUFBVUMsT0FBT0QsV0FBVztBQ1czQixTQUFTRSxrQkFBMkI7QUFDekMsU0FBTyxPQUFPQyxXQUFXLGVBQWUsT0FBT0MsYUFBYTtBQUM5RDtBQUtPLFNBQVNDLGVBQWVDLFNBQStDO0FBQzVFLE1BQUlDLFNBQVNELFFBQVFFO0FBQ3JCLE1BQUlELFVBQVVBLE9BQU9FLFNBQVEsTUFBTyx1QkFBdUI7QUFDekRGLGFBQVVBLE9BQXNCRzs7QUFFbEMsU0FBT0g7QUFDVDtBQU9BLFNBQVNJLGNBQWNDLFlBQTZCQyxNQUFtQkMsZ0JBQXdCO0FBQzdGLE1BQUlDO0FBQ0osTUFBSSxPQUFPSCxlQUFlLFVBQVU7QUFDbENHLG9CQUFnQkMsU0FBU0osWUFBWSxFQUFBO0FBRXJDLFFBQUlBLFdBQVdLLFFBQVEsR0FBQSxNQUFTLElBQUk7QUFFbENGLHNCQUFnQixnQkFBaUIsTUFBT0YsS0FBS0wsV0FBV00sY0FBZTs7U0FFcEU7QUFDTEMsb0JBQWdCSDs7QUFHbEIsU0FBT0c7QUFDVDtBQUVBLElBQU1HLG9CQUFtQixDQUFDQyxZQUN4QkEsUUFBUUMsY0FBY0MsWUFBWUgsaUJBQWlCQyxTQUFTLElBQUk7QUFFM0QsU0FBU0csU0FBU0MsSUFBaUJDLFVBQTBCO0FBQ2xFLFNBQU9OLGtCQUFpQkssRUFBSUUsRUFBQUEsaUJBQWlCRCxRQUFBQTtBQUMvQztBQUVBLElBQU1FLFlBQVk7RUFBQztFQUFPO0VBQVM7RUFBVTtBQUFPO0FBQ3BELFNBQVNDLG1CQUFtQkMsUUFBNkJDLE9BQWVDLFFBQTRCO0FBQ2xHLFFBQU1DLFNBQVMsQ0FBQTtBQUNmRCxXQUFTQSxTQUFTLE1BQU1BLFNBQVM7QUFDakMsV0FBU0UsSUFBSSxHQUFHQSxJQUFJLEdBQUdBLEtBQUs7QUFDMUIsVUFBTUMsTUFBTVAsVUFBVU0sQ0FBRTtBQUN4QkQsV0FBT0UsR0FBSSxJQUFHQyxXQUFXTixPQUFPQyxRQUFRLE1BQU1JLE1BQU1ILE1BQUFBLENBQU8sS0FBSztFQUNsRTtBQUNBQyxTQUFPSSxRQUFRSixPQUFPSyxPQUFPTCxPQUFPTTtBQUNwQ04sU0FBT08sU0FBU1AsT0FBT1EsTUFBTVIsT0FBT1M7QUFDcEMsU0FBT1Q7QUFDVDtBQUVBLElBQU1VLGVBQWUsQ0FBQ0MsR0FBV0MsR0FBV0MsWUFDekNGLElBQUksS0FBS0MsSUFBSSxPQUFPLENBQUNDLFVBQVUsQ0FBQyxPQUF3QkM7QUFPM0QsU0FBU0Msa0JBQ1BDLEdBQ0FDLFFBS0U7QUFDRixRQUFNQyxVQUFVLEVBQWtCQTtBQUNsQyxRQUFNQyxTQUFVRCxXQUFXQSxRQUFRRSxTQUFTRixRQUFRLENBQUUsSUFBR0Y7QUFDekQsUUFBTSxFQUFDSyxTQUFTQyxRQUFBQSxJQUFXSDtBQUMzQixNQUFJSSxNQUFNO0FBQ1YsTUFBSVosR0FBR0M7QUFDUCxNQUFJRixhQUFhVyxTQUFTQyxTQUFTTixFQUFFSCxNQUFNLEdBQUc7QUFDNUNGLFFBQUlVO0FBQ0pULFFBQUlVO1NBQ0M7QUFDTCxVQUFNRSxPQUFPUCxPQUFPUSxzQkFBcUI7QUFDekNkLFFBQUlRLE9BQU9PLFVBQVVGLEtBQUtuQjtBQUMxQk8sUUFBSU8sT0FBT1EsVUFBVUgsS0FBS2hCO0FBQzFCZSxVQUFNOztBQUVSLFNBQU87SUFBQ1o7SUFBR0M7SUFBR1c7RUFBRztBQUNuQjtBQVNPLFNBQVNLLG9CQUNkQyxPQUNBQyxPQUMwQjtBQUMxQixNQUFJLFlBQVlELE9BQU87QUFDckIsV0FBT0E7O0FBR1QsUUFBTSxFQUFDWixRQUFRYyx3QkFBQUEsSUFBMkJEO0FBQzFDLFFBQU1oQyxRQUFRWCxrQkFBaUI4QixNQUFBQTtBQUMvQixRQUFNZSxZQUFZbEMsTUFBTW1DLGNBQWM7QUFDdEMsUUFBTUMsV0FBV3RDLG1CQUFtQkUsT0FBTyxTQUFBO0FBQzNDLFFBQU1xQyxVQUFVdkMsbUJBQW1CRSxPQUFPLFVBQVUsT0FBQTtBQUNwRCxRQUFNLEVBQUNhLEdBQUdDLEdBQUdXLElBQUcsSUFBSVIsa0JBQWtCYyxPQUFPWixNQUFBQTtBQUM3QyxRQUFNbUIsVUFBVUYsU0FBUzdCLFFBQVFrQixPQUFPWSxRQUFROUI7QUFDaEQsUUFBTWdDLFVBQVVILFNBQVMxQixPQUFPZSxPQUFPWSxRQUFRM0I7QUFFL0MsTUFBSSxFQUFDSixPQUFPRyxPQUFBQSxJQUFVdUI7QUFDdEIsTUFBSUUsV0FBVztBQUNiNUIsYUFBUzhCLFNBQVM5QixRQUFRK0IsUUFBUS9CO0FBQ2xDRyxjQUFVMkIsU0FBUzNCLFNBQVM0QixRQUFRNUI7O0FBRXRDLFNBQU87SUFDTEksR0FBRzJCLEtBQUtDLE9BQU81QixJQUFJeUIsV0FBV2hDLFFBQVFhLE9BQU9iLFFBQVEyQix1QkFBQUE7SUFDckRuQixHQUFHMEIsS0FBS0MsT0FBTzNCLElBQUl5QixXQUFXOUIsU0FBU1UsT0FBT1YsU0FBU3dCLHVCQUFBQTtFQUN6RDtBQUNGO0FBRUEsU0FBU1MsaUJBQWlCdkIsUUFBMkJiLE9BQWVHLFFBQWdDO0FBQ2xHLE1BQUlrQyxVQUFrQkM7QUFFdEIsTUFBSXRDLFVBQVV1QyxVQUFhcEMsV0FBV29DLFFBQVc7QUFDL0MsVUFBTUMsWUFBWXRFLGVBQWUyQyxNQUFBQTtBQUNqQyxRQUFJLENBQUMyQixXQUFXO0FBQ2R4QyxjQUFRYSxPQUFPNEI7QUFDZnRDLGVBQVNVLE9BQU82QjtXQUNYO0FBQ0wsWUFBTXRCLE9BQU9vQixVQUFVbkIsc0JBQXFCO0FBQzVDLFlBQU1zQixpQkFBaUI1RCxrQkFBaUJ5RCxTQUFBQTtBQUN4QyxZQUFNSSxrQkFBa0JwRCxtQkFBbUJtRCxnQkFBZ0IsVUFBVSxPQUFBO0FBQ3JFLFlBQU1FLG1CQUFtQnJELG1CQUFtQm1ELGdCQUFnQixTQUFBO0FBQzVEM0MsY0FBUW9CLEtBQUtwQixRQUFRNkMsaUJBQWlCN0MsUUFBUTRDLGdCQUFnQjVDO0FBQzlERyxlQUFTaUIsS0FBS2pCLFNBQVMwQyxpQkFBaUIxQyxTQUFTeUMsZ0JBQWdCekM7QUFDakVrQyxpQkFBVzdELGNBQWNtRSxlQUFlTixVQUFVRyxXQUFXLGFBQUE7QUFDN0RGLGtCQUFZOUQsY0FBY21FLGVBQWVMLFdBQVdFLFdBQVcsY0FBQTs7O0FBR25FLFNBQU87SUFDTHhDO0lBQ0FHO0lBQ0FrQyxVQUFVQSxZQUFZUztJQUN0QlIsV0FBV0EsYUFBYVE7RUFDMUI7QUFDRjtBQUVBLElBQU1DLFNBQVMsQ0FBQ0MsTUFBY2QsS0FBS0MsTUFBTWEsSUFBSSxFQUFNLElBQUE7QUFHNUMsU0FBU0MsZUFDZHBDLFFBQ0FxQyxTQUNBQyxVQUNBQyxhQUNtQztBQUNuQyxRQUFNMUQsUUFBUVgsa0JBQWlCOEIsTUFBQUE7QUFDL0IsUUFBTXdDLFVBQVU3RCxtQkFBbUJFLE9BQU8sUUFBQTtBQUMxQyxRQUFNMkMsV0FBVzdELGNBQWNrQixNQUFNMkMsVUFBVXhCLFFBQVEsYUFBa0JpQyxLQUFBQTtBQUN6RSxRQUFNUixZQUFZOUQsY0FBY2tCLE1BQU00QyxXQUFXekIsUUFBUSxjQUFtQmlDLEtBQUFBO0FBQzVFLFFBQU1RLGdCQUFnQmxCLGlCQUFpQnZCLFFBQVFxQyxTQUFTQyxRQUFBQTtBQUN4RCxNQUFJLEVBQUNuRCxPQUFPRyxPQUFBQSxJQUFVbUQ7QUFFdEIsTUFBSTVELE1BQU1tQyxjQUFjLGVBQWU7QUFDckMsVUFBTUUsVUFBVXZDLG1CQUFtQkUsT0FBTyxVQUFVLE9BQUE7QUFDcEQsVUFBTW9DLFdBQVd0QyxtQkFBbUJFLE9BQU8sU0FBQTtBQUMzQ00sYUFBUzhCLFNBQVM5QixRQUFRK0IsUUFBUS9CO0FBQ2xDRyxjQUFVMkIsU0FBUzNCLFNBQVM0QixRQUFRNUI7O0FBRXRDSCxVQUFRa0MsS0FBS3FCLElBQUksR0FBR3ZELFFBQVFxRCxRQUFRckQsS0FBSztBQUN6Q0csV0FBUytCLEtBQUtxQixJQUFJLEdBQUdILGNBQWNwRCxRQUFRb0QsY0FBY2pELFNBQVNrRCxRQUFRbEQsTUFBTTtBQUNoRkgsVUFBUStDLE9BQU9iLEtBQUtzQixJQUFJeEQsT0FBT3FDLFVBQVVpQixjQUFjakIsUUFBUSxDQUFBO0FBQy9EbEMsV0FBUzRDLE9BQU9iLEtBQUtzQixJQUFJckQsUUFBUW1DLFdBQVdnQixjQUFjaEIsU0FBUyxDQUFBO0FBQ25FLE1BQUl0QyxTQUFTLENBQUNHLFFBQVE7QUFHcEJBLGFBQVM0QyxPQUFPL0MsUUFBUSxDQUFBOztBQUcxQixRQUFNeUQsaUJBQWlCUCxZQUFZWCxVQUFhWSxhQUFhWjtBQUU3RCxNQUFJa0Isa0JBQWtCTCxlQUFlRSxjQUFjbkQsVUFBVUEsU0FBU21ELGNBQWNuRCxRQUFRO0FBQzFGQSxhQUFTbUQsY0FBY25EO0FBQ3ZCSCxZQUFRK0MsT0FBT2IsS0FBS3dCLE1BQU12RCxTQUFTaUQsV0FBQUEsQ0FBQUE7O0FBR3JDLFNBQU87SUFBQ3BEO0lBQU9HO0VBQU07QUFDdkI7QUFRTyxTQUFTd0QsWUFDZGpDLE9BQ0FrQyxZQUNBQyxZQUNnQjtBQUNoQixRQUFNQyxhQUFhRixjQUFjO0FBQ2pDLFFBQU1HLGVBQWU3QixLQUFLd0IsTUFBTWhDLE1BQU12QixTQUFTMkQsVUFBQUE7QUFDL0MsUUFBTUUsY0FBYzlCLEtBQUt3QixNQUFNaEMsTUFBTTFCLFFBQVE4RCxVQUFBQTtBQUU3Q3BDLFFBQU12QixTQUFTK0IsS0FBS3dCLE1BQU1oQyxNQUFNdkIsTUFBTTtBQUN0Q3VCLFFBQU0xQixRQUFRa0MsS0FBS3dCLE1BQU1oQyxNQUFNMUIsS0FBSztBQUVwQyxRQUFNYSxTQUFTYSxNQUFNYjtBQUtyQixNQUFJQSxPQUFPbkIsVUFBVW1FLGNBQWUsQ0FBQ2hELE9BQU9uQixNQUFNUyxVQUFVLENBQUNVLE9BQU9uQixNQUFNTSxRQUFTO0FBQ2pGYSxXQUFPbkIsTUFBTVMsU0FBUyxHQUFHdUIsTUFBTXZCLE1BQU07QUFDckNVLFdBQU9uQixNQUFNTSxRQUFRLEdBQUcwQixNQUFNMUIsS0FBSzs7QUFHckMsTUFBSTBCLE1BQU1DLDRCQUE0Qm1DLGNBQy9CakQsT0FBT1YsV0FBVzRELGdCQUNsQmxELE9BQU9iLFVBQVVnRSxhQUFhO0FBQ25DdEMsVUFBTUMsMEJBQTBCbUM7QUFDaENqRCxXQUFPVixTQUFTNEQ7QUFDaEJsRCxXQUFPYixRQUFRZ0U7QUFDZnRDLFVBQU11QyxJQUFJQyxhQUFhSixZQUFZLEdBQUcsR0FBR0EsWUFBWSxHQUFHLENBQUE7QUFDeEQsV0FBTzs7QUFFVCxTQUFPO0FBQ1Q7QUFPYUssSUFBQUEsK0JBQWdDLFdBQVc7QUFDdEQsTUFBSUMsbUJBQW1CO0FBQ3ZCLE1BQUk7QUFDRixVQUFNQyxVQUFVO01BQ2QsSUFBSUMsVUFBVTtBQUNaRiwyQkFBbUI7QUFDbkIsZUFBTztNQUNUO0lBQ0Y7QUFFQSxRQUFJckcsZ0JBQW1CLEdBQUE7QUFDckJDLGFBQU91RyxpQkFBaUIsUUFBUSxNQUFNRixPQUFBQTtBQUN0Q3JHLGFBQU93RyxvQkFBb0IsUUFBUSxNQUFNSCxPQUFBQTs7RUFFN0MsU0FBU3pELEdBQUc7RUFFWjtBQUNBLFNBQU93RDtBQUNULEVBQUs7QUFZRSxTQUFTSyxhQUNkekYsU0FDQUssVUFDb0I7QUFDcEIsUUFBTXFGLFFBQVF2RixTQUFTSCxTQUFTSyxRQUFBQTtBQUNoQyxRQUFNc0YsVUFBVUQsU0FBU0EsTUFBTUUsTUFBTSxtQkFBQTtBQUNyQyxTQUFPRCxVQUFVLENBQUNBLFFBQVEsQ0FBQSxJQUFLcEM7QUFDakM7QUUzUkEsSUFBTXNDLHdCQUF3QixTQUFTQyxPQUFlQyxPQUEyQjtBQUMvRSxTQUFPO0lBQ0xDLEVBQUVBLEdBQUc7QUFDSCxhQUFPRixRQUFRQSxRQUFRQyxRQUFRQztJQUNqQztJQUNBQyxTQUFTQyxHQUFHO0FBQ1ZILGNBQVFHO0lBQ1Y7SUFDQUMsVUFBVUMsT0FBTztBQUNmLFVBQUlBLFVBQVUsVUFBVTtBQUN0QixlQUFPQTs7QUFFVCxhQUFPQSxVQUFVLFVBQVUsU0FBUztJQUN0QztJQUNBQyxNQUFNTCxHQUFHTSxPQUFPO0FBQ2QsYUFBT04sSUFBSU07SUFDYjtJQUNBQyxXQUFXUCxHQUFHUSxXQUFXO0FBQ3ZCLGFBQU9SLElBQUlRO0lBQ2I7RUFDRjtBQUNGO0FBRUEsSUFBTUMsd0JBQXdCLFdBQXVCO0FBQ25ELFNBQU87SUFDTFQsRUFBRUEsR0FBRztBQUNILGFBQU9BO0lBQ1Q7SUFDQUMsU0FBU0MsR0FBRztJQUFBO0lBRVpDLFVBQVVDLE9BQU87QUFDZixhQUFPQTtJQUNUO0lBQ0FDLE1BQU1MLEdBQUdNLE9BQU87QUFDZCxhQUFPTixJQUFJTTtJQUNiO0lBQ0FDLFdBQVdQLEdBQUdVLFlBQVk7QUFDeEIsYUFBT1Y7SUFDVDtFQUNGO0FBQ0Y7QUFFTyxTQUFTVyxjQUFjQyxLQUFjZCxPQUFlQyxPQUFlO0FBQ3hFLFNBQU9hLE1BQU1mLHNCQUFzQkMsT0FBT0MsS0FBQUEsSUFBU1Usc0JBQXVCO0FBQzVFO0FBRU8sU0FBU0ksc0JBQXNCQyxLQUErQkMsV0FBMEI7QUFDN0YsTUFBSUMsT0FBNEJDO0FBQ2hDLE1BQUlGLGNBQWMsU0FBU0EsY0FBYyxPQUFPO0FBQzlDQyxZQUFRRixJQUFJSSxPQUFPRjtBQUNuQkMsZUFBVztNQUNURCxNQUFNRyxpQkFBaUIsV0FBQTtNQUN2QkgsTUFBTUksb0JBQW9CLFdBQUE7SUFDM0I7QUFFREosVUFBTUssWUFBWSxhQUFhTixXQUFXLFdBQUE7QUFDekNELFFBQWlEUSxvQkFBb0JMOztBQUUxRTtBQUVPLFNBQVNNLHFCQUFxQlQsS0FBK0JHLFVBQTZCO0FBQy9GLE1BQUlBLGFBQWFPLFFBQVc7QUFDMUIsV0FBUVYsSUFBaURRO0FBQ3pEUixRQUFJSSxPQUFPRixNQUFNSyxZQUFZLGFBQWFKLFNBQVMsQ0FBQSxHQUFJQSxTQUFTLENBQUUsQ0FBQTs7QUFFdEU7OztBRTlETyxJQUFNUSxXQUFOLE1BQU1BO0VBQ1hDLGNBQWM7QUFDWixTQUFLQyxXQUFXO0FBQ2hCLFNBQUtDLFVBQVUsb0JBQUlDLElBQUFBO0FBQ25CLFNBQUtDLFdBQVc7QUFDaEIsU0FBS0MsWUFBWUM7RUFDbkI7RUFLQUMsUUFBUUMsT0FBT0MsT0FBT0MsTUFBTUMsTUFBTTtBQUNoQyxVQUFNQyxZQUFZSCxNQUFNSSxVQUFVRixJQUFLO0FBQ3ZDLFVBQU1HLFdBQVdMLE1BQU1NO0FBRXZCSCxjQUFVSSxRQUFRQyxDQUFBQSxPQUFNQSxHQUFHO01BQ3pCVDtNQUNBVSxTQUFTVCxNQUFNUztNQUNmSjtNQUNBSyxhQUFhQyxLQUFLQyxJQUFJWCxPQUFPRCxNQUFNYSxPQUFPUixRQUFBQTtJQUM1QyxDQUFBLENBQUE7RUFDRjtFQUtBUyxXQUFXO0FBQ1QsUUFBSSxLQUFLdEIsVUFBVTtBQUNqQjs7QUFFRixTQUFLRyxXQUFXO0FBRWhCLFNBQUtILFdBQVd1QixpQkFBaUJDLEtBQUtDLFFBQVEsTUFBTTtBQUNsRCxXQUFLQyxRQUFPO0FBQ1osV0FBSzFCLFdBQVc7QUFFaEIsVUFBSSxLQUFLRyxVQUFVO0FBQ2pCLGFBQUttQixTQUFROztJQUVqQixDQUFBO0VBQ0Y7RUFLQUksUUFBUWpCLE9BQU9rQixLQUFLQyxJQUFHLEdBQUk7QUFDekIsUUFBSUMsWUFBWTtBQUVoQixTQUFLNUIsUUFBUWMsUUFBUSxDQUFDUCxPQUFPRCxVQUFVO0FBQ3JDLFVBQUksQ0FBQ0MsTUFBTXNCLFdBQVcsQ0FBQ3RCLE1BQU11QixNQUFNQyxRQUFRO0FBQ3pDOztBQUVGLFlBQU1ELFFBQVF2QixNQUFNdUI7QUFDcEIsVUFBSUUsSUFBSUYsTUFBTUMsU0FBUztBQUN2QixVQUFJRSxPQUFPO0FBQ1gsVUFBSUM7QUFFSixhQUFPRixLQUFLLEdBQUcsRUFBRUEsR0FBRztBQUNsQkUsZUFBT0osTUFBTUUsQ0FBRTtBQUVmLFlBQUlFLEtBQUtDLFNBQVM7QUFDaEIsY0FBSUQsS0FBS0UsU0FBUzdCLE1BQU1NLFVBQVU7QUFHaENOLGtCQUFNTSxXQUFXcUIsS0FBS0U7O0FBRXhCRixlQUFLRyxLQUFLN0IsSUFBQUE7QUFDVnlCLGlCQUFPO2VBQ0Y7QUFHTEgsZ0JBQU1FLENBQUFBLElBQUtGLE1BQU1BLE1BQU1DLFNBQVMsQ0FBRTtBQUNsQ0QsZ0JBQU1RLElBQUc7O01BRWI7QUFFQSxVQUFJTCxNQUFNO0FBQ1IzQixjQUFNMkIsS0FBSTtBQUNWLGFBQUs1QixRQUFRQyxPQUFPQyxPQUFPQyxNQUFNLFVBQUE7O0FBR25DLFVBQUksQ0FBQ3NCLE1BQU1DLFFBQVE7QUFDakJ4QixjQUFNc0IsVUFBVTtBQUNoQixhQUFLeEIsUUFBUUMsT0FBT0MsT0FBT0MsTUFBTSxVQUFBO0FBQ2pDRCxjQUFNUyxVQUFVOztBQUdsQlksbUJBQWFFLE1BQU1DO0lBQ3JCLENBQUE7QUFFQSxTQUFLNUIsWUFBWUs7QUFFakIsUUFBSW9CLGNBQWMsR0FBRztBQUNuQixXQUFLMUIsV0FBVzs7RUFFcEI7RUFLQXFDLFVBQVVqQyxPQUFPO0FBQ2YsVUFBTWtDLFNBQVMsS0FBS3hDO0FBQ3BCLFFBQUlPLFFBQVFpQyxPQUFPQyxJQUFJbkMsS0FBQUE7QUFDdkIsUUFBSSxDQUFDQyxPQUFPO0FBQ1ZBLGNBQVE7UUFDTnNCLFNBQVM7UUFDVGIsU0FBUztRQUNUYyxPQUFPLENBQUE7UUFDUG5CLFdBQVc7VUFDVCtCLFVBQVUsQ0FBQTtVQUNWQyxVQUFVLENBQUE7UUFDWjtNQUNGO0FBQ0FILGFBQU9JLElBQUl0QyxPQUFPQyxLQUFBQTs7QUFFcEIsV0FBT0E7RUFDVDtFQU9Bc0MsT0FBT3ZDLE9BQU93QyxPQUFPQyxJQUFJO0FBQ3ZCLFNBQUtSLFVBQVVqQyxLQUFBQSxFQUFPSyxVQUFVbUMsS0FBQUEsRUFBT0UsS0FBS0QsRUFBQUE7RUFDOUM7RUFPQUUsSUFBSTNDLE9BQU93QixPQUFPO0FBQ2hCLFFBQUksQ0FBQ0EsU0FBUyxDQUFDQSxNQUFNQyxRQUFRO0FBQzNCOztBQUVGLFNBQUtRLFVBQVVqQyxLQUFBQSxFQUFPd0IsTUFBTWtCLEtBQVFsQixHQUFBQSxLQUFBQTtFQUN0QztFQU1Bb0IsSUFBSTVDLE9BQU87QUFDVCxXQUFPLEtBQUtpQyxVQUFVakMsS0FBQUEsRUFBT3dCLE1BQU1DLFNBQVM7RUFDOUM7RUFNQVgsTUFBTWQsT0FBTztBQUNYLFVBQU1DLFFBQVEsS0FBS1AsUUFBUXlDLElBQUluQyxLQUFBQTtBQUMvQixRQUFJLENBQUNDLE9BQU87QUFDVjs7QUFFRkEsVUFBTXNCLFVBQVU7QUFDaEJ0QixVQUFNYSxRQUFRTSxLQUFLQyxJQUFHO0FBQ3RCcEIsVUFBTU0sV0FBV04sTUFBTXVCLE1BQU1xQixPQUFPLENBQUNDLEtBQUtDLFFBQVFuQyxLQUFLb0MsSUFBSUYsS0FBS0MsSUFBSUUsU0FBUyxHQUFHLENBQUE7QUFDaEYsU0FBS2xDLFNBQVE7RUFDZjtFQUVBUSxRQUFRdkIsT0FBTztBQUNiLFFBQUksQ0FBQyxLQUFLSixVQUFVO0FBQ2xCLGFBQU87O0FBRVQsVUFBTUssUUFBUSxLQUFLUCxRQUFReUMsSUFBSW5DLEtBQUFBO0FBQy9CLFFBQUksQ0FBQ0MsU0FBUyxDQUFDQSxNQUFNc0IsV0FBVyxDQUFDdEIsTUFBTXVCLE1BQU1DLFFBQVE7QUFDbkQsYUFBTzs7QUFFVCxXQUFPO0VBQ1Q7RUFNQXlCLEtBQUtsRCxPQUFPO0FBQ1YsVUFBTUMsUUFBUSxLQUFLUCxRQUFReUMsSUFBSW5DLEtBQUFBO0FBQy9CLFFBQUksQ0FBQ0MsU0FBUyxDQUFDQSxNQUFNdUIsTUFBTUMsUUFBUTtBQUNqQzs7QUFFRixVQUFNRCxRQUFRdkIsTUFBTXVCO0FBQ3BCLFFBQUlFLElBQUlGLE1BQU1DLFNBQVM7QUFFdkIsV0FBT0MsS0FBSyxHQUFHLEVBQUVBLEdBQUc7QUFDbEJGLFlBQU1FLENBQUUsRUFBQ3lCLE9BQU07SUFDakI7QUFDQWxELFVBQU11QixRQUFRLENBQUE7QUFDZCxTQUFLekIsUUFBUUMsT0FBT0MsT0FBT21CLEtBQUtDLElBQUcsR0FBSSxVQUFBO0VBQ3pDO0VBTUErQixPQUFPcEQsT0FBTztBQUNaLFdBQU8sS0FBS04sUUFBUTJELE9BQU9yRCxLQUFBQTtFQUM3QjtBQUNGO0FBR0EsSUFBQSxXQUErQixvQkFBSVQsU0FBVztBQ2pOOUMsSUFBTStELGNBQWM7QUFDcEIsSUFBTUMsZ0JBQWdCO0VBQ3BCQyxRQUFRQyxPQUFNQyxLQUFJQyxRQUFRO0FBQ3hCLFdBQU9BLFNBQVMsTUFBTUQsTUFBS0Q7RUFDN0I7RUFNQUcsTUFBTUgsT0FBTUMsS0FBSUMsUUFBUTtBQUN0QixVQUFNRSxLQUFLQyxNQUFhTCxTQUFRSCxXQUFBQTtBQUNoQyxVQUFNUyxLQUFLRixHQUFHRyxTQUFTRixNQUFhSixPQUFNSixXQUFBQTtBQUMxQyxXQUFPUyxNQUFNQSxHQUFHQyxRQUNaRCxHQUFHRSxJQUFJSixJQUFJRixNQUFBQSxFQUFRTyxVQUFTLElBQzVCUjtFQUNOO0VBQ0FTLE9BQU9WLE9BQU1DLEtBQUlDLFFBQVE7QUFDdkIsV0FBT0YsU0FBUUMsTUFBS0QsU0FBUUU7RUFDOUI7QUFDRjtBQUVlLElBQU1TLFlBQU4sTUFBTUE7RUFDbkI1RSxZQUFZNkUsS0FBS0MsUUFBUUMsTUFBTWIsS0FBSTtBQUNqQyxVQUFNYyxlQUFlRixPQUFPQyxJQUFLO0FBRWpDYixJQUFBQSxNQUFLZSxRQUFRO01BQUNKLElBQUlYO01BQUlBO01BQUljO01BQWNILElBQUlaO0lBQUssQ0FBQTtBQUNqRCxVQUFNQSxRQUFPZ0IsUUFBUTtNQUFDSixJQUFJWjtNQUFNZTtNQUFjZDtJQUFHLENBQUE7QUFFakQsU0FBSzdCLFVBQVU7QUFDZixTQUFLNkMsTUFBTUwsSUFBSTVELE1BQU04QyxjQUFjYyxJQUFJbEUsUUFBUSxPQUFPc0QsS0FBSztBQUMzRCxTQUFLa0IsVUFBVUMsUUFBUVAsSUFBSVEsTUFBTSxLQUFLRCxRQUFRRTtBQUM5QyxTQUFLQyxTQUFTbkUsS0FBS29FLE1BQU01RCxLQUFLQyxJQUFHLEtBQU1nRCxJQUFJWSxTQUFTLEVBQUE7QUFDcEQsU0FBS2hDLFlBQVksS0FBS25CLFNBQVNsQixLQUFLb0UsTUFBTVgsSUFBSTlELFFBQVE7QUFDdEQsU0FBSzJFLFFBQVEsQ0FBQyxDQUFDYixJQUFJYztBQUNuQixTQUFLQyxVQUFVZDtBQUNmLFNBQUtlLFFBQVFkO0FBQ2IsU0FBS2UsUUFBUTdCO0FBQ2IsU0FBSzhCLE1BQU03QjtBQUNYLFNBQUs4QixZQUFZMUY7RUFDbkI7RUFFQTJGLFNBQVM7QUFDUCxXQUFPLEtBQUs1RDtFQUNkO0VBRUE2RCxPQUFPckIsS0FBS1gsS0FBSXhELE1BQU07QUFDcEIsUUFBSSxLQUFLMkIsU0FBUztBQUNoQixXQUFLOUIsUUFBUSxLQUFLO0FBRWxCLFlBQU15RSxlQUFlLEtBQUtZLFFBQVEsS0FBS0MsS0FBSztBQUM1QyxZQUFNTSxVQUFVekYsT0FBTyxLQUFLNkU7QUFDNUIsWUFBTWEsU0FBUyxLQUFLM0MsWUFBWTBDO0FBQ2hDLFdBQUtaLFNBQVM3RTtBQUNkLFdBQUsrQyxZQUFZckMsS0FBS29FLE1BQU1wRSxLQUFLb0MsSUFBSTRDLFFBQVF2QixJQUFJOUQsUUFBUSxDQUFBO0FBQ3pELFdBQUt1QixVQUFVNkQ7QUFDZixXQUFLVCxRQUFRLENBQUMsQ0FBQ2IsSUFBSWM7QUFDbkIsV0FBS0ksTUFBTWQsUUFBUTtRQUFDSixJQUFJWDtRQUFJQTtRQUFJYztRQUFjSCxJQUFJWjtNQUFLLENBQUE7QUFDdkQsV0FBSzZCLFFBQVFiLFFBQVE7UUFBQ0osSUFBSVo7UUFBTWU7UUFBY2Q7TUFBRyxDQUFBOztFQUVyRDtFQUVBUCxTQUFTO0FBQ1AsUUFBSSxLQUFLdEIsU0FBUztBQUVoQixXQUFLRSxLQUFLWCxLQUFLQyxJQUFHLENBQUE7QUFDbEIsV0FBS1EsVUFBVTtBQUNmLFdBQUs5QixRQUFRLEtBQUs7O0VBRXRCO0VBRUFnQyxLQUFLN0IsTUFBTTtBQUNULFVBQU15RixVQUFVekYsT0FBTyxLQUFLNkU7QUFDNUIsVUFBTXhFLFdBQVcsS0FBSzBDO0FBQ3RCLFVBQU1zQixPQUFPLEtBQUtjO0FBQ2xCLFVBQU01QixRQUFPLEtBQUs2QjtBQUNsQixVQUFNSCxPQUFPLEtBQUtEO0FBQ2xCLFVBQU14QixNQUFLLEtBQUs2QjtBQUNoQixRQUFJNUI7QUFFSixTQUFLOUIsVUFBVTRCLFVBQVNDLFFBQU95QixRQUFTUSxVQUFVcEY7QUFFbEQsUUFBSSxDQUFDLEtBQUtzQixTQUFTO0FBQ2pCLFdBQUt1RCxRQUFRYixJQUFBQSxJQUFRYjtBQUNyQixXQUFLM0QsUUFBUSxJQUFJO0FBQ2pCOztBQUdGLFFBQUk0RixVQUFVLEdBQUc7QUFDZixXQUFLUCxRQUFRYixJQUFBQSxJQUFRZDtBQUNyQjs7QUFHRkUsYUFBVWdDLFVBQVVwRixXQUFZO0FBQ2hDb0QsYUFBU3dCLFFBQVF4QixTQUFTLElBQUksSUFBSUEsU0FBU0E7QUFDM0NBLGFBQVMsS0FBS2dCLFFBQVEvRCxLQUFLQyxJQUFJLEdBQUdELEtBQUtvQyxJQUFJLEdBQUdXLE1BQUFBLENBQUFBLENBQUFBO0FBRTlDLFNBQUt5QixRQUFRYixJQUFLLElBQUcsS0FBS0csSUFBSWpCLE9BQU1DLEtBQUlDLE1BQUFBO0VBQzFDO0VBRUFrQyxPQUFPO0FBQ0wsVUFBTUMsV0FBVyxLQUFLTixjQUFjLEtBQUtBLFlBQVksQ0FBQTtBQUNyRCxXQUFPLElBQUlPLFFBQVEsQ0FBQ0MsS0FBS0MsUUFBUTtBQUMvQkgsZUFBU3BELEtBQUs7UUFBQ3NEO1FBQUtDO01BQUcsQ0FBQTtJQUN6QixDQUFBO0VBQ0Y7RUFFQWxHLFFBQVFtRyxVQUFVO0FBQ2hCLFVBQU1DLFNBQVNELFdBQVcsUUFBUTtBQUNsQyxVQUFNSixXQUFXLEtBQUtOLGFBQWEsQ0FBQTtBQUNuQyxhQUFTOUQsSUFBSSxHQUFHQSxJQUFJb0UsU0FBU3JFLFFBQVFDLEtBQUs7QUFDeENvRSxlQUFTcEUsQ0FBRSxFQUFDeUUsTUFBTyxFQUFBO0lBQ3JCO0VBQ0Y7QUFDRjtBQ2pIZSxJQUFNQyxhQUFOLE1BQU1BO0VBQ25CNUcsWUFBWVEsT0FBT3FHLFFBQVE7QUFDekIsU0FBS0MsU0FBU3RHO0FBQ2QsU0FBS3VHLGNBQWMsb0JBQUk1RyxJQUFBQTtBQUN2QixTQUFLNkcsVUFBVUgsTUFBQUE7RUFDakI7RUFFQUcsVUFBVUgsUUFBUTtBQUNoQixRQUFJLENBQUNJLFNBQVNKLE1BQVMsR0FBQTtBQUNyQjs7QUFHRixVQUFNSyxtQkFBbUJDLE9BQU9DLEtBQUtDLFNBQVNDLFNBQVM7QUFDdkQsVUFBTUMsZ0JBQWdCLEtBQUtSO0FBRTNCSSxXQUFPSyxvQkFBb0JYLE1BQUFBLEVBQVE3RixRQUFReUcsQ0FBQUEsUUFBTztBQUNoRCxZQUFNNUMsTUFBTWdDLE9BQU9ZLEdBQUk7QUFDdkIsVUFBSSxDQUFDUixTQUFTcEMsR0FBTSxHQUFBO0FBQ2xCOztBQUVGLFlBQU02QixXQUFXLENBQUE7QUFDakIsaUJBQVdnQixVQUFVUixrQkFBa0I7QUFDckNSLGlCQUFTZ0IsTUFBQUEsSUFBVTdDLElBQUk2QyxNQUFPO01BQ2hDO0FBRUNDLE9BQUFBLFFBQVE5QyxJQUFJK0MsVUFBVSxLQUFLL0MsSUFBSStDLGNBQWM7UUFBQ0g7TUFBSSxHQUFFekcsUUFBUSxDQUFDK0QsU0FBUztBQUNyRSxZQUFJQSxTQUFTMEMsT0FBTyxDQUFDRixjQUFjbkUsSUFBSTJCLElBQU8sR0FBQTtBQUM1Q3dDLHdCQUFjekUsSUFBSWlDLE1BQU0yQixRQUFBQTs7TUFFNUIsQ0FBQTtJQUNGLENBQUE7RUFDRjtFQU1BbUIsZ0JBQWdCL0MsUUFBUWdELFFBQVE7QUFDOUIsVUFBTUMsYUFBYUQsT0FBT0U7QUFDMUIsVUFBTUEsVUFBVUMscUJBQXFCbkQsUUFBUWlELFVBQUFBO0FBQzdDLFFBQUksQ0FBQ0MsU0FBUztBQUNaLGFBQU8sQ0FBQTs7QUFHVCxVQUFNRSxhQUFhLEtBQUtDLGtCQUFrQkgsU0FBU0QsVUFBQUE7QUFDbkQsUUFBSUEsV0FBV0ssU0FBUztBQUl0QkMsZUFBU3ZELE9BQU9rRCxRQUFRTSxhQUFhUCxVQUFZUSxFQUFBQSxLQUFLLE1BQU07QUFDMUR6RCxlQUFPa0QsVUFBVUQ7TUFDbkIsR0FBRyxNQUFNO01BRVQsQ0FBQTs7QUFHRixXQUFPRztFQUNUO0VBS0FDLGtCQUFrQnJELFFBQVFnRCxRQUFRO0FBQ2hDLFVBQU1QLGdCQUFnQixLQUFLUjtBQUMzQixVQUFNbUIsYUFBYSxDQUFBO0FBQ25CLFVBQU1uRyxVQUFVK0MsT0FBT3dELGdCQUFnQnhELE9BQU93RCxjQUFjLENBQUE7QUFDNUQsVUFBTUUsUUFBUXJCLE9BQU9DLEtBQUtVLE1BQUFBO0FBQzFCLFVBQU1wSCxPQUFPa0IsS0FBS0MsSUFBRztBQUNyQixRQUFJSztBQUVKLFNBQUtBLElBQUlzRyxNQUFNdkcsU0FBUyxHQUFHQyxLQUFLLEdBQUcsRUFBRUEsR0FBRztBQUN0QyxZQUFNNkMsT0FBT3lELE1BQU10RyxDQUFFO0FBQ3JCLFVBQUk2QyxLQUFLMEQsT0FBTyxDQUFBLE1BQU8sS0FBSztBQUMxQjs7QUFHRixVQUFJMUQsU0FBUyxXQUFXO0FBQ3RCbUQsbUJBQVdoRixLQUFRLEdBQUEsS0FBSzJFLGdCQUFnQi9DLFFBQVFnRCxNQUFBQSxDQUFBQTtBQUNoRDs7QUFFRixZQUFNWSxRQUFRWixPQUFPL0MsSUFBSztBQUMxQixVQUFJdUMsWUFBWXZGLFFBQVFnRCxJQUFLO0FBQzdCLFlBQU1GLE1BQU0wQyxjQUFjNUUsSUFBSW9DLElBQUFBO0FBRTlCLFVBQUl1QyxXQUFXO0FBQ2IsWUFBSXpDLE9BQU95QyxVQUFVckIsT0FBTSxHQUFJO0FBRTdCcUIsb0JBQVVwQixPQUFPckIsS0FBSzZELE9BQU9oSSxJQUFBQTtBQUM3QjtlQUNLO0FBQ0w0RyxvQkFBVTNELE9BQU07OztBQUdwQixVQUFJLENBQUNrQixPQUFPLENBQUNBLElBQUk5RCxVQUFVO0FBRXpCK0QsZUFBT0MsSUFBQUEsSUFBUTJEO0FBQ2Y7O0FBR0YzRyxjQUFRZ0QsSUFBQUEsSUFBUXVDLFlBQVksSUFBSTFDLFVBQVVDLEtBQUtDLFFBQVFDLE1BQU0yRCxLQUFBQTtBQUM3RFIsaUJBQVdoRixLQUFLb0UsU0FBQUE7SUFDbEI7QUFDQSxXQUFPWTtFQUNUO0VBU0FoQyxPQUFPcEIsUUFBUWdELFFBQVE7QUFDckIsUUFBSSxLQUFLZixZQUFZNEIsU0FBUyxHQUFHO0FBRS9CeEIsYUFBT3lCLE9BQU85RCxRQUFRZ0QsTUFBQUE7QUFDdEI7O0FBR0YsVUFBTUksYUFBYSxLQUFLQyxrQkFBa0JyRCxRQUFRZ0QsTUFBQUE7QUFFbEQsUUFBSUksV0FBV2pHLFFBQVE7QUFDckI0RyxlQUFTMUYsSUFBSSxLQUFLMkQsUUFBUW9CLFVBQUFBO0FBQzFCLGFBQU87O0VBRVg7QUFDRjtBQUVBLFNBQVNHLFNBQVNILFlBQVlOLFlBQVk7QUFDeEMsUUFBTTdGLFVBQVUsQ0FBQTtBQUNoQixRQUFNcUYsT0FBT0QsT0FBT0MsS0FBS1EsVUFBQUE7QUFDekIsV0FBUzFGLElBQUksR0FBR0EsSUFBSWtGLEtBQUtuRixRQUFRQyxLQUFLO0FBQ3BDLFVBQU00RyxPQUFPWixXQUFXZCxLQUFLbEYsQ0FBQUEsQ0FBRTtBQUMvQixRQUFJNEcsUUFBUUEsS0FBSzdDLE9BQU0sR0FBSTtBQUN6QmxFLGNBQVFtQixLQUFLNEYsS0FBS3pDLEtBQUksQ0FBQTs7RUFFMUI7QUFFQSxTQUFPRSxRQUFRd0MsSUFBSWhILE9BQUFBO0FBQ3JCO0FBRUEsU0FBU2tHLHFCQUFxQm5ELFFBQVFpRCxZQUFZO0FBQ2hELE1BQUksQ0FBQ0EsWUFBWTtBQUNmOztBQUVGLE1BQUlDLFVBQVVsRCxPQUFPa0Q7QUFDckIsTUFBSSxDQUFDQSxTQUFTO0FBQ1psRCxXQUFPa0QsVUFBVUQ7QUFDakI7O0FBRUYsTUFBSUMsUUFBUUksU0FBUztBQUduQnRELFdBQU9rRCxVQUFVQSxVQUFVYixPQUFPeUIsT0FBTyxDQUFBLEdBQUlaLFNBQVM7TUFBQ0ksU0FBUztNQUFPRSxhQUFhLENBQUE7SUFBRSxDQUFBOztBQUV4RixTQUFPTjtBQUNUO0FDdEpBLFNBQVNnQixVQUFVQyxPQUFPQyxpQkFBaUI7QUFDekMsUUFBTUMsT0FBT0YsU0FBU0EsTUFBTWpCLFdBQVcsQ0FBQTtBQUN2QyxRQUFNb0IsVUFBVUQsS0FBS0M7QUFDckIsUUFBTS9ILE1BQU04SCxLQUFLOUgsUUFBUWYsU0FBWTRJLGtCQUFrQjtBQUN2RCxRQUFNMUYsTUFBTTJGLEtBQUszRixRQUFRbEQsU0FBWTRJLGtCQUFrQjtBQUN2RCxTQUFPO0lBQ0w1SCxPQUFPOEgsVUFBVTVGLE1BQU1uQztJQUN2QmdJLEtBQUtELFVBQVUvSCxNQUFNbUM7RUFDdkI7QUFDRjtBQUVBLFNBQVM4RixZQUFZQyxRQUFRQyxRQUFRTixpQkFBaUI7QUFDcEQsTUFBSUEsb0JBQW9CLE9BQU87QUFDN0IsV0FBTzs7QUFFVCxRQUFNTyxJQUFJVCxVQUFVTyxRQUFRTCxlQUFBQTtBQUM1QixRQUFNUSxJQUFJVixVQUFVUSxRQUFRTixlQUFBQTtBQUU1QixTQUFPO0lBQ0xTLEtBQUtELEVBQUVMO0lBQ1BPLE9BQU9ILEVBQUVKO0lBQ1RRLFFBQVFILEVBQUVwSTtJQUNWd0ksTUFBTUwsRUFBRW5JO0VBQ1Y7QUFDRjtBQUVBLFNBQVN5SSxPQUFPckIsT0FBTztBQUNyQixNQUFJc0IsSUFBR0MsR0FBR0MsR0FBR0M7QUFFYixNQUFJbEQsU0FBU3lCLEtBQVEsR0FBQTtBQUNuQnNCLElBQUFBLEtBQUl0QixNQUFNaUI7QUFDVk0sUUFBSXZCLE1BQU1rQjtBQUNWTSxRQUFJeEIsTUFBTW1CO0FBQ1ZNLFFBQUl6QixNQUFNb0I7U0FDTDtBQUNMRSxJQUFBQSxLQUFJQyxJQUFJQyxJQUFJQyxJQUFJekI7O0FBR2xCLFNBQU87SUFDTGlCLEtBQUtLO0lBQ0xKLE9BQU9LO0lBQ1BKLFFBQVFLO0lBQ1JKLE1BQU1LO0lBQ05DLFVBQVUxQixVQUFVO0VBQ3RCO0FBQ0Y7QUFFQSxTQUFTMkIsd0JBQXdCN0osT0FBTzhKLGVBQWU7QUFDckQsUUFBTWxELE9BQU8sQ0FBQTtBQUNiLFFBQU1tRCxXQUFXL0osTUFBTWdLLHVCQUF1QkYsYUFBQUE7QUFDOUMsTUFBSXBJLEdBQUd1STtBQUVQLE9BQUt2SSxJQUFJLEdBQUd1SSxPQUFPRixTQUFTdEksUUFBUUMsSUFBSXVJLE1BQU0sRUFBRXZJLEdBQUc7QUFDakRrRixTQUFLbEUsS0FBS3FILFNBQVNySSxDQUFBQSxFQUFHd0ksS0FBSztFQUM3QjtBQUNBLFNBQU90RDtBQUNUO0FBRUEsU0FBU3VELFdBQVdDLE9BQU9sQyxPQUFPbUMsU0FBUzdDLFVBQVUsQ0FBQSxHQUFJO0FBQ3ZELFFBQU1aLE9BQU93RCxNQUFNeEQ7QUFDbkIsUUFBTTBELGFBQWE5QyxRQUFRK0MsU0FBUztBQUNwQyxNQUFJN0ksR0FBR3VJLE1BQU1PLGNBQWNDO0FBRTNCLE1BQUl2QyxVQUFVLE1BQU07QUFDbEI7O0FBR0YsT0FBS3hHLElBQUksR0FBR3VJLE9BQU9yRCxLQUFLbkYsUUFBUUMsSUFBSXVJLE1BQU0sRUFBRXZJLEdBQUc7QUFDN0M4SSxtQkFBZSxDQUFDNUQsS0FBS2xGLENBQUU7QUFDdkIsUUFBSThJLGlCQUFpQkgsU0FBUztBQUM1QixVQUFJN0MsUUFBUWUsS0FBSztBQUNmOztBQUVGOztBQUVGa0MsaUJBQWFMLE1BQU05QyxPQUFPa0QsWUFBYTtBQUN2QyxRQUFJRSxlQUFTRCxVQUFnQkgsTUFBQUEsY0FBZXBDLFVBQVUsS0FBS3lDLEtBQUt6QyxLQUFBQSxNQUFXeUMsS0FBS0YsVUFBQUEsSUFBZTtBQUM3RnZDLGVBQVN1Qzs7RUFFYjtBQUNBLFNBQU92QztBQUNUO0FBRUEsU0FBUzBDLHlCQUF5QkMsTUFBTTtBQUN0QyxRQUFNakUsT0FBT0QsT0FBT0MsS0FBS2lFLElBQUFBO0FBQ3pCLFFBQU1DLFFBQVEsSUFBSUMsTUFBTW5FLEtBQUtuRixNQUFNO0FBQ25DLE1BQUlDLEdBQUd1SSxNQUFNaEQ7QUFDYixPQUFLdkYsSUFBSSxHQUFHdUksT0FBT3JELEtBQUtuRixRQUFRQyxJQUFJdUksTUFBTSxFQUFFdkksR0FBRztBQUM3Q3VGLFVBQU1MLEtBQUtsRixDQUFFO0FBQ2JvSixVQUFNcEosQ0FBQUEsSUFBSztNQUNUdUgsR0FBR2hDO01BQ0hpQyxHQUFHMkIsS0FBSzVELEdBQUk7SUFDZDtFQUNGO0FBQ0EsU0FBTzZEO0FBQ1Q7QUFFQSxTQUFTRSxVQUFVdkMsT0FBT3dDLE1BQU07QUFDOUIsUUFBTUMsVUFBVXpDLFNBQVNBLE1BQU1qQixRQUFRMEQ7QUFDdkMsU0FBT0EsV0FBWUEsWUFBWXBMLFVBQWFtTCxLQUFLYixVQUFVdEs7QUFDN0Q7QUFFQSxTQUFTcUwsWUFBWUMsWUFBWUMsWUFBWUosTUFBTTtBQUNqRCxTQUFPLEdBQUdHLFdBQVdFLEVBQUUsSUFBSUQsV0FBV0MsRUFBRSxJQUFJTCxLQUFLYixTQUFTYSxLQUFLOUssSUFBSTtBQUNyRTtBQUVBLFNBQVNvTCxjQUFjOUMsT0FBTztBQUM1QixRQUFNLEVBQUM1SCxLQUFLbUMsS0FBS3dJLFlBQVlDLFdBQVUsSUFBSWhELE1BQU04QyxjQUFhO0FBQzlELFNBQU87SUFDTDFLLEtBQUsySyxhQUFhM0ssTUFBTTZLLE9BQU9DO0lBQy9CM0ksS0FBS3lJLGFBQWF6SSxNQUFNMEksT0FBT0U7RUFDakM7QUFDRjtBQUVBLFNBQVNDLGlCQUFpQkMsUUFBUUMsVUFBVUMsWUFBWTtBQUN0RCxRQUFNQyxXQUFXSCxPQUFPQyxRQUFTLE1BQUtELE9BQU9DLFFBQUFBLElBQVksQ0FBQTtBQUN6RCxTQUFPRSxTQUFTRCxVQUFBQSxNQUFnQkMsU0FBU0QsVUFBQUEsSUFBYyxDQUFBO0FBQ3pEO0FBRUEsU0FBU0Usb0JBQW9COUIsT0FBTytCLFFBQVFDLFVBQVVqTSxNQUFNO0FBQzFELGFBQVc4SyxRQUFRa0IsT0FBT0Usd0JBQXdCbE0sSUFBQUEsRUFBTXlJLFFBQU8sR0FBSTtBQUNqRSxVQUFNVixRQUFRa0MsTUFBTWEsS0FBS2YsS0FBSztBQUM5QixRQUFJLFlBQWFoQyxRQUFRLEtBQU8sQ0FBQ2tFLFlBQVlsRSxRQUFRLEdBQUk7QUFDdkQsYUFBTytDLEtBQUtmOztFQUVoQjtBQUVBLFNBQU87QUFDVDtBQUVBLFNBQVNvQyxhQUFhQyxZQUFZQyxRQUFRO0FBQ3hDLFFBQU0sRUFBQ3hNLE9BQU95TSxhQUFheEIsS0FBQUEsSUFBUXNCO0FBQ25DLFFBQU1ULFNBQVM5TCxNQUFNME0sWUFBWTFNLE1BQU0wTSxVQUFVLENBQUE7QUFDakQsUUFBTSxFQUFDQyxRQUFRUixRQUFRakMsT0FBT00sYUFBQUEsSUFBZ0JTO0FBQzlDLFFBQU0yQixRQUFRRCxPQUFPRTtBQUNyQixRQUFNQyxRQUFRWCxPQUFPVTtBQUNyQixRQUFNNUYsTUFBTWtFLFlBQVl3QixRQUFRUixRQUFRbEIsSUFBQUE7QUFDeEMsUUFBTWhCLE9BQU91QyxPQUFPL0s7QUFDcEIsTUFBSTJJO0FBRUosV0FBUzFJLElBQUksR0FBR0EsSUFBSXVJLE1BQU0sRUFBRXZJLEdBQUc7QUFDN0IsVUFBTUUsT0FBTzRLLE9BQU85SyxDQUFFO0FBQ3RCLFVBQU0sRUFBQyxDQUFDa0wsS0FBQUEsR0FBUTFDLE9BQU8sQ0FBQzRDLEtBQU0sR0FBRTVFLE1BQUssSUFBSXRHO0FBQ3pDLFVBQU1tTCxhQUFhbkwsS0FBSzhLLFlBQVk5SyxLQUFLOEssVUFBVSxDQUFBO0FBQ25EdEMsWUFBUTJDLFdBQVdELEtBQUFBLElBQVNqQixpQkFBaUJDLFFBQVE3RSxLQUFLaUQsS0FBQUE7QUFDMURFLFVBQU1JLFlBQUFBLElBQWdCdEM7QUFFdEJrQyxVQUFNNEMsT0FBT2Qsb0JBQW9COUIsT0FBTytCLFFBQVEsTUFBTWxCLEtBQUs5SyxJQUFJO0FBQy9EaUssVUFBTTZDLFVBQVVmLG9CQUFvQjlCLE9BQU8rQixRQUFRLE9BQU9sQixLQUFLOUssSUFBSTtBQUVuRSxVQUFNK00sZUFBZTlDLE1BQU0rQyxrQkFBa0IvQyxNQUFNK0MsZ0JBQWdCLENBQUE7QUFDbkVELGlCQUFhMUMsWUFBQUEsSUFBZ0J0QztFQUMvQjtBQUNGO0FBRUEsU0FBU2tGLGdCQUFnQnBOLE9BQU82TSxNQUFNO0FBQ3BDLFFBQU1RLFNBQVNyTixNQUFNcU47QUFDckIsU0FBTzFHLE9BQU9DLEtBQUt5RyxNQUFBQSxFQUFRQyxPQUFPckcsQ0FBQUEsUUFBT29HLE9BQU9wRyxHQUFJLEVBQUM0RixTQUFTQSxJQUFBQSxFQUFNVSxNQUFLO0FBQzNFO0FBRUEsU0FBU0MscUJBQXFCQyxRQUFRdkQsT0FBTztBQUMzQyxTQUFPd0QsY0FBY0QsUUFDbkI7SUFDRWhJLFFBQVE7SUFDUmtJLFNBQVM3TjtJQUNUMEssY0FBY047SUFDZEE7SUFDQUssTUFBTTtJQUNOcEssTUFBTTtFQUNSLENBQUE7QUFFSjtBQUVBLFNBQVN5TixrQkFBa0JILFFBQVF2RCxPQUFPMkQsU0FBUztBQUNqRCxTQUFPSCxjQUFjRCxRQUFRO0lBQzNCaEksUUFBUTtJQUNScUksV0FBVzVEO0lBQ1hzQyxRQUFRMU07SUFDUmlPLEtBQUtqTztJQUNMK047SUFDQTNEO0lBQ0FLLE1BQU07SUFDTnBLLE1BQU07RUFDUixDQUFBO0FBQ0Y7QUFFQSxTQUFTNk4sWUFBWS9DLE1BQU16SixPQUFPO0FBRWhDLFFBQU1nSixlQUFlUyxLQUFLc0IsV0FBV3JDO0FBQ3JDLFFBQU0yQyxPQUFPNUIsS0FBS2tCLFVBQVVsQixLQUFLa0IsT0FBT1U7QUFDeEMsTUFBSSxDQUFDQSxNQUFNO0FBQ1Q7O0FBR0ZyTCxVQUFRQSxTQUFTeUosS0FBS2dEO0FBQ3RCLGFBQVd6QixVQUFVaEwsT0FBTztBQUMxQixVQUFNc0ssU0FBU1UsT0FBT0U7QUFDdEIsUUFBSSxDQUFDWixVQUFVQSxPQUFPZSxJQUFLLE1BQUsvTSxVQUFhZ00sT0FBT2UsSUFBQUEsRUFBTXJDLFlBQUFBLE1BQWtCMUssUUFBVztBQUNyRjs7QUFFRixXQUFPZ00sT0FBT2UsSUFBSyxFQUFDckMsWUFBYTtBQUNqQyxRQUFJc0IsT0FBT2UsSUFBSyxFQUFDTSxrQkFBa0JyTixVQUFhZ00sT0FBT2UsSUFBQUEsRUFBTU0sY0FBYzNDLFlBQUFBLE1BQWtCMUssUUFBVztBQUN0RyxhQUFPZ00sT0FBT2UsSUFBQUEsRUFBTU0sY0FBYzNDLFlBQWE7O0VBRW5EO0FBQ0Y7QUFFQSxJQUFNMEQscUJBQXFCLENBQUMzRCxTQUFTQSxTQUFTLFdBQVdBLFNBQVM7QUFDbEUsSUFBTTRELG1CQUFtQixDQUFDQyxRQUFRQyxXQUFXQSxTQUFTRCxTQUFTekgsT0FBT3lCLE9BQU8sQ0FBQSxHQUFJZ0csTUFBTztBQUN4RixJQUFNRSxjQUFjLENBQUNDLFVBQVV0RCxNQUFNakwsVUFBVXVPLFlBQVksQ0FBQ3RELEtBQUt1RCxVQUFVdkQsS0FBS3dELFlBQzNFO0VBQUM3SCxNQUFNaUQsd0JBQXdCN0osT0FBTyxJQUFJO0VBQUdzSCxRQUFRO0FBQUk7QUFFL0MsSUFBTW9ILG9CQUFOLE1BQU1BO0VBcUJuQmxQLFlBQVlRLE9BQU93SyxjQUFjO0FBQy9CLFNBQUt4SyxRQUFRQTtBQUNiLFNBQUsyTyxPQUFPM08sTUFBTTRPO0FBQ2xCLFNBQUsxRSxRQUFRTTtBQUNiLFNBQUtxRSxrQkFBa0IsQ0FBQTtBQUN2QixTQUFLcEMsY0FBYyxLQUFLcUMsUUFBTztBQUMvQixTQUFLQyxRQUFRLEtBQUt0QyxZQUFZdE07QUFDOUIsU0FBS3FILFVBQVUxSDtBQUVmLFNBQUtrUCxXQUFXO0FBQ2hCLFNBQUtDLFFBQVFuUDtBQUNiLFNBQUtvUCxjQUFjcFA7QUFDbkIsU0FBS3FQLGlCQUFpQnJQO0FBQ3RCLFNBQUtzUCxhQUFhdFA7QUFDbEIsU0FBS3VQLGFBQWF2UDtBQUNsQixTQUFLd1Asc0JBQXNCO0FBQzNCLFNBQUtDLHFCQUFxQjtBQUMxQixTQUFLQyxXQUFXMVA7QUFDaEIsU0FBSzJQLFlBQVksQ0FBQTtBQUNqQixTQUFLQyxxQkFBcUIsV0FBV0E7QUFDckMsU0FBS0Msa0JBQWtCLFdBQVdBO0FBRWxDLFNBQUtDLFdBQVU7RUFDakI7RUFFQUEsYUFBYTtBQUNYLFVBQU0zRSxPQUFPLEtBQUt3QjtBQUNsQixTQUFLakcsVUFBUztBQUNkLFNBQUtxSixXQUFVO0FBQ2Y1RSxTQUFLd0QsV0FBV3pELFVBQVVDLEtBQUtrQixRQUFRbEIsSUFBQUE7QUFDdkMsU0FBSzZFLFlBQVc7QUFFaEIsUUFBSSxLQUFLdEksUUFBUXVJLFFBQVEsQ0FBQyxLQUFLL1AsTUFBTWdRLGdCQUFnQixRQUFXLEdBQUE7QUFDOURDLGNBQVFDLEtBQUssb0tBQUE7O0VBRWpCO0VBRUFDLFlBQVkzRixjQUFjO0FBQ3hCLFFBQUksS0FBS04sVUFBVU0sY0FBYztBQUMvQndELGtCQUFZLEtBQUt2QixXQUFXOztBQUU5QixTQUFLdkMsUUFBUU07RUFDZjtFQUVBcUYsYUFBYTtBQUNYLFVBQU03UCxRQUFRLEtBQUtBO0FBQ25CLFVBQU1pTCxPQUFPLEtBQUt3QjtBQUNsQixVQUFNa0IsVUFBVSxLQUFLeUMsV0FBVTtBQUUvQixVQUFNQyxXQUFXLENBQUN4RCxNQUFNNUQsR0FBR0MsR0FBR08sTUFBTW9ELFNBQVMsTUFBTTVELElBQUk0RCxTQUFTLE1BQU1wRCxJQUFJUDtBQUUxRSxVQUFNb0gsTUFBTXJGLEtBQUtzRixVQUFVQyxlQUFlN0MsUUFBUTRDLFNBQVNuRCxnQkFBZ0JwTixPQUFPLEdBQUEsQ0FBQTtBQUNsRixVQUFNeVEsTUFBTXhGLEtBQUt5RixVQUFVRixlQUFlN0MsUUFBUStDLFNBQVN0RCxnQkFBZ0JwTixPQUFPLEdBQUEsQ0FBQTtBQUNsRixVQUFNMlEsTUFBTTFGLEtBQUsyRixVQUFVSixlQUFlN0MsUUFBUWlELFNBQVN4RCxnQkFBZ0JwTixPQUFPLEdBQUEsQ0FBQTtBQUNsRixVQUFNNlEsWUFBWTVGLEtBQUs0RjtBQUN2QixVQUFNQyxNQUFNN0YsS0FBSzhGLFVBQVVWLFNBQVNRLFdBQVdQLEtBQUtHLEtBQUtFLEdBQUFBO0FBQ3pELFVBQU1LLE1BQU0vRixLQUFLZ0csVUFBVVosU0FBU1EsV0FBV0osS0FBS0gsS0FBS0ssR0FBQUE7QUFDekQxRixTQUFLbEMsU0FBUyxLQUFLbUksY0FBY1osR0FBQUE7QUFDakNyRixTQUFLakMsU0FBUyxLQUFLa0ksY0FBY1QsR0FBQUE7QUFDakN4RixTQUFLa0csU0FBUyxLQUFLRCxjQUFjUCxHQUFBQTtBQUNqQzFGLFNBQUswQixTQUFTLEtBQUt1RSxjQUFjSixHQUFBQTtBQUNqQzdGLFNBQUtrQixTQUFTLEtBQUsrRSxjQUFjRixHQUFBQTtFQUNuQztFQUVBWixhQUFhO0FBQ1gsV0FBTyxLQUFLcFEsTUFBTTZLLEtBQUt1RyxTQUFTLEtBQUtsSCxLQUFLO0VBQzVDO0VBRUE0RSxVQUFVO0FBQ1IsV0FBTyxLQUFLOU8sTUFBTXFSLGVBQWUsS0FBS25ILEtBQUs7RUFDN0M7RUFNQWdILGNBQWNJLFNBQVM7QUFDckIsV0FBTyxLQUFLdFIsTUFBTXFOLE9BQU9pRSxPQUFRO0VBQ25DO0VBS0FDLGVBQWU5SSxPQUFPO0FBQ3BCLFVBQU13QyxPQUFPLEtBQUt3QjtBQUNsQixXQUFPaEUsVUFBVXdDLEtBQUswQixTQUNsQjFCLEtBQUtrQixTQUNMbEIsS0FBSzBCO0VBQ1g7RUFFQTZFLFFBQVE7QUFDTixTQUFLclEsUUFBUSxPQUFBO0VBQ2Y7RUFLQXNRLFdBQVc7QUFDVCxVQUFNeEcsT0FBTyxLQUFLd0I7QUFDbEIsUUFBSSxLQUFLd0MsT0FBTztBQUNkeUMsMEJBQW9CLEtBQUt6QyxPQUFPLElBQUk7O0FBRXRDLFFBQUloRSxLQUFLd0QsVUFBVTtBQUNqQlQsa0JBQVkvQyxJQUFBQTs7RUFFaEI7RUFLQTBHLGFBQWE7QUFDWCxVQUFNaEUsVUFBVSxLQUFLeUMsV0FBVTtBQUMvQixVQUFNdkYsT0FBTzhDLFFBQVE5QyxTQUFTOEMsUUFBUTlDLE9BQU8sQ0FBQTtBQUM3QyxVQUFNb0UsUUFBUSxLQUFLQTtBQU1uQixRQUFJeEksU0FBU29FLElBQU8sR0FBQTtBQUNsQixXQUFLb0UsUUFBUXJFLHlCQUF5QkMsSUFBQUE7ZUFDN0JvRSxVQUFVcEUsTUFBTTtBQUN6QixVQUFJb0UsT0FBTztBQUVUeUMsNEJBQW9CekMsT0FBTyxJQUFJO0FBRS9CLGNBQU1oRSxPQUFPLEtBQUt3QjtBQUNsQnVCLG9CQUFZL0MsSUFBQUE7QUFDWkEsYUFBS2dELFVBQVUsQ0FBQTs7QUFFakIsVUFBSXBELFFBQVFsRSxPQUFPaUwsYUFBYS9HLElBQU8sR0FBQTtBQUNyQ2dILDBCQUFrQmhILE1BQU0sSUFBSTs7QUFFOUIsV0FBSzRFLFlBQVksQ0FBQTtBQUNqQixXQUFLUixRQUFRcEU7O0VBRWpCO0VBRUFpRixjQUFjO0FBQ1osVUFBTTdFLE9BQU8sS0FBS3dCO0FBRWxCLFNBQUtrRixXQUFVO0FBRWYsUUFBSSxLQUFLakMsb0JBQW9CO0FBQzNCekUsV0FBSzBDLFVBQVUsSUFBSSxLQUFLK0IsbUJBQWtCOztFQUU5QztFQUVBb0Msc0JBQXNCQyxrQkFBa0I7QUFDdEMsVUFBTTlHLE9BQU8sS0FBS3dCO0FBQ2xCLFVBQU1rQixVQUFVLEtBQUt5QyxXQUFVO0FBQy9CLFFBQUk0QixlQUFlO0FBRW5CLFNBQUtMLFdBQVU7QUFHZixVQUFNTSxhQUFhaEgsS0FBS3dEO0FBQ3hCeEQsU0FBS3dELFdBQVd6RCxVQUFVQyxLQUFLa0IsUUFBUWxCLElBQUFBO0FBR3ZDLFFBQUlBLEtBQUtiLFVBQVV1RCxRQUFRdkQsT0FBTztBQUNoQzRILHFCQUFlO0FBRWZoRSxrQkFBWS9DLElBQUFBO0FBQ1pBLFdBQUtiLFFBQVF1RCxRQUFRdkQ7O0FBS3ZCLFNBQUs4SCxnQkFBZ0JILGdCQUFBQTtBQUdyQixRQUFJQyxnQkFBZ0JDLGVBQWVoSCxLQUFLd0QsVUFBVTtBQUNoRG5DLG1CQUFhLE1BQU1yQixLQUFLZ0QsT0FBTzs7RUFFbkM7RUFNQXpILFlBQVk7QUFDVixVQUFNSCxTQUFTLEtBQUtyRyxNQUFNcUc7QUFDMUIsVUFBTThMLFlBQVk5TCxPQUFPK0wsaUJBQWlCLEtBQUtyRCxLQUFLO0FBQ3BELFVBQU1zRCxTQUFTaE0sT0FBT2lNLGdCQUFnQixLQUFLbEMsV0FBVSxHQUFJK0IsV0FBVyxJQUFJO0FBQ3hFLFNBQUszSyxVQUFVbkIsT0FBT2tNLGVBQWVGLFFBQVEsS0FBS0csV0FBVSxDQUFBO0FBQzVELFNBQUt4RCxXQUFXLEtBQUt4SCxRQUFRaUw7QUFDN0IsU0FBSzVELGtCQUFrQixDQUFBO0VBQ3pCO0VBTUE2RCxNQUFNNVIsT0FBTzZSLE9BQU87QUFDbEIsVUFBTSxFQUFDbEcsYUFBYXhCLE1BQU1nRSxPQUFPcEUsS0FBSSxJQUFJO0FBQ3pDLFVBQU0sRUFBQzhCLFFBQVE4QixTQUFBQSxJQUFZeEQ7QUFDM0IsVUFBTTJCLFFBQVFELE9BQU9FO0FBRXJCLFFBQUkrRixTQUFTOVIsVUFBVSxLQUFLNlIsVUFBVTlILEtBQUtwSixTQUFTLE9BQU93SixLQUFLNEg7QUFDaEUsUUFBSUMsT0FBT2hTLFFBQVEsS0FBS21LLEtBQUtnRCxRQUFRbk4sUUFBUSxDQUFFO0FBQy9DLFFBQUlZLEdBQUdxQixLQUFLeUo7QUFFWixRQUFJLEtBQUt3QyxhQUFhLE9BQU87QUFDM0IvRCxXQUFLZ0QsVUFBVXBEO0FBQ2ZJLFdBQUs0SCxVQUFVO0FBQ2ZyRyxlQUFTM0I7V0FDSjtBQUNMLFVBQUkxRCxRQUFRMEQsS0FBSy9KLEtBQUFBLENBQU0sR0FBRztBQUN4QjBMLGlCQUFTLEtBQUt1RyxlQUFlOUgsTUFBTUosTUFBTS9KLE9BQU82UixLQUFBQTtNQUNsRCxXQUFXbE0sU0FBU29FLEtBQUsvSixLQUFBQSxDQUFNLEdBQUc7QUFDaEMwTCxpQkFBUyxLQUFLd0csZ0JBQWdCL0gsTUFBTUosTUFBTS9KLE9BQU82UixLQUFBQTthQUM1QztBQUNMbkcsaUJBQVMsS0FBS3lHLG1CQUFtQmhJLE1BQU1KLE1BQU0vSixPQUFPNlIsS0FBQUE7O0FBR3RELFlBQU1PLDZCQUE2QixNQUFNblEsSUFBSTZKLEtBQUFBLE1BQVcsUUFBU2tHLFFBQVEvUCxJQUFJNkosS0FBQUEsSUFBU2tHLEtBQUtsRyxLQUFNO0FBQ2pHLFdBQUtsTCxJQUFJLEdBQUdBLElBQUlpUixPQUFPLEVBQUVqUixHQUFHO0FBQzFCdUosYUFBS2dELFFBQVF2TSxJQUFJWixLQUFBQSxJQUFTaUMsTUFBTXlKLE9BQU85SyxDQUFFO0FBQ3pDLFlBQUlrUixRQUFRO0FBQ1YsY0FBSU0sMkJBQThCLEdBQUE7QUFDaENOLHFCQUFTOztBQUVYRSxpQkFBTy9QOztNQUVYO0FBQ0FrSSxXQUFLNEgsVUFBVUQ7O0FBR2pCLFFBQUluRSxVQUFVO0FBQ1puQyxtQkFBYSxNQUFNRSxNQUFBQTs7RUFFdkI7RUFhQXlHLG1CQUFtQmhJLE1BQU1KLE1BQU0vSixPQUFPNlIsT0FBTztBQUMzQyxVQUFNLEVBQUNoRyxRQUFRUixPQUFBQSxJQUFVbEI7QUFDekIsVUFBTTJCLFFBQVFELE9BQU9FO0FBQ3JCLFVBQU1DLFFBQVFYLE9BQU9VO0FBQ3JCLFVBQU1zRyxTQUFTeEcsT0FBT3lHLFVBQVM7QUFDL0IsVUFBTUMsY0FBYzFHLFdBQVdSO0FBQy9CLFVBQU1LLFNBQVMsSUFBSXpCLE1BQU00SCxLQUFBQTtBQUN6QixRQUFJalIsR0FBR3VJLE1BQU1DO0FBRWIsU0FBS3hJLElBQUksR0FBR3VJLE9BQU8wSSxPQUFPalIsSUFBSXVJLE1BQU0sRUFBRXZJLEdBQUc7QUFDdkN3SSxjQUFReEksSUFBSVo7QUFDWjBMLGFBQU85SyxDQUFBQSxJQUFLO1FBQ1YsQ0FBQ2tMLEtBQUFBLEdBQVF5RyxlQUFlMUcsT0FBTytGLE1BQU1TLE9BQU9qSixLQUFBQSxHQUFRQSxLQUFBQTtRQUNwRCxDQUFDNEMsS0FBQUEsR0FBUVgsT0FBT3VHLE1BQU03SCxLQUFLWCxLQUFBQSxHQUFRQSxLQUFBQTtNQUNyQztJQUNGO0FBQ0EsV0FBT3NDO0VBQ1Q7RUFhQXVHLGVBQWU5SCxNQUFNSixNQUFNL0osT0FBTzZSLE9BQU87QUFDdkMsVUFBTSxFQUFDNUosUUFBUUMsT0FBQUEsSUFBVWlDO0FBQ3pCLFVBQU11QixTQUFTLElBQUl6QixNQUFNNEgsS0FBQUE7QUFDekIsUUFBSWpSLEdBQUd1SSxNQUFNQyxPQUFPdEk7QUFFcEIsU0FBS0YsSUFBSSxHQUFHdUksT0FBTzBJLE9BQU9qUixJQUFJdUksTUFBTSxFQUFFdkksR0FBRztBQUN2Q3dJLGNBQVF4SSxJQUFJWjtBQUNaYyxhQUFPaUosS0FBS1gsS0FBTTtBQUNsQnNDLGFBQU85SyxDQUFBQSxJQUFLO1FBQ1Z1SCxHQUFHRixPQUFPMkosTUFBTTlRLEtBQUssQ0FBQSxHQUFJc0ksS0FBQUE7UUFDekJoQixHQUFHRixPQUFPMEosTUFBTTlRLEtBQUssQ0FBQSxHQUFJc0ksS0FBQUE7TUFDM0I7SUFDRjtBQUNBLFdBQU9zQztFQUNUO0VBYUF3RyxnQkFBZ0IvSCxNQUFNSixNQUFNL0osT0FBTzZSLE9BQU87QUFDeEMsVUFBTSxFQUFDNUosUUFBUUMsT0FBQUEsSUFBVWlDO0FBQ3pCLFVBQU0sRUFBQ3FJLFdBQVcsS0FBS0MsV0FBVyxJQUFBLElBQU8sS0FBS3ZFO0FBQzlDLFVBQU14QyxTQUFTLElBQUl6QixNQUFNNEgsS0FBQUE7QUFDekIsUUFBSWpSLEdBQUd1SSxNQUFNQyxPQUFPdEk7QUFFcEIsU0FBS0YsSUFBSSxHQUFHdUksT0FBTzBJLE9BQU9qUixJQUFJdUksTUFBTSxFQUFFdkksR0FBRztBQUN2Q3dJLGNBQVF4SSxJQUFJWjtBQUNaYyxhQUFPaUosS0FBS1gsS0FBTTtBQUNsQnNDLGFBQU85SyxDQUFBQSxJQUFLO1FBQ1Z1SCxHQUFHRixPQUFPMkosTUFBTWMsaUJBQWlCNVIsTUFBTTBSLFFBQVdwSixHQUFBQSxLQUFBQTtRQUNsRGhCLEdBQUdGLE9BQU8wSixNQUFNYyxpQkFBaUI1UixNQUFNMlIsUUFBV3JKLEdBQUFBLEtBQUFBO01BQ3BEO0lBQ0Y7QUFDQSxXQUFPc0M7RUFDVDtFQUtBaUgsVUFBVXZKLE9BQU87QUFDZixXQUFPLEtBQUt1QyxZQUFZd0IsUUFBUS9ELEtBQU07RUFDeEM7RUFLQXdKLGVBQWV4SixPQUFPO0FBQ3BCLFdBQU8sS0FBS3VDLFlBQVk1QixLQUFLWCxLQUFNO0VBQ3JDO0VBS0FDLFdBQVcxQixPQUFPK0QsUUFBUWpDLE1BQU07QUFDOUIsVUFBTXZLLFFBQVEsS0FBS0E7QUFDbkIsVUFBTWlMLE9BQU8sS0FBS3dCO0FBQ2xCLFVBQU12RSxRQUFRc0UsT0FBTy9ELE1BQU1vRSxJQUFJO0FBQy9CLFVBQU16QyxRQUFRO01BQ1p4RCxNQUFNaUQsd0JBQXdCN0osT0FBTyxJQUFJO01BQ3pDc0gsUUFBUWtGLE9BQU9FLFFBQVFqRSxNQUFNb0UsSUFBSSxFQUFFTTtJQUNyQztBQUNBLFdBQU9oRCxXQUFXQyxPQUFPbEMsT0FBTytDLEtBQUtmLE9BQU87TUFBQ0s7SUFBSSxDQUFBO0VBQ25EO0VBS0FvSixzQkFBc0JDLE9BQU9uTCxPQUFPK0QsUUFBUXBDLE9BQU87QUFDakQsVUFBTXlKLGNBQWNySCxPQUFPL0QsTUFBTW9FLElBQUk7QUFDckMsUUFBSTNFLFFBQVEyTCxnQkFBZ0IsT0FBT0MsTUFBTUQ7QUFDekMsVUFBTXZNLFNBQVM4QyxTQUFTb0MsT0FBT0UsUUFBUWpFLE1BQU1vRSxJQUFJO0FBQ2pELFFBQUl6QyxTQUFTOUMsUUFBUTtBQUNuQjhDLFlBQU05QyxTQUFTQTtBQUNmWSxjQUFRaUMsV0FBV0MsT0FBT3lKLGFBQWEsS0FBS3BILFlBQVl2QyxLQUFLOztBQUUvRDBKLFVBQU0vUyxNQUFNRCxLQUFLQyxJQUFJK1MsTUFBTS9TLEtBQUtxSCxLQUFBQTtBQUNoQzBMLFVBQU01USxNQUFNcEMsS0FBS29DLElBQUk0USxNQUFNNVEsS0FBS2tGLEtBQUFBO0VBQ2xDO0VBS0E2TCxVQUFVdEwsT0FBTzhGLFVBQVU7QUFDekIsVUFBTXRELE9BQU8sS0FBS3dCO0FBQ2xCLFVBQU13QixVQUFVaEQsS0FBS2dEO0FBQ3JCLFVBQU0yRSxTQUFTM0gsS0FBSzRILFdBQVdwSyxVQUFVd0MsS0FBSzBCO0FBQzlDLFVBQU0xQyxPQUFPZ0UsUUFBUXhNO0FBQ3JCLFVBQU11UyxhQUFhLEtBQUt6QyxlQUFlOUksS0FBQUE7QUFDdkMsVUFBTTJCLFFBQVFrRSxZQUFZQyxVQUFVdEQsTUFBTSxLQUFLakwsS0FBSztBQUNwRCxVQUFNNFQsUUFBUTtNQUFDL1MsS0FBSzZLLE9BQU9FO01BQW1CNUksS0FBSzBJLE9BQU9DO0lBQWlCO0FBQzNFLFVBQU0sRUFBQzlLLEtBQUtvVCxVQUFValIsS0FBS2tSLFNBQVEsSUFBSTNJLGNBQWN5SSxVQUFBQTtBQUNyRCxRQUFJdFMsR0FBRzhLO0FBRVAsYUFBUzJILFFBQVE7QUFDZjNILGVBQVN5QixRQUFRdk0sQ0FBRTtBQUNuQixZQUFNK0ksYUFBYStCLE9BQU93SCxXQUFXbkgsSUFBSTtBQUN6QyxhQUFPLENBQUNuQyxlQUFTOEIsT0FBTy9ELE1BQU1vRSxJQUFJLENBQUMsS0FBS29ILFdBQVd4SixjQUFjeUosV0FBV3pKO0lBQzlFO0FBRUEsU0FBSy9JLElBQUksR0FBR0EsSUFBSXVJLE1BQU0sRUFBRXZJLEdBQUc7QUFDekIsVUFBSXlTLE1BQVMsR0FBQTtBQUNYOztBQUVGLFdBQUtSLHNCQUFzQkMsT0FBT25MLE9BQU8rRCxRQUFRcEMsS0FBQUE7QUFDakQsVUFBSXdJLFFBQVE7QUFFVjs7SUFFSjtBQUNBLFFBQUlBLFFBQVE7QUFFVixXQUFLbFIsSUFBSXVJLE9BQU8sR0FBR3ZJLEtBQUssR0FBRyxFQUFFQSxHQUFHO0FBQzlCLFlBQUl5UyxNQUFTLEdBQUE7QUFDWDs7QUFFRixhQUFLUixzQkFBc0JDLE9BQU9uTCxPQUFPK0QsUUFBUXBDLEtBQUFBO0FBQ2pEO01BQ0Y7O0FBRUYsV0FBT3dKO0VBQ1Q7RUFFQVEsbUJBQW1CM0wsT0FBTztBQUN4QixVQUFNK0QsU0FBUyxLQUFLQyxZQUFZd0I7QUFDaEMsVUFBTTNHLFNBQVMsQ0FBQTtBQUNmLFFBQUk1RixHQUFHdUksTUFBTS9CO0FBRWIsU0FBS3hHLElBQUksR0FBR3VJLE9BQU91QyxPQUFPL0ssUUFBUUMsSUFBSXVJLE1BQU0sRUFBRXZJLEdBQUc7QUFDL0N3RyxjQUFRc0UsT0FBTzlLLENBQUFBLEVBQUcrRyxNQUFNb0UsSUFBSTtBQUM1QixVQUFJbkMsZUFBU3hDLEtBQVEsR0FBQTtBQUNuQlosZUFBTzVFLEtBQUt3RixLQUFBQTs7SUFFaEI7QUFDQSxXQUFPWjtFQUNUO0VBTUErTSxpQkFBaUI7QUFDZixXQUFPO0VBQ1Q7RUFLQUMsaUJBQWlCcEssT0FBTztBQUN0QixVQUFNZSxPQUFPLEtBQUt3QjtBQUNsQixVQUFNRSxTQUFTMUIsS0FBSzBCO0FBQ3BCLFVBQU1SLFNBQVNsQixLQUFLa0I7QUFDcEIsVUFBTUssU0FBUyxLQUFLaUgsVUFBVXZKLEtBQUFBO0FBQzlCLFdBQU87TUFDTHFLLE9BQU81SCxTQUFTLEtBQUtBLE9BQU82SCxpQkFBaUJoSSxPQUFPRyxPQUFPRSxJQUFJLENBQUMsSUFBSTtNQUNwRTNFLE9BQU9pRSxTQUFTLEtBQUtBLE9BQU9xSSxpQkFBaUJoSSxPQUFPTCxPQUFPVSxJQUFJLENBQUMsSUFBSTtJQUN0RTtFQUNGO0VBS0ExTCxRQUFRb0osTUFBTTtBQUNaLFVBQU1VLE9BQU8sS0FBS3dCO0FBQ2xCLFNBQUsvRyxPQUFPNkUsUUFBUSxTQUFBO0FBQ3BCVSxTQUFLd0osUUFBUWxMLE9BQU9pSCxlQUFlLEtBQUtoSixRQUFRa04sTUFBTTVMLFlBQVltQyxLQUFLbEMsUUFBUWtDLEtBQUtqQyxRQUFRLEtBQUtxTCxlQUFjLENBQUEsQ0FBQSxDQUFBO0VBQ2pIO0VBS0EzTyxPQUFPNkUsTUFBTTtFQUFBO0VBRWI1SSxPQUFPO0FBQ0wsVUFBTWlOLE1BQU0sS0FBS0Q7QUFDakIsVUFBTTNPLFFBQVEsS0FBS0E7QUFDbkIsVUFBTWlMLE9BQU8sS0FBS3dCO0FBQ2xCLFVBQU1rSSxXQUFXMUosS0FBS0osUUFBUSxDQUFBO0FBQzlCLFVBQU0rSixPQUFPNVUsTUFBTTZVO0FBQ25CLFVBQU1wUCxTQUFTLENBQUE7QUFDZixVQUFNM0UsUUFBUSxLQUFLc08sY0FBYztBQUNqQyxVQUFNdUQsUUFBUSxLQUFLdEQsY0FBZXNGLFNBQVNsVCxTQUFTWDtBQUNwRCxVQUFNZ1UsMEJBQTBCLEtBQUt0TixRQUFRc047QUFDN0MsUUFBSXBUO0FBRUosUUFBSXVKLEtBQUswQyxTQUFTO0FBQ2hCMUMsV0FBSzBDLFFBQVFoTSxLQUFLaU4sS0FBS2dHLE1BQU05VCxPQUFPNlIsS0FBQUE7O0FBR3RDLFNBQUtqUixJQUFJWixPQUFPWSxJQUFJWixRQUFRNlIsT0FBTyxFQUFFalIsR0FBRztBQUN0QyxZQUFNbU0sVUFBVThHLFNBQVNqVCxDQUFFO0FBQzNCLFVBQUltTSxRQUFRVyxRQUFRO0FBQ2xCOztBQUVGLFVBQUlYLFFBQVFwSSxVQUFVcVAseUJBQXlCO0FBQzdDclAsZUFBTy9DLEtBQUttTCxPQUFBQTthQUNQO0FBQ0xBLGdCQUFRbE0sS0FBS2lOLEtBQUtnRyxJQUFBQTs7SUFFdEI7QUFFQSxTQUFLbFQsSUFBSSxHQUFHQSxJQUFJK0QsT0FBT2hFLFFBQVEsRUFBRUMsR0FBRztBQUNsQytELGFBQU8vRCxDQUFBQSxFQUFHQyxLQUFLaU4sS0FBS2dHLElBQUFBO0lBQ3RCO0VBQ0Y7RUFTQUcsU0FBUzdLLE9BQU96RSxRQUFRO0FBQ3RCLFVBQU04RSxPQUFPOUUsU0FBUyxXQUFXO0FBQ2pDLFdBQU95RSxVQUFVcEssVUFBYSxLQUFLMk0sWUFBWWtCLFVBQzNDLEtBQUtxSCw2QkFBNkJ6SyxJQUFBQSxJQUNsQyxLQUFLMEssMEJBQTBCL0ssU0FBUyxHQUFHSyxJQUFLO0VBQ3REO0VBS0FpSSxXQUFXdEksT0FBT3pFLFFBQVE4RSxNQUFNO0FBQzlCLFVBQU1vRCxVQUFVLEtBQUt5QyxXQUFVO0FBQy9CLFFBQUk4RTtBQUNKLFFBQUloTCxTQUFTLEtBQUtBLFFBQVEsS0FBS3VDLFlBQVk1QixLQUFLcEosUUFBUTtBQUN0RCxZQUFNb00sVUFBVSxLQUFLcEIsWUFBWTVCLEtBQUtYLEtBQU07QUFDNUNnTCxnQkFBVXJILFFBQVEyQixhQUNmM0IsUUFBUTJCLFdBQVc1QixrQkFBa0IsS0FBSzRFLFdBQVUsR0FBSXRJLE9BQU8yRCxPQUFPO0FBQ3pFcUgsY0FBUTFJLFNBQVMsS0FBS2lILFVBQVV2SixLQUFBQTtBQUNoQ2dMLGNBQVFuSCxNQUFNSixRQUFROUMsS0FBS1gsS0FBTTtBQUNqQ2dMLGNBQVFoTCxRQUFRZ0wsUUFBUXBILFlBQVk1RDtXQUMvQjtBQUNMZ0wsZ0JBQVUsS0FBSzFGLGFBQ1osS0FBS0EsV0FBV2hDLHFCQUFxQixLQUFLeE4sTUFBTXdTLFdBQVUsR0FBSSxLQUFLdEksS0FBSztBQUMzRWdMLGNBQVF2SCxVQUFVQTtBQUNsQnVILGNBQVFoTCxRQUFRZ0wsUUFBUTFLLGVBQWUsS0FBS047O0FBRzlDZ0wsWUFBUXpQLFNBQVMsQ0FBQyxDQUFDQTtBQUNuQnlQLFlBQVEzSyxPQUFPQTtBQUNmLFdBQU8ySztFQUNUO0VBTUFGLDZCQUE2QnpLLE1BQU07QUFDakMsV0FBTyxLQUFLNEssdUJBQXVCLEtBQUt6RixtQkFBbUJwRSxJQUFJZixJQUFBQTtFQUNqRTtFQU9BMEssMEJBQTBCL0ssT0FBT0ssTUFBTTtBQUNyQyxXQUFPLEtBQUs0Syx1QkFBdUIsS0FBS3hGLGdCQUFnQnJFLElBQUlmLE1BQU1MLEtBQUFBO0VBQ3BFO0VBS0FpTCx1QkFBdUJDLGFBQWE3SyxPQUFPLFdBQVdMLE9BQU87QUFDM0QsVUFBTXpFLFNBQVM4RSxTQUFTO0FBQ3hCLFVBQU04SyxRQUFRLEtBQUt4RztBQUNuQixVQUFNeUcsV0FBV0YsY0FBYyxNQUFNN0s7QUFDckMsVUFBTTZELFNBQVNpSCxNQUFNQyxRQUFTO0FBQzlCLFVBQU1DLFVBQVUsS0FBS2pHLHVCQUF1QmtHLFFBQVF0TCxLQUFBQTtBQUNwRCxRQUFJa0UsUUFBUTtBQUNWLGFBQU9ELGlCQUFpQkMsUUFBUW1ILE9BQUFBOztBQUVsQyxVQUFNbFAsU0FBUyxLQUFLckcsTUFBTXFHO0FBQzFCLFVBQU04TCxZQUFZOUwsT0FBT29QLHdCQUF3QixLQUFLMUcsT0FBT3FHLFdBQUFBO0FBQzdELFVBQU1NLFdBQVdqUSxTQUFTO01BQUMsR0FBRzJQLFdBQVk7TUFBUTtNQUFTQTtNQUFhO1FBQU07TUFBQ0E7TUFBYTtJQUFHO0FBQy9GLFVBQU0vQyxTQUFTaE0sT0FBT2lNLGdCQUFnQixLQUFLbEMsV0FBVSxHQUFJK0IsU0FBQUE7QUFDekQsVUFBTXdELFNBQVFoUCxPQUFPQyxLQUFLQyxTQUFTOE4sU0FBU1MsV0FBWSxDQUFBO0FBR3hELFVBQU1GLFVBQVUsTUFBTSxLQUFLMUMsV0FBV3RJLE9BQU96RSxRQUFROEUsSUFBQUE7QUFDckQsVUFBTWpELFNBQVNqQixPQUFPdVAsb0JBQW9CdkQsUUFBUXNELFFBQU9ULFNBQVNRLFFBQUFBO0FBRWxFLFFBQUlwTyxPQUFPTSxTQUFTO0FBR2xCTixhQUFPTSxVQUFVMk47QUFLakJGLFlBQU1DLFFBQVMsSUFBRzNPLE9BQU9rUCxPQUFPMUgsaUJBQWlCN0csUUFBUWlPLE9BQUFBLENBQUFBOztBQUczRCxXQUFPak87RUFDVDtFQU1Bd08sbUJBQW1CNUwsT0FBTzZMLFlBQVl0USxRQUFRO0FBQzVDLFVBQU16RixRQUFRLEtBQUtBO0FBQ25CLFVBQU1xVixRQUFRLEtBQUt4RztBQUNuQixVQUFNeUcsV0FBVyxhQUFhUyxVQUFBQTtBQUM5QixVQUFNM0gsU0FBU2lILE1BQU1DLFFBQVM7QUFDOUIsUUFBSWxILFFBQVE7QUFDVixhQUFPQTs7QUFFVCxRQUFJNUc7QUFDSixRQUFJeEgsTUFBTXdILFFBQVFWLGNBQWMsT0FBTztBQUNyQyxZQUFNVCxTQUFTLEtBQUtyRyxNQUFNcUc7QUFDMUIsWUFBTThMLFlBQVk5TCxPQUFPMlAsMEJBQTBCLEtBQUtqSCxPQUFPZ0gsVUFBQUE7QUFDL0QsWUFBTTFELFNBQVNoTSxPQUFPaU0sZ0JBQWdCLEtBQUtsQyxXQUFVLEdBQUkrQixTQUFBQTtBQUN6RDNLLGdCQUFVbkIsT0FBT2tNLGVBQWVGLFFBQVEsS0FBS0csV0FBV3RJLE9BQU96RSxRQUFRc1EsVUFBQUEsQ0FBQUE7O0FBRXpFLFVBQU1yTyxhQUFhLElBQUl0QixXQUFXcEcsT0FBT3dILFdBQVdBLFFBQVFFLFVBQVU7QUFDdEUsUUFBSUYsV0FBV0EsUUFBUXlPLFlBQVk7QUFDakNaLFlBQU1DLFFBQUFBLElBQVkzTyxPQUFPa1AsT0FBT25PLFVBQUFBOztBQUVsQyxXQUFPQTtFQUNUO0VBTUF3TyxpQkFBaUIxTyxTQUFTO0FBQ3hCLFFBQUksQ0FBQ0EsUUFBUUksU0FBUztBQUNwQjs7QUFFRixXQUFPLEtBQUt1SCxtQkFBbUIsS0FBS0EsaUJBQWlCeEksT0FBT3lCLE9BQU8sQ0FBQSxHQUFJWixPQUFPO0VBQ2hGO0VBTUEyTyxlQUFlNUwsTUFBTTZMLGVBQWU7QUFDbEMsV0FBTyxDQUFDQSxpQkFBaUJsSSxtQkFBbUIzRCxJQUFBQSxLQUFTLEtBQUt2SyxNQUFNcVc7RUFDbEU7RUFLQUMsa0JBQWtCeFYsT0FBT3lKLE1BQU07QUFDN0IsVUFBTWdNLFlBQVksS0FBS3RCLDBCQUEwQm5VLE9BQU95SixJQUFBQTtBQUN4RCxVQUFNaU0sMEJBQTBCLEtBQUtySDtBQUNyQyxVQUFNaUgsZ0JBQWdCLEtBQUtGLGlCQUFpQkssU0FBQUE7QUFDNUMsVUFBTUosaUJBQWlCLEtBQUtBLGVBQWU1TCxNQUFNNkwsYUFBQUEsS0FBbUJBLGtCQUFrQkk7QUFDdEYsU0FBS0Msb0JBQW9CTCxlQUFlN0wsTUFBTWdNLFNBQUFBO0FBQzlDLFdBQU87TUFBQ0g7TUFBZUQ7SUFBYztFQUN2QztFQU1BTyxjQUFjN0ksU0FBUzNELE9BQU85QyxZQUFZbUQsTUFBTTtBQUM5QyxRQUFJMkQsbUJBQW1CM0QsSUFBTyxHQUFBO0FBQzVCNUQsYUFBT3lCLE9BQU95RixTQUFTekcsVUFBQUE7V0FDbEI7QUFDTCxXQUFLME8sbUJBQW1CNUwsT0FBT0ssSUFBTTdFLEVBQUFBLE9BQU9tSSxTQUFTekcsVUFBQUE7O0VBRXpEO0VBTUFxUCxvQkFBb0JMLGVBQWU3TCxNQUFNaEQsWUFBWTtBQUNuRCxRQUFJNk8saUJBQWlCLENBQUNsSSxtQkFBbUIzRCxJQUFPLEdBQUE7QUFDOUMsV0FBS3VMLG1CQUFtQmhXLFFBQVd5SyxJQUFNN0UsRUFBQUEsT0FBTzBRLGVBQWU3TyxVQUFBQTs7RUFFbkU7RUFLQW9QLFVBQVU5SSxTQUFTM0QsT0FBT0ssTUFBTTlFLFFBQVE7QUFDdENvSSxZQUFRcEksU0FBU0E7QUFDakIsVUFBTStCLFVBQVUsS0FBS3VOLFNBQVM3SyxPQUFPekUsTUFBQUE7QUFDckMsU0FBS3FRLG1CQUFtQjVMLE9BQU9LLE1BQU05RSxNQUFRQyxFQUFBQSxPQUFPbUksU0FBUztNQUczRHJHLFNBQVMsQ0FBRS9CLFVBQVUsS0FBS3lRLGlCQUFpQjFPLE9BQWFBLEtBQUFBO0lBQzFELENBQUE7RUFDRjtFQUVBb1AsaUJBQWlCL0ksU0FBU3JELGNBQWNOLE9BQU87QUFDN0MsU0FBS3lNLFVBQVU5SSxTQUFTM0QsT0FBTyxVQUFVLEtBQUs7RUFDaEQ7RUFFQTJNLGNBQWNoSixTQUFTckQsY0FBY04sT0FBTztBQUMxQyxTQUFLeU0sVUFBVTlJLFNBQVMzRCxPQUFPLFVBQVUsSUFBSTtFQUMvQztFQUtBNE0sMkJBQTJCO0FBQ3pCLFVBQU1qSixVQUFVLEtBQUtwQixZQUFZa0I7QUFFakMsUUFBSUUsU0FBUztBQUNYLFdBQUs4SSxVQUFVOUksU0FBUy9OLFFBQVcsVUFBVSxLQUFLOztFQUV0RDtFQUtBaVgsd0JBQXdCO0FBQ3RCLFVBQU1sSixVQUFVLEtBQUtwQixZQUFZa0I7QUFFakMsUUFBSUUsU0FBUztBQUNYLFdBQUs4SSxVQUFVOUksU0FBUy9OLFFBQVcsVUFBVSxJQUFJOztFQUVyRDtFQUtBb1MsZ0JBQWdCSCxrQkFBa0I7QUFDaEMsVUFBTWxILE9BQU8sS0FBS29FO0FBQ2xCLFVBQU0wRixXQUFXLEtBQUtsSSxZQUFZNUI7QUFHbEMsZUFBVyxDQUFDMUUsUUFBUTZRLE1BQU1DLElBQUFBLEtBQVMsS0FBS3hILFdBQVc7QUFDakQsV0FBS3RKLE1BQU8sRUFBQzZRLE1BQU1DLElBQUFBO0lBQ3JCO0FBQ0EsU0FBS3hILFlBQVksQ0FBQTtBQUVqQixVQUFNeUgsVUFBVXZDLFNBQVNsVDtBQUN6QixVQUFNMFYsVUFBVXRNLEtBQUtwSjtBQUNyQixVQUFNa1IsUUFBUS9SLEtBQUtDLElBQUlzVyxTQUFTRCxPQUFBQTtBQUVoQyxRQUFJdkUsT0FBTztBQUtULFdBQUtELE1BQU0sR0FBR0MsS0FBQUE7O0FBR2hCLFFBQUl3RSxVQUFVRCxTQUFTO0FBQ3JCLFdBQUtFLGdCQUFnQkYsU0FBU0MsVUFBVUQsU0FBU25GLGdCQUFBQTtlQUN4Q29GLFVBQVVELFNBQVM7QUFDNUIsV0FBS0csZ0JBQWdCRixTQUFTRCxVQUFVQyxPQUFBQTs7RUFFNUM7RUFLQUMsZ0JBQWdCdFcsT0FBTzZSLE9BQU9aLG1CQUFtQixNQUFNO0FBQ3JELFVBQU05RyxPQUFPLEtBQUt3QjtBQUNsQixVQUFNNUIsT0FBT0ksS0FBS0o7QUFDbEIsVUFBTWhDLE1BQU0vSCxRQUFRNlI7QUFDcEIsUUFBSWpSO0FBRUosVUFBTTRWLE9BQU8sQ0FBQ0MsUUFBUTtBQUNwQkEsVUFBSTlWLFVBQVVrUjtBQUNkLFdBQUtqUixJQUFJNlYsSUFBSTlWLFNBQVMsR0FBR0MsS0FBS21ILEtBQUtuSCxLQUFLO0FBQ3RDNlYsWUFBSTdWLENBQUUsSUFBRzZWLElBQUk3VixJQUFJaVIsS0FBTTtNQUN6QjtJQUNGO0FBQ0EyRSxTQUFLek0sSUFBQUE7QUFFTCxTQUFLbkosSUFBSVosT0FBT1ksSUFBSW1ILEtBQUssRUFBRW5ILEdBQUc7QUFDNUJtSixXQUFLbkosQ0FBRSxJQUFHLElBQUksS0FBS2lPLGdCQUFlO0lBQ3BDO0FBRUEsUUFBSSxLQUFLWCxVQUFVO0FBQ2pCc0ksV0FBS3JNLEtBQUtnRCxPQUFPOztBQUVuQixTQUFLeUUsTUFBTTVSLE9BQU82UixLQUFBQTtBQUVsQixRQUFJWixrQkFBa0I7QUFDcEIsV0FBS3lGLGVBQWUzTSxNQUFNL0osT0FBTzZSLE9BQU8sT0FBQTs7RUFFNUM7RUFFQTZFLGVBQWUzSixTQUFTL00sT0FBTzZSLE9BQU9wSSxNQUFNO0VBQUE7RUFLNUM4TSxnQkFBZ0J2VyxPQUFPNlIsT0FBTztBQUM1QixVQUFNMUgsT0FBTyxLQUFLd0I7QUFDbEIsUUFBSSxLQUFLdUMsVUFBVTtBQUNqQixZQUFNeUksVUFBVXhNLEtBQUtnRCxRQUFReUosT0FBTzVXLE9BQU82UixLQUFBQTtBQUMzQyxVQUFJMUgsS0FBS3dELFVBQVU7QUFDakJULG9CQUFZL0MsTUFBTXdNLE9BQUFBOzs7QUFHdEJ4TSxTQUFLSixLQUFLNk0sT0FBTzVXLE9BQU82UixLQUFBQTtFQUMxQjtFQUtBZ0YsTUFBTUMsTUFBTTtBQUNWLFFBQUksS0FBSzVJLFVBQVU7QUFDakIsV0FBS1MsVUFBVS9NLEtBQUtrVixJQUFBQTtXQUNmO0FBQ0wsWUFBTSxDQUFDelIsUUFBUTZRLE1BQU1DLElBQUFBLElBQVFXO0FBQzdCLFdBQUt6UixNQUFPLEVBQUM2USxNQUFNQyxJQUFBQTs7QUFFckIsU0FBS2pYLE1BQU02WCxhQUFhblYsS0FBSztNQUFDLEtBQUt3SDtNQUFVME4sR0FBQUE7SUFBSyxDQUFBO0VBQ3BEO0VBRUFFLGNBQWM7QUFDWixVQUFNbkYsUUFBUW9GLFVBQVV0VztBQUN4QixTQUFLa1csTUFBTTtNQUFDO01BQW1CLEtBQUt2SCxXQUFVLEVBQUd2RixLQUFLcEosU0FBU2tSO01BQU9BO0lBQU0sQ0FBQTtFQUM5RTtFQUVBcUYsYUFBYTtBQUNYLFNBQUtMLE1BQU07TUFBQztNQUFtQixLQUFLbEwsWUFBWTVCLEtBQUtwSixTQUFTO01BQUc7SUFBRSxDQUFBO0VBQ3JFO0VBRUF3VyxlQUFlO0FBQ2IsU0FBS04sTUFBTTtNQUFDO01BQW1CO01BQUc7SUFBRSxDQUFBO0VBQ3RDO0VBRUFPLGNBQWNwWCxPQUFPNlIsT0FBTztBQUMxQixRQUFJQSxPQUFPO0FBQ1QsV0FBS2dGLE1BQU07UUFBQztRQUFtQjdXO1FBQU82UjtNQUFNLENBQUE7O0FBRTlDLFVBQU13RixXQUFXSixVQUFVdFcsU0FBUztBQUNwQyxRQUFJMFcsVUFBVTtBQUNaLFdBQUtSLE1BQU07UUFBQztRQUFtQjdXO1FBQU9xWDtNQUFTLENBQUE7O0VBRW5EO0VBRUFDLGlCQUFpQjtBQUNmLFNBQUtULE1BQU07TUFBQztNQUFtQjtNQUFHSSxVQUFVdFc7SUFBTyxDQUFBO0VBQ3JEO0FBQ0Y7QUFwMEJFLGNBTG1CaU4sbUJBS1o3SCxZQUFXLENBQUE7QUFLbEIsY0FWbUI2SCxtQkFVWmdCLHNCQUFxQjtBQUs1QixjQWZtQmhCLG1CQWVaaUIsbUJBQWtCO0FDeE8zQixTQUFTMEksa0JBQWtCNVAsT0FBT3RJLE1BQU07QUFDdEMsTUFBSSxDQUFDc0ksTUFBTTZQLE9BQU9DLE1BQU07QUFDdEIsVUFBTUMsZUFBZS9QLE1BQU00RCx3QkFBd0JsTSxJQUFBQTtBQUNuRCxRQUFJbUgsU0FBUyxDQUFBO0FBRWIsYUFBUzVGLElBQUksR0FBR3VJLE9BQU91TyxhQUFhL1csUUFBUUMsSUFBSXVJLE1BQU12SSxLQUFLO0FBQ3pENEYsZUFBU0EsT0FBT21SLE9BQU9ELGFBQWE5VyxDQUFBQSxFQUFHNkssV0FBVzZILG1CQUFtQjNMLEtBQUFBLENBQUFBO0lBQ3ZFO0FBQ0FBLFVBQU02UCxPQUFPQyxPQUFPRyxhQUFhcFIsT0FBT3FSLEtBQUssQ0FBQ0MsR0FBR2xQLE1BQU1rUCxJQUFJbFAsQ0FBQUEsQ0FBQUE7O0FBRTdELFNBQU9qQixNQUFNNlAsT0FBT0M7QUFDdEI7QUFNQSxTQUFTTSxxQkFBcUI1TixNQUFNO0FBQ2xDLFFBQU14QyxRQUFRd0MsS0FBSzBCO0FBQ25CLFFBQU1yRixTQUFTK1Esa0JBQWtCNVAsT0FBT3dDLEtBQUs5SyxJQUFJO0FBQ2pELE1BQUlVLE1BQU00SCxNQUFNcVE7QUFDaEIsTUFBSXBYLEdBQUd1SSxNQUFNOE8sTUFBTWpHO0FBQ25CLFFBQU1rRyxtQkFBbUIsTUFBTTtBQUM3QixRQUFJRCxTQUFTLFNBQVNBLFNBQVMsUUFBUTtBQUVyQzs7QUFFRixRQUFJdkQsUUFBUTFDLElBQU8sR0FBQTtBQUVqQmpTLFlBQU1ELEtBQUtDLElBQUlBLEtBQUtELEtBQUtxWSxJQUFJRixPQUFPakcsSUFBU2pTLEtBQUFBLEdBQUFBOztBQUUvQ2lTLFdBQU9pRztFQUNUO0FBRUEsT0FBS3JYLElBQUksR0FBR3VJLE9BQU8zQyxPQUFPN0YsUUFBUUMsSUFBSXVJLE1BQU0sRUFBRXZJLEdBQUc7QUFDL0NxWCxXQUFPdFEsTUFBTXlRLGlCQUFpQjVSLE9BQU81RixDQUFFLENBQUE7QUFDdkNzWCxxQkFBQUE7RUFDRjtBQUVBbEcsU0FBT2hUO0FBQ1AsT0FBSzRCLElBQUksR0FBR3VJLE9BQU94QixNQUFNMFEsTUFBTTFYLFFBQVFDLElBQUl1SSxNQUFNLEVBQUV2SSxHQUFHO0FBQ3BEcVgsV0FBT3RRLE1BQU0yUSxnQkFBZ0IxWCxDQUFBQTtBQUM3QnNYLHFCQUFBQTtFQUNGO0FBRUEsU0FBT25ZO0FBQ1Q7QUFRQSxTQUFTd1kseUJBQXlCblAsT0FBT29QLE9BQU85UixTQUFTK1IsWUFBWTtBQUNuRSxRQUFNQyxZQUFZaFMsUUFBUWlTO0FBQzFCLE1BQUl0UixNQUFNdVI7QUFFVixNQUFJQyxjQUFjSCxTQUFZLEdBQUE7QUFDNUJyUixXQUFPbVIsTUFBTXpZLE1BQU0yRyxRQUFRb1M7QUFDM0JGLFlBQVFsUyxRQUFRcVM7U0FDWDtBQUlMMVIsV0FBT3FSLFlBQVlEO0FBQ25CRyxZQUFROztBQUdWLFNBQU87SUFDTEksT0FBTzNSLE9BQU9vUjtJQUNkRztJQUNBNVksT0FBT3dZLE1BQU1TLE9BQU83UCxLQUFBQSxJQUFVL0IsT0FBTztFQUN2QztBQUNGO0FBUUEsU0FBUzZSLDBCQUEwQjlQLE9BQU9vUCxPQUFPOVIsU0FBUytSLFlBQVk7QUFDcEUsUUFBTVEsU0FBU1QsTUFBTVM7QUFDckIsUUFBTWhCLE9BQU9nQixPQUFPN1AsS0FBTTtBQUMxQixNQUFJNEksT0FBTzVJLFFBQVEsSUFBSTZQLE9BQU83UCxRQUFRLENBQUEsSUFBSztBQUMzQyxNQUFJK1AsT0FBTy9QLFFBQVE2UCxPQUFPdFksU0FBUyxJQUFJc1ksT0FBTzdQLFFBQVEsQ0FBRSxJQUFHO0FBQzNELFFBQU1nUSxVQUFVMVMsUUFBUW9TO0FBRXhCLE1BQUk5RyxTQUFTLE1BQU07QUFHakJBLFdBQU9pRyxRQUFRa0IsU0FBUyxPQUFPWCxNQUFNelEsTUFBTXlRLE1BQU14WSxRQUFRbVosT0FBT2xCOztBQUdsRSxNQUFJa0IsU0FBUyxNQUFNO0FBRWpCQSxXQUFPbEIsT0FBT0EsT0FBT2pHOztBQUd2QixRQUFNaFMsUUFBUWlZLFFBQVFBLE9BQU9uWSxLQUFLQyxJQUFJaVMsTUFBTW1ILElBQUksS0FBSyxJQUFJQztBQUN6RCxRQUFNL1IsT0FBT3ZILEtBQUtxWSxJQUFJZ0IsT0FBT25ILElBQUFBLElBQVEsSUFBSW9IO0FBRXpDLFNBQU87SUFDTEosT0FBTzNSLE9BQU9vUjtJQUNkRyxPQUFPbFMsUUFBUXFTO0lBQ2YvWTtFQUNGO0FBQ0Y7QUFFQSxTQUFTcVosY0FBY0MsT0FBT3hZLE1BQU11SyxRQUFRekssR0FBRztBQUM3QyxRQUFNMlksYUFBYWxPLE9BQU91RyxNQUFNMEgsTUFBTSxDQUFBLEdBQUkxWSxDQUFBQTtBQUMxQyxRQUFNNFksV0FBV25PLE9BQU91RyxNQUFNMEgsTUFBTSxDQUFBLEdBQUkxWSxDQUFBQTtBQUN4QyxRQUFNYixNQUFNRCxLQUFLQyxJQUFJd1osWUFBWUMsUUFBQUE7QUFDakMsUUFBTXRYLE1BQU1wQyxLQUFLb0MsSUFBSXFYLFlBQVlDLFFBQUFBO0FBQ2pDLE1BQUlDLFdBQVcxWjtBQUNmLE1BQUkyWixTQUFTeFg7QUFFYixNQUFJcEMsS0FBS3FZLElBQUlwWSxHQUFBQSxJQUFPRCxLQUFLcVksSUFBSWpXLEdBQU0sR0FBQTtBQUNqQ3VYLGVBQVd2WDtBQUNYd1gsYUFBUzNaOztBQUtYZSxPQUFLdUssT0FBT1UsSUFBSSxJQUFJMk47QUFFcEI1WSxPQUFLNlksVUFBVTtJQUNiRjtJQUNBQztJQUNBMVosT0FBT3VaO0lBQ1B4UixLQUFLeVI7SUFDTHpaO0lBQ0FtQztFQUNGO0FBQ0Y7QUFFQSxTQUFTMFgsV0FBV04sT0FBT3hZLE1BQU11SyxRQUFRekssR0FBRztBQUMxQyxNQUFJeUYsUUFBUWlULEtBQVEsR0FBQTtBQUNsQkQsa0JBQWNDLE9BQU94WSxNQUFNdUssUUFBUXpLLENBQUFBO1NBQzlCO0FBQ0xFLFNBQUt1SyxPQUFPVSxJQUFJLElBQUlWLE9BQU91RyxNQUFNMEgsT0FBTzFZLENBQUFBOztBQUUxQyxTQUFPRTtBQUNUO0FBRUEsU0FBUytZLHNCQUFzQjFQLE1BQU1KLE1BQU0vSixPQUFPNlIsT0FBTztBQUN2RCxRQUFNaEcsU0FBUzFCLEtBQUswQjtBQUNwQixRQUFNUixTQUFTbEIsS0FBS2tCO0FBQ3BCLFFBQU1nSCxTQUFTeEcsT0FBT3lHLFVBQVM7QUFDL0IsUUFBTUMsY0FBYzFHLFdBQVdSO0FBQy9CLFFBQU1LLFNBQVMsQ0FBQTtBQUNmLE1BQUk5SyxHQUFHdUksTUFBTXJJLE1BQU13WTtBQUVuQixPQUFLMVksSUFBSVosT0FBT21KLE9BQU9uSixRQUFRNlIsT0FBT2pSLElBQUl1SSxNQUFNLEVBQUV2SSxHQUFHO0FBQ25EMFksWUFBUXZQLEtBQUtuSixDQUFFO0FBQ2ZFLFdBQU8sQ0FBQTtBQUNQQSxTQUFLK0ssT0FBT0UsSUFBSSxJQUFJd0csZUFBZTFHLE9BQU8rRixNQUFNUyxPQUFPelIsQ0FBQUEsR0FBSUEsQ0FBQUE7QUFDM0Q4SyxXQUFPOUosS0FBS2dZLFdBQVdOLE9BQU94WSxNQUFNdUssUUFBUXpLLENBQUFBLENBQUFBO0VBQzlDO0FBQ0EsU0FBTzhLO0FBQ1Q7QUFFQSxTQUFTb08sV0FBV0MsUUFBUTtBQUMxQixTQUFPQSxVQUFVQSxPQUFPTixhQUFhemEsVUFBYSthLE9BQU9MLFdBQVcxYTtBQUN0RTtBQUVBLFNBQVNnYixRQUFRM1MsTUFBTWdFLFFBQVE0TyxZQUFZO0FBQ3pDLE1BQUk1UyxTQUFTLEdBQUc7QUFDZCxXQUFPd0MsS0FBS3hDLElBQUFBOztBQUVkLFVBQVFnRSxPQUFPNk8sYUFBWSxJQUFLLElBQUksT0FBTzdPLE9BQU90TCxPQUFPa2EsYUFBYSxJQUFJO0FBQzVFO0FBRUEsU0FBU0UsWUFBWTdULFlBQVk7QUFDL0IsTUFBSXdCLFNBQVM5SCxPQUFPK0gsS0FBS00sS0FBS0U7QUFDOUIsTUFBSWpDLFdBQVc4VCxZQUFZO0FBQ3pCdFMsY0FBVXhCLFdBQVcrVCxPQUFPL1QsV0FBVzZCO0FBQ3ZDbkksWUFBUTtBQUNSK0gsVUFBTTtTQUNEO0FBQ0xELGNBQVV4QixXQUFXK1QsT0FBTy9ULFdBQVc4QjtBQUN2Q3BJLFlBQVE7QUFDUitILFVBQU07O0FBRVIsTUFBSUQsU0FBUztBQUNYTyxVQUFNO0FBQ05FLGFBQVM7U0FDSjtBQUNMRixVQUFNO0FBQ05FLGFBQVM7O0FBRVgsU0FBTztJQUFDdkk7SUFBTytIO0lBQUtEO0lBQVNPO0lBQUtFO0VBQU07QUFDMUM7QUFFQSxTQUFTK1IsaUJBQWlCaFUsWUFBWUksU0FBUzRDLE9BQU9GLE9BQU87QUFDM0QsTUFBSW1SLE9BQU83VCxRQUFROFQ7QUFDbkIsUUFBTXRWLE1BQU0sQ0FBQTtBQUVaLE1BQUksQ0FBQ3FWLE1BQU07QUFDVGpVLGVBQVdrVSxnQkFBZ0J0VjtBQUMzQjs7QUFHRixNQUFJcVYsU0FBUyxNQUFNO0FBQ2pCalUsZUFBV2tVLGdCQUFnQjtNQUFDblMsS0FBSztNQUFNQyxPQUFPO01BQU1DLFFBQVE7TUFBTUMsTUFBTTtJQUFJO0FBQzVFOztBQUdGLFFBQU0sRUFBQ3hJLE9BQU8rSCxLQUFLRCxTQUFTTyxLQUFLRSxPQUFBQSxJQUFVNFIsWUFBWTdULFVBQUFBO0FBRXZELE1BQUlpVSxTQUFTLFlBQVlqUixPQUFPO0FBQzlCaEQsZUFBV21VLHFCQUFxQjtBQUNoQyxTQUFLblIsTUFBTTRDLFFBQVEsT0FBTzlDLE9BQU87QUFDL0JtUixhQUFPbFM7Z0JBQ0dpQixNQUFNNkMsV0FBVyxPQUFPL0MsT0FBTztBQUN6Q21SLGFBQU9oUztXQUNGO0FBQ0xyRCxVQUFJd1YsVUFBVW5TLFFBQVF2SSxPQUFPK0gsS0FBS0QsT0FBQUEsQ0FBQUEsSUFBWTtBQUM5Q3lTLGFBQU9sUzs7O0FBSVhuRCxNQUFJd1YsVUFBVUgsTUFBTXZhLE9BQU8rSCxLQUFLRCxPQUFBQSxDQUFBQSxJQUFZO0FBQzVDeEIsYUFBV2tVLGdCQUFnQnRWO0FBQzdCO0FBRUEsU0FBU3dWLFVBQVVILE1BQU16QyxHQUFHbFAsR0FBR2QsU0FBUztBQUN0QyxNQUFJQSxTQUFTO0FBQ1h5UyxXQUFPSSxLQUFLSixNQUFNekMsR0FBR2xQLENBQUFBO0FBQ3JCMlIsV0FBT0ssU0FBU0wsTUFBTTNSLEdBQUdrUCxDQUFBQTtTQUNwQjtBQUNMeUMsV0FBT0ssU0FBU0wsTUFBTXpDLEdBQUdsUCxDQUFBQTs7QUFFM0IsU0FBTzJSO0FBQ1Q7QUFFQSxTQUFTSSxLQUFLRSxNQUFNQyxJQUFJQyxJQUFJO0FBQzFCLFNBQU9GLFNBQVNDLEtBQUtDLEtBQUtGLFNBQVNFLEtBQUtELEtBQUtEO0FBQy9DO0FBRUEsU0FBU0QsU0FBU0ksR0FBR2hiLE9BQU8rSCxLQUFLO0FBQy9CLFNBQU9pVCxNQUFNLFVBQVVoYixRQUFRZ2IsTUFBTSxRQUFRalQsTUFBTWlUO0FBQ3JEO0FBRUEsU0FBU0MsaUJBQWlCM1UsWUFBWSxFQUFDNFUsY0FBQUEsR0FBZ0J0QyxPQUFPO0FBQzVEdFMsYUFBVzRVLGdCQUFnQkEsa0JBQWtCLFNBQ3pDdEMsVUFBVSxJQUFJLE9BQU8sSUFDckJzQztBQUNOO0FBRWUsSUFBTUMsZ0JBQU4sY0FBNEJ2TixrQkFBQUE7RUFnRHpDdUUsbUJBQW1CaEksTUFBTUosTUFBTS9KLE9BQU82UixPQUFPO0FBQzNDLFdBQU9nSSxzQkFBc0IxUCxNQUFNSixNQUFNL0osT0FBTzZSLEtBQUFBO0VBQ2xEO0VBT0FJLGVBQWU5SCxNQUFNSixNQUFNL0osT0FBTzZSLE9BQU87QUFDdkMsV0FBT2dJLHNCQUFzQjFQLE1BQU1KLE1BQU0vSixPQUFPNlIsS0FBQUE7RUFDbEQ7RUFPQUssZ0JBQWdCL0gsTUFBTUosTUFBTS9KLE9BQU82UixPQUFPO0FBQ3hDLFVBQU0sRUFBQ2hHLFFBQVFSLE9BQUFBLElBQVVsQjtBQUN6QixVQUFNLEVBQUNxSSxXQUFXLEtBQUtDLFdBQVcsSUFBQSxJQUFPLEtBQUt2RTtBQUM5QyxVQUFNa04sV0FBV3ZQLE9BQU9FLFNBQVMsTUFBTXlHLFdBQVdDO0FBQ2xELFVBQU00SSxXQUFXaFEsT0FBT1UsU0FBUyxNQUFNeUcsV0FBV0M7QUFDbEQsVUFBTS9HLFNBQVMsQ0FBQTtBQUNmLFFBQUk5SyxHQUFHdUksTUFBTXJJLE1BQU13YTtBQUNuQixTQUFLMWEsSUFBSVosT0FBT21KLE9BQU9uSixRQUFRNlIsT0FBT2pSLElBQUl1SSxNQUFNLEVBQUV2SSxHQUFHO0FBQ25EMGEsWUFBTXZSLEtBQUtuSixDQUFFO0FBQ2JFLGFBQU8sQ0FBQTtBQUNQQSxXQUFLK0ssT0FBT0UsSUFBSSxJQUFJRixPQUFPK0YsTUFBTWMsaUJBQWlCNEksS0FBS0YsUUFBV3hhLEdBQUFBLENBQUFBO0FBQ2xFOEssYUFBTzlKLEtBQUtnWSxXQUFXbEgsaUJBQWlCNEksS0FBS0QsUUFBQUEsR0FBV3ZhLE1BQU11SyxRQUFRekssQ0FBQUEsQ0FBQUE7SUFDeEU7QUFDQSxXQUFPOEs7RUFDVDtFQUtBbUgsc0JBQXNCQyxPQUFPbkwsT0FBTytELFFBQVFwQyxPQUFPO0FBQ2pELFVBQU11SixzQkFBc0JDLE9BQU9uTCxPQUFPK0QsUUFBUXBDLEtBQUFBO0FBQ2xELFVBQU15USxTQUFTck8sT0FBT2lPO0FBQ3RCLFFBQUlJLFVBQVVwUyxVQUFVLEtBQUtnRSxZQUFZTixRQUFRO0FBRS9DeUgsWUFBTS9TLE1BQU1ELEtBQUtDLElBQUkrUyxNQUFNL1MsS0FBS2dhLE9BQU9oYSxHQUFHO0FBQzFDK1MsWUFBTTVRLE1BQU1wQyxLQUFLb0MsSUFBSTRRLE1BQU01USxLQUFLNlgsT0FBTzdYLEdBQUc7O0VBRTlDO0VBTUFxUixpQkFBaUI7QUFDZixXQUFPO0VBQ1Q7RUFLQUMsaUJBQWlCcEssT0FBTztBQUN0QixVQUFNZSxPQUFPLEtBQUt3QjtBQUNsQixVQUFNLEVBQUNFLFFBQVFSLE9BQUFBLElBQVVsQjtBQUN6QixVQUFNdUIsU0FBUyxLQUFLaUgsVUFBVXZKLEtBQUFBO0FBQzlCLFVBQU0yUSxTQUFTck8sT0FBT2lPO0FBQ3RCLFVBQU12UyxRQUFRMFMsV0FBV0MsTUFDckIsSUFBQSxNQUFNQSxPQUFPL1osUUFBUSxPQUFPK1osT0FBT2hTLE1BQU0sTUFDekMsS0FBS3NELE9BQU9xSSxpQkFBaUJoSSxPQUFPTCxPQUFPVSxJQUFJLENBQUM7QUFFcEQsV0FBTztNQUNMMEgsT0FBTyxLQUFLNUgsT0FBTzZILGlCQUFpQmhJLE9BQU9HLE9BQU9FLElBQUksQ0FBQztNQUN2RDNFO0lBQ0Y7RUFDRjtFQUVBMEgsYUFBYTtBQUNYLFNBQUtOLHNCQUFzQjtBQUUzQixVQUFNTSxXQUFVO0FBRWhCLFVBQU0zRSxPQUFPLEtBQUt3QjtBQUNsQnhCLFNBQUtiLFFBQVEsS0FBS2dHLFdBQVUsRUFBR2hHO0VBQ2pDO0VBRUExRSxPQUFPNkUsTUFBTTtBQUNYLFVBQU1VLE9BQU8sS0FBS3dCO0FBQ2xCLFNBQUsrSyxlQUFldk0sS0FBS0osTUFBTSxHQUFHSSxLQUFLSixLQUFLcEosUUFBUThJLElBQUFBO0VBQ3REO0VBRUFpTixlQUFlNkUsTUFBTXZiLE9BQU82UixPQUFPcEksTUFBTTtBQUN2QyxVQUFNaUgsU0FBUWpILFNBQVM7QUFDdkIsVUFBTSxFQUFDTCxPQUFPdUMsYUFBYSxFQUFDTixPQUFBQSxFQUFPLElBQUk7QUFDdkMsVUFBTWdQLE9BQU9oUCxPQUFPbVEsYUFBWTtBQUNoQyxVQUFNcEIsYUFBYS9PLE9BQU82TyxhQUFZO0FBQ3RDLFVBQU0xQixRQUFRLEtBQUtpRCxVQUFTO0FBQzVCLFVBQU0sRUFBQ25HLGVBQWVELGVBQWMsSUFBSSxLQUFLRyxrQkFBa0J4VixPQUFPeUosSUFBQUE7QUFFdEUsYUFBUzdJLElBQUlaLE9BQU9ZLElBQUlaLFFBQVE2UixPQUFPalIsS0FBSztBQUMxQyxZQUFNOEssU0FBUyxLQUFLaUgsVUFBVS9SLENBQUFBO0FBQzlCLFlBQU04YSxVQUFVaEwsVUFBU21JLGNBQWNuTixPQUFPTCxPQUFPVSxJQUFJLENBQUMsSUFBSTtRQUFDc087UUFBTXNCLE1BQU10QjtNQUFJLElBQUksS0FBS3VCLHlCQUF5QmhiLENBQUU7QUFDbkgsWUFBTWliLFVBQVUsS0FBS0MseUJBQXlCbGIsR0FBRzRYLEtBQUFBO0FBQ2pELFlBQU1sUCxTQUFTb0MsT0FBT0UsV0FBVyxDQUFBLEdBQUlQLE9BQU9VLElBQUk7QUFFaEQsWUFBTXpGLGFBQWE7UUFDakI4VDtRQUNBQyxNQUFNcUIsUUFBUXJCO1FBQ2RJLG9CQUFvQixDQUFDblIsU0FBU3dRLFdBQVdwTyxPQUFPaU8sT0FBTyxLQUFNdlEsVUFBVUUsTUFBTTRDLFFBQVE5QyxVQUFVRSxNQUFNNkM7UUFDckdoRSxHQUFHaVMsYUFBYXNCLFFBQVFDLE9BQU9FLFFBQVFFO1FBQ3ZDM1QsR0FBR2dTLGFBQWF5QixRQUFRRSxTQUFTTCxRQUFRQztRQUN6Q0ssUUFBUTVCLGFBQWF5QixRQUFReFUsT0FBT3ZILEtBQUtxWSxJQUFJdUQsUUFBUXJVLElBQUk7UUFDekQ0VSxPQUFPN0IsYUFBYXRhLEtBQUtxWSxJQUFJdUQsUUFBUXJVLElBQUksSUFBSXdVLFFBQVF4VTtNQUN2RDtBQUVBLFVBQUlnTyxnQkFBZ0I7QUFDbEIvTyxtQkFBV0ksVUFBVTRPLGlCQUFpQixLQUFLbkIsMEJBQTBCdlQsR0FBRzJhLEtBQUszYSxDQUFFLEVBQUMrRCxTQUFTLFdBQVc4RSxJQUFJOztBQUUxRyxZQUFNL0MsVUFBVUosV0FBV0ksV0FBVzZVLEtBQUszYSxDQUFBQSxFQUFHOEY7QUFDOUM0VCx1QkFBaUJoVSxZQUFZSSxTQUFTNEMsT0FBT0YsS0FBQUE7QUFDN0M2Uix1QkFBaUIzVSxZQUFZSSxTQUFTOFIsTUFBTUksS0FBSztBQUNqRCxXQUFLaEQsY0FBYzJGLEtBQUszYSxDQUFFLEdBQUVBLEdBQUcwRixZQUFZbUQsSUFBQUE7SUFDN0M7RUFDRjtFQVNBeVMsV0FBV0MsTUFBTW5QLFdBQVc7QUFDMUIsVUFBTSxFQUFDbkIsT0FBTSxJQUFJLEtBQUtGO0FBQ3RCLFVBQU0xQyxXQUFXNEMsT0FBT04sd0JBQXdCLEtBQUswQyxLQUFLLEVBQ3ZEekIsT0FBT3JDLENBQUFBLFNBQVFBLEtBQUtzQixXQUFXL0UsUUFBUTBWLE9BQU87QUFDakQsVUFBTWhTLFVBQVV5QixPQUFPbkYsUUFBUTBEO0FBQy9CLFVBQU1ZLFNBQVMsQ0FBQTtBQUVmLFVBQU1xUixXQUFXLENBQUNsUyxTQUFTO0FBQ3pCLFlBQU11QixTQUFTdkIsS0FBS3NCLFdBQVdrSCxVQUFVM0YsU0FBQUE7QUFDekMsWUFBTXNQLE1BQU01USxVQUFVQSxPQUFPdkIsS0FBS2tCLE9BQU9VLElBQUk7QUFFN0MsVUFBSThNLGNBQWN5RCxHQUFRQyxLQUFBQSxNQUFNRCxHQUFNLEdBQUE7QUFDcEMsZUFBTzs7SUFFWDtBQUVBLGVBQVduUyxRQUFRbEIsVUFBVTtBQUMzQixVQUFJK0QsY0FBY2hPLFVBQWFxZCxTQUFTbFMsSUFBTyxHQUFBO0FBQzdDOztBQVFGLFVBQUlDLFlBQVksU0FBU1ksT0FBT3dSLFFBQVFyUyxLQUFLYixLQUFLLE1BQU0sTUFDekRjLFlBQVlwTCxVQUFhbUwsS0FBS2IsVUFBVXRLLFFBQVk7QUFDakRnTSxlQUFPcEosS0FBS3VJLEtBQUtiLEtBQUs7O0FBRXhCLFVBQUlhLEtBQUtmLFVBQVUrUyxNQUFNO0FBQ3ZCOztJQUVKO0FBS0EsUUFBSSxDQUFDblIsT0FBT3JLLFFBQVE7QUFDbEJxSyxhQUFPcEosS0FBSzVDLE1BQUFBOztBQUdkLFdBQU9nTTtFQUNUO0VBTUF5UixlQUFlclQsT0FBTztBQUNwQixXQUFPLEtBQUs4UyxXQUFXbGQsUUFBV29LLEtBQUFBLEVBQU96STtFQUMzQztFQVVBK2IsZUFBZWhULGNBQWNpVCxNQUFNM1AsV0FBVztBQUM1QyxVQUFNaEMsU0FBUyxLQUFLa1IsV0FBV3hTLGNBQWNzRCxTQUFBQTtBQUM3QyxVQUFNNUQsUUFBUSxTQUFVcEssU0FDcEJnTSxPQUFPd1IsUUFBUUcsSUFDZixJQUFBO0FBRUosV0FBUXZULFVBQVUsS0FDZDRCLE9BQU9ySyxTQUFTLElBQ2hCeUk7RUFDTjtFQUtBcVMsWUFBWTtBQUNWLFVBQU01VCxPQUFPLEtBQUtuQjtBQUNsQixVQUFNeUQsT0FBTyxLQUFLd0I7QUFDbEIsVUFBTUUsU0FBUzFCLEtBQUswQjtBQUNwQixVQUFNb04sU0FBUyxDQUFBO0FBQ2YsUUFBSXJZLEdBQUd1STtBQUVQLFNBQUt2SSxJQUFJLEdBQUd1SSxPQUFPZ0IsS0FBS0osS0FBS3BKLFFBQVFDLElBQUl1SSxNQUFNLEVBQUV2SSxHQUFHO0FBQ2xEcVksYUFBT3JYLEtBQUtpSyxPQUFPdU0saUJBQWlCLEtBQUt6RixVQUFVL1IsQ0FBRSxFQUFDaUwsT0FBT0UsSUFBSSxHQUFHbkwsQ0FBQUEsQ0FBQUE7SUFDdEU7QUFFQSxVQUFNK1gsZUFBZTlRLEtBQUs4UTtBQUMxQixVQUFNNVksTUFBTTRZLGdCQUFnQloscUJBQXFCNU4sSUFBQUE7QUFFakQsV0FBTztNQUNMcEs7TUFDQWtaO01BQ0FqWixPQUFPNkwsT0FBTytRO01BQ2Q3VSxLQUFLOEQsT0FBT2dSO01BQ1pwRSxZQUFZLEtBQUtnRSxlQUFjO01BQy9COVUsT0FBT2tFO01BQ1B1USxTQUFTdlUsS0FBS3VVO01BRWR4RCxPQUFPRCxlQUFlLElBQUk5USxLQUFLaVIscUJBQXFCalIsS0FBS2tSO0lBQzNEO0VBQ0Y7RUFNQTZDLHlCQUF5QnhTLE9BQU87QUFDOUIsVUFBTSxFQUFDdUMsYUFBYSxFQUFDTixRQUFRc0MsVUFBVXZFLE9BQU9NLGFBQUFBLEdBQWVoRCxTQUFTLEVBQUMyVCxNQUFNeUMsV0FBV0MsYUFBQUEsRUFBYSxJQUFJO0FBQ3pHLFVBQU05QyxhQUFhNkMsYUFBYTtBQUNoQyxVQUFNcFIsU0FBUyxLQUFLaUgsVUFBVXZKLEtBQUFBO0FBQzlCLFVBQU0yUSxTQUFTck8sT0FBT2lPO0FBQ3RCLFVBQU1xRCxXQUFXbEQsV0FBV0MsTUFBQUE7QUFDNUIsUUFBSTNTLFFBQVFzRSxPQUFPTCxPQUFPVSxJQUFJO0FBQzlCLFFBQUkvTCxRQUFRO0FBQ1osUUFBSVcsU0FBU2dOLFdBQVcsS0FBS3RFLFdBQVdnQyxRQUFRSyxRQUFRaUMsUUFBQUEsSUFBWXZHO0FBQ3BFLFFBQUl1VSxNQUFNdFU7QUFFVixRQUFJMUcsV0FBV3lHLE9BQU87QUFDcEJwSCxjQUFRVyxTQUFTeUc7QUFDakJ6RyxlQUFTeUc7O0FBR1gsUUFBSTRWLFVBQVU7QUFDWjVWLGNBQVEyUyxPQUFPTjtBQUNmOVksZUFBU29aLE9BQU9MLFNBQVNLLE9BQU9OO0FBRWhDLFVBQUlyUyxVQUFVLEtBQUt5QyxLQUFLekMsS0FBQUEsTUFBV3lDLEtBQUtrUSxPQUFPTCxNQUFNLEdBQUc7QUFDdEQxWixnQkFBUTs7QUFFVkEsZUFBU29IOztBQUdYLFVBQU1tUyxhQUFhLENBQUNWLGNBQWNpRSxTQUFBQSxLQUFjLENBQUNFLFdBQVdGLFlBQVk5YztBQUN4RSxRQUFJcWEsT0FBT2hQLE9BQU8rTSxpQkFBaUJtQixVQUFBQTtBQUVuQyxRQUFJLEtBQUtyYSxNQUFNK2Qsa0JBQWtCN1QsS0FBUSxHQUFBO0FBQ3ZDdVMsYUFBT3RRLE9BQU8rTSxpQkFBaUJwWSxRQUFRVyxNQUFBQTtXQUNsQztBQUVMZ2IsYUFBT3RCOztBQUdUaFQsV0FBT3NVLE9BQU90QjtBQUVkLFFBQUl2YSxLQUFLcVksSUFBSTlRLElBQUFBLElBQVEwVixjQUFjO0FBQ2pDMVYsYUFBTzJTLFFBQVEzUyxNQUFNZ0UsUUFBUTRPLFVBQWM4QyxJQUFBQTtBQUMzQyxVQUFJM1YsVUFBVTZTLFlBQVk7QUFDeEJJLGdCQUFRaFQsT0FBTzs7QUFFakIsWUFBTTZWLGFBQWE3UixPQUFPOFIsbUJBQW1CLENBQUE7QUFDN0MsWUFBTUMsV0FBVy9SLE9BQU84UixtQkFBbUIsQ0FBQTtBQUMzQyxZQUFNcGQsTUFBTUQsS0FBS0MsSUFBSW1kLFlBQVlFLFFBQUFBO0FBQ2pDLFlBQU1sYixNQUFNcEMsS0FBS29DLElBQUlnYixZQUFZRSxRQUFBQTtBQUNqQy9DLGFBQU92YSxLQUFLb0MsSUFBSXBDLEtBQUtDLElBQUlzYSxNQUFNblksR0FBTW5DLEdBQUFBLEdBQUFBO0FBQ3JDNGIsYUFBT3RCLE9BQU9oVDtBQUVkLFVBQUlzRyxZQUFZLENBQUNxUCxVQUFVO0FBRXpCdFIsZUFBT0UsUUFBUVAsT0FBT1UsSUFBSSxFQUFFTSxjQUFjM0MsWUFBYSxJQUFHMkIsT0FBT2dTLGlCQUFpQjFCLElBQVF0USxJQUFBQSxPQUFPZ1MsaUJBQWlCaEQsSUFBQUE7OztBQUl0SCxRQUFJQSxTQUFTaFAsT0FBTytNLGlCQUFpQjZCLFVBQWEsR0FBQTtBQUNoRCxZQUFNcUQsV0FBV3pULEtBQUt4QyxJQUFBQSxJQUFRZ0UsT0FBT2tTLHFCQUFxQnRELFVBQWMsSUFBQTtBQUN4RUksY0FBUWlEO0FBQ1JqVyxjQUFRaVc7O0FBR1YsV0FBTztNQUNMalc7TUFDQWdUO01BQ0FzQjtNQUNBSSxRQUFRSixPQUFPdFUsT0FBTztJQUN4QjtFQUNGO0VBS0F5VSx5QkFBeUIxUyxPQUFPb1AsT0FBTztBQUNyQyxVQUFNN1EsUUFBUTZRLE1BQU03UTtBQUNwQixVQUFNakIsVUFBVSxLQUFLQTtBQUNyQixVQUFNMlYsV0FBVzNWLFFBQVEyVjtBQUN6QixVQUFNbUIsa0JBQWtCOU4sZUFBZWhKLFFBQVE4VyxpQkFBaUJDLFFBQUFBO0FBQ2hFLFFBQUkxQixRQUFRMVU7QUFDWixRQUFJbVIsTUFBTTRELFNBQVM7QUFDakIsWUFBTTNELGFBQWE0RCxXQUFXLEtBQUtJLGVBQWVyVCxLQUFBQSxJQUFTb1AsTUFBTUM7QUFDakUsWUFBTTNGLFFBQVFwTSxRQUFRaVMsaUJBQWlCLFNBQ25DTywwQkFBMEI5UCxPQUFPb1AsT0FBTzlSLFNBQVMrUixVQUNqREYsSUFBQUEseUJBQXlCblAsT0FBT29QLE9BQU85UixTQUFTK1IsVUFBVztBQUUvRCxZQUFNaUYsYUFBYSxLQUFLaEIsZUFBZSxLQUFLdFQsT0FBTyxLQUFLdUMsWUFBWXJDLE9BQU8rUyxXQUFXalQsUUFBUXBLLE1BQVM7QUFDdkcrYyxlQUFTakosTUFBTTlTLFFBQVM4UyxNQUFNa0csUUFBUTBFLGFBQWU1SyxNQUFNa0csUUFBUTtBQUNuRTNSLGFBQU92SCxLQUFLQyxJQUFJeWQsaUJBQWlCMUssTUFBTWtHLFFBQVFsRyxNQUFNOEYsS0FBSztXQUNyRDtBQUVMbUQsZUFBU3BVLE1BQU15USxpQkFBaUIsS0FBS3pGLFVBQVV2SixLQUFBQSxFQUFPekIsTUFBTW9FLElBQUksR0FBRzNDLEtBQUFBO0FBQ25FL0IsYUFBT3ZILEtBQUtDLElBQUl5ZCxpQkFBaUJoRixNQUFNelksTUFBTXlZLE1BQU1JLEtBQUs7O0FBRzFELFdBQU87TUFDTHlCLE1BQU0wQixTQUFTMVUsT0FBTztNQUN0QnNVLE1BQU1JLFNBQVMxVSxPQUFPO01BQ3RCMFU7TUFDQTFVO0lBQ0Y7RUFDRjtFQUVBeEcsT0FBTztBQUNMLFVBQU1zSixPQUFPLEtBQUt3QjtBQUNsQixVQUFNTixTQUFTbEIsS0FBS2tCO0FBQ3BCLFVBQU1zUyxRQUFReFQsS0FBS0o7QUFDbkIsVUFBTVosT0FBT3dVLE1BQU1oZDtBQUNuQixRQUFJQyxJQUFJO0FBRVIsV0FBT0EsSUFBSXVJLE1BQU0sRUFBRXZJLEdBQUc7QUFDcEIsVUFBSSxLQUFLK1IsVUFBVS9SLENBQUFBLEVBQUd5SyxPQUFPVSxJQUFJLE1BQU0sTUFBTTtBQUMzQzRSLGNBQU0vYyxDQUFFLEVBQUNDLEtBQUssS0FBS2dOLElBQUk7O0lBRTNCO0VBQ0Y7QUFFRjtBQTVZRSxjQUZtQnNOLGVBRVozUSxNQUFLO0FBS1osY0FQbUIyUSxlQU9acFYsWUFBVztFQUNoQjZJLG9CQUFvQjtFQUNwQkMsaUJBQWlCO0VBRWpCaUssb0JBQW9CO0VBQ3BCQyxlQUFlO0VBQ2ZxRCxTQUFTO0VBRVR4VixZQUFZO0lBQ1ZnWCxTQUFTO01BQ1B2ZSxNQUFNO01BQ05pSCxZQUFZO1FBQUM7UUFBSztRQUFLO1FBQVE7UUFBUztNQUFTO0lBQ25EO0VBQ0Y7O0FBTUYsY0ExQm1CNlUsZUEwQlowQyxhQUFZO0VBQ2pCdFIsUUFBUTtJQUNOdVIsU0FBUztNQUNQemUsTUFBTTtNQUNOMGUsUUFBUTtNQUNSQyxNQUFNO1FBQ0pELFFBQVE7TUFDVjtJQUNGO0lBQ0FFLFNBQVM7TUFDUDVlLE1BQU07TUFDTjZlLGFBQWE7SUFDZjtFQUNGOztBRS9SSixTQUFTQyxrQkFBa0JDLFVBQVVDLGVBQWVDLFFBQVE7QUFDMUQsTUFBSUMsU0FBUztBQUNiLE1BQUlDLFNBQVM7QUFDYixNQUFJQyxVQUFVO0FBQ2QsTUFBSUMsVUFBVTtBQUVkLE1BQUlMLGdCQUFnQk0sS0FBSztBQUN2QixVQUFNQyxhQUFhUjtBQUNuQixVQUFNUyxXQUFXRCxhQUFhUDtBQUM5QixVQUFNUyxTQUFTQyxLQUFLQyxJQUFJSixVQUFBQTtBQUN4QixVQUFNSyxTQUFTRixLQUFLRyxJQUFJTixVQUFBQTtBQUN4QixVQUFNTyxPQUFPSixLQUFLQyxJQUFJSCxRQUFBQTtBQUN0QixVQUFNTyxPQUFPTCxLQUFLRyxJQUFJTCxRQUFBQTtBQUN0QixVQUFNUSxVQUFVLENBQUNDLE9BQU9DLEdBQUdDLE1BQU1DLGNBQWNILE9BQU9WLFlBQVlDLFVBQVUsSUFBSSxJQUFJLElBQUlFLEtBQUtXLElBQUlILEdBQUdBLElBQUlqQixRQUFRa0IsR0FBR0EsSUFBSWxCLE1BQU87QUFDOUgsVUFBTXFCLFVBQVUsQ0FBQ0wsT0FBT0MsR0FBR0MsTUFBTUMsY0FBY0gsT0FBT1YsWUFBWUMsVUFBVSxJQUFJLElBQUksS0FBS0UsS0FBS2EsSUFBSUwsR0FBR0EsSUFBSWpCLFFBQVFrQixHQUFHQSxJQUFJbEIsTUFBTztBQUMvSCxVQUFNdUIsT0FBT1IsUUFBUSxHQUFHUCxRQUFRSyxJQUFBQTtBQUNoQyxVQUFNVyxPQUFPVCxRQUFRVSxTQUFTZCxRQUFRRyxJQUFBQTtBQUN0QyxVQUFNWSxPQUFPTCxRQUFRTSxJQUFJbkIsUUFBUUssSUFBQUE7QUFDakMsVUFBTWUsT0FBT1AsUUFBUU0sS0FBS0YsU0FBU2QsUUFBUUcsSUFBQUE7QUFDM0NiLGNBQVVzQixPQUFPRyxRQUFRO0FBQ3pCeEIsY0FBVXNCLE9BQU9JLFFBQVE7QUFDekJ6QixjQUFVLEVBQUVvQixPQUFPRyxRQUFRO0FBQzNCdEIsY0FBVSxFQUFFb0IsT0FBT0ksUUFBUTs7QUFFN0IsU0FBTztJQUFDM0I7SUFBUUM7SUFBUUM7SUFBU0M7RUFBTztBQUMxQztBQUVlLElBQU15QixxQkFBTixjQUFpQ0Msa0JBQUFBO0VBMEY5Q0MsWUFBWUMsT0FBT0MsY0FBYztBQUMvQixVQUFNRCxPQUFPQyxZQUFBQTtBQUViLFNBQUtDLHNCQUFzQjtBQUMzQixTQUFLQyxjQUFjQztBQUNuQixTQUFLQyxjQUFjRDtBQUNuQixTQUFLakMsVUFBVWlDO0FBQ2YsU0FBS2hDLFVBQVVnQztFQUNqQjtFQUVBRSxhQUFhO0VBQUE7RUFLYkMsTUFBTUMsT0FBT0MsT0FBTztBQUNsQixVQUFNQyxPQUFPLEtBQUtDLFdBQVUsRUFBR0Q7QUFDL0IsVUFBTUUsT0FBTyxLQUFLQztBQUVsQixRQUFJLEtBQUtDLGFBQWEsT0FBTztBQUMzQkYsV0FBS0csVUFBVUw7V0FDVjtBQUNMLFVBQUlNLFNBQVMsQ0FBQ0MsT0FBTSxDQUFDUCxLQUFLTyxFQUFFO0FBRTVCLFVBQUlDLFNBQVNSLEtBQUtGLEtBQUFBLENBQU0sR0FBRztBQUN6QixjQUFNLEVBQUNXLE1BQU0sUUFBQSxJQUFXLEtBQUtMO0FBQzdCRSxpQkFBUyxDQUFDQyxPQUFNLENBQUNHLGlCQUFpQlYsS0FBS08sRUFBQUEsR0FBSUUsR0FBQUE7O0FBRzdDLFVBQUlGLEdBQUdJO0FBQ1AsV0FBS0osSUFBSVQsT0FBT2EsT0FBT2IsUUFBUUMsT0FBT1EsSUFBSUksTUFBTSxFQUFFSixHQUFHO0FBQ25ETCxhQUFLRyxRQUFRRSxDQUFFLElBQUdELE9BQU9DLENBQUFBO01BQzNCOztFQUVKO0VBS0FLLGVBQWU7QUFDYixXQUFPQyxVQUFVLEtBQUtDLFFBQVExRCxXQUFXLEVBQUE7RUFDM0M7RUFLQTJELG9CQUFvQjtBQUNsQixXQUFPRixVQUFVLEtBQUtDLFFBQVF6RCxhQUFhO0VBQzdDO0VBTUEyRCxzQkFBc0I7QUFDcEIsUUFBSXBDLE1BQU1qQjtBQUNWLFFBQUllLE1BQU0sQ0FBQ2Y7QUFFWCxhQUFTNEMsSUFBSSxHQUFHQSxJQUFJLEtBQUtqQixNQUFNVSxLQUFLaUIsU0FBU0MsUUFBUSxFQUFFWCxHQUFHO0FBQ3hELFVBQUksS0FBS2pCLE1BQU02QixpQkFBaUJaLENBQUFBLEtBQU0sS0FBS2pCLE1BQU04QixlQUFlYixDQUFHYyxFQUFBQSxTQUFTLEtBQUtDLE9BQU87QUFDdEYsY0FBTUMsYUFBYSxLQUFLakMsTUFBTThCLGVBQWViLENBQUFBLEVBQUdnQjtBQUNoRCxjQUFNbkUsV0FBV21FLFdBQVdYLGFBQVk7QUFDeEMsY0FBTXZELGdCQUFnQmtFLFdBQVdSLGtCQUFpQjtBQUVsRG5DLGNBQU1iLEtBQUthLElBQUlBLEtBQUt4QixRQUFBQTtBQUNwQnNCLGNBQU1YLEtBQUtXLElBQUlBLEtBQUt0QixXQUFXQyxhQUFBQTs7SUFFbkM7QUFFQSxXQUFPO01BQ0xELFVBQVV3QjtNQUNWdkIsZUFBZXFCLE1BQU1FO0lBQ3ZCO0VBQ0Y7RUFLQTRDLE9BQU9DLE1BQU07QUFDWCxVQUFNbkMsUUFBUSxLQUFLQTtBQUNuQixVQUFNLEVBQUNvQyxVQUFTLElBQUlwQztBQUNwQixVQUFNWSxPQUFPLEtBQUtDO0FBQ2xCLFVBQU13QixPQUFPekIsS0FBS0Y7QUFDbEIsVUFBTTRCLFVBQVUsS0FBS0Msa0JBQWlCLElBQUssS0FBS0MsYUFBYUgsSUFBUSxJQUFBLEtBQUtiLFFBQVFjO0FBQ2xGLFVBQU1HLFVBQVVoRSxLQUFLVyxLQUFLWCxLQUFLYSxJQUFJOEMsVUFBVU0sT0FBT04sVUFBVU8sTUFBTSxJQUFJTCxXQUFXLEdBQUcsQ0FBQTtBQUN0RixVQUFNdEUsU0FBU1MsS0FBS2EsSUFBSXNELGFBQWEsS0FBS3BCLFFBQVF4RCxRQUFReUUsT0FBVSxHQUFBLENBQUE7QUFDcEUsVUFBTUksY0FBYyxLQUFLQyxlQUFlLEtBQUtDLEtBQUs7QUFLbEQsVUFBTSxFQUFDaEYsZUFBZUQsU0FBQUEsSUFBWSxLQUFLNEQsb0JBQW1CO0FBQzFELFVBQU0sRUFBQ3pELFFBQVFDLFFBQVFDLFNBQVNDLFFBQUFBLElBQVdQLGtCQUFrQkMsVUFBVUMsZUFBZUMsTUFBQUE7QUFDdEYsVUFBTWdGLFlBQVlaLFVBQVVNLFFBQVFKLFdBQVdyRTtBQUMvQyxVQUFNZ0YsYUFBYWIsVUFBVU8sU0FBU0wsV0FBV3BFO0FBQ2pELFVBQU1nRixZQUFZekUsS0FBS1csSUFBSVgsS0FBS2EsSUFBSTBELFVBQVVDLFNBQUFBLElBQWEsR0FBRyxDQUFBO0FBQzlELFVBQU01QyxjQUFjOEMsWUFBWSxLQUFLM0IsUUFBUTRCLFFBQVFGLFNBQUFBO0FBQ3JELFVBQU0vQyxjQUFjMUIsS0FBS1csSUFBSWlCLGNBQWNyQyxRQUFRLENBQUE7QUFDbkQsVUFBTXFGLGdCQUFnQmhELGNBQWNGLGVBQWUsS0FBS21ELDhCQUE2QjtBQUNyRixTQUFLbkYsVUFBVUEsVUFBVWtDO0FBQ3pCLFNBQUtqQyxVQUFVQSxVQUFVaUM7QUFFekJPLFNBQUsyQyxRQUFRLEtBQUtDLGVBQWM7QUFFaEMsU0FBS25ELGNBQWNBLGNBQWNnRCxlQUFlLEtBQUtJLHFCQUFxQixLQUFLVixLQUFLO0FBQ3BGLFNBQUs1QyxjQUFjMUIsS0FBS1csSUFBSSxLQUFLaUIsY0FBY2dELGVBQWVSLGFBQWEsQ0FBQTtBQUUzRSxTQUFLYSxlQUFlckIsTUFBTSxHQUFHQSxLQUFLVCxRQUFRTyxJQUFBQTtFQUM1QztFQUtBd0IsZUFBZTFDLEdBQUcyQyxRQUFPO0FBQ3ZCLFVBQU1DLE9BQU8sS0FBS3JDO0FBQ2xCLFVBQU1aLE9BQU8sS0FBS0M7QUFDbEIsVUFBTTlDLGdCQUFnQixLQUFLMEQsa0JBQWlCO0FBQzVDLFFBQUltQyxVQUFVQyxLQUFLQyxVQUFVQyxpQkFBa0IsQ0FBQyxLQUFLL0QsTUFBTWdFLGtCQUFrQi9DLENBQU1MLEtBQUFBLEtBQUtHLFFBQVFFLENBQUUsTUFBSyxRQUFRTCxLQUFLRixLQUFLTyxDQUFBQSxFQUFHZ0QsUUFBUTtBQUNsSSxhQUFPOztBQUVULFdBQU8sS0FBS0MsdUJBQXVCdEQsS0FBS0csUUFBUUUsQ0FBRSxJQUFHbEQsZ0JBQWdCTSxHQUFBQTtFQUN2RTtFQUVBcUYsZUFBZXJCLE1BQU03QixPQUFPQyxPQUFPMEIsTUFBTTtBQUN2QyxVQUFNeUIsU0FBUXpCLFNBQVM7QUFDdkIsVUFBTW5DLFFBQVEsS0FBS0E7QUFDbkIsVUFBTW9DLFlBQVlwQyxNQUFNb0M7QUFDeEIsVUFBTXlCLE9BQU83RCxNQUFNd0I7QUFDbkIsVUFBTTJDLGdCQUFnQk4sS0FBS0M7QUFDM0IsVUFBTU0sV0FBV2hDLFVBQVVpQyxPQUFPakMsVUFBVWtDLFNBQVM7QUFDckQsVUFBTUMsV0FBV25DLFVBQVVvQyxNQUFNcEMsVUFBVXFDLFVBQVU7QUFDckQsVUFBTUMsZUFBZWQsVUFBU08sY0FBY087QUFDNUMsVUFBTXZFLGNBQWN1RSxlQUFlLElBQUksS0FBS3ZFO0FBQzVDLFVBQU1FLGNBQWNxRSxlQUFlLElBQUksS0FBS3JFO0FBQzVDLFVBQU0sRUFBQ3NFLGVBQWVDLGVBQWMsSUFBSSxLQUFLQyxrQkFBa0JyRSxPQUFPMkIsSUFBQUE7QUFDdEUsUUFBSTdELGFBQWEsS0FBS2dELGFBQVk7QUFDbEMsUUFBSUw7QUFFSixTQUFLQSxJQUFJLEdBQUdBLElBQUlULE9BQU8sRUFBRVMsR0FBRztBQUMxQjNDLG9CQUFjLEtBQUtxRixlQUFlMUMsR0FBRzJDLE1BQUFBO0lBQ3ZDO0FBRUEsU0FBSzNDLElBQUlULE9BQU9TLElBQUlULFFBQVFDLE9BQU8sRUFBRVEsR0FBRztBQUN0QyxZQUFNbEQsZ0JBQWdCLEtBQUs0RixlQUFlMUMsR0FBRzJDLE1BQUFBO0FBQzdDLFlBQU1rQixNQUFNekMsS0FBS3BCLENBQUU7QUFDbkIsWUFBTThELGFBQWE7UUFDakJDLEdBQUdaLFVBQVUsS0FBS2pHO1FBQ2xCOEcsR0FBR1YsVUFBVSxLQUFLbkc7UUFDbEJFO1FBQ0FDLFVBQVVELGFBQWFQO1FBQ3ZCQTtRQUNBc0M7UUFDQUY7TUFDRjtBQUNBLFVBQUl5RSxnQkFBZ0I7QUFDbEJHLG1CQUFXdkQsVUFBVW1ELGlCQUFpQixLQUFLTywwQkFBMEJqRSxHQUFHNkQsSUFBSUssU0FBUyxXQUFXaEQsSUFBSTs7QUFFdEc3RCxvQkFBY1A7QUFFZCxXQUFLcUgsY0FBY04sS0FBSzdELEdBQUc4RCxZQUFZNUMsSUFBQUE7SUFDekM7RUFDRjtFQUVBcUIsaUJBQWlCO0FBQ2YsVUFBTTVDLE9BQU8sS0FBS0M7QUFDbEIsVUFBTXdFLFdBQVd6RSxLQUFLRjtBQUN0QixRQUFJNkMsUUFBUTtBQUNaLFFBQUl0QztBQUVKLFNBQUtBLElBQUksR0FBR0EsSUFBSW9FLFNBQVN6RCxRQUFRWCxLQUFLO0FBQ3BDLFlBQU1xRSxRQUFRMUUsS0FBS0csUUFBUUUsQ0FBRTtBQUM3QixVQUFJcUUsVUFBVSxRQUFRLENBQUNDLE1BQU1ELEtBQUFBLEtBQVUsS0FBS3RGLE1BQU1nRSxrQkFBa0IvQyxDQUFBQSxLQUFNLENBQUNvRSxTQUFTcEUsQ0FBRSxFQUFDZ0QsUUFBUTtBQUM3RlYsaUJBQVM5RSxLQUFLK0csSUFBSUYsS0FBQUE7O0lBRXRCO0FBRUEsV0FBTy9CO0VBQ1Q7RUFFQVcsdUJBQXVCb0IsT0FBTztBQUM1QixVQUFNL0IsUUFBUSxLQUFLMUMsWUFBWTBDO0FBQy9CLFFBQUlBLFFBQVEsS0FBSyxDQUFDZ0MsTUFBTUQsS0FBUSxHQUFBO0FBQzlCLGFBQU9qSCxPQUFPSSxLQUFLK0csSUFBSUYsS0FBQUEsSUFBUy9COztBQUVsQyxXQUFPO0VBQ1Q7RUFFQWtDLGlCQUFpQjFDLE9BQU87QUFDdEIsVUFBTW5DLE9BQU8sS0FBS0M7QUFDbEIsVUFBTWIsUUFBUSxLQUFLQTtBQUNuQixVQUFNMEYsU0FBUzFGLE1BQU1VLEtBQUtnRixVQUFVLENBQUE7QUFDcEMsVUFBTUosUUFBUUssYUFBYS9FLEtBQUtHLFFBQVFnQyxLQUFBQSxHQUFRL0MsTUFBTXdCLFFBQVFvRSxNQUFNO0FBRXBFLFdBQU87TUFDTEMsT0FBT0gsT0FBTzNDLEtBQUFBLEtBQVU7TUFDeEJ1QztJQUNGO0VBQ0Y7RUFFQS9DLGtCQUFrQkYsTUFBTTtBQUN0QixRQUFJakQsTUFBTTtBQUNWLFVBQU1ZLFFBQVEsS0FBS0E7QUFDbkIsUUFBSWlCLEdBQUdJLE1BQU1ULE1BQU1xQixZQUFZVDtBQUUvQixRQUFJLENBQUNhLE1BQU07QUFFVCxXQUFLcEIsSUFBSSxHQUFHSSxPQUFPckIsTUFBTVUsS0FBS2lCLFNBQVNDLFFBQVFYLElBQUlJLE1BQU0sRUFBRUosR0FBRztBQUM1RCxZQUFJakIsTUFBTTZCLGlCQUFpQlosQ0FBSSxHQUFBO0FBQzdCTCxpQkFBT1osTUFBTThCLGVBQWViLENBQUFBO0FBQzVCb0IsaUJBQU96QixLQUFLRjtBQUNadUIsdUJBQWFyQixLQUFLcUI7QUFDbEI7O01BRUo7O0FBR0YsUUFBSSxDQUFDSSxNQUFNO0FBQ1QsYUFBTzs7QUFHVCxTQUFLcEIsSUFBSSxHQUFHSSxPQUFPZ0IsS0FBS1QsUUFBUVgsSUFBSUksTUFBTSxFQUFFSixHQUFHO0FBQzdDTyxnQkFBVVMsV0FBV2lELDBCQUEwQmpFLENBQUFBO0FBQy9DLFVBQUlPLFFBQVFzRSxnQkFBZ0IsU0FBUztBQUNuQzFHLGNBQU1YLEtBQUtXLElBQUlBLEtBQUtvQyxRQUFRdUUsZUFBZSxHQUFHdkUsUUFBUXdFLG9CQUFvQixDQUFBOztJQUU5RTtBQUNBLFdBQU81RztFQUNUO0VBRUFvRCxhQUFhSCxNQUFNO0FBQ2pCLFFBQUlqRCxNQUFNO0FBRVYsYUFBUzZCLElBQUksR0FBR0ksT0FBT2dCLEtBQUtULFFBQVFYLElBQUlJLE1BQU0sRUFBRUosR0FBRztBQUNqRCxZQUFNTyxVQUFVLEtBQUswRCwwQkFBMEJqRSxDQUFBQTtBQUMvQzdCLFlBQU1YLEtBQUtXLElBQUlBLEtBQUtvQyxRQUFReUUsVUFBVSxHQUFHekUsUUFBUTBFLGVBQWUsQ0FBQTtJQUNsRTtBQUNBLFdBQU85RztFQUNUO0VBTUFxRSxxQkFBcUJ4RCxjQUFjO0FBQ2pDLFFBQUlrRyxtQkFBbUI7QUFFdkIsYUFBU2xGLElBQUksR0FBR0EsSUFBSWhCLGNBQWMsRUFBRWdCLEdBQUc7QUFDckMsVUFBSSxLQUFLakIsTUFBTTZCLGlCQUFpQlosQ0FBSSxHQUFBO0FBQ2xDa0YsNEJBQW9CLEtBQUtyRCxlQUFlN0IsQ0FBQUE7O0lBRTVDO0FBRUEsV0FBT2tGO0VBQ1Q7RUFLQXJELGVBQWU3QyxjQUFjO0FBQzNCLFdBQU94QixLQUFLVyxJQUFJZ0gsZUFBZSxLQUFLcEcsTUFBTVUsS0FBS2lCLFNBQVMxQixZQUFBQSxFQUFjb0csUUFBUSxDQUFJLEdBQUEsQ0FBQTtFQUNwRjtFQU1BL0MsZ0NBQWdDO0FBQzlCLFdBQU8sS0FBS0cscUJBQXFCLEtBQUt6RCxNQUFNVSxLQUFLaUIsU0FBU0MsTUFBTSxLQUFLO0VBQ3ZFO0FBQ0Y7QUFyV0UsY0FGbUIvQixvQkFFWnlHLE1BQUs7QUFLWixjQVBtQnpHLG9CQU9aMEcsWUFBVztFQUNoQkMsb0JBQW9CO0VBQ3BCQyxpQkFBaUI7RUFDakIzQyxXQUFXO0lBRVRDLGVBQWU7SUFFZlcsY0FBYztFQUNoQjtFQUNBZ0MsWUFBWTtJQUNWQyxTQUFTO01BQ1A1RSxNQUFNO01BQ05nRCxZQUFZO1FBQUM7UUFBaUI7UUFBWTtRQUFlO1FBQWU7UUFBYztRQUFLO1FBQUs7UUFBVTtRQUFlO01BQVU7SUFDckk7RUFDRjtFQUVBL0csUUFBUTtFQUdSRixVQUFVO0VBR1ZDLGVBQWU7RUFHZnFGLFFBQVE7RUFHUmQsU0FBUztFQUVUc0UsV0FBVzs7QUFHYixjQXhDbUIvRyxvQkF3Q1pnSCxlQUFjO0VBQ25CQyxhQUFhLENBQUNDLFNBQVNBLFNBQVM7RUFDaENDLFlBQVksQ0FBQ0QsU0FBU0EsU0FBUyxhQUFhLENBQUNBLEtBQUtFLFdBQVcsWUFBaUIsS0FBQSxDQUFDRixLQUFLRSxXQUFXLGlCQUFBOztBQU1qRyxjQWhEbUJwSCxvQkFnRFpxSCxhQUFZO0VBQ2pCQyxhQUFhO0VBR2JDLFNBQVM7SUFDUEMsUUFBUTtNQUNOM0IsUUFBUTtRQUNONEIsZUFBZXRILE9BQU87QUFDcEIsZ0JBQU1VLE9BQU9WLE1BQU1VO0FBQ25CLGNBQUlBLEtBQUtnRixPQUFPOUQsVUFBVWxCLEtBQUtpQixTQUFTQyxRQUFRO0FBQzlDLGtCQUFNLEVBQUM4RCxRQUFRLEVBQUM2QixZQUFZQyxPQUFBQSxPQUFBQSxFQUFNLElBQUl4SCxNQUFNcUgsT0FBTzdGO0FBRW5ELG1CQUFPZCxLQUFLZ0YsT0FBTytCLElBQUksQ0FBQzVCLE9BQU81RSxNQUFNO0FBQ25DLG9CQUFNTCxPQUFPWixNQUFNOEIsZUFBZSxDQUFBO0FBQ2xDLG9CQUFNNEYsUUFBUTlHLEtBQUtxQixXQUFXMEYsU0FBUzFHLENBQUFBO0FBRXZDLHFCQUFPO2dCQUNMMkcsTUFBTS9CO2dCQUNOZ0MsV0FBV0gsTUFBTUk7Z0JBQ2pCQyxhQUFhTCxNQUFNTTtnQkFDbkJDLFdBQVdUO2dCQUNYVSxXQUFXUixNQUFNM0I7Z0JBQ2pCd0I7Z0JBQ0F0RCxRQUFRLENBQUNqRSxNQUFNZ0Usa0JBQWtCL0MsQ0FBQUE7Z0JBR2pDOEIsT0FBTzlCO2NBQ1Q7WUFDRixDQUFBOztBQUVGLGlCQUFPLENBQUE7UUFDVDtNQUNGO01BRUFrSCxRQUFRQyxHQUFHQyxZQUFZaEIsUUFBUTtBQUM3QkEsZUFBT3JILE1BQU1zSSxxQkFBcUJELFdBQVd0RixLQUFLO0FBQ2xEc0UsZUFBT3JILE1BQU1rQyxPQUFNO01BQ3JCO0lBQ0Y7RUFDRjs7QUd4SFcsSUFBTXFHLGdCQUFOLGNBQTRCQyxtQkFBQUE7QUFvQjNDO0FBbEJFLGNBRm1CRCxlQUVaRSxNQUFLO0FBS1osY0FQbUJGLGVBT1pHLFlBQVc7RUFFaEJDLFFBQVE7RUFHUkMsVUFBVTtFQUdWQyxlQUFlO0VBR2ZDLFFBQVE7O0FHMkNaLFNBQVNDLFdBQXdCO0FBQy9CLFFBQU0sSUFBSUMsTUFBTSxpRkFBbUY7QUFDckc7QUFRQSxJQUFNQyxrQkFBTixNQUFNQSxpQkFBQUE7RUFvQkpDLFlBQVlDLFNBQW9CO0FBRnZCQTtBQUdQLFNBQUtBLFVBQVVBLFdBQVcsQ0FBQTtFQUM1Qjs7Ozs7Ozs7Ozs7RUFWQSxPQUFPQyxTQUNMQyxTQUNBO0FBQ0FDLFdBQU9DLE9BQU9OLGlCQUFnQk8sV0FBV0gsT0FBQUE7RUFDM0M7O0VBU0FJLE9BQU87RUFBQTtFQUVQQyxVQUFrQztBQUNoQyxXQUFPWCxTQUFBQTtFQUNUO0VBRUFZLFFBQXVCO0FBQ3JCLFdBQU9aLFNBQUFBO0VBQ1Q7RUFFQWEsU0FBaUI7QUFDZixXQUFPYixTQUFBQTtFQUNUO0VBRUFjLE1BQWM7QUFDWixXQUFPZCxTQUFBQTtFQUNUO0VBRUFlLE9BQWU7QUFDYixXQUFPZixTQUFBQTtFQUNUO0VBRUFnQixVQUFrQjtBQUNoQixXQUFPaEIsU0FBQUE7RUFDVDtFQUVBaUIsUUFBZ0I7QUFDZCxXQUFPakIsU0FBQUE7RUFDVDtBQUNGO0FBRUEsSUFBQSxXQUFlO0VBQ2JrQixPQUFPaEI7QUFDVDtBQy9HQSxTQUFTaUIsYUFBYUMsU0FBU0MsTUFBTUMsT0FBT0MsV0FBVztBQUNyRCxRQUFNLEVBQUNDLFlBQVlDLE1BQU1DLFFBQUFBLElBQVdOO0FBQ3BDLFFBQU1PLFNBQVNILFdBQVdJLFlBQVlEO0FBQ3RDLE1BQUlBLFVBQVVOLFNBQVNNLE9BQU9OLFFBQVFBLFNBQVMsT0FBT0ssV0FBV0QsS0FBS0ksUUFBUTtBQUM1RSxVQUFNQyxlQUFlSCxPQUFPSSxpQkFBaUJDLGdCQUFnQkM7QUFDN0QsUUFBSSxDQUFDVixXQUFXO0FBQ2QsYUFBT08sYUFBYUwsTUFBTUosTUFBTUMsS0FBQUE7ZUFDdkJFLFdBQVdVLGdCQUFnQjtBQUlwQyxZQUFNQyxLQUFLVixLQUFLLENBQUU7QUFDbEIsWUFBTVcsUUFBUSxPQUFPRCxHQUFHRSxhQUFhLGNBQWNGLEdBQUdFLFNBQVNoQixJQUFBQTtBQUMvRCxVQUFJZSxPQUFPO0FBQ1QsY0FBTUUsUUFBUVIsYUFBYUwsTUFBTUosTUFBTUMsUUFBUWMsS0FBQUE7QUFDL0MsY0FBTUcsTUFBTVQsYUFBYUwsTUFBTUosTUFBTUMsUUFBUWMsS0FBQUE7QUFDN0MsZUFBTztVQUFDSSxJQUFJRixNQUFNRTtVQUFJQyxJQUFJRixJQUFJRTtRQUFFOzs7O0FBS3RDLFNBQU87SUFBQ0QsSUFBSTtJQUFHQyxJQUFJaEIsS0FBS0ksU0FBUztFQUFDO0FBQ3BDO0FBVUEsU0FBU2EseUJBQXlCQyxPQUFPdEIsTUFBTXVCLFVBQVVDLFNBQVN0QixXQUFXO0FBQzNFLFFBQU11QixXQUFXSCxNQUFNSSw2QkFBNEI7QUFDbkQsUUFBTXpCLFFBQVFzQixTQUFTdkIsSUFBSztBQUM1QixXQUFTMkIsSUFBSSxHQUFHQyxPQUFPSCxTQUFTakIsUUFBUW1CLElBQUlDLE1BQU0sRUFBRUQsR0FBRztBQUNyRCxVQUFNLEVBQUNFLE9BQU96QixLQUFBQSxJQUFRcUIsU0FBU0UsQ0FBRTtBQUNqQyxVQUFNLEVBQUNSLElBQUlDLEdBQUFBLElBQU10QixhQUFhMkIsU0FBU0UsQ0FBQUEsR0FBSTNCLE1BQU1DLE9BQU9DLFNBQUFBO0FBQ3hELGFBQVM0QixJQUFJWCxJQUFJVyxLQUFLVixJQUFJLEVBQUVVLEdBQUc7QUFDN0IsWUFBTUMsVUFBVTNCLEtBQUswQixDQUFFO0FBQ3ZCLFVBQUksQ0FBQ0MsUUFBUUMsTUFBTTtBQUNqQlIsZ0JBQVFPLFNBQVNGLE9BQU9DLENBQUFBOztJQUU1QjtFQUNGO0FBQ0Y7QUFPQSxTQUFTRyx5QkFBeUJqQyxNQUFNO0FBQ3RDLFFBQU1rQyxPQUFPbEMsS0FBS21DLFFBQVEsR0FBQSxNQUFTO0FBQ25DLFFBQU1DLE9BQU9wQyxLQUFLbUMsUUFBUSxHQUFBLE1BQVM7QUFFbkMsU0FBTyxTQUFTRSxLQUFLQyxLQUFLO0FBQ3hCLFVBQU1DLFNBQVNMLE9BQU9NLEtBQUtDLElBQUlKLElBQUlLLElBQUlKLElBQUlJLENBQUMsSUFBSTtBQUNoRCxVQUFNQyxTQUFTUCxPQUFPSSxLQUFLQyxJQUFJSixJQUFJTyxJQUFJTixJQUFJTSxDQUFDLElBQUk7QUFDaEQsV0FBT0osS0FBS0ssS0FBS0wsS0FBS00sSUFBSVAsUUFBUSxDQUFLQyxJQUFBQSxLQUFLTSxJQUFJSCxRQUFRLENBQUEsQ0FBQTtFQUMxRDtBQUNGO0FBV0EsU0FBU0ksa0JBQWtCekIsT0FBT0MsVUFBVXZCLE1BQU1nRCxrQkFBa0JDLGtCQUFrQjtBQUNwRixRQUFNQyxRQUFRLENBQUE7QUFFZCxNQUFJLENBQUNELG9CQUFvQixDQUFDM0IsTUFBTTZCLGNBQWM1QixRQUFXLEdBQUE7QUFDdkQsV0FBTzJCOztBQUdULFFBQU1FLGlCQUFpQixTQUFTckIsU0FBU3NCLGNBQWN4QixPQUFPO0FBQzVELFFBQUksQ0FBQ29CLG9CQUFvQixDQUFDSyxlQUFldkIsU0FBU1QsTUFBTWlDLFdBQVcsQ0FBSSxHQUFBO0FBQ3JFOztBQUVGLFFBQUl4QixRQUFReUIsUUFBUWpDLFNBQVNtQixHQUFHbkIsU0FBU3FCLEdBQUdJLGdCQUFtQixHQUFBO0FBQzdERSxZQUFNTyxLQUFLO1FBQUMxQjtRQUFTc0I7UUFBY3hCO01BQUssQ0FBQTs7RUFFNUM7QUFFQVIsMkJBQXlCQyxPQUFPdEIsTUFBTXVCLFVBQVU2QixnQkFBZ0IsSUFBSTtBQUNwRSxTQUFPRjtBQUNUO0FBVUEsU0FBU1Esc0JBQXNCcEMsT0FBT0MsVUFBVXZCLE1BQU1nRCxrQkFBa0I7QUFDdEUsTUFBSUUsUUFBUSxDQUFBO0FBRVosV0FBU0UsZUFBZXJCLFNBQVNzQixjQUFjeEIsT0FBTztBQUNwRCxVQUFNLEVBQUM4QixZQUFZQyxTQUFBQSxJQUFZN0IsUUFBUThCLFNBQVM7TUFBQztNQUFjO09BQWFiLGdCQUFBQTtBQUM1RSxVQUFNLEVBQUNjLE1BQUFBLElBQVNDLGtCQUFrQmhDLFNBQVM7TUFBQ1csR0FBR25CLFNBQVNtQjtNQUFHRSxHQUFHckIsU0FBU3FCO0lBQUMsQ0FBQTtBQUV4RSxRQUFJb0IsY0FBY0YsT0FBT0gsWUFBWUMsUUFBVyxHQUFBO0FBQzlDVixZQUFNTyxLQUFLO1FBQUMxQjtRQUFTc0I7UUFBY3hCO01BQUssQ0FBQTs7RUFFNUM7QUFFQVIsMkJBQXlCQyxPQUFPdEIsTUFBTXVCLFVBQVU2QixjQUFBQTtBQUNoRCxTQUFPRjtBQUNUO0FBWUEsU0FBU2UseUJBQXlCM0MsT0FBT0MsVUFBVXZCLE1BQU1FLFdBQVc4QyxrQkFBa0JDLGtCQUFrQjtBQUN0RyxNQUFJQyxRQUFRLENBQUE7QUFDWixRQUFNZ0IsaUJBQWlCakMseUJBQXlCakMsSUFBQUE7QUFDaEQsTUFBSW1FLGNBQWNDLE9BQU9DO0FBRXpCLFdBQVNqQixlQUFlckIsU0FBU3NCLGNBQWN4QixPQUFPO0FBQ3BELFVBQU0yQixXQUFVekIsUUFBUXlCLFFBQVFqQyxTQUFTbUIsR0FBR25CLFNBQVNxQixHQUFHSSxnQkFBQUE7QUFDeEQsUUFBSTlDLGFBQWEsQ0FBQ3NELFVBQVM7QUFDekI7O0FBR0YsVUFBTWMsU0FBU3ZDLFFBQVF3QyxlQUFldkIsZ0JBQUFBO0FBQ3RDLFVBQU13QixjQUFjLENBQUMsQ0FBQ3ZCLG9CQUFvQjNCLE1BQU02QixjQUFjbUIsTUFBQUE7QUFDOUQsUUFBSSxDQUFDRSxlQUFlLENBQUNoQixVQUFTO0FBQzVCOztBQUdGLFVBQU1pQixXQUFXUCxlQUFlM0MsVUFBVStDLE1BQUFBO0FBQzFDLFFBQUlHLFdBQVdOLGFBQWE7QUFDMUJqQixjQUFRO1FBQUM7VUFBQ25CO1VBQVNzQjtVQUFjeEI7UUFBSztNQUFFO0FBQ3hDc0Msb0JBQWNNO2VBQ0xBLGFBQWFOLGFBQWE7QUFFbkNqQixZQUFNTyxLQUFLO1FBQUMxQjtRQUFTc0I7UUFBY3hCO01BQUssQ0FBQTs7RUFFNUM7QUFFQVIsMkJBQXlCQyxPQUFPdEIsTUFBTXVCLFVBQVU2QixjQUFBQTtBQUNoRCxTQUFPRjtBQUNUO0FBWUEsU0FBU3dCLGdCQUFnQnBELE9BQU9DLFVBQVV2QixNQUFNRSxXQUFXOEMsa0JBQWtCQyxrQkFBa0I7QUFDN0YsTUFBSSxDQUFDQSxvQkFBb0IsQ0FBQzNCLE1BQU02QixjQUFjNUIsUUFBVyxHQUFBO0FBQ3ZELFdBQU8sQ0FBQTs7QUFHVCxTQUFPdkIsU0FBUyxPQUFPLENBQUNFLFlBQ3BCd0Qsc0JBQXNCcEMsT0FBT0MsVUFBVXZCLE1BQU1nRCxnQkFBQUEsSUFDN0NpQix5QkFBeUIzQyxPQUFPQyxVQUFVdkIsTUFBTUUsV0FBVzhDLGtCQUFrQkMsZ0JBQWlCO0FBQ3BHO0FBV0EsU0FBUzBCLGFBQWFyRCxPQUFPQyxVQUFVdkIsTUFBTUUsV0FBVzhDLGtCQUFrQjtBQUN4RSxRQUFNRSxRQUFRLENBQUE7QUFDZCxRQUFNMEIsY0FBYzVFLFNBQVMsTUFBTSxhQUFhO0FBQ2hELE1BQUk2RSxpQkFBaUI7QUFFckJ4RCwyQkFBeUJDLE9BQU90QixNQUFNdUIsVUFBVSxDQUFDUSxTQUFTc0IsY0FBY3hCLFVBQVU7QUFDaEYsUUFBSUUsUUFBUTZDLFdBQVksRUFBQ3JELFNBQVN2QixJQUFBQSxHQUFPZ0QsZ0JBQW1CLEdBQUE7QUFDMURFLFlBQU1PLEtBQUs7UUFBQzFCO1FBQVNzQjtRQUFjeEI7TUFBSyxDQUFBO0FBQ3hDZ0QsdUJBQWlCQSxrQkFBa0I5QyxRQUFReUIsUUFBUWpDLFNBQVNtQixHQUFHbkIsU0FBU3FCLEdBQUdJLGdCQUFBQTs7RUFFL0UsQ0FBQTtBQUlBLE1BQUk5QyxhQUFhLENBQUMyRSxnQkFBZ0I7QUFDaEMsV0FBTyxDQUFBOztBQUVULFNBQU8zQjtBQUNUO0FBTUEsSUFBQSxjQUFlO0VBRWI3QjtFQUdBeUQsT0FBTztJQVlMakQsTUFBTVAsT0FBT3lELEdBQUdoRyxTQUFTaUUsa0JBQWtCO0FBQ3pDLFlBQU16QixXQUFXeUQsb0JBQW9CRCxHQUFHekQsS0FBQUE7QUFFeEMsWUFBTXRCLE9BQU9qQixRQUFRaUIsUUFBUTtBQUM3QixZQUFNaUQsbUJBQW1CbEUsUUFBUWtFLG9CQUFvQjtBQUNyRCxZQUFNQyxRQUFRbkUsUUFBUW1CLFlBQ2xCNkMsa0JBQWtCekIsT0FBT0MsVUFBVXZCLE1BQU1nRCxrQkFBa0JDLGdCQUFBQSxJQUMzRHlCLGdCQUFnQnBELE9BQU9DLFVBQVV2QixNQUFNLE9BQU9nRCxrQkFBa0JDLGdCQUFpQjtBQUNyRixZQUFNZ0MsV0FBVyxDQUFBO0FBRWpCLFVBQUksQ0FBQy9CLE1BQU0xQyxRQUFRO0FBQ2pCLGVBQU8sQ0FBQTs7QUFHVGMsWUFBTUksNkJBQTRCLEVBQUd3RCxRQUFRLENBQUNDLFNBQVM7QUFDckQsY0FBTXRELFFBQVFxQixNQUFNLENBQUEsRUFBR3JCO0FBQ3ZCLGNBQU1FLFVBQVVvRCxLQUFLL0UsS0FBS3lCLEtBQU07QUFHaEMsWUFBSUUsV0FBVyxDQUFDQSxRQUFRQyxNQUFNO0FBQzVCaUQsbUJBQVN4QixLQUFLO1lBQUMxQjtZQUFTc0IsY0FBYzhCLEtBQUt0RDtZQUFPQTtVQUFLLENBQUE7O01BRTNELENBQUE7QUFFQSxhQUFPb0Q7SUFDVDtJQVlBRyxRQUFROUQsT0FBT3lELEdBQUdoRyxTQUFTaUUsa0JBQWtCO0FBQzNDLFlBQU16QixXQUFXeUQsb0JBQW9CRCxHQUFHekQsS0FBQUE7QUFDeEMsWUFBTXRCLE9BQU9qQixRQUFRaUIsUUFBUTtBQUM3QixZQUFNaUQsbUJBQW1CbEUsUUFBUWtFLG9CQUFvQjtBQUNyRCxVQUFJQyxRQUFRbkUsUUFBUW1CLFlBQ2hCNkMsa0JBQWtCekIsT0FBT0MsVUFBVXZCLE1BQU1nRCxrQkFBa0JDLGdCQUFBQSxJQUM3RHlCLGdCQUFnQnBELE9BQU9DLFVBQVV2QixNQUFNLE9BQU9nRCxrQkFBa0JDLGdCQUFpQjtBQUVuRixVQUFJQyxNQUFNMUMsU0FBUyxHQUFHO0FBQ3BCLGNBQU02QyxlQUFlSCxNQUFNLENBQUEsRUFBR0c7QUFDOUIsY0FBTWpELE9BQU9rQixNQUFNK0QsZUFBZWhDLFlBQUFBLEVBQWNqRDtBQUNoRDhDLGdCQUFRLENBQUE7QUFDUixpQkFBU3ZCLElBQUksR0FBR0EsSUFBSXZCLEtBQUtJLFFBQVEsRUFBRW1CLEdBQUc7QUFDcEN1QixnQkFBTU8sS0FBSztZQUFDMUIsU0FBUzNCLEtBQUt1QixDQUFFO1lBQUUwQjtZQUFjeEIsT0FBT0Y7VUFBQyxDQUFBO1FBQ3REOztBQUdGLGFBQU91QjtJQUNUO0lBWUFvQyxNQUFNaEUsT0FBT3lELEdBQUdoRyxTQUFTaUUsa0JBQWtCO0FBQ3pDLFlBQU16QixXQUFXeUQsb0JBQW9CRCxHQUFHekQsS0FBQUE7QUFDeEMsWUFBTXRCLE9BQU9qQixRQUFRaUIsUUFBUTtBQUM3QixZQUFNaUQsbUJBQW1CbEUsUUFBUWtFLG9CQUFvQjtBQUNyRCxhQUFPRixrQkFBa0J6QixPQUFPQyxVQUFVdkIsTUFBTWdELGtCQUFrQkMsZ0JBQUFBO0lBQ3BFO0lBV0FzQyxRQUFRakUsT0FBT3lELEdBQUdoRyxTQUFTaUUsa0JBQWtCO0FBQzNDLFlBQU16QixXQUFXeUQsb0JBQW9CRCxHQUFHekQsS0FBQUE7QUFDeEMsWUFBTXRCLE9BQU9qQixRQUFRaUIsUUFBUTtBQUM3QixZQUFNaUQsbUJBQW1CbEUsUUFBUWtFLG9CQUFvQjtBQUNyRCxhQUFPeUIsZ0JBQWdCcEQsT0FBT0MsVUFBVXZCLE1BQU1qQixRQUFRbUIsV0FBVzhDLGtCQUFrQkMsZ0JBQUFBO0lBQ3JGO0lBV0FQLEVBQUVwQixPQUFPeUQsR0FBR2hHLFNBQVNpRSxrQkFBa0I7QUFDckMsWUFBTXpCLFdBQVd5RCxvQkFBb0JELEdBQUd6RCxLQUFBQTtBQUN4QyxhQUFPcUQsYUFBYXJELE9BQU9DLFVBQVUsS0FBS3hDLFFBQVFtQixXQUFXOEMsZ0JBQUFBO0lBQy9EO0lBV0FKLEVBQUV0QixPQUFPeUQsR0FBR2hHLFNBQVNpRSxrQkFBa0I7QUFDckMsWUFBTXpCLFdBQVd5RCxvQkFBb0JELEdBQUd6RCxLQUFBQTtBQUN4QyxhQUFPcUQsYUFBYXJELE9BQU9DLFVBQVUsS0FBS3hDLFFBQVFtQixXQUFXOEMsZ0JBQUFBO0lBQy9EO0VBQ0Y7QUFDRjtBQ3ZXQSxJQUFNd0MsbUJBQW1CO0VBQUM7RUFBUTtFQUFPO0VBQVM7QUFBUztBQUUzRCxTQUFTQyxpQkFBaUJDLE9BQU9uRSxVQUFVO0FBQ3pDLFNBQU9tRSxNQUFNQyxPQUFPQyxDQUFBQSxNQUFLQSxFQUFFQyxRQUFRdEUsUUFBQUE7QUFDckM7QUFFQSxTQUFTdUUsNEJBQTRCSixPQUFPMUYsTUFBTTtBQUNoRCxTQUFPMEYsTUFBTUMsT0FBT0MsQ0FBQUEsTUFBS0osaUJBQWlCckQsUUFBUXlELEVBQUVDLEdBQUcsTUFBTSxNQUFNRCxFQUFFRyxJQUFJL0YsU0FBU0EsSUFBQUE7QUFDcEY7QUFFQSxTQUFTZ0csYUFBYU4sT0FBT08sU0FBUztBQUNwQyxTQUFPUCxNQUFNUSxLQUFLLENBQUNDLEdBQUdDLE1BQU07QUFDMUIsVUFBTUMsS0FBS0osVUFBVUcsSUFBSUQ7QUFDekIsVUFBTUcsS0FBS0wsVUFBVUUsSUFBSUM7QUFDekIsV0FBT0MsR0FBR0UsV0FBV0QsR0FBR0MsU0FDdEJGLEdBQUd4RSxRQUFReUUsR0FBR3pFLFFBQ2R3RSxHQUFHRSxTQUFTRCxHQUFHQztFQUNuQixDQUFBO0FBQ0Y7QUFFQSxTQUFTQyxVQUFVQyxPQUFPO0FBQ3hCLFFBQU1DLGNBQWMsQ0FBQTtBQUNwQixNQUFJL0UsR0FBR0MsTUFBTW1FLEtBQUtGLEtBQUtjLE9BQU9DO0FBRTlCLE9BQUtqRixJQUFJLEdBQUdDLFFBQVE2RSxTQUFTLENBQUEsR0FBSWpHLFFBQVFtQixJQUFJQyxNQUFNLEVBQUVELEdBQUc7QUFDdERvRSxVQUFNVSxNQUFNOUUsQ0FBRTtBQUNiLEtBQUEsRUFBQ0osVUFBVXNFLEtBQUs5RyxTQUFTLEVBQUM0SCxPQUFPQyxjQUFjLEVBQUMsRUFBQyxJQUFJYjtBQUN0RFcsZ0JBQVlqRCxLQUFLO01BQ2Y1QixPQUFPRjtNQUNQb0U7TUFDQUY7TUFDQWdCLFlBQVlkLElBQUllLGFBQVk7TUFDNUJQLFFBQVFSLElBQUlRO01BQ1pJLE9BQU9BLFNBQVVkLE1BQU1jO01BQ3ZCQztJQUNGLENBQUE7RUFDRjtBQUNBLFNBQU9GO0FBQ1Q7QUFFQSxTQUFTSyxZQUFZQyxVQUFTO0FBQzVCLFFBQU1DLFNBQVMsQ0FBQTtBQUNmLGFBQVdDLFFBQVFGLFVBQVM7QUFDMUIsVUFBTSxFQUFDTCxPQUFPZCxLQUFLZSxZQUFBQSxJQUFlTTtBQUNsQyxRQUFJLENBQUNQLFNBQVMsQ0FBQ25CLGlCQUFpQjJCLFNBQVN0QixHQUFNLEdBQUE7QUFDN0M7O0FBRUYsVUFBTXVCLFNBQVNILE9BQU9OLEtBQUFBLE1BQVdNLE9BQU9OLEtBQUFBLElBQVM7TUFBQ1UsT0FBTztNQUFHQyxRQUFRO01BQUdmLFFBQVE7TUFBR2dCLE1BQU07O0FBQ3hGSCxXQUFPQztBQUNQRCxXQUFPYixVQUFVSztFQUNuQjtBQUNBLFNBQU9LO0FBQ1Q7QUFLQSxTQUFTTyxjQUFjUixVQUFTUyxRQUFRO0FBQ3RDLFFBQU1SLFNBQVNGLFlBQVlDLFFBQUFBO0FBQzNCLFFBQU0sRUFBQ1UsY0FBY0MsY0FBQUEsSUFBaUJGO0FBQ3RDLE1BQUk5RixHQUFHQyxNQUFNZ0c7QUFDYixPQUFLakcsSUFBSSxHQUFHQyxPQUFPb0YsU0FBUXhHLFFBQVFtQixJQUFJQyxNQUFNLEVBQUVELEdBQUc7QUFDaERpRyxhQUFTWixTQUFRckYsQ0FBRTtBQUNuQixVQUFNLEVBQUNrRyxTQUFBQSxJQUFZRCxPQUFPN0I7QUFDMUIsVUFBTVksUUFBUU0sT0FBT1csT0FBT2pCLEtBQUs7QUFDakMsVUFBTW1CLFNBQVNuQixTQUFTaUIsT0FBT2hCLGNBQWNELE1BQU1KO0FBQ25ELFFBQUlxQixPQUFPZixZQUFZO0FBQ3JCZSxhQUFPRyxRQUFRRCxTQUFTQSxTQUFTSixlQUFlRyxZQUFZSixPQUFPTztBQUNuRUosYUFBT0ssU0FBU047V0FDWDtBQUNMQyxhQUFPRyxRQUFRTDtBQUNmRSxhQUFPSyxTQUFTSCxTQUFTQSxTQUFTSCxnQkFBZ0JFLFlBQVlKLE9BQU9TOztFQUV6RTtBQUNBLFNBQU9qQjtBQUNUO0FBRUEsU0FBU2tCLGlCQUFpQjFCLE9BQU87QUFDL0IsUUFBTUMsY0FBY0YsVUFBVUMsS0FBQUE7QUFDOUIsUUFBTW9CLFdBQVc3QixhQUFhVSxZQUFZZixPQUFPdUIsQ0FBQUEsU0FBUUEsS0FBS25CLElBQUk4QixRQUFRLEdBQUcsSUFBSTtBQUNqRixRQUFNTyxPQUFPcEMsYUFBYVAsaUJBQWlCaUIsYUFBYSxNQUFBLEdBQVMsSUFBSTtBQUNyRSxRQUFNMkIsUUFBUXJDLGFBQWFQLGlCQUFpQmlCLGFBQWEsT0FBQSxDQUFBO0FBQ3pELFFBQU00QixNQUFNdEMsYUFBYVAsaUJBQWlCaUIsYUFBYSxLQUFBLEdBQVEsSUFBSTtBQUNuRSxRQUFNNkIsU0FBU3ZDLGFBQWFQLGlCQUFpQmlCLGFBQWEsUUFBQSxDQUFBO0FBQzFELFFBQU04QixtQkFBbUIxQyw0QkFBNEJZLGFBQWEsR0FBQTtBQUNsRSxRQUFNK0IsaUJBQWlCM0MsNEJBQTRCWSxhQUFhLEdBQUE7QUFFaEUsU0FBTztJQUNMbUI7SUFDQWEsWUFBWU4sS0FBS08sT0FBT0wsR0FBQUE7SUFDeEJNLGdCQUFnQlAsTUFBTU0sT0FBT0YsY0FBQUEsRUFBZ0JFLE9BQU9KLE1BQUFBLEVBQVFJLE9BQU9ILGdCQUFBQTtJQUNuRWpGLFdBQVdrQyxpQkFBaUJpQixhQUFhLFdBQUE7SUFDekNtQyxVQUFVVCxLQUFLTyxPQUFPTixLQUFBQSxFQUFPTSxPQUFPRixjQUFBQTtJQUNwQzVCLFlBQVl5QixJQUFJSyxPQUFPSixNQUFBQSxFQUFRSSxPQUFPSCxnQkFBQUE7RUFDeEM7QUFDRjtBQUVBLFNBQVNNLGVBQWVDLFlBQVl4RixXQUFXNEMsR0FBR0MsR0FBRztBQUNuRCxTQUFPNUQsS0FBS3dHLElBQUlELFdBQVc1QyxDQUFFLEdBQUU1QyxVQUFVNEMsQ0FBQUEsQ0FBRSxJQUFJM0QsS0FBS3dHLElBQUlELFdBQVczQyxDQUFBQSxHQUFJN0MsVUFBVTZDLENBQUUsQ0FBQTtBQUNyRjtBQUVBLFNBQVM2QyxpQkFBaUJGLFlBQVlHLFlBQVk7QUFDaERILGFBQVdULE1BQU05RixLQUFLd0csSUFBSUQsV0FBV1QsS0FBS1ksV0FBV1osR0FBRztBQUN4RFMsYUFBV1gsT0FBTzVGLEtBQUt3RyxJQUFJRCxXQUFXWCxNQUFNYyxXQUFXZCxJQUFJO0FBQzNEVyxhQUFXUixTQUFTL0YsS0FBS3dHLElBQUlELFdBQVdSLFFBQVFXLFdBQVdYLE1BQU07QUFDakVRLGFBQVdWLFFBQVE3RixLQUFLd0csSUFBSUQsV0FBV1YsT0FBT2EsV0FBV2IsS0FBSztBQUNoRTtBQUVBLFNBQVNjLFdBQVc1RixXQUFXa0UsUUFBUUcsUUFBUVgsUUFBUTtBQUNyRCxRQUFNLEVBQUNwQixLQUFLRSxJQUFBQSxJQUFPNkI7QUFDbkIsUUFBTW1CLGFBQWF4RixVQUFVd0Y7QUFHN0IsTUFBSSxDQUFDSyxTQUFTdkQsR0FBTSxHQUFBO0FBQ2xCLFFBQUkrQixPQUFPTCxNQUFNO0FBRWZoRSxnQkFBVXNDLEdBQUFBLEtBQVErQixPQUFPTDs7QUFFM0IsVUFBTVosUUFBUU0sT0FBT1csT0FBT2pCLEtBQUssS0FBSztNQUFDWSxNQUFNO01BQUdGLE9BQU87SUFBQztBQUN4RFYsVUFBTVksT0FBTy9FLEtBQUt3RyxJQUFJckMsTUFBTVksTUFBTUssT0FBT2YsYUFBYWQsSUFBSWtDLFNBQVNsQyxJQUFJZ0MsS0FBSztBQUM1RUgsV0FBT0wsT0FBT1osTUFBTVksT0FBT1osTUFBTVU7QUFDakM5RCxjQUFVc0MsR0FBQUEsS0FBUStCLE9BQU9MOztBQUczQixNQUFJeEIsSUFBSXNELFlBQVk7QUFDbEJKLHFCQUFpQkYsWUFBWWhELElBQUlzRCxXQUFVLENBQUE7O0FBRzdDLFFBQU1DLFdBQVc5RyxLQUFLd0csSUFBSSxHQUFHdkIsT0FBTzhCLGFBQWFULGVBQWVDLFlBQVl4RixXQUFXLFFBQVEsT0FBQSxDQUFBO0FBQy9GLFFBQU1pRyxZQUFZaEgsS0FBS3dHLElBQUksR0FBR3ZCLE9BQU9nQyxjQUFjWCxlQUFlQyxZQUFZeEYsV0FBVyxPQUFPLFFBQUEsQ0FBQTtBQUNoRyxRQUFNbUcsZUFBZUosYUFBYS9GLFVBQVVvRztBQUM1QyxRQUFNQyxnQkFBZ0JKLGNBQWNqRyxVQUFVc0c7QUFDOUN0RyxZQUFVb0csSUFBSUw7QUFDZC9GLFlBQVVzRyxJQUFJTDtBQUdkLFNBQU81QixPQUFPZixhQUNWO0lBQUNpRCxNQUFNSjtJQUFjSyxPQUFPSDtNQUM1QjtJQUFDRSxNQUFNRjtJQUFlRyxPQUFPTDs7QUFDbkM7QUFFQSxTQUFTTSxpQkFBaUJ6RyxXQUFXO0FBQ25DLFFBQU13RixhQUFheEYsVUFBVXdGO0FBRTdCLFdBQVNrQixVQUFVcEUsS0FBSztBQUN0QixVQUFNcUUsU0FBUzFILEtBQUt3RyxJQUFJRCxXQUFXbEQsR0FBQUEsSUFBT3RDLFVBQVVzQyxHQUFBQSxHQUFNLENBQUE7QUFDMUR0QyxjQUFVc0MsR0FBQUEsS0FBUXFFO0FBQ2xCLFdBQU9BO0VBQ1Q7QUFDQTNHLFlBQVVYLEtBQUtxSCxVQUFVLEtBQUE7QUFDekIxRyxZQUFVYixLQUFLdUgsVUFBVSxNQUFBO0FBQ3pCQSxZQUFVLE9BQUE7QUFDVkEsWUFBVSxRQUFBO0FBQ1o7QUFFQSxTQUFTRSxXQUFXdEQsWUFBWXRELFdBQVc7QUFDekMsUUFBTXdGLGFBQWF4RixVQUFVd0Y7QUFFN0IsV0FBU3FCLG1CQUFtQkMsWUFBVztBQUNyQyxVQUFNQyxTQUFTO01BQUNsQyxNQUFNO01BQUdFLEtBQUs7TUFBR0QsT0FBTztNQUFHRSxRQUFRO0lBQUM7QUFDcEQ4QixJQUFBQSxXQUFVbkYsUUFBUSxDQUFDVyxRQUFRO0FBQ3pCeUUsYUFBT3pFLEdBQUFBLElBQU9yRCxLQUFLd0csSUFBSXpGLFVBQVVzQyxHQUFJLEdBQUVrRCxXQUFXbEQsR0FBSSxDQUFBO0lBQ3hELENBQUE7QUFDQSxXQUFPeUU7RUFDVDtBQUVBLFNBQU96RCxhQUNIdUQsbUJBQW1CO0lBQUM7SUFBUTtFQUFRLENBQUEsSUFDcENBLG1CQUFtQjtJQUFDO0lBQU87R0FBUztBQUMxQztBQUVBLFNBQVNHLFNBQVM5RCxPQUFPbEQsV0FBV2tFLFFBQVFSLFFBQVE7QUFDbEQsUUFBTXVELGFBQWEsQ0FBQTtBQUNuQixNQUFJN0ksR0FBR0MsTUFBTWdHLFFBQVE3QixLQUFLMEUsT0FBT0M7QUFFakMsT0FBSy9JLElBQUksR0FBR0MsT0FBTzZFLE1BQU1qRyxRQUFRaUssUUFBUSxHQUFHOUksSUFBSUMsTUFBTSxFQUFFRCxHQUFHO0FBQ3pEaUcsYUFBU25CLE1BQU05RSxDQUFFO0FBQ2pCb0UsVUFBTTZCLE9BQU83QjtBQUViQSxRQUFJNEUsT0FDRi9DLE9BQU9HLFNBQVN4RSxVQUFVb0csR0FDMUIvQixPQUFPSyxVQUFVMUUsVUFBVXNHLEdBQzNCTSxXQUFXdkMsT0FBT2YsWUFBWXRELFNBQUFBLENBQUFBO0FBRWhDLFVBQU0sRUFBQ3VHLE1BQU1DLE1BQUFBLElBQVNaLFdBQVc1RixXQUFXa0UsUUFBUUcsUUFBUVgsTUFBQUE7QUFJNUR3RCxhQUFTWCxRQUFRVSxXQUFXaEs7QUFHNUJrSyxjQUFVQSxXQUFXWDtBQUVyQixRQUFJLENBQUNoRSxJQUFJOEIsVUFBVTtBQUNqQjJDLGlCQUFXL0csS0FBS21FLE1BQUFBOztFQUVwQjtBQUVBLFNBQU82QyxTQUFTRixTQUFTQyxZQUFZakgsV0FBV2tFLFFBQVFSLE1BQVd5RCxLQUFBQTtBQUNyRTtBQUVBLFNBQVNFLFdBQVc3RSxLQUFLcUMsTUFBTUUsS0FBS1AsT0FBT0UsUUFBUTtBQUNqRGxDLE1BQUl1QyxNQUFNQTtBQUNWdkMsTUFBSXFDLE9BQU9BO0FBQ1hyQyxNQUFJc0MsUUFBUUQsT0FBT0w7QUFDbkJoQyxNQUFJd0MsU0FBU0QsTUFBTUw7QUFDbkJsQyxNQUFJZ0MsUUFBUUE7QUFDWmhDLE1BQUlrQyxTQUFTQTtBQUNmO0FBRUEsU0FBUzRDLFdBQVdwRSxPQUFPbEQsV0FBV2tFLFFBQVFSLFFBQVE7QUFDcEQsUUFBTTZELGNBQWNyRCxPQUFPc0Q7QUFDM0IsTUFBSSxFQUFDckksR0FBR0UsRUFBQUEsSUFBS1c7QUFFYixhQUFXcUUsVUFBVW5CLE9BQU87QUFDMUIsVUFBTVYsTUFBTTZCLE9BQU83QjtBQUNuQixVQUFNWSxRQUFRTSxPQUFPVyxPQUFPakIsS0FBSyxLQUFLO01BQUNVLE9BQU87TUFBR0MsUUFBUTtNQUFHZixRQUFRO0lBQUM7QUFDckUsVUFBTUEsU0FBUyxPQUFRSyxjQUFjRCxNQUFNSixVQUFXO0FBQ3RELFFBQUlxQixPQUFPZixZQUFZO0FBQ3JCLFlBQU1rQixRQUFReEUsVUFBVW9HLElBQUlwRDtBQUM1QixZQUFNMEIsU0FBU3RCLE1BQU1ZLFFBQVF4QixJQUFJa0M7QUFDakMsVUFBSStDLFFBQVFyRSxNQUFNMUYsS0FBSyxHQUFHO0FBQ3hCMkIsWUFBSStELE1BQU0xRjs7QUFFWixVQUFJOEUsSUFBSThCLFVBQVU7QUFDaEIrQyxtQkFBVzdFLEtBQUsrRSxZQUFZMUMsTUFBTXhGLEdBQUc2RSxPQUFPOEIsYUFBYXVCLFlBQVl6QyxRQUFReUMsWUFBWTFDLE1BQU1ILE1BQUFBO2FBQzFGO0FBQ0wyQyxtQkFBVzdFLEtBQUt4QyxVQUFVNkUsT0FBT3pCLE1BQU1XLFFBQVExRSxHQUFHbUYsT0FBT0UsTUFBQUE7O0FBRTNEdEIsWUFBTTFGLFFBQVEyQjtBQUNkK0QsWUFBTVcsVUFBVVM7QUFDaEJuRixVQUFJbUQsSUFBSXdDO1dBQ0g7QUFDTCxZQUFNTixTQUFTMUUsVUFBVXNHLElBQUl0RDtBQUM3QixZQUFNd0IsUUFBUXBCLE1BQU1ZLFFBQVF4QixJQUFJZ0M7QUFDaEMsVUFBSWlELFFBQVFyRSxNQUFNMUYsS0FBSyxHQUFHO0FBQ3hCeUIsWUFBSWlFLE1BQU0xRjs7QUFFWixVQUFJOEUsSUFBSThCLFVBQVU7QUFDaEIrQyxtQkFBVzdFLEtBQUtyRCxHQUFHb0ksWUFBWXhDLEtBQUtQLE9BQU9OLE9BQU9nQyxjQUFjcUIsWUFBWXZDLFNBQVN1QyxZQUFZeEMsR0FBRzthQUMvRjtBQUNMc0MsbUJBQVc3RSxLQUFLckQsR0FBR2EsVUFBVStFLE1BQU0zQixNQUFNVyxRQUFRUyxPQUFPRSxNQUFBQTs7QUFFMUR0QixZQUFNMUYsUUFBUXlCO0FBQ2RpRSxZQUFNVyxVQUFVVztBQUNoQnZGLFVBQUlxRCxJQUFJc0M7O0VBRVo7QUFFQTlFLFlBQVViLElBQUlBO0FBQ2RhLFlBQVVYLElBQUlBO0FBQ2hCO0FBd0JBLElBQUEsVUFBZTtFQVFicUksT0FBTzNKLE9BQU80SixNQUFNO0FBQ2xCLFFBQUksQ0FBQzVKLE1BQU1tRixPQUFPO0FBQ2hCbkYsWUFBTW1GLFFBQVEsQ0FBQTs7QUFJaEJ5RSxTQUFLckQsV0FBV3FELEtBQUtyRCxZQUFZO0FBQ2pDcUQsU0FBSzNKLFdBQVcySixLQUFLM0osWUFBWTtBQUNqQzJKLFNBQUszRSxTQUFTMkUsS0FBSzNFLFVBQVU7QUFFN0IyRSxTQUFLQyxVQUFVRCxLQUFLQyxXQUFXLFdBQVc7QUFDeEMsYUFBTztRQUFDO1VBQ05DLEdBQUc7VUFDSEMsS0FBSzlILFdBQVc7QUFDZDJILGlCQUFLRyxLQUFLOUgsU0FBQUE7VUFDWjtRQUNGO01BQUU7SUFDSjtBQUVBakMsVUFBTW1GLE1BQU1oRCxLQUFLeUgsSUFBQUE7RUFDbkI7RUFPQUksVUFBVWhLLE9BQU9pSyxZQUFZO0FBQzNCLFVBQU0xSixRQUFRUCxNQUFNbUYsUUFBUW5GLE1BQU1tRixNQUFNdEUsUUFBUW9KLFVBQWMsSUFBQTtBQUM5RCxRQUFJMUosVUFBVSxJQUFJO0FBQ2hCUCxZQUFNbUYsTUFBTStFLE9BQU8zSixPQUFPLENBQUE7O0VBRTlCO0VBUUE0SixVQUFVbkssT0FBTzRKLE1BQU1uTSxTQUFTO0FBQzlCbU0sU0FBS3JELFdBQVc5SSxRQUFROEk7QUFDeEJxRCxTQUFLM0osV0FBV3hDLFFBQVF3QztBQUN4QjJKLFNBQUszRSxTQUFTeEgsUUFBUXdIO0VBQ3hCO0VBVUFvRSxPQUFPckosT0FBT3lHLE9BQU9FLFFBQVF5RCxZQUFZO0FBQ3ZDLFFBQUksQ0FBQ3BLLE9BQU87QUFDVjs7QUFHRixVQUFNeUosVUFBVVksVUFBVXJLLE1BQU12QyxRQUFRNkksT0FBT21ELE9BQU87QUFDdEQsVUFBTS9DLGlCQUFpQnhGLEtBQUt3RyxJQUFJakIsUUFBUWdELFFBQVFoRCxPQUFPLENBQUE7QUFDdkQsVUFBTUcsa0JBQWtCMUYsS0FBS3dHLElBQUlmLFNBQVM4QyxRQUFROUMsUUFBUSxDQUFBO0FBQzFELFVBQU14QixRQUFRMEIsaUJBQWlCN0csTUFBTW1GLEtBQUs7QUFDMUMsVUFBTW1GLGdCQUFnQm5GLE1BQU1vQztBQUM1QixVQUFNZ0Qsa0JBQWtCcEYsTUFBTUk7QUFJOUJpRixTQUFLeEssTUFBTW1GLE9BQU9WLENBQUFBLFFBQU87QUFDdkIsVUFBSSxPQUFPQSxJQUFJZ0csaUJBQWlCLFlBQVk7QUFDMUNoRyxZQUFJZ0csYUFBWTs7SUFFcEIsQ0FBQTtBQTZCQSxVQUFNQywwQkFBMEJKLGNBQWNLLE9BQU8sQ0FBQ0MsT0FBT2hGLFNBQzNEQSxLQUFLbkIsSUFBSWhILFdBQVdtSSxLQUFLbkIsSUFBSWhILFFBQVFvTixZQUFZLFFBQVFELFFBQVFBLFFBQVEsR0FBRyxDQUFNLEtBQUE7QUFFcEYsVUFBTXpFLFNBQVN2SSxPQUFPa04sT0FBTztNQUMzQjdDLFlBQVl4QjtNQUNaMEIsYUFBYXhCO01BQ2I4QztNQUNBL0M7TUFDQUU7TUFDQVIsY0FBY00saUJBQWlCLElBQUlnRTtNQUNuQ3JFLGVBQWVPLGtCQUFrQjtJQUNuQyxDQUFBO0FBQ0EsVUFBTWEsYUFBYTdKLE9BQU9DLE9BQU8sQ0FBQSxHQUFJNEwsT0FBQUE7QUFDckM5QixxQkFBaUJGLFlBQVk0QyxVQUFVRCxVQUFBQSxDQUFBQTtBQUN2QyxVQUFNbkksWUFBWXJFLE9BQU9DLE9BQU87TUFDOUI0SjtNQUNBWSxHQUFHM0I7TUFDSDZCLEdBQUczQjtNQUNIeEYsR0FBR3FJLFFBQVEzQztNQUNYeEYsR0FBR21JLFFBQVF6QztPQUNWeUMsT0FBQUE7QUFFSCxVQUFNOUQsU0FBU08sY0FBY29FLGNBQWNqRCxPQUFPa0QsZUFBa0JwRSxHQUFBQSxNQUFBQTtBQUdwRThDLGFBQVM5RCxNQUFNb0IsVUFBVXRFLFdBQVdrRSxRQUFRUixNQUFBQTtBQUc1Q3NELGFBQVNxQixlQUFlckksV0FBV2tFLFFBQVFSLE1BQUFBO0FBRzNDLFFBQUlzRCxTQUFTc0IsaUJBQWlCdEksV0FBV2tFLFFBQVFSLE1BQVMsR0FBQTtBQUV4RHNELGVBQVNxQixlQUFlckksV0FBV2tFLFFBQVFSLE1BQUFBOztBQUc3QytDLHFCQUFpQnpHLFNBQUFBO0FBR2pCc0gsZUFBV3BFLE1BQU1pQyxZQUFZbkYsV0FBV2tFLFFBQVFSLE1BQUFBO0FBR2hEMUQsY0FBVWIsS0FBS2EsVUFBVW9HO0FBQ3pCcEcsY0FBVVgsS0FBS1csVUFBVXNHO0FBRXpCZ0IsZUFBV3BFLE1BQU1tQyxnQkFBZ0JyRixXQUFXa0UsUUFBUVIsTUFBQUE7QUFFcEQzRixVQUFNaUMsWUFBWTtNQUNoQjZFLE1BQU03RSxVQUFVNkU7TUFDaEJFLEtBQUsvRSxVQUFVK0U7TUFDZkQsT0FBTzlFLFVBQVU2RSxPQUFPN0UsVUFBVW9HO01BQ2xDcEIsUUFBUWhGLFVBQVUrRSxNQUFNL0UsVUFBVXNHO01BQ2xDNUIsUUFBUTFFLFVBQVVzRztNQUNsQjlCLE9BQU94RSxVQUFVb0c7SUFDbkI7QUFHQW1DLFNBQUtyRixNQUFNbEQsV0FBVyxDQUFDcUUsV0FBVztBQUNoQyxZQUFNN0IsTUFBTTZCLE9BQU83QjtBQUNuQjdHLGFBQU9DLE9BQU80RyxLQUFLekUsTUFBTWlDLFNBQVM7QUFDbEN3QyxVQUFJNEUsT0FBT3BILFVBQVVvRyxHQUFHcEcsVUFBVXNHLEdBQUc7UUFBQ3pCLE1BQU07UUFBR0UsS0FBSztRQUFHRCxPQUFPO1FBQUdFLFFBQVE7TUFBQyxDQUFBO0lBQzVFLENBQUE7RUFDRjtBQUNGO0FDOWJlLElBQU04RCxlQUFOLE1BQU1BO0VBT25CQyxlQUFlQyxRQUFRQyxhQUFhO0VBQUE7RUFRcENDLGVBQWVDLFNBQVM7QUFDdEIsV0FBTztFQUNUO0VBU0FDLGlCQUFpQnJMLE9BQU9zTCxNQUFNQyxVQUFVO0VBQUE7RUFReENDLG9CQUFvQnhMLE9BQU9zTCxNQUFNQyxVQUFVO0VBQUE7RUFLM0NFLHNCQUFzQjtBQUNwQixXQUFPO0VBQ1Q7RUFTQUMsZUFBZWpMLFNBQVNnRyxPQUFPRSxRQUFRdUUsYUFBYTtBQUNsRHpFLFlBQVF2RixLQUFLd0csSUFBSSxHQUFHakIsU0FBU2hHLFFBQVFnRyxLQUFLO0FBQzFDRSxhQUFTQSxVQUFVbEcsUUFBUWtHO0FBQzNCLFdBQU87TUFDTEY7TUFDQUUsUUFBUXpGLEtBQUt3RyxJQUFJLEdBQUd3RCxjQUFjaEssS0FBS3lLLE1BQU1sRixRQUFReUUsV0FBQUEsSUFBZXZFLE1BQU07SUFDNUU7RUFDRjtFQU1BaUYsV0FBV1gsUUFBUTtBQUNqQixXQUFPO0VBQ1Q7RUFNQVksYUFBYUMsUUFBUTtFQUVyQjtBQUNGO0FDdEVlLElBQU1DLGdCQUFOLGNBQTRCaEIsYUFBQUE7RUFDekNDLGVBQWVwQixNQUFNO0FBSW5CLFdBQU9BLFFBQVFBLEtBQUtvQyxjQUFjcEMsS0FBS29DLFdBQVcsSUFBQSxLQUFTO0VBQzdEO0VBQ0FILGFBQWFDLFFBQVE7QUFDbkJBLFdBQU9yTyxRQUFRd08sWUFBWTtFQUM3QjtBQUNGO0FDVEEsSUFBTUMsY0FBYztBQU9wQixJQUFNQyxjQUFjO0VBQ2xCQyxZQUFZO0VBQ1pDLFdBQVc7RUFDWEMsVUFBVTtFQUNWQyxjQUFjO0VBQ2RDLGFBQWE7RUFDYkMsYUFBYTtFQUNiQyxXQUFXO0VBQ1hDLGNBQWM7RUFDZEMsWUFBWTtBQUNkO0FBRUEsSUFBTUMsZ0JBQWdCbE8sQ0FBQUEsVUFBU0EsVUFBVSxRQUFRQSxVQUFVO0FBUTNELFNBQVNtTyxXQUFXN0IsUUFBUUMsYUFBYTtBQUN2QyxRQUFNNkIsUUFBUTlCLE9BQU84QjtBQUlyQixRQUFNQyxlQUFlL0IsT0FBT2dDLGFBQWEsUUFBQTtBQUN6QyxRQUFNQyxjQUFjakMsT0FBT2dDLGFBQWEsT0FBQTtBQUd4Q2hDLFNBQU9pQixXQUFBQSxJQUFlO0lBQ3BCaUIsU0FBUztNQUNQeEcsUUFBUXFHO01BQ1J2RyxPQUFPeUc7TUFDUEgsT0FBTztRQUNMbEMsU0FBU2tDLE1BQU1sQztRQUNmbEUsUUFBUW9HLE1BQU1wRztRQUNkRixPQUFPc0csTUFBTXRHO01BQ2Y7SUFDRjtFQUNGO0FBS0FzRyxRQUFNbEMsVUFBVWtDLE1BQU1sQyxXQUFXO0FBRWpDa0MsUUFBTUssWUFBWUwsTUFBTUssYUFBYTtBQUVyQyxNQUFJUCxjQUFjSyxXQUFjLEdBQUE7QUFDOUIsVUFBTUcsZUFBZUMsYUFBYXJDLFFBQVEsT0FBQTtBQUMxQyxRQUFJb0MsaUJBQWlCRSxRQUFXO0FBQzlCdEMsYUFBT3hFLFFBQVE0Rzs7O0FBSW5CLE1BQUlSLGNBQWNHLFlBQWUsR0FBQTtBQUMvQixRQUFJL0IsT0FBTzhCLE1BQU1wRyxXQUFXLElBQUk7QUFJOUJzRSxhQUFPdEUsU0FBU3NFLE9BQU94RSxTQUFTeUUsZUFBZTtXQUMxQztBQUNMLFlBQU1zQyxnQkFBZ0JGLGFBQWFyQyxRQUFRLFFBQUE7QUFDM0MsVUFBSXVDLGtCQUFrQkQsUUFBVztBQUMvQnRDLGVBQU90RSxTQUFTNkc7Ozs7QUFLdEIsU0FBT3ZDO0FBQ1Q7QUFJQSxJQUFNd0MsdUJBQXVCQywrQkFBK0I7RUFBQ0MsU0FBUztBQUFJLElBQUk7QUFFOUUsU0FBU0MsWUFBWUMsTUFBTXZDLE1BQU1DLFVBQVU7QUFDekNzQyxPQUFLeEMsaUJBQWlCQyxNQUFNQyxVQUFVa0Msb0JBQUFBO0FBQ3hDO0FBRUEsU0FBU0ssZUFBZTlOLE9BQU9zTCxNQUFNQyxVQUFVO0FBQzdDdkwsUUFBTWlMLE9BQU9PLG9CQUFvQkYsTUFBTUMsVUFBVWtDLG9CQUFBQTtBQUNuRDtBQUVBLFNBQVNNLGdCQUFnQkMsT0FBT2hPLE9BQU87QUFDckMsUUFBTXNMLE9BQU9hLFlBQVk2QixNQUFNMUMsSUFBSSxLQUFLMEMsTUFBTTFDO0FBQzlDLFFBQU0sRUFBQ2xLLEdBQUdFLEVBQUFBLElBQUtvQyxvQkFBb0JzSyxPQUFPaE8sS0FBQUE7QUFDMUMsU0FBTztJQUNMc0w7SUFDQXRMO0lBQ0FpTyxRQUFRRDtJQUNSNU0sR0FBR0EsTUFBTW1NLFNBQVluTSxJQUFJO0lBQ3pCRSxHQUFHQSxNQUFNaU0sU0FBWWpNLElBQUk7RUFDM0I7QUFDRjtBQUVBLFNBQVM0TSxpQkFBaUJDLFVBQVVsRCxRQUFRO0FBQzFDLGFBQVc0QyxRQUFRTSxVQUFVO0FBQzNCLFFBQUlOLFNBQVM1QyxVQUFVNEMsS0FBS08sU0FBU25ELE1BQVMsR0FBQTtBQUM1QyxhQUFPOztFQUVYO0FBQ0Y7QUFFQSxTQUFTb0QscUJBQXFCck8sT0FBT3NMLE1BQU1DLFVBQVU7QUFDbkQsUUFBTU4sU0FBU2pMLE1BQU1pTDtBQUNyQixRQUFNcUQsV0FBVyxJQUFJQyxpQkFBaUJDLENBQUFBLFlBQVc7QUFDL0MsUUFBSUMsVUFBVTtBQUNkLGVBQVdDLFNBQVNGLFNBQVM7QUFDM0JDLGdCQUFVQSxXQUFXUCxpQkFBaUJRLE1BQU1DLFlBQVkxRCxNQUFBQTtBQUN4RHdELGdCQUFVQSxXQUFXLENBQUNQLGlCQUFpQlEsTUFBTUUsY0FBYzNELE1BQUFBO0lBQzdEO0FBQ0EsUUFBSXdELFNBQVM7QUFDWGxELGVBQUFBOztFQUVKLENBQUE7QUFDQStDLFdBQVNPLFFBQVFDLFVBQVU7SUFBQ0MsV0FBVztJQUFNQyxTQUFTO0VBQUksQ0FBQTtBQUMxRCxTQUFPVjtBQUNUO0FBRUEsU0FBU1cscUJBQXFCalAsT0FBT3NMLE1BQU1DLFVBQVU7QUFDbkQsUUFBTU4sU0FBU2pMLE1BQU1pTDtBQUNyQixRQUFNcUQsV0FBVyxJQUFJQyxpQkFBaUJDLENBQUFBLFlBQVc7QUFDL0MsUUFBSUMsVUFBVTtBQUNkLGVBQVdDLFNBQVNGLFNBQVM7QUFDM0JDLGdCQUFVQSxXQUFXUCxpQkFBaUJRLE1BQU1FLGNBQWMzRCxNQUFBQTtBQUMxRHdELGdCQUFVQSxXQUFXLENBQUNQLGlCQUFpQlEsTUFBTUMsWUFBWTFELE1BQUFBO0lBQzNEO0FBQ0EsUUFBSXdELFNBQVM7QUFDWGxELGVBQUFBOztFQUVKLENBQUE7QUFDQStDLFdBQVNPLFFBQVFDLFVBQVU7SUFBQ0MsV0FBVztJQUFNQyxTQUFTO0VBQUksQ0FBQTtBQUMxRCxTQUFPVjtBQUNUO0FBRUEsSUFBTVkscUJBQXFCLG9CQUFJQyxJQUFBQTtBQUMvQixJQUFJQyxzQkFBc0I7QUFFMUIsU0FBU0MsaUJBQWlCO0FBQ3hCLFFBQU1DLE1BQU1DLE9BQU9DO0FBQ25CLE1BQUlGLFFBQVFGLHFCQUFxQjtBQUMvQjs7QUFFRkEsd0JBQXNCRTtBQUN0QkoscUJBQW1CdEwsUUFBUSxDQUFDNkwsUUFBUXpQLFVBQVU7QUFDNUMsUUFBSUEsTUFBTTBQLDRCQUE0QkosS0FBSztBQUN6Q0csYUFBQUE7O0VBRUosQ0FBQTtBQUNGO0FBRUEsU0FBU0UsOEJBQThCM1AsT0FBT3lQLFFBQVE7QUFDcEQsTUFBSSxDQUFDUCxtQkFBbUJqSixNQUFNO0FBQzVCc0osV0FBT2xFLGlCQUFpQixVQUFVZ0UsY0FBQUE7O0FBRXBDSCxxQkFBbUJVLElBQUk1UCxPQUFPeVAsTUFBQUE7QUFDaEM7QUFFQSxTQUFTSSxnQ0FBZ0M3UCxPQUFPO0FBQzlDa1AscUJBQW1CWSxPQUFPOVAsS0FBQUE7QUFDMUIsTUFBSSxDQUFDa1AsbUJBQW1CakosTUFBTTtBQUM1QnNKLFdBQU8vRCxvQkFBb0IsVUFBVTZELGNBQUFBOztBQUV6QztBQUVBLFNBQVNVLHFCQUFxQi9QLE9BQU9zTCxNQUFNQyxVQUFVO0FBQ25ELFFBQU1OLFNBQVNqTCxNQUFNaUw7QUFDckIsUUFBTStFLFlBQVkvRSxVQUFVZ0YsZUFBZWhGLE1BQUFBO0FBQzNDLE1BQUksQ0FBQytFLFdBQVc7QUFDZDs7QUFFRixRQUFNUCxTQUFTUyxVQUFVLENBQUN6SixPQUFPRSxXQUFXO0FBQzFDLFVBQU0wQixJQUFJMkgsVUFBVUc7QUFDcEI1RSxhQUFTOUUsT0FBT0UsTUFBQUE7QUFDaEIsUUFBSTBCLElBQUkySCxVQUFVRyxhQUFhO0FBUTdCNUUsZUFBQUE7O0tBRURnRSxNQUFBQTtBQUdILFFBQU1qQixXQUFXLElBQUk4QixlQUFlNUIsQ0FBQUEsWUFBVztBQUM3QyxVQUFNRSxRQUFRRixRQUFRLENBQUU7QUFDeEIsVUFBTS9ILFFBQVFpSSxNQUFNMkIsWUFBWTVKO0FBQ2hDLFVBQU1FLFNBQVMrSCxNQUFNMkIsWUFBWTFKO0FBSWpDLFFBQUlGLFVBQVUsS0FBS0UsV0FBVyxHQUFHO0FBQy9COztBQUVGOEksV0FBT2hKLE9BQU9FLE1BQUFBO0VBQ2hCLENBQUE7QUFDQTJILFdBQVNPLFFBQVFtQixTQUFBQTtBQUNqQkwsZ0NBQThCM1AsT0FBT3lQLE1BQUFBO0FBRXJDLFNBQU9uQjtBQUNUO0FBRUEsU0FBU2dDLGdCQUFnQnRRLE9BQU9zTCxNQUFNZ0QsVUFBVTtBQUM5QyxNQUFJQSxVQUFVO0FBQ1pBLGFBQVNpQyxXQUFVOztBQUVyQixNQUFJakYsU0FBUyxVQUFVO0FBQ3JCdUUsb0NBQWdDN1AsS0FBQUE7O0FBRXBDO0FBRUEsU0FBU3dRLHFCQUFxQnhRLE9BQU9zTCxNQUFNQyxVQUFVO0FBQ25ELFFBQU1OLFNBQVNqTCxNQUFNaUw7QUFDckIsUUFBTXdGLFFBQVFQLFVBQVUsQ0FBQ2xDLFVBQVU7QUFJakMsUUFBSWhPLE1BQU0wUSxRQUFRLE1BQU07QUFDdEJuRixlQUFTd0MsZ0JBQWdCQyxPQUFPaE8sS0FBQUEsQ0FBQUE7O0tBRWpDQSxLQUFBQTtBQUVINE4sY0FBWTNDLFFBQVFLLE1BQU1tRixLQUFBQTtBQUUxQixTQUFPQTtBQUNUO0FBTWUsSUFBTUUsY0FBTixjQUEwQjVGLGFBQUFBO0VBT3ZDQyxlQUFlQyxRQUFRQyxhQUFhO0FBSWxDLFVBQU1FLFVBQVVILFVBQVVBLE9BQU9lLGNBQWNmLE9BQU9lLFdBQVcsSUFBQTtBQVNqRSxRQUFJWixXQUFXQSxRQUFRSCxXQUFXQSxRQUFRO0FBR3hDNkIsaUJBQVc3QixRQUFRQyxXQUFBQTtBQUNuQixhQUFPRTs7QUFHVCxXQUFPO0VBQ1Q7RUFLQUQsZUFBZUMsU0FBUztBQUN0QixVQUFNSCxTQUFTRyxRQUFRSDtBQUN2QixRQUFJLENBQUNBLE9BQU9pQixXQUFBQSxHQUFjO0FBQ3hCLGFBQU87O0FBR1QsVUFBTWlCLFVBQVVsQyxPQUFPaUIsV0FBQUEsRUFBYWlCO0FBQ3BDO01BQUM7TUFBVTtNQUFTdkosUUFBUSxDQUFDZ04sU0FBUztBQUNwQyxZQUFNalMsUUFBUXdPLFFBQVF5RCxJQUFLO0FBQzNCLFVBQUlDLGNBQWNsUyxLQUFRLEdBQUE7QUFDeEJzTSxlQUFPNkYsZ0JBQWdCRixJQUFBQTthQUNsQjtBQUNMM0YsZUFBTzhGLGFBQWFILE1BQU1qUyxLQUFBQTs7SUFFOUIsQ0FBQTtBQUVBLFVBQU1vTyxRQUFRSSxRQUFRSixTQUFTLENBQUE7QUFDL0JuUCxXQUFPb1QsS0FBS2pFLEtBQUFBLEVBQU9uSixRQUFRLENBQUNxTixRQUFRO0FBQ2xDaEcsYUFBTzhCLE1BQU1rRSxHQUFBQSxJQUFPbEUsTUFBTWtFLEdBQUk7SUFDaEMsQ0FBQTtBQU9BaEcsV0FBT3hFLFFBQVF3RSxPQUFPeEU7QUFFdEIsV0FBT3dFLE9BQU9pQixXQUFZO0FBQzFCLFdBQU87RUFDVDtFQVFBYixpQkFBaUJyTCxPQUFPc0wsTUFBTUMsVUFBVTtBQUV0QyxTQUFLQyxvQkFBb0J4TCxPQUFPc0wsSUFBQUE7QUFFaEMsVUFBTTRGLFVBQVVsUixNQUFNbVIsYUFBYW5SLE1BQU1tUixXQUFXLENBQUE7QUFDcEQsVUFBTUMsV0FBVztNQUNmQyxRQUFRaEQ7TUFDUmlELFFBQVFyQztNQUNSUSxRQUFRTTtJQUNWO0FBQ0EsVUFBTTdQLFVBQVVrUixTQUFTOUYsSUFBQUEsS0FBU2tGO0FBQ2xDVSxZQUFRNUYsSUFBQUEsSUFBUXBMLFFBQVFGLE9BQU9zTCxNQUFNQyxRQUFBQTtFQUN2QztFQU9BQyxvQkFBb0J4TCxPQUFPc0wsTUFBTTtBQUMvQixVQUFNNEYsVUFBVWxSLE1BQU1tUixhQUFhblIsTUFBTW1SLFdBQVcsQ0FBQTtBQUNwRCxVQUFNVixRQUFRUyxRQUFRNUYsSUFBSztBQUUzQixRQUFJLENBQUNtRixPQUFPO0FBQ1Y7O0FBR0YsVUFBTVcsV0FBVztNQUNmQyxRQUFRZjtNQUNSZ0IsUUFBUWhCO01BQ1JiLFFBQVFhO0lBQ1Y7QUFDQSxVQUFNcFEsVUFBVWtSLFNBQVM5RixJQUFBQSxLQUFTd0M7QUFDbEM1TixZQUFRRixPQUFPc0wsTUFBTW1GLEtBQUFBO0FBQ3JCUyxZQUFRNUYsSUFBQUEsSUFBUWlDO0VBQ2xCO0VBRUE5QixzQkFBc0I7QUFDcEIsV0FBTzhELE9BQU9DO0VBQ2hCO0VBUUE5RCxlQUFlVCxRQUFReEUsT0FBT0UsUUFBUXVFLGFBQWE7QUFDakQsV0FBT1EsZUFBZVQsUUFBUXhFLE9BQU9FLFFBQVF1RSxXQUFBQTtFQUMvQztFQUtBVSxXQUFXWCxRQUFRO0FBQ2pCLFVBQU0rRSxZQUFZQyxlQUFlaEYsTUFBQUE7QUFDakMsV0FBTyxDQUFDLEVBQUUrRSxhQUFhQSxVQUFVdUI7RUFDbkM7QUFDRjtBQzNYTyxTQUFTQyxnQkFBZ0J2RyxRQUFRO0FBQ3RDLE1BQUksQ0FBQ3dHLGdCQUFzQixLQUFBLE9BQU9DLG9CQUFvQixlQUFlekcsa0JBQWtCeUcsaUJBQWtCO0FBQ3ZHLFdBQU8zRjs7QUFFVCxTQUFPNEU7QUFDVDtBQ0xlLElBQU1nQixVQUFOLE1BQU1BO0VBQU47QUFLYnZRO0FBQ0FFO0FBQ0FzUSxrQ0FBUztBQUNUblU7QUFDQW9VOztFQUVBQyxnQkFBZ0JwUSxrQkFBa0M7QUFDaEQsVUFBTSxFQUFDTixHQUFHRSxFQUFBQSxJQUFLLEtBQUtpQixTQUFTO01BQUM7TUFBSztPQUFNYixnQkFBQUE7QUFDekMsV0FBTztNQUFDTjtNQUFHRTtJQUFDO0VBQ2Q7RUFFQXlRLFdBQVc7QUFDVCxXQUFPQyxTQUFTLEtBQUs1USxDQUFDLEtBQUs0USxTQUFTLEtBQUsxUSxDQUFDO0VBQzVDO0VBU0FpQixTQUFTMFAsT0FBaUJDLE9BQW1EO0FBQzNFLFVBQU1DLFFBQVEsS0FBS047QUFDbkIsUUFBSSxDQUFDSyxTQUFTLENBQUNDLE9BQU87QUFFcEIsYUFBTzs7QUFFVCxVQUFNQyxNQUErQixDQUFBO0FBQ3JDSCxVQUFNck8sUUFBUSxDQUFDZ04sU0FBUztBQUN0QndCLFVBQUl4QixJQUFBQSxJQUFRdUIsTUFBTXZCLElBQUssS0FBSXVCLE1BQU12QixJQUFBQSxFQUFNZ0IsT0FBTSxJQUFLTyxNQUFNdkIsSUFBQUEsRUFBTXlCLE1BQU0sS0FBS3pCLElBQWU7SUFDMUYsQ0FBQTtBQUNBLFdBQU93QjtFQUNUO0FBQ0Y7QUFyQ0UsY0FGbUJULFNBRVpXLFlBQVcsQ0FBQTtBQUNsQixjQUhtQlgsU0FHWlk7QUNRRixTQUFTQyxTQUFTQyxPQUFPQyxPQUFPO0FBQ3JDLFFBQU1DLFdBQVdGLE1BQU1oVixRQUFRaVY7QUFDL0IsUUFBTUUscUJBQXFCQyxrQkFBa0JKLEtBQUFBO0FBQzdDLFFBQU1LLGFBQWE1UixLQUFLNlIsSUFBSUosU0FBU0ssaUJBQWlCSixvQkFBb0JBLGtCQUFBQTtBQUMxRSxRQUFNSyxlQUFlTixTQUFTTyxNQUFNQyxVQUFVQyxnQkFBZ0JWLEtBQUFBLElBQVMsQ0FBQTtBQUN2RSxRQUFNVyxrQkFBa0JKLGFBQWEvVDtBQUNyQyxRQUFNb1UsUUFBUUwsYUFBYSxDQUFFO0FBQzdCLFFBQU1NLE9BQU9OLGFBQWFJLGtCQUFrQixDQUFFO0FBQzlDLFFBQU1HLFdBQVcsQ0FBQTtBQUdqQixNQUFJSCxrQkFBa0JQLFlBQVk7QUFDaENXLGVBQVdmLE9BQU9jLFVBQVVQLGNBQWNJLGtCQUFrQlAsVUFBQUE7QUFDNUQsV0FBT1U7O0FBR1QsUUFBTUUsVUFBVUMsaUJBQWlCVixjQUFjUCxPQUFPSSxVQUFBQTtBQUV0RCxNQUFJTyxrQkFBa0IsR0FBRztBQUN2QixRQUFJaFQsR0FBR0M7QUFDUCxVQUFNc1Qsa0JBQWtCUCxrQkFBa0IsSUFBSW5TLEtBQUsyUyxPQUFPTixPQUFPRCxVQUFVRCxrQkFBa0IsRUFBQSxJQUFNO0FBQ25HM1MsU0FBS2dTLE9BQU9jLFVBQVVFLFNBQVM3QyxjQUFjK0MsZUFBQUEsSUFBbUIsSUFBSU4sUUFBUU0saUJBQWlCTixLQUFBQTtBQUM3RixTQUFLalQsSUFBSSxHQUFHQyxPQUFPK1Msa0JBQWtCLEdBQUdoVCxJQUFJQyxNQUFNRCxLQUFLO0FBQ3JESyxXQUFLZ1MsT0FBT2MsVUFBVUUsU0FBU1QsYUFBYTVTLENBQUFBLEdBQUk0UyxhQUFhNVMsSUFBSSxDQUFFLENBQUE7SUFDckU7QUFDQUssU0FBS2dTLE9BQU9jLFVBQVVFLFNBQVNILE1BQU0xQyxjQUFjK0MsZUFBQUEsSUFBbUJsQixNQUFNeFQsU0FBU3FVLE9BQU9LLGVBQWU7QUFDM0csV0FBT0o7O0FBRVQ5UyxPQUFLZ1MsT0FBT2MsVUFBVUUsT0FBQUE7QUFDdEIsU0FBT0Y7QUFDVDtBQUVBLFNBQVNYLGtCQUFrQkosT0FBTztBQUNoQyxRQUFNcUIsU0FBU3JCLE1BQU1oVixRQUFRcVc7QUFDN0IsUUFBTUMsYUFBYXRCLE1BQU11QixVQUFTO0FBQ2xDLFFBQU1DLFdBQVd4QixNQUFNeUIsVUFBVUgsY0FBY0QsU0FBUyxJQUFJO0FBQzVELFFBQU1LLFdBQVcxQixNQUFNMkIsYUFBYUw7QUFDcEMsU0FBTzdTLEtBQUt5SyxNQUFNekssS0FBSzZSLElBQUlrQixVQUFVRSxRQUFBQSxDQUFBQTtBQUN2QztBQU9BLFNBQVNSLGlCQUFpQlYsY0FBY1AsT0FBT0ksWUFBWTtBQUN6RCxRQUFNdUIsbUJBQW1CQyxlQUFlckIsWUFBQUE7QUFDeEMsUUFBTVMsVUFBVWhCLE1BQU14VCxTQUFTNFQ7QUFJL0IsTUFBSSxDQUFDdUIsa0JBQWtCO0FBQ3JCLFdBQU9uVCxLQUFLd0csSUFBSWdNLFNBQVMsQ0FBQTs7QUFHM0IsUUFBTWEsVUFBVUMsV0FBV0gsZ0JBQUFBO0FBQzNCLFdBQVNoVSxJQUFJLEdBQUdDLE9BQU9pVSxRQUFRclYsU0FBUyxHQUFHbUIsSUFBSUMsTUFBTUQsS0FBSztBQUN4RCxVQUFNbUcsU0FBUytOLFFBQVFsVSxDQUFFO0FBQ3pCLFFBQUltRyxTQUFTa04sU0FBUztBQUNwQixhQUFPbE47O0VBRVg7QUFDQSxTQUFPdEYsS0FBS3dHLElBQUlnTSxTQUFTLENBQUE7QUFDM0I7QUFLQSxTQUFTTixnQkFBZ0JWLE9BQU87QUFDOUIsUUFBTStCLFNBQVMsQ0FBQTtBQUNmLE1BQUlwVSxHQUFHQztBQUNQLE9BQUtELElBQUksR0FBR0MsT0FBT29TLE1BQU14VCxRQUFRbUIsSUFBSUMsTUFBTUQsS0FBSztBQUM5QyxRQUFJcVMsTUFBTXJTLENBQUUsRUFBQzZTLE9BQU87QUFDbEJ1QixhQUFPdFMsS0FBSzlCLENBQUFBOztFQUVoQjtBQUNBLFNBQU9vVTtBQUNUO0FBUUEsU0FBU2hCLFdBQVdmLE9BQU9jLFVBQVVQLGNBQWNTLFNBQVM7QUFDMUQsTUFBSTNOLFFBQVE7QUFDWixNQUFJMk8sT0FBT3pCLGFBQWEsQ0FBRTtBQUMxQixNQUFJNVM7QUFFSnFULFlBQVV4UyxLQUFLeVQsS0FBS2pCLE9BQUFBO0FBQ3BCLE9BQUtyVCxJQUFJLEdBQUdBLElBQUlxUyxNQUFNeFQsUUFBUW1CLEtBQUs7QUFDakMsUUFBSUEsTUFBTXFVLE1BQU07QUFDZGxCLGVBQVNyUixLQUFLdVEsTUFBTXJTLENBQUUsQ0FBQTtBQUN0QjBGO0FBQ0EyTyxhQUFPekIsYUFBYWxOLFFBQVEyTixPQUFROztFQUV4QztBQUNGO0FBU0EsU0FBU2hULEtBQUtnUyxPQUFPYyxVQUFVRSxTQUFTa0IsWUFBWUMsVUFBVTtBQUM1RCxRQUFNbFYsUUFBUW1WLGVBQWVGLFlBQVksQ0FBQTtBQUN6QyxRQUFNaFYsTUFBTXNCLEtBQUs2UixJQUFJK0IsZUFBZUQsVUFBVW5DLE1BQU14VCxNQUFNLEdBQUd3VCxNQUFNeFQsTUFBTTtBQUN6RSxNQUFJNkcsUUFBUTtBQUNaLE1BQUk3RyxRQUFRbUIsR0FBR3FVO0FBRWZoQixZQUFVeFMsS0FBS3lULEtBQUtqQixPQUFBQTtBQUNwQixNQUFJbUIsVUFBVTtBQUNaM1YsYUFBUzJWLFdBQVdEO0FBQ3BCbEIsY0FBVXhVLFNBQVNnQyxLQUFLeUssTUFBTXpNLFNBQVN3VSxPQUFBQTs7QUFHekNnQixTQUFPL1U7QUFFUCxTQUFPK1UsT0FBTyxHQUFHO0FBQ2YzTztBQUNBMk8sV0FBT3hULEtBQUsyUyxNQUFNbFUsUUFBUW9HLFFBQVEyTixPQUFBQTtFQUNwQztBQUVBLE9BQUtyVCxJQUFJYSxLQUFLd0csSUFBSS9ILE9BQU8sQ0FBSVUsR0FBQUEsSUFBSVQsS0FBS1MsS0FBSztBQUN6QyxRQUFJQSxNQUFNcVUsTUFBTTtBQUNkbEIsZUFBU3JSLEtBQUt1USxNQUFNclMsQ0FBRSxDQUFBO0FBQ3RCMEY7QUFDQTJPLGFBQU94VCxLQUFLMlMsTUFBTWxVLFFBQVFvRyxRQUFRMk4sT0FBQUE7O0VBRXRDO0FBQ0Y7QUFNQSxTQUFTWSxlQUFlUyxLQUFLO0FBQzNCLFFBQU1DLE1BQU1ELElBQUk3VjtBQUNoQixNQUFJbUIsR0FBR2pDO0FBRVAsTUFBSTRXLE1BQU0sR0FBRztBQUNYLFdBQU87O0FBR1QsT0FBSzVXLE9BQU8yVyxJQUFJLENBQUUsR0FBRTFVLElBQUksR0FBR0EsSUFBSTJVLEtBQUssRUFBRTNVLEdBQUc7QUFDdkMsUUFBSTBVLElBQUkxVSxDQUFFLElBQUcwVSxJQUFJMVUsSUFBSSxDQUFFLE1BQUtqQyxNQUFNO0FBQ2hDLGFBQU87O0VBRVg7QUFDQSxTQUFPQTtBQUNUO0FDaktBLElBQU02VyxlQUFlLENBQUNDLFVBQVVBLFVBQVUsU0FBUyxVQUFVQSxVQUFVLFVBQVUsU0FBU0E7QUFDMUYsSUFBTUMsaUJBQWlCLENBQUMxQyxPQUFPMkMsTUFBTXRCLFdBQVdzQixTQUFTLFNBQVNBLFNBQVMsU0FBUzNDLE1BQU0yQyxJQUFBQSxJQUFRdEIsU0FBU3JCLE1BQU0yQyxJQUFBQSxJQUFRdEI7QUFDekgsSUFBTXVCLGdCQUFnQixDQUFDQyxhQUFhdEMsa0JBQWtCOVIsS0FBSzZSLElBQUlDLGlCQUFpQnNDLGFBQWFBLFdBQUFBO0FBWTdGLFNBQVNDLE9BQU9SLEtBQUtTLFVBQVU7QUFDN0IsUUFBTWYsU0FBUyxDQUFBO0FBQ2YsUUFBTWdCLFlBQVlWLElBQUk3VixTQUFTc1c7QUFDL0IsUUFBTVIsTUFBTUQsSUFBSTdWO0FBQ2hCLE1BQUltQixJQUFJO0FBRVIsU0FBT0EsSUFBSTJVLEtBQUszVSxLQUFLb1YsV0FBVztBQUM5QmhCLFdBQU90UyxLQUFLNFMsSUFBSTdULEtBQUt5SyxNQUFNdEwsQ0FBRyxDQUFBLENBQUE7RUFDaEM7QUFDQSxTQUFPb1U7QUFDVDtBQU9BLFNBQVNpQixvQkFBb0JqRCxPQUFPbFMsT0FBT29WLGlCQUFpQjtBQUMxRCxRQUFNelcsU0FBU3VULE1BQU1DLE1BQU14VDtBQUMzQixRQUFNMFcsY0FBYTFVLEtBQUs2UixJQUFJeFMsT0FBT3JCLFNBQVMsQ0FBQTtBQUM1QyxRQUFNUyxRQUFROFMsTUFBTW9EO0FBQ3BCLFFBQU1qVyxNQUFNNlMsTUFBTXFEO0FBQ2xCLFFBQU1DLFVBQVU7QUFDaEIsTUFBSUMsWUFBWXZELE1BQU13RCxnQkFBZ0JMLFdBQUFBO0FBQ3RDLE1BQUk5QjtBQUVKLE1BQUk2QixpQkFBaUI7QUFDbkIsUUFBSXpXLFdBQVcsR0FBRztBQUNoQjRVLGVBQVM1UyxLQUFLd0csSUFBSXNPLFlBQVlyVyxPQUFPQyxNQUFNb1csU0FBQUE7ZUFDbEN6VixVQUFVLEdBQUc7QUFDdEJ1VCxnQkFBVXJCLE1BQU13RCxnQkFBZ0IsQ0FBQSxJQUFLRCxhQUFhO1dBQzdDO0FBQ0xsQyxnQkFBVWtDLFlBQVl2RCxNQUFNd0QsZ0JBQWdCTCxjQUFhLENBQUEsS0FBTTs7QUFFakVJLGlCQUFhSixjQUFhclYsUUFBUXVULFNBQVMsQ0FBQ0E7QUFHNUMsUUFBSWtDLFlBQVlyVyxRQUFRb1csV0FBV0MsWUFBWXBXLE1BQU1tVyxTQUFTO0FBQzVEOzs7QUFHSixTQUFPQztBQUNUO0FBTUEsU0FBU0UsZUFBZUMsUUFBUWpYLFFBQVE7QUFDdENzTCxPQUFLMkwsUUFBUSxDQUFDQyxVQUFVO0FBQ3RCLFVBQU1DLEtBQUtELE1BQU1DO0FBQ2pCLFVBQU1DLFFBQVFELEdBQUduWCxTQUFTO0FBQzFCLFFBQUltQjtBQUNKLFFBQUlpVyxRQUFRcFgsUUFBUTtBQUNsQixXQUFLbUIsSUFBSSxHQUFHQSxJQUFJaVcsT0FBTyxFQUFFalcsR0FBRztBQUMxQixlQUFPK1YsTUFBTXRYLEtBQUt1WCxHQUFHaFcsQ0FBQUEsQ0FBRTtNQUN6QjtBQUNBZ1csU0FBR25NLE9BQU8sR0FBR29NLEtBQUFBOztFQUVqQixDQUFBO0FBQ0Y7QUFLQSxTQUFTQyxrQkFBa0I5WSxTQUFTO0FBQ2xDLFNBQU9BLFFBQVErWSxZQUFZL1ksUUFBUXNXLGFBQWE7QUFDbEQ7QUFLQSxTQUFTMEMsZUFBZWhaLFNBQVNpWixVQUFVO0FBQ3pDLE1BQUksQ0FBQ2paLFFBQVFvTixTQUFTO0FBQ3BCLFdBQU87O0FBR1QsUUFBTThMLE9BQU9DLE9BQU9uWixRQUFRa1osTUFBTUQsUUFBQUE7QUFDbEMsUUFBTWpOLFVBQVVZLFVBQVU1TSxRQUFRZ00sT0FBTztBQUN6QyxRQUFNb04sUUFBUUMsUUFBUXJaLFFBQVFzWixJQUFJLElBQUl0WixRQUFRc1osS0FBSzdYLFNBQVM7QUFFNUQsU0FBTyxRQUFTeVgsS0FBS0ssYUFBY3ZOLFFBQVE5QztBQUM3QztBQUVBLFNBQVNzUSxtQkFBbUJDLFFBQVF6RSxPQUFPO0FBQ3pDLFNBQU8wRSxjQUFjRCxRQUFRO0lBQzNCekU7SUFDQW5ILE1BQU07RUFDUixDQUFBO0FBQ0Y7QUFFQSxTQUFTOEwsa0JBQWtCRixRQUFRM1csT0FBTzhXLE1BQU07QUFDOUMsU0FBT0YsY0FBY0QsUUFBUTtJQUMzQkc7SUFDQTlXO0lBQ0ErSyxNQUFNO0VBQ1IsQ0FBQTtBQUNGO0FBRUEsU0FBU2dNLFdBQVdwQyxPQUFPalYsVUFBVTBFLFNBQVM7QUFFNUMsTUFBSXlOLE1BQU1tRixtQkFBbUJyQyxLQUFBQTtBQUM3QixNQUFJLFdBQVlqVixhQUFhLFdBQWEsQ0FBQzBFLFdBQVcxRSxhQUFhLFNBQVU7QUFDM0VtUyxVQUFNNkMsYUFBYTdDLEdBQUFBOztBQUVyQixTQUFPQTtBQUNUO0FBRUEsU0FBU29GLFVBQVUvRSxPQUFPcUIsUUFBUTdULFVBQVVpVixPQUFPO0FBQ2pELFFBQU0sRUFBQ2xPLEtBQUtGLE1BQU1HLFFBQVFGLE9BQU8vRyxNQUFLLElBQUl5UztBQUMxQyxRQUFNLEVBQUN4USxXQUFXd1YsT0FBQUEsSUFBVXpYO0FBQzVCLE1BQUkwWCxXQUFXO0FBQ2YsTUFBSUMsVUFBVUMsUUFBUUM7QUFDdEIsUUFBTWxSLFNBQVNNLFNBQVNEO0FBQ3hCLFFBQU1QLFFBQVFNLFFBQVFEO0FBRXRCLE1BQUkyTCxNQUFNak4sYUFBWSxHQUFJO0FBQ3hCb1MsYUFBU0UsZUFBZTVDLE9BQU9wTyxNQUFNQyxLQUFBQTtBQUVyQyxRQUFJZSxTQUFTN0gsUUFBVyxHQUFBO0FBQ3RCLFlBQU04WCxpQkFBaUJuYSxPQUFPb1QsS0FBSy9RLFFBQUFBLEVBQVUsQ0FBRTtBQUMvQyxZQUFNdEIsUUFBUXNCLFNBQVM4WCxjQUFlO0FBQ3RDRixlQUFTSixPQUFPTSxjQUFBQSxFQUFnQkMsaUJBQWlCclosS0FBQUEsSUFBU2dJLFNBQVNtTjtlQUMxRDdULGFBQWEsVUFBVTtBQUNoQzRYLGdCQUFVNVYsVUFBVWdGLFNBQVNoRixVQUFVK0UsT0FBTyxJQUFJTCxTQUFTbU47V0FDdEQ7QUFDTCtELGVBQVMxQyxlQUFlMUMsT0FBT3hTLFVBQVU2VCxNQUFBQTs7QUFFM0M2RCxlQUFXNVEsUUFBUUQ7U0FDZDtBQUNMLFFBQUlnQixTQUFTN0gsUUFBVyxHQUFBO0FBQ3RCLFlBQU04WCxpQkFBaUJuYSxPQUFPb1QsS0FBSy9RLFFBQUFBLEVBQVUsQ0FBRTtBQUMvQyxZQUFNdEIsUUFBUXNCLFNBQVM4WCxjQUFlO0FBQ3RDSCxlQUFTSCxPQUFPTSxjQUFBQSxFQUFnQkMsaUJBQWlCclosS0FBQUEsSUFBUzhILFFBQVFxTjtlQUN6RDdULGFBQWEsVUFBVTtBQUNoQzJYLGdCQUFVM1YsVUFBVTZFLE9BQU83RSxVQUFVOEUsU0FBUyxJQUFJTixRQUFRcU47V0FDckQ7QUFDTDhELGVBQVN6QyxlQUFlMUMsT0FBT3hTLFVBQVU2VCxNQUFBQTs7QUFFM0MrRCxhQUFTQyxlQUFlNUMsT0FBT2pPLFFBQVFELEdBQUFBO0FBQ3ZDMFEsZUFBV3pYLGFBQWEsU0FBUyxDQUFDZ1ksVUFBVUE7O0FBRTlDLFNBQU87SUFBQ0w7SUFBUUM7SUFBUUY7SUFBVUQ7RUFBUTtBQUM1QztBQUVlLElBQU1RLFFBQU4sTUFBTUEsZUFBY3ZHLFFBQUFBO0VBR2pDblUsWUFBWTJhLEtBQUs7QUFDZixVQUFLO0FBR0wsU0FBS0MsS0FBS0QsSUFBSUM7QUFFZCxTQUFLOU0sT0FBTzZNLElBQUk3TTtBQUVoQixTQUFLN04sVUFBVThQO0FBRWYsU0FBS21ELE1BQU15SCxJQUFJekg7QUFFZixTQUFLMVEsUUFBUW1ZLElBQUluWTtBQUlqQixTQUFLZ0gsTUFBTXVHO0FBRVgsU0FBS3RHLFNBQVNzRztBQUVkLFNBQUt6RyxPQUFPeUc7QUFFWixTQUFLeEcsUUFBUXdHO0FBRWIsU0FBSzlHLFFBQVE4RztBQUViLFNBQUs1RyxTQUFTNEc7QUFDZCxTQUFLOEssV0FBVztNQUNkdlIsTUFBTTtNQUNOQyxPQUFPO01BQ1BDLEtBQUs7TUFDTEMsUUFBUTtJQUNWO0FBRUEsU0FBSzBRLFdBQVdwSztBQUVoQixTQUFLK0ssWUFBWS9LO0FBRWpCLFNBQUtnTCxhQUFhaEw7QUFFbEIsU0FBS2lMLGdCQUFnQmpMO0FBRXJCLFNBQUtrTCxjQUFjbEw7QUFFbkIsU0FBS21MLGVBQWVuTDtBQUlwQixTQUFLN08sT0FBTzZPO0FBRVosU0FBS29MLGdCQUFnQnBMO0FBQ3JCLFNBQUt3RixNQUFNeEY7QUFDWCxTQUFLN0YsTUFBTTZGO0FBQ1gsU0FBS3FMLFNBQVNyTDtBQUVkLFNBQUttRixRQUFRLENBQUE7QUFFYixTQUFLbUcsaUJBQWlCO0FBRXRCLFNBQUtDLGNBQWM7QUFFbkIsU0FBS0MsY0FBYztBQUNuQixTQUFLN0UsVUFBVTtBQUNmLFNBQUtFLGFBQWE7QUFDbEIsU0FBSzRFLG9CQUFvQixDQUFBO0FBRXpCLFNBQUtuRCxjQUFjdEk7QUFFbkIsU0FBS3VJLFlBQVl2STtBQUNqQixTQUFLbk8saUJBQWlCO0FBQ3RCLFNBQUs2WixXQUFXMUw7QUFDaEIsU0FBSzJMLFdBQVczTDtBQUNoQixTQUFLNEwsZ0JBQWdCNUw7QUFDckIsU0FBSzZMLGdCQUFnQjdMO0FBQ3JCLFNBQUs4TCxlQUFlO0FBQ3BCLFNBQUtDLGVBQWU7QUFDcEIsU0FBS0MsU0FBUyxDQUFBO0FBQ2QsU0FBS0Msb0JBQW9CO0FBQ3pCLFNBQUtDLFdBQVdsTTtFQUNsQjtFQU1BeFAsS0FBS04sU0FBUztBQUNaLFNBQUtBLFVBQVVBLFFBQVFpYyxXQUFXLEtBQUsxTixXQUFVLENBQUE7QUFFakQsU0FBS3ROLE9BQU9qQixRQUFRaUI7QUFHcEIsU0FBS3dhLFdBQVcsS0FBS2piLE1BQU1SLFFBQVFzVixHQUFHO0FBQ3RDLFNBQUtrRyxXQUFXLEtBQUtoYixNQUFNUixRQUFRaUssR0FBRztBQUN0QyxTQUFLMFIsZ0JBQWdCLEtBQUtuYixNQUFNUixRQUFRa2MsWUFBWTtBQUNwRCxTQUFLUixnQkFBZ0IsS0FBS2xiLE1BQU1SLFFBQVFtYyxZQUFZO0VBQ3REO0VBUUEzYixNQUFNNGIsS0FBS3RaLE9BQU87QUFDaEIsV0FBT3NaO0VBQ1Q7RUFPQUMsZ0JBQWdCO0FBQ2QsUUFBSSxFQUFDWixVQUFVRCxVQUFVRyxlQUFlRCxjQUFBQSxJQUFpQjtBQUN6REQsZUFBV2EsZ0JBQWdCYixVQUFVcFcsT0FBT0MsaUJBQWlCO0FBQzdEa1csZUFBV2MsZ0JBQWdCZCxVQUFVblcsT0FBT2tYLGlCQUFpQjtBQUM3RFosb0JBQWdCVyxnQkFBZ0JYLGVBQWV0VyxPQUFPQyxpQkFBaUI7QUFDdkVvVyxvQkFBZ0JZLGdCQUFnQlosZUFBZXJXLE9BQU9rWCxpQkFBaUI7QUFDdkUsV0FBTztNQUNMakgsS0FBS2dILGdCQUFnQmIsVUFBVUUsYUFBQUE7TUFDL0IxUixLQUFLcVMsZ0JBQWdCZCxVQUFVRSxhQUFBQTtNQUMvQmMsWUFBWUMsZUFBU2hCLFFBQUFBO01BQ3JCaUIsWUFBWUQsZUFBU2pCLFFBQUFBO0lBQ3ZCO0VBQ0Y7RUFRQW1CLFVBQVVDLFVBQVU7QUFFbEIsUUFBSSxFQUFDdEgsS0FBS3JMLEtBQUt1UyxZQUFZRSxXQUFBQSxJQUFjLEtBQUtMLGNBQWE7QUFDM0QsUUFBSXJhO0FBRUosUUFBSXdhLGNBQWNFLFlBQVk7QUFDNUIsYUFBTztRQUFDcEg7UUFBS3JMO01BQUc7O0FBR2xCLFVBQU00UyxRQUFRLEtBQUtDLHdCQUF1QjtBQUMxQyxhQUFTbGEsSUFBSSxHQUFHQyxPQUFPZ2EsTUFBTXBiLFFBQVFtQixJQUFJQyxNQUFNLEVBQUVELEdBQUc7QUFDbERaLGNBQVE2YSxNQUFNamEsQ0FBRSxFQUFDeEIsV0FBV3ViLFVBQVUsTUFBTUMsUUFBQUE7QUFDNUMsVUFBSSxDQUFDSixZQUFZO0FBQ2ZsSCxjQUFNN1IsS0FBSzZSLElBQUlBLEtBQUt0VCxNQUFNc1QsR0FBRzs7QUFFL0IsVUFBSSxDQUFDb0gsWUFBWTtBQUNmelMsY0FBTXhHLEtBQUt3RyxJQUFJQSxLQUFLakksTUFBTWlJLEdBQUc7O0lBRWpDO0FBR0FxTCxVQUFNb0gsY0FBY3BILE1BQU1yTCxNQUFNQSxNQUFNcUw7QUFDdENyTCxVQUFNdVMsY0FBY2xILE1BQU1yTCxNQUFNcUwsTUFBTXJMO0FBRXRDLFdBQU87TUFDTHFMLEtBQUtnSCxnQkFBZ0JoSCxLQUFLZ0gsZ0JBQWdCclMsS0FBS3FMLEdBQUFBLENBQUFBO01BQy9DckwsS0FBS3FTLGdCQUFnQnJTLEtBQUtxUyxnQkFBZ0JoSCxLQUFLckwsR0FBQUEsQ0FBQUE7SUFDakQ7RUFDRjtFQU9BSyxhQUFhO0FBQ1gsV0FBTztNQUNMakIsTUFBTSxLQUFLMlIsZUFBZTtNQUMxQnpSLEtBQUssS0FBS3VSLGNBQWM7TUFDeEJ4UixPQUFPLEtBQUsyUixnQkFBZ0I7TUFDNUJ6UixRQUFRLEtBQUt1UixpQkFBaUI7SUFDaEM7RUFDRjtFQU9BZ0MsV0FBVztBQUNULFdBQU8sS0FBSzlIO0VBQ2Q7RUFLQStILFlBQVk7QUFDVixVQUFNM2IsT0FBTyxLQUFLa0IsTUFBTWxCO0FBQ3hCLFdBQU8sS0FBS3JCLFFBQVFpZCxXQUFXLEtBQUtsVixhQUFZLElBQUsxRyxLQUFLNmIsVUFBVTdiLEtBQUs4YixZQUFZOWIsS0FBSzRiLFVBQVUsQ0FBQTtFQUN0RztFQUtBRyxjQUFjNVksWUFBWSxLQUFLakMsTUFBTWlDLFdBQVc7QUFDOUMsVUFBTUwsUUFBUSxLQUFLa1gsZ0JBQWdCLEtBQUtBLGNBQWMsS0FBS2dDLG1CQUFtQjdZLFNBQVM7QUFDdkYsV0FBT0w7RUFDVDtFQUdBNkksZUFBZTtBQUNiLFNBQUs4TyxTQUFTLENBQUE7QUFDZCxTQUFLQyxvQkFBb0I7RUFDM0I7RUFNQXVCLGVBQWU7QUFDYkMsYUFBSyxLQUFLdmQsUUFBUXNkLGNBQWM7TUFBQztJQUFLLENBQUE7RUFDeEM7RUFVQTFSLE9BQU9zTyxVQUFVVyxXQUFXMkMsU0FBUztBQUNuQyxVQUFNLEVBQUNDLGFBQWFDLE9BQU96SSxPQUFPQyxTQUFBQSxJQUFZLEtBQUtsVjtBQUNuRCxVQUFNMmQsYUFBYXpJLFNBQVN5STtBQUc1QixTQUFLTCxhQUFZO0FBR2pCLFNBQUtwRCxXQUFXQTtBQUNoQixTQUFLVyxZQUFZQTtBQUNqQixTQUFLRCxXQUFXNEMsVUFBVXJkLE9BQU9DLE9BQU87TUFDdENpSixNQUFNO01BQ05DLE9BQU87TUFDUEMsS0FBSztNQUNMQyxRQUFRO09BQ1BnVSxPQUFBQTtBQUVILFNBQUt2SSxRQUFRO0FBQ2IsU0FBS3FHLGNBQWM7QUFDbkIsU0FBS0YsaUJBQWlCO0FBQ3RCLFNBQUtDLGNBQWM7QUFHbkIsU0FBS3VDLG9CQUFtQjtBQUN4QixTQUFLQyxjQUFhO0FBQ2xCLFNBQUtDLG1CQUFrQjtBQUV2QixTQUFLbkgsYUFBYSxLQUFLNU8sYUFBWSxJQUMvQixLQUFLaUIsUUFBUXdVLFFBQVFuVSxPQUFPbVUsUUFBUWxVLFFBQ3BDLEtBQUtKLFNBQVNzVSxRQUFRalUsTUFBTWlVLFFBQVFoVTtBQUd4QyxRQUFJLENBQUMsS0FBS3VTLG1CQUFtQjtBQUMzQixXQUFLZ0MsaUJBQWdCO0FBQ3JCLFdBQUtDLG9CQUFtQjtBQUN4QixXQUFLQyxnQkFBZTtBQUNwQixXQUFLOUMsU0FBUytDLFVBQVUsTUFBTVIsT0FBT0QsV0FBQUE7QUFDckMsV0FBSzFCLG9CQUFvQjs7QUFHM0IsU0FBS29DLGlCQUFnQjtBQUVyQixTQUFLbEosUUFBUSxLQUFLbUosV0FBVSxLQUFNLENBQUE7QUFHbEMsU0FBS0MsZ0JBQWU7QUFJcEIsVUFBTUMsa0JBQWtCWCxhQUFhLEtBQUsxSSxNQUFNeFQ7QUFDaEQsU0FBSzhjLHNCQUFzQkQsa0JBQWtCeEcsT0FBTyxLQUFLN0MsT0FBTzBJLFVBQUFBLElBQWMsS0FBSzFJLEtBQUs7QUFNeEYsU0FBS3ZJLFVBQVM7QUFHZCxTQUFLOFIsNkJBQTRCO0FBQ2pDLFNBQUtDLHVCQUFzQjtBQUMzQixTQUFLQyw0QkFBMkI7QUFHaEMsUUFBSXhKLFNBQVM5SCxZQUFZOEgsU0FBU0gsWUFBWUcsU0FBU3lKLFdBQVcsU0FBUztBQUN6RSxXQUFLMUosUUFBUUYsU0FBUyxNQUFNLEtBQUtFLEtBQUs7QUFDdEMsV0FBS3FHLGNBQWM7QUFDbkIsV0FBS3NELGNBQWE7O0FBR3BCLFFBQUlOLGlCQUFpQjtBQUVuQixXQUFLQyxzQkFBc0IsS0FBS3RKLEtBQUs7O0FBR3ZDLFNBQUs0SixVQUFTO0FBQ2QsU0FBS0MsSUFBRztBQUNSLFNBQUtDLFNBQVE7QUFJYixTQUFLQyxZQUFXO0VBQ2xCO0VBS0F0UyxZQUFZO0FBQ1YsUUFBSXVTLGdCQUFnQixLQUFLamYsUUFBUWtIO0FBQ2pDLFFBQUlnWSxZQUFZQztBQUVoQixRQUFJLEtBQUtwWCxhQUFZLEdBQUk7QUFDdkJtWCxtQkFBYSxLQUFLN1Y7QUFDbEI4VixpQkFBVyxLQUFLN1Y7V0FDWDtBQUNMNFYsbUJBQWEsS0FBSzNWO0FBQ2xCNFYsaUJBQVcsS0FBSzNWO0FBRWhCeVYsc0JBQWdCLENBQUNBOztBQUVuQixTQUFLN0csY0FBYzhHO0FBQ25CLFNBQUs3RyxZQUFZOEc7QUFDakIsU0FBS3hkLGlCQUFpQnNkO0FBQ3RCLFNBQUt4SSxVQUFVMEksV0FBV0Q7QUFDMUIsU0FBS0UsaUJBQWlCLEtBQUtwZixRQUFRcWY7RUFDckM7RUFFQUwsY0FBYztBQUNaekIsYUFBSyxLQUFLdmQsUUFBUWdmLGFBQWE7TUFBQztJQUFLLENBQUE7RUFDdkM7RUFJQXBCLHNCQUFzQjtBQUNwQkwsYUFBSyxLQUFLdmQsUUFBUTRkLHFCQUFxQjtNQUFDO0lBQUssQ0FBQTtFQUMvQztFQUNBQyxnQkFBZ0I7QUFFZCxRQUFJLEtBQUs5VixhQUFZLEdBQUk7QUFFdkIsV0FBS2lCLFFBQVEsS0FBS2tSO0FBQ2xCLFdBQUs3USxPQUFPO0FBQ1osV0FBS0MsUUFBUSxLQUFLTjtXQUNiO0FBQ0wsV0FBS0UsU0FBUyxLQUFLMlI7QUFHbkIsV0FBS3RSLE1BQU07QUFDWCxXQUFLQyxTQUFTLEtBQUtOOztBQUlyQixTQUFLOFIsY0FBYztBQUNuQixTQUFLRixhQUFhO0FBQ2xCLFNBQUtHLGVBQWU7QUFDcEIsU0FBS0YsZ0JBQWdCO0VBQ3ZCO0VBQ0ErQyxxQkFBcUI7QUFDbkJQLGFBQUssS0FBS3ZkLFFBQVE4ZCxvQkFBb0I7TUFBQztJQUFLLENBQUE7RUFDOUM7RUFFQXdCLFdBQVdDLE1BQU07QUFDZixTQUFLaGQsTUFBTWlkLGNBQWNELE1BQU0sS0FBS2hSLFdBQVUsQ0FBQTtBQUM5Q2dQLGFBQUssS0FBS3ZkLFFBQVF1ZixJQUFBQSxHQUFPO01BQUM7SUFBSyxDQUFBO0VBQ2pDO0VBR0F4QixtQkFBbUI7QUFDakIsU0FBS3VCLFdBQVcsa0JBQUE7RUFDbEI7RUFDQXRCLHNCQUFzQjtFQUFBO0VBQ3RCQyxrQkFBa0I7QUFDaEIsU0FBS3FCLFdBQVcsaUJBQUE7RUFDbEI7RUFHQW5CLG1CQUFtQjtBQUNqQixTQUFLbUIsV0FBVyxrQkFBQTtFQUNsQjtFQUlBbEIsYUFBYTtBQUNYLFdBQU8sQ0FBQTtFQUNUO0VBQ0FDLGtCQUFrQjtBQUNoQixTQUFLaUIsV0FBVyxpQkFBQTtFQUNsQjtFQUVBRyw4QkFBOEI7QUFDNUJsQyxhQUFLLEtBQUt2ZCxRQUFReWYsNkJBQTZCO01BQUM7SUFBSyxDQUFBO0VBQ3ZEO0VBS0FDLG1CQUFtQnpLLE9BQU87QUFDeEIsVUFBTUMsV0FBVyxLQUFLbFYsUUFBUWlWO0FBQzlCLFFBQUlyUyxHQUFHQyxNQUFNK1c7QUFDYixTQUFLaFgsSUFBSSxHQUFHQyxPQUFPb1MsTUFBTXhULFFBQVFtQixJQUFJQyxNQUFNRCxLQUFLO0FBQzlDZ1gsYUFBTzNFLE1BQU1yUyxDQUFFO0FBQ2ZnWCxXQUFLK0YsUUFBUXBDLFNBQUtySSxTQUFTMEssVUFBVTtRQUFDaEcsS0FBSzFZO1FBQU8wQjtRQUFHcVM7TUFBTSxHQUFFLElBQUk7SUFDbkU7RUFDRjtFQUNBNEssNkJBQTZCO0FBQzNCdEMsYUFBSyxLQUFLdmQsUUFBUTZmLDRCQUE0QjtNQUFDO0lBQUssQ0FBQTtFQUN0RDtFQUlBckIsK0JBQStCO0FBQzdCakIsYUFBSyxLQUFLdmQsUUFBUXdlLDhCQUE4QjtNQUFDO0lBQUssQ0FBQTtFQUN4RDtFQUNBQyx5QkFBeUI7QUFDdkIsVUFBTXplLFVBQVUsS0FBS0E7QUFDckIsVUFBTWtWLFdBQVdsVixRQUFRaVY7QUFDekIsVUFBTTZLLFdBQVdsSSxjQUFjLEtBQUszQyxNQUFNeFQsUUFBUXpCLFFBQVFpVixNQUFNTSxhQUFhO0FBQzdFLFVBQU13SyxjQUFjN0ssU0FBUzZLLGVBQWU7QUFDNUMsVUFBTUMsY0FBYzlLLFNBQVM4SztBQUM3QixRQUFJOUUsZ0JBQWdCNkU7QUFDcEIsUUFBSUUsV0FBV3BGLFdBQVdxRjtBQUUxQixRQUFJLENBQUMsS0FBS0MsV0FBVSxLQUFNLENBQUNqTCxTQUFTOUgsV0FBVzJTLGVBQWVDLGVBQWVGLFlBQVksS0FBSyxDQUFDLEtBQUsvWCxhQUFZLEdBQUk7QUFDbEgsV0FBS21ULGdCQUFnQjZFO0FBQ3JCOztBQUdGLFVBQU1LLGFBQWEsS0FBS0MsZUFBYztBQUN0QyxVQUFNQyxnQkFBZ0JGLFdBQVdHLE9BQU92WDtBQUN4QyxVQUFNd1gsaUJBQWlCSixXQUFXSyxRQUFRdlg7QUFJMUMsVUFBTWdSLFdBQVd3RyxZQUFZLEtBQUtuZSxNQUFNeUcsUUFBUXNYLGVBQWUsR0FBRyxLQUFLcEcsUUFBUTtBQUMvRStGLGdCQUFZamdCLFFBQVFxVyxTQUFTLEtBQUs2RCxXQUFXNEYsV0FBVzVGLFlBQVk0RixXQUFXO0FBRy9FLFFBQUlRLGdCQUFnQixJQUFJTCxXQUFXO0FBQ2pDQSxrQkFBWS9GLFlBQVk0RixZQUFZOWYsUUFBUXFXLFNBQVMsTUFBTTtBQUMzRHdFLGtCQUFZLEtBQUtBLFlBQVkvQixrQkFBa0I5WSxRQUFRMmdCLElBQUksSUFDM0R6TCxTQUFTbEosVUFBVWdOLGVBQWVoWixRQUFRNGdCLE9BQU8sS0FBS3JlLE1BQU12QyxRQUFRa1osSUFBSTtBQUN4RWdILHlCQUFtQnpjLEtBQUtLLEtBQUt3YyxnQkFBZ0JBLGdCQUFnQkUsaUJBQWlCQSxjQUFBQTtBQUM5RXRGLHNCQUFnQjJGLFVBQVVwZCxLQUFLNlIsSUFDN0I3UixLQUFLcWQsS0FBS0osYUFBYU4sV0FBV0ssUUFBUXZYLFNBQVMsS0FBSytXLFdBQVcsSUFBSSxDQUFBLENBQUEsR0FDdkV4YyxLQUFLcWQsS0FBS0osWUFBWTdGLFlBQVlxRixrQkFBa0IsSUFBSSxDQUFBLENBQUEsSUFBTXpjLEtBQUtxZCxLQUFLSixZQUFZRixpQkFBaUJOLGtCQUFrQixJQUFJLENBQUEsQ0FBQSxDQUFBLENBQUE7QUFFN0hoRixzQkFBZ0J6WCxLQUFLd0csSUFBSThWLGFBQWF0YyxLQUFLNlIsSUFBSTBLLGFBQWE5RSxhQUFBQSxDQUFBQTs7QUFHOUQsU0FBS0EsZ0JBQWdCQTtFQUN2QjtFQUNBd0QsOEJBQThCO0FBQzVCbkIsYUFBSyxLQUFLdmQsUUFBUTBlLDZCQUE2QjtNQUFDO0lBQUssQ0FBQTtFQUN2RDtFQUNBRSxnQkFBZ0I7RUFBQTtFQUloQkMsWUFBWTtBQUNWdEIsYUFBSyxLQUFLdmQsUUFBUTZlLFdBQVc7TUFBQztJQUFLLENBQUE7RUFDckM7RUFDQUMsTUFBTTtBQUVKLFVBQU1pQyxVQUFVO01BQ2QvWCxPQUFPO01BQ1BFLFFBQVE7SUFDVjtBQUVBLFVBQU0sRUFBQzNHLE9BQU92QyxTQUFTLEVBQUNpVixPQUFPQyxVQUFVMEwsT0FBT0ksV0FBV0wsTUFBTU0sU0FBQUEsRUFBUyxJQUFJO0FBQzlFLFVBQU03VCxVQUFVLEtBQUsrUyxXQUFVO0FBQy9CLFVBQU1wWSxlQUFlLEtBQUtBLGFBQVk7QUFFdEMsUUFBSXFGLFNBQVM7QUFDWCxZQUFNOFQsY0FBY2xJLGVBQWVnSSxXQUFXemUsTUFBTXZDLFFBQVFrWixJQUFJO0FBQ2hFLFVBQUluUixjQUFjO0FBQ2hCZ1osZ0JBQVEvWCxRQUFRLEtBQUtrUjtBQUNyQjZHLGdCQUFRN1gsU0FBUzRQLGtCQUFrQm1JLFFBQVlDLElBQUFBO2FBQzFDO0FBQ0xILGdCQUFRN1gsU0FBUyxLQUFLMlI7QUFDdEJrRyxnQkFBUS9YLFFBQVE4UCxrQkFBa0JtSSxRQUFZQyxJQUFBQTs7QUFJaEQsVUFBSWhNLFNBQVM5SCxXQUFXLEtBQUs2SCxNQUFNeFQsUUFBUTtBQUN6QyxjQUFNLEVBQUNvVSxPQUFPQyxNQUFNeUssUUFBUUUsUUFBQUEsSUFBVyxLQUFLSixlQUFjO0FBQzFELGNBQU1jLGNBQWNqTSxTQUFTbEosVUFBVTtBQUN2QyxjQUFNb1YsZUFBZUMsVUFBVSxLQUFLbkcsYUFBYTtBQUNqRCxjQUFNb0csTUFBTTdkLEtBQUs2ZCxJQUFJRixZQUFBQTtBQUNyQixjQUFNRyxNQUFNOWQsS0FBSzhkLElBQUlILFlBQUFBO0FBRXJCLFlBQUlyWixjQUFjO0FBRWhCLGdCQUFNeVosY0FBY3RNLFNBQVN1TSxTQUFTLElBQUlGLE1BQU1oQixPQUFPdlgsUUFBUXNZLE1BQU1iLFFBQVF2WDtBQUM3RTZYLGtCQUFRN1gsU0FBU3pGLEtBQUs2UixJQUFJLEtBQUt1RixXQUFXa0csUUFBUTdYLFNBQVNzWSxjQUFjTCxXQUFBQTtlQUNwRTtBQUdMLGdCQUFNTyxhQUFheE0sU0FBU3VNLFNBQVMsSUFBSUgsTUFBTWYsT0FBT3ZYLFFBQVF1WSxNQUFNZCxRQUFRdlg7QUFFNUU2WCxrQkFBUS9YLFFBQVF2RixLQUFLNlIsSUFBSSxLQUFLNEUsVUFBVTZHLFFBQVEvWCxRQUFRMFksYUFBYVAsV0FBQUE7O0FBRXZFLGFBQUtRLGtCQUFrQjlMLE9BQU9DLE1BQU15TCxLQUFLRCxHQUFBQTs7O0FBSTdDLFNBQUtNLGVBQWM7QUFFbkIsUUFBSTdaLGNBQWM7QUFDaEIsV0FBS2lCLFFBQVEsS0FBS3lOLFVBQVVsVSxNQUFNeUcsUUFBUSxLQUFLNFIsU0FBU3ZSLE9BQU8sS0FBS3VSLFNBQVN0UjtBQUM3RSxXQUFLSixTQUFTNlgsUUFBUTdYO1dBQ2pCO0FBQ0wsV0FBS0YsUUFBUStYLFFBQVEvWDtBQUNyQixXQUFLRSxTQUFTLEtBQUt1TixVQUFVbFUsTUFBTTJHLFNBQVMsS0FBSzBSLFNBQVNyUixNQUFNLEtBQUtxUixTQUFTcFI7O0VBRWxGO0VBRUFtWSxrQkFBa0I5TCxPQUFPQyxNQUFNeUwsS0FBS0QsS0FBSztBQUN2QyxVQUFNLEVBQUNyTSxPQUFPLEVBQUN3QyxPQUFPekwsUUFBTyxHQUFHeEosU0FBUSxJQUFJLEtBQUt4QztBQUNqRCxVQUFNNmhCLFlBQVksS0FBSzNHLGtCQUFrQjtBQUN6QyxVQUFNNEcsbUJBQW1CdGYsYUFBYSxTQUFTLEtBQUt2QixTQUFTO0FBRTdELFFBQUksS0FBSzhHLGFBQVksR0FBSTtBQUN2QixZQUFNZ2EsYUFBYSxLQUFLdkosZ0JBQWdCLENBQUssSUFBQSxLQUFLblA7QUFDbEQsWUFBTTJZLGNBQWMsS0FBSzFZLFFBQVEsS0FBS2tQLGdCQUFnQixLQUFLdkQsTUFBTXhULFNBQVMsQ0FBQTtBQUMxRSxVQUFJdVosY0FBYztBQUNsQixVQUFJQyxlQUFlO0FBSW5CLFVBQUk0RyxXQUFXO0FBQ2IsWUFBSUMsa0JBQWtCO0FBQ3BCOUcsd0JBQWNzRyxNQUFNekwsTUFBTTdNO0FBQzFCaVMseUJBQWVzRyxNQUFNekwsS0FBSzVNO2VBQ3JCO0FBQ0w4Uix3QkFBY3VHLE1BQU0xTCxNQUFNM007QUFDMUIrUix5QkFBZXFHLE1BQU14TCxLQUFLOU07O2lCQUVuQnlPLFVBQVUsU0FBUztBQUM1QndELHVCQUFlbkYsS0FBSzlNO2lCQUNYeU8sVUFBVSxPQUFPO0FBQzFCdUQsc0JBQWNuRixNQUFNN007aUJBQ1h5TyxVQUFVLFNBQVM7QUFDNUJ1RCxzQkFBY25GLE1BQU03TSxRQUFRO0FBQzVCaVMsdUJBQWVuRixLQUFLOU0sUUFBUTs7QUFJOUIsV0FBS2dTLGNBQWN2WCxLQUFLd0csS0FBSytRLGNBQWMrRyxhQUFhL1YsV0FBVyxLQUFLaEQsU0FBUyxLQUFLQSxRQUFRK1ksYUFBYSxDQUFBO0FBQzNHLFdBQUs5RyxlQUFleFgsS0FBS3dHLEtBQUtnUixlQUFlK0csY0FBY2hXLFdBQVcsS0FBS2hELFNBQVMsS0FBS0EsUUFBUWdaLGNBQWMsQ0FBQTtXQUMxRztBQUNMLFVBQUlsSCxhQUFhaEYsS0FBSzVNLFNBQVM7QUFDL0IsVUFBSTZSLGdCQUFnQmxGLE1BQU0zTSxTQUFTO0FBRW5DLFVBQUl1TyxVQUFVLFNBQVM7QUFDckJxRCxxQkFBYTtBQUNiQyx3QkFBZ0JsRixNQUFNM007aUJBQ2J1TyxVQUFVLE9BQU87QUFDMUJxRCxxQkFBYWhGLEtBQUs1TTtBQUNsQjZSLHdCQUFnQjs7QUFHbEIsV0FBS0QsYUFBYUEsYUFBYTlPO0FBQy9CLFdBQUsrTyxnQkFBZ0JBLGdCQUFnQi9POztFQUV6QztFQU1BNFYsaUJBQWlCO0FBQ2YsUUFBSSxLQUFLaEgsVUFBVTtBQUNqQixXQUFLQSxTQUFTdlIsT0FBTzVGLEtBQUt3RyxJQUFJLEtBQUsrUSxhQUFhLEtBQUtKLFNBQVN2UixJQUFJO0FBQ2xFLFdBQUt1UixTQUFTclIsTUFBTTlGLEtBQUt3RyxJQUFJLEtBQUs2USxZQUFZLEtBQUtGLFNBQVNyUixHQUFHO0FBQy9ELFdBQUtxUixTQUFTdFIsUUFBUTdGLEtBQUt3RyxJQUFJLEtBQUtnUixjQUFjLEtBQUtMLFNBQVN0UixLQUFLO0FBQ3JFLFdBQUtzUixTQUFTcFIsU0FBUy9GLEtBQUt3RyxJQUFJLEtBQUs4USxlQUFlLEtBQUtILFNBQVNwUixNQUFNOztFQUU1RTtFQUVBdVYsV0FBVztBQUNUeEIsYUFBSyxLQUFLdmQsUUFBUStlLFVBQVU7TUFBQztJQUFLLENBQUE7RUFDcEM7RUFNQWhYLGVBQWU7QUFDYixVQUFNLEVBQUM5RyxNQUFNdUIsU0FBQUEsSUFBWSxLQUFLeEM7QUFDOUIsV0FBT3dDLGFBQWEsU0FBU0EsYUFBYSxZQUFZdkIsU0FBUztFQUNqRTtFQUlBZ2hCLGFBQWE7QUFDWCxXQUFPLEtBQUtqaUIsUUFBUThJO0VBQ3RCO0VBTUF5VixzQkFBc0J0SixPQUFPO0FBQzNCLFNBQUt3Syw0QkFBMkI7QUFFaEMsU0FBS0MsbUJBQW1CekssS0FBQUE7QUFHeEIsUUFBSXJTLEdBQUdDO0FBQ1AsU0FBS0QsSUFBSSxHQUFHQyxPQUFPb1MsTUFBTXhULFFBQVFtQixJQUFJQyxNQUFNRCxLQUFLO0FBQzlDLFVBQUl3USxjQUFjNkIsTUFBTXJTLENBQUUsRUFBQytjLEtBQUssR0FBRztBQUNqQzFLLGNBQU14SSxPQUFPN0osR0FBRyxDQUFBO0FBQ2hCQztBQUNBRDs7SUFFSjtBQUVBLFNBQUtpZCwyQkFBMEI7RUFDakM7RUFNQVEsaUJBQWlCO0FBQ2YsUUFBSUQsYUFBYSxLQUFLOUU7QUFFdEIsUUFBSSxDQUFDOEUsWUFBWTtBQUNmLFlBQU16QyxhQUFhLEtBQUszZCxRQUFRaVYsTUFBTTBJO0FBQ3RDLFVBQUkxSSxRQUFRLEtBQUtBO0FBQ2pCLFVBQUkwSSxhQUFhMUksTUFBTXhULFFBQVE7QUFDN0J3VCxnQkFBUTZDLE9BQU83QyxPQUFPMEksVUFBQUE7O0FBR3hCLFdBQUtyQyxjQUFjOEUsYUFBYSxLQUFLOEIsbUJBQW1Cak4sT0FBT0EsTUFBTXhULFFBQVEsS0FBS3pCLFFBQVFpVixNQUFNTSxhQUFhOztBQUcvRyxXQUFPNks7RUFDVDtFQVFBOEIsbUJBQW1Cak4sT0FBT3hULFFBQVE4VCxlQUFlO0FBQy9DLFVBQU0sRUFBQ3RDLEtBQUtzSSxtQkFBbUI3QyxPQUFNLElBQUk7QUFDekMsVUFBTXlKLFNBQVMsQ0FBQTtBQUNmLFVBQU1DLFVBQVUsQ0FBQTtBQUNoQixVQUFNcEssWUFBWXZVLEtBQUt5SyxNQUFNek0sU0FBU21XLGNBQWNuVyxRQUFROFQsYUFBQUEsQ0FBQUE7QUFDNUQsUUFBSThNLGtCQUFrQjtBQUN0QixRQUFJQyxtQkFBbUI7QUFDdkIsUUFBSTFmLEdBQUdHLEdBQUd3ZixNQUFNNUMsT0FBTzZDLFVBQVVDLFlBQVk5SixPQUFPWSxZQUFZdlEsT0FBT0UsUUFBUXdaO0FBRS9FLFNBQUs5ZixJQUFJLEdBQUdBLElBQUluQixRQUFRbUIsS0FBS29WLFdBQVc7QUFDdEMySCxjQUFRMUssTUFBTXJTLENBQUUsRUFBQytjO0FBQ2pCNkMsaUJBQVcsS0FBS0csd0JBQXdCL2YsQ0FBQUE7QUFDeENxUSxVQUFJaUcsT0FBT3VKLGFBQWFELFNBQVNJO0FBQ2pDakssY0FBUUQsT0FBTytKLFVBQUFBLElBQWMvSixPQUFPK0osVUFBQUEsS0FBZTtRQUFDcGhCLE1BQU0sQ0FBQTtRQUFJdVgsSUFBSSxDQUFBO01BQUU7QUFDcEVXLG1CQUFhaUosU0FBU2pKO0FBQ3RCdlEsY0FBUUUsU0FBUztBQUVqQixVQUFJLENBQUNrSyxjQUFjdU0sS0FBVSxLQUFBLENBQUN0RyxRQUFRc0csS0FBUSxHQUFBO0FBQzVDM1csZ0JBQVE2WixhQUFhNVAsS0FBSzBGLE1BQU10WCxNQUFNc1gsTUFBTUMsSUFBSTVQLE9BQU8yVyxLQUFBQTtBQUN2RHpXLGlCQUFTcVE7aUJBQ0FGLFFBQVFzRyxLQUFRLEdBQUE7QUFFekIsYUFBSzVjLElBQUksR0FBR3dmLE9BQU81QyxNQUFNbGUsUUFBUXNCLElBQUl3ZixNQUFNLEVBQUV4ZixHQUFHO0FBQzlDMmYsd0JBQXFDL0MsTUFBTTVjLENBQUU7QUFFN0MsY0FBSSxDQUFDcVEsY0FBY3NQLFdBQWdCLEtBQUEsQ0FBQ3JKLFFBQVFxSixXQUFjLEdBQUE7QUFDeEQxWixvQkFBUTZaLGFBQWE1UCxLQUFLMEYsTUFBTXRYLE1BQU1zWCxNQUFNQyxJQUFJNVAsT0FBTzBaLFdBQUFBO0FBQ3ZEeFosc0JBQVVxUTs7UUFFZDs7QUFFRjRJLGFBQU96ZCxLQUFLc0UsS0FBQUE7QUFDWm9aLGNBQVExZCxLQUFLd0UsTUFBQUE7QUFDYm1aLHdCQUFrQjVlLEtBQUt3RyxJQUFJakIsT0FBT3FaLGVBQUFBO0FBQ2xDQyx5QkFBbUI3ZSxLQUFLd0csSUFBSWYsUUFBUW9aLGdCQUFBQTtJQUN0QztBQUNBN0osbUJBQWVDLFFBQVFqWCxNQUFBQTtBQUV2QixVQUFNOGUsU0FBUzRCLE9BQU8vZSxRQUFRaWYsZUFBQUE7QUFDOUIsVUFBTTVCLFVBQVUyQixRQUFRaGYsUUFBUWtmLGdCQUFBQTtBQUVoQyxVQUFNUSxVQUFVLENBQUNDLFNBQVM7TUFBQy9aLE9BQU9tWixPQUFPWSxHQUFBQSxLQUFRO01BQUc3WixRQUFRa1osUUFBUVcsR0FBQUEsS0FBUTs7QUFFNUUsV0FBTztNQUNMbE4sT0FBT2lOLFFBQVEsQ0FBQTtNQUNmaE4sTUFBTWdOLFFBQVFyaEIsU0FBUyxDQUFBO01BQ3ZCOGUsUUFBUXVDLFFBQVF2QyxNQUFBQTtNQUNoQkUsU0FBU3FDLFFBQVFyQyxPQUFBQTtNQUNqQjBCO01BQ0FDO0lBQ0Y7RUFDRjtFQU9BWSxpQkFBaUI5aEIsT0FBTztBQUN0QixXQUFPQTtFQUNUO0VBU0FxWixpQkFBaUJyWixPQUFPNEIsT0FBTztBQUM3QixXQUFPbWdCO0VBQ1Q7RUFRQUMsaUJBQWlCQyxPQUFPO0VBQUE7RUFReEIzSyxnQkFBZ0IxVixPQUFPO0FBQ3JCLFVBQU1tUyxRQUFRLEtBQUtBO0FBQ25CLFFBQUluUyxRQUFRLEtBQUtBLFFBQVFtUyxNQUFNeFQsU0FBUyxHQUFHO0FBQ3pDLGFBQU87O0FBRVQsV0FBTyxLQUFLOFksaUJBQWlCdEYsTUFBTW5TLEtBQUFBLEVBQU81QixLQUFLO0VBQ2pEO0VBUUFraUIsbUJBQW1CQyxTQUFTO0FBQzFCLFFBQUksS0FBSzFoQixnQkFBZ0I7QUFDdkIwaEIsZ0JBQVUsSUFBSUE7O0FBR2hCLFVBQU1GLFFBQVEsS0FBSy9LLGNBQWNpTCxVQUFVLEtBQUs1TTtBQUNoRCxXQUFPNk0sWUFBWSxLQUFLbEUsaUJBQWlCbUUsWUFBWSxLQUFLaGhCLE9BQU80Z0IsT0FBTyxDQUFBLElBQUtBLEtBQUs7RUFDcEY7RUFNQUssbUJBQW1CTCxPQUFPO0FBQ3hCLFVBQU1FLFdBQVdGLFFBQVEsS0FBSy9LLGVBQWUsS0FBSzNCO0FBQ2xELFdBQU8sS0FBSzlVLGlCQUFpQixJQUFJMGhCLFVBQVVBO0VBQzdDO0VBT0FJLGVBQWU7QUFDYixXQUFPLEtBQUtsSixpQkFBaUIsS0FBS21KLGFBQVksQ0FBQTtFQUNoRDtFQUtBQSxlQUFlO0FBQ2IsVUFBTSxFQUFDcE8sS0FBS3JMLElBQUcsSUFBSTtBQUVuQixXQUFPcUwsTUFBTSxLQUFLckwsTUFBTSxJQUFJQSxNQUMxQnFMLE1BQU0sS0FBS3JMLE1BQU0sSUFBSXFMLE1BQ3JCO0VBQ0o7RUFLQS9HLFdBQVd6TCxPQUFPO0FBQ2hCLFVBQU1tUyxRQUFRLEtBQUtBLFNBQVMsQ0FBQTtBQUU1QixRQUFJblMsU0FBUyxLQUFLQSxRQUFRbVMsTUFBTXhULFFBQVE7QUFDdEMsWUFBTW1ZLE9BQU8zRSxNQUFNblMsS0FBTTtBQUN6QixhQUFPOFcsS0FBS29DLGFBQ2JwQyxLQUFLb0MsV0FBV3JDLGtCQUFrQixLQUFLcEwsV0FBVSxHQUFJekwsT0FBTzhXLElBQUk7O0FBRWpFLFdBQU8sS0FBS29DLGFBQ1osS0FBS0EsV0FBV3hDLG1CQUFtQixLQUFLalgsTUFBTWdNLFdBQVUsR0FBSSxJQUFJO0VBQ2xFO0VBTUFnSSxZQUFZO0FBQ1YsVUFBTW9OLGNBQWMsS0FBSzNqQixRQUFRaVY7QUFHakMsVUFBTTJPLE1BQU12QyxVQUFVLEtBQUtuRyxhQUFhO0FBQ3hDLFVBQU1vRyxNQUFNN2QsS0FBS0MsSUFBSUQsS0FBSzZkLElBQUlzQyxHQUFBQSxDQUFBQTtBQUM5QixVQUFNckMsTUFBTTlkLEtBQUtDLElBQUlELEtBQUs4ZCxJQUFJcUMsR0FBQUEsQ0FBQUE7QUFFOUIsVUFBTXhELGFBQWEsS0FBS0MsZUFBYztBQUN0QyxVQUFNclUsVUFBVTJYLFlBQVlFLG1CQUFtQjtBQUMvQyxVQUFNalosSUFBSXdWLGFBQWFBLFdBQVdHLE9BQU92WCxRQUFRZ0QsVUFBVTtBQUMzRCxVQUFNbEIsS0FBSXNWLGFBQWFBLFdBQVdLLFFBQVF2WCxTQUFTOEMsVUFBVTtBQUc3RCxXQUFPLEtBQUtqRSxhQUFZLElBQ3BCK0MsS0FBSXdXLE1BQU0xVyxJQUFJMlcsTUFBTTNXLElBQUkwVyxNQUFNeFcsS0FBSXlXLE1BQ2xDelcsS0FBSXlXLE1BQU0zVyxJQUFJMFcsTUFBTXhXLEtBQUl3VyxNQUFNMVcsSUFBSTJXO0VBQ3hDO0VBTUFwQixhQUFhO0FBQ1gsVUFBTS9TLFVBQVUsS0FBS3BOLFFBQVFvTjtBQUU3QixRQUFJQSxZQUFZLFFBQVE7QUFDdEIsYUFBTyxDQUFDLENBQUNBOztBQUdYLFdBQU8sS0FBSzBQLHdCQUF1QixFQUFHcmIsU0FBUztFQUNqRDtFQUtBcWlCLHNCQUFzQnRmLFdBQVc7QUFDL0IsVUFBTXZELE9BQU8sS0FBS0E7QUFDbEIsVUFBTXNCLFFBQVEsS0FBS0E7QUFDbkIsVUFBTXZDLFVBQVUsS0FBS0E7QUFDckIsVUFBTSxFQUFDMmdCLE1BQU1uZSxVQUFVdWhCLE9BQUFBLElBQVUvakI7QUFDakMsVUFBTXFXLFNBQVNzSyxLQUFLdEs7QUFDcEIsVUFBTXRPLGVBQWUsS0FBS0EsYUFBWTtBQUN0QyxVQUFNa04sUUFBUSxLQUFLQTtBQUNuQixVQUFNNEMsY0FBYzVDLE1BQU14VCxVQUFVNFUsU0FBUyxJQUFJO0FBQ2pELFVBQU0yTixLQUFLbEwsa0JBQWtCNkgsSUFBQUE7QUFDN0IsVUFBTXhjLFFBQVEsQ0FBQTtBQUVkLFVBQU04ZixhQUFhRixPQUFPOUgsV0FBVyxLQUFLMU4sV0FBVSxDQUFBO0FBQ3BELFVBQU0yVixZQUFZRCxXQUFXN1csVUFBVTZXLFdBQVdqYixRQUFRO0FBQzFELFVBQU1tYixnQkFBZ0JELFlBQVk7QUFDbEMsVUFBTUUsbUJBQW1CLFNBQVNqQixPQUFPO0FBQ3ZDLGFBQU9JLFlBQVloaEIsT0FBTzRnQixPQUFPZSxTQUFBQTtJQUNuQztBQUNBLFFBQUlHLGFBQWF6aEIsR0FBRzJWLFdBQVcrTDtBQUMvQixRQUFJQyxLQUFLQyxLQUFLQyxLQUFLQyxLQUFLQyxJQUFJQyxJQUFJQyxJQUFJQztBQUVwQyxRQUFJdGlCLGFBQWEsT0FBTztBQUN0QjZoQixvQkFBY0QsaUJBQWlCLEtBQUs1YSxNQUFNO0FBQzFDZ2IsWUFBTSxLQUFLaGIsU0FBU3dhO0FBQ3BCVSxZQUFNTCxjQUFjRjtBQUNwQlMsV0FBS1IsaUJBQWlCNWYsVUFBVStFLEdBQUcsSUFBSTRhO0FBQ3ZDVyxXQUFLdGdCLFVBQVVnRjtlQUNOaEgsYUFBYSxVQUFVO0FBQ2hDNmhCLG9CQUFjRCxpQkFBaUIsS0FBSzdhLEdBQUc7QUFDdkNxYixXQUFLcGdCLFVBQVUrRTtBQUNmdWIsV0FBS1YsaUJBQWlCNWYsVUFBVWdGLE1BQU0sSUFBSTJhO0FBQzFDSyxZQUFNSCxjQUFjRjtBQUNwQk8sWUFBTSxLQUFLbmIsTUFBTXlhO2VBQ1J4aEIsYUFBYSxRQUFRO0FBQzlCNmhCLG9CQUFjRCxpQkFBaUIsS0FBSzlhLEtBQUs7QUFDekNpYixZQUFNLEtBQUtqYixRQUFRMGE7QUFDbkJTLFlBQU1KLGNBQWNGO0FBQ3BCUSxXQUFLUCxpQkFBaUI1ZixVQUFVNkUsSUFBSSxJQUFJOGE7QUFDeENVLFdBQUtyZ0IsVUFBVThFO2VBQ045RyxhQUFhLFNBQVM7QUFDL0I2aEIsb0JBQWNELGlCQUFpQixLQUFLL2EsSUFBSTtBQUN4Q3NiLFdBQUtuZ0IsVUFBVTZFO0FBQ2Z3YixXQUFLVCxpQkFBaUI1ZixVQUFVOEUsS0FBSyxJQUFJNmE7QUFDekNJLFlBQU1GLGNBQWNGO0FBQ3BCTSxZQUFNLEtBQUtwYixPQUFPMmE7ZUFDVC9pQixTQUFTLEtBQUs7QUFDdkIsVUFBSXVCLGFBQWEsVUFBVTtBQUN6QjZoQixzQkFBY0Qsa0JBQWtCNWYsVUFBVStFLE1BQU0vRSxVQUFVZ0YsVUFBVSxJQUFJLEdBQUE7aUJBQy9EYSxTQUFTN0gsUUFBVyxHQUFBO0FBQzdCLGNBQU04WCxpQkFBaUJuYSxPQUFPb1QsS0FBSy9RLFFBQUFBLEVBQVUsQ0FBRTtBQUMvQyxjQUFNdEIsUUFBUXNCLFNBQVM4WCxjQUFlO0FBQ3RDK0osc0JBQWNELGlCQUFpQixLQUFLN2hCLE1BQU15WCxPQUFPTSxjQUFBQSxFQUFnQkMsaUJBQWlCclosS0FBQUEsQ0FBQUE7O0FBR3BGMGpCLFdBQUtwZ0IsVUFBVStFO0FBQ2Z1YixXQUFLdGdCLFVBQVVnRjtBQUNmZ2IsWUFBTUgsY0FBY0Y7QUFDcEJPLFlBQU1GLE1BQU1SO2VBQ0gvaUIsU0FBUyxLQUFLO0FBQ3ZCLFVBQUl1QixhQUFhLFVBQVU7QUFDekI2aEIsc0JBQWNELGtCQUFrQjVmLFVBQVU2RSxPQUFPN0UsVUFBVThFLFNBQVMsQ0FBQTtpQkFDM0RlLFNBQVM3SCxRQUFXLEdBQUE7QUFDN0IsY0FBTThYLGlCQUFpQm5hLE9BQU9vVCxLQUFLL1EsUUFBQUEsRUFBVSxDQUFFO0FBQy9DLGNBQU10QixRQUFRc0IsU0FBUzhYLGNBQWU7QUFDdEMrSixzQkFBY0QsaUJBQWlCLEtBQUs3aEIsTUFBTXlYLE9BQU9NLGNBQUFBLEVBQWdCQyxpQkFBaUJyWixLQUFBQSxDQUFBQTs7QUFHcEZxakIsWUFBTUYsY0FBY0Y7QUFDcEJNLFlBQU1GLE1BQU1QO0FBQ1pXLFdBQUtuZ0IsVUFBVTZFO0FBQ2Z3YixXQUFLcmdCLFVBQVU4RTs7QUFHakIsVUFBTXliLFFBQVExTixlQUFlclgsUUFBUWlWLE1BQU1NLGVBQWVzQyxXQUFBQTtBQUMxRCxVQUFNbU4sT0FBT3ZoQixLQUFLd0csSUFBSSxHQUFHeEcsS0FBS3lULEtBQUtXLGNBQWNrTixLQUFBQSxDQUFBQTtBQUNqRCxTQUFLbmlCLElBQUksR0FBR0EsSUFBSWlWLGFBQWFqVixLQUFLb2lCLE1BQU07QUFDdEMsWUFBTXJYLFVBQVUsS0FBS1ksV0FBVzNMLENBQUFBO0FBQ2hDLFlBQU1xaUIsY0FBY3RFLEtBQUsxRSxXQUFXdE8sT0FBQUE7QUFDcEMsWUFBTXVYLG9CQUFvQm5CLE9BQU85SCxXQUFXdE8sT0FBQUE7QUFFNUMsWUFBTXdYLFlBQVlGLFlBQVlFO0FBQzlCLFlBQU1DLFlBQVlILFlBQVlJO0FBQzlCLFlBQU1DLGFBQWFKLGtCQUFrQkssUUFBUSxDQUFBO0FBQzdDLFlBQU1DLG1CQUFtQk4sa0JBQWtCTztBQUUzQyxZQUFNeEYsWUFBWWdGLFlBQVloRjtBQUM5QixZQUFNeUYsWUFBWVQsWUFBWVM7QUFDOUIsWUFBTUMsaUJBQWlCVixZQUFZVSxrQkFBa0IsQ0FBQTtBQUNyRCxZQUFNQyx1QkFBdUJYLFlBQVlXO0FBRXpDck4sa0JBQVlOLG9CQUFvQixNQUFNclYsR0FBR3lULE1BQUFBO0FBR3pDLFVBQUlrQyxjQUFjekksUUFBVztBQUMzQjs7QUFHRndVLHlCQUFtQmYsWUFBWWhoQixPQUFPZ1csV0FBVzRNLFNBQUFBO0FBRWpELFVBQUlwZCxjQUFjO0FBQ2hCd2MsY0FBTUUsTUFBTUUsS0FBS0UsS0FBS1A7YUFDakI7QUFDTEUsY0FBTUUsTUFBTUUsS0FBS0UsS0FBS1I7O0FBR3hCbmdCLFlBQU1PLEtBQUs7UUFDVDZmO1FBQ0FDO1FBQ0FDO1FBQ0FDO1FBQ0FDO1FBQ0FDO1FBQ0FDO1FBQ0FDO1FBQ0E5YixPQUFPbWM7UUFDUEUsT0FBT0Q7UUFDUEU7UUFDQUU7UUFDQXZGO1FBQ0F5RjtRQUNBQztRQUNBQztNQUNGLENBQUE7SUFDRjtBQUVBLFNBQUtoSyxlQUFlL0Q7QUFDcEIsU0FBS2dFLGVBQWV3STtBQUVwQixXQUFPbGdCO0VBQ1Q7RUFLQWtaLG1CQUFtQjdZLFdBQVc7QUFDNUIsVUFBTXZELE9BQU8sS0FBS0E7QUFDbEIsVUFBTWpCLFVBQVUsS0FBS0E7QUFDckIsVUFBTSxFQUFDd0MsVUFBVXlTLE9BQU8wTyxZQUFBQSxJQUFlM2pCO0FBQ3ZDLFVBQU0rSCxlQUFlLEtBQUtBLGFBQVk7QUFDdEMsVUFBTWtOLFFBQVEsS0FBS0E7QUFDbkIsVUFBTSxFQUFDd0MsT0FBT29PLFlBQVk3WixTQUFTeVYsT0FBTSxJQUFJa0M7QUFDN0MsVUFBTUssS0FBS2xMLGtCQUFrQjlZLFFBQVEyZ0IsSUFBSTtBQUN6QyxVQUFNbUYsaUJBQWlCOUIsS0FBS2hZO0FBQzVCLFVBQU0rWixrQkFBa0J0RSxTQUFTLENBQUN6VixVQUFVOFo7QUFDNUMsVUFBTTdMLFdBQVcsQ0FBQ29ILFVBQVUsS0FBS25HLGFBQWE7QUFDOUMsVUFBTS9XLFFBQVEsQ0FBQTtBQUNkLFFBQUl2QixHQUFHQyxNQUFNK1csTUFBTStGLE9BQU9oYyxHQUFHRSxHQUFHbWlCLFdBQVc3QyxPQUFPakssTUFBTUssWUFBWTBNLFdBQVdDO0FBQy9FLFFBQUlDLGVBQWU7QUFFbkIsUUFBSTNqQixhQUFhLE9BQU87QUFDdEJxQixVQUFJLEtBQUsyRixTQUFTdWM7QUFDbEJDLGtCQUFZLEtBQUtJLHdCQUF1QjtlQUMvQjVqQixhQUFhLFVBQVU7QUFDaENxQixVQUFJLEtBQUswRixNQUFNd2M7QUFDZkMsa0JBQVksS0FBS0ksd0JBQXVCO2VBQy9CNWpCLGFBQWEsUUFBUTtBQUM5QixZQUFNbVMsTUFBTSxLQUFLMFIsd0JBQXdCckMsRUFBQUE7QUFDekNnQyxrQkFBWXJSLElBQUlxUjtBQUNoQnJpQixVQUFJZ1IsSUFBSWhSO2VBQ0NuQixhQUFhLFNBQVM7QUFDL0IsWUFBTW1TLE1BQU0sS0FBSzBSLHdCQUF3QnJDLEVBQUFBO0FBQ3pDZ0Msa0JBQVlyUixJQUFJcVI7QUFDaEJyaUIsVUFBSWdSLElBQUloUjtlQUNDMUMsU0FBUyxLQUFLO0FBQ3ZCLFVBQUl1QixhQUFhLFVBQVU7QUFDekJxQixhQUFNVyxVQUFVK0UsTUFBTS9FLFVBQVVnRixVQUFVLElBQUtzYztpQkFDdEN6YixTQUFTN0gsUUFBVyxHQUFBO0FBQzdCLGNBQU04WCxpQkFBaUJuYSxPQUFPb1QsS0FBSy9RLFFBQUFBLEVBQVUsQ0FBRTtBQUMvQyxjQUFNdEIsUUFBUXNCLFNBQVM4WCxjQUFlO0FBQ3RDelcsWUFBSSxLQUFLdEIsTUFBTXlYLE9BQU9NLGNBQWUsRUFBQ0MsaUJBQWlCclosS0FBUzRrQixJQUFBQTs7QUFFbEVFLGtCQUFZLEtBQUtJLHdCQUF1QjtlQUMvQm5sQixTQUFTLEtBQUs7QUFDdkIsVUFBSXVCLGFBQWEsVUFBVTtBQUN6Qm1CLGFBQU1hLFVBQVU2RSxPQUFPN0UsVUFBVThFLFNBQVMsSUFBS3djO2lCQUN0Q3piLFNBQVM3SCxRQUFXLEdBQUE7QUFDN0IsY0FBTThYLGlCQUFpQm5hLE9BQU9vVCxLQUFLL1EsUUFBQUEsRUFBVSxDQUFFO0FBQy9DLGNBQU10QixRQUFRc0IsU0FBUzhYLGNBQWU7QUFDdEMzVyxZQUFJLEtBQUtwQixNQUFNeVgsT0FBT00sY0FBQUEsRUFBZ0JDLGlCQUFpQnJaLEtBQUFBOztBQUV6RDhrQixrQkFBWSxLQUFLSyx3QkFBd0JyQyxFQUFBQSxFQUFJZ0M7O0FBRy9DLFFBQUkva0IsU0FBUyxLQUFLO0FBQ2hCLFVBQUl3VyxVQUFVLFNBQVM7QUFDckIwTyx1QkFBZTtpQkFDTjFPLFVBQVUsT0FBTztBQUMxQjBPLHVCQUFlOzs7QUFJbkIsVUFBTS9GLGFBQWEsS0FBS0MsZUFBYztBQUN0QyxTQUFLemQsSUFBSSxHQUFHQyxPQUFPb1MsTUFBTXhULFFBQVFtQixJQUFJQyxNQUFNLEVBQUVELEdBQUc7QUFDOUNnWCxhQUFPM0UsTUFBTXJTLENBQUU7QUFDZitjLGNBQVEvRixLQUFLK0Y7QUFFYixZQUFNc0YsY0FBY3RCLFlBQVkxSCxXQUFXLEtBQUsxTixXQUFXM0wsQ0FBQUEsQ0FBQUE7QUFDM0R1Z0IsY0FBUSxLQUFLM0ssZ0JBQWdCNVYsQ0FBQUEsSUFBSytnQixZQUFZMkM7QUFDOUNwTixhQUFPLEtBQUt5Six3QkFBd0IvZixDQUFBQTtBQUNwQzJXLG1CQUFhTCxLQUFLSztBQUNsQjBNLGtCQUFZNU0sUUFBUXNHLEtBQUFBLElBQVNBLE1BQU1sZSxTQUFTO0FBQzVDLFlBQU04a0IsWUFBWU4sWUFBWTtBQUM5QixZQUFNWixTQUFRSixZQUFZSTtBQUMxQixZQUFNbUIsY0FBY3ZCLFlBQVl3QjtBQUNoQyxZQUFNQyxjQUFjekIsWUFBWTBCO0FBQ2hDLFVBQUlDLGdCQUFnQlo7QUFFcEIsVUFBSWplLGNBQWM7QUFDaEJwRSxZQUFJd2Y7QUFFSixZQUFJNkMsY0FBYyxTQUFTO0FBQ3pCLGNBQUlwakIsTUFBTUMsT0FBTyxHQUFHO0FBQ2xCK2pCLDRCQUFnQixDQUFDLEtBQUs1bUIsUUFBUWtILFVBQVUsVUFBVTtxQkFDekN0RSxNQUFNLEdBQUc7QUFDbEJna0IsNEJBQWdCLENBQUMsS0FBSzVtQixRQUFRa0gsVUFBVSxTQUFTO2lCQUM1QztBQUNMMGYsNEJBQWdCOzs7QUFJcEIsWUFBSXBrQixhQUFhLE9BQU87QUFDdEIsY0FBSXFqQixlQUFlLFVBQVU1TCxhQUFhLEdBQUc7QUFDM0NpTSx5QkFBYSxDQUFDRCxZQUFZMU0sYUFBYUEsYUFBYTtxQkFDM0NzTSxlQUFlLFVBQVU7QUFDbENLLHlCQUFhLENBQUM5RixXQUFXSyxRQUFRdlgsU0FBUyxJQUFJcWQsWUFBWWhOLGFBQWFBO2lCQUNsRTtBQUNMMk0seUJBQWEsQ0FBQzlGLFdBQVdLLFFBQVF2WCxTQUFTcVEsYUFBYTs7ZUFFcEQ7QUFFTCxjQUFJc00sZUFBZSxVQUFVNUwsYUFBYSxHQUFHO0FBQzNDaU0seUJBQWEzTSxhQUFhO3FCQUNqQnNNLGVBQWUsVUFBVTtBQUNsQ0sseUJBQWE5RixXQUFXSyxRQUFRdlgsU0FBUyxJQUFJcWQsWUFBWWhOO2lCQUNwRDtBQUNMMk0seUJBQWE5RixXQUFXSyxRQUFRdlgsU0FBUytjLFlBQVkxTTs7O0FBR3pELFlBQUlrSSxRQUFRO0FBQ1Z5RSx3QkFBYzs7QUFFaEIsWUFBSWpNLGFBQWEsS0FBSyxDQUFDZ0wsWUFBWTRCLG1CQUFtQjtBQUNwRGxqQixlQUFLLGFBQWMsSUFBS0YsS0FBSzhkLElBQUl0SCxRQUFBQTs7YUFFOUI7QUFDTHBXLFlBQUlzZjtBQUNKK0Msc0JBQWMsSUFBSUQsYUFBYTFNLGFBQWE7O0FBRzlDLFVBQUl1TjtBQUVKLFVBQUk3QixZQUFZNEIsbUJBQW1CO0FBQ2pDLGNBQU1FLGVBQWVuYSxVQUFVcVksWUFBWStCLGVBQWU7QUFDMUQsY0FBTTlkLFNBQVNrWCxXQUFXZ0MsUUFBUXhmLENBQUU7QUFDcEMsY0FBTW9HLFFBQVFvWCxXQUFXK0IsT0FBT3ZmLENBQUU7QUFFbEMsWUFBSTJHLE1BQU0yYyxhQUFhYSxhQUFheGQ7QUFDcEMsWUFBSUYsT0FBTyxJQUFJMGQsYUFBYTFkO0FBRTVCLGdCQUFROGMsY0FBQUE7VUFDUixLQUFLO0FBQ0g1YyxtQkFBT0wsU0FBUztBQUNoQjtVQUNGLEtBQUs7QUFDSEssbUJBQU9MO0FBQ1A7UUFHRjtBQUVBLGdCQUFROGMsV0FBQUE7VUFDUixLQUFLO0FBQ0gzYyxvQkFBUUwsUUFBUTtBQUNoQjtVQUNGLEtBQUs7QUFDSEssb0JBQVFMO0FBQ1I7VUFDRixLQUFLO0FBQ0gsZ0JBQUlwRyxNQUFNQyxPQUFPLEdBQUc7QUFDbEJ3RyxzQkFBUUw7dUJBQ0NwRyxJQUFJLEdBQUc7QUFDaEJ5RyxzQkFBUUwsUUFBUTs7QUFFbEI7UUFHRjtBQUVBOGQsbUJBQVc7VUFDVHpkO1VBQ0FFO1VBQ0FQLE9BQU9BLFFBQVErZCxhQUFhL2Q7VUFDNUJFLFFBQVFBLFNBQVM2ZCxhQUFhN2Q7VUFFOUJtYyxPQUFPSixZQUFZZ0M7UUFDckI7O0FBR0Y5aUIsWUFBTU8sS0FBSztRQUNUaWI7UUFDQXpHO1FBQ0FnTjtRQUNBbG1CLFNBQVM7VUFDUGlhO1VBQ0FvTCxPQUFBQTtVQUNBbUI7VUFDQUU7VUFDQVYsV0FBV1k7VUFDWFQ7VUFDQWUsYUFBYTtZQUFDdmpCO1lBQUdFO1VBQUU7VUFDbkJpakI7UUFDRjtNQUNGLENBQUE7SUFDRjtBQUVBLFdBQU8zaUI7RUFDVDtFQUVBaWlCLDBCQUEwQjtBQUN4QixVQUFNLEVBQUM1akIsVUFBVXlTLE1BQUFBLElBQVMsS0FBS2pWO0FBQy9CLFVBQU1pYSxXQUFXLENBQUNvSCxVQUFVLEtBQUtuRyxhQUFhO0FBRTlDLFFBQUlqQixVQUFVO0FBQ1osYUFBT3pYLGFBQWEsUUFBUSxTQUFTOztBQUd2QyxRQUFJaVYsUUFBUTtBQUVaLFFBQUl4QyxNQUFNd0MsVUFBVSxTQUFTO0FBQzNCQSxjQUFRO0lBQ1YsV0FBV3hDLE1BQU13QyxVQUFVLE9BQU87QUFDaENBLGNBQVE7SUFDVixXQUFXeEMsTUFBTXdDLFVBQVUsU0FBUztBQUNsQ0EsY0FBUTs7QUFHVixXQUFPQTtFQUNUO0VBRUE0Tyx3QkFBd0JyQyxJQUFJO0FBQzFCLFVBQU0sRUFBQ3hoQixVQUFVeVMsT0FBTyxFQUFDNFEsWUFBWXBFLFFBQVF6VixRQUFBQSxFQUFRLElBQUksS0FBS2hNO0FBQzlELFVBQU1vZ0IsYUFBYSxLQUFLQyxlQUFjO0FBQ3RDLFVBQU15RixpQkFBaUI5QixLQUFLaFk7QUFDNUIsVUFBTXVVLFNBQVNILFdBQVdHLE9BQU92WDtBQUVqQyxRQUFJZ2Q7QUFDSixRQUFJcmlCO0FBRUosUUFBSW5CLGFBQWEsUUFBUTtBQUN2QixVQUFJaWYsUUFBUTtBQUNWOWQsWUFBSSxLQUFLMkYsUUFBUTBDO0FBRWpCLFlBQUk2WixlQUFlLFFBQVE7QUFDekJHLHNCQUFZO21CQUNISCxlQUFlLFVBQVU7QUFDbENHLHNCQUFZO0FBQ1pyaUIsZUFBTTRjLFNBQVM7ZUFDVjtBQUNMeUYsc0JBQVk7QUFDWnJpQixlQUFLNGM7O2FBRUY7QUFDTDVjLFlBQUksS0FBSzJGLFFBQVF3YztBQUVqQixZQUFJRCxlQUFlLFFBQVE7QUFDekJHLHNCQUFZO21CQUNISCxlQUFlLFVBQVU7QUFDbENHLHNCQUFZO0FBQ1pyaUIsZUFBTTRjLFNBQVM7ZUFDVjtBQUNMeUYsc0JBQVk7QUFDWnJpQixjQUFJLEtBQUswRjs7O2VBR0o3RyxhQUFhLFNBQVM7QUFDL0IsVUFBSWlmLFFBQVE7QUFDVjlkLFlBQUksS0FBSzBGLE9BQU8yQztBQUVoQixZQUFJNlosZUFBZSxRQUFRO0FBQ3pCRyxzQkFBWTttQkFDSEgsZUFBZSxVQUFVO0FBQ2xDRyxzQkFBWTtBQUNacmlCLGVBQU00YyxTQUFTO2VBQ1Y7QUFDTHlGLHNCQUFZO0FBQ1pyaUIsZUFBSzRjOzthQUVGO0FBQ0w1YyxZQUFJLEtBQUswRixPQUFPeWM7QUFFaEIsWUFBSUQsZUFBZSxRQUFRO0FBQ3pCRyxzQkFBWTttQkFDSEgsZUFBZSxVQUFVO0FBQ2xDRyxzQkFBWTtBQUNacmlCLGVBQUs0YyxTQUFTO2VBQ1Q7QUFDTHlGLHNCQUFZO0FBQ1pyaUIsY0FBSSxLQUFLMkY7OztXQUdSO0FBQ0wwYyxrQkFBWTs7QUFHZCxXQUFPO01BQUNBO01BQVdyaUI7SUFBQztFQUN0QjtFQUtBd2pCLG9CQUFvQjtBQUNsQixRQUFJLEtBQUtubkIsUUFBUWlWLE1BQU13TSxRQUFRO0FBQzdCOztBQUdGLFVBQU1sZixRQUFRLEtBQUtBO0FBQ25CLFVBQU1DLFdBQVcsS0FBS3hDLFFBQVF3QztBQUU5QixRQUFJQSxhQUFhLFVBQVVBLGFBQWEsU0FBUztBQUMvQyxhQUFPO1FBQUMrRyxLQUFLO1FBQUdGLE1BQU0sS0FBS0E7UUFBTUcsUUFBUWpILE1BQU0yRztRQUFRSSxPQUFPLEtBQUtBO01BQUs7O0FBQ3hFLFFBQUk5RyxhQUFhLFNBQVNBLGFBQWEsVUFBVTtBQUNqRCxhQUFPO1FBQUMrRyxLQUFLLEtBQUtBO1FBQUtGLE1BQU07UUFBR0csUUFBUSxLQUFLQTtRQUFRRixPQUFPL0csTUFBTXlHO01BQUs7O0VBRTNFO0VBS0FvZSxpQkFBaUI7QUFDZixVQUFNLEVBQUNuVSxLQUFLalQsU0FBUyxFQUFDcW5CLGdCQUFBQSxHQUFrQmhlLE1BQU1FLEtBQUtQLE9BQU9FLE9BQU0sSUFBSTtBQUNwRSxRQUFJbWUsaUJBQWlCO0FBQ25CcFUsVUFBSXFVLEtBQUk7QUFDUnJVLFVBQUlzVSxZQUFZRjtBQUNoQnBVLFVBQUl1VSxTQUFTbmUsTUFBTUUsS0FBS1AsT0FBT0UsTUFBQUE7QUFDL0IrSixVQUFJd1UsUUFBTzs7RUFFZjtFQUVBQyxxQkFBcUJ4bUIsT0FBTztBQUMxQixVQUFNeWYsT0FBTyxLQUFLM2dCLFFBQVEyZ0I7QUFDMUIsUUFBSSxDQUFDLEtBQUtSLFdBQVUsS0FBTSxDQUFDUSxLQUFLdlQsU0FBUztBQUN2QyxhQUFPOztBQUVULFVBQU02SCxRQUFRLEtBQUtBO0FBQ25CLFVBQU1uUyxRQUFRbVMsTUFBTTBTLFVBQVVDLENBQUFBLE9BQUtBLEdBQUUxbUIsVUFBVUEsS0FBQUE7QUFDL0MsUUFBSTRCLFNBQVMsR0FBRztBQUNkLFlBQU0ra0IsT0FBT2xILEtBQUsxRSxXQUFXLEtBQUsxTixXQUFXekwsS0FBQUEsQ0FBQUE7QUFDN0MsYUFBTytrQixLQUFLMUM7O0FBRWQsV0FBTztFQUNUO0VBS0EyQyxTQUFTdGpCLFdBQVc7QUFDbEIsVUFBTW1jLE9BQU8sS0FBSzNnQixRQUFRMmdCO0FBQzFCLFVBQU0xTixNQUFNLEtBQUtBO0FBQ2pCLFVBQU05TyxRQUFRLEtBQUtpWCxtQkFBbUIsS0FBS0EsaUJBQWlCLEtBQUswSSxzQkFBc0J0ZixTQUFTO0FBQ2hHLFFBQUk1QixHQUFHQztBQUVQLFVBQU1rbEIsV0FBVyxDQUFDQyxJQUFJQyxJQUFJM1ksVUFBVTtBQUNsQyxVQUFJLENBQUNBLE1BQU10RyxTQUFTLENBQUNzRyxNQUFNK1YsT0FBTztBQUNoQzs7QUFFRnBTLFVBQUlxVSxLQUFJO0FBQ1JyVSxVQUFJa1MsWUFBWTdWLE1BQU10RztBQUN0QmlLLFVBQUlpVixjQUFjNVksTUFBTStWO0FBQ3hCcFMsVUFBSWtWLFlBQVk3WSxNQUFNZ1csY0FBYyxDQUFBLENBQUU7QUFDdENyUyxVQUFJbVYsaUJBQWlCOVksTUFBTWtXO0FBRTNCdlMsVUFBSW9WLFVBQVM7QUFDYnBWLFVBQUlxVixPQUFPTixHQUFHcmtCLEdBQUdxa0IsR0FBR25rQixDQUFDO0FBQ3JCb1AsVUFBSXNWLE9BQU9OLEdBQUd0a0IsR0FBR3NrQixHQUFHcGtCLENBQUM7QUFDckJvUCxVQUFJdVYsT0FBTTtBQUNWdlYsVUFBSXdVLFFBQU87SUFDYjtBQUVBLFFBQUk5RyxLQUFLdlQsU0FBUztBQUNoQixXQUFLeEssSUFBSSxHQUFHQyxPQUFPc0IsTUFBTTFDLFFBQVFtQixJQUFJQyxNQUFNLEVBQUVELEdBQUc7QUFDOUMsY0FBTXVKLE9BQU9oSSxNQUFNdkIsQ0FBRTtBQUVyQixZQUFJK2QsS0FBSzhILGlCQUFpQjtBQUN4QlYsbUJBQ0U7WUFBQ3BrQixHQUFHd0ksS0FBS3dZO1lBQUk5Z0IsR0FBR3NJLEtBQUt5WTthQUNyQjtZQUFDamhCLEdBQUd3SSxLQUFLMFk7WUFBSWhoQixHQUFHc0ksS0FBSzJZO2FBQ3JCM1ksSUFBQUE7O0FBSUosWUFBSXdVLEtBQUs1SCxXQUFXO0FBQ2xCZ1AsbUJBQ0U7WUFBQ3BrQixHQUFHd0ksS0FBS29ZO1lBQUsxZ0IsR0FBR3NJLEtBQUtxWTthQUN0QjtZQUFDN2dCLEdBQUd3SSxLQUFLc1k7WUFBSzVnQixHQUFHc0ksS0FBS3VZO2FBQ3RCO1lBQ0VXLE9BQU9sWixLQUFLdVo7WUFDWjFjLE9BQU9tRCxLQUFLOFQ7WUFDWnFGLFlBQVluWixLQUFLd1o7WUFDakJILGtCQUFrQnJaLEtBQUt5WjtVQUN6QixDQUFBOztNQUdOOztFQUVKO0VBS0E4QyxhQUFhO0FBQ1gsVUFBTSxFQUFDbm1CLE9BQU8wUSxLQUFLalQsU0FBUyxFQUFDK2pCLFFBQVFwRCxLQUFJLEVBQUMsSUFBSTtBQUM5QyxVQUFNc0QsYUFBYUYsT0FBTzlILFdBQVcsS0FBSzFOLFdBQVUsQ0FBQTtBQUNwRCxVQUFNMlYsWUFBWUgsT0FBTzNXLFVBQVU2VyxXQUFXamIsUUFBUTtBQUN0RCxRQUFJLENBQUNrYixXQUFXO0FBQ2Q7O0FBRUYsVUFBTXlFLGdCQUFnQmhJLEtBQUsxRSxXQUFXLEtBQUsxTixXQUFXLENBQUEsQ0FBQSxFQUFJNFc7QUFDMUQsVUFBTWQsY0FBYyxLQUFLeEk7QUFDekIsUUFBSThJLElBQUlFLElBQUlELElBQUlFO0FBRWhCLFFBQUksS0FBSy9jLGFBQVksR0FBSTtBQUN2QjRjLFdBQUtwQixZQUFZaGhCLE9BQU8sS0FBSzhHLE1BQU02YSxTQUFBQSxJQUFhQSxZQUFZO0FBQzVEVyxXQUFLdEIsWUFBWWhoQixPQUFPLEtBQUsrRyxPQUFPcWYsYUFBQUEsSUFBaUJBLGdCQUFnQjtBQUNyRS9ELFdBQUtFLEtBQUtUO1dBQ0w7QUFDTE8sV0FBS3JCLFlBQVloaEIsT0FBTyxLQUFLZ0gsS0FBSzJhLFNBQUFBLElBQWFBLFlBQVk7QUFDM0RZLFdBQUt2QixZQUFZaGhCLE9BQU8sS0FBS2lILFFBQVFtZixhQUFBQSxJQUFpQkEsZ0JBQWdCO0FBQ3RFaEUsV0FBS0UsS0FBS1I7O0FBRVpwUixRQUFJcVUsS0FBSTtBQUNSclUsUUFBSWtTLFlBQVlsQixXQUFXamI7QUFDM0JpSyxRQUFJaVYsY0FBY2pFLFdBQVdvQjtBQUU3QnBTLFFBQUlvVixVQUFTO0FBQ2JwVixRQUFJcVYsT0FBTzNELElBQUlDLEVBQUFBO0FBQ2YzUixRQUFJc1YsT0FBTzFELElBQUlDLEVBQUFBO0FBQ2Y3UixRQUFJdVYsT0FBTTtBQUVWdlYsUUFBSXdVLFFBQU87RUFDYjtFQUtBbUIsV0FBV3BrQixXQUFXO0FBQ3BCLFVBQU1tZixjQUFjLEtBQUszakIsUUFBUWlWO0FBRWpDLFFBQUksQ0FBQzBPLFlBQVl2VyxTQUFTO0FBQ3hCOztBQUdGLFVBQU02RixNQUFNLEtBQUtBO0FBRWpCLFVBQU00VixPQUFPLEtBQUsxQixrQkFBaUI7QUFDbkMsUUFBSTBCLE1BQU07QUFDUkMsZUFBUzdWLEtBQUs0VixJQUFBQTs7QUFHaEIsVUFBTTFrQixRQUFRLEtBQUtpWixjQUFjNVksU0FBQUE7QUFDakMsZUFBVzJILFFBQVFoSSxPQUFPO0FBQ3hCLFlBQU00a0Isb0JBQW9CNWMsS0FBS25NO0FBQy9CLFlBQU13aUIsV0FBV3JXLEtBQUsrTTtBQUN0QixZQUFNeUcsUUFBUXhULEtBQUt3VDtBQUNuQixZQUFNOWIsSUFBSXNJLEtBQUsrWjtBQUNmOEMsaUJBQVcvVixLQUFLME0sT0FBTyxHQUFHOWIsR0FBRzJlLFVBQVV1RyxpQkFBQUE7SUFDekM7QUFFQSxRQUFJRixNQUFNO0FBQ1JJLGlCQUFXaFcsR0FBQUE7O0VBRWY7RUFLQWlXLFlBQVk7QUFDVixVQUFNLEVBQUNqVyxLQUFLalQsU0FBUyxFQUFDd0MsVUFBVW9lLE9BQU8xWixRQUFPLEVBQUMsSUFBSTtBQUVuRCxRQUFJLENBQUMwWixNQUFNeFQsU0FBUztBQUNsQjs7QUFHRixVQUFNOEwsT0FBT0MsT0FBT3lILE1BQU0xSCxJQUFJO0FBQzlCLFVBQU1sTixVQUFVWSxVQUFVZ1UsTUFBTTVVLE9BQU87QUFDdkMsVUFBTXlMLFFBQVFtSixNQUFNbko7QUFDcEIsUUFBSXBCLFNBQVM2QyxLQUFLSyxhQUFhO0FBRS9CLFFBQUkvVyxhQUFhLFlBQVlBLGFBQWEsWUFBWTZILFNBQVM3SCxRQUFXLEdBQUE7QUFDeEU2VCxnQkFBVXJLLFFBQVF4QztBQUNsQixVQUFJNlAsUUFBUXVILE1BQU10SCxJQUFJLEdBQUc7QUFDdkJqRCxrQkFBVTZDLEtBQUtLLGNBQWNxSCxNQUFNdEgsS0FBSzdYLFNBQVM7O1dBRTlDO0FBQ0w0VSxnQkFBVXJLLFFBQVF6Qzs7QUFHcEIsVUFBTSxFQUFDNFEsUUFBUUMsUUFBUUYsVUFBVUQsU0FBUSxJQUFJRixVQUFVLE1BQU0xRCxRQUFRN1QsVUFBVWlWLEtBQUFBO0FBRS9FdVIsZUFBVy9WLEtBQUsyTixNQUFNdEgsTUFBTSxHQUFHLEdBQUdKLE1BQU07TUFDdENtTSxPQUFPekUsTUFBTXlFO01BQ2JuTDtNQUNBRDtNQUNBK0wsV0FBV25NLFdBQVdwQyxPQUFPalYsVUFBVTBFLE9BQUFBO01BQ3ZDaWYsY0FBYztNQUNkZSxhQUFhO1FBQUMvTTtRQUFRQztNQUFPO0lBQy9CLENBQUE7RUFDRjtFQUVBOU4sS0FBSzlILFdBQVc7QUFDZCxRQUFJLENBQUMsS0FBSzJiLFdBQVUsR0FBSTtBQUN0Qjs7QUFHRixTQUFLaUgsZUFBYztBQUNuQixTQUFLVSxTQUFTdGpCLFNBQUFBO0FBQ2QsU0FBS2trQixXQUFVO0FBQ2YsU0FBS1EsVUFBUztBQUNkLFNBQUtOLFdBQVdwa0IsU0FBQUE7RUFDbEI7RUFNQTRILFVBQVU7QUFDUixVQUFNeWIsT0FBTyxLQUFLN25CO0FBQ2xCLFVBQU1tcEIsS0FBS3RCLEtBQUs1UyxTQUFTNFMsS0FBSzVTLE1BQU01SSxLQUFLO0FBQ3pDLFVBQU0rYyxLQUFLL1IsZUFBZXdRLEtBQUtsSCxRQUFRa0gsS0FBS2xILEtBQUt0VSxHQUFHLEVBQUM7QUFDckQsVUFBTWdkLEtBQUtoUyxlQUFld1EsS0FBSzlELFVBQVU4RCxLQUFLOUQsT0FBTzFYLEdBQUcsQ0FBQTtBQUV4RCxRQUFJLENBQUMsS0FBSzhULFdBQVUsS0FBTSxLQUFLN1QsU0FBU21PLE9BQU1wYSxVQUFVaU0sTUFBTTtBQUU1RCxhQUFPO1FBQUM7VUFDTkQsR0FBRzhjO1VBQ0g3YyxNQUFNLENBQUM5SCxjQUFjO0FBQ25CLGlCQUFLOEgsS0FBSzlILFNBQUFBO1VBQ1o7UUFDRjtNQUFFOztBQUdKLFdBQU87TUFBQztRQUNONkgsR0FBRytjO1FBQ0g5YyxNQUFNLENBQUM5SCxjQUFjO0FBQ25CLGVBQUs0aUIsZUFBYztBQUNuQixlQUFLVSxTQUFTdGpCLFNBQUFBO0FBQ2QsZUFBSzBrQixVQUFTO1FBQ2hCO01BQ0Y7TUFBRztRQUNEN2MsR0FBR2dkO1FBQ0gvYyxNQUFNLE1BQU07QUFDVixlQUFLb2MsV0FBVTtRQUNqQjtNQUNGO01BQUc7UUFDRHJjLEdBQUc4YztRQUNIN2MsTUFBTSxDQUFDOUgsY0FBYztBQUNuQixlQUFLb2tCLFdBQVdwa0IsU0FBQUE7UUFDbEI7TUFDRjtJQUFFO0VBQ0o7RUFPQXNZLHdCQUF3QmpQLE1BQU07QUFDNUIsVUFBTWdQLFFBQVEsS0FBS3RhLE1BQU1JLDZCQUE0QjtBQUNyRCxVQUFNMm1CLFNBQVMsS0FBS3JvQixPQUFPO0FBQzNCLFVBQU0rVixTQUFTLENBQUE7QUFDZixRQUFJcFUsR0FBR0M7QUFFUCxTQUFLRCxJQUFJLEdBQUdDLE9BQU9nYSxNQUFNcGIsUUFBUW1CLElBQUlDLE1BQU0sRUFBRUQsR0FBRztBQUM5QyxZQUFNd0QsT0FBT3lXLE1BQU1qYSxDQUFFO0FBQ3JCLFVBQUl3RCxLQUFLa2pCLE1BQU8sTUFBSyxLQUFLM08sT0FBTyxDQUFDOU0sUUFBUXpILEtBQUt5SCxTQUFTQSxPQUFPO0FBQzdEbUosZUFBT3RTLEtBQUswQixJQUFBQTs7SUFFaEI7QUFDQSxXQUFPNFE7RUFDVDtFQU9BMkwsd0JBQXdCN2YsT0FBTztBQUM3QixVQUFNK2tCLE9BQU8sS0FBSzduQixRQUFRaVYsTUFBTWdILFdBQVcsS0FBSzFOLFdBQVd6TCxLQUFBQSxDQUFBQTtBQUMzRCxXQUFPcVcsT0FBTzBPLEtBQUszTyxJQUFJO0VBQ3pCO0VBS0FxUSxhQUFhO0FBQ1gsVUFBTUMsV0FBVyxLQUFLN0csd0JBQXdCLENBQUEsRUFBR3BKO0FBQ2pELFlBQVEsS0FBS3hSLGFBQVksSUFBSyxLQUFLaUIsUUFBUSxLQUFLRSxVQUFVc2dCO0VBQzVEO0FBQ0Y7QUN2cURlLElBQU1DLGdCQUFOLE1BQU1BO0VBQ25CMXBCLFlBQVk4TixNQUFNNmIsT0FBT3pwQixVQUFVO0FBQ2pDLFNBQUs0TixPQUFPQTtBQUNaLFNBQUs2YixRQUFRQTtBQUNiLFNBQUt6cEIsV0FBV0E7QUFDaEIsU0FBS2tFLFFBQVFoRSx1QkFBT3dwQixPQUFPLElBQUk7RUFDakM7RUFFQUMsVUFBVS9iLE1BQU07QUFDZCxXQUFPMU4sT0FBT0UsVUFBVXdwQixjQUFjdE0sS0FBSyxLQUFLMVAsS0FBS3hOLFdBQVd3TixLQUFLeE4sU0FBUztFQUNoRjtFQU1BeXBCLFNBQVMzZCxNQUFNO0FBQ2IsVUFBTTRkLFFBQVE1cEIsT0FBTzZwQixlQUFlN2QsSUFBQUE7QUFDcEMsUUFBSThkO0FBRUosUUFBSUMsa0JBQWtCSCxLQUFRLEdBQUE7QUFFNUJFLG9CQUFjLEtBQUtILFNBQVNDLEtBQUFBOztBQUc5QixVQUFNNWxCLFFBQVEsS0FBS0E7QUFDbkIsVUFBTXdXLEtBQUt4TyxLQUFLd087QUFDaEIsVUFBTStPLFFBQVEsS0FBS0EsUUFBUSxNQUFNL087QUFFakMsUUFBSSxDQUFDQSxJQUFJO0FBQ1AsWUFBTSxJQUFJOWEsTUFBTSw2QkFBNkJzTSxJQUFNOztBQUdyRCxRQUFJd08sTUFBTXhXLE9BQU87QUFFZixhQUFPdWxCOztBQUdUdmxCLFVBQU13VyxFQUFBQSxJQUFNeE87QUFDWmdlLHFCQUFpQmhlLE1BQU11ZCxPQUFPTyxXQUFBQTtBQUM5QixRQUFJLEtBQUtocUIsVUFBVTtBQUNqQjRVLGVBQVM1VSxTQUFTa00sS0FBS3dPLElBQUl4TyxLQUFLaWUsU0FBUzs7QUFHM0MsV0FBT1Y7RUFDVDtFQU1BVyxJQUFJMVAsSUFBSTtBQUNOLFdBQU8sS0FBS3hXLE1BQU13VyxFQUFHO0VBQ3ZCO0VBS0EyUCxXQUFXbmUsTUFBTTtBQUNmLFVBQU1oSSxRQUFRLEtBQUtBO0FBQ25CLFVBQU13VyxLQUFLeE8sS0FBS3dPO0FBQ2hCLFVBQU0rTyxRQUFRLEtBQUtBO0FBRW5CLFFBQUkvTyxNQUFNeFcsT0FBTztBQUNmLGFBQU9BLE1BQU13VyxFQUFHOztBQUdsQixRQUFJK08sU0FBUy9PLE1BQU05RixTQUFTNlUsS0FBQUEsR0FBUTtBQUNsQyxhQUFPN1UsU0FBUzZVLEtBQU0sRUFBQy9PLEVBQUc7QUFDMUIsVUFBSSxLQUFLMWEsVUFBVTtBQUNqQixlQUFPbXFCLFVBQVV6UCxFQUFHOzs7RUFHMUI7QUFDRjtBQUVBLFNBQVN3UCxpQkFBaUJoZSxNQUFNdWQsT0FBT08sYUFBYTtBQUVsRCxRQUFNTSxlQUFlQyxNQUFNcnFCLHVCQUFPd3BCLE9BQU8sSUFBSSxHQUFHO0lBQzlDTSxjQUFjcFYsU0FBU3dWLElBQUlKLFdBQUFBLElBQWUsQ0FBQTtJQUMxQ3BWLFNBQVN3VixJQUFJWCxLQUFBQTtJQUNidmQsS0FBSzBJO0VBQ04sQ0FBQTtBQUVEQSxXQUFTMUMsSUFBSXVYLE9BQU9hLFlBQUFBO0FBRXBCLE1BQUlwZSxLQUFLMkksZUFBZTtBQUN0QjJWLGtCQUFjZixPQUFPdmQsS0FBSzJJLGFBQWE7O0FBR3pDLE1BQUkzSSxLQUFLdWUsYUFBYTtBQUNwQjdWLGFBQVM4VixTQUFTakIsT0FBT3ZkLEtBQUt1ZSxXQUFXOztBQUU3QztBQUVBLFNBQVNELGNBQWNmLE9BQU9rQixRQUFRO0FBQ3BDenFCLFNBQU9vVCxLQUFLcVgsTUFBQUEsRUFBUXprQixRQUFRMGtCLENBQUFBLGFBQVk7QUFDdEMsVUFBTUMsZ0JBQWdCRCxTQUFTRSxNQUFNLEdBQUE7QUFDckMsVUFBTUMsYUFBYUYsY0FBY0csSUFBRztBQUNwQyxVQUFNQyxjQUFjO01BQUN4QjtJQUFNLEVBQUM5ZixPQUFPa2hCLGFBQWVLLEVBQUFBLEtBQUssR0FBQTtBQUN2RCxVQUFNQyxRQUFRUixPQUFPQyxRQUFTLEVBQUNFLE1BQU0sR0FBQTtBQUNyQyxVQUFNTSxhQUFhRCxNQUFNSCxJQUFHO0FBQzVCLFVBQU1LLGNBQWNGLE1BQU1ELEtBQUssR0FBQTtBQUMvQnRXLGFBQVMwVyxNQUFNTCxhQUFhRixZQUFZTSxhQUFhRCxVQUFBQTtFQUN2RCxDQUFBO0FBQ0Y7QUFFQSxTQUFTbkIsa0JBQWtCSCxPQUFPO0FBQ2hDLFNBQU8sUUFBUUEsU0FBUyxjQUFjQTtBQUN4QztBQzFHTyxJQUFNeUIsV0FBTixNQUFNQTtFQUNYenJCLGNBQWM7QUFDWixTQUFLMHJCLGNBQWMsSUFBSWhDLGNBQWNpQyxtQkFBbUIsWUFBWSxJQUFJO0FBQ3hFLFNBQUt4bEIsV0FBVyxJQUFJdWpCLGNBQWN2VixTQUFTLFVBQUE7QUFDM0MsU0FBS3lYLFVBQVUsSUFBSWxDLGNBQWN0cEIsUUFBUSxTQUFBO0FBQ3pDLFNBQUs2WixTQUFTLElBQUl5UCxjQUFjaFAsT0FBTyxRQUFBO0FBR3ZDLFNBQUttUixtQkFBbUI7TUFBQyxLQUFLSDtNQUFhLEtBQUt6UjtNQUFRLEtBQUs5VDtJQUFTO0VBQ3hFO0VBS0F4RixPQUFPbXJCLE1BQU07QUFDWCxTQUFLQyxNQUFNLFlBQVlELElBQUFBO0VBQ3pCO0VBRUFFLFVBQVVGLE1BQU07QUFDZCxTQUFLQyxNQUFNLGNBQWNELElBQUFBO0VBQzNCO0VBS0FHLGtCQUFrQkgsTUFBTTtBQUN0QixTQUFLQyxNQUFNLFlBQVlELE1BQU0sS0FBS0osV0FBVztFQUMvQztFQUtBUSxlQUFlSixNQUFNO0FBQ25CLFNBQUtDLE1BQU0sWUFBWUQsTUFBTSxLQUFLM2xCLFFBQVE7RUFDNUM7RUFLQWdtQixjQUFjTCxNQUFNO0FBQ2xCLFNBQUtDLE1BQU0sWUFBWUQsTUFBTSxLQUFLRixPQUFPO0VBQzNDO0VBS0FRLGFBQWFOLE1BQU07QUFDakIsU0FBS0MsTUFBTSxZQUFZRCxNQUFNLEtBQUs3UixNQUFNO0VBQzFDO0VBTUFvUyxjQUFjelIsSUFBSTtBQUNoQixXQUFPLEtBQUswUixLQUFLMVIsSUFBSSxLQUFLOFEsYUFBYSxZQUFBO0VBQ3pDO0VBTUFhLFdBQVczUixJQUFJO0FBQ2IsV0FBTyxLQUFLMFIsS0FBSzFSLElBQUksS0FBS3pVLFVBQVUsU0FBQTtFQUN0QztFQU1BcW1CLFVBQVU1UixJQUFJO0FBQ1osV0FBTyxLQUFLMFIsS0FBSzFSLElBQUksS0FBS2dSLFNBQVMsUUFBQTtFQUNyQztFQU1BYSxTQUFTN1IsSUFBSTtBQUNYLFdBQU8sS0FBSzBSLEtBQUsxUixJQUFJLEtBQUtYLFFBQVEsT0FBQTtFQUNwQztFQUtBeVMscUJBQXFCWixNQUFNO0FBQ3pCLFNBQUtDLE1BQU0sY0FBY0QsTUFBTSxLQUFLSixXQUFXO0VBQ2pEO0VBS0FpQixrQkFBa0JiLE1BQU07QUFDdEIsU0FBS0MsTUFBTSxjQUFjRCxNQUFNLEtBQUszbEIsUUFBUTtFQUM5QztFQUtBeW1CLGlCQUFpQmQsTUFBTTtBQUNyQixTQUFLQyxNQUFNLGNBQWNELE1BQU0sS0FBS0YsT0FBTztFQUM3QztFQUtBaUIsZ0JBQWdCZixNQUFNO0FBQ3BCLFNBQUtDLE1BQU0sY0FBY0QsTUFBTSxLQUFLN1IsTUFBTTtFQUM1QztFQUtBOFIsTUFBTWUsUUFBUWhCLE1BQU1pQixlQUFlO0FBQ2pDO01BQUlqQixHQUFBQTtNQUFNMWxCLFFBQVE0bUIsQ0FBQUEsUUFBTztBQUN2QixZQUFNQyxNQUFNRixpQkFBaUIsS0FBS0csb0JBQW9CRixHQUFBQTtBQUN0RCxVQUFJRCxpQkFBaUJFLElBQUlwRCxVQUFVbUQsR0FBU0MsS0FBQUEsUUFBUSxLQUFLckIsV0FBV29CLElBQUlwUyxJQUFLO0FBQzNFLGFBQUt1UyxNQUFNTCxRQUFRRyxLQUFLRCxHQUFBQTthQUNuQjtBQUtMaGdCLGFBQUtnZ0IsS0FBSzVnQixDQUFBQSxTQUFRO0FBT2hCLGdCQUFNZ2hCLFVBQVVMLGlCQUFpQixLQUFLRyxvQkFBb0I5Z0IsSUFBQUE7QUFDMUQsZUFBSytnQixNQUFNTCxRQUFRTSxTQUFTaGhCLElBQUFBO1FBQzlCLENBQUE7O0lBRUosQ0FBQTtFQUNGO0VBS0ErZ0IsTUFBTUwsUUFBUU8sV0FBVUMsV0FBVztBQUNqQyxVQUFNQyxjQUFjQyxZQUFZVixNQUFBQTtBQUNoQ3RQLGFBQUs4UCxVQUFVLFdBQVdDLFdBQUFBLEdBQWMsQ0FBQSxHQUFJRCxTQUFBQTtBQUM1Q0QsSUFBQUEsVUFBU1AsTUFBQUEsRUFBUVEsU0FBQUE7QUFDakI5UCxhQUFLOFAsVUFBVSxVQUFVQyxXQUFBQSxHQUFjLENBQUEsR0FBSUQsU0FBQUE7RUFDN0M7RUFLQUosb0JBQW9CcGYsTUFBTTtBQUN4QixhQUFTakwsSUFBSSxHQUFHQSxJQUFJLEtBQUtncEIsaUJBQWlCbnFCLFFBQVFtQixLQUFLO0FBQ3JELFlBQU1vcUIsTUFBTSxLQUFLcEIsaUJBQWlCaHBCLENBQUU7QUFDcEMsVUFBSW9xQixJQUFJcEQsVUFBVS9iLElBQU8sR0FBQTtBQUN2QixlQUFPbWY7O0lBRVg7QUFFQSxXQUFPLEtBQUtyQjtFQUNkO0VBS0FVLEtBQUsxUixJQUFJbVMsZUFBZWpmLE1BQU07QUFDNUIsVUFBTTFCLE9BQU8yZ0IsY0FBY3pDLElBQUkxUCxFQUFBQTtBQUMvQixRQUFJeE8sU0FBUzJELFFBQVc7QUFDdEIsWUFBTSxJQUFJalEsTUFBTSxNQUFNOGEsS0FBSywyQkFBMkI5TSxPQUFPLEdBQUs7O0FBRXBFLFdBQU8xQjtFQUNUO0FBRUY7QUFHQSxJQUFBLFdBQStCLG9CQUFJcWYsU0FBVztBQ3RLL0IsSUFBTWdDLGdCQUFOLE1BQU1BO0VBQ25CenRCLGNBQWM7QUFDWixTQUFLMHRCLFFBQVEsQ0FBQTtFQUNmO0VBWUFDLE9BQU9uckIsT0FBT29yQixNQUFNOUIsTUFBTWpsQixRQUFRO0FBQ2hDLFFBQUkrbUIsU0FBUyxjQUFjO0FBQ3pCLFdBQUtGLFFBQVEsS0FBS0csbUJBQW1CcnJCLE9BQU8sSUFBSTtBQUNoRCxXQUFLc3JCLFFBQVEsS0FBS0osT0FBT2xyQixPQUFPLFNBQUE7O0FBR2xDLFVBQU1tb0IsZUFBYzlqQixTQUFTLEtBQUtrbkIsYUFBYXZyQixLQUFBQSxFQUFPcUUsT0FBT0EsTUFBVSxJQUFBLEtBQUtrbkIsYUFBYXZyQixLQUFNO0FBQy9GLFVBQU15VSxTQUFTLEtBQUs2VyxRQUFRbkQsY0FBYW5vQixPQUFPb3JCLE1BQU05QixJQUFBQTtBQUV0RCxRQUFJOEIsU0FBUyxnQkFBZ0I7QUFDM0IsV0FBS0UsUUFBUW5ELGNBQWFub0IsT0FBTyxNQUFBO0FBQ2pDLFdBQUtzckIsUUFBUSxLQUFLSixPQUFPbHJCLE9BQU8sV0FBQTs7QUFFbEMsV0FBT3lVO0VBQ1Q7RUFLQTZXLFFBQVFuRCxjQUFhbm9CLE9BQU9vckIsTUFBTTlCLE1BQU07QUFDdENBLFdBQU9BLFFBQVEsQ0FBQTtBQUNmLGVBQVdrQyxjQUFjckQsY0FBYTtBQUNwQyxZQUFNc0QsU0FBU0QsV0FBV0M7QUFDMUIsWUFBTW5CLFNBQVNtQixPQUFPTCxJQUFLO0FBQzNCLFlBQU1qbEIsU0FBUztRQUFDbkc7UUFBT3NwQjtRQUFNa0MsV0FBVy90QjtNQUFRO0FBQ2hELFVBQUlpdUIsU0FBYXBCLFFBQVFua0IsUUFBUXNsQixNQUFBQSxNQUFZLFNBQVNuQyxLQUFLcUMsWUFBWTtBQUNyRSxlQUFPOztJQUVYO0FBRUEsV0FBTztFQUNUO0VBRUFDLGFBQWE7QUFNWCxRQUFJLENBQUMvYSxjQUFjLEtBQUswSSxNQUFNLEdBQUc7QUFDL0IsV0FBS3NTLFlBQVksS0FBS3RTO0FBQ3RCLFdBQUtBLFNBQVNoTTs7RUFFbEI7RUFNQWdlLGFBQWF2ckIsT0FBTztBQUNsQixRQUFJLEtBQUt1WixRQUFRO0FBQ2YsYUFBTyxLQUFLQTs7QUFHZCxVQUFNNE8sZUFBYyxLQUFLNU8sU0FBUyxLQUFLOFIsbUJBQW1CcnJCLEtBQUFBO0FBRTFELFNBQUs4ckIsb0JBQW9COXJCLEtBQUFBO0FBRXpCLFdBQU9tb0I7RUFDVDtFQUVBa0QsbUJBQW1CcnJCLE9BQU8rckIsS0FBSztBQUM3QixVQUFNamdCLFNBQVM5TCxTQUFTQSxNQUFNOEw7QUFDOUIsVUFBTXJPLFVBQVVxWCxlQUFlaEosT0FBT3JPLFdBQVdxTyxPQUFPck8sUUFBUTJyQixTQUFTLENBQUEsQ0FBQztBQUMxRSxVQUFNQSxVQUFVNEMsV0FBV2xnQixNQUFBQTtBQUUzQixXQUFPck8sWUFBWSxTQUFTLENBQUNzdUIsTUFBTSxDQUFBLElBQUtFLGtCQUFrQmpzQixPQUFPb3BCLFNBQVMzckIsU0FBU3N1QixHQUFJO0VBQ3pGO0VBTUFELG9CQUFvQjlyQixPQUFPO0FBQ3pCLFVBQU1rc0Isc0JBQXNCLEtBQUtMLGFBQWEsQ0FBQTtBQUM5QyxVQUFNMUQsZUFBYyxLQUFLNU87QUFDekIsVUFBTW5iLE9BQU8sQ0FBQ3lHLEdBQUdDLE1BQU1ELEVBQUVSLE9BQU9qRCxDQUFBQSxNQUFLLENBQUMwRCxFQUFFcW5CLEtBQUs3cUIsQ0FBQUEsTUFBS0YsRUFBRXFxQixPQUFPclQsT0FBTzlXLEVBQUVtcUIsT0FBT3JULEVBQUUsQ0FBQTtBQUM3RSxTQUFLa1QsUUFBUWx0QixLQUFLOHRCLHFCQUFxQi9ELFlBQUFBLEdBQWNub0IsT0FBTyxNQUFBO0FBQzVELFNBQUtzckIsUUFBUWx0QixLQUFLK3BCLGNBQWErRCxtQkFBQUEsR0FBc0Jsc0IsT0FBTyxPQUFBO0VBQzlEO0FBQ0Y7QUFLQSxTQUFTZ3NCLFdBQVdsZ0IsUUFBUTtBQUMxQixRQUFNc2dCLFdBQVcsQ0FBQTtBQUNqQixRQUFNaEQsVUFBVSxDQUFBO0FBQ2hCLFFBQU1wWSxPQUFPcFQsT0FBT29ULEtBQUs2WixTQUFTekIsUUFBUXhuQixLQUFLO0FBQy9DLFdBQVN2QixJQUFJLEdBQUdBLElBQUkyUSxLQUFLOVIsUUFBUW1CLEtBQUs7QUFDcEMrb0IsWUFBUWpuQixLQUFLMG9CLFNBQVNiLFVBQVVoWixLQUFLM1EsQ0FBRSxDQUFBLENBQUE7RUFDekM7QUFFQSxRQUFNZ3NCLFFBQVF2Z0IsT0FBT3NkLFdBQVcsQ0FBQTtBQUNoQyxXQUFTL29CLElBQUksR0FBR0EsSUFBSWdzQixNQUFNbnRCLFFBQVFtQixLQUFLO0FBQ3JDLFVBQU1vckIsU0FBU1ksTUFBTWhzQixDQUFFO0FBRXZCLFFBQUkrb0IsUUFBUXZvQixRQUFRNHFCLE1BQUFBLE1BQVksSUFBSTtBQUNsQ3JDLGNBQVFqbkIsS0FBS3NwQixNQUFBQTtBQUNiVyxlQUFTWCxPQUFPclQsRUFBRSxJQUFJOztFQUUxQjtBQUVBLFNBQU87SUFBQ2dSO0lBQVNnRDtFQUFRO0FBQzNCO0FBRUEsU0FBU0UsUUFBUTd1QixTQUFTc3VCLEtBQUs7QUFDN0IsTUFBSSxDQUFDQSxPQUFPdHVCLFlBQVksT0FBTztBQUM3QixXQUFPOztBQUVULE1BQUlBLFlBQVksTUFBTTtBQUNwQixXQUFPLENBQUE7O0FBRVQsU0FBT0E7QUFDVDtBQUVBLFNBQVN3dUIsa0JBQWtCanNCLE9BQU8sRUFBQ29wQixTQUFTZ0QsU0FBUSxHQUFHM3VCLFNBQVNzdUIsS0FBSztBQUNuRSxRQUFNdFgsU0FBUyxDQUFBO0FBQ2YsUUFBTXJKLFVBQVVwTCxNQUFNZ00sV0FBVTtBQUVoQyxhQUFXeWYsVUFBVXJDLFNBQVM7QUFDNUIsVUFBTWhSLEtBQUtxVCxPQUFPclQ7QUFDbEIsVUFBTWtOLE9BQU9nSCxRQUFRN3VCLFFBQVEyYSxFQUFBQSxHQUFLMlQsR0FBQUE7QUFDbEMsUUFBSXpHLFNBQVMsTUFBTTtBQUNqQjs7QUFFRjdRLFdBQU90UyxLQUFLO01BQ1ZzcEI7TUFDQWh1QixTQUFTOHVCLFdBQVd2c0IsTUFBTThMLFFBQVE7UUFBQzJmO1FBQVFZLE9BQU9ELFNBQVNoVSxFQUFHO01BQUEsR0FBR2tOLE1BQU1sYSxPQUFBQTtJQUN6RSxDQUFBO0VBQ0Y7QUFFQSxTQUFPcUo7QUFDVDtBQUVBLFNBQVM4WCxXQUFXemdCLFFBQVEsRUFBQzJmLFFBQVFZLE1BQUssR0FBRy9HLE1BQU1sYSxTQUFTO0FBQzFELFFBQU00RixPQUFPbEYsT0FBTzBnQixnQkFBZ0JmLE1BQUFBO0FBQ3BDLFFBQU1nQixTQUFTM2dCLE9BQU80Z0IsZ0JBQWdCcEgsTUFBTXRVLElBQUFBO0FBQzVDLE1BQUlxYixTQUFTWixPQUFPblosVUFBVTtBQUU1Qm1hLFdBQU90cUIsS0FBS3NwQixPQUFPblosUUFBUTs7QUFFN0IsU0FBT3hHLE9BQU82Z0IsZUFBZUYsUUFBUXJoQixTQUFTO0lBQUM7S0FBSztJQUVsRHdoQixZQUFZO0lBQ1pDLFdBQVc7SUFDWEMsU0FBUztFQUNYLENBQUE7QUFDRjtBQ2xMTyxTQUFTQyxhQUFhemhCLE1BQU03TixTQUFTO0FBQzFDLFFBQU11dkIsa0JBQWtCMWEsU0FBUzJhLFNBQVMzaEIsSUFBQUEsS0FBUyxDQUFBO0FBQ25ELFFBQU00aEIsa0JBQWtCenZCLFFBQVF3dkIsWUFBWSxDQUFBLEdBQUkzaEIsSUFBSyxLQUFJLENBQUE7QUFDekQsU0FBTzRoQixlQUFlQyxhQUFhMXZCLFFBQVEwdkIsYUFBYUgsZ0JBQWdCRyxhQUFhO0FBQ3ZGO0FBRUEsU0FBU0MsMEJBQTBCaFYsSUFBSStVLFdBQVc7QUFDaEQsTUFBSXp1QixPQUFPMFo7QUFDWCxNQUFJQSxPQUFPLFdBQVc7QUFDcEIxWixXQUFPeXVCO2FBQ0UvVSxPQUFPLFdBQVc7QUFDM0IxWixXQUFPeXVCLGNBQWMsTUFBTSxNQUFNOztBQUVuQyxTQUFPenVCO0FBQ1Q7QUFFQSxTQUFTMnVCLDBCQUEwQjN1QixNQUFNeXVCLFdBQVc7QUFDbEQsU0FBT3p1QixTQUFTeXVCLFlBQVksWUFBWTtBQUMxQztBQUVBLFNBQVNHLGNBQWNsVixJQUFJO0FBQ3pCLE1BQUlBLE9BQU8sT0FBT0EsT0FBTyxPQUFPQSxPQUFPLEtBQUs7QUFDMUMsV0FBT0E7O0FBRVg7QUFFQSxTQUFTbVYsaUJBQWlCdHRCLFVBQVU7QUFDbEMsTUFBSUEsYUFBYSxTQUFTQSxhQUFhLFVBQVU7QUFDL0MsV0FBTzs7QUFFVCxNQUFJQSxhQUFhLFVBQVVBLGFBQWEsU0FBUztBQUMvQyxXQUFPOztBQUVYO0FBRU8sU0FBU3V0QixjQUFjcFYsT0FBT3FWLGNBQWM7QUFDakQsTUFBSUgsY0FBY2xWLEVBQUssR0FBQTtBQUNyQixXQUFPQTs7QUFFVCxhQUFXa04sUUFBUW1JLGNBQWM7QUFDL0IsVUFBTS91QixPQUFPNG1CLEtBQUs1bUIsUUFDYjZ1QixpQkFBaUJqSSxLQUFLcmxCLFFBQVEsS0FDOUJtWSxHQUFHbFosU0FBUyxLQUFLb3VCLGNBQWNsVixHQUFHLENBQUEsRUFBR3NWLFlBQVcsQ0FBQTtBQUNyRCxRQUFJaHZCLE1BQU07QUFDUixhQUFPQTs7RUFFWDtBQUNBLFFBQU0sSUFBSXBCLE1BQU0sNkJBQTZCOGEsRUFBRyxxREFBb0Q7QUFDdEc7QUFFQSxTQUFTdVYsbUJBQW1CdlYsSUFBSTFaLE1BQU1vRixTQUFTO0FBQzdDLE1BQUlBLFFBQVFwRixPQUFPLFFBQUEsTUFBYzBaLElBQUk7QUFDbkMsV0FBTztNQUFDMVo7SUFBSTs7QUFFaEI7QUFFQSxTQUFTa3ZCLHlCQUF5QnhWLElBQUl0TSxRQUFRO0FBQzVDLE1BQUlBLE9BQU9oTixRQUFRZ04sT0FBT2hOLEtBQUttdUIsVUFBVTtBQUN2QyxVQUFNWSxVQUFVL2hCLE9BQU9oTixLQUFLbXVCLFNBQVM1b0IsT0FBTyxDQUFDeXBCLE1BQU1BLEVBQUVDLFlBQVkzVixNQUFNMFYsRUFBRUUsWUFBWTVWLEVBQUFBO0FBQ3JGLFFBQUl5VixRQUFRM3VCLFFBQVE7QUFDbEIsYUFBT3l1QixtQkFBbUJ2VixJQUFJLEtBQUt5VixRQUFRLENBQUEsQ0FBRSxLQUFLRixtQkFBbUJ2VixJQUFJLEtBQUt5VixRQUFRLENBQUUsQ0FBQTs7O0FBRzVGLFNBQU8sQ0FBQTtBQUNUO0FBRUEsU0FBU0ksaUJBQWlCbmlCLFFBQVFyTyxTQUFTO0FBQ3pDLFFBQU15d0IsZ0JBQWdCckcsVUFBVS9iLE9BQU9SLElBQUksS0FBSztJQUFDbU0sUUFBUSxDQUFBO0VBQUU7QUFDM0QsUUFBTTBXLGVBQWUxd0IsUUFBUWdhLFVBQVUsQ0FBQTtBQUN2QyxRQUFNMlcsaUJBQWlCckIsYUFBYWpoQixPQUFPUixNQUFNN04sT0FBQUE7QUFDakQsUUFBTWdhLFNBQVM3Wix1QkFBT3dwQixPQUFPLElBQUk7QUFHakN4cEIsU0FBT29ULEtBQUttZCxZQUFBQSxFQUFjdnFCLFFBQVF3VSxDQUFBQSxPQUFNO0FBQ3RDLFVBQU1pVyxZQUFZRixhQUFhL1YsRUFBRztBQUNsQyxRQUFJLENBQUN0USxTQUFTdW1CLFNBQVksR0FBQTtBQUN4QixhQUFPQyxRQUFRQyxNQUFNLDBDQUEwQ25XLEVBQUFBLEVBQUk7O0FBRXJFLFFBQUlpVyxVQUFVRyxRQUFRO0FBQ3BCLGFBQU9GLFFBQVFHLEtBQUssa0RBQWtEclcsRUFBQUEsRUFBSTs7QUFFNUUsVUFBTTFaLE9BQU84dUIsY0FBY3BWLElBQUlpVyxXQUFXVCx5QkFBeUJ4VixJQUFJdE0sTUFBU3dHLEdBQUFBLFNBQVNtRixPQUFPNFcsVUFBVS9pQixJQUFJLENBQUM7QUFDL0csVUFBTW9qQixZQUFZckIsMEJBQTBCM3VCLE1BQU0wdkIsY0FBQUE7QUFDbEQsVUFBTU8sc0JBQXNCVCxjQUFjelcsVUFBVSxDQUFBO0FBQ3BEQSxXQUFPVyxFQUFBQSxJQUFNd1csUUFBUWh4Qix1QkFBT3dwQixPQUFPLElBQUksR0FBRztNQUFDO1FBQUMxb0I7TUFBSTtNQUFHMnZCO01BQVdNLG9CQUFvQmp3QixJQUFLO01BQUVpd0Isb0JBQW9CRCxTQUFVO0lBQUMsQ0FBQTtFQUMxSCxDQUFBO0FBR0E1aUIsU0FBT2hOLEtBQUttdUIsU0FBU3JwQixRQUFRRSxDQUFBQSxZQUFXO0FBQ3RDLFVBQU13SCxPQUFPeEgsUUFBUXdILFFBQVFRLE9BQU9SO0FBQ3BDLFVBQU02aEIsWUFBWXJwQixRQUFRcXBCLGFBQWFKLGFBQWF6aEIsTUFBTTdOLE9BQUFBO0FBQzFELFVBQU11dkIsa0JBQWtCbkYsVUFBVXZjLElBQUFBLEtBQVMsQ0FBQTtBQUMzQyxVQUFNcWpCLHNCQUFzQjNCLGdCQUFnQnZWLFVBQVUsQ0FBQTtBQUN0RDdaLFdBQU9vVCxLQUFLMmQsbUJBQUFBLEVBQXFCL3FCLFFBQVFpckIsQ0FBQUEsY0FBYTtBQUNwRCxZQUFNbndCLE9BQU8wdUIsMEJBQTBCeUIsV0FBVzFCLFNBQUFBO0FBQ2xELFlBQU0vVSxLQUFLdFUsUUFBUXBGLE9BQU8sUUFBQSxLQUFhQTtBQUN2QytZLGFBQU9XLEVBQUcsSUFBR1gsT0FBT1csRUFBQUEsS0FBT3hhLHVCQUFPd3BCLE9BQU8sSUFBSTtBQUM3Q3dILGNBQVFuWCxPQUFPVyxFQUFBQSxHQUFLO1FBQUM7VUFBQzFaO1FBQUk7UUFBR3l2QixhQUFhL1YsRUFBRztRQUFFdVcsb0JBQW9CRSxTQUFVO01BQUMsQ0FBQTtJQUNoRixDQUFBO0VBQ0YsQ0FBQTtBQUdBanhCLFNBQU9vVCxLQUFLeUcsTUFBQUEsRUFBUTdULFFBQVFxTixDQUFBQSxRQUFPO0FBQ2pDLFVBQU13QixRQUFRZ0YsT0FBT3hHLEdBQUk7QUFDekIyZCxZQUFRbmMsT0FBTztNQUFDSCxTQUFTbUYsT0FBT2hGLE1BQU1uSCxJQUFJO01BQUdnSCxTQUFTRztJQUFNLENBQUE7RUFDOUQsQ0FBQTtBQUVBLFNBQU9nRjtBQUNUO0FBRUEsU0FBU3FYLFlBQVloakIsUUFBUTtBQUMzQixRQUFNck8sVUFBVXFPLE9BQU9yTyxZQUFZcU8sT0FBT3JPLFVBQVUsQ0FBQTtBQUVwREEsVUFBUTJyQixVQUFVdFUsZUFBZXJYLFFBQVEyckIsU0FBUyxDQUFBLENBQUM7QUFDbkQzckIsVUFBUWdhLFNBQVN3VyxpQkFBaUJuaUIsUUFBUXJPLE9BQUFBO0FBQzVDO0FBRUEsU0FBU3N4QixTQUFTandCLE1BQU07QUFDdEJBLFNBQU9BLFFBQVEsQ0FBQTtBQUNmQSxPQUFLbXVCLFdBQVdudUIsS0FBS211QixZQUFZLENBQUE7QUFDakNudUIsT0FBSzRiLFNBQVM1YixLQUFLNGIsVUFBVSxDQUFBO0FBQzdCLFNBQU81YjtBQUNUO0FBRUEsU0FBU2t3QixXQUFXbGpCLFFBQVE7QUFDMUJBLFdBQVNBLFVBQVUsQ0FBQTtBQUNuQkEsU0FBT2hOLE9BQU9pd0IsU0FBU2pqQixPQUFPaE4sSUFBSTtBQUVsQ2d3QixjQUFZaGpCLE1BQUFBO0FBRVosU0FBT0E7QUFDVDtBQUVBLElBQU1takIsV0FBVyxvQkFBSTlmLElBQUFBO0FBQ3JCLElBQU0rZixhQUFhLG9CQUFJQyxJQUFBQTtBQUV2QixTQUFTQyxXQUFXQyxVQUFVQyxVQUFVO0FBQ3RDLE1BQUl0ZSxPQUFPaWUsU0FBU25ILElBQUl1SCxRQUFBQTtBQUN4QixNQUFJLENBQUNyZSxNQUFNO0FBQ1RBLFdBQU9zZSxTQUFBQTtBQUNQTCxhQUFTcmYsSUFBSXlmLFVBQVVyZSxJQUFBQTtBQUN2QmtlLGVBQVcvd0IsSUFBSTZTLElBQUFBOztBQUVqQixTQUFPQTtBQUNUO0FBRUEsSUFBTXVlLGFBQWEsQ0FBQzNmLE1BQUs0ZixLQUFLdmUsUUFBUTtBQUNwQyxRQUFNcVUsT0FBT21LLGlCQUFpQkQsS0FBS3ZlLEdBQUFBO0FBQ25DLE1BQUlxVSxTQUFTL1gsUUFBVztBQUN0QnFDLElBQUFBLEtBQUl6UixJQUFJbW5CLElBQUFBOztBQUVaO0FBRWUsSUFBTW9LLFNBQU4sTUFBTUE7RUFDbkJseUIsWUFBWXNPLFFBQVE7QUFDbEIsU0FBSzZqQixVQUFVWCxXQUFXbGpCLE1BQUFBO0FBQzFCLFNBQUs4akIsY0FBYyxvQkFBSXpnQixJQUFBQTtBQUN2QixTQUFLMGdCLGlCQUFpQixvQkFBSTFnQixJQUFBQTtFQUM1QjtFQUVBLElBQUkyZ0IsV0FBVztBQUNiLFdBQU8sS0FBS0gsUUFBUUc7RUFDdEI7RUFFQSxJQUFJeGtCLE9BQU87QUFDVCxXQUFPLEtBQUtxa0IsUUFBUXJrQjtFQUN0QjtFQUVBLElBQUlBLEtBQUtBLE1BQU07QUFDYixTQUFLcWtCLFFBQVFya0IsT0FBT0E7RUFDdEI7RUFFQSxJQUFJeE0sT0FBTztBQUNULFdBQU8sS0FBSzZ3QixRQUFRN3dCO0VBQ3RCO0VBRUEsSUFBSUEsS0FBS0EsTUFBTTtBQUNiLFNBQUs2d0IsUUFBUTd3QixPQUFPaXdCLFNBQVNqd0IsSUFBQUE7RUFDL0I7RUFFQSxJQUFJckIsVUFBVTtBQUNaLFdBQU8sS0FBS2t5QixRQUFRbHlCO0VBQ3RCO0VBRUEsSUFBSUEsUUFBUUEsU0FBUztBQUNuQixTQUFLa3lCLFFBQVFseUIsVUFBVUE7RUFDekI7RUFFQSxJQUFJMnJCLFVBQVU7QUFDWixXQUFPLEtBQUt1RyxRQUFRdkc7RUFDdEI7RUFFQS9mLFNBQVM7QUFDUCxVQUFNeUMsU0FBUyxLQUFLNmpCO0FBQ3BCLFNBQUtJLFdBQVU7QUFDZmpCLGdCQUFZaGpCLE1BQUFBO0VBQ2Q7RUFFQWlrQixhQUFhO0FBQ1gsU0FBS0gsWUFBWUksTUFBSztBQUN0QixTQUFLSCxlQUFlRyxNQUFLO0VBQzNCO0VBUUFDLGlCQUFpQkMsYUFBYTtBQUM1QixXQUFPZCxXQUFXYyxhQUNoQixNQUFNO01BQUM7UUFDTCxZQUFZQSxXQUFBQTtRQUNaO01BQ0Q7SUFBQyxDQUFBO0VBQ047RUFTQUMsMEJBQTBCRCxhQUFhRSxZQUFZO0FBQ2pELFdBQU9oQixXQUFXLEdBQUdjLFdBQUFBLGVBQTBCRSxVQUFBQSxJQUM3QyxNQUFNO01BQ0o7UUFDRSxZQUFZRixXQUFBQSxnQkFBMkJFLFVBQUFBO1FBQ3ZDLGVBQWVBLFVBQUFBO01BQ2hCO01BRUQ7UUFDRSxZQUFZRixXQUFBQTtRQUNaO01BQ0Q7SUFDRixDQUFBO0VBQ0w7RUFVQUcsd0JBQXdCSCxhQUFhSSxhQUFhO0FBQ2hELFdBQU9sQixXQUFXLEdBQUdjLFdBQUFBLElBQWVJLFdBQUFBLElBQ2xDLE1BQU07TUFBQztRQUNMLFlBQVlKLFdBQUFBLGFBQXdCSSxXQUFBQTtRQUNwQyxZQUFZSixXQUFBQTtRQUNaLFlBQVlJLFdBQUFBO1FBQ1o7TUFDRDtJQUFDLENBQUE7RUFDTjtFQU9BOUQsZ0JBQWdCZixRQUFRO0FBQ3RCLFVBQU1yVCxLQUFLcVQsT0FBT3JUO0FBQ2xCLFVBQU05TSxPQUFPLEtBQUtBO0FBQ2xCLFdBQU84akIsV0FBVyxHQUFHOWpCLElBQUFBLFdBQWU4TSxFQUFBQSxJQUNsQyxNQUFNO01BQUM7UUFDTCxXQUFXQSxFQUFBQTtXQUNScVQsT0FBTzhFLDBCQUEwQixDQUFBO01BQ3JDO0lBQUMsQ0FBQTtFQUNOO0VBS0FDLGNBQWNDLFdBQVdDLFlBQVk7QUFDbkMsVUFBTWQsY0FBYyxLQUFLQTtBQUN6QixRQUFJeFosUUFBUXdaLFlBQVk5SCxJQUFJMkksU0FBQUE7QUFDNUIsUUFBSSxDQUFDcmEsU0FBU3NhLFlBQVk7QUFDeEJ0YSxjQUFRLG9CQUFJakgsSUFBQUE7QUFDWnlnQixrQkFBWWhnQixJQUFJNmdCLFdBQVdyYSxLQUFBQTs7QUFFN0IsV0FBT0E7RUFDVDtFQVFBc1csZ0JBQWdCK0QsV0FBV0UsVUFBVUQsWUFBWTtBQUMvQyxVQUFNLEVBQUNqekIsU0FBUzZOLEtBQUksSUFBSTtBQUN4QixVQUFNOEssUUFBUSxLQUFLb2EsY0FBY0MsV0FBV0MsVUFBQUE7QUFDNUMsVUFBTUUsU0FBU3hhLE1BQU0wUixJQUFJNkksUUFBQUE7QUFDekIsUUFBSUMsUUFBUTtBQUNWLGFBQU9BOztBQUdULFVBQU1uRSxTQUFTLG9CQUFJMEMsSUFBQUE7QUFFbkJ3QixhQUFTL3NCLFFBQVFvTixDQUFBQSxTQUFRO0FBQ3ZCLFVBQUl5ZixXQUFXO0FBQ2JoRSxlQUFPdHVCLElBQUlzeUIsU0FBQUE7QUFDWHpmLGFBQUtwTixRQUFRcU4sQ0FBQUEsUUFBT3NlLFdBQVc5QyxRQUFRZ0UsV0FBV3hmLEdBQUFBLENBQUFBOztBQUVwREQsV0FBS3BOLFFBQVFxTixDQUFBQSxRQUFPc2UsV0FBVzlDLFFBQVFodkIsU0FBU3dULEdBQUFBLENBQUFBO0FBQ2hERCxXQUFLcE4sUUFBUXFOLENBQUFBLFFBQU9zZSxXQUFXOUMsUUFBUTVFLFVBQVV2YyxJQUFBQSxLQUFTLENBQUEsR0FBSTJGLEdBQUFBLENBQUFBO0FBQzlERCxXQUFLcE4sUUFBUXFOLENBQUFBLFFBQU9zZSxXQUFXOUMsUUFBUW5hLFVBQVVyQixHQUFBQSxDQUFBQTtBQUNqREQsV0FBS3BOLFFBQVFxTixDQUFBQSxRQUFPc2UsV0FBVzlDLFFBQVF0RSxhQUFhbFgsR0FBQUEsQ0FBQUE7SUFDdEQsQ0FBQTtBQUVBLFVBQU03TSxRQUFReXNCLE1BQU1DLEtBQUtyRSxNQUFBQTtBQUN6QixRQUFJcm9CLE1BQU1sRixXQUFXLEdBQUc7QUFDdEJrRixZQUFNakMsS0FBS3ZFLHVCQUFPd3BCLE9BQU8sSUFBSSxDQUFBOztBQUUvQixRQUFJOEgsV0FBVzZCLElBQUlKLFFBQVcsR0FBQTtBQUM1QnZhLFlBQU14RyxJQUFJK2dCLFVBQVV2c0IsS0FBQUE7O0FBRXRCLFdBQU9BO0VBQ1Q7RUFNQTRzQixvQkFBb0I7QUFDbEIsVUFBTSxFQUFDdnpCLFNBQVM2TixLQUFJLElBQUk7QUFFeEIsV0FBTztNQUNMN047TUFDQW9xQixVQUFVdmMsSUFBSyxLQUFJLENBQUE7TUFDbkJnSCxTQUFTMmEsU0FBUzNoQixJQUFLLEtBQUksQ0FBQTtNQUMzQjtRQUFDQTtNQUFJO01BQ0xnSDtNQUNBNlY7SUFDRDtFQUNIO0VBU0E4SSxvQkFBb0J4RSxRQUFReUUsUUFBTzlsQixTQUFTK2xCLFdBQVc7SUFBQztLQUFLO0FBQzNELFVBQU0xYyxTQUFTO01BQUMyYyxTQUFTO0lBQUk7QUFDN0IsVUFBTSxFQUFDQyxVQUFVQyxZQUFXLElBQUlDLFlBQVksS0FBSzFCLGdCQUFnQnBELFFBQVEwRSxRQUFBQTtBQUN6RSxRQUFJMXpCLFVBQVU0ekI7QUFDZCxRQUFJRyxZQUFZSCxVQUFVSCxNQUFRLEdBQUE7QUFDaEN6YyxhQUFPMmMsVUFBVTtBQUNqQmhtQixnQkFBVXFtQixXQUFXcm1CLE9BQVdBLElBQUFBLFFBQUFBLElBQVlBO0FBRTVDLFlBQU1zbUIsY0FBYyxLQUFLL0UsZUFBZUYsUUFBUXJoQixTQUFTa21CLFdBQUFBO0FBQ3pEN3pCLGdCQUFVazBCLGVBQWVOLFVBQVVqbUIsU0FBU3NtQixXQUFBQTs7QUFHOUMsZUFBVzlnQixRQUFRc2dCLFFBQU87QUFDeEJ6YyxhQUFPN0QsSUFBQUEsSUFBUW5ULFFBQVFtVCxJQUFLO0lBQzlCO0FBQ0EsV0FBTzZEO0VBQ1Q7RUFRQWtZLGVBQWVGLFFBQVFyaEIsU0FBUytsQixXQUFXO0lBQUM7RUFBRyxHQUFFUyxvQkFBb0I7QUFDbkUsVUFBTSxFQUFDUCxTQUFBQSxJQUFZRSxZQUFZLEtBQUsxQixnQkFBZ0JwRCxRQUFRMEUsUUFBQUE7QUFDNUQsV0FBT3JwQixTQUFTc0QsT0FDWnVtQixJQUFBQSxlQUFlTixVQUFVam1CLFNBQVNtQyxRQUFXcWtCLGtCQUFBQSxJQUM3Q1A7RUFDTjtBQUNGO0FBRUEsU0FBU0UsWUFBWU0sZUFBZXBGLFFBQVEwRSxVQUFVO0FBQ3BELE1BQUkvYSxRQUFReWIsY0FBYy9KLElBQUkyRSxNQUFBQTtBQUM5QixNQUFJLENBQUNyVyxPQUFPO0FBQ1ZBLFlBQVEsb0JBQUlqSCxJQUFBQTtBQUNaMGlCLGtCQUFjamlCLElBQUk2YyxRQUFRclcsS0FBQUE7O0FBRTVCLFFBQU1pWixXQUFXOEIsU0FBU3ZJLEtBQUk7QUFDOUIsTUFBSWdJLFNBQVN4YSxNQUFNMFIsSUFBSXVILFFBQUFBO0FBQ3ZCLE1BQUksQ0FBQ3VCLFFBQVE7QUFDWCxVQUFNUyxXQUFXUyxnQkFBZ0JyRixRQUFRMEUsUUFBQUE7QUFDekNQLGFBQVM7TUFDUFM7TUFDQUMsYUFBYUgsU0FBUzlzQixPQUFPMHRCLENBQUFBLE1BQUssQ0FBQ0EsRUFBRXJFLFlBQVcsRUFBRzduQixTQUFTLE9BQUEsQ0FBQTtJQUM5RDtBQUNBdVEsVUFBTXhHLElBQUl5ZixVQUFVdUIsTUFBQUE7O0FBRXRCLFNBQU9BO0FBQ1Q7QUFFQSxJQUFNb0IsY0FBY3J6QixDQUFBQSxVQUFTbUosU0FBU25KLEtBQUFBLEtBQ2pDZixPQUFPcTBCLG9CQUFvQnR6QixLQUFPd3RCLEVBQUFBLEtBQUssQ0FBQ2xiLFFBQVF3Z0IsV0FBVzl5QixNQUFNc1MsR0FBSSxDQUFBLENBQUE7QUFFMUUsU0FBU3VnQixZQUFZL2dCLE9BQU95Z0IsUUFBTztBQUNqQyxRQUFNLEVBQUNnQixjQUFjQyxZQUFXLElBQUk1RyxhQUFhOWEsS0FBQUE7QUFFakQsYUFBV0csUUFBUXNnQixRQUFPO0FBQ3hCLFVBQU10RSxhQUFhc0YsYUFBYXRoQixJQUFBQTtBQUNoQyxVQUFNaWMsWUFBWXNGLFlBQVl2aEIsSUFBQUE7QUFDOUIsVUFBTWpTLFNBQVNrdUIsYUFBYUQsZUFBZW5jLE1BQU1HLElBQUs7QUFDdEQsUUFBS2djLGVBQWU2RSxXQUFXOXlCLEtBQUFBLEtBQVVxekIsWUFBWXJ6QixLQUFLLE1BQ3BEa3VCLGFBQWEvVixRQUFRblksS0FBUyxHQUFBO0FBQ2xDLGFBQU87O0VBRVg7QUFDQSxTQUFPO0FBQ1Q7O0FDN1lBLElBQU15ekIsa0JBQWtCO0VBQUM7RUFBTztFQUFVO0VBQVE7RUFBUztBQUFZO0FBQ3ZFLFNBQVNDLHFCQUFxQnB5QixVQUFVdkIsTUFBTTtBQUM1QyxTQUFPdUIsYUFBYSxTQUFTQSxhQUFhLFlBQWFteUIsZ0JBQWdCdnhCLFFBQVFaLFFBQUFBLE1BQWMsTUFBTXZCLFNBQVM7QUFDOUc7QUFFQSxTQUFTNHpCLGNBQWNDLElBQUlDLElBQUk7QUFDN0IsU0FBTyxTQUFTM3RCLEdBQUdDLEdBQUc7QUFDcEIsV0FBT0QsRUFBRTB0QixFQUFHLE1BQUt6dEIsRUFBRXl0QixFQUFBQSxJQUNmMXRCLEVBQUUydEIsRUFBQUEsSUFBTTF0QixFQUFFMHRCLEVBQUFBLElBQ1YzdEIsRUFBRTB0QixFQUFHLElBQUd6dEIsRUFBRXl0QixFQUFHO0VBQ25CO0FBQ0Y7QUFFQSxTQUFTRSxxQkFBcUJybkIsU0FBUztBQUNyQyxRQUFNcEwsUUFBUW9MLFFBQVFwTDtBQUN0QixRQUFNMHlCLG1CQUFtQjF5QixNQUFNdkMsUUFBUXdPO0FBRXZDak0sUUFBTWlkLGNBQWMsYUFBQTtBQUNwQnlPLFdBQWFnSCxvQkFBb0JBLGlCQUFpQkMsWUFBWTtJQUFDdm5CO0tBQVVwTCxLQUFBQTtBQUMzRTtBQUVBLFNBQVM0eUIsb0JBQW9CeG5CLFNBQVM7QUFDcEMsUUFBTXBMLFFBQVFvTCxRQUFRcEw7QUFDdEIsUUFBTTB5QixtQkFBbUIxeUIsTUFBTXZDLFFBQVF3TztBQUN2Q3lmLFdBQWFnSCxvQkFBb0JBLGlCQUFpQkcsWUFBWTtJQUFDem5CO0tBQVVwTCxLQUFBQTtBQUMzRTtBQU1BLFNBQVM4eUIsVUFBVWxwQixNQUFNO0FBQ3ZCLE1BQUk2SCxnQkFBQUEsS0FBcUIsT0FBTzdILFNBQVMsVUFBVTtBQUNqREEsV0FBT2tGLFNBQVNpa0IsZUFBZW5wQixJQUFBQTtFQUNqQyxXQUFXQSxRQUFRQSxLQUFLMUssUUFBUTtBQUU5QjBLLFdBQU9BLEtBQUssQ0FBRTs7QUFHaEIsTUFBSUEsUUFBUUEsS0FBS3FCLFFBQVE7QUFFdkJyQixXQUFPQSxLQUFLcUI7O0FBRWQsU0FBT3JCO0FBQ1Q7QUFFQSxJQUFNb3BCLFlBQVksQ0FBQTtBQUNsQixJQUFNQyxXQUFXLENBQUNoaUIsUUFBUTtBQUN4QixRQUFNaEcsU0FBUzZuQixVQUFVN2hCLEdBQUFBO0FBQ3pCLFNBQU9yVCxPQUFPczFCLE9BQU9GLFNBQUFBLEVBQVczdUIsT0FBTyxDQUFDOHVCLE1BQU1BLEVBQUVsb0IsV0FBV0EsTUFBQUEsRUFBUXlkLElBQUc7QUFDeEU7QUFFQSxTQUFTMEssZ0JBQWdCNUQsS0FBSzd2QixPQUFPMHpCLE1BQU07QUFDekMsUUFBTXJpQixPQUFPcFQsT0FBT29ULEtBQUt3ZSxHQUFBQTtBQUN6QixhQUFXdmUsT0FBT0QsTUFBTTtBQUN0QixVQUFNc2lCLFNBQVMsQ0FBQ3JpQjtBQUNoQixRQUFJcWlCLFVBQVUzekIsT0FBTztBQUNuQixZQUFNaEIsUUFBUTZ3QixJQUFJdmUsR0FBSTtBQUN0QixhQUFPdWUsSUFBSXZlLEdBQUk7QUFDZixVQUFJb2lCLE9BQU8sS0FBS0MsU0FBUzN6QixPQUFPO0FBQzlCNnZCLFlBQUk4RCxTQUFTRCxJQUFBQSxJQUFRMTBCOzs7RUFHM0I7QUFDRjtBQVNBLFNBQVM0MEIsbUJBQW1COXZCLEdBQUcrdkIsV0FBV0MsYUFBYUMsU0FBUztBQUM5RCxNQUFJLENBQUNELGVBQWVod0IsRUFBRTZILFNBQVMsWUFBWTtBQUN6QyxXQUFPOztBQUVULE1BQUlvb0IsU0FBUztBQUNYLFdBQU9GOztBQUVULFNBQU8vdkI7QUFDVDtBQUVBLFNBQVNrd0IsZUFBZWxoQixPQUFPeFEsV0FBVzJ4QixPQUFPO0FBQy9DLFNBQU9uaEIsTUFBTWhWLFFBQVFvMkIsT0FBT3BoQixNQUFNbWhCLEtBQU0sSUFBRzN4QixVQUFVMnhCLEtBQU07QUFDN0Q7QUFFQSxTQUFTRSxlQUFlandCLE1BQU01QixXQUFXO0FBQ3ZDLFFBQU0sRUFBQzh4QixRQUFRQyxPQUFBQSxJQUFVbndCO0FBQ3pCLE1BQUlrd0IsVUFBVUMsUUFBUTtBQUNwQixXQUFPO01BQ0xsdEIsTUFBTTZzQixlQUFlSSxRQUFROXhCLFdBQVcsTUFBQTtNQUN4QzhFLE9BQU80c0IsZUFBZUksUUFBUTl4QixXQUFXLE9BQUE7TUFDekMrRSxLQUFLMnNCLGVBQWVLLFFBQVEveEIsV0FBVyxLQUFBO01BQ3ZDZ0YsUUFBUTBzQixlQUFlSyxRQUFRL3hCLFdBQVcsUUFBQTtJQUM1Qzs7QUFFRixTQUFPQTtBQUNUO0FBRUEsSUFBTWd5QixRQUFOLE1BQU1BO0VBU0osT0FBTzFNLFlBQVkzbEIsT0FBTztBQUN4QmlwQixhQUFTMXNCLElBQU95RCxHQUFBQSxLQUFBQTtBQUNoQnN5QixzQkFBQUE7RUFDRjtFQUVBLE9BQU9uTSxjQUFjbm1CLE9BQU87QUFDMUJpcEIsYUFBU3JCLE9BQVU1bkIsR0FBQUEsS0FBQUE7QUFDbkJzeUIsc0JBQUFBO0VBQ0Y7RUFHQTEyQixZQUFZb00sTUFBTXVxQixZQUFZO0FBQzVCLFVBQU1yb0IsU0FBUyxLQUFLQSxTQUFTLElBQUk0akIsT0FBT3lFLFVBQUFBO0FBQ3hDLFVBQU1DLGdCQUFnQnRCLFVBQVVscEIsSUFBQUE7QUFDaEMsVUFBTXlxQixnQkFBZ0JwQixTQUFTbUIsYUFBQUE7QUFDL0IsUUFBSUMsZUFBZTtBQUNqQixZQUFNLElBQUkvMkIsTUFDUiw4Q0FBK0MrMkIsY0FBY2pjLEtBQUssb0RBQ2xCaWMsY0FBY3BwQixPQUFPbU4sS0FBSyxrQkFDMUU7O0FBR0osVUFBTTNhLFVBQVVxTyxPQUFPNmdCLGVBQWU3Z0IsT0FBT2tsQixrQkFBaUIsR0FBSSxLQUFLaGxCLFdBQVUsQ0FBQTtBQUVqRixTQUFLOGpCLFdBQVcsS0FBS2hrQixPQUFPZ2tCLFlBQVl0ZSxnQkFBZ0I0aUIsYUFBYSxHQUFBO0FBQ3JFLFNBQUt0RSxTQUFTamtCLGFBQWFDLE1BQUFBO0FBRTNCLFVBQU1WLFVBQVUsS0FBSzBrQixTQUFTOWtCLGVBQWVvcEIsZUFBZTMyQixRQUFReU4sV0FBVztBQUMvRSxVQUFNRCxTQUFTRyxXQUFXQSxRQUFRSDtBQUNsQyxVQUFNdEUsU0FBU3NFLFVBQVVBLE9BQU90RTtBQUNoQyxVQUFNRixRQUFRd0UsVUFBVUEsT0FBT3hFO0FBRS9CLFNBQUsyUixLQUFLa2MsSUFBQUE7QUFDVixTQUFLNWpCLE1BQU10RjtBQUNYLFNBQUtILFNBQVNBO0FBQ2QsU0FBS3hFLFFBQVFBO0FBQ2IsU0FBS0UsU0FBU0E7QUFDZCxTQUFLNHRCLFdBQVc5MkI7QUFJaEIsU0FBSysyQixlQUFlLEtBQUt0cEI7QUFDekIsU0FBS3JCLFVBQVUsQ0FBQTtBQUNmLFNBQUs0cUIsWUFBWSxDQUFBO0FBQ2pCLFNBQUtDLFVBQVVubkI7QUFDZixTQUFLcEksUUFBUSxDQUFBO0FBQ2IsU0FBS3VLLDBCQUEwQm5DO0FBQy9CLFNBQUt0TCxZQUFZc0w7QUFDakIsU0FBS29uQixVQUFVLENBQUE7QUFDZixTQUFLQyxhQUFhcm5CO0FBQ2xCLFNBQUtzbkIsYUFBYSxDQUFBO0FBRWxCLFNBQUtDLHVCQUF1QnZuQjtBQUM1QixTQUFLd25CLGtCQUFrQixDQUFBO0FBQ3ZCLFNBQUt0ZCxTQUFTLENBQUE7QUFDZCxTQUFLdWQsV0FBVyxJQUFJL0osY0FBQUE7QUFDcEIsU0FBSzlaLFdBQVcsQ0FBQTtBQUNoQixTQUFLOGpCLGlCQUFpQixDQUFBO0FBQ3RCLFNBQUtDLFdBQVc7QUFDaEIsU0FBS0Msc0JBQXNCNW5CO0FBQzNCLFNBQUtrTSxXQUFXbE07QUFDaEIsU0FBSzZuQixZQUFZQyxTQUFTQyxDQUFBQSxTQUFRLEtBQUtqc0IsT0FBT2lzQixJQUFPNzNCLEdBQUFBLFFBQVE4M0IsZUFBZSxDQUFBO0FBQzVFLFNBQUtDLGVBQWUsQ0FBQTtBQUdwQnhDLGNBQVUsS0FBSzVhLEVBQUUsSUFBSTtBQUVyQixRQUFJLENBQUNoTixXQUFXLENBQUNILFFBQVE7QUFLdkJxakIsY0FBUUMsTUFBTSxtRUFBQTtBQUNkOztBQUdGa0gsYUFBU0MsT0FBTyxNQUFNLFlBQVlqRCxvQkFBQUE7QUFDbENnRCxhQUFTQyxPQUFPLE1BQU0sWUFBWTlDLG1CQUFBQTtBQUVsQyxTQUFLK0MsWUFBVztBQUNoQixRQUFJLEtBQUtULFVBQVU7QUFDakIsV0FBSzdyQixPQUFNOztFQUVmO0VBRUEsSUFBSTZCLGNBQWM7QUFDaEIsVUFBTSxFQUFDek4sU0FBUyxFQUFDeU4sYUFBYTBxQixvQkFBQUEsR0FBc0JudkIsT0FBT0UsUUFBUTZ0QixhQUFZLElBQUk7QUFDbkYsUUFBSSxDQUFDM2pCLGNBQWMzRixXQUFjLEdBQUE7QUFFL0IsYUFBT0E7O0FBR1QsUUFBSTBxQix1QkFBdUJwQixjQUFjO0FBRXZDLGFBQU9BOztBQUlULFdBQU83dEIsU0FBU0YsUUFBUUUsU0FBUztFQUNuQztFQUVBLElBQUk3SCxPQUFPO0FBQ1QsV0FBTyxLQUFLZ04sT0FBT2hOO0VBQ3JCO0VBRUEsSUFBSUEsS0FBS0EsTUFBTTtBQUNiLFNBQUtnTixPQUFPaE4sT0FBT0E7RUFDckI7RUFFQSxJQUFJckIsVUFBVTtBQUNaLFdBQU8sS0FBSzgyQjtFQUNkO0VBRUEsSUFBSTkyQixRQUFRQSxTQUFTO0FBQ25CLFNBQUtxTyxPQUFPck8sVUFBVUE7RUFDeEI7RUFFQSxJQUFJb3RCLFdBQVc7QUFDYixXQUFPQTtFQUNUO0VBS0E4SyxjQUFjO0FBRVosU0FBSzFZLGNBQWMsWUFBQTtBQUVuQixRQUFJLEtBQUt4ZixRQUFRbzRCLFlBQVk7QUFDM0IsV0FBS3BtQixPQUFNO1dBQ047QUFDTHFtQixrQkFBWSxNQUFNLEtBQUtyNEIsUUFBUStSLGdCQUFnQjs7QUFHakQsU0FBS3VtQixXQUFVO0FBR2YsU0FBSzlZLGNBQWMsV0FBQTtBQUVuQixXQUFPO0VBQ1Q7RUFFQStTLFFBQVE7QUFDTmdHLGdCQUFZLEtBQUsvcUIsUUFBUSxLQUFLeUYsR0FBRztBQUNqQyxXQUFPO0VBQ1Q7RUFFQXVsQixPQUFPO0FBQ0xSLGFBQVNRLEtBQUssSUFBSTtBQUNsQixXQUFPO0VBQ1Q7RUFPQXhtQixPQUFPaEosT0FBT0UsUUFBUTtBQUNwQixRQUFJLENBQUM4dUIsU0FBU1MsUUFBUSxJQUFJLEdBQUc7QUFDM0IsV0FBS0MsUUFBUTF2QixPQUFPRSxNQUFBQTtXQUNmO0FBQ0wsV0FBS3l2QixvQkFBb0I7UUFBQzN2QjtRQUFPRTtNQUFNOztFQUUzQztFQUVBd3ZCLFFBQVExdkIsT0FBT0UsUUFBUTtBQUNyQixVQUFNbEosVUFBVSxLQUFLQTtBQUNyQixVQUFNd04sU0FBUyxLQUFLQTtBQUNwQixVQUFNQyxjQUFjek4sUUFBUW00Qix1QkFBdUIsS0FBSzFxQjtBQUN4RCxVQUFNbXJCLFVBQVUsS0FBS3ZHLFNBQVNwa0IsZUFBZVQsUUFBUXhFLE9BQU9FLFFBQVF1RSxXQUFBQTtBQUNwRSxVQUFNb3JCLFdBQVc3NEIsUUFBUStSLG9CQUFvQixLQUFLc2dCLFNBQVNya0Isb0JBQW1CO0FBQzlFLFVBQU02cEIsT0FBTyxLQUFLN3VCLFFBQVEsV0FBVztBQUVyQyxTQUFLQSxRQUFRNHZCLFFBQVE1dkI7QUFDckIsU0FBS0UsU0FBUzB2QixRQUFRMXZCO0FBQ3RCLFNBQUs2dEIsZUFBZSxLQUFLdHBCO0FBQ3pCLFFBQUksQ0FBQzRxQixZQUFZLE1BQU1RLFVBQVUsSUFBSSxHQUFHO0FBQ3RDOztBQUdGLFNBQUtyWixjQUFjLFVBQVU7TUFBQ2hYLE1BQU1vd0I7SUFBTyxDQUFBO0FBRTNDM0ssYUFBYWp1QixRQUFRODRCLFVBQVU7TUFBQztNQUFNRjtJQUFRLEdBQUUsSUFBSTtBQUVwRCxRQUFJLEtBQUtuQixVQUFVO0FBQ2pCLFVBQUksS0FBS0UsVUFBVUUsSUFBTyxHQUFBO0FBRXhCLGFBQUtrQixPQUFNOzs7RUFHakI7RUFFQUMsc0JBQXNCO0FBQ3BCLFVBQU1oNUIsVUFBVSxLQUFLQTtBQUNyQixVQUFNaTVCLGdCQUFnQmo1QixRQUFRZ2EsVUFBVSxDQUFBO0FBRXhDak4sU0FBS2tzQixlQUFlLENBQUNDLGFBQWE1UCxXQUFXO0FBQzNDNFAsa0JBQVl2ZSxLQUFLMk87SUFDbkIsQ0FBQTtFQUNGO0VBS0E2UCxzQkFBc0I7QUFDcEIsVUFBTW41QixVQUFVLEtBQUtBO0FBQ3JCLFVBQU1vNUIsWUFBWXA1QixRQUFRZ2E7QUFDMUIsVUFBTUEsU0FBUyxLQUFLQTtBQUNwQixVQUFNcWYsVUFBVWw1QixPQUFPb1QsS0FBS3lHLE1BQUFBLEVBQVE5TSxPQUFPLENBQUM2a0IsS0FBS3BYLE9BQU87QUFDdERvWCxVQUFJcFgsRUFBRyxJQUFHO0FBQ1YsYUFBT29YO0lBQ1QsR0FBRyxDQUFBLENBQUM7QUFDSixRQUFJNXRCLFFBQVEsQ0FBQTtBQUVaLFFBQUlpMUIsV0FBVztBQUNiajFCLGNBQVFBLE1BQU15RixPQUNaekosT0FBT29ULEtBQUs2bEIsU0FBV0UsRUFBQUEsSUFBSSxDQUFDM2UsT0FBTztBQUNqQyxjQUFNcVYsZUFBZW9KLFVBQVV6ZSxFQUFHO0FBQ2xDLGNBQU0xWixPQUFPOHVCLGNBQWNwVixJQUFJcVYsWUFBQUE7QUFDL0IsY0FBTXVKLFdBQVd0NEIsU0FBUztBQUMxQixjQUFNOEcsZUFBZTlHLFNBQVM7QUFDOUIsZUFBTztVQUNMakIsU0FBU2d3QjtVQUNUd0osV0FBV0QsV0FBVyxjQUFjeHhCLGVBQWUsV0FBVztVQUM5RDB4QixPQUFPRixXQUFXLGlCQUFpQnh4QixlQUFlLGFBQWE7UUFDakU7TUFDRixDQUFBLENBQUE7O0FBSUpnRixTQUFLNUksT0FBTyxDQUFDZ0ksU0FBUztBQUNwQixZQUFNNmpCLGVBQWU3akIsS0FBS25NO0FBQzFCLFlBQU0yYSxLQUFLcVYsYUFBYXJWO0FBQ3hCLFlBQU0xWixPQUFPOHVCLGNBQWNwVixJQUFJcVYsWUFBQUE7QUFDL0IsWUFBTTBKLFlBQVlyaUIsZUFBZTJZLGFBQWFuaUIsTUFBTTFCLEtBQUtzdEIsS0FBSztBQUU5RCxVQUFJekosYUFBYXh0QixhQUFhc04sVUFBYThrQixxQkFBcUI1RSxhQUFheHRCLFVBQVV2QixJQUFVMnpCLE1BQUFBLHFCQUFxQnpvQixLQUFLcXRCLFNBQVMsR0FBRztBQUNySXhKLHFCQUFheHRCLFdBQVcySixLQUFLcXRCOztBQUcvQkgsY0FBUTFlLEVBQUcsSUFBRztBQUNkLFVBQUkzRixRQUFRO0FBQ1osVUFBSTJGLE1BQU1YLFVBQVVBLE9BQU9XLEVBQUFBLEVBQUk5TSxTQUFTNnJCLFdBQVc7QUFDakQxa0IsZ0JBQVFnRixPQUFPVyxFQUFHO2FBQ2I7QUFDTCxjQUFNZ2YsYUFBYXZNLFNBQVNaLFNBQVNrTixTQUFBQTtBQUNyQzFrQixnQkFBUSxJQUFJMmtCLFdBQVc7VUFDckJoZjtVQUNBOU0sTUFBTTZyQjtVQUNOem1CLEtBQUssS0FBS0E7VUFDVjFRLE9BQU87UUFDVCxDQUFBO0FBQ0F5WCxlQUFPaEYsTUFBTTJGLEVBQUUsSUFBSTNGOztBQUdyQkEsWUFBTTFVLEtBQUswdkIsY0FBY2h3QixPQUFBQTtJQUMzQixDQUFBO0FBRUErTSxTQUFLc3NCLFNBQVMsQ0FBQ08sWUFBWWpmLE9BQU87QUFDaEMsVUFBSSxDQUFDaWYsWUFBWTtBQUNmLGVBQU81ZixPQUFPVyxFQUFHOztJQUVyQixDQUFBO0FBRUE1TixTQUFLaU4sUUFBUSxDQUFDaEYsVUFBVTtBQUN0Qi9NLGNBQVF5RSxVQUFVLE1BQU1zSSxPQUFPQSxNQUFNaFYsT0FBTztBQUM1Q2lJLGNBQVFpRSxPQUFPLE1BQU04SSxLQUFBQTtJQUN2QixDQUFBO0VBQ0Y7RUFLQTZrQixrQkFBa0I7QUFDaEIsVUFBTW4zQixXQUFXLEtBQUtzMEI7QUFDdEIsVUFBTThDLFVBQVUsS0FBS3o0QixLQUFLbXVCLFNBQVMvdEI7QUFDbkMsVUFBTXM0QixVQUFVcjNCLFNBQVNqQjtBQUV6QmlCLGFBQVN5RSxLQUFLLENBQUNDLEdBQUdDLE1BQU1ELEVBQUV0RSxRQUFRdUUsRUFBRXZFLEtBQUs7QUFDekMsUUFBSWkzQixVQUFVRCxTQUFTO0FBQ3JCLGVBQVNsM0IsSUFBSWszQixTQUFTbDNCLElBQUltM0IsU0FBUyxFQUFFbjNCLEdBQUc7QUFDdEMsYUFBS28zQixvQkFBb0JwM0IsQ0FBQUE7TUFDM0I7QUFDQUYsZUFBUytKLE9BQU9xdEIsU0FBU0MsVUFBVUQsT0FBQUE7O0FBRXJDLFNBQUt4QyxrQkFBa0I1MEIsU0FBU3UzQixNQUFNLENBQUc5eUIsRUFBQUEsS0FBSzB0QixjQUFjLFNBQVMsT0FBQSxDQUFBO0VBQ3ZFO0VBS0FxRiw4QkFBOEI7QUFDNUIsVUFBTSxFQUFDbEQsV0FBV3QwQixVQUFVckIsTUFBTSxFQUFDbXVCLFNBQUFBLEVBQVMsSUFBSTtBQUNoRCxRQUFJOXNCLFNBQVNqQixTQUFTK3RCLFNBQVMvdEIsUUFBUTtBQUNyQyxhQUFPLEtBQUt3MUI7O0FBRWR2MEIsYUFBU3lELFFBQVEsQ0FBQ0MsTUFBTXRELFVBQVU7QUFDaEMsVUFBSTBzQixTQUFTNW9CLE9BQU9qRCxDQUFBQSxNQUFLQSxNQUFNeUMsS0FBSyt6QixRQUFRLEVBQUUxNEIsV0FBVyxHQUFHO0FBQzFELGFBQUt1NEIsb0JBQW9CbDNCLEtBQUFBOztJQUU3QixDQUFBO0VBQ0Y7RUFFQXMzQiwyQkFBMkI7QUFDekIsVUFBTUMsaUJBQWlCLENBQUE7QUFDdkIsVUFBTTdLLFdBQVcsS0FBS251QixLQUFLbXVCO0FBQzNCLFFBQUk1c0IsR0FBR0M7QUFFUCxTQUFLcTNCLDRCQUEyQjtBQUVoQyxTQUFLdDNCLElBQUksR0FBR0MsT0FBTzJzQixTQUFTL3RCLFFBQVFtQixJQUFJQyxNQUFNRCxLQUFLO0FBQ2pELFlBQU15RCxVQUFVbXBCLFNBQVM1c0IsQ0FBRTtBQUMzQixVQUFJd0QsT0FBTyxLQUFLRSxlQUFlMUQsQ0FBQUE7QUFDL0IsWUFBTWlMLE9BQU94SCxRQUFRd0gsUUFBUSxLQUFLUSxPQUFPUjtBQUV6QyxVQUFJekgsS0FBS3lILFFBQVF6SCxLQUFLeUgsU0FBU0EsTUFBTTtBQUNuQyxhQUFLbXNCLG9CQUFvQnAzQixDQUFBQTtBQUN6QndELGVBQU8sS0FBS0UsZUFBZTFELENBQUFBOztBQUU3QndELFdBQUt5SCxPQUFPQTtBQUNaekgsV0FBS3NwQixZQUFZcnBCLFFBQVFxcEIsYUFBYUosYUFBYXpoQixNQUFNLEtBQUs3TixPQUFPO0FBQ3JFb0csV0FBS2swQixRQUFRajBCLFFBQVFpMEIsU0FBUztBQUM5QmwwQixXQUFLdEQsUUFBUUY7QUFDYndELFdBQUt1WixRQUFRLEtBQUt0WixRQUFRc1o7QUFDMUJ2WixXQUFLbTBCLFVBQVUsS0FBS0MsaUJBQWlCNTNCLENBQUFBO0FBRXJDLFVBQUl3RCxLQUFLaEYsWUFBWTtBQUNuQmdGLGFBQUtoRixXQUFXcTVCLFlBQVk3M0IsQ0FBQUE7QUFDNUJ3RCxhQUFLaEYsV0FBV3M1QixXQUFVO2FBQ3JCO0FBQ0wsY0FBTUMsa0JBQWtCdk4sU0FBU2hCLGNBQWN2ZSxJQUFBQTtBQUMvQyxjQUFNLEVBQUMrc0Isb0JBQW9CQyxnQkFBQUEsSUFBbUJobUIsU0FBUzJhLFNBQVMzaEIsSUFBSztBQUNyRTFOLGVBQU9DLE9BQU91NkIsaUJBQWlCO1VBQzdCRSxpQkFBaUJ6TixTQUFTZCxXQUFXdU8sZUFBQUE7VUFDckNELG9CQUFvQkEsc0JBQXNCeE4sU0FBU2QsV0FBV3NPLGtCQUFBQTtRQUNoRSxDQUFBO0FBQ0F4MEIsYUFBS2hGLGFBQWEsSUFBSXU1QixnQkFBZ0IsTUFBTS8zQixDQUFBQTtBQUM1Q3kzQix1QkFBZTMxQixLQUFLMEIsS0FBS2hGLFVBQVU7O0lBRXZDO0FBRUEsU0FBS3k0QixnQkFBZTtBQUNwQixXQUFPUTtFQUNUO0VBTUFTLGlCQUFpQjtBQUNmL3RCLFNBQUssS0FBSzFMLEtBQUttdUIsVUFBVSxDQUFDbnBCLFNBQVMvQixpQkFBaUI7QUFDbEQsV0FBS2dDLGVBQWVoQyxZQUFjbEQsRUFBQUEsV0FBVzI1QixNQUFLO0lBQ3BELEdBQUcsSUFBSTtFQUNUO0VBS0FBLFFBQVE7QUFDTixTQUFLRCxlQUFjO0FBQ25CLFNBQUt0YixjQUFjLE9BQUE7RUFDckI7RUFFQTVULE9BQU9pc0IsTUFBTTtBQUNYLFVBQU14cEIsU0FBUyxLQUFLQTtBQUVwQkEsV0FBT3pDLE9BQU07QUFDYixVQUFNNUwsVUFBVSxLQUFLODJCLFdBQVd6b0IsT0FBTzZnQixlQUFlN2dCLE9BQU9rbEIsa0JBQWlCLEdBQUksS0FBS2hsQixXQUFVLENBQUE7QUFDakcsVUFBTXlzQixnQkFBZ0IsS0FBS3RELHNCQUFzQixDQUFDMTNCLFFBQVF3TztBQUUxRCxTQUFLeXNCLGNBQWE7QUFDbEIsU0FBS0Msb0JBQW1CO0FBQ3hCLFNBQUtDLHFCQUFvQjtBQUl6QixTQUFLNUQsU0FBU3BKLFdBQVU7QUFFeEIsUUFBSSxLQUFLM08sY0FBYyxnQkFBZ0I7TUFBQ3FZO01BQU0zSixZQUFZO0lBQUksQ0FBQSxNQUFPLE9BQU87QUFDMUU7O0FBSUYsVUFBTW1NLGlCQUFpQixLQUFLRCx5QkFBd0I7QUFFcEQsU0FBSzVhLGNBQWMsc0JBQUE7QUFHbkIsUUFBSTdTLGFBQWE7QUFDakIsYUFBUy9KLElBQUksR0FBR0MsT0FBTyxLQUFLeEIsS0FBS211QixTQUFTL3RCLFFBQVFtQixJQUFJQyxNQUFNRCxLQUFLO0FBQy9ELFlBQU0sRUFBQ3hCLFdBQVUsSUFBSSxLQUFLa0YsZUFBZTFELENBQUFBO0FBQ3pDLFlBQU1tNEIsU0FBUSxDQUFDQyxpQkFBaUJYLGVBQWVqM0IsUUFBUWhDLFVBQUFBLE1BQWdCO0FBR3ZFQSxpQkFBV2c2QixzQkFBc0JMLE1BQUFBO0FBQ2pDcHVCLG1CQUFhbEosS0FBS3dHLElBQUksQ0FBQzdJLFdBQVdpNkIsZUFBYyxHQUFJMXVCLFVBQUFBO0lBQ3REO0FBQ0FBLGlCQUFhLEtBQUsydUIsY0FBY3Q3QixRQUFRNkksT0FBTzB5QixjQUFjNXVCLGFBQWE7QUFDMUUsU0FBSzZ1QixjQUFjN3VCLFVBQUFBO0FBR25CLFFBQUksQ0FBQ3F1QixlQUFlO0FBR2xCanVCLFdBQUtzdEIsZ0JBQWdCLENBQUNqNUIsZUFBZTtBQUNuQ0EsbUJBQVcyNUIsTUFBSztNQUNsQixDQUFBOztBQUdGLFNBQUtVLGdCQUFnQjVELElBQUFBO0FBR3JCLFNBQUtyWSxjQUFjLGVBQWU7TUFBQ3FZO0lBQUksQ0FBQTtBQUV2QyxTQUFLenJCLFFBQVFqRixLQUFLMHRCLGNBQWMsS0FBSyxNQUFBLENBQUE7QUFHckMsVUFBTSxFQUFDcUMsU0FBU0MsV0FBVSxJQUFJO0FBQzlCLFFBQUlBLFlBQVk7QUFDZCxXQUFLdUUsY0FBY3ZFLFlBQVksSUFBSTtlQUMxQkQsUUFBUXoxQixRQUFRO0FBQ3pCLFdBQUtrNkIsbUJBQW1CekUsU0FBU0EsU0FBUyxJQUFJOztBQUdoRCxTQUFLNkIsT0FBTTtFQUNiO0VBS0FrQyxnQkFBZ0I7QUFDZGx1QixTQUFLLEtBQUtpTixRQUFRLENBQUNoRixVQUFVO0FBQzNCL00sY0FBUXNFLFVBQVUsTUFBTXlJLEtBQUFBO0lBQzFCLENBQUE7QUFFQSxTQUFLZ2tCLG9CQUFtQjtBQUN4QixTQUFLRyxvQkFBbUI7RUFDMUI7RUFLQStCLHNCQUFzQjtBQUNwQixVQUFNbDdCLFVBQVUsS0FBS0E7QUFDckIsVUFBTTQ3QixpQkFBaUIsSUFBSWxLLElBQUl2eEIsT0FBT29ULEtBQUssS0FBSzZqQixVQUFVLENBQUE7QUFDMUQsVUFBTXlFLFlBQVksSUFBSW5LLElBQUkxeEIsUUFBUTg3QixNQUFNO0FBRXhDLFFBQUksQ0FBQ0MsVUFBVUgsZ0JBQWdCQyxTQUFBQSxLQUFjLENBQUMsQ0FBQyxLQUFLeEUseUJBQXlCcjNCLFFBQVFvNEIsWUFBWTtBQUUvRixXQUFLNEQsYUFBWTtBQUNqQixXQUFLMUQsV0FBVTs7RUFFbkI7RUFLQTZDLHVCQUF1QjtBQUNyQixVQUFNLEVBQUMzRCxlQUFBQSxJQUFrQjtBQUN6QixVQUFNeUUsVUFBVSxLQUFLQyx1QkFBc0IsS0FBTSxDQUFBO0FBQ2pELGVBQVcsRUFBQ3JQLFFBQVEzcUIsT0FBT29HLE1BQUFBLEtBQVUyekIsU0FBUztBQUM1QyxZQUFNckcsT0FBTy9JLFdBQVcsb0JBQW9CLENBQUN2a0IsUUFBUUE7QUFDckRxdEIsc0JBQWdCNkIsZ0JBQWdCdDFCLE9BQU8wekIsSUFBQUE7SUFDekM7RUFDRjtFQUtBc0cseUJBQXlCO0FBQ3ZCLFVBQU1uRSxlQUFlLEtBQUtBO0FBQzFCLFFBQUksQ0FBQ0EsZ0JBQWdCLENBQUNBLGFBQWF0MkIsUUFBUTtBQUN6Qzs7QUFHRixTQUFLczJCLGVBQWUsQ0FBQTtBQUNwQixVQUFNb0UsZUFBZSxLQUFLOTZCLEtBQUttdUIsU0FBUy90QjtBQUN4QyxVQUFNMjZCLFVBQVUsQ0FBQ3JaLFFBQVEsSUFBSTJPLElBQzNCcUcsYUFDR254QixPQUFPOHVCLENBQUFBLE1BQUtBLEVBQUUsQ0FBQSxNQUFPM1MsR0FBQUEsRUFDckJ1VyxJQUFJLENBQUM1RCxHQUFHOXlCLE1BQU1BLElBQUksTUFBTTh5QixFQUFFanBCLE9BQU8sQ0FBRzBlLEVBQUFBLEtBQUssR0FBQSxDQUFBLENBQUE7QUFHOUMsVUFBTWtSLFlBQVlELFFBQVEsQ0FBQTtBQUMxQixhQUFTeDVCLElBQUksR0FBR0EsSUFBSXU1QixjQUFjdjVCLEtBQUs7QUFDckMsVUFBSSxDQUFDbTVCLFVBQVVNLFdBQVdELFFBQVF4NUIsQ0FBSyxDQUFBLEdBQUE7QUFDckM7O0lBRUo7QUFDQSxXQUFPd3dCLE1BQU1DLEtBQUtnSixTQUNmL0MsRUFBQUEsSUFBSTVELENBQUFBLE1BQUtBLEVBQUUzSyxNQUFNLEdBQ2pCdU8sQ0FBQUEsRUFBQUEsSUFBSWx5QixDQUFBQSxPQUFNO01BQUN5bEIsUUFBUXpsQixFQUFFLENBQUU7TUFBRWxGLE9BQU8sQ0FBQ2tGLEVBQUUsQ0FBRTtNQUFFa0IsT0FBTyxDQUFDbEIsRUFBRSxDQUFFO01BQUE7RUFDeEQ7RUFPQW8wQixjQUFjN3VCLFlBQVk7QUFDeEIsUUFBSSxLQUFLNlMsY0FBYyxnQkFBZ0I7TUFBQzBPLFlBQVk7SUFBSSxDQUFBLE1BQU8sT0FBTztBQUNwRTs7QUFHRmptQixZQUFRMkQsT0FBTyxNQUFNLEtBQUs1QyxPQUFPLEtBQUtFLFFBQVF5RCxVQUFBQTtBQUU5QyxVQUFNa2MsT0FBTyxLQUFLcmtCO0FBQ2xCLFVBQU04M0IsU0FBU3pULEtBQUs3ZixTQUFTLEtBQUs2ZixLQUFLM2YsVUFBVTtBQUVqRCxTQUFLa0QsVUFBVSxDQUFBO0FBQ2ZXLFNBQUssS0FBS3JGLE9BQU8sQ0FBQ1YsUUFBUTtBQUN4QixVQUFJczFCLFVBQVV0MUIsSUFBSXhFLGFBQWEsYUFBYTtBQUUxQzs7QUFLRixVQUFJd0UsSUFBSTBGLFdBQVc7QUFDakIxRixZQUFJMEYsVUFBUzs7QUFFZixXQUFLTixRQUFRMUgsS0FBSSxHQUFJc0MsSUFBSW9GLFFBQU8sQ0FBQTtJQUNsQyxHQUFHLElBQUk7QUFFUCxTQUFLQSxRQUFRakcsUUFBUSxDQUFDZ0csTUFBTXJKLFVBQVU7QUFDcENxSixXQUFLb3dCLE9BQU96NUI7SUFDZCxDQUFBO0FBRUEsU0FBSzBjLGNBQWMsYUFBQTtFQUNyQjtFQU9BaWMsZ0JBQWdCNUQsTUFBTTtBQUNwQixRQUFJLEtBQUtyWSxjQUFjLHdCQUF3QjtNQUFDcVk7TUFBTTNKLFlBQVk7SUFBSSxDQUFBLE1BQU8sT0FBTztBQUNsRjs7QUFHRixhQUFTdHJCLElBQUksR0FBR0MsT0FBTyxLQUFLeEIsS0FBS211QixTQUFTL3RCLFFBQVFtQixJQUFJQyxNQUFNLEVBQUVELEdBQUc7QUFDL0QsV0FBSzBELGVBQWUxRCxDQUFHeEIsRUFBQUEsV0FBV3NMLFVBQVM7SUFDN0M7QUFFQSxhQUFTOUosSUFBSSxHQUFHQyxPQUFPLEtBQUt4QixLQUFLbXVCLFNBQVMvdEIsUUFBUW1CLElBQUlDLE1BQU0sRUFBRUQsR0FBRztBQUMvRCxXQUFLNDVCLGVBQWU1NUIsR0FBR294QixXQUFXNkQsSUFBQUEsSUFBUUEsS0FBSztRQUFDdnpCLGNBQWMxQjtNQUFDLENBQUEsSUFBS2kxQixJQUFJO0lBQzFFO0FBRUEsU0FBS3JZLGNBQWMsdUJBQXVCO01BQUNxWTtJQUFJLENBQUE7RUFDakQ7RUFPQTJFLGVBQWUxNUIsT0FBTyswQixNQUFNO0FBQzFCLFVBQU16eEIsT0FBTyxLQUFLRSxlQUFleEQsS0FBQUE7QUFDakMsVUFBTStvQixPQUFPO01BQUN6bEI7TUFBTXREO01BQU8rMEI7TUFBTTNKLFlBQVk7SUFBSTtBQUVqRCxRQUFJLEtBQUsxTyxjQUFjLHVCQUF1QnFNLElBQUFBLE1BQVUsT0FBTztBQUM3RDs7QUFHRnpsQixTQUFLaEYsV0FBV3E3QixRQUFRNUUsSUFBQUE7QUFFeEJoTSxTQUFLcUMsYUFBYTtBQUNsQixTQUFLMU8sY0FBYyxzQkFBc0JxTSxJQUFBQTtFQUMzQztFQUVBa04sU0FBUztBQUNQLFFBQUksS0FBS3ZaLGNBQWMsZ0JBQWdCO01BQUMwTyxZQUFZO0lBQUksQ0FBQSxNQUFPLE9BQU87QUFDcEU7O0FBR0YsUUFBSThKLFNBQVMxRSxJQUFJLElBQUksR0FBRztBQUN0QixVQUFJLEtBQUttRSxZQUFZLENBQUNPLFNBQVNTLFFBQVEsSUFBSSxHQUFHO0FBQzVDVCxpQkFBUzkxQixNQUFNLElBQUk7O1dBRWhCO0FBQ0wsV0FBS29LLEtBQUk7QUFDVDBvQiwyQkFBcUI7UUFBQ3p5QixPQUFPO01BQUksQ0FBQTs7RUFFckM7RUFFQStKLE9BQU87QUFDTCxRQUFJMUo7QUFDSixRQUFJLEtBQUsrMUIsbUJBQW1CO0FBQzFCLFlBQU0sRUFBQzN2QixPQUFPRSxPQUFBQSxJQUFVLEtBQUt5dkI7QUFDN0IsV0FBS0QsUUFBUTF2QixPQUFPRSxNQUFBQTtBQUNwQixXQUFLeXZCLG9CQUFvQjs7QUFFM0IsU0FBS3BHLE1BQUs7QUFFVixRQUFJLEtBQUt2cEIsU0FBUyxLQUFLLEtBQUtFLFVBQVUsR0FBRztBQUN2Qzs7QUFHRixRQUFJLEtBQUtzVyxjQUFjLGNBQWM7TUFBQzBPLFlBQVk7SUFBSSxDQUFBLE1BQU8sT0FBTztBQUNsRTs7QUFNRixVQUFNd08sU0FBUyxLQUFLdHdCO0FBQ3BCLFNBQUt4SixJQUFJLEdBQUdBLElBQUk4NUIsT0FBT2o3QixVQUFVaTdCLE9BQU85NUIsQ0FBQUEsRUFBR3lKLEtBQUssR0FBRyxFQUFFekosR0FBRztBQUN0RDg1QixhQUFPOTVCLENBQUUsRUFBQzBKLEtBQUssS0FBSzlILFNBQVM7SUFDL0I7QUFFQSxTQUFLbTRCLGNBQWE7QUFHbEIsV0FBTy81QixJQUFJODVCLE9BQU9qN0IsUUFBUSxFQUFFbUIsR0FBRztBQUM3Qjg1QixhQUFPOTVCLENBQUUsRUFBQzBKLEtBQUssS0FBSzlILFNBQVM7SUFDL0I7QUFFQSxTQUFLZ2IsY0FBYyxXQUFBO0VBQ3JCO0VBS0FvZCx1QkFBdUJDLGVBQWU7QUFDcEMsVUFBTW42QixXQUFXLEtBQUs0MEI7QUFDdEIsVUFBTXRnQixTQUFTLENBQUE7QUFDZixRQUFJcFUsR0FBR0M7QUFFUCxTQUFLRCxJQUFJLEdBQUdDLE9BQU9ILFNBQVNqQixRQUFRbUIsSUFBSUMsTUFBTSxFQUFFRCxHQUFHO0FBQ2pELFlBQU13RCxPQUFPMUQsU0FBU0UsQ0FBRTtBQUN4QixVQUFJLENBQUNpNkIsaUJBQWlCejJCLEtBQUttMEIsU0FBUztBQUNsQ3ZqQixlQUFPdFMsS0FBSzBCLElBQUFBOztJQUVoQjtBQUVBLFdBQU80UTtFQUNUO0VBTUFyVSwrQkFBK0I7QUFDN0IsV0FBTyxLQUFLaTZCLHVCQUF1QixJQUFJO0VBQ3pDO0VBT0FELGdCQUFnQjtBQUNkLFFBQUksS0FBS25kLGNBQWMsc0JBQXNCO01BQUMwTyxZQUFZO0lBQUksQ0FBQSxNQUFPLE9BQU87QUFDMUU7O0FBR0YsVUFBTXhyQixXQUFXLEtBQUtDLDZCQUE0QjtBQUNsRCxhQUFTQyxJQUFJRixTQUFTakIsU0FBUyxHQUFHbUIsS0FBSyxHQUFHLEVBQUVBLEdBQUc7QUFDN0MsV0FBS2s2QixhQUFhcDZCLFNBQVNFLENBQUUsQ0FBQTtJQUMvQjtBQUVBLFNBQUs0YyxjQUFjLG1CQUFBO0VBQ3JCO0VBT0FzZCxhQUFhMTJCLE1BQU07QUFDakIsVUFBTTZNLE1BQU0sS0FBS0E7QUFDakIsVUFBTW1qQixPQUFPaHdCLEtBQUsyMkI7QUFDbEIsVUFBTUMsVUFBVSxDQUFDNUcsS0FBSzZHO0FBQ3RCLFVBQU1wVSxPQUFPd04sZUFBZWp3QixNQUFNLEtBQUs1QixTQUFTO0FBQ2hELFVBQU1xbkIsT0FBTztNQUNYemxCO01BQ0F0RCxPQUFPc0QsS0FBS3REO01BQ1pvckIsWUFBWTtJQUNkO0FBRUEsUUFBSSxLQUFLMU8sY0FBYyxxQkFBcUJxTSxJQUFBQSxNQUFVLE9BQU87QUFDM0Q7O0FBR0YsUUFBSW1SLFNBQVM7QUFDWGxVLGVBQVM3VixLQUFLO1FBQ1o1SixNQUFNK3NCLEtBQUsvc0IsU0FBUyxRQUFRLElBQUl3ZixLQUFLeGYsT0FBTytzQixLQUFLL3NCO1FBQ2pEQyxPQUFPOHNCLEtBQUs5c0IsVUFBVSxRQUFRLEtBQUtOLFFBQVE2ZixLQUFLdmYsUUFBUThzQixLQUFLOXNCO1FBQzdEQyxLQUFLNnNCLEtBQUs3c0IsUUFBUSxRQUFRLElBQUlzZixLQUFLdGYsTUFBTTZzQixLQUFLN3NCO1FBQzlDQyxRQUFRNHNCLEtBQUs1c0IsV0FBVyxRQUFRLEtBQUtOLFNBQVMyZixLQUFLcmYsU0FBUzRzQixLQUFLNXNCO01BQ25FLENBQUE7O0FBR0ZwRCxTQUFLaEYsV0FBV2tMLEtBQUk7QUFFcEIsUUFBSTB3QixTQUFTO0FBQ1gvVCxpQkFBV2hXLEdBQUFBOztBQUdiNFksU0FBS3FDLGFBQWE7QUFDbEIsU0FBSzFPLGNBQWMsb0JBQW9CcU0sSUFBQUE7RUFDekM7RUFPQXpuQixjQUFjbUMsT0FBTztBQUNuQixXQUFPaEMsZUFBZWdDLE9BQU8sS0FBSy9CLFdBQVcsS0FBSzgyQixXQUFXO0VBQy9EO0VBRUE0QiwwQkFBMEJsM0IsR0FBRzZ4QixNQUFNNzNCLFNBQVNpRSxrQkFBa0I7QUFDNUQsVUFBTTRvQixTQUFTc1EsWUFBWXAzQixNQUFNOHhCLElBQUs7QUFDdEMsUUFBSSxPQUFPaEwsV0FBVyxZQUFZO0FBQ2hDLGFBQU9BLE9BQU8sTUFBTTdtQixHQUFHaEcsU0FBU2lFLGdCQUFBQTs7QUFHbEMsV0FBTyxDQUFBO0VBQ1Q7RUFFQXFDLGVBQWVoQyxjQUFjO0FBQzNCLFVBQU0rQixVQUFVLEtBQUtoRixLQUFLbXVCLFNBQVNsckIsWUFBYTtBQUNoRCxVQUFNNUIsV0FBVyxLQUFLczBCO0FBQ3RCLFFBQUk1d0IsT0FBTzFELFNBQVNrRSxPQUFPakQsQ0FBQUEsTUFBS0EsS0FBS0EsRUFBRXcyQixhQUFhOXpCLE9BQUFBLEVBQVM0a0IsSUFBRztBQUVoRSxRQUFJLENBQUM3a0IsTUFBTTtBQUNUQSxhQUFPO1FBQ0x5SCxNQUFNO1FBQ054TSxNQUFNLENBQUE7UUFDTmdGLFNBQVM7UUFDVGpGLFlBQVk7UUFDWmc4QixRQUFRO1FBQ1I5TSxTQUFTO1FBQ1RDLFNBQVM7UUFDVCtKLE9BQU9qMEIsV0FBV0EsUUFBUWkwQixTQUFTO1FBQ25DeDNCLE9BQU93QjtRQUNQNjFCLFVBQVU5ekI7UUFDVmczQixTQUFTLENBQUE7UUFDVC83QixTQUFTO01BQ1g7QUFDQW9CLGVBQVNnQyxLQUFLMEIsSUFBQUE7O0FBR2hCLFdBQU9BO0VBQ1Q7RUFFQW1JLGFBQWE7QUFDWCxXQUFPLEtBQUt5TixhQUFhLEtBQUtBLFdBQVd0QyxjQUFjLE1BQU07TUFBQ25YLE9BQU87TUFBTXNMLE1BQU07S0FBUTtFQUMzRjtFQUVBeXZCLHlCQUF5QjtBQUN2QixXQUFPLEtBQUszNkIsNkJBQTRCLEVBQUdsQjtFQUM3QztFQUVBKzRCLGlCQUFpQmwyQixjQUFjO0FBQzdCLFVBQU0rQixVQUFVLEtBQUtoRixLQUFLbXVCLFNBQVNsckIsWUFBYTtBQUNoRCxRQUFJLENBQUMrQixTQUFTO0FBQ1osYUFBTzs7QUFHVCxVQUFNRCxPQUFPLEtBQUtFLGVBQWVoQyxZQUFBQTtBQUlqQyxXQUFPLE9BQU84QixLQUFLZzNCLFdBQVcsWUFBWSxDQUFDaDNCLEtBQUtnM0IsU0FBUyxDQUFDLzJCLFFBQVErMkI7RUFDcEU7RUFFQUcscUJBQXFCajVCLGNBQWNpMkIsU0FBUztBQUMxQyxVQUFNbjBCLE9BQU8sS0FBS0UsZUFBZWhDLFlBQUFBO0FBQ2pDOEIsU0FBS2czQixTQUFTLENBQUM3QztFQUNqQjtFQUVBaUQscUJBQXFCMTZCLE9BQU87QUFDMUIsU0FBSzAwQixlQUFlMTBCLEtBQU0sSUFBRyxDQUFDLEtBQUswMEIsZUFBZTEwQixLQUFNO0VBQzFEO0VBRUEyNkIsa0JBQWtCMzZCLE9BQU87QUFDdkIsV0FBTyxDQUFDLEtBQUswMEIsZUFBZTEwQixLQUFNO0VBQ3BDO0VBS0E0NkIsa0JBQWtCcDVCLGNBQWNxNUIsV0FBV3BELFNBQVM7QUFDbEQsVUFBTTFDLE9BQU8wQyxVQUFVLFNBQVM7QUFDaEMsVUFBTW4wQixPQUFPLEtBQUtFLGVBQWVoQyxZQUFBQTtBQUNqQyxVQUFNb1EsUUFBUXRPLEtBQUtoRixXQUFXdzhCLG1CQUFtQjl0QixRQUFXK25CLElBQUFBO0FBRTVELFFBQUk1ckIsUUFBUTB4QixTQUFZLEdBQUE7QUFDdEJ2M0IsV0FBSy9FLEtBQUtzOEIsU0FBQUEsRUFBV1AsU0FBUyxDQUFDN0M7QUFDL0IsV0FBSzN1QixPQUFNO1dBQ047QUFDTCxXQUFLMnhCLHFCQUFxQmo1QixjQUFjaTJCLE9BQUFBO0FBRXhDN2xCLFlBQU05SSxPQUFPeEYsTUFBTTtRQUFDbTBCO01BQU8sQ0FBQTtBQUMzQixXQUFLM3VCLE9BQU8sQ0FBQ3FILFFBQVFBLElBQUkzTyxpQkFBaUJBLGVBQWV1ekIsT0FBTy9uQixNQUFTOztFQUU3RTtFQUVBK3RCLEtBQUt2NUIsY0FBY3E1QixXQUFXO0FBQzVCLFNBQUtELGtCQUFrQnA1QixjQUFjcTVCLFdBQVcsS0FBSztFQUN2RDtFQUVBRyxLQUFLeDVCLGNBQWNxNUIsV0FBVztBQUM1QixTQUFLRCxrQkFBa0JwNUIsY0FBY3E1QixXQUFXLElBQUk7RUFDdEQ7RUFLQTNELG9CQUFvQjExQixjQUFjO0FBQ2hDLFVBQU04QixPQUFPLEtBQUs0d0IsVUFBVTF5QixZQUFhO0FBQ3pDLFFBQUk4QixRQUFRQSxLQUFLaEYsWUFBWTtBQUMzQmdGLFdBQUtoRixXQUFXMjhCLFNBQVE7O0FBRTFCLFdBQU8sS0FBSy9HLFVBQVUxeUIsWUFBYTtFQUNyQztFQUVBMDVCLFFBQVE7QUFDTixRQUFJcDdCLEdBQUdDO0FBQ1AsU0FBSzIxQixLQUFJO0FBQ1RSLGFBQVNqTSxPQUFPLElBQUk7QUFFcEIsU0FBS25wQixJQUFJLEdBQUdDLE9BQU8sS0FBS3hCLEtBQUttdUIsU0FBUy90QixRQUFRbUIsSUFBSUMsTUFBTSxFQUFFRCxHQUFHO0FBQzNELFdBQUtvM0Isb0JBQW9CcDNCLENBQUFBO0lBQzNCO0VBQ0Y7RUFFQXE3QixVQUFVO0FBQ1IsU0FBS3plLGNBQWMsZUFBQTtBQUNuQixVQUFNLEVBQUNoUyxRQUFReUYsSUFBRyxJQUFJO0FBRXRCLFNBQUsrcUIsTUFBSztBQUNWLFNBQUszdkIsT0FBT2lrQixXQUFVO0FBRXRCLFFBQUk5a0IsUUFBUTtBQUNWLFdBQUt3dUIsYUFBWTtBQUNqQnpELGtCQUFZL3FCLFFBQVF5RixHQUFBQTtBQUNwQixXQUFLb2YsU0FBUzNrQixlQUFldUYsR0FBQUE7QUFDN0IsV0FBS3pGLFNBQVM7QUFDZCxXQUFLeUYsTUFBTTs7QUFHYixXQUFPc2lCLFVBQVUsS0FBSzVhLEVBQUU7QUFFeEIsU0FBSzZFLGNBQWMsY0FBQTtFQUNyQjtFQUVBMGUsaUJBQWlCclMsTUFBTTtBQUNyQixXQUFPLEtBQUtyZSxPQUFPMndCLFVBQWF0UyxHQUFBQSxJQUFBQTtFQUNsQztFQUtBeU0sYUFBYTtBQUNYLFNBQUs4RixlQUFjO0FBQ25CLFFBQUksS0FBS3ArQixRQUFRbzRCLFlBQVk7QUFDM0IsV0FBS2lHLHFCQUFvQjtXQUNwQjtBQUNMLFdBQUs1RyxXQUFXOztFQUVwQjtFQUtBMkcsaUJBQWlCO0FBQ2YsVUFBTUUsWUFBWSxLQUFLbEg7QUFDdkIsVUFBTS9FLFdBQVcsS0FBS0E7QUFFdEIsVUFBTWtNLE9BQU8sQ0FBQzF3QixNQUFNQyxjQUFhO0FBQy9CdWtCLGVBQVN6a0IsaUJBQWlCLE1BQU1DLE1BQU1DLFNBQUFBO0FBQ3RDd3dCLGdCQUFVendCLElBQUFBLElBQVFDO0lBQ3BCO0FBRUEsVUFBTUEsV0FBVyxDQUFDOUgsR0FBR3JDLEdBQUdFLE1BQU07QUFDNUJtQyxRQUFFdzRCLFVBQVU3NkI7QUFDWnFDLFFBQUV5NEIsVUFBVTU2QjtBQUNaLFdBQUs2M0IsY0FBYzExQixDQUFBQTtJQUNyQjtBQUVBK0csU0FBSyxLQUFLL00sUUFBUTg3QixRQUFRLENBQUNqdUIsU0FBUzB3QixLQUFLMXdCLE1BQU1DLFFBQUFBLENBQUFBO0VBQ2pEO0VBS0F1d0IsdUJBQXVCO0FBQ3JCLFFBQUksQ0FBQyxLQUFLaEgsc0JBQXNCO0FBQzlCLFdBQUtBLHVCQUF1QixDQUFBOztBQUU5QixVQUFNaUgsWUFBWSxLQUFLakg7QUFDdkIsVUFBTWhGLFdBQVcsS0FBS0E7QUFFdEIsVUFBTWtNLE9BQU8sQ0FBQzF3QixNQUFNQyxjQUFhO0FBQy9CdWtCLGVBQVN6a0IsaUJBQWlCLE1BQU1DLE1BQU1DLFNBQUFBO0FBQ3RDd3dCLGdCQUFVendCLElBQUFBLElBQVFDO0lBQ3BCO0FBQ0EsVUFBTTR3QixVQUFVLENBQUM3d0IsTUFBTUMsY0FBYTtBQUNsQyxVQUFJd3dCLFVBQVV6d0IsSUFBQUEsR0FBTztBQUNuQndrQixpQkFBU3RrQixvQkFBb0IsTUFBTUYsTUFBTUMsU0FBQUE7QUFDekMsZUFBT3d3QixVQUFVendCLElBQUs7O0lBRTFCO0FBRUEsVUFBTUMsV0FBVyxDQUFDOUUsT0FBT0UsV0FBVztBQUNsQyxVQUFJLEtBQUtzRSxRQUFRO0FBQ2YsYUFBS3dFLE9BQU9oSixPQUFPRSxNQUFBQTs7SUFFdkI7QUFFQSxRQUFJeTFCO0FBQ0osVUFBTWxILFdBQVcsTUFBTTtBQUNyQmlILGNBQVEsVUFBVWpILFFBQUFBO0FBRWxCLFdBQUtBLFdBQVc7QUFDaEIsV0FBS3psQixPQUFNO0FBRVh1c0IsV0FBSyxVQUFVendCLFFBQUFBO0FBQ2Z5d0IsV0FBSyxVQUFVSSxRQUFBQTtJQUNqQjtBQUVBQSxlQUFXLE1BQU07QUFDZixXQUFLbEgsV0FBVztBQUVoQmlILGNBQVEsVUFBVTV3QixRQUFBQTtBQUdsQixXQUFLa3dCLE1BQUs7QUFDVixXQUFLdEYsUUFBUSxHQUFHLENBQUE7QUFFaEI2RixXQUFLLFVBQVU5RyxRQUFBQTtJQUNqQjtBQUVBLFFBQUlwRixTQUFTbGtCLFdBQVcsS0FBS1gsTUFBTSxHQUFHO0FBQ3BDaXFCLGVBQUFBO1dBQ0s7QUFDTGtILGVBQUFBOztFQUVKO0VBS0EzQyxlQUFlO0FBQ2JqdkIsU0FBSyxLQUFLcXFCLFlBQVksQ0FBQ3RwQixVQUFVRCxTQUFTO0FBQ3hDLFdBQUt3a0IsU0FBU3RrQixvQkFBb0IsTUFBTUYsTUFBTUMsUUFBQUE7SUFDaEQsQ0FBQTtBQUNBLFNBQUtzcEIsYUFBYSxDQUFBO0FBRWxCcnFCLFNBQUssS0FBS3NxQixzQkFBc0IsQ0FBQ3ZwQixVQUFVRCxTQUFTO0FBQ2xELFdBQUt3a0IsU0FBU3RrQixvQkFBb0IsTUFBTUYsTUFBTUMsUUFBQUE7SUFDaEQsQ0FBQTtBQUNBLFNBQUt1cEIsdUJBQXVCdm5CO0VBQzlCO0VBRUE4dUIsaUJBQWlCejZCLE9BQU8wekIsTUFBTW5pQixTQUFTO0FBQ3JDLFVBQU1tcEIsU0FBU25wQixVQUFVLFFBQVE7QUFDakMsUUFBSXRQLE1BQU0rRixNQUFNdkosR0FBR0M7QUFFbkIsUUFBSWcxQixTQUFTLFdBQVc7QUFDdEJ6eEIsYUFBTyxLQUFLRSxlQUFlbkMsTUFBTSxDQUFBLEVBQUdHLFlBQVk7QUFDaEQ4QixXQUFLaEYsV0FBVyxNQUFNeTlCLFNBQVMsbUJBQW9CLEVBQUE7O0FBR3JELFNBQUtqOEIsSUFBSSxHQUFHQyxPQUFPc0IsTUFBTTFDLFFBQVFtQixJQUFJQyxNQUFNLEVBQUVELEdBQUc7QUFDOUN1SixhQUFPaEksTUFBTXZCLENBQUU7QUFDZixZQUFNeEIsYUFBYStLLFFBQVEsS0FBSzdGLGVBQWU2RixLQUFLN0gsWUFBWSxFQUFFbEQ7QUFDbEUsVUFBSUEsWUFBWTtBQUNkQSxtQkFBV3k5QixTQUFTLFlBQUEsRUFBYzF5QixLQUFLbkosU0FBU21KLEtBQUs3SCxjQUFjNkgsS0FBS3JKLEtBQUs7O0lBRWpGO0VBQ0Y7RUFNQWc4QixvQkFBb0I7QUFDbEIsV0FBTyxLQUFLNUgsV0FBVyxDQUFBO0VBQ3pCO0VBTUE2SCxrQkFBa0JDLGdCQUFnQjtBQUNoQyxVQUFNQyxhQUFhLEtBQUsvSCxXQUFXLENBQUE7QUFDbkMsVUFBTS9pQixTQUFTNnFCLGVBQWUxRixJQUFJLENBQUMsRUFBQ2gxQixjQUFjeEIsTUFBSyxNQUFNO0FBQzNELFlBQU1zRCxPQUFPLEtBQUtFLGVBQWVoQyxZQUFBQTtBQUNqQyxVQUFJLENBQUM4QixNQUFNO0FBQ1QsY0FBTSxJQUFJdkcsTUFBTSwrQkFBK0J5RSxZQUFjOztBQUcvRCxhQUFPO1FBQ0xBO1FBQ0F0QixTQUFTb0QsS0FBSy9FLEtBQUt5QixLQUFNO1FBQ3pCQTtNQUNGO0lBQ0YsQ0FBQTtBQUNBLFVBQU02SSxVQUFVLENBQUN1ekIsZUFBZS9xQixRQUFROHFCLFVBQUFBO0FBRXhDLFFBQUl0ekIsU0FBUztBQUNYLFdBQUt1ckIsVUFBVS9pQjtBQUVmLFdBQUtnakIsYUFBYTtBQUNsQixXQUFLd0UsbUJBQW1CeG5CLFFBQVE4cUIsVUFBQUE7O0VBRXBDO0VBV0F6ZixjQUFjbU8sTUFBTTlCLE1BQU1qbEIsUUFBUTtBQUNoQyxXQUFPLEtBQUsyd0IsU0FBUzdKLE9BQU8sTUFBTUMsTUFBTTlCLE1BQU1qbEIsTUFBQUE7RUFDaEQ7RUFPQXU0QixnQkFBZ0JDLFVBQVU7QUFDeEIsV0FBTyxLQUFLN0gsU0FBU3piLE9BQU9sVixPQUFPMHRCLENBQUFBLE1BQUtBLEVBQUV0RyxPQUFPclQsT0FBT3lrQixRQUFBQSxFQUFVMzlCLFdBQVc7RUFDL0U7RUFLQWs2QixtQkFBbUJ4bkIsUUFBUThxQixZQUFZSSxRQUFRO0FBQzdDLFVBQU1DLGVBQWUsS0FBS3QvQixRQUFRdS9CO0FBQ2xDLFVBQU01K0IsT0FBTyxDQUFDeUcsR0FBR0MsTUFBTUQsRUFBRVIsT0FBT2pELENBQUFBLE1BQUssQ0FBQzBELEVBQUVxbkIsS0FBSzdxQixDQUFBQSxNQUFLRixFQUFFVyxpQkFBaUJULEVBQUVTLGdCQUFnQlgsRUFBRWIsVUFBVWUsRUFBRWYsS0FBSyxDQUFBO0FBQzFHLFVBQU0wOEIsY0FBYzcrQixLQUFLcytCLFlBQVk5cUIsTUFBQUE7QUFDckMsVUFBTXNyQixZQUFZSixTQUFTbHJCLFNBQVN4VCxLQUFLd1QsUUFBUThxQixVQUFXO0FBRTVELFFBQUlPLFlBQVkvOUIsUUFBUTtBQUN0QixXQUFLbTlCLGlCQUFpQlksYUFBYUYsYUFBYXpILE1BQU0sS0FBSzs7QUFHN0QsUUFBSTRILFVBQVVoK0IsVUFBVTY5QixhQUFhekgsTUFBTTtBQUN6QyxXQUFLK0csaUJBQWlCYSxXQUFXSCxhQUFhekgsTUFBTSxJQUFJOztFQUU1RDtFQUtBNkQsY0FBYzExQixHQUFHcTVCLFFBQVE7QUFDdkIsVUFBTXhULE9BQU87TUFDWHRiLE9BQU92SztNQUNQcTVCO01BQ0FuUixZQUFZO01BQ1o4SCxhQUFhLEtBQUs1eEIsY0FBYzRCLENBQUFBO0lBQ2xDO0FBQ0EsVUFBTTA1QixjQUFjLENBQUMxUixZQUFZQSxPQUFPaHVCLFFBQVE4N0IsVUFBVSxLQUFLOTdCLFFBQVE4N0IsUUFBUTF6QixTQUFTcEMsRUFBRXdLLE9BQU8zQyxJQUFJO0FBRXJHLFFBQUksS0FBSzJSLGNBQWMsZUFBZXFNLE1BQU02VCxXQUFBQSxNQUFpQixPQUFPO0FBQ2xFOztBQUdGLFVBQU0vekIsVUFBVSxLQUFLZzBCLGFBQWEzNUIsR0FBR3E1QixRQUFReFQsS0FBS21LLFdBQVc7QUFFN0RuSyxTQUFLcUMsYUFBYTtBQUNsQixTQUFLMU8sY0FBYyxjQUFjcU0sTUFBTTZULFdBQUFBO0FBRXZDLFFBQUkvekIsV0FBV2tnQixLQUFLbGdCLFNBQVM7QUFDM0IsV0FBS290QixPQUFNOztBQUdiLFdBQU87RUFDVDtFQVVBNEcsYUFBYTM1QixHQUFHcTVCLFFBQVFySixhQUFhO0FBQ25DLFVBQU0sRUFBQ2tCLFNBQVMrSCxhQUFhLENBQUEsR0FBSWovQixRQUFBQSxJQUFXO0FBZTVDLFVBQU1pRSxtQkFBbUJvN0I7QUFDekIsVUFBTWxyQixTQUFTLEtBQUt5ckIsbUJBQW1CNTVCLEdBQUdpNUIsWUFBWWpKLGFBQWEveEIsZ0JBQUFBO0FBQ25FLFVBQU1neUIsVUFBVTRKLGNBQWM3NUIsQ0FBQUE7QUFDOUIsVUFBTSt2QixZQUFZRCxtQkFBbUI5dkIsR0FBRyxLQUFLbXhCLFlBQVluQixhQUFhQyxPQUFBQTtBQUV0RSxRQUFJRCxhQUFhO0FBR2YsV0FBS21CLGFBQWE7QUFHbEJsSixlQUFhanVCLFFBQVE4L0IsU0FBUztRQUFDOTVCO1FBQUdtTztRQUFRO01BQUssR0FBRSxJQUFJO0FBRXJELFVBQUk4aEIsU0FBUztBQUNYaEksaUJBQWFqdUIsUUFBUSsvQixTQUFTO1VBQUMvNUI7VUFBR21PO1VBQVE7UUFBSyxHQUFFLElBQUk7OztBQUl6RCxVQUFNeEksVUFBVSxDQUFDdXpCLGVBQWUvcUIsUUFBUThxQixVQUFBQTtBQUN4QyxRQUFJdHpCLFdBQVcwekIsUUFBUTtBQUNyQixXQUFLbkksVUFBVS9pQjtBQUNmLFdBQUt3bkIsbUJBQW1CeG5CLFFBQVE4cUIsWUFBWUksTUFBQUE7O0FBRzlDLFNBQUtsSSxhQUFhcEI7QUFFbEIsV0FBT3BxQjtFQUNUO0VBVUFpMEIsbUJBQW1CNTVCLEdBQUdpNUIsWUFBWWpKLGFBQWEveEIsa0JBQWtCO0FBQy9ELFFBQUkrQixFQUFFNkgsU0FBUyxZQUFZO0FBQ3pCLGFBQU8sQ0FBQTs7QUFHVCxRQUFJLENBQUNtb0IsYUFBYTtBQUVoQixhQUFPaUo7O0FBR1QsVUFBTUssZUFBZSxLQUFLdC9CLFFBQVF1L0I7QUFDbEMsV0FBTyxLQUFLckMsMEJBQTBCbDNCLEdBQUdzNUIsYUFBYXpILE1BQU15SCxjQUFjcjdCLGdCQUFBQTtFQUM1RTtBQUNGO0FBMW9DRSxjQUZJdXlCLE9BRUczaEIsWUFBV0E7QUFDbEIsY0FISTJoQixPQUdHakIsYUFBWUE7QUFDbkIsY0FKSWlCLE9BSUdwTSxhQUFZQTtBQUNuQixjQUxJb00sT0FLR3BKLFlBQVdBO0FBQ2xCLGNBTklvSixPQU1Hd0osV0FBVUE7QUFDakIsY0FQSXhKLE9BT0doQixZQUFXQTtBQXdvQ3BCLFNBQVNpQixvQkFBb0I7QUFDM0IsU0FBTzFwQixLQUFLeXBCLE1BQU1qQixXQUFXLENBQUNoekIsVUFBVUEsTUFBTWcxQixTQUFTcEosV0FBVSxDQUFBO0FBQ25FO0FDbHdDQSxTQUFTOFIsUUFBUWh0QixLQUErQmpRLFNBQXFCNkIsVUFBa0I7QUFDckYsUUFBTSxFQUFDRCxZQUFZczdCLGFBQWF2OEIsR0FBR0UsR0FBR3M4QixhQUFhQyxZQUFBQSxJQUFlcDlCO0FBQ2xFLE1BQUlxOUIsY0FBY0gsY0FBY0M7QUFJaENsdEIsTUFBSW9WLFVBQVM7QUFDYnBWLE1BQUlxdEIsSUFBSTM4QixHQUFHRSxHQUFHczhCLGFBQWF2N0IsYUFBYXk3QixhQUFheDdCLFdBQVd3N0IsV0FBQUE7QUFDaEUsTUFBSUQsY0FBY0YsYUFBYTtBQUM3Qkcsa0JBQWNILGNBQWNFO0FBQzVCbnRCLFFBQUlxdEIsSUFBSTM4QixHQUFHRSxHQUFHdThCLGFBQWF2N0IsV0FBV3c3QixhQUFhejdCLGFBQWF5N0IsYUFBYSxJQUFJO1NBQzVFO0FBQ0xwdEIsUUFBSXF0QixJQUFJMzhCLEdBQUdFLEdBQUdxOEIsYUFBYXI3QixXQUFXMlYsU0FBUzVWLGFBQWE0VixPQUFBQTs7QUFFOUR2SCxNQUFJc3RCLFVBQVM7QUFDYnR0QixNQUFJbWpCLEtBQUk7QUFDVjtBQUVBLFNBQVNvSyxnQkFBZ0J0L0IsT0FBTztBQUM5QixTQUFPdS9CLGtCQUFrQnYvQixPQUFPO0lBQUM7SUFBYztJQUFZO0lBQWM7RUFBVyxDQUFBO0FBQ3RGO0FBS0EsU0FBU3cvQixvQkFBa0JKLEtBQWlCRixhQUFxQkQsYUFBcUJRLFlBQW9CO0FBQ3hHLFFBQU1DLElBQUlKLGdCQUFnQkYsSUFBSXRnQyxRQUFRNmdDLFlBQVk7QUFDbEQsUUFBTUMsaUJBQWlCWCxjQUFjQyxlQUFlO0FBQ3BELFFBQU1XLGFBQWF0OUIsS0FBSzZSLElBQUl3ckIsZUFBZUgsYUFBYVAsY0FBYyxDQUFBO0FBU3RFLFFBQU1ZLG9CQUFvQixDQUFDQyxRQUFRO0FBQ2pDLFVBQU1DLGlCQUFpQmYsY0FBYzE4QixLQUFLNlIsSUFBSXdyQixlQUFlRyxHQUFHLEtBQUtOLGFBQWE7QUFDbEYsV0FBT2pnQixZQUFZdWdCLEtBQUssR0FBR3g5QixLQUFLNlIsSUFBSXdyQixlQUFlSSxhQUFBQSxDQUFBQTtFQUNyRDtBQUVBLFNBQU87SUFDTEMsWUFBWUgsa0JBQWtCSixFQUFFTyxVQUFVO0lBQzFDQyxVQUFVSixrQkFBa0JKLEVBQUVRLFFBQVE7SUFDdENDLFlBQVkzZ0IsWUFBWWtnQixFQUFFUyxZQUFZLEdBQUdOLFVBQUFBO0lBQ3pDTyxVQUFVNWdCLFlBQVlrZ0IsRUFBRVUsVUFBVSxHQUFHUCxVQUFBQTtFQUN2QztBQUNGO0FBS0EsU0FBU1EsV0FBV0MsR0FBV0MsT0FBZTk5QixHQUFXRSxHQUFXO0FBQ2xFLFNBQU87SUFDTEYsR0FBR0EsSUFBSTY5QixJQUFJLzlCLEtBQUs2ZCxJQUFJbWdCLEtBQUFBO0lBQ3BCNTlCLEdBQUdBLElBQUkyOUIsSUFBSS85QixLQUFLOGQsSUFBSWtnQixLQUFBQTtFQUN0QjtBQUNGO0FBaUJBLFNBQVNDLFFBQ1B6dUIsS0FDQWpRLFNBQ0FxVCxRQUNBSixTQUNBOVQsS0FDQXcvQixVQUNBO0FBQ0EsUUFBTSxFQUFDaCtCLEdBQUdFLEdBQUdlLFlBQVkxQyxPQUFPZytCLGFBQWFFLGFBQWF3QixPQUFBQSxJQUFVNStCO0FBRXBFLFFBQU1tOUIsY0FBYzE4QixLQUFLd0csSUFBSWpILFFBQVFtOUIsY0FBY2xxQixVQUFVSSxTQUFTNnBCLGFBQWEsQ0FBQTtBQUNuRixRQUFNRSxjQUFjd0IsU0FBUyxJQUFJQSxTQUFTM3JCLFVBQVVJLFNBQVM2cEIsY0FBYztBQUUzRSxNQUFJMkIsZ0JBQWdCO0FBQ3BCLFFBQU1DLFNBQVEzL0IsTUFBTUQ7QUFFcEIsTUFBSStULFNBQVM7QUFJWCxVQUFNOHJCLHVCQUF1QkgsU0FBUyxJQUFJQSxTQUFTM3JCLFVBQVU7QUFDN0QsVUFBTStyQix1QkFBdUI3QixjQUFjLElBQUlBLGNBQWNscUIsVUFBVTtBQUN2RSxVQUFNZ3NCLHNCQUFzQkYsdUJBQXVCQyx3QkFBd0I7QUFDM0UsVUFBTUUsZ0JBQWdCRCx1QkFBdUIsSUFBSUgsU0FBU0csc0JBQXVCQSxxQkFBcUJoc0IsV0FBVzZyQjtBQUNqSEQscUJBQWlCQyxTQUFRSSxpQkFBaUI7O0FBRzVDLFFBQU1DLE9BQU8xK0IsS0FBS3dHLElBQUksTUFBTzYzQixTQUFRM0IsY0FBYzlwQixTQUFTK3JCLEVBQU1qQyxJQUFBQTtBQUNsRSxRQUFNa0MsZUFBZVAsU0FBUUssUUFBUTtBQUNyQyxRQUFNdjlCLGFBQWExQyxRQUFRbWdDLGNBQWNSO0FBQ3pDLFFBQU1oOUIsV0FBVzFDLE1BQU1rZ0MsY0FBY1I7QUFDckMsUUFBTSxFQUFDVixZQUFZQyxVQUFVQyxZQUFZQyxTQUFRLElBQUlaLG9CQUFrQjE5QixTQUFTbzlCLGFBQWFELGFBQWF0N0IsV0FBV0QsVUFBQUE7QUFFckgsUUFBTTA5QiwyQkFBMkJuQyxjQUFjZ0I7QUFDL0MsUUFBTW9CLHlCQUF5QnBDLGNBQWNpQjtBQUM3QyxRQUFNb0IsMEJBQTBCNTlCLGFBQWF1OEIsYUFBYW1CO0FBQzFELFFBQU1HLHdCQUF3QjU5QixXQUFXdThCLFdBQVdtQjtBQUVwRCxRQUFNRywyQkFBMkJ0QyxjQUFjaUI7QUFDL0MsUUFBTXNCLHlCQUF5QnZDLGNBQWNrQjtBQUM3QyxRQUFNc0IsMEJBQTBCaCtCLGFBQWF5OEIsYUFBYXFCO0FBQzFELFFBQU1HLHdCQUF3QmgrQixXQUFXeThCLFdBQVdxQjtBQUVwRDF2QixNQUFJb1YsVUFBUztBQUViLE1BQUlzWixVQUFVO0FBRVosVUFBTW1CLHlCQUF5Qk4sMEJBQTBCQyx5QkFBeUI7QUFDbEZ4dkIsUUFBSXF0QixJQUFJMzhCLEdBQUdFLEdBQUdzOEIsYUFBYXFDLHlCQUF5Qk0scUJBQUFBO0FBQ3BEN3ZCLFFBQUlxdEIsSUFBSTM4QixHQUFHRSxHQUFHczhCLGFBQWEyQyx1QkFBdUJMLHFCQUFBQTtBQUdsRCxRQUFJckIsV0FBVyxHQUFHO0FBQ2hCLFlBQU0yQixVQUFVeEIsV0FBV2dCLHdCQUF3QkUsdUJBQXVCOStCLEdBQUdFLENBQUFBO0FBQzdFb1AsVUFBSXF0QixJQUFJeUMsUUFBUXAvQixHQUFHby9CLFFBQVFsL0IsR0FBR3U5QixVQUFVcUIsdUJBQXVCNTlCLFdBQVcyVixPQUFBQTs7QUFJNUUsVUFBTXdvQixLQUFLekIsV0FBV29CLHdCQUF3Qjk5QixVQUFVbEIsR0FBR0UsQ0FBQUE7QUFDM0RvUCxRQUFJc1YsT0FBT3lhLEdBQUdyL0IsR0FBR3EvQixHQUFHbi9CLENBQUM7QUFHckIsUUFBSXk5QixXQUFXLEdBQUc7QUFDaEIsWUFBTXlCLFVBQVV4QixXQUFXb0Isd0JBQXdCRSx1QkFBdUJsL0IsR0FBR0UsQ0FBQUE7QUFDN0VvUCxVQUFJcXRCLElBQUl5QyxRQUFRcC9CLEdBQUdvL0IsUUFBUWwvQixHQUFHeTlCLFVBQVV6OEIsV0FBVzJWLFNBQVNxb0Isd0JBQXdCcC9CLEtBQUsyK0IsRUFBRTs7QUFJN0YsVUFBTWEseUJBQTBCcCtCLFdBQVl5OEIsV0FBV2xCLGVBQWlCeDdCLGFBQWN5OEIsYUFBYWpCLGdCQUFpQjtBQUNwSG50QixRQUFJcXRCLElBQUkzOEIsR0FBR0UsR0FBR3U4QixhQUFhdjdCLFdBQVl5OEIsV0FBV2xCLGFBQWM2Qyx1QkFBdUIsSUFBSTtBQUMzRmh3QixRQUFJcXRCLElBQUkzOEIsR0FBR0UsR0FBR3U4QixhQUFhNkMsdUJBQXVCcitCLGFBQWN5OEIsYUFBYWpCLGFBQWMsSUFBSTtBQUcvRixRQUFJaUIsYUFBYSxHQUFHO0FBQ2xCLFlBQU0wQixVQUFVeEIsV0FBV21CLDBCQUEwQkUseUJBQXlCai9CLEdBQUdFLENBQUFBO0FBQ2pGb1AsVUFBSXF0QixJQUFJeUMsUUFBUXAvQixHQUFHby9CLFFBQVFsL0IsR0FBR3c5QixZQUFZdUIsMEJBQTBCbi9CLEtBQUsyK0IsSUFBSXg5QixhQUFhNFYsT0FBQUE7O0FBSTVGLFVBQU0wb0IsS0FBSzNCLFdBQVdlLDBCQUEwQjE5QixZQUFZakIsR0FBR0UsQ0FBQUE7QUFDL0RvUCxRQUFJc1YsT0FBTzJhLEdBQUd2L0IsR0FBR3UvQixHQUFHci9CLENBQUM7QUFHckIsUUFBSXM5QixhQUFhLEdBQUc7QUFDbEIsWUFBTTRCLFVBQVV4QixXQUFXZSwwQkFBMEJFLHlCQUF5QjcrQixHQUFHRSxDQUFBQTtBQUNqRm9QLFVBQUlxdEIsSUFBSXlDLFFBQVFwL0IsR0FBR28vQixRQUFRbC9CLEdBQUdzOUIsWUFBWXY4QixhQUFhNFYsU0FBU2dvQix1QkFBQUE7O1NBRTdEO0FBQ0x2dkIsUUFBSXFWLE9BQU8za0IsR0FBR0UsQ0FBQUE7QUFFZCxVQUFNcy9CLGNBQWMxL0IsS0FBSzZkLElBQUlraEIsdUJBQUFBLElBQTJCckMsY0FBY3g4QjtBQUN0RSxVQUFNeS9CLGNBQWMzL0IsS0FBSzhkLElBQUlpaEIsdUJBQUFBLElBQTJCckMsY0FBY3Q4QjtBQUN0RW9QLFFBQUlzVixPQUFPNGEsYUFBYUMsV0FBQUE7QUFFeEIsVUFBTUMsWUFBWTUvQixLQUFLNmQsSUFBSW1oQixxQkFBQUEsSUFBeUJ0QyxjQUFjeDhCO0FBQ2xFLFVBQU0yL0IsWUFBWTcvQixLQUFLOGQsSUFBSWtoQixxQkFBQUEsSUFBeUJ0QyxjQUFjdDhCO0FBQ2xFb1AsUUFBSXNWLE9BQU84YSxXQUFXQyxTQUFBQTs7QUFHeEJyd0IsTUFBSXN0QixVQUFTO0FBQ2Y7QUFFQSxTQUFTZ0QsUUFDUHR3QixLQUNBalEsU0FDQXFULFFBQ0FKLFNBQ0EwckIsVUFDQTtBQUNBLFFBQU0sRUFBQzZCLGFBQWE1K0IsWUFBWTYrQixjQUFBQSxJQUFpQnpnQztBQUNqRCxNQUFJNkIsV0FBVzdCLFFBQVE2QjtBQUN2QixNQUFJMitCLGFBQWE7QUFDZjlCLFlBQVF6dUIsS0FBS2pRLFNBQVNxVCxRQUFRSixTQUFTcFIsVUFBVTg4QixRQUFBQTtBQUNqRCxhQUFTLytCLElBQUksR0FBR0EsSUFBSTRnQyxhQUFhLEVBQUU1Z0MsR0FBRztBQUNwQ3FRLFVBQUl5d0IsS0FBSTtJQUNWO0FBQ0EsUUFBSSxDQUFDQyxNQUFNRixhQUFnQixHQUFBO0FBQ3pCNStCLGlCQUFXRCxjQUFjNitCLGdCQUFnQkcsT0FBT0E7OztBQUdwRGxDLFVBQVF6dUIsS0FBS2pRLFNBQVNxVCxRQUFRSixTQUFTcFIsVUFBVTg4QixRQUFBQTtBQUNqRDF1QixNQUFJeXdCLEtBQUk7QUFDUixTQUFPNytCO0FBQ1Q7QUFFQSxTQUFTNmpCLFdBQ1B6VixLQUNBalEsU0FDQXFULFFBQ0FKLFNBQ0EwckIsVUFDQTtBQUNBLFFBQU0sRUFBQzZCLGFBQWE1K0IsWUFBWTYrQixlQUFlempDLFFBQU8sSUFBSWdEO0FBQzFELFFBQU0sRUFBQzZnQyxhQUFhQyxpQkFBaUJ4ZSxZQUFZRSxpQkFBZ0IsSUFBSXhsQjtBQUNyRSxRQUFNK2pDLFFBQVEvakMsUUFBUWdrQyxnQkFBZ0I7QUFFdEMsTUFBSSxDQUFDSCxhQUFhO0FBQ2hCOztBQUdGNXdCLE1BQUlrVixZQUFZN0MsY0FBYyxDQUFBLENBQUU7QUFDaENyUyxNQUFJbVYsaUJBQWlCNUM7QUFFckIsTUFBSXVlLE9BQU87QUFDVDl3QixRQUFJa1MsWUFBWTBlLGNBQWM7QUFDOUI1d0IsUUFBSWd4QixXQUFXSCxtQkFBbUI7U0FDN0I7QUFDTDd3QixRQUFJa1MsWUFBWTBlO0FBQ2hCNXdCLFFBQUlneEIsV0FBV0gsbUJBQW1COztBQUdwQyxNQUFJai9CLFdBQVc3QixRQUFRNkI7QUFDdkIsTUFBSTIrQixhQUFhO0FBQ2Y5QixZQUFRenVCLEtBQUtqUSxTQUFTcVQsUUFBUUosU0FBU3BSLFVBQVU4OEIsUUFBQUE7QUFDakQsYUFBUy8rQixJQUFJLEdBQUdBLElBQUk0Z0MsYUFBYSxFQUFFNWdDLEdBQUc7QUFDcENxUSxVQUFJdVYsT0FBTTtJQUNaO0FBQ0EsUUFBSSxDQUFDbWIsTUFBTUYsYUFBZ0IsR0FBQTtBQUN6QjUrQixpQkFBV0QsY0FBYzYrQixnQkFBZ0JHLE9BQU9BOzs7QUFJcEQsTUFBSUcsT0FBTztBQUNUOUQsWUFBUWh0QixLQUFLalEsU0FBUzZCLFFBQUFBOztBQUd4QixNQUFJLENBQUMyK0IsYUFBYTtBQUNoQjlCLFlBQVF6dUIsS0FBS2pRLFNBQVNxVCxRQUFRSixTQUFTcFIsVUFBVTg4QixRQUFBQTtBQUNqRDF1QixRQUFJdVYsT0FBTTs7QUFFZDtBQVVlLElBQU0wYixhQUFOLGNBQXlCaHdCLFFBQUFBO0VBbUN0Q25VLFlBQVkyYSxLQUFLO0FBQ2YsVUFBSztBQVRQK29CO0FBQ0E1K0I7QUFDQTIrQjtBQUNBcEQ7QUFDQUQ7QUFDQUQ7QUFDQXQ3QjtBQUtFLFNBQUs1RSxVQUFVOFA7QUFDZixTQUFLMnpCLGdCQUFnQjN6QjtBQUNyQixTQUFLbEwsYUFBYWtMO0FBQ2xCLFNBQUtqTCxXQUFXaUw7QUFDaEIsU0FBS3N3QixjQUFjdHdCO0FBQ25CLFNBQUtxd0IsY0FBY3J3QjtBQUNuQixTQUFLb3dCLGNBQWM7QUFDbkIsU0FBS3NELGNBQWM7QUFFbkIsUUFBSTlvQixLQUFLO0FBQ1B2YSxhQUFPQyxPQUFPLE1BQU1zYSxHQUFBQTs7RUFFeEI7RUFFQWpXLFFBQVEwL0IsUUFBZ0JDLFFBQWdCbmdDLGtCQUEyQjtBQUNqRSxVQUFNc0MsUUFBUSxLQUFLekIsU0FBUztNQUFDO01BQUs7T0FBTWIsZ0JBQUFBO0FBQ3hDLFVBQU0sRUFBQ2MsT0FBT1csU0FBQUEsSUFBWVYsa0JBQWtCdUIsT0FBTztNQUFDNUMsR0FBR3dnQztNQUFRdGdDLEdBQUd1Z0M7SUFBTSxDQUFBO0FBQ3hFLFVBQU0sRUFBQ3gvQixZQUFZQyxVQUFVdTdCLGFBQWFELGFBQWFzRCxjQUFBQSxJQUFpQixLQUFLMytCLFNBQVM7TUFDcEY7TUFDQTtNQUNBO01BQ0E7TUFDQTtPQUNDYixnQkFBQUE7QUFDSCxVQUFNb2dDLFdBQVcsS0FBS3JrQyxRQUFRaVcsVUFBVSxLQUFLalcsUUFBUTZqQyxlQUFlO0FBQ3BFLFVBQU1TLGlCQUFpQmp0QixlQUFlb3NCLGVBQWU1K0IsV0FBV0QsVUFBQUE7QUFDaEUsVUFBTTIvQixnQkFBZ0JELGtCQUFrQlYsT0FBTzMrQixjQUFjRixPQUFPSCxZQUFZQyxRQUFBQTtBQUNoRixVQUFNMi9CLGVBQWVDLFdBQVcvK0IsVUFBVTA2QixjQUFjaUUsU0FBU2xFLGNBQWNrRSxPQUFBQTtBQUUvRSxXQUFRRSxpQkFBaUJDO0VBQzNCO0VBRUFoL0IsZUFBZXZCLGtCQUEyQjtBQUN4QyxVQUFNLEVBQUNOLEdBQUdFLEdBQUdlLFlBQVlDLFVBQVV1N0IsYUFBYUQsWUFBVyxJQUFJLEtBQUtyN0IsU0FBUztNQUMzRTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7T0FDQ2IsZ0JBQUFBO0FBQ0gsVUFBTSxFQUFDb1MsUUFBUUosUUFBQUEsSUFBVyxLQUFLalc7QUFDL0IsVUFBTTBrQyxhQUFhOS9CLGFBQWFDLFlBQVk7QUFDNUMsVUFBTTgvQixjQUFjdkUsY0FBY0QsY0FBY2xxQixVQUFVSSxVQUFVO0FBQ3BFLFdBQU87TUFDTDFTLEdBQUdBLElBQUlGLEtBQUs2ZCxJQUFJb2pCLFNBQWFDLElBQUFBO01BQzdCOWdDLEdBQUdBLElBQUlKLEtBQUs4ZCxJQUFJbWpCLFNBQWFDLElBQUFBO0lBQy9CO0VBQ0Y7RUFFQXR3QixnQkFBZ0JwUSxrQkFBMkI7QUFDekMsV0FBTyxLQUFLdUIsZUFBZXZCLGdCQUFBQTtFQUM3QjtFQUVBcUksS0FBSzJHLEtBQStCO0FBQ2xDLFVBQU0sRUFBQ2pULFNBQVN5akMsY0FBYSxJQUFJO0FBQ2pDLFVBQU1wdEIsVUFBVXJXLFFBQVFxVyxVQUFVLEtBQUs7QUFDdkMsVUFBTUosV0FBV2pXLFFBQVFpVyxXQUFXLEtBQUs7QUFDekMsVUFBTTByQixXQUFXM2hDLFFBQVEyaEM7QUFDekIsU0FBS3pCLGNBQWVsZ0MsUUFBUWdrQyxnQkFBZ0IsVUFBVyxPQUFPO0FBQzlELFNBQUtSLGNBQWNDLGdCQUFnQkcsTUFBTW5nQyxLQUFLeUssTUFBTXUxQixnQkFBZ0JHLEdBQUFBLElBQU87QUFFM0UsUUFBSUgsa0JBQWtCLEtBQUssS0FBS3JELGNBQWMsS0FBSyxLQUFLRCxjQUFjLEdBQUc7QUFDdkU7O0FBR0ZsdEIsUUFBSXFVLEtBQUk7QUFFUixVQUFNb2QsYUFBYSxLQUFLOS9CLGFBQWEsS0FBS0MsWUFBWTtBQUN0RG9PLFFBQUkyeEIsVUFBVW5oQyxLQUFLNmQsSUFBSW9qQixTQUFBQSxJQUFhcnVCLFFBQVE1UyxLQUFLOGQsSUFBSW1qQixTQUFhcnVCLElBQUFBLE1BQUFBO0FBQ2xFLFVBQU13dUIsTUFBTSxJQUFJcGhDLEtBQUs4ZCxJQUFJOWQsS0FBSzZSLElBQUk4c0IsSUFBSXFCLGlCQUFpQixDQUFBLENBQUE7QUFDdkQsVUFBTXFCLGVBQWV6dUIsU0FBU3d1QjtBQUU5QjV4QixRQUFJc1UsWUFBWXZuQixRQUFRcW5CO0FBQ3hCcFUsUUFBSWlWLGNBQWNsb0IsUUFBUStrQztBQUUxQnhCLFlBQVF0d0IsS0FBSyxNQUFNNnhCLGNBQWM3dUIsU0FBUzByQixRQUFBQTtBQUMxQ2paLGVBQVd6VixLQUFLLE1BQU02eEIsY0FBYzd1QixTQUFTMHJCLFFBQUFBO0FBRTdDMXVCLFFBQUl3VSxRQUFPO0VBQ2I7QUFDRjtBQXJIRSxjQUZtQnljLFlBRVp2cEIsTUFBSztBQUVaLGNBSm1CdXBCLFlBSVpydkIsWUFBVztFQUNoQm12QixhQUFhO0VBQ2JlLGFBQWE7RUFDYnpmLFlBQVksQ0FBQTtFQUNaRSxrQkFBa0I7RUFDbEJzZSxpQkFBaUJoMEI7RUFDakIrd0IsY0FBYztFQUNkZ0QsYUFBYTtFQUNieHRCLFFBQVE7RUFDUkosU0FBUztFQUNUbFIsT0FBTytLO0VBQ1A2eEIsVUFBVTs7QUFHWixjQWxCbUJ1QyxZQWtCWnB2QixpQkFBZ0I7RUFDckJ1UyxpQkFBaUI7O0FBR25CLGNBdEJtQjZjLFlBc0JaeFosZUFBYztFQUNuQnNhLGFBQWE7RUFDYkMsWUFBWSxDQUFDMWxCLFNBQVNBLFNBQVM7O0FHaFJuQyxTQUFTMmxCLGFBQWFDLEtBQUtDLGtCQUFrQjtBQUMzQyxRQUFNLEVBQUNDLEdBQUdDLEdBQUdDLE1BQU1DLE9BQU9DLE9BQUFBLElBQW1DTixJQUFJTyxTQUFTO0lBQUM7SUFBSztJQUFLO0lBQVE7SUFBUztLQUFXTixnQkFBQUE7QUFFakgsTUFBSU8sTUFBTUMsT0FBT0MsS0FBS0MsUUFBUUM7QUFFOUIsTUFBSVosSUFBSWEsWUFBWTtBQUNsQkQsV0FBT04sU0FBUztBQUNoQkUsV0FBT00sS0FBS0MsSUFBSWIsR0FBR0UsSUFBQUE7QUFDbkJLLFlBQVFLLEtBQUtFLElBQUlkLEdBQUdFLElBQUFBO0FBQ3BCTSxVQUFNUCxJQUFJUztBQUNWRCxhQUFTUixJQUFJUztTQUNSO0FBQ0xBLFdBQU9QLFFBQVE7QUFDZkcsV0FBT04sSUFBSVU7QUFDWEgsWUFBUVAsSUFBSVU7QUFDWkYsVUFBTUksS0FBS0MsSUFBSVosR0FBR0MsSUFBQUE7QUFDbEJPLGFBQVNHLEtBQUtFLElBQUliLEdBQUdDLElBQUFBOztBQUd2QixTQUFPO0lBQUNJO0lBQU1FO0lBQUtEO0lBQU9FO0VBQU07QUFDbEM7QUFFQSxTQUFTTSxZQUFZQyxPQUFNQyxPQUFPSixLQUFLQyxLQUFLO0FBQzFDLFNBQU9FLFFBQU8sSUFBSUUsWUFBWUQsT0FBT0osS0FBS0MsR0FBSTtBQUNoRDtBQUVBLFNBQVNLLGlCQUFpQnJCLEtBQUtzQixNQUFNQyxNQUFNO0FBQ3pDLFFBQU1KLFFBQVFuQixJQUFJd0IsUUFBUUM7QUFDMUIsUUFBTVAsUUFBT2xCLElBQUkwQjtBQUNqQixRQUFNQyxJQUFJQyxPQUFPVCxLQUFBQTtBQUVqQixTQUFPO0lBQ0xVLEdBQUdaLFlBQVlDLE1BQUtSLEtBQUtpQixFQUFFakIsS0FBSyxHQUFHYSxJQUFBQTtJQUNuQ08sR0FBR2IsWUFBWUMsTUFBS1QsT0FBT2tCLEVBQUVsQixPQUFPLEdBQUdhLElBQUFBO0lBQ3ZDUyxHQUFHZCxZQUFZQyxNQUFLUCxRQUFRZ0IsRUFBRWhCLFFBQVEsR0FBR1ksSUFBQUE7SUFDekNTLEdBQUdmLFlBQVlDLE1BQUtWLE1BQU1tQixFQUFFbkIsTUFBTSxHQUFHYyxJQUFBQTtFQUN2QztBQUNGO0FBRUEsU0FBU1csa0JBQWtCakMsS0FBS3NCLE1BQU1DLE1BQU07QUFDMUMsUUFBTSxFQUFDVyxtQkFBa0IsSUFBSWxDLElBQUlPLFNBQVM7SUFBQztFQUFxQixDQUFBO0FBQ2hFLFFBQU1ZLFFBQVFuQixJQUFJd0IsUUFBUVc7QUFDMUIsUUFBTVIsSUFBSVMsY0FBY2pCLEtBQUFBO0FBQ3hCLFFBQU1rQixPQUFPdkIsS0FBS0MsSUFBSU8sTUFBTUMsSUFBQUE7QUFDNUIsUUFBTUwsUUFBT2xCLElBQUkwQjtBQUlqQixRQUFNWSxlQUFlSixzQkFBc0JLLFNBQVNwQixLQUFBQTtBQUVwRCxTQUFPO0lBQ0xxQixTQUFTdkIsWUFBWSxDQUFDcUIsZ0JBQWdCcEIsTUFBS1IsT0FBT1EsTUFBS1YsTUFBTW1CLEVBQUVhLFNBQVMsR0FBR0gsSUFBQUE7SUFDM0VJLFVBQVV4QixZQUFZLENBQUNxQixnQkFBZ0JwQixNQUFLUixPQUFPUSxNQUFLVCxPQUFPa0IsRUFBRWMsVUFBVSxHQUFHSixJQUFBQTtJQUM5RUssWUFBWXpCLFlBQVksQ0FBQ3FCLGdCQUFnQnBCLE1BQUtQLFVBQVVPLE1BQUtWLE1BQU1tQixFQUFFZSxZQUFZLEdBQUdMLElBQUFBO0lBQ3BGTSxhQUFhMUIsWUFBWSxDQUFDcUIsZ0JBQWdCcEIsTUFBS1AsVUFBVU8sTUFBS1QsT0FBT2tCLEVBQUVnQixhQUFhLEdBQUdOLElBQUFBO0VBQ3pGO0FBQ0Y7QUFFQSxTQUFTTyxjQUFjNUMsS0FBSztBQUMxQixRQUFNNkMsU0FBUzlDLGFBQWFDLEdBQUFBO0FBQzVCLFFBQU1LLFFBQVF3QyxPQUFPcEMsUUFBUW9DLE9BQU9yQztBQUNwQyxRQUFNRixTQUFTdUMsT0FBT2xDLFNBQVNrQyxPQUFPbkM7QUFDdEMsUUFBTW9DLFNBQVN6QixpQkFBaUJyQixLQUFLSyxRQUFRLEdBQUdDLFNBQVMsQ0FBQTtBQUN6RCxRQUFNeUMsU0FBU2Qsa0JBQWtCakMsS0FBS0ssUUFBUSxHQUFHQyxTQUFTLENBQUE7QUFFMUQsU0FBTztJQUNMMEMsT0FBTztNQUNMOUMsR0FBRzJDLE9BQU9yQztNQUNWTCxHQUFHMEMsT0FBT25DO01BQ1Z1QyxHQUFHNUM7TUFDSDZDLEdBQUc1QztNQUNIeUM7SUFDRjtJQUNBSSxPQUFPO01BQ0xqRCxHQUFHMkMsT0FBT3JDLE9BQU9zQyxPQUFPZDtNQUN4QjdCLEdBQUcwQyxPQUFPbkMsTUFBTW9DLE9BQU9qQjtNQUN2Qm9CLEdBQUc1QyxRQUFReUMsT0FBT2QsSUFBSWMsT0FBT2hCO01BQzdCb0IsR0FBRzVDLFNBQVN3QyxPQUFPakIsSUFBSWlCLE9BQU9mO01BQzlCZ0IsUUFBUTtRQUNOUCxTQUFTMUIsS0FBS0UsSUFBSSxHQUFHK0IsT0FBT1AsVUFBVTFCLEtBQUtFLElBQUk4QixPQUFPakIsR0FBR2lCLE9BQU9kLENBQUMsQ0FBQTtRQUNqRVMsVUFBVTNCLEtBQUtFLElBQUksR0FBRytCLE9BQU9OLFdBQVczQixLQUFLRSxJQUFJOEIsT0FBT2pCLEdBQUdpQixPQUFPaEIsQ0FBQyxDQUFBO1FBQ25FWSxZQUFZNUIsS0FBS0UsSUFBSSxHQUFHK0IsT0FBT0wsYUFBYTVCLEtBQUtFLElBQUk4QixPQUFPZixHQUFHZSxPQUFPZCxDQUFDLENBQUE7UUFDdkVXLGFBQWE3QixLQUFLRSxJQUFJLEdBQUcrQixPQUFPSixjQUFjN0IsS0FBS0UsSUFBSThCLE9BQU9mLEdBQUdlLE9BQU9oQixDQUFDLENBQUE7TUFDM0U7SUFDRjtFQUNGO0FBQ0Y7QUFFQSxTQUFTc0IsUUFBUXBELEtBQUtFLEdBQUdDLEdBQUdGLGtCQUFrQjtBQUM1QyxRQUFNb0QsUUFBUW5ELE1BQU07QUFDcEIsUUFBTW9ELFFBQVFuRCxNQUFNO0FBQ3BCLFFBQU1vRCxXQUFXRixTQUFTQztBQUMxQixRQUFNVCxTQUFTN0MsT0FBTyxDQUFDdUQsWUFBWXhELGFBQWFDLEtBQUtDLGdCQUFBQTtBQUVyRCxTQUFPNEMsV0FDSFEsU0FBU0csV0FBV3RELEdBQUcyQyxPQUFPckMsTUFBTXFDLE9BQU9wQyxLQUFLLE9BQ2hENkMsU0FBU0UsV0FBV3JELEdBQUcwQyxPQUFPbkMsS0FBS21DLE9BQU9sQyxNQUFNO0FBQ3REO0FBRUEsU0FBUzhDLFVBQVVWLFFBQVE7QUFDekIsU0FBT0EsT0FBT1AsV0FBV08sT0FBT04sWUFBWU0sT0FBT0wsY0FBY0ssT0FBT0o7QUFDMUU7QUFPQSxTQUFTZSxrQkFBa0JDLEtBQUtDLE1BQU07QUFDcENELE1BQUlDLEtBQUtBLEtBQUsxRCxHQUFHMEQsS0FBS3pELEdBQUd5RCxLQUFLWCxHQUFHVyxLQUFLVixDQUFDO0FBQ3pDO0FBRUEsU0FBU1csWUFBWUQsTUFBTUUsUUFBUUMsVUFBVSxDQUFBLEdBQUk7QUFDL0MsUUFBTTdELElBQUkwRCxLQUFLMUQsTUFBTTZELFFBQVE3RCxJQUFJLENBQUM0RCxTQUFTO0FBQzNDLFFBQU0zRCxJQUFJeUQsS0FBS3pELE1BQU00RCxRQUFRNUQsSUFBSSxDQUFDMkQsU0FBUztBQUMzQyxRQUFNYixLQUFLVyxLQUFLMUQsSUFBSTBELEtBQUtYLE1BQU1jLFFBQVE3RCxJQUFJNkQsUUFBUWQsSUFBSWEsU0FBUyxLQUFLNUQ7QUFDckUsUUFBTWdELE1BQUtVLEtBQUt6RCxJQUFJeUQsS0FBS1YsTUFBTWEsUUFBUTVELElBQUk0RCxRQUFRYixJQUFJWSxTQUFTLEtBQUszRDtBQUNyRSxTQUFPO0lBQ0xELEdBQUcwRCxLQUFLMUQsSUFBSUE7SUFDWkMsR0FBR3lELEtBQUt6RCxJQUFJQTtJQUNaOEMsR0FBR1csS0FBS1gsSUFBSUE7SUFDWkMsR0FBR1UsS0FBS1YsSUFBSUE7SUFDWkgsUUFBUWEsS0FBS2I7RUFDZjtBQUNGO0FBRWUsSUFBTWlCLGFBQU4sY0FBeUJDLFFBQUFBO0VBdUJ0Q0MsWUFBWUMsS0FBSztBQUNmLFVBQUs7QUFFTCxTQUFLM0MsVUFBVTRDO0FBQ2YsU0FBS3ZELGFBQWF1RDtBQUNsQixTQUFLaEUsT0FBT2dFO0FBQ1osU0FBSy9ELFFBQVErRDtBQUNiLFNBQUs5RCxTQUFTOEQ7QUFDZCxTQUFLQyxnQkFBZ0JEO0FBRXJCLFFBQUlELEtBQUs7QUFDUEcsYUFBT0MsT0FBTyxNQUFNSixHQUFBQTs7RUFFeEI7RUFFQUssS0FBS2IsS0FBSztBQUNSLFVBQU0sRUFBQ1UsZUFBZTdDLFNBQVMsRUFBQ2lELGFBQWFDLGdCQUFBQSxFQUFnQixJQUFJO0FBQ2pFLFVBQU0sRUFBQ3ZCLE9BQU9ILE1BQUFBLElBQVNKLGNBQWMsSUFBSTtBQUN6QyxVQUFNK0IsY0FBY2xCLFVBQVVULE1BQU1ELE1BQU0sSUFBSTZCLHFCQUFxQmxCO0FBRW5FQyxRQUFJa0IsS0FBSTtBQUVSLFFBQUk3QixNQUFNQyxNQUFNRSxNQUFNRixLQUFLRCxNQUFNRSxNQUFNQyxNQUFNRCxHQUFHO0FBQzlDUyxVQUFJbUIsVUFBUztBQUNiSCxrQkFBWWhCLEtBQUtFLFlBQVliLE9BQU9xQixlQUFlbEIsS0FBQUEsQ0FBQUE7QUFDbkRRLFVBQUlvQixLQUFJO0FBQ1JKLGtCQUFZaEIsS0FBS0UsWUFBWVYsT0FBTyxDQUFDa0IsZUFBZXJCLEtBQUFBLENBQUFBO0FBQ3BEVyxVQUFJcUIsWUFBWVA7QUFDaEJkLFVBQUlzQixLQUFLLFNBQUE7O0FBR1h0QixRQUFJbUIsVUFBUztBQUNiSCxnQkFBWWhCLEtBQUtFLFlBQVlWLE9BQU9rQixhQUFBQSxDQUFBQTtBQUNwQ1YsUUFBSXFCLFlBQVlOO0FBQ2hCZixRQUFJc0IsS0FBSTtBQUVSdEIsUUFBSXVCLFFBQU87RUFDYjtFQUVBOUIsUUFBUStCLFFBQVFDLFFBQVFuRixrQkFBa0I7QUFDeEMsV0FBT21ELFFBQVEsTUFBTStCLFFBQVFDLFFBQVFuRixnQkFBQUE7RUFDdkM7RUFFQW9GLFNBQVNGLFFBQVFsRixrQkFBa0I7QUFDakMsV0FBT21ELFFBQVEsTUFBTStCLFFBQVEsTUFBTWxGLGdCQUFBQTtFQUNyQztFQUVBcUYsU0FBU0YsUUFBUW5GLGtCQUFrQjtBQUNqQyxXQUFPbUQsUUFBUSxNQUFNLE1BQU1nQyxRQUFRbkYsZ0JBQUFBO0VBQ3JDO0VBRUFzRixlQUFldEYsa0JBQWtCO0FBQy9CLFVBQU0sRUFBQ0MsR0FBR0MsR0FBR0MsTUFBTVMsV0FBVSxJQUE2QixLQUFLTixTQUFTO01BQUM7TUFBSztNQUFLO01BQVE7T0FBZU4sZ0JBQUFBO0FBQzFHLFdBQU87TUFDTEMsR0FBR1csY0FBY1gsSUFBSUUsUUFBUSxJQUFJRjtNQUNqQ0MsR0FBR1UsYUFBYVYsS0FBS0EsSUFBSUMsUUFBUTtJQUNuQztFQUNGO0VBRUFvRixTQUFTQyxNQUFNO0FBQ2IsV0FBT0EsU0FBUyxNQUFNLEtBQUtwRixRQUFRLElBQUksS0FBS0MsU0FBUztFQUN2RDtBQUNGO0FBbkZFLGNBRm1CMEQsWUFFWjBCLE1BQUs7QUFLWixjQVBtQjFCLFlBT1oyQixZQUFXO0VBQ2hCakUsZUFBZTtFQUNmRCxhQUFhO0VBQ2JVLGNBQWM7RUFDZGtDLGVBQWU7RUFDZnVCLFlBQVl4Qjs7QUFNZCxjQWxCbUJKLFlBa0JaNkIsaUJBQWdCO0VBQ3JCbkIsaUJBQWlCO0VBQ2pCRCxhQUFhOztBV3pJakIsSUFBTXFCLGFBQWEsQ0FBQ0MsV0FBV0MsYUFBYTtBQUMxQyxNQUFJLEVBQUNDLFlBQVlELFVBQVVFLFdBQVdGLFNBQUFBLElBQVlEO0FBRWxELE1BQUlBLFVBQVVJLGVBQWU7QUFDM0JGLGdCQUFZRyxLQUFLQyxJQUFJSixXQUFXRCxRQUFBQTtBQUNoQ0UsZUFBV0gsVUFBVU8sbUJBQW1CRixLQUFLQyxJQUFJSCxVQUFVRixRQUFBQTs7QUFHN0QsU0FBTztJQUNMRTtJQUNBRDtJQUNBTSxZQUFZSCxLQUFLSSxJQUFJUixVQUFVQyxTQUFBQTtFQUNqQztBQUNGO0FBRUEsSUFBTVEsYUFBYSxDQUFDQyxHQUFHQyxNQUFNRCxNQUFNLFFBQVFDLE1BQU0sUUFBUUQsRUFBRUUsaUJBQWlCRCxFQUFFQyxnQkFBZ0JGLEVBQUVHLFVBQVVGLEVBQUVFO0FBRXJHLElBQU1DLFNBQU4sY0FBcUJDLFFBQUFBO0VBSzFCQyxZQUFZQyxRQUFRO0FBQ2xCLFVBQUs7QUFFTCxTQUFLQyxTQUFTO0FBR2QsU0FBS0MsaUJBQWlCLENBQUE7QUFLdEIsU0FBS0MsZUFBZTtBQUdwQixTQUFLQyxlQUFlO0FBRXBCLFNBQUtDLFFBQVFMLE9BQU9LO0FBQ3BCLFNBQUtDLFVBQVVOLE9BQU9NO0FBQ3RCLFNBQUtDLE1BQU1QLE9BQU9PO0FBQ2xCLFNBQUtDLGNBQWNDO0FBQ25CLFNBQUtDLGNBQWNEO0FBQ25CLFNBQUtFLGFBQWFGO0FBQ2xCLFNBQUtHLFlBQVlIO0FBQ2pCLFNBQUtJLFdBQVdKO0FBQ2hCLFNBQUtLLE1BQU1MO0FBQ1gsU0FBS00sU0FBU047QUFDZCxTQUFLTyxPQUFPUDtBQUNaLFNBQUtRLFFBQVFSO0FBQ2IsU0FBS1MsU0FBU1Q7QUFDZCxTQUFLVSxRQUFRVjtBQUNiLFNBQUtXLFdBQVdYO0FBQ2hCLFNBQUtZLFdBQVdaO0FBQ2hCLFNBQUthLFNBQVNiO0FBQ2QsU0FBS2MsV0FBV2Q7RUFDbEI7RUFFQWUsT0FBT1gsVUFBVUQsV0FBV2EsU0FBUztBQUNuQyxTQUFLWixXQUFXQTtBQUNoQixTQUFLRCxZQUFZQTtBQUNqQixTQUFLUSxXQUFXSztBQUVoQixTQUFLQyxjQUFhO0FBQ2xCLFNBQUtDLFlBQVc7QUFDaEIsU0FBS0MsSUFBRztFQUNWO0VBRUFGLGdCQUFnQjtBQUNkLFFBQUksS0FBS0csYUFBWSxHQUFJO0FBQ3ZCLFdBQUtWLFFBQVEsS0FBS047QUFDbEIsV0FBS0csT0FBTyxLQUFLSSxTQUFTSjtBQUMxQixXQUFLQyxRQUFRLEtBQUtFO1dBQ2I7QUFDTCxXQUFLRCxTQUFTLEtBQUtOO0FBQ25CLFdBQUtFLE1BQU0sS0FBS00sU0FBU047QUFDekIsV0FBS0MsU0FBUyxLQUFLRzs7RUFFdkI7RUFFQVMsY0FBYztBQUNaLFVBQU03QyxZQUFZLEtBQUt3QixRQUFRd0IsVUFBVSxDQUFBO0FBQ3pDLFFBQUl0QixjQUFjdUIsU0FBS2pELFVBQVVrRCxnQkFBZ0I7TUFBQyxLQUFLM0I7T0FBUSxJQUFJLEtBQUssQ0FBQTtBQUV4RSxRQUFJdkIsVUFBVW1ELFFBQVE7QUFDcEJ6QixvQkFBY0EsWUFBWXlCLE9BQU8sQ0FBQ0MsU0FBU3BELFVBQVVtRCxPQUFPQyxNQUFNLEtBQUs3QixNQUFNOEIsSUFBSSxDQUFBOztBQUduRixRQUFJckQsVUFBVXNELE1BQU07QUFDbEI1QixvQkFBY0EsWUFBWTRCLEtBQUssQ0FBQzNDLEdBQUdDLE1BQU1aLFVBQVVzRCxLQUFLM0MsR0FBR0MsR0FBRyxLQUFLVyxNQUFNOEIsSUFBSSxDQUFBOztBQUcvRSxRQUFJLEtBQUs3QixRQUFRK0IsU0FBUztBQUN4QjdCLGtCQUFZNkIsUUFBTzs7QUFHckIsU0FBSzdCLGNBQWNBO0VBQ3JCO0VBRUFvQixNQUFNO0FBQ0osVUFBTSxFQUFDdEIsU0FBU0MsSUFBRyxJQUFJO0FBTXZCLFFBQUksQ0FBQ0QsUUFBUWdDLFNBQVM7QUFDcEIsV0FBS25CLFFBQVEsS0FBS0QsU0FBUztBQUMzQjs7QUFHRixVQUFNcEMsWUFBWXdCLFFBQVF3QjtBQUMxQixVQUFNUyxZQUFZQyxPQUFPMUQsVUFBVTJELElBQUk7QUFDdkMsVUFBTTFELFdBQVd3RCxVQUFVRztBQUMzQixVQUFNQyxjQUFjLEtBQUtDLG9CQUFtQjtBQUM1QyxVQUFNLEVBQUMzRCxVQUFVSyxXQUFBQSxJQUFjVCxXQUFXQyxXQUFXQyxRQUFBQTtBQUVyRCxRQUFJb0MsT0FBT0Q7QUFFWFgsUUFBSWtDLE9BQU9GLFVBQVVNO0FBRXJCLFFBQUksS0FBS2hCLGFBQVksR0FBSTtBQUN2QlYsY0FBUSxLQUFLTjtBQUNiSyxlQUFTLEtBQUs0QixTQUFTSCxhQUFhNUQsVUFBVUUsVUFBVUssVUFBYyxJQUFBO1dBQ2pFO0FBQ0w0QixlQUFTLEtBQUtOO0FBQ2RPLGNBQVEsS0FBSzRCLFNBQVNKLGFBQWFKLFdBQVd0RCxVQUFVSyxVQUFjLElBQUE7O0FBR3hFLFNBQUs2QixRQUFRaEMsS0FBS0MsSUFBSStCLE9BQU9iLFFBQVFPLFlBQVksS0FBS0EsUUFBUTtBQUM5RCxTQUFLSyxTQUFTL0IsS0FBS0MsSUFBSThCLFFBQVFaLFFBQVFNLGFBQWEsS0FBS0EsU0FBUztFQUNwRTtFQUtBa0MsU0FBU0gsYUFBYTVELFVBQVVFLFVBQVVLLFlBQVk7QUFDcEQsVUFBTSxFQUFDaUIsS0FBS00sVUFBVVAsU0FBUyxFQUFDd0IsUUFBUSxFQUFDa0IsUUFBQUEsRUFBUSxFQUFDLElBQUk7QUFDdEQsVUFBTUMsV0FBVyxLQUFLL0MsaUJBQWlCLENBQUE7QUFFdkMsVUFBTVMsYUFBYSxLQUFLQSxhQUFhO01BQUM7SUFBRTtBQUN4QyxVQUFNdUMsYUFBYTVELGFBQWEwRDtBQUNoQyxRQUFJRyxjQUFjUjtBQUVsQnBDLFFBQUk2QyxZQUFZO0FBQ2hCN0MsUUFBSThDLGVBQWU7QUFFbkIsUUFBSUMsTUFBTTtBQUNWLFFBQUl4QyxNQUFNLENBQUNvQztBQUNYLFNBQUsxQyxZQUFZK0MsUUFBUSxDQUFDQyxZQUFZQyxNQUFNO0FBQzFDLFlBQU1DLFlBQVl6RSxXQUFZRixXQUFXLElBQUt3QixJQUFJb0QsWUFBWUgsV0FBV0ksSUFBSSxFQUFFekM7QUFFL0UsVUFBSXNDLE1BQU0sS0FBSzlDLFdBQVdBLFdBQVdrRCxTQUFTLENBQUEsSUFBS0gsWUFBWSxJQUFJVixVQUFVbkMsVUFBVTtBQUNyRnNDLHVCQUFlRDtBQUNmdkMsbUJBQVdBLFdBQVdrRCxVQUFVSixJQUFJLElBQUksSUFBSSxFQUFBLElBQU07QUFDbEQzQyxlQUFPb0M7QUFDUEk7O0FBR0ZMLGVBQVNRLENBQUFBLElBQUs7UUFBQ3pDLE1BQU07UUFBR0Y7UUFBS3dDO1FBQUtuQyxPQUFPdUM7UUFBV3hDLFFBQVE1QjtNQUFVO0FBRXRFcUIsaUJBQVdBLFdBQVdrRCxTQUFTLENBQUEsS0FBTUgsWUFBWVY7SUFDbkQsQ0FBQTtBQUVBLFdBQU9HO0VBQ1Q7RUFFQUosU0FBU0osYUFBYUosV0FBV3RELFVBQVU2RSxhQUFhO0FBQ3RELFVBQU0sRUFBQ3ZELEtBQUtLLFdBQVdOLFNBQVMsRUFBQ3dCLFFBQVEsRUFBQ2tCLFFBQUFBLEVBQVEsRUFBQyxJQUFJO0FBQ3ZELFVBQU1DLFdBQVcsS0FBSy9DLGlCQUFpQixDQUFBO0FBQ3ZDLFVBQU1RLGNBQWMsS0FBS0EsY0FBYyxDQUFBO0FBQ3ZDLFVBQU1xRCxjQUFjbkQsWUFBWStCO0FBRWhDLFFBQUlxQixhQUFhaEI7QUFDakIsUUFBSWlCLGtCQUFrQjtBQUN0QixRQUFJQyxtQkFBbUI7QUFFdkIsUUFBSWxELE9BQU87QUFDWCxRQUFJbUQsTUFBTTtBQUVWLFNBQUszRCxZQUFZK0MsUUFBUSxDQUFDQyxZQUFZQyxNQUFNO0FBQzFDLFlBQU0sRUFBQ0MsV0FBV3BFLFdBQVUsSUFBSThFLGtCQUFrQm5GLFVBQVVzRCxXQUFXaEMsS0FBS2lELFlBQVlNLFdBQUFBO0FBR3hGLFVBQUlMLElBQUksS0FBS1MsbUJBQW1CNUUsYUFBYSxJQUFJMEQsVUFBVWUsYUFBYTtBQUN0RUMsc0JBQWNDLGtCQUFrQmpCO0FBQ2hDdEMsb0JBQVkyRCxLQUFLO1VBQUNsRCxPQUFPOEM7VUFBaUIvQyxRQUFRZ0Q7UUFBZ0IsQ0FBQTtBQUNsRWxELGdCQUFRaUQsa0JBQWtCakI7QUFDMUJtQjtBQUNBRiwwQkFBa0JDLG1CQUFtQjs7QUFJdkNqQixlQUFTUSxDQUFBQSxJQUFLO1FBQUN6QztRQUFNRixLQUFLb0Q7UUFBa0JDO1FBQUtoRCxPQUFPdUM7UUFBV3hDLFFBQVE1QjtNQUFVO0FBR3JGMkUsd0JBQWtCOUUsS0FBS0ksSUFBSTBFLGlCQUFpQlAsU0FBQUE7QUFDNUNRLDBCQUFvQjVFLGFBQWEwRDtJQUNuQyxDQUFBO0FBRUFnQixrQkFBY0M7QUFDZHZELGdCQUFZMkQsS0FBSztNQUFDbEQsT0FBTzhDO01BQWlCL0MsUUFBUWdEO0lBQWdCLENBQUE7QUFFbEUsV0FBT0Y7RUFDVDtFQUVBTSxpQkFBaUI7QUFDZixRQUFJLENBQUMsS0FBS2hFLFFBQVFnQyxTQUFTO0FBQ3pCOztBQUVGLFVBQU1LLGNBQWMsS0FBS0Msb0JBQW1CO0FBQzVDLFVBQU0sRUFBQzFDLGdCQUFnQitDLFVBQVUzQyxTQUFTLEVBQUNpRSxPQUFPekMsUUFBUSxFQUFDa0IsUUFBTyxHQUFHd0IsSUFBQUEsRUFBSSxJQUFJO0FBQzdFLFVBQU1DLFlBQVlDLGNBQWNGLEtBQUssS0FBS3hELE1BQU0sS0FBS0csS0FBSztBQUMxRCxRQUFJLEtBQUtVLGFBQVksR0FBSTtBQUN2QixVQUFJeUIsTUFBTTtBQUNWLFVBQUl0QyxPQUFPMkQsZUFBZUosT0FBTyxLQUFLdkQsT0FBT2dDLFNBQVMsS0FBSy9CLFFBQVEsS0FBS04sV0FBVzJDLEdBQUksQ0FBQTtBQUN2RixpQkFBV3NCLFVBQVUzQixVQUFVO0FBQzdCLFlBQUlLLFFBQVFzQixPQUFPdEIsS0FBSztBQUN0QkEsZ0JBQU1zQixPQUFPdEI7QUFDYnRDLGlCQUFPMkQsZUFBZUosT0FBTyxLQUFLdkQsT0FBT2dDLFNBQVMsS0FBSy9CLFFBQVEsS0FBS04sV0FBVzJDLEdBQUksQ0FBQTs7QUFFckZzQixlQUFPOUQsT0FBTyxLQUFLQSxNQUFNNkIsY0FBY0s7QUFDdkM0QixlQUFPNUQsT0FBT3lELFVBQVVJLFdBQVdKLFVBQVVLLEVBQUU5RCxJQUFPNEQsR0FBQUEsT0FBT3pELEtBQUs7QUFDbEVILGdCQUFRNEQsT0FBT3pELFFBQVE2QjtNQUN6QjtXQUNLO0FBQ0wsVUFBSW1CLE1BQU07QUFDVixVQUFJckQsTUFBTTZELGVBQWVKLE9BQU8sS0FBS3pELE1BQU02QixjQUFjSyxTQUFTLEtBQUtqQyxTQUFTLEtBQUtMLFlBQVl5RCxHQUFBQSxFQUFLakQsTUFBTTtBQUM1RyxpQkFBVzBELFVBQVUzQixVQUFVO0FBQzdCLFlBQUkyQixPQUFPVCxRQUFRQSxLQUFLO0FBQ3RCQSxnQkFBTVMsT0FBT1Q7QUFDYnJELGdCQUFNNkQsZUFBZUosT0FBTyxLQUFLekQsTUFBTTZCLGNBQWNLLFNBQVMsS0FBS2pDLFNBQVMsS0FBS0wsWUFBWXlELEdBQUFBLEVBQUtqRCxNQUFNOztBQUUxRzBELGVBQU85RCxNQUFNQTtBQUNiOEQsZUFBTzVELFFBQVEsS0FBS0EsT0FBT2dDO0FBQzNCNEIsZUFBTzVELE9BQU95RCxVQUFVSSxXQUFXSixVQUFVSyxFQUFFRixPQUFPNUQsSUFBSSxHQUFHNEQsT0FBT3pELEtBQUs7QUFDekVMLGVBQU84RCxPQUFPMUQsU0FBUzhCO01BQ3pCOztFQUVKO0VBRUFuQixlQUFlO0FBQ2IsV0FBTyxLQUFLdkIsUUFBUWUsYUFBYSxTQUFTLEtBQUtmLFFBQVFlLGFBQWE7RUFDdEU7RUFFQTBELE9BQU87QUFDTCxRQUFJLEtBQUt6RSxRQUFRZ0MsU0FBUztBQUN4QixZQUFNL0IsTUFBTSxLQUFLQTtBQUNqQnlFLGVBQVN6RSxLQUFLLElBQUk7QUFFbEIsV0FBSzBFLE1BQUs7QUFFVkMsaUJBQVczRSxHQUFBQTs7RUFFZjtFQUtBMEUsUUFBUTtBQUNOLFVBQU0sRUFBQzNFLFNBQVM2RSxNQUFNekUsYUFBYUMsWUFBWUosSUFBQUEsSUFBTztBQUN0RCxVQUFNLEVBQUNnRSxPQUFPekMsUUFBUWhELFVBQUFBLElBQWFxRztBQUNuQyxVQUFNQyxlQUFlQyxTQUFTQztBQUM5QixVQUFNYixZQUFZQyxjQUFjUyxLQUFLWCxLQUFLLEtBQUt4RCxNQUFNLEtBQUtHLEtBQUs7QUFDL0QsVUFBTW9CLFlBQVlDLE9BQU8xRCxVQUFVMkQsSUFBSTtBQUN2QyxVQUFNLEVBQUNPLFFBQU8sSUFBSWxFO0FBQ2xCLFVBQU1DLFdBQVd3RCxVQUFVRztBQUMzQixVQUFNNkMsZUFBZXhHLFdBQVc7QUFDaEMsUUFBSXlHO0FBRUosU0FBS0MsVUFBUztBQUdkbEYsUUFBSTZDLFlBQVlxQixVQUFVckIsVUFBVSxNQUFBO0FBQ3BDN0MsUUFBSThDLGVBQWU7QUFDbkI5QyxRQUFJbUYsWUFBWTtBQUNoQm5GLFFBQUlrQyxPQUFPRixVQUFVTTtBQUVyQixVQUFNLEVBQUM1RCxVQUFVRCxXQUFXTSxXQUFVLElBQUlULFdBQVdDLFdBQVdDLFFBQUFBO0FBR2hFLFVBQU00RyxnQkFBZ0IsU0FBU2IsR0FBR2MsR0FBR3BDLFlBQVk7QUFDL0MsVUFBSXFDLE1BQU01RyxRQUFhQSxLQUFBQSxZQUFZLEtBQUs0RyxNQUFNN0csU0FBQUEsS0FBY0EsWUFBWSxHQUFHO0FBQ3pFOztBQUlGdUIsVUFBSXVGLEtBQUk7QUFFUixZQUFNSixZQUFZSyxlQUFldkMsV0FBV2tDLFdBQVcsQ0FBQTtBQUN2RG5GLFVBQUl5RixZQUFZRCxlQUFldkMsV0FBV3dDLFdBQVdaLFlBQUFBO0FBQ3JEN0UsVUFBSTBGLFVBQVVGLGVBQWV2QyxXQUFXeUMsU0FBUyxNQUFBO0FBQ2pEMUYsVUFBSTJGLGlCQUFpQkgsZUFBZXZDLFdBQVcwQyxnQkFBZ0IsQ0FBQTtBQUMvRDNGLFVBQUk0RixXQUFXSixlQUFldkMsV0FBVzJDLFVBQVUsT0FBQTtBQUNuRDVGLFVBQUltRixZQUFZQTtBQUNoQm5GLFVBQUk2RixjQUFjTCxlQUFldkMsV0FBVzRDLGFBQWFoQixZQUFBQTtBQUV6RDdFLFVBQUk4RixZQUFZTixlQUFldkMsV0FBVzhDLFVBQVUsQ0FBQSxDQUFFLENBQUE7QUFFdEQsVUFBSXhILFVBQVVJLGVBQWU7QUFHM0IsY0FBTXFILGNBQWM7VUFDbEJDLFFBQVF4SCxZQUFZRyxLQUFLc0gsUUFBUTtVQUNqQ0MsWUFBWWxELFdBQVdrRDtVQUN2QkMsVUFBVW5ELFdBQVdtRDtVQUNyQkMsYUFBYWxCO1FBQ2Y7QUFDQSxjQUFNbUIsVUFBVXBDLFVBQVVxQyxNQUFNaEMsR0FBRzdGLFdBQVcsQ0FBQTtBQUM5QyxjQUFNOEgsVUFBVW5CLElBQUlMO0FBR3BCeUIsd0JBQWdCekcsS0FBS2dHLGFBQWFNLFNBQVNFLFNBQVNqSSxVQUFVTyxtQkFBbUJKLFFBQUFBO2FBQzVFO0FBR0wsY0FBTWdJLFVBQVVyQixJQUFJekcsS0FBS0ksS0FBS1IsV0FBV0MsYUFBYSxHQUFHLENBQUE7QUFDekQsY0FBTWtJLFdBQVd6QyxVQUFVSSxXQUFXQyxHQUFHN0YsUUFBQUE7QUFDekMsY0FBTWtJLGVBQWVDLGNBQWM1RCxXQUFXMkQsWUFBWTtBQUUxRDVHLFlBQUk4RyxVQUFTO0FBRWIsWUFBSUMsT0FBT0MsT0FBT0osWUFBQUEsRUFBY0ssS0FBS0MsQ0FBQUEsTUFBS0EsTUFBTSxDQUFJLEdBQUE7QUFDbERDLDZCQUFtQm5ILEtBQUs7WUFDdEJ1RSxHQUFHb0M7WUFDSHRCLEdBQUdxQjtZQUNIVSxHQUFHMUk7WUFDSDJJLEdBQUc1STtZQUNId0gsUUFBUVc7VUFDVixDQUFBO2VBQ0s7QUFDTDVHLGNBQUlzSCxLQUFLWCxVQUFVRCxTQUFTaEksVUFBVUQsU0FBQUE7O0FBR3hDdUIsWUFBSXVILEtBQUk7QUFDUixZQUFJcEMsY0FBYyxHQUFHO0FBQ25CbkYsY0FBSXdILE9BQU07OztBQUlkeEgsVUFBSXlILFFBQU87SUFDYjtBQUVBLFVBQU1DLFdBQVcsU0FBU25ELEdBQUdjLEdBQUdwQyxZQUFZO0FBQzFDMEUsaUJBQVczSCxLQUFLaUQsV0FBV0ksTUFBTWtCLEdBQUdjLElBQUt0RyxhQUFhLEdBQUlpRCxXQUFXO1FBQ25FNEYsZUFBZTNFLFdBQVc0RTtRQUMxQmhGLFdBQVdxQixVQUFVckIsVUFBVUksV0FBV0osU0FBUztNQUNyRCxDQUFBO0lBQ0Y7QUFHQSxVQUFNdkIsZUFBZSxLQUFLQSxhQUFZO0FBQ3RDLFVBQU1jLGNBQWMsS0FBS0Msb0JBQW1CO0FBQzVDLFFBQUlmLGNBQWM7QUFDaEIyRCxlQUFTO1FBQ1BWLEdBQUdILGVBQWVKLE9BQU8sS0FBS3ZELE9BQU9nQyxTQUFTLEtBQUsvQixRQUFRTixXQUFXLENBQUUsQ0FBQTtRQUN4RWlGLEdBQUcsS0FBSzlFLE1BQU1rQyxVQUFVTDtRQUN4QjBGLE1BQU07TUFDUjtXQUNLO0FBQ0w3QyxlQUFTO1FBQ1BWLEdBQUcsS0FBSzlELE9BQU9nQztRQUNmNEMsR0FBR2pCLGVBQWVKLE9BQU8sS0FBS3pELE1BQU02QixjQUFjSyxTQUFTLEtBQUtqQyxTQUFTTCxZQUFZLENBQUEsRUFBR1EsTUFBTTtRQUM5Rm1ILE1BQU07TUFDUjs7QUFHRkMsMEJBQXNCLEtBQUsvSCxLQUFLNEUsS0FBS29ELGFBQWE7QUFFbEQsVUFBTXJGLGFBQWE1RCxhQUFhMEQ7QUFDaEMsU0FBS3hDLFlBQVkrQyxRQUFRLENBQUNDLFlBQVlDLE1BQU07QUFDMUNsRCxVQUFJNkYsY0FBYzVDLFdBQVdnRjtBQUM3QmpJLFVBQUl5RixZQUFZeEMsV0FBV2dGO0FBRTNCLFlBQU1DLFlBQVlsSSxJQUFJb0QsWUFBWUgsV0FBV0ksSUFBSSxFQUFFekM7QUFDbkQsWUFBTWlDLFlBQVlxQixVQUFVckIsVUFBVUksV0FBV0osY0FBY0ksV0FBV0osWUFBWXRFLFVBQVVzRSxVQUFRO0FBQ3hHLFlBQU1qQyxRQUFRbEMsV0FBV3NHLGVBQWVrRDtBQUN4QyxVQUFJM0QsSUFBSVUsT0FBT1Y7QUFDZixVQUFJYyxJQUFJSixPQUFPSTtBQUVmbkIsZ0JBQVVpRSxTQUFTLEtBQUt2SCxLQUFLO0FBRTdCLFVBQUlVLGNBQWM7QUFDaEIsWUFBSTRCLElBQUksS0FBS3FCLElBQUkzRCxRQUFRNkIsVUFBVSxLQUFLL0IsT0FBTztBQUM3QzJFLGNBQUlKLE9BQU9JLEtBQUsxQztBQUNoQnNDLGlCQUFPNkM7QUFDUHZELGNBQUlVLE9BQU9WLElBQUlILGVBQWVKLE9BQU8sS0FBS3ZELE9BQU9nQyxTQUFTLEtBQUsvQixRQUFRTixXQUFXNkUsT0FBTzZDLElBQUksQ0FBQzs7aUJBRXZGNUUsSUFBSSxLQUFLbUMsSUFBSTFDLGFBQWEsS0FBS25DLFFBQVE7QUFDaEQrRCxZQUFJVSxPQUFPVixJQUFJQSxJQUFJcEUsWUFBWThFLE9BQU82QyxJQUFJLEVBQUVsSCxRQUFRNkI7QUFDcER3QyxlQUFPNkM7QUFDUHpDLFlBQUlKLE9BQU9JLElBQUlqQixlQUFlSixPQUFPLEtBQUt6RCxNQUFNNkIsY0FBY0ssU0FBUyxLQUFLakMsU0FBU0wsWUFBWThFLE9BQU82QyxJQUFJLEVBQUVuSCxNQUFNOztBQUd0SCxZQUFNeUgsUUFBUWxFLFVBQVVLLEVBQUVBLENBQUFBO0FBRTFCYSxvQkFBY2dELE9BQU8vQyxHQUFHcEMsVUFBQUE7QUFFeEJzQixVQUFJOEQsT0FBT3hGLFdBQVcwQixJQUFJN0YsV0FBV3NHLGNBQWMxRCxlQUFlaUQsSUFBSTNELFFBQVEsS0FBS0YsT0FBT2tFLEtBQUtYLEdBQUc7QUFHbEd5RCxlQUFTeEQsVUFBVUssRUFBRUEsQ0FBQUEsR0FBSWMsR0FBR3BDLFVBQUFBO0FBRTVCLFVBQUkzQixjQUFjO0FBQ2hCMkQsZUFBT1YsS0FBSzNELFFBQVE2QjtNQUN0QixXQUFXLE9BQU9RLFdBQVdJLFNBQVMsVUFBVTtBQUM5QyxjQUFNaUYsaUJBQWlCdEcsVUFBVVc7QUFDakNzQyxlQUFPSSxLQUFLa0QsMEJBQTBCdEYsWUFBWXFGLGNBQWtCN0YsSUFBQUE7YUFDL0Q7QUFDTHdDLGVBQU9JLEtBQUsxQzs7SUFFaEIsQ0FBQTtBQUVBNkYseUJBQXFCLEtBQUt4SSxLQUFLNEUsS0FBS29ELGFBQWE7RUFDbkQ7RUFLQTlDLFlBQVk7QUFDVixVQUFNTixPQUFPLEtBQUs3RTtBQUNsQixVQUFNMEksWUFBWTdELEtBQUs4RDtBQUN2QixVQUFNQyxZQUFZMUcsT0FBT3dHLFVBQVV2RyxJQUFJO0FBQ3ZDLFVBQU0wRyxlQUFlQyxVQUFVSixVQUFVaEcsT0FBTztBQUVoRCxRQUFJLENBQUNnRyxVQUFVMUcsU0FBUztBQUN0Qjs7QUFHRixVQUFNbUMsWUFBWUMsY0FBY1MsS0FBS1gsS0FBSyxLQUFLeEQsTUFBTSxLQUFLRyxLQUFLO0FBQy9ELFVBQU1aLE1BQU0sS0FBS0E7QUFDakIsVUFBTWMsV0FBVzJILFVBQVUzSDtBQUMzQixVQUFNa0UsZUFBZTJELFVBQVV4RyxPQUFPO0FBQ3RDLFVBQU0yRyw2QkFBNkJGLGFBQWFySSxNQUFNeUU7QUFDdEQsUUFBSUs7QUFJSixRQUFJNUUsT0FBTyxLQUFLQTtBQUNoQixRQUFJSCxXQUFXLEtBQUtNO0FBRXBCLFFBQUksS0FBS1UsYUFBWSxHQUFJO0FBRXZCaEIsaUJBQVcxQixLQUFLSSxJQUFPLEdBQUEsS0FBS29CLFVBQVU7QUFDdENpRixVQUFJLEtBQUs5RSxNQUFNdUk7QUFDZnJJLGFBQU8yRCxlQUFlUSxLQUFLWixPQUFPdkQsTUFBTSxLQUFLQyxRQUFRSixRQUFBQTtXQUNoRDtBQUVMLFlBQU1ELFlBQVksS0FBS0YsWUFBWTRJLE9BQU8sQ0FBQ0MsS0FBSzdHLFNBQVN2RCxLQUFLSSxJQUFJZ0ssS0FBSzdHLEtBQUt4QixNQUFNLEdBQUcsQ0FBQTtBQUNyRjBFLFVBQUl5RCw2QkFBNkIxRSxlQUFlUSxLQUFLWixPQUFPLEtBQUt6RCxLQUFLLEtBQUtDLFNBQVNILFlBQVl1RSxLQUFLckQsT0FBT2tCLFVBQVUsS0FBS0osb0JBQW1CLENBQUE7O0FBS2hKLFVBQU1rQyxJQUFJSCxlQUFldEQsVUFBVUwsTUFBTUEsT0FBT0gsUUFBQUE7QUFHaEROLFFBQUk2QyxZQUFZcUIsVUFBVXJCLFVBQVVvRyxtQkFBbUJuSSxRQUFBQSxDQUFBQTtBQUN2RGQsUUFBSThDLGVBQWU7QUFDbkI5QyxRQUFJNkYsY0FBYzRDLFVBQVUxRDtBQUM1Qi9FLFFBQUl5RixZQUFZZ0QsVUFBVTFEO0FBQzFCL0UsUUFBSWtDLE9BQU95RyxVQUFVckc7QUFFckJxRixlQUFXM0gsS0FBS3lJLFVBQVVwRixNQUFNa0IsR0FBR2MsR0FBR3NELFNBQUFBO0VBQ3hDO0VBS0F0RyxzQkFBc0I7QUFDcEIsVUFBTW9HLFlBQVksS0FBSzFJLFFBQVEySTtBQUMvQixVQUFNQyxZQUFZMUcsT0FBT3dHLFVBQVV2RyxJQUFJO0FBQ3ZDLFVBQU0wRyxlQUFlQyxVQUFVSixVQUFVaEcsT0FBTztBQUNoRCxXQUFPZ0csVUFBVTFHLFVBQVU0RyxVQUFVaEcsYUFBYWlHLGFBQWFqSSxTQUFTO0VBQzFFO0VBS0F1SSxpQkFBaUIzRSxHQUFHYyxHQUFHO0FBQ3JCLFFBQUluQyxHQUFHaUcsUUFBUUM7QUFFZixRQUFJQyxXQUFXOUUsR0FBRyxLQUFLOUQsTUFBTSxLQUFLQyxLQUFLLEtBQ2xDMkksV0FBV2hFLEdBQUcsS0FBSzlFLEtBQUssS0FBS0MsTUFBTSxHQUFHO0FBRXpDNEksV0FBSyxLQUFLeko7QUFDVixXQUFLdUQsSUFBSSxHQUFHQSxJQUFJa0csR0FBRzlGLFFBQVEsRUFBRUosR0FBRztBQUM5QmlHLGlCQUFTQyxHQUFHbEcsQ0FBRTtBQUVkLFlBQUltRyxXQUFXOUUsR0FBRzRFLE9BQU8xSSxNQUFNMEksT0FBTzFJLE9BQU8wSSxPQUFPdkksS0FBSyxLQUNwRHlJLFdBQVdoRSxHQUFHOEQsT0FBTzVJLEtBQUs0SSxPQUFPNUksTUFBTTRJLE9BQU94SSxNQUFNLEdBQUc7QUFFMUQsaUJBQU8sS0FBS1YsWUFBWWlELENBQUU7O01BRTlCOztBQUdGLFdBQU87RUFDVDtFQU1Bb0csWUFBWUMsR0FBRztBQUNiLFVBQU0zRSxPQUFPLEtBQUs3RTtBQUNsQixRQUFJLENBQUN5SixXQUFXRCxFQUFFRSxNQUFNN0UsSUFBTyxHQUFBO0FBQzdCOztBQUlGLFVBQU04RSxjQUFjLEtBQUtSLGlCQUFpQkssRUFBRWhGLEdBQUdnRixFQUFFbEUsQ0FBQztBQUVsRCxRQUFJa0UsRUFBRUUsU0FBUyxlQUFlRixFQUFFRSxTQUFTLFlBQVk7QUFDbkQsWUFBTUUsV0FBVyxLQUFLL0o7QUFDdEIsWUFBTWdLLFdBQVczSyxXQUFXMEssVUFBVUQsV0FBQUE7QUFDdEMsVUFBSUMsWUFBWSxDQUFDQyxVQUFVO0FBQ3pCcEksaUJBQUtvRCxLQUFLaUYsU0FBUztVQUFDTjtVQUFHSTtVQUFVO1FBQUssR0FBRSxJQUFJOztBQUc5QyxXQUFLL0osZUFBZThKO0FBRXBCLFVBQUlBLGVBQWUsQ0FBQ0UsVUFBVTtBQUM1QnBJLGlCQUFLb0QsS0FBS2tGLFNBQVM7VUFBQ1A7VUFBR0c7VUFBYTtRQUFLLEdBQUUsSUFBSTs7SUFFbkQsV0FBV0EsYUFBYTtBQUN0QmxJLGVBQUtvRCxLQUFLbUYsU0FBUztRQUFDUjtRQUFHRztRQUFhO01BQUssR0FBRSxJQUFJOztFQUVuRDtBQUNGO0FBRUEsU0FBUzdGLGtCQUFrQm5GLFVBQVVzRCxXQUFXaEMsS0FBS2lELFlBQVlNLGFBQWE7QUFDNUUsUUFBTUosWUFBWTZHLG1CQUFtQi9HLFlBQVl2RSxVQUFVc0QsV0FBV2hDLEdBQUFBO0FBQ3RFLFFBQU1qQixhQUFha0wsb0JBQW9CMUcsYUFBYU4sWUFBWWpCLFVBQVVXLFVBQVU7QUFDcEYsU0FBTztJQUFDUTtJQUFXcEU7RUFBVTtBQUMvQjtBQUVBLFNBQVNpTCxtQkFBbUIvRyxZQUFZdkUsVUFBVXNELFdBQVdoQyxLQUFLO0FBQ2hFLE1BQUlrSyxpQkFBaUJqSCxXQUFXSTtBQUNoQyxNQUFJNkcsa0JBQWtCLE9BQU9BLG1CQUFtQixVQUFVO0FBQ3hEQSxxQkFBaUJBLGVBQWVuQixPQUFPLENBQUM3SixHQUFHQyxNQUFNRCxFQUFFb0UsU0FBU25FLEVBQUVtRSxTQUFTcEUsSUFBSUMsQ0FBQzs7QUFFOUUsU0FBT1QsV0FBWXNELFVBQVVHLE9BQU8sSUFBS25DLElBQUlvRCxZQUFZOEcsY0FBQUEsRUFBZ0J0SjtBQUMzRTtBQUVBLFNBQVNxSixvQkFBb0IxRyxhQUFhTixZQUFZcUYsZ0JBQWdCO0FBQ3BFLE1BQUl2SixhQUFhd0U7QUFDakIsTUFBSSxPQUFPTixXQUFXSSxTQUFTLFVBQVU7QUFDdkN0RSxpQkFBYXdKLDBCQUEwQnRGLFlBQVlxRixjQUFBQTs7QUFFckQsU0FBT3ZKO0FBQ1Q7QUFFQSxTQUFTd0osMEJBQTBCdEYsWUFBWXFGLGdCQUFnQjtBQUM3RCxRQUFNNkIsY0FBY2xILFdBQVdJLE9BQU9KLFdBQVdJLEtBQUtDLFNBQVM7QUFDL0QsU0FBT2dGLGlCQUFpQjZCO0FBQzFCO0FBRUEsU0FBU1gsV0FBV0MsTUFBTTdFLE1BQU07QUFDOUIsT0FBSzZFLFNBQVMsZUFBZUEsU0FBUyxnQkFBZ0I3RSxLQUFLa0YsV0FBV2xGLEtBQUtpRixVQUFVO0FBQ25GLFdBQU87O0FBRVQsTUFBSWpGLEtBQUttRixZQUFZTixTQUFTLFdBQVdBLFNBQVMsWUFBWTtBQUM1RCxXQUFPOztBQUVULFNBQU87QUFDVDtBQUVBLElBQUEsZ0JBQWU7RUFDYlcsSUFBSTtFQU1KQyxVQUFVL0s7RUFFVmdMLE1BQU14SyxPQUFPeUssT0FBT3hLLFNBQVM7QUFDM0IsVUFBTXlLLFNBQVMxSyxNQUFNMEssU0FBUyxJQUFJbEwsT0FBTztNQUFDVSxLQUFLRixNQUFNRTtNQUFLRDtNQUFTRDtJQUFLLENBQUE7QUFDeEUySyxZQUFRQyxVQUFVNUssT0FBTzBLLFFBQVF6SyxPQUFBQTtBQUNqQzBLLFlBQVFFLE9BQU83SyxPQUFPMEssTUFBQUE7RUFDeEI7RUFFQUksS0FBSzlLLE9BQU87QUFDVjJLLFlBQVFJLFVBQVUvSyxPQUFPQSxNQUFNMEssTUFBTTtBQUNyQyxXQUFPMUssTUFBTTBLO0VBQ2Y7RUFLQU0sYUFBYWhMLE9BQU95SyxPQUFPeEssU0FBUztBQUNsQyxVQUFNeUssU0FBUzFLLE1BQU0wSztBQUNyQkMsWUFBUUMsVUFBVTVLLE9BQU8wSyxRQUFRekssT0FBQUE7QUFDakN5SyxXQUFPekssVUFBVUE7RUFDbkI7RUFJQWdMLFlBQVlqTCxPQUFPO0FBQ2pCLFVBQU0wSyxTQUFTMUssTUFBTTBLO0FBQ3JCQSxXQUFPcEosWUFBVztBQUNsQm9KLFdBQU96RyxlQUFjO0VBQ3ZCO0VBR0FpSCxXQUFXbEwsT0FBT21MLE1BQU07QUFDdEIsUUFBSSxDQUFDQSxLQUFLQyxRQUFRO0FBQ2hCcEwsWUFBTTBLLE9BQU9sQixZQUFZMkIsS0FBS0UsS0FBSzs7RUFFdkM7RUFFQXJHLFVBQVU7SUFDUi9DLFNBQVM7SUFDVGpCLFVBQVU7SUFDVmtELE9BQU87SUFDUGhELFVBQVU7SUFDVmMsU0FBUztJQUNUZixRQUFRO0lBR1JnSixRQUFRUixHQUFHdEcsWUFBWXVILFFBQVE7QUFDN0IsWUFBTW5MLFFBQVE0RCxXQUFXN0Q7QUFDekIsWUFBTWdNLEtBQUtaLE9BQU8xSztBQUNsQixVQUFJc0wsR0FBR0MsaUJBQWlCaE0sS0FBUSxHQUFBO0FBQzlCK0wsV0FBR0UsS0FBS2pNLEtBQUFBO0FBQ1I0RCxtQkFBVzRFLFNBQVM7YUFDZjtBQUNMdUQsV0FBR0csS0FBS2xNLEtBQUFBO0FBQ1I0RCxtQkFBVzRFLFNBQVM7O0lBRXhCO0lBRUFpQyxTQUFTO0lBQ1RELFNBQVM7SUFFVHRJLFFBQVE7TUFDTndELE9BQU8sQ0FBQy9FLFFBQVFBLElBQUlGLE1BQU1DLFFBQVFnRjtNQUNsQ3JHLFVBQVU7TUFDVitELFNBQVM7TUFZVGhCLGVBQWUzQixPQUFPO0FBQ3BCLGNBQU0wTCxXQUFXMUwsTUFBTThCLEtBQUs0SjtBQUM1QixjQUFNLEVBQUNqSyxRQUFRLEVBQUM1QyxlQUFld0gsWUFBWXRELFdBQVdrQyxPQUFBQSxRQUFPMEcsaUJBQWlCN0UsYUFBQUEsRUFBYSxJQUFJOUcsTUFBTTBLLE9BQU96SztBQUU1RyxlQUFPRCxNQUFNNEwsdUJBQXNCLEVBQUdDLElBQUksQ0FBQ0MsU0FBUztBQUNsRCxnQkFBTUMsUUFBUUQsS0FBS0UsV0FBV0MsU0FBU3BOLGdCQUFnQixJQUFJdUIsTUFBUztBQUNwRSxnQkFBTW1HLGNBQWN3QyxVQUFVZ0QsTUFBTXhGLFdBQVc7QUFFL0MsaUJBQU87WUFDTGhELE1BQU1tSSxTQUFTSSxLQUFLdk0sS0FBSyxFQUFFMk07WUFDM0J2RyxXQUFXb0csTUFBTUk7WUFDakJoRSxXQUFXbEQ7WUFDWDhDLFFBQVEsQ0FBQytELEtBQUtNO1lBQ2R4RyxTQUFTbUcsTUFBTU07WUFDZnBHLFVBQVU4RixNQUFNTztZQUNoQnpHLGdCQUFnQmtHLE1BQU1RO1lBQ3RCekcsVUFBVWlHLE1BQU1TO1lBQ2hCbkgsWUFBWWtCLFlBQVl6RixRQUFReUYsWUFBWTFGLFVBQVU7WUFDdERrRixhQUFhZ0csTUFBTVU7WUFDbkJwRyxZQUFZQSxjQUFjMEYsTUFBTTFGO1lBQ2hDQyxVQUFVeUYsTUFBTXpGO1lBQ2hCdkQsV0FBV0EsYUFBYWdKLE1BQU1oSjtZQUM5QitELGNBQWM2RSxvQkFBb0I3RSxnQkFBZ0JpRixNQUFNakY7WUFHeER4SCxjQUFjd00sS0FBS3ZNO1VBQ3JCO1FBQ0YsR0FBRyxJQUFJO01BQ1Q7SUFDRjtJQUVBcUosT0FBTztNQUNMM0QsT0FBTyxDQUFDL0UsUUFBUUEsSUFBSUYsTUFBTUMsUUFBUWdGO01BQ2xDaEQsU0FBUztNQUNUakIsVUFBVTtNQUNWdUMsTUFBTTtJQUNSO0VBQ0Y7RUFFQW1KLGFBQWE7SUFDWEMsYUFBYSxDQUFDQyxTQUFTLENBQUNBLEtBQUtDLFdBQVcsSUFBQTtJQUN4Q3BMLFFBQVE7TUFDTmtMLGFBQWEsQ0FBQ0MsU0FBUyxDQUFDO1FBQUM7UUFBa0I7UUFBVTtNQUFPLEVBQUNFLFNBQVNGLElBQUFBO0lBQ3hFO0VBQ0Y7QUFDRjtBQ3pzQk8sSUFBTUcsUUFBTixjQUFvQnROLFFBQUFBO0VBSXpCQyxZQUFZQyxRQUFRO0FBQ2xCLFVBQUs7QUFFTCxTQUFLSyxRQUFRTCxPQUFPSztBQUNwQixTQUFLQyxVQUFVTixPQUFPTTtBQUN0QixTQUFLQyxNQUFNUCxPQUFPTztBQUNsQixTQUFLOE0sV0FBVzVNO0FBQ2hCLFNBQUtLLE1BQU1MO0FBQ1gsU0FBS00sU0FBU047QUFDZCxTQUFLTyxPQUFPUDtBQUNaLFNBQUtRLFFBQVFSO0FBQ2IsU0FBS1UsUUFBUVY7QUFDYixTQUFLUyxTQUFTVDtBQUNkLFNBQUtZLFdBQVdaO0FBQ2hCLFNBQUthLFNBQVNiO0FBQ2QsU0FBS2MsV0FBV2Q7RUFDbEI7RUFFQWUsT0FBT1gsVUFBVUQsV0FBVztBQUMxQixVQUFNdUUsT0FBTyxLQUFLN0U7QUFFbEIsU0FBS1UsT0FBTztBQUNaLFNBQUtGLE1BQU07QUFFWCxRQUFJLENBQUNxRSxLQUFLN0MsU0FBUztBQUNqQixXQUFLbkIsUUFBUSxLQUFLRCxTQUFTLEtBQUtELFFBQVEsS0FBS0YsU0FBUztBQUN0RDs7QUFHRixTQUFLSSxRQUFRLEtBQUtGLFFBQVFKO0FBQzFCLFNBQUtLLFNBQVMsS0FBS0gsU0FBU0g7QUFFNUIsVUFBTTBNLFlBQVlDLFFBQVFwSSxLQUFLdkIsSUFBSSxJQUFJdUIsS0FBS3ZCLEtBQUtDLFNBQVM7QUFDMUQsU0FBS3dKLFdBQVdqRSxVQUFVakUsS0FBS25DLE9BQU87QUFDdEMsVUFBTXdLLFdBQVdGLFlBQVk5SyxPQUFPMkMsS0FBSzFDLElBQUksRUFBRVMsYUFBYSxLQUFLbUssU0FBU25NO0FBRTFFLFFBQUksS0FBS1csYUFBWSxHQUFJO0FBQ3ZCLFdBQUtYLFNBQVNzTTtXQUNUO0FBQ0wsV0FBS3JNLFFBQVFxTTs7RUFFakI7RUFFQTNMLGVBQWU7QUFDYixVQUFNNEwsTUFBTSxLQUFLbk4sUUFBUWU7QUFDekIsV0FBT29NLFFBQVEsU0FBU0EsUUFBUTtFQUNsQztFQUVBQyxVQUFVQyxRQUFRO0FBQ2hCLFVBQU0sRUFBQzdNLEtBQUtFLE1BQU1ELFFBQVFFLE9BQU9YLFFBQUFBLElBQVc7QUFDNUMsVUFBTWlFLFFBQVFqRSxRQUFRaUU7QUFDdEIsUUFBSW9DLFdBQVc7QUFDZixRQUFJOUYsVUFBVStNLFFBQVFDO0FBRXRCLFFBQUksS0FBS2hNLGFBQVksR0FBSTtBQUN2QitMLGVBQVNqSixlQUFlSixPQUFPdkQsTUFBTUMsS0FBQUE7QUFDckM0TSxlQUFTL00sTUFBTTZNO0FBQ2Y5TSxpQkFBV0ksUUFBUUQ7V0FDZDtBQUNMLFVBQUlWLFFBQVFlLGFBQWEsUUFBUTtBQUMvQnVNLGlCQUFTNU0sT0FBTzJNO0FBQ2hCRSxpQkFBU2xKLGVBQWVKLE9BQU94RCxRQUFRRCxHQUFBQTtBQUN2QzZGLG1CQUFXbUgsS0FBSzthQUNYO0FBQ0xGLGlCQUFTM00sUUFBUTBNO0FBQ2pCRSxpQkFBU2xKLGVBQWVKLE9BQU96RCxLQUFLQyxNQUFBQTtBQUNwQzRGLG1CQUFXbUgsS0FBSzs7QUFFbEJqTixpQkFBV0UsU0FBU0Q7O0FBRXRCLFdBQU87TUFBQzhNO01BQVFDO01BQVFoTjtNQUFVOEY7SUFBUTtFQUM1QztFQUVBNUIsT0FBTztBQUNMLFVBQU14RSxNQUFNLEtBQUtBO0FBQ2pCLFVBQU00RSxPQUFPLEtBQUs3RTtBQUVsQixRQUFJLENBQUM2RSxLQUFLN0MsU0FBUztBQUNqQjs7QUFHRixVQUFNeUwsV0FBV3ZMLE9BQU8yQyxLQUFLMUMsSUFBSTtBQUNqQyxVQUFNUyxhQUFhNkssU0FBUzdLO0FBQzVCLFVBQU15SyxTQUFTekssYUFBYSxJQUFJLEtBQUttSyxTQUFTdk07QUFDOUMsVUFBTSxFQUFDOE0sUUFBUUMsUUFBUWhOLFVBQVU4RixTQUFBQSxJQUFZLEtBQUsrRyxVQUFVQyxNQUFBQTtBQUU1RHpGLGVBQVczSCxLQUFLNEUsS0FBS3ZCLE1BQU0sR0FBRyxHQUFHbUssVUFBVTtNQUN6Q3pJLE9BQU9ILEtBQUtHO01BQ1p6RTtNQUNBOEY7TUFDQXZELFdBQVdvRyxtQkFBbUJyRSxLQUFLWixLQUFLO01BQ3hDbEIsY0FBYztNQUNkMkssYUFBYTtRQUFDSjtRQUFRQztNQUFPO0lBQy9CLENBQUE7RUFDRjtBQUNGO0FBRUEsU0FBU0ksWUFBWTVOLE9BQU8ySSxXQUFXO0FBQ3JDLFFBQU1DLFFBQVEsSUFBSW1FLE1BQU07SUFDdEI3TSxLQUFLRixNQUFNRTtJQUNYRCxTQUFTMEk7SUFDVDNJO0VBQ0YsQ0FBQTtBQUVBMkssVUFBUUMsVUFBVTVLLE9BQU80SSxPQUFPRCxTQUFBQTtBQUNoQ2dDLFVBQVFFLE9BQU83SyxPQUFPNEksS0FBQUE7QUFDdEI1SSxRQUFNNk4sYUFBYWpGO0FBQ3JCO0FBRUEsSUFBQSxlQUFlO0VBQ2IwQixJQUFJO0VBTUpDLFVBQVV3QztFQUVWdkMsTUFBTXhLLE9BQU95SyxPQUFPeEssU0FBUztBQUMzQjJOLGdCQUFZNU4sT0FBT0MsT0FBQUE7RUFDckI7RUFFQTZLLEtBQUs5SyxPQUFPO0FBQ1YsVUFBTTZOLGFBQWE3TixNQUFNNk47QUFDekJsRCxZQUFRSSxVQUFVL0ssT0FBTzZOLFVBQUFBO0FBQ3pCLFdBQU83TixNQUFNNk47RUFDZjtFQUVBN0MsYUFBYWhMLE9BQU95SyxPQUFPeEssU0FBUztBQUNsQyxVQUFNMkksUUFBUTVJLE1BQU02TjtBQUNwQmxELFlBQVFDLFVBQVU1SyxPQUFPNEksT0FBTzNJLE9BQUFBO0FBQ2hDMkksVUFBTTNJLFVBQVVBO0VBQ2xCO0VBRUErRSxVQUFVO0lBQ1JkLE9BQU87SUFDUGpDLFNBQVM7SUFDVEcsTUFBTTtNQUNKbkIsUUFBUTtJQUNWO0lBQ0FDLFVBQVU7SUFDVnlCLFNBQVM7SUFDVDNCLFVBQVU7SUFDVnVDLE1BQU07SUFDTnRDLFFBQVE7RUFDVjtFQUVBNk0sZUFBZTtJQUNiN0ksT0FBTztFQUNUO0VBRUF5SCxhQUFhO0lBQ1hDLGFBQWE7SUFDYm9CLFlBQVk7RUFDZDtBQUNGO0FDbEtBLElBQU1sQyxPQUFNLG9CQUFJbUMsUUFBQUE7QUFFaEIsSUFBQSxrQkFBZTtFQUNiMUQsSUFBSTtFQUVKRSxNQUFNeEssT0FBT3lLLE9BQU94SyxTQUFTO0FBQzNCLFVBQU0ySSxRQUFRLElBQUltRSxNQUFNO01BQ3RCN00sS0FBS0YsTUFBTUU7TUFDWEQ7TUFDQUQ7SUFDRixDQUFBO0FBRUEySyxZQUFRQyxVQUFVNUssT0FBTzRJLE9BQU8zSSxPQUFBQTtBQUNoQzBLLFlBQVFFLE9BQU83SyxPQUFPNEksS0FBQUE7QUFDdEJpRCxJQUFBQSxLQUFJb0MsSUFBSWpPLE9BQU80SSxLQUFBQTtFQUNqQjtFQUVBa0MsS0FBSzlLLE9BQU87QUFDVjJLLFlBQVFJLFVBQVUvSyxPQUFPNkwsS0FBSXFDLElBQUlsTyxLQUFBQSxDQUFBQTtBQUNqQzZMLElBQUFBLEtBQUlzQyxPQUFPbk8sS0FBQUE7RUFDYjtFQUVBZ0wsYUFBYWhMLE9BQU95SyxPQUFPeEssU0FBUztBQUNsQyxVQUFNMkksUUFBUWlELEtBQUlxQyxJQUFJbE8sS0FBQUE7QUFDdEIySyxZQUFRQyxVQUFVNUssT0FBTzRJLE9BQU8zSSxPQUFBQTtBQUNoQzJJLFVBQU0zSSxVQUFVQTtFQUNsQjtFQUVBK0UsVUFBVTtJQUNSZCxPQUFPO0lBQ1BqQyxTQUFTO0lBQ1RHLE1BQU07TUFDSm5CLFFBQVE7SUFDVjtJQUNBQyxVQUFVO0lBQ1Z5QixTQUFTO0lBQ1QzQixVQUFVO0lBQ1Z1QyxNQUFNO0lBQ050QyxRQUFRO0VBQ1Y7RUFFQTZNLGVBQWU7SUFDYjdJLE9BQU87RUFDVDtFQUVBeUgsYUFBYTtJQUNYQyxhQUFhO0lBQ2JvQixZQUFZO0VBQ2Q7QUFDRjtBQ3BDQSxJQUFNSyxjQUFjO0VBSWxCQyxRQUFRQyxPQUFPO0FBQ2IsUUFBSSxDQUFDQSxNQUFNOUssUUFBUTtBQUNqQixhQUFPOztBQUdULFFBQUlKLEdBQUdtTDtBQUNQLFFBQUk5SixJQUFJO0FBQ1IsUUFBSWMsSUFBSTtBQUNSLFFBQUlpSixRQUFRO0FBRVosU0FBS3BMLElBQUksR0FBR21MLE1BQU1ELE1BQU05SyxRQUFRSixJQUFJbUwsS0FBSyxFQUFFbkwsR0FBRztBQUM1QyxZQUFNcUwsS0FBS0gsTUFBTWxMLENBQUFBLEVBQUdzTDtBQUNwQixVQUFJRCxNQUFNQSxHQUFHRSxTQUFRLEdBQUk7QUFDdkIsY0FBTXZCLE1BQU1xQixHQUFHRyxnQkFBZTtBQUM5Qm5LLGFBQUsySSxJQUFJM0k7QUFDVGMsYUFBSzZILElBQUk3SDtBQUNULFVBQUVpSjs7SUFFTjtBQUVBLFdBQU87TUFDTC9KLEdBQUdBLElBQUkrSjtNQUNQakosR0FBR0EsSUFBSWlKO0lBQ1Q7RUFDRjtFQUtBSyxRQUFRUCxPQUFPUSxlQUFlO0FBQzVCLFFBQUksQ0FBQ1IsTUFBTTlLLFFBQVE7QUFDakIsYUFBTzs7QUFHVCxRQUFJaUIsSUFBSXFLLGNBQWNySztBQUN0QixRQUFJYyxJQUFJdUosY0FBY3ZKO0FBQ3RCLFFBQUl3SixjQUFjQyxPQUFPQztBQUN6QixRQUFJN0wsR0FBR21MLEtBQUtXO0FBRVosU0FBSzlMLElBQUksR0FBR21MLE1BQU1ELE1BQU05SyxRQUFRSixJQUFJbUwsS0FBSyxFQUFFbkwsR0FBRztBQUM1QyxZQUFNcUwsS0FBS0gsTUFBTWxMLENBQUFBLEVBQUdzTDtBQUNwQixVQUFJRCxNQUFNQSxHQUFHRSxTQUFRLEdBQUk7QUFDdkIsY0FBTVEsU0FBU1YsR0FBR1csZUFBYztBQUNoQyxjQUFNQyxJQUFJQyxzQkFBc0JSLGVBQWVLLE1BQUFBO0FBRS9DLFlBQUlFLElBQUlOLGFBQWE7QUFDbkJBLHdCQUFjTTtBQUNkSCwyQkFBaUJUOzs7SUFHdkI7QUFFQSxRQUFJUyxnQkFBZ0I7QUFDbEIsWUFBTUssS0FBS0wsZUFBZU4sZ0JBQWU7QUFDekNuSyxVQUFJOEssR0FBRzlLO0FBQ1BjLFVBQUlnSyxHQUFHaEs7O0FBR1QsV0FBTztNQUNMZDtNQUNBYztJQUNGO0VBQ0Y7QUFDRjtBQUdBLFNBQVNpSyxhQUFhQyxNQUFNQyxRQUFRO0FBQ2xDLE1BQUlBLFFBQVE7QUFDVixRQUFJeEMsUUFBUXdDLE1BQVMsR0FBQTtBQUVuQkMsWUFBTUMsVUFBVTVMLEtBQUs2TCxNQUFNSixNQUFNQyxNQUFBQTtXQUM1QjtBQUNMRCxXQUFLekwsS0FBSzBMLE1BQUFBOzs7QUFJZCxTQUFPRDtBQUNUO0FBUUEsU0FBU0ssY0FBY0MsS0FBSztBQUMxQixPQUFLLE9BQU9BLFFBQVEsWUFBWUEsZUFBZUMsV0FBV0QsSUFBSUUsUUFBUSxJQUFBLElBQVEsSUFBSTtBQUNoRixXQUFPRixJQUFJRyxNQUFNLElBQUE7O0FBRW5CLFNBQU9IO0FBQ1Q7QUFTQSxTQUFTSSxrQkFBa0JuUSxPQUFPNkIsTUFBTTtBQUN0QyxRQUFNLEVBQUM2TSxTQUFTcFAsY0FBY0MsTUFBQUEsSUFBU3NDO0FBQ3ZDLFFBQU1tSyxhQUFhaE0sTUFBTW9RLGVBQWU5USxZQUFBQSxFQUFjME07QUFDdEQsUUFBTSxFQUFDRSxPQUFPbUUsTUFBQUEsSUFBU3JFLFdBQVdzRSxpQkFBaUIvUSxLQUFBQTtBQUVuRCxTQUFPO0lBQ0xTO0lBQ0FrTTtJQUNBcUUsUUFBUXZFLFdBQVd3RSxVQUFValIsS0FBQUE7SUFDN0JrUixLQUFLelEsTUFBTThCLEtBQUs0SixTQUFTcE0sWUFBYSxFQUFDd0MsS0FBS3ZDLEtBQU07SUFDbERtUixnQkFBZ0JMO0lBQ2hCTSxTQUFTM0UsV0FBVzRFLFdBQVU7SUFDOUJDLFdBQVd0UjtJQUNYRDtJQUNBb1A7RUFDRjtBQUNGO0FBS0EsU0FBU29DLGVBQWVDLFNBQVM5USxTQUFTO0FBQ3hDLFFBQU1DLE1BQU02USxRQUFRL1EsTUFBTUU7QUFDMUIsUUFBTSxFQUFDOFEsTUFBTUMsUUFBUXJJLE1BQUFBLElBQVNtSTtBQUM5QixRQUFNLEVBQUNuUyxVQUFVRCxVQUFBQSxJQUFhc0I7QUFDOUIsUUFBTWlSLFdBQVcvTyxPQUFPbEMsUUFBUWlSLFFBQVE7QUFDeEMsUUFBTXJJLFlBQVkxRyxPQUFPbEMsUUFBUTRJLFNBQVM7QUFDMUMsUUFBTXNJLGFBQWFoUCxPQUFPbEMsUUFBUWtSLFVBQVU7QUFDNUMsUUFBTUMsaUJBQWlCeEksTUFBTXBGO0FBQzdCLFFBQU02TixrQkFBa0JKLE9BQU96TjtBQUMvQixRQUFNOE4sb0JBQW9CTixLQUFLeE47QUFFL0IsUUFBTWIsVUFBVW9HLFVBQVU5SSxRQUFRMEMsT0FBTztBQUN6QyxNQUFJOUIsU0FBUzhCLFFBQVE5QjtBQUNyQixNQUFJQyxRQUFRO0FBR1osTUFBSXlRLHFCQUFxQlAsS0FBSy9ILE9BQU8sQ0FBQ3VGLE9BQU9nRCxhQUFhaEQsUUFBUWdELFNBQVNDLE9BQU9qTyxTQUFTZ08sU0FBU0UsTUFBTWxPLFNBQVNnTyxTQUFTRyxNQUFNbk8sUUFBUSxDQUFBO0FBQzFJK04sd0JBQXNCUixRQUFRYSxXQUFXcE8sU0FBU3VOLFFBQVFjLFVBQVVyTztBQUVwRSxNQUFJNE4sZ0JBQWdCO0FBQ2xCdlEsY0FBVXVRLGlCQUFpQnZJLFVBQVVoRyxjQUNuQ3VPLGlCQUFpQixLQUFLblIsUUFBUTZSLGVBQy9CN1IsUUFBUThSOztBQUVYLE1BQUlSLG9CQUFvQjtBQUV0QixVQUFNUyxpQkFBaUIvUixRQUFRZ1MsZ0JBQWdCblQsS0FBS0ksSUFBSVAsV0FBV3VTLFNBQVNyTyxVQUFVLElBQUlxTyxTQUFTck87QUFDbkdoQyxjQUFVeVEsb0JBQW9CVSxrQkFDNUJULHFCQUFxQkQscUJBQXFCSixTQUFTck8sY0FDbkQwTyxxQkFBcUIsS0FBS3RSLFFBQVFpUzs7QUFFdEMsTUFBSWIsaUJBQWlCO0FBQ25CeFEsY0FBVVosUUFBUWtTLGtCQUNqQmQsa0JBQWtCRixXQUFXdE8sY0FDNUJ3TyxrQkFBa0IsS0FBS3BSLFFBQVFtUzs7QUFJbkMsTUFBSUMsZUFBZTtBQUNuQixRQUFNQyxlQUFlLFNBQVN0SyxNQUFNO0FBQ2xDbEgsWUFBUWhDLEtBQUtJLElBQUk0QixPQUFPWixJQUFJb0QsWUFBWTBFLElBQU1sSCxFQUFBQSxRQUFRdVIsWUFBQUE7RUFDeEQ7QUFFQW5TLE1BQUl1RixLQUFJO0FBRVJ2RixNQUFJa0MsT0FBT3lHLFVBQVVyRztBQUNyQitQLE9BQUt4QixRQUFRbkksT0FBTzBKLFlBQUFBO0FBR3BCcFMsTUFBSWtDLE9BQU84TyxTQUFTMU87QUFDcEIrUCxPQUFLeEIsUUFBUWEsV0FBV1ksT0FBT3pCLFFBQVFjLFNBQVMsR0FBR1MsWUFBQUE7QUFHbkRELGlCQUFlcFMsUUFBUWdTLGdCQUFpQnJULFdBQVcsSUFBSXFCLFFBQVF3UyxhQUFjO0FBQzdFRixPQUFLdkIsTUFBTSxDQUFDUSxhQUFhO0FBQ3ZCZSxTQUFLZixTQUFTQyxRQUFRYSxZQUFBQTtBQUN0QkMsU0FBS2YsU0FBU0UsT0FBT1ksWUFBQUE7QUFDckJDLFNBQUtmLFNBQVNHLE9BQU9XLFlBQUFBO0VBQ3ZCLENBQUE7QUFHQUQsaUJBQWU7QUFHZm5TLE1BQUlrQyxPQUFPK08sV0FBVzNPO0FBQ3RCK1AsT0FBS3hCLFFBQVFFLFFBQVFxQixZQUFBQTtBQUVyQnBTLE1BQUl5SCxRQUFPO0FBR1g3RyxXQUFTNkIsUUFBUTdCO0FBRWpCLFNBQU87SUFBQ0E7SUFBT0Q7RUFBTTtBQUN2QjtBQUVBLFNBQVM2UixnQkFBZ0IxUyxPQUFPcUMsTUFBTTtBQUNwQyxRQUFNLEVBQUNrRCxHQUFHMUUsT0FBQUEsSUFBVXdCO0FBRXBCLE1BQUlrRCxJQUFJMUUsU0FBUyxHQUFHO0FBQ2xCLFdBQU87RUFDVCxXQUFXMEUsSUFBS3ZGLE1BQU1hLFNBQVNBLFNBQVMsR0FBSTtBQUMxQyxXQUFPOztBQUVULFNBQU87QUFDVDtBQUVBLFNBQVM4UixvQkFBb0JDLFFBQVE1UyxPQUFPQyxTQUFTb0MsTUFBTTtBQUN6RCxRQUFNLEVBQUNvQyxHQUFHM0QsTUFBQUEsSUFBU3VCO0FBQ25CLFFBQU13USxRQUFRNVMsUUFBUTZTLFlBQVk3UyxRQUFROFM7QUFDMUMsTUFBSUgsV0FBVyxVQUFVbk8sSUFBSTNELFFBQVErUixRQUFRN1MsTUFBTWMsT0FBTztBQUN4RCxXQUFPOztBQUdULE1BQUk4UixXQUFXLFdBQVduTyxJQUFJM0QsUUFBUStSLFFBQVEsR0FBRztBQUMvQyxXQUFPOztBQUVYO0FBRUEsU0FBU0csZ0JBQWdCaFQsT0FBT0MsU0FBU29DLE1BQU00USxRQUFRO0FBQ3JELFFBQU0sRUFBQ3hPLEdBQUczRCxNQUFBQSxJQUFTdUI7QUFDbkIsUUFBTSxFQUFDdkIsT0FBT29TLFlBQVlDLFdBQVcsRUFBQ3hTLE1BQU1DLE1BQUssRUFBQyxJQUFJWjtBQUN0RCxNQUFJNFMsU0FBUztBQUViLE1BQUlLLFdBQVcsVUFBVTtBQUN2QkwsYUFBU25PLE1BQU05RCxPQUFPQyxTQUFTLElBQUksU0FBUzthQUNuQzZELEtBQUszRCxRQUFRLEdBQUc7QUFDekI4UixhQUFTO0VBQ1gsV0FBV25PLEtBQUt5TyxhQUFhcFMsUUFBUSxHQUFHO0FBQ3RDOFIsYUFBUzs7QUFHWCxNQUFJRCxvQkFBb0JDLFFBQVE1UyxPQUFPQyxTQUFTb0MsSUFBTyxHQUFBO0FBQ3JEdVEsYUFBUzs7QUFHWCxTQUFPQTtBQUNUO0FBS0EsU0FBU1EsbUJBQW1CcFQsT0FBT0MsU0FBU29DLE1BQU07QUFDaEQsUUFBTTRRLFNBQVM1USxLQUFLNFEsVUFBVWhULFFBQVFnVCxVQUFVUCxnQkFBZ0IxUyxPQUFPcUMsSUFBQUE7QUFFdkUsU0FBTztJQUNMdVEsUUFBUXZRLEtBQUt1USxVQUFVM1MsUUFBUTJTLFVBQVVJLGdCQUFnQmhULE9BQU9DLFNBQVNvQyxNQUFNNFEsTUFBQUE7SUFDL0VBO0VBQ0Y7QUFDRjtBQUVBLFNBQVNJLE9BQU9oUixNQUFNdVEsUUFBUTtBQUM1QixNQUFJLEVBQUNuTyxHQUFHM0QsTUFBQUEsSUFBU3VCO0FBQ2pCLE1BQUl1USxXQUFXLFNBQVM7QUFDdEJuTyxTQUFLM0Q7YUFDSThSLFdBQVcsVUFBVTtBQUM5Qm5PLFNBQU0zRCxRQUFROztBQUVoQixTQUFPMkQ7QUFDVDtBQUVBLFNBQVM2TyxPQUFPalIsTUFBTTRRLFFBQVFNLGdCQUFnQjtBQUU1QyxNQUFJLEVBQUNoTyxHQUFHMUUsT0FBQUEsSUFBVXdCO0FBQ2xCLE1BQUk0USxXQUFXLE9BQU87QUFDcEIxTixTQUFLZ087YUFDSU4sV0FBVyxVQUFVO0FBQzlCMU4sU0FBSzFFLFNBQVMwUztTQUNUO0FBQ0xoTyxTQUFNMUUsU0FBUzs7QUFFakIsU0FBTzBFO0FBQ1Q7QUFLQSxTQUFTaU8sbUJBQW1CdlQsU0FBU29DLE1BQU1vUixXQUFXelQsT0FBTztBQUMzRCxRQUFNLEVBQUM4UyxXQUFXQyxjQUFjVyxhQUFBQSxJQUFnQnpUO0FBQ2hELFFBQU0sRUFBQzJTLFFBQVFLLE9BQUFBLElBQVVRO0FBQ3pCLFFBQU1GLGlCQUFpQlQsWUFBWUM7QUFDbkMsUUFBTSxFQUFDWSxTQUFTQyxVQUFVQyxZQUFZQyxZQUFBQSxJQUFlL00sY0FBYzJNLFlBQUFBO0FBRW5FLE1BQUlqUCxJQUFJNE8sT0FBT2hSLE1BQU11USxNQUFBQTtBQUNyQixRQUFNck4sSUFBSStOLE9BQU9qUixNQUFNNFEsUUFBUU0sY0FBQUE7QUFFL0IsTUFBSU4sV0FBVyxVQUFVO0FBQ3ZCLFFBQUlMLFdBQVcsUUFBUTtBQUNyQm5PLFdBQUs4TztlQUNJWCxXQUFXLFNBQVM7QUFDN0JuTyxXQUFLOE87O2FBRUVYLFdBQVcsUUFBUTtBQUM1Qm5PLFNBQUszRixLQUFLSSxJQUFJeVUsU0FBU0UsVUFBY2YsSUFBQUE7YUFDNUJGLFdBQVcsU0FBUztBQUM3Qm5PLFNBQUszRixLQUFLSSxJQUFJMFUsVUFBVUUsV0FBZWhCLElBQUFBOztBQUd6QyxTQUFPO0lBQ0xyTyxHQUFHc1AsWUFBWXRQLEdBQUcsR0FBR3pFLE1BQU1jLFFBQVF1QixLQUFLdkIsS0FBSztJQUM3Q3lFLEdBQUd3TyxZQUFZeE8sR0FBRyxHQUFHdkYsTUFBTWEsU0FBU3dCLEtBQUt4QixNQUFNO0VBQ2pEO0FBQ0Y7QUFFQSxTQUFTbVQsWUFBWWpELFNBQVM3TSxPQUFPakUsU0FBUztBQUM1QyxRQUFNMEMsVUFBVW9HLFVBQVU5SSxRQUFRMEMsT0FBTztBQUV6QyxTQUFPdUIsVUFBVSxXQUNiNk0sUUFBUXRNLElBQUlzTSxRQUFRalEsUUFBUSxJQUM1Qm9ELFVBQVUsVUFDUjZNLFFBQVF0TSxJQUFJc00sUUFBUWpRLFFBQVE2QixRQUFRL0IsUUFDcENtUSxRQUFRdE0sSUFBSTlCLFFBQVFoQztBQUM1QjtBQUtBLFNBQVNzVCx3QkFBd0JDLFdBQVU7QUFDekMsU0FBTzFFLGFBQWEsQ0FBQSxHQUFJTSxjQUFjb0UsU0FBQUEsQ0FBQUE7QUFDeEM7QUFFQSxTQUFTQyxxQkFBcUJDLFFBQVFyRCxTQUFTc0QsY0FBYztBQUMzRCxTQUFPQyxjQUFjRixRQUFRO0lBQzNCckQ7SUFDQXNEO0lBQ0ExSyxNQUFNO0VBQ1IsQ0FBQTtBQUNGO0FBRUEsU0FBUzRLLGtCQUFrQkMsV0FBV0MsU0FBUztBQUM3QyxRQUFNQyxXQUFXRCxXQUFXQSxRQUFROUQsV0FBVzhELFFBQVE5RCxRQUFRSSxXQUFXMEQsUUFBUTlELFFBQVFJLFFBQVF5RDtBQUNsRyxTQUFPRSxXQUFXRixVQUFVRSxTQUFTQSxRQUFBQSxJQUFZRjtBQUNuRDtBQUVBLElBQU1HLG1CQUFtQjtFQUV2QkMsYUFBYUM7RUFDYmpNLE1BQU15TCxjQUFjO0FBQ2xCLFFBQUlBLGFBQWE3USxTQUFTLEdBQUc7QUFDM0IsWUFBTTNCLE9BQU93UyxhQUFhLENBQUU7QUFDNUIsWUFBTTVTLFNBQVNJLEtBQUs3QixNQUFNOEIsS0FBS0w7QUFDL0IsWUFBTXFULGFBQWFyVCxTQUFTQSxPQUFPK0IsU0FBUztBQUU1QyxVQUFJLFFBQVEsS0FBS3ZELFdBQVcsS0FBS0EsUUFBUThVLFNBQVMsV0FBVztBQUMzRCxlQUFPbFQsS0FBSzhPLFFBQVF6RSxTQUFTO2lCQUNwQnJLLEtBQUtxSyxPQUFPO0FBQ3JCLGVBQU9ySyxLQUFLcUs7TUFDZCxXQUFXNEksYUFBYSxLQUFLalQsS0FBS2dQLFlBQVlpRSxZQUFZO0FBQ3hELGVBQU9yVCxPQUFPSSxLQUFLZ1AsU0FBUzs7O0FBSWhDLFdBQU87RUFDVDtFQUNBbUUsWUFBWUg7RUFHWmpELFlBQVlpRDtFQUdaSSxhQUFhSjtFQUNiM0ksTUFBTWdKLGFBQWE7QUFDakIsUUFBSSxRQUFRLEtBQUtqVixXQUFXLEtBQUtBLFFBQVE4VSxTQUFTLFdBQVc7QUFDM0QsYUFBT0csWUFBWWhKLFFBQVEsT0FBT2dKLFlBQVl4RSxrQkFBa0J3RSxZQUFZeEU7O0FBRzlFLFFBQUl4RSxRQUFRZ0osWUFBWXZFLFFBQVF6RSxTQUFTO0FBRXpDLFFBQUlBLE9BQU87QUFDVEEsZUFBUzs7QUFFWCxVQUFNbUUsUUFBUTZFLFlBQVl4RTtBQUMxQixRQUFJLENBQUN5RSxjQUFjOUUsS0FBUSxHQUFBO0FBQ3pCbkUsZUFBU21FOztBQUVYLFdBQU9uRTtFQUNUO0VBQ0FrSixXQUFXRixhQUFhO0FBQ3RCLFVBQU1wSixPQUFPb0osWUFBWWxWLE1BQU1vUSxlQUFlOEUsWUFBWTVWLFlBQVk7QUFDdEUsVUFBTVcsVUFBVTZMLEtBQUtFLFdBQVdDLFNBQVNpSixZQUFZckUsU0FBUztBQUM5RCxXQUFPO01BQ0xwRSxhQUFheE0sUUFBUXdNO01BQ3JCTixpQkFBaUJsTSxRQUFRa007TUFDekI1RixhQUFhdEcsUUFBUXNHO01BQ3JCK0YsWUFBWXJNLFFBQVFxTTtNQUNwQkMsa0JBQWtCdE0sUUFBUXNNO01BQzFCekYsY0FBYztJQUNoQjtFQUNGO0VBQ0F1TyxpQkFBaUI7QUFDZixXQUFPLEtBQUtwVixRQUFRcVY7RUFDdEI7RUFDQUMsZ0JBQWdCTCxhQUFhO0FBQzNCLFVBQU1wSixPQUFPb0osWUFBWWxWLE1BQU1vUSxlQUFlOEUsWUFBWTVWLFlBQVk7QUFDdEUsVUFBTVcsVUFBVTZMLEtBQUtFLFdBQVdDLFNBQVNpSixZQUFZckUsU0FBUztBQUM5RCxXQUFPO01BQ0x4SyxZQUFZcEcsUUFBUW9HO01BQ3BCQyxVQUFVckcsUUFBUXFHO0lBQ3BCO0VBQ0Y7RUFDQWtQLFlBQVlYO0VBR1poRCxXQUFXZ0Q7RUFHWFksY0FBY1o7RUFDZDVELFFBQVE0RDtFQUNSYSxhQUFhYjtBQUNmO0FBV0EsU0FBU2MsMkJBQTJCbkIsV0FBVzVILE1BQU0xTSxLQUFLMFYsS0FBSztBQUM3RCxRQUFNQyxTQUFTckIsVUFBVTVILElBQUFBLEVBQU1sTCxLQUFLeEIsS0FBSzBWLEdBQUFBO0FBRXpDLE1BQUksT0FBT0MsV0FBVyxhQUFhO0FBQ2pDLFdBQU9sQixpQkFBaUIvSCxJQUFBQSxFQUFNbEwsS0FBS3hCLEtBQUswVixHQUFBQTs7QUFHMUMsU0FBT0M7QUFDVDtBQUVPLElBQU1DLFVBQU4sY0FBc0JyVyxRQUFBQTtFQU8zQkMsWUFBWUMsUUFBUTtBQUNsQixVQUFLO0FBRUwsU0FBS29XLFVBQVU7QUFDZixTQUFLQyxVQUFVLENBQUE7QUFDZixTQUFLQyxpQkFBaUI3VjtBQUN0QixTQUFLOFYsUUFBUTlWO0FBQ2IsU0FBSytWLG9CQUFvQi9WO0FBQ3pCLFNBQUtnVyxnQkFBZ0IsQ0FBQTtBQUNyQixTQUFLQyxjQUFjalc7QUFDbkIsU0FBS2tXLFdBQVdsVztBQUNoQixTQUFLSixRQUFRTCxPQUFPSztBQUNwQixTQUFLQyxVQUFVTixPQUFPTTtBQUN0QixTQUFLc1csYUFBYW5XO0FBQ2xCLFNBQUt3SSxRQUFReEk7QUFDYixTQUFLd1IsYUFBYXhSO0FBQ2xCLFNBQUs0USxPQUFPNVE7QUFDWixTQUFLeVIsWUFBWXpSO0FBQ2pCLFNBQUs2USxTQUFTN1E7QUFDZCxTQUFLd1MsU0FBU3hTO0FBQ2QsU0FBSzZTLFNBQVM3UztBQUNkLFNBQUtxRSxJQUFJckU7QUFDVCxTQUFLbUYsSUFBSW5GO0FBQ1QsU0FBS1MsU0FBU1Q7QUFDZCxTQUFLVSxRQUFRVjtBQUNiLFNBQUtvVyxTQUFTcFc7QUFDZCxTQUFLcVcsU0FBU3JXO0FBR2QsU0FBS3NXLGNBQWN0VztBQUNuQixTQUFLdVcsbUJBQW1Cdlc7QUFDeEIsU0FBS3dXLGtCQUFrQnhXO0VBQ3pCO0VBRUF5VyxXQUFXNVcsU0FBUztBQUNsQixTQUFLQSxVQUFVQTtBQUNmLFNBQUtrVyxvQkFBb0IvVjtBQUN6QixTQUFLa1csV0FBV2xXO0VBQ2xCO0VBS0EwVyxxQkFBcUI7QUFDbkIsVUFBTUMsU0FBUyxLQUFLWjtBQUVwQixRQUFJWSxRQUFRO0FBQ1YsYUFBT0E7O0FBR1QsVUFBTS9XLFFBQVEsS0FBS0E7QUFDbkIsVUFBTUMsVUFBVSxLQUFLQSxRQUFRK1csV0FBVyxLQUFLQyxXQUFVLENBQUE7QUFDdkQsVUFBTW5TLE9BQU83RSxRQUFRaVgsV0FBV2xYLE1BQU1DLFFBQVFrWCxhQUFhbFgsUUFBUW1YO0FBQ25FLFVBQU1BLGFBQWEsSUFBSUMsV0FBVyxLQUFLclgsT0FBTzhFLElBQUFBO0FBQzlDLFFBQUlBLEtBQUt3UyxZQUFZO0FBQ25CLFdBQUtuQixvQkFBb0JsUCxPQUFPc1EsT0FBT0gsVUFBQUE7O0FBR3pDLFdBQU9BO0VBQ1Q7RUFLQUgsYUFBYTtBQUNYLFdBQU8sS0FBS1gsYUFDWixLQUFLQSxXQUFXbkMscUJBQXFCLEtBQUtuVSxNQUFNaVgsV0FBVSxHQUFJLE1BQU0sS0FBS2IsYUFBYTtFQUN4RjtFQUVBb0IsU0FBUy9DLFNBQVN4VSxTQUFTO0FBQ3pCLFVBQU0sRUFBQ3VVLFVBQVMsSUFBSXZVO0FBRXBCLFVBQU0yVSxjQUFjZSwyQkFBMkJuQixXQUFXLGVBQWUsTUFBTUMsT0FBQUE7QUFDL0UsVUFBTTdMLFFBQVErTSwyQkFBMkJuQixXQUFXLFNBQVMsTUFBTUMsT0FBQUE7QUFDbkUsVUFBTU8sYUFBYVcsMkJBQTJCbkIsV0FBVyxjQUFjLE1BQU1DLE9BQUFBO0FBRTdFLFFBQUkvQyxRQUFRLENBQUE7QUFDWkEsWUFBUWxDLGFBQWFrQyxPQUFPNUIsY0FBYzhFLFdBQUFBLENBQUFBO0FBQzFDbEQsWUFBUWxDLGFBQWFrQyxPQUFPNUIsY0FBY2xILEtBQUFBLENBQUFBO0FBQzFDOEksWUFBUWxDLGFBQWFrQyxPQUFPNUIsY0FBY2tGLFVBQUFBLENBQUFBO0FBRTFDLFdBQU90RDtFQUNUO0VBRUErRixjQUFjcEQsY0FBY3BVLFNBQVM7QUFDbkMsV0FBT2dVLHdCQUNMMEIsMkJBQTJCMVYsUUFBUXVVLFdBQVcsY0FBYyxNQUFNSCxZQUFBQSxDQUFBQTtFQUV0RTtFQUVBcUQsUUFBUXJELGNBQWNwVSxTQUFTO0FBQzdCLFVBQU0sRUFBQ3VVLFVBQVMsSUFBSXZVO0FBQ3BCLFVBQU0wWCxZQUFZLENBQUE7QUFFbEJwRixTQUFLOEIsY0FBYyxDQUFDSSxZQUFZO0FBQzlCLFlBQU1qRCxXQUFXO1FBQ2ZDLFFBQVEsQ0FBQTtRQUNSQyxPQUFPLENBQUE7UUFDUEMsT0FBTyxDQUFBO01BQ1Q7QUFDQSxZQUFNaUcsU0FBU3JELGtCQUFrQkMsV0FBV0MsT0FBQUE7QUFDNUNqRixtQkFBYWdDLFNBQVNDLFFBQVEzQixjQUFjNkYsMkJBQTJCaUMsUUFBUSxlQUFlLE1BQU1uRCxPQUFBQSxDQUFBQSxDQUFBQTtBQUNwR2pGLG1CQUFhZ0MsU0FBU0UsT0FBT2lFLDJCQUEyQmlDLFFBQVEsU0FBUyxNQUFNbkQsT0FBQUEsQ0FBQUE7QUFDL0VqRixtQkFBYWdDLFNBQVNHLE9BQU83QixjQUFjNkYsMkJBQTJCaUMsUUFBUSxjQUFjLE1BQU1uRCxPQUFBQSxDQUFBQSxDQUFBQTtBQUVsR2tELGdCQUFVM1QsS0FBS3dOLFFBQUFBO0lBQ2pCLENBQUE7QUFFQSxXQUFPbUc7RUFDVDtFQUVBRSxhQUFheEQsY0FBY3BVLFNBQVM7QUFDbEMsV0FBT2dVLHdCQUNMMEIsMkJBQTJCMVYsUUFBUXVVLFdBQVcsYUFBYSxNQUFNSCxZQUFBQSxDQUFBQTtFQUVyRTtFQUdBeUQsVUFBVXpELGNBQWNwVSxTQUFTO0FBQy9CLFVBQU0sRUFBQ3VVLFVBQVMsSUFBSXZVO0FBRXBCLFVBQU13VixlQUFlRSwyQkFBMkJuQixXQUFXLGdCQUFnQixNQUFNSCxZQUFBQTtBQUNqRixVQUFNcEQsU0FBUzBFLDJCQUEyQm5CLFdBQVcsVUFBVSxNQUFNSCxZQUFBQTtBQUNyRSxVQUFNcUIsY0FBY0MsMkJBQTJCbkIsV0FBVyxlQUFlLE1BQU1ILFlBQUFBO0FBRS9FLFFBQUkzQyxRQUFRLENBQUE7QUFDWkEsWUFBUWxDLGFBQWFrQyxPQUFPNUIsY0FBYzJGLFlBQUFBLENBQUFBO0FBQzFDL0QsWUFBUWxDLGFBQWFrQyxPQUFPNUIsY0FBY21CLE1BQUFBLENBQUFBO0FBQzFDUyxZQUFRbEMsYUFBYWtDLE9BQU81QixjQUFjNEYsV0FBQUEsQ0FBQUE7QUFFMUMsV0FBT2hFO0VBQ1Q7RUFLQXFHLGFBQWE5WCxTQUFTO0FBQ3BCLFVBQU0rWCxTQUFTLEtBQUtoQztBQUNwQixVQUFNbFUsT0FBTyxLQUFLOUIsTUFBTThCO0FBQ3hCLFVBQU00VSxjQUFjLENBQUE7QUFDcEIsVUFBTUMsbUJBQW1CLENBQUE7QUFDekIsVUFBTUMsa0JBQWtCLENBQUE7QUFDeEIsUUFBSXZDLGVBQWUsQ0FBQTtBQUNuQixRQUFJalIsR0FBR21MO0FBRVAsU0FBS25MLElBQUksR0FBR21MLE1BQU15SixPQUFPeFUsUUFBUUosSUFBSW1MLEtBQUssRUFBRW5MLEdBQUc7QUFDN0NpUixtQkFBYXJRLEtBQUttTSxrQkFBa0IsS0FBS25RLE9BQU9nWSxPQUFPNVUsQ0FBRSxDQUFBLENBQUE7SUFDM0Q7QUFHQSxRQUFJbkQsUUFBUTJCLFFBQVE7QUFDbEJ5UyxxQkFBZUEsYUFBYXpTLE9BQU8sQ0FBQzhNLFNBQVNuUCxPQUFPMFksVUFBVWhZLFFBQVEyQixPQUFPOE0sU0FBU25QLE9BQU8wWSxPQUFPblcsSUFBQUEsQ0FBQUE7O0FBSXRHLFFBQUk3QixRQUFRaVksVUFBVTtBQUNwQjdELHFCQUFlQSxhQUFhdFMsS0FBSyxDQUFDM0MsR0FBR0MsTUFBTVksUUFBUWlZLFNBQVM5WSxHQUFHQyxHQUFHeUMsSUFBQUEsQ0FBQUE7O0FBSXBFeVEsU0FBSzhCLGNBQWMsQ0FBQ0ksWUFBWTtBQUM5QixZQUFNbUQsU0FBU3JELGtCQUFrQnRVLFFBQVF1VSxXQUFXQyxPQUFBQTtBQUNwRGlDLGtCQUFZMVMsS0FBSzJSLDJCQUEyQmlDLFFBQVEsY0FBYyxNQUFNbkQsT0FBQUEsQ0FBQUE7QUFDeEVrQyx1QkFBaUIzUyxLQUFLMlIsMkJBQTJCaUMsUUFBUSxtQkFBbUIsTUFBTW5ELE9BQUFBLENBQUFBO0FBQ2xGbUMsc0JBQWdCNVMsS0FBSzJSLDJCQUEyQmlDLFFBQVEsa0JBQWtCLE1BQU1uRCxPQUFBQSxDQUFBQTtJQUNsRixDQUFBO0FBRUEsU0FBS2lDLGNBQWNBO0FBQ25CLFNBQUtDLG1CQUFtQkE7QUFDeEIsU0FBS0Msa0JBQWtCQTtBQUN2QixTQUFLTCxhQUFhbEM7QUFDbEIsV0FBT0E7RUFDVDtFQUVBbFQsT0FBT2dYLFNBQVMvTSxRQUFRO0FBQ3RCLFVBQU1uTCxVQUFVLEtBQUtBLFFBQVErVyxXQUFXLEtBQUtDLFdBQVUsQ0FBQTtBQUN2RCxVQUFNZSxTQUFTLEtBQUtoQztBQUNwQixRQUFJb0M7QUFDSixRQUFJL0QsZUFBZSxDQUFBO0FBRW5CLFFBQUksQ0FBQzJELE9BQU94VSxRQUFRO0FBQ2xCLFVBQUksS0FBS3VTLFlBQVksR0FBRztBQUN0QnFDLHFCQUFhO1VBQ1hyQyxTQUFTO1FBQ1g7O1dBRUc7QUFDTCxZQUFNL1UsV0FBV29OLFlBQVluTyxRQUFRZSxRQUFRLEVBQUVVLEtBQUssTUFBTXNXLFFBQVEsS0FBSy9CLGNBQWM7QUFDckY1QixxQkFBZSxLQUFLMEQsYUFBYTlYLE9BQUFBO0FBRWpDLFdBQUsySSxRQUFRLEtBQUs0TyxTQUFTbkQsY0FBY3BVLE9BQUFBO0FBQ3pDLFdBQUsyUixhQUFhLEtBQUs2RixjQUFjcEQsY0FBY3BVLE9BQUFBO0FBQ25ELFdBQUsrUSxPQUFPLEtBQUswRyxRQUFRckQsY0FBY3BVLE9BQUFBO0FBQ3ZDLFdBQUs0UixZQUFZLEtBQUtnRyxhQUFheEQsY0FBY3BVLE9BQUFBO0FBQ2pELFdBQUtnUixTQUFTLEtBQUs2RyxVQUFVekQsY0FBY3BVLE9BQUFBO0FBRTNDLFlBQU1vQyxPQUFPLEtBQUs2VCxRQUFRcEYsZUFBZSxNQUFNN1EsT0FBQUE7QUFDL0MsWUFBTW9ZLGtCQUFrQnBSLE9BQU9xUixPQUFPLENBQUEsR0FBSXRYLFVBQVVxQixJQUFBQTtBQUNwRCxZQUFNb1IsWUFBWUwsbUJBQW1CLEtBQUtwVCxPQUFPQyxTQUFTb1ksZUFBQUE7QUFDMUQsWUFBTUUsa0JBQWtCL0UsbUJBQW1CdlQsU0FBU29ZLGlCQUFpQjVFLFdBQVcsS0FBS3pULEtBQUs7QUFFMUYsV0FBSzRTLFNBQVNhLFVBQVViO0FBQ3hCLFdBQUtLLFNBQVNRLFVBQVVSO0FBRXhCbUYsbUJBQWE7UUFDWHJDLFNBQVM7UUFDVHRSLEdBQUc4VCxnQkFBZ0I5VDtRQUNuQmMsR0FBR2dULGdCQUFnQmhUO1FBQ25CekUsT0FBT3VCLEtBQUt2QjtRQUNaRCxRQUFRd0IsS0FBS3hCO1FBQ2IyVixRQUFReFYsU0FBU3lEO1FBQ2pCZ1MsUUFBUXpWLFNBQVN1RTtNQUNuQjs7QUFHRixTQUFLNlEsZ0JBQWdCL0I7QUFDckIsU0FBS2lDLFdBQVdsVztBQUVoQixRQUFJZ1ksWUFBWTtBQUNkLFdBQUt0QixtQkFBa0IsRUFBRzNWLE9BQU8sTUFBTWlYLFVBQUFBOztBQUd6QyxRQUFJRCxXQUFXbFksUUFBUXVZLFVBQVU7QUFDL0J2WSxjQUFRdVksU0FBUzlXLEtBQUssTUFBTTtRQUFDMUIsT0FBTyxLQUFLQTtRQUFPK1EsU0FBUztRQUFNM0Y7TUFBTSxDQUFBOztFQUV6RTtFQUVBcU4sVUFBVUMsY0FBY3hZLEtBQUttQyxNQUFNcEMsU0FBUztBQUMxQyxVQUFNMFksZ0JBQWdCLEtBQUtDLGlCQUFpQkYsY0FBY3JXLE1BQU1wQyxPQUFBQTtBQUVoRUMsUUFBSTJZLE9BQU9GLGNBQWNHLElBQUlILGNBQWNJLEVBQUU7QUFDN0M3WSxRQUFJMlksT0FBT0YsY0FBY0ssSUFBSUwsY0FBY00sRUFBRTtBQUM3Qy9ZLFFBQUkyWSxPQUFPRixjQUFjTyxJQUFJUCxjQUFjUSxFQUFFO0VBQy9DO0VBRUFQLGlCQUFpQkYsY0FBY3JXLE1BQU1wQyxTQUFTO0FBQzVDLFVBQU0sRUFBQzJTLFFBQVFLLE9BQU0sSUFBSTtBQUN6QixVQUFNLEVBQUNILFdBQVdZLGFBQUFBLElBQWdCelQ7QUFDbEMsVUFBTSxFQUFDMFQsU0FBU0MsVUFBVUMsWUFBWUMsWUFBQUEsSUFBZS9NLGNBQWMyTSxZQUFBQTtBQUNuRSxVQUFNLEVBQUNqUCxHQUFHMlUsS0FBSzdULEdBQUc4VCxJQUFBQSxJQUFPWDtBQUN6QixVQUFNLEVBQUM1WCxPQUFPRCxPQUFBQSxJQUFVd0I7QUFDeEIsUUFBSXlXLElBQUlFLElBQUlFLElBQUlILElBQUlFLElBQUlFO0FBRXhCLFFBQUlsRyxXQUFXLFVBQVU7QUFDdkJnRyxXQUFLSSxNQUFPeFksU0FBUztBQUVyQixVQUFJK1IsV0FBVyxRQUFRO0FBQ3JCa0csYUFBS007QUFDTEosYUFBS0YsS0FBS2hHO0FBR1ZpRyxhQUFLRSxLQUFLbkc7QUFDVnFHLGFBQUtGLEtBQUtuRzthQUNMO0FBQ0xnRyxhQUFLTSxNQUFNdFk7QUFDWGtZLGFBQUtGLEtBQUtoRztBQUdWaUcsYUFBS0UsS0FBS25HO0FBQ1ZxRyxhQUFLRixLQUFLbkc7O0FBR1pvRyxXQUFLSjtXQUNBO0FBQ0wsVUFBSWxHLFdBQVcsUUFBUTtBQUNyQm9HLGFBQUtJLE1BQU10YSxLQUFLSSxJQUFJeVUsU0FBU0UsVUFBZWYsSUFBQUE7aUJBQ25DRixXQUFXLFNBQVM7QUFDN0JvRyxhQUFLSSxNQUFNdFksUUFBUWhDLEtBQUtJLElBQUkwVSxVQUFVRSxXQUFlaEIsSUFBQUE7YUFDaEQ7QUFDTGtHLGFBQUssS0FBS3hDOztBQUdaLFVBQUl2RCxXQUFXLE9BQU87QUFDcEI4RixhQUFLTTtBQUNMSixhQUFLRixLQUFLakc7QUFHVmdHLGFBQUtFLEtBQUtsRztBQUNWb0csYUFBS0YsS0FBS2xHO2FBQ0w7QUFDTGlHLGFBQUtNLE1BQU14WTtBQUNYb1ksYUFBS0YsS0FBS2pHO0FBR1ZnRyxhQUFLRSxLQUFLbEc7QUFDVm9HLGFBQUtGLEtBQUtsRzs7QUFFWnFHLFdBQUtKOztBQUVQLFdBQU87TUFBQ0Q7TUFBSUU7TUFBSUU7TUFBSUg7TUFBSUU7TUFBSUU7SUFBRTtFQUNoQztFQUVBL1QsVUFBVWtVLElBQUlwWixLQUFLRCxTQUFTO0FBQzFCLFVBQU0ySSxRQUFRLEtBQUtBO0FBQ25CLFVBQU1wRixTQUFTb0YsTUFBTXBGO0FBQ3JCLFFBQUlxRixXQUFXaUosY0FBYzFPO0FBRTdCLFFBQUlJLFFBQVE7QUFDVixZQUFNWSxZQUFZQyxjQUFjcEUsUUFBUWtFLEtBQUssS0FBS00sR0FBRyxLQUFLM0QsS0FBSztBQUUvRHdZLFNBQUc3VSxJQUFJdVAsWUFBWSxNQUFNL1QsUUFBUXNaLFlBQVl0WixPQUFBQTtBQUU3Q0MsVUFBSTZDLFlBQVlxQixVQUFVckIsVUFBVTlDLFFBQVFzWixVQUFVO0FBQ3REclosVUFBSThDLGVBQWU7QUFFbkI2RixrQkFBWTFHLE9BQU9sQyxRQUFRNEksU0FBUztBQUNwQ2lKLHFCQUFlN1IsUUFBUTZSO0FBRXZCNVIsVUFBSXlGLFlBQVkxRixRQUFRdVo7QUFDeEJ0WixVQUFJa0MsT0FBT3lHLFVBQVVyRztBQUVyQixXQUFLWSxJQUFJLEdBQUdBLElBQUlJLFFBQVEsRUFBRUosR0FBRztBQUMzQmxELFlBQUkwSCxTQUFTZ0IsTUFBTXhGLENBQUFBLEdBQUlnQixVQUFVSyxFQUFFNlUsR0FBRzdVLENBQUMsR0FBRzZVLEdBQUcvVCxJQUFJc0QsVUFBVWhHLGFBQWEsQ0FBQTtBQUN4RXlXLFdBQUcvVCxLQUFLc0QsVUFBVWhHLGFBQWFpUDtBQUUvQixZQUFJMU8sSUFBSSxNQUFNSSxRQUFRO0FBQ3BCOFYsYUFBRy9ULEtBQUt0RixRQUFROFIsb0JBQW9CRDs7TUFFeEM7O0VBRUo7RUFLQTJILGNBQWN2WixLQUFLb1osSUFBSWxXLEdBQUdnQixXQUFXbkUsU0FBUztBQUM1QyxVQUFNbVYsYUFBYSxLQUFLc0IsWUFBWXRULENBQUU7QUFDdEMsVUFBTW1TLGtCQUFrQixLQUFLb0IsaUJBQWlCdlQsQ0FBRTtBQUNoRCxVQUFNLEVBQUN6RSxXQUFXQyxTQUFBQSxJQUFZcUI7QUFDOUIsVUFBTWlSLFdBQVcvTyxPQUFPbEMsUUFBUWlSLFFBQVE7QUFDeEMsVUFBTXdJLFNBQVMxRixZQUFZLE1BQU0sUUFBUS9ULE9BQUFBO0FBQ3pDLFVBQU0wWixZQUFZdlYsVUFBVUssRUFBRWlWLE1BQUFBO0FBQzlCLFVBQU1FLFVBQVVqYixZQUFZdVMsU0FBU3JPLGNBQWNxTyxTQUFTck8sYUFBYWxFLGFBQWEsSUFBSTtBQUMxRixVQUFNa2IsU0FBU1AsR0FBRy9ULElBQUlxVTtBQUV0QixRQUFJM1osUUFBUXBCLGVBQWU7QUFDekIsWUFBTXFILGNBQWM7UUFDbEJDLFFBQVFySCxLQUFLQyxJQUFJSCxVQUFVRCxTQUFhLElBQUE7UUFDeEMwSCxZQUFZa1AsZ0JBQWdCbFA7UUFDNUJDLFVBQVVpUCxnQkFBZ0JqUDtRQUMxQkMsYUFBYTtNQUNmO0FBR0EsWUFBTUMsVUFBVXBDLFVBQVVJLFdBQVdtVixXQUFXL2EsUUFBQUEsSUFBWUEsV0FBVztBQUN2RSxZQUFNOEgsVUFBVW1ULFNBQVNsYixZQUFZO0FBR3JDdUIsVUFBSTZGLGNBQWM5RixRQUFRNlo7QUFDMUI1WixVQUFJeUYsWUFBWTFGLFFBQVE2WjtBQUN4QkMsZ0JBQVU3WixLQUFLZ0csYUFBYU0sU0FBU0UsT0FBQUE7QUFHckN4RyxVQUFJNkYsY0FBY3FQLFdBQVczSTtBQUM3QnZNLFVBQUl5RixZQUFZeVAsV0FBV2pKO0FBQzNCNE4sZ0JBQVU3WixLQUFLZ0csYUFBYU0sU0FBU0UsT0FBQUE7V0FDaEM7QUFFTHhHLFVBQUltRixZQUFZMlUsU0FBUzVFLFdBQVc3TyxXQUFXLElBQUl6SCxLQUFLSSxJQUFPK0gsR0FBQUEsT0FBT0MsT0FBT2tPLFdBQVc3TyxXQUFXLENBQU02TyxJQUFBQSxXQUFXN08sZUFBZTtBQUNuSXJHLFVBQUk2RixjQUFjcVAsV0FBVzNJO0FBQzdCdk0sVUFBSThGLFlBQVlvUCxXQUFXOUksY0FBYyxDQUFBLENBQUU7QUFDM0NwTSxVQUFJMkYsaUJBQWlCdVAsV0FBVzdJLG9CQUFvQjtBQUdwRCxZQUFNME4sU0FBUzdWLFVBQVVJLFdBQVdtVixXQUFXL2EsUUFBQUE7QUFDL0MsWUFBTXNiLFNBQVM5VixVQUFVSSxXQUFXSixVQUFVcUMsTUFBTWtULFdBQVcsQ0FBQSxHQUFJL2EsV0FBVyxDQUFBO0FBQzlFLFlBQU1rSSxlQUFlQyxjQUFjcU8sV0FBV3RPLFlBQVk7QUFFMUQsVUFBSUcsT0FBT0MsT0FBT0osWUFBQUEsRUFBY0ssS0FBS0MsQ0FBQUEsTUFBS0EsTUFBTSxDQUFJLEdBQUE7QUFDbERsSCxZQUFJOEcsVUFBUztBQUNiOUcsWUFBSXlGLFlBQVkxRixRQUFRNlo7QUFDeEJ6UywyQkFBbUJuSCxLQUFLO1VBQ3RCdUUsR0FBR3dWO1VBQ0gxVSxHQUFHc1U7VUFDSHZTLEdBQUcxSTtVQUNIMkksR0FBRzVJO1VBQ0h3SCxRQUFRVztRQUNWLENBQUE7QUFDQTVHLFlBQUl1SCxLQUFJO0FBQ1J2SCxZQUFJd0gsT0FBTTtBQUdWeEgsWUFBSXlGLFlBQVl5UCxXQUFXako7QUFDM0JqTSxZQUFJOEcsVUFBUztBQUNiSywyQkFBbUJuSCxLQUFLO1VBQ3RCdUUsR0FBR3lWO1VBQ0gzVSxHQUFHc1UsU0FBUztVQUNadlMsR0FBRzFJLFdBQVc7VUFDZDJJLEdBQUc1SSxZQUFZO1VBQ2Z3SCxRQUFRVztRQUNWLENBQUE7QUFDQTVHLFlBQUl1SCxLQUFJO2FBQ0g7QUFFTHZILFlBQUl5RixZQUFZMUYsUUFBUTZaO0FBQ3hCNVosWUFBSWlhLFNBQVNGLFFBQVFKLFFBQVFqYixVQUFVRCxTQUFBQTtBQUN2Q3VCLFlBQUlrYSxXQUFXSCxRQUFRSixRQUFRamIsVUFBVUQsU0FBQUE7QUFFekN1QixZQUFJeUYsWUFBWXlQLFdBQVdqSjtBQUMzQmpNLFlBQUlpYSxTQUFTRCxRQUFRTCxTQUFTLEdBQUdqYixXQUFXLEdBQUdELFlBQVksQ0FBQTs7O0FBSy9EdUIsUUFBSXlGLFlBQVksS0FBS2lSLGdCQUFnQnhULENBQUU7RUFDekM7RUFFQWlYLFNBQVNmLElBQUlwWixLQUFLRCxTQUFTO0FBQ3pCLFVBQU0sRUFBQytRLEtBQUFBLElBQVE7QUFDZixVQUFNLEVBQUNrQixhQUFhb0ksV0FBV3JJLGVBQWV0VCxXQUFXQyxVQUFVNlQsV0FBQUEsSUFBY3hTO0FBQ2pGLFVBQU1pUixXQUFXL08sT0FBT2xDLFFBQVFpUixRQUFRO0FBQ3hDLFFBQUljLGlCQUFpQmQsU0FBU3JPO0FBQzlCLFFBQUkwWCxlQUFlO0FBRW5CLFVBQU1uVyxZQUFZQyxjQUFjcEUsUUFBUWtFLEtBQUssS0FBS00sR0FBRyxLQUFLM0QsS0FBSztBQUUvRCxVQUFNMFosaUJBQWlCLFNBQVN4UyxNQUFNO0FBQ3BDOUgsVUFBSTBILFNBQVNJLE1BQU01RCxVQUFVSyxFQUFFNlUsR0FBRzdVLElBQUk4VixZQUFBQSxHQUFlakIsR0FBRy9ULElBQUl5TSxpQkFBaUIsQ0FBQTtBQUM3RXNILFNBQUcvVCxLQUFLeU0saUJBQWlCRTtJQUMzQjtBQUVBLFVBQU11SSwwQkFBMEJyVyxVQUFVckIsVUFBVXVYLFNBQUFBO0FBQ3BELFFBQUk5SSxVQUFVa0osV0FBV2hKLE9BQU90TyxHQUFHdVgsR0FBR0MsTUFBTUM7QUFFNUMzYSxRQUFJNkMsWUFBWXVYO0FBQ2hCcGEsUUFBSThDLGVBQWU7QUFDbkI5QyxRQUFJa0MsT0FBTzhPLFNBQVMxTztBQUVwQjhXLE9BQUc3VSxJQUFJdVAsWUFBWSxNQUFNeUcseUJBQXlCeGEsT0FBQUE7QUFHbERDLFFBQUl5RixZQUFZMUYsUUFBUXFWO0FBQ3hCL0MsU0FBSyxLQUFLWCxZQUFZNEksY0FBQUE7QUFFdEJELG1CQUFldEksaUJBQWlCd0ksNEJBQTRCLFVBQ3hESCxjQUFjLFdBQVkxYixXQUFXLElBQUk2VCxhQUFlN1QsV0FBVyxJQUFJNlQsYUFDdkU7QUFHSixTQUFLclAsSUFBSSxHQUFHd1gsT0FBTzVKLEtBQUt4TixRQUFRSixJQUFJd1gsTUFBTSxFQUFFeFgsR0FBRztBQUM3Q29PLGlCQUFXUixLQUFLNU4sQ0FBRTtBQUNsQnNYLGtCQUFZLEtBQUs5RCxnQkFBZ0J4VCxDQUFFO0FBRW5DbEQsVUFBSXlGLFlBQVkrVTtBQUNoQm5JLFdBQUtmLFNBQVNDLFFBQVErSSxjQUFBQTtBQUV0QjlJLGNBQVFGLFNBQVNFO0FBRWpCLFVBQUlPLGlCQUFpQlAsTUFBTWxPLFFBQVE7QUFDakMsYUFBS2lXLGNBQWN2WixLQUFLb1osSUFBSWxXLEdBQUdnQixXQUFXbkUsT0FBQUE7QUFDMUMrUix5QkFBaUJsVCxLQUFLSSxJQUFJZ1MsU0FBU3JPLFlBQVlsRSxTQUFBQTs7QUFHakQsV0FBS2djLElBQUksR0FBR0UsT0FBT25KLE1BQU1sTyxRQUFRbVgsSUFBSUUsTUFBTSxFQUFFRixHQUFHO0FBQzlDSCx1QkFBZTlJLE1BQU1pSixDQUFFLENBQUE7QUFFdkIzSSx5QkFBaUJkLFNBQVNyTztNQUM1QjtBQUVBMFAsV0FBS2YsU0FBU0csT0FBTzZJLGNBQUFBO0lBQ3ZCO0FBR0FELG1CQUFlO0FBQ2Z2SSxxQkFBaUJkLFNBQVNyTztBQUcxQjBQLFNBQUssS0FBS1YsV0FBVzJJLGNBQUFBO0FBQ3JCbEIsT0FBRy9ULEtBQUsyTTtFQUNWO0VBRUE0SSxXQUFXeEIsSUFBSXBaLEtBQUtELFNBQVM7QUFDM0IsVUFBTWdSLFNBQVMsS0FBS0E7QUFDcEIsVUFBTXpOLFNBQVN5TixPQUFPek47QUFDdEIsUUFBSTJOLFlBQVkvTjtBQUVoQixRQUFJSSxRQUFRO0FBQ1YsWUFBTVksWUFBWUMsY0FBY3BFLFFBQVFrRSxLQUFLLEtBQUtNLEdBQUcsS0FBSzNELEtBQUs7QUFFL0R3WSxTQUFHN1UsSUFBSXVQLFlBQVksTUFBTS9ULFFBQVE4YSxhQUFhOWEsT0FBQUE7QUFDOUNxWixTQUFHL1QsS0FBS3RGLFFBQVFrUztBQUVoQmpTLFVBQUk2QyxZQUFZcUIsVUFBVXJCLFVBQVU5QyxRQUFROGEsV0FBVztBQUN2RDdhLFVBQUk4QyxlQUFlO0FBRW5CbU8sbUJBQWFoUCxPQUFPbEMsUUFBUWtSLFVBQVU7QUFFdENqUixVQUFJeUYsWUFBWTFGLFFBQVErYTtBQUN4QjlhLFVBQUlrQyxPQUFPK08sV0FBVzNPO0FBRXRCLFdBQUtZLElBQUksR0FBR0EsSUFBSUksUUFBUSxFQUFFSixHQUFHO0FBQzNCbEQsWUFBSTBILFNBQVNxSixPQUFPN04sQ0FBQUEsR0FBSWdCLFVBQVVLLEVBQUU2VSxHQUFHN1UsQ0FBQyxHQUFHNlUsR0FBRy9ULElBQUk0TCxXQUFXdE8sYUFBYSxDQUFBO0FBQzFFeVcsV0FBRy9ULEtBQUs0TCxXQUFXdE8sYUFBYTVDLFFBQVFtUztNQUMxQzs7RUFFSjtFQUVBNkksZUFBZTNCLElBQUlwWixLQUFLZ2IsYUFBYWpiLFNBQVM7QUFDNUMsVUFBTSxFQUFDMlMsUUFBUUssT0FBTSxJQUFJO0FBQ3pCLFVBQU0sRUFBQ3hPLEdBQUdjLEVBQUFBLElBQUsrVDtBQUNmLFVBQU0sRUFBQ3hZLE9BQU9ELE9BQUFBLElBQVVxYTtBQUN4QixVQUFNLEVBQUN2SCxTQUFTQyxVQUFVQyxZQUFZQyxZQUFBQSxJQUFlL00sY0FBYzlHLFFBQVF5VCxZQUFZO0FBRXZGeFQsUUFBSXlGLFlBQVkxRixRQUFRa007QUFDeEJqTSxRQUFJNkYsY0FBYzlGLFFBQVF3TTtBQUMxQnZNLFFBQUltRixZQUFZcEYsUUFBUXNHO0FBRXhCckcsUUFBSThHLFVBQVM7QUFDYjlHLFFBQUlpYixPQUFPMVcsSUFBSWtQLFNBQVNwTyxDQUFBQTtBQUN4QixRQUFJME4sV0FBVyxPQUFPO0FBQ3BCLFdBQUt3RixVQUFVYSxJQUFJcFosS0FBS2diLGFBQWFqYixPQUFBQTs7QUFFdkNDLFFBQUkyWSxPQUFPcFUsSUFBSTNELFFBQVE4UyxVQUFVck8sQ0FBQUE7QUFDakNyRixRQUFJa2IsaUJBQWlCM1csSUFBSTNELE9BQU95RSxHQUFHZCxJQUFJM0QsT0FBT3lFLElBQUlxTyxRQUFBQTtBQUNsRCxRQUFJWCxXQUFXLFlBQVlMLFdBQVcsU0FBUztBQUM3QyxXQUFLNkYsVUFBVWEsSUFBSXBaLEtBQUtnYixhQUFhamIsT0FBQUE7O0FBRXZDQyxRQUFJMlksT0FBT3BVLElBQUkzRCxPQUFPeUUsSUFBSTFFLFNBQVNpVCxXQUFBQTtBQUNuQzVULFFBQUlrYixpQkFBaUIzVyxJQUFJM0QsT0FBT3lFLElBQUkxRSxRQUFRNEQsSUFBSTNELFFBQVFnVCxhQUFhdk8sSUFBSTFFLE1BQUFBO0FBQ3pFLFFBQUlvUyxXQUFXLFVBQVU7QUFDdkIsV0FBS3dGLFVBQVVhLElBQUlwWixLQUFLZ2IsYUFBYWpiLE9BQUFBOztBQUV2Q0MsUUFBSTJZLE9BQU9wVSxJQUFJb1AsWUFBWXRPLElBQUkxRSxNQUFBQTtBQUMvQlgsUUFBSWtiLGlCQUFpQjNXLEdBQUdjLElBQUkxRSxRQUFRNEQsR0FBR2MsSUFBSTFFLFNBQVNnVCxVQUFBQTtBQUNwRCxRQUFJWixXQUFXLFlBQVlMLFdBQVcsUUFBUTtBQUM1QyxXQUFLNkYsVUFBVWEsSUFBSXBaLEtBQUtnYixhQUFhamIsT0FBQUE7O0FBRXZDQyxRQUFJMlksT0FBT3BVLEdBQUdjLElBQUlvTyxPQUFBQTtBQUNsQnpULFFBQUlrYixpQkFBaUIzVyxHQUFHYyxHQUFHZCxJQUFJa1AsU0FBU3BPLENBQUFBO0FBQ3hDckYsUUFBSW1iLFVBQVM7QUFFYm5iLFFBQUl1SCxLQUFJO0FBRVIsUUFBSXhILFFBQVFzRyxjQUFjLEdBQUc7QUFDM0JyRyxVQUFJd0gsT0FBTTs7RUFFZDtFQU1BNFQsdUJBQXVCcmIsU0FBUztBQUM5QixVQUFNRCxRQUFRLEtBQUtBO0FBQ25CLFVBQU11YixRQUFRLEtBQUtsRjtBQUNuQixVQUFNbUYsUUFBUUQsU0FBU0EsTUFBTTlXO0FBQzdCLFVBQU1nWCxRQUFRRixTQUFTQSxNQUFNaFc7QUFDN0IsUUFBSWlXLFNBQVNDLE9BQU87QUFDbEIsWUFBTXphLFdBQVdvTixZQUFZbk8sUUFBUWUsUUFBUSxFQUFFVSxLQUFLLE1BQU0sS0FBS3NVLFNBQVMsS0FBS0MsY0FBYztBQUMzRixVQUFJLENBQUNqVixVQUFVO0FBQ2I7O0FBRUYsWUFBTXFCLE9BQU8sS0FBSzZULFFBQVFwRixlQUFlLE1BQU03USxPQUFBQTtBQUMvQyxZQUFNb1ksa0JBQWtCcFIsT0FBT3FSLE9BQU8sQ0FBQSxHQUFJdFgsVUFBVSxLQUFLa1YsS0FBSztBQUM5RCxZQUFNekMsWUFBWUwsbUJBQW1CcFQsT0FBT0MsU0FBU29ZLGVBQUFBO0FBQ3JELFlBQU1xRCxRQUFRbEksbUJBQW1CdlQsU0FBU29ZLGlCQUFpQjVFLFdBQVd6VCxLQUFBQTtBQUN0RSxVQUFJd2IsTUFBTUcsUUFBUUQsTUFBTWpYLEtBQUtnWCxNQUFNRSxRQUFRRCxNQUFNblcsR0FBRztBQUNsRCxhQUFLcU4sU0FBU2EsVUFBVWI7QUFDeEIsYUFBS0ssU0FBU1EsVUFBVVI7QUFDeEIsYUFBS25TLFFBQVF1QixLQUFLdkI7QUFDbEIsYUFBS0QsU0FBU3dCLEtBQUt4QjtBQUNuQixhQUFLMlYsU0FBU3hWLFNBQVN5RDtBQUN2QixhQUFLZ1MsU0FBU3pWLFNBQVN1RTtBQUN2QixhQUFLdVIsbUJBQWtCLEVBQUczVixPQUFPLE1BQU11YSxLQUFBQTs7O0VBRzdDO0VBTUFFLGNBQWM7QUFDWixXQUFPLENBQUMsQ0FBQyxLQUFLN0Y7RUFDaEI7RUFFQXJSLEtBQUt4RSxLQUFLO0FBQ1IsVUFBTUQsVUFBVSxLQUFLQSxRQUFRK1csV0FBVyxLQUFLQyxXQUFVLENBQUE7QUFDdkQsUUFBSWxCLFVBQVUsS0FBS0E7QUFFbkIsUUFBSSxDQUFDQSxTQUFTO0FBQ1o7O0FBR0YsU0FBS3VGLHVCQUF1QnJiLE9BQUFBO0FBRTVCLFVBQU1pYixjQUFjO01BQ2xCcGEsT0FBTyxLQUFLQTtNQUNaRCxRQUFRLEtBQUtBO0lBQ2Y7QUFDQSxVQUFNeVksS0FBSztNQUNUN1UsR0FBRyxLQUFLQTtNQUNSYyxHQUFHLEtBQUtBO0lBQ1Y7QUFHQXdRLGNBQVVqWCxLQUFLK2MsSUFBSTlGLE9BQVcsSUFBQSxPQUFPLElBQUlBO0FBRXpDLFVBQU1wVCxVQUFVb0csVUFBVTlJLFFBQVEwQyxPQUFPO0FBR3pDLFVBQU1tWixvQkFBb0IsS0FBS2xULE1BQU1wRixVQUFVLEtBQUtvTyxXQUFXcE8sVUFBVSxLQUFLd04sS0FBS3hOLFVBQVUsS0FBS3FPLFVBQVVyTyxVQUFVLEtBQUt5TixPQUFPek47QUFFbEksUUFBSXZELFFBQVFpWCxXQUFXNEUsbUJBQW1CO0FBQ3hDNWIsVUFBSXVGLEtBQUk7QUFDUnZGLFVBQUk2YixjQUFjaEc7QUFHbEIsV0FBS2tGLGVBQWUzQixJQUFJcFosS0FBS2diLGFBQWFqYixPQUFBQTtBQUUxQ2dJLDRCQUFzQi9ILEtBQUtELFFBQVFpSSxhQUFhO0FBRWhEb1IsU0FBRy9ULEtBQUs1QyxRQUFRbEM7QUFHaEIsV0FBSzJFLFVBQVVrVSxJQUFJcFosS0FBS0QsT0FBQUE7QUFHeEIsV0FBS29hLFNBQVNmLElBQUlwWixLQUFLRCxPQUFBQTtBQUd2QixXQUFLNmEsV0FBV3hCLElBQUlwWixLQUFLRCxPQUFBQTtBQUV6QnlJLDJCQUFxQnhJLEtBQUtELFFBQVFpSSxhQUFhO0FBRS9DaEksVUFBSXlILFFBQU87O0VBRWY7RUFNQXFVLG9CQUFvQjtBQUNsQixXQUFPLEtBQUtoRyxXQUFXLENBQUE7RUFDekI7RUFPQWlHLGtCQUFrQkMsZ0JBQWdCcE4sZUFBZTtBQUMvQyxVQUFNcU4sYUFBYSxLQUFLbkc7QUFDeEIsVUFBTWdDLFNBQVNrRSxlQUFlclEsSUFBSSxDQUFDLEVBQUN2TSxjQUFjQyxNQUFLLE1BQU07QUFDM0QsWUFBTXVNLE9BQU8sS0FBSzlMLE1BQU1vUSxlQUFlOVEsWUFBQUE7QUFFdkMsVUFBSSxDQUFDd00sTUFBTTtBQUNULGNBQU0sSUFBSXNRLE1BQU0sb0NBQW9DOWMsWUFBYzs7QUFHcEUsYUFBTztRQUNMQTtRQUNBb1AsU0FBUzVDLEtBQUtoSyxLQUFLdkMsS0FBTTtRQUN6QkE7TUFDRjtJQUNGLENBQUE7QUFDQSxVQUFNNFksVUFBVSxDQUFDa0UsZUFBZUYsWUFBWW5FLE1BQUFBO0FBQzVDLFVBQU1zRSxrQkFBa0IsS0FBS0MsaUJBQWlCdkUsUUFBUWxKLGFBQUFBO0FBRXRELFFBQUlxSixXQUFXbUUsaUJBQWlCO0FBQzlCLFdBQUt0RyxVQUFVZ0M7QUFDZixXQUFLL0IsaUJBQWlCbkg7QUFDdEIsV0FBSzBOLHNCQUFzQjtBQUMzQixXQUFLcmIsT0FBTyxJQUFJOztFQUVwQjtFQVNBcUksWUFBWUMsR0FBRzJCLFFBQVFxUixjQUFjLE1BQU07QUFDekMsUUFBSXJSLFVBQVUsS0FBS29SLHFCQUFxQjtBQUN0QyxhQUFPOztBQUVULFNBQUtBLHNCQUFzQjtBQUUzQixVQUFNdmMsVUFBVSxLQUFLQTtBQUNyQixVQUFNa2MsYUFBYSxLQUFLbkcsV0FBVyxDQUFBO0FBQ25DLFVBQU1nQyxTQUFTLEtBQUswRSxtQkFBbUJqVCxHQUFHMFMsWUFBWS9RLFFBQVFxUixXQUFBQTtBQUs5RCxVQUFNSCxrQkFBa0IsS0FBS0MsaUJBQWlCdkUsUUFBUXZPLENBQUFBO0FBR3RELFVBQU0wTyxVQUFVL00sVUFBVSxDQUFDaVIsZUFBZXJFLFFBQVFtRSxVQUFlRyxLQUFBQTtBQUdqRSxRQUFJbkUsU0FBUztBQUNYLFdBQUtuQyxVQUFVZ0M7QUFFZixVQUFJL1gsUUFBUWlYLFdBQVdqWCxRQUFRdVksVUFBVTtBQUN2QyxhQUFLdkMsaUJBQWlCO1VBQ3BCeFIsR0FBR2dGLEVBQUVoRjtVQUNMYyxHQUFHa0UsRUFBRWxFO1FBQ1A7QUFFQSxhQUFLcEUsT0FBTyxNQUFNaUssTUFBQUE7OztBQUl0QixXQUFPK007RUFDVDtFQVdBdUUsbUJBQW1CalQsR0FBRzBTLFlBQVkvUSxRQUFRcVIsYUFBYTtBQUNyRCxVQUFNeGMsVUFBVSxLQUFLQTtBQUVyQixRQUFJd0osRUFBRUUsU0FBUyxZQUFZO0FBQ3pCLGFBQU8sQ0FBQTs7QUFHVCxRQUFJLENBQUM4UyxhQUFhO0FBR2hCLGFBQU9OLFdBQVd2YSxPQUFPd0IsQ0FBQUEsTUFDdkIsS0FBS3BELE1BQU04QixLQUFLNEosU0FBU3RJLEVBQUU5RCxZQUFZLEtBQ3ZDLEtBQUtVLE1BQU1vUSxlQUFlaE4sRUFBRTlELFlBQVksRUFBRTBNLFdBQVd3RSxVQUFVcE4sRUFBRTdELEtBQUssTUFBTWEsTUFBQUE7O0FBS2hGLFVBQU00WCxTQUFTLEtBQUtoWSxNQUFNMmMsMEJBQTBCbFQsR0FBR3hKLFFBQVE4VSxNQUFNOVUsU0FBU21MLE1BQUFBO0FBRTlFLFFBQUluTCxRQUFRK0IsU0FBUztBQUNuQmdXLGFBQU9oVyxRQUFPOztBQUdoQixXQUFPZ1c7RUFDVDtFQVNBdUUsaUJBQWlCdkUsUUFBUXZPLEdBQUc7QUFDMUIsVUFBTSxFQUFDK00sUUFBUUMsUUFBUXhXLFFBQU8sSUFBSTtBQUNsQyxVQUFNZSxXQUFXb04sWUFBWW5PLFFBQVFlLFFBQVEsRUFBRVUsS0FBSyxNQUFNc1csUUFBUXZPLENBQUFBO0FBQ2xFLFdBQU96SSxhQUFhLFVBQVV3VixXQUFXeFYsU0FBU3lELEtBQUtnUyxXQUFXelYsU0FBU3VFO0VBQzdFO0FBQ0Y7QUF2dkJFLGNBTFd1USxTQUtKMUgsZUFBY0E7QUF5dkJ2QixJQUFBLGlCQUFlO0VBQ2I5RCxJQUFJO0VBQ0pDLFVBQVV1TDtFQUNWMUg7RUFFQXdPLFVBQVU1YyxPQUFPeUssT0FBT3hLLFNBQVM7QUFDL0IsUUFBSUEsU0FBUztBQUNYRCxZQUFNK1EsVUFBVSxJQUFJK0UsUUFBUTtRQUFDOVY7UUFBT0M7TUFBTyxDQUFBOztFQUUvQztFQUVBK0ssYUFBYWhMLE9BQU95SyxPQUFPeEssU0FBUztBQUNsQyxRQUFJRCxNQUFNK1EsU0FBUztBQUNqQi9RLFlBQU0rUSxRQUFROEYsV0FBVzVXLE9BQUFBOztFQUU3QjtFQUVBNGMsTUFBTTdjLE9BQU95SyxPQUFPeEssU0FBUztBQUMzQixRQUFJRCxNQUFNK1EsU0FBUztBQUNqQi9RLFlBQU0rUSxRQUFROEYsV0FBVzVXLE9BQUFBOztFQUU3QjtFQUVBNmMsVUFBVTljLE9BQU87QUFDZixVQUFNK1EsVUFBVS9RLE1BQU0rUTtBQUV0QixRQUFJQSxXQUFXQSxRQUFRNkssWUFBVyxHQUFJO0FBQ3BDLFlBQU16USxPQUFPO1FBQ1g0RjtNQUNGO0FBRUEsVUFBSS9RLE1BQU0rYyxjQUFjLHFCQUFxQjtRQUFDLEdBQUc1UjtRQUFNNlIsWUFBWTtNQUFJLENBQUEsTUFBTyxPQUFPO0FBQ25GOztBQUdGak0sY0FBUXJNLEtBQUsxRSxNQUFNRSxHQUFHO0FBRXRCRixZQUFNK2MsY0FBYyxvQkFBb0I1UixJQUFBQTs7RUFFNUM7RUFFQUQsV0FBV2xMLE9BQU9tTCxNQUFNO0FBQ3RCLFFBQUluTCxNQUFNK1EsU0FBUztBQUVqQixZQUFNa00sbUJBQW1COVIsS0FBS0M7QUFDOUIsVUFBSXBMLE1BQU0rUSxRQUFRdkgsWUFBWTJCLEtBQUtFLE9BQU80UixrQkFBa0I5UixLQUFLc1IsV0FBVyxHQUFHO0FBRTdFdFIsYUFBS2dOLFVBQVU7OztFQUdyQjtFQUVBblQsVUFBVTtJQUNSa1MsU0FBUztJQUNUc0IsVUFBVTtJQUNWeFgsVUFBVTtJQUNWbUwsaUJBQWlCO0lBQ2pCcU4sWUFBWTtJQUNaM1EsV0FBVztNQUNUNUgsUUFBUTtJQUNWO0lBQ0E2USxjQUFjO0lBQ2RDLG1CQUFtQjtJQUNuQndILFlBQVk7SUFDWmpFLFdBQVc7SUFDWHBELGFBQWE7SUFDYmhCLFVBQVUsQ0FBQTtJQUVWb0osV0FBVztJQUNYVSxhQUFhO0lBQ2I1SSxlQUFlO0lBQ2ZELGlCQUFpQjtJQUNqQmhCLFlBQVk7TUFDVmxRLFFBQVE7SUFDVjtJQUNBOFosYUFBYTtJQUNicFksU0FBUztJQUNUb1EsY0FBYztJQUNkRCxXQUFXO0lBQ1hZLGNBQWM7SUFDZC9VLFdBQVcsQ0FBQ3VCLEtBQUs0RSxTQUFTQSxLQUFLb00sU0FBUzdPO0lBQ3hDekQsVUFBVSxDQUFDc0IsS0FBSzRFLFNBQVNBLEtBQUtvTSxTQUFTN087SUFDdkN5WCxvQkFBb0I7SUFDcEI3SCxlQUFlO0lBQ2ZRLFlBQVk7SUFDWmhHLGFBQWE7SUFDYmxHLGFBQWE7SUFDYjRRLFdBQVc7TUFDVCtGLFVBQVU7TUFDVkMsUUFBUTtJQUNWO0lBQ0EvRixZQUFZO01BQ1ZnRyxTQUFTO1FBQ1B6VCxNQUFNO1FBQ055TyxZQUFZO1VBQUM7VUFBSztVQUFLO1VBQVM7VUFBVTtVQUFVO1FBQVM7TUFDL0Q7TUFDQXJDLFNBQVM7UUFDUG9ILFFBQVE7UUFDUkQsVUFBVTtNQUNaO0lBQ0Y7SUFDQTFJLFdBQVdHO0VBQ2I7RUFFQTdHLGVBQWU7SUFDYm9ELFVBQVU7SUFDVkMsWUFBWTtJQUNadEksV0FBVztFQUNiO0VBRUE2RCxhQUFhO0lBQ1hDLGFBQWEsQ0FBQ0MsU0FBU0EsU0FBUyxZQUFZQSxTQUFTLGNBQWNBLFNBQVM7SUFDNUVtQixZQUFZO0lBQ1p5RyxXQUFXO01BQ1Q3SCxhQUFhO01BQ2JvQixZQUFZO0lBQ2Q7SUFDQW9KLFdBQVc7TUFDVGtHLFdBQVc7SUFDYjtJQUNBakcsWUFBWTtNQUNWaUcsV0FBVztJQUNiO0VBQ0Y7RUFHQUMsd0JBQXdCO0lBQUM7RUFBYztBQUN6QztBQzN6Q0EsSUFBTUMsY0FBYyxDQUFDQyxRQUFRQyxLQUFLQyxPQUFPQyxnQkFBZ0I7QUFDdkQsTUFBSSxPQUFPRixRQUFRLFVBQVU7QUFDM0JDLFlBQVFGLE9BQU9JLEtBQUtILEdBQU8sSUFBQTtBQUMzQkUsZ0JBQVlFLFFBQVE7TUFBQ0g7TUFBT0ksT0FBT0w7SUFBRyxDQUFBO2FBQzdCTSxNQUFNTixHQUFNLEdBQUE7QUFDckJDLFlBQVE7O0FBRVYsU0FBT0E7QUFDVDtBQUVBLFNBQVNNLGVBQWVSLFFBQVFDLEtBQUtDLE9BQU9DLGFBQWE7QUFDdkQsUUFBTU0sUUFBUVQsT0FBT1UsUUFBUVQsR0FBQUE7QUFDN0IsTUFBSVEsVUFBVSxJQUFJO0FBQ2hCLFdBQU9WLFlBQVlDLFFBQVFDLEtBQUtDLE9BQU9DLFdBQUFBOztBQUV6QyxRQUFNUSxPQUFPWCxPQUFPWSxZQUFZWCxHQUFBQTtBQUNoQyxTQUFPUSxVQUFVRSxPQUFPVCxRQUFRTztBQUNsQztBQUVBLElBQU1JLGFBQWEsQ0FBQ1gsT0FBT1ksUUFBUVosVUFBVSxPQUFPLE9BQU9hLFlBQVlDLEtBQUtDLE1BQU1mLEtBQUFBLEdBQVEsR0FBR1ksR0FBSTtBQUVqRyxTQUFTSSxrQkFBa0JDLE9BQU87QUFDaEMsUUFBTW5CLFNBQVMsS0FBS29CLFVBQVM7QUFFN0IsTUFBSUQsU0FBUyxLQUFLQSxRQUFRbkIsT0FBT3FCLFFBQVE7QUFDdkMsV0FBT3JCLE9BQU9tQixLQUFNOztBQUV0QixTQUFPQTtBQUNUO0FBRWUsSUFBTUcsZ0JBQU4sY0FBNEJDLE1BQUFBO0VBYXpDQyxZQUFZQyxLQUFLO0FBQ2YsVUFBTUEsR0FBQUE7QUFHTixTQUFLQyxjQUFjQztBQUNuQixTQUFLQyxjQUFjO0FBQ25CLFNBQUtDLGVBQWUsQ0FBQTtFQUN0QjtFQUVBQyxLQUFLQyxjQUFjO0FBQ2pCLFVBQU1DLFFBQVEsS0FBS0g7QUFDbkIsUUFBSUcsTUFBTVgsUUFBUTtBQUNoQixZQUFNckIsU0FBUyxLQUFLb0IsVUFBUztBQUM3QixpQkFBVyxFQUFDbEIsT0FBT0ksTUFBSyxLQUFLMEIsT0FBTztBQUNsQyxZQUFJaEMsT0FBT0UsS0FBTSxNQUFLSSxPQUFPO0FBQzNCTixpQkFBT2lDLE9BQU8vQixPQUFPLENBQUE7O01BRXpCO0FBQ0EsV0FBSzJCLGVBQWUsQ0FBQTs7QUFFdEIsVUFBTUMsS0FBS0MsWUFBQUE7RUFDYjtFQUVBRyxNQUFNakMsS0FBS0MsT0FBTztBQUNoQixRQUFJaUMsY0FBY2xDLEdBQU0sR0FBQTtBQUN0QixhQUFPOztBQUVULFVBQU1ELFNBQVMsS0FBS29CLFVBQVM7QUFDN0JsQixZQUFRa0MsU0FBU2xDLEtBQVVGLEtBQUFBLE9BQU9FLEtBQUFBLE1BQVdELE1BQU1DLFFBQy9DTSxlQUFlUixRQUFRQyxLQUFLb0MsZUFBZW5DLE9BQU9ELEdBQUFBLEdBQU0sS0FBSzRCLFlBQVk7QUFDN0UsV0FBT2hCLFdBQVdYLE9BQU9GLE9BQU9xQixTQUFTLENBQUE7RUFDM0M7RUFFQWlCLHNCQUFzQjtBQUNwQixVQUFNLEVBQUNDLFlBQVlDLFdBQUFBLElBQWMsS0FBS0MsY0FBYTtBQUNuRCxRQUFJLEVBQUNDLEtBQUs1QixJQUFHLElBQUksS0FBSzZCLFVBQVUsSUFBSTtBQUVwQyxRQUFJLEtBQUtDLFFBQVFDLFdBQVcsU0FBUztBQUNuQyxVQUFJLENBQUNOLFlBQVk7QUFDZkcsY0FBTTs7QUFFUixVQUFJLENBQUNGLFlBQVk7QUFDZjFCLGNBQU0sS0FBS00sVUFBUyxFQUFHQyxTQUFTOzs7QUFJcEMsU0FBS3FCLE1BQU1BO0FBQ1gsU0FBSzVCLE1BQU1BO0VBQ2I7RUFFQWdDLGFBQWE7QUFDWCxVQUFNSixNQUFNLEtBQUtBO0FBQ2pCLFVBQU01QixNQUFNLEtBQUtBO0FBQ2pCLFVBQU1pQyxTQUFTLEtBQUtILFFBQVFHO0FBQzVCLFVBQU1DLFFBQVEsQ0FBQTtBQUNkLFFBQUloRCxTQUFTLEtBQUtvQixVQUFTO0FBRzNCcEIsYUFBUyxRQUFTLEtBQUtjLFFBQVFkLE9BQU9xQixTQUFTLElBQUtyQixTQUFTQSxPQUFPaUQsTUFBTVAsS0FBSzVCLE1BQU0sQ0FBRTtBQUV2RixTQUFLYyxjQUFjWixLQUFLRixJQUFJZCxPQUFPcUIsVUFBVTBCLFNBQVMsSUFBSSxJQUFJLENBQUE7QUFDOUQsU0FBS3JCLGNBQWMsS0FBS2dCLE9BQU9LLFNBQVMsTUFBTTtBQUU5QyxhQUFTNUIsUUFBUXVCLEtBQUt2QixTQUFTTCxLQUFLSyxTQUFTO0FBQzNDNkIsWUFBTTVDLEtBQUs7UUFBQ2U7TUFBSyxDQUFBO0lBQ25CO0FBQ0EsV0FBTzZCO0VBQ1Q7RUFFQUUsaUJBQWlCL0IsT0FBTztBQUN0QixXQUFPRCxrQkFBa0JpQyxLQUFLLE1BQU1oQyxLQUFBQTtFQUN0QztFQUtBaUMsWUFBWTtBQUNWLFVBQU1BLFVBQVM7QUFFZixRQUFJLENBQUMsS0FBS0MsYUFBWSxHQUFJO0FBRXhCLFdBQUtDLGlCQUFpQixDQUFDLEtBQUtBOztFQUVoQztFQUdBQyxpQkFBaUJwQyxPQUFPO0FBQ3RCLFFBQUksT0FBT0EsVUFBVSxVQUFVO0FBQzdCQSxjQUFRLEtBQUtlLE1BQU1mLEtBQUFBOztBQUdyQixXQUFPQSxVQUFVLE9BQU9xQyxNQUFNLEtBQUtDLG9CQUFvQnRDLFFBQVEsS0FBS08sZUFBZSxLQUFLRSxXQUFXO0VBQ3JHO0VBSUE4QixnQkFBZ0J4RCxPQUFPO0FBQ3JCLFVBQU04QyxRQUFRLEtBQUtBO0FBQ25CLFFBQUk5QyxRQUFRLEtBQUtBLFFBQVE4QyxNQUFNM0IsU0FBUyxHQUFHO0FBQ3pDLGFBQU87O0FBRVQsV0FBTyxLQUFLa0MsaUJBQWlCUCxNQUFNOUMsS0FBQUEsRUFBT2lCLEtBQUs7RUFDakQ7RUFFQXdDLGlCQUFpQkMsT0FBTztBQUN0QixXQUFPNUMsS0FBS0MsTUFBTSxLQUFLUyxjQUFjLEtBQUttQyxtQkFBbUJELEtBQVMsSUFBQSxLQUFLaEMsV0FBVztFQUN4RjtFQUVBa0MsZUFBZTtBQUNiLFdBQU8sS0FBS0M7RUFDZDtBQUNGO0FBMUhFLGNBRm1CekMsZUFFWjBDLE1BQUs7QUFLWixjQVBtQjFDLGVBT1oyQyxZQUFXO0VBQ2hCakIsT0FBTztJQUNMa0IsVUFBVWhEO0VBQ1o7O0FDbkJKLFNBQVNpRCxnQkFBY0MsbUJBQW1CQyxXQUFXO0FBQ25ELFFBQU1yQixRQUFRLENBQUE7QUFLZCxRQUFNc0IsY0FBYztBQUNwQixRQUFNLEVBQUN6QixRQUFRMEIsTUFBTTdCLEtBQUs1QixLQUFLMEQsV0FBV0MsT0FBT0MsVUFBVUMsV0FBV0MsY0FBQUEsSUFBaUJSO0FBQ3ZGLFFBQU1TLE9BQU9OLFFBQVE7QUFDckIsUUFBTU8sWUFBWUosV0FBVztBQUM3QixRQUFNLEVBQUNoQyxLQUFLcUMsTUFBTWpFLEtBQUtrRSxLQUFBQSxJQUFRWDtBQUMvQixRQUFNOUIsYUFBYSxDQUFDSixjQUFjTyxHQUFBQTtBQUNsQyxRQUFNRixhQUFhLENBQUNMLGNBQWNyQixHQUFBQTtBQUNsQyxRQUFNbUUsZUFBZSxDQUFDOUMsY0FBY3NDLEtBQUFBO0FBQ3BDLFFBQU1TLGNBQWNGLE9BQU9ELFNBQVNKLFlBQVk7QUFDaEQsTUFBSVEsVUFBVUMsU0FBU0osT0FBT0QsUUFBUUQsWUFBWUQsSUFBUUEsSUFBQUE7QUFDMUQsTUFBSVEsUUFBUUMsU0FBU0MsU0FBU0M7QUFJOUIsTUFBSUwsVUFBVWIsZUFBZSxDQUFDL0IsY0FBYyxDQUFDQyxZQUFZO0FBQ3ZELFdBQU87TUFBQztRQUFDckIsT0FBTzREO01BQUk7TUFBRztRQUFDNUQsT0FBTzZEO01BQUk7SUFBRTs7QUFHdkNRLGNBQVl4RSxLQUFLeUUsS0FBS1QsT0FBT0csT0FBQUEsSUFBV25FLEtBQUswRSxNQUFNWCxPQUFPSSxPQUFBQTtBQUMxRCxNQUFJSyxZQUFZVixXQUFXO0FBRXpCSyxjQUFVQyxRQUFRSSxZQUFZTCxVQUFVTCxZQUFZRCxJQUFRQSxJQUFBQTs7QUFHOUQsTUFBSSxDQUFDMUMsY0FBY3FDLFNBQVksR0FBQTtBQUU3QmEsYUFBU3JFLEtBQUsyRSxJQUFJLElBQUluQixTQUFBQTtBQUN0QlcsY0FBVW5FLEtBQUt5RSxLQUFLTixVQUFVRSxNQUFVQSxJQUFBQTs7QUFHMUMsTUFBSXhDLFdBQVcsU0FBUztBQUN0QnlDLGNBQVV0RSxLQUFLMEUsTUFBTVgsT0FBT0ksT0FBV0EsSUFBQUE7QUFDdkNJLGNBQVV2RSxLQUFLeUUsS0FBS1QsT0FBT0csT0FBV0EsSUFBQUE7U0FDakM7QUFDTEcsY0FBVVA7QUFDVlEsY0FBVVA7O0FBR1osTUFBSXpDLGNBQWNDLGNBQWMrQixRQUFRcUIsYUFBYTlFLE1BQU00QixPQUFPNkIsTUFBTVksVUFBVSxHQUFPLEdBQUE7QUFLdkZLLGdCQUFZeEUsS0FBS0MsTUFBTUQsS0FBSzBCLEtBQUs1QixNQUFNNEIsT0FBT3lDLFNBQVNULFFBQUFBLENBQUFBO0FBQ3ZEUyxlQUFXckUsTUFBTTRCLE9BQU84QztBQUN4QkYsY0FBVTVDO0FBQ1Y2QyxjQUFVekU7RUFDWixXQUFXbUUsY0FBYztBQUl2QkssY0FBVS9DLGFBQWFHLE1BQU00QztBQUM3QkMsY0FBVS9DLGFBQWExQixNQUFNeUU7QUFDN0JDLGdCQUFZZixRQUFRO0FBQ3BCVSxlQUFXSSxVQUFVRCxXQUFXRTtTQUMzQjtBQUVMQSxpQkFBYUQsVUFBVUQsV0FBV0g7QUFHbEMsUUFBSVUsYUFBYUwsV0FBV3hFLEtBQUtDLE1BQU11RSxTQUFBQSxHQUFZTCxVQUFVLEdBQU8sR0FBQTtBQUNsRUssa0JBQVl4RSxLQUFLQyxNQUFNdUUsU0FBQUE7V0FDbEI7QUFDTEEsa0JBQVl4RSxLQUFLeUUsS0FBS0QsU0FBQUE7OztBQU0xQixRQUFNTSxnQkFBZ0I5RSxLQUFLRixJQUN6QmlGLGVBQWVaLE9BQUFBLEdBQ2ZZLGVBQWVULE9BQUFBLENBQUFBO0FBRWpCRCxXQUFTckUsS0FBSzJFLElBQUksSUFBSXhELGNBQWNxQyxTQUFBQSxJQUFhc0IsZ0JBQWdCdEIsU0FBUztBQUMxRWMsWUFBVXRFLEtBQUtDLE1BQU1xRSxVQUFVRCxNQUFVQSxJQUFBQTtBQUN6Q0UsWUFBVXZFLEtBQUtDLE1BQU1zRSxVQUFVRixNQUFVQSxJQUFBQTtBQUV6QyxNQUFJVyxJQUFJO0FBQ1IsTUFBSXpELFlBQVk7QUFDZCxRQUFJcUMsaUJBQWlCVSxZQUFZNUMsS0FBSztBQUNwQ00sWUFBTTVDLEtBQUs7UUFBQ2UsT0FBT3VCO01BQUcsQ0FBQTtBQUV0QixVQUFJNEMsVUFBVTVDLEtBQUs7QUFDakJzRDs7QUFHRixVQUFJSCxhQUFhN0UsS0FBS0MsT0FBT3FFLFVBQVVVLElBQUliLFdBQVdFLE1BQUFBLElBQVVBLFFBQVEzQyxLQUFLdUQsa0JBQWtCdkQsS0FBS3dDLFlBQVlkLGlCQUFxQixDQUFBLEdBQUE7QUFDbkk0Qjs7ZUFFT1YsVUFBVTVDLEtBQUs7QUFDeEJzRDs7O0FBSUosU0FBT0EsSUFBSVIsV0FBVyxFQUFFUSxHQUFHO0FBQ3pCLFVBQU1FLFlBQVlsRixLQUFLQyxPQUFPcUUsVUFBVVUsSUFBSWIsV0FBV0UsTUFBVUEsSUFBQUE7QUFDakUsUUFBSTdDLGNBQWMwRCxZQUFZcEYsS0FBSztBQUNqQzs7QUFFRmtDLFVBQU01QyxLQUFLO01BQUNlLE9BQU8rRTtJQUFTLENBQUE7RUFDOUI7QUFFQSxNQUFJMUQsY0FBY29DLGlCQUFpQlcsWUFBWXpFLEtBQUs7QUFFbEQsUUFBSWtDLE1BQU0zQixVQUFVd0UsYUFBYTdDLE1BQU1BLE1BQU0zQixTQUFTLENBQUEsRUFBR0YsT0FBT0wsS0FBS21GLGtCQUFrQm5GLEtBQUtvRSxZQUFZZCxpQkFBcUIsQ0FBQSxHQUFBO0FBQzNIcEIsWUFBTUEsTUFBTTNCLFNBQVMsQ0FBRSxFQUFDRixRQUFRTDtXQUMzQjtBQUNMa0MsWUFBTTVDLEtBQUs7UUFBQ2UsT0FBT0w7TUFBRyxDQUFBOztFQUUxQixXQUFXLENBQUMwQixjQUFjK0MsWUFBWXpFLEtBQUs7QUFDekNrQyxVQUFNNUMsS0FBSztNQUFDZSxPQUFPb0U7SUFBTyxDQUFBOztBQUc1QixTQUFPdkM7QUFDVDtBQUVBLFNBQVNpRCxrQkFBa0I5RSxPQUFPK0QsWUFBWSxFQUFDaUIsWUFBWUMsWUFBVyxHQUFHO0FBQ3ZFLFFBQU1DLE1BQU1DLFVBQVVGLFdBQUFBO0FBQ3RCLFFBQU1HLFNBQVNKLGFBQWFuRixLQUFLd0YsSUFBSUgsR0FBQUEsSUFBT3JGLEtBQUt5RixJQUFJSixHQUFBQSxNQUFTO0FBQzlELFFBQU1oRixTQUFTLE9BQU82RCxjQUFjLEtBQUsvRCxPQUFPRTtBQUNoRCxTQUFPTCxLQUFLMEIsSUFBSXdDLGFBQWFxQixPQUFPbEYsTUFBQUE7QUFDdEM7QUFFZSxJQUFNcUYsa0JBQU4sY0FBOEJuRixNQUFBQTtFQUUzQ0MsWUFBWUMsS0FBSztBQUNmLFVBQU1BLEdBQUFBO0FBR04sU0FBS2tGLFFBQVFoRjtBQUViLFNBQUtpRixNQUFNakY7QUFFWCxTQUFLRCxjQUFjQztBQUVuQixTQUFLa0YsWUFBWWxGO0FBQ2pCLFNBQUtDLGNBQWM7RUFDckI7RUFFQU0sTUFBTWpDLEtBQUtDLE9BQU87QUFDaEIsUUFBSWlDLGNBQWNsQyxHQUFNLEdBQUE7QUFDdEIsYUFBTzs7QUFFVCxTQUFLLE9BQU9BLFFBQVEsWUFBWUEsZUFBZTZHLFdBQVcsQ0FBQzFFLFNBQVMsQ0FBQ25DLEdBQU0sR0FBQTtBQUN6RSxhQUFPOztBQUdULFdBQU8sQ0FBQ0E7RUFDVjtFQUVBOEcseUJBQXlCO0FBQ3ZCLFVBQU0sRUFBQ0MsWUFBVyxJQUFJLEtBQUtwRTtBQUMzQixVQUFNLEVBQUNMLFlBQVlDLFdBQUFBLElBQWMsS0FBS0MsY0FBYTtBQUNuRCxRQUFJLEVBQUNDLEtBQUs1QixJQUFHLElBQUk7QUFFakIsVUFBTW1HLFNBQVNDLENBQUFBLE1BQU14RSxNQUFNSCxhQUFhRyxNQUFNd0U7QUFDOUMsVUFBTUMsU0FBU0QsQ0FBQUEsTUFBTXBHLE1BQU0wQixhQUFhMUIsTUFBTW9HO0FBRTlDLFFBQUlGLGFBQWE7QUFDZixZQUFNSSxVQUFVQyxLQUFLM0UsR0FBQUE7QUFDckIsWUFBTTRFLFVBQVVELEtBQUt2RyxHQUFBQTtBQUVyQixVQUFJc0csVUFBVSxLQUFLRSxVQUFVLEdBQUc7QUFDOUJILGVBQU8sQ0FBQTtNQUNULFdBQVdDLFVBQVUsS0FBS0UsVUFBVSxHQUFHO0FBQ3JDTCxlQUFPLENBQUE7OztBQUlYLFFBQUl2RSxRQUFRNUIsS0FBSztBQUNmLFVBQUlpQyxTQUFTakMsUUFBUSxJQUFJLElBQUlFLEtBQUt1RyxJQUFJekcsTUFBTSxJQUFLO0FBRWpEcUcsYUFBT3JHLE1BQU1pQyxNQUFBQTtBQUViLFVBQUksQ0FBQ2lFLGFBQWE7QUFDaEJDLGVBQU92RSxNQUFNSyxNQUFBQTs7O0FBR2pCLFNBQUtMLE1BQU1BO0FBQ1gsU0FBSzVCLE1BQU1BO0VBQ2I7RUFFQTBHLGVBQWU7QUFDYixVQUFNQyxXQUFXLEtBQUs3RSxRQUFRSTtBQUU5QixRQUFJLEVBQUMwRSxlQUFlQyxTQUFBQSxJQUFZRjtBQUNoQyxRQUFJL0M7QUFFSixRQUFJaUQsVUFBVTtBQUNaakQsaUJBQVcxRCxLQUFLeUUsS0FBSyxLQUFLM0UsTUFBTTZHLFFBQVkzRyxJQUFBQSxLQUFLMEUsTUFBTSxLQUFLaEQsTUFBTWlGLFFBQVksSUFBQTtBQUM5RSxVQUFJakQsV0FBVyxLQUFNO0FBQ25Ca0QsZ0JBQVFDLEtBQUssVUFBVSxLQUFLN0QsRUFBRSxvQkFBb0IyRCxRQUFTLGtDQUFpQ2pELFFBQUFBLDJCQUFtQztBQUMvSEEsbUJBQVc7O1dBRVI7QUFDTEEsaUJBQVcsS0FBS29ELGlCQUFnQjtBQUNoQ0osc0JBQWdCQSxpQkFBaUI7O0FBR25DLFFBQUlBLGVBQWU7QUFDakJoRCxpQkFBVzFELEtBQUswQixJQUFJZ0YsZUFBZWhELFFBQUFBOztBQUdyQyxXQUFPQTtFQUNUO0VBS0FvRCxtQkFBbUI7QUFDakIsV0FBT2hCLE9BQU9pQjtFQUNoQjtFQUVBakYsYUFBYTtBQUNYLFVBQU1rRixPQUFPLEtBQUtwRjtBQUNsQixVQUFNNkUsV0FBV08sS0FBS2hGO0FBTXRCLFFBQUkwQixXQUFXLEtBQUs4QyxhQUFZO0FBQ2hDOUMsZUFBVzFELEtBQUtGLElBQUksR0FBRzRELFFBQUFBO0FBRXZCLFVBQU11RCwwQkFBMEI7TUFDOUJ2RDtNQUNBN0IsUUFBUW1GLEtBQUtuRjtNQUNiSCxLQUFLc0YsS0FBS3RGO01BQ1Y1QixLQUFLa0gsS0FBS2xIO01BQ1YwRCxXQUFXaUQsU0FBU2pEO01BQ3BCRCxNQUFNa0QsU0FBU0U7TUFDZmxELE9BQU9nRCxTQUFTaEQ7TUFDaEJFLFdBQVcsS0FBS3VELFdBQVU7TUFDMUIvQixZQUFZLEtBQUs5QyxhQUFZO01BQzdCK0MsYUFBYXFCLFNBQVNyQixlQUFlO01BQ3JDeEIsZUFBZTZDLFNBQVM3QyxrQkFBa0I7SUFDNUM7QUFDQSxVQUFNUCxZQUFZLEtBQUs4RCxVQUFVO0FBQ2pDLFVBQU1uRixRQUFRbUIsZ0JBQWM4RCx5QkFBeUI1RCxTQUFBQTtBQUlyRCxRQUFJMkQsS0FBS25GLFdBQVcsU0FBUztBQUMzQnVGLHlCQUFtQnBGLE9BQU8sTUFBTSxPQUFBOztBQUdsQyxRQUFJZ0YsS0FBS0ssU0FBUztBQUNoQnJGLFlBQU1xRixRQUFPO0FBRWIsV0FBSzFCLFFBQVEsS0FBSzdGO0FBQ2xCLFdBQUs4RixNQUFNLEtBQUtsRTtXQUNYO0FBQ0wsV0FBS2lFLFFBQVEsS0FBS2pFO0FBQ2xCLFdBQUtrRSxNQUFNLEtBQUs5Rjs7QUFHbEIsV0FBT2tDO0VBQ1Q7RUFLQUksWUFBWTtBQUNWLFVBQU1KLFFBQVEsS0FBS0E7QUFDbkIsUUFBSTJELFFBQVEsS0FBS2pFO0FBQ2pCLFFBQUlrRSxNQUFNLEtBQUs5RjtBQUVmLFVBQU1zQyxVQUFTO0FBRWYsUUFBSSxLQUFLUixRQUFRRyxVQUFVQyxNQUFNM0IsUUFBUTtBQUN2QyxZQUFNMEIsVUFBVTZELE1BQU1ELFNBQVMzRixLQUFLRixJQUFJa0MsTUFBTTNCLFNBQVMsR0FBRyxDQUFLLElBQUE7QUFDL0RzRixlQUFTNUQ7QUFDVDZELGFBQU83RDs7QUFFVCxTQUFLckIsY0FBY2lGO0FBQ25CLFNBQUtFLFlBQVlEO0FBQ2pCLFNBQUtoRixjQUFjZ0YsTUFBTUQ7RUFDM0I7RUFFQXpELGlCQUFpQi9CLE9BQU87QUFDdEIsV0FBT21ILGFBQWFuSCxPQUFPLEtBQUtvSCxNQUFNM0YsUUFBUTRGLFFBQVEsS0FBSzVGLFFBQVFJLE1BQU15RixNQUFNO0VBQ2pGO0FBQ0Y7QUNuVGUsSUFBTUMsY0FBTixjQUEwQmhDLGdCQUFBQTtFQWN2Q3BFLHNCQUFzQjtBQUNwQixVQUFNLEVBQUNJLEtBQUs1QixJQUFHLElBQUksS0FBSzZCLFVBQVUsSUFBSTtBQUV0QyxTQUFLRCxNQUFNTixlQUFTTSxHQUFBQSxJQUFPQSxNQUFNO0FBQ2pDLFNBQUs1QixNQUFNc0IsZUFBU3RCLEdBQUFBLElBQU9BLE1BQU07QUFHakMsU0FBS2lHLHVCQUFzQjtFQUM3QjtFQU1BZSxtQkFBbUI7QUFDakIsVUFBTTNCLGFBQWEsS0FBSzlDLGFBQVk7QUFDcEMsVUFBTWhDLFNBQVM4RSxhQUFhLEtBQUt3QyxRQUFRLEtBQUtDO0FBQzlDLFVBQU14QyxjQUFjRSxVQUFVLEtBQUsxRCxRQUFRSSxNQUFNb0QsV0FBVztBQUM1RCxVQUFNRyxTQUFTSixhQUFhbkYsS0FBS3dGLElBQUlKLFdBQUFBLElBQWVwRixLQUFLeUYsSUFBSUwsV0FBQUEsTUFBaUI7QUFDOUUsVUFBTXlDLFdBQVcsS0FBS0Msd0JBQXdCLENBQUE7QUFDOUMsV0FBTzlILEtBQUt5RSxLQUFLcEUsU0FBU0wsS0FBSzBCLElBQUksSUFBSW1HLFNBQVNFLGFBQWF4QyxLQUFBQSxDQUFBQTtFQUMvRDtFQUdBaEQsaUJBQWlCcEMsT0FBTztBQUN0QixXQUFPQSxVQUFVLE9BQU9xQyxNQUFNLEtBQUtDLG9CQUFvQnRDLFFBQVEsS0FBS08sZUFBZSxLQUFLRSxXQUFXO0VBQ3JHO0VBRUErQixpQkFBaUJDLE9BQU87QUFDdEIsV0FBTyxLQUFLbEMsY0FBYyxLQUFLbUMsbUJBQW1CRCxLQUFBQSxJQUFTLEtBQUtoQztFQUNsRTtBQUNGO0FBM0NFLGNBRm1COEcsYUFFWjFFLE1BQUs7QUFLWixjQVBtQjBFLGFBT1p6RSxZQUFXO0VBQ2hCakIsT0FBTztJQUNMa0IsVUFBVThFLE1BQU1DLFdBQVdDO0VBQzdCOztBQ1JKLElBQU1DLGFBQWFqQyxDQUFBQSxNQUFLbEcsS0FBSzBFLE1BQU0wRCxNQUFNbEMsQ0FBQUEsQ0FBQUE7QUFDekMsSUFBTW1DLGlCQUFpQixDQUFDbkMsR0FBR29DLE1BQU10SSxLQUFLMkUsSUFBSSxJQUFJd0QsV0FBV2pDLENBQUtvQyxJQUFBQSxDQUFBQTtBQUU5RCxTQUFTQyxRQUFRQyxTQUFTO0FBQ3hCLFFBQU1DLFNBQVNELFVBQVd4SSxLQUFLMkUsSUFBSSxJQUFJd0QsV0FBV0ssT0FBQUEsQ0FBQUE7QUFDbEQsU0FBT0MsV0FBVztBQUNwQjtBQUVBLFNBQVNDLE1BQU1oSCxLQUFLNUIsS0FBSzZJLFVBQVU7QUFDakMsUUFBTUMsWUFBWTVJLEtBQUsyRSxJQUFJLElBQUlnRSxRQUFBQTtBQUMvQixRQUFNaEQsUUFBUTNGLEtBQUswRSxNQUFNaEQsTUFBTWtILFNBQUFBO0FBQy9CLFFBQU1oRCxNQUFNNUYsS0FBS3lFLEtBQUszRSxNQUFNOEksU0FBQUE7QUFDNUIsU0FBT2hELE1BQU1EO0FBQ2Y7QUFFQSxTQUFTa0QsU0FBU25ILEtBQUs1QixLQUFLO0FBQzFCLFFBQU1nSixRQUFRaEosTUFBTTRCO0FBQ3BCLE1BQUlpSCxXQUFXUixXQUFXVyxLQUFBQTtBQUMxQixTQUFPSixNQUFNaEgsS0FBSzVCLEtBQUs2SSxRQUFBQSxJQUFZLElBQUk7QUFDckNBO0VBQ0Y7QUFDQSxTQUFPRCxNQUFNaEgsS0FBSzVCLEtBQUs2SSxRQUFBQSxJQUFZLElBQUk7QUFDckNBO0VBQ0Y7QUFDQSxTQUFPM0ksS0FBSzBCLElBQUlpSCxVQUFVUixXQUFXekcsR0FBQUEsQ0FBQUE7QUFDdkM7QUFTQSxTQUFTeUIsY0FBY0MsbUJBQW1CLEVBQUMxQixLQUFLNUIsSUFBRyxHQUFHO0FBQ3BENEIsUUFBTXFILGdCQUFnQjNGLGtCQUFrQjFCLEtBQUtBLEdBQUFBO0FBQzdDLFFBQU1NLFFBQVEsQ0FBQTtBQUNkLFFBQU1nSCxTQUFTYixXQUFXekcsR0FBQUE7QUFDMUIsTUFBSXVILE1BQU1KLFNBQVNuSCxLQUFLNUIsR0FBQUE7QUFDeEIsTUFBSTBELFlBQVl5RixNQUFNLElBQUlqSixLQUFLMkUsSUFBSSxJQUFJM0UsS0FBS3VHLElBQUkwQyxHQUFBQSxDQUFBQSxJQUFRO0FBQ3hELFFBQU10QyxXQUFXM0csS0FBSzJFLElBQUksSUFBSXNFLEdBQUFBO0FBQzlCLFFBQU1DLE9BQU9GLFNBQVNDLE1BQU1qSixLQUFLMkUsSUFBSSxJQUFJcUUsTUFBQUEsSUFBVTtBQUNuRCxRQUFNckQsUUFBUTNGLEtBQUtDLE9BQU95QixNQUFNd0gsUUFBUTFGLFNBQWFBLElBQUFBO0FBQ3JELFFBQU16QixTQUFTL0IsS0FBSzBFLE9BQU9oRCxNQUFNd0gsUUFBUXZDLFdBQVcsRUFBQSxJQUFNQSxXQUFXO0FBQ3JFLE1BQUl3QyxjQUFjbkosS0FBSzBFLE9BQU9pQixRQUFRNUQsVUFBVS9CLEtBQUsyRSxJQUFJLElBQUlzRSxHQUFBQSxDQUFBQTtBQUM3RCxNQUFJOUksUUFBUTRJLGdCQUFnQjNGLGtCQUFrQjFCLEtBQUsxQixLQUFLQyxPQUFPaUosT0FBT25ILFNBQVNvSCxjQUFjbkosS0FBSzJFLElBQUksSUFBSXNFLEdBQUFBLEtBQVF6RixTQUFhQSxJQUFBQSxTQUFBQTtBQUMvSCxTQUFPckQsUUFBUUwsS0FBSztBQUNsQmtDLFVBQU01QyxLQUFLO01BQUNlO01BQU9pSixPQUFPYixRQUFRcEksS0FBQUE7TUFBUWdKO0lBQVcsQ0FBQTtBQUNyRCxRQUFJQSxlQUFlLElBQUk7QUFDckJBLG9CQUFjQSxjQUFjLEtBQUssS0FBSztXQUNqQztBQUNMQTs7QUFFRixRQUFJQSxlQUFlLElBQUk7QUFDckJGO0FBQ0FFLG9CQUFjO0FBQ2QzRixrQkFBWXlGLE9BQU8sSUFBSSxJQUFJekY7O0FBRTdCckQsWUFBUUgsS0FBS0MsT0FBT2lKLE9BQU9uSCxTQUFTb0gsY0FBY25KLEtBQUsyRSxJQUFJLElBQUlzRSxHQUFBQSxLQUFRekYsU0FBYUEsSUFBQUE7RUFDdEY7QUFDQSxRQUFNNkYsV0FBV04sZ0JBQWdCM0Ysa0JBQWtCdEQsS0FBS0ssS0FBQUE7QUFDeEQ2QixRQUFNNUMsS0FBSztJQUFDZSxPQUFPa0o7SUFBVUQsT0FBT2IsUUFBUWMsUUFBQUE7SUFBV0Y7RUFBVyxDQUFBO0FBRWxFLFNBQU9uSDtBQUNUO0FBRWUsSUFBTXNILG1CQUFOLGNBQStCL0ksTUFBQUE7RUFpQjVDQyxZQUFZQyxLQUFLO0FBQ2YsVUFBTUEsR0FBQUE7QUFHTixTQUFLa0YsUUFBUWhGO0FBRWIsU0FBS2lGLE1BQU1qRjtBQUVYLFNBQUtELGNBQWNDO0FBQ25CLFNBQUtDLGNBQWM7RUFDckI7RUFFQU0sTUFBTWpDLEtBQUtDLE9BQU87QUFDaEIsVUFBTWlCLFFBQVF1RixnQkFBZ0I2RCxVQUFVckksTUFBTXNJLE1BQU0sTUFBTTtNQUFDdks7TUFBS0M7SUFBTSxDQUFBO0FBQ3RFLFFBQUlpQixVQUFVLEdBQUc7QUFDZixXQUFLc0osUUFBUTtBQUNiLGFBQU85STs7QUFFVCxXQUFPUyxlQUFTakIsS0FBQUEsS0FBVUEsUUFBUSxJQUFJQSxRQUFRO0VBQ2hEO0VBRUFtQixzQkFBc0I7QUFDcEIsVUFBTSxFQUFDSSxLQUFLNUIsSUFBRyxJQUFJLEtBQUs2QixVQUFVLElBQUk7QUFFdEMsU0FBS0QsTUFBTU4sZUFBU00sR0FBQUEsSUFBTzFCLEtBQUtGLElBQUksR0FBRzRCLEdBQUFBLElBQU87QUFDOUMsU0FBSzVCLE1BQU1zQixlQUFTdEIsR0FBQUEsSUFBT0UsS0FBS0YsSUFBSSxHQUFHQSxHQUFBQSxJQUFPO0FBRTlDLFFBQUksS0FBSzhCLFFBQVFvRSxhQUFhO0FBQzVCLFdBQUt5RCxRQUFROztBQUtmLFFBQUksS0FBS0EsU0FBUyxLQUFLL0gsUUFBUSxLQUFLZ0ksaUJBQWlCLENBQUN0SSxlQUFTLEtBQUt1SSxRQUFRLEdBQUc7QUFDN0UsV0FBS2pJLE1BQU1BLFFBQVEyRyxlQUFlLEtBQUszRyxLQUFLLENBQUsyRyxJQUFBQSxlQUFlLEtBQUszRyxLQUFLLEVBQUMsSUFBSzJHLGVBQWUsS0FBSzNHLEtBQUssQ0FBRTs7QUFHN0csU0FBS3FFLHVCQUFzQjtFQUM3QjtFQUVBQSx5QkFBeUI7QUFDdkIsVUFBTSxFQUFDeEUsWUFBWUMsV0FBQUEsSUFBYyxLQUFLQyxjQUFhO0FBQ25ELFFBQUlDLE1BQU0sS0FBS0E7QUFDZixRQUFJNUIsTUFBTSxLQUFLQTtBQUVmLFVBQU1tRyxTQUFTQyxDQUFBQSxNQUFNeEUsTUFBTUgsYUFBYUcsTUFBTXdFO0FBQzlDLFVBQU1DLFNBQVNELENBQUFBLE1BQU1wRyxNQUFNMEIsYUFBYTFCLE1BQU1vRztBQUU5QyxRQUFJeEUsUUFBUTVCLEtBQUs7QUFDZixVQUFJNEIsT0FBTyxHQUFHO0FBQ1p1RSxlQUFPLENBQUE7QUFDUEUsZUFBTyxFQUFBO2FBQ0Y7QUFDTEYsZUFBT29DLGVBQWUzRyxLQUFLLEVBQUMsQ0FBQTtBQUM1QnlFLGVBQU9rQyxlQUFldkksS0FBSyxDQUFDLENBQUE7OztBQUdoQyxRQUFJNEIsT0FBTyxHQUFHO0FBQ1p1RSxhQUFPb0MsZUFBZXZJLEtBQUssRUFBQyxDQUFBOztBQUU5QixRQUFJQSxPQUFPLEdBQUc7QUFFWnFHLGFBQU9rQyxlQUFlM0csS0FBSyxDQUFDLENBQUE7O0FBRzlCLFNBQUtBLE1BQU1BO0FBQ1gsU0FBSzVCLE1BQU1BO0VBQ2I7RUFFQWdDLGFBQWE7QUFDWCxVQUFNa0YsT0FBTyxLQUFLcEY7QUFFbEIsVUFBTXdCLG9CQUFvQjtNQUN4QjFCLEtBQUssS0FBS2lJO01BQ1Y3SixLQUFLLEtBQUs4SjtJQUNaO0FBQ0EsVUFBTTVILFFBQVFtQixjQUFjQyxtQkFBbUIsSUFBSTtBQUluRCxRQUFJNEQsS0FBS25GLFdBQVcsU0FBUztBQUMzQnVGLHlCQUFtQnBGLE9BQU8sTUFBTSxPQUFBOztBQUdsQyxRQUFJZ0YsS0FBS0ssU0FBUztBQUNoQnJGLFlBQU1xRixRQUFPO0FBRWIsV0FBSzFCLFFBQVEsS0FBSzdGO0FBQ2xCLFdBQUs4RixNQUFNLEtBQUtsRTtXQUNYO0FBQ0wsV0FBS2lFLFFBQVEsS0FBS2pFO0FBQ2xCLFdBQUtrRSxNQUFNLEtBQUs5Rjs7QUFHbEIsV0FBT2tDO0VBQ1Q7RUFNQUUsaUJBQWlCL0IsT0FBTztBQUN0QixXQUFPQSxVQUFVUSxTQUNiLE1BQ0EyRyxhQUFhbkgsT0FBTyxLQUFLb0gsTUFBTTNGLFFBQVE0RixRQUFRLEtBQUs1RixRQUFRSSxNQUFNeUYsTUFBTTtFQUM5RTtFQUtBckYsWUFBWTtBQUNWLFVBQU11RCxRQUFRLEtBQUtqRTtBQUVuQixVQUFNVSxVQUFTO0FBRWYsU0FBSzFCLGNBQWMwSCxNQUFNekMsS0FBQUE7QUFDekIsU0FBSy9FLGNBQWN3SCxNQUFNLEtBQUt0SSxHQUFHLElBQUlzSSxNQUFNekMsS0FBQUE7RUFDN0M7RUFFQXBELGlCQUFpQnBDLE9BQU87QUFDdEIsUUFBSUEsVUFBVVEsVUFBYVIsVUFBVSxHQUFHO0FBQ3RDQSxjQUFRLEtBQUt1Qjs7QUFFZixRQUFJdkIsVUFBVSxRQUFRWixNQUFNWSxLQUFRLEdBQUE7QUFDbEMsYUFBT3FDOztBQUVULFdBQU8sS0FBS0MsbUJBQW1CdEMsVUFBVSxLQUFLdUIsTUFDMUMsS0FDQzBHLE1BQU1qSSxLQUFBQSxJQUFTLEtBQUtPLGVBQWUsS0FBS0UsV0FBVztFQUMxRDtFQUVBK0IsaUJBQWlCQyxPQUFPO0FBQ3RCLFVBQU1pSCxVQUFVLEtBQUtoSCxtQkFBbUJELEtBQUFBO0FBQ3hDLFdBQU81QyxLQUFLMkUsSUFBSSxJQUFJLEtBQUtqRSxjQUFjbUosVUFBVSxLQUFLakosV0FBVztFQUNuRTtBQUNGO0FBdEpFLGNBRm1CMEksa0JBRVp0RyxNQUFLO0FBS1osY0FQbUJzRyxrQkFPWnJHLFlBQVc7RUFDaEJqQixPQUFPO0lBQ0xrQixVQUFVOEUsTUFBTUMsV0FBVzZCO0lBQzNCVixPQUFPO01BQ0xXLFNBQVM7SUFDWDtFQUNGOztBQzlFSixTQUFTQyxzQkFBc0JoRCxNQUFNO0FBQ25DLFFBQU1QLFdBQVdPLEtBQUtoRjtBQUV0QixNQUFJeUUsU0FBU3dELFdBQVdqRCxLQUFLaUQsU0FBUztBQUNwQyxVQUFNQyxVQUFVQyxVQUFVMUQsU0FBUzJELGVBQWU7QUFDbEQsV0FBTy9JLGVBQWVvRixTQUFTNEQsUUFBUTVELFNBQVM0RCxLQUFLQyxNQUFNckgsU0FBU29ILEtBQUtDLElBQUksSUFBSUosUUFBUXRDOztBQUUzRixTQUFPO0FBQ1Q7QUFFQSxTQUFTMkMsaUJBQWlCQyxLQUFLSCxNQUFNL0ssT0FBTztBQUMxQ0EsVUFBUW1MLFFBQVFuTCxLQUFBQSxJQUFTQSxRQUFRO0lBQUNBO0VBQU07QUFDeEMsU0FBTztJQUNMb0wsR0FBR0MsYUFBYUgsS0FBS0gsS0FBS08sUUFBUXRMLEtBQUFBO0lBQ2xDdUwsR0FBR3ZMLE1BQU1lLFNBQVNnSyxLQUFLdEM7RUFDekI7QUFDRjtBQUVBLFNBQVMrQyxnQkFBZ0JDLE9BQU9DLEtBQUtWLE1BQU01SSxLQUFLNUIsS0FBSztBQUNuRCxNQUFJaUwsVUFBVXJKLE9BQU9xSixVQUFVakwsS0FBSztBQUNsQyxXQUFPO01BQ0w2RixPQUFPcUYsTUFBT1YsT0FBTztNQUNyQjFFLEtBQUtvRixNQUFPVixPQUFPO0lBQ3JCO0VBQ0YsV0FBV1MsUUFBUXJKLE9BQU9xSixRQUFRakwsS0FBSztBQUNyQyxXQUFPO01BQ0w2RixPQUFPcUYsTUFBTVY7TUFDYjFFLEtBQUtvRjtJQUNQOztBQUdGLFNBQU87SUFDTHJGLE9BQU9xRjtJQUNQcEYsS0FBS29GLE1BQU1WO0VBQ2I7QUFDRjtBQUtBLFNBQVNXLG1CQUFtQkMsT0FBTztBQThCakMsUUFBTUMsT0FBTztJQUNYQyxHQUFHRixNQUFNRyxPQUFPSCxNQUFNSSxTQUFTRDtJQUMvQkUsR0FBR0wsTUFBTU0sUUFBUU4sTUFBTUksU0FBU0U7SUFDaENDLEdBQUdQLE1BQU1RLE1BQU1SLE1BQU1JLFNBQVNJO0lBQzlCQyxHQUFHVCxNQUFNbkksU0FBU21JLE1BQU1JLFNBQVN2STtFQUNuQztBQUNBLFFBQU02SSxTQUFTQyxPQUFPQyxPQUFPLENBQUEsR0FBSVgsSUFBQUE7QUFDakMsUUFBTVksYUFBYSxDQUFBO0FBQ25CLFFBQU03QixVQUFVLENBQUE7QUFDaEIsUUFBTThCLGFBQWFkLE1BQU1lLGFBQWE1TDtBQUN0QyxRQUFNNkwsaUJBQWlCaEIsTUFBTXRKLFFBQVF1SztBQUNyQyxRQUFNQyxrQkFBa0JGLGVBQWVHLG9CQUFvQkMsS0FBS04sYUFBYTtBQUU3RSxXQUFTTyxJQUFJLEdBQUdBLElBQUlQLFlBQVlPLEtBQUs7QUFDbkMsVUFBTXZGLE9BQU9rRixlQUFlTSxXQUFXdEIsTUFBTXVCLHFCQUFxQkYsQ0FBQUEsQ0FBQUE7QUFDbEVyQyxZQUFRcUMsQ0FBQUEsSUFBS3ZGLEtBQUtrRDtBQUNsQixVQUFNd0MsZ0JBQWdCeEIsTUFBTXlCLGlCQUFpQkosR0FBR3JCLE1BQU0wQixjQUFjMUMsUUFBUXFDLENBQUFBLEdBQUlILGVBQUFBO0FBQ2hGLFVBQU1TLFNBQVNDLE9BQU85RixLQUFLcUQsSUFBSTtBQUMvQixVQUFNMEMsV0FBV3hDLGlCQUFpQlcsTUFBTVYsS0FBS3FDLFFBQVEzQixNQUFNZSxhQUFhTSxDQUFFLENBQUE7QUFDMUVSLGVBQVdRLENBQUFBLElBQUtRO0FBRWhCLFVBQU1DLGVBQWVDLGdCQUFnQi9CLE1BQU1nQyxjQUFjWCxDQUFLSCxJQUFBQSxlQUFBQTtBQUM5RCxVQUFNckIsUUFBUS9LLEtBQUtDLE1BQU1rTixVQUFVSCxZQUFBQSxDQUFBQTtBQUNuQyxVQUFNSSxVQUFVdEMsZ0JBQWdCQyxPQUFPMkIsY0FBY1csR0FBR04sU0FBU3JDLEdBQUcsR0FBRyxHQUFBO0FBQ3ZFLFVBQU00QyxVQUFVeEMsZ0JBQWdCQyxPQUFPMkIsY0FBY2EsR0FBR1IsU0FBU2xDLEdBQUcsSUFBSSxHQUFBO0FBQ3hFMkMsaUJBQWE1QixRQUFRVCxNQUFNNkIsY0FBY0ksU0FBU0UsT0FBQUE7RUFDcEQ7QUFFQXBDLFFBQU11QyxlQUNKdEMsS0FBS0MsSUFBSVEsT0FBT1IsR0FDaEJRLE9BQU9MLElBQUlKLEtBQUtJLEdBQ2hCSixLQUFLTSxJQUFJRyxPQUFPSCxHQUNoQkcsT0FBT0QsSUFBSVIsS0FBS1EsQ0FBQztBQUluQlQsUUFBTXdDLG1CQUFtQkMscUJBQXFCekMsT0FBT2EsWUFBWTdCLE9BQUFBO0FBQ25FO0FBRUEsU0FBU3NELGFBQWE1QixRQUFRVCxNQUFNSixPQUFPcUMsU0FBU0UsU0FBUztBQUMzRCxRQUFNOUgsTUFBTXhGLEtBQUt1RyxJQUFJdkcsS0FBS3dGLElBQUl1RixLQUFBQSxDQUFBQTtBQUM5QixRQUFNdEYsTUFBTXpGLEtBQUt1RyxJQUFJdkcsS0FBS3lGLElBQUlzRixLQUFBQSxDQUFBQTtBQUM5QixNQUFJc0MsSUFBSTtBQUNSLE1BQUlFLElBQUk7QUFDUixNQUFJSCxRQUFRekgsUUFBUXdGLEtBQUtDLEdBQUc7QUFDMUJpQyxTQUFLbEMsS0FBS0MsSUFBSWdDLFFBQVF6SCxTQUFTSDtBQUMvQm9HLFdBQU9SLElBQUlwTCxLQUFLMEIsSUFBSWtLLE9BQU9SLEdBQUdELEtBQUtDLElBQUlpQyxDQUFBQTtFQUN6QyxXQUFXRCxRQUFReEgsTUFBTXVGLEtBQUtJLEdBQUc7QUFDL0I4QixTQUFLRCxRQUFReEgsTUFBTXVGLEtBQUtJLEtBQUsvRjtBQUM3Qm9HLFdBQU9MLElBQUl2TCxLQUFLRixJQUFJOEwsT0FBT0wsR0FBR0osS0FBS0ksSUFBSThCLENBQUFBOztBQUV6QyxNQUFJQyxRQUFRM0gsUUFBUXdGLEtBQUtNLEdBQUc7QUFDMUI4QixTQUFLcEMsS0FBS00sSUFBSTZCLFFBQVEzSCxTQUFTRjtBQUMvQm1HLFdBQU9ILElBQUl6TCxLQUFLMEIsSUFBSWtLLE9BQU9ILEdBQUdOLEtBQUtNLElBQUk4QixDQUFBQTtFQUN6QyxXQUFXRCxRQUFRMUgsTUFBTXVGLEtBQUtRLEdBQUc7QUFDL0I0QixTQUFLRCxRQUFRMUgsTUFBTXVGLEtBQUtRLEtBQUtsRztBQUM3Qm1HLFdBQU9ELElBQUkzTCxLQUFLRixJQUFJOEwsT0FBT0QsR0FBR1IsS0FBS1EsSUFBSTRCLENBQUFBOztBQUUzQztBQUVBLFNBQVNLLHFCQUFxQjFDLE9BQU9oTSxPQUFPMk8sVUFBVTtBQUNwRCxRQUFNQyxnQkFBZ0I1QyxNQUFNMEI7QUFDNUIsUUFBTSxFQUFDbUIsT0FBTzNCLGlCQUFpQmxDLFNBQVNJLEtBQUksSUFBSXVEO0FBQ2hELFFBQU1HLHFCQUFxQjlDLE1BQU15QixpQkFBaUJ6TixPQUFPNE8sZ0JBQWdCQyxRQUFRN0QsU0FBU2tDLGVBQUFBO0FBQzFGLFFBQU1yQixRQUFRL0ssS0FBS0MsTUFBTWtOLFVBQVVGLGdCQUFnQmUsbUJBQW1CakQsUUFBUWtELE9BQUFBLENBQUFBLENBQUFBO0FBQzlFLFFBQU1WLElBQUlXLFVBQVVGLG1CQUFtQlQsR0FBR2pELEtBQUtPLEdBQUdFLEtBQUFBO0FBQ2xELFFBQU1vRCxZQUFZQyxxQkFBcUJyRCxLQUFBQTtBQUN2QyxRQUFNTSxPQUFPZ0QsaUJBQWlCTCxtQkFBbUJYLEdBQUcvQyxLQUFLSSxHQUFHeUQsU0FBQUE7QUFDNUQsU0FBTztJQUVMRyxTQUFTO0lBR1RqQixHQUFHVyxtQkFBbUJYO0lBQ3RCRTtJQUdBWTtJQUdBOUM7SUFDQUssS0FBSzZCO0lBQ0wvQixPQUFPSCxPQUFPZixLQUFLSTtJQUNuQjNILFFBQVF3SyxJQUFJakQsS0FBS087RUFDbkI7QUFDRjtBQUVBLFNBQVMwRCxnQkFBZ0JDLE1BQU1DLE1BQU07QUFDbkMsTUFBSSxDQUFDQSxNQUFNO0FBQ1QsV0FBTzs7QUFFVCxRQUFNLEVBQUNwRCxNQUFNSyxLQUFLRixPQUFPekksT0FBTSxJQUFJeUw7QUFDbkMsUUFBTUUsZUFBZUMsZUFBZTtJQUFDdEIsR0FBR2hDO0lBQU1rQyxHQUFHN0I7RUFBRyxHQUFHK0MsSUFBQUEsS0FBU0UsZUFBZTtJQUFDdEIsR0FBR2hDO0lBQU1rQyxHQUFHeEs7RUFBTSxHQUFHMEwsSUFBQUEsS0FDbkdFLGVBQWU7SUFBQ3RCLEdBQUc3QjtJQUFPK0IsR0FBRzdCO0VBQUcsR0FBRytDLElBQUFBLEtBQVNFLGVBQWU7SUFBQ3RCLEdBQUc3QjtJQUFPK0IsR0FBR3hLO0tBQVMwTCxJQUFBQTtBQUNwRixTQUFPLENBQUNDO0FBQ1Y7QUFFQSxTQUFTZixxQkFBcUJ6QyxPQUFPYSxZQUFZN0IsU0FBUztBQUN4RCxRQUFNMEUsUUFBUSxDQUFBO0FBQ2QsUUFBTTVDLGFBQWFkLE1BQU1lLGFBQWE1TDtBQUN0QyxRQUFNMkcsT0FBT2tFLE1BQU10SjtBQUNuQixRQUFNLEVBQUN5SyxtQkFBbUJwQyxRQUFBQSxJQUFXakQsS0FBS21GO0FBQzFDLFFBQU0wQixXQUFXO0lBQ2ZFLE9BQU8vRCxzQkFBc0JoRCxJQUFRLElBQUE7SUFDckNvRixpQkFBaUJDLG9CQUFvQkMsS0FBS04sYUFBYTtFQUN6RDtBQUNBLE1BQUl5QztBQUVKLFdBQVNsQyxJQUFJLEdBQUdBLElBQUlQLFlBQVlPLEtBQUs7QUFDbkNzQixhQUFTM0QsVUFBVUEsUUFBUXFDLENBQUU7QUFDN0JzQixhQUFTdkQsT0FBT3lCLFdBQVdRLENBQUU7QUFFN0IsVUFBTWlDLE9BQU9aLHFCQUFxQjFDLE9BQU9xQixHQUFHc0IsUUFBQUE7QUFDNUNlLFVBQU14UCxLQUFLb1AsSUFBQUE7QUFDWCxRQUFJdkUsWUFBWSxRQUFRO0FBQ3RCdUUsV0FBS0YsVUFBVUMsZ0JBQWdCQyxNQUFNQyxJQUFBQTtBQUNyQyxVQUFJRCxLQUFLRixTQUFTO0FBQ2hCRyxlQUFPRDs7O0VBR2I7QUFDQSxTQUFPSTtBQUNUO0FBRUEsU0FBU1IscUJBQXFCckQsT0FBTztBQUNuQyxNQUFJQSxVQUFVLEtBQUtBLFVBQVUsS0FBSztBQUNoQyxXQUFPO2FBQ0VBLFFBQVEsS0FBSztBQUN0QixXQUFPOztBQUdULFNBQU87QUFDVDtBQUVBLFNBQVNzRCxpQkFBaUJoQixHQUFHM0MsR0FBR21FLE9BQU87QUFDckMsTUFBSUEsVUFBVSxTQUFTO0FBQ3JCeEIsU0FBSzNDO2FBQ0ltRSxVQUFVLFVBQVU7QUFDN0J4QixTQUFNM0MsSUFBSTs7QUFFWixTQUFPMkM7QUFDVDtBQUVBLFNBQVNhLFVBQVVYLEdBQUcxQyxJQUFHRSxPQUFPO0FBQzlCLE1BQUlBLFVBQVUsTUFBTUEsVUFBVSxLQUFLO0FBQ2pDd0MsU0FBTTFDLEtBQUk7RUFDWixXQUFXRSxRQUFRLE9BQU9BLFFBQVEsSUFBSTtBQUNwQ3dDLFNBQUsxQzs7QUFFUCxTQUFPMEM7QUFDVDtBQUVBLFNBQVN1QixrQkFBa0J0RSxLQUFLeEQsTUFBTXdILE1BQU07QUFDMUMsUUFBTSxFQUFDbkQsTUFBTUssS0FBS0YsT0FBT3pJLE9BQU0sSUFBSXlMO0FBQ25DLFFBQU0sRUFBQ08sY0FBYSxJQUFJL0g7QUFFeEIsTUFBSSxDQUFDN0YsY0FBYzROLGFBQWdCLEdBQUE7QUFDakMsVUFBTUMsZUFBZUMsY0FBY2pJLEtBQUtnSSxZQUFZO0FBQ3BELFVBQU05RSxVQUFVQyxVQUFVbkQsS0FBS29ELGVBQWU7QUFDOUNJLFFBQUkwRSxZQUFZSDtBQUVoQixVQUFNSSxlQUFlOUQsT0FBT25CLFFBQVFtQjtBQUNwQyxVQUFNK0QsY0FBYzFELE1BQU14QixRQUFRd0I7QUFDbEMsVUFBTTJELGdCQUFnQjdELFFBQVFILE9BQU9uQixRQUFRdkM7QUFDN0MsVUFBTTJILGlCQUFpQnZNLFNBQVMySSxNQUFNeEIsUUFBUXRDO0FBRTlDLFFBQUlpRSxPQUFPMEQsT0FBT1AsWUFBQUEsRUFBY1EsS0FBS3RKLENBQUFBLE1BQUtBLE1BQU0sQ0FBSSxHQUFBO0FBQ2xEc0UsVUFBSWlGLFVBQVM7QUFDYkMseUJBQW1CbEYsS0FBSztRQUN0QjZDLEdBQUc4QjtRQUNINUIsR0FBRzZCO1FBQ0gxRSxHQUFHMkU7UUFDSHhFLEdBQUd5RTtRQUNISyxRQUFRWDtNQUNWLENBQUE7QUFDQXhFLFVBQUlvRixLQUFJO1dBQ0g7QUFDTHBGLFVBQUlxRixTQUFTVixjQUFjQyxhQUFhQyxlQUFlQyxjQUFBQTs7O0FBRzdEO0FBRUEsU0FBU1EsZ0JBQWdCNUUsT0FBTzZFLFlBQVk7QUFDMUMsUUFBTSxFQUFDdkYsS0FBSzVJLFNBQVMsRUFBQ3VLLFlBQVcsRUFBQyxJQUFJakI7QUFFdEMsV0FBU3FCLElBQUl3RCxhQUFhLEdBQUd4RCxLQUFLLEdBQUdBLEtBQUs7QUFDeEMsVUFBTWlDLE9BQU90RCxNQUFNd0MsaUJBQWlCbkIsQ0FBRTtBQUN0QyxRQUFJLENBQUNpQyxLQUFLRixTQUFTO0FBRWpCOztBQUVGLFVBQU0wQixjQUFjN0QsWUFBWUssV0FBV3RCLE1BQU11QixxQkFBcUJGLENBQUFBLENBQUFBO0FBQ3RFdUMsc0JBQWtCdEUsS0FBS3dGLGFBQWF4QixJQUFBQTtBQUNwQyxVQUFNM0IsU0FBU0MsT0FBT2tELFlBQVkzRixJQUFJO0FBQ3RDLFVBQU0sRUFBQ2dELEdBQUdFLEdBQUdZLFVBQUFBLElBQWFLO0FBRTFCeUIsZUFDRXpGLEtBQ0FVLE1BQU1lLGFBQWFNLENBQUUsR0FDckJjLEdBQ0FFLElBQUtWLE9BQU85RSxhQUFhLEdBQ3pCOEUsUUFDQTtNQUNFcUQsT0FBT0YsWUFBWUU7TUFDbkIvQjtNQUNBZ0MsY0FBYztJQUNoQixDQUFBO0VBRUo7QUFDRjtBQUVBLFNBQVNDLGVBQWVsRixPQUFPeUUsUUFBUVUsVUFBVU4sWUFBWTtBQUMzRCxRQUFNLEVBQUN2RixJQUFHLElBQUlVO0FBQ2QsTUFBSW1GLFVBQVU7QUFFWjdGLFFBQUk4RixJQUFJcEYsTUFBTXFGLFNBQVNyRixNQUFNc0YsU0FBU2IsUUFBUSxHQUFHYyxHQUFBQTtTQUM1QztBQUVMLFFBQUkvRCxnQkFBZ0J4QixNQUFNeUIsaUJBQWlCLEdBQUdnRCxNQUFBQTtBQUM5Q25GLFFBQUlrRyxPQUFPaEUsY0FBY1csR0FBR1gsY0FBY2EsQ0FBQztBQUUzQyxhQUFTaEIsSUFBSSxHQUFHQSxJQUFJd0QsWUFBWXhELEtBQUs7QUFDbkNHLHNCQUFnQnhCLE1BQU15QixpQkFBaUJKLEdBQUdvRCxNQUFBQTtBQUMxQ25GLFVBQUltRyxPQUFPakUsY0FBY1csR0FBR1gsY0FBY2EsQ0FBQztJQUM3Qzs7QUFFSjtBQUVBLFNBQVNxRCxlQUFlMUYsT0FBTzJGLGNBQWNsQixRQUFRSSxZQUFZZSxZQUFZO0FBQzNFLFFBQU10RyxNQUFNVSxNQUFNVjtBQUNsQixRQUFNNkYsV0FBV1EsYUFBYVI7QUFFOUIsUUFBTSxFQUFDSCxPQUFBQSxRQUFPYSxVQUFBQSxJQUFhRjtBQUUzQixNQUFLLENBQUNSLFlBQVksQ0FBQ04sY0FBZSxDQUFDRyxVQUFTLENBQUNhLGFBQWFwQixTQUFTLEdBQUc7QUFDcEU7O0FBR0ZuRixNQUFJd0csS0FBSTtBQUNSeEcsTUFBSXlHLGNBQWNmO0FBQ2xCMUYsTUFBSXVHLFlBQVlBO0FBQ2hCdkcsTUFBSTBHLFlBQVlKLFdBQVdLLElBQUk7QUFDL0IzRyxNQUFJNEcsaUJBQWlCTixXQUFXTztBQUVoQzdHLE1BQUlpRixVQUFTO0FBQ2JXLGlCQUFlbEYsT0FBT3lFLFFBQVFVLFVBQVVOLFVBQUFBO0FBQ3hDdkYsTUFBSThHLFVBQVM7QUFDYjlHLE1BQUkrRyxPQUFNO0FBQ1YvRyxNQUFJZ0gsUUFBTztBQUNiO0FBRUEsU0FBU0Msd0JBQXdCQyxRQUFReFMsT0FBT0ksT0FBTztBQUNyRCxTQUFPcVMsY0FBY0QsUUFBUTtJQUMzQnBTO0lBQ0FKO0lBQ0EwUyxNQUFNO0VBQ1IsQ0FBQTtBQUNGO0FBRWUsSUFBTUMsb0JBQU4sY0FBZ0NuTSxnQkFBQUE7RUEwRTdDbEYsWUFBWUMsS0FBSztBQUNmLFVBQU1BLEdBQUFBO0FBR04sU0FBSzhQLFVBQVU1UDtBQUVmLFNBQUs2UCxVQUFVN1A7QUFFZixTQUFLaU0sY0FBY2pNO0FBRW5CLFNBQUtzTCxlQUFlLENBQUE7QUFDcEIsU0FBS3lCLG1CQUFtQixDQUFBO0VBQzFCO0VBRUFvRSxnQkFBZ0I7QUFFZCxVQUFNNUgsVUFBVSxLQUFLb0IsV0FBV25CLFVBQVVILHNCQUFzQixLQUFLcEksT0FBTyxJQUFJLENBQUE7QUFDaEYsVUFBTThJLElBQUksS0FBSy9DLFFBQVEsS0FBS29LLFdBQVc3SCxRQUFRdkM7QUFDL0MsVUFBTWtELEtBQUksS0FBS2pELFNBQVMsS0FBS29LLFlBQVk5SCxRQUFRdEM7QUFDakQsU0FBSzJJLFVBQVV2USxLQUFLMEUsTUFBTSxLQUFLMkcsT0FBT1gsSUFBSSxJQUFJUixRQUFRbUIsSUFBSTtBQUMxRCxTQUFLbUYsVUFBVXhRLEtBQUswRSxNQUFNLEtBQUtnSCxNQUFNYixLQUFJLElBQUlYLFFBQVF3QixHQUFHO0FBQ3hELFNBQUtrQixjQUFjNU0sS0FBSzBFLE1BQU0xRSxLQUFLMEIsSUFBSWdKLEdBQUdHLEVBQUssSUFBQSxDQUFBO0VBQ2pEO0VBRUF2SixzQkFBc0I7QUFDcEIsVUFBTSxFQUFDSSxLQUFLNUIsSUFBRyxJQUFJLEtBQUs2QixVQUFVLEtBQUs7QUFFdkMsU0FBS0QsTUFBTU4sZUFBU00sR0FBQUEsS0FBUSxDQUFDbkMsTUFBTW1DLEdBQU9BLElBQUFBLE1BQU07QUFDaEQsU0FBSzVCLE1BQU1zQixlQUFTdEIsR0FBQUEsS0FBUSxDQUFDUCxNQUFNTyxHQUFPQSxJQUFBQSxNQUFNO0FBR2hELFNBQUtpRyx1QkFBc0I7RUFDN0I7RUFNQWUsbUJBQW1CO0FBQ2pCLFdBQU85RyxLQUFLeUUsS0FBSyxLQUFLbUksY0FBYzVDLHNCQUFzQixLQUFLcEksT0FBTyxDQUFBO0VBQ3hFO0VBRUFxUSxtQkFBbUJqUSxPQUFPO0FBQ3hCMEQsb0JBQWdCNkQsVUFBVTBJLG1CQUFtQjlQLEtBQUssTUFBTUgsS0FBQUE7QUFHeEQsU0FBS2lLLGVBQWUsS0FBSzdMLFVBQVMsRUFDL0I4UixJQUFJLENBQUMvUixPQUFPakIsVUFBVTtBQUNyQixZQUFNSSxRQUFRNlMsU0FBYSxLQUFLdlEsUUFBUXVLLFlBQVlqSixVQUFVO1FBQUMvQztRQUFPakI7TUFBTSxHQUFFLElBQUk7QUFDbEYsYUFBT0ksU0FBU0EsVUFBVSxJQUFJQSxRQUFRO0tBRXZDOFMsRUFBQUEsT0FBTyxDQUFDbE0sR0FBR3FHLE1BQU0sS0FBS2hGLE1BQU04SyxrQkFBa0I5RixDQUFBQSxDQUFBQTtFQUNuRDtFQUVBK0YsTUFBTTtBQUNKLFVBQU10TCxPQUFPLEtBQUtwRjtBQUVsQixRQUFJb0YsS0FBS2lELFdBQVdqRCxLQUFLbUYsWUFBWWxDLFNBQVM7QUFDNUNnQix5QkFBbUIsSUFBSTtXQUNsQjtBQUNMLFdBQUt3QyxlQUFlLEdBQUcsR0FBRyxHQUFHLENBQUE7O0VBRWpDO0VBRUFBLGVBQWU4RSxjQUFjQyxlQUFlQyxhQUFhQyxnQkFBZ0I7QUFDdkUsU0FBS25DLFdBQVd2USxLQUFLMEUsT0FBTzZOLGVBQWVDLGlCQUFpQixDQUFBO0FBQzVELFNBQUtoQyxXQUFXeFEsS0FBSzBFLE9BQU8rTixjQUFjQyxrQkFBa0IsQ0FBQTtBQUM1RCxTQUFLOUYsZUFBZTVNLEtBQUswQixJQUFJLEtBQUtrTCxjQUFjLEdBQUc1TSxLQUFLRixJQUFJeVMsY0FBY0MsZUFBZUMsYUFBYUMsY0FBQUEsQ0FBQUE7RUFDeEc7RUFFQXhGLGNBQWNoTyxPQUFPO0FBQ25CLFVBQU15VCxrQkFBa0JsQyxPQUFPLEtBQUt4RSxhQUFhNUwsVUFBVTtBQUMzRCxVQUFNdVMsYUFBYSxLQUFLaFIsUUFBUWdSLGNBQWM7QUFFOUMsV0FBTzNGLGdCQUFnQi9OLFFBQVF5VCxrQkFBa0JyTixVQUFVc04sVUFBQUEsQ0FBQUE7RUFDN0Q7RUFFQUMsOEJBQThCMVMsT0FBTztBQUNuQyxRQUFJZ0IsY0FBY2hCLEtBQVEsR0FBQTtBQUN4QixhQUFPcUM7O0FBSVQsVUFBTXNRLGdCQUFnQixLQUFLbEcsZUFBZSxLQUFLOU0sTUFBTSxLQUFLNEI7QUFDMUQsUUFBSSxLQUFLRSxRQUFReUYsU0FBUztBQUN4QixjQUFRLEtBQUt2SCxNQUFNSyxTQUFTMlM7O0FBRTlCLFlBQVEzUyxRQUFRLEtBQUt1QixPQUFPb1I7RUFDOUI7RUFFQUMsOEJBQThCQyxVQUFVO0FBQ3RDLFFBQUk3UixjQUFjNlIsUUFBVyxHQUFBO0FBQzNCLGFBQU94UTs7QUFHVCxVQUFNeVEsaUJBQWlCRCxZQUFZLEtBQUtwRyxlQUFlLEtBQUs5TSxNQUFNLEtBQUs0QjtBQUN2RSxXQUFPLEtBQUtFLFFBQVF5RixVQUFVLEtBQUt2SCxNQUFNbVQsaUJBQWlCLEtBQUt2UixNQUFNdVI7RUFDdkU7RUFFQXhHLHFCQUFxQnZOLE9BQU87QUFDMUIsVUFBTWlOLGNBQWMsS0FBS0YsZ0JBQWdCLENBQUE7QUFFekMsUUFBSS9NLFNBQVMsS0FBS0EsUUFBUWlOLFlBQVk5TCxRQUFRO0FBQzVDLFlBQU02UyxhQUFhL0csWUFBWWpOLEtBQU07QUFDckMsYUFBT3VTLHdCQUF3QixLQUFLMEIsV0FBVSxHQUFJalUsT0FBT2dVLFVBQUFBOztFQUU3RDtFQUVBdkcsaUJBQWlCek4sT0FBT2tVLG9CQUFvQmhILGtCQUFrQixHQUFHO0FBQy9ELFVBQU1yQixRQUFRLEtBQUttQyxjQUFjaE8sS0FBQUEsSUFBUytPLFVBQVU3QjtBQUNwRCxXQUFPO01BQ0xpQixHQUFHck4sS0FBS3lGLElBQUlzRixLQUFBQSxJQUFTcUkscUJBQXFCLEtBQUs3QztNQUMvQ2hELEdBQUd2TixLQUFLd0YsSUFBSXVGLEtBQUFBLElBQVNxSSxxQkFBcUIsS0FBSzVDO01BQy9DekY7SUFDRjtFQUNGO0VBRUFzSSx5QkFBeUJuVSxPQUFPaUIsT0FBTztBQUNyQyxXQUFPLEtBQUt3TSxpQkFBaUJ6TixPQUFPLEtBQUsyVCw4QkFBOEIxUyxLQUFBQSxDQUFBQTtFQUN6RTtFQUVBbVQsZ0JBQWdCcFUsT0FBTztBQUNyQixXQUFPLEtBQUttVSx5QkFBeUJuVSxTQUFTLEdBQUcsS0FBS3FVLGFBQVksQ0FBQTtFQUNwRTtFQUVBQyxzQkFBc0J0VSxPQUFPO0FBQzNCLFVBQU0sRUFBQ21NLE1BQU1LLEtBQUtGLE9BQU96SSxPQUFNLElBQUksS0FBSzJLLGlCQUFpQnhPLEtBQU07QUFDL0QsV0FBTztNQUNMbU07TUFDQUs7TUFDQUY7TUFDQXpJO0lBQ0Y7RUFDRjtFQUtBMFEsaUJBQWlCO0FBQ2YsVUFBTSxFQUFDQyxpQkFBaUJDLE1BQU0sRUFBQ3RELFNBQUFBLEVBQVMsSUFBSSxLQUFLek87QUFDakQsUUFBSThSLGlCQUFpQjtBQUNuQixZQUFNbEosTUFBTSxLQUFLQTtBQUNqQkEsVUFBSXdHLEtBQUk7QUFDUnhHLFVBQUlpRixVQUFTO0FBQ2JXLHFCQUFlLE1BQU0sS0FBS3lDLDhCQUE4QixLQUFLaE4sU0FBUyxHQUFHd0ssVUFBVSxLQUFLcEUsYUFBYTVMLE1BQU07QUFDM0dtSyxVQUFJOEcsVUFBUztBQUNiOUcsVUFBSTBFLFlBQVl3RTtBQUNoQmxKLFVBQUlvRixLQUFJO0FBQ1JwRixVQUFJZ0gsUUFBTzs7RUFFZjtFQUtBb0MsV0FBVztBQUNULFVBQU1wSixNQUFNLEtBQUtBO0FBQ2pCLFVBQU14RCxPQUFPLEtBQUtwRjtBQUNsQixVQUFNLEVBQUNpUyxZQUFZRixNQUFNRyxPQUFBQSxJQUFVOU07QUFDbkMsVUFBTStJLGFBQWEsS0FBSzlELGFBQWE1TDtBQUVyQyxRQUFJa00sR0FBR3hLLFFBQVFnUztBQUVmLFFBQUkvTSxLQUFLbUYsWUFBWWxDLFNBQVM7QUFDNUI2RixzQkFBZ0IsTUFBTUMsVUFBQUE7O0FBR3hCLFFBQUk0RCxLQUFLMUosU0FBUztBQUNoQixXQUFLakksTUFBTWdTLFFBQVEsQ0FBQ0MsTUFBTS9VLFVBQVU7QUFDbEMsWUFBSUEsVUFBVSxHQUFHO0FBQ2Y2QyxtQkFBUyxLQUFLOFEsOEJBQThCb0IsS0FBSzlULEtBQUs7QUFDdEQsZ0JBQU0rVCxVQUFVLEtBQUtmLFdBQVdqVSxLQUFBQTtBQUNoQyxnQkFBTThRLGNBQWMyRCxLQUFLbkgsV0FBVzBILE9BQUFBO0FBQ3BDLGdCQUFNQyxvQkFBb0JMLE9BQU90SCxXQUFXMEgsT0FBQUE7QUFFNUN0RCx5QkFBZSxNQUFNWixhQUFhak8sUUFBUWdPLFlBQVlvRSxpQkFBQUE7O01BRTFELENBQUE7O0FBR0YsUUFBSU4sV0FBVzVKLFNBQVM7QUFDdEJPLFVBQUl3RyxLQUFJO0FBRVIsV0FBS3pFLElBQUl3RCxhQUFhLEdBQUd4RCxLQUFLLEdBQUdBLEtBQUs7QUFDcEMsY0FBTXlELGNBQWM2RCxXQUFXckgsV0FBVyxLQUFLQyxxQkFBcUJGLENBQUFBLENBQUFBO0FBQ3BFLGNBQU0sRUFBQzJELE9BQUFBLFFBQU9hLFVBQUFBLElBQWFmO0FBRTNCLFlBQUksQ0FBQ2UsYUFBYSxDQUFDYixRQUFPO0FBQ3hCOztBQUdGMUYsWUFBSXVHLFlBQVlBO0FBQ2hCdkcsWUFBSXlHLGNBQWNmO0FBRWxCMUYsWUFBSTBHLFlBQVlsQixZQUFZb0UsVUFBVTtBQUN0QzVKLFlBQUk0RyxpQkFBaUJwQixZQUFZcUU7QUFFakN0UyxpQkFBUyxLQUFLOFEsOEJBQThCN0wsS0FBS2hGLE1BQU1xRixVQUFVLEtBQUszRixNQUFNLEtBQUs1QixHQUFHO0FBQ3BGaVUsbUJBQVcsS0FBS3BILGlCQUFpQkosR0FBR3hLLE1BQUFBO0FBQ3BDeUksWUFBSWlGLFVBQVM7QUFDYmpGLFlBQUlrRyxPQUFPLEtBQUtILFNBQVMsS0FBS0MsT0FBTztBQUNyQ2hHLFlBQUltRyxPQUFPb0QsU0FBUzFHLEdBQUcwRyxTQUFTeEcsQ0FBQztBQUNqQy9DLFlBQUkrRyxPQUFNO01BQ1o7QUFFQS9HLFVBQUlnSCxRQUFPOztFQUVmO0VBS0E4QyxhQUFhO0VBQUE7RUFLYkMsYUFBYTtBQUNYLFVBQU0vSixNQUFNLEtBQUtBO0FBQ2pCLFVBQU14RCxPQUFPLEtBQUtwRjtBQUNsQixVQUFNNkUsV0FBV08sS0FBS2hGO0FBRXRCLFFBQUksQ0FBQ3lFLFNBQVN3RCxTQUFTO0FBQ3JCOztBQUdGLFVBQU0ySSxhQUFhLEtBQUsxRixjQUFjLENBQUE7QUFDdEMsUUFBSW5MLFFBQVE0RjtBQUVaNkMsUUFBSXdHLEtBQUk7QUFDUnhHLFFBQUlnSyxVQUFVLEtBQUtqRSxTQUFTLEtBQUtDLE9BQU87QUFDeENoRyxRQUFJaUssT0FBTzdCLFVBQUFBO0FBQ1hwSSxRQUFJMkQsWUFBWTtBQUNoQjNELFFBQUkyRixlQUFlO0FBRW5CLFNBQUtuTyxNQUFNZ1MsUUFBUSxDQUFDQyxNQUFNL1UsVUFBVTtBQUNsQyxVQUFJQSxVQUFVLEtBQUssQ0FBQzhILEtBQUtLLFNBQVM7QUFDaEM7O0FBR0YsWUFBTTJJLGNBQWN2SixTQUFTK0YsV0FBVyxLQUFLMkcsV0FBV2pVLEtBQUFBLENBQUFBO0FBQ3hELFlBQU0ySSxXQUFXaUYsT0FBT2tELFlBQVkzRixJQUFJO0FBQ3hDdEksZUFBUyxLQUFLOFEsOEJBQThCLEtBQUs3USxNQUFNOUMsS0FBTSxFQUFDaUIsS0FBSztBQUVuRSxVQUFJNlAsWUFBWTBFLG1CQUFtQjtBQUNqQ2xLLFlBQUlILE9BQU94QyxTQUFTK0M7QUFDcEJqRCxnQkFBUTZDLElBQUltSyxZQUFZVixLQUFLM1UsS0FBSyxFQUFFcUk7QUFDcEM2QyxZQUFJMEUsWUFBWWMsWUFBWWpCO0FBRTVCLGNBQU03RSxVQUFVQyxVQUFVNkYsWUFBWTVGLGVBQWU7QUFDckRJLFlBQUlxRixTQUNGLENBQUNsSSxRQUFRLElBQUl1QyxRQUFRbUIsTUFDckIsQ0FBQ3RKLFNBQVM4RixTQUFTeUMsT0FBTyxJQUFJSixRQUFRd0IsS0FDdEMvRCxRQUFRdUMsUUFBUXZDLE9BQ2hCRSxTQUFTeUMsT0FBT0osUUFBUXRDLE1BQU07O0FBSWxDcUksaUJBQVd6RixLQUFLeUosS0FBSzNVLE9BQU8sR0FBRyxDQUFDeUMsUUFBUThGLFVBQVU7UUFDaERxSSxPQUFPRixZQUFZRTtRQUNuQjBFLGFBQWE1RSxZQUFZNkU7UUFDekJDLGFBQWE5RSxZQUFZK0U7TUFDM0IsQ0FBQTtJQUNGLENBQUE7QUFFQXZLLFFBQUlnSCxRQUFPO0VBQ2I7RUFLQXdELFlBQVk7RUFBQTtBQUNkO0FBeFZFLGNBRm1CbkQsbUJBRVo3TyxNQUFLO0FBS1osY0FQbUI2TyxtQkFPWjVPLFlBQVc7RUFDaEJnSCxTQUFTO0VBR1RnTCxTQUFTO0VBQ1RsQixVQUFVO0VBRVZGLFlBQVk7SUFDVjVKLFNBQVM7SUFDVDhHLFdBQVc7SUFDWHFELFlBQVksQ0FBQTtJQUNaQyxrQkFBa0I7RUFDcEI7RUFFQVYsTUFBTTtJQUNKdEQsVUFBVTtFQUNaO0VBRUF1QyxZQUFZO0VBR1o1USxPQUFPO0lBRUwwUyxtQkFBbUI7SUFFbkJ4UixVQUFVOEUsTUFBTUMsV0FBV0M7RUFDN0I7RUFFQWlFLGFBQWE7SUFDWDRDLGVBQWVwTztJQUdmeUosaUJBQWlCO0lBR2pCSCxTQUFTO0lBR1RJLE1BQU07TUFDSkMsTUFBTTtJQUNSO0lBR0FwSCxTQUFTNUQsT0FBTztBQUNkLGFBQU9BO0lBQ1Q7SUFHQTRLLFNBQVM7SUFHVG1DLG1CQUFtQjtFQUNyQjs7QUFHRixjQTlEbUJ3RixtQkE4RFpxRCxpQkFBZ0I7RUFDckIsb0JBQW9CO0VBQ3BCLHFCQUFxQjtFQUNyQixlQUFlOztBQUdqQixjQXBFbUJyRCxtQkFvRVpzRCxlQUFjO0VBQ25CdEIsWUFBWTtJQUNWdUIsV0FBVztFQUNiOztBQ3pZSixJQUFNQyxZQUFZO0VBQ2hCQyxhQUFhO0lBQUNDLFFBQVE7SUFBTWpMLE1BQU07SUFBRzVCLE9BQU87RUFBSTtFQUNoRDhNLFFBQVE7SUFBQ0QsUUFBUTtJQUFNakwsTUFBTTtJQUFNNUIsT0FBTztFQUFFO0VBQzVDK00sUUFBUTtJQUFDRixRQUFRO0lBQU1qTCxNQUFNO0lBQU81QixPQUFPO0VBQUU7RUFDN0NnTixNQUFNO0lBQUNILFFBQVE7SUFBTWpMLE1BQU07SUFBUzVCLE9BQU87RUFBRTtFQUM3Q2lOLEtBQUs7SUFBQ0osUUFBUTtJQUFNakwsTUFBTTtJQUFVNUIsT0FBTztFQUFFO0VBQzdDa04sTUFBTTtJQUFDTCxRQUFRO0lBQU9qTCxNQUFNO0lBQVc1QixPQUFPO0VBQUM7RUFDL0NtTixPQUFPO0lBQUNOLFFBQVE7SUFBTWpMLE1BQU07SUFBUzVCLE9BQU87RUFBRTtFQUM5Q29OLFNBQVM7SUFBQ1AsUUFBUTtJQUFPakwsTUFBTTtJQUFTNUIsT0FBTztFQUFDO0VBQ2hEcU4sTUFBTTtJQUFDUixRQUFRO0lBQU1qTCxNQUFNO0VBQVE7QUFDckM7QUFLQSxJQUFNMEwsUUFBNkNuSyx1QkFBT29LLEtBQUtaLFNBQUFBO0FBTS9ELFNBQVNhLE9BQU9DLEdBQUd4SyxHQUFHO0FBQ3BCLFNBQU93SyxJQUFJeEs7QUFDYjtBQU9BLFNBQVN6SyxNQUFNZ0ssT0FBT2tMLE9BQU87QUFDM0IsTUFBSWpWLGNBQWNpVixLQUFRLEdBQUE7QUFDeEIsV0FBTzs7QUFHVCxRQUFNQyxVQUFVbkwsTUFBTW9MO0FBQ3RCLFFBQU0sRUFBQ0MsUUFBUXRXLE9BQUFBLFFBQU91VyxXQUFVLElBQUl0TCxNQUFNdUw7QUFDMUMsTUFBSXRXLFFBQVFpVztBQUVaLE1BQUksT0FBT0csV0FBVyxZQUFZO0FBQ2hDcFcsWUFBUW9XLE9BQU9wVyxLQUFBQTs7QUFJakIsTUFBSSxDQUFDaUIsZUFBU2pCLEtBQVEsR0FBQTtBQUNwQkEsWUFBUSxPQUFPb1csV0FBVyxXQUN0QkYsUUFBUW5WLE1BQU1mLE9BQTRCb1csTUFBQUEsSUFDMUNGLFFBQVFuVixNQUFNZixLQUFNOztBQUcxQixNQUFJQSxVQUFVLE1BQU07QUFDbEIsV0FBTzs7QUFHVCxNQUFJRixRQUFPO0FBQ1RFLFlBQVFGLFdBQVUsV0FBV3lXLFNBQVNGLFVBQWVBLEtBQUFBLGVBQWUsUUFDaEVILFFBQVFNLFFBQVF4VyxPQUFPLFdBQVdxVyxVQUFBQSxJQUNsQ0gsUUFBUU0sUUFBUXhXLE9BQU9GLE1BQU07O0FBR25DLFNBQU8sQ0FBQ0U7QUFDVjtBQVVBLFNBQVN5VywwQkFBMEJDLFNBQVNuVixLQUFLNUIsS0FBS2dYLFVBQVU7QUFDOUQsUUFBTUMsT0FBT2YsTUFBTTNWO0FBRW5CLFdBQVNrTSxJQUFJeUosTUFBTXRXLFFBQVFtWCxPQUFBQSxHQUFVdEssSUFBSXdLLE9BQU8sR0FBRyxFQUFFeEssR0FBRztBQUN0RCxVQUFNeUssV0FBVzNCLFVBQVVXLE1BQU16SixDQUFBQSxDQUFFO0FBQ25DLFVBQU1sSSxTQUFTMlMsU0FBU3RPLFFBQVFzTyxTQUFTdE8sUUFBUTVDLE9BQU9tUjtBQUV4RCxRQUFJRCxTQUFTekIsVUFBVXZWLEtBQUt5RSxNQUFNM0UsTUFBTTRCLFFBQVEyQyxTQUFTMlMsU0FBUzFNLEtBQUcsS0FBT3dNLFVBQVU7QUFDcEYsYUFBT2QsTUFBTXpKLENBQUU7O0VBRW5CO0FBRUEsU0FBT3lKLE1BQU1lLE9BQU8sQ0FBRTtBQUN4QjtBQVdBLFNBQVNHLDJCQUEyQmhNLE9BQU9pTSxVQUFVTixTQUFTblYsS0FBSzVCLEtBQUs7QUFDdEUsV0FBU3lNLElBQUl5SixNQUFNM1YsU0FBUyxHQUFHa00sS0FBS3lKLE1BQU10VyxRQUFRbVgsT0FBQUEsR0FBVXRLLEtBQUs7QUFDL0QsVUFBTTFJLE9BQU9tUyxNQUFNekosQ0FBRTtBQUNyQixRQUFJOEksVUFBVXhSLElBQUssRUFBQzBSLFVBQVVySyxNQUFNb0wsU0FBU2MsS0FBS3RYLEtBQUs0QixLQUFLbUMsSUFBQUEsS0FBU3NULFdBQVcsR0FBRztBQUNqRixhQUFPdFQ7O0VBRVg7QUFFQSxTQUFPbVMsTUFBTWEsVUFBVWIsTUFBTXRXLFFBQVFtWCxPQUFBQSxJQUFXLENBQUM7QUFDbkQ7QUFNQSxTQUFTUSxtQkFBbUJ4VCxNQUFNO0FBQ2hDLFdBQVMwSSxJQUFJeUosTUFBTXRXLFFBQVFtRSxJQUFRLElBQUEsR0FBR2tULE9BQU9mLE1BQU0zVixRQUFRa00sSUFBSXdLLE1BQU0sRUFBRXhLLEdBQUc7QUFDeEUsUUFBSThJLFVBQVVXLE1BQU16SixDQUFBQSxDQUFFLEVBQUVnSixRQUFRO0FBQzlCLGFBQU9TLE1BQU16SixDQUFFOztFQUVuQjtBQUNGO0FBT0EsU0FBUytLLFFBQVF0VixPQUFPdVYsTUFBTUMsWUFBWTtBQUN4QyxNQUFJLENBQUNBLFlBQVk7QUFDZnhWLFVBQU11VixJQUFLLElBQUc7YUFDTEMsV0FBV25YLFFBQVE7QUFDNUIsVUFBTSxFQUFDb1gsSUFBSUMsR0FBQUEsSUFBTUMsUUFBUUgsWUFBWUQsSUFBQUE7QUFDckMsVUFBTUssWUFBWUosV0FBV0MsRUFBQUEsS0FBT0YsT0FBT0MsV0FBV0MsRUFBRyxJQUFHRCxXQUFXRSxFQUFHO0FBQzFFMVYsVUFBTTRWLFNBQVUsSUFBRzs7QUFFdkI7QUFTQSxTQUFTQyxjQUFjM00sT0FBT2xKLE9BQU9rUSxNQUFLNEYsV0FBVztBQUNuRCxRQUFNekIsVUFBVW5MLE1BQU1vTDtBQUN0QixRQUFNN1csUUFBUSxDQUFDNFcsUUFBUU0sUUFBUTNVLE1BQU0sQ0FBQSxFQUFHN0IsT0FBTzJYLFNBQUFBO0FBQy9DLFFBQU1uWSxPQUFPcUMsTUFBTUEsTUFBTTNCLFNBQVMsQ0FBQSxFQUFHRjtBQUNyQyxNQUFJaUosT0FBT2xLO0FBRVgsT0FBS2tLLFFBQVEzSixPQUFPMkosU0FBU3pKLE1BQU15SixRQUFRLENBQUNpTixRQUFRMEIsSUFBSTNPLE9BQU8sR0FBRzBPLFNBQVksR0FBQTtBQUM1RTVZLFlBQVFnVCxLQUFJOUksS0FBTTtBQUNsQixRQUFJbEssU0FBUyxHQUFHO0FBQ2Q4QyxZQUFNOUMsS0FBQUEsRUFBT2tLLFFBQVE7O0VBRXpCO0FBQ0EsU0FBT3BIO0FBQ1Q7QUFRQSxTQUFTZ1csb0JBQW9COU0sT0FBT3FFLFFBQVF1SSxXQUFXO0FBQ3JELFFBQU05VixRQUFRLENBQUE7QUFFZCxRQUFNa1EsT0FBTSxDQUFBO0FBQ1osUUFBTTZFLE9BQU94SCxPQUFPbFA7QUFDcEIsTUFBSWtNLEdBQUdwTTtBQUVQLE9BQUtvTSxJQUFJLEdBQUdBLElBQUl3SyxNQUFNLEVBQUV4SyxHQUFHO0FBQ3pCcE0sWUFBUW9QLE9BQU9oRCxDQUFFO0FBQ2pCMkYsSUFBQUEsS0FBSS9SLEtBQUFBLElBQVNvTTtBQUVidkssVUFBTTVDLEtBQUs7TUFDVGU7TUFDQWlKLE9BQU87SUFDVCxDQUFBO0VBQ0Y7QUFJQSxTQUFRMk4sU0FBUyxLQUFLLENBQUNlLFlBQWE5VixRQUFRNlYsY0FBYzNNLE9BQU9sSixPQUFPa1EsTUFBSzRGLFNBQVU7QUFDekY7QUFFZSxJQUFNRyxZQUFOLGNBQXdCMVgsTUFBQUE7RUFnRHJDQyxZQUFZMFgsT0FBTztBQUNqQixVQUFNQSxLQUFBQTtBQUdOLFNBQUtDLFNBQVM7TUFDWkMsTUFBTSxDQUFBO01BQ05wWixRQUFRLENBQUE7TUFDUnFaLEtBQUssQ0FBQTtJQUNQO0FBR0EsU0FBS0MsUUFBUTtBQUViLFNBQUtDLGFBQWE1WDtBQUNsQixTQUFLNlgsV0FBVyxDQUFBO0FBQ2hCLFNBQUtDLGNBQWM7QUFDbkIsU0FBS2hDLGFBQWE5VjtFQUNwQjtFQUVBRyxLQUFLNFgsV0FBVzFSLE9BQU8sQ0FBQSxHQUFJO0FBQ3pCLFVBQU11USxPQUFPbUIsVUFBVW5CLFNBQVNtQixVQUFVbkIsT0FBTyxDQUFBO0FBRWpELFVBQU1sQixVQUFVLEtBQUtDLFdBQVcsSUFBSXFDLFNBQVNDLE1BQU1GLFVBQVVDLFNBQVNFLElBQUk7QUFFMUV4QyxZQUFRdlYsS0FBS2tHLElBQUFBO0FBTWI4UixZQUFRdkIsS0FBS3dCLGdCQUFnQjFDLFFBQVEyQyxRQUFPLENBQUE7QUFFNUMsU0FBS3ZDLGFBQWE7TUFDaEJGLFFBQVFnQixLQUFLaEI7TUFDYnRXLE9BQU9zWCxLQUFLdFg7TUFDWnVXLFlBQVllLEtBQUtmO0lBQ25CO0FBRUEsVUFBTTFWLEtBQUs0WCxTQUFBQTtBQUVYLFNBQUtELGNBQWN6UixLQUFLaVM7RUFDMUI7RUFPQS9YLE1BQU1qQyxLQUFLQyxPQUFPO0FBQ2hCLFFBQUlELFFBQVEwQixRQUFXO0FBQ3JCLGFBQU87O0FBRVQsV0FBT08sTUFBTSxNQUFNakMsR0FBQUE7RUFDckI7RUFFQWlhLGVBQWU7QUFDYixVQUFNQSxhQUFZO0FBQ2xCLFNBQUtmLFNBQVM7TUFDWkMsTUFBTSxDQUFBO01BQ05wWixRQUFRLENBQUE7TUFDUnFaLEtBQUssQ0FBQTtJQUNQO0VBQ0Y7RUFFQS9XLHNCQUFzQjtBQUNwQixVQUFNTSxVQUFVLEtBQUtBO0FBQ3JCLFVBQU15VSxVQUFVLEtBQUtDO0FBQ3JCLFVBQU16UyxPQUFPakMsUUFBUTJWLEtBQUsxVCxRQUFRO0FBRWxDLFFBQUksRUFBQ25DLEtBQUs1QixLQUFLeUIsWUFBWUMsV0FBQUEsSUFBYyxLQUFLQyxjQUFhO0FBSzNELGFBQVMwWCxhQUFhdFgsUUFBUTtBQUM1QixVQUFJLENBQUNOLGNBQWMsQ0FBQ2hDLE1BQU1zQyxPQUFPSCxHQUFHLEdBQUc7QUFDckNBLGNBQU0xQixLQUFLMEIsSUFBSUEsS0FBS0csT0FBT0gsR0FBRzs7QUFFaEMsVUFBSSxDQUFDRixjQUFjLENBQUNqQyxNQUFNc0MsT0FBTy9CLEdBQUcsR0FBRztBQUNyQ0EsY0FBTUUsS0FBS0YsSUFBSUEsS0FBSytCLE9BQU8vQixHQUFHOztJQUVsQztBQUdBLFFBQUksQ0FBQ3lCLGNBQWMsQ0FBQ0MsWUFBWTtBQUU5QjJYLG1CQUFhLEtBQUtDLGdCQUFlLENBQUE7QUFJakMsVUFBSXhYLFFBQVFDLFdBQVcsV0FBV0QsUUFBUUksTUFBTXFYLFdBQVcsVUFBVTtBQUNuRUYscUJBQWEsS0FBS3hYLFVBQVUsS0FBSyxDQUFBOzs7QUFJckNELFVBQU1OLGVBQVNNLEdBQUFBLEtBQVEsQ0FBQ25DLE1BQU1tQyxHQUFPQSxJQUFBQSxNQUFNLENBQUMyVSxRQUFRTSxRQUFRMkMsS0FBS0MsSUFBRyxHQUFJMVYsSUFBSztBQUM3RS9ELFVBQU1zQixlQUFTdEIsR0FBQUEsS0FBUSxDQUFDUCxNQUFNTyxHQUFBQSxJQUFPQSxNQUFNLENBQUN1VyxRQUFRbUQsTUFBTUYsS0FBS0MsSUFBRyxHQUFJMVYsSUFBQUEsSUFBUTtBQUc5RSxTQUFLbkMsTUFBTTFCLEtBQUswQixJQUFJQSxLQUFLNUIsTUFBTSxDQUFBO0FBQy9CLFNBQUtBLE1BQU1FLEtBQUtGLElBQUk0QixNQUFNLEdBQUc1QixHQUFBQTtFQUMvQjtFQUtBc1osa0JBQWtCO0FBQ2hCLFVBQU1LLE1BQU0sS0FBS0MsbUJBQWtCO0FBQ25DLFFBQUloWSxNQUFNb0UsT0FBT2lCO0FBQ2pCLFFBQUlqSCxNQUFNZ0csT0FBTzZUO0FBRWpCLFFBQUlGLElBQUlwWixRQUFRO0FBQ2RxQixZQUFNK1gsSUFBSSxDQUFFO0FBQ1ozWixZQUFNMlosSUFBSUEsSUFBSXBaLFNBQVMsQ0FBRTs7QUFFM0IsV0FBTztNQUFDcUI7TUFBSzVCO0lBQUc7RUFDbEI7RUFLQWdDLGFBQWE7QUFDWCxVQUFNRixVQUFVLEtBQUtBO0FBQ3JCLFVBQU1nWSxXQUFXaFksUUFBUTJWO0FBQ3pCLFVBQU05USxXQUFXN0UsUUFBUUk7QUFDekIsVUFBTXdWLGFBQWEvUSxTQUFTNFMsV0FBVyxXQUFXLEtBQUtLLG1CQUFrQixJQUFLLEtBQUtHLFVBQVM7QUFFNUYsUUFBSWpZLFFBQVFDLFdBQVcsV0FBVzJWLFdBQVduWCxRQUFRO0FBQ25ELFdBQUtxQixNQUFNLEtBQUtpSSxZQUFZNk4sV0FBVyxDQUFFO0FBQ3pDLFdBQUsxWCxNQUFNLEtBQUs4SixZQUFZNE4sV0FBV0EsV0FBV25YLFNBQVMsQ0FBRTs7QUFHL0QsVUFBTXFCLE1BQU0sS0FBS0E7QUFDakIsVUFBTTVCLE1BQU0sS0FBS0E7QUFFakIsVUFBTWtDLFFBQVE4WCxlQUFldEMsWUFBWTlWLEtBQUs1QixHQUFBQTtBQUs5QyxTQUFLd1ksUUFBUXNCLFNBQVMvVixTQUFTNEMsU0FBU3NULFdBQ3BDbkQsMEJBQTBCZ0QsU0FBUy9DLFNBQVMsS0FBS25WLEtBQUssS0FBSzVCLEtBQUssS0FBS2thLGtCQUFrQnRZLEdBQ3ZGd1YsQ0FBQUEsSUFBQUEsMkJBQTJCLE1BQU1sVixNQUFNM0IsUUFBUXVaLFNBQVMvQyxTQUFTLEtBQUtuVixLQUFLLEtBQUs1QixHQUFHO0FBQ3ZGLFNBQUt5WSxhQUFhLENBQUM5UixTQUFTMkMsTUFBTVcsV0FBVyxLQUFLdU8sVUFBVSxTQUFTM1gsU0FDakUwVyxtQkFBbUIsS0FBS2lCLEtBQUs7QUFDakMsU0FBSzJCLFlBQVl6QyxVQUFBQTtBQUVqQixRQUFJNVYsUUFBUXlGLFNBQVM7QUFDbkJyRixZQUFNcUYsUUFBTzs7QUFHZixXQUFPMlEsb0JBQW9CLE1BQU1oVyxPQUFPLEtBQUt1VyxVQUFVO0VBQ3pEO0VBRUEyQixnQkFBZ0I7QUFHZCxRQUFJLEtBQUt0WSxRQUFRdVkscUJBQXFCO0FBQ3BDLFdBQUtGLFlBQVksS0FBS2pZLE1BQU1rUSxJQUFJK0IsQ0FBQUEsU0FBUSxDQUFDQSxLQUFLOVQsS0FBSyxDQUFBOztFQUV2RDtFQVVBOFosWUFBWXpDLGFBQWEsQ0FBQSxHQUFJO0FBQzNCLFFBQUk3UixRQUFRO0FBQ1osUUFBSUMsTUFBTTtBQUNWLFFBQUluRyxPQUFPRTtBQUVYLFFBQUksS0FBS2lDLFFBQVFHLFVBQVV5VixXQUFXblgsUUFBUTtBQUM1Q1osY0FBUSxLQUFLMmEsbUJBQW1CNUMsV0FBVyxDQUFFLENBQUE7QUFDN0MsVUFBSUEsV0FBV25YLFdBQVcsR0FBRztBQUMzQnNGLGdCQUFRLElBQUlsRzthQUNQO0FBQ0xrRyxpQkFBUyxLQUFLeVUsbUJBQW1CNUMsV0FBVyxDQUFBLENBQUUsSUFBSS9YLFNBQVM7O0FBRTdERSxhQUFPLEtBQUt5YSxtQkFBbUI1QyxXQUFXQSxXQUFXblgsU0FBUyxDQUFFLENBQUE7QUFDaEUsVUFBSW1YLFdBQVduWCxXQUFXLEdBQUc7QUFDM0J1RixjQUFNakc7YUFDRDtBQUNMaUcsZUFBT2pHLE9BQU8sS0FBS3lhLG1CQUFtQjVDLFdBQVdBLFdBQVduWCxTQUFTLENBQUEsQ0FBRSxLQUFLOzs7QUFHaEYsVUFBTWdhLFFBQVE3QyxXQUFXblgsU0FBUyxJQUFJLE1BQU07QUFDNUNzRixZQUFRNUYsWUFBWTRGLE9BQU8sR0FBRzBVLEtBQUFBO0FBQzlCelUsVUFBTTdGLFlBQVk2RixLQUFLLEdBQUd5VSxLQUFBQTtBQUUxQixTQUFLN0IsV0FBVztNQUFDN1M7TUFBT0M7TUFBS3ZCLFFBQVEsS0FBS3NCLFFBQVEsSUFBSUM7SUFBSTtFQUM1RDtFQVNBaVUsWUFBWTtBQUNWLFVBQU14RCxVQUFVLEtBQUtDO0FBQ3JCLFVBQU01VSxNQUFNLEtBQUtBO0FBQ2pCLFVBQU01QixNQUFNLEtBQUtBO0FBQ2pCLFVBQU04QixVQUFVLEtBQUtBO0FBQ3JCLFVBQU1nWSxXQUFXaFksUUFBUTJWO0FBRXpCLFVBQU0rQyxRQUFRVixTQUFTL1YsUUFBUStTLDBCQUEwQmdELFNBQVMvQyxTQUFTblYsS0FBSzVCLEtBQUssS0FBS2thLGtCQUFrQnRZLEdBQUFBLENBQUFBO0FBQzVHLFVBQU1pRixXQUFXdEYsZUFBZU8sUUFBUUksTUFBTTJFLFVBQVUsQ0FBQTtBQUN4RCxVQUFNNFQsVUFBVUQsVUFBVSxTQUFTVixTQUFTcEQsYUFBYTtBQUN6RCxVQUFNZ0UsYUFBYTlELFNBQVM2RCxPQUFZQSxLQUFBQSxZQUFZO0FBQ3BELFVBQU12WSxRQUFRLENBQUE7QUFDZCxRQUFJdkMsUUFBUWlDO0FBQ1osUUFBSTZWLE1BQU05VDtBQUdWLFFBQUkrVyxZQUFZO0FBQ2QvYSxjQUFRLENBQUM0VyxRQUFRTSxRQUFRbFgsT0FBTyxXQUFXOGEsT0FBQUE7O0FBSTdDOWEsWUFBUSxDQUFDNFcsUUFBUU0sUUFBUWxYLE9BQU8rYSxhQUFhLFFBQVFGLEtBQUs7QUFHMUQsUUFBSWpFLFFBQVFlLEtBQUt0WCxLQUFLNEIsS0FBSzRZLEtBQUFBLElBQVMsTUFBUzNULFVBQVU7QUFDckQsWUFBTSxJQUFJOFQsTUFBTS9ZLE1BQU0sVUFBVTVCLE1BQU0seUNBQXlDNkcsV0FBVyxNQUFNMlQsS0FBTzs7QUFHekcsVUFBTTlDLGFBQWE1VixRQUFRSSxNQUFNcVgsV0FBVyxVQUFVLEtBQUtxQixrQkFBaUI7QUFDNUUsU0FBS25ELE9BQU85WCxPQUFPZ0UsUUFBUSxHQUFHOFQsT0FBT3pYLEtBQUt5WCxPQUFPLENBQUNsQixRQUFRMEIsSUFBSVIsTUFBTTVRLFVBQVUyVCxLQUFBQSxHQUFRN1csU0FBUztBQUM3RjZULGNBQVF0VixPQUFPdVYsTUFBTUMsVUFBQUE7SUFDdkI7QUFFQSxRQUFJRCxTQUFTelgsT0FBTzhCLFFBQVFDLFdBQVcsV0FBVzRCLFVBQVUsR0FBRztBQUM3RDZULGNBQVF0VixPQUFPdVYsTUFBTUMsVUFBQUE7O0FBSXZCLFdBQU8zTCxPQUFPb0ssS0FBS2pVLEtBQU8yWSxFQUFBQSxLQUFLekUsTUFBQUEsRUFBUWhFLElBQUk3RSxDQUFBQSxNQUFLLENBQUNBLENBQUFBO0VBQ25EO0VBTUFuTCxpQkFBaUIvQixPQUFPO0FBQ3RCLFVBQU1rVyxVQUFVLEtBQUtDO0FBQ3JCLFVBQU1zRCxXQUFXLEtBQUtoWSxRQUFRMlY7QUFFOUIsUUFBSXFDLFNBQVNnQixlQUFlO0FBQzFCLGFBQU92RSxRQUFRNU8sT0FBT3RILE9BQU95WixTQUFTZ0IsYUFBYTs7QUFFckQsV0FBT3ZFLFFBQVE1TyxPQUFPdEgsT0FBT3laLFNBQVNiLGVBQWU4QixRQUFRO0VBQy9EO0VBT0FwVCxPQUFPdEgsT0FBT3NILFFBQVE7QUFDcEIsVUFBTTdGLFVBQVUsS0FBS0E7QUFDckIsVUFBTW9YLFVBQVVwWCxRQUFRMlYsS0FBS3dCO0FBQzdCLFVBQU1sVixPQUFPLEtBQUt5VTtBQUNsQixVQUFNd0MsTUFBTXJULFVBQVV1UixRQUFRblYsSUFBSztBQUNuQyxXQUFPLEtBQUt5UyxTQUFTN08sT0FBT3RILE9BQU8yYSxHQUFBQTtFQUNyQztFQVdBQyxvQkFBb0J4RCxNQUFNclksT0FBTzhDLE9BQU95RixRQUFRO0FBQzlDLFVBQU03RixVQUFVLEtBQUtBO0FBQ3JCLFVBQU1vWixZQUFZcFosUUFBUUksTUFBTWtCO0FBRWhDLFFBQUk4WCxXQUFXO0FBQ2IsYUFBTzdZLFNBQUs2WSxXQUFXO1FBQUN6RDtRQUFNclk7UUFBTzhDO01BQU0sR0FBRSxJQUFJOztBQUduRCxVQUFNZ1gsVUFBVXBYLFFBQVEyVixLQUFLd0I7QUFDN0IsVUFBTWxWLE9BQU8sS0FBS3lVO0FBQ2xCLFVBQU1SLFlBQVksS0FBS1M7QUFDdkIsVUFBTTBDLGNBQWNwWCxRQUFRbVYsUUFBUW5WLElBQUs7QUFDekMsVUFBTXFYLGNBQWNwRCxhQUFha0IsUUFBUWxCLFNBQVU7QUFDbkQsVUFBTTdELE9BQU9qUyxNQUFNOUMsS0FBTTtBQUN6QixVQUFNa0ssUUFBUTBPLGFBQWFvRCxlQUFlakgsUUFBUUEsS0FBSzdLO0FBRXZELFdBQU8sS0FBS2tOLFNBQVM3TyxPQUFPOFAsTUFBTTlQLFdBQVcyQixRQUFROFIsY0FBY0QsWUFBVTtFQUMvRTtFQUtBaEosbUJBQW1CalEsT0FBTztBQUN4QixRQUFJdUssR0FBR3dLLE1BQU05QztBQUViLFNBQUsxSCxJQUFJLEdBQUd3SyxPQUFPL1UsTUFBTTNCLFFBQVFrTSxJQUFJd0ssTUFBTSxFQUFFeEssR0FBRztBQUM5QzBILGFBQU9qUyxNQUFNdUssQ0FBRTtBQUNmMEgsV0FBSzNVLFFBQVEsS0FBS3liLG9CQUFvQjlHLEtBQUs5VCxPQUFPb00sR0FBR3ZLLEtBQUFBO0lBQ3ZEO0VBQ0Y7RUFNQW9ZLG1CQUFtQmphLE9BQU87QUFDeEIsV0FBT0EsVUFBVSxPQUFPcUMsT0FBT3JDLFFBQVEsS0FBS3VCLFFBQVEsS0FBSzVCLE1BQU0sS0FBSzRCO0VBQ3RFO0VBTUFhLGlCQUFpQnBDLE9BQU87QUFDdEIsVUFBTWdiLFVBQVUsS0FBSzNDO0FBQ3JCLFVBQU14TixNQUFNLEtBQUtvUCxtQkFBbUJqYSxLQUFBQTtBQUNwQyxXQUFPLEtBQUtzQyxvQkFBb0IwWSxRQUFReFYsUUFBUXFGLE9BQU9tUSxRQUFROVcsTUFBTTtFQUN2RTtFQU1BMUIsaUJBQWlCQyxPQUFPO0FBQ3RCLFVBQU11WSxVQUFVLEtBQUszQztBQUNyQixVQUFNeE4sTUFBTSxLQUFLbkksbUJBQW1CRCxLQUFBQSxJQUFTdVksUUFBUTlXLFNBQVM4VyxRQUFRdlY7QUFDdEUsV0FBTyxLQUFLbEUsTUFBTXNKLE9BQU8sS0FBS2xMLE1BQU0sS0FBSzRCO0VBQzNDO0VBT0EwWixjQUFjOWIsT0FBTztBQUNuQixVQUFNK2IsWUFBWSxLQUFLelosUUFBUUk7QUFDL0IsVUFBTXNaLGlCQUFpQixLQUFLOVEsSUFBSW1LLFlBQVlyVixLQUFBQSxFQUFPcUk7QUFDbkQsVUFBTW9ELFFBQVF6RixVQUFVLEtBQUtqRCxhQUFZLElBQUtnWixVQUFVRSxjQUFjRixVQUFValcsV0FBVztBQUMzRixVQUFNb1csY0FBY3hiLEtBQUt5RixJQUFJc0YsS0FBQUE7QUFDN0IsVUFBTTBRLGNBQWN6YixLQUFLd0YsSUFBSXVGLEtBQUFBO0FBQzdCLFVBQU0yUSxlQUFlLEtBQUs1VCx3QkFBd0IsQ0FBQSxFQUFHd0M7QUFFckQsV0FBTztNQUNMSSxHQUFJNFEsaUJBQWlCRSxjQUFnQkUsZUFBZUQ7TUFDcEQ1USxHQUFJeVEsaUJBQWlCRyxjQUFnQkMsZUFBZUY7SUFDdEQ7RUFDRjtFQU9BeEIsa0JBQWtCMkIsYUFBYTtBQUM3QixVQUFNL0IsV0FBVyxLQUFLaFksUUFBUTJWO0FBQzlCLFVBQU13QixpQkFBaUJhLFNBQVNiO0FBR2hDLFVBQU10UixTQUFTc1IsZUFBZWEsU0FBUy9WLElBQUksS0FBS2tWLGVBQWV6RDtBQUMvRCxVQUFNc0csZUFBZSxLQUFLYixvQkFBb0JZLGFBQWEsR0FBRzNELG9CQUFvQixNQUFNO01BQUMyRDtPQUFjLEtBQUtwRCxVQUFVLEdBQUc5USxNQUFBQTtBQUN6SCxVQUFNNkMsT0FBTyxLQUFLOFEsY0FBY1EsWUFBQUE7QUFHaEMsVUFBTTlFLFdBQVc5VyxLQUFLMEUsTUFBTSxLQUFLckMsYUFBWSxJQUFLLEtBQUtzRixRQUFRMkMsS0FBS0ksSUFBSSxLQUFLOUMsU0FBUzBDLEtBQUtPLENBQUMsSUFBSTtBQUNoRyxXQUFPaU0sV0FBVyxJQUFJQSxXQUFXO0VBQ25DO0VBS0E0RCxvQkFBb0I7QUFDbEIsUUFBSWxELGFBQWEsS0FBS1csT0FBT0MsUUFBUSxDQUFBO0FBQ3JDLFFBQUk3TCxHQUFHd0s7QUFFUCxRQUFJUyxXQUFXblgsUUFBUTtBQUNyQixhQUFPbVg7O0FBR1QsVUFBTXFFLFFBQVEsS0FBS0Msd0JBQXVCO0FBRTFDLFFBQUksS0FBS3JELGVBQWVvRCxNQUFNeGIsUUFBUTtBQUNwQyxhQUFRLEtBQUs4WCxPQUFPQyxPQUFPeUQsTUFBTSxDQUFBLEVBQUdFLFdBQVdDLG1CQUFtQixJQUFJOztBQUd4RSxTQUFLelAsSUFBSSxHQUFHd0ssT0FBTzhFLE1BQU14YixRQUFRa00sSUFBSXdLLE1BQU0sRUFBRXhLLEdBQUc7QUFDOUNpTCxtQkFBYUEsV0FBV3lFLE9BQU9KLE1BQU10UCxDQUFFLEVBQUN3UCxXQUFXQyxtQkFBbUIsSUFBSSxDQUFBO0lBQzVFO0FBRUEsV0FBUSxLQUFLN0QsT0FBT0MsT0FBTyxLQUFLOEQsVUFBVTFFLFVBQUFBO0VBQzVDO0VBS0FrQyxxQkFBcUI7QUFDbkIsVUFBTWxDLGFBQWEsS0FBS1csT0FBT25aLFVBQVUsQ0FBQTtBQUN6QyxRQUFJdU4sR0FBR3dLO0FBRVAsUUFBSVMsV0FBV25YLFFBQVE7QUFDckIsYUFBT21YOztBQUdULFVBQU14WSxTQUFTLEtBQUtvQixVQUFTO0FBQzdCLFNBQUttTSxJQUFJLEdBQUd3SyxPQUFPL1gsT0FBT3FCLFFBQVFrTSxJQUFJd0ssTUFBTSxFQUFFeEssR0FBRztBQUMvQ2lMLGlCQUFXcFksS0FBSzhCLE1BQU0sTUFBTWxDLE9BQU91TixDQUFFLENBQUEsQ0FBQTtJQUN2QztBQUVBLFdBQVEsS0FBSzRMLE9BQU9uWixTQUFTLEtBQUt5WixjQUFjakIsYUFBYSxLQUFLMEUsVUFBVTFFLFVBQVc7RUFDekY7RUFNQTBFLFVBQVUzTSxRQUFRO0FBRWhCLFdBQU80TSxhQUFhNU0sT0FBT29MLEtBQUt6RSxNQUFBQSxDQUFBQTtFQUNsQztBQUNGO0FBMWRFLGNBRm1CK0IsV0FFWmpWLE1BQUs7QUFLWixjQVBtQmlWLFdBT1poVixZQUFXO0VBUWhCcEIsUUFBUTtFQUVSOFcsVUFBVSxDQUFBO0VBQ1ZwQixNQUFNO0lBQ0poQixRQUFRO0lBQ1IxUyxNQUFNO0lBQ041RCxPQUFPO0lBQ1B1VyxZQUFZO0lBQ1pLLFNBQVM7SUFDVGtDLGdCQUFnQixDQUFBO0VBQ2xCO0VBQ0EvVyxPQUFPO0lBU0xxWCxRQUFRO0lBRVJuVyxVQUFVO0lBRVZrRyxPQUFPO01BQ0xXLFNBQVM7SUFDWDtFQUNGOztBQ3JPSixTQUFTcVMsYUFBWUMsT0FBT0MsS0FBS2pWLFNBQVM7QUFDeEMsTUFBSW9RLEtBQUs7QUFDVCxNQUFJQyxLQUFLMkUsTUFBTWhjLFNBQVM7QUFDeEIsTUFBSWtjLFlBQVlDLFlBQVlDLFlBQVlDO0FBQ3hDLE1BQUlyVixTQUFTO0FBQ1gsUUFBSWlWLE9BQU9ELE1BQU01RSxFQUFBQSxFQUFJek0sT0FBT3NSLE9BQU9ELE1BQU0zRSxFQUFHLEVBQUMxTSxLQUFLO0FBQy9DLE9BQUEsRUFBQ3lNLElBQUlDLEdBQUFBLElBQU1pRixhQUFhTixPQUFPLE9BQU9DLEdBQUc7O0FBRTNDLEtBQUEsRUFBQ3RSLEtBQUt1UixZQUFZaEYsTUFBTWtGLFdBQVUsSUFBSUosTUFBTTVFLEVBQUFBO0FBQzVDLEtBQUEsRUFBQ3pNLEtBQUt3UixZQUFZakYsTUFBTW1GLFdBQVUsSUFBSUwsTUFBTTNFLEVBQUFBO1NBQ3hDO0FBQ0wsUUFBSTRFLE9BQU9ELE1BQU01RSxFQUFBQSxFQUFJRixRQUFRK0UsT0FBT0QsTUFBTTNFLEVBQUcsRUFBQ0gsTUFBTTtBQUNqRCxPQUFBLEVBQUNFLElBQUlDLEdBQUFBLElBQU1pRixhQUFhTixPQUFPLFFBQVFDLEdBQUc7O0FBRTVDLEtBQUEsRUFBQy9FLE1BQU1nRixZQUFZdlIsS0FBS3lSLFdBQVUsSUFBSUosTUFBTTVFLEVBQUFBO0FBQzVDLEtBQUEsRUFBQ0YsTUFBTWlGLFlBQVl4UixLQUFLMFIsV0FBVSxJQUFJTCxNQUFNM0UsRUFBQUE7O0FBRy9DLFFBQU1rRixPQUFPSixhQUFhRDtBQUMxQixTQUFPSyxPQUFPSCxjQUFjQyxhQUFhRCxlQUFlSCxNQUFNQyxjQUFjSyxPQUFPSDtBQUNyRjtBQUVBLElBQU1JLGtCQUFOLGNBQThCNUUsVUFBQUE7RUFZNUJ6WCxZQUFZMFgsT0FBTztBQUNqQixVQUFNQSxLQUFBQTtBQUdOLFNBQUs0RSxTQUFTLENBQUE7QUFFZCxTQUFLQyxVQUFVcGM7QUFFZixTQUFLcWMsY0FBY3JjO0VBQ3JCO0VBS0FzWixjQUFjO0FBQ1osVUFBTXpDLGFBQWEsS0FBS3lGLHVCQUFzQjtBQUM5QyxVQUFNWixRQUFRLEtBQUtTLFNBQVMsS0FBS0ksaUJBQWlCMUYsVUFBQUE7QUFDbEQsU0FBS3VGLFVBQVVYLGFBQVlDLE9BQU8sS0FBSzNhLEdBQUc7QUFDMUMsU0FBS3NiLGNBQWNaLGFBQVlDLE9BQU8sS0FBS3ZjLEdBQUcsSUFBSSxLQUFLaWQ7QUFDdkQsVUFBTTlDLFlBQVl6QyxVQUFBQTtFQUNwQjtFQWFBMEYsaUJBQWlCMUYsWUFBWTtBQUMzQixVQUFNLEVBQUM5VixLQUFLNUIsSUFBRyxJQUFJO0FBQ25CLFVBQU04TyxRQUFRLENBQUE7QUFDZCxVQUFNeU4sUUFBUSxDQUFBO0FBQ2QsUUFBSTlQLEdBQUd3SyxNQUFNb0csTUFBTUMsTUFBTUM7QUFFekIsU0FBSzlRLElBQUksR0FBR3dLLE9BQU9TLFdBQVduWCxRQUFRa00sSUFBSXdLLE1BQU0sRUFBRXhLLEdBQUc7QUFDbkQ2USxhQUFPNUYsV0FBV2pMLENBQUU7QUFDcEIsVUFBSTZRLFFBQVExYixPQUFPMGIsUUFBUXRkLEtBQUs7QUFDOUI4TyxjQUFNeFAsS0FBS2dlLElBQUFBOztJQUVmO0FBRUEsUUFBSXhPLE1BQU12TyxTQUFTLEdBQUc7QUFFcEIsYUFBTztRQUNMO1VBQUNrWCxNQUFNN1Y7VUFBS3NKLEtBQUs7UUFBQztRQUNsQjtVQUFDdU0sTUFBTXpYO1VBQUtrTCxLQUFLO1FBQUM7TUFDbkI7O0FBR0gsU0FBS3VCLElBQUksR0FBR3dLLE9BQU9uSSxNQUFNdk8sUUFBUWtNLElBQUl3SyxNQUFNLEVBQUV4SyxHQUFHO0FBQzlDOFEsYUFBT3pPLE1BQU1yQyxJQUFJLENBQUU7QUFDbkI0USxhQUFPdk8sTUFBTXJDLElBQUksQ0FBRTtBQUNuQjZRLGFBQU94TyxNQUFNckMsQ0FBRTtBQUdmLFVBQUl2TSxLQUFLQyxPQUFPb2QsT0FBT0YsUUFBUSxDQUFBLE1BQU9DLE1BQU07QUFDMUNmLGNBQU1qZCxLQUFLO1VBQUNtWSxNQUFNNkY7VUFBTXBTLEtBQUt1QixLQUFLd0ssT0FBTztRQUFFLENBQUE7O0lBRS9DO0FBQ0EsV0FBT3NGO0VBQ1Q7RUFRQXhDLFlBQVk7QUFDVixVQUFNblksTUFBTSxLQUFLQTtBQUNqQixVQUFNNUIsTUFBTSxLQUFLQTtBQUNqQixRQUFJMFgsYUFBYSxNQUFNa0Qsa0JBQWlCO0FBQ3hDLFFBQUksQ0FBQ2xELFdBQVc4RixTQUFTNWIsR0FBQUEsS0FBUSxDQUFDOFYsV0FBV25YLFFBQVE7QUFDbkRtWCxpQkFBV3ZXLE9BQU8sR0FBRyxHQUFHUyxHQUFBQTs7QUFFMUIsUUFBSSxDQUFDOFYsV0FBVzhGLFNBQVN4ZCxHQUFBQSxLQUFRMFgsV0FBV25YLFdBQVcsR0FBRztBQUN4RG1YLGlCQUFXcFksS0FBS1UsR0FBQUE7O0FBRWxCLFdBQU8wWCxXQUFXbUQsS0FBSyxDQUFDeEUsR0FBR3hLLE1BQU13SyxJQUFJeEssQ0FBQUE7RUFDdkM7RUFPQXNSLHlCQUF5QjtBQUN2QixRQUFJekYsYUFBYSxLQUFLVyxPQUFPRSxPQUFPLENBQUE7QUFFcEMsUUFBSWIsV0FBV25YLFFBQVE7QUFDckIsYUFBT21YOztBQUdULFVBQU1ZLE9BQU8sS0FBS3NDLGtCQUFpQjtBQUNuQyxVQUFNcGIsUUFBUSxLQUFLb2EsbUJBQWtCO0FBQ3JDLFFBQUl0QixLQUFLL1gsVUFBVWYsTUFBTWUsUUFBUTtBQUcvQm1YLG1CQUFhLEtBQUswRSxVQUFVOUQsS0FBSzZELE9BQU8zYyxLQUFBQSxDQUFBQTtXQUNuQztBQUNMa1ksbUJBQWFZLEtBQUsvWCxTQUFTK1gsT0FBTzlZOztBQUVwQ2tZLGlCQUFhLEtBQUtXLE9BQU9FLE1BQU1iO0FBRS9CLFdBQU9BO0VBQ1Q7RUFNQTRDLG1CQUFtQmphLE9BQU87QUFDeEIsWUFBUWljLGFBQVksS0FBS1UsUUFBUTNjLEtBQVMsSUFBQSxLQUFLNGMsV0FBVyxLQUFLQztFQUNqRTtFQU1BcmEsaUJBQWlCQyxPQUFPO0FBQ3RCLFVBQU11WSxVQUFVLEtBQUszQztBQUNyQixVQUFNM08sVUFBVSxLQUFLaEgsbUJBQW1CRCxLQUFBQSxJQUFTdVksUUFBUTlXLFNBQVM4VyxRQUFRdlY7QUFDMUUsV0FBT3dXLGFBQVksS0FBS1UsUUFBUWpULFVBQVUsS0FBS21ULGNBQWMsS0FBS0QsU0FBUyxJQUFJO0VBQ2pGO0FBQ0Y7QUEzSUUsY0FGSUYsaUJBRUc3WixNQUFLO0FBS1osY0FQSTZaLGlCQU9HNVosWUFBV2dWLFVBQVVoVjs7O0F6RWY5QixNQUFNO0FBQUEsRUFDRjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNKO0FBRU8sSUFBTSxhQUFOLGNBQXlCLHVCQUFNO0FBQUEsRUFHbEMsWUFBWXNhLE1BQVUsUUFBa0I7QUFDcEMsVUFBTUEsSUFBRztBQUVULFNBQUssU0FBUztBQUVkLFNBQUssUUFBUSxRQUFRLEdBQUcsRUFBRSxhQUFhLENBQUMsR0FBRztBQUMzQyxTQUFLLFFBQVEsU0FBUyxhQUFhO0FBQ25DLFNBQUssUUFBUSxhQUNULGtDQUFBQyxTQUFDLFlBQU8sSUFBRyxxQkFDUCxrQ0FBQUEsU0FBQyxZQUFPLE9BQU0sU0FBUSxVQUFRLFFBQ3pCLEVBQUUsT0FBTyxDQUNkLEdBQ0Esa0NBQUFBLFNBQUMsWUFBTyxPQUFNLGFBQVcsRUFBRSxTQUFTLENBQUUsR0FDdEMsa0NBQUFBLFNBQUMsWUFBTyxPQUFNLFVBQVEsRUFBRSxNQUFNLENBQUUsR0FDaEMsa0NBQUFBLFNBQUMsWUFBTyxPQUFNLGNBQVksRUFBRSxVQUFVLENBQUUsQ0FDNUM7QUFHSixTQUFLLFFBQVEsTUFBTSxTQUFTO0FBQzVCLFNBQUssUUFBUSxNQUFNLFFBQVE7QUFFM0IsUUFBSSwwQkFBUyxVQUFVO0FBQ25CLFdBQUssVUFBVSxNQUFNLFVBQVU7QUFBQSxJQUNuQztBQUFBLEVBQ0o7QUFBQSxFQUVBLFNBQWU7QUFDWCxVQUFNLEVBQUUsVUFBVSxJQUFJO0FBQ3RCLGNBQVUsTUFBTSxZQUFZO0FBRzVCLFVBQU0sWUFBbUIsS0FBSyxPQUFPO0FBQ3JDLFFBQUksT0FBZSxVQUFVLFlBQVksWUFBWTtBQUNyRCxhQUFTLFlBQVksR0FBRyxhQUFhLE1BQU0sYUFBYTtBQUNwRCxnQkFBVSxZQUFZLG9CQUFvQixTQUFTO0FBQUEsSUFDdkQ7QUFFQSxVQUFNLHlCQUFpRCxFQUFFLEdBQUcsRUFBRTtBQUM5RCxlQUFXLENBQUMsV0FBVyxRQUFRLEtBQUssc0JBQXNCLFVBQVUsWUFBWSxJQUFJLEdBQUc7QUFDbkYsVUFBSSxhQUFhLEdBQUc7QUFDaEIsK0JBQXVCLENBQUMsS0FBSztBQUFBLE1BQ2pDLE9BQU87QUFDSCwrQkFBdUIsU0FBUyxJQUFJO0FBQUEsTUFDeEM7QUFBQSxJQUNKO0FBRUEsVUFBTSxpQkFBeUIsVUFBVSxhQUFhLFVBQVU7QUFDaEUsV0FBTyxLQUFLLElBQUksTUFBTSxDQUFDO0FBRXZCLGNBQVUsYUFDTixrQ0FBQUEsU0FBQyxhQUNHLGtDQUFBQSxTQUFDLFlBQU8sSUFBRyxpQkFBZ0IsR0FDM0Isa0NBQUFBLFNBQUMsVUFBSyxJQUFHLHdCQUF1QixHQUNoQyxrQ0FBQUEsU0FBQyxVQUFHLEdBQ0osa0NBQUFBLFNBQUMsVUFBRyxHQUNKLGtDQUFBQSxTQUFDLFlBQU8sSUFBRyxrQkFBaUIsR0FDNUIsa0NBQUFBLFNBQUMsVUFBSyxJQUFHLHlCQUF3QixHQUNqQyxrQ0FBQUEsU0FBQyxVQUFHLEdBQ0osa0NBQUFBLFNBQUMsVUFBRyxHQUNKLGtDQUFBQSxTQUFDLFlBQU8sSUFBRyxjQUFhLEdBQ3hCLGtDQUFBQSxTQUFDLFVBQUssSUFBRyxxQkFBb0IsR0FDN0Isa0NBQUFBLFNBQUMsVUFBRyxHQUNKLGtDQUFBQSxTQUFDLFVBQUcsR0FDSixrQ0FBQUEsU0FBQyxZQUFPLElBQUcsa0JBQWlCLEdBQzVCLGtDQUFBQSxTQUFDLFVBQUcsR0FDSixrQ0FBQUEsU0FBQyxVQUFLLElBQUcseUJBQXdCLENBQ3JDO0FBR0o7QUFBQSxNQUNJO0FBQUEsTUFDQTtBQUFBLE1BQ0EsRUFBRSxVQUFVO0FBQUEsTUFDWixFQUFFLGVBQWU7QUFBQSxNQUNqQixPQUFPLEtBQUssc0JBQXNCO0FBQUEsTUFDbEMsT0FBTyxPQUFPLHNCQUFzQjtBQUFBLE1BQ3BDLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsTUFBTSxRQUFRLENBQUMsRUFBRSxDQUFDO0FBQUEsTUFDaEUsRUFBRSxXQUFXO0FBQUEsTUFDYixFQUFFLE1BQU07QUFBQSxNQUNSLEVBQUUsaUJBQWlCO0FBQUEsSUFDdkI7QUFFQSxXQUFPLFVBQVUsVUFBVSxZQUFZO0FBQ3ZDLGFBQVMsV0FBVyxHQUFHLFlBQVksTUFBTSxZQUFZO0FBQ2pELGdCQUFVLFVBQVUsb0JBQW9CLFFBQVE7QUFBQSxJQUNwRDtBQUdBLFVBQU0sbUJBQTJCO0FBQUEsTUFDekIsS0FBSztBQUFBLFFBQ0EsVUFBVSxVQUFVLDZCQUE2QixJQUFJLGlCQUFrQjtBQUFBLE1BQzVFLElBQUksTUFBTTtBQUFBLE1BQ1Y7QUFBQSxJQUNKLEdBQ0EsbUJBQTJCLGFBQWEsVUFBVSxVQUFVLFlBQVksR0FBRyxLQUFLO0FBRXBGO0FBQUEsTUFDSTtBQUFBLE1BQ0E7QUFBQSxNQUNBLEVBQUUsV0FBVztBQUFBLE1BQ2IsRUFBRSxnQkFBZ0I7QUFBQSxNQUNsQixPQUFPLEtBQUssVUFBVSxVQUFVLElBQUk7QUFBQSxNQUNwQyxPQUFPLE9BQU8sVUFBVSxVQUFVLElBQUk7QUFBQSxNQUN0QyxFQUFFLHFCQUFxQixFQUFFLEtBQUssa0JBQWtCLFNBQVMsaUJBQWlCLENBQUM7QUFBQSxNQUMzRSxFQUFFLE9BQU87QUFBQSxNQUNULEVBQUUsTUFBTTtBQUFBLE1BQ1IsRUFBRSxpQkFBaUI7QUFBQSxJQUN2QjtBQUdBLFVBQU0sUUFBa0Isb0JBQW9CLFVBQVUsTUFBTSxJQUFJO0FBQ2hFLGFBQVMsT0FBTyxLQUFLLElBQUksR0FBRyxLQUFLLEdBQUcsUUFBUSxLQUFLLElBQUksR0FBRyxLQUFLLEdBQUcsUUFBUTtBQUNwRSxnQkFBVSxNQUFNLG9CQUFvQixJQUFJO0FBQUEsSUFDNUM7QUFDQSxVQUFNLGVBQ0YsS0FBSyxNQUFNLFVBQVUsTUFBTSw2QkFBNkIsSUFBSSxjQUFjLEtBQUs7QUFFbkY7QUFBQSxNQUNJO0FBQUEsTUFDQTtBQUFBLE1BQ0EsRUFBRSxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0EsT0FBTyxLQUFLLFVBQVUsTUFBTSxJQUFJO0FBQUEsTUFDaEMsT0FBTyxPQUFPLFVBQVUsTUFBTSxJQUFJO0FBQUEsTUFDbEMsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLGFBQWEsQ0FBQztBQUFBLE1BQzVDLEVBQUUsT0FBTztBQUFBLE1BQ1QsRUFBRSxPQUFPO0FBQUEsTUFDVCxFQUFFLGlCQUFpQjtBQUFBLElBQ3ZCO0FBR0EsVUFBTSxrQkFBMEIsS0FBSyxPQUFPLFNBQVMsMEJBQStCLElBQUk7QUFDeEY7QUFBQSxNQUNJO0FBQUEsTUFDQTtBQUFBLE1BQ0EsRUFBRSxZQUFZO0FBQUEsTUFDZCxFQUFFLGlCQUFpQjtBQUFBLE1BQ25CO0FBQUEsUUFDSSxHQUFHLEVBQUUsZUFBZSxDQUFDLE1BQU0sS0FBSztBQUFBLFVBQzNCLFVBQVUsV0FBVyxrQkFBbUI7QUFBQSxRQUM3QyxDQUFDO0FBQUEsUUFDRCxHQUFHLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxLQUFLO0FBQUEsVUFDN0IsVUFBVSxhQUFhLGtCQUFtQjtBQUFBLFFBQy9DLENBQUM7QUFBQSxRQUNELEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLEtBQUs7QUFBQSxVQUM5QixVQUFVLGNBQWMsa0JBQW1CO0FBQUEsUUFDaEQsQ0FBQztBQUFBLE1BQ0w7QUFBQSxNQUNBLENBQUMsVUFBVSxVQUFVLFVBQVUsWUFBWSxVQUFVLFdBQVc7QUFBQSxNQUNoRSxFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixDQUFDO0FBQUEsSUFDL0M7QUFBQSxFQUNKO0FBQUEsRUFFQSxVQUFnQjtBQUNaLFVBQU0sRUFBRSxVQUFVLElBQUk7QUFDdEIsY0FBVSxNQUFNO0FBQUEsRUFDcEI7QUFDSjtBQUVBLFNBQVMsaUJBQ0wsTUFDQSxVQUNBLE9BQ0EsVUFDQSxRQUNBLE1BQ0EsU0FDQSxjQUFjLElBQ2QsYUFBYSxJQUNiLGFBQWEsSUFDZjtBQUNFLFFBQU0sUUFBUSxpQkFBaUIsU0FBUyxJQUFJO0FBQzVDLFFBQU0sWUFBWSxNQUFNLGlCQUFpQixlQUFlO0FBRXhELE1BQUksU0FBUyxDQUFDLEdBQ1Ysa0JBQWtCLENBQUMsU0FBUztBQUNoQyxNQUFJLFNBQVMsT0FBTztBQUNoQixhQUFTO0FBQUEsTUFDTCxHQUFHO0FBQUEsUUFDQyxPQUFPO0FBQUEsVUFDSCxTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsVUFDTixPQUFPO0FBQUEsUUFDWDtBQUFBLE1BQ0o7QUFBQSxNQUNBLEdBQUc7QUFBQSxRQUNDLE9BQU87QUFBQSxVQUNILFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKLE9BQU87QUFDSCxzQkFBa0IsQ0FBQyxXQUFXLFdBQVcsT0FBTztBQUFBLEVBQ3BEO0FBRUEsUUFBTSxlQUFlLGFBQWEsbUJBQW1CLGFBQWE7QUFFbEUsUUFBTSxhQUFhLElBQUksTUFBTSxTQUFTLGVBQWUsUUFBUSxHQUF3QjtBQUFBLElBQ2pGO0FBQUEsSUFDQSxNQUFNO0FBQUEsTUFDRixRQUFRLGVBQWUsT0FBTyxNQUFNLEdBQUcsRUFBRSxJQUFJO0FBQUEsTUFDN0MsVUFBVTtBQUFBLFFBQ047QUFBQSxVQUNJLE9BQU87QUFBQSxVQUNQO0FBQUEsVUFDQSxNQUFNLGVBQWUsS0FBSyxNQUFNLEdBQUcsRUFBRSxJQUFJO0FBQUEsUUFDN0M7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ0w7QUFBQSxNQUNBLFNBQVM7QUFBQSxRQUNMLE9BQU87QUFBQSxVQUNILFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsVUFDQSxPQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ04sU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sT0FBTztBQUFBLFVBQ1g7QUFBQSxVQUNBLE9BQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxRQUFRO0FBQUEsVUFDSixTQUFTO0FBQUEsUUFDYjtBQUFBLE1BQ0o7QUFBQSxNQUNBLGFBQWE7QUFBQSxJQUNqQjtBQUFBLEVBQ0osQ0FBQztBQUVELE1BQUksY0FBYztBQUNkLFVBQU0sZ0JBQWdCLFNBQVMsZUFBZSxpQkFBaUI7QUFDL0Qsa0JBQWMsaUJBQWlCLFNBQVMsTUFBTTtBQUMxQyxVQUFJLGdCQUFnQjtBQUNwQixZQUFNLGNBQWMsY0FBYztBQUNsQyxVQUFJLGdCQUFnQixTQUFTO0FBQ3pCLHlCQUFpQixPQUFPLE1BQU0sR0FBRyxFQUFFO0FBQ25DLHVCQUFlLEtBQUssTUFBTSxHQUFHLEVBQUU7QUFBQSxNQUNuQyxXQUFXLGdCQUFnQixXQUFXO0FBQ2xDLHlCQUFpQixPQUFPLE1BQU0sR0FBRyxFQUFFO0FBQ25DLHVCQUFlLEtBQUssTUFBTSxHQUFHLEVBQUU7QUFBQSxNQUNuQyxXQUFXLGdCQUFnQixRQUFRO0FBQy9CLHlCQUFpQixPQUFPLE1BQU0sR0FBRyxHQUFHO0FBQ3BDLHVCQUFlLEtBQUssTUFBTSxHQUFHLEdBQUc7QUFBQSxNQUNwQyxPQUFPO0FBQ0gseUJBQWlCO0FBQ2pCLHVCQUFlO0FBQUEsTUFDbkI7QUFFQSxpQkFBVyxLQUFLLFNBQVM7QUFDekIsaUJBQVcsS0FBSyxTQUFTLENBQUMsSUFBSTtBQUFBLFFBQzFCLE9BQU87QUFBQSxRQUNQO0FBQUEsUUFDQSxNQUFNO0FBQUEsTUFDVjtBQUNBLGlCQUFXLE9BQU87QUFBQSxJQUN0QixDQUFDO0FBQUEsRUFDTDtBQUVBLFdBQVMsZUFBZSxHQUFHLFFBQVEsU0FBUyxFQUFFLFlBQVk7QUFDOUQ7OztBMkV0VEEsSUFBQUMsbUJBQXFEO0FBTzlDLElBQU0seUJBQXlCO0FBRS9CLElBQU0sc0JBQU4sY0FBa0MsMEJBQVM7QUFBQSxFQUc5QyxZQUFZLE1BQXFCLFFBQWtCO0FBQy9DLFVBQU0sSUFBSTtBQUVWLFNBQUssU0FBUztBQUNkLFNBQUssY0FBYyxLQUFLLElBQUksVUFBVSxHQUFHLGFBQWEsTUFBTSxLQUFLLE9BQU8sQ0FBQyxDQUFDO0FBQzFFLFNBQUssY0FBYyxLQUFLLElBQUksTUFBTSxHQUFHLFVBQVUsTUFBTSxLQUFLLE9BQU8sQ0FBQyxDQUFDO0FBQUEsRUFDdkU7QUFBQSxFQUVPLGNBQXNCO0FBQ3pCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFTyxpQkFBeUI7QUFDNUIsV0FBTyxFQUFFLG9CQUFvQjtBQUFBLEVBQ2pDO0FBQUEsRUFFTyxVQUFrQjtBQUNyQixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRU8sYUFBYSxNQUFrQjtBQUNsQyxTQUFLLFFBQVEsQ0FBQyxTQUFTO0FBQ25CLFdBQUssU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUNuQixRQUFRLE9BQU8sRUFDZixRQUFRLE1BQU07QUFDWCxhQUFLLElBQUksVUFBVSxtQkFBbUIsc0JBQXNCO0FBQUEsTUFDaEUsQ0FBQztBQUFBLElBQ1QsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVPLFNBQWU7QUFDbEIsVUFBTSxhQUEyQixLQUFLLElBQUksVUFBVSxjQUFjO0FBRWxFLFVBQU0sU0FBc0IsVUFBVSxxQkFBcUI7QUFDM0QsVUFBTSxhQUEwQixPQUFPLFVBQVUscUJBQXFCO0FBRXRFLGVBQVcsV0FBVyxLQUFLLE9BQU8sYUFBYTtBQUMzQyxZQUFNLE9BQW1CLEtBQUssT0FBTyxZQUFZLE9BQU87QUFFeEQsWUFBTSxnQkFBZ0IsQ0FBQyxLQUFLLGNBQWMsSUFBSSxLQUFLLFFBQVE7QUFFM0QsWUFBTSxlQUE0QixLQUFLO0FBQUEsUUFDbkM7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDSixFQUFFLHVCQUF1QixxQkFBcUIsRUFBRSxDQUFDO0FBRWpELFVBQUksS0FBSyxTQUFTLFNBQVMsR0FBRztBQUMxQixjQUFNLG1CQUFnQyxLQUFLO0FBQUEsVUFDdkM7QUFBQSxVQUNBLEVBQUUsS0FBSztBQUFBLFVBQ1AsQ0FBQyxLQUFLLGNBQWMsSUFBSSxFQUFFLEtBQUssQ0FBQztBQUFBLFVBQ2hDO0FBQUEsVUFDQTtBQUFBLFFBQ0o7QUFFQSxtQkFBVyxXQUFXLEtBQUssVUFBVTtBQUNqQyxnQkFBTSxhQUFhLGNBQWMsUUFBUSxTQUFTLFdBQVc7QUFDN0QsY0FBSSxZQUFZO0FBQ1osaUJBQUssY0FBYyxJQUFJLEtBQUssUUFBUTtBQUNwQyxpQkFBSyxjQUFjLElBQUksRUFBRSxLQUFLLENBQUM7QUFDL0IsaUJBQUssMkJBQTJCLGdCQUFnQjtBQUNoRCxpQkFBSywyQkFBMkIsWUFBWTtBQUFBLFVBQ2hEO0FBQ0EsZUFBSztBQUFBLFlBQ0Q7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0EsQ0FBQyxLQUFLLGNBQWMsSUFBSSxFQUFFLEtBQUssQ0FBQztBQUFBLFlBQ2hDO0FBQUEsWUFDQSxLQUFLO0FBQUEsVUFDVDtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBRUEsVUFBSSxLQUFLLGVBQWUsU0FBUyxHQUFHO0FBQ2hDLGNBQU0sTUFBYyxLQUFLLElBQUk7QUFDN0IsWUFBSSxXQUFXO0FBQ2YsWUFBSSxnQkFBb0MsTUFDcEMsY0FBYztBQUNsQixjQUFNLGtCQUEwQixLQUFLLE9BQU8sS0FBSyxTQUFTO0FBRTFELG1CQUFXLFNBQVMsS0FBSyxnQkFBZ0I7QUFDckMsY0FBSSxNQUFNLFdBQVcsVUFBVTtBQUMzQixrQkFBTSxRQUFnQixLQUFLLE1BQU0sTUFBTSxVQUFVLFFBQVEsS0FBSyxPQUFPLElBQUs7QUFFMUUsZ0JBQUksUUFBUSxpQkFBaUI7QUFDekI7QUFBQSxZQUNKO0FBRUEsZ0JBQUksVUFBVSxJQUFJO0FBQ2QsNEJBQWMsRUFBRSxXQUFXO0FBQUEsWUFDL0IsV0FBVyxVQUFVLEdBQUc7QUFDcEIsNEJBQWMsRUFBRSxPQUFPO0FBQUEsWUFDM0IsV0FBVyxVQUFVLEdBQUc7QUFDcEIsNEJBQWMsRUFBRSxVQUFVO0FBQUEsWUFDOUIsT0FBTztBQUNILDRCQUFjLElBQUksS0FBSyxNQUFNLE9BQU8sRUFBRSxhQUFhO0FBQUEsWUFDdkQ7QUFFQSw0QkFBZ0IsS0FBSztBQUFBLGNBQ2pCO0FBQUEsY0FDQTtBQUFBLGNBQ0EsQ0FBQyxLQUFLLGNBQWMsSUFBSSxXQUFXO0FBQUEsY0FDbkM7QUFBQSxjQUNBO0FBQUEsWUFDSjtBQUNBLHVCQUFXLE1BQU07QUFBQSxVQUNyQjtBQUVBLGdCQUFNLGFBQWEsY0FBYyxNQUFNLEtBQUssU0FBUyxXQUFXO0FBQ2hFLGNBQUksWUFBWTtBQUNaLGlCQUFLLGNBQWMsSUFBSSxLQUFLLFFBQVE7QUFDcEMsaUJBQUssY0FBYyxJQUFJLFdBQVc7QUFDbEMsaUJBQUssMkJBQTJCLGFBQWE7QUFDN0MsaUJBQUssMkJBQTJCLFlBQVk7QUFBQSxVQUNoRDtBQUVBLGVBQUs7QUFBQSxZQUNEO0FBQUEsWUFDQSxNQUFNO0FBQUEsWUFDTjtBQUFBLFlBQ0EsQ0FBQyxLQUFLLGNBQWMsSUFBSSxXQUFXO0FBQUEsWUFDbkM7QUFBQSxZQUNBLEtBQUs7QUFBQSxVQUNUO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBRUEsVUFBTSxZQUFxQixLQUFLLFlBQVksU0FBUyxDQUFDO0FBQ3RELGNBQVUsTUFBTTtBQUNoQixjQUFVLFlBQVksTUFBTTtBQUFBLEVBQ2hDO0FBQUEsRUFFUSxzQkFDSixVQUNBLGFBQ0EsV0FDQSxRQUNBLE1BQ1c7QUFDWCxVQUFNLFdBQTJCLFNBQVMsVUFBVSxZQUFZO0FBQ2hFLFVBQU0sZ0JBQWdDLFNBQVMsVUFBVSxrQkFBa0I7QUFDM0UsVUFBTSxhQUE2QixTQUFTLFVBQVUscUJBQXFCO0FBQzNFLFVBQU0saUJBQWlDLGNBQWM7QUFBQSxNQUNqRDtBQUFBLElBQ0o7QUFFQSxtQkFBZSxZQUFZO0FBQzNCLFFBQUksV0FBVztBQUNYLE1BQUMsZUFBZSxXQUFXLENBQUMsRUFBa0IsTUFBTSxZQUFZO0FBQUEsSUFDcEU7QUFFQSxrQkFBYyxVQUFVLDBCQUEwQixFQUFFLFFBQVEsV0FBVztBQUV2RSxRQUFJLFFBQVE7QUFDUixlQUFTLE1BQU0sVUFBVTtBQUFBLElBQzdCO0FBRUEsa0JBQWMsYUFBYSxNQUFNO0FBQzdCLGlCQUFXLFNBQVMsV0FBVyxZQUF1QztBQUNsRSxZQUFJLE1BQU0sTUFBTSxZQUFZLFdBQVcsTUFBTSxNQUFNLFlBQVksSUFBSTtBQUMvRCxnQkFBTSxNQUFNLFVBQVU7QUFDdEIsVUFBQyxlQUFlLFdBQVcsQ0FBQyxFQUFrQixNQUFNLFlBQ2hEO0FBQ0osZUFBSyxjQUFjLE9BQU8sV0FBVztBQUFBLFFBQ3pDLE9BQU87QUFDSCxnQkFBTSxNQUFNLFVBQVU7QUFDdEIsVUFBQyxlQUFlLFdBQVcsQ0FBQyxFQUFrQixNQUFNLFlBQVk7QUFDaEUsZUFBSyxjQUFjLElBQUksV0FBVztBQUFBLFFBQ3RDO0FBQUEsTUFDSjtBQUFBLElBQ0osQ0FBQztBQUVELFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFUSxvQkFDSixVQUNBLE1BQ0EsY0FDQSxRQUNBLE1BQ0EsUUFDSTtBQUNKLFVBQU0sWUFBeUIsU0FDMUIsdUJBQXVCLHFCQUFxQixFQUFFLENBQUMsRUFDL0MsVUFBVSxVQUFVO0FBQ3pCLFFBQUksUUFBUTtBQUNSLGdCQUFVLE1BQU0sVUFBVTtBQUFBLElBQzlCO0FBRUEsVUFBTSxlQUE0QixVQUFVLFVBQVUsZ0JBQWdCO0FBQ3RFLFFBQUksY0FBYztBQUNkLG1CQUFhLFNBQVMsV0FBVztBQUFBLElBQ3JDO0FBRUEsaUJBQWEsVUFBVSx3QkFBd0IsRUFBRSxRQUFRLEtBQUssUUFBUTtBQUN0RSxpQkFBYTtBQUFBLE1BQ1Q7QUFBQSxNQUNBLE9BQU8sVUFBc0I7QUFDekIsY0FBTSxlQUFlO0FBQ3JCLGVBQU8seUJBQXlCLEtBQUs7QUFDckMsY0FBTSxLQUFLLElBQUksVUFBVSxRQUFRLEVBQUUsU0FBUyxJQUFJO0FBQ2hELGVBQU87QUFBQSxNQUNYO0FBQUEsTUFDQTtBQUFBLElBQ0o7QUFFQSxpQkFBYTtBQUFBLE1BQ1Q7QUFBQSxNQUNBLENBQUMsVUFBc0I7QUFDbkIsY0FBTSxlQUFlO0FBQ3JCLGNBQU0sV0FBaUIsSUFBSSxzQkFBSztBQUNoQyxhQUFLLElBQUksVUFBVSxRQUFRLGFBQWEsVUFBVSxNQUFNLG1CQUFtQixJQUFJO0FBQy9FLGlCQUFTLGVBQWU7QUFBQSxVQUNwQixHQUFHLE1BQU07QUFBQSxVQUNULEdBQUcsTUFBTTtBQUFBLFFBQ2IsQ0FBQztBQUNELGVBQU87QUFBQSxNQUNYO0FBQUEsTUFDQTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUEsRUFFUSwyQkFBMkIsVUFBNkI7QUFDNUQsVUFBTSxpQkFBaUIsU0FBUyxLQUFLLG1DQUFtQztBQUN4RSxJQUFDLGVBQWUsV0FBVyxDQUFDLEVBQWtCLE1BQU0sWUFBWTtBQUFBLEVBQ3BFO0FBQ0o7OztBQ3BQQSxJQUFBQyxtQkFBOEM7QUFLdkMsSUFBTSxhQUFOLE1BQWlCO0FBQUEsRUFPcEIsWUFBWSxNQUFjO0FBTDFCLFNBQU8sV0FBb0IsQ0FBQztBQUM1QixTQUFPLGlCQUE4QixDQUFDO0FBRXRDLFNBQU8sZ0JBQWdCO0FBR25CLFNBQUssV0FBVztBQUNoQixTQUFLLGdCQUFnQixvQkFBSSxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFBQSxFQUM1RDtBQUFBLEVBRU8sVUFBVSxXQUF5QztBQUV0RCxTQUFLLFdBQVcsS0FBSyxTQUFTO0FBQUEsTUFDMUIsQ0FBQyxHQUFVLE9BQWMsVUFBVSxFQUFFLElBQUksS0FBSyxNQUFNLFVBQVUsRUFBRSxJQUFJLEtBQUs7QUFBQSxJQUM3RTtBQUdBLFNBQUssaUJBQWlCLEtBQUssZUFBZSxLQUFLLENBQUMsR0FBYyxNQUFpQjtBQUMzRSxZQUFNLFNBQVMsRUFBRSxVQUFVLEVBQUU7QUFDN0IsVUFBSSxVQUFVLEdBQUc7QUFDYixlQUFPO0FBQUEsTUFDWDtBQUNBLGNBQVEsVUFBVSxFQUFFLEtBQUssSUFBSSxLQUFLLE1BQU0sVUFBVSxFQUFFLEtBQUssSUFBSSxLQUFLO0FBQUEsSUFDdEUsQ0FBQztBQUFBLEVBQ0w7QUFDSjtBQUVPLElBQU0sMkJBQU4sY0FBdUMsbUNBQTBCO0FBQUEsRUFJcEUsWUFBWUMsTUFBVSxVQUFvQjtBQUN0QyxVQUFNQSxJQUFHO0FBSmIsU0FBTyxXQUFxQixDQUFDO0FBS3pCLFNBQUssV0FBVztBQUFBLEVBQ3BCO0FBQUEsRUFFQSxXQUFxQjtBQUNqQixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBRUEsWUFBWSxNQUFzQjtBQUM5QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsYUFBYSxTQUFpQixHQUFxQztBQUMvRCxTQUFLLE1BQU07QUFDWCxTQUFLLGVBQWUsT0FBTztBQUFBLEVBQy9CO0FBQ0o7OztBQ3ZEQSxJQUFBQyxtQkFBd0I7QUFFakIsU0FBUyxVQUFVO0FBQ3RCO0FBQUEsSUFDSTtBQUFBLElBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlKO0FBQ0o7OztBQ0pPLElBQU0sdUJBQU4sTUFBNEQ7QUFBQSxFQUMvRCxXQUFXLFlBQW9CLFlBQTRCO0FBQ3ZELFVBQU0sUUFBUSxhQUFhLGFBQWE7QUFDeEMsV0FBTyxLQUFLLE1BQU0sS0FBSyxPQUFPLElBQUksS0FBSyxJQUFJO0FBQUEsRUFDL0M7QUFDSjtBQUVPLElBQU0sNkJBQU4sTUFBa0U7QUFBQSxFQUtyRSxXQUFXLFlBQW9CLFlBQTRCO0FBQ3ZELFFBQUksY0FBYyxLQUFLLHNCQUFzQixjQUFjLEtBQUs7QUFDNUQsWUFBTSxnQkFBZ0IsVUFBVSxLQUFLLEtBQUssa0JBQWtCLGtCQUFrQixVQUFVLEtBQUssS0FBSyxrQkFBa0I7QUFDeEgsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFDSjtBQUVPLElBQU0sdUJBQU4sTUFBTSxzQkFBcUI7QUFBQSxFQUc5QixZQUFZLFVBQWlDO0FBQ3pDLFNBQUssV0FBVztBQUFBLEVBQ3BCO0FBQUEsRUFFQSxPQUFPLFNBQStCO0FBQ2xDLFdBQU8sSUFBSSxzQkFBcUIsMEJBQTBCO0FBQUEsRUFDOUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVdBLGdCQUFnQixTQUFtRDtBQUMvRCxVQUFNLFFBQWdCLHNCQUFxQixpQkFBaUIsT0FBTztBQUNuRSxRQUFJLE9BQU8sT0FBTyxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNoRSxZQUFNO0FBRVYsVUFBTSxJQUFZLEtBQUssU0FBUyxXQUFXLEdBQUcsUUFBUSxDQUFDO0FBQ3ZELFFBQUksSUFBWTtBQUNoQixlQUFXLE9BQU8sU0FBUztBQUN2QixZQUFNLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxRQUFRLEdBQUcsQ0FBVztBQUMzRCxVQUFJLElBQUksSUFBSSxPQUFPO0FBRWYsY0FBTSxRQUFnQixJQUFJO0FBQzFCLGVBQU8sQ0FBQyxPQUFPLEtBQUs7QUFBQSxNQUN4QjtBQUNBLFdBQUs7QUFBQSxJQUNUO0FBQ0EsVUFBTTtBQUFBLEVBQ1Y7QUFBQSxFQUVBLE9BQWUsaUJBQWlCLFNBQXlDO0FBQ3JFLFVBQU0sUUFDRixzQkFBc0IsT0FBTyxFQUN4QixJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssTUFBTSxLQUFLLEVBQ3pCLE9BQU8sQ0FBQyxHQUFHLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBSztBQUN2QyxXQUFPO0FBQUEsRUFDWDtBQUNKO0FBRU8sSUFBSSw2QkFBb0QsSUFBSSxxQkFBcUI7QUFDakYsSUFBTSw2QkFDVCxJQUFJLDJCQUEyQjs7O0FDckU1QixJQUFLLFlBQUwsa0JBQUtDLGVBQUw7QUFDSCxFQUFBQSxzQkFBQTtBQUNBLEVBQUFBLHNCQUFBO0FBQ0EsRUFBQUEsc0JBQUE7QUFDQSxFQUFBQSxzQkFBQTtBQUNBLEVBQUFBLHNCQUFBO0FBTFEsU0FBQUE7QUFBQSxHQUFBO0FBT0wsSUFBSyxZQUFMLGtCQUFLQyxlQUFMO0FBQ0gsRUFBQUEsc0JBQUE7QUFDQSxFQUFBQSxzQkFBQTtBQUZRLFNBQUFBO0FBQUEsR0FBQTtBQTZCWixJQUFNLHFCQUFOLE1BQU0sb0JBQW1CO0FBQUEsRUFRckIsSUFBSSxpQkFBMEI7QUFDMUIsV0FBTyxLQUFLLFdBQVc7QUFBQSxFQUMzQjtBQUFBLEVBRUEsSUFBSSxjQUFvQjtBQUNwQixRQUFJLFNBQWU7QUFDbkIsUUFBSSxLQUFLLFdBQVc7QUFBTSxlQUFTLEtBQUssS0FBSyxRQUFRLEtBQUssU0FBUyxLQUFLLFlBQVk7QUFDcEYsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLFlBQVksZUFBK0I7QUFDdkMsU0FBSyxnQkFBZ0I7QUFDckIsU0FBSyx3QkFBd0Isb0JBQW1CO0FBQUEsTUFDNUMsS0FBSztBQUFBLElBQ1Q7QUFDQSxTQUFLLHVCQUF1QixxQkFBcUIsT0FBTztBQUFBLEVBQzVEO0FBQUEsRUFFQSxRQUFRLE1BQWtCO0FBQ3RCLFNBQUssT0FBTztBQUNaLFNBQUssZ0JBQWdCLElBQUk7QUFBQSxFQUM3QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsbUJBQW1CLFdBQXlCO0FBQ3hDLFFBQUk7QUFDSixRQUFJLFFBQWdCO0FBQ3BCLFFBQUksYUFBYSxLQUFLLEtBQUssY0FBYyxRQUFRO0FBQzdDO0FBQ0EsY0FBUSxZQUFZLEtBQUssS0FBSyxjQUFjO0FBQUEsSUFDaEQ7QUFDQSxTQUFLLGdCQUFnQixjQUFjLEtBQUs7QUFBQSxFQUM1QztBQUFBLEVBRVEsZ0JBQWdCLGNBQTZCLFVBQWtCLE1BQVk7QUFDL0UsU0FBSyxlQUFlO0FBQ3BCLFNBQUssVUFBVTtBQUFBLEVBQ25CO0FBQUEsRUFFQSxXQUFvQjtBQUNoQixRQUFJLEtBQUssY0FBYyxhQUFhLG9DQUFzQztBQUN0RSxXQUFLLGVBQWU7QUFBQSxJQUN4QixPQUFPO0FBRUgsVUFBSSxLQUFLLGdCQUFnQixNQUFNO0FBQzNCLGFBQUssZ0JBQWdCLEtBQUsscUJBQXFCO0FBQUEsTUFDbkQ7QUFFQSxVQUFJLENBQUMsS0FBSywwQkFBMEIsR0FBRztBQUNuQyxZQUFJLEtBQUssZ0JBQWdCLEtBQUssdUJBQXVCO0FBRWpELGVBQUssZ0JBQWdCQyxNQUFLLGNBQWMsS0FBSyxZQUFZLENBQUM7QUFDMUQsY0FBSSxDQUFDLEtBQUssMEJBQTBCLEdBQUc7QUFDbkMsaUJBQUssZ0JBQWdCLElBQUk7QUFBQSxVQUM3QjtBQUFBLFFBQ0osT0FBTztBQUNILGVBQUssVUFBVTtBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFFQSxXQUFPLEtBQUssV0FBVztBQUFBLEVBQzNCO0FBQUEsRUFFUSxpQkFBdUI7QUFDM0IsVUFBTSxXQUFtQixLQUFLLEtBQUssY0FBYztBQUNqRCxVQUFNLFdBQW1CLEtBQUssS0FBSyxjQUFjO0FBQ2pELFFBQUksV0FBVyxXQUFXLEdBQUc7QUFJekIsWUFBTSxVQUFpRCxDQUFDO0FBQ3hELFVBQUksV0FBVztBQUFHLCtCQUE0QixJQUFJO0FBQ2xELFVBQUksV0FBVztBQUFHLCtCQUE0QixJQUFJO0FBQ2xELFlBQU0sQ0FBQyxjQUFjLEtBQUssSUFBSSxLQUFLLHFCQUFxQixnQkFBZ0IsT0FBTztBQUMvRSxXQUFLLGdCQUFnQixjQUFjLEtBQUs7QUFBQSxJQUM1QyxPQUFPO0FBQ0gsV0FBSyxnQkFBZ0IsSUFBSTtBQUFBLElBQzdCO0FBQUEsRUFDSjtBQUFBLEVBRVEsNEJBQXFDO0FBQ3pDLFVBQU0sV0FBbUIsS0FBSyxLQUFLLHVCQUF1QixLQUFLLFlBQVk7QUFFM0UsVUFBTSxTQUFrQixTQUFTLFNBQVM7QUFDMUMsUUFBSSxRQUFRO0FBQ1IsY0FBUSxLQUFLLGNBQWMsV0FBVztBQUFBLFFBQ2xDLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFHRCxlQUFLLFVBQVU7QUFDZjtBQUFBLFFBRUosS0FBSztBQUFBLFFBQ0wsS0FBSztBQUNELGVBQUssVUFBVSwyQkFBMkIsV0FBVyxHQUFHLFNBQVMsU0FBUyxDQUFDO0FBQzNFO0FBQUEsTUFDUjtBQUFBLElBQ0o7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsd0JBQThCO0FBQzFCLFNBQUssa0JBQWtCO0FBQ3ZCLFVBQU0sSUFBYyxLQUFLLFlBQVk7QUFHckMsU0FBSyx1QkFBdUIsa0JBQXVCO0FBQ25ELFNBQUssdUJBQXVCLGtCQUF1QjtBQUVuRCxTQUFLLGlCQUFpQjtBQUFBLEVBQzFCO0FBQUEsRUFFUSx1QkFBdUIsR0FBYSxjQUFrQztBQUMxRSxVQUFNLFFBQWdCLEtBQUssS0FBSyx1QkFBdUIsWUFBWTtBQUNuRSxhQUFTLElBQUksTUFBTSxTQUFTLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDeEMsVUFBSSxPQUFPLEdBQUcsR0FBRyxNQUFNLENBQUMsRUFBRSxRQUFRO0FBQUcsYUFBSyxLQUFLLGtCQUFrQixHQUFHLFlBQVk7QUFBQSxJQUNwRjtBQUFBLEVBQ0o7QUFBQSxFQUVBLG9CQUEwQjtBQUN0QixTQUFLLGtCQUFrQjtBQUN2QixTQUFLLEtBQUssa0JBQWtCLEtBQUssU0FBUyxLQUFLLFlBQVk7QUFDM0QsU0FBSyxpQkFBaUI7QUFBQSxFQUMxQjtBQUFBLEVBRUEsNkJBQW1DO0FBQy9CLFNBQUssa0JBQWtCO0FBQ3ZCLFVBQU0sV0FBbUIsS0FBSyxLQUFLLHVCQUF1QixLQUFLLFlBQVk7QUFDM0UsUUFBSSxTQUFTLFVBQVU7QUFBRztBQUMxQixVQUFNLE9BQU8sS0FBSztBQUNsQixTQUFLLEtBQUssa0JBQWtCLEtBQUssU0FBUyxLQUFLLFlBQVk7QUFDM0QsU0FBSyxLQUFLLFdBQVcsVUFBVSxXQUFXLElBQUk7QUFDOUMsU0FBSyxpQkFBaUI7QUFBQSxFQUMxQjtBQUFBLEVBRVEsbUJBQW1CO0FBQ3ZCLFNBQUssVUFBVTtBQUFBLEVBQ25CO0FBQUEsRUFFUSxvQkFBb0I7QUFDeEIsUUFBSSxLQUFLLFdBQVcsUUFBUSxLQUFLLGdCQUFnQjtBQUFNLFlBQU07QUFBQSxFQUNqRTtBQUFBLEVBRUEsT0FBZSwyQkFBMkIsZUFBb0Q7QUFDMUYsUUFBSSxTQUF1QjtBQUMzQixZQUFRLGNBQWMsV0FBVztBQUFBLE1BQzdCLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDRDtBQUNBO0FBQUEsTUFFSixLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQ0Q7QUFDQTtBQUFBLElBQ1I7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNKO0FBRU8sSUFBTSxtQkFBTixNQUFNLGtCQUE4QztBQUFBLEVBU3ZELElBQUksaUJBQTBCO0FBQzFCLFdBQU8sS0FBSyxXQUFXLFFBQVEsS0FBSyxtQkFBbUI7QUFBQSxFQUMzRDtBQUFBLEVBRUEsSUFBSSxjQUFvQjtBQUNwQixRQUFJLEtBQUssV0FBVztBQUFNLGFBQU87QUFDakMsV0FBTyxLQUFLLFVBQVUsS0FBSyxPQUFPO0FBQUEsRUFDdEM7QUFBQSxFQUVBLElBQUksY0FBb0I7QUFDcEIsUUFBSSxTQUFlO0FBQ25CLFFBQUksS0FBSyxXQUFXLFFBQVEsS0FBSyxtQkFBbUI7QUFDaEQsZUFBUyxLQUFLLG1CQUFtQjtBQUNyQyxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsWUFBWSxlQUErQixZQUFnQztBQUN2RSxTQUFLLHFCQUFxQixJQUFJLG1CQUFtQixhQUFhO0FBQzlELFNBQUssZ0JBQWdCO0FBQ3JCLFNBQUssYUFBYTtBQUNsQixTQUFLLHVCQUF1QixxQkFBcUIsT0FBTztBQUFBLEVBQzVEO0FBQUEsRUFFQSxRQUFRLE1BQWtCO0FBRXRCLFFBQUksS0FBSyxjQUFjO0FBQW1DLGFBQU8sS0FBSyxNQUFNO0FBRTVFLFNBQUssWUFBWSxrQkFBaUIsd0JBQXdCLEtBQUssWUFBWSxDQUFDO0FBQzVFLFNBQUssV0FBVyxJQUFJO0FBQUEsRUFDeEI7QUFBQSxFQUVBLE9BQWUsd0JBQXdCLGFBQTZCO0FBQ2hFLFVBQU0sU0FBaUIsQ0FBQztBQUN4QixhQUFTLE1BQU0sR0FBRyxNQUFNLFlBQVksUUFBUSxPQUFPO0FBQy9DLFlBQU0sT0FBYSxZQUFZLEdBQUc7QUFDbEMsWUFBTSxjQUFjLEtBQUssMEJBQStCLEtBQUssSUFBSTtBQUNqRSxVQUFJLGFBQWE7QUFDYixlQUFPLEtBQUssSUFBSTtBQUFBLE1BQ3BCO0FBQUEsSUFDSjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFUSxXQUFXLFNBQXdCO0FBQ3ZDLFNBQUssVUFBVTtBQUNmLFFBQUksV0FBVztBQUFNLFdBQUssbUJBQW1CLFFBQVEsS0FBSyxVQUFVLE9BQU8sQ0FBQztBQUFBLEVBQ2hGO0FBQUEsRUFFQSxXQUFvQjtBQUNoQixRQUFJLFNBQWtCO0FBR3RCLFFBQUksS0FBSyxnQkFBZ0I7QUFDckIsV0FBSyxtQkFBbUIsa0JBQWtCO0FBQUEsSUFDOUM7QUFFQSxRQUFJLEtBQUssY0FBYyxhQUFhLG9DQUFzQztBQUN0RSxlQUFTLEtBQUssNkJBQTZCO0FBQUEsSUFDL0MsT0FBTztBQUdILFVBQUksS0FBSyxXQUFXLE1BQU07QUFDdEIsYUFBSyxlQUFlLElBQUk7QUFBQSxNQUM1QjtBQUNBLGFBQU8sS0FBSyxVQUFVLEtBQUssVUFBVSxRQUFRO0FBQ3pDLFlBQUksS0FBSyxtQkFBbUIsU0FBUyxHQUFHO0FBQ3BDLG1CQUFTO0FBQ1Q7QUFBQSxRQUNKO0FBQ0EsYUFBSyxlQUFlLEtBQUs7QUFBQSxNQUM3QjtBQUFBLElBQ0o7QUFDQSxRQUFJLENBQUM7QUFBUSxXQUFLLFVBQVU7QUFDNUIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVRLGVBQWUsV0FBMEI7QUFDN0MsWUFBUSxLQUFLLGNBQWMsV0FBVztBQUFBLE1BQ2xDLEtBQUs7QUFDRCxhQUFLLFVBQVUsWUFBWSxJQUFJLEtBQUssVUFBVTtBQUM5QztBQUFBLE1BRUosS0FBSyxpQ0FBbUM7QUFFcEMsY0FBTSxVQUFrQyxDQUFDO0FBQ3pDLFlBQUksVUFBbUI7QUFDdkIsaUJBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxVQUFVLFFBQVEsS0FBSztBQUM1QyxjQUFJLEtBQUssVUFBVSxDQUFDLEVBQUUsMEJBQStCLEtBQUssR0FBRztBQUN6RCxvQkFBUSxDQUFDLElBQUk7QUFDYixzQkFBVTtBQUFBLFVBQ2Q7QUFBQSxRQUNKO0FBQ0EsWUFBSSxTQUFTO0FBQ1QsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLHFCQUFxQixnQkFBZ0IsT0FBTztBQUN0RSxlQUFLLFVBQVU7QUFBQSxRQUNuQixPQUFPO0FBRUgsZUFBSyxVQUFVLEtBQUssVUFBVTtBQUFBLFFBQ2xDO0FBQ0E7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUNBLFFBQUksS0FBSyxVQUFVLEtBQUssVUFBVSxRQUFRO0FBQ3RDLFdBQUssbUJBQW1CLFFBQVEsS0FBSyxVQUFVLEtBQUssT0FBTyxDQUFDO0FBQUEsSUFDaEU7QUFBQSxFQUNKO0FBQUEsRUFFUSwrQkFBd0M7QUFFNUMsVUFBTSxVQUFrQyxDQUFDO0FBQ3pDLGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxVQUFVLFFBQVEsS0FBSztBQUM1QyxZQUFNLFlBQW9CLEtBQUssVUFBVSxDQUFDLEVBQUUsMEJBQStCLEtBQUs7QUFDaEYsVUFBSSxXQUFXO0FBQ1gsZ0JBQVEsQ0FBQyxJQUFJO0FBQUEsTUFDakI7QUFBQSxJQUNKO0FBQ0EsUUFBSSxPQUFPLEtBQUssT0FBTyxFQUFFLFVBQVU7QUFBRyxhQUFPO0FBRTdDLFVBQU0sQ0FBQyxTQUFTLE9BQU8sSUFBSSxLQUFLLHFCQUFxQixnQkFBZ0IsT0FBTztBQUM1RSxTQUFLLFdBQVcsT0FBTztBQUN2QixTQUFLLG1CQUFtQixtQkFBbUIsT0FBTztBQUNsRCxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsd0JBQWlDO0FBQzdCLFNBQUssbUJBQW1CLHNCQUFzQjtBQUM5QyxXQUFPLEtBQUssU0FBUztBQUFBLEVBQ3pCO0FBQUEsRUFFQSxvQkFBNkI7QUFDekIsU0FBSyxtQkFBbUIsa0JBQWtCO0FBQzFDLFdBQU8sS0FBSyxTQUFTO0FBQUEsRUFDekI7QUFBQSxFQUVBLDZCQUFtQztBQUMvQixTQUFLLG1CQUFtQiwyQkFBMkI7QUFBQSxFQUN2RDtBQUFBLEVBRVEsMkJBQWlDO0FBQ3JDLFFBQUksS0FBSyxZQUFZLDBCQUErQixLQUFLLEtBQUssR0FBRztBQUM3RCxXQUFLLFVBQVUsT0FBTyxLQUFLLFNBQVMsQ0FBQztBQUdyQyxVQUFJLEtBQUssVUFBVSxLQUFLLFVBQVU7QUFBUSxhQUFLLFdBQVcsS0FBSyxPQUFPO0FBQUEsSUFDMUU7QUFBQSxFQUNKO0FBQ0o7OztBQzVXTyxJQUFNLE9BQU4sTUFBVztBQUFBLEVBSWQsSUFBSSxhQUFzQjtBQUN0QixXQUFPLEtBQUssYUFBYSxLQUFLLENBQUMsYUFBYSxTQUFTLFVBQVU7QUFBQSxFQUNuRTtBQUFBLEVBRUEsSUFBSSxXQUFtQjtBQUNuQixXQUFPLEtBQUssS0FBSztBQUFBLEVBQ3JCO0FBQUEsRUFFQSxZQUFZLE1BQWUsY0FBMEI7QUFDakQsU0FBSyxPQUFPO0FBQ1osU0FBSyxlQUFlO0FBQ3BCLGlCQUFhLFFBQVEsQ0FBQyxhQUFjLFNBQVMsT0FBTyxJQUFLO0FBQUEsRUFDN0Q7QUFBQSxFQUVBLGtCQUFrQixNQUFrQjtBQUNoQyxlQUFXLFlBQVksS0FBSyxjQUFjO0FBQ3RDLGlCQUFXLFFBQVEsU0FBUyxPQUFPO0FBQy9CLGFBQUssV0FBVyxTQUFTLFdBQVcsSUFBSTtBQUFBLE1BQzVDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUVBLGtCQUFrQixPQUFlLElBQUk7QUEvQnpDO0FBZ0NRLFFBQUksTUFBYyxTQUFTLElBQUksS0FBSyxLQUFLLGFBQWEsTUFBTTtBQUFBO0FBQzVELGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxhQUFhLFFBQVEsS0FBSztBQUMvQyxZQUFNLElBQWMsS0FBSyxhQUFhLENBQUM7QUFDdkMsYUFBTyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksS0FBSyxFQUFFLE1BQU0sTUFBSyxPQUFFLGNBQUYsbUJBQWEsSUFBSSxLQUFLLEVBQUUsYUFBYSxRQUFRO0FBQUE7QUFBQSxJQUNuRztBQUNBLFlBQVEsTUFBTSxHQUFHO0FBQUEsRUFDckI7QUFBQSxFQUVBLE1BQU0sY0FBYyxVQUFxQztBQUNyRCxRQUFJLFdBQW1CLE1BQU0sS0FBSyxLQUFLLEtBQUs7QUFDNUMsZUFBVyxZQUFZLEtBQUssY0FBYztBQUN0QyxVQUFJLFNBQVMsWUFBWTtBQUNyQixtQkFBVyxTQUFTLG1CQUFtQixVQUFVLFFBQVE7QUFBQSxNQUM3RDtBQUFBLElBQ0o7QUFDQSxVQUFNLEtBQUssS0FBSyxNQUFNLFFBQVE7QUFDOUIsU0FBSyxhQUFhLFFBQVEsQ0FBQyxhQUFjLFNBQVMsYUFBYSxLQUFNO0FBQUEsRUFDekU7QUFDSjs7O0FDOUNPLElBQU0sT0FBTixNQUFXO0FBQUE7QUFBQSxFQUtkLElBQUksY0FBdUI7QUFDdkIsV0FBTyxLQUFLLGdCQUFnQjtBQUFBLEVBQ2hDO0FBQUEsRUFPQSxZQUFZLE1BQXNCO0FBQzlCLFdBQU8sT0FBTyxNQUFNLElBQUk7QUFBQSxFQUM1QjtBQUFBLEVBRUEsSUFBSSxlQUE2QjtBQUM3QixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBRUEsSUFBSSxRQUFpQjtBQUNqQixXQUFPLENBQUMsS0FBSztBQUFBLEVBQ2pCO0FBQUEsRUFFQSxJQUFJLFFBQWlCO0FBQ2pCLFdBQU8sS0FBSyxlQUFlLEtBQUssYUFBYSxNQUFNO0FBQUEsRUFDdkQ7QUFBQSxFQUVBLGlCQUF5QjtBQUNyQixRQUFJLFNBQWlCO0FBQ3JCLFFBQUksS0FBSztBQUFhLGVBQVMsS0FBSyxhQUFhLGVBQWU7QUFBQTtBQUMzRCxlQUFTO0FBQ2QsV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDNUJPLFNBQVNDLE9BQ1osTUFDQSx5QkFDQSxpQ0FDQSx3QkFDQSxnQ0FDQSwyQkFDQSx5QkFDQSw4QkFDNEI7QUFDNUIsTUFBSSxXQUFXO0FBQ2YsUUFBTSxRQUFzQyxDQUFDO0FBQzdDLE1BQUksV0FBNEI7QUFDaEMsTUFBSSxTQUFTO0FBRWIsUUFBTSxRQUFrQixLQUFLLFdBQVcsUUFBUSxJQUFJLEVBQUUsTUFBTSxJQUFJO0FBQ2hFLFdBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkMsVUFBTSxjQUFjLE1BQU0sQ0FBQztBQUMzQixRQUFJLFlBQVksV0FBVyxHQUFHO0FBQzFCLFVBQUksVUFBVTtBQUNWLGNBQU0sS0FBSyxDQUFDLFVBQVUsVUFBVSxNQUFNLENBQUM7QUFDdkMsbUJBQVc7QUFBQSxNQUNmO0FBRUEsaUJBQVc7QUFDWDtBQUFBLElBQ0osV0FBVyxZQUFZLFdBQVcsTUFBTSxLQUFLLENBQUMsWUFBWSxXQUFXLFNBQVMsR0FBRztBQUM3RSxhQUFPLElBQUksSUFBSSxNQUFNLFVBQVUsQ0FBQyxZQUFZLFNBQVMsS0FBSztBQUFHO0FBQzdEO0FBQ0E7QUFBQSxJQUNKO0FBRUEsUUFBSSxTQUFTLFNBQVMsR0FBRztBQUNyQixrQkFBWTtBQUFBLElBQ2hCO0FBQ0EsZ0JBQVksWUFBWSxRQUFRO0FBRWhDLFFBQ0ksWUFBWSxTQUFTLCtCQUErQixLQUNwRCxZQUFZLFNBQVMsdUJBQXVCLEdBQzlDO0FBQ0UsaUJBQVcsTUFBTSxDQUFDLEVBQUUsU0FBUywrQkFBK0I7QUFHNUQsaUJBQVcsTUFBTSxDQUFDO0FBQ2xCLGVBQVM7QUFDVCxVQUFJLElBQUksSUFBSSxNQUFNLFVBQVUsTUFBTSxJQUFJLENBQUMsRUFBRSxXQUFXLFNBQVMsR0FBRztBQUM1RCxvQkFBWSxPQUFPLE1BQU0sSUFBSSxDQUFDO0FBQzlCO0FBQUEsTUFDSjtBQUNBLFlBQU0sS0FBSyxDQUFDLFVBQVUsVUFBVSxNQUFNLENBQUM7QUFDdkMsaUJBQVc7QUFDWCxpQkFBVztBQUFBLElBQ2YsV0FDSSxhQUFhLFNBQ1gsNkJBQTZCLFlBQVksS0FBSyxXQUFXLEtBQ3RELDJCQUEyQixnQkFBZ0IsS0FBSyxXQUFXLEtBQzNELGdDQUFnQyxZQUFZLEtBQUssV0FBVyxJQUNuRTtBQUNFO0FBQ0EsZUFBUztBQUFBLElBQ2IsV0FBVyxZQUFZLEtBQUssTUFBTSx3QkFBd0I7QUFDdEQ7QUFDQSxlQUFTO0FBQUEsSUFDYixXQUFXLFlBQVksS0FBSyxNQUFNLGdDQUFnQztBQUM5RDtBQUNBLGVBQVM7QUFBQSxJQUNiLFdBQVcsWUFBWSxXQUFXLEtBQUssS0FBSyxZQUFZLFdBQVcsS0FBSyxHQUFHO0FBQ3ZFLFlBQU0saUJBQWlCLFlBQVksTUFBTSxPQUFPLEVBQUUsQ0FBQztBQUNuRCxhQUFPLElBQUksSUFBSSxNQUFNLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLFdBQVcsY0FBYyxHQUFHO0FBQ3JFO0FBQ0Esb0JBQVksT0FBTyxNQUFNLENBQUM7QUFBQSxNQUM5QjtBQUNBLGtCQUFZLE9BQU87QUFDbkI7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUVBLE1BQUksWUFBWSxVQUFVO0FBQ3RCLFVBQU0sS0FBSyxDQUFDLFVBQVUsVUFBVSxNQUFNLENBQUM7QUFBQSxFQUMzQztBQUVBLFNBQU87QUFDWDs7O0FDNUZPLElBQU0sZ0JBQU4sTUFBb0I7QUFBQTtBQUFBLEVBS3ZCLFlBQVksT0FBZSxNQUFjO0FBQ3JDLFNBQUssUUFBUTtBQUNiLFNBQUssT0FBTztBQUFBLEVBQ2hCO0FBQ0o7QUFFTyxJQUFNLG9CQUFOLE1BQXdCO0FBQUEsRUFDM0IsT0FBTyxPQUNILGNBQ0EsY0FDQSxVQUNlO0FBQ2YsVUFBTSxVQUFnQyxvQkFBb0IsT0FBTyxZQUFZO0FBQzdFLFdBQU8sUUFBUSxPQUFPLGNBQWMsUUFBUTtBQUFBLEVBQ2hEO0FBQ0o7QUFNQSxJQUFNLCtCQUFOLE1BQW1FO0FBQUEsRUFDL0QsT0FBTyxjQUFzQixVQUF1QztBQUNoRSxVQUFNLE1BQWMsYUFBYSxRQUFRLFNBQVMsdUJBQXVCO0FBQ3pFLFVBQU0sT0FBc0IsSUFBSTtBQUFBLE1BQzVCLGFBQWEsVUFBVSxHQUFHLEdBQUc7QUFBQSxNQUM3QixhQUFhLFVBQVUsTUFBTSxTQUFTLHdCQUF3QixNQUFNO0FBQUEsSUFDeEU7QUFDQSxVQUFNLFNBQTBCLENBQUMsSUFBSTtBQUNyQyxXQUFPO0FBQUEsRUFDWDtBQUNKO0FBRUEsSUFBTSxrQ0FBTixNQUFzRTtBQUFBLEVBQ2xFLE9BQU8sY0FBc0IsVUFBdUM7QUFDaEUsVUFBTSxNQUFjLGFBQWEsUUFBUSxTQUFTLCtCQUErQjtBQUNqRixVQUFNLFFBQWdCLGFBQWEsVUFBVSxHQUFHLEdBQUcsR0FDL0MsUUFBZ0IsYUFBYTtBQUFBLE1BQ3pCLE1BQU0sU0FBUyxnQ0FBZ0M7QUFBQSxJQUNuRDtBQUNKLFVBQU0sU0FBMEI7QUFBQSxNQUM1QixJQUFJLGNBQWMsT0FBTyxLQUFLO0FBQUEsTUFDOUIsSUFBSSxjQUFjLE9BQU8sS0FBSztBQUFBLElBQ2xDO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQUVBLElBQU0sOEJBQU4sTUFBa0U7QUFBQSxFQUM5RCxPQUFPLGNBQXNCLFVBQXVDO0FBQ2hFLFVBQU0sTUFBTSxhQUFhLFFBQVEsT0FBTyxTQUFTLHlCQUF5QixJQUFJO0FBQzlFLFVBQU0sT0FBc0IsSUFBSTtBQUFBLE1BQzVCLGFBQWEsVUFBVSxHQUFHLEdBQUc7QUFBQSxNQUM3QixhQUFhLFVBQVUsTUFBTSxJQUFJLFNBQVMsdUJBQXVCLE1BQU07QUFBQSxJQUMzRTtBQUNBLFVBQU0sU0FBMEIsQ0FBQyxJQUFJO0FBQ3JDLFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFFQSxJQUFNLGlDQUFOLE1BQXFFO0FBQUEsRUFDakUsT0FBTyxjQUFzQixVQUF1QztBQUNoRSxVQUFNLE1BQU0sYUFBYSxRQUFRLE9BQU8sU0FBUyxpQ0FBaUMsSUFBSTtBQUN0RixVQUFNLFFBQWdCLGFBQWEsVUFBVSxHQUFHLEdBQUcsR0FDL0MsUUFBZ0IsYUFBYTtBQUFBLE1BQ3pCLE1BQU0sSUFBSSxTQUFTLCtCQUErQjtBQUFBLElBQ3REO0FBRUosVUFBTSxTQUEwQjtBQUFBLE1BQzVCLElBQUksY0FBYyxPQUFPLEtBQUs7QUFBQSxNQUM5QixJQUFJLGNBQWMsT0FBTyxLQUFLO0FBQUEsSUFDbEM7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNKO0FBRUEsSUFBTSxxQkFBTixNQUF5RDtBQUFBLEVBQ3JELE9BQU8sY0FBc0IsVUFBdUM7QUFDaEUsVUFBTSxXQUErQixDQUFDO0FBQ3RDLFFBQUksU0FBUywyQkFBMkI7QUFDcEMsZUFBUyxLQUFLLEdBQUcsYUFBYSxTQUFTLGFBQWEsQ0FBQztBQUFBLElBQ3pEO0FBQ0EsUUFBSSxTQUFTLHlCQUF5QjtBQUNsQyxlQUFTLEtBQUssR0FBRyxhQUFhLFNBQVMsaUJBQWlCLENBQUM7QUFBQSxJQUM3RDtBQUNBLFFBQUksU0FBUyw4QkFBOEI7QUFDdkMsZUFBUyxLQUFLLEdBQUcsYUFBYSxTQUFTLGFBQWEsQ0FBQztBQUFBLElBQ3pEO0FBQ0EsYUFBUyxLQUFLLENBQUMsR0FBRyxNQUFNO0FBQ3BCLFVBQUksRUFBRSxRQUFRLEVBQUUsT0FBTztBQUNuQixlQUFPO0FBQUEsTUFDWDtBQUNBLFVBQUksRUFBRSxRQUFRLEVBQUUsT0FBTztBQUNuQixlQUFPO0FBQUEsTUFDWDtBQUVBLGFBQU87QUFBQSxJQUNYLENBQUM7QUFFRCxRQUFJLE9BQWU7QUFDbkIsVUFBTSxTQUEwQixDQUFDO0FBQ2pDLGVBQVcsS0FBSyxVQUFVO0FBQ3RCLFlBQU0sZ0JBQXdCLEVBQUUsT0FDNUIsY0FBc0IsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFO0FBQy9DLGNBQ0ksYUFBYSxVQUFVLEdBQUcsYUFBYSxJQUN2Qyx1QkFBdUIsaUJBQWlCLElBQ3hDLGFBQWEsVUFBVSxXQUFXO0FBQ3RDLGNBQVEsdUJBQXVCLGtCQUFrQixPQUFPLFFBQVE7QUFDaEUsYUFDSSxhQUFhLFVBQVUsR0FBRyxhQUFhLElBQ3ZDLHVCQUF1QjtBQUFBLFFBQ25CLGFBQWEsVUFBVSxlQUFlLFdBQVc7QUFBQSxNQUNyRCxJQUNBLGFBQWEsVUFBVSxXQUFXO0FBQ3RDLGFBQU8sdUJBQXVCLGtCQUFrQixNQUFNLFFBQVE7QUFDOUQsYUFBTyxLQUFLLElBQUksY0FBYyxPQUFPLElBQUksQ0FBQztBQUFBLElBQzlDO0FBRUEsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQUVPLElBQU0seUJBQU4sTUFBNkI7QUFBQSxFQUNoQyxPQUFPLG1CQUEyQjtBQUM5QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsT0FBTyxnQkFBZ0IsS0FBcUI7QUFDeEMsV0FBTyxpQ0FBaUMsTUFBTTtBQUFBLEVBQ2xEO0FBQUEsRUFFQSxPQUFPLGtCQUFrQixNQUFjLFVBQThCO0FBQ2pFLFFBQUksU0FBaUI7QUFDckIsUUFBSSxTQUFTO0FBQTJCLGVBQVMsT0FBTyxRQUFRLFFBQVEsRUFBRTtBQUMxRSxRQUFJLFNBQVM7QUFBeUIsZUFBUyxPQUFPLFFBQVEsVUFBVSxFQUFFO0FBQzFFLFFBQUksU0FBUyw4QkFBOEI7QUFDdkMsZUFBUyxPQUFPLFFBQVEsUUFBUSxFQUFFLEVBQUUsUUFBUSxRQUFRLEVBQUU7QUFBQSxJQUMxRDtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFFTyxJQUFNLHNCQUFOLE1BQTBCO0FBQUEsRUFDN0IsT0FBTyxPQUFPLGNBQThDO0FBQ3hELFFBQUk7QUFDSixZQUFRLGNBQWM7QUFBQSxNQUNsQjtBQUNJLGtCQUFVLElBQUksNkJBQTZCO0FBQzNDO0FBQUEsTUFDSjtBQUNJLGtCQUFVLElBQUksZ0NBQWdDO0FBQzlDO0FBQUEsTUFDSjtBQUNJLGtCQUFVLElBQUksNEJBQTRCO0FBQzFDO0FBQUEsTUFDSjtBQUNJLGtCQUFVLElBQUksK0JBQStCO0FBQzdDO0FBQUEsTUFDSjtBQUNJLGtCQUFVLElBQUksbUJBQW1CO0FBQ2pDO0FBQUEsSUFDUjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQ3BLTyxJQUFNLHFCQUFOLE1BQXlCO0FBQUEsRUFLNUIsWUFBWSxVQUFvQixVQUFrQixRQUFnQjtBQUM5RCxTQUFLLFdBQVc7QUFDaEIsU0FBSyxXQUFXO0FBQ2hCLFNBQUssU0FBUztBQUFBLEVBQ2xCO0FBQ0o7QUFFTyxJQUFNLHFCQUFOLE1BQXlCO0FBQUEsRUFNNUIsWUFBWSxVQUFzQjtBQUM5QixTQUFLLFdBQVc7QUFBQSxFQUNwQjtBQUFBLEVBRUEsTUFBTSxtQkFBbUIsVUFBbUIsaUJBQWlEO0FBQ3pGLFNBQUssV0FBVztBQUNoQixVQUFNLFdBQW1CLE1BQU0sU0FBUyxLQUFLO0FBQzdDLFFBQUk7QUFDSixRQUFJLEtBQUssU0FBUyx1QkFBdUI7QUFDckMsc0JBQWdCO0FBQUEsSUFDcEIsT0FBTztBQUNILFlBQU0sVUFBb0IsU0FBUyxXQUFXO0FBQzlDLHNCQUFnQixLQUFLLDJCQUEyQixPQUFPO0FBQUEsSUFDM0Q7QUFDQSxVQUFNLFNBQXFCLEtBQUsscUJBQXFCLFVBQVUsYUFBYTtBQUM1RSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRVEscUJBQXFCLFVBQWtCLGVBQXNDO0FBQ2pGLFNBQUssV0FBVztBQUNoQixTQUFLLGdCQUFnQjtBQUVyQixVQUFNLFNBQXFCLENBQUM7QUFDNUIsVUFBTSx5QkFBdUQsS0FBSyxlQUFlO0FBQ2pGLGVBQVdDLE1BQUssd0JBQXdCO0FBQ3BDLFlBQU0scUJBQXlDLElBQUksbUJBQW1CQSxHQUFFLENBQUMsR0FBR0EsR0FBRSxDQUFDLEdBQUdBLEdBQUUsQ0FBQyxDQUFDO0FBQ3RGLFlBQU0sV0FBcUIsS0FBSyxxQkFBcUIsa0JBQWtCO0FBR3ZFLFlBQU0sb0JBQXFDLGtCQUFrQjtBQUFBLFFBQ3pELFNBQVM7QUFBQSxRQUNULFNBQVMsYUFBYTtBQUFBLFFBQ3RCLEtBQUs7QUFBQSxNQUNUO0FBR0EsVUFBSSx1QkFDQSx1QkFBdUIsMkJBQTJCLFNBQVMsYUFBYSxRQUFRO0FBR3BGLFlBQU0sZ0JBQWdCLGtCQUFrQjtBQUN4QyxVQUFJLHFCQUFxQixTQUFTLGVBQWU7QUFDN0MsaUJBQVMsYUFBYTtBQUN0QiwrQkFBdUIscUJBQXFCLE1BQU0sR0FBRyxhQUFhO0FBQUEsTUFDdEU7QUFHQSxZQUFNLFdBQW1CLEtBQUssZUFBZSxtQkFBbUIsb0JBQW9CO0FBQ3BGLGVBQVMsWUFBWSxRQUFRO0FBQzdCLGFBQU8sS0FBSyxRQUFRO0FBQUEsSUFDeEI7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRVEsaUJBQStDO0FBQ25ELFVBQU0sV0FBdUIsS0FBSztBQUNsQyxVQUFNLFNBQXVDQztBQUFBLE1BQ3pDLEtBQUs7QUFBQSxNQUNMLFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxJQUNiO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVRLHFCQUFxQixvQkFBa0Q7QUFDM0UsVUFBTSxFQUFFLFVBQVUsVUFBVSxPQUFPLElBQUk7QUFFdkMsVUFBTSxrQkFBNEIsS0FBSyxTQUFTLG1CQUFtQixNQUFNO0FBQ3pFLFVBQU0sU0FBUyxTQUFTO0FBQUEsTUFDcEIsS0FBSztBQUFBLE1BQ0w7QUFBQSxNQUNBLEtBQUs7QUFBQSxNQUNMO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNKO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVRLGVBQ0osbUJBQ0Esc0JBQ007QUFDTixVQUFNLFdBQW1CLENBQUM7QUFHMUIsYUFBUyxJQUFJLEdBQUcsSUFBSSxrQkFBa0IsUUFBUSxLQUFLO0FBQy9DLFlBQU0sRUFBRSxPQUFPLEtBQUssSUFBSSxrQkFBa0IsQ0FBQztBQUUzQyxZQUFNLGtCQUEyQixJQUFJLHFCQUFxQjtBQUMxRCxZQUFNQyxZQUE2QixxQkFBcUIsQ0FBQztBQUV6RCxZQUFNLFVBQWdCLElBQUksS0FBSztBQUFBLFFBQzNCO0FBQUEsUUFDQTtBQUFBLFFBQ0EsU0FBUztBQUFBLE1BQ2IsQ0FBQztBQUNELGNBQVEsZUFDSixtQkFBbUIsQ0FBQ0EsVUFBUywwQkFBMEIsSUFBSUEsWUFBVztBQUUxRSxlQUFTLEtBQUssT0FBTztBQUFBLElBQ3pCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVRLDJCQUEyQixTQUE4QjtBQUM3RCxRQUFJLFNBQW9CLFVBQVU7QUFDbEM7QUFBTyxpQkFBVyxlQUFlLEtBQUssU0FBUyxlQUFlO0FBQzFELG1CQUFXLE9BQU8sU0FBUztBQUN2QixjQUFJLFFBQVEsZUFBZSxJQUFJLFdBQVcsY0FBYyxHQUFHLEdBQUc7QUFDMUQscUJBQVMsVUFBVSxvQkFBb0IsR0FBRztBQUMxQyxrQkFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQzlJTyxJQUFNLGlCQUFOLE1BQXFCO0FBQUEsRUFPeEIsWUFBWSxVQUFzQjtBQUM5QixTQUFLLFdBQVc7QUFBQSxFQUNwQjtBQUFBLEVBRUEsTUFBTSxLQUFLLFVBQW1CLGVBQXlDO0FBQ25FLFNBQUssV0FBVztBQUVoQixVQUFNLGlCQUFxQyxJQUFJLG1CQUFtQixLQUFLLFFBQVE7QUFFL0UsVUFBTSxlQUEyQixNQUFNLGVBQWU7QUFBQSxNQUNsRDtBQUFBLE1BQ0E7QUFBQSxJQUNKO0FBRUEsVUFBTSxTQUFlLElBQUksS0FBSyxVQUFVLFlBQVk7QUFDcEQsV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDL0JBLElBQUFDLG9CQU1PO0FBWUEsSUFBTSxVQUFOLE1BQWlDO0FBQUEsRUFLcEMsWUFBWSxPQUFjLGVBQThCLE1BQWE7QUFDakUsU0FBSyxRQUFRO0FBQ2IsU0FBSyxnQkFBZ0I7QUFDckIsU0FBSyxPQUFPO0FBQUEsRUFDaEI7QUFBQSxFQUVBLElBQUksT0FBZTtBQUNmLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFDckI7QUFBQSxFQUVBLElBQUksV0FBbUI7QUFDbkIsV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUNyQjtBQUFBLEVBRUEsYUFBdUI7QUFDbkIsVUFBTSxpQkFBaUIsS0FBSyxjQUFjLGFBQWEsS0FBSyxJQUFJLEtBQUssQ0FBQztBQUN0RSxlQUFPLGtCQUFBQyxZQUFtQixjQUFjLEtBQUssQ0FBQztBQUFBLEVBQ2xEO0FBQUEsRUFFQSxtQkFBbUIsVUFBNEI7QUFDM0MsVUFBTSxpQkFBaUIsS0FBSyxjQUFjLGFBQWEsS0FBSyxJQUFJLEtBQUssQ0FBQztBQUN0RSxVQUFNLFdBQTJCLGVBQWUsWUFBWSxDQUFDO0FBQzdELFVBQU0sUUFBd0IsQ0FBQztBQUMvQixlQUFXLFdBQVcsVUFBVTtBQUM1QixVQUFJLFFBQVEsU0FBUyxNQUFNLE9BQU8sVUFBVTtBQUN4QztBQUFBLE1BQ0o7QUFFQSxhQUFPLE1BQU0sU0FBUyxLQUFLLE1BQU0sTUFBTSxTQUFTLENBQUMsRUFBRSxTQUFTLFFBQVEsT0FBTztBQUN2RSxjQUFNLElBQUk7QUFBQSxNQUNkO0FBRUEsWUFBTSxLQUFLLE9BQU87QUFBQSxJQUN0QjtBQUVBLFVBQU0sU0FBUyxDQUFDO0FBQ2hCLGVBQVcsY0FBYyxPQUFPO0FBQzVCLGlCQUFXLFVBQVUsV0FBVyxRQUFRLFFBQVEsZUFBZSxFQUFFLEVBQUUsS0FBSztBQUN4RSxhQUFPLEtBQUssV0FBVyxPQUFPO0FBQUEsSUFDbEM7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsTUFBTSxPQUF3QjtBQUMxQixXQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssS0FBSyxJQUFJO0FBQUEsRUFDMUM7QUFBQSxFQUVBLE1BQU0sTUFBTSxTQUFnQztBQUN4QyxVQUFNLEtBQUssTUFBTSxPQUFPLEtBQUssTUFBTSxPQUFPO0FBQUEsRUFDOUM7QUFDSjs7O0FDdEVPLElBQU0scUJBQU4sTUFBeUI7QUFBQSxFQUM1QixPQUFPLFVBQVUsTUFBWSxVQUE4QjtBQUN2RCxRQUFJLFlBQW9CO0FBQ3hCLFFBQUksaUJBQXlCO0FBRTdCLFNBQUssYUFBYSxRQUFRLENBQUMsYUFBYTtBQUNwQyxlQUFTLE1BQ0osT0FBTyxDQUFDLFNBQVMsS0FBSyxXQUFXLEVBQ2pDLFFBQVEsQ0FBQyxTQUFTO0FBQ2YscUJBQWEsS0FBSyxhQUFhO0FBQy9CO0FBQUEsTUFDSixDQUFDO0FBQUEsSUFDVCxDQUFDO0FBRUQsUUFBSSxTQUFpQjtBQUNyQixRQUFJLGlCQUFpQixHQUFHO0FBQ3BCLFlBQU0sMEJBQWtDLFlBQVk7QUFDcEQsWUFBTSx3QkFBZ0MsS0FBSztBQUFBLFFBQ3ZDO0FBQUEsUUFDQSxLQUFLLElBQUksaUJBQWlCLEdBQUcsSUFBSSxLQUFLLElBQUksRUFBRTtBQUFBLE1BQ2hEO0FBQ0EsZUFDSSwwQkFBMEIsd0JBQzFCLFNBQVMsWUFBWSxJQUFNO0FBQUEsSUFDbkM7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNKOzs7QUM1Qk8sSUFBTSxpQkFBTixNQUFxQjtBQUFBLEVBQXJCO0FBQ0gsZ0JBQStCLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFFaEMsb0JBQW9CLE9BQXFCO0FBQ3JDLFFBQUksQ0FBQyxLQUFLLFNBQVMsS0FBSztBQUFHLFdBQUssS0FBSyxLQUFLLElBQUk7QUFBQSxFQUNsRDtBQUFBLEVBRUEsU0FBUyxPQUF3QjtBQUM3QixXQUFPLE9BQU8sVUFBVSxlQUFlLEtBQUssS0FBSyxNQUFNLEtBQUs7QUFBQSxFQUNoRTtBQUFBLEVBRUEsZUFBZSxPQUFxQjtBQUNoQyxTQUFLLG9CQUFvQixLQUFLO0FBQzlCLFNBQUssS0FBSyxLQUFLO0FBQUEsRUFDbkI7QUFBQSxFQUVBLGNBQXNCO0FBQ2xCLFdBQU8sS0FBSyxJQUFJLEdBQUcsb0JBQW9CLEtBQUssSUFBSSxDQUFDLEtBQUs7QUFBQSxFQUMxRDtBQUFBLEVBRUEsK0JBQXVDO0FBQ25DLFVBQU0sSUFDRixzQkFBc0IsS0FBSyxJQUFJLEVBQzFCLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxNQUFNLFFBQVEsS0FBSyxFQUNyQyxPQUFPLENBQUMsR0FBRyxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUs7QUFDdkMsV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDM0JPLElBQU0sUUFBTixNQUFZO0FBQUEsRUFBWjtBQUNILGlCQUF3QixJQUFJLGVBQWU7QUFDM0MscUJBQTRCLElBQUksZUFBZTtBQUMvQyx1QkFBOEIsSUFBSSxlQUFlO0FBQ2pELG9CQUFtQjtBQUNuQixzQkFBcUI7QUFDckIsdUJBQXNCO0FBQUE7QUFBQSxFQUV0QixJQUFJLGFBQXFCO0FBQ3JCLFdBQU8sS0FBSyxhQUFhLEtBQUs7QUFBQSxFQUNsQztBQUFBLEVBRUEsZUFBZTtBQUNYLFNBQUs7QUFBQSxFQUNUO0FBQUEsRUFFQSxPQUFPLGFBQXFCLFVBQWtCLE1BQWM7QUFDeEQsU0FBSyxVQUFVLGVBQWUsUUFBUTtBQUN0QyxTQUFLLE1BQU0sZUFBZSxJQUFJO0FBQzlCLFNBQUssWUFBWSxlQUFlLFdBQVc7QUFFM0MsUUFBSSxZQUFZLElBQUk7QUFDaEIsV0FBSztBQUFBLElBQ1QsT0FBTztBQUNILFdBQUs7QUFBQSxJQUNUO0FBQUEsRUFDSjtBQUFBLEVBRUEsaUJBQXlCO0FBQ3JCLFdBQU8sS0FBSyxVQUFVLFlBQVk7QUFBQSxFQUN0QztBQUFBLEVBRUEscUJBQTZCO0FBQ3pCLFdBQU8sS0FBSyxVQUFVLDZCQUE2QixJQUFJLEtBQUs7QUFBQSxFQUNoRTtBQUFBLEVBRUEsa0JBQTBCO0FBQ3RCLFdBQU8sS0FBSyxNQUFNLDZCQUE2QixJQUFJLEtBQUs7QUFBQSxFQUM1RDtBQUNKOzs7QUM1Qk8sSUFBTSwwQkFBTixNQUE4QjtBQUFBLEVBR2pDLFVBQVUsVUFBdUI7QUFFN0IsVUFBTSxnQkFBZ0M7QUFBQSxNQUNsQztBQUFBLE1BQ0E7QUFBQSxJQUNKO0FBQ0EsVUFBTSxXQUE4QixJQUFJO0FBQUEsTUFDcEM7QUFBQTtBQUFBLElBRUo7QUFDQSxVQUFNLFNBQVMsSUFBSSxNQUFNO0FBQ3pCLGFBQVMsUUFBUSxRQUFRO0FBQ3pCLFdBQU8sU0FBUyxTQUFTLEdBQUc7QUFDeEIsWUFBTSxPQUFhLFNBQVM7QUFDNUIsVUFBSSxLQUFLLGFBQWE7QUFDbEIsY0FBTUMsWUFBNkIsS0FBSztBQUN4QyxlQUFPLE9BQU9BLFVBQVMsMEJBQTBCQSxVQUFTLFVBQVVBLFVBQVMsSUFBSTtBQUFBLE1BQ3JGLE9BQU87QUFDSCxlQUFPLGFBQWE7QUFBQSxNQUN4QjtBQUFBLElBQ0o7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNKOzs7QUMvQk8sSUFBTSxlQUFOLE1BQTRDO0FBQUEsRUFJL0MsWUFBWSxVQUFzQjtBQUZsQyxnQkFBK0IsQ0FBQztBQUc1QixTQUFLLFdBQVc7QUFBQSxFQUNwQjtBQUFBLEVBRUEsSUFBSSxXQUFXO0FBQ1gsV0FBTyxLQUFLLFNBQVM7QUFBQSxFQUN6QjtBQUFBLEVBRUEsZUFBZSxNQUF1QjtBQUNsQyxXQUFPLE9BQU8sVUFBVSxlQUFlLEtBQUssS0FBSyxNQUFNLElBQUk7QUFBQSxFQUMvRDtBQUFBLEVBRUEsY0FBYyxNQUE2QjtBQUN2QyxRQUFJLE9BQWU7QUFDbkIsUUFBSSxLQUFLLGVBQWUsSUFBSSxHQUFHO0FBQzNCLGFBQU8sS0FBSyxNQUFNLEtBQUssS0FBSyxJQUFJLENBQUM7QUFBQSxJQUNyQztBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxlQUFlLE1BQWMsTUFBb0I7QUFDN0MsU0FBSyxLQUFLLElBQUksSUFBSTtBQUFBLEVBQ3RCO0FBQ0o7OztBQ3hCTyxJQUFNLDJCQUFOLE1BQW9FO0FBQUEsRUFLdkUsWUFBWSxRQUFrQixVQUFzQixNQUFnQjtBQUNoRSxTQUFLLFNBQVM7QUFDZCxTQUFLLFdBQVc7QUFDaEIsU0FBSyxPQUFPO0FBQUEsRUFDaEI7QUFBQSxFQUVBLFFBQWM7QUFDVixTQUFLLEtBQUssT0FBTyxDQUFDO0FBQUEsRUFDdEI7QUFBQSxFQUVBLElBQUksVUFBMEI7QUFDMUIsUUFBSSxDQUFDLEtBQUssU0FBUyxRQUFRO0FBQUcsV0FBSyxLQUFLLEtBQUssU0FBUyxhQUFhLFFBQVE7QUFBQSxFQUMvRTtBQUFBLEVBRUEsU0FBUyxVQUE2QjtBQUNsQyxXQUFPLEtBQUssS0FBSyxTQUFTLFNBQVMsYUFBYSxRQUFRO0FBQUEsRUFDNUQ7QUFBQSxFQUVBLE1BQU0sUUFBdUI7QUFFekIsUUFBSSxLQUFLLFVBQVU7QUFBTTtBQUV6QixVQUFNLEtBQUssT0FBTyxlQUFlO0FBQUEsRUFDckM7QUFDSjs7O0E1SU9BLElBQU0sZUFBMkI7QUFBQSxFQUM3QixVQUFVO0FBQUEsRUFDVixVQUFVO0FBQUEsRUFDVixVQUFVLENBQUM7QUFBQSxFQUNYLGFBQWE7QUFDakI7QUFZQSxJQUFxQixXQUFyQixNQUFxQixrQkFBaUIseUJBQU87QUFBQSxFQUE3QztBQUFBO0FBSUksU0FBTyxXQUFXO0FBRWxCLFNBQU8sY0FBaUQsQ0FBQztBQUt6RCxTQUFRLGdCQUE0QyxDQUFDO0FBQ3JELFNBQVEsWUFBb0MsQ0FBQztBQUM3QyxTQUFRLGdCQUFnQjtBQUN4QixTQUFPLGdCQUF3QyxDQUFDO0FBRWhEO0FBQUEsU0FBTyxXQUFpQixJQUFJQyxNQUFLLFFBQVEsSUFBSTtBQUFBO0FBQUEsRUFJN0MsTUFBTSxTQUF3QjtBQUMxQixVQUFNLEtBQUssZUFBZTtBQUMxQixTQUFLLGFBQWEsSUFBSSxhQUFhLEtBQUssS0FBSyxRQUFRO0FBQ3JELFNBQUssMkJBQTJCLElBQUk7QUFBQSxNQUNoQztBQUFBLE1BQ0EsS0FBSyxLQUFLO0FBQUEsTUFDVixLQUFLLEtBQUs7QUFBQSxJQUNkO0FBRUEsWUFBUTtBQUVSLFNBQUssWUFBWSxLQUFLLGlCQUFpQjtBQUN2QyxTQUFLLFVBQVUsVUFBVSxJQUFJLGVBQWU7QUFDNUMsU0FBSyxVQUFVLGFBQWEsY0FBYyxFQUFFLHNCQUFzQixDQUFDO0FBQ25FLFNBQUssVUFBVSxhQUFhLHVCQUF1QixLQUFLO0FBQ3hELFNBQUssVUFBVSxpQkFBaUIsU0FBUyxZQUFZO0FBQ2pELFVBQUksQ0FBQyxLQUFLLFVBQVU7QUFDaEIsY0FBTSxLQUFLLEtBQUs7QUFDaEIsYUFBSyxvQkFBb0I7QUFBQSxNQUM3QjtBQUFBLElBQ0osQ0FBQztBQUVELFNBQUssY0FBYyxpQkFBaUIsRUFBRSxjQUFjLEdBQUcsWUFBWTtBQUMvRCxVQUFJLENBQUMsS0FBSyxVQUFVO0FBQ2hCLGNBQU0sS0FBSyxLQUFLO0FBQ2hCLGFBQUs7QUFBQSxVQUNELEtBQUs7QUFBQSxVQUNMLEtBQUs7QUFBQTtBQUFBLFFBRVQ7QUFBQSxNQUNKO0FBQUEsSUFDSixDQUFDO0FBRUQsUUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLDhCQUE4QjtBQUNsRCxXQUFLO0FBQUEsUUFDRCxLQUFLLElBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLFlBQTJCO0FBQ2pFLGNBQUksbUJBQW1CLDJCQUFTLFFBQVEsY0FBYyxNQUFNO0FBQ3hELGlCQUFLLFFBQVEsQ0FBQyxTQUFTO0FBQ25CLG1CQUFLLFNBQVMsRUFBRSx1QkFBdUIsQ0FBQyxFQUNuQyxRQUFRLGVBQWUsRUFDdkIsUUFBUSxNQUFNO0FBQ1gscUJBQUssbUJBQW1CLHFCQUE0QjtBQUFBLGNBQ3hELENBQUM7QUFBQSxZQUNULENBQUM7QUFFRCxpQkFBSyxRQUFRLENBQUMsU0FBUztBQUNuQixtQkFBSyxTQUFTLEVBQUUsdUJBQXVCLENBQUMsRUFDbkMsUUFBUSxlQUFlLEVBQ3ZCLFFBQVEsTUFBTTtBQUNYLHFCQUFLLG1CQUFtQixxQkFBNEI7QUFBQSxjQUN4RCxDQUFDO0FBQUEsWUFDVCxDQUFDO0FBRUQsaUJBQUssUUFBUSxDQUFDLFNBQVM7QUFDbkIsbUJBQUssU0FBUyxFQUFFLHVCQUF1QixDQUFDLEVBQ25DLFFBQVEsZUFBZSxFQUN2QixRQUFRLE1BQU07QUFDWCxxQkFBSyxtQkFBbUIscUJBQTRCO0FBQUEsY0FDeEQsQ0FBQztBQUFBLFlBQ1QsQ0FBQztBQUFBLFVBQ0w7QUFBQSxRQUNKLENBQUM7QUFBQSxNQUNMO0FBQUEsSUFDSjtBQUVBLFNBQUssV0FBVztBQUFBLE1BQ1osSUFBSTtBQUFBLE1BQ0osTUFBTSxFQUFFLHNCQUFzQjtBQUFBLE1BQzlCLFVBQVUsWUFBWTtBQUNsQixZQUFJLENBQUMsS0FBSyxVQUFVO0FBQ2hCLGdCQUFNLEtBQUssS0FBSztBQUNoQixlQUFLLG9CQUFvQjtBQUFBLFFBQzdCO0FBQUEsTUFDSjtBQUFBLElBQ0osQ0FBQztBQUVELFNBQUssV0FBVztBQUFBLE1BQ1osSUFBSTtBQUFBLE1BQ0osTUFBTSxFQUFFLHNCQUFzQjtBQUFBLE1BQzlCLFVBQVUsTUFBTTtBQUNaLGNBQU0sV0FBeUIsS0FBSyxJQUFJLFVBQVUsY0FBYztBQUNoRSxZQUFJLFlBQVksU0FBUyxjQUFjLE1BQU07QUFDekMsZUFBSyxtQkFBbUIsc0JBQTZCO0FBQUEsUUFDekQ7QUFBQSxNQUNKO0FBQUEsSUFDSixDQUFDO0FBRUQsU0FBSyxXQUFXO0FBQUEsTUFDWixJQUFJO0FBQUEsTUFDSixNQUFNLEVBQUUsc0JBQXNCO0FBQUEsTUFDOUIsVUFBVSxNQUFNO0FBQ1osY0FBTSxXQUF5QixLQUFLLElBQUksVUFBVSxjQUFjO0FBQ2hFLFlBQUksWUFBWSxTQUFTLGNBQWMsTUFBTTtBQUN6QyxlQUFLLG1CQUFtQixzQkFBNkI7QUFBQSxRQUN6RDtBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFFRCxTQUFLLFdBQVc7QUFBQSxNQUNaLElBQUk7QUFBQSxNQUNKLE1BQU0sRUFBRSxzQkFBc0I7QUFBQSxNQUM5QixVQUFVLE1BQU07QUFDWixjQUFNLFdBQXlCLEtBQUssSUFBSSxVQUFVLGNBQWM7QUFDaEUsWUFBSSxZQUFZLFNBQVMsY0FBYyxNQUFNO0FBQ3pDLGVBQUssbUJBQW1CLHNCQUE2QjtBQUFBLFFBQ3pEO0FBQUEsTUFDSjtBQUFBLElBQ0osQ0FBQztBQUVELFNBQUssV0FBVztBQUFBLE1BQ1osSUFBSTtBQUFBLE1BQ0osTUFBTSxFQUFFLGtCQUFrQjtBQUFBLE1BQzFCLFVBQVUsWUFBWTtBQUNsQixZQUFJLENBQUMsS0FBSyxVQUFVO0FBQ2hCLGdCQUFNLEtBQUssS0FBSztBQUNoQixlQUFLO0FBQUEsWUFDRCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUE7QUFBQSxVQUVUO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFFRCxTQUFLLFdBQVc7QUFBQSxNQUNaLElBQUk7QUFBQSxNQUNKLE1BQU0sRUFBRSxnQkFBZ0I7QUFBQSxNQUN4QixVQUFVLFlBQVk7QUFDbEIsY0FBTSxLQUFLLEtBQUs7QUFDaEIsYUFBSyxtQkFBbUIsS0FBSyxVQUFVLEtBQUssc0JBQWtDO0FBQUEsTUFDbEY7QUFBQSxJQUNKLENBQUM7QUFFRCxTQUFLLFdBQVc7QUFBQSxNQUNaLElBQUk7QUFBQSxNQUNKLE1BQU0sRUFBRSxzQkFBc0I7QUFBQSxNQUM5QixVQUFVLFlBQVk7QUFDbEIsY0FBTSxXQUF5QixLQUFLLElBQUksVUFBVSxjQUFjO0FBQ2hFLFlBQUksWUFBWSxTQUFTLGNBQWMsTUFBTTtBQUN6QyxlQUFLLGdDQUFnQyx3QkFBb0M7QUFBQSxRQUM3RTtBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFFRCxTQUFLLFdBQVc7QUFBQSxNQUNaLElBQUk7QUFBQSxNQUNKLE1BQU0sRUFBRSxvQkFBb0I7QUFBQSxNQUM1QixVQUFVLFlBQVk7QUFDbEIsY0FBTSxXQUF5QixLQUFLLElBQUksVUFBVSxjQUFjO0FBQ2hFLFlBQUksWUFBWSxTQUFTLGNBQWMsTUFBTTtBQUN6QyxlQUFLLGdDQUFnQyxzQkFBa0M7QUFBQSxRQUMzRTtBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFFRCxTQUFLLFdBQVc7QUFBQSxNQUNaLElBQUk7QUFBQSxNQUNKLE1BQU0sRUFBRSxZQUFZO0FBQUEsTUFDcEIsVUFBVSxZQUFZO0FBQ2xCLFlBQUksQ0FBQyxLQUFLLFVBQVU7QUFDaEIsZ0JBQU0sS0FBSyxLQUFLO0FBQ2hCLGNBQUksV0FBVyxLQUFLLEtBQUssSUFBSSxFQUFFLEtBQUs7QUFBQSxRQUN4QztBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFFRCxTQUFLLGNBQWMsSUFBSSxhQUFhLEtBQUssS0FBSyxJQUFJLENBQUM7QUFFbkQsU0FBSyxJQUFJLFVBQVUsY0FBYyxNQUFNO0FBQ25DLFdBQUssU0FBUztBQUNkLGlCQUFXLFlBQVk7QUFDbkIsWUFBSSxDQUFDLEtBQUssVUFBVTtBQUNoQixnQkFBTSxLQUFLLEtBQUs7QUFBQSxRQUNwQjtBQUFBLE1BQ0osR0FBRyxHQUFJO0FBQUEsSUFDWCxDQUFDO0FBQUEsRUFDTDtBQUFBLEVBRUEsV0FBaUI7QUFDYixTQUFLLElBQUksVUFBVSxnQkFBZ0Isc0JBQXNCLEVBQUUsUUFBUSxDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUM7QUFBQSxFQUM5RjtBQUFBLEVBRUEsTUFBYyxnQ0FDVixVQUNBLFlBQ2E7QUFDYixVQUFNLFlBQXVCLEtBQUssY0FBYyxLQUFLLGNBQWMsUUFBUSxDQUFDO0FBQzVFLFVBQU0sT0FBYSxNQUFNLEtBQUssU0FBUyxVQUFVLFNBQVM7QUFFMUQsVUFBTSxXQUFXLElBQUlBLE1BQUssUUFBUSxJQUFJO0FBQ3RDLFNBQUssa0JBQWtCLFFBQVE7QUFDL0IsVUFBTSxvQkFBb0IsZUFBZTtBQUFBLE1BQ3JDLEtBQUs7QUFBQSxNQUNMO0FBQUEsTUFDQTtBQUFBLElBQ0o7QUFDQSxTQUFLLG1CQUFtQixVQUFVLG1CQUFtQixVQUFVO0FBQUEsRUFDbkU7QUFBQSxFQUVRLG1CQUNKLGNBQ0EsbUJBQ0EsWUFDSTtBQUNKLFVBQU0sZUFBZSxVQUFTLHVCQUF1QixLQUFLLEtBQUssUUFBUTtBQUN2RSxVQUFNLHlCQUF5QixJQUFJO0FBQUEsTUFDL0IsS0FBSyxLQUFLO0FBQUEsTUFDVixLQUFLO0FBQUEsSUFDVDtBQUNBLFVBQU0sa0JBQTZDLElBQUk7QUFBQSxNQUNuRDtBQUFBLE1BQ0E7QUFBQSxNQUNBLEtBQUssS0FBSztBQUFBLE1BQ1Y7QUFBQSxNQUNBLEtBQUs7QUFBQSxJQUNUO0FBRUEsb0JBQWdCLFlBQVksY0FBYyxpQkFBaUI7QUFDM0QsUUFBSSxlQUFlLEtBQUssS0FBSyxNQUFNLEtBQUssS0FBSyxVQUFVLGlCQUFpQixVQUFVLEVBQUUsS0FBSztBQUFBLEVBQzdGO0FBQUEsRUFFQSxPQUFlLHVCQUF1QixVQUF5QztBQUMzRSxRQUFJLFlBQXVCLFVBQVUsU0FBUyxrQkFBNEM7QUFDMUYsUUFBSSxjQUFjO0FBQVc7QUFDN0IsUUFBSSxZQUF1QixVQUFVLFNBQVMsa0JBQTRDO0FBQzFGLFFBQUksY0FBYztBQUFXO0FBQzdCLFlBQVEsSUFBSSxzQ0FBc0MsU0FBUyxnQkFBZ0IsU0FBUyxFQUFFO0FBRXRGLFVBQU0sZ0JBQWdDO0FBQUEsTUFDbEM7QUFBQSxNQUNBO0FBQUEsSUFDSjtBQUNBLFdBQU8sSUFBSSxpQkFBaUIsd0NBQW1EO0FBQUEsRUFDbkY7QUFBQSxFQUVBLE1BQU0sT0FBc0I7QUFDeEIsUUFBSSxLQUFLLFVBQVU7QUFDZjtBQUFBLElBQ0o7QUFDQSxTQUFLLFdBQVc7QUFHaEIsSUFBTSxZQUFNO0FBQ1osU0FBSyxhQUFhLElBQUksYUFBYSxLQUFLLEtBQUssUUFBUTtBQUNyRCxTQUFLLGdCQUFnQixDQUFDO0FBQ3RCLFNBQUssWUFBWSxDQUFDO0FBQ2xCLFNBQUssZ0JBQWdCO0FBQ3JCLFNBQUssZ0JBQWdCLENBQUM7QUFDdEIsU0FBSyxjQUFjLENBQUM7QUFHcEIsVUFBTSxlQUFlLElBQUlBLE1BQUssUUFBUSxJQUFJO0FBRTFDLFVBQU0sTUFBTSxPQUFPLE9BQU8sS0FBSyxJQUFJLENBQUM7QUFDcEMsVUFBTSxZQUFvQixJQUFJLE9BQU8sWUFBWTtBQUVqRCxRQUFJLGNBQWMsS0FBSyxLQUFLLFVBQVU7QUFDbEMsV0FBSyxLQUFLLFdBQVc7QUFDckIsV0FBSyx5QkFBeUIsTUFBTTtBQUdwQyxZQUFNLEtBQUssZUFBZTtBQUFBLElBQzlCO0FBRUEsVUFBTSxRQUFpQixLQUFLLElBQUksTUFBTSxpQkFBaUI7QUFDdkQsZUFBVyxZQUFZLE9BQU87QUFDMUIsVUFDSSxLQUFLLEtBQUssU0FBUyxvQkFBb0I7QUFBQSxRQUFLLENBQUMsV0FDekMsU0FBUyxLQUFLLFdBQVcsTUFBTTtBQUFBLE1BQ25DLEdBQ0Y7QUFDRTtBQUFBLE1BQ0o7QUFFQSxVQUFJLEtBQUssY0FBYyxTQUFTLElBQUksTUFBTSxRQUFXO0FBQ2pELGFBQUssY0FBYyxTQUFTLElBQUksSUFBSSxDQUFDO0FBQUEsTUFDekM7QUFFQSxZQUFNLFFBQVEsS0FBSyxJQUFJLGNBQWMsY0FBYyxTQUFTLElBQUksS0FBSyxDQUFDO0FBQ3RFLGlCQUFXLGNBQWMsT0FBTztBQUM1QixZQUFJLEtBQUssY0FBYyxVQUFVLE1BQU07QUFDbkMsZUFBSyxjQUFjLFVBQVUsSUFBSSxDQUFDO0FBR3RDLFlBQUksV0FBVyxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsWUFBWSxNQUFNLE1BQU07QUFDcEQsZUFBSyxjQUFjLFVBQVUsRUFBRSxLQUFLO0FBQUEsWUFDaEMsWUFBWSxTQUFTO0FBQUEsWUFDckIsV0FBVyxNQUFNLFVBQVU7QUFBQSxVQUMvQixDQUFDO0FBRUQsVUFBTSxXQUFLLFNBQVMsTUFBTSxZQUFZLE1BQU0sVUFBVSxDQUFDO0FBQUEsUUFDM0Q7QUFBQSxNQUNKO0FBRUEsWUFBTSxZQUF1QixLQUFLLGNBQWMsS0FBSyxjQUFjLFFBQVEsQ0FBQztBQUM1RSxVQUFJLFVBQVUsU0FBUztBQUNuQixjQUFNLE9BQWEsTUFBTSxLQUFLLFNBQVMsVUFBVSxTQUFTO0FBQzFELGNBQU0sMEJBQWtDLG1CQUFtQjtBQUFBLFVBQ3ZEO0FBQUEsVUFDQSxLQUFLLEtBQUs7QUFBQSxRQUNkO0FBQ0EsYUFBSyxrQkFBa0IsWUFBWTtBQUVuQyxZQUFJLDBCQUEwQixHQUFHO0FBQzdCLGVBQUssV0FBVyxlQUFlLEtBQUssVUFBVSx1QkFBdUI7QUFBQSxRQUN6RTtBQUFBLE1BQ0o7QUFFQSxZQUFNLGlCQUFpQixLQUFLLElBQUksY0FBYyxhQUFhLFFBQVEsS0FBSyxDQUFDO0FBRXpFLFlBQU0sY0FDRixlQUFlLGVBQWUsQ0FBQztBQUNuQyxZQUFNLFdBQU8sOEJBQVcsY0FBYyxLQUFLLENBQUM7QUFFNUMsVUFBSSxlQUFlO0FBQ25CLFlBQU0sa0JBQWtCLENBQUM7QUFFekIsaUJBQVcsZUFBZSxLQUFLLEtBQUssU0FBUyxjQUFjO0FBQ3ZELFlBQUksS0FBSyxLQUFLLENBQUMsUUFBUSxRQUFRLGVBQWUsSUFBSSxXQUFXLGNBQWMsR0FBRyxDQUFDLEdBQUc7QUFDOUUsY0FBSSxDQUFDLE9BQU8sVUFBVSxlQUFlLEtBQUssS0FBSyxhQUFhLFdBQVcsR0FBRztBQUN0RSxpQkFBSyxZQUFZLFdBQVcsSUFBSSxJQUFJLFdBQVcsV0FBVztBQUFBLFVBQzlEO0FBQ0EsMEJBQWdCLEtBQUssV0FBVztBQUNoQyx5QkFBZTtBQUNmO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxVQUFJLGNBQWM7QUFDZDtBQUFBLE1BQ0o7QUFHQSxVQUNJLEVBQ0ksT0FBTyxVQUFVLGVBQWUsS0FBSyxhQUFhLFFBQVEsS0FDMUQsT0FBTyxVQUFVLGVBQWUsS0FBSyxhQUFhLGFBQWEsS0FDL0QsT0FBTyxVQUFVLGVBQWUsS0FBSyxhQUFhLFNBQVMsSUFFakU7QUFDRSxtQkFBVyxrQkFBa0IsaUJBQWlCO0FBQzFDLGVBQUssWUFBWSxjQUFjLEVBQUUsU0FBUyxLQUFLLFFBQVE7QUFBQSxRQUMzRDtBQUNBO0FBQUEsTUFDSjtBQUVBLFlBQU0sVUFBa0IsT0FDbkIsT0FBTyxZQUFZLFFBQVEsR0FBRyxDQUFDLGNBQWMsY0FBYyxpQkFBaUIsQ0FBQyxFQUM3RSxRQUFRO0FBRWIsaUJBQVcsa0JBQWtCLGlCQUFpQjtBQUMxQyxhQUFLLFlBQVksY0FBYyxFQUFFLGVBQWUsS0FBSyxFQUFFLE1BQU0sVUFBVSxRQUFRLENBQUM7QUFDaEYsWUFBSSxXQUFXLElBQUksUUFBUSxHQUFHO0FBQzFCLGVBQUssWUFBWSxjQUFjLEVBQUU7QUFBQSxRQUNyQztBQUFBLE1BQ0o7QUFFQSxVQUFJO0FBQ0osVUFBSSxLQUFLLFdBQVcsZUFBZSxTQUFTLElBQUksR0FBRztBQUMvQyxnQkFBUSxLQUFLLFdBQVcsY0FBYyxTQUFTLElBQUksSUFBSSxZQUFZLFNBQVMsS0FBSztBQUFBLE1BQ3JGLE9BQU87QUFDSCxlQUFPLFlBQVksU0FBUztBQUFBLE1BQ2hDO0FBQ0EsV0FBSyxXQUFXLGVBQWUsU0FBUyxNQUFNLElBQUk7QUFFbEQsVUFBSSxXQUFXLElBQUksUUFBUSxHQUFHO0FBQzFCLGFBQUs7QUFBQSxNQUNUO0FBRUEsWUFBTSxRQUFnQixLQUFLLE1BQU0sVUFBVSxJQUFJLFFBQVEsTUFBTSxLQUFLLE9BQU8sSUFBSztBQUM5RSxVQUFJLENBQUMsT0FBTyxVQUFVLGVBQWUsS0FBSyxLQUFLLGVBQWUsS0FBSyxHQUFHO0FBQ2xFLGFBQUssY0FBYyxLQUFLLElBQUk7QUFBQSxNQUNoQztBQUNBLFdBQUssY0FBYyxLQUFLO0FBQUEsSUFDNUI7QUFFQSxJQUFNLFdBQUssTUFBTSxNQUFVLENBQUMsTUFBY0MsVUFBaUI7QUFDdkQsV0FBSyxVQUFVLElBQUksSUFBSUEsUUFBTztBQUFBLElBQ2xDLENBQUM7QUFHRCxTQUFLLFdBQVcsZUFBZSx5QkFBeUIsWUFBWTtBQUdwRSxTQUFLLFNBQVMsaUJBQWlCO0FBQy9CLFNBQUssb0JBQW9CLGVBQWU7QUFBQSxNQUNwQyxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUE7QUFBQSxJQUVUO0FBQ0EsVUFBTSxPQUFnQyxJQUFJLHdCQUF3QjtBQUNsRSxTQUFLLFlBQVksS0FBSyxVQUFVLEtBQUssUUFBUTtBQUU3QyxRQUFJLEtBQUssS0FBSyxTQUFTLG1CQUFtQjtBQUN0QyxjQUFRLElBQUksT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEtBQUssV0FBVyxJQUFJO0FBQ3JELGNBQVEsSUFBSSxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRO0FBQUEsSUFDbEQ7QUFFQSxlQUFXLFdBQVcsS0FBSyxhQUFhO0FBQ3BDLFdBQUssWUFBWSxPQUFPLEVBQUUsVUFBVSxLQUFLLFNBQVM7QUFBQSxJQUN0RDtBQUVBLFFBQUksS0FBSyxLQUFLLFNBQVMsbUJBQW1CO0FBQ3RDLGNBQVE7QUFBQSxRQUNKLFNBQ0ksRUFBRSxtQkFBbUI7QUFBQSxVQUNqQixHQUFHLEtBQUssSUFBSSxJQUFJLElBQUksUUFBUTtBQUFBLFFBQ2hDLENBQUM7QUFBQSxNQUNUO0FBQUEsSUFDSjtBQUVBLFNBQUssVUFBVTtBQUFBLE1BQ1gsRUFBRSxjQUFjO0FBQUEsUUFDWixlQUFlLEtBQUs7QUFBQSxRQUNwQixvQkFBb0IsS0FBSyxrQkFBa0IsMEJBQStCLElBQUk7QUFBQSxNQUNsRixDQUFDO0FBQUEsSUFDTDtBQUVBLFFBQUksS0FBSyxLQUFLLFNBQVM7QUFBK0IsV0FBSyxnQkFBZ0IsT0FBTztBQUNsRixTQUFLLFdBQVc7QUFBQSxFQUNwQjtBQUFBLEVBRUEsTUFBTSxTQUFTLFVBQWlCLFdBQXFDO0FBQ2pFLFVBQU0sU0FBeUIsSUFBSSxlQUFlLEtBQUssS0FBSyxRQUFRO0FBQ3BFLFVBQU0sT0FBYSxNQUFNLE9BQU8sS0FBSyxLQUFLLGNBQWMsUUFBUSxHQUFHLFNBQVM7QUFDNUUsUUFBSSxLQUFLO0FBQVksV0FBSyxjQUFjLEtBQUssS0FBSyxRQUFRO0FBQzFELFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxNQUFNLG1CQUFtQixNQUFhLFVBQXlDO0FBQzNFLFVBQU0saUJBQWlCLEtBQUssSUFBSSxjQUFjLGFBQWEsSUFBSSxLQUFLLENBQUM7QUFDckUsVUFBTSxjQUNGLGVBQWUsZUFBZSxDQUFDO0FBRW5DLFVBQU0sV0FBTyw4QkFBVyxjQUFjLEtBQUssQ0FBQztBQUM1QyxRQUFJLEtBQUssS0FBSyxTQUFTLG9CQUFvQixLQUFLLENBQUMsV0FBVyxLQUFLLEtBQUssV0FBVyxNQUFNLENBQUMsR0FBRztBQUN2RixVQUFJLHlCQUFPLEVBQUUsd0JBQXdCLENBQUM7QUFDdEM7QUFBQSxJQUNKO0FBRUEsUUFBSSxlQUFlO0FBQ25CLGVBQVcsT0FBTyxNQUFNO0FBQ3BCLFVBQ0ksS0FBSyxLQUFLLFNBQVMsYUFBYTtBQUFBLFFBQzVCLENBQUMsZ0JBQWdCLFFBQVEsZUFBZSxJQUFJLFdBQVcsY0FBYyxHQUFHO0FBQUEsTUFDNUUsR0FDRjtBQUNFLHVCQUFlO0FBQ2Y7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUVBLFFBQUksY0FBYztBQUNkLFVBQUkseUJBQU8sRUFBRSxpQkFBaUIsQ0FBQztBQUMvQjtBQUFBLElBQ0o7QUFFQSxRQUFJLFdBQW1CLE1BQU0sS0FBSyxJQUFJLE1BQU0sS0FBSyxJQUFJO0FBQ3JELFFBQUksTUFBYyxVQUFrQjtBQUNwQyxVQUFNLE1BQWMsS0FBSyxJQUFJO0FBRTdCLFFBQ0ksRUFDSSxPQUFPLFVBQVUsZUFBZSxLQUFLLGFBQWEsUUFBUSxLQUMxRCxPQUFPLFVBQVUsZUFBZSxLQUFLLGFBQWEsYUFBYSxLQUMvRCxPQUFPLFVBQVUsZUFBZSxLQUFLLGFBQWEsU0FBUyxJQUVqRTtBQUNFLFVBQUksWUFBWSxHQUNaLGNBQWMsR0FDZCxpQkFBaUI7QUFFckIsaUJBQVcsV0FBVyxLQUFLLGNBQWMsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHO0FBQ3ZELGNBQU1DLFFBQWUsS0FBSyxXQUFXLGNBQWMsUUFBUSxVQUFVO0FBQ3JFLFlBQUlBLE9BQU07QUFDTix1QkFBYSxRQUFRLFlBQVksS0FBSyxVQUFVLFFBQVEsVUFBVSxJQUFJQTtBQUN0RSx5QkFBZSxLQUFLLFVBQVUsUUFBUSxVQUFVLElBQUksUUFBUTtBQUM1RCw0QkFBa0IsUUFBUTtBQUFBLFFBQzlCO0FBQUEsTUFDSjtBQUVBLFlBQU0sZ0JBQWdCLEtBQUssSUFBSSxjQUFjLGNBQWMsS0FBSyxJQUFJLEtBQUssQ0FBQztBQUMxRSxpQkFBVyxrQkFBa0IsZUFBZTtBQUN4QyxjQUFNQSxRQUFlLEtBQUssV0FBVyxjQUFjLGNBQWM7QUFDakUsWUFBSUEsT0FBTTtBQUNOLHVCQUNJLGNBQWMsY0FBYyxJQUFJLEtBQUssVUFBVSxjQUFjLElBQUlBO0FBQ3JFLHlCQUFlLEtBQUssVUFBVSxjQUFjLElBQUksY0FBYyxjQUFjO0FBQzVFLDRCQUFrQixjQUFjLGNBQWM7QUFBQSxRQUNsRDtBQUFBLE1BQ0o7QUFFQSxZQUFNLG1CQUNGLEtBQUssS0FBSyxTQUFTLGdCQUNuQixLQUFLLElBQUksR0FBSyxLQUFLLElBQUksaUJBQWlCLEdBQUcsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO0FBQy9ELGNBQ0ssSUFBTSxvQkFBb0IsS0FBSyxLQUFLLFNBQVMsWUFDN0MsaUJBQWlCLElBQ1gsbUJBQW1CLFlBQWEsY0FDakMsbUJBQW1CLEtBQUssS0FBSyxTQUFTO0FBRWhELFVBQUksS0FBSyxXQUFXLGVBQWUsS0FBSyxJQUFJLEdBQUc7QUFDM0MsZ0JBQVEsT0FBTyxLQUFLLFdBQVcsY0FBYyxLQUFLLElBQUksS0FBSztBQUFBLE1BQy9EO0FBQ0EsYUFBTyxLQUFLLE1BQU0sSUFBSTtBQUN0QixpQkFBVztBQUNYLDBCQUFvQjtBQUFBLElBQ3hCLE9BQU87QUFDSCxpQkFBVyxZQUFZLGFBQWE7QUFDcEMsYUFBTyxZQUFZLFNBQVM7QUFDNUIsMEJBQ0ksTUFDQSxPQUNLLE9BQU8sWUFBWSxRQUFRLEdBQUcsQ0FBQyxjQUFjLGNBQWMsaUJBQWlCLENBQUMsRUFDN0UsUUFBUTtBQUFBLElBQ3JCO0FBRUEsVUFBTSxXQUFtQztBQUFBLE1BQ3JDO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxLQUFLLEtBQUs7QUFBQSxNQUNWLEtBQUs7QUFBQSxJQUNUO0FBQ0EsZUFBVyxTQUFTO0FBQ3BCLFdBQU8sU0FBUztBQUVoQixVQUFNLE1BQU0sT0FBTyxPQUFPLE1BQU0sV0FBVyxLQUFLLE9BQU8sR0FBSTtBQUMzRCxVQUFNLFlBQW9CLElBQUksT0FBTyxZQUFZO0FBR2pELFFBQUksc0JBQXNCLEtBQUssUUFBUSxHQUFHO0FBQ3RDLFlBQU0saUJBQWlCLHNCQUFzQixLQUFLLFFBQVE7QUFDMUQsaUJBQVcsU0FBUztBQUFBLFFBQ2hCO0FBQUEsUUFDQTtBQUFBLEVBQVEsZUFBZSxDQUFDLENBQUMsV0FBVyxTQUFTO0FBQUEsZUFDekIsUUFBUTtBQUFBLFdBQWMsSUFBSTtBQUFBLEVBQ3ZDLGVBQWUsQ0FBQyxDQUFDO0FBQUEsTUFDNUI7QUFBQSxJQUNKLFdBQVcsd0JBQXdCLEtBQUssUUFBUSxHQUFHO0FBRS9DLFlBQU0sZUFBZSx3QkFBd0IsS0FBSyxRQUFRO0FBQzFELGlCQUFXLFNBQVM7QUFBQSxRQUNoQjtBQUFBLFFBQ0E7QUFBQSxFQUFRLGFBQWEsQ0FBQyxDQUFDLFdBQVcsU0FBUztBQUFBLGVBQ3ZCLFFBQVE7QUFBQSxXQUFjLElBQUk7QUFBQTtBQUFBLE1BQ2xEO0FBQUEsSUFDSixPQUFPO0FBQ0gsaUJBQ0k7QUFBQSxVQUFnQixTQUFTO0FBQUEsZUFBa0IsUUFBUTtBQUFBLFdBQ3ZDLElBQUk7QUFBQTtBQUFBO0FBQUEsRUFBWSxRQUFRO0FBQUEsSUFDNUM7QUFFQSxRQUFJLEtBQUssS0FBSyxTQUFTLGtCQUFrQjtBQUNyQyxZQUFNLFlBQXVCLEtBQUssY0FBYyxLQUFLLGNBQWMsSUFBSSxDQUFDO0FBQ3hFLFlBQU0sUUFBYyxNQUFNLEtBQUssU0FBUyxNQUFNLFNBQVM7QUFDdkQsaUJBQVcsWUFBWSxNQUFNLGNBQWM7QUFDdkMsYUFBSyxLQUFLLFNBQVMsS0FBSyxTQUFTLGFBQWEsUUFBUTtBQUFBLE1BQzFEO0FBQ0EsWUFBTSxLQUFLLGVBQWU7QUFBQSxJQUM5QjtBQUNBLFVBQU0sS0FBSyxJQUFJLE1BQU0sT0FBTyxNQUFNLFFBQVE7QUFFMUMsUUFBSSx5QkFBTyxFQUFFLG1CQUFtQixDQUFDO0FBRWpDLFVBQU0sS0FBSyxLQUFLO0FBQ2hCLFFBQUksS0FBSyxLQUFLLFNBQVMsY0FBYztBQUNqQyxXQUFLLGVBQWUsS0FBSyxzQkFBc0I7QUFBQSxJQUNuRDtBQUFBLEVBQ0o7QUFBQSxFQUVBLE1BQU0sc0JBQXFDO0FBQ3ZDLFVBQU0sa0JBQTRCLE9BQU8sS0FBSyxLQUFLLFdBQVc7QUFDOUQsUUFBSSxnQkFBZ0IsV0FBVyxHQUFHO0FBQzlCLFdBQUssZUFBZSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQUEsSUFDMUMsT0FBTztBQUNILFlBQU0scUJBQXFCLElBQUkseUJBQXlCLEtBQUssS0FBSyxlQUFlO0FBQ2pGLHlCQUFtQixpQkFBaUIsQ0FBQyxZQUFvQixLQUFLLGVBQWUsT0FBTztBQUNwRix5QkFBbUIsS0FBSztBQUFBLElBQzVCO0FBQUEsRUFDSjtBQUFBLEVBRUEsTUFBTSxlQUFlLFNBQWdDO0FBQ2pELFFBQUksQ0FBQyxPQUFPLFVBQVUsZUFBZSxLQUFLLEtBQUssYUFBYSxPQUFPLEdBQUc7QUFDbEUsVUFBSSx5QkFBTyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsUUFBUSxDQUFDLENBQUM7QUFDckQ7QUFBQSxJQUNKO0FBRUEsU0FBSyx5QkFBeUI7QUFDOUIsVUFBTSxPQUFPLEtBQUssWUFBWSxPQUFPO0FBRXJDLFFBQUksS0FBSyxnQkFBZ0IsR0FBRztBQUN4QixZQUFNLFFBQVEsS0FBSyxLQUFLLFNBQVMsaUJBQzNCLEtBQUssTUFBTSxLQUFLLE9BQU8sSUFBSSxLQUFLLGFBQWEsSUFDN0M7QUFDTixZQUFNLEtBQUssSUFBSSxVQUFVLFFBQVEsRUFBRSxTQUFTLEtBQUssZUFBZSxLQUFLLEVBQUUsSUFBSTtBQUMzRTtBQUFBLElBQ0o7QUFFQSxRQUFJLEtBQUssU0FBUyxTQUFTLEdBQUc7QUFDMUIsWUFBTSxRQUFRLEtBQUssS0FBSyxTQUFTLGlCQUMzQixLQUFLLE1BQU0sS0FBSyxPQUFPLElBQUksS0FBSyxTQUFTLE1BQU0sSUFDL0M7QUFDTixXQUFLLElBQUksVUFBVSxRQUFRLEVBQUUsU0FBUyxLQUFLLFNBQVMsS0FBSyxDQUFDO0FBQzFEO0FBQUEsSUFDSjtBQUVBLFFBQUkseUJBQU8sRUFBRSxlQUFlLENBQUM7QUFBQSxFQUNqQztBQUFBLEVBRUEsY0FBYyxNQUFzQjtBQUNoQyxXQUFPLElBQUksUUFBUSxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksZUFBZSxJQUFJO0FBQUEsRUFDbkU7QUFBQSxFQUVBLGNBQWMsTUFBMEI7QUFDcEMsV0FBTyxVQUFVLG1CQUFtQixNQUFNLEtBQUssS0FBSyxRQUFRO0FBQUEsRUFDaEU7QUFBQSxFQUVBLE1BQU0saUJBQWdDO0FBQ2xDLFVBQU0sYUFBeUIsTUFBTSxLQUFLLFNBQVM7QUFDbkQsUUFBSSx5Q0FBWTtBQUFVLHNCQUFnQixXQUFXLFFBQVE7QUFDN0QsU0FBSyxPQUFPLE9BQU8sT0FBTyxDQUFDLEdBQUcsY0FBYyxVQUFVO0FBQ3RELFNBQUssS0FBSyxXQUFXLE9BQU8sT0FBTyxDQUFDLEdBQUcsa0JBQWtCLEtBQUssS0FBSyxRQUFRO0FBQUEsRUFDL0U7QUFBQSxFQUVBLE1BQU0saUJBQWdDO0FBQ2xDLFVBQU0sS0FBSyxTQUFTLEtBQUssSUFBSTtBQUFBLEVBQ2pDO0FBQUEsRUFFQSxXQUFpQjtBQUNiLFNBQUs7QUFBQSxNQUNEO0FBQUEsTUFDQSxDQUFDLFNBQVUsS0FBSyxrQkFBa0IsSUFBSSxvQkFBb0IsTUFBTSxJQUFJO0FBQUEsSUFDeEU7QUFFQSxRQUNJLEtBQUssS0FBSyxTQUFTLGlDQUNuQixJQUFJLFVBQVUsZ0JBQWdCLHNCQUFzQixFQUFFLFVBQVUsR0FDbEU7QUFDRSxXQUFLLElBQUksVUFBVSxhQUFhLEtBQUssRUFBRSxhQUFhO0FBQUEsUUFDaEQsTUFBTTtBQUFBLFFBQ04sUUFBUTtBQUFBLE1BQ1osQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBQ0o7IiwKICAibmFtZXMiOiBbIm1vZHVsZSIsICJjYWxsYmFjayIsICJhbHBoYSIsICJlc2MiLCAiU3RyaW5nIiwgInN0ciIsICJyZXBsYWNlIiwgIm1hcCIsICJzIiwgInNldElubmVySFRNTEF0dHIiLCAiRE9NQXR0cmlidXRlTmFtZXMiLCAic2FuaXRpemVkIiwgImgiLCAibmFtZSIsICJhdHRycyIsICJzdGFjayIsICJpIiwgImFyZ3VtZW50cyIsICJsZW5ndGgiLCAicHVzaCIsICJjaGlsZHJlbiIsICJyZXZlcnNlIiwgImVtcHR5VGFncyIsICJpbmRleE9mIiwgIl9faHRtbCIsICJjaGlsZCIsICJwb3AiLCAibW9kdWxlIiwgImNhbGxiYWNrIiwgImlzQXJyYXkiLCAiaXNPYmplY3QiLCAiaXNOdW1iZXIiLCAibWFwIiwgImZvcm1hdCIsICJsb2NhbGUiLCAidCIsICJ0byIsICJmcm9tIiwgImlzRnVuY3Rpb24iLCAic2V0IiwgIm5vdyIsICJzaWduIiwgInRva2VuIiwgIm9yZGluYWwiLCAiaSIsICJkaWZmIiwgImxvY2FsZURhdGEiLCAiaCIsICJob3VycyIsICJtaW51dGVzIiwgIm5hbWVzIiwgImRlZmF1bHRzIiwgInRva2VucyIsICJtZXJpZGllbSIsICJ5ZWFycyIsICJtb250aHMiLCAid2Vla3MiLCAiZGF5cyIsICJzZWNvbmRzIiwgIm1pbGxpc2Vjb25kcyIsICJvZmZzZXQiLCAiY2xvbmUiLCAicm91bmQiLCAidGhyZXNob2xkcyIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgIm5hbWVzIiwgImNhbGxiYWNrIiwgImFwcCIsICJpbXBvcnRfb2JzaWRpYW4iLCAiRGVjayIsICJ0IiwgImgxIiwgImgyIiwgImltcG9ydF9tb21lbnQiLCAibW9tZW50IiwgIm1vbWVudCIsICJzY2hlZHVsZSIsICJpbXBvcnRfb2JzaWRpYW4iLCAiYXBwIiwgInJlc29sdmUiLCAiY2FsbGJhY2siLCAiaW1wb3J0X29ic2lkaWFuIiwgImFwcCIsICJsaW5rIiwgImgiLCAiYXBwIiwgImgiLCAic2NoZWR1bGUiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF92aHRtbCIsICJoIiwgImgiLCAiaW50ZXJwb2xhdGUiLCAidCIsICJjb2xvciIsICJub29wIiwgInVpZCIsICJpZCIsICJpc051bGxPclVuZGVmIiwgInZhbHVlIiwgImlzQXJyYXkiLCAiQXJyYXkiLCAidHlwZSIsICJPYmplY3QiLCAicHJvdG90eXBlIiwgInRvU3RyaW5nIiwgImNhbGwiLCAic2xpY2UiLCAiaXNPYmplY3QiLCAiaXNOdW1iZXJGaW5pdGUiLCAiTnVtYmVyIiwgImlzRmluaXRlIiwgImZpbml0ZU9yRGVmYXVsdCIsICJkZWZhdWx0VmFsdWUiLCAidmFsdWVPckRlZmF1bHQiLCAidG9QZXJjZW50YWdlIiwgImRpbWVuc2lvbiIsICJlbmRzV2l0aCIsICJwYXJzZUZsb2F0IiwgInRvRGltZW5zaW9uIiwgImNhbGxiYWNrIiwgImZuIiwgImFyZ3MiLCAidGhpc0FyZyIsICJhcHBseSIsICJlYWNoIiwgImxvb3BhYmxlIiwgInJldmVyc2UiLCAiaSIsICJsZW4iLCAia2V5cyIsICJsZW5ndGgiLCAiX2VsZW1lbnRzRXF1YWwiLCAiYTAiLCAiYTEiLCAiaWxlbiIsICJ2MCIsICJ2MSIsICJkYXRhc2V0SW5kZXgiLCAiaW5kZXgiLCAiY2xvbmUiLCAic291cmNlIiwgIm1hcCIsICJ0YXJnZXQiLCAiY3JlYXRlIiwgImtsZW4iLCAiayIsICJpc1ZhbGlkS2V5IiwgImtleSIsICJpbmRleE9mIiwgIl9tZXJnZXIiLCAib3B0aW9ucyIsICJ0dmFsIiwgInN2YWwiLCAibWVyZ2UiLCAic291cmNlcyIsICJtZXJnZXIiLCAiY3VycmVudCIsICJtZXJnZUlmIiwgIl9tZXJnZXJJZiIsICJoYXNPd25Qcm9wZXJ0eSIsICJrZXlSZXNvbHZlcnMiLCAidiIsICJ4IiwgIm8iLCAieSIsICJfc3BsaXRLZXkiLCAia2V5IiwgInBhcnRzIiwgInNwbGl0IiwgImtleXMiLCAidG1wIiwgInBhcnQiLCAiZW5kc1dpdGgiLCAic2xpY2UiLCAicHVzaCIsICJfZ2V0S2V5UmVzb2x2ZXIiLCAib2JqIiwgImsiLCAicmVzb2x2ZU9iamVjdEtleSIsICJyZXNvbHZlciIsICJfY2FwaXRhbGl6ZSIsICJzdHIiLCAiY2hhckF0IiwgInRvVXBwZXJDYXNlIiwgImRlZmluZWQiLCAidmFsdWUiLCAiaXNGdW5jdGlvbiIsICJzZXRzRXF1YWwiLCAiYSIsICJiIiwgInNpemUiLCAiaXRlbSIsICJoYXMiLCAiX2lzQ2xpY2tFdmVudCIsICJlIiwgInR5cGUiLCAiUEkiLCAiTWF0aCIsICJUQVUiLCAiUElUQVUiLCAiSU5GSU5JVFkiLCAiTnVtYmVyIiwgIlBPU0lUSVZFX0lORklOSVRZIiwgIlJBRF9QRVJfREVHIiwgIkhBTEZfUEkiLCAiUVVBUlRFUl9QSSIsICJUV09fVEhJUkRTX1BJIiwgImxvZzEwIiwgInNpZ24iLCAiYWxtb3N0RXF1YWxzIiwgImVwc2lsb24iLCAiYWJzIiwgIm5pY2VOdW0iLCAicmFuZ2UiLCAicm91bmRlZFJhbmdlIiwgInJvdW5kIiwgIm5pY2VSYW5nZSIsICJwb3ciLCAiZmxvb3IiLCAiZnJhY3Rpb24iLCAibmljZUZyYWN0aW9uIiwgIl9mYWN0b3JpemUiLCAicmVzdWx0IiwgInNxcnQiLCAiaSIsICJzb3J0IiwgInBvcCIsICJpc051bWJlciIsICJuIiwgImlzTmFOIiwgInBhcnNlRmxvYXQiLCAiaXNGaW5pdGUiLCAiYWxtb3N0V2hvbGUiLCAicm91bmRlZCIsICJfc2V0TWluQW5kTWF4QnlLZXkiLCAiYXJyYXkiLCAidGFyZ2V0IiwgInByb3BlcnR5IiwgImlsZW4iLCAibGVuZ3RoIiwgIm1pbiIsICJtYXgiLCAidG9SYWRpYW5zIiwgImRlZ3JlZXMiLCAidG9EZWdyZWVzIiwgInJhZGlhbnMiLCAiX2RlY2ltYWxQbGFjZXMiLCAiaXNGaW5pdGVOdW1iZXIiLCAicCIsICJnZXRBbmdsZUZyb21Qb2ludCIsICJjZW50cmVQb2ludCIsICJhbmdsZVBvaW50IiwgImRpc3RhbmNlRnJvbVhDZW50ZXIiLCAiZGlzdGFuY2VGcm9tWUNlbnRlciIsICJyYWRpYWxEaXN0YW5jZUZyb21DZW50ZXIiLCAiYW5nbGUiLCAiYXRhbjIiLCAiZGlzdGFuY2UiLCAiZGlzdGFuY2VCZXR3ZWVuUG9pbnRzIiwgInB0MSIsICJwdDIiLCAiX25vcm1hbGl6ZUFuZ2xlIiwgImEiLCAiVEFVIiwgIl9hbmdsZUJldHdlZW4iLCAiYW5nbGUiLCAic3RhcnQiLCAiZW5kIiwgInNhbWVBbmdsZUlzRnVsbENpcmNsZSIsICJzIiwgImUiLCAiYW5nbGVUb1N0YXJ0IiwgImFuZ2xlVG9FbmQiLCAic3RhcnRUb0FuZ2xlIiwgImVuZFRvQW5nbGUiLCAiX2xpbWl0VmFsdWUiLCAidmFsdWUiLCAibWluIiwgIm1heCIsICJNYXRoIiwgIl9pbnQxNlJhbmdlIiwgIl9pc0JldHdlZW4iLCAiZXBzaWxvbiIsICJfbG9va3VwIiwgInRhYmxlIiwgImNtcCIsICJpbmRleCIsICJoaSIsICJsZW5ndGgiLCAibG8iLCAibWlkIiwgIl9sb29rdXBCeUtleSIsICJrZXkiLCAibGFzdCIsICJ0aSIsICJfcmxvb2t1cEJ5S2V5IiwgIl9maWx0ZXJCZXR3ZWVuIiwgInZhbHVlcyIsICJzbGljZSIsICJhcnJheUV2ZW50cyIsICJsaXN0ZW5BcnJheUV2ZW50cyIsICJhcnJheSIsICJsaXN0ZW5lciIsICJfY2hhcnRqcyIsICJsaXN0ZW5lcnMiLCAicHVzaCIsICJPYmplY3QiLCAiZGVmaW5lUHJvcGVydHkiLCAiY29uZmlndXJhYmxlIiwgImVudW1lcmFibGUiLCAiZm9yRWFjaCIsICJtZXRob2QiLCAiX2NhcGl0YWxpemUiLCAiYmFzZSIsICJhcmdzIiwgInJlcyIsICJhcHBseSIsICJvYmplY3QiLCAidW5saXN0ZW5BcnJheUV2ZW50cyIsICJzdHViIiwgImluZGV4T2YiLCAic3BsaWNlIiwgIl9hcnJheVVuaXF1ZSIsICJpdGVtcyIsICJzZXQiLCAiU2V0IiwgInNpemUiLCAiQXJyYXkiLCAiZnJvbSIsICJyZXF1ZXN0QW5pbUZyYW1lIiwgIndpbmRvdyIsICJjYWxsYmFjayIsICJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCAidGhyb3R0bGVkIiwgImZuIiwgInRoaXNBcmciLCAiYXJnc1RvVXNlIiwgInRpY2tpbmciLCAiYXJncyIsICJjYWxsIiwgImFwcGx5IiwgImRlYm91bmNlIiwgImRlbGF5IiwgInRpbWVvdXQiLCAiY2xlYXJUaW1lb3V0IiwgInNldFRpbWVvdXQiLCAiX3RvTGVmdFJpZ2h0Q2VudGVyIiwgImFsaWduIiwgIl9hbGlnblN0YXJ0RW5kIiwgInN0YXJ0IiwgImVuZCIsICJfdGV4dFgiLCAibGVmdCIsICJyaWdodCIsICJydGwiLCAiY2hlY2siLCAiYXRFZGdlIiwgInQiLCAiZWxhc3RpY0luIiwgInMiLCAicCIsICJNYXRoIiwgInBvdyIsICJzaW4iLCAiVEFVIiwgImVsYXN0aWNPdXQiLCAiZWZmZWN0cyIsICJsaW5lYXIiLCAiZWFzZUluUXVhZCIsICJlYXNlT3V0UXVhZCIsICJlYXNlSW5PdXRRdWFkIiwgImVhc2VJbkN1YmljIiwgImVhc2VPdXRDdWJpYyIsICJlYXNlSW5PdXRDdWJpYyIsICJlYXNlSW5RdWFydCIsICJlYXNlT3V0UXVhcnQiLCAiZWFzZUluT3V0UXVhcnQiLCAiZWFzZUluUXVpbnQiLCAiZWFzZU91dFF1aW50IiwgImVhc2VJbk91dFF1aW50IiwgImVhc2VJblNpbmUiLCAiY29zIiwgIkhBTEZfUEkiLCAiZWFzZU91dFNpbmUiLCAiZWFzZUluT3V0U2luZSIsICJQSSIsICJlYXNlSW5FeHBvIiwgImVhc2VPdXRFeHBvIiwgImVhc2VJbk91dEV4cG8iLCAiZWFzZUluQ2lyYyIsICJzcXJ0IiwgImVhc2VPdXRDaXJjIiwgImVhc2VJbk91dENpcmMiLCAiZWFzZUluRWxhc3RpYyIsICJlYXNlT3V0RWxhc3RpYyIsICJlYXNlSW5PdXRFbGFzdGljIiwgImVhc2VJbkJhY2siLCAiZWFzZU91dEJhY2siLCAiZWFzZUluT3V0QmFjayIsICJlYXNlSW5Cb3VuY2UiLCAiZWFzZU91dEJvdW5jZSIsICJtIiwgImQiLCAiZWFzZUluT3V0Qm91bmNlIiwgImlzUGF0dGVybk9yR3JhZGllbnQiLCAidmFsdWUiLCAidHlwZSIsICJ0b1N0cmluZyIsICJjb2xvciIsICJDb2xvciIsICJnZXRIb3ZlckNvbG9yIiwgInNhdHVyYXRlIiwgImRhcmtlbiIsICJoZXhTdHJpbmciLCAibnVtYmVycyIsICJjb2xvcnMiLCAiYXBwbHlBbmltYXRpb25zRGVmYXVsdHMiLCAiZGVmYXVsdHMiLCAic2V0IiwgImRlbGF5IiwgInVuZGVmaW5lZCIsICJkdXJhdGlvbiIsICJlYXNpbmciLCAiZm4iLCAiZnJvbSIsICJsb29wIiwgInRvIiwgImRlc2NyaWJlIiwgIl9mYWxsYmFjayIsICJfaW5kZXhhYmxlIiwgIl9zY3JpcHRhYmxlIiwgIm5hbWUiLCAicHJvcGVydGllcyIsICJhY3RpdmUiLCAiYW5pbWF0aW9uIiwgInJlc2l6ZSIsICJzaG93IiwgImFuaW1hdGlvbnMiLCAidmlzaWJsZSIsICJoaWRlIiwgInYiLCAiYXBwbHlMYXlvdXRzRGVmYXVsdHMiLCAiYXV0b1BhZGRpbmciLCAicGFkZGluZyIsICJ0b3AiLCAicmlnaHQiLCAiYm90dG9tIiwgImxlZnQiLCAiaW50bENhY2hlIiwgIk1hcCIsICJnZXROdW1iZXJGb3JtYXQiLCAibG9jYWxlIiwgIm9wdGlvbnMiLCAiY2FjaGVLZXkiLCAiSlNPTiIsICJzdHJpbmdpZnkiLCAiZm9ybWF0dGVyIiwgImdldCIsICJJbnRsIiwgIk51bWJlckZvcm1hdCIsICJmb3JtYXROdW1iZXIiLCAibnVtIiwgImZvcm1hdCIsICJmb3JtYXR0ZXJzIiwgInZhbHVlcyIsICJpc0FycmF5IiwgIm51bWVyaWMiLCAidGlja1ZhbHVlIiwgImluZGV4IiwgInRpY2tzIiwgImNoYXJ0IiwgIm5vdGF0aW9uIiwgImRlbHRhIiwgImxlbmd0aCIsICJtYXhUaWNrIiwgIm1heCIsICJhYnMiLCAiY2FsY3VsYXRlRGVsdGEiLCAibG9nRGVsdGEiLCAibG9nMTAiLCAibnVtRGVjaW1hbCIsICJpc05hTiIsICJtaW4iLCAiZmxvb3IiLCAibWluaW11bUZyYWN0aW9uRGlnaXRzIiwgIm1heGltdW1GcmFjdGlvbkRpZ2l0cyIsICJPYmplY3QiLCAiYXNzaWduIiwgImxvZ2FyaXRobWljIiwgInJlbWFpbiIsICJzaWduaWZpY2FuZCIsICJpbmNsdWRlcyIsICJjYWxsIiwgImFwcGx5U2NhbGVEZWZhdWx0cyIsICJkaXNwbGF5IiwgIm9mZnNldCIsICJyZXZlcnNlIiwgImJlZ2luQXRaZXJvIiwgImJvdW5kcyIsICJjbGlwIiwgImdyYWNlIiwgImdyaWQiLCAibGluZVdpZHRoIiwgImRyYXdPbkNoYXJ0QXJlYSIsICJkcmF3VGlja3MiLCAidGlja0xlbmd0aCIsICJ0aWNrV2lkdGgiLCAiX2N0eCIsICJ0aWNrQ29sb3IiLCAiYm9yZGVyIiwgImRhc2giLCAiZGFzaE9mZnNldCIsICJ3aWR0aCIsICJ0aXRsZSIsICJ0ZXh0IiwgIm1pblJvdGF0aW9uIiwgIm1heFJvdGF0aW9uIiwgIm1pcnJvciIsICJ0ZXh0U3Ryb2tlV2lkdGgiLCAidGV4dFN0cm9rZUNvbG9yIiwgImF1dG9Ta2lwIiwgImF1dG9Ta2lwUGFkZGluZyIsICJsYWJlbE9mZnNldCIsICJjYWxsYmFjayIsICJUaWNrcyIsICJtaW5vciIsICJtYWpvciIsICJhbGlnbiIsICJjcm9zc0FsaWduIiwgInNob3dMYWJlbEJhY2tkcm9wIiwgImJhY2tkcm9wQ29sb3IiLCAiYmFja2Ryb3BQYWRkaW5nIiwgInJvdXRlIiwgInN0YXJ0c1dpdGgiLCAib3ZlcnJpZGVzIiwgImNyZWF0ZSIsICJkZXNjcmlwdG9ycyIsICJnZXRTY29wZSIsICJub2RlIiwgImtleSIsICJrZXlzIiwgInNwbGl0IiwgImkiLCAibiIsICJrIiwgInJvb3QiLCAic2NvcGUiLCAibWVyZ2UiLCAiRGVmYXVsdHMiLCAiY29uc3RydWN0b3IiLCAiX2Rlc2NyaXB0b3JzIiwgIl9hcHBsaWVycyIsICJiYWNrZ3JvdW5kQ29sb3IiLCAiYm9yZGVyQ29sb3IiLCAiZGF0YXNldHMiLCAiZGV2aWNlUGl4ZWxSYXRpbyIsICJjb250ZXh0IiwgInBsYXRmb3JtIiwgImdldERldmljZVBpeGVsUmF0aW8iLCAiZWxlbWVudHMiLCAiZXZlbnRzIiwgImZvbnQiLCAiZmFtaWx5IiwgInNpemUiLCAic3R5bGUiLCAibGluZUhlaWdodCIsICJ3ZWlnaHQiLCAiaG92ZXIiLCAiaG92ZXJCYWNrZ3JvdW5kQ29sb3IiLCAiY3R4IiwgImhvdmVyQm9yZGVyQ29sb3IiLCAiaG92ZXJDb2xvciIsICJpbmRleEF4aXMiLCAiaW50ZXJhY3Rpb24iLCAibW9kZSIsICJpbnRlcnNlY3QiLCAiaW5jbHVkZUludmlzaWJsZSIsICJtYWludGFpbkFzcGVjdFJhdGlvIiwgIm9uSG92ZXIiLCAib25DbGljayIsICJwYXJzaW5nIiwgInBsdWdpbnMiLCAicmVzcG9uc2l2ZSIsICJzY2FsZSIsICJzY2FsZXMiLCAic2hvd0xpbmUiLCAiZHJhd0FjdGl2ZUVsZW1lbnRzT25Ub3AiLCAiYXBwbHkiLCAib3ZlcnJpZGUiLCAidGFyZ2V0U2NvcGUiLCAidGFyZ2V0TmFtZSIsICJzY29wZU9iamVjdCIsICJ0YXJnZXRTY29wZU9iamVjdCIsICJwcml2YXRlTmFtZSIsICJkZWZpbmVQcm9wZXJ0aWVzIiwgIndyaXRhYmxlIiwgImVudW1lcmFibGUiLCAibG9jYWwiLCAidGFyZ2V0IiwgImlzT2JqZWN0IiwgInZhbHVlT3JEZWZhdWx0IiwgImFwcGxpZXJzIiwgImZvckVhY2giLCAidG9Gb250U3RyaW5nIiwgImlzTnVsbE9yVW5kZWYiLCAiX21lYXN1cmVUZXh0IiwgImRhdGEiLCAiZ2MiLCAibG9uZ2VzdCIsICJzdHJpbmciLCAidGV4dFdpZHRoIiwgIm1lYXN1cmVUZXh0IiwgInB1c2giLCAiX2xvbmdlc3RUZXh0IiwgImFycmF5T2ZUaGluZ3MiLCAiY2FjaGUiLCAiZ2FyYmFnZUNvbGxlY3QiLCAic2F2ZSIsICJpbGVuIiwgImoiLCAiamxlbiIsICJ0aGluZyIsICJuZXN0ZWRUaGluZyIsICJyZXN0b3JlIiwgImdjTGVuIiwgInNwbGljZSIsICJfYWxpZ25QaXhlbCIsICJwaXhlbCIsICJjdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyIsICJoYWxmV2lkdGgiLCAicm91bmQiLCAiY2xlYXJDYW52YXMiLCAiY2FudmFzIiwgImdldENvbnRleHQiLCAicmVzZXRUcmFuc2Zvcm0iLCAiY2xlYXJSZWN0IiwgImhlaWdodCIsICJkcmF3UG9pbnQiLCAieCIsICJ5IiwgImRyYXdQb2ludExlZ2VuZCIsICJ3IiwgInhPZmZzZXQiLCAieU9mZnNldCIsICJjb3JuZXJSYWRpdXMiLCAieE9mZnNldFciLCAieU9mZnNldFciLCAicG9pbnRTdHlsZSIsICJyb3RhdGlvbiIsICJyYWRpdXMiLCAicmFkIiwgIlJBRF9QRVJfREVHIiwgInRyYW5zbGF0ZSIsICJyb3RhdGUiLCAiZHJhd0ltYWdlIiwgImJlZ2luUGF0aCIsICJlbGxpcHNlIiwgImFyYyIsICJjbG9zZVBhdGgiLCAibW92ZVRvIiwgIlRXT19USElSRFNfUEkiLCAibGluZVRvIiwgIlFVQVJURVJfUEkiLCAiU1FSVDFfMiIsICJyZWN0IiwgImZpbGwiLCAiYm9yZGVyV2lkdGgiLCAic3Ryb2tlIiwgIl9pc1BvaW50SW5BcmVhIiwgInBvaW50IiwgImFyZWEiLCAibWFyZ2luIiwgImNsaXBBcmVhIiwgInVuY2xpcEFyZWEiLCAic2V0UmVuZGVyT3B0cyIsICJjdHgiLCAib3B0cyIsICJ0cmFuc2xhdGlvbiIsICJ0cmFuc2xhdGUiLCAiaXNOdWxsT3JVbmRlZiIsICJyb3RhdGlvbiIsICJyb3RhdGUiLCAiY29sb3IiLCAiZmlsbFN0eWxlIiwgInRleHRBbGlnbiIsICJ0ZXh0QmFzZWxpbmUiLCAiZGVjb3JhdGVUZXh0IiwgIngiLCAieSIsICJsaW5lIiwgInN0cmlrZXRocm91Z2giLCAidW5kZXJsaW5lIiwgIm1ldHJpY3MiLCAibWVhc3VyZVRleHQiLCAibGVmdCIsICJhY3R1YWxCb3VuZGluZ0JveExlZnQiLCAicmlnaHQiLCAiYWN0dWFsQm91bmRpbmdCb3hSaWdodCIsICJ0b3AiLCAiYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQiLCAiYm90dG9tIiwgImFjdHVhbEJvdW5kaW5nQm94RGVzY2VudCIsICJ5RGVjb3JhdGlvbiIsICJzdHJva2VTdHlsZSIsICJiZWdpblBhdGgiLCAibGluZVdpZHRoIiwgImRlY29yYXRpb25XaWR0aCIsICJtb3ZlVG8iLCAibGluZVRvIiwgInN0cm9rZSIsICJkcmF3QmFja2Ryb3AiLCAib2xkQ29sb3IiLCAiZmlsbFJlY3QiLCAid2lkdGgiLCAiaGVpZ2h0IiwgInJlbmRlclRleHQiLCAidGV4dCIsICJmb250IiwgImxpbmVzIiwgImlzQXJyYXkiLCAic3Ryb2tlV2lkdGgiLCAic3Ryb2tlQ29sb3IiLCAiaSIsICJzYXZlIiwgInN0cmluZyIsICJsZW5ndGgiLCAiYmFja2Ryb3AiLCAic3Ryb2tlVGV4dCIsICJtYXhXaWR0aCIsICJmaWxsVGV4dCIsICJOdW1iZXIiLCAibGluZUhlaWdodCIsICJyZXN0b3JlIiwgImFkZFJvdW5kZWRSZWN0UGF0aCIsICJyZWN0IiwgInciLCAiaCIsICJyYWRpdXMiLCAiYXJjIiwgInRvcExlZnQiLCAiUEkiLCAiYm90dG9tTGVmdCIsICJIQUxGX1BJIiwgImJvdHRvbVJpZ2h0IiwgInRvcFJpZ2h0IiwgIkxJTkVfSEVJR0hUIiwgIkZPTlRfU1RZTEUiLCAidG9MaW5lSGVpZ2h0IiwgInZhbHVlIiwgInNpemUiLCAibWF0Y2hlcyIsICJtYXRjaCIsICJudW1iZXJPclplcm8iLCAidiIsICJfcmVhZFZhbHVlVG9Qcm9wcyIsICJwcm9wcyIsICJyZXQiLCAib2JqUHJvcHMiLCAiaXNPYmplY3QiLCAia2V5cyIsICJPYmplY3QiLCAicmVhZCIsICJwcm9wIiwgInZhbHVlT3JEZWZhdWx0IiwgInRvVFJCTCIsICJ0b1RSQkxDb3JuZXJzIiwgInRvUGFkZGluZyIsICJvYmoiLCAidG9Gb250IiwgIm9wdGlvbnMiLCAiZmFsbGJhY2siLCAiZGVmYXVsdHMiLCAicGFyc2VJbnQiLCAic3R5bGUiLCAiY29uc29sZSIsICJ3YXJuIiwgInVuZGVmaW5lZCIsICJmYW1pbHkiLCAid2VpZ2h0IiwgInRvRm9udFN0cmluZyIsICJyZXNvbHZlIiwgImlucHV0cyIsICJjb250ZXh0IiwgImluZGV4IiwgImluZm8iLCAiY2FjaGVhYmxlIiwgImlsZW4iLCAiX2FkZEdyYWNlIiwgIm1pbm1heCIsICJncmFjZSIsICJiZWdpbkF0WmVybyIsICJtaW4iLCAibWF4IiwgImNoYW5nZSIsICJ0b0RpbWVuc2lvbiIsICJrZWVwWmVybyIsICJhZGQiLCAiTWF0aCIsICJhYnMiLCAiY3JlYXRlQ29udGV4dCIsICJwYXJlbnRDb250ZXh0IiwgImFzc2lnbiIsICJjcmVhdGUiLCAiX2NyZWF0ZVJlc29sdmVyIiwgInNjb3BlcyIsICJwcmVmaXhlcyIsICJyb290U2NvcGVzIiwgImdldFRhcmdldCIsICJmaW5hbFJvb3RTY29wZXMiLCAiX3Jlc29sdmUiLCAiY2FjaGUiLCAiU3ltYm9sIiwgInRvU3RyaW5nVGFnIiwgIl9jYWNoZWFibGUiLCAiX3Njb3BlcyIsICJfcm9vdFNjb3BlcyIsICJfZmFsbGJhY2siLCAiX2dldFRhcmdldCIsICJvdmVycmlkZSIsICJzY29wZSIsICJQcm94eSIsICJkZWxldGVQcm9wZXJ0eSIsICJ0YXJnZXQiLCAiX2tleXMiLCAiZ2V0IiwgIl9jYWNoZWQiLCAiX3Jlc29sdmVXaXRoUHJlZml4ZXMiLCAiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwgIlJlZmxlY3QiLCAiZ2V0UHJvdG90eXBlT2YiLCAiaGFzIiwgImdldEtleXNGcm9tQWxsU2NvcGVzIiwgImluY2x1ZGVzIiwgIm93bktleXMiLCAic2V0IiwgInN0b3JhZ2UiLCAiX3N0b3JhZ2UiLCAiX2F0dGFjaENvbnRleHQiLCAicHJveHkiLCAic3ViUHJveHkiLCAiZGVzY3JpcHRvckRlZmF1bHRzIiwgIl9wcm94eSIsICJfY29udGV4dCIsICJfc3ViUHJveHkiLCAiX3N0YWNrIiwgIlNldCIsICJfZGVzY3JpcHRvcnMiLCAic2V0Q29udGV4dCIsICJyZWNlaXZlciIsICJfcmVzb2x2ZVdpdGhDb250ZXh0IiwgImFsbEtleXMiLCAiZW51bWVyYWJsZSIsICJjb25maWd1cmFibGUiLCAic2NyaXB0YWJsZSIsICJpbmRleGFibGUiLCAiX3NjcmlwdGFibGUiLCAiX2luZGV4YWJsZSIsICJfYWxsS2V5cyIsICJpc1NjcmlwdGFibGUiLCAiaXNGdW5jdGlvbiIsICJpc0luZGV4YWJsZSIsICJyZWFkS2V5IiwgInByZWZpeCIsICJuYW1lIiwgIl9jYXBpdGFsaXplIiwgIm5lZWRzU3ViUmVzb2x2ZXIiLCAiY29uc3RydWN0b3IiLCAicHJvdG90eXBlIiwgImhhc093blByb3BlcnR5IiwgImNhbGwiLCAiZGVzY3JpcHRvcnMiLCAiX3Jlc29sdmVTY3JpcHRhYmxlIiwgIl9yZXNvbHZlQXJyYXkiLCAiZ2V0VmFsdWUiLCAiRXJyb3IiLCAiQXJyYXkiLCAiZnJvbSIsICJqb2luIiwgImRlbGV0ZSIsICJjcmVhdGVTdWJSZXNvbHZlciIsICJhcnIiLCAiZmlsdGVyIiwgInMiLCAiaXRlbSIsICJyZXNvbHZlciIsICJwdXNoIiwgInJlc29sdmVGYWxsYmFjayIsICJnZXRTY29wZSIsICJrZXkiLCAicGFyZW50IiwgInJlc29sdmVPYmplY3RLZXkiLCAiYWRkU2NvcGVzIiwgInBhcmVudFNjb3BlcyIsICJwYXJlbnRGYWxsYmFjayIsICJhbGxTY29wZXMiLCAiYWRkU2NvcGVzRnJvbUtleSIsICJzdWJHZXRUYXJnZXQiLCAicmVzb2x2ZUtleXNGcm9tQWxsU2NvcGVzIiwgImsiLCAic3RhcnRzV2l0aCIsICJFUFNJTE9OIiwgIk51bWJlciIsICJfaXNEb21TdXBwb3J0ZWQiLCAid2luZG93IiwgImRvY3VtZW50IiwgIl9nZXRQYXJlbnROb2RlIiwgImRvbU5vZGUiLCAicGFyZW50IiwgInBhcmVudE5vZGUiLCAidG9TdHJpbmciLCAiaG9zdCIsICJwYXJzZU1heFN0eWxlIiwgInN0eWxlVmFsdWUiLCAibm9kZSIsICJwYXJlbnRQcm9wZXJ0eSIsICJ2YWx1ZUluUGl4ZWxzIiwgInBhcnNlSW50IiwgImluZGV4T2YiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJlbGVtZW50IiwgIm93bmVyRG9jdW1lbnQiLCAiZGVmYXVsdFZpZXciLCAiZ2V0U3R5bGUiLCAiZWwiLCAicHJvcGVydHkiLCAiZ2V0UHJvcGVydHlWYWx1ZSIsICJwb3NpdGlvbnMiLCAiZ2V0UG9zaXRpb25lZFN0eWxlIiwgInN0eWxlcyIsICJzdHlsZSIsICJzdWZmaXgiLCAicmVzdWx0IiwgImkiLCAicG9zIiwgInBhcnNlRmxvYXQiLCAid2lkdGgiLCAibGVmdCIsICJyaWdodCIsICJoZWlnaHQiLCAidG9wIiwgImJvdHRvbSIsICJ1c2VPZmZzZXRQb3MiLCAieCIsICJ5IiwgInRhcmdldCIsICJzaGFkb3dSb290IiwgImdldENhbnZhc1Bvc2l0aW9uIiwgImUiLCAiY2FudmFzIiwgInRvdWNoZXMiLCAic291cmNlIiwgImxlbmd0aCIsICJvZmZzZXRYIiwgIm9mZnNldFkiLCAiYm94IiwgInJlY3QiLCAiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwgImNsaWVudFgiLCAiY2xpZW50WSIsICJnZXRSZWxhdGl2ZVBvc2l0aW9uIiwgImV2ZW50IiwgImNoYXJ0IiwgImN1cnJlbnREZXZpY2VQaXhlbFJhdGlvIiwgImJvcmRlckJveCIsICJib3hTaXppbmciLCAicGFkZGluZ3MiLCAiYm9yZGVycyIsICJ4T2Zmc2V0IiwgInlPZmZzZXQiLCAiTWF0aCIsICJyb3VuZCIsICJnZXRDb250YWluZXJTaXplIiwgIm1heFdpZHRoIiwgIm1heEhlaWdodCIsICJ1bmRlZmluZWQiLCAiY29udGFpbmVyIiwgImNsaWVudFdpZHRoIiwgImNsaWVudEhlaWdodCIsICJjb250YWluZXJTdHlsZSIsICJjb250YWluZXJCb3JkZXIiLCAiY29udGFpbmVyUGFkZGluZyIsICJJTkZJTklUWSIsICJyb3VuZDEiLCAidiIsICJnZXRNYXhpbXVtU2l6ZSIsICJiYldpZHRoIiwgImJiSGVpZ2h0IiwgImFzcGVjdFJhdGlvIiwgIm1hcmdpbnMiLCAiY29udGFpbmVyU2l6ZSIsICJtYXgiLCAibWluIiwgIm1haW50YWluSGVpZ2h0IiwgImZsb29yIiwgInJldGluYVNjYWxlIiwgImZvcmNlUmF0aW8iLCAiZm9yY2VTdHlsZSIsICJwaXhlbFJhdGlvIiwgImRldmljZUhlaWdodCIsICJkZXZpY2VXaWR0aCIsICJjdHgiLCAic2V0VHJhbnNmb3JtIiwgInN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnMiLCAicGFzc2l2ZVN1cHBvcnRlZCIsICJvcHRpb25zIiwgInBhc3NpdmUiLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJyZW1vdmVFdmVudExpc3RlbmVyIiwgInJlYWRVc2VkU2l6ZSIsICJ2YWx1ZSIsICJtYXRjaGVzIiwgIm1hdGNoIiwgImdldFJpZ2h0VG9MZWZ0QWRhcHRlciIsICJyZWN0WCIsICJ3aWR0aCIsICJ4IiwgInNldFdpZHRoIiwgInciLCAidGV4dEFsaWduIiwgImFsaWduIiwgInhQbHVzIiwgInZhbHVlIiwgImxlZnRGb3JMdHIiLCAiaXRlbVdpZHRoIiwgImdldExlZnRUb1JpZ2h0QWRhcHRlciIsICJfaXRlbVdpZHRoIiwgImdldFJ0bEFkYXB0ZXIiLCAicnRsIiwgIm92ZXJyaWRlVGV4dERpcmVjdGlvbiIsICJjdHgiLCAiZGlyZWN0aW9uIiwgInN0eWxlIiwgIm9yaWdpbmFsIiwgImNhbnZhcyIsICJnZXRQcm9wZXJ0eVZhbHVlIiwgImdldFByb3BlcnR5UHJpb3JpdHkiLCAic2V0UHJvcGVydHkiLCAicHJldlRleHREaXJlY3Rpb24iLCAicmVzdG9yZVRleHREaXJlY3Rpb24iLCAidW5kZWZpbmVkIiwgIkFuaW1hdG9yIiwgImNvbnN0cnVjdG9yIiwgIl9yZXF1ZXN0IiwgIl9jaGFydHMiLCAiTWFwIiwgIl9ydW5uaW5nIiwgIl9sYXN0RGF0ZSIsICJ1bmRlZmluZWQiLCAiX25vdGlmeSIsICJjaGFydCIsICJhbmltcyIsICJkYXRlIiwgInR5cGUiLCAiY2FsbGJhY2tzIiwgImxpc3RlbmVycyIsICJudW1TdGVwcyIsICJkdXJhdGlvbiIsICJmb3JFYWNoIiwgImZuIiwgImluaXRpYWwiLCAiY3VycmVudFN0ZXAiLCAiTWF0aCIsICJtaW4iLCAic3RhcnQiLCAiX3JlZnJlc2giLCAicmVxdWVzdEFuaW1GcmFtZSIsICJjYWxsIiwgIndpbmRvdyIsICJfdXBkYXRlIiwgIkRhdGUiLCAibm93IiwgInJlbWFpbmluZyIsICJydW5uaW5nIiwgIml0ZW1zIiwgImxlbmd0aCIsICJpIiwgImRyYXciLCAiaXRlbSIsICJfYWN0aXZlIiwgIl90b3RhbCIsICJ0aWNrIiwgInBvcCIsICJfZ2V0QW5pbXMiLCAiY2hhcnRzIiwgImdldCIsICJjb21wbGV0ZSIsICJwcm9ncmVzcyIsICJzZXQiLCAibGlzdGVuIiwgImV2ZW50IiwgImNiIiwgInB1c2giLCAiYWRkIiwgImhhcyIsICJyZWR1Y2UiLCAiYWNjIiwgImN1ciIsICJtYXgiLCAiX2R1cmF0aW9uIiwgInN0b3AiLCAiY2FuY2VsIiwgInJlbW92ZSIsICJkZWxldGUiLCAidHJhbnNwYXJlbnQiLCAiaW50ZXJwb2xhdG9ycyIsICJib29sZWFuIiwgImZyb20iLCAidG8iLCAiZmFjdG9yIiwgImNvbG9yIiwgImMwIiwgImhlbHBlcnNDb2xvciIsICJjMSIsICJ2YWxpZCIsICJtaXgiLCAiaGV4U3RyaW5nIiwgIm51bWJlciIsICJBbmltYXRpb24iLCAiY2ZnIiwgInRhcmdldCIsICJwcm9wIiwgImN1cnJlbnRWYWx1ZSIsICJyZXNvbHZlIiwgIl9mbiIsICJfZWFzaW5nIiwgImVmZmVjdHMiLCAiZWFzaW5nIiwgImxpbmVhciIsICJfc3RhcnQiLCAiZmxvb3IiLCAiZGVsYXkiLCAiX2xvb3AiLCAibG9vcCIsICJfdGFyZ2V0IiwgIl9wcm9wIiwgIl9mcm9tIiwgIl90byIsICJfcHJvbWlzZXMiLCAiYWN0aXZlIiwgInVwZGF0ZSIsICJlbGFwc2VkIiwgInJlbWFpbiIsICJ3YWl0IiwgInByb21pc2VzIiwgIlByb21pc2UiLCAicmVzIiwgInJlaiIsICJyZXNvbHZlZCIsICJtZXRob2QiLCAiQW5pbWF0aW9ucyIsICJjb25maWciLCAiX2NoYXJ0IiwgIl9wcm9wZXJ0aWVzIiwgImNvbmZpZ3VyZSIsICJpc09iamVjdCIsICJhbmltYXRpb25PcHRpb25zIiwgIk9iamVjdCIsICJrZXlzIiwgImRlZmF1bHRzIiwgImFuaW1hdGlvbiIsICJhbmltYXRlZFByb3BzIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAia2V5IiwgIm9wdGlvbiIsICJpc0FycmF5IiwgInByb3BlcnRpZXMiLCAiX2FuaW1hdGVPcHRpb25zIiwgInZhbHVlcyIsICJuZXdPcHRpb25zIiwgIm9wdGlvbnMiLCAicmVzb2x2ZVRhcmdldE9wdGlvbnMiLCAiYW5pbWF0aW9ucyIsICJfY3JlYXRlQW5pbWF0aW9ucyIsICIkc2hhcmVkIiwgImF3YWl0QWxsIiwgIiRhbmltYXRpb25zIiwgInRoZW4iLCAicHJvcHMiLCAiY2hhckF0IiwgInZhbHVlIiwgInNpemUiLCAiYXNzaWduIiwgImFuaW1hdG9yIiwgImFuaW0iLCAiYWxsIiwgInNjYWxlQ2xpcCIsICJzY2FsZSIsICJhbGxvd2VkT3ZlcmZsb3ciLCAib3B0cyIsICJyZXZlcnNlIiwgImVuZCIsICJkZWZhdWx0Q2xpcCIsICJ4U2NhbGUiLCAieVNjYWxlIiwgIngiLCAieSIsICJ0b3AiLCAicmlnaHQiLCAiYm90dG9tIiwgImxlZnQiLCAidG9DbGlwIiwgInQiLCAiciIsICJiIiwgImwiLCAiZGlzYWJsZWQiLCAiZ2V0U29ydGVkRGF0YXNldEluZGljZXMiLCAiZmlsdGVyVmlzaWJsZSIsICJtZXRhc2V0cyIsICJfZ2V0U29ydGVkRGF0YXNldE1ldGFzIiwgImlsZW4iLCAiaW5kZXgiLCAiYXBwbHlTdGFjayIsICJzdGFjayIsICJkc0luZGV4IiwgInNpbmdsZU1vZGUiLCAibW9kZSIsICJkYXRhc2V0SW5kZXgiLCAib3RoZXJWYWx1ZSIsICJpc0Zpbml0ZSIsICJzaWduIiwgImNvbnZlcnRPYmplY3REYXRhVG9BcnJheSIsICJkYXRhIiwgImFkYXRhIiwgIkFycmF5IiwgImlzU3RhY2tlZCIsICJtZXRhIiwgInN0YWNrZWQiLCAiZ2V0U3RhY2tLZXkiLCAiaW5kZXhTY2FsZSIsICJ2YWx1ZVNjYWxlIiwgImlkIiwgImdldFVzZXJCb3VuZHMiLCAibWluRGVmaW5lZCIsICJtYXhEZWZpbmVkIiwgIk51bWJlciIsICJORUdBVElWRV9JTkZJTklUWSIsICJQT1NJVElWRV9JTkZJTklUWSIsICJnZXRPckNyZWF0ZVN0YWNrIiwgInN0YWNrcyIsICJzdGFja0tleSIsICJpbmRleFZhbHVlIiwgInN1YlN0YWNrIiwgImdldExhc3RJbmRleEluU3RhY2siLCAidlNjYWxlIiwgInBvc2l0aXZlIiwgImdldE1hdGNoaW5nVmlzaWJsZU1ldGFzIiwgInVwZGF0ZVN0YWNrcyIsICJjb250cm9sbGVyIiwgInBhcnNlZCIsICJfY2FjaGVkTWV0YSIsICJfc3RhY2tzIiwgImlTY2FsZSIsICJpQXhpcyIsICJheGlzIiwgInZBeGlzIiwgIml0ZW1TdGFja3MiLCAiX3RvcCIsICJfYm90dG9tIiwgInZpc3VhbFZhbHVlcyIsICJfdmlzdWFsVmFsdWVzIiwgImdldEZpcnN0U2NhbGVJZCIsICJzY2FsZXMiLCAiZmlsdGVyIiwgInNoaWZ0IiwgImNyZWF0ZURhdGFzZXRDb250ZXh0IiwgInBhcmVudCIsICJjcmVhdGVDb250ZXh0IiwgImRhdGFzZXQiLCAiY3JlYXRlRGF0YUNvbnRleHQiLCAiZWxlbWVudCIsICJkYXRhSW5kZXgiLCAicmF3IiwgImNsZWFyU3RhY2tzIiwgIl9wYXJzZWQiLCAiaXNEaXJlY3RVcGRhdGVNb2RlIiwgImNsb25lSWZOb3RTaGFyZWQiLCAiY2FjaGVkIiwgInNoYXJlZCIsICJjcmVhdGVTdGFjayIsICJjYW5TdGFjayIsICJoaWRkZW4iLCAiX3N0YWNrZWQiLCAiRGF0YXNldENvbnRyb2xsZXIiLCAiX2N0eCIsICJjdHgiLCAiX2NhY2hlZERhdGFPcHRzIiwgImdldE1ldGEiLCAiX3R5cGUiLCAiX3BhcnNpbmciLCAiX2RhdGEiLCAiX29iamVjdERhdGEiLCAiX3NoYXJlZE9wdGlvbnMiLCAiX2RyYXdTdGFydCIsICJfZHJhd0NvdW50IiwgImVuYWJsZU9wdGlvblNoYXJpbmciLCAic3VwcG9ydHNEZWNpbWF0aW9uIiwgIiRjb250ZXh0IiwgIl9zeW5jTGlzdCIsICJkYXRhc2V0RWxlbWVudFR5cGUiLCAiZGF0YUVsZW1lbnRUeXBlIiwgImluaXRpYWxpemUiLCAibGlua1NjYWxlcyIsICJhZGRFbGVtZW50cyIsICJmaWxsIiwgImlzUGx1Z2luRW5hYmxlZCIsICJjb25zb2xlIiwgIndhcm4iLCAidXBkYXRlSW5kZXgiLCAiZ2V0RGF0YXNldCIsICJjaG9vc2VJZCIsICJ4aWQiLCAieEF4aXNJRCIsICJ2YWx1ZU9yRGVmYXVsdCIsICJ5aWQiLCAieUF4aXNJRCIsICJyaWQiLCAickF4aXNJRCIsICJpbmRleEF4aXMiLCAiaWlkIiwgImlBeGlzSUQiLCAidmlkIiwgInZBeGlzSUQiLCAiZ2V0U2NhbGVGb3JJZCIsICJyU2NhbGUiLCAiZGF0YXNldHMiLCAiZ2V0RGF0YXNldE1ldGEiLCAic2NhbGVJRCIsICJfZ2V0T3RoZXJTY2FsZSIsICJyZXNldCIsICJfZGVzdHJveSIsICJ1bmxpc3RlbkFycmF5RXZlbnRzIiwgIl9kYXRhQ2hlY2siLCAiaXNFeHRlbnNpYmxlIiwgImxpc3RlbkFycmF5RXZlbnRzIiwgImJ1aWxkT3JVcGRhdGVFbGVtZW50cyIsICJyZXNldE5ld0VsZW1lbnRzIiwgInN0YWNrQ2hhbmdlZCIsICJvbGRTdGFja2VkIiwgIl9yZXN5bmNFbGVtZW50cyIsICJzY29wZUtleXMiLCAiZGF0YXNldFNjb3BlS2V5cyIsICJzY29wZXMiLCAiZ2V0T3B0aW9uU2NvcGVzIiwgImNyZWF0ZVJlc29sdmVyIiwgImdldENvbnRleHQiLCAicGFyc2luZyIsICJwYXJzZSIsICJjb3VudCIsICJzb3J0ZWQiLCAiX3NvcnRlZCIsICJwcmV2IiwgInBhcnNlQXJyYXlEYXRhIiwgInBhcnNlT2JqZWN0RGF0YSIsICJwYXJzZVByaW1pdGl2ZURhdGEiLCAiaXNOb3RJbk9yZGVyQ29tcGFyZWRUb1ByZXYiLCAibGFiZWxzIiwgImdldExhYmVscyIsICJzaW5nbGVTY2FsZSIsICJ4QXhpc0tleSIsICJ5QXhpc0tleSIsICJyZXNvbHZlT2JqZWN0S2V5IiwgImdldFBhcnNlZCIsICJnZXREYXRhRWxlbWVudCIsICJ1cGRhdGVSYW5nZUZyb21QYXJzZWQiLCAicmFuZ2UiLCAicGFyc2VkVmFsdWUiLCAiTmFOIiwgImdldE1pbk1heCIsICJvdGhlclNjYWxlIiwgIm90aGVyTWluIiwgIm90aGVyTWF4IiwgIl9za2lwIiwgImdldEFsbFBhcnNlZFZhbHVlcyIsICJnZXRNYXhPdmVyZmxvdyIsICJnZXRMYWJlbEFuZFZhbHVlIiwgImxhYmVsIiwgImdldExhYmVsRm9yVmFsdWUiLCAiX2NsaXAiLCAiY2xpcCIsICJlbGVtZW50cyIsICJhcmVhIiwgImNoYXJ0QXJlYSIsICJkcmF3QWN0aXZlRWxlbWVudHNPblRvcCIsICJnZXRTdHlsZSIsICJyZXNvbHZlRGF0YXNldEVsZW1lbnRPcHRpb25zIiwgInJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMiLCAiY29udGV4dCIsICJfcmVzb2x2ZUVsZW1lbnRPcHRpb25zIiwgImVsZW1lbnRUeXBlIiwgImNhY2hlIiwgImNhY2hlS2V5IiwgInNoYXJpbmciLCAiZGVmaW5lZCIsICJkYXRhc2V0RWxlbWVudFNjb3BlS2V5cyIsICJwcmVmaXhlcyIsICJuYW1lcyIsICJyZXNvbHZlTmFtZWRPcHRpb25zIiwgImZyZWV6ZSIsICJfcmVzb2x2ZUFuaW1hdGlvbnMiLCAidHJhbnNpdGlvbiIsICJkYXRhc2V0QW5pbWF0aW9uU2NvcGVLZXlzIiwgIl9jYWNoZWFibGUiLCAiZ2V0U2hhcmVkT3B0aW9ucyIsICJpbmNsdWRlT3B0aW9ucyIsICJzaGFyZWRPcHRpb25zIiwgIl9hbmltYXRpb25zRGlzYWJsZWQiLCAiX2dldFNoYXJlZE9wdGlvbnMiLCAiZmlyc3RPcHRzIiwgInByZXZpb3VzbHlTaGFyZWRPcHRpb25zIiwgInVwZGF0ZVNoYXJlZE9wdGlvbnMiLCAidXBkYXRlRWxlbWVudCIsICJfc2V0U3R5bGUiLCAicmVtb3ZlSG92ZXJTdHlsZSIsICJzZXRIb3ZlclN0eWxlIiwgIl9yZW1vdmVEYXRhc2V0SG92ZXJTdHlsZSIsICJfc2V0RGF0YXNldEhvdmVyU3R5bGUiLCAiYXJnMSIsICJhcmcyIiwgIm51bU1ldGEiLCAibnVtRGF0YSIsICJfaW5zZXJ0RWxlbWVudHMiLCAiX3JlbW92ZUVsZW1lbnRzIiwgIm1vdmUiLCAiYXJyIiwgInVwZGF0ZUVsZW1lbnRzIiwgInJlbW92ZWQiLCAic3BsaWNlIiwgIl9zeW5jIiwgImFyZ3MiLCAiX2RhdGFDaGFuZ2VzIiwgIl9vbkRhdGFQdXNoIiwgImFyZ3VtZW50cyIsICJfb25EYXRhUG9wIiwgIl9vbkRhdGFTaGlmdCIsICJfb25EYXRhU3BsaWNlIiwgIm5ld0NvdW50IiwgIl9vbkRhdGFVbnNoaWZ0IiwgImdldEFsbFNjYWxlVmFsdWVzIiwgIl9jYWNoZSIsICIkYmFyIiwgInZpc2libGVNZXRhcyIsICJjb25jYXQiLCAiX2FycmF5VW5pcXVlIiwgInNvcnQiLCAiYSIsICJjb21wdXRlTWluU2FtcGxlU2l6ZSIsICJfbGVuZ3RoIiwgImN1cnIiLCAidXBkYXRlTWluQW5kUHJldiIsICJhYnMiLCAiZ2V0UGl4ZWxGb3JWYWx1ZSIsICJ0aWNrcyIsICJnZXRQaXhlbEZvclRpY2siLCAiY29tcHV0ZUZpdENhdGVnb3J5VHJhaXRzIiwgInJ1bGVyIiwgInN0YWNrQ291bnQiLCAidGhpY2tuZXNzIiwgImJhclRoaWNrbmVzcyIsICJyYXRpbyIsICJpc051bGxPclVuZGVmIiwgImNhdGVnb3J5UGVyY2VudGFnZSIsICJiYXJQZXJjZW50YWdlIiwgImNodW5rIiwgInBpeGVscyIsICJjb21wdXRlRmxleENhdGVnb3J5VHJhaXRzIiwgIm5leHQiLCAicGVyY2VudCIsICJwYXJzZUZsb2F0QmFyIiwgImVudHJ5IiwgInN0YXJ0VmFsdWUiLCAiZW5kVmFsdWUiLCAiYmFyU3RhcnQiLCAiYmFyRW5kIiwgIl9jdXN0b20iLCAicGFyc2VWYWx1ZSIsICJwYXJzZUFycmF5T3JQcmltaXRpdmUiLCAiaXNGbG9hdEJhciIsICJjdXN0b20iLCAiYmFyU2lnbiIsICJhY3R1YWxCYXNlIiwgImlzSG9yaXpvbnRhbCIsICJib3JkZXJQcm9wcyIsICJob3Jpem9udGFsIiwgImJhc2UiLCAic2V0Qm9yZGVyU2tpcHBlZCIsICJlZGdlIiwgImJvcmRlclNraXBwZWQiLCAiZW5hYmxlQm9yZGVyUmFkaXVzIiwgInBhcnNlRWRnZSIsICJzd2FwIiwgInN0YXJ0RW5kIiwgIm9yaWciLCAidjEiLCAidjIiLCAidiIsICJzZXRJbmZsYXRlQW1vdW50IiwgImluZmxhdGVBbW91bnQiLCAiQmFyQ29udHJvbGxlciIsICJpQXhpc0tleSIsICJ2QXhpc0tleSIsICJvYmoiLCAiYmFycyIsICJnZXRCYXNlUGl4ZWwiLCAiX2dldFJ1bGVyIiwgInZwaXhlbHMiLCAiaGVhZCIsICJfY2FsY3VsYXRlQmFyVmFsdWVQaXhlbHMiLCAiaXBpeGVscyIsICJfY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMiLCAiY2VudGVyIiwgImhlaWdodCIsICJ3aWR0aCIsICJfZ2V0U3RhY2tzIiwgImxhc3QiLCAiZ3JvdXBlZCIsICJza2lwTnVsbCIsICJ2YWwiLCAiaXNOYU4iLCAiaW5kZXhPZiIsICJfZ2V0U3RhY2tDb3VudCIsICJfZ2V0U3RhY2tJbmRleCIsICJuYW1lIiwgIl9zdGFydFBpeGVsIiwgIl9lbmRQaXhlbCIsICJiYXNlVmFsdWUiLCAibWluQmFyTGVuZ3RoIiwgImZsb2F0aW5nIiwgImdldERhdGFWaXNpYmlsaXR5IiwgInN0YXJ0UGl4ZWwiLCAiZ2V0UGl4ZWxGb3JEZWNpbWFsIiwgImVuZFBpeGVsIiwgImdldFZhbHVlRm9yUGl4ZWwiLCAiaGFsZkdyaWQiLCAiZ2V0TGluZVdpZHRoRm9yVmFsdWUiLCAibWF4QmFyVGhpY2tuZXNzIiwgIkluZmluaXR5IiwgInN0YWNrSW5kZXgiLCAicmVjdHMiLCAibnVtYmVycyIsICJvdmVycmlkZXMiLCAiX2luZGV4XyIsICJvZmZzZXQiLCAiZ3JpZCIsICJfdmFsdWVfIiwgImJlZ2luQXRaZXJvIiwgImdldFJhdGlvQW5kT2Zmc2V0IiwgInJvdGF0aW9uIiwgImNpcmN1bWZlcmVuY2UiLCAiY3V0b3V0IiwgInJhdGlvWCIsICJyYXRpb1kiLCAib2Zmc2V0WCIsICJvZmZzZXRZIiwgIlRBVSIsICJzdGFydEFuZ2xlIiwgImVuZEFuZ2xlIiwgInN0YXJ0WCIsICJNYXRoIiwgImNvcyIsICJzdGFydFkiLCAic2luIiwgImVuZFgiLCAiZW5kWSIsICJjYWxjTWF4IiwgImFuZ2xlIiwgImEiLCAiYiIsICJfYW5nbGVCZXR3ZWVuIiwgIm1heCIsICJjYWxjTWluIiwgIm1pbiIsICJtYXhYIiwgIm1heFkiLCAiSEFMRl9QSSIsICJtaW5YIiwgIlBJIiwgIm1pblkiLCAiRG91Z2hudXRDb250cm9sbGVyIiwgIkRhdGFzZXRDb250cm9sbGVyIiwgImNvbnN0cnVjdG9yIiwgImNoYXJ0IiwgImRhdGFzZXRJbmRleCIsICJlbmFibGVPcHRpb25TaGFyaW5nIiwgImlubmVyUmFkaXVzIiwgInVuZGVmaW5lZCIsICJvdXRlclJhZGl1cyIsICJsaW5rU2NhbGVzIiwgInBhcnNlIiwgInN0YXJ0IiwgImNvdW50IiwgImRhdGEiLCAiZ2V0RGF0YXNldCIsICJtZXRhIiwgIl9jYWNoZWRNZXRhIiwgIl9wYXJzaW5nIiwgIl9wYXJzZWQiLCAiZ2V0dGVyIiwgImkiLCAiaXNPYmplY3QiLCAia2V5IiwgInJlc29sdmVPYmplY3RLZXkiLCAiaWxlbiIsICJfZ2V0Um90YXRpb24iLCAidG9SYWRpYW5zIiwgIm9wdGlvbnMiLCAiX2dldENpcmN1bWZlcmVuY2UiLCAiX2dldFJvdGF0aW9uRXh0ZW50cyIsICJkYXRhc2V0cyIsICJsZW5ndGgiLCAiaXNEYXRhc2V0VmlzaWJsZSIsICJnZXREYXRhc2V0TWV0YSIsICJ0eXBlIiwgIl90eXBlIiwgImNvbnRyb2xsZXIiLCAidXBkYXRlIiwgIm1vZGUiLCAiY2hhcnRBcmVhIiwgImFyY3MiLCAic3BhY2luZyIsICJnZXRNYXhCb3JkZXJXaWR0aCIsICJnZXRNYXhPZmZzZXQiLCAibWF4U2l6ZSIsICJ3aWR0aCIsICJoZWlnaHQiLCAidG9QZXJjZW50YWdlIiwgImNoYXJ0V2VpZ2h0IiwgIl9nZXRSaW5nV2VpZ2h0IiwgImluZGV4IiwgIm1heFdpZHRoIiwgIm1heEhlaWdodCIsICJtYXhSYWRpdXMiLCAidG9EaW1lbnNpb24iLCAicmFkaXVzIiwgInJhZGl1c0xlbmd0aCIsICJfZ2V0VmlzaWJsZURhdGFzZXRXZWlnaHRUb3RhbCIsICJ0b3RhbCIsICJjYWxjdWxhdGVUb3RhbCIsICJfZ2V0UmluZ1dlaWdodE9mZnNldCIsICJ1cGRhdGVFbGVtZW50cyIsICJfY2lyY3VtZmVyZW5jZSIsICJyZXNldCIsICJvcHRzIiwgImFuaW1hdGlvbiIsICJhbmltYXRlUm90YXRlIiwgImdldERhdGFWaXNpYmlsaXR5IiwgImhpZGRlbiIsICJjYWxjdWxhdGVDaXJjdW1mZXJlbmNlIiwgImFuaW1hdGlvbk9wdHMiLCAiY2VudGVyWCIsICJsZWZ0IiwgInJpZ2h0IiwgImNlbnRlclkiLCAidG9wIiwgImJvdHRvbSIsICJhbmltYXRlU2NhbGUiLCAic2hhcmVkT3B0aW9ucyIsICJpbmNsdWRlT3B0aW9ucyIsICJfZ2V0U2hhcmVkT3B0aW9ucyIsICJhcmMiLCAicHJvcGVydGllcyIsICJ4IiwgInkiLCAicmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyIsICJhY3RpdmUiLCAidXBkYXRlRWxlbWVudCIsICJtZXRhRGF0YSIsICJ2YWx1ZSIsICJpc05hTiIsICJhYnMiLCAiZ2V0TGFiZWxBbmRWYWx1ZSIsICJsYWJlbHMiLCAiZm9ybWF0TnVtYmVyIiwgImxvY2FsZSIsICJsYWJlbCIsICJib3JkZXJBbGlnbiIsICJib3JkZXJXaWR0aCIsICJob3ZlckJvcmRlcldpZHRoIiwgIm9mZnNldCIsICJob3Zlck9mZnNldCIsICJyaW5nV2VpZ2h0T2Zmc2V0IiwgInZhbHVlT3JEZWZhdWx0IiwgIndlaWdodCIsICJpZCIsICJkZWZhdWx0cyIsICJkYXRhc2V0RWxlbWVudFR5cGUiLCAiZGF0YUVsZW1lbnRUeXBlIiwgImFuaW1hdGlvbnMiLCAibnVtYmVycyIsICJpbmRleEF4aXMiLCAiZGVzY3JpcHRvcnMiLCAiX3NjcmlwdGFibGUiLCAibmFtZSIsICJfaW5kZXhhYmxlIiwgInN0YXJ0c1dpdGgiLCAib3ZlcnJpZGVzIiwgImFzcGVjdFJhdGlvIiwgInBsdWdpbnMiLCAibGVnZW5kIiwgImdlbmVyYXRlTGFiZWxzIiwgInBvaW50U3R5bGUiLCAiY29sb3IiLCAibWFwIiwgInN0eWxlIiwgImdldFN0eWxlIiwgInRleHQiLCAiZmlsbFN0eWxlIiwgImJhY2tncm91bmRDb2xvciIsICJzdHJva2VTdHlsZSIsICJib3JkZXJDb2xvciIsICJmb250Q29sb3IiLCAibGluZVdpZHRoIiwgIm9uQ2xpY2siLCAiZSIsICJsZWdlbmRJdGVtIiwgInRvZ2dsZURhdGFWaXNpYmlsaXR5IiwgIlBpZUNvbnRyb2xsZXIiLCAiRG91Z2hudXRDb250cm9sbGVyIiwgImlkIiwgImRlZmF1bHRzIiwgImN1dG91dCIsICJyb3RhdGlvbiIsICJjaXJjdW1mZXJlbmNlIiwgInJhZGl1cyIsICJhYnN0cmFjdCIsICJFcnJvciIsICJEYXRlQWRhcHRlckJhc2UiLCAiY29uc3RydWN0b3IiLCAib3B0aW9ucyIsICJvdmVycmlkZSIsICJtZW1iZXJzIiwgIk9iamVjdCIsICJhc3NpZ24iLCAicHJvdG90eXBlIiwgImluaXQiLCAiZm9ybWF0cyIsICJwYXJzZSIsICJmb3JtYXQiLCAiYWRkIiwgImRpZmYiLCAic3RhcnRPZiIsICJlbmRPZiIsICJfZGF0ZSIsICJiaW5hcnlTZWFyY2giLCAibWV0YXNldCIsICJheGlzIiwgInZhbHVlIiwgImludGVyc2VjdCIsICJjb250cm9sbGVyIiwgImRhdGEiLCAiX3NvcnRlZCIsICJpU2NhbGUiLCAiX2NhY2hlZE1ldGEiLCAibGVuZ3RoIiwgImxvb2t1cE1ldGhvZCIsICJfcmV2ZXJzZVBpeGVscyIsICJfcmxvb2t1cEJ5S2V5IiwgIl9sb29rdXBCeUtleSIsICJfc2hhcmVkT3B0aW9ucyIsICJlbCIsICJyYW5nZSIsICJnZXRSYW5nZSIsICJzdGFydCIsICJlbmQiLCAibG8iLCAiaGkiLCAiZXZhbHVhdGVJbnRlcmFjdGlvbkl0ZW1zIiwgImNoYXJ0IiwgInBvc2l0aW9uIiwgImhhbmRsZXIiLCAibWV0YXNldHMiLCAiZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcyIsICJpIiwgImlsZW4iLCAiaW5kZXgiLCAiaiIsICJlbGVtZW50IiwgInNraXAiLCAiZ2V0RGlzdGFuY2VNZXRyaWNGb3JBeGlzIiwgInVzZVgiLCAiaW5kZXhPZiIsICJ1c2VZIiwgInB0MSIsICJwdDIiLCAiZGVsdGFYIiwgIk1hdGgiLCAiYWJzIiwgIngiLCAiZGVsdGFZIiwgInkiLCAic3FydCIsICJwb3ciLCAiZ2V0SW50ZXJzZWN0SXRlbXMiLCAidXNlRmluYWxQb3NpdGlvbiIsICJpbmNsdWRlSW52aXNpYmxlIiwgIml0ZW1zIiwgImlzUG9pbnRJbkFyZWEiLCAiZXZhbHVhdGlvbkZ1bmMiLCAiZGF0YXNldEluZGV4IiwgIl9pc1BvaW50SW5BcmVhIiwgImNoYXJ0QXJlYSIsICJpblJhbmdlIiwgInB1c2giLCAiZ2V0TmVhcmVzdFJhZGlhbEl0ZW1zIiwgInN0YXJ0QW5nbGUiLCAiZW5kQW5nbGUiLCAiZ2V0UHJvcHMiLCAiYW5nbGUiLCAiZ2V0QW5nbGVGcm9tUG9pbnQiLCAiX2FuZ2xlQmV0d2VlbiIsICJnZXROZWFyZXN0Q2FydGVzaWFuSXRlbXMiLCAiZGlzdGFuY2VNZXRyaWMiLCAibWluRGlzdGFuY2UiLCAiTnVtYmVyIiwgIlBPU0lUSVZFX0lORklOSVRZIiwgImNlbnRlciIsICJnZXRDZW50ZXJQb2ludCIsICJwb2ludEluQXJlYSIsICJkaXN0YW5jZSIsICJnZXROZWFyZXN0SXRlbXMiLCAiZ2V0QXhpc0l0ZW1zIiwgInJhbmdlTWV0aG9kIiwgImludGVyc2VjdHNJdGVtIiwgIm1vZGVzIiwgImUiLCAiZ2V0UmVsYXRpdmVQb3NpdGlvbiIsICJlbGVtZW50cyIsICJmb3JFYWNoIiwgIm1ldGEiLCAiZGF0YXNldCIsICJnZXREYXRhc2V0TWV0YSIsICJwb2ludCIsICJuZWFyZXN0IiwgIlNUQVRJQ19QT1NJVElPTlMiLCAiZmlsdGVyQnlQb3NpdGlvbiIsICJhcnJheSIsICJmaWx0ZXIiLCAidiIsICJwb3MiLCAiZmlsdGVyRHluYW1pY1Bvc2l0aW9uQnlBeGlzIiwgImJveCIsICJzb3J0QnlXZWlnaHQiLCAicmV2ZXJzZSIsICJzb3J0IiwgImEiLCAiYiIsICJ2MCIsICJ2MSIsICJ3ZWlnaHQiLCAid3JhcEJveGVzIiwgImJveGVzIiwgImxheW91dEJveGVzIiwgInN0YWNrIiwgInN0YWNrV2VpZ2h0IiwgImhvcml6b250YWwiLCAiaXNIb3Jpem9udGFsIiwgImJ1aWxkU3RhY2tzIiwgImxheW91dHMiLCAic3RhY2tzIiwgIndyYXAiLCAiaW5jbHVkZXMiLCAiX3N0YWNrIiwgImNvdW50IiwgInBsYWNlZCIsICJzaXplIiwgInNldExheW91dERpbXMiLCAicGFyYW1zIiwgInZCb3hNYXhXaWR0aCIsICJoQm94TWF4SGVpZ2h0IiwgImxheW91dCIsICJmdWxsU2l6ZSIsICJmYWN0b3IiLCAid2lkdGgiLCAiYXZhaWxhYmxlV2lkdGgiLCAiaGVpZ2h0IiwgImF2YWlsYWJsZUhlaWdodCIsICJidWlsZExheW91dEJveGVzIiwgImxlZnQiLCAicmlnaHQiLCAidG9wIiwgImJvdHRvbSIsICJjZW50ZXJIb3Jpem9udGFsIiwgImNlbnRlclZlcnRpY2FsIiwgImxlZnRBbmRUb3AiLCAiY29uY2F0IiwgInJpZ2h0QW5kQm90dG9tIiwgInZlcnRpY2FsIiwgImdldENvbWJpbmVkTWF4IiwgIm1heFBhZGRpbmciLCAibWF4IiwgInVwZGF0ZU1heFBhZGRpbmciLCAiYm94UGFkZGluZyIsICJ1cGRhdGVEaW1zIiwgImlzT2JqZWN0IiwgImdldFBhZGRpbmciLCAibmV3V2lkdGgiLCAib3V0ZXJXaWR0aCIsICJuZXdIZWlnaHQiLCAib3V0ZXJIZWlnaHQiLCAid2lkdGhDaGFuZ2VkIiwgInciLCAiaGVpZ2h0Q2hhbmdlZCIsICJoIiwgInNhbWUiLCAib3RoZXIiLCAiaGFuZGxlTWF4UGFkZGluZyIsICJ1cGRhdGVQb3MiLCAiY2hhbmdlIiwgImdldE1hcmdpbnMiLCAibWFyZ2luRm9yUG9zaXRpb25zIiwgInBvc2l0aW9ucyIsICJtYXJnaW4iLCAiZml0Qm94ZXMiLCAicmVmaXRCb3hlcyIsICJyZWZpdCIsICJjaGFuZ2VkIiwgInVwZGF0ZSIsICJzZXRCb3hEaW1zIiwgInBsYWNlQm94ZXMiLCAidXNlclBhZGRpbmciLCAicGFkZGluZyIsICJkZWZpbmVkIiwgImFkZEJveCIsICJpdGVtIiwgIl9sYXllcnMiLCAieiIsICJkcmF3IiwgInJlbW92ZUJveCIsICJsYXlvdXRJdGVtIiwgInNwbGljZSIsICJjb25maWd1cmUiLCAibWluUGFkZGluZyIsICJ0b1BhZGRpbmciLCAidmVydGljYWxCb3hlcyIsICJob3Jpem9udGFsQm94ZXMiLCAiZWFjaCIsICJiZWZvcmVMYXlvdXQiLCAidmlzaWJsZVZlcnRpY2FsQm94Q291bnQiLCAicmVkdWNlIiwgInRvdGFsIiwgImRpc3BsYXkiLCAiZnJlZXplIiwgIkJhc2VQbGF0Zm9ybSIsICJhY3F1aXJlQ29udGV4dCIsICJjYW52YXMiLCAiYXNwZWN0UmF0aW8iLCAicmVsZWFzZUNvbnRleHQiLCAiY29udGV4dCIsICJhZGRFdmVudExpc3RlbmVyIiwgInR5cGUiLCAibGlzdGVuZXIiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIsICJnZXREZXZpY2VQaXhlbFJhdGlvIiwgImdldE1heGltdW1TaXplIiwgImZsb29yIiwgImlzQXR0YWNoZWQiLCAidXBkYXRlQ29uZmlnIiwgImNvbmZpZyIsICJCYXNpY1BsYXRmb3JtIiwgImdldENvbnRleHQiLCAiYW5pbWF0aW9uIiwgIkVYUEFORE9fS0VZIiwgIkVWRU5UX1RZUEVTIiwgInRvdWNoc3RhcnQiLCAidG91Y2htb3ZlIiwgInRvdWNoZW5kIiwgInBvaW50ZXJlbnRlciIsICJwb2ludGVyZG93biIsICJwb2ludGVybW92ZSIsICJwb2ludGVydXAiLCAicG9pbnRlcmxlYXZlIiwgInBvaW50ZXJvdXQiLCAiaXNOdWxsT3JFbXB0eSIsICJpbml0Q2FudmFzIiwgInN0eWxlIiwgInJlbmRlckhlaWdodCIsICJnZXRBdHRyaWJ1dGUiLCAicmVuZGVyV2lkdGgiLCAiaW5pdGlhbCIsICJib3hTaXppbmciLCAiZGlzcGxheVdpZHRoIiwgInJlYWRVc2VkU2l6ZSIsICJ1bmRlZmluZWQiLCAiZGlzcGxheUhlaWdodCIsICJldmVudExpc3RlbmVyT3B0aW9ucyIsICJzdXBwb3J0c0V2ZW50TGlzdGVuZXJPcHRpb25zIiwgInBhc3NpdmUiLCAiYWRkTGlzdGVuZXIiLCAibm9kZSIsICJyZW1vdmVMaXN0ZW5lciIsICJmcm9tTmF0aXZlRXZlbnQiLCAiZXZlbnQiLCAibmF0aXZlIiwgIm5vZGVMaXN0Q29udGFpbnMiLCAibm9kZUxpc3QiLCAiY29udGFpbnMiLCAiY3JlYXRlQXR0YWNoT2JzZXJ2ZXIiLCAib2JzZXJ2ZXIiLCAiTXV0YXRpb25PYnNlcnZlciIsICJlbnRyaWVzIiwgInRyaWdnZXIiLCAiZW50cnkiLCAiYWRkZWROb2RlcyIsICJyZW1vdmVkTm9kZXMiLCAib2JzZXJ2ZSIsICJkb2N1bWVudCIsICJjaGlsZExpc3QiLCAic3VidHJlZSIsICJjcmVhdGVEZXRhY2hPYnNlcnZlciIsICJkcnBMaXN0ZW5pbmdDaGFydHMiLCAiTWFwIiwgIm9sZERldmljZVBpeGVsUmF0aW8iLCAib25XaW5kb3dSZXNpemUiLCAiZHByIiwgIndpbmRvdyIsICJkZXZpY2VQaXhlbFJhdGlvIiwgInJlc2l6ZSIsICJjdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyIsICJsaXN0ZW5EZXZpY2VQaXhlbFJhdGlvQ2hhbmdlcyIsICJzZXQiLCAidW5saXN0ZW5EZXZpY2VQaXhlbFJhdGlvQ2hhbmdlcyIsICJkZWxldGUiLCAiY3JlYXRlUmVzaXplT2JzZXJ2ZXIiLCAiY29udGFpbmVyIiwgIl9nZXRQYXJlbnROb2RlIiwgInRocm90dGxlZCIsICJjbGllbnRXaWR0aCIsICJSZXNpemVPYnNlcnZlciIsICJjb250ZW50UmVjdCIsICJyZWxlYXNlT2JzZXJ2ZXIiLCAiZGlzY29ubmVjdCIsICJjcmVhdGVQcm94eUFuZExpc3RlbiIsICJwcm94eSIsICJjdHgiLCAiRG9tUGxhdGZvcm0iLCAicHJvcCIsICJpc051bGxPclVuZGVmIiwgInJlbW92ZUF0dHJpYnV0ZSIsICJzZXRBdHRyaWJ1dGUiLCAia2V5cyIsICJrZXkiLCAicHJveGllcyIsICIkcHJveGllcyIsICJoYW5kbGVycyIsICJhdHRhY2giLCAiZGV0YWNoIiwgImlzQ29ubmVjdGVkIiwgIl9kZXRlY3RQbGF0Zm9ybSIsICJfaXNEb21TdXBwb3J0ZWQiLCAiT2Zmc2NyZWVuQ2FudmFzIiwgIkVsZW1lbnQiLCAiYWN0aXZlIiwgIiRhbmltYXRpb25zIiwgInRvb2x0aXBQb3NpdGlvbiIsICJoYXNWYWx1ZSIsICJpc051bWJlciIsICJwcm9wcyIsICJmaW5hbCIsICJhbmltcyIsICJyZXQiLCAiX3RvIiwgImRlZmF1bHRzIiwgImRlZmF1bHRSb3V0ZXMiLCAiYXV0b1NraXAiLCAic2NhbGUiLCAidGlja3MiLCAidGlja09wdHMiLCAiZGV0ZXJtaW5lZE1heFRpY2tzIiwgImRldGVybWluZU1heFRpY2tzIiwgInRpY2tzTGltaXQiLCAibWluIiwgIm1heFRpY2tzTGltaXQiLCAibWFqb3JJbmRpY2VzIiwgIm1ham9yIiwgImVuYWJsZWQiLCAiZ2V0TWFqb3JJbmRpY2VzIiwgIm51bU1ham9ySW5kaWNlcyIsICJmaXJzdCIsICJsYXN0IiwgIm5ld1RpY2tzIiwgInNraXBNYWpvcnMiLCAic3BhY2luZyIsICJjYWxjdWxhdGVTcGFjaW5nIiwgImF2Z01ham9yU3BhY2luZyIsICJyb3VuZCIsICJvZmZzZXQiLCAidGlja0xlbmd0aCIsICJfdGlja1NpemUiLCAibWF4U2NhbGUiLCAiX2xlbmd0aCIsICJtYXhDaGFydCIsICJfbWF4TGVuZ3RoIiwgImV2ZW5NYWpvclNwYWNpbmciLCAiZ2V0RXZlblNwYWNpbmciLCAiZmFjdG9ycyIsICJfZmFjdG9yaXplIiwgInJlc3VsdCIsICJuZXh0IiwgImNlaWwiLCAibWFqb3JTdGFydCIsICJtYWpvckVuZCIsICJ2YWx1ZU9yRGVmYXVsdCIsICJhcnIiLCAibGVuIiwgInJldmVyc2VBbGlnbiIsICJhbGlnbiIsICJvZmZzZXRGcm9tRWRnZSIsICJlZGdlIiwgImdldFRpY2tzTGltaXQiLCAidGlja3NMZW5ndGgiLCAic2FtcGxlIiwgIm51bUl0ZW1zIiwgImluY3JlbWVudCIsICJnZXRQaXhlbEZvckdyaWRMaW5lIiwgIm9mZnNldEdyaWRMaW5lcyIsICJ2YWxpZEluZGV4IiwgIl9zdGFydFBpeGVsIiwgIl9lbmRQaXhlbCIsICJlcHNpbG9uIiwgImxpbmVWYWx1ZSIsICJnZXRQaXhlbEZvclRpY2siLCAiZ2FyYmFnZUNvbGxlY3QiLCAiY2FjaGVzIiwgImNhY2hlIiwgImdjIiwgImdjTGVuIiwgImdldFRpY2tNYXJrTGVuZ3RoIiwgImRyYXdUaWNrcyIsICJnZXRUaXRsZUhlaWdodCIsICJmYWxsYmFjayIsICJmb250IiwgInRvRm9udCIsICJsaW5lcyIsICJpc0FycmF5IiwgInRleHQiLCAibGluZUhlaWdodCIsICJjcmVhdGVTY2FsZUNvbnRleHQiLCAicGFyZW50IiwgImNyZWF0ZUNvbnRleHQiLCAiY3JlYXRlVGlja0NvbnRleHQiLCAidGljayIsICJ0aXRsZUFsaWduIiwgIl90b0xlZnRSaWdodENlbnRlciIsICJ0aXRsZUFyZ3MiLCAic2NhbGVzIiwgInJvdGF0aW9uIiwgIm1heFdpZHRoIiwgInRpdGxlWCIsICJ0aXRsZVkiLCAiX2FsaWduU3RhcnRFbmQiLCAicG9zaXRpb25BeGlzSUQiLCAiZ2V0UGl4ZWxGb3JWYWx1ZSIsICJIQUxGX1BJIiwgIlNjYWxlIiwgImNmZyIsICJpZCIsICJfbWFyZ2lucyIsICJtYXhIZWlnaHQiLCAicGFkZGluZ1RvcCIsICJwYWRkaW5nQm90dG9tIiwgInBhZGRpbmdMZWZ0IiwgInBhZGRpbmdSaWdodCIsICJsYWJlbFJvdGF0aW9uIiwgIl9yYW5nZSIsICJfZ3JpZExpbmVJdGVtcyIsICJfbGFiZWxJdGVtcyIsICJfbGFiZWxTaXplcyIsICJfbG9uZ2VzdFRleHRDYWNoZSIsICJfdXNlck1heCIsICJfdXNlck1pbiIsICJfc3VnZ2VzdGVkTWF4IiwgIl9zdWdnZXN0ZWRNaW4iLCAiX3RpY2tzTGVuZ3RoIiwgIl9ib3JkZXJWYWx1ZSIsICJfY2FjaGUiLCAiX2RhdGFMaW1pdHNDYWNoZWQiLCAiJGNvbnRleHQiLCAic2V0Q29udGV4dCIsICJzdWdnZXN0ZWRNaW4iLCAic3VnZ2VzdGVkTWF4IiwgInJhdyIsICJnZXRVc2VyQm91bmRzIiwgImZpbml0ZU9yRGVmYXVsdCIsICJORUdBVElWRV9JTkZJTklUWSIsICJtaW5EZWZpbmVkIiwgImlzRmluaXRlIiwgIm1heERlZmluZWQiLCAiZ2V0TWluTWF4IiwgImNhblN0YWNrIiwgIm1ldGFzIiwgImdldE1hdGNoaW5nVmlzaWJsZU1ldGFzIiwgImdldFRpY2tzIiwgImdldExhYmVscyIsICJsYWJlbHMiLCAieExhYmVscyIsICJ5TGFiZWxzIiwgImdldExhYmVsSXRlbXMiLCAiX2NvbXB1dGVMYWJlbEl0ZW1zIiwgImJlZm9yZVVwZGF0ZSIsICJjYWxsIiwgIm1hcmdpbnMiLCAiYmVnaW5BdFplcm8iLCAiZ3JhY2UiLCAic2FtcGxlU2l6ZSIsICJiZWZvcmVTZXREaW1lbnNpb25zIiwgInNldERpbWVuc2lvbnMiLCAiYWZ0ZXJTZXREaW1lbnNpb25zIiwgImJlZm9yZURhdGFMaW1pdHMiLCAiZGV0ZXJtaW5lRGF0YUxpbWl0cyIsICJhZnRlckRhdGFMaW1pdHMiLCAiX2FkZEdyYWNlIiwgImJlZm9yZUJ1aWxkVGlja3MiLCAiYnVpbGRUaWNrcyIsICJhZnRlckJ1aWxkVGlja3MiLCAic2FtcGxpbmdFbmFibGVkIiwgIl9jb252ZXJ0VGlja3NUb0xhYmVscyIsICJiZWZvcmVDYWxjdWxhdGVMYWJlbFJvdGF0aW9uIiwgImNhbGN1bGF0ZUxhYmVsUm90YXRpb24iLCAiYWZ0ZXJDYWxjdWxhdGVMYWJlbFJvdGF0aW9uIiwgInNvdXJjZSIsICJhZnRlckF1dG9Ta2lwIiwgImJlZm9yZUZpdCIsICJmaXQiLCAiYWZ0ZXJGaXQiLCAiYWZ0ZXJVcGRhdGUiLCAicmV2ZXJzZVBpeGVscyIsICJzdGFydFBpeGVsIiwgImVuZFBpeGVsIiwgIl9hbGlnblRvUGl4ZWxzIiwgImFsaWduVG9QaXhlbHMiLCAiX2NhbGxIb29rcyIsICJuYW1lIiwgIm5vdGlmeVBsdWdpbnMiLCAiYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uIiwgImdlbmVyYXRlVGlja0xhYmVscyIsICJsYWJlbCIsICJjYWxsYmFjayIsICJhZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbiIsICJudW1UaWNrcyIsICJtaW5Sb3RhdGlvbiIsICJtYXhSb3RhdGlvbiIsICJ0aWNrV2lkdGgiLCAibWF4TGFiZWxEaWFnb25hbCIsICJfaXNWaXNpYmxlIiwgImxhYmVsU2l6ZXMiLCAiX2dldExhYmVsU2l6ZXMiLCAibWF4TGFiZWxXaWR0aCIsICJ3aWRlc3QiLCAibWF4TGFiZWxIZWlnaHQiLCAiaGlnaGVzdCIsICJfbGltaXRWYWx1ZSIsICJncmlkIiwgInRpdGxlIiwgInRvRGVncmVlcyIsICJhc2luIiwgIm1pblNpemUiLCAidGl0bGVPcHRzIiwgImdyaWRPcHRzIiwgInRpdGxlSGVpZ2h0IiwgInRpY2tQYWRkaW5nIiwgImFuZ2xlUmFkaWFucyIsICJ0b1JhZGlhbnMiLCAiY29zIiwgInNpbiIsICJsYWJlbEhlaWdodCIsICJtaXJyb3IiLCAibGFiZWxXaWR0aCIsICJfY2FsY3VsYXRlUGFkZGluZyIsICJfaGFuZGxlTWFyZ2lucyIsICJpc1JvdGF0ZWQiLCAibGFiZWxzQmVsb3dUaWNrcyIsICJvZmZzZXRMZWZ0IiwgIm9mZnNldFJpZ2h0IiwgImlzRnVsbFNpemUiLCAiX2NvbXB1dGVMYWJlbFNpemVzIiwgIndpZHRocyIsICJoZWlnaHRzIiwgIndpZGVzdExhYmVsU2l6ZSIsICJoaWdoZXN0TGFiZWxTaXplIiwgImpsZW4iLCAidGlja0ZvbnQiLCAiZm9udFN0cmluZyIsICJuZXN0ZWRMYWJlbCIsICJfcmVzb2x2ZVRpY2tGb250T3B0aW9ucyIsICJzdHJpbmciLCAiX21lYXN1cmVUZXh0IiwgInZhbHVlQXQiLCAiaWR4IiwgImdldExhYmVsRm9yVmFsdWUiLCAiTmFOIiwgImdldFZhbHVlRm9yUGl4ZWwiLCAicGl4ZWwiLCAiZ2V0UGl4ZWxGb3JEZWNpbWFsIiwgImRlY2ltYWwiLCAiX2ludDE2UmFuZ2UiLCAiX2FsaWduUGl4ZWwiLCAiZ2V0RGVjaW1hbEZvclBpeGVsIiwgImdldEJhc2VQaXhlbCIsICJnZXRCYXNlVmFsdWUiLCAib3B0aW9uVGlja3MiLCAicm90IiwgImF1dG9Ta2lwUGFkZGluZyIsICJfY29tcHV0ZUdyaWRMaW5lSXRlbXMiLCAiYm9yZGVyIiwgInRsIiwgImJvcmRlck9wdHMiLCAiYXhpc1dpZHRoIiwgImF4aXNIYWxmV2lkdGgiLCAiYWxpZ25Cb3JkZXJWYWx1ZSIsICJib3JkZXJWYWx1ZSIsICJhbGlnbmVkTGluZVZhbHVlIiwgInR4MSIsICJ0eTEiLCAidHgyIiwgInR5MiIsICJ4MSIsICJ5MSIsICJ4MiIsICJ5MiIsICJsaW1pdCIsICJzdGVwIiwgIm9wdHNBdEluZGV4IiwgIm9wdHNBdEluZGV4Qm9yZGVyIiwgImxpbmVXaWR0aCIsICJsaW5lQ29sb3IiLCAiY29sb3IiLCAiYm9yZGVyRGFzaCIsICJkYXNoIiwgImJvcmRlckRhc2hPZmZzZXQiLCAiZGFzaE9mZnNldCIsICJ0aWNrQ29sb3IiLCAidGlja0JvcmRlckRhc2giLCAidGlja0JvcmRlckRhc2hPZmZzZXQiLCAiY3Jvc3NBbGlnbiIsICJ0aWNrQW5kUGFkZGluZyIsICJoVGlja0FuZFBhZGRpbmciLCAidGV4dEFsaWduIiwgImxpbmVDb3VudCIsICJ0ZXh0T2Zmc2V0IiwgInRleHRCYXNlbGluZSIsICJfZ2V0WEF4aXNMYWJlbEFsaWdubWVudCIsICJfZ2V0WUF4aXNMYWJlbEFsaWdubWVudCIsICJsYWJlbE9mZnNldCIsICJoYWxmQ291bnQiLCAic3Ryb2tlQ29sb3IiLCAidGV4dFN0cm9rZUNvbG9yIiwgInN0cm9rZVdpZHRoIiwgInRleHRTdHJva2VXaWR0aCIsICJ0aWNrVGV4dEFsaWduIiwgInNob3dMYWJlbEJhY2tkcm9wIiwgImJhY2tkcm9wIiwgImxhYmVsUGFkZGluZyIsICJiYWNrZHJvcFBhZGRpbmciLCAiYmFja2Ryb3BDb2xvciIsICJ0cmFuc2xhdGlvbiIsICJfY29tcHV0ZUxhYmVsQXJlYSIsICJkcmF3QmFja2dyb3VuZCIsICJiYWNrZ3JvdW5kQ29sb3IiLCAic2F2ZSIsICJmaWxsU3R5bGUiLCAiZmlsbFJlY3QiLCAicmVzdG9yZSIsICJnZXRMaW5lV2lkdGhGb3JWYWx1ZSIsICJmaW5kSW5kZXgiLCAidCIsICJvcHRzIiwgImRyYXdHcmlkIiwgImRyYXdMaW5lIiwgInAxIiwgInAyIiwgInN0cm9rZVN0eWxlIiwgInNldExpbmVEYXNoIiwgImxpbmVEYXNoT2Zmc2V0IiwgImJlZ2luUGF0aCIsICJtb3ZlVG8iLCAibGluZVRvIiwgInN0cm9rZSIsICJkcmF3T25DaGFydEFyZWEiLCAiZHJhd0JvcmRlciIsICJsYXN0TGluZVdpZHRoIiwgImRyYXdMYWJlbHMiLCAiYXJlYSIsICJjbGlwQXJlYSIsICJyZW5kZXJUZXh0T3B0aW9ucyIsICJyZW5kZXJUZXh0IiwgInVuY2xpcEFyZWEiLCAiZHJhd1RpdGxlIiwgInR6IiwgImd6IiwgImJ6IiwgImF4aXNJRCIsICJfbWF4RGlnaXRzIiwgImZvbnRTaXplIiwgIlR5cGVkUmVnaXN0cnkiLCAic2NvcGUiLCAiY3JlYXRlIiwgImlzRm9yVHlwZSIsICJpc1Byb3RvdHlwZU9mIiwgInJlZ2lzdGVyIiwgInByb3RvIiwgImdldFByb3RvdHlwZU9mIiwgInBhcmVudFNjb3BlIiwgImlzSUNoYXJ0Q29tcG9uZW50IiwgInJlZ2lzdGVyRGVmYXVsdHMiLCAib3ZlcnJpZGVzIiwgImdldCIsICJ1bnJlZ2lzdGVyIiwgIml0ZW1EZWZhdWx0cyIsICJtZXJnZSIsICJyb3V0ZURlZmF1bHRzIiwgImRlc2NyaXB0b3JzIiwgImRlc2NyaWJlIiwgInJvdXRlcyIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eVBhcnRzIiwgInNwbGl0IiwgInNvdXJjZU5hbWUiLCAicG9wIiwgInNvdXJjZVNjb3BlIiwgImpvaW4iLCAicGFydHMiLCAidGFyZ2V0TmFtZSIsICJ0YXJnZXRTY29wZSIsICJyb3V0ZSIsICJSZWdpc3RyeSIsICJjb250cm9sbGVycyIsICJEYXRhc2V0Q29udHJvbGxlciIsICJwbHVnaW5zIiwgIl90eXBlZFJlZ2lzdHJpZXMiLCAiYXJncyIsICJfZWFjaCIsICJyZW1vdmUiLCAiYWRkQ29udHJvbGxlcnMiLCAiYWRkRWxlbWVudHMiLCAiYWRkUGx1Z2lucyIsICJhZGRTY2FsZXMiLCAiZ2V0Q29udHJvbGxlciIsICJfZ2V0IiwgImdldEVsZW1lbnQiLCAiZ2V0UGx1Z2luIiwgImdldFNjYWxlIiwgInJlbW92ZUNvbnRyb2xsZXJzIiwgInJlbW92ZUVsZW1lbnRzIiwgInJlbW92ZVBsdWdpbnMiLCAicmVtb3ZlU2NhbGVzIiwgIm1ldGhvZCIsICJ0eXBlZFJlZ2lzdHJ5IiwgImFyZyIsICJyZWciLCAiX2dldFJlZ2lzdHJ5Rm9yVHlwZSIsICJfZXhlYyIsICJpdGVtUmVnIiwgInJlZ2lzdHJ5IiwgImNvbXBvbmVudCIsICJjYW1lbE1ldGhvZCIsICJfY2FwaXRhbGl6ZSIsICJQbHVnaW5TZXJ2aWNlIiwgIl9pbml0IiwgIm5vdGlmeSIsICJob29rIiwgIl9jcmVhdGVEZXNjcmlwdG9ycyIsICJfbm90aWZ5IiwgIl9kZXNjcmlwdG9ycyIsICJkZXNjcmlwdG9yIiwgInBsdWdpbiIsICJjYWxsQ2FsbGJhY2siLCAiY2FuY2VsYWJsZSIsICJpbnZhbGlkYXRlIiwgIl9vbGRDYWNoZSIsICJfbm90aWZ5U3RhdGVDaGFuZ2VzIiwgImFsbCIsICJhbGxQbHVnaW5zIiwgImNyZWF0ZURlc2NyaXB0b3JzIiwgInByZXZpb3VzRGVzY3JpcHRvcnMiLCAic29tZSIsICJsb2NhbElkcyIsICJsb2NhbCIsICJnZXRPcHRzIiwgInBsdWdpbk9wdHMiLCAicGx1Z2luU2NvcGVLZXlzIiwgInNjb3BlcyIsICJnZXRPcHRpb25TY29wZXMiLCAiY3JlYXRlUmVzb2x2ZXIiLCAic2NyaXB0YWJsZSIsICJpbmRleGFibGUiLCAiYWxsS2V5cyIsICJnZXRJbmRleEF4aXMiLCAiZGF0YXNldERlZmF1bHRzIiwgImRhdGFzZXRzIiwgImRhdGFzZXRPcHRpb25zIiwgImluZGV4QXhpcyIsICJnZXRBeGlzRnJvbURlZmF1bHRTY2FsZUlEIiwgImdldERlZmF1bHRTY2FsZUlERnJvbUF4aXMiLCAiaWRNYXRjaGVzQXhpcyIsICJheGlzRnJvbVBvc2l0aW9uIiwgImRldGVybWluZUF4aXMiLCAic2NhbGVPcHRpb25zIiwgInRvTG93ZXJDYXNlIiwgImdldEF4aXNGcm9tRGF0YXNldCIsICJyZXRyaWV2ZUF4aXNGcm9tRGF0YXNldHMiLCAiYm91bmREcyIsICJkIiwgInhBeGlzSUQiLCAieUF4aXNJRCIsICJtZXJnZVNjYWxlQ29uZmlnIiwgImNoYXJ0RGVmYXVsdHMiLCAiY29uZmlnU2NhbGVzIiwgImNoYXJ0SW5kZXhBeGlzIiwgInNjYWxlQ29uZiIsICJjb25zb2xlIiwgImVycm9yIiwgIl9wcm94eSIsICJ3YXJuIiwgImRlZmF1bHRJZCIsICJkZWZhdWx0U2NhbGVPcHRpb25zIiwgIm1lcmdlSWYiLCAiZGVmYXVsdElEIiwgImluaXRPcHRpb25zIiwgImluaXREYXRhIiwgImluaXRDb25maWciLCAia2V5Q2FjaGUiLCAia2V5c0NhY2hlZCIsICJTZXQiLCAiY2FjaGVkS2V5cyIsICJjYWNoZUtleSIsICJnZW5lcmF0ZSIsICJhZGRJZkZvdW5kIiwgIm9iaiIsICJyZXNvbHZlT2JqZWN0S2V5IiwgIkNvbmZpZyIsICJfY29uZmlnIiwgIl9zY29wZUNhY2hlIiwgIl9yZXNvbHZlckNhY2hlIiwgInBsYXRmb3JtIiwgImNsZWFyQ2FjaGUiLCAiY2xlYXIiLCAiZGF0YXNldFNjb3BlS2V5cyIsICJkYXRhc2V0VHlwZSIsICJkYXRhc2V0QW5pbWF0aW9uU2NvcGVLZXlzIiwgInRyYW5zaXRpb24iLCAiZGF0YXNldEVsZW1lbnRTY29wZUtleXMiLCAiZWxlbWVudFR5cGUiLCAiYWRkaXRpb25hbE9wdGlvblNjb3BlcyIsICJfY2FjaGVkU2NvcGVzIiwgIm1haW5TY29wZSIsICJyZXNldENhY2hlIiwgImtleUxpc3RzIiwgImNhY2hlZCIsICJBcnJheSIsICJmcm9tIiwgImhhcyIsICJjaGFydE9wdGlvblNjb3BlcyIsICJyZXNvbHZlTmFtZWRPcHRpb25zIiwgIm5hbWVzIiwgInByZWZpeGVzIiwgIiRzaGFyZWQiLCAicmVzb2x2ZXIiLCAic3ViUHJlZml4ZXMiLCAiZ2V0UmVzb2x2ZXIiLCAibmVlZENvbnRleHQiLCAiaXNGdW5jdGlvbiIsICJzdWJSZXNvbHZlciIsICJfYXR0YWNoQ29udGV4dCIsICJkZXNjcmlwdG9yRGVmYXVsdHMiLCAicmVzb2x2ZXJDYWNoZSIsICJfY3JlYXRlUmVzb2x2ZXIiLCAicCIsICJoYXNGdW5jdGlvbiIsICJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwgImlzU2NyaXB0YWJsZSIsICJpc0luZGV4YWJsZSIsICJLTk9XTl9QT1NJVElPTlMiLCAicG9zaXRpb25Jc0hvcml6b250YWwiLCAiY29tcGFyZTJMZXZlbCIsICJsMSIsICJsMiIsICJvbkFuaW1hdGlvbnNDb21wbGV0ZSIsICJhbmltYXRpb25PcHRpb25zIiwgIm9uQ29tcGxldGUiLCAib25BbmltYXRpb25Qcm9ncmVzcyIsICJvblByb2dyZXNzIiwgImdldENhbnZhcyIsICJnZXRFbGVtZW50QnlJZCIsICJpbnN0YW5jZXMiLCAiZ2V0Q2hhcnQiLCAidmFsdWVzIiwgImMiLCAibW92ZU51bWVyaWNLZXlzIiwgIm1vdmUiLCAiaW50S2V5IiwgImRldGVybWluZUxhc3RFdmVudCIsICJsYXN0RXZlbnQiLCAiaW5DaGFydEFyZWEiLCAiaXNDbGljayIsICJnZXRTaXplRm9yQXJlYSIsICJmaWVsZCIsICJjbGlwIiwgImdldERhdGFzZXRBcmVhIiwgInhTY2FsZSIsICJ5U2NhbGUiLCAiQ2hhcnQiLCAiaW52YWxpZGF0ZVBsdWdpbnMiLCAidXNlckNvbmZpZyIsICJpbml0aWFsQ2FudmFzIiwgImV4aXN0aW5nQ2hhcnQiLCAidWlkIiwgIl9vcHRpb25zIiwgIl9hc3BlY3RSYXRpbyIsICJfbWV0YXNldHMiLCAiX3N0YWNrcyIsICJfYWN0aXZlIiwgIl9sYXN0RXZlbnQiLCAiX2xpc3RlbmVycyIsICJfcmVzcG9uc2l2ZUxpc3RlbmVycyIsICJfc29ydGVkTWV0YXNldHMiLCAiX3BsdWdpbnMiLCAiX2hpZGRlbkluZGljZXMiLCAiYXR0YWNoZWQiLCAiX2FuaW1hdGlvbnNEaXNhYmxlZCIsICJfZG9SZXNpemUiLCAiZGVib3VuY2UiLCAibW9kZSIsICJyZXNpemVEZWxheSIsICJfZGF0YUNoYW5nZXMiLCAiYW5pbWF0b3IiLCAibGlzdGVuIiwgIl9pbml0aWFsaXplIiwgIm1haW50YWluQXNwZWN0UmF0aW8iLCAicmVzcG9uc2l2ZSIsICJyZXRpbmFTY2FsZSIsICJiaW5kRXZlbnRzIiwgImNsZWFyQ2FudmFzIiwgInN0b3AiLCAicnVubmluZyIsICJfcmVzaXplIiwgIl9yZXNpemVCZWZvcmVEcmF3IiwgIm5ld1NpemUiLCAibmV3UmF0aW8iLCAib25SZXNpemUiLCAicmVuZGVyIiwgImVuc3VyZVNjYWxlc0hhdmVJRHMiLCAic2NhbGVzT3B0aW9ucyIsICJheGlzT3B0aW9ucyIsICJidWlsZE9yVXBkYXRlU2NhbGVzIiwgInNjYWxlT3B0cyIsICJ1cGRhdGVkIiwgIm1hcCIsICJpc1JhZGlhbCIsICJkcG9zaXRpb24iLCAiZHR5cGUiLCAic2NhbGVUeXBlIiwgInNjYWxlQ2xhc3MiLCAiaGFzVXBkYXRlZCIsICJfdXBkYXRlTWV0YXNldHMiLCAibnVtRGF0YSIsICJudW1NZXRhIiwgIl9kZXN0cm95RGF0YXNldE1ldGEiLCAic2xpY2UiLCAiX3JlbW92ZVVucmVmZXJlbmNlZE1ldGFzZXRzIiwgIl9kYXRhc2V0IiwgImJ1aWxkT3JVcGRhdGVDb250cm9sbGVycyIsICJuZXdDb250cm9sbGVycyIsICJvcmRlciIsICJ2aXNpYmxlIiwgImlzRGF0YXNldFZpc2libGUiLCAidXBkYXRlSW5kZXgiLCAibGlua1NjYWxlcyIsICJDb250cm9sbGVyQ2xhc3MiLCAiZGF0YXNldEVsZW1lbnRUeXBlIiwgImRhdGFFbGVtZW50VHlwZSIsICJfcmVzZXRFbGVtZW50cyIsICJyZXNldCIsICJhbmltc0Rpc2FibGVkIiwgIl91cGRhdGVTY2FsZXMiLCAiX2NoZWNrRXZlbnRCaW5kaW5ncyIsICJfdXBkYXRlSGlkZGVuSW5kaWNlcyIsICJidWlsZE9yVXBkYXRlRWxlbWVudHMiLCAiZ2V0TWF4T3ZlcmZsb3ciLCAiX21pblBhZGRpbmciLCAiYXV0b1BhZGRpbmciLCAiX3VwZGF0ZUxheW91dCIsICJfdXBkYXRlRGF0YXNldHMiLCAiX2V2ZW50SGFuZGxlciIsICJfdXBkYXRlSG92ZXJTdHlsZXMiLCAiZXhpc3RpbmdFdmVudHMiLCAibmV3RXZlbnRzIiwgImV2ZW50cyIsICJzZXRzRXF1YWwiLCAidW5iaW5kRXZlbnRzIiwgImNoYW5nZXMiLCAiX2dldFVuaWZvcm1EYXRhQ2hhbmdlcyIsICJkYXRhc2V0Q291bnQiLCAibWFrZVNldCIsICJjaGFuZ2VTZXQiLCAibm9BcmVhIiwgIl9pZHgiLCAiX3VwZGF0ZURhdGFzZXQiLCAiX3VwZGF0ZSIsICJsYXllcnMiLCAiX2RyYXdEYXRhc2V0cyIsICJfZ2V0U29ydGVkRGF0YXNldE1ldGFzIiwgImZpbHRlclZpc2libGUiLCAiX2RyYXdEYXRhc2V0IiwgIl9jbGlwIiwgInVzZUNsaXAiLCAiZGlzYWJsZWQiLCAiZ2V0RWxlbWVudHNBdEV2ZW50Rm9yTW9kZSIsICJJbnRlcmFjdGlvbiIsICJoaWRkZW4iLCAiX3BhcnNlZCIsICJnZXRWaXNpYmxlRGF0YXNldENvdW50IiwgInNldERhdGFzZXRWaXNpYmlsaXR5IiwgInRvZ2dsZURhdGFWaXNpYmlsaXR5IiwgImdldERhdGFWaXNpYmlsaXR5IiwgIl91cGRhdGVWaXNpYmlsaXR5IiwgImRhdGFJbmRleCIsICJfcmVzb2x2ZUFuaW1hdGlvbnMiLCAiaGlkZSIsICJzaG93IiwgIl9kZXN0cm95IiwgIl9zdG9wIiwgImRlc3Ryb3kiLCAidG9CYXNlNjRJbWFnZSIsICJ0b0RhdGFVUkwiLCAiYmluZFVzZXJFdmVudHMiLCAiYmluZFJlc3BvbnNpdmVFdmVudHMiLCAibGlzdGVuZXJzIiwgIl9hZGQiLCAib2Zmc2V0WCIsICJvZmZzZXRZIiwgIl9yZW1vdmUiLCAiZGV0YWNoZWQiLCAidXBkYXRlSG92ZXJTdHlsZSIsICJwcmVmaXgiLCAiZ2V0QWN0aXZlRWxlbWVudHMiLCAic2V0QWN0aXZlRWxlbWVudHMiLCAiYWN0aXZlRWxlbWVudHMiLCAibGFzdEFjdGl2ZSIsICJfZWxlbWVudHNFcXVhbCIsICJpc1BsdWdpbkVuYWJsZWQiLCAicGx1Z2luSWQiLCAicmVwbGF5IiwgImhvdmVyT3B0aW9ucyIsICJob3ZlciIsICJkZWFjdGl2YXRlZCIsICJhY3RpdmF0ZWQiLCAiZXZlbnRGaWx0ZXIiLCAiX2hhbmRsZUV2ZW50IiwgIl9nZXRBY3RpdmVFbGVtZW50cyIsICJfaXNDbGlja0V2ZW50IiwgIm9uSG92ZXIiLCAib25DbGljayIsICJ2ZXJzaW9uIiwgImNsaXBBcmMiLCAicGl4ZWxNYXJnaW4iLCAib3V0ZXJSYWRpdXMiLCAiaW5uZXJSYWRpdXMiLCAiYW5nbGVNYXJnaW4iLCAiYXJjIiwgImNsb3NlUGF0aCIsICJ0b1JhZGl1c0Nvcm5lcnMiLCAiX3JlYWRWYWx1ZVRvUHJvcHMiLCAicGFyc2VCb3JkZXJSYWRpdXMiLCAiYW5nbGVEZWx0YSIsICJvIiwgImJvcmRlclJhZGl1cyIsICJoYWxmVGhpY2tuZXNzIiwgImlubmVyTGltaXQiLCAiY29tcHV0ZU91dGVyTGltaXQiLCAidmFsIiwgIm91dGVyQXJjTGltaXQiLCAib3V0ZXJTdGFydCIsICJvdXRlckVuZCIsICJpbm5lclN0YXJ0IiwgImlubmVyRW5kIiwgInJUaGV0YVRvWFkiLCAiciIsICJ0aGV0YSIsICJwYXRoQXJjIiwgImNpcmN1bGFyIiwgImlubmVyUiIsICJzcGFjaW5nT2Zmc2V0IiwgImFscGhhIiwgIm5vU3BhY2luZ0lubmVyUmFkaXVzIiwgIm5vU3BhY2luZ091dGVyUmFkaXVzIiwgImF2Tm9nU3BhY2luZ1JhZGl1cyIsICJhZGp1c3RlZEFuZ2xlIiwgImJldGEiLCAiUEkiLCAiYW5nbGVPZmZzZXQiLCAib3V0ZXJTdGFydEFkanVzdGVkUmFkaXVzIiwgIm91dGVyRW5kQWRqdXN0ZWRSYWRpdXMiLCAib3V0ZXJTdGFydEFkanVzdGVkQW5nbGUiLCAib3V0ZXJFbmRBZGp1c3RlZEFuZ2xlIiwgImlubmVyU3RhcnRBZGp1c3RlZFJhZGl1cyIsICJpbm5lckVuZEFkanVzdGVkUmFkaXVzIiwgImlubmVyU3RhcnRBZGp1c3RlZEFuZ2xlIiwgImlubmVyRW5kQWRqdXN0ZWRBbmdsZSIsICJvdXRlck1pZEFkanVzdGVkQW5nbGUiLCAicENlbnRlciIsICJwNCIsICJpbm5lck1pZEFkanVzdGVkQW5nbGUiLCAicDgiLCAib3V0ZXJTdGFydFgiLCAib3V0ZXJTdGFydFkiLCAib3V0ZXJFbmRYIiwgIm91dGVyRW5kWSIsICJkcmF3QXJjIiwgImZ1bGxDaXJjbGVzIiwgImNpcmN1bWZlcmVuY2UiLCAiZmlsbCIsICJpc05hTiIsICJUQVUiLCAiYm9yZGVyV2lkdGgiLCAiYm9yZGVySm9pblN0eWxlIiwgImlubmVyIiwgImJvcmRlckFsaWduIiwgImxpbmVKb2luIiwgIkFyY0VsZW1lbnQiLCAiY2hhcnRYIiwgImNoYXJ0WSIsICJyQWRqdXN0IiwgIl9jaXJjdW1mZXJlbmNlIiwgImJldHdlZW5BbmdsZXMiLCAid2l0aGluUmFkaXVzIiwgIl9pc0JldHdlZW4iLCAiaGFsZkFuZ2xlIiwgImhhbGZSYWRpdXMiLCAidHJhbnNsYXRlIiwgImZpeCIsICJyYWRpdXNPZmZzZXQiLCAiYm9yZGVyQ29sb3IiLCAiX3NjcmlwdGFibGUiLCAiX2luZGV4YWJsZSIsICJnZXRCYXJCb3VuZHMiLCAiYmFyIiwgInVzZUZpbmFsUG9zaXRpb24iLCAieCIsICJ5IiwgImJhc2UiLCAid2lkdGgiLCAiaGVpZ2h0IiwgImdldFByb3BzIiwgImxlZnQiLCAicmlnaHQiLCAidG9wIiwgImJvdHRvbSIsICJoYWxmIiwgImhvcml6b250YWwiLCAiTWF0aCIsICJtaW4iLCAibWF4IiwgInNraXBPckxpbWl0IiwgInNraXAiLCAidmFsdWUiLCAiX2xpbWl0VmFsdWUiLCAicGFyc2VCb3JkZXJXaWR0aCIsICJtYXhXIiwgIm1heEgiLCAib3B0aW9ucyIsICJib3JkZXJXaWR0aCIsICJib3JkZXJTa2lwcGVkIiwgIm8iLCAidG9UUkJMIiwgInQiLCAiciIsICJiIiwgImwiLCAicGFyc2VCb3JkZXJSYWRpdXMiLCAiZW5hYmxlQm9yZGVyUmFkaXVzIiwgImJvcmRlclJhZGl1cyIsICJ0b1RSQkxDb3JuZXJzIiwgIm1heFIiLCAiZW5hYmxlQm9yZGVyIiwgImlzT2JqZWN0IiwgInRvcExlZnQiLCAidG9wUmlnaHQiLCAiYm90dG9tTGVmdCIsICJib3R0b21SaWdodCIsICJib3VuZGluZ1JlY3RzIiwgImJvdW5kcyIsICJib3JkZXIiLCAicmFkaXVzIiwgIm91dGVyIiwgInciLCAiaCIsICJpbm5lciIsICJpblJhbmdlIiwgInNraXBYIiwgInNraXBZIiwgInNraXBCb3RoIiwgIl9pc0JldHdlZW4iLCAiaGFzUmFkaXVzIiwgImFkZE5vcm1hbFJlY3RQYXRoIiwgImN0eCIsICJyZWN0IiwgImluZmxhdGVSZWN0IiwgImFtb3VudCIsICJyZWZSZWN0IiwgIkJhckVsZW1lbnQiLCAiRWxlbWVudCIsICJjb25zdHJ1Y3RvciIsICJjZmciLCAidW5kZWZpbmVkIiwgImluZmxhdGVBbW91bnQiLCAiT2JqZWN0IiwgImFzc2lnbiIsICJkcmF3IiwgImJvcmRlckNvbG9yIiwgImJhY2tncm91bmRDb2xvciIsICJhZGRSZWN0UGF0aCIsICJhZGRSb3VuZGVkUmVjdFBhdGgiLCAic2F2ZSIsICJiZWdpblBhdGgiLCAiY2xpcCIsICJmaWxsU3R5bGUiLCAiZmlsbCIsICJyZXN0b3JlIiwgIm1vdXNlWCIsICJtb3VzZVkiLCAiaW5YUmFuZ2UiLCAiaW5ZUmFuZ2UiLCAiZ2V0Q2VudGVyUG9pbnQiLCAiZ2V0UmFuZ2UiLCAiYXhpcyIsICJpZCIsICJkZWZhdWx0cyIsICJwb2ludFN0eWxlIiwgImRlZmF1bHRSb3V0ZXMiLCAiZ2V0Qm94U2l6ZSIsICJsYWJlbE9wdHMiLCAiZm9udFNpemUiLCAiYm94SGVpZ2h0IiwgImJveFdpZHRoIiwgInVzZVBvaW50U3R5bGUiLCAiTWF0aCIsICJtaW4iLCAicG9pbnRTdHlsZVdpZHRoIiwgIml0ZW1IZWlnaHQiLCAibWF4IiwgIml0ZW1zRXF1YWwiLCAiYSIsICJiIiwgImRhdGFzZXRJbmRleCIsICJpbmRleCIsICJMZWdlbmQiLCAiRWxlbWVudCIsICJjb25zdHJ1Y3RvciIsICJjb25maWciLCAiX2FkZGVkIiwgImxlZ2VuZEhpdEJveGVzIiwgIl9ob3ZlcmVkSXRlbSIsICJkb3VnaG51dE1vZGUiLCAiY2hhcnQiLCAib3B0aW9ucyIsICJjdHgiLCAibGVnZW5kSXRlbXMiLCAidW5kZWZpbmVkIiwgImNvbHVtblNpemVzIiwgImxpbmVXaWR0aHMiLCAibWF4SGVpZ2h0IiwgIm1heFdpZHRoIiwgInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCIsICJoZWlnaHQiLCAid2lkdGgiLCAiX21hcmdpbnMiLCAicG9zaXRpb24iLCAid2VpZ2h0IiwgImZ1bGxTaXplIiwgInVwZGF0ZSIsICJtYXJnaW5zIiwgInNldERpbWVuc2lvbnMiLCAiYnVpbGRMYWJlbHMiLCAiZml0IiwgImlzSG9yaXpvbnRhbCIsICJsYWJlbHMiLCAiY2FsbCIsICJnZW5lcmF0ZUxhYmVscyIsICJmaWx0ZXIiLCAiaXRlbSIsICJkYXRhIiwgInNvcnQiLCAicmV2ZXJzZSIsICJkaXNwbGF5IiwgImxhYmVsRm9udCIsICJ0b0ZvbnQiLCAiZm9udCIsICJzaXplIiwgInRpdGxlSGVpZ2h0IiwgIl9jb21wdXRlVGl0bGVIZWlnaHQiLCAic3RyaW5nIiwgIl9maXRSb3dzIiwgIl9maXRDb2xzIiwgInBhZGRpbmciLCAiaGl0Ym94ZXMiLCAibGluZUhlaWdodCIsICJ0b3RhbEhlaWdodCIsICJ0ZXh0QWxpZ24iLCAidGV4dEJhc2VsaW5lIiwgInJvdyIsICJmb3JFYWNoIiwgImxlZ2VuZEl0ZW0iLCAiaSIsICJpdGVtV2lkdGgiLCAibWVhc3VyZVRleHQiLCAidGV4dCIsICJsZW5ndGgiLCAiX2l0ZW1IZWlnaHQiLCAiaGVpZ2h0TGltaXQiLCAidG90YWxXaWR0aCIsICJjdXJyZW50Q29sV2lkdGgiLCAiY3VycmVudENvbEhlaWdodCIsICJjb2wiLCAiY2FsY3VsYXRlSXRlbVNpemUiLCAicHVzaCIsICJhZGp1c3RIaXRCb3hlcyIsICJhbGlnbiIsICJydGwiLCAicnRsSGVscGVyIiwgImdldFJ0bEFkYXB0ZXIiLCAiX2FsaWduU3RhcnRFbmQiLCAiaGl0Ym94IiwgImxlZnRGb3JMdHIiLCAieCIsICJkcmF3IiwgImNsaXBBcmVhIiwgIl9kcmF3IiwgInVuY2xpcEFyZWEiLCAib3B0cyIsICJkZWZhdWx0Q29sb3IiLCAiZGVmYXVsdHMiLCAiY29sb3IiLCAiaGFsZkZvbnRTaXplIiwgImN1cnNvciIsICJkcmF3VGl0bGUiLCAibGluZVdpZHRoIiwgImRyYXdMZWdlbmRCb3giLCAieSIsICJpc05hTiIsICJzYXZlIiwgInZhbHVlT3JEZWZhdWx0IiwgImZpbGxTdHlsZSIsICJsaW5lQ2FwIiwgImxpbmVEYXNoT2Zmc2V0IiwgImxpbmVKb2luIiwgInN0cm9rZVN0eWxlIiwgInNldExpbmVEYXNoIiwgImxpbmVEYXNoIiwgImRyYXdPcHRpb25zIiwgInJhZGl1cyIsICJTUVJUMiIsICJwb2ludFN0eWxlIiwgInJvdGF0aW9uIiwgImJvcmRlcldpZHRoIiwgImNlbnRlclgiLCAieFBsdXMiLCAiY2VudGVyWSIsICJkcmF3UG9pbnRMZWdlbmQiLCAieUJveFRvcCIsICJ4Qm94TGVmdCIsICJib3JkZXJSYWRpdXMiLCAidG9UUkJMQ29ybmVycyIsICJiZWdpblBhdGgiLCAiT2JqZWN0IiwgInZhbHVlcyIsICJzb21lIiwgInYiLCAiYWRkUm91bmRlZFJlY3RQYXRoIiwgInciLCAiaCIsICJyZWN0IiwgImZpbGwiLCAic3Ryb2tlIiwgInJlc3RvcmUiLCAiZmlsbFRleHQiLCAicmVuZGVyVGV4dCIsICJzdHJpa2V0aHJvdWdoIiwgImhpZGRlbiIsICJsaW5lIiwgIm92ZXJyaWRlVGV4dERpcmVjdGlvbiIsICJ0ZXh0RGlyZWN0aW9uIiwgImZvbnRDb2xvciIsICJ0ZXh0V2lkdGgiLCAic2V0V2lkdGgiLCAicmVhbFgiLCAiX3RleHRYIiwgImZvbnRMaW5lSGVpZ2h0IiwgImNhbGN1bGF0ZUxlZ2VuZEl0ZW1IZWlnaHQiLCAicmVzdG9yZVRleHREaXJlY3Rpb24iLCAidGl0bGVPcHRzIiwgInRpdGxlIiwgInRpdGxlRm9udCIsICJ0aXRsZVBhZGRpbmciLCAidG9QYWRkaW5nIiwgInRvcFBhZGRpbmdQbHVzSGFsZkZvbnRTaXplIiwgInJlZHVjZSIsICJhY2MiLCAiX3RvTGVmdFJpZ2h0Q2VudGVyIiwgIl9nZXRMZWdlbmRJdGVtQXQiLCAiaGl0Qm94IiwgImxoIiwgIl9pc0JldHdlZW4iLCAiaGFuZGxlRXZlbnQiLCAiZSIsICJpc0xpc3RlbmVkIiwgInR5cGUiLCAiaG92ZXJlZEl0ZW0iLCAicHJldmlvdXMiLCAic2FtZUl0ZW0iLCAib25MZWF2ZSIsICJvbkhvdmVyIiwgIm9uQ2xpY2siLCAiY2FsY3VsYXRlSXRlbVdpZHRoIiwgImNhbGN1bGF0ZUl0ZW1IZWlnaHQiLCAibGVnZW5kSXRlbVRleHQiLCAibGFiZWxIZWlnaHQiLCAiaWQiLCAiX2VsZW1lbnQiLCAic3RhcnQiLCAiX2FyZ3MiLCAibGVnZW5kIiwgImxheW91dHMiLCAiY29uZmlndXJlIiwgImFkZEJveCIsICJzdG9wIiwgInJlbW92ZUJveCIsICJiZWZvcmVVcGRhdGUiLCAiYWZ0ZXJVcGRhdGUiLCAiYWZ0ZXJFdmVudCIsICJhcmdzIiwgInJlcGxheSIsICJldmVudCIsICJjaSIsICJpc0RhdGFzZXRWaXNpYmxlIiwgImhpZGUiLCAic2hvdyIsICJkYXRhc2V0cyIsICJ1c2VCb3JkZXJSYWRpdXMiLCAiX2dldFNvcnRlZERhdGFzZXRNZXRhcyIsICJtYXAiLCAibWV0YSIsICJzdHlsZSIsICJjb250cm9sbGVyIiwgImdldFN0eWxlIiwgImxhYmVsIiwgImJhY2tncm91bmRDb2xvciIsICJ2aXNpYmxlIiwgImJvcmRlckNhcFN0eWxlIiwgImJvcmRlckRhc2giLCAiYm9yZGVyRGFzaE9mZnNldCIsICJib3JkZXJKb2luU3R5bGUiLCAiYm9yZGVyQ29sb3IiLCAiZGVzY3JpcHRvcnMiLCAiX3NjcmlwdGFibGUiLCAibmFtZSIsICJzdGFydHNXaXRoIiwgImluY2x1ZGVzIiwgIlRpdGxlIiwgIl9wYWRkaW5nIiwgImxpbmVDb3VudCIsICJpc0FycmF5IiwgInRleHRTaXplIiwgInBvcyIsICJfZHJhd0FyZ3MiLCAib2Zmc2V0IiwgInRpdGxlWCIsICJ0aXRsZVkiLCAiUEkiLCAiZm9udE9wdHMiLCAidHJhbnNsYXRpb24iLCAiY3JlYXRlVGl0bGUiLCAidGl0bGVCbG9jayIsICJkZWZhdWx0Um91dGVzIiwgIl9pbmRleGFibGUiLCAiV2Vha01hcCIsICJzZXQiLCAiZ2V0IiwgImRlbGV0ZSIsICJwb3NpdGlvbmVycyIsICJhdmVyYWdlIiwgIml0ZW1zIiwgImxlbiIsICJjb3VudCIsICJlbCIsICJlbGVtZW50IiwgImhhc1ZhbHVlIiwgInRvb2x0aXBQb3NpdGlvbiIsICJuZWFyZXN0IiwgImV2ZW50UG9zaXRpb24iLCAibWluRGlzdGFuY2UiLCAiTnVtYmVyIiwgIlBPU0lUSVZFX0lORklOSVRZIiwgIm5lYXJlc3RFbGVtZW50IiwgImNlbnRlciIsICJnZXRDZW50ZXJQb2ludCIsICJkIiwgImRpc3RhbmNlQmV0d2VlblBvaW50cyIsICJ0cCIsICJwdXNoT3JDb25jYXQiLCAiYmFzZSIsICJ0b1B1c2giLCAiQXJyYXkiLCAicHJvdG90eXBlIiwgImFwcGx5IiwgInNwbGl0TmV3bGluZXMiLCAic3RyIiwgIlN0cmluZyIsICJpbmRleE9mIiwgInNwbGl0IiwgImNyZWF0ZVRvb2x0aXBJdGVtIiwgImdldERhdGFzZXRNZXRhIiwgInZhbHVlIiwgImdldExhYmVsQW5kVmFsdWUiLCAicGFyc2VkIiwgImdldFBhcnNlZCIsICJyYXciLCAiZm9ybWF0dGVkVmFsdWUiLCAiZGF0YXNldCIsICJnZXREYXRhc2V0IiwgImRhdGFJbmRleCIsICJnZXRUb29sdGlwU2l6ZSIsICJ0b29sdGlwIiwgImJvZHkiLCAiZm9vdGVyIiwgImJvZHlGb250IiwgImZvb3RlckZvbnQiLCAidGl0bGVMaW5lQ291bnQiLCAiZm9vdGVyTGluZUNvdW50IiwgImJvZHlMaW5lSXRlbUNvdW50IiwgImNvbWJpbmVkQm9keUxlbmd0aCIsICJib2R5SXRlbSIsICJiZWZvcmUiLCAibGluZXMiLCAiYWZ0ZXIiLCAiYmVmb3JlQm9keSIsICJhZnRlckJvZHkiLCAidGl0bGVTcGFjaW5nIiwgInRpdGxlTWFyZ2luQm90dG9tIiwgImJvZHlMaW5lSGVpZ2h0IiwgImRpc3BsYXlDb2xvcnMiLCAiYm9keVNwYWNpbmciLCAiZm9vdGVyTWFyZ2luVG9wIiwgImZvb3RlclNwYWNpbmciLCAid2lkdGhQYWRkaW5nIiwgIm1heExpbmVXaWR0aCIsICJlYWNoIiwgImNvbmNhdCIsICJib3hQYWRkaW5nIiwgImRldGVybWluZVlBbGlnbiIsICJkb2VzTm90Rml0V2l0aEFsaWduIiwgInhBbGlnbiIsICJjYXJldCIsICJjYXJldFNpemUiLCAiY2FyZXRQYWRkaW5nIiwgImRldGVybWluZVhBbGlnbiIsICJ5QWxpZ24iLCAiY2hhcnRXaWR0aCIsICJjaGFydEFyZWEiLCAiZGV0ZXJtaW5lQWxpZ25tZW50IiwgImFsaWduWCIsICJhbGlnblkiLCAicGFkZGluZ0FuZFNpemUiLCAiZ2V0QmFja2dyb3VuZFBvaW50IiwgImFsaWdubWVudCIsICJjb3JuZXJSYWRpdXMiLCAidG9wTGVmdCIsICJ0b3BSaWdodCIsICJib3R0b21MZWZ0IiwgImJvdHRvbVJpZ2h0IiwgIl9saW1pdFZhbHVlIiwgImdldEFsaWduZWRYIiwgImdldEJlZm9yZUFmdGVyQm9keUxpbmVzIiwgImNhbGxiYWNrIiwgImNyZWF0ZVRvb2x0aXBDb250ZXh0IiwgInBhcmVudCIsICJ0b29sdGlwSXRlbXMiLCAiY3JlYXRlQ29udGV4dCIsICJvdmVycmlkZUNhbGxiYWNrcyIsICJjYWxsYmFja3MiLCAiY29udGV4dCIsICJvdmVycmlkZSIsICJkZWZhdWx0Q2FsbGJhY2tzIiwgImJlZm9yZVRpdGxlIiwgIm5vb3AiLCAibGFiZWxDb3VudCIsICJtb2RlIiwgImFmdGVyVGl0bGUiLCAiYmVmb3JlTGFiZWwiLCAidG9vbHRpcEl0ZW0iLCAiaXNOdWxsT3JVbmRlZiIsICJsYWJlbENvbG9yIiwgImxhYmVsVGV4dENvbG9yIiwgImJvZHlDb2xvciIsICJsYWJlbFBvaW50U3R5bGUiLCAiYWZ0ZXJMYWJlbCIsICJiZWZvcmVGb290ZXIiLCAiYWZ0ZXJGb290ZXIiLCAiaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2siLCAiYXJnIiwgInJlc3VsdCIsICJUb29sdGlwIiwgIm9wYWNpdHkiLCAiX2FjdGl2ZSIsICJfZXZlbnRQb3NpdGlvbiIsICJfc2l6ZSIsICJfY2FjaGVkQW5pbWF0aW9ucyIsICJfdG9vbHRpcEl0ZW1zIiwgIiRhbmltYXRpb25zIiwgIiRjb250ZXh0IiwgImRhdGFQb2ludHMiLCAiY2FyZXRYIiwgImNhcmV0WSIsICJsYWJlbENvbG9ycyIsICJsYWJlbFBvaW50U3R5bGVzIiwgImxhYmVsVGV4dENvbG9ycyIsICJpbml0aWFsaXplIiwgIl9yZXNvbHZlQW5pbWF0aW9ucyIsICJjYWNoZWQiLCAic2V0Q29udGV4dCIsICJnZXRDb250ZXh0IiwgImVuYWJsZWQiLCAiYW5pbWF0aW9uIiwgImFuaW1hdGlvbnMiLCAiQW5pbWF0aW9ucyIsICJfY2FjaGVhYmxlIiwgImZyZWV6ZSIsICJnZXRUaXRsZSIsICJnZXRCZWZvcmVCb2R5IiwgImdldEJvZHkiLCAiYm9keUl0ZW1zIiwgInNjb3BlZCIsICJnZXRBZnRlckJvZHkiLCAiZ2V0Rm9vdGVyIiwgIl9jcmVhdGVJdGVtcyIsICJhY3RpdmUiLCAiYXJyYXkiLCAiaXRlbVNvcnQiLCAiY2hhbmdlZCIsICJwcm9wZXJ0aWVzIiwgInBvc2l0aW9uQW5kU2l6ZSIsICJhc3NpZ24iLCAiYmFja2dyb3VuZFBvaW50IiwgImV4dGVybmFsIiwgImRyYXdDYXJldCIsICJ0b29sdGlwUG9pbnQiLCAiY2FyZXRQb3NpdGlvbiIsICJnZXRDYXJldFBvc2l0aW9uIiwgImxpbmVUbyIsICJ4MSIsICJ5MSIsICJ4MiIsICJ5MiIsICJ4MyIsICJ5MyIsICJwdFgiLCAicHRZIiwgInB0IiwgInRpdGxlQWxpZ24iLCAidGl0bGVDb2xvciIsICJfZHJhd0NvbG9yQm94IiwgImNvbG9yWCIsICJydGxDb2xvclgiLCAieU9mZlNldCIsICJjb2xvclkiLCAibXVsdGlLZXlCYWNrZ3JvdW5kIiwgImRyYXdQb2ludCIsICJpc09iamVjdCIsICJvdXRlclgiLCAiaW5uZXJYIiwgImZpbGxSZWN0IiwgInN0cm9rZVJlY3QiLCAiZHJhd0JvZHkiLCAiYm9keUFsaWduIiwgInhMaW5lUGFkZGluZyIsICJmaWxsTGluZU9mVGV4dCIsICJib2R5QWxpZ25Gb3JDYWxjdWxhdGlvbiIsICJ0ZXh0Q29sb3IiLCAiaiIsICJpbGVuIiwgImpsZW4iLCAiZHJhd0Zvb3RlciIsICJmb290ZXJBbGlnbiIsICJmb290ZXJDb2xvciIsICJkcmF3QmFja2dyb3VuZCIsICJ0b29sdGlwU2l6ZSIsICJtb3ZlVG8iLCAicXVhZHJhdGljQ3VydmVUbyIsICJjbG9zZVBhdGgiLCAiX3VwZGF0ZUFuaW1hdGlvblRhcmdldCIsICJhbmltcyIsICJhbmltWCIsICJhbmltWSIsICJwb2ludCIsICJfdG8iLCAiX3dpbGxSZW5kZXIiLCAiYWJzIiwgImhhc1Rvb2x0aXBDb250ZW50IiwgImdsb2JhbEFscGhhIiwgImdldEFjdGl2ZUVsZW1lbnRzIiwgInNldEFjdGl2ZUVsZW1lbnRzIiwgImFjdGl2ZUVsZW1lbnRzIiwgImxhc3RBY3RpdmUiLCAiRXJyb3IiLCAiX2VsZW1lbnRzRXF1YWwiLCAicG9zaXRpb25DaGFuZ2VkIiwgIl9wb3NpdGlvbkNoYW5nZWQiLCAiX2lnbm9yZVJlcGxheUV2ZW50cyIsICJpbkNoYXJ0QXJlYSIsICJfZ2V0QWN0aXZlRWxlbWVudHMiLCAiZ2V0RWxlbWVudHNBdEV2ZW50Rm9yTW9kZSIsICJhZnRlckluaXQiLCAicmVzZXQiLCAiYWZ0ZXJEcmF3IiwgIm5vdGlmeVBsdWdpbnMiLCAiY2FuY2VsYWJsZSIsICJ1c2VGaW5hbFBvc2l0aW9uIiwgImR1cmF0aW9uIiwgImVhc2luZyIsICJudW1iZXJzIiwgIl9mYWxsYmFjayIsICJhZGRpdGlvbmFsT3B0aW9uU2NvcGVzIiwgImFkZElmU3RyaW5nIiwgImxhYmVscyIsICJyYXciLCAiaW5kZXgiLCAiYWRkZWRMYWJlbHMiLCAicHVzaCIsICJ1bnNoaWZ0IiwgImxhYmVsIiwgImlzTmFOIiwgImZpbmRPckFkZExhYmVsIiwgImZpcnN0IiwgImluZGV4T2YiLCAibGFzdCIsICJsYXN0SW5kZXhPZiIsICJ2YWxpZEluZGV4IiwgIm1heCIsICJfbGltaXRWYWx1ZSIsICJNYXRoIiwgInJvdW5kIiwgIl9nZXRMYWJlbEZvclZhbHVlIiwgInZhbHVlIiwgImdldExhYmVscyIsICJsZW5ndGgiLCAiQ2F0ZWdvcnlTY2FsZSIsICJTY2FsZSIsICJjb25zdHJ1Y3RvciIsICJjZmciLCAiX3N0YXJ0VmFsdWUiLCAidW5kZWZpbmVkIiwgIl92YWx1ZVJhbmdlIiwgIl9hZGRlZExhYmVscyIsICJpbml0IiwgInNjYWxlT3B0aW9ucyIsICJhZGRlZCIsICJzcGxpY2UiLCAicGFyc2UiLCAiaXNOdWxsT3JVbmRlZiIsICJpc0Zpbml0ZSIsICJ2YWx1ZU9yRGVmYXVsdCIsICJkZXRlcm1pbmVEYXRhTGltaXRzIiwgIm1pbkRlZmluZWQiLCAibWF4RGVmaW5lZCIsICJnZXRVc2VyQm91bmRzIiwgIm1pbiIsICJnZXRNaW5NYXgiLCAib3B0aW9ucyIsICJib3VuZHMiLCAiYnVpbGRUaWNrcyIsICJvZmZzZXQiLCAidGlja3MiLCAic2xpY2UiLCAiZ2V0TGFiZWxGb3JWYWx1ZSIsICJjYWxsIiwgImNvbmZpZ3VyZSIsICJpc0hvcml6b250YWwiLCAiX3JldmVyc2VQaXhlbHMiLCAiZ2V0UGl4ZWxGb3JWYWx1ZSIsICJOYU4iLCAiZ2V0UGl4ZWxGb3JEZWNpbWFsIiwgImdldFBpeGVsRm9yVGljayIsICJnZXRWYWx1ZUZvclBpeGVsIiwgInBpeGVsIiwgImdldERlY2ltYWxGb3JQaXhlbCIsICJnZXRCYXNlUGl4ZWwiLCAiYm90dG9tIiwgImlkIiwgImRlZmF1bHRzIiwgImNhbGxiYWNrIiwgImdlbmVyYXRlVGlja3MiLCAiZ2VuZXJhdGlvbk9wdGlvbnMiLCAiZGF0YVJhbmdlIiwgIk1JTl9TUEFDSU5HIiwgInN0ZXAiLCAicHJlY2lzaW9uIiwgImNvdW50IiwgIm1heFRpY2tzIiwgIm1heERpZ2l0cyIsICJpbmNsdWRlQm91bmRzIiwgInVuaXQiLCAibWF4U3BhY2VzIiwgInJtaW4iLCAicm1heCIsICJjb3VudERlZmluZWQiLCAibWluU3BhY2luZyIsICJzcGFjaW5nIiwgIm5pY2VOdW0iLCAiZmFjdG9yIiwgIm5pY2VNaW4iLCAibmljZU1heCIsICJudW1TcGFjZXMiLCAiY2VpbCIsICJmbG9vciIsICJwb3ciLCAiYWxtb3N0V2hvbGUiLCAiYWxtb3N0RXF1YWxzIiwgImRlY2ltYWxQbGFjZXMiLCAiX2RlY2ltYWxQbGFjZXMiLCAiaiIsICJyZWxhdGl2ZUxhYmVsU2l6ZSIsICJ0aWNrVmFsdWUiLCAiaG9yaXpvbnRhbCIsICJtaW5Sb3RhdGlvbiIsICJyYWQiLCAidG9SYWRpYW5zIiwgInJhdGlvIiwgInNpbiIsICJjb3MiLCAiTGluZWFyU2NhbGVCYXNlIiwgInN0YXJ0IiwgImVuZCIsICJfZW5kVmFsdWUiLCAiTnVtYmVyIiwgImhhbmRsZVRpY2tSYW5nZU9wdGlvbnMiLCAiYmVnaW5BdFplcm8iLCAic2V0TWluIiwgInYiLCAic2V0TWF4IiwgIm1pblNpZ24iLCAic2lnbiIsICJtYXhTaWduIiwgImFicyIsICJnZXRUaWNrTGltaXQiLCAidGlja09wdHMiLCAibWF4VGlja3NMaW1pdCIsICJzdGVwU2l6ZSIsICJjb25zb2xlIiwgIndhcm4iLCAiY29tcHV0ZVRpY2tMaW1pdCIsICJQT1NJVElWRV9JTkZJTklUWSIsICJvcHRzIiwgIm51bWVyaWNHZW5lcmF0b3JPcHRpb25zIiwgIl9tYXhEaWdpdHMiLCAiX3JhbmdlIiwgIl9zZXRNaW5BbmRNYXhCeUtleSIsICJyZXZlcnNlIiwgImZvcm1hdE51bWJlciIsICJjaGFydCIsICJsb2NhbGUiLCAiZm9ybWF0IiwgIkxpbmVhclNjYWxlIiwgIndpZHRoIiwgImhlaWdodCIsICJ0aWNrRm9udCIsICJfcmVzb2x2ZVRpY2tGb250T3B0aW9ucyIsICJsaW5lSGVpZ2h0IiwgIlRpY2tzIiwgImZvcm1hdHRlcnMiLCAibnVtZXJpYyIsICJsb2cxMEZsb29yIiwgImxvZzEwIiwgImNoYW5nZUV4cG9uZW50IiwgIm0iLCAiaXNNYWpvciIsICJ0aWNrVmFsIiwgInJlbWFpbiIsICJzdGVwcyIsICJyYW5nZUV4cCIsICJyYW5nZVN0ZXAiLCAic3RhcnRFeHAiLCAicmFuZ2UiLCAiZmluaXRlT3JEZWZhdWx0IiwgIm1pbkV4cCIsICJleHAiLCAiYmFzZSIsICJzaWduaWZpY2FuZCIsICJtYWpvciIsICJsYXN0VGljayIsICJMb2dhcml0aG1pY1NjYWxlIiwgInByb3RvdHlwZSIsICJhcHBseSIsICJfemVybyIsICJfc3VnZ2VzdGVkTWluIiwgIl91c2VyTWluIiwgIl91c2VyTWF4IiwgImRlY2ltYWwiLCAibG9nYXJpdGhtaWMiLCAiZW5hYmxlZCIsICJnZXRUaWNrQmFja2Ryb3BIZWlnaHQiLCAiZGlzcGxheSIsICJwYWRkaW5nIiwgInRvUGFkZGluZyIsICJiYWNrZHJvcFBhZGRpbmciLCAiZm9udCIsICJzaXplIiwgIm1lYXN1cmVMYWJlbFNpemUiLCAiY3R4IiwgImlzQXJyYXkiLCAidyIsICJfbG9uZ2VzdFRleHQiLCAic3RyaW5nIiwgImgiLCAiZGV0ZXJtaW5lTGltaXRzIiwgImFuZ2xlIiwgInBvcyIsICJmaXRXaXRoUG9pbnRMYWJlbHMiLCAic2NhbGUiLCAib3JpZyIsICJsIiwgImxlZnQiLCAiX3BhZGRpbmciLCAiciIsICJyaWdodCIsICJ0IiwgInRvcCIsICJiIiwgImxpbWl0cyIsICJPYmplY3QiLCAiYXNzaWduIiwgImxhYmVsU2l6ZXMiLCAidmFsdWVDb3VudCIsICJfcG9pbnRMYWJlbHMiLCAicG9pbnRMYWJlbE9wdHMiLCAicG9pbnRMYWJlbHMiLCAiYWRkaXRpb25hbEFuZ2xlIiwgImNlbnRlclBvaW50TGFiZWxzIiwgIlBJIiwgImkiLCAic2V0Q29udGV4dCIsICJnZXRQb2ludExhYmVsQ29udGV4dCIsICJwb2ludFBvc2l0aW9uIiwgImdldFBvaW50UG9zaXRpb24iLCAiZHJhd2luZ0FyZWEiLCAicGxGb250IiwgInRvRm9udCIsICJ0ZXh0U2l6ZSIsICJhbmdsZVJhZGlhbnMiLCAiX25vcm1hbGl6ZUFuZ2xlIiwgImdldEluZGV4QW5nbGUiLCAidG9EZWdyZWVzIiwgImhMaW1pdHMiLCAieCIsICJ2TGltaXRzIiwgInkiLCAidXBkYXRlTGltaXRzIiwgInNldENlbnRlclBvaW50IiwgIl9wb2ludExhYmVsSXRlbXMiLCAiYnVpbGRQb2ludExhYmVsSXRlbXMiLCAiY3JlYXRlUG9pbnRMYWJlbEl0ZW0iLCAiaXRlbU9wdHMiLCAib3V0ZXJEaXN0YW5jZSIsICJleHRyYSIsICJwb2ludExhYmVsUG9zaXRpb24iLCAiSEFMRl9QSSIsICJ5Rm9yQW5nbGUiLCAidGV4dEFsaWduIiwgImdldFRleHRBbGlnbkZvckFuZ2xlIiwgImxlZnRGb3JUZXh0QWxpZ24iLCAidmlzaWJsZSIsICJpc05vdE92ZXJsYXBwZWQiLCAiaXRlbSIsICJhcmVhIiwgImFwZXhlc0luQXJlYSIsICJfaXNQb2ludEluQXJlYSIsICJpdGVtcyIsICJhbGlnbiIsICJkcmF3UG9pbnRMYWJlbEJveCIsICJiYWNrZHJvcENvbG9yIiwgImJvcmRlclJhZGl1cyIsICJ0b1RSQkxDb3JuZXJzIiwgImZpbGxTdHlsZSIsICJiYWNrZHJvcExlZnQiLCAiYmFja2Ryb3BUb3AiLCAiYmFja2Ryb3BXaWR0aCIsICJiYWNrZHJvcEhlaWdodCIsICJ2YWx1ZXMiLCAic29tZSIsICJiZWdpblBhdGgiLCAiYWRkUm91bmRlZFJlY3RQYXRoIiwgInJhZGl1cyIsICJmaWxsIiwgImZpbGxSZWN0IiwgImRyYXdQb2ludExhYmVscyIsICJsYWJlbENvdW50IiwgIm9wdHNBdEluZGV4IiwgInJlbmRlclRleHQiLCAiY29sb3IiLCAidGV4dEJhc2VsaW5lIiwgInBhdGhSYWRpdXNMaW5lIiwgImNpcmN1bGFyIiwgImFyYyIsICJ4Q2VudGVyIiwgInlDZW50ZXIiLCAiVEFVIiwgIm1vdmVUbyIsICJsaW5lVG8iLCAiZHJhd1JhZGl1c0xpbmUiLCAiZ3JpZExpbmVPcHRzIiwgImJvcmRlck9wdHMiLCAibGluZVdpZHRoIiwgInNhdmUiLCAic3Ryb2tlU3R5bGUiLCAic2V0TGluZURhc2giLCAiZGFzaCIsICJsaW5lRGFzaE9mZnNldCIsICJkYXNoT2Zmc2V0IiwgImNsb3NlUGF0aCIsICJzdHJva2UiLCAicmVzdG9yZSIsICJjcmVhdGVQb2ludExhYmVsQ29udGV4dCIsICJwYXJlbnQiLCAiY3JlYXRlQ29udGV4dCIsICJ0eXBlIiwgIlJhZGlhbExpbmVhclNjYWxlIiwgInNldERpbWVuc2lvbnMiLCAibWF4V2lkdGgiLCAibWF4SGVpZ2h0IiwgImdlbmVyYXRlVGlja0xhYmVscyIsICJtYXAiLCAiY2FsbENhbGxiYWNrIiwgImZpbHRlciIsICJnZXREYXRhVmlzaWJpbGl0eSIsICJmaXQiLCAibGVmdE1vdmVtZW50IiwgInJpZ2h0TW92ZW1lbnQiLCAidG9wTW92ZW1lbnQiLCAiYm90dG9tTW92ZW1lbnQiLCAiYW5nbGVNdWx0aXBsaWVyIiwgInN0YXJ0QW5nbGUiLCAiZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUiLCAic2NhbGluZ0ZhY3RvciIsICJnZXRWYWx1ZUZvckRpc3RhbmNlRnJvbUNlbnRlciIsICJkaXN0YW5jZSIsICJzY2FsZWREaXN0YW5jZSIsICJwb2ludExhYmVsIiwgImdldENvbnRleHQiLCAiZGlzdGFuY2VGcm9tQ2VudGVyIiwgImdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZSIsICJnZXRCYXNlUG9zaXRpb24iLCAiZ2V0QmFzZVZhbHVlIiwgImdldFBvaW50TGFiZWxQb3NpdGlvbiIsICJkcmF3QmFja2dyb3VuZCIsICJiYWNrZ3JvdW5kQ29sb3IiLCAiZ3JpZCIsICJkcmF3R3JpZCIsICJhbmdsZUxpbmVzIiwgImJvcmRlciIsICJwb3NpdGlvbiIsICJmb3JFYWNoIiwgInRpY2siLCAiY29udGV4dCIsICJvcHRzQXRJbmRleEJvcmRlciIsICJib3JkZXJEYXNoIiwgImJvcmRlckRhc2hPZmZzZXQiLCAiZHJhd0JvcmRlciIsICJkcmF3TGFiZWxzIiwgInRyYW5zbGF0ZSIsICJyb3RhdGUiLCAic2hvd0xhYmVsQmFja2Ryb3AiLCAibWVhc3VyZVRleHQiLCAic3Ryb2tlQ29sb3IiLCAidGV4dFN0cm9rZUNvbG9yIiwgInN0cm9rZVdpZHRoIiwgInRleHRTdHJva2VXaWR0aCIsICJkcmF3VGl0bGUiLCAiYW5pbWF0ZSIsICJkZWZhdWx0Um91dGVzIiwgImRlc2NyaXB0b3JzIiwgIl9mYWxsYmFjayIsICJJTlRFUlZBTFMiLCAibWlsbGlzZWNvbmQiLCAiY29tbW9uIiwgInNlY29uZCIsICJtaW51dGUiLCAiaG91ciIsICJkYXkiLCAid2VlayIsICJtb250aCIsICJxdWFydGVyIiwgInllYXIiLCAiVU5JVFMiLCAia2V5cyIsICJzb3J0ZXIiLCAiYSIsICJpbnB1dCIsICJhZGFwdGVyIiwgIl9hZGFwdGVyIiwgInBhcnNlciIsICJpc29XZWVrZGF5IiwgIl9wYXJzZU9wdHMiLCAiaXNOdW1iZXIiLCAic3RhcnRPZiIsICJkZXRlcm1pbmVVbml0Rm9yQXV0b1RpY2tzIiwgIm1pblVuaXQiLCAiY2FwYWNpdHkiLCAiaWxlbiIsICJpbnRlcnZhbCIsICJNQVhfU0FGRV9JTlRFR0VSIiwgImRldGVybWluZVVuaXRGb3JGb3JtYXR0aW5nIiwgIm51bVRpY2tzIiwgImRpZmYiLCAiZGV0ZXJtaW5lTWFqb3JVbml0IiwgImFkZFRpY2siLCAidGltZSIsICJ0aW1lc3RhbXBzIiwgImxvIiwgImhpIiwgIl9sb29rdXAiLCAidGltZXN0YW1wIiwgInNldE1ham9yVGlja3MiLCAibWFqb3JVbml0IiwgImFkZCIsICJ0aWNrc0Zyb21UaW1lc3RhbXBzIiwgIlRpbWVTY2FsZSIsICJwcm9wcyIsICJfY2FjaGUiLCAiZGF0YSIsICJhbGwiLCAiX3VuaXQiLCAiX21ham9yVW5pdCIsICJfb2Zmc2V0cyIsICJfbm9ybWFsaXplZCIsICJzY2FsZU9wdHMiLCAiYWRhcHRlcnMiLCAiX2RhdGUiLCAiZGF0ZSIsICJtZXJnZUlmIiwgImRpc3BsYXlGb3JtYXRzIiwgImZvcm1hdHMiLCAibm9ybWFsaXplZCIsICJiZWZvcmVMYXlvdXQiLCAiX2FwcGx5Qm91bmRzIiwgIl9nZXRMYWJlbEJvdW5kcyIsICJzb3VyY2UiLCAiRGF0ZSIsICJub3ciLCAiZW5kT2YiLCAiYXJyIiwgImdldExhYmVsVGltZXN0YW1wcyIsICJORUdBVElWRV9JTkZJTklUWSIsICJ0aW1lT3B0cyIsICJfZ2VuZXJhdGUiLCAiX2ZpbHRlckJldHdlZW4iLCAiYXV0b1NraXAiLCAiX2dldExhYmVsQ2FwYWNpdHkiLCAiaW5pdE9mZnNldHMiLCAiYWZ0ZXJBdXRvU2tpcCIsICJvZmZzZXRBZnRlckF1dG9za2lwIiwgImdldERlY2ltYWxGb3JWYWx1ZSIsICJsaW1pdCIsICJtaW5vciIsICJ3ZWVrZGF5IiwgImhhc1dlZWtkYXkiLCAiRXJyb3IiLCAiZ2V0RGF0YVRpbWVzdGFtcHMiLCAic29ydCIsICJ0b29sdGlwRm9ybWF0IiwgImRhdGV0aW1lIiwgImZtdCIsICJfdGlja0Zvcm1hdEZ1bmN0aW9uIiwgImZvcm1hdHRlciIsICJtaW5vckZvcm1hdCIsICJtYWpvckZvcm1hdCIsICJvZmZzZXRzIiwgIl9nZXRMYWJlbFNpemUiLCAidGlja3NPcHRzIiwgInRpY2tMYWJlbFdpZHRoIiwgIm1heFJvdGF0aW9uIiwgImNvc1JvdGF0aW9uIiwgInNpblJvdGF0aW9uIiwgInRpY2tGb250U2l6ZSIsICJleGFtcGxlVGltZSIsICJleGFtcGxlTGFiZWwiLCAibWV0YXMiLCAiZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMiLCAiY29udHJvbGxlciIsICJnZXRBbGxQYXJzZWRWYWx1ZXMiLCAiY29uY2F0IiwgIm5vcm1hbGl6ZSIsICJfYXJyYXlVbmlxdWUiLCAiaW50ZXJwb2xhdGUiLCAidGFibGUiLCAidmFsIiwgInByZXZTb3VyY2UiLCAibmV4dFNvdXJjZSIsICJwcmV2VGFyZ2V0IiwgIm5leHRUYXJnZXQiLCAiX2xvb2t1cEJ5S2V5IiwgInNwYW4iLCAiVGltZVNlcmllc1NjYWxlIiwgIl90YWJsZSIsICJfbWluUG9zIiwgIl90YWJsZVJhbmdlIiwgIl9nZXRUaW1lc3RhbXBzRm9yVGFibGUiLCAiYnVpbGRMb29rdXBUYWJsZSIsICJwcmV2IiwgImN1cnIiLCAibmV4dCIsICJpbmNsdWRlcyIsICJhcHAiLCAiaCIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImFwcCIsICJpbXBvcnRfb2JzaWRpYW4iLCAiQ2FyZE9yZGVyIiwgIkRlY2tPcmRlciIsICJEZWNrIiwgInBhcnNlIiwgInQiLCAicGFyc2UiLCAic2NoZWR1bGUiLCAiaW1wb3J0X29ic2lkaWFuIiwgIk9ic2lkaWFuR2V0QWxsVGFncyIsICJzY2hlZHVsZSIsICJEZWNrIiwgInJhbmsiLCAiZWFzZSJdCn0K
|