MathUtil.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/mk/utils/MathUtil.js';
  5. var __require = nodeEnv ? function (request) {
  6. return cc.require(request);
  7. } : function (request) {
  8. return __quick_compile_project__.require(request, __filename);
  9. };
  10. function __define (exports, require, module) {
  11. if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
  12. cc._RF.push(module, '2e942sG6JJJpaWgvlGJiuOO', 'MathUtil');
  13. // script/mk/utils/MathUtil.ts
  14. "use strict";
  15. Object.defineProperty(exports, "__esModule", { value: true });
  16. /**
  17. * 数学计算工具类
  18. * @author 冯聪
  19. */
  20. var MathUtil = /** @class */ (function () {
  21. function MathUtil() {
  22. //---------------------------------------------------------科学计数法-----------------------------------------------------
  23. /**数字单位 */
  24. this.numUnit = { 4: "万", 8: "亿", 12: "兆", 16: "万兆", 20: "亿兆", 24: "兆兆", 28: "万兆兆", 32: "亿兆兆", 36: "兆兆兆" };
  25. }
  26. /** 计算两点之间距离 */
  27. MathUtil.prototype.dis = function (x1, y1, x2, y2) {
  28. return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
  29. };
  30. /**
  31. * 取一个区间内随机整数
  32. * @param n 开始位置
  33. * @param m 结束位置
  34. * @param ifInt 是否是整数
  35. * @returns 返回的随机整数
  36. */
  37. MathUtil.prototype.random = function (n, m, ifInt) {
  38. if (ifInt === void 0) { ifInt = true; }
  39. var random = n;
  40. if (ifInt) {
  41. random = Math.floor(Math.random() * (m - n + 1) + n);
  42. }
  43. else {
  44. random = Math.random() * (m - n) + n;
  45. }
  46. return random;
  47. };
  48. /**
  49. * 超大数值加法运算 忽略小数部分
  50. * @param a
  51. * @param b
  52. */
  53. MathUtil.prototype.addition = function (a, b) {
  54. var res = '', temp = 0;
  55. var a1 = a.split('.')[0].split('');
  56. var b1 = b.split('.')[0].split('');
  57. while (a1.length || b1.length || temp) {
  58. temp += ~~a1.pop() + ~~b1.pop();
  59. res = (temp % 10) + res;
  60. temp = temp > 9;
  61. }
  62. return res.replace(/^0+/, '');
  63. };
  64. /**
  65. * 超大数值减法运算 忽略小数部分
  66. * @param a
  67. * @param b
  68. */
  69. MathUtil.prototype.subtraction = function (a, b) {
  70. a = a.split('.')[0].split('');
  71. b = b.split('.')[0].split('');
  72. var aMaxb = a.length > b.length;
  73. if (a.length == b.length) {
  74. for (var i = 0, len = a.length; i < len; i++) {
  75. if (a[i] == b[i])
  76. continue;
  77. aMaxb = a[i] > b[i];
  78. break;
  79. }
  80. }
  81. if (!aMaxb)
  82. a = [b, b = a][0];
  83. var result = '';
  84. while (a.length) {
  85. var temp = parseInt(a.pop()) - parseInt(b.pop() || 0);
  86. if (temp >= 0)
  87. result = temp + result;
  88. else {
  89. result = temp + 10 + result;
  90. a[a.length - 1]--;
  91. }
  92. }
  93. result = (aMaxb ? '' : '-') + result.replace(/^0*/g, '');
  94. if (result == '-') {
  95. result = '0';
  96. }
  97. return result;
  98. };
  99. /**
  100. * 超大数值高位对比 忽略小数部分
  101. * @param a
  102. * @param b
  103. */
  104. MathUtil.prototype.contrastNumber = function (a, b) {
  105. a = a.split('.')[0].split('');
  106. b = b.split('.')[0].split('');
  107. var aMaxb = a.length > b.length;
  108. if (a.length == b.length) {
  109. for (var i = 0, len = a.length; i < len; i++) {
  110. if (a[i] == b[i])
  111. continue;
  112. aMaxb = a[i] > b[i];
  113. break;
  114. }
  115. }
  116. if (!aMaxb)
  117. a = [b, b = a][0];
  118. var result = '';
  119. while (a.length) {
  120. var temp = parseInt(a.pop()) - parseInt(b.pop() || 0);
  121. if (temp >= 0)
  122. result = temp + result;
  123. else {
  124. result = temp + 10 + result;
  125. a[a.length - 1]--;
  126. }
  127. }
  128. if (a === b)
  129. return true;
  130. return Boolean(aMaxb);
  131. };
  132. /**
  133. * 数值乘法
  134. * @param a
  135. * @param b
  136. */
  137. MathUtil.prototype.accMuls = function (a, b) {
  138. var arra = a.split('').reverse(), arrb = b.split('').reverse(), lena = arra.length, lenb = arrb.length, result = Array(lena + lenb + 1).join('0').split('');
  139. arra.map(function (itema, indexa) {
  140. arrb.map(function (itemb, indexb) {
  141. result[indexa + indexb] = +result[indexa + indexb] + itema * itemb;
  142. });
  143. });
  144. result.map(function (item, index) {
  145. if (item >= 10) {
  146. result[index + 1] = ~~result[index + 1] + ~~(result[index] / 10);
  147. result[index] %= 10;
  148. }
  149. });
  150. return result.reverse().join('').replace(/^0+/, '');
  151. };
  152. /**
  153. * 超大数值乘法
  154. * @param arg1
  155. * @param arg2
  156. */
  157. MathUtil.prototype.accMul = function (arg1, arg2) {
  158. var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
  159. try {
  160. m += s1.split(".")[1].length;
  161. }
  162. catch (e) { }
  163. try {
  164. m += s2.split(".")[1].length;
  165. }
  166. catch (e) { }
  167. var targe = this.accMuls(s1.replace(".", ""), s2.replace(".", ""));
  168. return this.accDiv(targe, Math.pow(10, m).toString());
  169. };
  170. /** 科学技术法转为数值字符串形式 */
  171. MathUtil.prototype.toNonExponential = function (num) {
  172. return num.toLocaleString().replace(/[,]/g, '');
  173. };
  174. /**
  175. * 超大数值除法运算
  176. * @param arg1
  177. * @param arg2
  178. */
  179. MathUtil.prototype.accDiv = function (arg1, arg2) {
  180. var t1 = 0, t2 = 0, t3 = 0, r1, r2;
  181. try {
  182. t1 = arg1.toString().split(".")[1].length;
  183. }
  184. catch (e) { }
  185. try {
  186. t2 = arg2.toString().split(".")[1].length;
  187. }
  188. catch (e) { }
  189. r1 = Number(arg1.toString().replace(".", ""));
  190. r2 = Number(arg2.toString().replace(".", ""));
  191. if (r2 == 0)
  192. return '0';
  193. var result = String(r1 / r2);
  194. try {
  195. t3 = result.toString().split(".")[1].length;
  196. }
  197. catch (e) { }
  198. var index = t2 - t1 - t3;
  199. if (index < 0) {
  200. result = result.replace(".", "");
  201. while (result.length <= Math.abs(index)) {
  202. result = '0' + result;
  203. }
  204. var start = result.substring(0, result.length + index);
  205. var end = result.substring(result.length + index, result.length);
  206. result = start + '.' + end;
  207. return this.toNonExponential(Number(result));
  208. }
  209. else if (index > 0) {
  210. result = result.replace(".", "");
  211. while (result.length <= Math.abs(index)) {
  212. result += '0';
  213. }
  214. return this.toNonExponential(Number(result));
  215. }
  216. else
  217. return this.toNonExponential(Number(result.replace(".", "")));
  218. };
  219. /**
  220. * 数值格式化
  221. * @param value
  222. * @param showDeci
  223. */
  224. MathUtil.prototype.format = function (value, showDeci) {
  225. if (showDeci === void 0) { showDeci = true; }
  226. var a = value.split('.')[0];
  227. var b;
  228. for (var i in this.numUnit) {
  229. var ii = Number(i);
  230. if (a.length - 1 >= ii) {
  231. if (showDeci) {
  232. var deci = a.slice(a.length - ii, a.length - ii + 1);
  233. if (Number(deci) >= 1) {
  234. b = a.slice(0, a.length - ii) + "." + deci + this.numUnit[ii];
  235. }
  236. else {
  237. b = a.slice(0, a.length - ii) + this.numUnit[ii];
  238. }
  239. }
  240. else {
  241. b = a.slice(0, a.length - ii) + this.numUnit[ii];
  242. }
  243. }
  244. }
  245. ;
  246. if (!b)
  247. return a;
  248. return b;
  249. };
  250. return MathUtil;
  251. }());
  252. exports.default = MathUtil;
  253. cc._RF.pop();
  254. }
  255. if (nodeEnv) {
  256. __define(__module.exports, __require, __module);
  257. }
  258. else {
  259. __quick_compile_project__.registerModuleFunc(__filename, function () {
  260. __define(__module.exports, __require, __module);
  261. });
  262. }
  263. })();
  264. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcc2NyaXB0XFxta1xcdXRpbHNcXE1hdGhVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7OztHQUdHO0FBQ0g7SUFBQTtRQXlCSSxxSEFBcUg7UUFDckgsVUFBVTtRQUNGLFlBQU8sR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUM7SUErTWpILENBQUM7SUF4T0csZUFBZTtJQUNmLHNCQUFHLEdBQUgsVUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQ2QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7OztNQU1FO0lBQ0sseUJBQU0sR0FBYixVQUFjLENBQVMsRUFBRSxDQUFTLEVBQUUsS0FBcUI7UUFBckIsc0JBQUEsRUFBQSxZQUFxQjtRQUNyRCxJQUFJLE1BQU0sR0FBVyxDQUFDLENBQUM7UUFDdkIsSUFBSSxLQUFLLEVBQUU7WUFDUCxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3hEO2FBQ0k7WUFDRCxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMs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LENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQ3BEO2lCQUNKO3FCQUNJO29CQUNELENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ3BEO2FBQ0o7U0FDSjtRQUFBLENBQUM7UUFDRixJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUNMLGVBQUM7QUFBRCxDQTFPQSxBQTBPQyxJQUFBIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbi8qKlxyXG4gKiDmlbDlraborqHnrpflt6XlhbfnsbtcclxuICogQGF1dGhvciDlhq/ogapcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hdGhVdGlsIHtcclxuXHJcbiAgICAvKiog6K6h566X5Lik54K55LmL6Ze06Led56a7ICovXHJcbiAgICBkaXMoeDEsIHkxLCB4MiwgeTIpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coeDEgLSB4MiwgMikgKyBNYXRoLnBvdyh5MSAtIHkyLCAyKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIOWPluS4gOS4quWMuumXtOWGhemaj+acuuaVtOaVsFxyXG4gICAgKiBAcGFyYW0gbiDlvIDlp4vkvY3nva5cclxuICAgICogQHBhcmFtIG0g57uT5p2f5L2N572uXHJcbiAgICAqIEBwYXJhbSBpZkludCDmmK/lkKbmmK/mlbTmlbBcclxuICAgICogQHJldHVybnMg6L+U5Zue55qE6ZqP5py65pW05pWwXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHJhbmRvbShuOiBudW1iZXIsIG06IG51bWJlciwgaWZJbnQ6IGJvb2xlYW4gPSB0cnVlKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgcmFuZG9tOiBudW1iZXIgPSBuO1xyXG4gICAgICAgIGlmIChpZkludCkge1xyXG4gICAgICAgICAgICByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobSAtIG4gKyAxKSArIG4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmFuZG9tID0gTWF0aC5yYW5kb20oKSAqIChtIC0gbikgKyBuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmFuZG9tO1xyXG4gICAgfVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t56eR5a2m6K6h5pWw5rOVLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8qKuaVsOWtl+WNleS9jSAqL1xyXG4gICAgcHJpdmF0ZSBudW1Vbml0ID0geyA0OiBcIuS4h1wiLCA4OiBcIuS6v1wiLCAxMjogXCLlhYZcIiwgMTY6IFwi5LiH5YWGXCIsIDIwOiBcIuS6v+WFhlwiLCAyNDogXCLlhYblhYZcIiwgMjg6IFwi5LiH5YWG5YWGXCIsIDMyOiBcIuS6v+WFhuWFhlwiLCAzNjogXCLlhYblhYblhYZcIiB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog6LaF5aSn5pWw5YC85Yqg5rOV6L+Q566XICDlv73nlaXlsI/mlbDpg6jliIZcclxuICAgICAqIEBwYXJhbSBhXHJcbiAgICAgKiBAcGFyYW0gYlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkaXRpb24oYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciByZXM6IGFueSA9ICcnLFxyXG4gICAgICAgICAgICB0ZW1wOiBhbnkgPSAwO1xyXG4gICAgICAgIGxldCBhMSA9IGEuc3BsaXQoJy4nKVswXS5zcGxpdCgnJyk7XHJcbiAgICAgICAgbGV0IGIxID0gYi5zcGxpdCgnLicpWzBdLnNwbGl0KCcnKTtcclxuICAgICAgICB3aGlsZSAoYTEubGVuZ3RoIHx8IGIxLmxlbmd0aCB8fCB0ZW1wKSB7XHJcbiAgICAgICAgICAgIHRlbXAgKz0gfn5hMS5wb3AoKSArIH5+YjEucG9wKCk7XHJcbiAgICAgICAgICAgIHJlcyA9ICh0ZW1wICUgMTApICsgcmVzO1xyXG4gICAgICAgICAgICB0ZW1wID0gdGVtcCA+IDk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXMucmVwbGFjZSgvXjArLywgJycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6LaF5aSn5pWw5YC85YeP5rOV6L+Q566XICDlv73nlaXlsI/mlbDpg6jliIZcclxuICAgICAqIEBwYXJhbSBhXHJcbiAgICAgKiBAcGFyYW0gYlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3VidHJhY3Rpb24oYTogYW55LCBiOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGEgPSBhLnNwbGl0KCcuJylbMF0uc3BsaXQoJycpO1xyXG4gICAgICAgIGIgPSBiLnNwbGl0KCcuJylbMF0uc3BsaXQoJycpO1xyXG4gICAgICAgIHZhciBhTWF4YiA9IGEubGVuZ3RoID4gYi5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGEubGVuZ3RoID09IGIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYVtpXSA9PSBiW2ldKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGFNYXhiID0gYVtpXSA+IGJbaV07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWFNYXhiKSBhID0gW2IsIGIgPSBhXVswXTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgd2hpbGUgKGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHZhciB0ZW1wID0gcGFyc2VJbnQoYS5wb3AoKSkgLSBwYXJzZUludChiLnBvcCgpIHx8IDApO1xyXG4gICAgICAgICAgICBpZiAodGVtcCA+PSAwKSByZXN1bHQgPSB0ZW1wICsgcmVzdWx0O1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRlbXAgKyAxMCArIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIGFbYS5sZW5ndGggLSAxXS0tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdCA9IChhTWF4YiA/ICcnIDogJy0nKSArIHJlc3VsdC5yZXBsYWNlKC9eMCovZywgJycpO1xyXG4gICAgICAgIGlmIChyZXN1bHQgPT0gJy0nKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9ICcwJ1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6LaF5aSn5pWw5YC86auY5L2N5a+55q+UICDlv73nlaXlsI/mlbDpg6jliIZcclxuICAgICAqIEBwYXJhbSBhXHJcbiAgICAgKiBAcGFyYW0gYlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29udHJhc3ROdW1iZXIoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBhID0gYS5zcGxpdCgnLicpWzBdLnNwbGl0KCcnKTtcclxuICAgICAgICBiID0gYi5zcGxpdCgnLicpWzBdLnNwbGl0KCcnKTtcclxuICAgICAgICB2YXIgYU1heGIgPSBhLmxlbmd0aCA+IGIubGVuZ3RoO1xyXG4gICAgICAgIGlmIChhLmxlbmd0aCA9PSBiLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFbaV0gPT0gYltpXSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBhTWF4YiA9IGFbaV0gPiBiW2ldO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFhTWF4YikgYSA9IFtiLCBiID0gYV1bMF07XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9ICcnO1xyXG4gICAgICAgIHdoaWxlIChhLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB2YXIgdGVtcCA9IHBhcnNlSW50KGEucG9wKCkpIC0gcGFyc2VJbnQoYi5wb3AoKSB8fCAwKTtcclxuICAgICAgICAgICAgaWYgKHRlbXAgPj0gMCkgcmVzdWx0ID0gdGVtcCArIHJlc3VsdDtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0ZW1wICsgMTAgKyByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICBhW2EubGVuZ3RoIC0gMV0tLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oYU1heGIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pWw5YC85LmY5rOVXHJcbiAgICAgKiBAcGFyYW0gYSBcclxuICAgICAqIEBwYXJhbSBiXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY2NNdWxzKGEsIGIpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBhcnJhID0gYS5zcGxpdCgnJykucmV2ZXJzZSgpLFxyXG4gICAgICAgICAgICBhcnJiID0gYi5zcGxpdCgnJykucmV2ZXJzZSgpLFxyXG4gICAgICAgICAgICBsZW5hID0gYXJyYS5sZW5ndGgsXHJcbiAgICAgICAgICAgIGxlbmIgPSBhcnJiLmxlbmd0aCxcclxuICAgICAgICAgICAgcmVzdWx0OiBhbnkgPSBBcnJheShsZW5hICsgbGVuYiArIDEpLmpvaW4oJzAnKS5zcGxpdCgnJyk7XHJcbiAgICAgICAgYXJyYS5tYXAoKGl0ZW1hLCBpbmRleGEpID0+IHtcclxuICAgICAgICAgICAgYXJyYi5tYXAoKGl0ZW1iLCBpbmRleGIpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtpbmRleGEgKyBpbmRleGJdID0gK3Jlc3VsdFtpbmRleGEgKyBpbmRleGJdICsgaXRlbWEgKiBpdGVtYjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmVzdWx0Lm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gPj0gMTApIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtpbmRleCArIDFdID0gfn5yZXN1bHRbaW5kZXggKyAxXSArIH5+KHJlc3VsdFtpbmRleF0gLyAxMCk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaW5kZXhdICU9IDEwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXZlcnNlKCkuam9pbignJykucmVwbGFjZSgvXjArLywgJycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6LaF5aSn5pWw5YC85LmY5rOVXHJcbiAgICAgKiBAcGFyYW0gYXJnMVxyXG4gICAgICogQHBhcmFtIGFyZzJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjY011bChhcmcxOiBzdHJpbmcsIGFyZzI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIG0gPSAwLCBzMSA9IGFyZzEudG9TdHJpbmcoKSwgczIgPSBhcmcyLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgdHJ5IHsgbSArPSBzMS5zcGxpdChcIi5cIilbMV0ubGVuZ3RoIH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgIHRyeSB7IG0gKz0gczIuc3BsaXQoXCIuXCIpWzFdLmxlbmd0aCB9IGNhdGNoIChlKSB7IH1cclxuICAgICAgICBsZXQgdGFyZ2UgPSB0aGlzLmFjY011bHMoczEucmVwbGFjZShcIi5cIiwgXCJcIiksIHMyLnJlcGxhY2UoXCIuXCIsIFwiXCIpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNjRGl2KHRhcmdlLCBNYXRoLnBvdygxMCwgbSkudG9TdHJpbmcoKSlcclxuICAgIH1cclxuXHJcbiAgICAvKiog56eR5a2m5oqA5pyv5rOV6L2s5Li65pWw5YC85a2X56ym5Liy5b2i5byPICovXHJcbiAgICBwdWJsaWMgdG9Ob25FeHBvbmVudGlhbChudW06IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIG51bS50b0xvY2FsZVN0cmluZygpLnJlcGxhY2UoL1ssXS9nLCAnJylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOi2heWkp+aVsOWAvOmZpOazlei/kOeul1xyXG4gICAgICogQHBhcmFtIGFyZzFcclxuICAgICAqIEBwYXJhbSBhcmcyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY2NEaXYoYXJnMTogc3RyaW5nLCBhcmcyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cclxuICAgICAgICB2YXIgdDEgPSAwLCB0MiA9IDAsIHQzID0gMCwgcjEsIHIyO1xyXG5cclxuICAgICAgICB0cnkgeyB0MSA9IGFyZzEudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0ubGVuZ3RoIH0gY2F0Y2ggKGUpIHsgfVxyXG5cclxuICAgICAgICB0cnkgeyB0MiA9IGFyZzIudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0ubGVuZ3RoIH0gY2F0Y2ggKGUpIHsgfVxyXG5cclxuICAgICAgICByMSA9IE51bWJlcihhcmcxLnRvU3RyaW5nKCkucmVwbGFjZShcIi5cIiwgXCJcIikpXHJcblxyXG4gICAgICAgIHIyID0gTnVtYmVyKGFyZzIudG9TdHJpbmcoKS5yZXBsYWNlKFwiLlwiLCBcIlwiKSlcclxuXHJcbiAgICAgICAgaWYgKHIyID09IDApXHJcbiAgICAgICAgICAgIHJldHVybiAnMCc7XHJcblxyXG4gICAgICAgIHZhciByZXN1bHQgPSBTdHJpbmcocjEgLyByMik7XHJcblxyXG4gICAgICAgIHRyeSB7IHQzID0gcmVzdWx0LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdLmxlbmd0aCB9IGNhdGNoIChlKSB7IH1cclxuXHJcbiAgICAgICAgdmFyIGluZGV4ID0gdDIgLSB0MSAtIHQzO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKFwiLlwiLCBcIlwiKTtcclxuXHJcbiAgICAgICAgICAgIHdoaWxlIChyZXN1bHQubGVuZ3RoIDw9IE1hdGguYWJzKGluZGV4KSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gJzAnICsgcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgc3RhcnQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIHJlc3VsdC5sZW5ndGggKyBpbmRleCk7XHJcbiAgICAgICAgICAgIHZhciBlbmQgPSByZXN1bHQuc3Vic3RyaW5nKHJlc3VsdC5sZW5ndGggKyBpbmRleCwgcmVzdWx0Lmxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgICByZXN1bHQgPSBzdGFydCArICcuJyArIGVuZDtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvTm9uRXhwb25lbnRpYWwoTnVtYmVyKHJlc3VsdCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpbmRleCA+IDApIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoXCIuXCIsIFwiXCIpO1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKHJlc3VsdC5sZW5ndGggPD0gTWF0aC5hYnMoaW5kZXgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJzAnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvTm9uRXhwb25lbnRpYWwoTnVtYmVyKHJlc3VsdCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHJldHVybiB0aGlzLnRvTm9uRXhwb25lbnRpYWwoTnVtYmVyKHJlc3VsdC5yZXBsYWNlKFwiLlwiLCBcIlwiKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pWw5YC85qC85byP5YyWXHJcbiAgICAgKiBAcGFyYW0gdmFsdWVcclxuICAgICAqIEBwYXJhbSBzaG93RGVjaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZm9ybWF0KHZhbHVlOiBzdHJpbmcsIHNob3dEZWNpOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGEgPSB2YWx1ZS5zcGxpdCgnLicpWzBdO1xyXG4gICAgICAgIHZhciBiO1xyXG4gICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5udW1Vbml0KSB7XHJcbiAgICAgICAgICAgIGxldCBpaSA9IE51bWJlcihpKTtcclxuICAgICAgICAgICAgaWYgKGEubGVuZ3RoIC0gMSA+PSBpaSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNob3dEZWNpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRlY2kgPSBhLnNsaWNlKGEubGVuZ3RoIC0gaWksIGEubGVuZ3RoIC0gaWkgKyAxKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIoZGVjaSkgPj0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiID0gYS5zbGljZSgwLCBhLmxlbmd0aCAtIGlpKSArIFwiLlwiICsgZGVjaSArIHRoaXMubnVtVW5pdFtpaV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiID0gYS5zbGljZSgwLCBhLmxlbmd0aCAtIGlpKSArIHRoaXMubnVtVW5pdFtpaV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYiA9IGEuc2xpY2UoMCwgYS5sZW5ndGggLSBpaSkgKyB0aGlzLm51bVVuaXRbaWldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoIWIpIHJldHVybiBhO1xyXG4gICAgICAgIHJldHVybiBiO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==