angular-cc-library
Version:
angular credit card library
267 lines • 29.7 kB
JavaScript
const defaultFormat = /(\d{1,4})/g;
const cards = [
{
type: 'maestro',
patterns: [5018, 502, 503, 506, 56, 58, 639, 6220, 67],
format: defaultFormat,
length: [12, 13, 14, 15, 16, 17, 18, 19],
cvvLength: [3],
luhn: true,
}, {
type: 'forbrugsforeningen',
patterns: [600],
format: defaultFormat,
length: [16],
cvvLength: [3],
luhn: true,
}, {
type: 'dankort',
patterns: [5019],
format: defaultFormat,
length: [16],
cvvLength: [3],
luhn: true,
}, {
type: 'visa',
patterns: [4],
format: defaultFormat,
length: [13, 16, 19],
cvvLength: [3],
luhn: true,
}, {
type: 'mastercard',
patterns: [51, 52, 53, 54, 55, 22, 23, 24, 25, 26, 27],
format: defaultFormat,
length: [16],
cvvLength: [3],
luhn: true,
}, {
type: 'amex',
patterns: [34, 37],
format: /(\d{1,4})(\d{1,6})?(\d{1,5})?/,
length: [15],
cvvLength: [3, 4],
luhn: true,
}, {
type: 'dinersclub',
patterns: [30, 36, 38, 39],
format: /(\d{1,4})(\d{1,6})?(\d{1,4})?/,
length: [14],
cvvLength: [3],
luhn: true,
}, {
type: 'discover',
patterns: [60, 64, 65, 622],
format: defaultFormat,
length: [16],
cvvLength: [3],
luhn: true,
}, {
type: 'unionpay',
patterns: [62, 88],
format: defaultFormat,
length: [16, 17, 18, 19],
cvvLength: [3],
luhn: false,
}, {
type: 'jcb',
patterns: [35],
format: defaultFormat,
length: [16, 19],
cvvLength: [3],
luhn: true,
},
];
// @dynamic
export class CreditCard {
static cards() {
return cards;
}
static cardFromNumber(num) {
num = (num + '').replace(/\D/g, '');
for (let i = 0, len = cards.length; i < len; i++) {
const card = cards[i];
const ref = card.patterns;
for (let j = 0, len1 = ref.length; j < len1; j++) {
const pattern = ref[j];
const p = pattern + '';
if (num.substr(0, p.length) === p) {
return card;
}
}
}
}
static restrictNumeric(e) {
if (e.metaKey || e.ctrlKey) {
return true;
}
if (e.which === 32) {
return false;
}
if (e.which === 0) {
return true;
}
if (e.which < 33) {
return true;
}
const input = String.fromCharCode(e.which);
return !!/[\d\s]/.test(input);
}
static hasTextSelected(target) {
return target.selectionStart !== null && target.selectionStart !== target.selectionEnd;
}
static cardType(num) {
if (!num) {
return num;
}
const card = this.cardFromNumber(num);
if (card !== null && typeof card !== 'undefined') {
return card.type;
}
else {
return null;
}
}
static formatCardNumber(num) {
num = num.replace(/\D/g, '');
const card = this.cardFromNumber(num);
if (!card) {
return num;
}
const upperLength = card.length[card.length.length - 1];
num = num.slice(0, upperLength);
if (card.format.global) {
const matches = num.match(card.format);
if (matches != null) {
return matches.join(' ');
}
}
else {
const groups = card.format.exec(num);
if (groups == null) {
return;
}
groups.shift();
return groups.filter(Boolean).join(' ');
}
}
static safeVal(value, target, updateValue) {
let cursor = null;
const last = target.value;
let result = null;
try {
cursor = target.selectionStart;
}
catch (error) {
// do nothing
}
updateValue(value);
if (cursor !== null && target === document.activeElement) {
if (cursor === last.length) {
cursor = value.length;
}
if (last !== value) {
const prevPair = last.slice(cursor - 1, +cursor + 1 || 9e9);
const currPair = value.slice(cursor - 1, +cursor + 1 || 9e9);
const digit = value[cursor];
if (/\d/.test(digit) && prevPair === (`${digit} `) && currPair === (` ${digit}`)) {
cursor = cursor + 1;
}
}
result = cursor;
}
return result;
}
static isCardNumber(key, target) {
const digit = String.fromCharCode(key);
if (!/^\d+$/.test(digit)) {
return false;
}
if (CreditCard.hasTextSelected(target)) {
return true;
}
const value = (target.value + digit).replace(/\D/g, '');
const card = CreditCard.cardFromNumber(value);
if (card) {
return value.length <= card.length[card.length.length - 1];
}
else {
return value.length <= 16;
}
}
static restrictExpiry(key, target) {
const digit = String.fromCharCode(key);
if (!/^\d+$/.test(digit) || this.hasTextSelected(target)) {
return false;
}
const value = `${target.value}${digit}`.replace(/\D/g, '');
return value.length > 6;
}
static replaceFullWidthChars(str) {
if (str === null) {
str = '';
}
const fullWidth = '\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19';
const halfWidth = '0123456789';
let value = '';
const chars = str.split('');
for (let i = 0; i < chars.length; i++) {
let chr = chars[i];
const idx = fullWidth.indexOf(chr);
if (idx > -1) {
chr = halfWidth[idx];
}
value += chr;
}
return value;
}
static formatExpiry(expiry) {
const parts = expiry.match(/^\D*(\d{1,2})(\D+)?(\d{1,4})?/);
if (!parts) {
return '';
}
let mon = parts[1] || '';
let sep = parts[2] || '';
const year = parts[3] || '';
if (year.length > 0) {
sep = ' / ';
}
else if (sep === ' /') {
mon = mon.substring(0, 1);
sep = '';
}
else if (mon.length === 2 || sep.length > 0) {
sep = ' / ';
}
else if (mon.length === 1 && (mon !== '0' && mon !== '1')) {
mon = `0${mon}`;
sep = ' / ';
}
return `${mon}${sep}${year}`;
}
static restrictCvc(key, target) {
const digit = String.fromCharCode(key);
if (!/^\d+$/.test(digit) || this.hasTextSelected(target)) {
return false;
}
const val = `${target.value}${digit}`;
return val.length <= 4;
}
static luhnCheck(num) {
const digits = num.split('').reverse();
let odd = true;
let sum = 0;
for (let i = 0; i < digits.length; i++) {
let digit = parseInt(digits[i], 10);
if ((odd = !odd)) {
digit *= 2;
}
if (digit > 9) {
digit -= 9;
}
sum += digit;
}
return sum % 10 === 0;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlZGl0LWNhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNjLWxpYnJhcnkvc3JjL2xpYi9jcmVkaXQtY2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUM7QUFXbkMsTUFBTSxLQUFLLEdBQXFCO0lBQzlCO1FBQ0UsSUFBSSxFQUFFLFNBQVM7UUFDZixRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUN0RCxNQUFNLEVBQUUsYUFBYTtRQUNyQixNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3hDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNkLElBQUksRUFBRSxJQUFJO0tBQ1gsRUFBRTtRQUNELElBQUksRUFBRSxvQkFBb0I7UUFDMUIsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ2YsTUFBTSxFQUFFLGFBQWE7UUFDckIsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ1osU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxFQUFFLElBQUk7S0FDWCxFQUFFO1FBQ0QsSUFBSSxFQUFFLFNBQVM7UUFDZixRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDaEIsTUFBTSxFQUFFLGFBQWE7UUFDckIsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ1osU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxFQUFFLElBQUk7S0FDWCxFQUFFO1FBQ0QsSUFBSSxFQUFFLE1BQU07UUFDWixRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7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QU8sR0FBRyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZGVmYXVsdEZvcm1hdCA9IC8oXFxkezEsNH0pL2c7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FyZERlZmluaXRpb24ge1xuICB0eXBlOiBzdHJpbmc7XG4gIHBhdHRlcm5zOiBudW1iZXJbXTtcbiAgZm9ybWF0OiBSZWdFeHA7XG4gIGxlbmd0aDogbnVtYmVyW107XG4gIGN2dkxlbmd0aDogbnVtYmVyW107XG4gIGx1aG46IGJvb2xlYW47XG59XG5cbmNvbnN0IGNhcmRzOiBDYXJkRGVmaW5pdGlvbltdID0gW1xuICB7XG4gICAgdHlwZTogJ21hZXN0cm8nLFxuICAgIHBhdHRlcm5zOiBbNTAxOCwgNTAyLCA1MDMsIDUwNiwgNTYsIDU4LCA2MzksIDYyMjAsIDY3XSxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgbGVuZ3RoOiBbMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5XSxcbiAgICBjdnZMZW5ndGg6IFszXSxcbiAgICBsdWhuOiB0cnVlLFxuICB9LCB7XG4gICAgdHlwZTogJ2ZvcmJydWdzZm9yZW5pbmdlbicsXG4gICAgcGF0dGVybnM6IFs2MDBdLFxuICAgIGZvcm1hdDogZGVmYXVsdEZvcm1hdCxcbiAgICBsZW5ndGg6IFsxNl0sXG4gICAgY3Z2TGVuZ3RoOiBbM10sXG4gICAgbHVobjogdHJ1ZSxcbiAgfSwge1xuICAgIHR5cGU6ICdkYW5rb3J0JyxcbiAgICBwYXR0ZXJuczogWzUwMTldLFxuICAgIGZvcm1hdDogZGVmYXVsdEZvcm1hdCxcbiAgICBsZW5ndGg6IFsxNl0sXG4gICAgY3Z2TGVuZ3RoOiBbM10sXG4gICAgbHVobjogdHJ1ZSxcbiAgfSwge1xuICAgIHR5cGU6ICd2aXNhJyxcbiAgICBwYXR0ZXJuczogWzRdLFxuICAgIGZvcm1hdDogZGVmYXVsdEZvcm1hdCxcbiAgICBsZW5ndGg6IFsxMywgMTYsIDE5XSxcbiAgICBjdnZMZW5ndGg6IFszXSxcbiAgICBsdWhuOiB0cnVlLFxuICB9LCB7XG4gICAgdHlwZTogJ21hc3RlcmNhcmQnLFxuICAgIHBhdHRlcm5zOiBbNTEsIDUyLCA1MywgNTQsIDU1LCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3XSxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgbGVuZ3RoOiBbMTZdLFxuICAgIGN2dkxlbmd0aDogWzNdLFxuICAgIGx1aG46IHRydWUsXG4gIH0sIHtcbiAgICB0eXBlOiAnYW1leCcsXG4gICAgcGF0dGVybnM6IFszNCwgMzddLFxuICAgIGZvcm1hdDogLyhcXGR7MSw0fSkoXFxkezEsNn0pPyhcXGR7MSw1fSk/LyxcbiAgICBsZW5ndGg6IFsxNV0sXG4gICAgY3Z2TGVuZ3RoOiBbMywgNF0sXG4gICAgbHVobjogdHJ1ZSxcbiAgfSwge1xuICAgIHR5cGU6ICdkaW5lcnNjbHViJyxcbiAgICBwYXR0ZXJuczogWzMwLCAzNiwgMzgsIDM5XSxcbiAgICBmb3JtYXQ6IC8oXFxkezEsNH0pKFxcZHsxLDZ9KT8oXFxkezEsNH0pPy8sXG4gICAgbGVuZ3RoOiBbMTRdLFxuICAgIGN2dkxlbmd0aDogWzNdLFxuICAgIGx1aG46IHRydWUsXG4gIH0sIHtcbiAgICB0eXBlOiAnZGlzY292ZXInLFxuICAgIHBhdHRlcm5zOiBbNjAsIDY0LCA2NSwgNjIyXSxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgbGVuZ3RoOiBbMTZdLFxuICAgIGN2dkxlbmd0aDogWzNdLFxuICAgIGx1aG46IHRydWUsXG4gIH0sIHtcbiAgICB0eXBlOiAndW5pb25wYXknLFxuICAgIHBhdHRlcm5zOiBbNjIsIDg4XSxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgbGVuZ3RoOiBbMTYsIDE3LCAxOCwgMTldLFxuICAgIGN2dkxlbmd0aDogWzNdLFxuICAgIGx1aG46IGZhbHNlLFxuICB9LCB7XG4gICAgdHlwZTogJ2pjYicsXG4gICAgcGF0dGVybnM6IFszNV0sXG4gICAgZm9ybWF0OiBkZWZhdWx0Rm9ybWF0LFxuICAgIGxlbmd0aDogWzE2LCAxOV0sXG4gICAgY3Z2TGVuZ3RoOiBbM10sXG4gICAgbHVobjogdHJ1ZSxcbiAgfSxcbl07XG5cbi8vIEBkeW5hbWljXG5leHBvcnQgY2xhc3MgQ3JlZGl0Q2FyZCB7XG5cbiAgcHVibGljIHN0YXRpYyBjYXJkcygpIHtcbiAgICByZXR1cm4gY2FyZHM7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNhcmRGcm9tTnVtYmVyKG51bTogc3RyaW5nKTogQ2FyZERlZmluaXRpb24ge1xuICAgIG51bSA9IChudW0gKyAnJykucmVwbGFjZSgvXFxEL2csICcnKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjYXJkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgY2FyZCA9IGNhcmRzW2ldO1xuICAgICAgY29uc3QgcmVmID0gY2FyZC5wYXR0ZXJucztcblxuICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbjEgPSByZWYubGVuZ3RoOyBqIDwgbGVuMTsgaisrKSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSByZWZbal07XG4gICAgICAgIGNvbnN0IHAgPSBwYXR0ZXJuICsgJyc7XG5cbiAgICAgICAgaWYgKG51bS5zdWJzdHIoMCwgcC5sZW5ndGgpID09PSBwKSB7XG4gICAgICAgICAgcmV0dXJuIGNhcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHJlc3RyaWN0TnVtZXJpYyhlOiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZS53aGljaCA9PT0gMzIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGUud2hpY2ggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZS53aGljaCA8IDMzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGUud2hpY2gpO1xuICAgIHJldHVybiAhIS9bXFxkXFxzXS8udGVzdChpbnB1dCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGhhc1RleHRTZWxlY3RlZCh0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGFyZ2V0LnNlbGVjdGlvblN0YXJ0ICE9PSBudWxsICYmIHRhcmdldC5zZWxlY3Rpb25TdGFydCAhPT0gdGFyZ2V0LnNlbGVjdGlvbkVuZDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY2FyZFR5cGUobnVtOiBzdHJpbmcpIHtcbiAgICBpZiAoIW51bSkge1xuICAgICAgcmV0dXJuIG51bTtcbiAgICB9XG5cbiAgICBjb25zdCBjYXJkID0gdGhpcy5jYXJkRnJvbU51bWJlcihudW0pO1xuXG4gICAgaWYgKGNhcmQgIT09IG51bGwgJiYgdHlwZW9mIGNhcmQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gY2FyZC50eXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZvcm1hdENhcmROdW1iZXIobnVtOiBzdHJpbmcpIHtcbiAgICBudW0gPSBudW0ucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICBjb25zdCBjYXJkID0gdGhpcy5jYXJkRnJvbU51bWJlcihudW0pO1xuXG4gICAgaWYgKCFjYXJkKSB7XG4gICAgICByZXR1cm4gbnVtO1xuICAgIH1cblxuICAgIGNvbnN0IHVwcGVyTGVuZ3RoID0gY2FyZC5sZW5ndGhbY2FyZC5sZW5ndGgubGVuZ3RoIC0gMV07XG4gICAgbnVtID0gbnVtLnNsaWNlKDAsIHVwcGVyTGVuZ3RoKTtcblxuICAgIGlmIChjYXJkLmZvcm1hdC5nbG9iYWwpIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBudW0ubWF0Y2goY2FyZC5mb3JtYXQpO1xuICAgICAgaWYgKG1hdGNoZXMgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlcy5qb2luKCcgJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IGNhcmQuZm9ybWF0LmV4ZWMobnVtKTtcbiAgICAgIGlmIChncm91cHMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBncm91cHMuc2hpZnQoKTtcbiAgICAgIHJldHVybiBncm91cHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNhZmVWYWwodmFsdWU6IHN0cmluZywgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50LCB1cGRhdGVWYWx1ZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpOiBudW1iZXIge1xuICAgIGxldCBjdXJzb3I6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGxhc3QgPSB0YXJnZXQudmFsdWU7XG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBjdXJzb3IgPSB0YXJnZXQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICB1cGRhdGVWYWx1ZSh2YWx1ZSk7XG5cbiAgICBpZiAoY3Vyc29yICE9PSBudWxsICYmIHRhcmdldCA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgICAgaWYgKGN1cnNvciA9PT0gbGFzdC5sZW5ndGgpIHtcbiAgICAgICAgY3Vyc29yID0gdmFsdWUubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFzdCAhPT0gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgcHJldlBhaXIgPSBsYXN0LnNsaWNlKGN1cnNvciAtIDEsICtjdXJzb3IgKyAxIHx8IDllOSk7XG4gICAgICAgIGNvbnN0IGN1cnJQYWlyID0gdmFsdWUuc2xpY2UoY3Vyc29yIC0gMSwgK2N1cnNvciArIDEgfHwgOWU5KTtcbiAgICAgICAgY29uc3QgZGlnaXQgPSB2YWx1ZVtjdXJzb3JdO1xuXG4gICAgICAgIGlmICgvXFxkLy50ZXN0KGRpZ2l0KSAmJiBwcmV2UGFpciA9PT0gKGAke2RpZ2l0fSBgKSAmJiBjdXJyUGFpciA9PT0gKGAgJHtkaWdpdH1gKSkge1xuICAgICAgICAgIGN1cnNvciA9IGN1cnNvciArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0ID0gY3Vyc29yO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0NhcmROdW1iZXIoa2V5OiBudW1iZXIsIHRhcmdldDogSFRNTElucHV0RWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRpZ2l0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXkpO1xuICAgIGlmICghL15cXGQrJC8udGVzdChkaWdpdCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKENyZWRpdENhcmQuaGFzVGV4dFNlbGVjdGVkKHRhcmdldCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9ICh0YXJnZXQudmFsdWUgKyBkaWdpdCkucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICBjb25zdCBjYXJkID0gQ3JlZGl0Q2FyZC5jYXJkRnJvbU51bWJlcih2YWx1ZSk7XG5cbiAgICBpZiAoY2FyZCkge1xuICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8PSBjYXJkLmxlbmd0aFtjYXJkLmxlbmd0aC5sZW5ndGggLSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8PSAxNjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHJlc3RyaWN0RXhwaXJ5KGtleTogbnVtYmVyLCB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICBjb25zdCBkaWdpdCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoa2V5KTtcbiAgICBpZiAoIS9eXFxkKyQvLnRlc3QoZGlnaXQpIHx8IHRoaXMuaGFzVGV4dFNlbGVjdGVkKHRhcmdldCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBgJHt0YXJnZXQudmFsdWV9JHtkaWdpdH1gLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG5cbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gNjtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcmVwbGFjZUZ1bGxXaWR0aENoYXJzKHN0cjogc3RyaW5nKSB7XG4gICAgaWYgKHN0ciA9PT0gbnVsbCkge1xuICAgICAgc3RyID0gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbFdpZHRoID0gJ1xcdWZmMTBcXHVmZjExXFx1ZmYxMlxcdWZmMTNcXHVmZjE0XFx1ZmYxNVxcdWZmMTZcXHVmZjE3XFx1ZmYxOFxcdWZmMTknO1xuICAgIGNvbnN0IGhhbGZXaWR0aCA9ICcwMTIzNDU2Nzg5JztcbiAgICBsZXQgdmFsdWUgPSAnJztcbiAgICBjb25zdCBjaGFycyA9IHN0ci5zcGxpdCgnJyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgY2hyID0gY2hhcnNbaV07XG4gICAgICBjb25zdCBpZHggPSBmdWxsV2lkdGguaW5kZXhPZihjaHIpO1xuICAgICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgIGNociA9IGhhbGZXaWR0aFtpZHhdO1xuICAgICAgfVxuICAgICAgdmFsdWUgKz0gY2hyO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZvcm1hdEV4cGlyeShleHBpcnk6IHN0cmluZykge1xuICAgIGNvbnN0IHBhcnRzID0gZXhwaXJ5Lm1hdGNoKC9eXFxEKihcXGR7MSwyfSkoXFxEKyk/KFxcZHsxLDR9KT8vKTtcblxuICAgIGlmICghcGFydHMpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBsZXQgbW9uICA9IHBhcnRzWzFdIHx8ICcnO1xuICAgIGxldCBzZXAgID0gcGFydHNbMl0gfHwgJyc7XG4gICAgY29uc3QgeWVhciA9IHBhcnRzWzNdIHx8ICcnO1xuXG4gICAgaWYgKHllYXIubGVuZ3RoID4gMCkge1xuICAgICAgc2VwID0gJyAvICc7XG4gICAgfSBlbHNlIGlmIChzZXAgPT09ICcgLycpIHtcbiAgICAgIG1vbiA9IG1vbi5zdWJzdHJpbmcoMCwgMSk7XG4gICAgICBzZXAgPSAnJztcbiAgICB9IGVsc2UgaWYgKG1vbi5sZW5ndGggPT09IDIgfHwgc2VwLmxlbmd0aCA+IDApIHtcbiAgICAgIHNlcCA9ICcgLyAnO1xuICAgIH0gZWxzZSBpZiAobW9uLmxlbmd0aCA9PT0gMSAmJiAobW9uICE9PSAnMCcgJiYgbW9uICE9PSAnMScpKSB7XG4gICAgICBtb24gPSBgMCR7bW9ufWA7XG4gICAgICBzZXAgPSAnIC8gJztcbiAgICB9XG4gICAgcmV0dXJuIGAke21vbn0ke3NlcH0ke3llYXJ9YDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcmVzdHJpY3RDdmMoa2V5OiBudW1iZXIsIHRhcmdldDogSFRNTElucHV0RWxlbWVudCkge1xuICAgIGNvbnN0IGRpZ2l0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXkpO1xuICAgIGlmICghL15cXGQrJC8udGVzdChkaWdpdCkgfHwgdGhpcy5oYXNUZXh0U2VsZWN0ZWQodGFyZ2V0KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBgJHt0YXJnZXQudmFsdWV9JHtkaWdpdH1gO1xuICAgIHJldHVybiB2YWwubGVuZ3RoIDw9IDQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGx1aG5DaGVjayhudW06IHN0cmluZykge1xuICAgIGNvbnN0IGRpZ2l0cyA9IG51bS5zcGxpdCgnJykucmV2ZXJzZSgpO1xuICAgIGxldCBvZGQgPSB0cnVlO1xuICAgIGxldCBzdW0gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWdpdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBkaWdpdCA9IHBhcnNlSW50KGRpZ2l0c1tpXSwgMTApO1xuICAgICAgaWYgKChvZGQgPSAhb2RkKSkge1xuICAgICAgICBkaWdpdCAqPSAyO1xuICAgICAgfVxuICAgICAgaWYgKGRpZ2l0ID4gOSkge1xuICAgICAgICBkaWdpdCAtPSA5O1xuICAgICAgfVxuICAgICAgc3VtICs9IGRpZ2l0O1xuICAgIH1cblxuICAgIHJldHVybiBzdW0gJSAxMCA9PT0gMDtcbiAgfVxufVxuIl19