UNPKG

@lacussoft/cpf-gen

Version:

Utility function to generate valid CPF (Brazilian ID document).

310 lines (288 loc) 50.1 kB
/** * LacusSoft :: cpf-gen v1.5.1 * * @author Julio L. Muller. * @license MIT - 2020-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.cpfGen = 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 = { '&': '&amp;', '<': '&lt;', '>': '&gt;', "'": '&#39;', '"': '&quot;' }; 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$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; } var defaultOptions = { format: false, prefix: '' }; /** * Merge custom options to the default ones. */ function mergeOptions(customOptions) { if (customOptions === void 0) { customOptions = {}; } return mergeDeep(defaultOptions, customOptions); } /** * Generate an array of random numbers (as string) between 0 and 9. */ function numberGenerator(length) { var numericSequence = []; while (numericSequence.length < length) { var random = Math.random() * 10; var integer = Math.floor(random); numericSequence.push(integer); } return numericSequence; } /** * Generate a valid CPF (Brazilian ID document) numeric sequence. */ function cpfGen(options) { var userOptions = mergeOptions(options); var baseSequence = numOnly(userOptions.prefix); var prefixLength = baseSequence.length; if (prefixLength < 0 || prefixLength > 9) { throw new Error('Option "prefix" must be a string containing between 1 and 9 digits.'); } var cpfSequence = baseSequence.split('').map(Number).concat(numberGenerator(9 - prefixLength)); [9, 10].forEach(function (nextNumIndex) { var factor = nextNumIndex + 1; var sum = 0; for (var n = 0; n < nextNumIndex; n++, factor--) { sum += cpfSequence[n] * factor; } var remainder = 11 - sum % 11; cpfSequence.push(remainder > 9 ? 0 : remainder); }); return userOptions.format ? cpfFmt(cpfSequence.join('')) : cpfSequence.join(''); } return cpfGen; })); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BmLWdlbi5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2h0bWwtZXNjYXBlci9lc20vaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbnVtLW9ubHkvYnVpbGQvaW5kZXguY2pzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RlZXBtZXJnZS9kaXN0L2Nqcy5qcyIsIi4uLy4uL2NwZi1mbXQvYnVpbGQvaW5kZXgubWpzIiwiLi4vc3JjL21lcmdlLW9wdGlvbnMudHMiLCIuLi9zcmMvbnVtYmVyLWdlbmVyYXRvci50cyIsIi4uL3NyYy9jcGYtZ2VuLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChDKSAyMDE3LXByZXNlbnQgYnkgQW5kcmVhIEdpYW1tYXJjaGkgLSBAV2ViUmVmbGVjdGlvblxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cblxuY29uc3Qge3JlcGxhY2V9ID0gJyc7XG5cbi8vIGVzY2FwZVxuY29uc3QgZXMgPSAvJig/OmFtcHwjMzh8bHR8IzYwfGd0fCM2MnxhcG9zfCMzOXxxdW90fCMzNCk7L2c7XG5jb25zdCBjYSA9IC9bJjw+J1wiXS9nO1xuXG5jb25zdCBlc2NhID0ge1xuICAnJic6ICcmYW1wOycsXG4gICc8JzogJyZsdDsnLFxuICAnPic6ICcmZ3Q7JyxcbiAgXCInXCI6ICcmIzM5OycsXG4gICdcIic6ICcmcXVvdDsnXG59O1xuY29uc3QgcGUgPSBtID0+IGVzY2FbbV07XG5cbi8qKlxuICogU2FmZWx5IGVzY2FwZSBIVE1MIGVudGl0aWVzIHN1Y2ggYXMgYCZgLCBgPGAsIGA+YCwgYFwiYCwgYW5kIGAnYC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBlcyB0aGUgaW5wdXQgdG8gc2FmZWx5IGVzY2FwZVxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGVzY2FwZWQgaW5wdXQsIGFuZCBpdCAqKnRocm93cyoqIGFuIGVycm9yIGlmXG4gKiAgdGhlIGlucHV0IHR5cGUgaXMgdW5leHBlY3RlZCwgZXhjZXB0IGZvciBib29sZWFuIGFuZCBudW1iZXJzLFxuICogIGNvbnZlcnRlZCBhcyBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBlc2NhcGUgPSBlcyA9PiByZXBsYWNlLmNhbGwoZXMsIGNhLCBwZSk7XG5cblxuLy8gdW5lc2NhcGVcbmNvbnN0IHVuZXMgPSB7XG4gICcmYW1wOyc6ICcmJyxcbiAgJyYjMzg7JzogJyYnLFxuICAnJmx0Oyc6ICc8JyxcbiAgJyYjNjA7JzogJzwnLFxuICAnJmd0Oyc6ICc+JyxcbiAgJyYjNjI7JzogJz4nLFxuICAnJmFwb3M7JzogXCInXCIsXG4gICcmIzM5Oyc6IFwiJ1wiLFxuICAnJnF1b3Q7JzogJ1wiJyxcbiAgJyYjMzQ7JzogJ1wiJ1xufTtcbmNvbnN0IGNhcGUgPSBtID0+IHVuZXNbbV07XG5cbi8qKlxuICogU2FmZWx5IHVuZXNjYXBlIHByZXZpb3VzbHkgZXNjYXBlZCBlbnRpdGllcyBzdWNoIGFzIGAmYCwgYDxgLCBgPmAsIGBcImAsXG4gKiBhbmQgYCdgLlxuICogQHBhcmFtIHtzdHJpbmd9IHVuIGEgcHJldmlvdXNseSBlc2NhcGVkIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gdGhlIHVuZXNjYXBlZCBpbnB1dCwgYW5kIGl0ICoqdGhyb3dzKiogYW4gZXJyb3IgaWZcbiAqICB0aGUgaW5wdXQgdHlwZSBpcyB1bmV4cGVjdGVkLCBleGNlcHQgZm9yIGJvb2xlYW4gYW5kIG51bWJlcnMsXG4gKiAgY29udmVydGVkIGFzIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHVuZXNjYXBlID0gdW4gPT4gcmVwbGFjZS5jYWxsKHVuLCBlcywgY2FwZSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIG51bU9ubHkodGFyZ2V0KSB7XG4gIHJldHVybiBTdHJpbmcodGFyZ2V0KS5yZXBsYWNlKC9cXEQvZywgXCJcIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbnVtT25seTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYVc1a1pYZ3VZMnB6SWl3aWMyOTFjbU5sY3lJNld5SXVMaTl6Y21NdmJuVnRMVzl1YkhrdWRITWlYU3dpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpWm5WdVkzUnBiMjRnYm5WdFQyNXNlU2gwWVhKblpYUTZJSFZ1YTI1dmQyNHBPaUJ6ZEhKcGJtY2dlMXh1SUNCeVpYUjFjbTRnVTNSeWFXNW5LSFJoY21kbGRDa3VjbVZ3YkdGalpTZ3ZYRnhFTDJjc0lDY25LVHRjYm4xY2JseHVaWGh3YjNKMElHUmxabUYxYkhRZ2JuVnRUMjVzZVR0Y2JpSmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU96dEJRVUZCTEZOQlFWTXNVVUZCVVN4TlFVRjVRaXhGUVVGQk8wRkJRM2hETEVWQlFVRXNUMEZCVHl4TlFVRlBMRU5CUVVFc1RVRkJUU3hEUVVGRkxFTkJRVUVzVDBGQlFTeERRVUZSTEU5QlFVOHNSVUZCUlN4RFFVRkJPMEZCUTNwRE96czdPeUo5XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc01lcmdlYWJsZU9iamVjdCA9IGZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlKSB7XG5cdHJldHVybiBpc05vbk51bGxPYmplY3QodmFsdWUpXG5cdFx0JiYgIWlzU3BlY2lhbCh2YWx1ZSlcbn07XG5cbmZ1bmN0aW9uIGlzTm9uTnVsbE9iamVjdCh2YWx1ZSkge1xuXHRyZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG59XG5cbmZ1bmN0aW9uIGlzU3BlY2lhbCh2YWx1ZSkge1xuXHR2YXIgc3RyaW5nVmFsdWUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG5cdHJldHVybiBzdHJpbmdWYWx1ZSA9PT0gJ1tvYmplY3QgUmVnRXhwXSdcblx0XHR8fCBzdHJpbmdWYWx1ZSA9PT0gJ1tvYmplY3QgRGF0ZV0nXG5cdFx0fHwgaXNSZWFjdEVsZW1lbnQodmFsdWUpXG59XG5cbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9iNWFjOTYzZmI3OTFkMTI5OGU3ZjM5NjIzNjM4M2JjOTU1ZjkxNmMxL3NyYy9pc29tb3JwaGljL2NsYXNzaWMvZWxlbWVudC9SZWFjdEVsZW1lbnQuanMjTDIxLUwyNVxudmFyIGNhblVzZVN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcjtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBjYW5Vc2VTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgOiAweGVhYzc7XG5cbmZ1bmN0aW9uIGlzUmVhY3RFbGVtZW50KHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFXG59XG5cbmZ1bmN0aW9uIGVtcHR5VGFyZ2V0KHZhbCkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gW10gOiB7fVxufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZSwgb3B0aW9ucykge1xuXHRyZXR1cm4gKG9wdGlvbnMuY2xvbmUgIT09IGZhbHNlICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpKVxuXHRcdD8gZGVlcG1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSwgdmFsdWUsIG9wdGlvbnMpXG5cdFx0OiB2YWx1ZVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuXHRyZXR1cm4gdGFyZ2V0LmNvbmNhdChzb3VyY2UpLm1hcChmdW5jdGlvbihlbGVtZW50KSB7XG5cdFx0cmV0dXJuIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGVsZW1lbnQsIG9wdGlvbnMpXG5cdH0pXG59XG5cbmZ1bmN0aW9uIGdldE1lcmdlRnVuY3Rpb24oa2V5LCBvcHRpb25zKSB7XG5cdGlmICghb3B0aW9ucy5jdXN0b21NZXJnZSkge1xuXHRcdHJldHVybiBkZWVwbWVyZ2Vcblx0fVxuXHR2YXIgY3VzdG9tTWVyZ2UgPSBvcHRpb25zLmN1c3RvbU1lcmdlKGtleSk7XG5cdHJldHVybiB0eXBlb2YgY3VzdG9tTWVyZ2UgPT09ICdmdW5jdGlvbicgPyBjdXN0b21NZXJnZSA6IGRlZXBtZXJnZVxufVxuXG5mdW5jdGlvbiBnZXRFbnVtZXJhYmxlT3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkge1xuXHRyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc1xuXHRcdD8gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpLmZpbHRlcihmdW5jdGlvbihzeW1ib2wpIHtcblx0XHRcdHJldHVybiBPYmplY3QucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0YXJnZXQsIHN5bWJvbClcblx0XHR9KVxuXHRcdDogW11cbn1cblxuZnVuY3Rpb24gZ2V0S2V5cyh0YXJnZXQpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKHRhcmdldCkuY29uY2F0KGdldEVudW1lcmFibGVPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSlcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlJc09uT2JqZWN0KG9iamVjdCwgcHJvcGVydHkpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gcHJvcGVydHkgaW4gb2JqZWN0XG5cdH0gY2F0Y2goXykge1xuXHRcdHJldHVybiBmYWxzZVxuXHR9XG59XG5cbi8vIFByb3RlY3RzIGZyb20gcHJvdG90eXBlIHBvaXNvbmluZyBhbmQgdW5leHBlY3RlZCBtZXJnaW5nIHVwIHRoZSBwcm90b3R5cGUgY2hhaW4uXG5mdW5jdGlvbiBwcm9wZXJ0eUlzVW5zYWZlKHRhcmdldCwga2V5KSB7XG5cdHJldHVybiBwcm9wZXJ0eUlzT25PYmplY3QodGFyZ2V0LCBrZXkpIC8vIFByb3BlcnRpZXMgYXJlIHNhZmUgdG8gbWVyZ2UgaWYgdGhleSBkb24ndCBleGlzdCBpbiB0aGUgdGFyZ2V0IHlldCxcblx0XHQmJiAhKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwga2V5KSAvLyB1bnNhZmUgaWYgdGhleSBleGlzdCB1cCB0aGUgcHJvdG90eXBlIGNoYWluLFxuXHRcdFx0JiYgT2JqZWN0LnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodGFyZ2V0LCBrZXkpKSAvLyBhbmQgYWxzbyB1bnNhZmUgaWYgdGhleSdyZSBub25lbnVtZXJhYmxlLlxufVxuXG5mdW5jdGlvbiBtZXJnZU9iamVjdCh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuXHR2YXIgZGVzdGluYXRpb24gPSB7fTtcblx0aWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0KSkge1xuXHRcdGdldEtleXModGFyZ2V0KS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuXHRcdFx0ZGVzdGluYXRpb25ba2V5XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHRhcmdldFtrZXldLCBvcHRpb25zKTtcblx0XHR9KTtcblx0fVxuXHRnZXRLZXlzKHNvdXJjZSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcblx0XHRpZiAocHJvcGVydHlJc1Vuc2FmZSh0YXJnZXQsIGtleSkpIHtcblx0XHRcdHJldHVyblxuXHRcdH1cblxuXHRcdGlmIChwcm9wZXJ0eUlzT25PYmplY3QodGFyZ2V0LCBrZXkpICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3Qoc291cmNlW2tleV0pKSB7XG5cdFx0XHRkZXN0aW5hdGlvbltrZXldID0gZ2V0TWVyZ2VGdW5jdGlvbihrZXksIG9wdGlvbnMpKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSwgb3B0aW9ucyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlc3RpbmF0aW9uW2tleV0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChzb3VyY2Vba2V5XSwgb3B0aW9ucyk7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGRlc3RpbmF0aW9uXG59XG5cbmZ1bmN0aW9uIGRlZXBtZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuXHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0b3B0aW9ucy5hcnJheU1lcmdlID0gb3B0aW9ucy5hcnJheU1lcmdlIHx8IGRlZmF1bHRBcnJheU1lcmdlO1xuXHRvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0ID0gb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCB8fCBpc01lcmdlYWJsZU9iamVjdDtcblx0Ly8gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQgaXMgYWRkZWQgdG8gYG9wdGlvbnNgIHNvIHRoYXQgY3VzdG9tIGFycmF5TWVyZ2UoKVxuXHQvLyBpbXBsZW1lbnRhdGlvbnMgY2FuIHVzZSBpdC4gVGhlIGNhbGxlciBtYXkgbm90IHJlcGxhY2UgaXQuXG5cdG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQgPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZDtcblxuXHR2YXIgc291cmNlSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoc291cmNlKTtcblx0dmFyIHRhcmdldElzQXJyYXkgPSBBcnJheS5pc0FycmF5KHRhcmdldCk7XG5cdHZhciBzb3VyY2VBbmRUYXJnZXRUeXBlc01hdGNoID0gc291cmNlSXNBcnJheSA9PT0gdGFyZ2V0SXNBcnJheTtcblxuXHRpZiAoIXNvdXJjZUFuZFRhcmdldFR5cGVzTWF0Y2gpIHtcblx0XHRyZXR1cm4gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoc291cmNlLCBvcHRpb25zKVxuXHR9IGVsc2UgaWYgKHNvdXJjZUlzQXJyYXkpIHtcblx0XHRyZXR1cm4gb3B0aW9ucy5hcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBtZXJnZU9iamVjdCh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucylcblx0fVxufVxuXG5kZWVwbWVyZ2UuYWxsID0gZnVuY3Rpb24gZGVlcG1lcmdlQWxsKGFycmF5LCBvcHRpb25zKSB7XG5cdGlmICghQXJyYXkuaXNBcnJheShhcnJheSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ2ZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSBhbiBhcnJheScpXG5cdH1cblxuXHRyZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uKHByZXYsIG5leHQpIHtcblx0XHRyZXR1cm4gZGVlcG1lcmdlKHByZXYsIG5leHQsIG9wdGlvbnMpXG5cdH0sIHt9KVxufTtcblxudmFyIGRlZXBtZXJnZV8xID0gZGVlcG1lcmdlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZXBtZXJnZV8xO1xuIiwiaW1wb3J0IHsgZXNjYXBlIH0gZnJvbSAnaHRtbC1lc2NhcGVyJztcbmltcG9ydCBudW1Pbmx5IGZyb20gJ251bS1vbmx5JztcbmltcG9ydCBtZXJnZURlZXAgZnJvbSAnZGVlcG1lcmdlJztcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGRlbGltaXRlcnM6IHtcbiAgICBkb3Q6IFwiLlwiLFxuICAgIGRhc2g6IFwiLVwiXG4gIH0sXG4gIGhpZGRlblJhbmdlOiB7XG4gICAgc3RhcnQ6IDMsXG4gICAgZW5kOiAxMFxuICB9LFxuICBvbkZhaWw6ICh2YWx1ZSkgPT4gdmFsdWUsXG4gIGhpZGRlbktleTogXCIqXCIsXG4gIGhpZGRlbjogZmFsc2UsXG4gIGVzY2FwZTogZmFsc2Vcbn07XG5mdW5jdGlvbiBtZXJnZU9wdGlvbnMoY3VzdG9tT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBtZXJnZURlZXAoXG4gICAgZGVmYXVsdE9wdGlvbnMsXG4gICAgY3VzdG9tT3B0aW9uc1xuICApO1xuICBpZiAob3B0aW9ucy5oaWRkZW4pIHtcbiAgICBpZiAoaXNOYU4ob3B0aW9ucy5oaWRkZW5SYW5nZS5zdGFydCkgfHwgb3B0aW9ucy5oaWRkZW5SYW5nZS5zdGFydCA8IDAgfHwgb3B0aW9ucy5oaWRkZW5SYW5nZS5zdGFydCA+IDEwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdPcHRpb24gXCJoaWRkZW5SYW5nZS5zdGFydFwiIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMC4nKTtcbiAgICB9XG4gICAgaWYgKGlzTmFOKG9wdGlvbnMuaGlkZGVuUmFuZ2UuZW5kKSB8fCBvcHRpb25zLmhpZGRlblJhbmdlLmVuZCA8IDAgfHwgb3B0aW9ucy5oaWRkZW5SYW5nZS5lbmQgPiAxMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT3B0aW9uIFwiaGlkZGVuUmFuZ2UuZW5kXCIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwLicpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oaWRkZW5SYW5nZS5zdGFydCA+IG9wdGlvbnMuaGlkZGVuUmFuZ2UuZW5kKSB7XG4gICAgICBjb25zdCBhdXggPSBvcHRpb25zLmhpZGRlblJhbmdlLnN0YXJ0O1xuICAgICAgb3B0aW9ucy5oaWRkZW5SYW5nZS5zdGFydCA9IG9wdGlvbnMuaGlkZGVuUmFuZ2UuZW5kO1xuICAgICAgb3B0aW9ucy5oaWRkZW5SYW5nZS5lbmQgPSBhdXg7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5vbkZhaWwgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBvcHRpb24gXCJvbkZhaWxcIiBtdXN0IGJlIGEgY2FsbGJhY2sgZnVuY3Rpb24uJyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGNwZkZtdChjcGZTdHJpbmcsIG9wdGlvbnMpIHtcbiAgY29uc3QgQ1BGX0xFTkdUSCA9IDExO1xuICBjb25zdCBjcGZBcnJheSA9IG51bU9ubHkoY3BmU3RyaW5nKS5zcGxpdChcIlwiKTtcbiAgY29uc3QgY3VzdG9tT3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhvcHRpb25zKTtcbiAgaWYgKGNwZkFycmF5Lmxlbmd0aCAhPT0gQ1BGX0xFTkdUSCkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBQYXJhbWV0ZXIgXCIke2NwZlN0cmluZ31cIiBkb2VzIG5vdCBjb250YWluICR7Q1BGX0xFTkdUSH0gZGlnaXRzLmApO1xuICAgIHJldHVybiBjdXN0b21PcHRpb25zLm9uRmFpbChjcGZTdHJpbmcsIGVycm9yKTtcbiAgfVxuICBpZiAoY3VzdG9tT3B0aW9ucy5oaWRkZW4pIHtcbiAgICBmb3IgKGxldCBpID0gY3VzdG9tT3B0aW9ucy5oaWRkZW5SYW5nZS5zdGFydDsgaSA8PSBjdXN0b21PcHRpb25zLmhpZGRlblJhbmdlLmVuZDsgaSsrKSB7XG4gICAgICBjcGZBcnJheVtpXSA9IGN1c3RvbU9wdGlvbnMuaGlkZGVuS2V5O1xuICAgIH1cbiAgfVxuICBjcGZBcnJheS5zcGxpY2UoOSwgMCwgY3VzdG9tT3B0aW9ucy5kZWxpbWl0ZXJzLmRhc2gpO1xuICBjcGZBcnJheS5zcGxpY2UoNiwgMCwgY3VzdG9tT3B0aW9ucy5kZWxpbWl0ZXJzLmRvdCk7XG4gIGNwZkFycmF5LnNwbGljZSgzLCAwLCBjdXN0b21PcHRpb25zLmRlbGltaXRlcnMuZG90KTtcbiAgY29uc3QgY3BmUHJldHR5ID0gY3BmQXJyYXkuam9pbihcIlwiKTtcbiAgaWYgKGN1c3RvbU9wdGlvbnMuZXNjYXBlKSB7XG4gICAgcmV0dXJuIGVzY2FwZShjcGZQcmV0dHkpO1xuICB9XG4gIHJldHVybiBjcGZQcmV0dHk7XG59XG5cbmV4cG9ydCB7IGNwZkZtdCBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWFXNWtaWGd1Yldweklpd2ljMjkxY21ObGN5STZXeUl1TGk5emNtTXZiV1Z5WjJVdGIzQjBhVzl1Y3k1MGN5SXNJaTR1TDNOeVl5OWpjR1l0Wm0xMExuUnpJbDBzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0J0WlhKblpVUmxaWEFnWm5KdmJTQW5aR1ZsY0cxbGNtZGxKenRjYmx4dWRIbHdaU0JFWldWd1VHRnlkR2xoYkR4VVBpQTlJSHRjYmlBZ1cxQWdhVzRnYTJWNWIyWWdWRjAvT2lCRVpXVndVR0Z5ZEdsaGJEeFVXMUJkUGp0Y2JuMDdYRzVjYm1WNGNHOXlkQ0JwYm5SbGNtWmhZMlVnUVdOMGRXRnNRM0JtUm05eWJXRjBkR2x1WjA5d2RHbHZibk04VDI1RmNuSkdZV3hzWW1GamF6NGdlMXh1SUNCa1pXeHBiV2wwWlhKek9pQjdYRzRnSUNBZ1pHRnphRG9nYzNSeWFXNW5PMXh1SUNBZ0lHUnZkRG9nYzNSeWFXNW5PMXh1SUNCOU8xeHVJQ0JsYzJOaGNHVTZJR0p2YjJ4bFlXNDdYRzRnSUdocFpHUmxiam9nWW05dmJHVmhianRjYmlBZ2FHbGtaR1Z1UzJWNU9pQnpkSEpwYm1jN1hHNGdJR2hwWkdSbGJsSmhibWRsT2lCN1hHNGdJQ0FnWlc1a09pQnVkVzFpWlhJN1hHNGdJQ0FnYzNSaGNuUTZJRzUxYldKbGNqdGNiaUFnZlR0Y2JpQWdiMjVHWVdsc09pQW9kbUZzZFdVNklITjBjbWx1Wnl3Z1pYSnliM0k2SUVWeWNtOXlLU0E5UGlCUGJrVnlja1poYkd4aVlXTnJPMXh1ZlZ4dVhHNWxlSEJ2Y25RZ2RIbHdaU0JEY0daR2IzSnRZWFIwYVc1blQzQjBhVzl1Y3p4UGJrVnlja1poYkd4aVlXTnJQaUE5SUVSbFpYQlFZWEowYVdGc1BGeHVJQ0JCWTNSMVlXeERjR1pHYjNKdFlYUjBhVzVuVDNCMGFXOXVjenhQYmtWeWNrWmhiR3hpWVdOclBseHVQanRjYmx4dVkyOXVjM1FnWkdWbVlYVnNkRTl3ZEdsdmJuTTZJRUZqZEhWaGJFTndaa1p2Y20xaGRIUnBibWRQY0hScGIyNXpQSE4wY21sdVp6NGdQU0I3WEc0Z0lHUmxiR2x0YVhSbGNuTTZJSHRjYmlBZ0lDQmtiM1E2SUNjdUp5eGNiaUFnSUNCa1lYTm9PaUFuTFNjc1hHNGdJSDBzWEc0Z0lHaHBaR1JsYmxKaGJtZGxPaUI3WEc0Z0lDQWdjM1JoY25RNklETXNYRzRnSUNBZ1pXNWtPaUF4TUN4Y2JpQWdmU3hjYmlBZ2IyNUdZV2xzT2lBb2RtRnNkV1VwSUQwK0lIWmhiSFZsTEZ4dUlDQm9hV1JrWlc1TFpYazZJQ2NxSnl4Y2JpQWdhR2xrWkdWdU9pQm1ZV3h6WlN4Y2JpQWdaWE5qWVhCbE9pQm1ZV3h6WlN4Y2JuMDdYRzVjYmk4cUtseHVJQ29nVFdWeVoyVWdZM1Z6ZEc5dElHOXdkR2x2Ym5NZ2RHOGdkR2hsSUdSbFptRjFiSFFnYjI1bGN5NWNiaUFxTDF4dVpuVnVZM1JwYjI0Z2JXVnlaMlZQY0hScGIyNXpQRTl1UlhKeVJtRnNiR0poWTJzK0tGeHVJQ0JqZFhOMGIyMVBjSFJwYjI1ek9pQkRjR1pHYjNKdFlYUjBhVzVuVDNCMGFXOXVjenhQYmtWeWNrWmhiR3hpWVdOclBpQTlJSHQ5TEZ4dUtUb2dRV04wZFdGc1EzQm1SbTl5YldGMGRHbHVaMDl3ZEdsdmJuTThUMjVGY25KR1lXeHNZbUZqYXo0Z2UxeHVJQ0JqYjI1emRDQnZjSFJwYjI1eklEMGdiV1Z5WjJWRVpXVndLRnh1SUNBZ0lHUmxabUYxYkhSUGNIUnBiMjV6TEZ4dUlDQWdJR04xYzNSdmJVOXdkR2x2Ym5Nc1hHNGdJQ2tnWVhNZ1FXTjBkV0ZzUTNCbVJtOXliV0YwZEdsdVowOXdkR2x2Ym5NOFQyNUZjbkpHWVd4c1ltRmphejQ3WEc1Y2JpQWdhV1lnS0c5d2RHbHZibk11YUdsa1pHVnVLU0I3WEc0Z0lDQWdhV1lnS0Z4dUlDQWdJQ0FnYVhOT1lVNG9iM0IwYVc5dWN5NW9hV1JrWlc1U1lXNW5aUzV6ZEdGeWRDa2dmSHhjYmlBZ0lDQWdJRzl3ZEdsdmJuTXVhR2xrWkdWdVVtRnVaMlV1YzNSaGNuUWdQQ0F3SUh4OFhHNGdJQ0FnSUNCdmNIUnBiMjV6TG1ocFpHUmxibEpoYm1kbExuTjBZWEowSUQ0Z01UQmNiaUFnSUNBcElIdGNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QlVlWEJsUlhKeWIzSW9KMDl3ZEdsdmJpQmNJbWhwWkdSbGJsSmhibWRsTG5OMFlYSjBYQ0lnYlhWemRDQmlaU0JoSUc1MWJXSmxjaUJpWlhSM1pXVnVJREFnWVc1a0lERXdMaWNwTzF4dUlDQWdJSDFjYmx4dUlDQWdJR2xtSUNoY2JpQWdJQ0FnSUdselRtRk9LRzl3ZEdsdmJuTXVhR2xrWkdWdVVtRnVaMlV1Wlc1a0tTQjhmRnh1SUNBZ0lDQWdiM0IwYVc5dWN5NW9hV1JrWlc1U1lXNW5aUzVsYm1RZ1BDQXdJSHg4WEc0Z0lDQWdJQ0J2Y0hScGIyNXpMbWhwWkdSbGJsSmhibWRsTG1WdVpDQStJREV3WEc0Z0lDQWdLU0I3WEc0Z0lDQWdJQ0IwYUhKdmR5QnVaWGNnVkhsd1pVVnljbTl5S0NkUGNIUnBiMjRnWENKb2FXUmtaVzVTWVc1blpTNWxibVJjSWlCdGRYTjBJR0psSUdFZ2JuVnRZbVZ5SUdKbGRIZGxaVzRnTUNCaGJtUWdNVEF1SnlrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tHOXdkR2x2Ym5NdWFHbGtaR1Z1VW1GdVoyVXVjM1JoY25RZ1BpQnZjSFJwYjI1ekxtaHBaR1JsYmxKaGJtZGxMbVZ1WkNrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnWVhWNElEMGdiM0IwYVc5dWN5NW9hV1JrWlc1U1lXNW5aUzV6ZEdGeWREdGNiaUFnSUNBZ0lHOXdkR2x2Ym5NdWFHbGtaR1Z1VW1GdVoyVXVjM1JoY25RZ1BTQnZjSFJwYjI1ekxtaHBaR1JsYmxKaGJtZGxMbVZ1WkR0Y2JpQWdJQ0FnSUc5d2RHbHZibk11YUdsa1pHVnVVbUZ1WjJVdVpXNWtJRDBnWVhWNE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lHbG1JQ2gwZVhCbGIyWWdiM0IwYVc5dWN5NXZia1poYVd3Z0lUMDlJQ2RtZFc1amRHbHZiaWNwSUh0Y2JpQWdJQ0IwYUhKdmR5QnVaWGNnVkhsd1pVVnljbTl5S0NkVWFHVWdiM0IwYVc5dUlGd2liMjVHWVdsc1hDSWdiWFZ6ZENCaVpTQmhJR05oYkd4aVlXTnJJR1oxYm1OMGFXOXVMaWNwTzF4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUc5d2RHbHZibk03WEc1OVhHNWNibVY0Y0c5eWRDQmtaV1poZFd4MElHMWxjbWRsVDNCMGFXOXVjenRjYmlJc0ltbHRjRzl5ZENCN0lHVnpZMkZ3WlNCaGN5QmxjMk5oY0dWSVZFMU1JSDBnWm5KdmJTQW5hSFJ0YkMxbGMyTmhjR1Z5Snp0Y2JtbHRjRzl5ZENCdWRXMVBibXg1SUdaeWIyMGdKMjUxYlMxdmJteDVKenRjYmx4dWFXMXdiM0owSUcxbGNtZGxUM0IwYVc5dWN5Qm1jbTl0SUNjdUwyMWxjbWRsTFc5d2RHbHZibk1uTzF4dWFXMXdiM0owSUhSNWNHVWdleUJEY0daR2IzSnRZWFIwYVc1blQzQjBhVzl1Y3lCOUlHWnliMjBnSnk0dmJXVnlaMlV0YjNCMGFXOXVjeWM3WEc1Y2JpOHFLbHh1SUNvZ1JtOXliV0YwSUdFZ1oybDJaVzRnUTFCR0lHTm9ZWElnYzJWeGRXVnVZMlV1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR053WmtadGREeFBia1Z5Y2taaGJHeGlZV05ySUQwZ2MzUnlhVzVuUGloY2JpQWdZM0JtVTNSeWFXNW5PaUJ6ZEhKcGJtY3NYRzRnSUc5d2RHbHZibk0vT2lCRGNHWkdiM0p0WVhSMGFXNW5UM0IwYVc5dWN6eFBia1Z5Y2taaGJHeGlZV05yUGl4Y2JpazZJSE4wY21sdVp5QjdYRzRnSUdOdmJuTjBJRU5RUmw5TVJVNUhWRWdnUFNBeE1UdGNiaUFnWTI5dWMzUWdZM0JtUVhKeVlYa2dQU0J1ZFcxUGJteDVLR053WmxOMGNtbHVaeWt1YzNCc2FYUW9KeWNwTzF4dUlDQmpiMjV6ZENCamRYTjBiMjFQY0hScGIyNXpJRDBnYldWeVoyVlBjSFJwYjI1ektHOXdkR2x2Ym5NcE8xeHVYRzRnSUdsbUlDaGpjR1pCY25KaGVTNXNaVzVuZEdnZ0lUMDlJRU5RUmw5TVJVNUhWRWdwSUh0Y2JpQWdJQ0JqYjI1emRDQmxjbkp2Y2lBOUlHNWxkeUJGY25KdmNpaGdVR0Z5WVcxbGRHVnlJRndpSkh0amNHWlRkSEpwYm1kOVhDSWdaRzlsY3lCdWIzUWdZMjl1ZEdGcGJpQWtlME5RUmw5TVJVNUhWRWg5SUdScFoybDBjeTVnS1R0Y2JseHVJQ0FnSUhKbGRIVnliaUJqZFhOMGIyMVBjSFJwYjI1ekxtOXVSbUZwYkNoamNHWlRkSEpwYm1jc0lHVnljbTl5S1NCaGN5QnpkSEpwYm1jN1hHNGdJSDFjYmx4dUlDQnBaaUFvWTNWemRHOXRUM0IwYVc5dWN5NW9hV1JrWlc0cElIdGNiaUFnSUNCbWIzSWdLR3hsZENCcElEMGdZM1Z6ZEc5dFQzQjBhVzl1Y3k1b2FXUmtaVzVTWVc1blpTNXpkR0Z5ZERzZ2FTQThQU0JqZFhOMGIyMVBjSFJwYjI1ekxtaHBaR1JsYmxKaGJtZGxMbVZ1WkRzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0JqY0daQmNuSmhlVnRwWFNBOUlHTjFjM1J2YlU5d2RHbHZibk11YUdsa1pHVnVTMlY1TzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUdOd1prRnljbUY1TG5Od2JHbGpaU2c1TENBd0xDQmpkWE4wYjIxUGNIUnBiMjV6TG1SbGJHbHRhWFJsY25NdVpHRnphQ2s3WEc0Z0lHTndaa0Z5Y21GNUxuTndiR2xqWlNnMkxDQXdMQ0JqZFhOMGIyMVBjSFJwYjI1ekxtUmxiR2x0YVhSbGNuTXVaRzkwS1R0Y2JpQWdZM0JtUVhKeVlYa3VjM0JzYVdObEtETXNJREFzSUdOMWMzUnZiVTl3ZEdsdmJuTXVaR1ZzYVcxcGRHVnljeTVrYjNRcE8xeHVJQ0JqYjI1emRDQmpjR1pRY21WMGRIa2dQU0JqY0daQmNuSmhlUzVxYjJsdUtDY25LVHRjYmx4dUlDQnBaaUFvWTNWemRHOXRUM0IwYVc5dWN5NWxjMk5oY0dVcElIdGNiaUFnSUNCeVpYUjFjbTRnWlhOallYQmxTRlJOVENoamNHWlFjbVYwZEhrcE8xeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlHTndabEJ5WlhSMGVUdGNibjFjYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnWTNCbVJtMTBPMXh1SWwwc0ltNWhiV1Z6SWpwYkltVnpZMkZ3WlVoVVRVd2lYU3dpYldGd2NHbHVaM01pT2lJN096czdRVUY1UWtFc1RVRkJUU3hqUVVGeFJDeEhRVUZCTzBGQlFVRXNSVUZEZWtRc1ZVRkJXU3hGUVVGQk8wRkJRVUVzU1VGRFZpeEhRVUZMTEVWQlFVRXNSMEZCUVR0QlFVRkJMRWxCUTB3c1NVRkJUU3hGUVVGQk8wRkJRVUVzUjBGRFVqdEJRVUZCTEVWQlEwRXNWMEZCWVN4RlFVRkJPMEZCUVVFc1NVRkRXQ3hMUVVGUExFVkJRVUVzUTBGQlFUdEJRVUZCTEVsQlExQXNSMEZCU3l4RlFVRkJPMEZCUVVFc1IwRkRVRHRCUVVGQkxFVkJRMEVzVFVGQlFTeEZRVUZSTEVOQlFVTXNTMEZCVlN4TFFVRkJMRXRCUVVFN1FVRkJRU3hGUVVOdVFpeFRRVUZYTEVWQlFVRXNSMEZCUVR0QlFVRkJMRVZCUTFnc1RVRkJVU3hGUVVGQkxFdEJRVUU3UVVGQlFTeEZRVU5TTEUxQlFWRXNSVUZCUVR0QlFVTldMRU5CUVVFN1FVRkxRU3hUUVVGVExGbEJRVUVzUTBGRFVDeGhRVUZ4UkN4SFFVRkJMRVZCUTFZc1JVRkJRVHRCUVVNelF5eEZRVUZCTEUxQlFVMHNUMEZCVlN4SFFVRkJMRk5CUVVFN1FVRkJRU3hKUVVOa0xHTkJRVUU3UVVGQlFTeEpRVU5CTzBGQlFVRXNSMEZEUmp0QlFVVkJMRVZCUVVFc1NVRkJTU3hSUVVGUkxFMUJRVkVzUlVGQlFUdEJRVU5zUWl4SlFVRkJMRWxCUTBVc1MwRkJUU3hEUVVGQkxFOUJRVUVzUTBGQlVTeFhRVUZaTEVOQlFVRXNTMEZCU3l4RFFVTXZRaXhKUVVGQkxFOUJRVUVzUTBGQlVTeFhRVUZaTEVOQlFVRXNTMEZCUVN4SFFVRlJMRU5CUXpWQ0xFbEJRVUVzVDBGQlFTeERRVUZSTEZkQlFWa3NRMEZCUVN4TFFVRkJMRWRCUVZFc1JVRkROVUlzUlVGQlFUdEJRVU5CTEUxQlFVMHNUVUZCUVN4SlFVRkpMRlZCUVZVc0swUkJRU3RFTEVOQlFVRTdRVUZCUVR0QlFVZHlSaXhKUVVGQkxFbEJRMFVzUzBGQlRTeERRVUZCTEU5QlFVRXNRMEZCVVN4WFFVRlpMRU5CUVVFc1IwRkJSeXhEUVVNM1FpeEpRVUZCTEU5QlFVRXNRMEZCVVN4WFFVRlpMRU5CUVVFc1IwRkJRU3hIUVVGTkxFTkJRekZDTEVsQlFVRXNUMEZCUVN4RFFVRlJMRmRCUVZrc1EwRkJRU3hIUVVGQkxFZEJRVTBzUlVGRE1VSXNSVUZCUVR0QlFVTkJMRTFCUVUwc1RVRkJRU3hKUVVGSkxGVkJRVlVzTmtSQlFUWkVMRU5CUVVFN1FVRkJRVHRCUVVkdVJpeEpRVUZCTEVsQlFVa3NUMEZCVVN4RFFVRkJMRmRCUVVFc1EwRkJXU3hMUVVGUkxFZEJRVUVzVDBGQlFTeERRVUZSTEZsQlFWa3NSMEZCU3l4RlFVRkJPMEZCUTNaRUxFMUJRVTBzVFVGQlFTeEhRVUZCTEVkQlFVMHNVVUZCVVN4WFFVRlpMRU5CUVVFc1MwRkJRVHRCUVVOb1F5eE5RVUZSTEU5QlFVRXNRMEZCUVN4WFFVRkJMRU5CUVZrc1MwRkJVU3hIUVVGQkxFOUJRVUVzUTBGQlVTeFhRVUZaTEVOQlFVRXNSMEZCUVR0QlFVTm9SQ3hOUVVGQkxFOUJRVUVzUTBGQlVTeFpRVUZaTEVkQlFVMHNSMEZCUVN4SFFVRkJPMEZCUVVFN1FVRkROVUk3UVVGSFJpeEZRVUZKTEVsQlFVRXNUMEZCVHl4UFFVRlJMRU5CUVVFc1RVRkJRU3hMUVVGWExGVkJRVmtzUlVGQlFUdEJRVU40UXl4SlFVRk5MRTFCUVVFc1NVRkJTU3hWUVVGVkxHdEVRVUZyUkN4RFFVRkJPMEZCUVVFN1FVRkhlRVVzUlVGQlR5eFBRVUZCTEU5QlFVRTdRVUZEVkRzN1FVTjJSVUVzVTBGQlV5eE5RVUZCTEVOQlExQXNWMEZEUVN4UFFVTlJMRVZCUVVFN1FVRkRVaXhGUVVGQkxFMUJRVTBzVlVGQllTeEhRVUZCTEVWQlFVRTdRVUZEYmtJc1JVRkJRU3hOUVVGTkxGRkJRVmNzUjBGQlFTeFBRVUZCTEVOQlFWRXNVMEZCVXl4RFFVRkJMRU5CUVVVc1RVRkJUU3hGUVVGRkxFTkJRVUU3UVVGRE5VTXNSVUZCVFN4TlFVRkJMR0ZCUVVFc1IwRkJaMElzWVVGQllTeFBRVUZQTEVOQlFVRTdRVUZGTVVNc1JVRkJTU3hKUVVGQkxGRkJRVUVzUTBGQlV5eFhRVUZYTEZWQlFWa3NSVUZCUVR0QlFVTnNReXhKUVVGQkxFMUJRVTBzVVVGQlVTeEpRVUZKTEV0QlFVRXNRMEZCVFN4alFVRmpMRk5CUVZNc1EwRkJRU3h0UWtGQlFTeEZRVUZ6UWl4VlFVRlZMRU5CUVZVc1VVRkJRU3hEUVVGQkxFTkJRVUU3UVVGRmVrWXNTVUZCVHl4UFFVRkJMR0ZCUVVFc1EwRkJZeXhOUVVGUExFTkJRVUVzVTBGQlFTeEZRVUZYTEV0QlFVc3NRMEZCUVR0QlFVRkJPMEZCUnpsRExFVkJRVUVzU1VGQlNTeGpRVUZqTEUxQlFWRXNSVUZCUVR0QlFVTjRRaXhKUVVGVExFdEJRVUVzU1VGQlFTeERRVUZCTEVkQlFVa3NZMEZCWXl4WFFVRlpMRU5CUVVFc1MwRkJRU3hGUVVGUExFdEJRVXNzWVVGQll5eERRVUZCTEZkQlFVRXNRMEZCV1N4TFFVRkxMRU5CUVVzc1JVRkJRU3hGUVVGQk8wRkJRM0pHTEUxQlFWTXNVVUZCUVN4RFFVRkJMRU5CUVVNc1NVRkJTU3hoUVVGakxFTkJRVUVzVTBGQlFUdEJRVUZCTzBGQlF6bENPMEZCUjBZc1JVRkJRU3hSUVVGQkxFTkJRVk1zVFVGQlR5eERRVUZCTEVOQlFVRXNSVUZCUnl4RFFVRkhMRVZCUVVFc1lVRkJRU3hEUVVGakxGZEJRVmNzU1VGQlNTeERRVUZCTzBGQlEyNUVMRVZCUVVFc1VVRkJRU3hEUVVGVExFMUJRVThzUTBGQlFTeERRVUZCTEVWQlFVY3NRMEZCUnl4RlFVRkJMR0ZCUVVFc1EwRkJZeXhYUVVGWExFZEJRVWNzUTBGQlFUdEJRVU5zUkN4RlFVRkJMRkZCUVVFc1EwRkJVeXhOUVVGUExFTkJRVUVzUTBGQlFTeEZRVUZITEVOQlFVY3NSVUZCUVN4aFFVRkJMRU5CUVdNc1YwRkJWeXhIUVVGSExFTkJRVUU3UVVGRGJFUXNSVUZCVFN4TlFVRkJMRk5CUVVFc1IwRkJXU3hSUVVGVExFTkJRVUVzU1VGQlFTeERRVUZMTEVWQlFVVXNRMEZCUVR0QlFVVnNReXhGUVVGQkxFbEJRVWtzWTBGQll5eE5RVUZSTEVWQlFVRTdRVUZEZUVJc1NVRkJRU3hQUVVGUFFTeFBRVUZYTEZOQlFWTXNRMEZCUVR0QlFVRkJPMEZCUnpkQ0xFVkJRVThzVDBGQlFTeFRRVUZCTzBGQlExUTdPenM3SW4wPVxuIiwiaW1wb3J0IG1lcmdlRGVlcCBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdHVhbENwZkdlbmVyYXRvck9wdGlvbnMge1xuICBmb3JtYXQ6IGJvb2xlYW47XG4gIHByZWZpeDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBDcGZHZW5lcmF0b3JPcHRpb25zID0gUGFydGlhbDxBY3R1YWxDcGZHZW5lcmF0b3JPcHRpb25zPjtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGZvcm1hdDogZmFsc2UsXG4gIHByZWZpeDogJycsXG59O1xuXG4vKipcbiAqIE1lcmdlIGN1c3RvbSBvcHRpb25zIHRvIHRoZSBkZWZhdWx0IG9uZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhjdXN0b21PcHRpb25zOiBDcGZHZW5lcmF0b3JPcHRpb25zID0ge30pOiBBY3R1YWxDcGZHZW5lcmF0b3JPcHRpb25zIHtcbiAgcmV0dXJuIG1lcmdlRGVlcChkZWZhdWx0T3B0aW9ucywgY3VzdG9tT3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlT3B0aW9ucztcbiIsIi8qKlxuICogR2VuZXJhdGUgYW4gYXJyYXkgb2YgcmFuZG9tIG51bWJlcnMgKGFzIHN0cmluZykgYmV0d2VlbiAwIGFuZCAgOS5cbiAqL1xuZnVuY3Rpb24gbnVtYmVyR2VuZXJhdG9yKGxlbmd0aDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCBudW1lcmljU2VxdWVuY2U6IG51bWJlcltdID0gW107XG5cbiAgd2hpbGUgKG51bWVyaWNTZXF1ZW5jZS5sZW5ndGggPCBsZW5ndGgpIHtcbiAgICBjb25zdCByYW5kb20gPSBNYXRoLnJhbmRvbSgpICogMTA7XG4gICAgY29uc3QgaW50ZWdlciA9IE1hdGguZmxvb3IocmFuZG9tKTtcblxuICAgIG51bWVyaWNTZXF1ZW5jZS5wdXNoKGludGVnZXIpO1xuICB9XG5cbiAgcmV0dXJuIG51bWVyaWNTZXF1ZW5jZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbnVtYmVyR2VuZXJhdG9yO1xuIiwiaW1wb3J0IGNwZkZtdCBmcm9tICdAbGFjdXNzb2Z0L2NwZi1mbXQnO1xuaW1wb3J0IG51bU9ubHkgZnJvbSAnbnVtLW9ubHknO1xuXG5pbXBvcnQgbWVyZ2VPcHRpb25zIGZyb20gJy4vbWVyZ2Utb3B0aW9ucyc7XG5pbXBvcnQgdHlwZSB7IENwZkdlbmVyYXRvck9wdGlvbnMgfSBmcm9tICcuL21lcmdlLW9wdGlvbnMnO1xuaW1wb3J0IG51bWJlckdlbmVyYXRvciBmcm9tICcuL251bWJlci1nZW5lcmF0b3InO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgdmFsaWQgQ1BGIChCcmF6aWxpYW4gSUQgZG9jdW1lbnQpIG51bWVyaWMgc2VxdWVuY2UuXG4gKi9cbmZ1bmN0aW9uIGNwZkdlbihvcHRpb25zPzogQ3BmR2VuZXJhdG9yT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHVzZXJPcHRpb25zID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBiYXNlU2VxdWVuY2UgPSBudW1Pbmx5KHVzZXJPcHRpb25zLnByZWZpeCk7XG4gIGNvbnN0IHByZWZpeExlbmd0aCA9IGJhc2VTZXF1ZW5jZS5sZW5ndGg7XG5cbiAgaWYgKHByZWZpeExlbmd0aCA8IDAgfHwgcHJlZml4TGVuZ3RoID4gOSkge1xuICAgIHRocm93IG5ldyBFcnJvcignT3B0aW9uIFwicHJlZml4XCIgbXVzdCBiZSBhIHN0cmluZyBjb250YWluaW5nIGJldHdlZW4gMSBhbmQgOSBkaWdpdHMuJyk7XG4gIH1cblxuICBjb25zdCBjcGZTZXF1ZW5jZSA9IGJhc2VTZXF1ZW5jZVxuICAgIC5zcGxpdCgnJylcbiAgICAubWFwKE51bWJlcilcbiAgICAuY29uY2F0KG51bWJlckdlbmVyYXRvcig5IC0gcHJlZml4TGVuZ3RoKSk7XG4gIFs5LCAxMF0uZm9yRWFjaCgobmV4dE51bUluZGV4KSA9PiB7XG4gICAgbGV0IGZhY3RvciA9IG5leHROdW1JbmRleCArIDE7XG4gICAgbGV0IHN1bSA9IDA7XG5cbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IG5leHROdW1JbmRleDsgbisrLCBmYWN0b3ItLSkge1xuICAgICAgc3VtICs9IGNwZlNlcXVlbmNlW25dICogZmFjdG9yO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbWFpbmRlciA9IDExIC0gKHN1bSAlIDExKTtcbiAgICBjcGZTZXF1ZW5jZS5wdXNoKHJlbWFpbmRlciA+IDkgPyAwIDogcmVtYWluZGVyKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHVzZXJPcHRpb25zLmZvcm1hdCA/IGNwZkZtdChjcGZTZXF1ZW5jZS5qb2luKCcnKSkgOiBjcGZTZXF1ZW5jZS5qb2luKCcnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3BmR2VuO1xuIl0sIm5hbWVzIjpbInJlcGxhY2UiLCJjYSIsImVzY2EiLCJwZSIsIm0iLCJlc2NhcGUiLCJlcyIsImNhbGwiLCJpc01lcmdlYWJsZU9iamVjdCIsInZhbHVlIiwiaXNOb25OdWxsT2JqZWN0IiwiaXNTcGVjaWFsIiwic3RyaW5nVmFsdWUiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImlzUmVhY3RFbGVtZW50IiwiY2FuVXNlU3ltYm9sIiwiU3ltYm9sIiwiZm9yIiwiUkVBQ1RfRUxFTUVOVF9UWVBFIiwiJCR0eXBlb2YiLCJlbXB0eVRhcmdldCIsInZhbCIsIkFycmF5IiwiaXNBcnJheSIsImNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIiwib3B0aW9ucyIsImNsb25lIiwiZGVlcG1lcmdlIiwiZGVmYXVsdEFycmF5TWVyZ2UiLCJ0YXJnZXQiLCJzb3VyY2UiLCJjb25jYXQiLCJtYXAiLCJlbGVtZW50IiwiZ2V0TWVyZ2VGdW5jdGlvbiIsImtleSIsImN1c3RvbU1lcmdlIiwiZ2V0RW51bWVyYWJsZU93blByb3BlcnR5U3ltYm9scyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsInN5bWJvbCIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiZ2V0S2V5cyIsImtleXMiLCJwcm9wZXJ0eUlzT25PYmplY3QiLCJvYmplY3QiLCJwcm9wZXJ0eSIsIl8iLCJwcm9wZXJ0eUlzVW5zYWZlIiwiaGFzT3duUHJvcGVydHkiLCJtZXJnZU9iamVjdCIsImRlc3RpbmF0aW9uIiwiZm9yRWFjaCIsImFycmF5TWVyZ2UiLCJzb3VyY2VJc0FycmF5IiwidGFyZ2V0SXNBcnJheSIsInNvdXJjZUFuZFRhcmdldFR5cGVzTWF0Y2giLCJhbGwiLCJkZWVwbWVyZ2VBbGwiLCJhcnJheSIsIkVycm9yIiwicmVkdWNlIiwicHJldiIsIm5leHQiLCJkZWVwbWVyZ2VfMSIsImNqcyIsImRlZmF1bHRPcHRpb25zIiwibWVyZ2VPcHRpb25zIiwiZm9ybWF0IiwicHJlZml4IiwiY3VzdG9tT3B0aW9ucyIsIm1lcmdlRGVlcCIsIm51bWJlckdlbmVyYXRvciIsImxlbmd0aCIsIm51bWVyaWNTZXF1ZW5jZSIsInJhbmRvbSIsIk1hdGgiLCJpbnRlZ2VyIiwiZmxvb3IiLCJwdXNoIiwiY3BmR2VuIiwidXNlck9wdGlvbnMiLCJiYXNlU2VxdWVuY2UiLCJudW1Pbmx5IiwicHJlZml4TGVuZ3RoIiwiY3BmU2VxdWVuY2UiLCJzcGxpdCIsIk51bWJlciIsIm5leHROdW1JbmRleCIsImZhY3RvciIsInN1bSIsIm4iLCJyZW1haW5kZXIiLCJjcGZGbXQiLCJqb2luIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0VBQUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBLE1BQU07RUFBQ0EsRUFBQUE7RUFBTyxDQUFDLEdBQUcsRUFBRTtFQUlwQixNQUFNQyxF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