pretur.i18n
Version:
Internationalization using MessageFormat
96 lines • 15 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
function buildLocale(locale, definition) {
return { locale: locale, definition: definition };
}
exports.buildLocale = buildLocale;
function createStringBuilders(locale) {
var MessageFormat = require('messageformat');
var mf = new MessageFormat(locale);
return {
constant: function (str) {
return function () { return str; };
},
callback: function (cb) {
return cb;
},
messageFormat: function (formatString) {
return mf.compile(formatString);
},
};
}
function format(definition, fallback, bundleOrKey, data) {
if (process.env.NODE_ENV !== 'production' && !definition) {
throw new TypeError('definition must be provided');
}
if (bundleOrKey && typeof bundleOrKey === 'object') {
var targetKey = definition[bundleOrKey.key] ||
(fallback && fallback[bundleOrKey.key]);
if (process.env.NODE_ENV !== 'production' && !targetKey) {
throw new TypeError('provided bundle key does not exist in definition or the fallback');
}
return targetKey(bundleOrKey.data);
}
if (typeof bundleOrKey === 'string') {
var targetKey = definition[bundleOrKey] ||
(fallback && fallback[bundleOrKey]);
if (process.env.NODE_ENV !== 'production' && !targetKey) {
throw new TypeError('provided key does not exist in definition or the fallback');
}
return targetKey(data);
}
return '';
}
function bundle(key, data) {
return { key: key, data: data };
}
function internationalize(main) {
var alts = [];
for (var _i = 1; _i < arguments.length; _i++) {
alts[_i - 1] = arguments[_i];
}
var mainDefinition = main.definition(createStringBuilders(main.locale));
var keys = {};
for (var _a = 0, _b = Object.keys(mainDefinition); _a < _b.length; _a++) {
var key = _b[_a];
keys[key] = key;
}
function buildFormatter(locale) {
if (locale === main.locale) {
return function (bundleOrKey, data) {
return format(mainDefinition, undefined, bundleOrKey, data);
};
}
var target = alts.find(function (alt) { return alt.locale === locale; });
if (!target) {
throw new Error("The provided locale " + locale + " does not exist in the list of languages.");
}
var targetDefinition = target.definition(createStringBuilders(locale));
return function (bundleOrKey, data) {
return format(targetDefinition, mainDefinition, bundleOrKey, data);
};
}
return { keys: keys, bundle: bundle, buildFormatter: buildFormatter };
}
exports.internationalize = internationalize;
function combine(i18n1, i18n2) {
var keys = tslib_1.__assign({}, i18n1.keys, i18n2.keys);
function buildFormatter(locale) {
var formatter1 = i18n1.buildFormatter(locale);
var formatter2 = i18n2.buildFormatter(locale);
return function (bundleOrKey, data) {
var key = typeof bundleOrKey === 'string' ? bundleOrKey : bundleOrKey.key;
if (process.env.NODE_ENV !== 'production' && !keys[key]) {
throw new TypeError('provided key does not exist in any of the provided i18ns');
}
if (i18n2.keys[key]) {
return formatter2(bundleOrKey, data);
}
return formatter1(bundleOrKey, data);
};
}
return { keys: keys, bundle: bundle, buildFormatter: buildFormatter };
}
exports.combine = combine;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXdCQSxxQkFDRSxNQUFjLEVBQ2QsVUFBNkQ7SUFFN0QsTUFBTSxDQUFDLEVBQUUsTUFBTSxRQUFBLEVBQUUsVUFBVSxZQUFBLEVBQUUsQ0FBQztBQUNoQyxDQUFDO0FBTEQsa0NBS0M7QUFlRCw4QkFBOEIsTUFBYztJQUMxQyxJQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDL0MsSUFBTSxFQUFFLEdBQUcsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFckMsTUFBTSxDQUFDO1FBQ0wsUUFBUSxZQUFDLEdBQVc7WUFDbEIsTUFBTSxDQUFDLGNBQU0sT0FBQSxHQUFHLEVBQUgsQ0FBRyxDQUFDO1FBQ25CLENBQUM7UUFDRCxRQUFRLFlBQUMsRUFBMEI7WUFDakMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxhQUFhLFlBQUMsWUFBb0I7WUFDaEMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEMsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsZ0JBQ0UsVUFBeUIsRUFDekIsUUFBbUMsRUFDbkMsV0FBNEIsRUFDNUIsSUFBVTtJQUVWLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFlBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDekQsTUFBTSxJQUFJLFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxFQUFFLENBQUMsQ0FBQyxXQUFXLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFNLFNBQVMsR0FBUyxVQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUNsRCxDQUFDLFFBQVEsSUFBVSxRQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFakQsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN4RCxNQUFNLElBQUksU0FBUyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxFQUFFLENBQUMsQ0FBQyxPQUFPLFdBQVcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQU0sU0FBUyxHQUFTLFVBQVcsQ0FBQyxXQUFXLENBQUM7WUFDOUMsQ0FBQyxRQUFRLElBQVUsUUFBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFN0MsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN4RCxNQUFNLElBQUksU0FBUyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7UUFDbkYsQ0FBQztRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsZ0JBQWdCLEdBQVEsRUFBRSxJQUFVO0lBQ2xDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsS0FBQSxFQUFFLElBQUksTUFBQSxFQUFFLENBQUM7QUFDdkIsQ0FBQztBQVFELDBCQUNFLElBQWU7SUFDZixjQUE2QjtTQUE3QixVQUE2QixFQUE3QixxQkFBNkIsRUFBN0IsSUFBNkI7UUFBN0IsNkJBQTZCOztJQUU3QixJQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRTFFLElBQU0sSUFBSSxHQUFZLEVBQUUsQ0FBQztJQUV6QixHQUFHLENBQUMsQ0FBYyxVQUEyQixFQUEzQixLQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQTNCLGNBQTJCLEVBQTNCLElBQTJCO1FBQXhDLElBQU0sR0FBRyxTQUFBO1FBQ04sSUFBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztLQUN4QjtJQUVELHdCQUF3QixNQUFjO1FBQ3BDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsVUFBQyxXQUE0QixFQUFFLElBQVU7Z0JBQzlDLE9BQUEsTUFBTSxDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQztZQUFwRCxDQUFvRCxDQUFDO1FBQ3pELENBQUM7UUFFRCxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQXJCLENBQXFCLENBQUMsQ0FBQztRQUV2RCxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF1QixNQUFNLDhDQUEyQyxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUVELElBQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXpFLE1BQU0sQ0FBQyxVQUFDLFdBQTRCLEVBQUUsSUFBVTtZQUM5QyxPQUFBLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQztRQUEzRCxDQUEyRCxDQUFDO0lBQ2hFLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBRSxJQUFJLE1BQUEsRUFBRSxNQUFNLFFBQUEsRUFBRSxjQUFjLGdCQUFBLEVBQUUsQ0FBQztBQUMxQyxDQUFDO0FBL0JELDRDQStCQztBQUVELGlCQUNFLEtBQStCLEVBQy9CLEtBQStCO0lBRS9CLElBQU0sSUFBSSx3QkFBYyxLQUFLLENBQUMsSUFBSyxFQUFXLEtBQUssQ0FBQyxJQUFLLENBQUUsQ0FBQztJQUU1RCx3QkFBd0IsTUFBYztRQUNwQyxJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFaEQsTUFBTSxDQUFDLFVBQUMsV0FBNEIsRUFBRSxJQUFVO1lBQzlDLElBQU0sR0FBRyxHQUFHLE9BQU8sV0FBVyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO1lBQzVFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sSUFBSSxTQUFTLENBQUMsMERBQTBELENBQUMsQ0FBQztZQUNsRixDQUFDO1lBRUQsRUFBRSxDQUFDLENBQU8sS0FBSyxDQUFDLElBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLE1BQU0sQ0FBQyxVQUFVLENBQU0sV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFFRCxNQUFNLENBQUMsVUFBVSxDQUFNLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLEVBQUUsSUFBSSxNQUFBLEVBQUUsTUFBTSxRQUFBLEVBQUUsY0FBYyxnQkFBQSxFQUFFLENBQUM7QUFDMUMsQ0FBQztBQXpCRCwwQkF5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIEJ1bmRsZTxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLCBEID0gYW55PiB7XHJcbiAga2V5OiBLO1xyXG4gIGRhdGE/OiBEO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFN0cmluZ0J1aWxkZXI8RCA9IGFueT4ge1xyXG4gIChkYXRhPzogRCk6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdCdWlsZGVycyB7XHJcbiAgY29uc3RhbnQoc3RyOiBzdHJpbmcpOiBTdHJpbmdCdWlsZGVyPHVuZGVmaW5lZD47XHJcbiAgY2FsbGJhY2s8RD4oY2FsbGJhY2s6IChkYXRhPzogRCkgPT4gc3RyaW5nKTogU3RyaW5nQnVpbGRlcjxEPjtcclxuICBtZXNzYWdlRm9ybWF0PEQ+KGZvcm1hdFN0cmluZzogc3RyaW5nKTogU3RyaW5nQnVpbGRlcjxEPjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgRGVmaW5pdGlvbjxUPiA9IHtcclxuICBbUCBpbiBrZXlvZiBUXTogU3RyaW5nQnVpbGRlcjxUW1BdPjtcclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxlPFQ+IHtcclxuICBsb2NhbGU6IHN0cmluZztcclxuICBkZWZpbml0aW9uOiAoYnVpbGRlcnM6IFN0cmluZ0J1aWxkZXJzKSA9PiBEZWZpbml0aW9uPFQ+O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMb2NhbGU8VD4oXHJcbiAgbG9jYWxlOiBzdHJpbmcsXHJcbiAgZGVmaW5pdGlvbjogKHN0cmluZ0J1aWxkZXJzOiBTdHJpbmdCdWlsZGVycykgPT4gRGVmaW5pdGlvbjxUPixcclxuKTogTG9jYWxlPFQ+IHtcclxuICByZXR1cm4geyBsb2NhbGUsIGRlZmluaXRpb24gfTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgS2V5czxUPiA9IHtcclxuICBbUCBpbiBrZXlvZiBUXTogUDtcclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQnVuZGxlcjxUPiB7XHJcbiAgPEsgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IEssIGRhdGE/OiBUW0tdKTogQnVuZGxlPEssIFRbS10+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlcjxUPiB7XHJcbiAgPEsgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IEssIGRhdGE/OiBUW0tdKTogc3RyaW5nO1xyXG4gIDxLIGV4dGVuZHMga2V5b2YgVD4oYnVuZGxlOiBCdW5kbGU8SywgVFtLXT4pOiBzdHJpbmc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVN0cmluZ0J1aWxkZXJzKGxvY2FsZTogc3RyaW5nKTogU3RyaW5nQnVpbGRlcnMge1xyXG4gIGNvbnN0IE1lc3NhZ2VGb3JtYXQgPSByZXF1aXJlKCdtZXNzYWdlZm9ybWF0Jyk7XHJcbiAgY29uc3QgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdChsb2NhbGUpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgY29uc3RhbnQoc3RyOiBzdHJpbmcpIHtcclxuICAgICAgcmV0dXJuICgpID0+IHN0cjtcclxuICAgIH0sXHJcbiAgICBjYWxsYmFjayhjYjogKGRhdGE/OiBhbnkpID0+IHN0cmluZykge1xyXG4gICAgICByZXR1cm4gY2I7XHJcbiAgICB9LFxyXG4gICAgbWVzc2FnZUZvcm1hdChmb3JtYXRTdHJpbmc6IHN0cmluZykge1xyXG4gICAgICByZXR1cm4gbWYuY29tcGlsZShmb3JtYXRTdHJpbmcpO1xyXG4gICAgfSxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBmb3JtYXQ8VD4oXHJcbiAgZGVmaW5pdGlvbjogRGVmaW5pdGlvbjxUPixcclxuICBmYWxsYmFjazogRGVmaW5pdGlvbjxUPiB8IHVuZGVmaW5lZCxcclxuICBidW5kbGVPcktleTogQnVuZGxlIHwgc3RyaW5nLFxyXG4gIGRhdGE/OiBhbnksXHJcbik6IHN0cmluZyB7XHJcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWRlZmluaXRpb24pIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RlZmluaXRpb24gbXVzdCBiZSBwcm92aWRlZCcpO1xyXG4gIH1cclxuXHJcbiAgaWYgKGJ1bmRsZU9yS2V5ICYmIHR5cGVvZiBidW5kbGVPcktleSA9PT0gJ29iamVjdCcpIHtcclxuICAgIGNvbnN0IHRhcmdldEtleSA9ICg8YW55PmRlZmluaXRpb24pW2J1bmRsZU9yS2V5LmtleV0gfHxcclxuICAgICAgKGZhbGxiYWNrICYmICg8YW55PmZhbGxiYWNrKVtidW5kbGVPcktleS5rZXldKTtcclxuXHJcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhdGFyZ2V0S2V5KSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Byb3ZpZGVkIGJ1bmRsZSBrZXkgZG9lcyBub3QgZXhpc3QgaW4gZGVmaW5pdGlvbiBvciB0aGUgZmFsbGJhY2snKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXRLZXkoYnVuZGxlT3JLZXkuZGF0YSk7XHJcbiAgfVxyXG5cclxuICBpZiAodHlwZW9mIGJ1bmRsZU9yS2V5ID09PSAnc3RyaW5nJykge1xyXG4gICAgY29uc3QgdGFyZ2V0S2V5ID0gKDxhbnk+ZGVmaW5pdGlvbilbYnVuZGxlT3JLZXldIHx8XHJcbiAgICAgIChmYWxsYmFjayAmJiAoPGFueT5mYWxsYmFjaylbYnVuZGxlT3JLZXldKTtcclxuXHJcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhdGFyZ2V0S2V5KSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Byb3ZpZGVkIGtleSBkb2VzIG5vdCBleGlzdCBpbiBkZWZpbml0aW9uIG9yIHRoZSBmYWxsYmFjaycpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhcmdldEtleShkYXRhKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAnJztcclxufVxyXG5cclxuZnVuY3Rpb24gYnVuZGxlKGtleTogYW55LCBkYXRhPzogYW55KSB7XHJcbiAgcmV0dXJuIHsga2V5LCBkYXRhIH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuYXRpb25hbGl6YXRpb248VD4ge1xyXG4gIGtleXM6IEtleXM8VD47XHJcbiAgYnVuZGxlOiBCdW5kbGVyPFQ+O1xyXG4gIGJ1aWxkRm9ybWF0dGVyKGxvY2FsZTogc3RyaW5nKTogRm9ybWF0dGVyPFQ+O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJuYXRpb25hbGl6ZTxUPihcclxuICBtYWluOiBMb2NhbGU8VD4sXHJcbiAgLi4uYWx0czogTG9jYWxlPFBhcnRpYWw8VD4+W10sXHJcbik6IEludGVybmF0aW9uYWxpemF0aW9uPFQ+IHtcclxuICBjb25zdCBtYWluRGVmaW5pdGlvbiA9IG1haW4uZGVmaW5pdGlvbihjcmVhdGVTdHJpbmdCdWlsZGVycyhtYWluLmxvY2FsZSkpO1xyXG5cclxuICBjb25zdCBrZXlzID0gPEtleXM8VD4+e307XHJcblxyXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1haW5EZWZpbml0aW9uKSkge1xyXG4gICAgKDxhbnk+a2V5cylba2V5XSA9IGtleTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGJ1aWxkRm9ybWF0dGVyKGxvY2FsZTogc3RyaW5nKTogRm9ybWF0dGVyPFQ+IHtcclxuICAgIGlmIChsb2NhbGUgPT09IG1haW4ubG9jYWxlKSB7XHJcbiAgICAgIHJldHVybiAoYnVuZGxlT3JLZXk6IEJ1bmRsZSB8IHN0cmluZywgZGF0YT86IGFueSkgPT5cclxuICAgICAgICBmb3JtYXQobWFpbkRlZmluaXRpb24sIHVuZGVmaW5lZCwgYnVuZGxlT3JLZXksIGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRhcmdldCA9IGFsdHMuZmluZChhbHQgPT4gYWx0LmxvY2FsZSA9PT0gbG9jYWxlKTtcclxuXHJcbiAgICBpZiAoIXRhcmdldCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm92aWRlZCBsb2NhbGUgJHtsb2NhbGV9IGRvZXMgbm90IGV4aXN0IGluIHRoZSBsaXN0IG9mIGxhbmd1YWdlcy5gKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0YXJnZXREZWZpbml0aW9uID0gdGFyZ2V0LmRlZmluaXRpb24oY3JlYXRlU3RyaW5nQnVpbGRlcnMobG9jYWxlKSk7XHJcblxyXG4gICAgcmV0dXJuIChidW5kbGVPcktleTogQnVuZGxlIHwgc3RyaW5nLCBkYXRhPzogYW55KSA9PlxyXG4gICAgICBmb3JtYXQodGFyZ2V0RGVmaW5pdGlvbiwgbWFpbkRlZmluaXRpb24sIGJ1bmRsZU9yS2V5LCBkYXRhKTtcclxuICB9XHJcblxyXG4gIHJldHVybiB7IGtleXMsIGJ1bmRsZSwgYnVpbGRGb3JtYXR0ZXIgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmU8VDEsIFQyPihcclxuICBpMThuMTogSW50ZXJuYXRpb25hbGl6YXRpb248VDE+LFxyXG4gIGkxOG4yOiBJbnRlcm5hdGlvbmFsaXphdGlvbjxUMj4sXHJcbik6IEludGVybmF0aW9uYWxpemF0aW9uPFQxICYgVDI+IHtcclxuICBjb25zdCBrZXlzID0geyAuLi4oPGFueT5pMThuMS5rZXlzKSwgLi4uKDxhbnk+aTE4bjIua2V5cykgfTtcclxuXHJcbiAgZnVuY3Rpb24gYnVpbGRGb3JtYXR0ZXIobG9jYWxlOiBzdHJpbmcpOiBGb3JtYXR0ZXI8VDEgJiBUMj4ge1xyXG4gICAgY29uc3QgZm9ybWF0dGVyMSA9IGkxOG4xLmJ1aWxkRm9ybWF0dGVyKGxvY2FsZSk7XHJcbiAgICBjb25zdCBmb3JtYXR0ZXIyID0gaTE4bjIuYnVpbGRGb3JtYXR0ZXIobG9jYWxlKTtcclxuXHJcbiAgICByZXR1cm4gKGJ1bmRsZU9yS2V5OiBCdW5kbGUgfCBzdHJpbmcsIGRhdGE/OiBhbnkpID0+IHtcclxuICAgICAgY29uc3Qga2V5ID0gdHlwZW9mIGJ1bmRsZU9yS2V5ID09PSAnc3RyaW5nJyA/IGJ1bmRsZU9yS2V5IDogYnVuZGxlT3JLZXkua2V5O1xyXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAha2V5c1trZXldKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJvdmlkZWQga2V5IGRvZXMgbm90IGV4aXN0IGluIGFueSBvZiB0aGUgcHJvdmlkZWQgaTE4bnMnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCg8YW55PmkxOG4yLmtleXMpW2tleV0pIHtcclxuICAgICAgICByZXR1cm4gZm9ybWF0dGVyMig8YW55PmJ1bmRsZU9yS2V5LCBkYXRhKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGZvcm1hdHRlcjEoPGFueT5idW5kbGVPcktleSwgZGF0YSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHsga2V5cywgYnVuZGxlLCBidWlsZEZvcm1hdHRlciB9O1xyXG59XHJcbiJdfQ==