br-utils
Version:
Utility resources to deal with Brazilian-related data.
446 lines (413 loc) • 98.8 kB
JavaScript
/**
* br-utils v2.0.4
*
* @author Julio L. Muller.
* @license MIT - 2025
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.brUtils = factory());
})(this, (function () { 'use strict';
/**
* Copyright (C) 2017-present by Andrea Giammarchi - @WebReflection
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
const {
replace
} = '';
const ca = /[&<>'"]/g;
const esca = {
'&': '&',
'<': '<',
'>': '>',
"'": ''',
'"': '"'
};
const pe = m => esca[m];
/**
* Safely escape HTML entities such as `&`, `<`, `>`, `"`, and `'`.
* @param {string} es the input to safely escape
* @returns {string} the escaped input, and it **throws** an error if
* the input type is unexpected, except for boolean and numbers,
* converted as string.
*/
const escape = es => replace.call(es, ca, pe);
function getDefaultExportFromCjs (x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
}
var build;
var hasRequiredBuild;
function requireBuild () {
if (hasRequiredBuild) return build;
hasRequiredBuild = 1;
function numOnly(target) {
return String(target).replace(/\D/g, "");
}
build = numOnly;
return build;
}
var buildExports = requireBuild();
var numOnly = /*@__PURE__*/getDefaultExportFromCjs(buildExports);
var cjs;
var hasRequiredCjs;
function requireCjs() {
if (hasRequiredCjs) return cjs;
hasRequiredCjs = 1;
var isMergeableObject = function isMergeableObject(value) {
return isNonNullObject(value) && !isSpecial(value);
};
function isNonNullObject(value) {
return !!value && typeof value === 'object';
}
function isSpecial(value) {
var stringValue = Object.prototype.toString.call(value);
return stringValue === '[object RegExp]' || stringValue === '[object Date]' || isReactElement(value);
}
// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25
var canUseSymbol = typeof Symbol === 'function' && Symbol.for;
var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;
function isReactElement(value) {
return value.$$typeof === REACT_ELEMENT_TYPE;
}
function emptyTarget(val) {
return Array.isArray(val) ? [] : {};
}
function cloneUnlessOtherwiseSpecified(value, options) {
return options.clone !== false && options.isMergeableObject(value) ? deepmerge(emptyTarget(value), value, options) : value;
}
function defaultArrayMerge(target, source, options) {
return target.concat(source).map(function (element) {
return cloneUnlessOtherwiseSpecified(element, options);
});
}
function getMergeFunction(key, options) {
if (!options.customMerge) {
return deepmerge;
}
var customMerge = options.customMerge(key);
return typeof customMerge === 'function' ? customMerge : deepmerge;
}
function getEnumerableOwnPropertySymbols(target) {
return Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(target).filter(function (symbol) {
return Object.propertyIsEnumerable.call(target, symbol);
}) : [];
}
function getKeys(target) {
return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target));
}
function propertyIsOnObject(object, property) {
try {
return property in object;
} catch (_) {
return false;
}
}
// Protects from prototype poisoning and unexpected merging up the prototype chain.
function propertyIsUnsafe(target, key) {
return propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,
&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,
&& Object.propertyIsEnumerable.call(target, key)); // and also unsafe if they're nonenumerable.
}
function mergeObject(target, source, options) {
var destination = {};
if (options.isMergeableObject(target)) {
getKeys(target).forEach(function (key) {
destination[key] = cloneUnlessOtherwiseSpecified(target[key], options);
});
}
getKeys(source).forEach(function (key) {
if (propertyIsUnsafe(target, key)) {
return;
}
if (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {
destination[key] = getMergeFunction(key, options)(target[key], source[key], options);
} else {
destination[key] = cloneUnlessOtherwiseSpecified(source[key], options);
}
});
return destination;
}
function deepmerge(target, source, options) {
options = options || {};
options.arrayMerge = options.arrayMerge || defaultArrayMerge;
options.isMergeableObject = options.isMergeableObject || isMergeableObject;
// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()
// implementations can use it. The caller may not replace it.
options.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;
var sourceIsArray = Array.isArray(source);
var targetIsArray = Array.isArray(target);
var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;
if (!sourceAndTargetTypesMatch) {
return cloneUnlessOtherwiseSpecified(source, options);
} else if (sourceIsArray) {
return options.arrayMerge(target, source, options);
} else {
return mergeObject(target, source, options);
}
}
deepmerge.all = function deepmergeAll(array, options) {
if (!Array.isArray(array)) {
throw new Error('first argument should be an array');
}
return array.reduce(function (prev, next) {
return deepmerge(prev, next, options);
}, {});
};
var deepmerge_1 = deepmerge;
cjs = deepmerge_1;
return cjs;
}
var cjsExports = requireCjs();
var mergeDeep = /*@__PURE__*/getDefaultExportFromCjs(cjsExports);
const defaultOptions$3 = {
delimiters: {
dot: ".",
slash: "/",
dash: "-"
},
hiddenRange: {
start: 5,
end: 13
},
onFail: (value) => value,
hiddenKey: "*",
hidden: false,
escape: false
};
function mergeOptions$3(customOptions = {}) {
const options = mergeDeep(
defaultOptions$3,
customOptions
);
if (options.hidden) {
if (isNaN(options.hiddenRange.start) || options.hiddenRange.start < 0 || options.hiddenRange.start > 13) {
throw new TypeError('Option "hiddenRange.start" must be a number between 0 and 13.');
}
if (isNaN(options.hiddenRange.end) || options.hiddenRange.end < 0 || options.hiddenRange.end > 13) {
throw new TypeError('Option "hiddenRange.end" must be a number between 0 and 13.');
}
if (options.hiddenRange.start > options.hiddenRange.end) {
const aux = options.hiddenRange.start;
options.hiddenRange.start = options.hiddenRange.end;
options.hiddenRange.end = aux;
}
}
if (typeof options.onFail !== "function") {
throw new TypeError('The option "onFail" must be a callback function.');
}
return options;
}
function cnpjFmt(cnpjString, options) {
const CNPJ_LENGTH = 14;
const cnpjArray = numOnly(cnpjString).split("");
const customOptions = mergeOptions$3(options);
if (cnpjArray.length !== CNPJ_LENGTH) {
const error = new Error(`Parameter "${cnpjString}" does not contain ${CNPJ_LENGTH} digits.`);
return customOptions.onFail(cnpjString, error);
}
if (customOptions.hidden) {
for (let i = customOptions.hiddenRange.start; i <= customOptions.hiddenRange.end; i++) {
cnpjArray[i] = customOptions.hiddenKey;
}
}
cnpjArray.splice(12, 0, customOptions.delimiters.dash);
cnpjArray.splice(8, 0, customOptions.delimiters.slash);
cnpjArray.splice(5, 0, customOptions.delimiters.dot);
cnpjArray.splice(2, 0, customOptions.delimiters.dot);
const cnpjPretty = cnpjArray.join("");
if (customOptions.escape) {
return escape(cnpjPretty);
}
return cnpjPretty;
}
function calculateDigit(cnpjSequence) {
let index = 2;
const sum = [...cnpjSequence].reduceRight((previousResult, number) => {
const result = previousResult + number * index;
index = index === 9 ? 2 : index + 1;
return result;
}, 0);
const remainder = sum % 11;
return remainder < 2 ? 0 : 11 - remainder;
}
const defaultOptions$2 = {
format: false,
prefix: ""
};
function mergeOptions$2(customOptions = {}) {
return mergeDeep(defaultOptions$2, customOptions);
}
function numberGenerator$1(length) {
const numericSequence = [];
while (numericSequence.length < length) {
const random = Math.random() * 10;
const integer = Math.floor(random);
numericSequence.push(integer);
}
return numericSequence;
}
function cnpjGen(options) {
const userOptions = mergeOptions$2(options);
const baseSequence = numOnly(userOptions.prefix);
const prefixLength = baseSequence.length;
if (prefixLength < 0 || prefixLength > 12) {
throw new Error('Option "prefix" must be a string containing between 1 and 12 digits.');
}
if (prefixLength > 8 && baseSequence.slice(8) === "0000") {
throw new Error('The branch ID (characters 8 to 11) cannot be "0000".');
}
const branchID = [0, 0, 0, Math.ceil(Math.random() * 9)];
const cnpjSequence = baseSequence.split("").map(Number).concat(numberGenerator$1(8 - prefixLength)).concat(branchID.slice(0, 12 - prefixLength));
cnpjSequence.push(calculateDigit(cnpjSequence));
cnpjSequence.push(calculateDigit(cnpjSequence));
return userOptions.format ? cnpjFmt(cnpjSequence.join("")) : cnpjSequence.join("");
}
function cnpjVal(cnpjString) {
const CNPJ_LENGTH = 14;
const cnpjDigits = numOnly(cnpjString);
if (cnpjDigits.length !== CNPJ_LENGTH) {
return false;
}
return cnpjDigits === cnpjGen({
prefix: cnpjDigits.slice(0, 12)
});
}
const format$1 = cnpjFmt;
const generate$1 = cnpjGen;
const isValid$1 = cnpjVal;
var module$2 = { format: format$1, generate: generate$1, isValid: isValid$1 };
const defaultOptions$1 = {
delimiters: {
dot: ".",
dash: "-"
},
hiddenRange: {
start: 3,
end: 10
},
onFail: (value) => value,
hiddenKey: "*",
hidden: false,
escape: false
};
function mergeOptions$1(customOptions = {}) {
const options = mergeDeep(
defaultOptions$1,
customOptions
);
if (options.hidden) {
if (isNaN(options.hiddenRange.start) || options.hiddenRange.start < 0 || options.hiddenRange.start > 10) {
throw new TypeError('Option "hiddenRange.start" must be a number between 0 and 10.');
}
if (isNaN(options.hiddenRange.end) || options.hiddenRange.end < 0 || options.hiddenRange.end > 10) {
throw new TypeError('Option "hiddenRange.end" must be a number between 0 and 10.');
}
if (options.hiddenRange.start > options.hiddenRange.end) {
const aux = options.hiddenRange.start;
options.hiddenRange.start = options.hiddenRange.end;
options.hiddenRange.end = aux;
}
}
if (typeof options.onFail !== "function") {
throw new TypeError('The option "onFail" must be a callback function.');
}
return options;
}
function cpfFmt(cpfString, options) {
const CPF_LENGTH = 11;
const cpfArray = numOnly(cpfString).split("");
const customOptions = mergeOptions$1(options);
if (cpfArray.length !== CPF_LENGTH) {
const error = new Error(`Parameter "${cpfString}" does not contain ${CPF_LENGTH} digits.`);
return customOptions.onFail(cpfString, error);
}
if (customOptions.hidden) {
for (let i = customOptions.hiddenRange.start; i <= customOptions.hiddenRange.end; i++) {
cpfArray[i] = customOptions.hiddenKey;
}
}
cpfArray.splice(9, 0, customOptions.delimiters.dash);
cpfArray.splice(6, 0, customOptions.delimiters.dot);
cpfArray.splice(3, 0, customOptions.delimiters.dot);
const cpfPretty = cpfArray.join("");
if (customOptions.escape) {
return escape(cpfPretty);
}
return cpfPretty;
}
const defaultOptions = {
format: false,
prefix: ""
};
function mergeOptions(customOptions = {}) {
return mergeDeep(defaultOptions, customOptions);
}
function numberGenerator(length) {
const numericSequence = [];
while (numericSequence.length < length) {
const random = Math.random() * 10;
const integer = Math.floor(random);
numericSequence.push(integer);
}
return numericSequence;
}
function cpfGen(options) {
const userOptions = mergeOptions(options);
const baseSequence = numOnly(userOptions.prefix);
const prefixLength = baseSequence.length;
if (prefixLength < 0 || prefixLength > 9) {
throw new Error('Option "prefix" must be a string containing between 1 and 9 digits.');
}
const cpfSequence = baseSequence.split("").map(Number).concat(numberGenerator(9 - prefixLength));
[9, 10].forEach((nextNumIndex) => {
let factor = nextNumIndex + 1;
let sum = 0;
for (let n = 0; n < nextNumIndex; n++, factor--) {
sum += cpfSequence[n] * factor;
}
const remainder = 11 - sum % 11;
cpfSequence.push(remainder > 9 ? 0 : remainder);
});
return userOptions.format ? cpfFmt(cpfSequence.join("")) : cpfSequence.join("");
}
function cpfVal(cpfString) {
const CPF_LENGTH = 11;
const cpfDigits = numOnly(cpfString);
if (cpfDigits.length !== CPF_LENGTH) {
return false;
}
return cpfDigits === cpfGen({
prefix: cpfDigits.substring(0, 9)
});
}
const format = cpfFmt;
const generate = cpfGen;
const isValid = cpfVal;
var module$1 = { format, generate, isValid };
var cnpj = module$2;
var cpf = module$1;
var module = {
cnpj: cnpj,
cpf: cpf
};
return module;
}));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnItdXRpbHMuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9odG1sLWVzY2FwZXIvZXNtL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL251bS1vbmx5L2J1aWxkL2luZGV4LmNqcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kZWVwbWVyZ2UvZGlzdC9janMuanMiLCIuLi8uLi9jbnBqLWZtdC9idWlsZC9pbmRleC5tanMiLCIuLi8uLi9jbnBqLWdlbi9idWlsZC9pbmRleC5tanMiLCIuLi8uLi9jbnBqLXZhbC9idWlsZC9pbmRleC5tanMiLCIuLi8uLi9jbnBqLXV0aWxzL2J1aWxkL2luZGV4Lm1qcyIsIi4uLy4uL2NwZi1mbXQvYnVpbGQvaW5kZXgubWpzIiwiLi4vLi4vY3BmLWdlbi9idWlsZC9pbmRleC5tanMiLCIuLi8uLi9jcGYtdmFsL2J1aWxkL2luZGV4Lm1qcyIsIi4uLy4uL2NwZi11dGlscy9idWlsZC9pbmRleC5tanMiLCIuLi9zcmMvbW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChDKSAyMDE3LXByZXNlbnQgYnkgQW5kcmVhIEdpYW1tYXJjaGkgLSBAV2ViUmVmbGVjdGlvblxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cblxuY29uc3Qge3JlcGxhY2V9ID0gJyc7XG5cbi8vIGVzY2FwZVxuY29uc3QgZXMgPSAvJig/OmFtcHwjMzh8bHR8IzYwfGd0fCM2MnxhcG9zfCMzOXxxdW90fCMzNCk7L2c7XG5jb25zdCBjYSA9IC9bJjw+J1wiXS9nO1xuXG5jb25zdCBlc2NhID0ge1xuICAnJic6ICcmYW1wOycsXG4gICc8JzogJyZsdDsnLFxuICAnPic6ICcmZ3Q7JyxcbiAgXCInXCI6ICcmIzM5OycsXG4gICdcIic6ICcmcXVvdDsnXG59O1xuY29uc3QgcGUgPSBtID0+IGVzY2FbbV07XG5cbi8qKlxuICogU2FmZWx5IGVzY2FwZSBIVE1MIGVudGl0aWVzIHN1Y2ggYXMgYCZgLCBgPGAsIGA+YCwgYFwiYCwgYW5kIGAnYC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBlcyB0aGUgaW5wdXQgdG8gc2FmZWx5IGVzY2FwZVxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGVzY2FwZWQgaW5wdXQsIGFuZCBpdCAqKnRocm93cyoqIGFuIGVycm9yIGlmXG4gKiAgdGhlIGlucHV0IHR5cGUgaXMgdW5leHBlY3RlZCwgZXhjZXB0IGZvciBib29sZWFuIGFuZCBudW1iZXJzLFxuICogIGNvbnZlcnRlZCBhcyBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBlc2NhcGUgPSBlcyA9PiByZXBsYWNlLmNhbGwoZXMsIGNhLCBwZSk7XG5cblxuLy8gdW5lc2NhcGVcbmNvbnN0IHVuZXMgPSB7XG4gICcmYW1wOyc6ICcmJyxcbiAgJyYjMzg7JzogJyYnLFxuICAnJmx0Oyc6ICc8JyxcbiAgJyYjNjA7JzogJzwnLFxuICAnJmd0Oyc6ICc+JyxcbiAgJyYjNjI7JzogJz4nLFxuICAnJmFwb3M7JzogXCInXCIsXG4gICcmIzM5Oyc6IFwiJ1wiLFxuICAnJnF1b3Q7JzogJ1wiJyxcbiAgJyYjMzQ7JzogJ1wiJ1xufTtcbmNvbnN0IGNhcGUgPSBtID0+IHVuZXNbbV07XG5cbi8qKlxuICogU2FmZWx5IHVuZXNjYXBlIHByZXZpb3VzbHkgZXNjYXBlZCBlbnRpdGllcyBzdWNoIGFzIGAmYCwgYDxgLCBgPmAsIGBcImAsXG4gKiBhbmQgYCdgLlxuICogQHBhcmFtIHtzdHJpbmd9IHVuIGEgcHJldmlvdXNseSBlc2NhcGVkIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gdGhlIHVuZXNjYXBlZCBpbnB1dCwgYW5kIGl0ICoqdGhyb3dzKiogYW4gZXJyb3IgaWZcbiAqICB0aGUgaW5wdXQgdHlwZSBpcyB1bmV4cGVjdGVkLCBleGNlcHQgZm9yIGJvb2xlYW4gYW5kIG51bWJlcnMsXG4gKiAgY29udmVydGVkIGFzIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHVuZXNjYXBlID0gdW4gPT4gcmVwbGFjZS5jYWxsKHVuLCBlcywgY2FwZSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIG51bU9ubHkodGFyZ2V0KSB7XG4gIHJldHVybiBTdHJpbmcodGFyZ2V0KS5yZXBsYWNlKC9cXEQvZywgXCJcIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbnVtT25seTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYVc1a1pYZ3VZMnB6SWl3aWMyOTFjbU5sY3lJNld5SXVMaTl6Y21NdmJuVnRMVzl1YkhrdWRITWlYU3dpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpWm5WdVkzUnBiMjRnYm5WdFQyNXNlU2gwWVhKblpYUTZJSFZ1YTI1dmQyNHBPaUJ6ZEhKcGJtY2dlMXh1SUNCeVpYUjFjbTRnVTNSeWFXNW5LSFJoY21kbGRDa3VjbVZ3YkdGalpTZ3ZYRnhFTDJjc0lDY25LVHRjYm4xY2JseHVaWGh3YjNKMElHUmxabUYxYkhRZ2JuVnRUMjVzZVR0Y2JpSmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU96dEJRVUZCTEZOQlFWTXNVVUZCVVN4TlFVRjVRaXhGUVVGQk8wRkJRM2hETEVWQlFVRXNUMEZCVHl4TlFVRlBMRU5CUVVFc1RVRkJUU3hEUVVGRkxFTkJRVUVzVDBGQlFTeERRVUZSTEU5QlFVOHNSVUZCUlN4RFFVRkJPMEZCUTNwRE96czdPeUo5XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc01lcmdlYWJsZU9iamVjdCA9IGZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlKSB7XG5cdHJldHVybiBpc05vbk51bGxPYmplY3QodmFsdWUpXG5cdFx0JiYgIWlzU3BlY2lhbCh2YWx1ZSlcbn07XG5cbmZ1bmN0aW9uIGlzTm9uTnVsbE9iamVjdCh2YWx1ZSkge1xuXHRyZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG59XG5cbmZ1bmN0aW9uIGlzU3BlY2lhbCh2YWx1ZSkge1xuXHR2YXIgc3RyaW5nVmFsdWUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG5cdHJldHVybiBzdHJpbmdWYWx1ZSA9PT0gJ1tvYmplY3QgUmVnRXhwXSdcblx0XHR8fCBzdHJpbmdWYWx1ZSA9PT0gJ1tvYmplY3QgRGF0ZV0nXG5cdFx0fHwgaXNSZWFjdEVsZW1lbnQodmFsdWUpXG59XG5cbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9iNWFjOTYzZmI3OTFkMTI5OGU3ZjM5NjIzNjM4M2JjOTU1ZjkxNmMxL3NyYy9pc29tb3JwaGljL2NsYXNzaWMvZWxlbWVudC9SZWFjdEVsZW1lbnQuanMjTDIxLUwyNVxudmFyIGNhblVzZVN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcjtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBjYW5Vc2VTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgOiAweGVhYzc7XG5cbmZ1bmN0aW9uIGlzUmVhY3RFbGVtZW50KHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFXG59XG5cbmZ1bmN0aW9uIGVtcHR5VGFyZ2V0KHZhbCkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gW10gOiB7fVxufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZSwgb3B0aW9ucykge1xuXHRyZXR1cm4gKG9wdGlvbnMuY2xvbmUgIT09IGZhbHNlICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpKVxuXHRcdD8gZGVlcG1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSwgdmFsdWUsIG9wdGlvbnMpXG5cdFx0OiB2YWx1ZVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuXHRyZXR1cm4gdGFyZ2V0LmNvbmNhdChzb3VyY2UpLm1hcChmdW5jdGlvbihlbGVtZW50KSB7XG5cdFx0cmV0dXJuIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGVsZW1lbnQsIG9wdGlvbnMpXG5cdH0pXG59XG5cbmZ1bmN0aW9uIGdldE1lcmdlRnVuY3Rpb24oa2V5LCBvcHRpb25zKSB7XG5cdGlmICghb3B0aW9ucy5jdXN0b21NZXJnZSkge1xuXHRcdHJldHVybiBkZWVwbWVyZ2Vcblx0fVxuXHR2YXIgY3VzdG9tTWVyZ2UgPSBvcHRpb25zLmN1c3RvbU1lcmdlKGtleSk7XG5cdHJldHVybiB0eXBlb2YgY3VzdG9tTWVyZ2UgPT09ICdmdW5jdGlvbicgPyBjdXN0b21NZXJnZSA6IGRlZXBtZXJnZVxufVxuXG5mdW5jdGlvbiBnZXRFbnVtZXJhYmxlT3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkge1xuXHRyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc1xuXHRcdD8gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpLmZpbHRlcihmdW5jdGlvbihzeW1ib2wpIHtcblx0XHRcdHJldHVybiBPYmplY3QucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0YXJnZXQsIHN5bWJvbClcblx0XHR9KVxuXHRcdDogW11cbn1cblxuZnVuY3Rpb24gZ2V0S2V5cyh0YXJnZXQpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKHRhcmdldCkuY29uY2F0KGdldEVudW1lcmFibGVPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSlcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlJc09uT2JqZWN0KG9iamVjdCwgcHJvcGVydHkpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gcHJvcGVydHkgaW4gb2JqZWN0XG5cdH0gY2F0Y2goXykge1xuXHRcdHJldHVybiBmYWxzZVxuXHR9XG59XG5cbi8vIFByb3RlY3RzIGZyb20gcHJvdG90eXBlIHBvaXNvbmluZyBhbmQgdW5leHBlY3RlZCBtZXJnaW5nIHVwIHRoZSBwcm90b3R5cGUgY2hhaW4uXG5mdW5jdGlvbiBwcm9wZXJ0eUlzVW5zYWZlKHRhcmdldCwga2V5KSB7XG5cdHJldHVybiBwcm9wZXJ0eUlzT25PYmplY3QodGFyZ2V0LCBrZXkpIC8vIFByb3BlcnRpZXMgYXJlIHNhZmUgdG8gbWVyZ2UgaWYgdGhleSBkb24ndCBleGlzdCBpbiB0aGUgdGFyZ2V0IHlldCxcblx0XHQmJiAhKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwga2V5KSAvLyB1bnNhZmUgaWYgdGhleSBleGlzdCB1cCB0aGUgcHJvdG90eXBlIGNoYWluLFxuXHRcdFx0JiYgT2JqZWN0LnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodGFyZ2V0LCBrZXkpKSAvLyBhbmQgYWxzbyB1bnNhZmUgaWYgdGhleSdyZSBub25lbnVtZXJhYmxlLlxufVxuXG5mdW5jdGlvbiBtZXJnZU9iamVjdCh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuXHR2YXIgZGVzdGluYXRpb24gPSB7fTtcblx0aWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0KSkge1xuXHRcdGdldEtleXModGFyZ2V0KS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuXHRcdFx0ZGVzdGluYXRpb25ba2V5XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHRhcmdldFtrZXldLCBvcHRpb25zKTtcblx0XHR9KTtcblx0fVxuXHRnZXRLZXlzKHNvdXJjZSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcblx0XHRpZiAocHJvcGVydHlJc1Vuc2FmZSh0YXJnZXQsIGtleSkpIHtcblx0XHRcdHJldHVyblxuXHRcdH1cblxuXHRcdGlmIChwcm9wZXJ0eUlzT25PYmplY3QodGFyZ2V0LCBrZXkpICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3Qoc291cmNlW2tleV0pKSB7XG5cdFx0XHRkZXN0aW5hdGlvbltrZXldID0gZ2V0TWVyZ2VGdW5jdGlvbihrZXksIG9wdGlvbnMpKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSwgb3B0aW9ucyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlc3RpbmF0aW9uW2tleV0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChzb3VyY2Vba2V5XSwgb3B0aW9ucyk7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGRlc3RpbmF0aW9uXG59XG5cbmZ1bmN0aW9uIGRlZXBtZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuXHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0b3B0aW9ucy5hcnJheU1lcmdlID0gb3B0aW9ucy5hcnJheU1lcmdlIHx8IGRlZmF1bHRBcnJheU1lcmdlO1xuXHRvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0ID0gb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCB8fCBpc01lcmdlYWJsZU9iamVjdDtcblx0Ly8gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQgaXMgYWRkZWQgdG8gYG9wdGlvbnNgIHNvIHRoYXQgY3VzdG9tIGFycmF5TWVyZ2UoKVxuXHQvLyBpbXBsZW1lbnRhdGlvbnMgY2FuIHVzZSBpdC4gVGhlIGNhbGxlciBtYXkgbm90IHJlcGxhY2UgaXQuXG5cdG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQgPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZDtcblxuXHR2YXIgc291cmNlSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoc291cmNlKTtcblx0dmFyIHRhcmdldElzQXJyYXkgPSBBcnJheS5pc0FycmF5KHRhcmdldCk7XG5cdHZhciBzb3VyY2VBbmRUYXJnZXRUeXBlc01hdGNoID0gc291cmNlSXNBcnJheSA9PT0gdGFyZ2V0SXNBcnJheTtcblxuXHRpZiAoIXNvdXJjZUFuZFRhcmdldFR5cGVzTWF0Y2gpIHtcblx0XHRyZXR1cm4gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoc291cmNlLCBvcHRpb25zKVxuXHR9IGVsc2UgaWYgKHNvdXJjZUlzQXJyYXkpIHtcblx0XHRyZXR1cm4gb3B0aW9ucy5hcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBtZXJnZU9iamVjdCh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucylcblx0fVxufVxuXG5kZWVwbWVyZ2UuYWxsID0gZnVuY3Rpb24gZGVlcG1lcmdlQWxsKGFycmF5LCBvcHRpb25zKSB7XG5cdGlmICghQXJyYXkuaXNBcnJheShhcnJheSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ2ZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSBhbiBhcnJheScpXG5cdH1cblxuXHRyZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uKHByZXYsIG5leHQpIHtcblx0XHRyZXR1cm4gZGVlcG1lcmdlKHByZXYsIG5leHQsIG9wdGlvbnMpXG5cdH0sIHt9KVxufTtcblxudmFyIGRlZXBtZXJnZV8xID0gZGVlcG1lcmdlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZXBtZXJnZV8xO1xuIiwiaW1wb3J0IHsgZXNjYXBlIH0gZnJvbSAnaHRtbC1lc2NhcGVyJztcbmltcG9ydCBudW1Pbmx5IGZyb20gJ251bS1vbmx5JztcbmltcG9ydCBtZXJnZURlZXAgZnJvbSAnZGVlcG1lcmdlJztcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGRlbGltaXRlcnM6IHtcbiAgICBkb3Q6IFwiLlwiLFxuICAgIHNsYXNoOiBcIi9cIixcbiAgICBkYXNoOiBcIi1cIlxuICB9LFxuICBoaWRkZW5SYW5nZToge1xuICAgIHN0YXJ0OiA1LFxuICAgIGVuZDogMTNcbiAgfSxcbiAgb25GYWlsOiAodmFsdWUpID0+IHZhbHVlLFxuICBoaWRkZW5LZXk6IFwiKlwiLFxuICBoaWRkZW46IGZhbHNlLFxuICBlc2NhcGU6IGZhbHNlXG59O1xuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKGN1c3RvbU9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBvcHRpb25zID0gbWVyZ2VEZWVwKFxuICAgIGRlZmF1bHRPcHRpb25zLFxuICAgIGN1c3RvbU9wdGlvbnNcbiAgKTtcbiAgaWYgKG9wdGlvbnMuaGlkZGVuKSB7XG4gICAgaWYgKGlzTmFOKG9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQpIHx8IG9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQgPCAwIHx8IG9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQgPiAxMykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT3B0aW9uIFwiaGlkZGVuUmFuZ2Uuc3RhcnRcIiBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTMuJyk7XG4gICAgfVxuICAgIGlmIChpc05hTihvcHRpb25zLmhpZGRlblJhbmdlLmVuZCkgfHwgb3B0aW9ucy5oaWRkZW5SYW5nZS5lbmQgPCAwIHx8IG9wdGlvbnMuaGlkZGVuUmFuZ2UuZW5kID4gMTMpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ09wdGlvbiBcImhpZGRlblJhbmdlLmVuZFwiIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMy4nKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQgPiBvcHRpb25zLmhpZGRlblJhbmdlLmVuZCkge1xuICAgICAgY29uc3QgYXV4ID0gb3B0aW9ucy5oaWRkZW5SYW5nZS5zdGFydDtcbiAgICAgIG9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQgPSBvcHRpb25zLmhpZGRlblJhbmdlLmVuZDtcbiAgICAgIG9wdGlvbnMuaGlkZGVuUmFuZ2UuZW5kID0gYXV4O1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMub25GYWlsICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgb3B0aW9uIFwib25GYWlsXCIgbXVzdCBiZSBhIGNhbGxiYWNrIGZ1bmN0aW9uLicpO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufVxuXG5mdW5jdGlvbiBjbnBqRm10KGNucGpTdHJpbmcsIG9wdGlvbnMpIHtcbiAgY29uc3QgQ05QSl9MRU5HVEggPSAxNDtcbiAgY29uc3QgY25wakFycmF5ID0gbnVtT25seShjbnBqU3RyaW5nKS5zcGxpdChcIlwiKTtcbiAgY29uc3QgY3VzdG9tT3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhvcHRpb25zKTtcbiAgaWYgKGNucGpBcnJheS5sZW5ndGggIT09IENOUEpfTEVOR1RIKSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYFBhcmFtZXRlciBcIiR7Y25walN0cmluZ31cIiBkb2VzIG5vdCBjb250YWluICR7Q05QSl9MRU5HVEh9IGRpZ2l0cy5gKTtcbiAgICByZXR1cm4gY3VzdG9tT3B0aW9ucy5vbkZhaWwoY25walN0cmluZywgZXJyb3IpO1xuICB9XG4gIGlmIChjdXN0b21PcHRpb25zLmhpZGRlbikge1xuICAgIGZvciAobGV0IGkgPSBjdXN0b21PcHRpb25zLmhpZGRlblJhbmdlLnN0YXJ0OyBpIDw9IGN1c3RvbU9wdGlvbnMuaGlkZGVuUmFuZ2UuZW5kOyBpKyspIHtcbiAgICAgIGNucGpBcnJheVtpXSA9IGN1c3RvbU9wdGlvbnMuaGlkZGVuS2V5O1xuICAgIH1cbiAgfVxuICBjbnBqQXJyYXkuc3BsaWNlKDEyLCAwLCBjdXN0b21PcHRpb25zLmRlbGltaXRlcnMuZGFzaCk7XG4gIGNucGpBcnJheS5zcGxpY2UoOCwgMCwgY3VzdG9tT3B0aW9ucy5kZWxpbWl0ZXJzLnNsYXNoKTtcbiAgY25wakFycmF5LnNwbGljZSg1LCAwLCBjdXN0b21PcHRpb25zLmRlbGltaXRlcnMuZG90KTtcbiAgY25wakFycmF5LnNwbGljZSgyLCAwLCBjdXN0b21PcHRpb25zLmRlbGltaXRlcnMuZG90KTtcbiAgY29uc3QgY25walByZXR0eSA9IGNucGpBcnJheS5qb2luKFwiXCIpO1xuICBpZiAoY3VzdG9tT3B0aW9ucy5lc2NhcGUpIHtcbiAgICByZXR1cm4gZXNjYXBlKGNucGpQcmV0dHkpO1xuICB9XG4gIHJldHVybiBjbnBqUHJldHR5O1xufVxuXG5leHBvcnQgeyBjbnBqRm10IGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYVc1a1pYZ3ViV3B6SWl3aWMyOTFjbU5sY3lJNld5SXVMaTl6Y21NdmJXVnlaMlV0YjNCMGFXOXVjeTUwY3lJc0lpNHVMM055WXk5amJuQnFMV1p0ZEM1MGN5SmRMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpwYlhCdmNuUWdiV1Z5WjJWRVpXVndJR1p5YjIwZ0oyUmxaWEJ0WlhKblpTYzdYRzVjYm5SNWNHVWdSR1ZsY0ZCaGNuUnBZV3c4VkQ0Z1BTQjdYRzRnSUZ0UUlHbHVJR3RsZVc5bUlGUmRQem9nUkdWbGNGQmhjblJwWVd3OFZGdFFYVDQ3WEc1OU8xeHVYRzVsZUhCdmNuUWdhVzUwWlhKbVlXTmxJRUZqZEhWaGJFTnVjR3BHYjNKdFlYUjBhVzVuVDNCMGFXOXVjenhQYmtWeWNrWmhiR3hpWVdOclBpQjdYRzRnSUdSbGJHbHRhWFJsY25NNklIdGNiaUFnSUNCa1lYTm9PaUJ6ZEhKcGJtYzdYRzRnSUNBZ1pHOTBPaUJ6ZEhKcGJtYzdYRzRnSUNBZ2MyeGhjMmc2SUhOMGNtbHVaenRjYmlBZ2ZUdGNiaUFnWlhOallYQmxPaUJpYjI5c1pXRnVPMXh1SUNCb2FXUmtaVzQ2SUdKdmIyeGxZVzQ3WEc0Z0lHaHBaR1JsYmt0bGVUb2djM1J5YVc1bk8xeHVJQ0JvYVdSa1pXNVNZVzVuWlRvZ2UxeHVJQ0FnSUdWdVpEb2diblZ0WW1WeU8xeHVJQ0FnSUhOMFlYSjBPaUJ1ZFcxaVpYSTdYRzRnSUgwN1hHNGdJRzl1Um1GcGJEb2dLSFpoYkhWbE9pQnpkSEpwYm1jc0lHVnljbTl5T2lCRmNuSnZjaWtnUFQ0Z1QyNUZjbkpHWVd4c1ltRmphenRjYm4xY2JseHVaWGh3YjNKMElIUjVjR1VnUTI1d2FrWnZjbTFoZEhScGJtZFBjSFJwYjI1elBFOXVSWEp5Um1Gc2JHSmhZMnMrSUQwZ1JHVmxjRkJoY25ScFlXdzhYRzRnSUVGamRIVmhiRU51Y0dwR2IzSnRZWFIwYVc1blQzQjBhVzl1Y3p4UGJrVnlja1poYkd4aVlXTnJQbHh1UGp0Y2JseHVZMjl1YzNRZ1pHVm1ZWFZzZEU5d2RHbHZibk02SUVGamRIVmhiRU51Y0dwR2IzSnRZWFIwYVc1blQzQjBhVzl1Y3p4emRISnBibWMrSUQwZ2UxeHVJQ0JrWld4cGJXbDBaWEp6T2lCN1hHNGdJQ0FnWkc5ME9pQW5MaWNzWEc0Z0lDQWdjMnhoYzJnNklDY3ZKeXhjYmlBZ0lDQmtZWE5vT2lBbkxTY3NYRzRnSUgwc1hHNGdJR2hwWkdSbGJsSmhibWRsT2lCN1hHNGdJQ0FnYzNSaGNuUTZJRFVzWEc0Z0lDQWdaVzVrT2lBeE15eGNiaUFnZlN4Y2JpQWdiMjVHWVdsc09pQW9kbUZzZFdVcElEMCtJSFpoYkhWbExGeHVJQ0JvYVdSa1pXNUxaWGs2SUNjcUp5eGNiaUFnYUdsa1pHVnVPaUJtWVd4elpTeGNiaUFnWlhOallYQmxPaUJtWVd4elpTeGNibjA3WEc1Y2JpOHFLbHh1SUNvZ1RXVnlaMlVnWTNWemRHOXRJRzl3ZEdsdmJuTWdkRzhnZEdobElHUmxabUYxYkhRZ2IyNWxjeTVjYmlBcUwxeHVablZ1WTNScGIyNGdiV1Z5WjJWUGNIUnBiMjV6UEU5dVJYSnlSbUZzYkdKaFkycytLRnh1SUNCamRYTjBiMjFQY0hScGIyNXpPaUJEYm5CcVJtOXliV0YwZEdsdVowOXdkR2x2Ym5NOFQyNUZjbkpHWVd4c1ltRmphejRnUFNCN2ZTeGNiaWs2SUVGamRIVmhiRU51Y0dwR2IzSnRZWFIwYVc1blQzQjBhVzl1Y3p4UGJrVnlja1poYkd4aVlXTnJQaUI3WEc0Z0lHTnZibk4wSUc5d2RHbHZibk1nUFNCdFpYSm5aVVJsWlhBb1hHNGdJQ0FnWkdWbVlYVnNkRTl3ZEdsdmJuTXNYRzRnSUNBZ1kzVnpkRzl0VDNCMGFXOXVjeXhjYmlBZ0tTQmhjeUJCWTNSMVlXeERibkJxUm05eWJXRjBkR2x1WjA5d2RHbHZibk04VDI1RmNuSkdZV3hzWW1GamF6NDdYRzVjYmlBZ2FXWWdLRzl3ZEdsdmJuTXVhR2xrWkdWdUtTQjdYRzRnSUNBZ2FXWWdLRnh1SUNBZ0lDQWdhWE5PWVU0b2IzQjBhVzl1Y3k1b2FXUmtaVzVTWVc1blpTNXpkR0Z5ZENrZ2ZIeGNiaUFnSUNBZ0lHOXdkR2x2Ym5NdWFHbGtaR1Z1VW1GdVoyVXVjM1JoY25RZ1BDQXdJSHg4WEc0Z0lDQWdJQ0J2Y0hScGIyNXpMbWhwWkdSbGJsSmhibWRsTG5OMFlYSjBJRDRnTVROY2JpQWdJQ0FwSUh0Y2JpQWdJQ0FnSUhSb2NtOTNJRzVsZHlCVWVYQmxSWEp5YjNJb0owOXdkR2x2YmlCY0ltaHBaR1JsYmxKaGJtZGxMbk4wWVhKMFhDSWdiWFZ6ZENCaVpTQmhJRzUxYldKbGNpQmlaWFIzWldWdUlEQWdZVzVrSURFekxpY3BPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHbG1JQ2hjYmlBZ0lDQWdJR2x6VG1GT0tHOXdkR2x2Ym5NdWFHbGtaR1Z1VW1GdVoyVXVaVzVrS1NCOGZGeHVJQ0FnSUNBZ2IzQjBhVzl1Y3k1b2FXUmtaVzVTWVc1blpTNWxibVFnUENBd0lIeDhYRzRnSUNBZ0lDQnZjSFJwYjI1ekxtaHBaR1JsYmxKaGJtZGxMbVZ1WkNBK0lERXpYRzRnSUNBZ0tTQjdYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLQ2RQY0hScGIyNGdYQ0pvYVdSa1pXNVNZVzVuWlM1bGJtUmNJaUJ0ZFhOMElHSmxJR0VnYm5WdFltVnlJR0psZEhkbFpXNGdNQ0JoYm1RZ01UTXVKeWs3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0c5d2RHbHZibk11YUdsa1pHVnVVbUZ1WjJVdWMzUmhjblFnUGlCdmNIUnBiMjV6TG1ocFpHUmxibEpoYm1kbExtVnVaQ2tnZTF4dUlDQWdJQ0FnWTI5dWMzUWdZWFY0SUQwZ2IzQjBhVzl1Y3k1b2FXUmtaVzVTWVc1blpTNXpkR0Z5ZER0Y2JpQWdJQ0FnSUc5d2RHbHZibk11YUdsa1pHVnVVbUZ1WjJVdWMzUmhjblFnUFNCdmNIUnBiMjV6TG1ocFpHUmxibEpoYm1kbExtVnVaRHRjYmlBZ0lDQWdJRzl3ZEdsdmJuTXVhR2xrWkdWdVVtRnVaMlV1Wlc1a0lEMGdZWFY0TzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUdsbUlDaDBlWEJsYjJZZ2IzQjBhVzl1Y3k1dmJrWmhhV3dnSVQwOUlDZG1kVzVqZEdsdmJpY3BJSHRjYmlBZ0lDQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLQ2RVYUdVZ2IzQjBhVzl1SUZ3aWIyNUdZV2xzWENJZ2JYVnpkQ0JpWlNCaElHTmhiR3hpWVdOcklHWjFibU4wYVc5dUxpY3BPMXh1SUNCOVhHNWNiaUFnY21WMGRYSnVJRzl3ZEdsdmJuTTdYRzU5WEc1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUcxbGNtZGxUM0IwYVc5dWN6dGNiaUlzSW1sdGNHOXlkQ0I3SUdWelkyRndaU0JoY3lCbGMyTmhjR1ZJVkUxTUlIMGdabkp2YlNBbmFIUnRiQzFsYzJOaGNHVnlKenRjYm1sdGNHOXlkQ0J1ZFcxUGJteDVJR1p5YjIwZ0oyNTFiUzF2Ym14NUp6dGNibHh1YVcxd2IzSjBJRzFsY21kbFQzQjBhVzl1Y3lCbWNtOXRJQ2N1TDIxbGNtZGxMVzl3ZEdsdmJuTW5PMXh1YVcxd2IzSjBJSFI1Y0dVZ2V5QkRibkJxUm05eWJXRjBkR2x1WjA5d2RHbHZibk1nZlNCbWNtOXRJQ2N1TDIxbGNtZGxMVzl3ZEdsdmJuTW5PMXh1WEc0dktpcGNiaUFxSUVadmNtMWhkQ0JoSUdkcGRtVnVJRU5PVUVvZ1kyaGhjaUJ6WlhGMVpXNWpaUzVjYmlBcUwxeHVablZ1WTNScGIyNGdZMjV3YWtadGREeFBia1Z5Y2taaGJHeGlZV05ySUQwZ2MzUnlhVzVuUGloY2JpQWdZMjV3YWxOMGNtbHVaem9nYzNSeWFXNW5MRnh1SUNCdmNIUnBiMjV6UHpvZ1EyNXdha1p2Y20xaGRIUnBibWRQY0hScGIyNXpQRTl1UlhKeVJtRnNiR0poWTJzK0xGeHVLVG9nYzNSeWFXNW5JSHRjYmlBZ1kyOXVjM1FnUTA1UVNsOU1SVTVIVkVnZ1BTQXhORHRjYmlBZ1kyOXVjM1FnWTI1d2FrRnljbUY1SUQwZ2JuVnRUMjVzZVNoamJuQnFVM1J5YVc1bktTNXpjR3hwZENnbkp5azdYRzRnSUdOdmJuTjBJR04xYzNSdmJVOXdkR2x2Ym5NZ1BTQnRaWEpuWlU5d2RHbHZibk1vYjNCMGFXOXVjeWs3WEc1Y2JpQWdhV1lnS0dOdWNHcEJjbkpoZVM1c1pXNW5kR2dnSVQwOUlFTk9VRXBmVEVWT1IxUklLU0I3WEc0Z0lDQWdZMjl1YzNRZ1pYSnliM0lnUFNCdVpYY2dSWEp5YjNJb1lGQmhjbUZ0WlhSbGNpQmNJaVI3WTI1d2FsTjBjbWx1WjMxY0lpQmtiMlZ6SUc1dmRDQmpiMjUwWVdsdUlDUjdRMDVRU2w5TVJVNUhWRWg5SUdScFoybDBjeTVnS1R0Y2JseHVJQ0FnSUhKbGRIVnliaUJqZFhOMGIyMVBjSFJwYjI1ekxtOXVSbUZwYkNoamJuQnFVM1J5YVc1bkxDQmxjbkp2Y2lrZ1lYTWdjM1J5YVc1bk8xeHVJQ0I5WEc1Y2JpQWdhV1lnS0dOMWMzUnZiVTl3ZEdsdmJuTXVhR2xrWkdWdUtTQjdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FTQTlJR04xYzNSdmJVOXdkR2x2Ym5NdWFHbGtaR1Z1VW1GdVoyVXVjM1JoY25RN0lHa2dQRDBnWTNWemRHOXRUM0IwYVc5dWN5NW9hV1JrWlc1U1lXNW5aUzVsYm1RN0lHa3JLeWtnZTF4dUlDQWdJQ0FnWTI1d2FrRnljbUY1VzJsZElEMGdZM1Z6ZEc5dFQzQjBhVzl1Y3k1b2FXUmtaVzVMWlhrN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ1kyNXdha0Z5Y21GNUxuTndiR2xqWlNneE1pd2dNQ3dnWTNWemRHOXRUM0IwYVc5dWN5NWtaV3hwYldsMFpYSnpMbVJoYzJncE8xeHVJQ0JqYm5CcVFYSnlZWGt1YzNCc2FXTmxLRGdzSURBc0lHTjFjM1J2YlU5d2RHbHZibk11WkdWc2FXMXBkR1Z5Y3k1emJHRnphQ2s3WEc0Z0lHTnVjR3BCY25KaGVTNXpjR3hwWTJVb05Td2dNQ3dnWTNWemRHOXRUM0IwYVc5dWN5NWtaV3hwYldsMFpYSnpMbVJ2ZENrN1hHNGdJR051Y0dwQmNuSmhlUzV6Y0d4cFkyVW9NaXdnTUN3Z1kzVnpkRzl0VDNCMGFXOXVjeTVrWld4cGJXbDBaWEp6TG1SdmRDazdYRzRnSUdOdmJuTjBJR051Y0dwUWNtVjBkSGtnUFNCamJuQnFRWEp5WVhrdWFtOXBiaWduSnlrN1hHNWNiaUFnYVdZZ0tHTjFjM1J2YlU5d2RHbHZibk11WlhOallYQmxLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHVnpZMkZ3WlVoVVRVd29ZMjV3YWxCeVpYUjBlU2s3WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnWTI1d2FsQnlaWFIwZVR0Y2JuMWNibHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdZMjV3YWtadGREdGNiaUpkTENKdVlXMWxjeUk2V3lKbGMyTmhjR1ZJVkUxTUlsMHNJbTFoY0hCcGJtZHpJam9pT3pzN08wRkJNRUpCTEUxQlFVMHNZMEZCUVN4SFFVRnpSRHRCUVVGQkxFVkJRekZFTEZWQlFVRXNSVUZCV1R0QlFVRkJMRWxCUTFZc1IwRkJRU3hGUVVGTExFZEJRVUU3UVVGQlFTeEpRVU5NTEV0QlFVRXNSVUZCVHl4SFFVRkJPMEZCUVVFc1NVRkRVQ3hKUVVGQkxFVkJRVTA3UVVGQlFTeEhRVU5TTzBGQlFVRXNSVUZEUVN4WFFVRkJMRVZCUVdFN1FVRkJRU3hKUVVOWUxFdEJRVUVzUlVGQlR5eERRVUZCTzBGQlFVRXNTVUZEVUN4SFFVRkJMRVZCUVVzN1FVRkJRU3hIUVVOUU8wRkJRVUVzUlVGRFFTeE5RVUZCTEVWQlFWRXNRMEZCUXl4TFFVRkJMRXRCUVZVc1MwRkJRVHRCUVVGQkxFVkJRMjVDTEZOQlFVRXNSVUZCVnl4SFFVRkJPMEZCUVVFc1JVRkRXQ3hOUVVGQkxFVkJRVkVzUzBGQlFUdEJRVUZCTEVWQlExSXNUVUZCUVN4RlFVRlJPMEZCUTFZc1EwRkJRVHRCUVV0QkxGTkJRVk1zV1VGQlFTeERRVU5RTEdGQlFVRXNSMEZCYzBRc1JVRkJReXhGUVVOWU8wRkJRelZETEVWQlFVRXNUVUZCVFN4UFFVRkJMRWRCUVZVc1UwRkJRVHRCUVVGQkxFbEJRMlFzWTBGQlFUdEJRVUZCTEVsQlEwRTdRVUZCUVN4SFFVTkdPMEZCUlVFc1JVRkJRU3hKUVVGSkxGRkJRVkVzVFVGQlFTeEZRVUZSTzBGQlEyeENMRWxCUVVFc1NVRkRSU3hMUVVGQkxFTkJRVTBzVDBGQlFTeERRVUZSTEZkQlFVRXNRMEZCV1N4TFFVRkxMRU5CUVVFc1NVRkRMMElzVDBGQlFTeERRVUZSTEZkQlFVRXNRMEZCV1N4TFFVRkJMRWRCUVZFc1EwRkJRU3hKUVVNMVFpeFBRVUZCTEVOQlFWRXNWMEZCUVN4RFFVRlpMRXRCUVVFc1IwRkJVU3hGUVVGQkxFVkJRelZDTzBGQlEwRXNUVUZCUVN4TlFVRk5MRWxCUVVrc1ZVRkJWU3dyUkVGQkswUXNRMEZCUVR0QlFVRkJMRWxCUTNKR08wRkJSVUVzU1VGQlFTeEpRVU5GTEV0QlFVRXNRMEZCVFN4UFFVRkJMRU5CUVZFc1YwRkJRU3hEUVVGWkxFZEJRVWNzUTBGQlFTeEpRVU0zUWl4UFFVRkJMRU5CUVZFc1YwRkJRU3hEUVVGWkxFZEJRVUVzUjBGQlRTeERRVUZCTEVsQlF6RkNMRTlCUVVFc1EwRkJVU3hYUVVGQkxFTkJRVmtzUjBGQlFTeEhRVUZOTEVWQlFVRXNSVUZETVVJN1FVRkRRU3hOUVVGQkxFMUJRVTBzU1VGQlNTeFZRVUZWTERaRVFVRTJSQ3hEUVVGQk8wRkJRVUVzU1VGRGJrWTdRVUZGUVN4SlFVRkJMRWxCUVVrc1QwRkJRU3hEUVVGUkxGZEJRVUVzUTBGQldTeExRVUZCTEVkQlFWRXNUMEZCUVN4RFFVRlJMRmxCUVZrc1IwRkJRU3hGUVVGTE8wRkJRM1pFTEUxQlFVRXNUVUZCVFN4SFFVRkJMRWRCUVUwc1VVRkJVU3hYUVVGQkxFTkJRVmtzUzBGQlFUdEJRVU5vUXl4TlFVRkJMRTlCUVVFc1EwRkJVU3hYUVVGQkxFTkJRVmtzUzBGQlFTeEhRVUZSTEU5QlFVRXNRMEZCVVN4WFFVRkJMRU5CUVZrc1IwRkJRVHRCUVVOb1JDeE5RVUZCTEU5QlFVRXNRMEZCVVN4WlFVRlpMRWRCUVVFc1IwRkJUU3hIUVVGQk8wRkJRVUVzU1VGRE5VSTdRVUZCUVN4RlFVTkdPMEZCUlVFc1JVRkJRU3hKUVVGSkxFOUJRVThzVDBGQlFTeERRVUZSTEUxQlFVRXNTMEZCVnl4VlFVRkJMRVZCUVZrN1FVRkRlRU1zU1VGQlFTeE5RVUZOTEVsQlFVa3NWVUZCVlN4clJFRkJhMFFzUTBGQlFUdEJRVUZCTEVWQlEzaEZPMEZCUlVFc1JVRkJRU3hQUVVGUExFOUJRVUU3UVVGRFZEczdRVU42UlVFc1UwRkJVeXhQUVVGQkxFTkJRMUFzV1VGRFFTeFBRVUZCTEVWQlExRTdRVUZEVWl4RlFVRkJMRTFCUVUwc1YwRkJRU3hIUVVGakxFVkJRVUU3UVVGRGNFSXNSVUZCUVN4TlFVRk5MRk5CUVVFc1IwRkJXU3hQUVVGQkxFTkJRVkVzVlVGQlZTeERRVUZCTEVOQlFVVXNUVUZCVFN4RlFVRkZMRU5CUVVFN1FVRkRPVU1zUlVGQlFTeE5RVUZOTEdGQlFVRXNSMEZCWjBJc1lVRkJZU3hQUVVGUExFTkJRVUU3UVVGRk1VTXNSVUZCUVN4SlFVRkpMRk5CUVVFc1EwRkJWU3hYUVVGWExGZEJRVUVzUlVGQllUdEJRVU53UXl4SlFVRkJMRTFCUVUwc1VVRkJVU3hKUVVGSkxFdEJRVUVzUTBGQlRTeGpRVUZqTEZWQlFWVXNRMEZCUVN4dFFrRkJRU3hGUVVGelFpeFhRVUZYTEVOQlFVRXNVVUZCUVN4RFFVRlZMRU5CUVVFN1FVRkZNMFlzU1VGQlFTeFBRVUZQTEdGQlFVRXNRMEZCWXl4TlFVRkJMRU5CUVU4c1ZVRkJRU3hGUVVGWkxFdEJRVXNzUTBGQlFUdEJRVUZCTEVWQlF5OURPMEZCUlVFc1JVRkJRU3hKUVVGSkxHTkJRV01zVFVGQlFTeEZRVUZSTzBGQlEzaENMRWxCUVVFc1MwRkJRU3hKUVVGVExFTkJRVUVzUjBGQlNTeGpRVUZqTEZkQlFVRXNRMEZCV1N4TFFVRkJMRVZCUVU4c1MwRkJTeXhoUVVGQkxFTkJRV01zVjBGQlFTeERRVUZaTEV0QlFVc3NRMEZCUVN4RlFVRkJMRVZCUVVzN1FVRkRja1lzVFVGQlFTeFRRVUZCTEVOQlFWVXNRMEZCUXl4SlFVRkpMR0ZCUVVFc1EwRkJZeXhUUVVGQk8wRkJRVUVzU1VGREwwSTdRVUZCUVN4RlFVTkdPMEZCUlVFc1JVRkJRU3hUUVVGQkxFTkJRVlVzVFVGQlFTeERRVUZQTEVWQlFVRXNSVUZCU1N4RFFVRkJMRVZCUVVjc1lVRkJRU3hEUVVGakxGZEJRVmNzU1VGQlNTeERRVUZCTzBGQlEzSkVMRVZCUVVFc1UwRkJRU3hEUVVGVkxFMUJRVUVzUTBGQlR5eERRVUZCTEVWQlFVY3NRMEZCUVN4RlFVRkhMR0ZCUVVFc1EwRkJZeXhYUVVGWExFdEJRVXNzUTBGQlFUdEJRVU55UkN4RlFVRkJMRk5CUVVFc1EwRkJWU3hOUVVGQkxFTkJRVThzUTBGQlFTeEZRVUZITEVOQlFVRXNSVUZCUnl4aFFVRkJMRU5CUVdNc1YwRkJWeXhIUVVGSExFTkJRVUU3UVVGRGJrUXNSVUZCUVN4VFFVRkJMRU5CUVZVc1RVRkJRU3hEUVVGUExFTkJRVUVzUlVGQlJ5eERRVUZCTEVWQlFVY3NZVUZCUVN4RFFVRmpMRmRCUVZjc1IwRkJSeXhEUVVGQk8wRkJRMjVFTEVWQlFVRXNUVUZCVFN4VlFVRkJMRWRCUVdFc1UwRkJRU3hEUVVGVkxFbEJRVUVzUTBGQlN5eEZRVUZGTEVOQlFVRTdRVUZGY0VNc1JVRkJRU3hKUVVGSkxHTkJRV01zVFVGQlFTeEZRVUZSTzBGQlEzaENMRWxCUVVFc1QwRkJUMEVzVDBGQlZ5eFZRVUZWTEVOQlFVRTdRVUZCUVN4RlFVTTVRanRCUVVWQkxFVkJRVUVzVDBGQlR5eFZRVUZCTzBGQlExUTdPenM3SW4wPVxuIiwiaW1wb3J0IGNucGpGbXQgZnJvbSAnQGxhY3Vzc29mdC9jbnBqLWZtdCc7XG5pbXBvcnQgbnVtT25seSBmcm9tICdudW0tb25seSc7XG5pbXBvcnQgbWVyZ2VEZWVwIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZURpZ2l0KGNucGpTZXF1ZW5jZSkge1xuICBsZXQgaW5kZXggPSAyO1xuICBjb25zdCBzdW0gPSBbLi4uY25walNlcXVlbmNlXS5yZWR1Y2VSaWdodCgocHJldmlvdXNSZXN1bHQsIG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHByZXZpb3VzUmVzdWx0ICsgbnVtYmVyICogaW5kZXg7XG4gICAgaW5kZXggPSBpbmRleCA9PT0gOSA/IDIgOiBpbmRleCArIDE7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgMCk7XG4gIGNvbnN0IHJlbWFpbmRlciA9IHN1bSAlIDExO1xuICByZXR1cm4gcmVtYWluZGVyIDwgMiA/IDAgOiAxMSAtIHJlbWFpbmRlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGZvcm1hdDogZmFsc2UsXG4gIHByZWZpeDogXCJcIlxufTtcbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhjdXN0b21PcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIG1lcmdlRGVlcChkZWZhdWx0T3B0aW9ucywgY3VzdG9tT3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIG51bWJlckdlbmVyYXRvcihsZW5ndGgpIHtcbiAgY29uc3QgbnVtZXJpY1NlcXVlbmNlID0gW107XG4gIHdoaWxlIChudW1lcmljU2VxdWVuY2UubGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKSAqIDEwO1xuICAgIGNvbnN0IGludGVnZXIgPSBNYXRoLmZsb29yKHJhbmRvbSk7XG4gICAgbnVtZXJpY1NlcXVlbmNlLnB1c2goaW50ZWdlcik7XG4gIH1cbiAgcmV0dXJuIG51bWVyaWNTZXF1ZW5jZTtcbn1cblxuZnVuY3Rpb24gY25wakdlbihvcHRpb25zKSB7XG4gIGNvbnN0IHVzZXJPcHRpb25zID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBiYXNlU2VxdWVuY2UgPSBudW1Pbmx5KHVzZXJPcHRpb25zLnByZWZpeCk7XG4gIGNvbnN0IHByZWZpeExlbmd0aCA9IGJhc2VTZXF1ZW5jZS5sZW5ndGg7XG4gIGlmIChwcmVmaXhMZW5ndGggPCAwIHx8IHByZWZpeExlbmd0aCA+IDEyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdPcHRpb24gXCJwcmVmaXhcIiBtdXN0IGJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgYmV0d2VlbiAxIGFuZCAxMiBkaWdpdHMuJyk7XG4gIH1cbiAgaWYgKHByZWZpeExlbmd0aCA+IDggJiYgYmFzZVNlcXVlbmNlLnNsaWNlKDgpID09PSBcIjAwMDBcIikge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGJyYW5jaCBJRCAoY2hhcmFjdGVycyA4IHRvIDExKSBjYW5ub3QgYmUgXCIwMDAwXCIuJyk7XG4gIH1cbiAgY29uc3QgYnJhbmNoSUQgPSBbMCwgMCwgMCwgTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkgKiA5KV07XG4gIGNvbnN0IGNucGpTZXF1ZW5jZSA9IGJhc2VTZXF1ZW5jZS5zcGxpdChcIlwiKS5tYXAoTnVtYmVyKS5jb25jYXQobnVtYmVyR2VuZXJhdG9yKDggLSBwcmVmaXhMZW5ndGgpKS5jb25jYXQoYnJhbmNoSUQuc2xpY2UoMCwgMTIgLSBwcmVmaXhMZW5ndGgpKTtcbiAgY25walNlcXVlbmNlLnB1c2goY2FsY3VsYXRlRGlnaXQoY25walNlcXVlbmNlKSk7XG4gIGNucGpTZXF1ZW5jZS5wdXNoKGNhbGN1bGF0ZURpZ2l0KGNucGpTZXF1ZW5jZSkpO1xuICByZXR1cm4gdXNlck9wdGlvbnMuZm9ybWF0ID8gY25wakZtdChjbnBqU2VxdWVuY2Uuam9pbihcIlwiKSkgOiBjbnBqU2VxdWVuY2Uuam9pbihcIlwiKTtcbn1cblxuZXhwb3J0IHsgY25wakdlbiBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWFXNWtaWGd1Yldweklpd2ljMjkxY21ObGN5STZXeUl1TGk5emNtTXZZMkZzWTNWc1lYUmxMV1JwWjJsMExuUnpJaXdpTGk0dmMzSmpMMjFsY21kbExXOXdkR2x2Ym5NdWRITWlMQ0l1TGk5emNtTXZiblZ0WW1WeUxXZGxibVZ5WVhSdmNpNTBjeUlzSWk0dUwzTnlZeTlqYm5CcUxXZGxiaTUwY3lKZExDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZLaXBjYmlBcUlFTmhiR04xYkdGMFpTQjBhR1VnZG1WeWFXWnBaWElnWkdsbmFYUWdZbUZ6WldRZ2IyNGdRMDVRU2lCaVlYTmxJRzUxYldWeWFXTWdjMlZ4ZFdWdVkyVXVYRzRnS2k5Y2JtWjFibU4wYVc5dUlHTmhiR04xYkdGMFpVUnBaMmwwS0dOdWNHcFRaWEYxWlc1alpUb2diblZ0WW1WeVcxMHBPaUJ1ZFcxaVpYSWdlMXh1SUNCc1pYUWdhVzVrWlhnZ1BTQXlPMXh1SUNCamIyNXpkQ0J6ZFcwZ1BTQmJMaTR1WTI1d2FsTmxjWFZsYm1ObFhTNXlaV1IxWTJWU2FXZG9kQ2dvY0hKbGRtbHZkWE5TWlhOMWJIUXNJRzUxYldKbGNpa2dQVDRnZTF4dUlDQWdJR052Ym5OMElISmxjM1ZzZENBOUlIQnlaWFpwYjNWelVtVnpkV3gwSUNzZ2JuVnRZbVZ5SUNvZ2FXNWtaWGc3WEc0Z0lDQWdhVzVrWlhnZ1BTQnBibVJsZUNBOVBUMGdPU0EvSURJZ09pQnBibVJsZUNBcklERTdYRzVjYmlBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQjlMQ0F3S1R0Y2JseHVJQ0JqYjI1emRDQnlaVzFoYVc1a1pYSWdQU0J6ZFcwZ0pTQXhNVHRjYmx4dUlDQnlaWFIxY200Z2NtVnRZV2x1WkdWeUlEd2dNaUEvSURBZ09pQXhNU0F0SUhKbGJXRnBibVJsY2p0Y2JuMWNibHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdZMkZzWTNWc1lYUmxSR2xuYVhRN1hHNGlMQ0pwYlhCdmNuUWdiV1Z5WjJWRVpXVndJR1p5YjIwZ0oyUmxaWEJ0WlhKblpTYzdYRzVjYm1WNGNHOXlkQ0JwYm5SbGNtWmhZMlVnUVdOMGRXRnNRMjV3YWtkbGJtVnlZWFJ2Y2s5d2RHbHZibk1nZTF4dUlDQm1iM0p0WVhRNklHSnZiMnhsWVc0N1hHNGdJSEJ5WldacGVEb2djM1J5YVc1bk8xeHVmVnh1WEc1bGVIQnZjblFnZEhsd1pTQkRibkJxUjJWdVpYSmhkRzl5VDNCMGFXOXVjeUE5SUZCaGNuUnBZV3c4UVdOMGRXRnNRMjV3YWtkbGJtVnlZWFJ2Y2s5d2RHbHZibk0rTzF4dVhHNWpiMjV6ZENCa1pXWmhkV3gwVDNCMGFXOXVjeUE5SUh0Y2JpQWdabTl5YldGME9pQm1ZV3h6WlN4Y2JpQWdjSEpsWm1sNE9pQW5KeXhjYm4wN1hHNWNiaThxS2x4dUlDb2dUV1Z5WjJVZ1kzVnpkRzl0SUc5d2RHbHZibk1nZEc4Z2RHaGxJR1JsWm1GMWJIUWdiMjVsY3k1Y2JpQXFMMXh1Wm5WdVkzUnBiMjRnYldWeVoyVlBjSFJwYjI1ektHTjFjM1J2YlU5d2RHbHZibk02SUVOdWNHcEhaVzVsY21GMGIzSlBjSFJwYjI1eklEMGdlMzBwT2lCQlkzUjFZV3hEYm5CcVIyVnVaWEpoZEc5eVQzQjBhVzl1Y3lCN1hHNGdJSEpsZEhWeWJpQnRaWEpuWlVSbFpYQW9aR1ZtWVhWc2RFOXdkR2x2Ym5Nc0lHTjFjM1J2YlU5d2RHbHZibk1wTzF4dWZWeHVYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQnRaWEpuWlU5d2RHbHZibk03WEc0aUxDSXZLaXBjYmlBcUlFZGxibVZ5WVhSbElHRnVJR0Z5Y21GNUlHOW1JSEpoYm1SdmJTQnpkSEpwYm1kcFptbGxaQ0J1ZFcxaVpYSnpJR0psZEhkbFpXNGdNQ0JoYm1RZ0lEa3VYRzRnS2k5Y2JtWjFibU4wYVc5dUlHNTFiV0psY2tkbGJtVnlZWFJ2Y2loc1pXNW5kR2c2SUc1MWJXSmxjaWs2SUc1MWJXSmxjbHRkSUh0Y2JpQWdZMjl1YzNRZ2JuVnRaWEpwWTFObGNYVmxibU5sT2lCdWRXMWlaWEpiWFNBOUlGdGRPMXh1WEc0Z0lIZG9hV3hsSUNodWRXMWxjbWxqVTJWeGRXVnVZMlV1YkdWdVozUm9JRHdnYkdWdVozUm9LU0I3WEc0Z0lDQWdZMjl1YzNRZ2NtRnVaRzl0SUQwZ1RXRjBhQzV5WVc1a2IyMG9LU0FxSURFd08xeHVJQ0FnSUdOdmJuTjBJR2x1ZEdWblpYSWdQU0JOWVhSb0xtWnNiMjl5S0hKaGJtUnZiU2s3WEc1Y2JpQWdJQ0J1ZFcxbGNtbGpVMlZ4ZFdWdVkyVXVjSFZ6YUNocGJuUmxaMlZ5S1R0Y2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCdWRXMWxjbWxqVTJWeGRXVnVZMlU3WEc1OVhHNWNibVY0Y0c5eWRDQmtaV1poZFd4MElHNTFiV0psY2tkbGJtVnlZWFJ2Y2p0Y2JpSXNJbWx0Y0c5eWRDQmpibkJxUm0xMElHWnliMjBnSjBCc1lXTjFjM052Wm5RdlkyNXdhaTFtYlhRbk8xeHVhVzF3YjNKMElHNTFiVTl1YkhrZ1puSnZiU0FuYm5WdExXOXViSGtuTzF4dVhHNXBiWEJ2Y25RZ1kyRnNZM1ZzWVhSbFJHbG5hWFFnWm5KdmJTQW5MaTlqWVd4amRXeGhkR1V0WkdsbmFYUW5PMXh1YVcxd2IzSjBJRzFsY21kbFQzQjBhVzl1Y3lCbWNtOXRJQ2N1TDIxbGNtZGxMVzl3ZEdsdmJuTW5PMXh1YVcxd2IzSjBJSFI1Y0dVZ2V5QkRibkJxUjJWdVpYSmhkRzl5VDNCMGFXOXVjeUI5SUdaeWIyMGdKeTR2YldWeVoyVXRiM0IwYVc5dWN5YzdYRzVwYlhCdmNuUWdiblZ0WW1WeVIyVnVaWEpoZEc5eUlHWnliMjBnSnk0dmJuVnRZbVZ5TFdkbGJtVnlZWFJ2Y2ljN1hHNWNiaThxS2x4dUlDb2dSMlZ1WlhKaGRHVWdZU0IyWVd4cFpDQkRUbEJLSUNoQ2NtRjZhV3hwWVc0Z1kyOXRjR0Z1ZVNCSlJDa2diblZ0WlhKcFl5QnpaWEYxWlc1alpTNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z1kyNXdha2RsYmlodmNIUnBiMjV6UHpvZ1EyNXdha2RsYm1WeVlYUnZjazl3ZEdsdmJuTXBPaUJ6ZEhKcGJtY2dlMXh1SUNCamIyNXpkQ0IxYzJWeVQzQjBhVzl1Y3lBOUlHMWxjbWRsVDNCMGFXOXVjeWh2Y0hScGIyNXpLVHRjYmlBZ1kyOXVjM1FnWW1GelpWTmxjWFZsYm1ObElEMGdiblZ0VDI1c2VTaDFjMlZ5VDNCMGFXOXVjeTV3Y21WbWFYZ3BPMXh1SUNCamIyNXpkQ0J3Y21WbWFYaE1aVzVuZEdnZ1BTQmlZWE5sVTJWeGRXVnVZMlV1YkdWdVozUm9PMXh1WEc0Z0lHbG1JQ2h3Y21WbWFYaE1aVzVuZEdnZ1BDQXdJSHg4SUhCeVpXWnBlRXhsYm1kMGFDQStJREV5S1NCN1hHNGdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLQ2RQY0hScGIyNGdYQ0p3Y21WbWFYaGNJaUJ0ZFhOMElHSmxJR0VnYzNSeWFXNW5JR052Ym5SaGFXNXBibWNnWW1WMGQyVmxiaUF4SUdGdVpDQXhNaUJrYVdkcGRITXVKeWs3WEc0Z0lIMWNiaUFnYVdZZ0tIQnlaV1pwZUV4bGJtZDBhQ0ErSURnZ0ppWWdZbUZ6WlZObGNYVmxibU5sTG5Oc2FXTmxLRGdwSUQwOVBTQW5NREF3TUNjcElIdGNiaUFnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjFSb1pTQmljbUZ1WTJnZ1NVUWdLR05vWVhKaFkzUmxjbk1nT0NCMGJ5QXhNU2tnWTJGdWJtOTBJR0psSUZ3aU1EQXdNRndpTGljcE8xeHVJQ0I5WEc1Y2JpQWdZMjl1YzNRZ1luSmhibU5vU1VRZ1BTQmJNQ3dnTUN3Z01Dd2dUV0YwYUM1alpXbHNLRTFoZEdndWNtRnVaRzl0S0NrZ0tpQTVLVjA3WEc0Z0lHTnZibk4wSUdOdWNHcFRaWEYxWlc1alpTQTlJR0poYzJWVFpYRjFaVzVqWlZ4dUlDQWdJQzV6Y0d4cGRDZ25KeWxjYmlBZ0lDQXViV0Z3S0U1MWJXSmxjaWxjYmlBZ0lDQXVZMjl1WTJGMEtHNTFiV0psY2tkbGJtVnlZWFJ2Y2lnNElDMGdjSEpsWm1sNFRHVnVaM1JvS1NsY2JpQWdJQ0F1WTI5dVkyRjBLR0p5WVc1amFFbEVMbk5zYVdObEtEQXNJREV5SUMwZ2NISmxabWw0VEdWdVozUm9LU2s3WEc1Y2JpQWdZMjV3YWxObGNYVmxibU5sTG5CMWMyZ29ZMkZzWTNWc1lYUmxSR2xuYVhRb1kyNXdhbE5sY1hWbGJtTmxLU2s3WEc0Z0lHTnVjR3BUWlhGMVpXNWpaUzV3ZFhOb0tHTmhiR04xYkdGMFpVUnBaMmwwS0dOdWNHcFRaWEYxWlc1alpTa3BPMXh1WEc0Z0lISmxkSFZ5YmlCMWMyVnlUM0IwYVc5dWN5NW1iM0p0WVhRZ1B5QmpibkJxUm0xMEtHTnVjR3BUWlhGMVpXNWpaUzVxYjJsdUtDY25LU2tnT2lCamJuQnFVMlZ4ZFdWdVkyVXVhbTlwYmlnbkp5azdYRzU5WEc1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUdOdWNHcEhaVzQ3WEc0aVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWpzN096dEJRVWRCTEZOQlFWTXNaVUZCWlN4WlFVRkJMRVZCUVdkRE8wRkJRM1JFTEVWQlFVRXNTVUZCU1N4TFFVRkJMRWRCUVZFc1EwRkJRVHRCUVVOYUxFVkJRVUVzVFVGQlRTeEhRVUZCTEVkQlFVMHNRMEZCUXl4SFFVRkhMRmxCUVZrc1JVRkJSU3hYUVVGQkxFTkJRVmtzUTBGQlF5eG5Ra0ZCWjBJc1RVRkJRU3hMUVVGWE8wRkJRM0JGTEVsQlFVRXNUVUZCVFN4TlFVRkJMRWRCUVZNc2FVSkJRV2xDTEUxQlFVRXNSMEZCVXl4TFFVRkJPMEZCUTNwRExFbEJRVUVzUzBGQlFTeEhRVUZSTEV0QlFVRXNTMEZCVlN4RFFVRkJMRWRCUVVrc1EwRkJRU3hIUVVGSkxFdEJRVUVzUjBGQlVTeERRVUZCTzBGQlJXeERMRWxCUVVFc1QwRkJUeXhOUVVGQk8wRkJRVUVzUlVGRFZDeEhRVUZITEVOQlFVTXNRMEZCUVR0QlFVVktMRVZCUVVFc1RVRkJUU3haUVVGWkxFZEJRVUVzUjBGQlRTeEZRVUZCTzBGQlJYaENMRVZCUVVFc1QwRkJUeXhUUVVGQkxFZEJRVmtzUTBGQlFTeEhRVUZKTEVOQlFVRXNSMEZCU1N4RlFVRkJMRWRCUVVzc1UwRkJRVHRCUVVOc1F6czdRVU5PUVN4TlFVRk5MR05CUVVFc1IwRkJhVUk3UVVGQlFTeEZRVU55UWl4TlFVRkJMRVZCUVZFc1MwRkJRVHRCUVVGQkxFVkJRMUlzVFVGQlFTeEZRVUZSTzBGQlExWXNRMEZCUVR0QlFVdEJMRk5CUVZNc1dVRkJRU3hEUVVGaExHRkJRVUVzUjBGQmMwTXNSVUZCUXl4RlFVRXJRanRCUVVNeFJpeEZRVUZCTEU5QlFVOHNVMEZCUVN4RFFVRlZMR2RDUVVGblFpeGhRVUZoTEVOQlFVRTdRVUZEYUVRN08wRkRhRUpCTEZOQlFWTXNaMEpCUVdkQ0xFMUJRVUVzUlVGQk1FSTdRVUZEYWtRc1JVRkJRU3hOUVVGTkxHdENRVUUwUWl4RlFVRkRPMEZCUlc1RExFVkJRVUVzVDBGQlR5eGxRVUZCTEVOQlFXZENMRk5CUVZNc1RVRkJRU3hGUVVGUk8wRkJRM1JETEVsQlFVRXNUVUZCVFN4TlFVRkJMRWRCUVZNc1NVRkJRU3hEUVVGTExFMUJRVUVzUlVGQlR5eEhRVUZKTEVWQlFVRTdRVUZETDBJc1NVRkJRU3hOUVVGTkxFOUJRVUVzUjBGQlZTeEpRVUZCTEVOQlFVc3NTMEZCUVN4RFFVRk5MRTFCUVUwc1EwRkJRVHRCUVVWcVF5eEpRVUZCTEdWQlFVRXNRMEZCWjBJc1MwRkJTeXhQUVVGUExFTkJRVUU3UVVGQlFTeEZRVU01UWp0QlFVVkJMRVZCUVVFc1QwRkJUeXhsUVVGQk8wRkJRMVE3TzBGRFNFRXNVMEZCVXl4UlFVRlJMRTlCUVVFc1JVRkJkME03UVVGRGRrUXNSVUZCUVN4TlFVRk5MRmRCUVVFc1IwRkJZeXhoUVVGaExFOUJRVThzUTBGQlFUdEJRVU40UXl4RlFVRkJMRTFCUVUwc1dVRkJRU3hIUVVGbExFOUJRVUVzUTBGQlVTeFhRVUZCTEVOQlFWa3NUVUZCVFN4RFFVRkJPMEZCUXk5RExFVkJRVUVzVFVGQlRTeGxRVUZsTEZsQlFVRXNRMEZCWVN4TlFVRkJPMEZCUld4RExFVkJRVUVzU1VGQlNTeFpRVUZCTEVkQlFXVXNRMEZCUVN4SlFVRkxMRmxCUVVFc1IwRkJaU3hGUVVGQkxFVkJRVWs3UVVGRGVrTXNTVUZCUVN4TlFVRk5MRWxCUVVrc1RVRkJUU3h6UlVGQmMwVXNRMEZCUVR0QlFVRkJMRVZCUTNoR08wRkJRMEVzUlVGQlFTeEpRVUZKTEdWQlFXVXNRMEZCUVN4SlFVRkxMRmxCUVVFc1EwRkJZU3hMUVVGQkxFTkJRVTBzUTBGQlF5eE5RVUZOTEUxQlFVRXNSVUZCVVR0QlFVTjRSQ3hKUVVGQkxFMUJRVTBzU1VGQlNTeE5RVUZOTEhORVFVRnpSQ3hEUVVGQk8wRkJRVUVzUlVGRGVFVTdRVUZGUVN4RlFVRkJMRTFCUVUwc1VVRkJRU3hIUVVGWExFTkJRVU1zUTBGQlFTeEZRVUZITEVOQlFVRXNSVUZCUnl4RFFVRkJMRVZCUVVjc1NVRkJRU3hEUVVGTExFbEJRVUVzUTBGQlN5eEpRVUZCTEVOQlFVc3NUVUZCUVN4RlFVRlBMRWRCUVVrc1EwRkJReXhEUVVGRExFTkJRVUU3UVVGRGRrUXNSVUZCUVN4TlFVRk5MRmxCUVVFc1IwRkJaU3hoUVVOc1FpeExRVUZCTEVOQlFVMHNSVUZCUlN4RlFVTlNMRWRCUVVFc1EwRkJTU3hOUVVGTkxFVkJRMVlzVFVGQlFTeERRVUZQTEdWQlFVRXNRMEZCWjBJc1NVRkJTU3haUVVGWkxFTkJRVU1zUlVGRGVFTXNUVUZCUVN4RFFVRlBMRkZCUVVFc1EwRkJVeXhOUVVGTkxFTkJRVUVzUlVGQlJ5eEZRVUZCTEVkQlFVc3NXVUZCV1N4RFFVRkRMRU5CUVVFN1FVRkZPVU1zUlVGQlFTeFpRVUZCTEVOQlFXRXNTVUZCUVN4RFFVRkxMR05CUVVFc1EwRkJaU3haUVVGWkxFTkJRVU1zUTBGQlFUdEJRVU01UXl4RlFVRkJMRmxCUVVFc1EwRkJZU3hKUVVGQkxFTkJRVXNzWTBG