UNPKG

anylang

Version:

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

214 lines (212 loc) 26.9 kB
var __awaiter = (this && this.__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()); }); }; import queryString from 'query-string'; import { BaseTranslator } from '../BaseTranslator'; import { getFixedLanguage, languageAliases } from './languages'; import { getToken } from './token'; import { encodeForBatch, parseXMLResponse, visitArrayItems } from './utils'; /** * Common class for google translator implementations */ export class AbstractGoogleTranslator extends BaseTranslator { static isSupportedAutoFrom() { return true; } static getSupportedLanguages() { return languageAliases.getAll(); } getLengthLimit() { return 4000; } getRequestsTimeout() { return 300; } } /** * Translator implementation which use Google API with token from https://translate.google.com */ export class GoogleTranslator extends AbstractGoogleTranslator { checkLimitExceeding(text) { if (Array.isArray(text)) { const encodedText = encodeForBatch(text).join(''); const extra = encodedText.length - this.getLengthLimit(); return extra > 0 ? extra : 0; } else { const extra = text.length - this.getLengthLimit(); return extra > 0 ? extra : 0; } } translate(text, from, to) { return getToken(text).then(({ value: tk }) => { const apiPath = 'https://translate.google.com/translate_a/single'; const data = { client: 't', sl: getFixedLanguage(from), tl: getFixedLanguage(to), hl: getFixedLanguage(to), dt: ['at', 'bd', 'ex', 'ld', 'md', 'qca', 'rw', 'rm', 'ss', 't'], ie: 'UTF-8', oe: 'UTF-8', otf: 1, ssel: 0, tsel: 0, kc: 7, q: text, tk, }; const url = apiPath + '?' + queryString.stringify(data); return this.fetch(url, { responseType: 'json', method: 'GET', headers: this.options.headers, }) .then((rsp) => rsp.data) .then((rsp) => { if (!(rsp instanceof Array) || !(rsp[0] instanceof Array)) { throw new Error('Unexpected response'); } const translatedText = rsp[0] .map((chunk) => chunk instanceof Array && typeof chunk[0] === 'string' ? chunk[0] : '') .join(''); return translatedText; }); }); } translateBatch(text, from, to) { const preparedText = encodeForBatch(text); return getToken(preparedText.join('')).then(({ value: tk }) => { const apiPath = 'https://translate.googleapis.com/translate_a/t'; const data = { anno: 3, client: 'te', v: '1.0', format: 'html', sl: getFixedLanguage(from), tl: getFixedLanguage(to), tk, }; const url = apiPath + '?' + queryString.stringify(data); const body = preparedText .map((text) => `&q=${encodeURIComponent(text)}`) .join(''); return this.fetch(url, { responseType: 'json', method: 'POST', headers: Object.assign({ 'Content-Type': 'application/x-www-form-urlencoded' }, this.options.headers), body, }) .then((rsp) => rsp.data) .then((rawResp) => { try { if (!Array.isArray(rawResp)) { throw new Error('Unexpected response'); } const isSingleResponseMode = text.length === 1; const result = []; visitArrayItems(rawResp, (obj) => { if (isSingleResponseMode && result.length === 1) return; if (typeof obj !== 'string') return; if (isSingleResponseMode) { const parsedText = parseXMLResponse(obj); result.push(parsedText || obj); } else { const parsedText = parseXMLResponse(obj); if (parsedText !== null) { result.push(parsedText); } } }); if (result.length !== text.length) { throw new Error('Mismatching a lengths of original and translated arrays'); } return result; } catch (err) { console.warn('Got response', rawResp); throw err; } }); }); } } GoogleTranslator.translatorName = 'GoogleTranslator'; /** * Translator implementation which use Google API without token */ export class GoogleTranslatorTokenFree extends AbstractGoogleTranslator { constructor() { super(...arguments); this.translate = (text, from, to) => __awaiter(this, void 0, void 0, function* () { const [translation] = yield this.translateBatch([text], from, to); return translation; }); } translateBatch(text, from, to) { const apiPath = 'https://translate.googleapis.com/translate_a/t'; const data = { client: 'dict-chrome-ex', sl: getFixedLanguage(from), tl: getFixedLanguage(to), q: text, }; const url = apiPath + '?' + queryString.stringify(data); return this.fetch(url, { responseType: 'json', method: 'GET', headers: Object.assign({ 'Content-Type': 'application/x-www-form-urlencoded' }, this.options.headers), }) .then((rsp) => rsp.data) .then((rawResp) => { try { if (!Array.isArray(rawResp)) { throw new Error('Unexpected response'); } const intermediateTextsArray = []; visitArrayItems(rawResp, (obj) => { if (typeof obj === 'string') { intermediateTextsArray.push(obj); } }); const result = []; const isSingleResponseMode = text.length === 1; const isOneToOneMappingMode = intermediateTextsArray.length === text.length; for (let idx = 0; idx < intermediateTextsArray.length; idx++) { const text = intermediateTextsArray[idx]; if (isSingleResponseMode) { result.push(text); break; } // Each second text it's not translation if not 1-1 mapping const isTranslation = isOneToOneMappingMode || Number(idx) % 2 === 0; if (isTranslation) { result.push(text); } } if (result.length !== text.length) { console.warn('Translation result', result); throw new Error('Mismatching a lengths of original and translated arrays'); } return result; } catch (err) { console.warn('Got response', rawResp); throw err; } }); } } GoogleTranslatorTokenFree.translatorName = 'GoogleTranslatorTokenFree'; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRyYW5zbGF0b3JzL0dvb2dsZVRyYW5zbGF0b3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxXQUFXLE1BQU0sY0FBYyxDQUFDO0FBRXZDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFNUU7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLHdCQUF5QixTQUFRLGNBQWM7SUFDN0QsTUFBTSxDQUFDLG1CQUFtQjtRQUNoQyxPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFFTSxNQUFNLENBQUMscUJBQXFCO1FBQ2xDLE9BQU8sZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFTSxjQUFjO1FBQ3BCLE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVNLGtCQUFrQjtRQUN4QixPQUFPLEdBQUcsQ0FBQztJQUNaLENBQUM7Q0FDRDtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGdCQUFpQixTQUFRLHdCQUF3QjtJQUd0RCxtQkFBbUIsQ0FBQyxJQUF1QjtRQUNqRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pELE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FB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LE9BQU8sTUFBTSxDQUFDO1lBQ2YsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sR0FBRyxDQUFDO1lBQ1gsQ0FBQztRQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUEzRXNCLHdDQUFjLEdBQUcsMkJBQUgsQUFBOEIsQ0FBQyIsImZpbGUiOiJ0cmFuc2xhdG9ycy9Hb29nbGVUcmFuc2xhdG9yL2luZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHF1ZXJ5U3RyaW5nIGZyb20gJ3F1ZXJ5LXN0cmluZyc7XG5cbmltcG9ydCB7IEJhc2VUcmFuc2xhdG9yIH0gZnJvbSAnLi4vQmFzZVRyYW5zbGF0b3InO1xuaW1wb3J0IHsgZ2V0Rml4ZWRMYW5ndWFnZSwgbGFuZ3VhZ2VBbGlhc2VzIH0gZnJvbSAnLi9sYW5ndWFnZXMnO1xuaW1wb3J0IHsgZ2V0VG9rZW4gfSBmcm9tICcuL3Rva2VuJztcbmltcG9ydCB7IGVuY29kZUZvckJhdGNoLCBwYXJzZVhNTFJlc3BvbnNlLCB2aXNpdEFycmF5SXRlbXMgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDb21tb24gY2xhc3MgZm9yIGdvb2dsZSB0cmFuc2xhdG9yIGltcGxlbWVudGF0aW9uc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RHb29nbGVUcmFuc2xhdG9yIGV4dGVuZHMgQmFzZVRyYW5zbGF0b3Ige1xuXHRwdWJsaWMgc3RhdGljIGlzU3VwcG9ydGVkQXV0b0Zyb20oKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGdldFN1cHBvcnRlZExhbmd1YWdlcygpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIGxhbmd1YWdlQWxpYXNlcy5nZXRBbGwoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMZW5ndGhMaW1pdCgpIHtcblx0XHRyZXR1cm4gNDAwMDtcblx0fVxuXG5cdHB1YmxpYyBnZXRSZXF1ZXN0c1RpbWVvdXQoKSB7XG5cdFx0cmV0dXJuIDMwMDtcblx0fVxufVxuXG4vKipcbiAqIFRyYW5zbGF0b3IgaW1wbGVtZW50YXRpb24gd2hpY2ggdXNlIEdvb2dsZSBBUEkgd2l0aCB0b2tlbiBmcm9tIGh0dHBzOi8vdHJhbnNsYXRlLmdvb2dsZS5jb21cbiAqL1xuZXhwb3J0IGNsYXNzIEdvb2dsZVRyYW5zbGF0b3IgZXh0ZW5kcyBBYnN0cmFjdEdvb2dsZVRyYW5zbGF0b3Ige1xuXHRwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRyYW5zbGF0b3JOYW1lID0gJ0dvb2dsZVRyYW5zbGF0b3InO1xuXG5cdHB1YmxpYyBjaGVja0xpbWl0RXhjZWVkaW5nKHRleHQ6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodGV4dCkpIHtcblx0XHRcdGNvbnN0IGVuY29kZWRUZXh0ID0gZW5jb2RlRm9yQmF0Y2godGV4dCkuam9pbignJyk7XG5cdFx0XHRjb25zdCBleHRyYSA9IGVuY29kZWRUZXh0Lmxlbmd0aCAtIHRoaXMuZ2V0TGVuZ3RoTGltaXQoKTtcblx0XHRcdHJldHVybiBleHRyYSA+IDAgPyBleHRyYSA6IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGV4dHJhID0gdGV4dC5sZW5ndGggLSB0aGlzLmdldExlbmd0aExpbWl0KCk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPiAwID8gZXh0cmEgOiAwO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyB0cmFuc2xhdGUodGV4dDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gZ2V0VG9rZW4odGV4dCkudGhlbigoeyB2YWx1ZTogdGsgfSkgPT4ge1xuXHRcdFx0Y29uc3QgYXBpUGF0aCA9ICdodHRwczovL3RyYW5zbGF0ZS5nb29nbGUuY29tL3RyYW5zbGF0ZV9hL3NpbmdsZSc7XG5cblx0XHRcdGNvbnN0IGRhdGEgPSB7XG5cdFx0XHRcdGNsaWVudDogJ3QnLFxuXHRcdFx0XHRzbDogZ2V0Rml4ZWRMYW5ndWFnZShmcm9tKSxcblx0XHRcdFx0dGw6IGdldEZpeGVkTGFuZ3VhZ2UodG8pLFxuXHRcdFx0XHRobDogZ2V0Rml4ZWRMYW5ndWFnZSh0byksXG5cdFx0XHRcdGR0OiBbJ2F0JywgJ2JkJywgJ2V4JywgJ2xkJywgJ21kJywgJ3FjYScsICdydycsICdybScsICdzcycsICd0J10sXG5cdFx0XHRcdGllOiAnVVRGLTgnLFxuXHRcdFx0XHRvZTogJ1VURi04Jyxcblx0XHRcdFx0b3RmOiAxLFxuXHRcdFx0XHRzc2VsOiAwLFxuXHRcdFx0XHR0c2VsOiAwLFxuXHRcdFx0XHRrYzogNyxcblx0XHRcdFx0cTogdGV4dCxcblx0XHRcdFx0dGssXG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCB1cmwgPSBhcGlQYXRoICsgJz8nICsgcXVlcnlTdHJpbmcuc3RyaW5naWZ5KGRhdGEpO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5mZXRjaCh1cmwsIHtcblx0XHRcdFx0cmVzcG9uc2VUeXBlOiAnanNvbicsXG5cdFx0XHRcdG1ldGhvZDogJ0dFVCcsXG5cdFx0XHRcdGhlYWRlcnM6IHRoaXMub3B0aW9ucy5oZWFkZXJzLFxuXHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKHJzcCkgPT4gcnNwLmRhdGEpXG5cdFx0XHRcdC50aGVuKChyc3ApID0+IHtcblx0XHRcdFx0XHRpZiAoIShyc3AgaW5zdGFuY2VvZiBBcnJheSkgfHwgIShyc3BbMF0gaW5zdGFuY2VvZiBBcnJheSkpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCByZXNwb25zZScpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IHRyYW5zbGF0ZWRUZXh0ID0gcnNwWzBdXG5cdFx0XHRcdFx0XHQubWFwKChjaHVuaykgPT5cblx0XHRcdFx0XHRcdFx0Y2h1bmsgaW5zdGFuY2VvZiBBcnJheSAmJiB0eXBlb2YgY2h1bmtbMF0gPT09ICdzdHJpbmcnXG5cdFx0XHRcdFx0XHRcdFx0PyBjaHVua1swXVxuXHRcdFx0XHRcdFx0XHRcdDogJycsXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQuam9pbignJyk7XG5cblx0XHRcdFx0XHRyZXR1cm4gdHJhbnNsYXRlZFRleHQ7XG5cdFx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIHRyYW5zbGF0ZUJhdGNoKHRleHQ6IHN0cmluZ1tdLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpIHtcblx0XHRjb25zdCBwcmVwYXJlZFRleHQgPSBlbmNvZGVGb3JCYXRjaCh0ZXh0KTtcblx0XHRyZXR1cm4gZ2V0VG9rZW4ocHJlcGFyZWRUZXh0LmpvaW4oJycpKS50aGVuKCh7IHZhbHVlOiB0ayB9KSA9PiB7XG5cdFx0XHRjb25zdCBhcGlQYXRoID0gJ2h0dHBzOi8vdHJhbnNsYXRlLmdvb2dsZWFwaXMuY29tL3RyYW5zbGF0ZV9hL3QnO1xuXG5cdFx0XHRjb25zdCBkYXRhID0ge1xuXHRcdFx0XHRhbm5vOiAzLFxuXHRcdFx0XHRjbGllbnQ6ICd0ZScsXG5cdFx0XHRcdHY6ICcxLjAnLFxuXHRcdFx0XHRmb3JtYXQ6ICdodG1sJyxcblx0XHRcdFx0c2w6IGdldEZpeGVkTGFuZ3VhZ2UoZnJvbSksXG5cdFx0XHRcdHRsOiBnZXRGaXhlZExhbmd1YWdlKHRvKSxcblx0XHRcdFx0dGssXG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCB1cmwgPSBhcGlQYXRoICsgJz8nICsgcXVlcnlTdHJpbmcuc3RyaW5naWZ5KGRhdGEpO1xuXHRcdFx0Y29uc3QgYm9keSA9IHByZXBhcmVkVGV4dFxuXHRcdFx0XHQubWFwKCh0ZXh0KSA9PiBgJnE9JHtlbmNvZGVVUklDb21wb25lbnQodGV4dCl9YClcblx0XHRcdFx0LmpvaW4oJycpO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5mZXRjaCh1cmwsIHtcblx0XHRcdFx0cmVzcG9uc2VUeXBlOiAnanNvbicsXG5cdFx0XHRcdG1ldGhvZDogJ1BPU1QnLFxuXHRcdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFx0J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuXHRcdFx0XHRcdC4uLnRoaXMub3B0aW9ucy5oZWFkZXJzLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRib2R5LFxuXHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKHJzcCkgPT4gcnNwLmRhdGEpXG5cdFx0XHRcdC50aGVuKChyYXdSZXNwKSA9PiB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGlmICghQXJyYXkuaXNBcnJheShyYXdSZXNwKSkge1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgcmVzcG9uc2UnKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3QgaXNTaW5nbGVSZXNwb25zZU1vZGUgPSB0ZXh0Lmxlbmd0aCA9PT0gMTtcblxuXHRcdFx0XHRcdFx0Y29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRcdFx0dmlzaXRBcnJheUl0ZW1zKHJhd1Jlc3AsIChvYmopID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKGlzU2luZ2xlUmVzcG9uc2VNb2RlICYmIHJlc3VsdC5sZW5ndGggPT09IDEpIHJldHVybjtcblxuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9iaiAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuXHRcdFx0XHRcdFx0XHRpZiAoaXNTaW5nbGVSZXNwb25zZU1vZGUpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBwYXJzZWRUZXh0ID0gcGFyc2VYTUxSZXNwb25zZShvYmopO1xuXHRcdFx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKHBhcnNlZFRleHQgfHwgb2JqKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBwYXJzZWRUZXh0ID0gcGFyc2VYTUxSZXNwb25zZShvYmopO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXJzZWRUZXh0ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHQucHVzaChwYXJzZWRUZXh0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRpZiAocmVzdWx0Lmxlbmd0aCAhPT0gdGV4dC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdFx0XHRcdCdNaXNtYXRjaGluZyBhIGxlbmd0aHMgb2Ygb3JpZ2luYWwgYW5kIHRyYW5zbGF0ZWQgYXJyYXlzJyxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybignR290IHJlc3BvbnNlJywgcmF3UmVzcCk7XG5cdFx0XHRcdFx0XHR0aHJvdyBlcnI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufVxuXG4vKipcbiAqIFRyYW5zbGF0b3IgaW1wbGVtZW50YXRpb24gd2hpY2ggdXNlIEdvb2dsZSBBUEkgd2l0aG91dCB0b2tlblxuICovXG5leHBvcnQgY2xhc3MgR29vZ2xlVHJhbnNsYXRvclRva2VuRnJlZSBleHRlbmRzIEFic3RyYWN0R29vZ2xlVHJhbnNsYXRvciB7XG5cdHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHJhbnNsYXRvck5hbWUgPSAnR29vZ2xlVHJhbnNsYXRvclRva2VuRnJlZSc7XG5cblx0cHVibGljIHRyYW5zbGF0ZSA9IGFzeW5jICh0ZXh0OiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IFt0cmFuc2xhdGlvbl0gPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZUJhdGNoKFt0ZXh0XSwgZnJvbSwgdG8pO1xuXHRcdHJldHVybiB0cmFuc2xhdGlvbjtcblx0fTtcblxuXHRwdWJsaWMgdHJhbnNsYXRlQmF0Y2godGV4dDogc3RyaW5nW10sIGZyb206IHN0cmluZywgdG86IHN0cmluZykge1xuXHRcdGNvbnN0IGFwaVBhdGggPSAnaHR0cHM6Ly90cmFuc2xhdGUuZ29vZ2xlYXBpcy5jb20vdHJhbnNsYXRlX2EvdCc7XG5cblx0XHRjb25zdCBkYXRhID0ge1xuXHRcdFx0Y2xpZW50OiAnZGljdC1jaHJvbWUtZXgnLFxuXHRcdFx0c2w6IGdldEZpeGVkTGFuZ3VhZ2UoZnJvbSksXG5cdFx0XHR0bDogZ2V0Rml4ZWRMYW5ndWFnZSh0byksXG5cdFx0XHRxOiB0ZXh0LFxuXHRcdH07XG5cblx0XHRjb25zdCB1cmwgPSBhcGlQYXRoICsgJz8nICsgcXVlcnlTdHJpbmcuc3RyaW5naWZ5KGRhdGEpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmV0Y2godXJsLCB7XG5cdFx0XHRyZXNwb25zZVR5cGU6ICdqc29uJyxcblx0XHRcdG1ldGhvZDogJ0dFVCcsXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdCdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcblx0XHRcdFx0Li4udGhpcy5vcHRpb25zLmhlYWRlcnMsXG5cdFx0XHR9LFxuXHRcdH0pXG5cdFx0XHQudGhlbigocnNwKSA9PiByc3AuZGF0YSlcblx0XHRcdC50aGVuKChyYXdSZXNwKSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KHJhd1Jlc3ApKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgcmVzcG9uc2UnKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBpbnRlcm1lZGlhdGVUZXh0c0FycmF5OiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRcdHZpc2l0QXJyYXlJdGVtcyhyYXdSZXNwLCAob2JqKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHRcdFx0aW50ZXJtZWRpYXRlVGV4dHNBcnJheS5wdXNoKG9iaik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG5cblx0XHRcdFx0XHRjb25zdCBpc1NpbmdsZVJlc3BvbnNlTW9kZSA9IHRleHQubGVuZ3RoID09PSAxO1xuXHRcdFx0XHRcdGNvbnN0IGlzT25lVG9PbmVNYXBwaW5nTW9kZSA9XG5cdFx0XHRcdFx0XHRpbnRlcm1lZGlhdGVUZXh0c0FycmF5Lmxlbmd0aCA9PT0gdGV4dC5sZW5ndGg7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgaW50ZXJtZWRpYXRlVGV4dHNBcnJheS5sZW5ndGg7IGlkeCsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0ID0gaW50ZXJtZWRpYXRlVGV4dHNBcnJheVtpZHhdO1xuXG5cdFx0XHRcdFx0XHRpZiAoaXNTaW5nbGVSZXNwb25zZU1vZGUpIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0LnB1c2godGV4dCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBFYWNoIHNlY29uZCB0ZXh0IGl0J3Mgbm90IHRyYW5zbGF0aW9uIGlmIG5vdCAxLTEgbWFwcGluZ1xuXHRcdFx0XHRcdFx0Y29uc3QgaXNUcmFuc2xhdGlvbiA9XG5cdFx0XHRcdFx0XHRcdGlzT25lVG9PbmVNYXBwaW5nTW9kZSB8fCBOdW1iZXIoaWR4KSAlIDIgPT09IDA7XG5cdFx0XHRcdFx0XHRpZiAoaXNUcmFuc2xhdGlvbikge1xuXHRcdFx0XHRcdFx0XHRyZXN1bHQucHVzaCh0ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocmVzdWx0Lmxlbmd0aCAhPT0gdGV4dC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybignVHJhbnNsYXRpb24gcmVzdWx0JywgcmVzdWx0KTtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRcdFx0J01pc21hdGNoaW5nIGEgbGVuZ3RocyBvZiBvcmlnaW5hbCBhbmQgdHJhbnNsYXRlZCBhcnJheXMnLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ0dvdCByZXNwb25zZScsIHJhd1Jlc3ApO1xuXHRcdFx0XHRcdHRocm93IGVycjtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cbn1cbiJdfQ==