js-ecutils
Version:
JavaScript Library for Elliptic Curve Cryptography: key exchanges (Diffie-Hellman, Massey-Omura), ECDSA signatures, and Koblitz encoding. Suitable for crypto education and secure systems.
269 lines (257 loc) • 55.5 kB
JavaScript
"use strict";
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
var _globals = require("@jest/globals");
var _digital_signature = require("./algorithms/digital_signature");
var _koblitz = require("./algorithms/koblitz");
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
function _OverloadYield(e, d) { this.v = e, this.k = d; }
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
// ---------------------------------------------------------------------------
// ECDSA — Elliptic Curve Digital Signature Algorithm
//
// Signing (private key d, generator G of order n):
// 1. Choose random k ∈ [1, n-1]
// 2. R = k·G, r = R.x mod n
// 3. s = (hash + r·d) · k⁻¹ mod n
//
// Verification (public key Q = d·G):
// 1. w = s⁻¹ mod n
// 2. u₁ = hash·w mod n, u₂ = r·w mod n
// 3. R' = u₁·G + u₂·Q
// 4. Accept iff R'.x mod n = r
//
// Security: the nonce k must never be reused across different messages
// (cf. Sony PS3 ECDSA attack, 2010).
// ---------------------------------------------------------------------------
(0, _globals.describe)('ECDSA digital signatures', function () {
var privateKey = 123456789n;
var ds = new _digital_signature.DigitalSignature(privateKey);
(0, _globals.test)('default curve is secp256k1', function () {
(0, _globals.expect)(ds.curveName).toBe('secp256k1');
});
(0, _globals.test)('sign and verify: valid signature is accepted', function () {
var messageHash = 545454445644654n;
var _ds$sign = ds.sign(messageHash),
_ds$sign2 = _slicedToArray(_ds$sign, 2),
r = _ds$sign2[0],
s = _ds$sign2[1];
(0, _globals.expect)(ds.verify(ds.publicKey, messageHash, r, s)).toBe(true);
});
// r and s must be in [1, n-1]
(0, _globals.test)('verify rejects r or s outside [1, n-1]', function () {
var messageHash = 545454445644654n;
var _ds$sign3 = ds.sign(messageHash),
_ds$sign4 = _slicedToArray(_ds$sign3, 2),
r = _ds$sign4[0],
s = _ds$sign4[1];
var n = ds._curve.n;
(0, _globals.expect)(function () {
return ds.verify(ds.publicKey, messageHash, n, s);
}).toThrow('r or s are not in the valid range [1, n-1].');
(0, _globals.expect)(function () {
return ds.verify(ds.publicKey, messageHash, r, 0n);
}).toThrow('r or s are not in the valid range [1, n-1].');
});
// signMessage hashes the message with SHA-256, then signs the integer hash
(0, _globals.test)('signMessage and verifyMessage with SHA-256', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
var message, _yield$ds$signMessage, _yield$ds$signMessage2, r, s;
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
message = 'Hello, ECDSA!';
_context.next = 3;
return ds.signMessage(message);
case 3:
_yield$ds$signMessage = _context.sent;
_yield$ds$signMessage2 = _slicedToArray(_yield$ds$signMessage, 2);
r = _yield$ds$signMessage2[0];
s = _yield$ds$signMessage2[1];
_context.t0 = _globals.expect;
_context.next = 10;
return ds.verifyMessage(ds.publicKey, message, r, s);
case 10:
_context.t1 = _context.sent;
(0, _context.t0)(_context.t1).toBe(true);
case 12:
case "end":
return _context.stop();
}
}, _callee);
})));
// Q = d·G must lie on the curve
(0, _globals.test)('public key Q = d·G is on the curve', function () {
(0, _globals.expect)(ds.publicKey.isOnCurve()).toBe(true);
});
// signMessage/verifyMessage with a custom hash function
(0, _globals.test)('signMessage and verifyMessage with custom hash function', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
var customHash, message, _yield$ds$signMessage3, _yield$ds$signMessage4, r, s;
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
customHash = /*#__PURE__*/function () {
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(msg) {
var hex, str, i;
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
// Simple deterministic "hash" for testing: hex of char codes
hex = '';
str = typeof msg === 'string' ? msg : String.fromCharCode.apply(String, _toConsumableArray(msg));
for (i = 0; i < str.length; i++) {
hex += str.charCodeAt(i).toString(16).padStart(2, '0');
}
return _context2.abrupt("return", hex.padStart(64, '0'));
case 4:
case "end":
return _context2.stop();
}
}, _callee2);
}));
return function customHash(_x) {
return _ref3.apply(this, arguments);
};
}();
message = 'custom hash test';
_context3.next = 4;
return ds.signMessage(message, customHash);
case 4:
_yield$ds$signMessage3 = _context3.sent;
_yield$ds$signMessage4 = _slicedToArray(_yield$ds$signMessage3, 2);
r = _yield$ds$signMessage4[0];
s = _yield$ds$signMessage4[1];
_context3.t0 = _globals.expect;
_context3.next = 11;
return ds.verifyMessage(ds.publicKey, message, r, s, customHash);
case 11:
_context3.t1 = _context3.sent;
(0, _context3.t0)(_context3.t1).toBe(true);
case 13:
case "end":
return _context3.stop();
}
}, _callee3);
})));
// signMessage with Uint8Array input
(0, _globals.test)('signMessage and verifyMessage with Uint8Array input', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
var message, _yield$ds$signMessage5, _yield$ds$signMessage6, r, s;
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
message = new Uint8Array([72, 101, 108, 108, 111]); // "Hello"
_context4.next = 3;
return ds.signMessage(message);
case 3:
_yield$ds$signMessage5 = _context4.sent;
_yield$ds$signMessage6 = _slicedToArray(_yield$ds$signMessage5, 2);
r = _yield$ds$signMessage6[0];
s = _yield$ds$signMessage6[1];
_context4.t0 = _globals.expect;
_context4.next = 10;
return ds.verifyMessage(ds.publicKey, message, r, s);
case 10:
_context4.t1 = _context4.sent;
(0, _context4.t0)(_context4.t1).toBe(true);
case 12:
case "end":
return _context4.stop();
}
}, _callee4);
})));
// verify rejects a tampered signature
(0, _globals.test)('verify rejects tampered signature', function () {
var messageHash = 123456789n;
var _ds$sign5 = ds.sign(messageHash),
_ds$sign6 = _slicedToArray(_ds$sign5, 2),
r = _ds$sign6[0],
s = _ds$sign6[1];
// Tamper with the hash
(0, _globals.expect)(ds.verify(ds.publicKey, messageHash + 1n, r, s)).toBe(false);
});
// DigitalSignature with a different curve
(0, _globals.test)('works with secp384r1', function () {
var ds384 = new _digital_signature.DigitalSignature(42n, 'secp384r1');
var hash = 0xabcdefn;
var _ds384$sign = ds384.sign(hash),
_ds384$sign2 = _slicedToArray(_ds384$sign, 2),
r = _ds384$sign2[0],
s = _ds384$sign2[1];
(0, _globals.expect)(ds384.verify(ds384.publicKey, hash, r, s)).toBe(true);
});
});
// ---------------------------------------------------------------------------
// Koblitz encoding
//
// Maps a text message to a point on an elliptic curve:
// 1. Convert string → integer m (base-α positional encoding, α = alphabet_size)
// 2. For j = 1, 2, ..., 99:
// x = (100·m + j) mod p
// Compute s = x³ + ax + b (mod p)
// If s is a quadratic residue, compute y = √s and return (Point(x,y), j)
//
// Decoding reverses the process:
// m = (x - j) / 100
// Convert integer m → string via base-α decomposition
//
// Failure probability after 99 attempts: ≈ 2⁻⁹⁹
// ---------------------------------------------------------------------------
(0, _globals.describe)('Koblitz encoding', function () {
(0, _globals.test)('encode/decode roundtrip with Unicode alphabet (secp192k1)', function () {
var kob = new _koblitz.Koblitz('secp192k1', 65536n);
var message = 'Hello, EC!';
var _kob$encode = kob.encode(message),
_kob$encode2 = _slicedToArray(_kob$encode, 2),
point = _kob$encode2[0],
j = _kob$encode2[1];
(0, _globals.expect)(kob.decode(point, j)).toBe(message);
});
(0, _globals.test)('encode/decode roundtrip with ASCII alphabet (secp192k1)', function () {
var kob = new _koblitz.Koblitz('secp192k1', 256n);
var message = 'Hello, EC!';
var _kob$encode3 = kob.encode(message),
_kob$encode4 = _slicedToArray(_kob$encode3, 2),
point = _kob$encode4[0],
j = _kob$encode4[1];
(0, _globals.expect)(kob.decode(point, j)).toBe(message);
});
(0, _globals.test)('encode/decode with default settings (secp521r1, ASCII)', function () {
var kob = new _koblitz.Koblitz();
var message = 'Hello, Elliptic Curve Cryptography!';
var _kob$encode5 = kob.encode(message),
_kob$encode6 = _slicedToArray(_kob$encode5, 2),
point = _kob$encode6[0],
j = _kob$encode6[1];
(0, _globals.expect)(kob.decode(point, j)).toBe(message);
});
(0, _globals.test)('default curve is secp521r1', function () {
(0, _globals.expect)(new _koblitz.Koblitz().curveName).toBe('secp521r1');
});
(0, _globals.test)('default alphabet size is 256 (ASCII)', function () {
(0, _globals.expect)(new _koblitz.Koblitz().alphabetSize).toBe(256n);
});
// The encoded point must satisfy y² ≡ x³ + ax + b (mod p)
(0, _globals.test)('encoded point lies on the curve', function () {
var _Koblitz$encode = new _koblitz.Koblitz().encode('Test'),
_Koblitz$encode2 = _slicedToArray(_Koblitz$encode, 1),
point = _Koblitz$encode2[0];
(0, _globals.expect)(point.isOnCurve()).toBe(true);
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ2xvYmFscyIsInJlcXVpcmUiLCJfZGlnaXRhbF9zaWduYXR1cmUiLCJfa29ibGl0eiIsIl90b0NvbnN1bWFibGVBcnJheSIsInIiLCJfYXJyYXlXaXRob3V0SG9sZXMiLCJfaXRlcmFibGVUb0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlU3ByZWFkIiwiVHlwZUVycm9yIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImZyb20iLCJpc0FycmF5IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwiX3JlZ2VuZXJhdG9yIiwiZSIsIm0iLCJ0IiwiT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJjb25zdHJ1Y3RvciIsIm4iLCJkaXNwbGF5TmFtZSIsIm5hbWUiLCJvIiwiYSIsInN0b3AiLCJfY2F0Y2giLCJ2IiwiYWJydXB0IiwiZGVsZWdhdGVZaWVsZCIsInJlc3VsdE5hbWUiLCJkIiwiX3JlZ2VuZXJhdG9yVmFsdWVzIiwiZmluaXNoIiwiZiIsIl90IiwicCIsInByZXYiLCJuZXh0Iiwic2VudCIsImNhbGwiLCJ3cmFwIiwidyIsInJldmVyc2UiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwibWFyayIsImF3cmFwIiwiX092ZXJsb2FkWWllbGQiLCJBc3luY0l0ZXJhdG9yIiwiX3JlZ2VuZXJhdG9yQXN5bmNJdGVyYXRvciIsImFzeW5jIiwidSIsIl9yZWdlbmVyYXRvckFzeW5jR2VuIiwiX3JlZ2VuZXJhdG9yQXN5bmMiLCJrZXlzIiwiX3JlZ2VuZXJhdG9yS2V5cyIsInZhbHVlcyIsImlzTmFOIiwibGVuZ3RoIiwidmFsdWUiLCJkb25lIiwiX3R5cGVvZiIsInVuc2hpZnQiLCJwb3AiLCJ0aGVuIiwiUHJvbWlzZSIsImkiLCJjIiwicmVzb2x2ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJwcm90b3R5cGUiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWciLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJ5IiwiRyIsImJpbmQiLCJsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsInNldFByb3RvdHlwZU9mIiwiZGVmaW5lUHJvcGVydHkiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJfaW52b2tlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiayIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsIl9zbGljZWRUb0FycmF5IiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX25vbkl0ZXJhYmxlUmVzdCIsInRvU3RyaW5nIiwic2xpY2UiLCJ0ZXN0IiwicHVzaCIsImRlc2NyaWJlIiwicHJpdmF0ZUtleSIsImRzIiwiRGlnaXRhbFNpZ25hdHVyZSIsImV4cGVjdCIsImN1cnZlTmFtZSIsInRvQmUiLCJtZXNzYWdlSGFzaCIsIl9kcyRzaWduIiwic2lnbiIsIl9kcyRzaWduMiIsInMiLCJ2ZXJpZnkiLCJwdWJsaWNLZXkiLCJfZHMkc2lnbjMiLCJfZHMkc2lnbjQiLCJfY3VydmUiLCJ0b1Rocm93IiwiX2NhbGxlZSIsIm1lc3NhZ2UiLCJfeWllbGQkZHMkc2lnbk1lc3NhZ2UiLCJfeWllbGQkZHMkc2lnbk1lc3NhZ2UyIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInNpZ25NZXNzYWdlIiwidDAiLCJ2ZXJpZnlNZXNzYWdlIiwidDEiLCJpc09uQ3VydmUiLCJfY2FsbGVlMyIsImN1c3RvbUhhc2giLCJfeWllbGQkZHMkc2lnbk1lc3NhZ2UzIiwiX3lpZWxkJGRzJHNpZ25NZXNzYWdlNCIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsIl9yZWYzIiwiX2NhbGxlZTIiLCJtc2ciLCJoZXgiLCJzdHIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJjaGFyQ29kZUF0IiwicGFkU3RhcnQiLCJfeCIsIl9jYWxsZWU0IiwiX3lpZWxkJGRzJHNpZ25NZXNzYWdlNSIsIl95aWVsZCRkcyRzaWduTWVzc2FnZTYiLCJfY2FsbGVlNCQiLCJfY29udGV4dDQiLCJVaW50OEFycmF5IiwiX2RzJHNpZ241IiwiX2RzJHNpZ242IiwiZHMzODQiLCJoYXNoIiwiX2RzMzg0JHNpZ24iLCJfZHMzODQkc2lnbjIiLCJrb2IiLCJLb2JsaXR6IiwiX2tvYiRlbmNvZGUiLCJlbmNvZGUiLCJfa29iJGVuY29kZTIiLCJwb2ludCIsImoiLCJkZWNvZGUiLCJfa29iJGVuY29kZTMiLCJfa29iJGVuY29kZTQiLCJfa29iJGVuY29kZTUiLCJfa29iJGVuY29kZTYiLCJhbHBoYWJldFNpemUiLCJfS29ibGl0eiRlbmNvZGUiLCJfS29ibGl0eiRlbmNvZGUyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FsZ29yaXRobXMudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0ZXN0LCBleHBlY3QsIGRlc2NyaWJlIH0gZnJvbSAnQGplc3QvZ2xvYmFscydcbmltcG9ydCB7IERpZ2l0YWxTaWduYXR1cmUgfSBmcm9tICcuL2FsZ29yaXRobXMvZGlnaXRhbF9zaWduYXR1cmUnXG5pbXBvcnQgeyBLb2JsaXR6IH0gZnJvbSAnLi9hbGdvcml0aG1zL2tvYmxpdHonXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRUNEU0Eg4oCUIEVsbGlwdGljIEN1cnZlIERpZ2l0YWwgU2lnbmF0dXJlIEFsZ29yaXRobVxuLy9cbi8vIFNpZ25pbmcgKHByaXZhdGUga2V5IGQsIGdlbmVyYXRvciBHIG9mIG9yZGVyIG4pOlxuLy8gICAxLiBDaG9vc2UgcmFuZG9tIGsg4oiIIFsxLCBuLTFdXG4vLyAgIDIuIFIgPSBrwrdHLCAgciA9IFIueCBtb2QgblxuLy8gICAzLiBzID0gKGhhc2ggKyBywrdkKSDCtyBr4oG7wrkgIG1vZCBuXG4vL1xuLy8gVmVyaWZpY2F0aW9uIChwdWJsaWMga2V5IFEgPSBkwrdHKTpcbi8vICAgMS4gdyAgPSBz4oG7wrkgbW9kIG5cbi8vICAgMi4gdeKCgSA9IGhhc2jCt3cgbW9kIG4sICB14oKCID0gcsK3dyBtb2QgblxuLy8gICAzLiBSJyA9IHXigoHCt0cgKyB14oKCwrdRXG4vLyAgIDQuIEFjY2VwdCBpZmYgUicueCBtb2QgbiA9IHJcbi8vXG4vLyBTZWN1cml0eTogdGhlIG5vbmNlIGsgbXVzdCBuZXZlciBiZSByZXVzZWQgYWNyb3NzIGRpZmZlcmVudCBtZXNzYWdlc1xuLy8gKGNmLiBTb255IFBTMyBFQ0RTQSBhdHRhY2ssIDIwMTApLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmRlc2NyaWJlKCdFQ0RTQSBkaWdpdGFsIHNpZ25hdHVyZXMnLCAoKSA9PiB7XG4gIGNvbnN0IHByaXZhdGVLZXkgPSAxMjM0NTY3ODluXG4gIGNvbnN0IGRzID0gbmV3IERpZ2l0YWxTaWduYXR1cmUocHJpdmF0ZUtleSlcblxuICB0ZXN0KCdkZWZhdWx0IGN1cnZlIGlzIHNlY3AyNTZrMScsICgpID0+IHtcbiAgICBleHBlY3QoZHMuY3VydmVOYW1lKS50b0JlKCdzZWNwMjU2azEnKVxuICB9KVxuXG4gIHRlc3QoJ3NpZ24gYW5kIHZlcmlmeTogdmFsaWQgc2lnbmF0dXJlIGlzIGFjY2VwdGVkJywgKCkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2VIYXNoID0gNTQ1NDU0NDQ1NjQ0NjU0blxuICAgIGNvbnN0IFtyLCBzXSA9IGRzLnNpZ24obWVzc2FnZUhhc2gpXG4gICAgZXhwZWN0KGRzLnZlcmlmeShkcy5wdWJsaWNLZXksIG1lc3NhZ2VIYXNoLCByLCBzKSkudG9CZSh0cnVlKVxuICB9KVxuXG4gIC8vIHIgYW5kIHMgbXVzdCBiZSBpbiBbMSwgbi0xXVxuICB0ZXN0KCd2ZXJpZnkgcmVqZWN0cyByIG9yIHMgb3V0c2lkZSBbMSwgbi0xXScsICgpID0+IHtcbiAgICBjb25zdCBtZXNzYWdlSGFzaCA9IDU0NTQ1NDQ0NTY0NDY1NG5cbiAgICBjb25zdCBbciwgc10gPSBkcy5zaWduKG1lc3NhZ2VIYXNoKVxuICAgIGNvbnN0IG4gPSBkcy5fY3VydmUublxuXG4gICAgZXhwZWN0KCgpID0+IGRzLnZlcmlmeShkcy5wdWJsaWNLZXksIG1lc3NhZ2VIYXNoLCBuLCBzKSkudG9UaHJvdyhcbiAgICAgICdyIG9yIHMgYXJlIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UgWzEsIG4tMV0uJyxcbiAgICApXG4gICAgZXhwZWN0KCgpID0+IGRzLnZlcmlmeShkcy5wdWJsaWNLZXksIG1lc3NhZ2VIYXNoLCByLCAwbikpLnRvVGhyb3coXG4gICAgICAnciBvciBzIGFyZSBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIFsxLCBuLTFdLicsXG4gICAgKVxuICB9KVxuXG4gIC8vIHNpZ25NZXNzYWdlIGhhc2hlcyB0aGUgbWVzc2FnZSB3aXRoIFNIQS0yNTYsIHRoZW4gc2lnbnMgdGhlIGludGVnZXIgaGFzaFxuICB0ZXN0KCdzaWduTWVzc2FnZSBhbmQgdmVyaWZ5TWVzc2FnZSB3aXRoIFNIQS0yNTYnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9ICdIZWxsbywgRUNEU0EhJ1xuICAgIGNvbnN0IFtyLCBzXSA9IGF3YWl0IGRzLnNpZ25NZXNzYWdlKG1lc3NhZ2UpXG4gICAgZXhwZWN0KGF3YWl0IGRzLnZlcmlmeU1lc3NhZ2UoZHMucHVibGljS2V5LCBtZXNzYWdlLCByLCBzKSkudG9CZSh0cnVlKVxuICB9KVxuXG4gIC8vIFEgPSBkwrdHIG11c3QgbGllIG9uIHRoZSBjdXJ2ZVxuICB0ZXN0KCdwdWJsaWMga2V5IFEgPSBkwrdHIGlzIG9uIHRoZSBjdXJ2ZScsICgpID0+IHtcbiAgICBleHBlY3QoZHMucHVibGljS2V5LmlzT25DdXJ2ZSgpKS50b0JlKHRydWUpXG4gIH0pXG5cbiAgLy8gc2lnbk1lc3NhZ2UvdmVyaWZ5TWVzc2FnZSB3aXRoIGEgY3VzdG9tIGhhc2ggZnVuY3Rpb25cbiAgdGVzdCgnc2lnbk1lc3NhZ2UgYW5kIHZlcmlmeU1lc3NhZ2Ugd2l0aCBjdXN0b20gaGFzaCBmdW5jdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjdXN0b21IYXNoID0gYXN5bmMgKG1zZykgPT4ge1xuICAgICAgLy8gU2ltcGxlIGRldGVybWluaXN0aWMgXCJoYXNoXCIgZm9yIHRlc3Rpbmc6IGhleCBvZiBjaGFyIGNvZGVzXG4gICAgICBsZXQgaGV4ID0gJydcbiAgICAgIGNvbnN0IHN0ciA9IHR5cGVvZiBtc2cgPT09ICdzdHJpbmcnID8gbXNnIDogU3RyaW5nLmZyb21DaGFyQ29kZSguLi5tc2cpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBoZXggKz0gc3RyLmNoYXJDb2RlQXQoaSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBoZXgucGFkU3RhcnQoNjQsICcwJylcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZSA9ICdjdXN0b20gaGFzaCB0ZXN0J1xuICAgIGNvbnN0IFtyLCBzXSA9IGF3YWl0IGRzLnNpZ25NZXNzYWdlKG1lc3NhZ2UsIGN1c3RvbUhhc2gpXG4gICAgZXhwZWN0KFxuICAgICAgYXdhaXQgZHMudmVyaWZ5TWVzc2FnZShkcy5wdWJsaWNLZXksIG1lc3NhZ2UsIHIsIHMsIGN1c3RvbUhhc2gpLFxuICAgICkudG9CZSh0cnVlKVxuICB9KVxuXG4gIC8vIHNpZ25NZXNzYWdlIHdpdGggVWludDhBcnJheSBpbnB1dFxuICB0ZXN0KCdzaWduTWVzc2FnZSBhbmQgdmVyaWZ5TWVzc2FnZSB3aXRoIFVpbnQ4QXJyYXkgaW5wdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG5ldyBVaW50OEFycmF5KFs3MiwgMTAxLCAxMDgsIDEwOCwgMTExXSkgLy8gXCJIZWxsb1wiXG4gICAgY29uc3QgW3IsIHNdID0gYXdhaXQgZHMuc2lnbk1lc3NhZ2UobWVzc2FnZSlcbiAgICBleHBlY3QoYXdhaXQgZHMudmVyaWZ5TWVzc2FnZShkcy5wdWJsaWNLZXksIG1lc3NhZ2UsIHIsIHMpKS50b0JlKHRydWUpXG4gIH0pXG5cbiAgLy8gdmVyaWZ5IHJlamVjdHMgYSB0YW1wZXJlZCBzaWduYXR1cmVcbiAgdGVzdCgndmVyaWZ5IHJlamVjdHMgdGFtcGVyZWQgc2lnbmF0dXJlJywgKCkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2VIYXNoID0gMTIzNDU2Nzg5blxuICAgIGNvbnN0IFtyLCBzXSA9IGRzLnNpZ24obWVzc2FnZUhhc2gpXG4gICAgLy8gVGFtcGVyIHdpdGggdGhlIGhhc2hcbiAgICBleHBlY3QoZHMudmVyaWZ5KGRzLnB1YmxpY0tleSwgbWVzc2FnZUhhc2ggKyAxbiwgciwgcykpLnRvQmUoZmFsc2UpXG4gIH0pXG5cbiAgLy8gRGlnaXRhbFNpZ25hdHVyZSB3aXRoIGEgZGlmZmVyZW50IGN1cnZlXG4gIHRlc3QoJ3dvcmtzIHdpdGggc2VjcDM4NHIxJywgKCkgPT4ge1xuICAgIGNvbnN0IGRzMzg0ID0gbmV3IERpZ2l0YWxTaWduYXR1cmUoNDJuLCAnc2VjcDM4NHIxJylcbiAgICBjb25zdCBoYXNoID0gMHhhYmNkZWZuXG4gICAgY29uc3QgW3IsIHNdID0gZHMzODQuc2lnbihoYXNoKVxuICAgIGV4cGVjdChkczM4NC52ZXJpZnkoZHMzODQucHVibGljS2V5LCBoYXNoLCByLCBzKSkudG9CZSh0cnVlKVxuICB9KVxufSlcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBLb2JsaXR6IGVuY29kaW5nXG4vL1xuLy8gTWFwcyBhIHRleHQgbWVzc2FnZSB0byBhIHBvaW50IG9uIGFuIGVsbGlwdGljIGN1cnZlOlxuLy8gICAxLiBDb252ZXJ0IHN0cmluZyDihpIgaW50ZWdlciBtICAoYmFzZS3OsSBwb3NpdGlvbmFsIGVuY29kaW5nLCDOsSA9IGFscGhhYmV0X3NpemUpXG4vLyAgIDIuIEZvciBqID0gMSwgMiwgLi4uLCA5OTpcbi8vICAgICAgICB4ID0gKDEwMMK3bSArIGopIG1vZCBwXG4vLyAgICAgICAgQ29tcHV0ZSBzID0geMKzICsgYXggKyBiIChtb2QgcClcbi8vICAgICAgICBJZiBzIGlzIGEgcXVhZHJhdGljIHJlc2lkdWUsIGNvbXB1dGUgeSA9IOKImnMgYW5kIHJldHVybiAoUG9pbnQoeCx5KSwgailcbi8vXG4vLyBEZWNvZGluZyByZXZlcnNlcyB0aGUgcHJvY2Vzczpcbi8vICAgbSA9ICh4IC0gaikgLyAxMDBcbi8vICAgQ29udmVydCBpbnRlZ2VyIG0g4oaSIHN0cmluZyB2aWEgYmFzZS3OsSBkZWNvbXBvc2l0aW9uXG4vL1xuLy8gRmFpbHVyZSBwcm9iYWJpbGl0eSBhZnRlciA5OSBhdHRlbXB0czog4omIIDLigbvigbnigblcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5kZXNjcmliZSgnS29ibGl0eiBlbmNvZGluZycsICgpID0+IHtcbiAgdGVzdCgnZW5jb2RlL2RlY29kZSByb3VuZHRyaXAgd2l0aCBVbmljb2RlIGFscGhhYmV0IChzZWNwMTkyazEpJywgKCkgPT4ge1xuICAgIGNvbnN0IGtvYiA9IG5ldyBLb2JsaXR6KCdzZWNwMTkyazEnLCA2NTUzNm4pXG4gICAgY29uc3QgbWVzc2FnZSA9ICdIZWxsbywgRUMhJ1xuICAgIGNvbnN0IFtwb2ludCwgal0gPSBrb2IuZW5jb2RlKG1lc3NhZ2UpXG4gICAgZXhwZWN0KGtvYi5kZWNvZGUocG9pbnQsIGopKS50b0JlKG1lc3NhZ2UpXG4gIH0pXG5cbiAgdGVzdCgnZW5jb2RlL2RlY29kZSByb3VuZHRyaXAgd2l0aCBBU0NJSSBhbHBoYWJldCAoc2VjcDE5MmsxKScsICgpID0+IHtcbiAgICBjb25zdCBrb2IgPSBuZXcgS29ibGl0eignc2VjcDE5MmsxJywgMjU2bilcbiAgICBjb25zdCBtZXNzYWdlID0gJ0hlbGxvLCBFQyEnXG4gICAgY29uc3QgW3BvaW50LCBqXSA9IGtvYi5lbmNvZGUobWVzc2FnZSlcbiAgICBleHBlY3Qoa29iLmRlY29kZShwb2ludCwgaikpLnRvQmUobWVzc2FnZSlcbiAgfSlcblxuICB0ZXN0KCdlbmNvZGUvZGVjb2RlIHdpdGggZGVmYXVsdCBzZXR0aW5ncyAoc2VjcDUyMXIxLCBBU0NJSSknLCAoKSA9PiB7XG4gICAgY29uc3Qga29iID0gbmV3IEtvYmxpdHooKVxuICAgIGNvbnN0IG1lc3NhZ2UgPSAnSGVsbG8sIEVsbGlwdGljIEN1cnZlIENyeXB0b2dyYXBoeSEnXG4gICAgY29uc3QgW3BvaW50LCBqXSA9IGtvYi5lbmNvZGUobWVzc2FnZSlcbiAgICBleHBlY3Qoa29iLmRlY29kZShwb2ludCwgaikpLnRvQmUobWVzc2FnZSlcbiAgfSlcblxuICB0ZXN0KCdkZWZhdWx0IGN1cnZlIGlzIHNlY3A1MjFyMScsICgpID0+IHtcbiAgICBleHBlY3QobmV3IEtvYmxpdHooKS5jdXJ2ZU5hbWUpLnRvQmUoJ3NlY3A1MjFyMScpXG4gIH0pXG5cbiAgdGVzdCgnZGVmYXVsdCBhbHBoYWJldCBzaXplIGlzIDI1NiAoQVNDSUkpJywgKCkgPT4ge1xuICAgIGV4cGVjdChuZXcgS29ibGl0eigpLmFscGhhYmV0U2l6ZSkudG9CZSgyNTZuKVxuICB9KVxuXG4gIC8vIFRoZSBlbmNvZGVkIHBvaW50IG11c3Qgc2F0aXNmeSB5wrIg4omhIHjCsyArIGF4ICsgYiAobW9kIHApXG4gIHRlc3QoJ2VuY29kZWQgcG9pbnQgbGllcyBvbiB0aGUgY3VydmUnLCAoKSA9PiB7XG4gICAgY29uc3QgW3BvaW50XSA9IG5ldyBLb2JsaXR6KCkuZW5jb2RlKCdUZXN0JylcbiAgICBleHBlY3QocG9pbnQuaXNPbkN1cnZlKCkpLnRvQmUodHJ1ZSlcbiAgfSlc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