UNPKG

systelab-translate

Version:

The internationalization (i18n) library for Systelab

225 lines 28.8 kB
// Code derived from: https://gist.github.com/oskansavli/822382 export class DecimalFormat { constructor(formatStr) { this.prefix = ''; this.suffix = ''; this.comma = 0; this.minInt = 1; this.minFrac = 0; this.maxFrac = 0; // get prefix for (var i = 0; i < formatStr.length; i++) { if (formatStr.charAt(i) == '#' || formatStr.charAt(i) == '0') { this.prefix = formatStr.substring(0, i); formatStr = formatStr.substring(i); break; } } // get suffix this.suffix = formatStr.replace(/[#]|[0]|[,]|[.]/g, ''); var numberStr = formatStr.replace(/[^0#,.]/g, ''); var intStr = ''; var fracStr = ''; var point = numberStr.indexOf('.'); if (point != -1) { intStr = numberStr.substring(0, point); fracStr = numberStr.substring(point + 1); } else { intStr = numberStr; } var commaPos = intStr.lastIndexOf(','); if (commaPos != -1) { this.comma = intStr.length - 1 - commaPos; } intStr = intStr.replace(/[,]/g, ''); // remove commas fracStr = fracStr.replace(/[,]|[.]+/g, ''); this.maxFrac = fracStr.length; var tmp = intStr.replace(/[^0]/g, ''); // remove all except zero if (tmp.length > this.minInt) { this.minInt = tmp.length; } tmp = fracStr.replace(/[^0]/g, ''); this.minFrac = tmp.length; } format(numStr) { // remove prefix, suffix and commas var numberStr = this.formatBack(numStr) .toLowerCase(); // do not format if not a number if (isNaN(numberStr) || numberStr.length == 0) { return numStr; } //scientific numbers var positione = numberStr.indexOf("e"); if (positione != -1) { var n = Number(numberStr); // if (n == "Infinity" || n == "-Infinity") { // return numberStr; // } numberStr = n + ""; if (numberStr.indexOf('e') != -1) { return numberStr; } } var negative = false; // remove sign if (numberStr.charAt(0) == '-') { negative = true; numberStr = numberStr.substring(1); } else if (numberStr.charAt(0) == '+') { numberStr = numberStr.substring(1); } var point = numberStr.indexOf('.'); // position of point character var intStr = ''; var fracStr = ''; if (point != -1) { intStr = numberStr.substring(0, point); fracStr = numberStr.substring(point + 1); } else { intStr = numberStr; } fracStr = fracStr.replace(/[.]/, ''); // remove other point characters var isPercentage = this.suffix && this.suffix.charAt(0) === '%'; // if percentage, number will be multiplied by 100. var minInt = this.minInt, minFrac = this.minFrac, maxFrac = this.maxFrac; if (isPercentage) { minInt -= 2; minFrac += 2; maxFrac += 2; } if (fracStr.length > maxFrac) { // round //case 6143 var num2 = new Number('0.' + fracStr); var num = (maxFrac == 0) ? Math.round(num2.valueOf()) : num2.toFixed(maxFrac); // toFixed method has bugs on IE (0.7 --> 0) fracStr = num.toString(10) .substr(2); var c = (Number(num) >= 1) ? 1 : 0; //carry var x, i = intStr.length - 1; while (c) { //increment intStr if (i == -1) { intStr = '1' + intStr; break; } else { x = intStr.charAt(i); if (x == 9) { x = '0'; c = 1; } else { x = (++x) + ''; c = 0; } intStr = intStr.substring(0, i) + x + intStr.substring(i + 1, intStr.length); i--; } } } for (var i = fracStr.length; i < minFrac; i++) { // if minFrac=4 then 1.12 --> 1.1200 fracStr = fracStr + '0'; } while (fracStr.length > minFrac && fracStr.charAt(fracStr.length - 1) == '0') { // if minInt=4 then 00034 --> 0034) fracStr = fracStr.substring(0, fracStr.length - 1); } for (var i = intStr.length; i < minInt; i++) { // if minInt=4 then 034 --> 0034 intStr = '0' + intStr; } while (intStr.length > minInt && intStr.charAt(0) == '0') { // if minInt=4 then 00034 --> 0034) intStr = intStr.substring(1); } if (isPercentage) { // multiply by 100 intStr += fracStr.substring(0, 2); fracStr = fracStr.substring(2); } var j = 0; for (var i = intStr.length; i > 0; i--) { // add commas if (j != 0 && j % this.comma == 0) { intStr = intStr.substring(0, i) + ',' + intStr.substring(i); j = 0; } j++; } var formattedValue; if (fracStr.length > 0) { formattedValue = this.prefix + intStr + '.' + fracStr + this.suffix; } else { formattedValue = this.prefix + intStr + this.suffix; } if (negative) { formattedValue = '-' + formattedValue; } return formattedValue; } /** * @description Converts formatted value back to non-formatted value * @methodOf DecimalFormat * @param {String} fNumberStr Formatted number * @return {String} Original number * @author Oskan Savli */ formatBack(fNumStr) { fNumStr += ''; //ensure it is string if (!fNumStr) { return ''; } //do not return undefined or null if (!isNaN(fNumStr)) { return this.getNumericString(fNumStr); } var fNumberStr = fNumStr; var negative = false; if (fNumStr.charAt(0) == '-') { fNumberStr = fNumberStr.substr(1); negative = true; } var pIndex = fNumberStr.indexOf(this.prefix); var sIndex = (this.suffix == '') ? fNumberStr.length : fNumberStr.indexOf(this.suffix, this.prefix.length + 1); if (pIndex == 0 && sIndex > 0) { // remove suffix fNumberStr = fNumberStr.substr(0, sIndex); // remove prefix fNumberStr = fNumberStr.substr(this.prefix.length); // remove commas fNumberStr = fNumberStr.replace(/,/g, ''); if (negative) { fNumberStr = '-' + fNumberStr; } if (!isNaN(fNumberStr)) { return this.getNumericString(fNumberStr); } } return fNumStr; } /** * @description We shouldn't return strings like 1.000 in formatBack method. * However, using only Number(str) is not enough, because it omits . in big numbers * like 23423423423342234.34 => 23423423423342236 . There's a conflict in cases * 6143 and 6541. * @methodOf DecimalFormat * @param {String} str Numberic string * @return {String} Corrected numeric string * @author Serdar Bicer */ getNumericString(str) { //first convert to number var num = new Number(str); //check if there is a missing dot var numStr = num + ''; if (str.indexOf('.') > -1 && numStr.indexOf('.') < 0) { //check if original string has all zeros after dot or not for (var i = str.indexOf('.') + 1; i < str.length; i++) { //if not, this means we lost precision if (str.charAt(i) !== '0') { return str; } } return numStr; } return str; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjaW1hbC1mb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeXN0ZWxhYi10cmFuc2xhdGUvc3JjL2xpYi9kZWNpbWFsLWZvcm1hdC9kZWNpbWFsLWZvcm1hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrREFBK0Q7QUFFL0QsTUFBTSxPQUFPLGFBQWE7SUFTekIsWUFBWSxTQUFpQjtRQVB0QixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFJbEIsYUFBYTtRQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUM5RCxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkMsTUFBTTtZQUNQLENBQUM7UUFDRixDQUFDO1FBRUQsYUFBYTtRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVsRCxJQUFJLE1BQU0s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QUUsQ0FBQztnQkFDZCxVQUFVLEdBQUcsR0FBRyxHQUFHLFVBQVUsQ0FBQztZQUMvQixDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN4QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQyxDQUFDO1FBQ0YsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSyxnQkFBZ0IsQ0FBQyxHQUFHO1FBQzNCLHlCQUF5QjtRQUN6QixJQUFJLEdBQUcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixpQ0FBaUM7UUFDakMsSUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RCx5REFBeUQ7WUFDekQsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN4RCxzQ0FBc0M7Z0JBQ3RDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDM0IsT0FBTyxHQUFHLENBQUM7Z0JBQ1osQ0FBQztZQUNGLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNaLENBQUM7Q0FFRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvZGUgZGVyaXZlZCBmcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9vc2thbnNhdmxpLzgyMjM4MlxuXG5leHBvcnQgY2xhc3MgRGVjaW1hbEZvcm1hdCB7XG5cblx0cHVibGljIHByZWZpeCA9ICcnO1xuXHRwdWJsaWMgc3VmZml4ID0gJyc7XG5cdHB1YmxpYyBjb21tYSA9IDA7XG5cdHB1YmxpYyBtaW5JbnQgPSAxO1xuXHRwdWJsaWMgbWluRnJhYyA9IDA7XG5cdHB1YmxpYyBtYXhGcmFjID0gMDtcblxuXHRjb25zdHJ1Y3Rvcihmb3JtYXRTdHI6IHN0cmluZykge1xuXG5cdFx0Ly8gZ2V0IHByZWZpeFxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWF0U3RyLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoZm9ybWF0U3RyLmNoYXJBdChpKSA9PSAnIycgfHwgZm9ybWF0U3RyLmNoYXJBdChpKSA9PSAnMCcpIHtcblx0XHRcdFx0dGhpcy5wcmVmaXggPSBmb3JtYXRTdHIuc3Vic3RyaW5nKDAsIGkpO1xuXHRcdFx0XHRmb3JtYXRTdHIgPSBmb3JtYXRTdHIuc3Vic3RyaW5nKGkpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBnZXQgc3VmZml4XG5cdFx0dGhpcy5zdWZmaXggPSBmb3JtYXRTdHIucmVwbGFjZSgvWyNdfFswXXxbLF18Wy5dL2csICcnKTtcblx0XHR2YXIgbnVtYmVyU3RyID0gZm9ybWF0U3RyLnJlcGxhY2UoL1teMCMsLl0vZywgJycpO1xuXG5cdFx0dmFyIGludFN0ciA9ICcnO1xuXHRcdHZhciBmcmFjU3RyID0gJyc7XG5cdFx0dmFyIHBvaW50ID0gbnVtYmVyU3RyLmluZGV4T2YoJy4nKTtcblx0XHRpZiAocG9pbnQgIT0gLTEpIHtcblx0XHRcdGludFN0ciA9IG51bWJlclN0ci5zdWJzdHJpbmcoMCwgcG9pbnQpO1xuXHRcdFx0ZnJhY1N0ciA9IG51bWJlclN0ci5zdWJzdHJpbmcocG9pbnQgKyAxKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aW50U3RyID0gbnVtYmVyU3RyO1xuXHRcdH1cblxuXHRcdHZhciBjb21tYVBvcyA9IGludFN0ci5sYXN0SW5kZXhPZignLCcpO1xuXHRcdGlmIChjb21tYVBvcyAhPSAtMSkge1xuXHRcdFx0dGhpcy5jb21tYSA9IGludFN0ci5sZW5ndGggLSAxIC0gY29tbWFQb3M7XG5cdFx0fVxuXG5cdFx0aW50U3RyID0gaW50U3RyLnJlcGxhY2UoL1ssXS9nLCAnJyk7IC8vIHJlbW92ZSBjb21tYXNcblxuXHRcdGZyYWNTdHIgPSBmcmFjU3RyLnJlcGxhY2UoL1ssXXxbLl0rL2csICcnKTtcblxuXHRcdHRoaXMubWF4RnJhYyA9IGZyYWNTdHIubGVuZ3RoO1xuXHRcdHZhciB0bXAgPSBpbnRTdHIucmVwbGFjZSgvW14wXS9nLCAnJyk7IC8vIHJlbW92ZSBhbGwgZXhjZXB0IHplcm9cblx0XHRpZiAodG1wLmxlbmd0aCA+IHRoaXMubWluSW50KSB7XG5cdFx0XHR0aGlzLm1pbkludCA9IHRtcC5sZW5ndGg7XG5cdFx0fVxuXHRcdHRtcCA9IGZyYWNTdHIucmVwbGFjZSgvW14wXS9nLCAnJyk7XG5cdFx0dGhpcy5taW5GcmFjID0gdG1wLmxlbmd0aDtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXQobnVtU3RyOiBzdHJpbmcpIHsgLy8gMTIyMy4wNiAtLT4gJDEsMjIzLjA2XG5cdFx0Ly8gcmVtb3ZlIHByZWZpeCwgc3VmZml4IGFuZCBjb21tYXNcblx0XHR2YXIgbnVtYmVyU3RyID0gdGhpcy5mb3JtYXRCYWNrKG51bVN0cilcblx0XHRcdC50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0Ly8gZG8gbm90IGZvcm1hdCBpZiBub3QgYSBudW1iZXJcblx0XHRpZiAoaXNOYU4obnVtYmVyU3RyKSB8fCBudW1iZXJTdHIubGVuZ3RoID09IDApIHtcblx0XHRcdHJldHVybiBudW1TdHI7XG5cdFx0fVxuXG5cdFx0Ly9zY2llbnRpZmljIG51bWJlcnNcblx0XHR2YXIgcG9zaXRpb25lID0gbnVtYmVyU3RyLmluZGV4T2YoXCJlXCIpO1xuXHRcdGlmIChwb3NpdGlvbmUgIT0gLTEpIHtcblx0XHRcdHZhciBuID0gTnVtYmVyKG51bWJlclN0cik7XG5cdFx0XHQvLyBpZiAobiA9PSBcIkluZmluaXR5XCIgfHwgbiA9PSBcIi1JbmZpbml0eVwiKSB7XG5cdFx0XHQvL1x0cmV0dXJuIG51bWJlclN0cjtcblx0XHRcdC8vIH1cblx0XHRcdG51bWJlclN0ciA9IG4gKyBcIlwiO1xuXHRcdFx0aWYgKG51bWJlclN0ci5pbmRleE9mKCdlJykgIT0gLTEpIHtcblx0XHRcdFx0cmV0dXJuIG51bWJlclN0cjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR2YXIgbmVnYXRpdmUgPSBmYWxzZTtcblx0XHQvLyByZW1vdmUgc2lnblxuXHRcdGlmIChudW1iZXJTdHIuY2hhckF0KDApID09ICctJykge1xuXHRcdFx0bmVnYXRpdmUgPSB0cnVlO1xuXHRcdFx0bnVtYmVyU3RyID0gbnVtYmVyU3RyLnN1YnN0cmluZygxKTtcblx0XHR9IGVsc2UgaWYgKG51bWJlclN0ci5jaGFyQXQoMCkgPT0gJysnKSB7XG5cdFx0XHRudW1iZXJTdHIgPSBudW1iZXJTdHIuc3Vic3RyaW5nKDEpO1xuXHRcdH1cblxuXHRcdHZhciBwb2ludCA9IG51bWJlclN0ci5pbmRleE9mKCcuJyk7IC8vIHBvc2l0aW9uIG9mIHBvaW50IGNoYXJhY3RlclxuXHRcdHZhciBpbnRTdHIgPSAnJztcblx0XHR2YXIgZnJhY1N0ciA9ICcnO1xuXHRcdGlmIChwb2ludCAhPSAtMSkge1xuXHRcdFx0aW50U3RyID0gbnVtYmVyU3RyLnN1YnN0cmluZygwLCBwb2ludCk7XG5cdFx0XHRmcmFjU3RyID0gbnVtYmVyU3RyLnN1YnN0cmluZyhwb2ludCArIDEpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbnRTdHIgPSBudW1iZXJTdHI7XG5cdFx0fVxuXHRcdGZyYWNTdHIgPSBmcmFjU3RyLnJlcGxhY2UoL1suXS8sICcnKTsgLy8gcmVtb3ZlIG90aGVyIHBvaW50IGNoYXJhY3RlcnNcblxuXHRcdHZhciBpc1BlcmNlbnRhZ2UgPSB0aGlzLnN1ZmZpeCAmJiB0aGlzLnN1ZmZpeC5jaGFyQXQoMCkgPT09ICclJztcblx0XHQvLyBpZiBwZXJjZW50YWdlLCBudW1iZXIgd2lsbCBiZSBtdWx0aXBsaWVkIGJ5IDEwMC5cblx0XHR2YXIgbWluSW50ID0gdGhpcy5taW5JbnQsIG1pbkZyYWMgPSB0aGlzLm1pbkZyYWMsIG1heEZyYWMgPSB0aGlzLm1heEZyYWM7XG5cdFx0aWYgKGlzUGVyY2VudGFnZSkge1xuXHRcdFx0bWluSW50IC09IDI7XG5cdFx0XHRtaW5GcmFjICs9IDI7XG5cdFx0XHRtYXhGcmFjICs9IDI7XG5cdFx0fVxuXG5cdFx0aWYgKGZyYWNTdHIubGVuZ3RoID4gbWF4RnJhYykgeyAvLyByb3VuZFxuXHRcdFx0Ly9jYXNlIDYxNDNcblx0XHRcdHZhciBudW0yID0gbmV3IE51bWJlcignMC4nICsgZnJhY1N0cik7XG5cdFx0XHR2YXIgbnVtID0gKG1heEZyYWMgPT0gMCkgPyBNYXRoLnJvdW5kKG51bTIudmFsdWVPZigpKSA6IG51bTIudG9GaXhlZChtYXhGcmFjKTtcblx0XHRcdC8vIHRvRml4ZWQgbWV0aG9kIGhhcyBidWdzIG9uIElFICgwLjcgLS0+IDApXG5cdFx0XHRmcmFjU3RyID0gbnVtLnRvU3RyaW5nKDEwKVxuXHRcdFx0XHQuc3Vic3RyKDIpO1xuXHRcdFx0dmFyIGMgPSAoTnVtYmVyKG51bSkgPj0gMSkgPyAxIDogMDsgLy9jYXJyeVxuXHRcdFx0dmFyIHgsIGkgPSBpbnRTdHIubGVuZ3RoIC0gMTtcblx0XHRcdHdoaWxlIChjKSB7IC8vaW5jcmVtZW50IGludFN0clxuXHRcdFx0XHRpZiAoaSA9PSAtMSkge1xuXHRcdFx0XHRcdGludFN0ciA9ICcxJyArIGludFN0cjtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR4ID0gaW50U3RyLmNoYXJBdChpKTtcblx0XHRcdFx0XHRpZiAoeCA9PSA5KSB7XG5cdFx0XHRcdFx0XHR4ID0gJzAnO1xuXHRcdFx0XHRcdFx0YyA9IDE7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHggPSAoKyt4KSArICcnO1xuXHRcdFx0XHRcdFx0YyA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGludFN0ciA9IGludFN0ci5zdWJzdHJpbmcoMCwgaSkgKyB4ICsgaW50U3RyLnN1YnN0cmluZyhpICsgMSwgaW50U3RyLmxlbmd0aCk7XG5cdFx0XHRcdFx0aS0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAodmFyIGkgPSBmcmFjU3RyLmxlbmd0aDsgaSA8IG1pbkZyYWM7IGkrKykgeyAvLyBpZiBtaW5GcmFjPTQgdGhlbiAxLjEyIC0tPiAxLjEyMDBcblx0XHRcdGZyYWNTdHIgPSBmcmFjU3RyICsgJzAnO1xuXHRcdH1cblx0XHR3aGlsZSAoZnJhY1N0ci5sZW5ndGggPiBtaW5GcmFjICYmIGZyYWNTdHIuY2hhckF0KGZyYWNTdHIubGVuZ3RoIC0gMSkgPT0gJzAnKSB7IC8vIGlmIG1pbkludD00IHRoZW4gMDAwMzQgLS0+IDAwMzQpXG5cdFx0XHRmcmFjU3RyID0gZnJhY1N0ci5zdWJzdHJpbmcoMCwgZnJhY1N0ci5sZW5ndGggLSAxKTtcblx0XHR9XG5cblx0XHRmb3IgKHZhciBpID0gaW50U3RyLmxlbmd0aDsgaSA8IG1pbkludDsgaSsrKSB7IC8vIGlmIG1pbkludD00IHRoZW4gMDM0IC0tPiAwMDM0XG5cdFx0XHRpbnRTdHIgPSAnMCcgKyBpbnRTdHI7XG5cdFx0fVxuXHRcdHdoaWxlIChpbnRTdHIubGVuZ3RoID4gbWluSW50ICYmIGludFN0ci5jaGFyQXQoMCkgPT0gJzAnKSB7IC8vIGlmIG1pbkludD00IHRoZW4gMDAwMzQgLS0+IDAwMzQpXG5cdFx0XHRpbnRTdHIgPSBpbnRTdHIuc3Vic3RyaW5nKDEpO1xuXHRcdH1cblxuXHRcdGlmIChpc1BlcmNlbnRhZ2UpIHsgLy8gbXVsdGlwbHkgYnkgMTAwXG5cdFx0XHRpbnRTdHIgKz0gZnJhY1N0ci5zdWJzdHJpbmcoMCwgMik7XG5cdFx0XHRmcmFjU3RyID0gZnJhY1N0ci5zdWJzdHJpbmcoMik7XG5cdFx0fVxuXG5cdFx0dmFyIGogPSAwO1xuXHRcdGZvciAodmFyIGkgPSBpbnRTdHIubGVuZ3RoOyBpID4gMDsgaS0tKSB7IC8vIGFkZCBjb21tYXNcblx0XHRcdGlmIChqICE9IDAgJiYgaiAlIHRoaXMuY29tbWEgPT0gMCkge1xuXHRcdFx0XHRpbnRTdHIgPSBpbnRTdHIuc3Vic3RyaW5nKDAsIGkpICsgJywnICsgaW50U3RyLnN1YnN0cmluZyhpKTtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHR9XG5cdFx0XHRqKys7XG5cdFx0fVxuXG5cdFx0dmFyIGZvcm1hdHRlZFZhbHVlO1xuXHRcdGlmIChmcmFjU3RyLmxlbmd0aCA+IDApIHtcblx0XHRcdGZvcm1hdHRlZFZhbHVlID0gdGhpcy5wcmVmaXggKyBpbnRTdHIgKyAnLicgKyBmcmFjU3RyICsgdGhpcy5zdWZmaXg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvcm1hdHRlZFZhbHVlID0gdGhpcy5wcmVmaXggKyBpbnRTdHIgKyB0aGlzLnN1ZmZpeDtcblx0XHR9XG5cblx0XHRpZiAobmVnYXRpdmUpIHtcblx0XHRcdGZvcm1hdHRlZFZhbHVlID0gJy0nICsgZm9ybWF0dGVkVmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZvcm1hdHRlZFZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBmb3JtYXR0ZWQgdmFsdWUgYmFjayB0byBub24tZm9ybWF0dGVkIHZhbHVlXG5cdCAqIEBtZXRob2RPZiBEZWNpbWFsRm9ybWF0XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBmTnVtYmVyU3RyIEZvcm1hdHRlZCBudW1iZXJcblx0ICogQHJldHVybiB7U3RyaW5nfSBPcmlnaW5hbCBudW1iZXJcblx0ICogQGF1dGhvciBPc2thbiBTYXZsaVxuXHQgKi9cblx0cHJpdmF0ZSBmb3JtYXRCYWNrKGZOdW1TdHIpIHsgLy8gJDEsMjIzLjA2IC0tPiAxMjIzLjA2XG5cdFx0Zk51bVN0ciArPSAnJzsgLy9lbnN1cmUgaXQgaXMgc3RyaW5nXG5cdFx0aWYgKCFmTnVtU3RyKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fSAvL2RvIG5vdCByZXR1cm4gdW5kZWZpbmVkIG9yIG51bGxcblx0XHRpZiAoIWlzTmFOKGZOdW1TdHIpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXROdW1lcmljU3RyaW5nKGZOdW1TdHIpO1xuXHRcdH1cblx0XHR2YXIgZk51bWJlclN0ciA9IGZOdW1TdHI7XG5cdFx0dmFyIG5lZ2F0aXZlID0gZmFsc2U7XG5cdFx0aWYgKGZOdW1TdHIuY2hhckF0KDApID09ICctJykge1xuXHRcdFx0Zk51bWJlclN0ciA9IGZOdW1iZXJTdHIuc3Vic3RyKDEpO1xuXHRcdFx0bmVnYXRpdmUgPSB0cnVlO1xuXHRcdH1cblx0XHR2YXIgcEluZGV4ID0gZk51bWJlclN0ci5pbmRleE9mKHRoaXMucHJlZml4KTtcblx0XHR2YXIgc0luZGV4ID0gKHRoaXMuc3VmZml4ID09ICcnKSA/IGZOdW1iZXJTdHIubGVuZ3RoIDogZk51bWJlclN0ci5pbmRleE9mKHRoaXMuc3VmZml4LCB0aGlzLnByZWZpeC5sZW5ndGggKyAxKTtcblx0XHRpZiAocEluZGV4ID09IDAgJiYgc0luZGV4ID4gMCkge1xuXHRcdFx0Ly8gcmVtb3ZlIHN1ZmZpeFxuXHRcdFx0Zk51bWJlclN0ciA9IGZOdW1iZXJTdHIuc3Vic3RyKDAsIHNJbmRleCk7XG5cdFx0XHQvLyByZW1vdmUgcHJlZml4XG5cdFx0XHRmTnVtYmVyU3RyID0gZk51bWJlclN0ci5zdWJzdHIodGhpcy5wcmVmaXgubGVuZ3RoKTtcblx0XHRcdC8vIHJlbW92ZSBjb21tYXNcblx0XHRcdGZOdW1iZXJTdHIgPSBmTnVtYmVyU3RyLnJlcGxhY2UoLywvZywgJycpO1xuXHRcdFx0aWYgKG5lZ2F0aXZlKSB7XG5cdFx0XHRcdGZOdW1iZXJTdHIgPSAnLScgKyBmTnVtYmVyU3RyO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFpc05hTihmTnVtYmVyU3RyKSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXROdW1lcmljU3RyaW5nKGZOdW1iZXJTdHIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZk51bVN0cjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb24gV2Ugc2hvdWxkbid0IHJldHVybiBzdHJpbmdzIGxpa2UgMS4wMDAgaW4gZm9ybWF0QmFjayBtZXRob2QuXG5cdCAqIEhvd2V2ZXIsIHVzaW5nIG9ubHkgTnVtYmVyKHN0cikgaXMgbm90IGVub3VnaCwgYmVjYXVzZSBpdCBvbWl0cyAuIGluIGJpZyBudW1iZXJzXG5cdCAqIGxpa2UgMjM0MjM0MjM0MjMzNDIyMzQuMzQgPT4gMjM0MjM0MjM0MjMzNDIyMzYgLiBUaGVyZSdzIGEgY29uZmxpY3QgaW4gY2FzZXNcblx0ICogNjE0MyBhbmQgNjU0MS5cblx0ICogQG1ldGhvZE9mIERlY2ltYWxGb3JtYXRcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0ciBOdW1iZXJpYyBzdHJpbmdcblx0ICogQHJldHVybiB7U3RyaW5nfSBDb3JyZWN0ZWQgbnVtZXJpYyBzdHJpbmdcblx0ICogQGF1dGhvciBTZXJkYXIgQmljZXJcblx0ICovXG5cdHByaXZhdGUgZ2V0TnVtZXJpY1N0cmluZyhzdHIpIHtcblx0XHQvL2ZpcnN0IGNvbnZlcnQgdG8gbnVtYmVyXG5cdFx0dmFyIG51bSA9IG5ldyBOdW1iZXIoc3RyKTtcblx0XHQvL2NoZWNrIGlmIHRoZXJlIGlzIGEgbWlzc2luZyBkb3Rcblx0XHR2YXIgbnVtU3RyID0gbnVtICsgJyc7XG5cdFx0aWYgKHN0ci5pbmRleE9mKCcuJykgPiAtMSAmJiBudW1TdHIuaW5kZXhPZignLicpIDwgMCkge1xuXHRcdFx0Ly9jaGVjayBpZiBvcmlnaW5hbCBzdHJpbmcgaGFzIGFsbCB6ZXJvcyBhZnRlciBkb3Qgb3Igbm90XG5cdFx0XHRmb3IgKHZhciBpID0gc3RyLmluZGV4T2YoJy4nKSArIDE7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Ly9pZiBub3QsIHRoaXMgbWVhbnMgd2UgbG9zdCBwcmVjaXNpb25cblx0XHRcdFx0aWYgKHN0ci5jaGFyQXQoaSkgIT09ICcwJykge1xuXHRcdFx0XHRcdHJldHVybiBzdHI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBudW1TdHI7XG5cdFx0fVxuXHRcdHJldHVybiBzdHI7XG5cdH1cblxufVxuIl19