@ngx-i18nsupport/ngx-i18nsupport-lib
Version:
A Typescript library to work with Angular generated i18n files (xliff, xmb)
231 lines • 21.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* Created by roobm on 16.05.2017.
* Mapping from normalized tag names to placeholder names.
*/
/*
copied from https://github.com/angular/angular/blob/master/packages/compiler/src/i18n/serializers/placeholder.ts
*/
/** @type {?} */
const TAG_TO_PLACEHOLDER_NAMES = {
'A': 'LINK',
'B': 'BOLD_TEXT',
'BR': 'LINE_BREAK',
'EM': 'EMPHASISED_TEXT',
'H1': 'HEADING_LEVEL1',
'H2': 'HEADING_LEVEL2',
'H3': 'HEADING_LEVEL3',
'H4': 'HEADING_LEVEL4',
'H5': 'HEADING_LEVEL5',
'H6': 'HEADING_LEVEL6',
'HR': 'HORIZONTAL_RULE',
'I': 'ITALIC_TEXT',
'LI': 'LIST_ITEM',
'LINK': 'MEDIA_LINK',
'OL': 'ORDERED_LIST',
'P': 'PARAGRAPH',
'Q': 'QUOTATION',
'S': 'STRIKETHROUGH_TEXT',
'SMALL': 'SMALL_TEXT',
'SUB': 'SUBSTRIPT',
'SUP': 'SUPERSCRIPT',
'TBODY': 'TABLE_BODY',
'TD': 'TABLE_CELL',
'TFOOT': 'TABLE_FOOTER',
'TH': 'TABLE_HEADER_CELL',
'THEAD': 'TABLE_HEADER',
'TR': 'TABLE_ROW',
'TT': 'MONOSPACED_TEXT',
'U': 'UNDERLINED_TEXT',
'UL': 'UNORDERED_LIST',
};
/**
* HTML Tags (in uppercase) that are empty, they have no content, but do not need a close tag, e.g. <br>, <img>, <hr>.
* @type {?}
*/
const VOID_TAGS = ['BR', 'HR', 'IMG', 'AREA', 'LINK', 'WBR'];
export class TagMapping {
/**
* @param {?} tag
* @param {?} id
* @return {?}
*/
getStartTagPlaceholderName(tag, id) {
/** @type {?} */
const upperTag = tag.toUpperCase();
/** @type {?} */
const baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || `TAG_${upperTag}`;
return `START_${baseName}` + this.counterString(id);
}
/**
* @param {?} tag
* @return {?}
*/
getCloseTagPlaceholderName(tag) {
/** @type {?} */
const upperTag = tag.toUpperCase();
/** @type {?} */
const baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || `TAG_${upperTag}`;
return `CLOSE_${baseName}`;
}
/**
* @param {?} tag
* @param {?} id
* @return {?}
*/
getEmptyTagPlaceholderName(tag, id) {
/** @type {?} */
const upperTag = tag.toUpperCase();
/** @type {?} */
const baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || `TAG_${upperTag}`;
return baseName + this.counterString(id);
}
/**
* @param {?} tag
* @return {?}
*/
getCtypeForTag(tag) {
switch (tag.toLowerCase()) {
case 'br':
return 'lb';
case 'img':
return 'image';
default:
return `x-${tag}`;
}
}
/**
* @param {?} placeholderName
* @return {?}
*/
getTagnameFromStartTagPlaceholderName(placeholderName) {
if (placeholderName.startsWith('START_TAG_')) {
return this.stripCounter(placeholderName.substring('START_TAG_'.length)).toLowerCase();
}
else if (placeholderName.startsWith('START_')) {
/** @type {?} */
const ph = this.stripCounter(placeholderName.substring('START_'.length));
/** @type {?} */
const matchKey = Object.keys(TAG_TO_PLACEHOLDER_NAMES).find((/**
* @param {?} key
* @return {?}
*/
(key) => TAG_TO_PLACEHOLDER_NAMES[key] === ph));
return matchKey ? matchKey.toLowerCase() : null;
}
return null;
}
/**
* @param {?} placeholderName
* @return {?}
*/
getTagnameFromCloseTagPlaceholderName(placeholderName) {
if (placeholderName.startsWith('CLOSE_TAG_')) {
return this.stripCounter(placeholderName.substring('CLOSE_TAG_'.length)).toLowerCase();
}
else if (placeholderName.startsWith('CLOSE_')) {
/** @type {?} */
const ph = this.stripCounter(placeholderName.substring('CLOSE_'.length));
/** @type {?} */
const matchKey = Object.keys(TAG_TO_PLACEHOLDER_NAMES).find((/**
* @param {?} key
* @return {?}
*/
(key) => TAG_TO_PLACEHOLDER_NAMES[key] === ph));
return matchKey ? matchKey.toLowerCase() : null;
}
return null;
}
/**
* Test, wether placeholder name stands for empty html tag.
* @param {?} placeholderName can be TAG_<name> or just <name>
* @return {?}
*/
isEmptyTagPlaceholderName(placeholderName) {
/** @type {?} */
const ph = this.stripCounter(placeholderName);
/** @type {?} */
let matchKey;
if (ph.startsWith('TAG_')) {
matchKey = ph.substring(4).toUpperCase();
}
else {
matchKey = Object.keys(TAG_TO_PLACEHOLDER_NAMES).find((/**
* @param {?} key
* @return {?}
*/
(key) => TAG_TO_PLACEHOLDER_NAMES[key] === ph));
}
if (matchKey) {
if (VOID_TAGS.indexOf(matchKey) >= 0) {
return true;
}
}
return false;
}
/**
* tagname of empty tag placeholder.
* @param {?} placeholderName can be TAG_<name> or just <name>
* @return {?}
*/
getTagnameFromEmptyTagPlaceholderName(placeholderName) {
/** @type {?} */
const ph = this.stripCounter(placeholderName);
/** @type {?} */
let matchKey;
if (ph.startsWith('TAG_')) {
matchKey = ph.substring(4).toUpperCase();
}
else {
matchKey = Object.keys(TAG_TO_PLACEHOLDER_NAMES).find((/**
* @param {?} key
* @return {?}
*/
(key) => TAG_TO_PLACEHOLDER_NAMES[key] === ph));
}
if (matchKey) {
if (VOID_TAGS.indexOf(matchKey) >= 0) {
return matchKey.toLowerCase();
}
else {
return null;
}
}
return null;
}
/**
* If placeholder ends with _[0-9]+, strip that number.
* @private
* @param {?} placeholderName placeholderName
* @return {?} placeholderName without counter at end.
*/
stripCounter(placeholderName) {
if (placeholderName) {
/** @type {?} */
const re = /(.*)_[0-9]+$/;
if (placeholderName.match(re)) {
return placeholderName.replace(re, '$1');
}
}
return placeholderName;
}
/**
* String suffix for counter.
* If counter is 0, it is empty, otherwise _<id>.
* @private
* @param {?} id id
* @return {?} suffix for counter.
*/
counterString(id) {
if (id === 0) {
return '';
}
else {
return '_' + id.toString(10);
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLW1hcHBpbmcuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4LWkxOG5zdXBwb3J0L25neC1pMThuc3VwcG9ydC1saWIvIiwic291cmNlcyI6WyJpbXBsL3RhZy1tYXBwaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztNQVFNLHdCQUF3QixHQUEwQjtJQUNwRCxHQUFHLEVBQUUsTUFBTTtJQUNYLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLElBQUksRUFBRSxZQUFZO0lBQ2xCLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsSUFBSSxFQUFFLGdCQUFnQjtJQUN0QixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLElBQUksRUFBRSxnQkFBZ0I7SUFDdEIsSUFBSSxFQUFFLGdCQUFnQjtJQUN0QixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLElBQUksRUFBRSxnQkFBZ0I7SUFDdEIsSUFBSSxFQUFFLGlCQUFpQjtJQUN2QixHQUFHLEVBQUUsYUFBYTtJQUNsQixJQUFJLEVBQUUsV0FBVztJQUNqQixNQUFNLEVBQUUsWUFBWTtJQUNwQixJQUFJLEVBQUUsY0FBYztJQUNwQixHQUFHLEVBQUUsV0FBVztJQUNoQixHQUFHLEVBQUUsV0FBVztJQUNoQixHQUFHLEVBQUUsb0JBQW9CO0lBQ3pCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLEtBQUssRUFBRSxXQUFXO0lBQ2xCLEtBQUssRUFBRSxhQUFhO0lBQ3BCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLElBQUksRUFBRSxZQUFZO0lBQ2xCLE9BQU8sRUFBRSxjQUFjO0lBQ3ZCLElBQUksRUFBRSxtQkFBbUI7SUFDekIsT0FBTyxFQUFFLGNBQWM7SUFDdkIsSUFBSSxFQUFFLFdBQVc7SUFDakIsSUFBSSxFQUFFLGlCQUFpQjtJQUN2QixHQUFHLEVBQUUsaUJBQWlCO0lBQ3RCLElBQUksRUFBRSxnQkFBZ0I7Q0FDekI7Ozs7O01BS0ssU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFB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RyxDQUFDLEtBQUssRUFBRSxFQUFDLENBQUM7U0FDeEc7UUFDRCxJQUFJLFFBQVEsRUFBRTtZQUNWLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2xDLE9BQU8sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ2pDO2lCQUFNO2dCQUNILE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Ozs7Ozs7SUFPTyxZQUFZLENBQUMsZUFBdUI7UUFDeEMsSUFBSSxlQUFlLEVBQUU7O2tCQUNYLEVBQUUsR0FBRyxjQUFjO1lBQ3pCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDM0IsT0FBTyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM1QztTQUNKO1FBQ0QsT0FBTyxlQUFlLENBQUM7SUFDM0IsQ0FBQzs7Ozs7Ozs7SUFRTyxhQUFhLENBQUMsRUFBVTtRQUM1QixJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDVixPQUFPLEVBQUUsQ0FBQztTQUNiO2FBQU07WUFDSCxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2hDO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENyZWF0ZWQgYnkgcm9vYm0gb24gMTYuMDUuMjAxNy5cclxuICogTWFwcGluZyBmcm9tIG5vcm1hbGl6ZWQgdGFnIG5hbWVzIHRvIHBsYWNlaG9sZGVyIG5hbWVzLlxyXG4gKi9cclxuXHJcbi8qXHJcbmNvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvcGFja2FnZXMvY29tcGlsZXIvc3JjL2kxOG4vc2VyaWFsaXplcnMvcGxhY2Vob2xkZXIudHNcclxuICovXHJcbmNvbnN0IFRBR19UT19QTEFDRUhPTERFUl9OQU1FUzoge1trOiBzdHJpbmddOiBzdHJpbmd9ID0ge1xyXG4gICAgJ0EnOiAnTElOSycsXHJcbiAgICAnQic6ICdCT0xEX1RFWFQnLFxyXG4gICAgJ0JSJzogJ0xJTkVfQlJFQUsnLFxyXG4gICAgJ0VNJzogJ0VNUEhBU0lTRURfVEVYVCcsXHJcbiAgICAnSDEnOiAnSEVBRElOR19MRVZFTDEnLFxyXG4gICAgJ0gyJzogJ0hFQURJTkdfTEVWRUwyJyxcclxuICAgICdIMyc6ICdIRUFESU5HX0xFVkVMMycsXHJcbiAgICAnSDQnOiAnSEVBRElOR19MRVZFTDQnLFxyXG4gICAgJ0g1JzogJ0hFQURJTkdfTEVWRUw1JyxcclxuICAgICdINic6ICdIRUFESU5HX0xFVkVMNicsXHJcbiAgICAnSFInOiAnSE9SSVpPTlRBTF9SVUxFJyxcclxuICAgICdJJzogJ0lUQUxJQ19URVhUJyxcclxuICAgICdMSSc6ICdMSVNUX0lURU0nLFxyXG4gICAgJ0xJTksnOiAnTUVESUFfTElOSycsXHJcbiAgICAnT0wnOiAnT1JERVJFRF9MSVNUJyxcclxuICAgICdQJzogJ1BBUkFHUkFQSCcsXHJcbiAgICAnUSc6ICdRVU9UQVRJT04nLFxyXG4gICAgJ1MnOiAnU1RSSUtFVEhST1VHSF9URVhUJyxcclxuICAgICdTTUFMTCc6ICdTTUFMTF9URVhUJyxcclxuICAgICdTVUInOiAnU1VCU1RSSVBUJyxcclxuICAgICdTVVAnOiAnU1VQRVJTQ1JJUFQnLFxyXG4gICAgJ1RCT0RZJzogJ1RBQkxFX0JPRFknLFxyXG4gICAgJ1REJzogJ1RBQkxFX0NFTEwnLFxyXG4gICAgJ1RGT09UJzogJ1RBQkxFX0ZPT1RFUicsXHJcbiAgICAnVEgnOiAnVEFCTEVfSEVBREVSX0NFTEwnLFxyXG4gICAgJ1RIRUFEJzogJ1RBQkxFX0hFQURFUicsXHJcbiAgICAnVFInOiAnVEFCTEVfUk9XJyxcclxuICAgICdUVCc6ICdNT05PU1BBQ0VEX1RFWFQnLFxyXG4gICAgJ1UnOiAnVU5ERVJMSU5FRF9URVhUJyxcclxuICAgICdVTCc6ICdVTk9SREVSRURfTElTVCcsXHJcbn07XHJcblxyXG4vKipcclxuICogSFRNTCBUYWdzIChpbiB1cHBlcmNhc2UpIHRoYXQgYXJlIGVtcHR5LCB0aGV5IGhhdmUgbm8gY29udGVudCwgYnV0IGRvIG5vdCBuZWVkIGEgY2xvc2UgdGFnLCBlLmcuIDxicj4sIDxpbWc+LCA8aHI+LlxyXG4gKi9cclxuY29uc3QgVk9JRF9UQUdTID0gWydCUicsICdIUicsICdJTUcnLCAnQVJFQScsICdMSU5LJywgJ1dCUiddO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhZ01hcHBpbmcge1xyXG5cclxuICAgIHB1YmxpYyBnZXRTdGFydFRhZ1BsYWNlaG9sZGVyTmFtZSh0YWc6IHN0cmluZywgaWQ6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdXBwZXJUYWcgPSB0YWcudG9VcHBlckNhc2UoKTtcclxuICAgICAgICBjb25zdCBiYXNlTmFtZSA9IFRBR19UT19QTEFDRUhPTERFUl9OQU1FU1t1cHBlclRhZ10gfHwgYFRBR18ke3VwcGVyVGFnfWA7XHJcbiAgICAgICAgcmV0dXJuIGBTVEFSVF8ke2Jhc2VOYW1lfWAgKyB0aGlzLmNvdW50ZXJTdHJpbmcoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDbG9zZVRhZ1BsYWNlaG9sZGVyTmFtZSh0YWc6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdXBwZXJUYWcgPSB0YWcudG9VcHBlckNhc2UoKTtcclxuICAgICAgICBjb25zdCBiYXNlTmFtZSA9IFRBR19UT19QTEFDRUhPTERFUl9OQU1FU1t1cHBlclRhZ10gfHwgYFRBR18ke3VwcGVyVGFnfWA7XHJcbiAgICAgICAgcmV0dXJuIGBDTE9TRV8ke2Jhc2VOYW1lfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVtcHR5VGFnUGxhY2Vob2xkZXJOYW1lKHRhZzogc3RyaW5nLCBpZDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB1cHBlclRhZyA9IHRhZy50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gIFRBR19UT19QTEFDRUhPTERFUl9OQU1FU1t1cHBlclRhZ10gfHwgYFRBR18ke3VwcGVyVGFnfWA7XHJcbiAgICAgICAgcmV0dXJuIGJhc2VOYW1lICsgdGhpcy5jb3VudGVyU3RyaW5nKGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q3R5cGVGb3JUYWcodGFnOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodGFnLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSAnYnInOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdsYic7XHJcbiAgICAgICAgICAgIGNhc2UgJ2ltZyc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2ltYWdlJztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBgeC0ke3RhZ31gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGFnbmFtZUZyb21TdGFydFRhZ1BsYWNlaG9sZGVyTmFtZShwbGFjZWhvbGRlck5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyTmFtZS5zdGFydHNXaXRoKCdTVEFSVF9UQUdfJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXBDb3VudGVyKHBsYWNlaG9sZGVyTmFtZS5zdWJzdHJpbmcoJ1NUQVJUX1RBR18nLmxlbmd0aCkpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwbGFjZWhvbGRlck5hbWUuc3RhcnRzV2l0aCgnU1RBUlRfJykpIHtcclxuICAgICAgICAgICAgY29uc3QgcGggPSB0aGlzLnN0cmlwQ291bnRlcihwbGFjZWhvbGRlck5hbWUuc3Vic3RyaW5nKCdTVEFSVF8nLmxlbmd0aCkpO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaEtleSA9IE9iamVjdC5rZXlzKFRBR19UT19QTEFDRUhPTERFUl9OQU1FUykuZmluZCgoa2V5KSA9PiBUQUdfVE9fUExBQ0VIT0xERVJfTkFNRVNba2V5XSA9PT0gcGgpO1xyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hLZXkgPyBtYXRjaEtleS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFRhZ25hbWVGcm9tQ2xvc2VUYWdQbGFjZWhvbGRlck5hbWUocGxhY2Vob2xkZXJOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChwbGFjZWhvbGRlck5hbWUuc3RhcnRzV2l0aCgnQ0xPU0VfVEFHXycpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmlwQ291bnRlcihwbGFjZWhvbGRlck5hbWUuc3Vic3RyaW5nKCdDTE9TRV9UQUdfJy5sZW5ndGgpKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGxhY2Vob2xkZXJOYW1lLnN0YXJ0c1dpdGgoJ0NMT1NFXycpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBoID0gdGhpcy5zdHJpcENvdW50ZXIocGxhY2Vob2xkZXJOYW1lLnN1YnN0cmluZygnQ0xPU0VfJy5sZW5ndGgpKTtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2hLZXkgPSBPYmplY3Qua2V5cyhUQUdfVE9fUExBQ0VIT0xERVJfTkFNRVMpLmZpbmQoKGtleSkgPT4gVEFHX1RPX1BMQUNFSE9MREVSX05BTUVTW2tleV0gPT09IHBoKTtcclxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoS2V5ID8gbWF0Y2hLZXkudG9Mb3dlckNhc2UoKSA6IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVzdCwgd2V0aGVyIHBsYWNlaG9sZGVyIG5hbWUgc3RhbmRzIGZvciBlbXB0eSBodG1sIHRhZy5cclxuICAgICAqIEBwYXJhbSBwbGFjZWhvbGRlck5hbWUgY2FuIGJlIFRBR188bmFtZT4gb3IganVzdCA8bmFtZT5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzRW1wdHlUYWdQbGFjZWhvbGRlck5hbWUocGxhY2Vob2xkZXJOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBwaCA9IHRoaXMuc3RyaXBDb3VudGVyKHBsYWNlaG9sZGVyTmFtZSk7XHJcbiAgICAgICAgbGV0IG1hdGNoS2V5O1xyXG4gICAgICAgIGlmIChwaC5zdGFydHNXaXRoKCdUQUdfJykpIHtcclxuICAgICAgICAgICAgbWF0Y2hLZXkgPSBwaC5zdWJzdHJpbmcoNCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtYXRjaEtleSA9IE9iamVjdC5rZXlzKFRBR19UT19QTEFDRUhPTERFUl9OQU1FUykuZmluZCgoa2V5KSA9PiBUQUdfVE9fUExBQ0VIT0xERVJfTkFNRVNba2V5XSA9PT0gcGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWF0Y2hLZXkpIHtcclxuICAgICAgICAgICAgaWYgKFZPSURfVEFHUy5pbmRleE9mKG1hdGNoS2V5KSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB0YWduYW1lIG9mIGVtcHR5IHRhZyBwbGFjZWhvbGRlci5cclxuICAgICAqIEBwYXJhbSBwbGFjZWhvbGRlck5hbWUgY2FuIGJlIFRBR188bmFtZT4gb3IganVzdCA8bmFtZT5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFRhZ25hbWVGcm9tRW1wdHlUYWdQbGFjZWhvbGRlck5hbWUocGxhY2Vob2xkZXJOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHBoID0gdGhpcy5zdHJpcENvdW50ZXIocGxhY2Vob2xkZXJOYW1lKTtcclxuICAgICAgICBsZXQgbWF0Y2hLZXk7XHJcbiAgICAgICAgaWYgKHBoLnN0YXJ0c1dpdGgoJ1RBR18nKSkge1xyXG4gICAgICAgICAgICBtYXRjaEtleSA9IHBoLnN1YnN0cmluZyg0KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1hdGNoS2V5ID0gT2JqZWN0LmtleXMoVEFHX1RPX1BMQUNFSE9MREVSX05BTUVTKS5maW5kKChrZXkpID0+IFRBR19UT19QTEFDRUhPTERFUl9OQU1FU1trZXldID09PSBwaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXRjaEtleSkge1xyXG4gICAgICAgICAgICBpZiAoVk9JRF9UQUdTLmluZGV4T2YobWF0Y2hLZXkpID49IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaEtleS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBwbGFjZWhvbGRlciBlbmRzIHdpdGggX1swLTldKywgc3RyaXAgdGhhdCBudW1iZXIuXHJcbiAgICAgKiBAcGFyYW0gcGxhY2Vob2xkZXJOYW1lIHBsYWNlaG9sZGVyTmFtZVxyXG4gICAgICogQHJldHVybiBwbGFjZWhvbGRlck5hbWUgd2l0aG91dCBjb3VudGVyIGF0IGVuZC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdHJpcENvdW50ZXIocGxhY2Vob2xkZXJOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChwbGFjZWhvbGRlck5hbWUpIHtcclxuICAgICAgICAgICAgY29uc3QgcmUgPSAvKC4qKV9bMC05XSskLztcclxuICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyTmFtZS5tYXRjaChyZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwbGFjZWhvbGRlck5hbWUucmVwbGFjZShyZSwgJyQxJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0cmluZyBzdWZmaXggZm9yIGNvdW50ZXIuXHJcbiAgICAgKiBJZiBjb3VudGVyIGlzIDAsIGl0IGlzIGVtcHR5LCBvdGhlcndpc2UgXzxpZD4uXHJcbiAgICAgKiBAcGFyYW0gaWQgaWRcclxuICAgICAqIEByZXR1cm4gc3VmZml4IGZvciBjb3VudGVyLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvdW50ZXJTdHJpbmcoaWQ6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChpZCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICdfJyArIGlkLnRvU3RyaW5nKDEwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19