UNPKG

anylang

Version:

A translator's kit that uses the free APIs of Google Translate, Yandex, Bing, ChatGPT, and other LLMs

173 lines (171 loc) 25.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MicrosoftTranslator = void 0; var _zod = require("zod"); var _LanguageAliases = require("../../languages/LanguageAliases"); var _BaseTranslator = require("../BaseTranslator"); var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; const ResponseScheme = _zod.z.object({ translations: _zod.z.object({ text: _zod.z.string() }).array() }).array().or(_zod.z.object({ error: _zod.z.object({ code: _zod.z.number(), message: _zod.z.string() }) })); // eslint-disable // prettier-ignore const supportedLanguagesMap = new _LanguageAliases.LanguageAliases(["ace", "af", "sq", "am", "ar", "arz", "ary", "arb", "hy", "as", "ast", "az", "ban", "bn", "ba", "eu", "bbc", "be", "bho", "bik", "brx", "bs", "bg", "yue", "ca", "ceb", "hne", "lzh", "zh-Hans", "zh-Hant", "co", "hr", "cs", "da", "prs", "dv", "doi", "nl", "en", "en-GB", "epo", "et", "fo", "fj", "fil", "fi", "fr", "fr-CA", "fy", "fur", "gl", "lug", "ka", "de", "el", "gu", "ht", "ha", "he", "hil", "hi", "mww", "hu", "iba", "is", "ig", "ilo", "id", "ikt", "iu", "iu-Latn", "ga", "it", "jam", "ja", "jav", "kea", "kn", "pam", "ks", "kk", "km", "rw", "tlh-Latn", "gom", "ko", "kri", "ku", "kmr", "ky", "lo", "la", "lv", "lij", "lim", "ln", "lt", "lmo", "dsb", "lb", "mk", "mai", "mg", "ms", "ml", "mt", "mr", "mwr", "mfe", "min", "mn-Cyrl", "mn-Mong", "my", "mi", "ne", "nb", "nno", "nya", "oc", "or", "pap", "ps", "fa", "pl", "pt", "pt-PT", "pa", "pnb", "otq", "ro", "run", "ru", "sm", "sa", "srd", "sr-Cyrl", "sr-Latn", "st", "nso", "tn", "crs", "sn", "scn", "sd", "si", "sk", "sl", "so", "es", "su", "sw", "sv", "ty", "tgk", "ta", "tt", "te", "tet", "th", "bo", "ti", "tpi", "to", "tr", "tk", "uk", "hsb", "ur", "ug", "uz", "vec", "vi", "war", "cy", "xh", "ydd", "yo", "yua", "zu"]); // eslint-enable class MicrosoftTranslator extends _BaseTranslator.BaseTranslator { constructor() { super(...arguments); this.token = null; } static getSupportedLanguages() { return supportedLanguagesMap.getAll(); } getLengthLimit() { return 50000; } getRequestsTimeout() { return 300; } checkLimitExceeding(text) { if (Array.isArray(text)) { const arrayLen = text.reduce((acc, text) => acc + text.length, 0); const extra = arrayLen - this.getLengthLimit(); return extra > 0 ? extra : 0; } else { const extra = text.length - this.getLengthLimit(); return extra > 0 ? extra : 0; } } translate(text, from, to) { return __awaiter(this, void 0, void 0, function* () { return this.translateBatch([text], from, to).then(resp => resp[0]); }); } translateBatch(text, from, to) { return __awaiter(this, void 0, void 0, function* () { const sourceLanguage = from === 'auto' ? 'auto' : supportedLanguagesMap.get(from); const targetLanguage = supportedLanguagesMap.get(to); if (!sourceLanguage) throw new TypeError(`Unsupported source language ${from}`); if (!targetLanguage) throw new TypeError(`Unsupported source language ${to}`); const token = yield this.getToken(); const url = 'https://api-edge.cognitive.microsofttranslator.com/translate?' + ( // Omit `from` parameter for auto detection of language sourceLanguage !== 'auto' ? `from=${encodeURIComponent(sourceLanguage)}&` : '') + `to=${encodeURIComponent(targetLanguage)}&api-version=3.0&includeSentenceLength=true`; return this.fetch(url, { responseType: 'json', method: 'POST', headers: { accept: '*/*', 'accept-language': 'zh-TW,zh;q=0.9,ja;q=0.8,zh-CN;q=0.7,en-US;q=0.6,en;q=0.5', authorization: `Bearer ${token}`, 'cache-control': 'no-cache', 'content-type': 'application/json', pragma: 'no-cache', priority: 'u=1, i', 'referrer-policy': 'strict-origin-when-cross-origin', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'none', 'sec-fetch-storage-access': 'active' }, body: JSON.stringify(text.map(text => ({ Text: text }))) }).then(rawResult => { const result = ResponseScheme.parse(rawResult.data); if ('error' in result) { throw new Error(`Code ${result.error.code}: ${result.error.message}`); } // Transform translations array return result.map(translationItem => // Build translation for single text translationItem.translations.map(translationSegment => translationSegment.text).join(' ')); }); }); } getToken() { return __awaiter(this, void 0, void 0, function* () { var _a; // Wait resolution if pending if (this.token instanceof Promise) return this.token; // Fetch new token const tokenLifetime = (_a = this.options.tokenLifetime) !== null && _a !== void 0 ? _a : 30000; if (!this.token || Date.now() - this.token.issuedAt > tokenLifetime) { this.token = this.fetch('https://edge.microsoft.com/translate/auth', { responseType: 'text', method: 'GET', headers: { accept: '*/*', 'accept-language': 'zh-TW,zh;q=0.9,ja;q=0.8,zh-CN;q=0.7,en-US;q=0.6,en;q=0.5', 'cache-control': 'no-cache', pragma: 'no-cache', priority: 'u=1, i', 'referrer-policy': 'strict-origin-when-cross-origin', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'none', 'sec-fetch-storage-access': 'active' }, body: null }).then(({ data: token, statusText, status, ok }) => { if (!ok) throw new Error(statusText || `Unknown error with status ${status}`); this.token = { value: token, issuedAt: Date.now() }; return token; }).catch(error => { this.token = null; throw error; }); return yield this.token; } // Use cached value return this.token.value; }); } } exports.MicrosoftTranslator = MicrosoftTranslator; MicrosoftTranslator.translatorName = 'MicrosoftTranslator'; MicrosoftTranslator.isSupportedAutoFrom = () => true; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRvcnMvTWljcm9zb2Z0VHJhbnNsYXRvci9pbmRleC5qcyIsIm5hbWVzIjpbIl96b2QiLCJyZXF1aXJlIiwiX0xhbmd1YWdlQWxpYXNlcyIsIl9CYXNlVHJhbnNsYXRvciIsIlJlc3BvbnNlU2NoZW1lIiwieiIsIm9iamVjdCIsInRyYW5zbGF0aW9ucyIsInRleHQiLCJzdHJpbmciLCJhcnJheSIsIm9yIiwiZXJyb3IiLCJjb2RlIiwibnVtYmVyIiwibWVzc2FnZSIsInN1cHBvcnRlZExhbmd1YWdlc01hcCIsIkxhbmd1YWdlQWxpYXNlcyIsIk1pY3Jvc29mdFRyYW5zbGF0b3IiLCJCYXNlVHJhbnNsYXRvciIsImNvbnN0cnVjdG9yIiwidG9rZW4iLCJnZXRTdXBwb3J0ZWRMYW5ndWFnZXMiLCJnZXRBbGwiLCJnZXRMZW5ndGhMaW1pdCIsImdldFJlcXVlc3RzVGltZW91dCIsImNoZWNrTGltaXRFeGNlZWRpbmciLCJBcnJheSIsImlzQXJyYXkiLCJhcnJheUxlbiIsInJlZHVjZSIsImFjYyIsImxlbmd0aCIsImV4dHJhIiwidHJhbnNsYXRlIiwiZnJvbSIsInRvIiwidHJhbnNsYXRlQmF0Y2giLCJ0aGVuIiwicmVzcCIsInNvdXJjZUxhbmd1YWdlIiwiZ2V0IiwidGFyZ2V0TGFuZ3VhZ2UiLCJUeXBlRXJyb3IiLCJnZXRUb2tlbiIsInVybCIsImVuY29kZVVSSUNvbXBvbmVudCIsImZldGNoIiwicmVzcG9uc2VUeXBlIiwibWV0aG9kIiwiaGVhZGVycyIsImFjY2VwdCIsImF1dGhvcml6YXRpb24iLCJwcmFnbWEiLCJwcmlvcml0eSIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwibWFwIiwiVGV4dCIsInJhd1Jlc3VsdCIsInJlc3VsdCIsInBhcnNlIiwiZGF0YSIsIkVycm9yIiwidHJhbnNsYXRpb25JdGVtIiwidHJhbnNsYXRpb25TZWdtZW50Iiwiam9pbiIsIlByb21pc2UiLCJ0b2tlbkxpZmV0aW1lIiwiX2EiLCJvcHRpb25zIiwiRGF0ZSIsIm5vdyIsImlzc3VlZEF0Iiwic3RhdHVzVGV4dCIsInN0YXR1cyIsIm9rIiwidmFsdWUiLCJjYXRjaCIsInRyYW5zbGF0b3JOYW1lIiwiaXNTdXBwb3J0ZWRBdXRvRnJvbSJdLCJzb3VyY2VzIjpbInRyYW5zbGF0b3JzL01pY3Jvc29mdFRyYW5zbGF0b3IvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IExhbmd1YWdlQWxpYXNlcyB9IGZyb20gJy4uLy4uL2xhbmd1YWdlcy9MYW5ndWFnZUFsaWFzZXMnO1xuXG5pbXBvcnQgeyBCYXNlVHJhbnNsYXRvciB9IGZyb20gJy4uL0Jhc2VUcmFuc2xhdG9yJztcblxuY29uc3QgUmVzcG9uc2VTY2hlbWUgPSB6XG5cdC5vYmplY3Qoe1xuXHRcdHRyYW5zbGF0aW9uczogelxuXHRcdFx0Lm9iamVjdCh7XG5cdFx0XHRcdHRleHQ6IHouc3RyaW5nKCksXG5cdFx0XHR9KVxuXHRcdFx0LmFycmF5KCksXG5cdH0pXG5cdC5hcnJheSgpXG5cdC5vcihcblx0XHR6Lm9iamVjdCh7XG5cdFx0XHRlcnJvcjogei5vYmplY3Qoe1xuXHRcdFx0XHRjb2RlOiB6Lm51bWJlcigpLFxuXHRcdFx0XHRtZXNzYWdlOiB6LnN0cmluZygpLFxuXHRcdFx0fSksXG5cdFx0fSksXG5cdCk7XG5cbi8vIGVzbGludC1kaXNhYmxlXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IHN1cHBvcnRlZExhbmd1YWdlc01hcCA9IG5ldyBMYW5ndWFnZUFsaWFzZXMoW1xuXHRcImFjZVwiLCBcImFmXCIsIFwic3FcIiwgXCJhbVwiLCBcImFyXCIsIFwiYXJ6XCIsIFwiYXJ5XCIsIFwiYXJiXCIsIFwiaHlcIiwgXCJhc1wiLFxuXHRcImFzdFwiLCBcImF6XCIsIFwiYmFuXCIsIFwiYm5cIiwgXCJiYVwiLCBcImV1XCIsIFwiYmJjXCIsIFwiYmVcIiwgXCJiaG9cIiwgXCJiaWtcIixcblx0XCJicnhcIiwgXCJic1wiLCBcImJnXCIsIFwieXVlXCIsIFwiY2FcIiwgXCJjZWJcIiwgXCJobmVcIiwgXCJsemhcIiwgXCJ6aC1IYW5zXCIsXG5cdFwiemgtSGFudFwiLCBcImNvXCIsIFwiaHJcIiwgXCJjc1wiLCBcImRhXCIsIFwicHJzXCIsIFwiZHZcIiwgXCJkb2lcIiwgXCJubFwiLCBcImVuXCIsXG5cdFwiZW4tR0JcIiwgXCJlcG9cIiwgXCJldFwiLCBcImZvXCIsIFwiZmpcIiwgXCJmaWxcIiwgXCJmaVwiLCBcImZyXCIsIFwiZnItQ0FcIiwgXCJmeVwiLFxuXHRcImZ1clwiLCBcImdsXCIsIFwibHVnXCIsIFwia2FcIiwgXCJkZVwiLCBcImVsXCIsIFwiZ3VcIiwgXCJodFwiLCBcImhhXCIsIFwiaGVcIiwgXCJoaWxcIixcblx0XCJoaVwiLCBcIm13d1wiLCBcImh1XCIsIFwiaWJhXCIsIFwiaXNcIiwgXCJpZ1wiLCBcImlsb1wiLCBcImlkXCIsIFwiaWt0XCIsIFwiaXVcIiwgXCJpdS1MYXRuXCIsXG5cdFwiZ2FcIiwgXCJpdFwiLCBcImphbVwiLCBcImphXCIsIFwiamF2XCIsIFwia2VhXCIsIFwia25cIiwgXCJwYW1cIiwgXCJrc1wiLCBcImtrXCIsIFwia21cIixcblx0XCJyd1wiLCBcInRsaC1MYXRuXCIsIFwiZ29tXCIsIFwia29cIiwgXCJrcmlcIiwgXCJrdVwiLCBcImttclwiLCBcImt5XCIsIFwibG9cIiwgXCJsYVwiLCBcImx2XCIsXG5cdFwibGlqXCIsIFwibGltXCIsIFwibG5cIiwgXCJsdFwiLCBcImxtb1wiLCBcImRzYlwiLCBcImxiXCIsIFwibWtcIiwgXCJtYWlcIiwgXCJtZ1wiLCBcIm1zXCIsXG5cdFwibWxcIiwgXCJtdFwiLCBcIm1yXCIsIFwibXdyXCIsIFwibWZlXCIsIFwibWluXCIsIFwibW4tQ3lybFwiLCBcIm1uLU1vbmdcIiwgXCJteVwiLCBcIm1pXCIsXG5cdFwibmVcIiwgXCJuYlwiLCBcIm5ub1wiLCBcIm55YVwiLCBcIm9jXCIsIFwib3JcIiwgXCJwYXBcIiwgXCJwc1wiLCBcImZhXCIsIFwicGxcIiwgXCJwdFwiLFxuXHRcInB0LVBUXCIsIFwicGFcIiwgXCJwbmJcIiwgXCJvdHFcIiwgXCJyb1wiLCBcInJ1blwiLCBcInJ1XCIsIFwic21cIiwgXCJzYVwiLCBcInNyZFwiLFxuXHRcInNyLUN5cmxcIiwgXCJzci1MYXRuXCIsIFwic3RcIiwgXCJuc29cIiwgXCJ0blwiLCBcImNyc1wiLCBcInNuXCIsIFwic2NuXCIsIFwic2RcIiwgXCJzaVwiLFxuXHRcInNrXCIsIFwic2xcIiwgXCJzb1wiLCBcImVzXCIsIFwic3VcIiwgXCJzd1wiLCBcInN2XCIsIFwidHlcIiwgXCJ0Z2tcIiwgXCJ0YVwiLCBcInR0XCIsIFwidGVcIixcblx0XCJ0ZXRcIiwgXCJ0aFwiLCBcImJvXCIsIFwidGlcIiwgXCJ0cGlcIiwgXCJ0b1wiLCBcInRyXCIsIFwidGtcIiwgXCJ1a1wiLCBcImhzYlwiLCBcInVyXCIsIFwidWdcIixcblx0XCJ1elwiLCBcInZlY1wiLCBcInZpXCIsIFwid2FyXCIsIFwiY3lcIiwgXCJ4aFwiLCBcInlkZFwiLCBcInlvXCIsIFwieXVhXCIsIFwienVcIlxuXSk7XG4vLyBlc2xpbnQtZW5hYmxlXG5cbmV4cG9ydCBjbGFzcyBNaWNyb3NvZnRUcmFuc2xhdG9yIGV4dGVuZHMgQmFzZVRyYW5zbGF0b3I8eyB0b2tlbkxpZmV0aW1lPzogbnVtYmVyIH0+IHtcblx0cHVibGljIHN0YXRpYyByZWFkb25seSB0cmFuc2xhdG9yTmFtZSA9ICdNaWNyb3NvZnRUcmFuc2xhdG9yJztcblxuXHRwdWJsaWMgc3RhdGljIGlzU3VwcG9ydGVkQXV0b0Zyb20gPSAoKSA9PiB0cnVlO1xuXG5cdHB1YmxpYyBzdGF0aWMgZ2V0U3VwcG9ydGVkTGFuZ3VhZ2VzKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gc3VwcG9ydGVkTGFuZ3VhZ2VzTWFwLmdldEFsbCgpO1xuXHR9XG5cblx0cHVibGljIGdldExlbmd0aExpbWl0KCkge1xuXHRcdHJldHVybiA1MF8wMDA7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmVxdWVzdHNUaW1lb3V0KCkge1xuXHRcdHJldHVybiAzMDA7XG5cdH1cblxuXHRwdWJsaWMgY2hlY2tMaW1pdEV4Y2VlZGluZyh0ZXh0OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHRleHQpKSB7XG5cdFx0XHRjb25zdCBhcnJheUxlbiA9IHRleHQucmVkdWNlKChhY2MsIHRleHQpID0+IGFjYyArIHRleHQubGVuZ3RoLCAwKTtcblx0XHRcdGNvbnN0IGV4dHJhID0gYXJyYXlMZW4gLSB0aGlzLmdldExlbmd0aExpbWl0KCk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPiAwID8gZXh0cmEgOiAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBleHRyYSA9IHRleHQubGVuZ3RoIC0gdGhpcy5nZXRMZW5ndGhMaW1pdCgpO1xuXHRcdFx0cmV0dXJuIGV4dHJhID4gMCA/IGV4dHJhIDogMDtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgdHJhbnNsYXRlKHRleHQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlQmF0Y2goW3RleHRdLCBmcm9tLCB0bykudGhlbigocmVzcCkgPT4gcmVzcFswXSk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgdHJhbnNsYXRlQmF0Y2godGV4dDogc3RyaW5nW10sIGZyb206IHN0cmluZywgdG86IHN0cmluZykge1xuXHRcdGNvbnN0IHNvdXJjZUxhbmd1YWdlID0gZnJvbSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogc3VwcG9ydGVkTGFuZ3VhZ2VzTWFwLmdldChmcm9tKTtcblx0XHRjb25zdCB0YXJnZXRMYW5ndWFnZSA9IHN1cHBvcnRlZExhbmd1YWdlc01hcC5nZXQodG8pO1xuXG5cdFx0aWYgKCFzb3VyY2VMYW5ndWFnZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgc291cmNlIGxhbmd1YWdlICR7ZnJvbX1gKTtcblx0XHRpZiAoIXRhcmdldExhbmd1YWdlKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCBzb3VyY2UgbGFuZ3VhZ2UgJHt0b31gKTtcblxuXHRcdGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRUb2tlbigpO1xuXG5cdFx0Y29uc3QgdXJsID1cblx0XHRcdCdodHRwczovL2FwaS1lZGdlLmNvZ25pdGl2ZS5taWNyb3NvZnR0cmFuc2xhdG9yLmNvbS90cmFuc2xhdGU/JyArXG5cdFx0XHQvLyBPbWl0IGBmcm9tYCBwYXJhbWV0ZXIgZm9yIGF1dG8gZGV0ZWN0aW9uIG9mIGxhbmd1YWdlXG5cdFx0XHQoc291cmNlTGFuZ3VhZ2UgIT09ICdhdXRvJ1xuXHRcdFx0XHQ/IGBmcm9tPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNvdXJjZUxhbmd1YWdlKX0mYFxuXHRcdFx0XHQ6ICcnKSArXG5cdFx0XHRgdG89JHtlbmNvZGVVUklDb21wb25lbnQoXG5cdFx0XHRcdHRhcmdldExhbmd1YWdlLFxuXHRcdFx0KX0mYXBpLXZlcnNpb249My4wJmluY2x1ZGVTZW50ZW5jZUxlbmd0aD10cnVlYDtcblxuXHRcdHJldHVybiB0aGlzLmZldGNoKHVybCwge1xuXHRcdFx0cmVzcG9uc2VUeXBlOiAnanNvbicsXG5cdFx0XHRtZXRob2Q6ICdQT1NUJyxcblx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0YWNjZXB0OiAnKi8qJyxcblx0XHRcdFx0J2FjY2VwdC1sYW5ndWFnZSc6XG5cdFx0XHRcdFx0J3poLVRXLHpoO3E9MC45LGphO3E9MC44LHpoLUNOO3E9MC43LGVuLVVTO3E9MC42LGVuO3E9MC41Jyxcblx0XHRcdFx0YXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG5cdFx0XHRcdCdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlJyxcblx0XHRcdFx0J2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcblx0XHRcdFx0cHJhZ21hOiAnbm8tY2FjaGUnLFxuXHRcdFx0XHRwcmlvcml0eTogJ3U9MSwgaScsXG5cdFx0XHRcdCdyZWZlcnJlci1wb2xpY3knOiAnc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbicsXG5cdFx0XHRcdCdzZWMtZmV0Y2gtZGVzdCc6ICdlbXB0eScsXG5cdFx0XHRcdCdzZWMtZmV0Y2gtbW9kZSc6ICdjb3JzJyxcblx0XHRcdFx0J3NlYy1mZXRjaC1zaXRlJzogJ25vbmUnLFxuXHRcdFx0XHQnc2VjLWZldGNoLXN0b3JhZ2UtYWNjZXNzJzogJ2FjdGl2ZScsXG5cdFx0XHR9LFxuXHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkodGV4dC5tYXAoKHRleHQpID0+ICh7IFRleHQ6IHRleHQgfSkpKSxcblx0XHR9KS50aGVuKChyYXdSZXN1bHQpID0+IHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IFJlc3BvbnNlU2NoZW1lLnBhcnNlKHJhd1Jlc3VsdC5kYXRhKTtcblxuXHRcdFx0aWYgKCdlcnJvcicgaW4gcmVzdWx0KSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ29kZSAke3Jlc3VsdC5lcnJvci5jb2RlfTogJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVHJhbnNmb3JtIHRyYW5zbGF0aW9ucyBhcnJheVxuXHRcdFx0cmV0dXJuIHJlc3VsdC5tYXAoKHRyYW5zbGF0aW9uSXRlbSkgPT5cblx0XHRcdFx0Ly8gQnVpbGQgdHJhbnNsYXRpb24gZm9yIHNpbmdsZSB0ZXh0XG5cdFx0XHRcdHRyYW5zbGF0aW9uSXRlbS50cmFuc2xhdGlvbnNcblx0XHRcdFx0XHQubWFwKCh0cmFuc2xhdGlvblNlZ21lbnQpID0+IHRyYW5zbGF0aW9uU2VnbWVudC50ZXh0KVxuXHRcdFx0XHRcdC5qb2luKCcgJyksXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJvdGVjdGVkIHRva2VuOlxuXHRcdHwge1xuXHRcdFx0XHR2YWx1ZTogc3RyaW5nO1xuXHRcdFx0XHRpc3N1ZWRBdDogbnVtYmVyO1xuXHRcdCAgfVxuXHRcdHwgUHJvbWlzZTxzdHJpbmc+XG5cdFx0fCBudWxsID0gbnVsbDtcblx0cHJvdGVjdGVkIGFzeW5jIGdldFRva2VuKCkge1xuXHRcdC8vIFdhaXQgcmVzb2x1dGlvbiBpZiBwZW5kaW5nXG5cdFx0aWYgKHRoaXMudG9rZW4gaW5zdGFuY2VvZiBQcm9taXNlKSByZXR1cm4gdGhpcy50b2tlbjtcblxuXHRcdC8vIEZldGNoIG5ldyB0b2tlblxuXHRcdGNvbnN0IHRva2VuTGlmZXRpbWUgPSB0aGlzLm9wdGlvbnMudG9rZW5MaWZldGltZSA/PyAzMF8wMDA7XG5cdFx0aWYgKCF0aGlzLnRva2VuIHx8IERhdGUubm93KCkgLSB0aGlzLnRva2VuLmlzc3VlZEF0ID4gdG9rZW5MaWZldGltZSkge1xuXHRcdFx0dGhpcy50b2tlbiA9IHRoaXMuZmV0Y2goJ2h0dHBzOi8vZWRnZS5taWNyb3NvZnQuY29tL3RyYW5zbGF0ZS9hdXRoJywge1xuXHRcdFx0XHRyZXNwb25zZVR5cGU6ICd0ZXh0Jyxcblx0XHRcdFx0bWV0aG9kOiAnR0VUJyxcblx0XHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcdGFjY2VwdDogJyovKicsXG5cdFx0XHRcdFx0J2FjY2VwdC1sYW5ndWFnZSc6XG5cdFx0XHRcdFx0XHQnemgtVFcsemg7cT0wLjksamE7cT0wLjgsemgtQ047cT0wLjcsZW4tVVM7cT0wLjYsZW47cT0wLjUnLFxuXHRcdFx0XHRcdCdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlJyxcblx0XHRcdFx0XHRwcmFnbWE6ICduby1jYWNoZScsXG5cdFx0XHRcdFx0cHJpb3JpdHk6ICd1PTEsIGknLFxuXHRcdFx0XHRcdCdyZWZlcnJlci1wb2xpY3knOiAnc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbicsXG5cdFx0XHRcdFx0J3NlYy1mZXRjaC1kZXN0JzogJ2VtcHR5Jyxcblx0XHRcdFx0XHQnc2VjLWZldGNoLW1vZGUnOiAnY29ycycsXG5cdFx0XHRcdFx0J3NlYy1mZXRjaC1zaXRlJzogJ25vbmUnLFxuXHRcdFx0XHRcdCdzZWMtZmV0Y2gtc3RvcmFnZS1hY2Nlc3MnOiAnYWN0aXZlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ym9keTogbnVsbCxcblx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKCh7IGRhdGE6IHRva2VuLCBzdGF0dXNUZXh0LCBzdGF0dXMsIG9rIH0pID0+IHtcblx0XHRcdFx0XHRpZiAoIW9rKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdFx0XHRzdGF0dXNUZXh0IHx8IGBVbmtub3duIGVycm9yIHdpdGggc3RhdHVzICR7c3RhdHVzfWAsXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0dGhpcy50b2tlbiA9IHsgdmFsdWU6IHRva2VuLCBpc3N1ZWRBdDogRGF0ZS5ub3coKSB9O1xuXHRcdFx0XHRcdHJldHVybiB0b2tlbjtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdHRoaXMudG9rZW4gPSBudWxsO1xuXHRcdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIGF3YWl0IHRoaXMudG9rZW47XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIGNhY2hlZCB2YWx1ZVxuXHRcdHJldHVybiB0aGlzLnRva2VuLnZhbHVlO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLElBQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLGdCQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxlQUFBLEdBQUFGLE9BQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxNQUFNRyxjQUFjLEdBQUdDLE1BQUMsQ0FDdEJDLE1BQU0sQ0FBQztFQUNQQyxZQUFZLEVBQUVGLE1BQUMsQ0FDYkMsTUFBTSxDQUFDO0lBQ1BFLElBQUksRUFBRUgsTUFBQyxDQUFDSSxNQUFNO0dBQ2QsQ0FBQyxDQUNEQyxLQUFLO0NBQ1AsQ0FBQyxDQUNEQSxLQUFLLEVBQUUsQ0FDUEMsRUFBRSxDQUNGTixNQUFDLENBQUNDLE1BQU0sQ0FBQztFQUNSTSxLQUFLLEVBQUVQLE1BQUMsQ0FBQ0MsTUFBTSxDQUFDO0lBQ2ZPLElBQUksRUFBRVIsTUFBQyxDQUFDUyxNQUFNLEVBQUU7SUFDaEJDLE9BQU8sRUFBRVYsTUFBQyxDQUFDSSxNQUFNO0dBQ2pCO0NBQ0QsQ0FBQyxDQUNGO0FBRUY7QUFDQTtBQUNBLE1BQU1PLHFCQUFxQixHQUFHLElBQUlDLGdDQUFlLENBQUMsQ0FDakQsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUM5RCxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQy9ELEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUM5RCxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDbEUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFDbkUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFDekUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDcEUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDekUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDckUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUN2RSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUNuRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQ2pFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDdkUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQ3ZFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUN6RSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQzlELENBQUM7QUFDRjtBQUVNLE1BQU9DLG1CQUFvQixTQUFRQyw4QkFBMEM7RUFBbkZDLFlBQUE7O0lBdUZXLEtBQUFDLEtBQUssR0FNTCxJQUFJO0VBOENmO0VBdElRLE9BQU9DLHFCQUFxQkEsQ0FBQTtJQUNsQyxPQUFPTixxQkFBcUIsQ0FBQ08sTUFBTSxFQUFFO0VBQ3RDO0VBRU9DLGNBQWNBLENBQUE7SUFDcEIsT0FBTyxLQUFNO0VBQ2Q7RUFFT0Msa0JBQWtCQSxDQUFBO0lBQ3hCLE9BQU8sR0FBRztFQUNYO0VBRU9DLG1CQUFtQkEsQ0FBQ2xCLElBQXVCO0lBQ2pELElBQUltQixLQUFLLENBQUNDLE9BQU8sQ0FBQ3BCLElBQUksQ0FBQyxFQUFFO01BQ3hCLE1BQU1xQixRQUFRLEdBQUdyQixJQUFJLENBQUNzQixNQUFNLENBQUMsQ0FBQ0MsR0FBRyxFQUFFdkIsSUFBSSxLQUFLdUIsR0FBRyxHQUFHdkIsSUFBSSxDQUFDd0IsTUFBTSxFQUFFLENBQUMsQ0FBQztNQUNqRSxNQUFNQyxLQUFLLEdBQUdKLFFBQVEsR0FBRyxJQUFJLENBQUNMLGNBQWMsRUFBRTtNQUM5QyxPQUFPUyxLQUFLLEdBQUcsQ0FBQyxHQUFHQSxLQUFLLEdBQUcsQ0FBQztJQUM3QixDQUFDLE1BQU07TUFDTixNQUFNQSxLQUFLLEdBQUd6QixJQUFJLENBQUN3QixNQUFNLEdBQUcsSUFBSSxDQUFDUixjQUFjLEVBQUU7TUFDakQsT0FBT1MsS0FBSyxHQUFHLENBQUMsR0FBR0EsS0FBSyxHQUFHLENBQUM7SUFDN0I7RUFDRDtFQUVhQyxTQUFTQSxDQUFDMUIsSUFBWSxFQUFFMkIsSUFBWSxFQUFFQyxFQUFVOztNQUM1RCxPQUFPLElBQUksQ0FBQ0MsY0FBYyxDQUFDLENBQUM3QixJQUFJLENBQUMsRUFBRTJCLElBQUksRUFBRUMsRUFBRSxDQUFDLENBQUNFLElBQUksQ0FBRUMsSUFBSSxJQUFLQSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQzs7RUFFWUYsY0FBY0EsQ0FBQzdCLElBQWMsRUFBRTJCLElBQVksRUFBRUMsRUFBVTs7TUFDbkUsTUFBTUksY0FBYyxHQUFHTCxJQUFJLEtBQUssTUFBTSxHQUFHLE1BQU0sR0FBR25CLHFCQUFxQixDQUFDeUIsR0FBRyxDQUFDTixJQUFJLENBQUM7TUFDakYsTUFBTU8sY0FBYyxHQUFHMUIscUJBQXFCLENBQUN5QixHQUFHLENBQUNMLEVBQUUsQ0FBQztNQUVwRCxJQUFJLENBQUNJLGNBQWMsRUFBRSxNQUFNLElBQUlHLFNBQVMsQ0FBQywrQkFBK0JSLElBQUksRUFBRSxDQUFDO01BQy9FLElBQUksQ0FBQ08sY0FBYyxFQUFFLE1BQU0sSUFBSUMsU0FBUyxDQUFDLCtCQUErQlAsRUFBRSxFQUFFLENBQUM7TUFFN0UsTUFBTWYsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDdUIsUUFBUSxFQUFFO01BRW5DLE1BQU1DLEdBQUcsR0FDUiwrREFBK0Q7TUFDL0Q7TUFDQ0wsY0FBYyxLQUFLLE1BQU0sR0FDdkIsUUFBUU0sa0JBQWtCLENBQUNOLGNBQWMsQ0FBQyxHQUFHLEdBQzdDLEVBQUUsQ0FBQyxHQUNOLE1BQU1NLGtCQUFrQixDQUN2QkosY0FBYyxDQUNkLDZDQUE2QztNQUUvQyxPQUFPLElBQUksQ0FBQ0ssS0FBSyxDQUFDRixHQUFHLEVBQUU7UUFDdEJHLFlBQVksRUFBRSxNQUFNO1FBQ3BCQyxNQUFNLEVBQUUsTUFBTTtRQUNkQyxPQUFPLEVBQUU7VUFDUkMsTUFBTSxFQUFFLEtBQUs7VUFDYixpQkFBaUIsRUFDaEIsMERBQTBEO1VBQzNEQyxhQUFhLEVBQUUsVUFBVS9CLEtBQUssRUFBRTtVQUNoQyxlQUFlLEVBQUUsVUFBVTtVQUMzQixjQUFjLEVBQUUsa0JBQWtCO1VBQ2xDZ0MsTUFBTSxFQUFFLFVBQVU7VUFDbEJDLFFBQVEsRUFBRSxRQUFRO1VBQ2xCLGlCQUFpQixFQUFFLGlDQUFpQztVQUNwRCxnQkFBZ0IsRUFBRSxPQUFPO1VBQ3pCLGdCQUFnQixFQUFFLE1BQU07VUFDeEIsZ0JBQWdCLEVBQUUsTUFBTTtVQUN4QiwwQkFBMEIsRUFBRTtTQUM1QjtRQUNEQyxJQUFJLEVBQUVDLElBQUksQ0FBQ0MsU0FBUyxDQUFDakQsSUFBSSxDQUFDa0QsR0FBRyxDQUFFbEQsSUFBSSxLQUFNO1VBQUVtRCxJQUFJLEVBQUVuRDtRQUFJLENBQUUsQ0FBQyxDQUFDO09BQ3pELENBQUMsQ0FBQzhCLElBQUksQ0FBRXNCLFNBQVMsSUFBSTtRQUNyQixNQUFNQyxNQUFNLEdBQUd6RCxjQUFjLENBQUMwRCxLQUFLLENBQUNGLFNBQVMsQ0FBQ0csSUFBSSxDQUFDO1FBRW5ELElBQUksT0FBTyxJQUFJRixNQUFNLEVBQUU7VUFDdEIsTUFBTSxJQUFJRyxLQUFLLENBQUMsUUFBUUgsTUFBTSxDQUFDakQsS0FBSyxDQUFDQyxJQUFJLEtBQUtnRCxNQUFNLENBQUNqRCxLQUFLLENBQUNHLE9BQU8sRUFBRSxDQUFDO1FBQ3RFO1FBRUE7UUFDQSxPQUFPOEMsTUFBTSxDQUFDSCxHQUFHLENBQUVPLGVBQWU7UUFDakM7UUFDQUEsZUFBZSxDQUFDMUQsWUFBWSxDQUMxQm1ELEdBQUcsQ0FBRVEsa0JBQWtCLElBQUtBLGtCQUFrQixDQUFDMUQsSUFBSSxDQUFDLENBQ3BEMkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUNYO01BQ0YsQ0FBQyxDQUFDO0lBQ0gsQ0FBQzs7RUFTZXZCLFFBQVFBLENBQUE7OztNQUN2QjtNQUNBLElBQUksSUFBSSxDQUFDdkIsS0FBSyxZQUFZK0MsT0FBTyxFQUFFLE9BQU8sSUFBSSxDQUFDL0MsS0FBSztNQUVwRDtNQUNBLE1BQU1nRCxhQUFhLEdBQUcsQ0FBQUMsRUFBQSxPQUFJLENBQUNDLE9BQU8sQ0FBQ0YsYUFBYSxjQUFBQyxFQUFBLGNBQUFBLEVBQUEsR0FBSSxLQUFNO01BQzFELElBQUksQ0FBQyxJQUFJLENBQUNqRCxLQUFLLElBQUltRCxJQUFJLENBQUNDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQ3BELEtBQUssQ0FBQ3FELFFBQVEsR0FBR0wsYUFBYSxFQUFFO1FBQ3BFLElBQUksQ0FBQ2hELEtBQUssR0FBRyxJQUFJLENBQUMwQixLQUFLLENBQUMsMkNBQTJDLEVBQUU7VUFDcEVDLFlBQVksRUFBRSxNQUFNO1VBQ3BCQyxNQUFNLEVBQUUsS0FBSztVQUNiQyxPQUFPLEVBQUU7WUFDUkMsTUFBTSxFQUFFLEtBQUs7WUFDYixpQkFBaUIsRUFDaEIsMERBQTBEO1lBQzNELGVBQWUsRUFBRSxVQUFVO1lBQzNCRSxNQUFNLEVBQUUsVUFBVTtZQUNsQkMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsaUJBQWlCLEVBQUUsaUNBQWlDO1lBQ3BELGdCQUFnQixFQUFFLE9BQU87WUFDekIsZ0JBQWdCLEVBQUUsTUFBTTtZQUN4QixnQkFBZ0IsRUFBRSxNQUFNO1lBQ3hCLDBCQUEwQixFQUFFO1dBQzVCO1VBQ0RDLElBQUksRUFBRTtTQUNOLENBQUMsQ0FDQWpCLElBQUksQ0FBQyxDQUFDO1VBQUV5QixJQUFJLEVBQUUxQyxLQUFLO1VBQUVzRCxVQUFVO1VBQUVDLE1BQU07VUFBRUM7UUFBRSxDQUFFLEtBQUk7VUFDakQsSUFBSSxDQUFDQSxFQUFFLEVBQ04sTUFBTSxJQUFJYixLQUFLLENBQ2RXLFVBQVUsSUFBSSw2QkFBNkJDLE1BQU0sRUFBRSxDQUNuRDtVQUVGLElBQUksQ0FBQ3ZELEtBQUssR0FBRztZQUFFeUQsS0FBSyxFQUFFekQsS0FBSztZQUFFcUQsUUFBUSxFQUFFRixJQUFJLENBQUNDLEdBQUc7VUFBRSxDQUFFO1VBQ25ELE9BQU9wRCxLQUFLO1FBQ2IsQ0FBQyxDQUFDLENBQ0QwRCxLQUFLLENBQUVuRSxLQUFjLElBQUk7VUFDekIsSUFBSSxDQUFDUyxLQUFLLEdBQUcsSUFBSTtVQUNqQixNQUFNVCxLQUFLO1FBQ1osQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLElBQUksQ0FBQ1MsS0FBSztNQUN4QjtNQUVBO01BQ0EsT0FBTyxJQUFJLENBQUNBLEtBQUssQ0FBQ3lELEtBQUs7SUFDeEIsQ0FBQzs7OztBQXpJc0I1RCxtQkFBQSxDQUFBOEQsY0FBYyxHQUFHLHFCQUFIO0FBRXZCOUQsbUJBQUEsQ0FBQStELG1CQUFtQixHQUFHLE1BQU0sSUFBVCIsImlnbm9yZUxpc3QiOltdfQ==