diff --git a/dochack.js b/dochack.js
new file mode 100644
index 0000000..5b5816c
--- /dev/null
+++ b/dochack.js
@@ -0,0 +1,1609 @@
+/* Generated by the Nim Compiler v2.1.1 */
+var framePtr = null;
+var excHandler = 0;
+var lastJSError = null;
+var NTI33554466 = {size: 0,kind: 1,base: null,node: null,finalizer: null};
+var NTI704643086 = {size: 0, kind: 18, base: null, node: null, finalizer: null};
+var NTI33554435 = {size: 0,kind: 31,base: null,node: null,finalizer: null};
+var NTI939524173 = {size: 0,kind: 31,base: null,node: null,finalizer: null};
+var NTI939524179 = {size: 0, kind: 18, base: null, node: null, finalizer: null};
+var NTI134217745 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI134217749 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI134217751 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555169 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555177 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI33554449 = {size: 0,kind: 28,base: null,node: null,finalizer: null};
+var NTI33554450 = {size: 0,kind: 29,base: null,node: null,finalizer: null};
+var NTI33555176 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI33555173 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555174 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI134217741 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI134217743 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NNI134217743 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI134217743.node = NNI134217743;
+var NNI134217741 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI134217741.node = NNI134217741;
+var NNI33555174 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555174.node = NNI33555174;
+NTI33555176.base = NTI33555173;
+NTI33555177.base = NTI33555173;
+var NNI33555173 = {kind: 2, len: 5, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "parent", len: 0, typ: NTI33555176, name: "parent", sons: null},
+{kind: 1, offset: "name", len: 0, typ: NTI33554450, name: "name", sons: null},
+{kind: 1, offset: "message", len: 0, typ: NTI33554449, name: "msg", sons: null},
+{kind: 1, offset: "trace", len: 0, typ: NTI33554449, name: "trace", sons: null},
+{kind: 1, offset: "up", len: 0, typ: NTI33555177, name: "up", sons: null}]};
+NTI33555173.node = NNI33555173;
+var NNI33555169 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555169.node = NNI33555169;
+NTI33555173.base = NTI33555169;
+NTI33555174.base = NTI33555173;
+NTI134217741.base = NTI33555174;
+NTI134217743.base = NTI134217741;
+var NNI134217751 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI134217751.node = NNI134217751;
+NTI134217751.base = NTI33555174;
+var NNI134217749 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI134217749.node = NNI134217749;
+NTI134217749.base = NTI33555174;
+var NNI134217745 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI134217745.node = NNI134217745;
+NTI134217745.base = NTI33555174;
+var NNI939524179 = {kind: 2, len: 2, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "a", len: 0, typ: NTI939524173, name: "a", sons: null},
+{kind: 1, offset: "b", len: 0, typ: NTI33554435, name: "b", sons: null}]};
+NTI939524179.node = NNI939524179;
+var NNI704643086 = {kind: 2, len: 2, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "Field0", len: 0, typ: NTI33554435, name: "Field0", sons: null},
+{kind: 1, offset: "Field1", len: 0, typ: NTI33554466, name: "Field1", sons: null}]};
+NTI704643086.node = NNI704643086;
+
+function mnewString(len_33556987) {
+ var result = new Array(len_33556987);
+ for (var i = 0; i < len_33556987; i++) {result[i] = 0;}
+ return result;
+
+
+
+}
+
+function toJSStr(s_33556888) {
+ var result_33556889 = null;
+
+ var res_33556930 = newSeq_33556906((s_33556888).length);
+ var i_33556931 = 0;
+ var j_33556932 = 0;
+ Label1: {
+ Label2: while (true) {
+ if (!(i_33556931 < (s_33556888).length)) break Label2;
+ var c_33556933 = s_33556888[i_33556931];
+ if ((c_33556933 < 128)) {
+ res_33556930[j_33556932] = String.fromCharCode(c_33556933);
+ i_33556931 += 1;
+ }
+ else {
+ var helper_33556945 = newSeq_33556906(0);
+ Label3: {
+ Label4: while (true) {
+ if (!true) break Label4;
+ var code_33556946 = c_33556933.toString(16);
+ if ((((code_33556946) == null ? 0 : (code_33556946).length) == 1)) {
+ helper_33556945.push("%0");;
+ }
+ else {
+ helper_33556945.push("%");;
+ }
+
+ helper_33556945.push(code_33556946);;
+ i_33556931 += 1;
+ if ((((s_33556888).length <= i_33556931) || (s_33556888[i_33556931] < 128))) {
+ break Label3;
+ }
+
+ c_33556933 = s_33556888[i_33556931];
+ }
+ };
+++excHandler;
+ try {
+ res_33556930[j_33556932] = decodeURIComponent(helper_33556945.join(""));
+--excHandler;
+} catch (EXCEPTION) {
+ var prevJSError = lastJSError;
+ lastJSError = EXCEPTION;
+ --excHandler;
+ res_33556930[j_33556932] = helper_33556945.join("");
+ lastJSError = prevJSError;
+ } finally {
+ }
+ }
+
+ j_33556932 += 1;
+ }
+ };
+ if (res_33556930.length < j_33556932) { for (var i = res_33556930.length ; i < j_33556932 ; ++i) res_33556930.push(null); }
+ else { res_33556930.length = j_33556932; };
+ result_33556889 = res_33556930.join("");
+
+ return result_33556889;
+
+}
+
+function raiseException(e_33556640, ename_33556641) {
+ e_33556640.name = ename_33556641;
+ if ((excHandler == 0)) {
+ unhandledException(e_33556640);
+ }
+
+ throw e_33556640;
+
+
+}
+
+function addInt(a_33557034, b_33557035) {
+ var result = a_33557034 + b_33557035;
+ checkOverflowInt(result);
+ return result;
+
+
+
+}
+
+function chckRange(i_33557308, a_33557309, b_33557310) {
+ var result_33557311 = 0;
+
+ BeforeRet: {
+ if (((a_33557309 <= i_33557308) && (i_33557308 <= b_33557310))) {
+ result_33557311 = i_33557308;
+ break BeforeRet;
+ }
+ else {
+ raiseRangeError();
+ }
+
+ };
+
+ return result_33557311;
+
+}
+
+function setConstr() {
+ var result = {};
+ for (var i = 0; i < arguments.length; ++i) {
+ var x = arguments[i];
+ if (typeof(x) == "object") {
+ for (var j = x[0]; j <= x[1]; ++j) {
+ result[j] = true;
+ }
+ } else {
+ result[x] = true;
+ }
+ }
+ return result;
+
+
+
+}
+var ConstSet1 = setConstr(17, 16, 4, 18, 27, 19, 23, 22, 21);
+
+function nimCopy(dest_33557252, src_33557253, ti_33557254) {
+ var result_33557263 = null;
+
+ switch (ti_33557254.kind) {
+ case 21:
+ case 22:
+ case 23:
+ case 5:
+ if (!(isFatPointer_33557243(ti_33557254))) {
+ result_33557263 = src_33557253;
+ }
+ else {
+ result_33557263 = [src_33557253[0], src_33557253[1]];
+ }
+
+ break;
+ case 19:
+ if (dest_33557252 === null || dest_33557252 === undefined) {
+ dest_33557252 = {};
+ }
+ else {
+ for (var key in dest_33557252) { delete dest_33557252[key]; }
+ }
+ for (var key in src_33557253) { dest_33557252[key] = src_33557253[key]; }
+ result_33557263 = dest_33557252;
+
+ break;
+ case 18:
+ case 17:
+ if (!((ti_33557254.base == null))) {
+ result_33557263 = nimCopy(dest_33557252, src_33557253, ti_33557254.base);
+ }
+ else {
+ if ((ti_33557254.kind == 17)) {
+ result_33557263 = (dest_33557252 === null || dest_33557252 === undefined) ? {m_type: ti_33557254} : dest_33557252;
+ }
+ else {
+ result_33557263 = (dest_33557252 === null || dest_33557252 === undefined) ? {} : dest_33557252;
+ }
+ }
+ nimCopyAux(result_33557263, src_33557253, ti_33557254.node);
+ break;
+ case 4:
+ case 16:
+ if(ArrayBuffer.isView(src_33557253)) {
+ if(dest_33557252 === null || dest_33557252 === undefined || dest_33557252.length != src_33557253.length) {
+ dest_33557252 = new src_33557253.constructor(src_33557253);
+ } else {
+ dest_33557252.set(src_33557253, 0);
+ }
+ result_33557263 = dest_33557252;
+ } else {
+ if (src_33557253 === null) {
+ result_33557263 = null;
+ }
+ else {
+ if (dest_33557252 === null || dest_33557252 === undefined || dest_33557252.length != src_33557253.length) {
+ dest_33557252 = new Array(src_33557253.length);
+ }
+ result_33557263 = dest_33557252;
+ for (var i = 0; i < src_33557253.length; ++i) {
+ result_33557263[i] = nimCopy(result_33557263[i], src_33557253[i], ti_33557254.base);
+ }
+ }
+ }
+
+ break;
+ case 24:
+ case 27:
+ if (src_33557253 === null) {
+ result_33557263 = null;
+ }
+ else {
+ if (dest_33557252 === null || dest_33557252 === undefined || dest_33557252.length != src_33557253.length) {
+ dest_33557252 = new Array(src_33557253.length);
+ }
+ result_33557263 = dest_33557252;
+ for (var i = 0; i < src_33557253.length; ++i) {
+ result_33557263[i] = nimCopy(result_33557263[i], src_33557253[i], ti_33557254.base);
+ }
+ }
+
+ break;
+ case 28:
+ if (src_33557253 !== null) {
+ result_33557263 = src_33557253.slice(0);
+ }
+
+ break;
+ default:
+ result_33557263 = src_33557253;
+ break;
+ }
+
+ return result_33557263;
+
+}
+
+function chckIndx(i_33557303, a_33557304, b_33557305) {
+ var result_33557306 = 0;
+
+ BeforeRet: {
+ if (((a_33557304 <= i_33557303) && (i_33557303 <= b_33557305))) {
+ result_33557306 = i_33557303;
+ break BeforeRet;
+ }
+ else {
+ raiseIndexError(i_33557303, a_33557304, b_33557305);
+ }
+
+ };
+
+ return result_33557306;
+
+}
+
+function makeNimstrLit(c_33556882) {
+ var result = [];
+ for (var i = 0; i < c_33556882.length; ++i) {
+ result[i] = c_33556882.charCodeAt(i);
+ }
+ return result;
+
+
+
+}
+
+function subInt(a_33557038, b_33557039) {
+ var result = a_33557038 - b_33557039;
+ checkOverflowInt(result);
+ return result;
+
+
+
+}
+
+function cstrToNimstr(c_33556885) {
+ var ln = c_33556885.length;
+ var result = new Array(ln);
+ var r = 0;
+ for (var i = 0; i < ln; ++i) {
+ var ch = c_33556885.charCodeAt(i);
+
+ if (ch < 128) {
+ result[r] = ch;
+ }
+ else {
+ if (ch < 2048) {
+ result[r] = (ch >> 6) | 192;
+ }
+ else {
+ if (ch < 55296 || ch >= 57344) {
+ result[r] = (ch >> 12) | 224;
+ }
+ else {
+ ++i;
+ ch = 65536 + (((ch & 1023) << 10) | (c_33556885.charCodeAt(i) & 1023));
+ result[r] = (ch >> 18) | 240;
+ ++r;
+ result[r] = ((ch >> 12) & 63) | 128;
+ }
+ ++r;
+ result[r] = ((ch >> 6) & 63) | 128;
+ }
+ ++r;
+ result[r] = (ch & 63) | 128;
+ }
+ ++r;
+ }
+ return result;
+
+
+
+}
+var ConstSet2 = setConstr([65, 90]);
+var ConstSet3 = setConstr(95, 32, 46);
+var ConstSet4 = setConstr(95, 32, 46);
+
+function mulInt(a_33557042, b_33557043) {
+ var result = a_33557042 * b_33557043;
+ checkOverflowInt(result);
+ return result;
+
+
+
+}
+var ConstSet5 = setConstr([97, 122]);
+var ConstSet6 = setConstr([65, 90], [97, 122]);
+var ConstSet7 = setConstr([97, 122]);
+var ConstSet8 = setConstr([65, 90]);
+var ConstSet9 = setConstr([65, 90], [97, 122]);
+
+function nimMax(a_33557092, b_33557093) {
+ var Temporary1;
+
+ var result_33557094 = 0;
+
+ BeforeRet: {
+ if ((b_33557093 <= a_33557092)) {
+ Temporary1 = a_33557092;
+ }
+ else {
+ Temporary1 = b_33557093;
+ }
+
+ result_33557094 = Temporary1;
+ break BeforeRet;
+ };
+
+ return result_33557094;
+
+}
+
+function nimMin(a_33557088, b_33557089) {
+ var Temporary1;
+
+ var result_33557090 = 0;
+
+ BeforeRet: {
+ if ((a_33557088 <= b_33557089)) {
+ Temporary1 = a_33557088;
+ }
+ else {
+ Temporary1 = b_33557089;
+ }
+
+ result_33557090 = Temporary1;
+ break BeforeRet;
+ };
+
+ return result_33557090;
+
+}
+
+function addChar(x_33557399, c_33557400) {
+ x_33557399.push(c_33557400);
+
+
+}
+var objectID_1157628079 = [0];
+
+function setTheme(theme_553648134) {
+ document.documentElement.setAttribute("data-theme", theme_553648134);
+ window.localStorage.setItem("theme", theme_553648134);
+
+
+}
+
+function add_33556363(x_33556364, x_33556364_Idx, y_33556365) {
+ if (x_33556364[x_33556364_Idx] === null) { x_33556364[x_33556364_Idx] = []; }
+ var off = x_33556364[x_33556364_Idx].length;
+ x_33556364[x_33556364_Idx].length += y_33556365.length;
+ for (var i = 0; i < y_33556365.length; ++i) {
+ x_33556364[x_33556364_Idx][off+i] = y_33556365.charCodeAt(i);
+ }
+
+
+
+}
+
+function newSeq_33556906(len_33556908) {
+ var result_33556909 = [];
+
+ result_33556909 = new Array(len_33556908); for (var i = 0 ; i < len_33556908 ; ++i) { result_33556909[i] = null; }
+ return result_33556909;
+
+}
+
+function unhandledException(e_33556636) {
+ var buf_33556637 = [[]];
+ if (!(((e_33556636.message).length == 0))) {
+ buf_33556637[0].push.apply(buf_33556637[0], [69,114,114,111,114,58,32,117,110,104,97,110,100,108,101,100,32,101,120,99,101,112,116,105,111,110,58,32]);;
+ buf_33556637[0].push.apply(buf_33556637[0], e_33556636.message);;
+ }
+ else {
+ buf_33556637[0].push.apply(buf_33556637[0], [69,114,114,111,114,58,32,117,110,104,97,110,100,108,101,100,32,101,120,99,101,112,116,105,111,110]);;
+ }
+
+ buf_33556637[0].push.apply(buf_33556637[0], [32,91]);;
+ add_33556363(buf_33556637, 0, e_33556636.name);
+ buf_33556637[0].push.apply(buf_33556637[0], [93,10]);;
+ var cbuf_33556638 = toJSStr(buf_33556637[0]);
+ if (typeof(Error) !== "undefined") {
+ throw new Error(cbuf_33556638);
+ }
+ else {
+ throw cbuf_33556638;
+ }
+
+
+
+}
+
+function raiseOverflow() {
+ raiseException({message: [111,118,101,114,45,32,111,114,32,117,110,100,101,114,102,108,111,119], parent: null, m_type: NTI134217743, name: null, trace: [], up: null}, "OverflowDefect");
+
+
+}
+
+function checkOverflowInt(a_33557032) {
+ if (a_33557032 > 2147483647 || a_33557032 < -2147483648) raiseOverflow();
+
+
+
+}
+
+function raiseRangeError() {
+ raiseException({message: [118,97,108,117,101,32,111,117,116,32,111,102,32,114,97,110,103,101], parent: null, m_type: NTI134217751, name: null, trace: [], up: null}, "RangeDefect");
+
+
+}
+
+function addChars_301990087(result_301990089, result_301990089_Idx, x_301990090, start_301990091, n_301990092) {
+ var Temporary1;
+
+ var old_301990093 = (result_301990089[result_301990089_Idx]).length;
+ if (result_301990089[result_301990089_Idx].length < (Temporary1 = chckRange(addInt(old_301990093, n_301990092), 0, 2147483647), Temporary1)) { for (var i = result_301990089[result_301990089_Idx].length; i < Temporary1; ++i) result_301990089[result_301990089_Idx].push(0); }
+ else {result_301990089[result_301990089_Idx].length = Temporary1; };
+ Label2: {
+ var iHEX60gensym4_301990107 = 0;
+ var i_553649320 = 0;
+ Label3: {
+ Label4: while (true) {
+ if (!(i_553649320 < n_301990092)) break Label4;
+ iHEX60gensym4_301990107 = i_553649320;
+ result_301990089[result_301990089_Idx][chckIndx(addInt(old_301990093, iHEX60gensym4_301990107), 0, (result_301990089[result_301990089_Idx]).length - 1)] = x_301990090.charCodeAt(chckIndx(addInt(start_301990091, iHEX60gensym4_301990107), 0, (x_301990090).length - 1));
+ i_553649320 = addInt(i_553649320, 1);
+ }
+ };
+ };
+
+
+}
+
+function addChars_301990083(result_301990085, result_301990085_Idx, x_301990086) {
+ addChars_301990087(result_301990085, result_301990085_Idx, x_301990086, 0, ((x_301990086) == null ? 0 : (x_301990086).length));
+
+
+}
+
+function addInt_301990108(result_301990109, result_301990109_Idx, x_301990110) {
+ addChars_301990083(result_301990109, result_301990109_Idx, ((x_301990110) + ""));
+
+
+}
+
+function addInt_301990126(result_301990127, result_301990127_Idx, x_301990128) {
+ addInt_301990108(result_301990127, result_301990127_Idx, BigInt(x_301990128));
+
+
+}
+
+function HEX24_385875976(x_385875977) {
+ var result_385875978 = [[]];
+
+ addInt_301990126(result_385875978, 0, x_385875977);
+
+ return result_385875978[0];
+
+}
+
+function isFatPointer_33557243(ti_33557244) {
+ var result_33557245 = false;
+
+ BeforeRet: {
+ result_33557245 = !((ConstSet1[ti_33557244.base.kind] != undefined));
+ break BeforeRet;
+ };
+
+ return result_33557245;
+
+}
+
+function nimCopyAux(dest_33557256, src_33557257, n_33557258) {
+ switch (n_33557258.kind) {
+ case 0:
+ break;
+ case 1:
+ dest_33557256[n_33557258.offset] = nimCopy(dest_33557256[n_33557258.offset], src_33557257[n_33557258.offset], n_33557258.typ);
+
+ break;
+ case 2:
+ for (var i = 0; i < n_33557258.sons.length; i++) {
+ nimCopyAux(dest_33557256, src_33557257, n_33557258.sons[i]);
+ }
+
+ break;
+ case 3:
+ dest_33557256[n_33557258.offset] = nimCopy(dest_33557256[n_33557258.offset], src_33557257[n_33557258.offset], n_33557258.typ);
+ for (var i = 0; i < n_33557258.sons.length; ++i) {
+ nimCopyAux(dest_33557256, src_33557257, n_33557258.sons[i][1]);
+ }
+
+ break;
+ }
+
+
+}
+
+function raiseIndexError(i_33556799, a_33556800, b_33556801) {
+ var Temporary1;
+
+ if ((b_33556801 < a_33556800)) {
+ Temporary1 = [105,110,100,101,120,32,111,117,116,32,111,102,32,98,111,117,110,100,115,44,32,116,104,101,32,99,111,110,116,97,105,110,101,114,32,105,115,32,101,109,112,116,121];
+ }
+ else {
+ Temporary1 = ([105,110,100,101,120,32] || []).concat(HEX24_385875976(i_33556799) || [],[32,110,111,116,32,105,110,32] || [],HEX24_385875976(a_33556800) || [],[32,46,46,32] || [],HEX24_385875976(b_33556801) || []);
+ }
+
+ raiseException({message: nimCopy(null, Temporary1, NTI33554449), parent: null, m_type: NTI134217749, name: null, trace: [], up: null}, "IndexDefect");
+
+
+}
+
+function sysFatal_268435501(message_268435504) {
+ raiseException({message: nimCopy(null, message_268435504, NTI33554449), m_type: NTI134217745, parent: null, name: null, trace: [], up: null}, "AssertionDefect");
+
+
+}
+
+function raiseAssert_268435499(msg_268435500) {
+ sysFatal_268435501(msg_268435500);
+
+
+}
+
+function failedAssertImpl_268435541(msg_268435542) {
+ raiseAssert_268435499(msg_268435542);
+
+
+}
+
+function onDOMLoaded(e_553648169) {
+
+function HEX3Aanonymous_553648192(event_553648193) {
+ event_553648193.target.parentNode.style.display = "none";
+ event_553648193.target.parentNode.nextSibling.style.display = "inline";
+
+
+ }
+
+ document.getElementById("theme-select").value = window.localStorage.getItem("theme");
+ Label1: {
+ var pragmaDots_553648191 = null;
+ var colontmp__553649311 = [];
+ colontmp__553649311 = document.getElementsByClassName("pragmadots");
+ var i_553649313 = 0;
+ var L_553649314 = (colontmp__553649311).length;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649313 < L_553649314)) break Label3;
+ pragmaDots_553648191 = colontmp__553649311[chckIndx(i_553649313, 0, (colontmp__553649311).length - 1)];
+ pragmaDots_553648191.onclick = HEX3Aanonymous_553648192;
+ i_553649313 += 1;
+ if (!(((colontmp__553649311).length == L_553649314))) {
+ failedAssertImpl_268435541(makeNimstrLit("iterators.nim(251, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ };
+ };
+
+
+}
+
+function isWhitespace_553648533(x_553648534) {
+ var result_553648535 = false;
+
+ result_553648535 = (((x_553648534.nodeName == "#text") && !/\S/.test(x_553648534.textContent)) || (x_553648534.nodeName == "#comment"));
+
+ return result_553648535;
+
+}
+
+function toToc_553648536(x_553648537, father_553648538) {
+ var Temporary5;
+ var Temporary6;
+ var Temporary7;
+ var Temporary8;
+ var Temporary15;
+
+ if ((x_553648537.nodeName == "UL")) {
+ var f_553648546 = {heading: null, kids: [], sortId: (father_553648538.kids).length, doSort: false};
+ var i_553648547 = 0;
+ Label1: {
+ Label2: while (true) {
+ if (!(i_553648547 < x_553648537.childNodes.length)) break Label2;
+ var nxt_553648548 = addInt(i_553648547, 1);
+ Label3: {
+ Label4: while (true) {
+ if (!(nxt_553648548 < x_553648537.childNodes.length)) Temporary5 = false; else { Temporary5 = isWhitespace_553648533(x_553648537.childNodes[nxt_553648548]); } if (!Temporary5) break Label4;
+ nxt_553648548 = addInt(nxt_553648548, 1);
+ }
+ };
+ if (!(nxt_553648548 < x_553648537.childNodes.length)) Temporary8 = false; else { Temporary8 = (x_553648537.childNodes[i_553648547].nodeName == "LI"); } if (!Temporary8) Temporary7 = false; else { Temporary7 = (x_553648537.childNodes[i_553648547].childNodes.length == 1); } if (!Temporary7) Temporary6 = false; else { Temporary6 = (x_553648537.childNodes[nxt_553648548].nodeName == "UL"); } if (Temporary6) {
+ var e_553648560 = {heading: x_553648537.childNodes[i_553648547].childNodes[0], kids: [], sortId: (f_553648546.kids).length, doSort: false};
+ var it_553648561 = x_553648537.childNodes[nxt_553648548];
+ Label9: {
+ var j_553648566 = 0;
+ var colontmp__553649327 = 0;
+ colontmp__553649327 = it_553648561.childNodes.length;
+ var i_553649328 = 0;
+ Label10: {
+ Label11: while (true) {
+ if (!(i_553649328 < colontmp__553649327)) break Label11;
+ j_553648566 = i_553649328;
+ toToc_553648536(it_553648561.childNodes[j_553648566], e_553648560);
+ i_553649328 = addInt(i_553649328, 1);
+ }
+ };
+ };
+ f_553648546.kids.push(e_553648560);;
+ i_553648547 = addInt(nxt_553648548, 1);
+ }
+ else {
+ toToc_553648536(x_553648537.childNodes[i_553648547], f_553648546);
+ i_553648547 = addInt(i_553648547, 1);
+ }
+
+ }
+ };
+ father_553648538.kids.push(f_553648546);;
+ }
+ else {
+ if (isWhitespace_553648533(x_553648537)) {
+ }
+ else {
+ if ((x_553648537.nodeName == "LI")) {
+ var idx_553648583 = [];
+ Label12: {
+ var i_553648588 = 0;
+ var colontmp__553649331 = 0;
+ colontmp__553649331 = x_553648537.childNodes.length;
+ var i_553649332 = 0;
+ Label13: {
+ Label14: while (true) {
+ if (!(i_553649332 < colontmp__553649331)) break Label14;
+ i_553648588 = i_553649332;
+ if (!(isWhitespace_553648533(x_553648537.childNodes[i_553648588]))) {
+ idx_553648583.push(i_553648588);;
+ }
+
+ i_553649332 = addInt(i_553649332, 1);
+ }
+ };
+ };
+ if (!((idx_553648583).length == 2)) Temporary15 = false; else { Temporary15 = (x_553648537.childNodes[idx_553648583[chckIndx(1, 0, (idx_553648583).length - 1)]].nodeName == "UL"); } if (Temporary15) {
+ var e_553648604 = {heading: x_553648537.childNodes[idx_553648583[chckIndx(0, 0, (idx_553648583).length - 1)]], kids: [], sortId: (father_553648538.kids).length, doSort: false};
+ var it_553648605 = x_553648537.childNodes[idx_553648583[chckIndx(1, 0, (idx_553648583).length - 1)]];
+ Label16: {
+ var j_553648610 = 0;
+ var colontmp__553649335 = 0;
+ colontmp__553649335 = it_553648605.childNodes.length;
+ var i_553649336 = 0;
+ Label17: {
+ Label18: while (true) {
+ if (!(i_553649336 < colontmp__553649335)) break Label18;
+ j_553648610 = i_553649336;
+ toToc_553648536(it_553648605.childNodes[j_553648610], e_553648604);
+ i_553649336 = addInt(i_553649336, 1);
+ }
+ };
+ };
+ father_553648538.kids.push(e_553648604);;
+ }
+ else {
+ Label19: {
+ var i_553648619 = 0;
+ var colontmp__553649339 = 0;
+ colontmp__553649339 = x_553648537.childNodes.length;
+ var i_553649340 = 0;
+ Label20: {
+ Label21: while (true) {
+ if (!(i_553649340 < colontmp__553649339)) break Label21;
+ i_553648619 = i_553649340;
+ toToc_553648536(x_553648537.childNodes[i_553648619], father_553648538);
+ i_553649340 = addInt(i_553649340, 1);
+ }
+ };
+ };
+ }
+
+ }
+ else {
+ father_553648538.kids.push({heading: x_553648537, kids: [], sortId: (father_553648538.kids).length, doSort: false});;
+ }
+ }}
+
+
+}
+
+function extractItems_553648325(x_553648326, heading_553648327, items_553648328, items_553648328_Idx) {
+ BeforeRet: {
+ if ((x_553648326 == null)) {
+ break BeforeRet;
+ }
+
+ if ((!((x_553648326.heading == null)) && (x_553648326.heading.textContent == heading_553648327))) {
+ Label1: {
+ var i_553648345 = 0;
+ var colontmp__553649343 = 0;
+ colontmp__553649343 = (x_553648326.kids).length;
+ var i_553649344 = 0;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649344 < colontmp__553649343)) break Label3;
+ i_553648345 = i_553649344;
+ items_553648328[items_553648328_Idx].push(x_553648326.kids[chckIndx(i_553648345, 0, (x_553648326.kids).length - 1)].heading);;
+ i_553649344 = addInt(i_553649344, 1);
+ }
+ };
+ };
+ }
+ else {
+ Label4: {
+ var k_553648370 = null;
+ var i_553649348 = 0;
+ var L_553649349 = (x_553648326.kids).length;
+ Label5: {
+ Label6: while (true) {
+ if (!(i_553649348 < L_553649349)) break Label6;
+ k_553648370 = x_553648326.kids[chckIndx(i_553649348, 0, (x_553648326.kids).length - 1)];
+ extractItems_553648325(k_553648370, heading_553648327, items_553648328, items_553648328_Idx);
+ i_553649348 += 1;
+ if (!(((x_553648326.kids).length == L_553649349))) {
+ failedAssertImpl_268435541(makeNimstrLit("iterators.nim(251, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ };
+ };
+ }
+
+ };
+
+
+}
+
+function tree_553648257(tag_553648258, kids_553648259) {
+ var result_553648260 = null;
+
+ result_553648260 = document.createElement(tag_553648258);
+ Label1: {
+ var k_553648273 = null;
+ var i_553649361 = 0;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649361 < (kids_553648259).length)) break Label3;
+ k_553648273 = kids_553648259[chckIndx(i_553649361, 0, (kids_553648259).length - 1)];
+ result_553648260.appendChild(k_553648273);
+ i_553649361 += 1;
+ }
+ };
+ };
+
+ return result_553648260;
+
+}
+
+function text_553648281(s_553648282) {
+ var result_553648283 = null;
+
+ result_553648283 = document.createTextNode(s_553648282);
+
+ return result_553648283;
+
+}
+
+function uncovered_553648723(x_553648724) {
+ var Temporary1;
+
+ var result_553648725 = null;
+
+ BeforeRet: {
+ if ((((x_553648724.kids).length == 0) && !((x_553648724.heading == null)))) {
+ if (!(x_553648724.heading.hasOwnProperty('__karaxMarker__'))) {
+ Temporary1 = x_553648724;
+ }
+ else {
+ Temporary1 = null;
+ }
+
+ result_553648725 = Temporary1;
+ break BeforeRet;
+ }
+
+ result_553648725 = {heading: x_553648724.heading, kids: [], sortId: x_553648724.sortId, doSort: x_553648724.doSort};
+ Label2: {
+ var k_553648740 = null;
+ var i_553649368 = 0;
+ var L_553649369 = (x_553648724.kids).length;
+ Label3: {
+ Label4: while (true) {
+ if (!(i_553649368 < L_553649369)) break Label4;
+ k_553648740 = x_553648724.kids[chckIndx(i_553649368, 0, (x_553648724.kids).length - 1)];
+ var y_553648741 = uncovered_553648723(k_553648740);
+ if (!((y_553648741 == null))) {
+ result_553648725.kids.push(y_553648741);;
+ }
+
+ i_553649368 += 1;
+ if (!(((x_553648724.kids).length == L_553649369))) {
+ failedAssertImpl_268435541(makeNimstrLit("iterators.nim(251, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ };
+ };
+ if (((result_553648725.kids).length == 0)) {
+ result_553648725 = null;
+ }
+
+ };
+
+ return result_553648725;
+
+}
+
+function mergeTocs_553648753(orig_553648754, news_553648755) {
+ var result_553648756 = null;
+
+ result_553648756 = uncovered_553648723(orig_553648754);
+ if ((result_553648756 == null)) {
+ result_553648756 = news_553648755;
+ }
+ else {
+ Label1: {
+ var i_553648768 = 0;
+ var colontmp__553649364 = 0;
+ colontmp__553649364 = (news_553648755.kids).length;
+ var i_553649365 = 0;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649365 < colontmp__553649364)) break Label3;
+ i_553648768 = i_553649365;
+ result_553648756.kids.push(news_553648755.kids[chckIndx(i_553648768, 0, (news_553648755.kids).length - 1)]);;
+ i_553649365 = addInt(i_553649365, 1);
+ }
+ };
+ };
+ }
+
+
+ return result_553648756;
+
+}
+
+function buildToc_553648773(orig_553648774, types_553648775, procs_553648776) {
+ var result_553648777 = null;
+
+ var newStuff_553648782 = {heading: null, kids: [], doSort: true, sortId: 0};
+ Label1: {
+ var t_553648786 = null;
+ var i_553649356 = 0;
+ var L_553649357 = (types_553648775).length;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649356 < L_553649357)) break Label3;
+ t_553648786 = types_553648775[chckIndx(i_553649356, 0, (types_553648775).length - 1)];
+ var c_553648791 = {heading: t_553648786.cloneNode(true), kids: [], doSort: true, sortId: 0};
+ t_553648786.__karaxMarker__ = true;
+ Label4: {
+ var p_553648795 = null;
+ var i_553649353 = 0;
+ var L_553649354 = (procs_553648776).length;
+ Label5: {
+ Label6: while (true) {
+ if (!(i_553649353 < L_553649354)) break Label6;
+ p_553648795 = procs_553648776[chckIndx(i_553649353, 0, (procs_553648776).length - 1)];
+ if (!(p_553648795.hasOwnProperty('__karaxMarker__'))) {
+ var xx_553648796 = p_553648795.parentNode.getElementsByClassName("attachedType");
+ if ((((xx_553648796).length == 1) && (xx_553648796[chckIndx(0, 0, (xx_553648796).length - 1)].textContent == t_553648786.textContent))) {
+ var q_553648801 = tree_553648257("A", [text_553648281(p_553648795.title)]);
+ q_553648801.setAttribute("href", p_553648795.getAttribute("href"));
+ c_553648791.kids.push({heading: q_553648801, kids: [], sortId: 0, doSort: false});;
+ p_553648795.__karaxMarker__ = true;
+ }
+
+ }
+
+ i_553649353 += 1;
+ if (!(((procs_553648776).length == L_553649354))) {
+ failedAssertImpl_268435541(makeNimstrLit("iterators.nim(251, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ };
+ };
+ newStuff_553648782.kids.push(c_553648791);;
+ i_553649356 += 1;
+ if (!(((types_553648775).length == L_553649357))) {
+ failedAssertImpl_268435541(makeNimstrLit("iterators.nim(251, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ };
+ };
+ result_553648777 = mergeTocs_553648753(orig_553648774, newStuff_553648782);
+
+ return result_553648777;
+
+}
+
+function add_553648274(parent_553648275, kid_553648276) {
+ if (((parent_553648275.nodeName == "TR") && ((kid_553648276.nodeName == "TD") || (kid_553648276.nodeName == "TH")))) {
+ var k_553648277 = document.createElement("TD");
+ k_553648277.appendChild(kid_553648276);
+ parent_553648275.appendChild(k_553648277);
+ }
+ else {
+ parent_553648275.appendChild(kid_553648276);
+ }
+
+
+
+}
+
+function setClass_553648278(e_553648279, value_553648280) {
+ e_553648279.setAttribute("class", value_553648280);
+
+
+}
+
+function toHtml_553648403(x_553648404, isRoot_553648405) {
+
+function HEX3Aanonymous_553648423(a_553648424, b_553648425) {
+ var result_553648426 = 0;
+
+ BeforeRet: {
+ if ((!((a_553648424.heading == null)) && !((b_553648425.heading == null)))) {
+ var x_553648435 = a_553648424.heading.textContent;
+ var y_553648436 = b_553648425.heading.textContent;
+ if ((x_553648435 < y_553648436)) {
+ result_553648426 = (-1);
+ break BeforeRet;
+ }
+
+ if ((y_553648436 < x_553648435)) {
+ result_553648426 = 1;
+ break BeforeRet;
+ }
+
+ result_553648426 = 0;
+ break BeforeRet;
+ }
+ else {
+ result_553648426 = subInt(a_553648424.sortId, b_553648425.sortId);
+ break BeforeRet;
+ }
+
+ };
+
+ return result_553648426;
+
+ }
+
+ var result_553648406 = null;
+
+ BeforeRet: {
+ if ((x_553648404 == null)) {
+ result_553648406 = null;
+ break BeforeRet;
+ }
+
+ if (((x_553648404.kids).length == 0)) {
+ if ((x_553648404.heading == null)) {
+ result_553648406 = null;
+ break BeforeRet;
+ }
+
+ result_553648406 = x_553648404.heading.cloneNode(true);
+ break BeforeRet;
+ }
+
+ result_553648406 = tree_553648257("DIV", []);
+ if ((!((x_553648404.heading == null)) && !(x_553648404.heading.hasOwnProperty('__karaxMarker__')))) {
+ add_553648274(result_553648406, x_553648404.heading.cloneNode(true));
+ }
+
+ var ul_553648422 = tree_553648257("UL", []);
+ if (isRoot_553648405) {
+ setClass_553648278(ul_553648422, "simple simple-toc");
+ }
+ else {
+ setClass_553648278(ul_553648422, "simple");
+ }
+
+ if (x_553648404.doSort) {
+ x_553648404.kids.sort(HEX3Aanonymous_553648423);
+ }
+
+ Label1: {
+ var k_553648448 = null;
+ var i_553649372 = 0;
+ var L_553649373 = (x_553648404.kids).length;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649372 < L_553649373)) break Label3;
+ k_553648448 = x_553648404.kids[chckIndx(i_553649372, 0, (x_553648404.kids).length - 1)];
+ var y_553648449 = toHtml_553648403(k_553648448, false);
+ if (!((y_553648449 == null))) {
+ add_553648274(ul_553648422, tree_553648257("LI", [y_553648449]));
+ }
+
+ i_553649372 += 1;
+ if (!(((x_553648404.kids).length == L_553649373))) {
+ failedAssertImpl_268435541(makeNimstrLit("iterators.nim(251, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ };
+ };
+ if (!((ul_553648422.childNodes.length == 0))) {
+ add_553648274(result_553648406, ul_553648422);
+ }
+
+ if ((result_553648406.childNodes.length == 0)) {
+ result_553648406 = null;
+ }
+
+ };
+
+ return result_553648406;
+
+}
+
+function replaceById_553648284(id_553648285, newTree_553648286) {
+ var x_553648287 = document.getElementById(id_553648285);
+ x_553648287.parentNode.replaceChild(newTree_553648286, x_553648287);
+ newTree_553648286.id = id_553648285;
+
+
+}
+
+function togglevis_553648831(d_553648832) {
+ if ((d_553648832.style.display == "none")) {
+ d_553648832.style.display = "inline";
+ }
+ else {
+ d_553648832.style.display = "none";
+ }
+
+
+
+}
+
+function groupBy(value_553648834) {
+ var toc_553648835 = document.getElementById("toc-list");
+ if ((alternative_553648830[0] == null)) {
+ var tt_553648843 = {heading: null, kids: [], sortId: 0, doSort: false};
+ toToc_553648536(toc_553648835, tt_553648843);
+ tt_553648843 = tt_553648843.kids[chckIndx(0, 0, (tt_553648843.kids).length - 1)];
+ var types_553648848 = [[]];
+ var procs_553648853 = [[]];
+ extractItems_553648325(tt_553648843, "Types", types_553648848, 0);
+ extractItems_553648325(tt_553648843, "Procs", procs_553648853, 0);
+ extractItems_553648325(tt_553648843, "Converters", procs_553648853, 0);
+ extractItems_553648325(tt_553648843, "Methods", procs_553648853, 0);
+ extractItems_553648325(tt_553648843, "Templates", procs_553648853, 0);
+ extractItems_553648325(tt_553648843, "Macros", procs_553648853, 0);
+ extractItems_553648325(tt_553648843, "Iterators", procs_553648853, 0);
+ var ntoc_553648854 = buildToc_553648773(tt_553648843, types_553648848[0], procs_553648853[0]);
+ var x_553648855 = toHtml_553648403(ntoc_553648854, true);
+ alternative_553648830[0] = tree_553648257("DIV", [x_553648855]);
+ }
+
+ if ((value_553648834 == "type")) {
+ replaceById_553648284("tocRoot", alternative_553648830[0]);
+ }
+ else {
+ replaceById_553648284("tocRoot", tree_553648257("DIV", []));
+ }
+
+ togglevis_553648831(document.getElementById("toc-list"));
+
+
+}
+
+function HEX5BHEX5D_721421547(s_721421550, x_721421551) {
+ var result_721421552 = [];
+
+ var a_721421554 = x_721421551.a;
+ var L_721421556 = addInt(subInt(subInt((s_721421550).length, x_721421551.b), a_721421554), 1);
+ result_721421552 = nimCopy(null, mnewString(chckRange(L_721421556, 0, 2147483647)), NTI33554449);
+ Label1: {
+ var i_721421561 = 0;
+ var i_553649382 = 0;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649382 < L_721421556)) break Label3;
+ i_721421561 = i_553649382;
+ result_721421552[chckIndx(i_721421561, 0, (result_721421552).length - 1)] = s_721421550[chckIndx(addInt(i_721421561, a_721421554), 0, (s_721421550).length - 1)];
+ i_553649382 = addInt(i_553649382, 1);
+ }
+ };
+ };
+
+ return result_721421552;
+
+}
+
+function HEX2EHEX2E_939524199(a_939524202, b_939524203) {
+ var result_939524206 = ({a: 0, b: 0});
+
+ result_939524206 = nimCopy(result_939524206, {a: a_939524202, b: b_939524203}, NTI939524179);
+
+ return result_939524206;
+
+}
+async function loadIndex_553649049() {
+ var result_553649051 = null;
+
+ BeforeRet: {
+ var indexURL_553649057 = document.getElementById("indexLink").getAttribute("href");
+ var rootURL_553649082 = HEX5BHEX5D_721421547(cstrToNimstr(indexURL_553649057), HEX2EHEX2E_939524199(0, 14));
+ var resp_553649094 = (await (await fetch(indexURL_553649057)).text());
+ var indexElem_553649095 = document.createElement("div");
+ indexElem_553649095.innerHTML = resp_553649094;
+ Label1: {
+ var href_553649116 = null;
+ var colontmp__553649376 = [];
+ colontmp__553649376 = indexElem_553649095.getElementsByClassName("reference");
+ var i_553649378 = 0;
+ var L_553649379 = (colontmp__553649376).length;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649378 < L_553649379)) break Label3;
+ href_553649116 = colontmp__553649376[chckIndx(i_553649378, 0, (colontmp__553649376).length - 1)];
+ href_553649116.setAttribute("href", toJSStr((rootURL_553649082 || []).concat(cstrToNimstr(href_553649116.getAttribute("href")) || [])));
+ db_553648872[0].push(href_553649116);;
+ contents_553648873[0].push(href_553649116.getAttribute("data-doc-search-tag"));;
+ i_553649378 += 1;
+ if (!(((colontmp__553649376).length == L_553649379))) {
+ failedAssertImpl_268435541(makeNimstrLit("iterators.nim(251, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ };
+ };
+ result_553649051 = undefined;
+ break BeforeRet;
+ };
+
+ return result_553649051;
+
+}
+
+function then_553649225(future_553649228, onSuccess_553649229, onReject_553649230) {
+ var result_553649231 = null;
+
+ BeforeRet: {
+ var ret_553649241 = null;
+ ret_553649241 = future_553649228.then(onSuccess_553649229, onReject_553649230)
+ result_553649231 = ret_553649241;
+ break BeforeRet;
+ };
+
+ return result_553649231;
+
+}
+
+function nsuToLowerAsciiChar(c_721420373) {
+ var result_721420374 = 0;
+
+ if ((ConstSet2[c_721420373] != undefined)) {
+ result_721420374 = (c_721420373 ^ 32);
+ }
+ else {
+ result_721420374 = c_721420373;
+ }
+
+
+ return result_721420374;
+
+}
+
+function fuzzyMatch_704643088(pattern_704643089, str_704643090) {
+ var Temporary4;
+ var Temporary5;
+ var Temporary6;
+ var Temporary7;
+ var Temporary8;
+
+ var result_704643093 = {Field0: 0, Field1: false};
+
+ var scoreState_704643094 = (-100);
+ var headerMatched_704643095 = false;
+ var unmatchedLeadingCharCount_704643096 = 0;
+ var consecutiveMatchCount_704643097 = 0;
+ var strIndex_704643098 = 0;
+ var patIndex_704643099 = 0;
+ var score_704643100 = 0;
+ Label1: {
+ Label2: while (true) {
+ if (!((strIndex_704643098 < ((str_704643090) == null ? 0 : (str_704643090).length)) && (patIndex_704643099 < ((pattern_704643089) == null ? 0 : (pattern_704643089).length)))) break Label2;
+ Label3: {
+ var patternChar_704643103 = nsuToLowerAsciiChar(pattern_704643089.charCodeAt(chckIndx(patIndex_704643099, 0, (pattern_704643089).length - 1)));
+ var strChar_704643104 = nsuToLowerAsciiChar(str_704643090.charCodeAt(chckIndx(strIndex_704643098, 0, (str_704643090).length - 1)));
+ if ((ConstSet3[patternChar_704643103] != undefined)) {
+ patIndex_704643099 = addInt(patIndex_704643099, 1);
+ break Label3;
+ }
+
+ if ((ConstSet4[strChar_704643104] != undefined)) {
+ strIndex_704643098 = addInt(strIndex_704643098, 1);
+ break Label3;
+ }
+
+ if ((!(headerMatched_704643095) && (strChar_704643104 == 58))) {
+ headerMatched_704643095 = true;
+ scoreState_704643094 = (-100);
+ score_704643100 = ((Math.floor((0.5 * score_704643100))) | 0);
+ patIndex_704643099 = 0;
+ strIndex_704643098 = addInt(strIndex_704643098, 1);
+ break Label3;
+ }
+
+ if ((strChar_704643104 == patternChar_704643103)) {
+ switch (scoreState_704643094) {
+ case (-100):
+ case 20:
+ scoreState_704643094 = 10;
+ break;
+ case 0:
+ scoreState_704643094 = 5;
+ score_704643100 = addInt(score_704643100, scoreState_704643094);
+ break;
+ case 10:
+ case 5:
+ consecutiveMatchCount_704643097 = addInt(consecutiveMatchCount_704643097, 1);
+ scoreState_704643094 = 5;
+ score_704643100 = addInt(score_704643100, mulInt(5, consecutiveMatchCount_704643097));
+ if ((scoreState_704643094 == 10)) {
+ score_704643100 = addInt(score_704643100, 10);
+ }
+
+ var onBoundary_704643156 = (patIndex_704643099 == ((pattern_704643089) == null ? -1 : (pattern_704643089).length - 1));
+ if ((!(onBoundary_704643156) && (strIndex_704643098 < ((str_704643090) == null ? -1 : (str_704643090).length - 1)))) {
+ var nextPatternChar_704643157 = nsuToLowerAsciiChar(pattern_704643089.charCodeAt(chckIndx(addInt(patIndex_704643099, 1), 0, (pattern_704643089).length - 1)));
+ var nextStrChar_704643158 = nsuToLowerAsciiChar(str_704643090.charCodeAt(chckIndx(addInt(strIndex_704643098, 1), 0, (str_704643090).length - 1)));
+ if (!!((ConstSet5[nextStrChar_704643158] != undefined))) Temporary4 = false; else { Temporary4 = !((nextStrChar_704643158 == nextPatternChar_704643157)); } onBoundary_704643156 = Temporary4;
+ }
+
+ if (onBoundary_704643156) {
+ scoreState_704643094 = 20;
+ score_704643100 = addInt(score_704643100, scoreState_704643094);
+ }
+
+ break;
+ case (-1):
+ case (-3):
+ if (!((ConstSet6[str_704643090.charCodeAt(chckIndx(subInt(strIndex_704643098, 1), 0, (str_704643090).length - 1))] != undefined))) Temporary5 = true; else { if (!(ConstSet7[str_704643090.charCodeAt(chckIndx(subInt(strIndex_704643098, 1), 0, (str_704643090).length - 1))] != undefined)) Temporary6 = false; else { Temporary6 = (ConstSet8[str_704643090.charCodeAt(chckIndx(strIndex_704643098, 0, (str_704643090).length - 1))] != undefined); } Temporary5 = Temporary6; } var isLeadingChar_704643182 = Temporary5;
+ if (isLeadingChar_704643182) {
+ scoreState_704643094 = 10;
+ }
+ else {
+ scoreState_704643094 = 0;
+ score_704643100 = addInt(score_704643100, scoreState_704643094);
+ }
+
+ break;
+ }
+ patIndex_704643099 = addInt(patIndex_704643099, 1);
+ }
+ else {
+ switch (scoreState_704643094) {
+ case (-100):
+ scoreState_704643094 = (-3);
+ score_704643100 = addInt(score_704643100, scoreState_704643094);
+ break;
+ case 5:
+ scoreState_704643094 = (-1);
+ score_704643100 = addInt(score_704643100, scoreState_704643094);
+ consecutiveMatchCount_704643097 = 0;
+ break;
+ case (-3):
+ if ((unmatchedLeadingCharCount_704643096 < 3)) {
+ scoreState_704643094 = (-3);
+ score_704643100 = addInt(score_704643100, scoreState_704643094);
+ }
+
+ unmatchedLeadingCharCount_704643096 = addInt(unmatchedLeadingCharCount_704643096, 1);
+ break;
+ default:
+ scoreState_704643094 = (-1);
+ score_704643100 = addInt(score_704643100, scoreState_704643094);
+ break;
+ }
+ }
+
+ strIndex_704643098 = addInt(strIndex_704643098, 1);
+ };
+ }
+ };
+ if (!(patIndex_704643099 == ((pattern_704643089) == null ? 0 : (pattern_704643089).length))) Temporary7 = false; else { if ((strIndex_704643098 == ((str_704643090) == null ? 0 : (str_704643090).length))) Temporary8 = true; else { Temporary8 = !((ConstSet9[str_704643090.charCodeAt(chckIndx(strIndex_704643098, 0, (str_704643090).length - 1))] != undefined)); } Temporary7 = Temporary8; } if (Temporary7) {
+ score_704643100 = addInt(score_704643100, 10);
+ }
+
+ var colontmp__553649395 = nimMax(0, score_704643100);
+ var colontmp__553649396 = (0 < score_704643100);
+ result_704643093 = nimCopy(result_704643093, {Field0: colontmp__553649395, Field1: colontmp__553649396}, NTI704643086);
+
+ return result_704643093;
+
+}
+
+function escapeCString_553648874(x_553648875, x_553648875_Idx) {
+ var s_553648876 = [];
+ Label1: {
+ var c_553648877 = 0;
+ var iHEX60gensym12_553649399 = 0;
+ var nHEX60gensym12_553649400 = ((x_553648875[x_553648875_Idx]) == null ? 0 : (x_553648875[x_553648875_Idx]).length);
+ Label2: {
+ Label3: while (true) {
+ if (!(iHEX60gensym12_553649399 < nHEX60gensym12_553649400)) break Label3;
+ c_553648877 = x_553648875[x_553648875_Idx].charCodeAt(chckIndx(iHEX60gensym12_553649399, 0, (x_553648875[x_553648875_Idx]).length - 1));
+ switch (c_553648877) {
+ case 60:
+ s_553648876.push.apply(s_553648876, [38,108,116,59]);;
+ break;
+ case 62:
+ s_553648876.push.apply(s_553648876, [38,103,116,59]);;
+ break;
+ default:
+ addChar(s_553648876, c_553648877);;
+ break;
+ }
+ iHEX60gensym12_553649399 += 1;
+ }
+ };
+ };
+ x_553648875[x_553648875_Idx] = toJSStr(s_553648876);
+
+
+}
+
+function dosearch_553648878(value_553648879) {
+
+function HEX3Aanonymous_553648906(a_553648911, b_553648912) {
+ var result_553648917 = 0;
+
+ result_553648917 = subInt(b_553648912["Field1"], a_553648911["Field1"]);
+
+ return result_553648917;
+
+ }
+
+ var result_553648880 = null;
+
+ BeforeRet: {
+ if (((db_553648872[0]).length == 0)) {
+ break BeforeRet;
+ }
+
+ var ul_553648884 = tree_553648257("UL", []);
+ result_553648880 = tree_553648257("DIV", []);
+ setClass_553648278(result_553648880, "search_results");
+ var matches_553648889 = [];
+ Label1: {
+ var i_553648897 = 0;
+ var colontmp__553649386 = 0;
+ colontmp__553649386 = (db_553648872[0]).length;
+ var i_553649387 = 0;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649387 < colontmp__553649386)) break Label3;
+ i_553648897 = i_553649387;
+ Label4: {
+ var c_553648898 = contents_553648873[0][chckIndx(i_553648897, 0, (contents_553648873[0]).length - 1)];
+ if (((c_553648898 == "Examples") || (c_553648898 == "PEG construction"))) {
+ break Label4;
+ }
+
+ var tmpTuple_553648899 = fuzzyMatch_704643088(value_553648879, c_553648898);
+ var score_553648900 = tmpTuple_553648899["Field0"];
+ var matched_553648901 = tmpTuple_553648899["Field1"];
+ if (matched_553648901) {
+ matches_553648889.push({Field0: db_553648872[0][chckIndx(i_553648897, 0, (db_553648872[0]).length - 1)], Field1: score_553648900});;
+ }
+
+ };
+ i_553649387 = addInt(i_553649387, 1);
+ }
+ };
+ };
+ matches_553648889.sort(HEX3Aanonymous_553648906);
+ Label5: {
+ var i_553648934 = 0;
+ var colontmp__553649390 = 0;
+ colontmp__553649390 = nimMin((matches_553648889).length, 29);
+ var i_553649391 = 0;
+ Label6: {
+ Label7: while (true) {
+ if (!(i_553649391 < colontmp__553649390)) break Label7;
+ i_553648934 = i_553649391;
+ matches_553648889[chckIndx(i_553648934, 0, (matches_553648889).length - 1)]["Field0"].innerHTML = matches_553648889[chckIndx(i_553648934, 0, (matches_553648889).length - 1)]["Field0"].getAttribute("data-doc-search-tag");
+ escapeCString_553648874(matches_553648889[chckIndx(i_553648934, 0, (matches_553648889).length - 1)]["Field0"], "innerHTML");
+ add_553648274(ul_553648884, tree_553648257("LI", [matches_553648889[chckIndx(i_553648934, 0, (matches_553648889).length - 1)]["Field0"]]));
+ i_553649391 = addInt(i_553649391, 1);
+ }
+ };
+ };
+ if ((ul_553648884.childNodes.length == 0)) {
+ add_553648274(result_553648880, tree_553648257("B", [text_553648281("no search results")]));
+ }
+ else {
+ add_553648274(result_553648880, tree_553648257("B", [text_553648281("search results")]));
+ add_553648274(result_553648880, ul_553648884);
+ }
+
+ };
+
+ return result_553648880;
+
+}
+
+function search() {
+
+function wrapper_553649210() {
+ var elem_553649211 = document.getElementById("searchInput");
+ var value_553649212 = elem_553649211.value;
+ if (!((((value_553649212) == null ? 0 : (value_553649212).length) == 0))) {
+ if ((oldtoc_553649205[0] == null)) {
+ oldtoc_553649205[0] = document.getElementById("tocRoot");
+ }
+
+ var results_553649216 = dosearch_553648878(value_553649212);
+ replaceById_553648284("tocRoot", results_553649216);
+ }
+ else {
+ if (!((oldtoc_553649205[0] == null))) {
+ replaceById_553648284("tocRoot", oldtoc_553649205[0]);
+ }
+ }
+
+
+ }
+
+ if ((loadIndexFut_553649208[0] == null)) {
+ loadIndexFut_553649208[0] = loadIndex_553649049();
+ var _ = then_553649225(loadIndexFut_553649208[0], wrapper_553649210, null);
+ }
+
+ if (!((timer_553649206[0] == null))) {
+ clearTimeout(timer_553649206[0]);
+ }
+
+ timer_553649206[0] = setTimeout(wrapper_553649210, 400);
+
+
+}
+
+function copyToClipboard() {
+
+ function updatePreTags() {
+
+ const allPreTags = document.querySelectorAll("pre")
+
+ allPreTags.forEach((e) => {
+
+ const div = document.createElement("div")
+ div.classList.add("copyToClipBoard")
+
+ const preTag = document.createElement("pre")
+ preTag.innerHTML = e.innerHTML
+
+ const button = document.createElement("button")
+ button.value = e.textContent.replace('...', '')
+ button.classList.add("copyToClipBoardBtn")
+ button.style.cursor = "pointer"
+
+ div.appendChild(preTag)
+ div.appendChild(button)
+
+ e.outerHTML = div.outerHTML
+
+ })
+ }
+
+
+ function copyTextToClipboard(e) {
+ const clipBoardContent = e.target.value
+ navigator.clipboard.writeText(clipBoardContent).then(function() {
+ e.target.style.setProperty("--clipboard-image", "var(--clipboard-image-selected)")
+ }, function(err) {
+ console.error("Could not copy text: ", err);
+ });
+ }
+
+ window.addEventListener("click", (e) => {
+ if (e.target.classList.contains("copyToClipBoardBtn")) {
+ copyTextToClipboard(e)
+ }
+ })
+
+ window.addEventListener("mouseover", (e) => {
+ if (e.target.nodeName === "PRE") {
+ e.target.nextElementSibling.style.setProperty("--clipboard-image", "var(--clipboard-image-normal)")
+ }
+ })
+
+ window.addEventListener("DOMContentLoaded", updatePreTags)
+
+
+
+
+}
+var Temporary1;
+var t_553648167 = window.localStorage.getItem("theme");
+if ((t_553648167 == null)) {
+Temporary1 = "auto";
+}
+else {
+Temporary1 = t_553648167;
+}
+
+setTheme(Temporary1);
+var alternative_553648830 = [null];
+var db_553648872 = [[]];
+var contents_553648873 = [[]];
+var oldtoc_553649205 = [null];
+var timer_553649206 = [null];
+var loadIndexFut_553649208 = [null];
+copyToClipboard();
+window.addEventListener("DOMContentLoaded", onDOMLoaded, false);
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..0c9c374
--- /dev/null
+++ b/index.html
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+Index
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/nimdoc.out.css b/nimdoc.out.css
new file mode 100644
index 0000000..a9e4ac9
--- /dev/null
+++ b/nimdoc.out.css
@@ -0,0 +1,1033 @@
+/*
+Stylesheet for use with Docutils/rst2html.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+
+Modified from Chad Skeeters' rst2html-style
+https://bitbucket.org/cskeeters/rst2html-style/
+
+Modified by Boyd Greenfield and narimiran
+*/
+
+:root {
+ --primary-background: #fff;
+ --secondary-background: ghostwhite;
+ --third-background: #e8e8e8;
+ --info-background: #50c050;
+ --warning-background: #c0a000;
+ --error-background: #e04040;
+ --border: #dde;
+ --text: #222;
+ --anchor: #07b;
+ --anchor-focus: #607c9f;
+ --input-focus: #1fa0eb;
+ --strong: #3c3c3c;
+ --hint: #9A9A9A;
+ --nim-sprite-base64: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAN4AAAA9CAYAAADCt9ebAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjAzOjQ4KzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMjoyODo0MSswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMjoyODo0MSswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozMzM0ZjAxYS0yMDExLWE1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");
+
+ --keyword: #5e8f60;
+ --identifier: #222;
+ --comment: #484a86;
+ --operator: #155da4;
+ --punctuation: black;
+ --other: black;
+ --escapeSequence: #c4891b;
+ --number: #252dbe;
+ --literal: #a4255b;
+ --program: #6060c0;
+ --option: #508000;
+ --raw-data: #a4255b;
+
+ --clipboard-image-normal: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: black' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E %3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2' /%3E %3C/svg%3E");
+ --clipboard-image-selected: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: black' viewBox='0 0 20 20' fill='currentColor'%3E %3Cpath d='M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z' /%3E %3Cpath d='M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z' /%3E %3C/svg%3E");
+ --clipboard-image: var(--clipboard-image-normal)
+}
+
+[data-theme="dark"] {
+ --primary-background: #171921;
+ --secondary-background: #1e202a;
+ --third-background: #2b2e3b;
+ --info-background: #008000;
+ --warning-background: #807000;
+ --error-background: #c03000;
+ --border: #0e1014;
+ --text: #fff;
+ --anchor: #8be9fd;
+ --anchor-focus: #8be9fd;
+ --input-focus: #8be9fd;
+ --strong: #bd93f9;
+ --hint: #7A7C85;
+ --nim-sprite-base64: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARMAAABMCAYAAABOBlMuAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjE4OjIyKzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDplZGViMzU3MC1iNmZjLWQy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");
+
+ --keyword: #ff79c6;
+ --identifier: #f8f8f2;
+ --comment: #6272a4;
+ --operator: #ff79c6;
+ --punctuation: #f8f8f2;
+ --other: #f8f8f2;
+ --escapeSequence: #bd93f9;
+ --number: #bd93f9;
+ --literal: #f1fa8c;
+ --program: #9090c0;
+ --option: #90b010;
+ --raw-data: #8be9fd;
+
+ --clipboard-image-normal: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: lightgray' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E %3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2' /%3E %3C/svg%3E");
+ --clipboard-image-selected: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: lightgray' viewBox='0 0 20 20' fill='currentColor'%3E %3Cpath d='M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z' /%3E %3Cpath d='M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z' /%3E %3C/svg%3E");
+ --clipboard-image: var(--clipboard-image-normal);
+}
+
+@media (prefers-color-scheme: dark) {
+ [data-theme="auto"] {
+ --primary-background: #171921;
+ --secondary-background: #1e202a;
+ --third-background: #2b2e3b;
+ --info-background: #008000;
+ --warning-background: #807000;
+ --error-background: #c03000;
+ --border: #0e1014;
+ --text: #fff;
+ --anchor: #8be9fd;
+ --anchor-focus: #8be9fd;
+ --input-focus: #8be9fd;
+ --strong: #bd93f9;
+ --hint: #7A7C85;
+ --nim-sprite-base64: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARMAAABMCAYAAABOBlMuAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjE4OjIyKzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDplZGViMzU3MC1iNmZjLWQyNDQtYTExZi0yMjc5YmY4NDNhYTAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ZWRlYjM1NzAtYjZmYy1kMjQ0LWExMWYtMjI3OWJmODQzYWEwIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZWRlYjM1NzAtYjZmYy1kMjQ0LWExMWYtMjI3OWJmODQzYWEwIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplZGViMzU3MC1iNmZjLWQyNDQtYTExZi0yMjc5YmY4NDNhYTAiIHN0RXZ0OndoZW49IjIwMTktMTItMDNUMDE6MTg6MjIrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4wIChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4JZNR8AAAfG0lEQVR4nO2deViTZ7r/7yxkJaxJ2MK+GCBAMCwS1kgUFQSKK4XWWqsz1jpjp3b0tDP1V+eqU391fqfT/mpPPd20drTFDS0KFEVWJSGAEgLIZpAICBJACIRs549Rj1WILAkBfD/XlevySp68z/0S3+/7vPdzLyidTgcLkU2bd+z39/f/q1gshsrKSoJELFCa2iaEuU9K6kb+8uXxv54/fzE8L/eswNT2zCfQpjbAGKS8lPFKSEjIXiaTCSEhIeDj4xNnapsQ5j6rktZGp6UlfxIdzQVzCplmanvmG1hTG2BIAtlc26CgoDfT0tL2e3l5AQCAjY0NkMnk/a9s2k6rrKw8UV8n1JjYTIQ5RlAw14KzmL3xze1vfJyUuMJaq9UCFovFm9qu+YbBxcSPFUYkk8l2Q0NDsvo6ocrQx5+I8Ih4bz6f/0l8fHyKlZXV4/dRKBQwmcwwMpn8A4FAoPgHhH9bV1sxa488wZxoaycnJ/a9e/duCa5fkc3WvAiTI4Ib77p+XdqHG9anbfLy8gAAgLGxMdBpF+bjvzExqJj4scKI0dHRnwQHB++orq7+AgDeMuTxJ2Jl4rqU9PT0EwEBAUQCgTDuGAaDAampqYepVKpHUHDk325Ulw0a266YuFW+Gzdu/MDPz29jfn7+XgA4aOw5ESZP6kvpCXv3vnM8NiaSamVl+fj9BepGNDoGFRN7e/slcXFxO1xcXMDJyWnH7j//H/fi4uJdgutXmgw5z5O8smn7X9euXbvf29sbMBjMhONQKBRYWVlBbGzsbjMzM3JoOG+/sKKwy1h2rd/4elpGRsYuLy+vaDweD2w2Oy1h5ZrCvEunEaeeiVnMiabyl/F2/+X9P+8JDPQHHA5napMWBAYTk6DgSNuEhIS9DAYDAP7tq1i6dOkqOp3OWbNu0wens44emeoxA9lcWwKBYEMkEm2JRKIdHo+3QKFQWJ1Op8ZgMER3d/dVq1evTnFycpr0MSkUCsTExGzH4/Gk1LTME/39/TI0Go1FoVCg1WrVY2NjipGRkcGRkRH5dPwrEZHLXMPCwjJSUlIy3dzcfB+97+rqGhYSEpIOAIiYmBguN3zL77dt3uPh4W5qUxYUBhMTb2/vjeHh4cvR6P/dILK0tITIyEg7BweHr363/Z3Ampqaf1Zcu/zMKiVsyVJvMplsRyKR7IhEor2FhYUbhUJhJCYm2pFIJB6JRAIymQx4PB7QaDRoNBowMzMDJycnwOOn7icjEokQGxu7icFgbLp///7jFY1WqwWlUgkjIyOgUCgO7Ni5Rz48PCwfHh7uGRkZeaBQKOSjo6ODCoVCXlNVKn/6uCsT13FXrVr1emho6BYKhfLMnP7+/omrU9LPX8g+UThloxEMxqJFXjxESAyPQcSEExrLWLNmzW57e/txP/fw8ABHR8cdDAaDt3xF2ru9vb03sVgs0cbGxs/FxWVZUlISj0aj+dna2oKtrS1M5PcwJCgUCry8vODRrs84vPfoH6OjoyCXy6Gvr+/R6+CWrX9s7evrk/b19bWr1Wqli4sLZ8OGDe95eXmxUSjUuAd0cHDwjoqK2sYKXFIhvnldYYTTQpgU4/8+jyASCYDGoCd+ZkYYF8OICYezl8PhuOkbQyAQIDo62s/NzS2np6cHbGxsgEajAYFAAAwGA1gsFia6CE0NgUAABwcHsLe3B61WC2q1eo9WqwWNRgNKpRLUajUQiUSgUCh6zwGHwwGTydzo5+eXBQBnZu8MEJ5keHhYPqyYWMtHR0ZBpVIhYj9FUDONgOUvT12+du3avMDAQJjssdRqNWCxCyrEZdLodDoQi8Ulx44de628NL/V1Pa8iERE8l2dHB2CJvpcq9Nqbt1qKURWj1Njxld0ZGTkAW9v70kLCQC8sEIC8O/HKx8fn2gmk8kHgCk7pRFmzrWyAikASE1tx0Jj2uH0EZHL/N7YtuvT4OBgzmz4OBYSeDweIiMjt2S++vtMP1YYEmmJsCCY8mNOIJtr6+zsHBcZGXmIw+G4mZubG8m0hU9HRwcUFxe/KxQKTyDRsQjznSmJCS9+dVRERMTfQ0NDo2xtbfUGiSFMjtHRUaitrc3Jzc09kHvxVLmp7UFAmC6oZQkvrZLL5RJhReHtiQb5scKIXC7371FRUX90dnYGIpE4JR8Jgn40Gg20t7fXFxYWfnr9+vWjz8sdYi+Osh4vzgUBwZSgtu94V+fs7Hx7YGCgra6u7khLS0u2RCwYeTQgKmYFh8fj/f/g4OAldnZ2prR1wdPd3Q1CofBQSUnJkdLi3N8E93FCY6k+Pj48FxcXjlar1ZSWlh65VvYr4kREmDNg79+/D3FxcW5OTk5uXl5evNbW1tL0jK3ZXV1d1ykUintycvInoaGhdkj+gvGxs7MDPp+/m0AgWMQvS/lyeHhYTqPRPJycnIJSU1NZ3t7eW2g0Gly/fv2oWq1Gij0hzClQ/gHhpLS0tEM8Hm/7I8Ho7++HlpYWsLa2Bg8PDxOb+OKhUCigqakJ7t+/D25ubuDu7g4oFAp0Oh08ePAAvv7666TTWUdzTG0nAsKTYMU3ryuSU18+4+bmFrZo0SIOAICVlRUsXrx4zkakLnRIJBI8CgJ8MtdJp9NBZ2enqL29XWRC8xAQxgUNAHD+3L8KGhoaCp78ABES04JCoX4jJAAAAwMDUFtbe96YpRMQEKbL41DU5ubmko6Ojj2PSgggzD36+/vrb9y4cX425zzw93/8EBjon2is44+NjSkePBjqGRwc7G5v7xBV19w8U5B/3qgrr9+/uWtXUuKKD/TZ9MXh/066/OuFmunO8dGBQ98HBbGSp/t9U6LRaDXK0dHBoeFhuVzeL22/0yFqamopufjLqRJ933ssJi0tLSXV1dWHGAzGbuObOzs8ubqa71vZKpUKOjo6blwpOF8zm/Mu5cVkLlkSaswprAHAaVihgK7O7oSGxltvfXLon3nXK4RHT2cdN4pfKDCAlZyUuMJan02nTmczAaBmunPw4qI3cbnh0/36XICq0+lgcPABp7OrK629vUP5z8++LLh2XXD05L++yxrvC4/F5EZ12WBS8saLS5Ys2U2lUufUY45SqQSlUgkqlQrUavXj19jYGGg0GtBoNKDT6UCn05VotVq1TqfToFAojFar1eh0Og0Wi8XhcDgeGo1+/PhgZmYGOBwOsFgsmJmZ/eY1F+nt7YXa2trs2Z73wdCQBgCMHp1IJpHA09MdPD3dLRIS+OtKisvWvbP7vf2lZdePVFwzbHTwyMiI3hidkZFRUKvUYzOZ48HQkBIA5nWqBAqFAktLC7C0tADmIh88Pz4uMSyUk7hn776DV4tKPn/6d/lNxp1MJqsRCASf8vn8XdMpOjRTVCoVjI2NgUqlAq1WCyMjI9DX1wf379+Hvr6+/Q8ePOgdGRmRKxSKx0WLFAqFXKlUKnQ6nUar1arHq47mxwrD4/F4Eg6HI2GxWDwej7cgkUjWFAqFam5uTjU3N6eRyeQPLSwswNraGqysrIBAIDwWFywW+zja11Qi29LSclIikeSZZPJZBovBAI8XA8HBQR9kZZ3lR8cmvFZSlGe00p8IkwONRkNERBj4+i7a4+XpHv307/IbMakWlciXJbx0nMPh7Jqo0JGh0el0MDo6Cl1dXSCVSkEmk7177969W319fe1DQ0M9KpVKoVarlWq1WjndNhUPG3ApAWDcOxLTLwSDwWAOotFoDBaLxRMIBAsrKysne3t7Xzqd7k2n0/c4OzsDlUoFHA4364IyMDAATU1NxdWikhcq6tXKyhJezljPJZKI2eERS5cZeoWCMD2srCwhPX0tVzk2djiCG//GtfLLUoBxShB0dHTU3Lx580sLC4vtJBLJKMZoNBqQSqUglUqPdnR01PT09DT19/fLHjx40DM0NNQ72933GiSVGgB4JFQK+LfoSAGgnL04yppEIh2xtLS0t7GxcaFSqR7Ozs4fMRgMcHR0nJX8pJs3b54Ui8UXjT7RHIRMIkFK8irfwcEHPwQELUmqvYHUGJkLmJubw8YNa/i9vfffY/px3myQiDTPiEl9nVDDX576jaenZ7SnpyfLUJNrNBqQyWRw+/bt4x0dHTdkMlltV1dXw/XygjkdEv4wB0YOAK0AUM70C8HQ6fSzdDrdm0qlejg6OrLc3Ny2MBiMadWjfR4PHjyAmzdvZs/1v5MxoVAokJK8iicWS95k+nH+s0EiQhqpzQGoVFtYk5a87ba0XQAA34xbpagg/5zoT7s/OGNnZ8eaaYkBuVwOnZ2d5VKpVNTS0lLS2NhYWFVZ3Dujg5qQh6uY+ocvCAiKIPn4+Jz19PSMdnV15VCpVL6Dg4NBViw6nQ5EItHRpqamqzM+2DzHzo4O69amftLQeKsAZrDLgmBY/PyYsCIhfs+SiKUFE5Y8EwqFx11cXDihoaFTjjFAoVAwPDwMHR0dourq6jNCofDHhZqUVnvjmgIAcgAgJyg40mLRokX8kJCQjT4+PussLS1n1JPl7t27UFxcfHguB6mNjY2B7G4naNRTWyygUCjAYDGAx+PB0sICSCSi3vFYLBbCwjjA8vddBQtATKb7d3saBwc7IJPJBpsHjUGDGRYLJBIJLK0sAfucmyIGg4FFi3y8AwNZtycUk5KiS02vvf7WWQaDkejg4DApQwAeh3xDaWnpPoFAcPxFqnP6sEvgGf+A8Bx3d/cvIyIiNi1evHjT8wpNj8fAwACUlZW9P9dD5+/ckcFbf9gd2dcnn9LNAovF4inmZHtXNxdOdBR3+/JlS33pdP29wolEInA4weuiYxOy5vvuTkeHDHb+8c8xvb33Z3R9/N+Df+uIjYk02DwkEsna2trS1d/fNyGeF7uTyw1/7g3R3t4O2OxA/TVghULhcQqFQk1JSfmYSNR/5wD4d6EfgUBwvLS09IhUKhW9qAV5H9YjKQwJi6uvrKw8ERoamhkSEpKp7w7yJEqlEiQSyZmysrJv53qjdaVSCZdyTk+3qFMrAJRHRPLPN95qeifj5fU7mYt8JhyMRqMhMJDFdnF25gDAvBYTpXIMWlpay2fq/8m5mDcIABYGnEcGAGI/VlhBZWX1yZdSkz55OX0dV5+7w9bGGvz8mPrFpK62QskJjf2GTqd7x8bGbpnID4BCoUAmk0lLSkqOiESik2UleS/MakQflYKrXQDQxY1a3tTe3i6KiIjY5OXlxX7e9+rr6wsuXbr0t4ffn9OgMWjghMZQRcLp+8GulRVI/QPC37Wxtnal0ajJtjY2E451ZjiBra31vE9lR2PQQKFQaAAwo98Yi8Xq9fpPd56HO6rlvKWJv/PwcK+JilyCmajWMw6HAzs7+rMFpQOCIn6zHywSFvXm5eUdFAqFZ9Rq9bgHa2trq79w4cK+zz49cAARkmcpL81v/a/Dhz49d+7c3qqqqjyVSjXuOJ1OBxKJpDw3N/fA5V+zax6978cKw/sHhM/raMrnUVdboSy4fPWQSFSjd5yFBQWIRNKEd2IEw1J4JUd88WL+R51d3XrHWVDMnxUTa2tr1zXrNiUGsrmPf7DS4tymCxcu7Kuurs55+kKQSqVN586d23vs+8NHDXUCC5Wzp3/Iy8rKeruysvLM2Nhvo7VVKhXU1tYWnj17du/T7UOdnZ2D7OzsfGGB09raVi4S1RzXl0eFw+EAj8chYjKLVFffyOrq1C8mJBLpWTFRKBRyDofzC4vFWvXk+1ev/CLOzs7eKxAIslQqFeh0Oujp6enKzs7em/XTd7OayTqfKb56sT4rK+sPAoHg5KO/o0KhAKFQmHXy5MkdF3/5+TeZmctXpIXZ29v7zqVcKWNRX1epuXu3U/y8pEw0GmndOZt0dnXVDw0P6/W5oNHoZ30mQ0NDPb29vfvj4+Pf3rR5B/7od188XnEUXr4gDgmL+0NfX5/U19d3d3l5+YGfTnyDtLmcIhXXLsu4UcvfR6PRGGtra9eysrIjYrE45+kt4Fheou/69es/unnz5vm7d+/Wmsre2WRkZGTQ1DYg/JYGiUiTm1ugBAC9IfHPiEmDpFITE7fqJI/H27lmzZpDq5LWtz55t6wUXO3ihMYerK+vz2tpaUFaM0yT8tL81ujYle+TSCTrvEunBU9/voTLd92wYcPHVCqV39XVdXCu7+oYCp1O90Kc50Jk3I5+xVcv1jc3N5d4enpSMzIyvkpK3sh78nORsKg3++yPBS/q1q+hKCm61DSekERGJ3ikp6d/ERsbm1xVVXWwtbX1hRFtFAqFPMLMUyZsDyoQCI7LZDKIiIjwzczM/GpV0vro2TTsRSUqZoX3+vXrP1u9enXi0NAQiESirIdRtggIc5oJ40zq6uryGhoa8ry8vBJCQ0O9USjU94mrN7yWc+EnvaXb5gJMvxCMp6cnl0Kh2Le1tZVXXLs8L1LXefGrWRkZGZ/x+XyeUqkEkUh0vqenZ14HZyG8OEwoJjdrygd37NxTEBkZmWBtbQ3BwcEeKBTq+/UbX3/355Pfzlmn66qk9dGbN29+k8PhbCSRSNDZ2Snb9ae/HCkpKTksEhbN2QTD5NSX+Vu3bj0cHBzsjcFg4O7du1BWVvbNwxB9BIQ5j94I2Fu3bhXW19cDl8sFLBYLHA7Hg0wmf/e77e84ffXlPz6fLSMnQ2paZkJ4eHjmtm3b+B4eHvZkMhlQKBTY29s72dvbfxgUFJT8x7ffP1NRUfHjXErnZ/qFYKKjo7dt3rz5g8DAQPtH/XHa2tpqGhsbC55/BASEuYFeMblz505NTU3NgfDw8PcwGAygUCjw9fW1IJPJn/1130Hv0tLSI4WXL4hny9inYS+Osvbz80tgMpn8jIwMPovFch2vpoiDgwM4ODhwfH19OYsWLeJv3/Hu+cbGxquzXZz5aZYlvMRJT0/fFhkZue3JZmfd3d0gEolOIr4ShPmEXjFpkFRqXlrzSnFnZ+d7Tk5OjzNfXVxcICMjY6ezszNnVdL6vU8HWhmbgKAIkrOzMyc1NTXz0YU4maAuOp0OK1as4EVFRfGEQqHg1dfePHzr1q2rs71S8WOF4f38/BLS09M/iIyM5DxdxLq5uVlcVVU1bgVwBIS5il4xAQCQyWRigUBwJikpKe3JVGQcDgdLly7l2tranti0ecf7IpEoy9hbxX6sMDydTvdevXr1ltjY2F3u7u6AxT73FJ7B3Nwc4uLiwthsdphQKCzZkL7l0/r6+oKbNeVG90+EhMXZL1++fFtycvKHrq6uz4igUqmE5ubmEiTHCWG+8dwrUXD9imz9xtd/jIuLS7N5KpsTjUZDUFCQE4PB+F4oFGYmJW888Mv5k4UTHGpGxC9LYaenp78VEhKyxdHRESgUyoyOh0KhwNraGuLi4qIDAgKi6+rqyjekb/mHMSN6N6RvSdu+ffseNpsdZm09ftuW+vp6EIvFSB9hhHnHpG7rUqm0orW1tdXS0tLj6TIEaDQaaDQaxMfH811dXTl/3Xfw+JUrVz411J01cfWG6IiIiC07d+5McHNzs7ewMGyOFw6HAwcHB6BSqVx3d/fwz7/4rkAgEBwXCoUnHpZonDGrU9J5MTEx27du3Zrm4uKC0beaqq6u/ry+vj7XEPMiIMwmkxKTimuXZe/u+fCkp6fnexPdUfF4PPj7+1szGIydLi4unF1/+kvenTt3RG1tbRXTqfma8lIG39/fP/HVV19NZrFYHpMpzjQTzMzMwNPTE+Pp6Zng6emZ4Ofnl5CesfV8bW1tznQe3/wDwvFeXl7Rvr6+Ca+88kpaUFCQh74GXzqdDrq7u6GpqankRQmdR1hYTNrhUFVVlcXj8d6ysrKy0OfstLS0hPj4eC6Xy+U2NzeDRCI5/sa2XeX37t1rGhwc7BoYGJBN1P+FFbiE5OzszGaxWImvvvrqpoCAAKfp+ERmCpPJBCaTmcnhcDJLS0u/TE59+YxUKhXoi/lg+oVgrKysGJaWlna2trYeaWlpXDabvTMgIGDSfp2KiorzbW1tL0zoPMLCYtJX6uVfs2u++PKowMPDgz+ZIslEIhECAgKAxWJlajSazJ6eHmhra4PW1tZvtmz9o6Czs7O+r6+vfWxsbFir1WosLCzsV6xYkcnj8d7z9vaelmPV0Hh5eYGnp+f2mJiY7UVFRZ/HL0v5tru7+5ZGo1FisVg8Docj4fF4CxsbG1c+nx/m7e39sYeHB7i4uIC5ufmU6r4ODQ1BZWXlifkSrYuA8DRTumIrKytPent78728vCb9HRQKBVgsFhwcHIBOpwObzd4yNja2RaVSwdDQEHR1dcHo6CjQaDRwdXWdsWPV0KBQKPDw8AA7O7udERERO2tra2FgYACoVCo4OTkBjUYDMpkMeDz+8WuqaLVaaGxsbL19+/YzSX8ICPOFqYrJidDQ0AwvLy/e80c/CwaDARKJBI86BdJoNHB3dwe1Wj0nViL6IJPJwGQywdnZGZRKJRAIBDBUx8OBgQEoLS39BtkORpjPTJg1PB61N64pmpqarvb39xvUiLkuJE9CJpPBxsbGYEICANDZ2SlHgtQQ5jtTEhMAgLq6ulyJRFJvDGNeREZGRkAikRSUFuci2cEI85opi0l+7hmBWCzOeV6dToTJcfv27cHr168jxbgR5j1TFhMAgObm5hKZDNl0MAQtLS3Xzpw6hkS8Isx7piUmUqlUIBAIJuyjgzA5Ojs7QSKRINGuCAuCaYmJsKKw68qVK59KJJIu5HFneiiVSigqKjouEolOmtoWBARDMC0xAQC4+MvPJadOnXq3ra1N8yL0dDEkOp0OSktLy/Pz8w8+3d4CAWG+Mm0xAQA4fuy/jl+8ePGju3fvGsqeBY9Wq4XKysrWU6dOvX31yi8mKyyFgGBoZiQmAAD/79D+fadPn96PCMrz0el0UFVV1frtt9+mj9fiAgFhPjNjMQEAyMvLO3Ds2LE/tLS0INmuerh27Vr9999//xoiJAgLEYOEntbVVigB4PNNm3cMpqSkfMRms50McdyFgkqlgqKiovJTp069nZ97BhEShAWJQePYj373xdF1GzbLFQrFx6Ghob766ne8KNy7dw+KiopO5ubmfmTK4tsICMbG4EkxWT99d35l4rre/v7+D0NCQvh0Ot3QU8wL1Go1SKVSTX5+/sH8/PyDSP8bhIWOUTLsLuVklQcFR65pbGzcvnLlyvfc3NwsCASCMaaac+h0OhgaGoLq6uqaCxcu/OV01tGcTw7uM7VZCAhGx2jpug/vxAd58atzoqKitq1cuXKnvb29saabE+h0Oqiurpbm5eUdrK6uPlspuDrvY0hmO4YIhUIBGq1/X2CmNqFQKL3/79HomZ/z82xEowyy9zFr80zGDqPn/hdeviBmL47ad+fOnRsRERGbQkNDo62srIw97azT2dkJxcXFx0tKSo7Mdh8hY4LD4TDPH2U4MFjMc6tLmZmZzaj+Aw6H0/t9PB4PGCxmRudNJBL0ngeZTAI0Gj3jv+1szfM88Hic8cUEAKCmqlQOAN/ELU2qkEgkySwWK3HRokVcBoMxG9MbDZ1OB83NzdDU1FRQW1t7XiAQHJ+ovu18pbr6Rg6L5ZtoM0EhcUPT0tJW8tWRb0vQqIkvgKqqmhnVfrl2TfANXo+gjKlUio4OWc1M5sjOzjnQUH8rbqLPu3t6moaGhmfc+3q25tGHUqmECoEIUKbIrVkcEkONiIh4jcvlvu7s7OxLo9GmVe7QVCgUCujq6oKGhoaCioqKo9XV1WeM3YDMVPDik1gpyas+XrVyeaKXl8czjyANjbcgI/MNmkg49Q4ECPOH3NyC4RUr+M8IcHt7B1y9WlKRl3/5kElKnD1sfXEoJCzueEBAQGJYWFgGk8nk2djYAIFAgLm4pTw6Ogqjo6Mgl8vhxo0b50tLS4/U19fnLvS2FIWXfxEDQNLmLW9ueW1TxtchHDaQyWRTm4VgYkZHR6G+vhF+/NfP+y5e+vVjiVgwZpKVydOwF0dZW1lZOTGZTD6bzU4LCAiIptPp8HTDL1MwOjoKLS0tUFdXd1IsFudIpdKKgYGB7tloJTrX4MUnsVJTEj9etzY10dHRAQAAGm81wcsZW5CVyQInL69gNCGBjwcAGBx8ANnncypOnTr3H9nn/reD55wovvrQpyIHAHFUzIocGo3mQaPRfBwdHVlubm7bXF1dgcFgABqNNvruglwuh7t374JMJoOOjo7P79y5I+ru7m7q7e1tXQi7MzOh8PIv4pCw2DdaWtte37Au7aPIyCWAxWABjUbPif9HCMbjURtKiaQBfvr5zH9evlJ0uLQ4r/nJMXNiZTIRrMAlJAcHB18HBweWo6Mjy8rKajeJRAJLS0uwtLQECwsLoFAogMfjAYvFgpmZ2XNXMyqVCoaHh2FoaAiGh4cfvwYGBqCvrw+6u7vfvnfvXlNvb29rT09Pq0QsUM7S6c4rNqS/lrZ5U+YPRBKR9M7u9xwqBUUvtNAudH766XSLE8PR49ixE78/8tVnX403Zk7fUR46NUUAIPIPCMdTKJTdNjY2QKPRgE6nA51OB1tbWyCRSIDD4YBAIAAejwcCgfDYUajVakGlUoFarQadTvfY79HX1wf9/f0gl8tBLpfDvXv3HvXw+dxQPYYXMj+d+P7Mmzv+5OHr6/OJWq1GBHeB09TcUiKuq/coKS3/eqIx/wPkiIXC3w6YjAAAAABJRU5ErkJggg==");
+
+ --keyword: #ff79c6;
+ --identifier: #f8f8f2;
+ --comment: #6272a4;
+ --operator: #ff79c6;
+ --punctuation: #f8f8f2;
+ --other: #f8f8f2;
+ --escapeSequence: #bd93f9;
+ --number: #bd93f9;
+ --literal: #f1fa8c;
+ --program: #9090c0;
+ --option: #90b010;
+ --raw-data: #8be9fd;
+
+ --clipboard-image-normal: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: lightgray' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E %3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2' /%3E %3C/svg%3E");
+ --clipboard-image-selected: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: lightgray' viewBox='0 0 20 20' fill='currentColor'%3E %3Cpath d='M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z' /%3E %3Cpath d='M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z' /%3E %3C/svg%3E");
+ --clipboard-image: var(--clipboard-image-normal);
+ }
+}
+
+.theme-select-wrapper {
+ display: flex;
+ align-items: center;
+}
+
+html {
+ font-size: 100%;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%; }
+
+body {
+ font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif;
+ font-weight: 400;
+ font-size: 1.125em;
+ line-height: 1.5;
+ color: var(--text);
+ background-color: var(--primary-background); }
+
+/* Skeleton grid */
+.container {
+ position: relative;
+ width: 100%;
+ max-width: 1050px;
+ margin: 0 auto;
+ padding: 0;
+ box-sizing: border-box; }
+
+.column, .columns {
+ width: 100%;
+ float: left;
+ box-sizing: border-box;
+ margin-left: 1%; }
+
+@media print {
+ #global-links, .link-seesrc, .theme-switch-wrapper, #searchInputDiv, .search-groupby {
+ display:none;
+ }
+ .columns {
+ width:100% !important;
+ }
+}
+
+.column:first-child, .columns:first-child {
+ margin-left: 0; }
+
+.container .row {
+ display: flex; }
+
+.three.columns {
+ width: 25.0%;
+ height: 100vh;
+ position: sticky;
+ top: 0px;
+ overflow-y: auto;
+ padding: 2px;
+}
+
+.nine.columns {
+ width: 75.0%;
+ padding-left: 1.5em; }
+
+.twelve.columns {
+ width: 100%;
+ margin-left: 0; }
+
+@media screen and (max-width: 860px) {
+ .three.columns {
+ display: none;
+ }
+ .nine.columns {
+ width: 98.0%;
+ }
+ body {
+ font-size: 1em;
+ line-height: 1.35;
+ }
+}
+
+cite {
+ font-style: italic !important; }
+
+
+/* Nim search input */
+div#searchInputDiv {
+ margin-bottom: 1em;
+}
+input#searchInput {
+ width: 80%;
+}
+
+/*
+ * Some custom formatting for input forms.
+ * This also fixes input form colors on Firefox with a dark system theme on Linux.
+ */
+input {
+ -moz-appearance: none;
+ background-color: var(--secondary-background);
+ color: var(--text);
+ border: 1px solid var(--border);
+ font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif;
+ font-size: 0.9em;
+ padding: 6px;
+}
+
+input:focus {
+ border: 1px solid var(--input-focus);
+ box-shadow: 0 0 3px var(--input-focus);
+}
+
+select {
+ -moz-appearance: none;
+ background-color: var(--secondary-background);
+ color: var(--text);
+ border: 1px solid var(--border);
+ font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif;
+ font-size: 0.9em;
+ padding: 6px;
+}
+
+select:focus {
+ border: 1px solid var(--input-focus);
+ box-shadow: 0 0 3px var(--input-focus);
+}
+
+/* Docgen styles */
+
+:target {
+ border: 2px solid #B5651D;
+ border-style: dotted;
+}
+
+/* Links */
+a {
+ color: var(--anchor);
+ text-decoration: none;
+}
+
+a span.Identifier {
+ text-decoration: underline;
+ text-decoration-color: #aab;
+}
+
+a.reference-toplevel {
+ font-weight: bold;
+}
+
+a.nimdoc {
+ word-spacing: 0.3em;
+}
+
+a.toc-backref {
+ text-decoration: none;
+ color: var(--text);
+}
+
+a.link-seesrc {
+ color: #607c9f;
+ font-size: 0.9em;
+ font-style: italic;
+}
+
+a:hover, a:focus {
+ color: var(--anchor-focus);
+ text-decoration: underline;
+}
+
+a:hover span.Identifier {
+ color: var(--anchor);
+}
+
+
+sub, sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline; }
+
+sup {
+ top: -0.5em; }
+
+sub {
+ bottom: -0.25em; }
+
+img {
+ width: auto;
+ height: auto;
+ max-width: 100%;
+ vertical-align: middle;
+ border: 0;
+ -ms-interpolation-mode: bicubic; }
+
+@media print {
+ * {
+ color: black !important;
+ text-shadow: none !important;
+ background: transparent !important;
+ box-shadow: none !important; }
+
+ a, a:visited {
+ text-decoration: underline; }
+
+ a[href]:after {
+ content: " (" attr(href) ")"; }
+
+ abbr[title]:after {
+ content: " (" attr(title) ")"; }
+
+ .ir a:after,
+ a[href^="javascript:"]:after,
+ a[href^="#"]:after {
+ content: ""; }
+
+ pre, blockquote {
+ border: 1px solid #999;
+ page-break-inside: avoid; }
+
+ thead {
+ display: table-header-group; }
+
+ tr, img {
+ page-break-inside: avoid; }
+
+ img {
+ max-width: 100% !important; }
+
+ @page {
+ margin: 0.5cm; }
+
+ h1 {
+ page-break-before: always; }
+
+ h1.title {
+ page-break-before: avoid; }
+
+ p, h2, h3 {
+ orphans: 3;
+ widows: 3; }
+
+ h2, h3 {
+ page-break-after: avoid; }
+}
+
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em; }
+
+small {
+ font-size: 85%; }
+
+strong {
+ font-weight: 600;
+ font-size: 0.95em;
+ color: var(--strong); }
+
+em {
+ font-style: italic; }
+
+h1 {
+ font-size: 1.8em;
+ font-weight: 400;
+ padding-bottom: .25em;
+ border-bottom: 6px solid var(--third-background);
+ margin-top: 2.5em;
+ margin-bottom: 1em;
+ line-height: 1.2em; }
+
+h1.title {
+ padding-bottom: 1em;
+ border-bottom: 0px;
+ font-size: 2.5em;
+ text-align: center;
+ font-weight: 900;
+ margin-top: 0.75em;
+ margin-bottom: 0em; }
+
+h2 {
+ font-size: 1.3em;
+ margin-top: 2em; }
+
+h2.subtitle {
+ margin-top: 0em;
+ text-align: center; }
+
+h3 {
+ font-size: 1.125em;
+ font-style: italic;
+ margin-top: 1.5em; }
+
+h4 {
+ font-size: 1.125em;
+ margin-top: 1em; }
+
+h5 {
+ font-size: 1.125em;
+ margin-top: 0.75em; }
+
+h6 {
+ font-size: 1.1em; }
+
+
+ul, ol {
+ padding: 0;
+ margin-top: 0.5em;
+ margin-left: 0.75em; }
+
+ul ul, ul ol, ol ol, ol ul {
+ margin-bottom: 0;
+ margin-left: 1.25em; }
+
+ul.simple > li {
+ list-style-type: circle; }
+
+ul.simple-boot li {
+ list-style-type: none;
+ margin-left: 0em;
+ margin-bottom: 0.5em; }
+
+ol.simple > li, ul.simple > li {
+ margin-bottom: 0.2em;
+ margin-left: 0.4em }
+
+ul.simple.simple-toc > li {
+ margin-top: 1em; }
+
+ul.simple-toc {
+ list-style: none;
+ font-size: 0.9em;
+ margin-left: -0.3em;
+ margin-top: 1em; }
+
+ul.simple-toc > li {
+ list-style-type: none; }
+
+ul.simple-toc-section {
+ list-style-type: circle;
+ margin-left: 0.8em;
+ color: #6c9aae; }
+
+ul.nested-toc-section {
+ list-style-type: circle;
+ margin-left: -0.75em;
+ color: var(--text); }
+
+ul.nested-toc-section > li {
+ margin-left: 1.25em; }
+
+
+ol.arabic {
+ list-style: decimal; }
+
+ol.loweralpha {
+ list-style: lower-alpha; }
+
+ol.upperalpha {
+ list-style: upper-alpha; }
+
+ol.lowerroman {
+ list-style: lower-roman; }
+
+ol.upperroman {
+ list-style: upper-roman; }
+
+ul.auto-toc {
+ list-style-type: none; }
+
+
+dl {
+ margin-bottom: 1.5em; }
+
+dt {
+ margin-bottom: -0.5em;
+ margin-left: 0.0em; }
+
+dd {
+ margin-left: 2.0em;
+ margin-bottom: 3.0em;
+ margin-top: 0.5em; }
+
+
+hr {
+ margin: 2em 0;
+ border: 0;
+ border-top: 1px solid #aaa; }
+
+hr.footnote {
+ width: 25%;
+ border-top: 0.15em solid #999;
+ margin-bottom: 0.15em;
+ margin-top: 0.15em;
+}
+div.footnote-group {
+ margin-left: 1em;
+}
+div.footnote-label {
+ display: inline-block;
+ min-width: 1.7em;
+}
+
+div.option-list {
+ border: 0.1em solid var(--border);
+}
+div.option-list-item {
+ padding-left: 12em;
+ padding-right: 0;
+ padding-bottom: 0.3em;
+ padding-top: 0.3em;
+}
+div.odd {
+ background-color: var(--secondary-background);
+}
+div.option-list-label {
+ margin-left: -11.5em;
+ margin-right: 0em;
+ min-width: 11.5em;
+ display: inline-block;
+ vertical-align: top;
+}
+div.option-list-description {
+ width: calc(100% - 1em);
+ padding-left: 1em;
+ padding-right: 0;
+ display: inline-block;
+}
+
+blockquote {
+ font-size: 0.9em;
+ font-style: italic;
+ padding-left: 0.5em;
+ margin-left: 0;
+ border-left: 5px solid #bbc;
+}
+
+blockquote.markdown-quote {
+ font-size: 0.9rem; /* use rem to avoid recursion */
+ font-style: normal;
+}
+
+.pre, span.tok {
+ font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace;
+ font-weight: 500;
+ font-size: 0.85em;
+ color: var(--text);
+ background-color: var(--third-background);
+ padding-left: 3px;
+ padding-right: 3px;
+ border-radius: 4px;
+}
+
+span.tok {
+ border: 1px solid #808080;
+ padding-bottom: 0.1em;
+ margin-right: 0.2em;
+}
+
+.copyToClipBoard {
+ position: relative;
+}
+
+pre {
+ font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace;
+ color: var(--text);
+ font-weight: 500;
+ display: inline-block;
+ box-sizing: border-box;
+ min-width: 100%;
+ padding: 0.5em;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ font-size: 0.85em;
+ white-space: pre !important;
+ overflow-y: hidden;
+ overflow-x: visible;
+ background-color: var(--secondary-background);
+ border: 1px solid var(--border);
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+}
+
+.copyToClipBoardBtn {
+ visibility: hidden;
+ position: absolute;
+ width: 24px;
+ border-radius: 4px;
+ background-image: var(--clipboard-image);
+ right: 5px;
+ top: 13px;
+ background-color: var(--secondary-background);
+ padding: 11px;
+ border: 0;
+}
+
+.copyToClipBoard:hover .copyToClipBoardBtn {
+ visibility: visible;
+}
+
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll; }
+
+
+/* Nim line-numbered tables */
+.line-nums-table {
+ width: 100%;
+ table-layout: fixed; }
+
+table.line-nums-table {
+ border-radius: 4px;
+ border: 1px solid #cccccc;
+ background-color: ghostwhite;
+ border-collapse: separate;
+ margin-top: 15px;
+ margin-bottom: 25px; }
+
+.line-nums-table tbody {
+ border: none; }
+
+.line-nums-table td pre {
+ border: none;
+ background-color: transparent; }
+
+.line-nums-table td.blob-line-nums {
+ width: 28px; }
+
+.line-nums-table td.blob-line-nums pre {
+ color: #b0b0b0;
+ -webkit-filter: opacity(75%);
+ filter: opacity(75%);
+ text-align: right;
+ border-color: transparent;
+ background-color: transparent;
+ padding-left: 0px;
+ margin-left: 0px;
+ padding-right: 0px;
+ margin-right: 0px; }
+
+
+table {
+ max-width: 100%;
+ background-color: transparent;
+ margin-top: 0.5em;
+ margin-bottom: 1.5em;
+ border-collapse: collapse;
+ border-color: var(--third-background);
+ border-spacing: 0;
+ font-size: 0.9em;
+}
+
+table th, table td {
+ padding: 0px 0.5em 0px;
+ border-color: var(--third-background);
+}
+
+table th {
+ background-color: var(--third-background);
+ border-color: var(--third-background);
+ font-weight: bold; }
+
+table th.docinfo-name {
+ background-color: transparent;
+ text-align: right;
+}
+
+table tr:hover {
+ background-color: var(--third-background); }
+
+
+/* rst2html default used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+ border: 0; }
+
+table.borderless td, table.borderless th {
+ /* Override padding for "table.docutils td" with "! important".
+ The right padding separates the table cells. */
+ padding: 0 0.5em 0 0 !important; }
+
+.admonition {
+ padding: 0.3em;
+ background-color: var(--secondary-background);
+ border-left: 0.4em solid #7f7f84;
+ margin-bottom: 0.5em;
+ -webkit-box-shadow: 0 5px 8px -6px rgba(0,0,0,.2);
+ -moz-box-shadow: 0 5px 8px -6px rgba(0,0,0,.2);
+ box-shadow: 0 5px 8px -6px rgba(0,0,0,.2);
+}
+.admonition-info {
+ border-color: var(--info-background);
+}
+.admonition-info-text {
+ color: var(--info-background);
+}
+.admonition-warning {
+ border-color: var(--warning-background);
+}
+.admonition-warning-text {
+ color: var(--warning-background);
+}
+.admonition-error {
+ border-color: var(--error-background);
+}
+.admonition-error-text {
+ color: var(--error-background);
+}
+
+.first {
+ /* Override more specific margin styles with "! important". */
+ margin-top: 0 !important; }
+
+.last, .with-subtitle {
+ margin-bottom: 0 !important; }
+
+.hidden {
+ display: none; }
+
+blockquote.epigraph {
+ margin: 2em 5em; }
+
+dl.docutils dd {
+ margin-bottom: 0.5em; }
+
+object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
+ overflow: hidden; }
+
+
+div.figure {
+ margin-left: 2em;
+ margin-right: 2em; }
+
+div.footer, div.header {
+ clear: both;
+ text-align: center;
+ color: #666;
+ font-size: smaller; }
+
+div.footer {
+ padding-top: 5em; }
+
+div.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em; }
+
+div.line-block div.line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em; }
+
+div.topic {
+ margin: 2em; }
+
+div.search_results {
+ background-color: var(--third-background);
+ margin: 3vh 5vw;
+ padding: 1em;
+ border: 1px solid #4d4d4d;
+ position: fixed;
+ top: 10px;
+ isolation: isolate;
+ max-width: calc(100vw - 6em);
+ z-index: 1;
+ max-height: calc(100vh - 6em);
+ overflow-y: scroll;}
+
+div#global-links ul {
+ margin-left: 0;
+ list-style-type: none; }
+
+div#global-links > simple-boot {
+ margin-left: 3em; }
+
+hr.docutils {
+ width: 75%; }
+
+img.align-left, .figure.align-left, object.align-left {
+ clear: left;
+ float: left;
+ margin-right: 1em; }
+
+img.align-right, .figure.align-right, object.align-right {
+ clear: right;
+ float: right;
+ margin-left: 1em; }
+
+img.align-center, .figure.align-center, object.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto; }
+
+.align-left {
+ text-align: left; }
+
+.align-center {
+ clear: both;
+ text-align: center; }
+
+.align-right {
+ text-align: right; }
+
+/* reset inner alignment in figures */
+div.align-right {
+ text-align: inherit; }
+
+p.attribution {
+ text-align: right;
+ margin-left: 50%; }
+
+p.caption {
+ font-style: italic; }
+
+p.credits {
+ font-style: italic;
+ font-size: smaller; }
+
+p.label {
+ white-space: nowrap; }
+
+p.rubric {
+ font-weight: bold;
+ font-size: larger;
+ color: maroon;
+ text-align: center; }
+
+p.topic-title {
+ font-weight: bold; }
+
+pre.address {
+ margin-bottom: 0;
+ margin-top: 0;
+ font: inherit; }
+
+pre.literal-block, pre.doctest-block, pre.math, pre.code {
+ margin-left: 2em;
+ margin-right: 2em; }
+
+pre.code .ln {
+ color: grey; }
+
+/* line numbers */
+pre.code, code {
+ background-color: #eeeeee; }
+
+pre.code .comment, code .comment {
+ color: #5c6576; }
+
+pre.code .keyword, code .keyword {
+ color: #3B0D06;
+ font-weight: bold; }
+
+pre.code .literal.string, code .literal.string {
+ color: #0c5404; }
+
+pre.code .name.builtin, code .name.builtin {
+ color: #352b84; }
+
+pre.code .deleted, code .deleted {
+ background-color: #DEB0A1; }
+
+pre.code .inserted, code .inserted {
+ background-color: #A3D289; }
+
+span.classifier {
+ font-style: oblique; }
+
+span.classifier-delimiter {
+ font-weight: bold; }
+
+span.problematic {
+ color: #b30000; }
+
+span.section-subtitle {
+ /* font-size relative to parent (h1..h6 element) */
+ font-size: 80%; }
+
+span.DecNumber {
+ color: var(--number); }
+
+span.BinNumber {
+ color: var(--number); }
+
+span.HexNumber {
+ color: var(--number); }
+
+span.OctNumber {
+ color: var(--number); }
+
+span.FloatNumber {
+ color: var(--number); }
+
+span.Identifier {
+ color: var(--identifier); }
+
+span.Keyword {
+ font-weight: 600;
+ color: var(--keyword); }
+
+span.StringLit {
+ color: var(--literal); }
+
+span.LongStringLit {
+ color: var(--literal); }
+
+span.CharLit {
+ color: var(--literal); }
+
+span.EscapeSequence {
+ color: var(--escapeSequence); }
+
+span.Operator {
+ color: var(--operator); }
+
+span.Punctuation {
+ color: var(--punctuation); }
+
+span.Comment, span.LongComment {
+ font-style: italic;
+ font-weight: 400;
+ color: var(--comment); }
+
+span.RegularExpression {
+ color: darkviolet; }
+
+span.TagStart {
+ color: darkviolet; }
+
+span.TagEnd {
+ color: darkviolet; }
+
+span.Key {
+ color: #252dbe; }
+
+span.Value {
+ color: #252dbe; }
+
+span.RawData {
+ color: var(--raw-data); }
+
+span.Assembler {
+ color: #252dbe; }
+
+span.Preprocessor {
+ color: #252dbe; }
+
+span.Directive {
+ color: #252dbe; }
+
+span.option {
+ font-weight: bold;
+ font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace;
+ color: var(--option); }
+
+span.Prompt {
+ font-weight: bold;
+ color: red; }
+
+span.ProgramOutput {
+ font-weight: bold;
+ color: #808080; }
+
+span.program {
+ font-weight: bold;
+ color: var(--program);
+ text-decoration: underline;
+ text-decoration-color: var(--hint);
+ text-decoration-thickness: 0.05em;
+ text-underline-offset: 0.15em; }
+
+span.Command, span.Rule, span.Hyperlink,
+span.Label, span.Reference, span.Other {
+ color: var(--other); }
+
+/* Pop type, const, proc, and iterator defs in nim def blocks */
+dt pre > span.Identifier, dt pre > span.Operator {
+ color: var(--identifier);
+ font-weight: 700; }
+
+dt pre > span.Keyword ~ span.Identifier, dt pre > span.Identifier ~ span.Identifier,
+dt pre > span.Operator ~ span.Identifier, dt pre > span.Other ~ span.Identifier {
+ color: var(--identifier);
+ font-weight: inherit; }
+
+/* Nim sprite for the footer (taken from main page favicon) */
+.nim-sprite {
+ display: inline-block;
+ width: 51px;
+ height: 14px;
+ background-position: 0 0;
+ background-size: 51px 14px;
+ -webkit-filter: opacity(50%);
+ filter: opacity(50%);
+ background-repeat: no-repeat;
+ background-image: var(--nim-sprite-base64);
+ margin-bottom: 5px; }
+
+span.pragmadots {
+ /* Position: relative frees us up to make the dots
+ look really nice without fucking up the layout and
+ causing bulging in the parent container */
+ position: relative;
+ /* 1px down looks slightly nicer */
+ top: 1px;
+ padding: 2px;
+ background-color: var(--third-background);
+ border-radius: 4px;
+ margin: 0 2px;
+ cursor: pointer;
+ font-size: 0.8em; }
+
+span.pragmadots:hover {
+ background-color: var(--hint); }
+
+span.pragmawrap {
+ display: none; }
+
+span.attachedType {
+ display: none;
+ visibility: hidden; }
diff --git a/nimword.html b/nimword.html
new file mode 100644
index 0000000..acfbdae
--- /dev/null
+++ b/nimword.html
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+src/nimword
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
src/nimword
+
+
+
+ Theme:
+
+ 🌗 Match OS
+ 🌑 Dark
+ 🌕 Light
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
Source
+
Edit
+
+
+
+
+
+
+
+
+
+
NimwordHashingAlgorithm = enum
+ nhaPbkdf2Sha256 = "pbkdf2_sha256" , nhaPbkdf2Sha512 = "pbkdf2_sha512" ,
+ nhaArgon2i = "argon2i" , nhaArgon2id = "argon2id" , nhaDefault
+
+
+ The number of different hashing algorithms nimword supports
+ Source
+Edit
+
+
+
+
+
+
+
+
+
+
+
+
proc hashEncodePassword ( password : Password ; iterations : int ;
+ algorithm : NimwordHashingAlgorithm = nhaDefault ) : string {.
+ ... raises : [ OSError , ValueError , Exception , SodiumError ] , tags : [ RootEffect ] ,
+ forbids : [ ] .}
+
+
+ Hashes and encodes the given password using the argon2 algorithm from libsodium.
+Returns the hash as part of a larger string containing hash, iterations, algorithm, salt and any further values used to calculate the hash. The pattern depends on the algorithm chosen.
+The return value can be used with isValidPassword .
+The salt is randomly generated during the process.
+For guidance on choosing values for iterations consult the libsodium-documentation
+
+ Source
+Edit
+
+
+
+
+
+
+
+
proc isValidPassword ( password : Password ; encodedHash : string ) : bool {.... raises : {
+ UnknownAlgorithmError , ValueError , Pbkdf2Error , SodiumError , Exception } ,
+ tags : [ RootEffect ] , forbids : [ ] .}
+
+
+ Verifies that a given plain-text password can be used to generate the hash contained in encodedHash with the parameters provided in encodedHash .
+encodedHash must be a string with the kind of pattern that encodeHash procs or and hashEncodePassword generate.
+Raises UnknownAlgorithmError if the encoded hash string is for an algorithm not supported by nimword.
+
+ Source
+Edit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2023-09-25 18:52:33 UTC
+
+
+
+
+
+
+
+
+
diff --git a/nimword.idx b/nimword.idx
new file mode 100644
index 0000000..9f92bc4
--- /dev/null
+++ b/nimword.idx
@@ -0,0 +1,9 @@
+nimTitle nimword nimword.html module src/nimword 0
+nim nhaPbkdf2Sha256 nimword.html#nhaPbkdf2Sha256 NimwordHashingAlgorithm.nhaPbkdf2Sha256 10
+nim nhaPbkdf2Sha512 nimword.html#nhaPbkdf2Sha512 NimwordHashingAlgorithm.nhaPbkdf2Sha512 10
+nim nhaArgon2i nimword.html#nhaArgon2i NimwordHashingAlgorithm.nhaArgon2i 10
+nim nhaArgon2id nimword.html#nhaArgon2id NimwordHashingAlgorithm.nhaArgon2id 10
+nim nhaDefault nimword.html#nhaDefault NimwordHashingAlgorithm.nhaDefault 10
+nim NimwordHashingAlgorithm nimword.html#NimwordHashingAlgorithm enum NimwordHashingAlgorithm 10
+nim hashEncodePassword nimword.html#hashEncodePassword,Password,int,NimwordHashingAlgorithm proc hashEncodePassword(password: Password; iterations: int;\n algorithm: NimwordHashingAlgorithm = nhaDefault): string 20
+nim isValidPassword nimword.html#isValidPassword,Password,string proc isValidPassword(password: Password; encodedHash: string): bool 50
diff --git a/nimword/argon2.html b/nimword/argon2.html
new file mode 100644
index 0000000..ff41c95
--- /dev/null
+++ b/nimword/argon2.html
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+
+src/nimword/argon2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
src/nimword/argon2
+
+
+
+ Theme:
+
+ 🌗 Match OS
+ 🌑 Dark
+ 🌕 Light
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
Source
+
Edit
+
+
+
+
+
+
+
+
+
+
+
proc encodeHash ( hash : Hash ; salt : seq [ byte ] ; iterations : int ;
+ algorithm : PasswordHashingAlgorithm ; memoryLimitKibiBytes : int ) : string {.
+ ... raises : [ ValueError ] , tags : [ ] , forbids : [ ] .}
+
+
+ Encodes all relevant data for a password hash in a string.
+The returned string can be used with isValidPassword . Hash is a seqbyte like salt and gets turned into a base64 encoded string with all padding suffix characters of "=" removed".
+Salt gets turned into a base64 encoded string with all padding suffix character of "=" removed. memoryLimitKibiBytes is the number of KiB used for the hashing process. algorithm is either "argon2id" or "argon2i".
+The pattern is: $<algorithm>$v=19$m=<memoryLimit>,t=<iterations>,p=1$<salt>$<hash>
+
+ Source
+Edit
+
+
+
+
+
+
+
+
proc hashEncodePassword ( password : Password ; iterations : int = crypto_pwhash_opslimit_moderate ( ) . int ;
+ algorithm : PasswordHashingAlgorithm = phaDefault ;
+ memoryLimitKibiBytes : int = int ( crypto_pwhash_memlimit_moderate ( ) ) / 1024 . int ) : string {.
+ ... raises : { SodiumError , ValueError } , tags : [ ] , forbids : [ ] .}
+
+
+ Hashes and encodes the given password using the argon2 algorithm from libsodium.
+Returns the hash as part of a larger string containing hash, iterations, algorithm, memoryLimitKibiBytes and salt. For information about the pattern see encodeHash
+The return value can be used with isValidPassword .
+The salt is randomly generated during the process.
+For guidance on choosing values for iterations , algorithm and memorylimitKibiBytes see hashPassword .
+Raises SodiumError for invalid values for memoryLimit or iterations.
+
+ Source
+Edit
+
+
+
+
+
+
+
+
proc hashPassword ( password : Password ; salt : seq [ byte ] ;
+ iterations : int = crypto_pwhash_opslimit_moderate ( ) . int ;
+ hashLength : int = 32 ;
+ algorithm : PasswordHashingAlgorithm = phaDefault ;
+ memoryLimitKibiBytes : int = int ( crypto_pwhash_memlimit_moderate ( ) ) / 1024 . int ) : Hash {.
+ ... raises : { SodiumError , ValueError } , tags : [ ] , forbids : [ ] .}
+
+
+ Hashes the given password using the argon2 algorithm from libsodium. Returns the hash as seqbyte
+Salt must be exactly 16 bytes long.
+Iterations is the number of times the argon-algorithm is applied during hashing. For guidance on how to choose a number for this value, consult the libsodium-documentation for the opslimit value.
+hashLength is the number of bytes that the hash should be long. For guidance on how to choose a number for this value, consult the libsodium-documentation for the outlen value.
+The algorithm defaults to the default of libsodium. For guidance on which Argon variant to choose, consult the argon readme . Do note that libsodium and thus this package does not provide a way to call Argon2D.
+The memoryLimit must be provided in KibiBytes aka KiB, it designates the amount of memory used during hashing. For guidance on how to choose a number for this value, consult the libsodium-documentation for the memlimit value.
+Raises SodiumError for invalid values for memoryLimit or iterations.
+
+ Source
+Edit
+
+
+
+
+
+
+
+
proc isValidPassword ( password : Password ; encodedHash : string ) : bool {.
+ ... raises : SodiumError , tags : [ ] , forbids : [ ] .}
+
+
+ Verifies that a given plain-text password can be used to generate the hash contained in encodedHash with the parameters provided in encodedHash .
+encodedHash must be a string with the kind of pattern that encodeHash and hashEncodePassword generate.
+Raises SodiumError if an error happens during the process.
+
+ Source
+Edit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2023-09-25 18:52:33 UTC
+
+
+
+
+
+
+
+
+
diff --git a/nimword/argon2.idx b/nimword/argon2.idx
new file mode 100644
index 0000000..cc5d2e5
--- /dev/null
+++ b/nimword/argon2.idx
@@ -0,0 +1,5 @@
+nimTitle argon2 nimword/argon2.html module src/nimword/argon2 0
+nim encodeHash nimword/argon2.html#encodeHash,Hash,seq[byte],int,PasswordHashingAlgorithm,int proc encodeHash(hash: Hash; salt: seq[byte]; iterations: int;\n algorithm: PasswordHashingAlgorithm; memoryLimitKibiBytes: int): string 11
+nim hashPassword nimword/argon2.html#hashPassword,Password,seq[byte],int,int,PasswordHashingAlgorithm,int proc hashPassword(password: Password; salt: seq[byte];\n iterations: int = crypto_pwhash_opslimit_moderate().int;\n hashLength: int = 32;\n algorithm: PasswordHashingAlgorithm = phaDefault;\n memoryLimitKibiBytes: int = int(crypto_pwhash_memlimit_moderate()) / 1024.int): Hash 44
+nim hashEncodePassword nimword/argon2.html#hashEncodePassword,Password,int,PasswordHashingAlgorithm,int proc hashEncodePassword(password: Password;\n iterations: int = crypto_pwhash_opslimit_moderate().int;\n algorithm: PasswordHashingAlgorithm = phaDefault;\n memoryLimitKibiBytes: int = int(crypto_pwhash_memlimit_moderate()) / 1024.int): string 90
+nim isValidPassword nimword/argon2.html#isValidPassword,Password,string proc isValidPassword(password: Password; encodedHash: string): bool 117
diff --git a/nimword/pbkdf2_sha256.html b/nimword/pbkdf2_sha256.html
new file mode 100644
index 0000000..a0cd8bf
--- /dev/null
+++ b/nimword/pbkdf2_sha256.html
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+src/nimword/pbkdf2_sha256
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
src/nimword/pbkdf2_sha256
+
+
+
+ Theme:
+
+ 🌗 Match OS
+ 🌑 Dark
+ 🌕 Light
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
Source
+
Edit
+
+
+
+
+
+
+
+
+
+
+
proc encodeHash ( hash : Hash ; salt : seq [ byte ] ; iterations : SomeInteger ) : string
+
+
+ Convenience proc to encode all relevant data for a password hash using pbkdf2_sha256 into a string.
+The returned string can be used with isValidPassword .
+For further information, see encodeHash
+
+ Source
+Edit
+
+
+
+
+
+
+
+
proc hashEncodePassword ( password : Password ; iterations : int ) : string {.... gcsafe ,
+ raises : [ OSError , ValueError , Exception ] , tags : [ RootEffect ] , forbids : [ ] .}
+
+
+ Hashes and encodes the given password with the PBKDF2 using an HMAC with the SHA256 hashing algorithm from openssl.
+Returns the hash in an encoded form as part of a larger string containing it, iterations and salt. For information about the pattern see encodeHash
+The return value can be used with isValidPassword .
+For guidance on choosing values for iterations , algorithm and memorylimitKibiBytes see hashPassword .
+The salt used for the hash is randomly generated during the process.
+
+ Source
+Edit
+
+
+
+
+
+
+
+
proc hashPassword ( password : Password ; salt : seq [ byte ] ; iterations : int ) : Hash {.
+ ... gcsafe , raises : [ ValueError , Exception ] , tags : [ RootEffect ] , forbids : [ ] .}
+
+
+ Hashes the given plain-text password with the PBKDF2 using an HMAC with the SHA256 hashing algorithm from openssl.
+Returns the hash as Hash type.
+Salt can be of any size, but is recommended to be at least 16 bytes long.
+Iterations is the number of times the argon-algorithm is applied during hashing. Set the number of iterations to be as high as you can as long as hashing times remain acceptable for your application. For online use (e.g. logging in on a website), a 1 second computation is likely to be the acceptable maximum. For interactive use (e.g. a desktop application), a 5 second pause after having entered a password is acceptable if the password doesn't need to be entered more than once per session. For non-interactive and infrequent use (e.g. restoring an encrypted backup), an even slower computation can be an option.
+
+ Source
+Edit
+
+
+
+
+
+
+
+
proc isValidPassword ( password : Password ; encodedHash : string ) : bool {.
+ ... raises : { Pbkdf2Error , Exception } , tags : [ RootEffect ] , forbids : [ ] .}
+
+
+ Verifies that a given plain-text password can be used to generate the hash contained in encodedHash with the parameters provided in encodedHash .
+encodedHash must be a string with the kind of pattern that encodeHash and hashEncodePassword generate.
+Raises Pbkdf2Error if an error happens during the process.
+
+ Source
+Edit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2023-09-25 18:52:33 UTC
+
+
+
+
+
+
+
+
+
diff --git a/nimword/pbkdf2_sha256.idx b/nimword/pbkdf2_sha256.idx
new file mode 100644
index 0000000..f79cff0
--- /dev/null
+++ b/nimword/pbkdf2_sha256.idx
@@ -0,0 +1,5 @@
+nimTitle pbkdf2_sha256 nimword/pbkdf2_sha256.html module src/nimword/pbkdf2_sha256 0
+nim encodeHash nimword/pbkdf2_sha256.html#encodeHash,Hash,seq[byte],SomeInteger proc encodeHash(hash: Hash; salt: seq[byte]; iterations: SomeInteger): string 14
+nim hashPassword nimword/pbkdf2_sha256.html#hashPassword,Password,seq[byte],int proc hashPassword(password: Password; salt: seq[byte]; iterations: int): Hash 28
+nim hashEncodePassword nimword/pbkdf2_sha256.html#hashEncodePassword,Password,int proc hashEncodePassword(password: Password; iterations: int): string 45
+nim isValidPassword nimword/pbkdf2_sha256.html#isValidPassword,Password,string proc isValidPassword(password: Password; encodedHash: string): bool 62
diff --git a/nimword/pbkdf2_sha512.html b/nimword/pbkdf2_sha512.html
new file mode 100644
index 0000000..0e0e535
--- /dev/null
+++ b/nimword/pbkdf2_sha512.html
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+src/nimword/pbkdf2_sha512
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
src/nimword/pbkdf2_sha512
+
+
+
+ Theme:
+
+ 🌗 Match OS
+ 🌑 Dark
+ 🌕 Light
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
Source
+
Edit
+
+
+
+
+
+
+
+
+
+
+
proc encodeHash ( hash : Hash ; salt : seq [ byte ] ; iterations : SomeInteger ) : string
+
+
+ Convenience proc to encode all relevant data for a password hash using pbkdf2_sha512 into a string.
+The returned string can be used with isValidPassword .
+For further information, see encodeHash
+
+ Source
+Edit
+
+
+
+
+
+
+
+
proc hashEncodePassword ( password : Password ; iterations : int ) : string {.... gcsafe ,
+ raises : [ OSError , ValueError , Exception ] , tags : [ RootEffect ] , forbids : [ ] .}
+
+
+ Hashes and encodes the given password with the PBKDF2 using an HMAC with the SHA256 hashing algorithm from openssl.
+Returns the hash in an encoded form as part of a larger string containing hash, iterations and salt. For information about the pattern see encodeHash
+The return value can be used with isValidPassword .
+For guidance on choosing values for iterations , algorithm and memorylimitKibiBytes see hashPassword .
+The salt used for the hash is randomly generated during the process.
+
+ Source
+Edit
+
+
+
+
+
+
+
+
proc hashPassword ( password : Password ; salt : seq [ byte ] ; iterations : int ) : Hash {.
+ ... gcsafe , raises : [ ValueError , Exception ] , tags : [ RootEffect ] , forbids : [ ] .}
+
+
+ Hashes the given plain-text password with the PBKDF2 using an HMAC with the SHA512 hashing algorithm from openssl.
+Returns the hash as Hash type.
+Salt can be of any size, but is recommended to be at least 16 bytes long.
+Iterations is the number of times the argon-algorithm is applied during hashing. Set the number of iterations to be as high as you can as long as hashing times remain acceptable for your application. For online use (e.g. logging in on a website), a 1 second computation is likely to be the acceptable maximum. For interactive use (e.g. a desktop application), a 5 second pause after having entered a password is acceptable if the password doesn't need to be entered more than once per session. For non-interactive and infrequent use (e.g. restoring an encrypted backup), an even slower computation can be an option.
+
+ Source
+Edit
+
+
+
+
+
+
+
+
proc isValidPassword ( password : Password ; encodedHash : string ) : bool {.
+ ... raises : { Pbkdf2Error , Exception } , tags : [ RootEffect ] , forbids : [ ] .}
+
+
+ Verifies that a given plain-text password can be used to generate the hash contained in encodedHash with the parameters provided in encodedHash .
+encodedHash must be a string with the kind of pattern that encodeHash and hashEncodePassword generate.
+Raises Pbkdf2Error if an error happens during the process.
+
+ Source
+Edit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2023-09-25 18:52:33 UTC
+
+
+
+
+
+
+
+
+
diff --git a/nimword/pbkdf2_sha512.idx b/nimword/pbkdf2_sha512.idx
new file mode 100644
index 0000000..55838fa
--- /dev/null
+++ b/nimword/pbkdf2_sha512.idx
@@ -0,0 +1,5 @@
+nimTitle pbkdf2_sha512 nimword/pbkdf2_sha512.html module src/nimword/pbkdf2_sha512 0
+nim encodeHash nimword/pbkdf2_sha512.html#encodeHash,Hash,seq[byte],SomeInteger proc encodeHash(hash: Hash; salt: seq[byte]; iterations: SomeInteger): string 14
+nim hashPassword nimword/pbkdf2_sha512.html#hashPassword,Password,seq[byte],int proc hashPassword(password: Password; salt: seq[byte]; iterations: int): Hash 28
+nim hashEncodePassword nimword/pbkdf2_sha512.html#hashEncodePassword,Password,int proc hashEncodePassword(password: Password; iterations: int): string 46
+nim isValidPassword nimword/pbkdf2_sha512.html#isValidPassword,Password,string proc isValidPassword(password: Password; encodedHash: string): bool 64
diff --git a/nimword/private/base64_utils.html b/nimword/private/base64_utils.html
new file mode 100644
index 0000000..3764c33
--- /dev/null
+++ b/nimword/private/base64_utils.html
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+src/nimword/private/base64_utils
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
src/nimword/private/base64_utils
+
+
+
+ Theme:
+
+ 🌗 Match OS
+ 🌑 Dark
+ 🌕 Light
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
Source
+
Edit
+
+
+
+
+
+
+
+
+
+
proc decode ( s : string ) : seq [ byte ] {.... raises : [ ValueError ] , tags : [ ] , forbids : [ ] .}
+
+
+ Decodes a base64 encoded string and returns it as a byte-sequence
+ Source
+Edit
+
+
+
+
+
+
+
+
proc toBytes ( s : string ) : seq [ byte ] {.... raises : [ ] , tags : [ ] , forbids : [ ] .}
+
+
+ Simply casts a string into a byte-sequence without modifying it
+ Source
+Edit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2023-09-25 18:52:33 UTC
+
+
+
+
+
+
+
+
+
diff --git a/nimword/private/base64_utils.idx b/nimword/private/base64_utils.idx
new file mode 100644
index 0000000..f38088f
--- /dev/null
+++ b/nimword/private/base64_utils.idx
@@ -0,0 +1,3 @@
+nimTitle base64_utils nimword/private/base64_utils.html module src/nimword/private/base64_utils 0
+nim toBytes nimword/private/base64_utils.html#toBytes,string proc toBytes(s: string): seq[byte] 5
+nim decode nimword/private/base64_utils.html#decode,string proc decode(s: string): seq[byte] 9
diff --git a/nimword/private/pbkdf2_utils.html b/nimword/private/pbkdf2_utils.html
new file mode 100644
index 0000000..cb78048
--- /dev/null
+++ b/nimword/private/pbkdf2_utils.html
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+src/nimword/private/pbkdf2_utils
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
src/nimword/private/pbkdf2_utils
+
+
+
+ Theme:
+
+ 🌗 Match OS
+ 🌑 Dark
+ 🌕 Light
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
Source
+
Edit
+
+
+
+
+
+
+
+
+
+
Pbkdf2Algorithm = enum
+ pbkdf2_sha256 , pbkdf2_sha512
+
+
+ The hash algorithms that can be used with pbkdf2
+ Source
+Edit
+
+
+
+
+
+
+
+
+
+
+
+
+
proc encodeHash ( hash : Hash ; salt : seq [ byte ] ; iterations : SomeInteger ;
+ algorithm : Pbkdf2Algorithm ) : string
+
+
+ Encodes all relevant data for a password hash in a string.
+Hash is a seqbyte like salt and gets turned into a base64 encoded string with all padding suffix characters of "=" removed". Salt gets turned into a base64 encoded string with all padding suffix character of "=" removed. Algorithm is either "pbkdf2_sha256" or "pbkdf2_sha512"
+The pattern is: $<algorithm>$<iterations>$<salt>$<hash>
+
+ Source
+Edit
+
+
+
+
+
+
+
+
proc hashPbkdf2 ( password : Password ; salt : seq [ byte ] ; iterations : int ;
+ digestFunction : EVP_MD ) : Hash {.... gcsafe ,
+ raises : [ ValueError , Exception ] , tags : [ RootEffect ] , forbids : [ ] .}
+
+
+ Hashes the given password with a SHA256 digest and the PBKDF2 hashing function from openSSL. This will execute the PBKDF2. HMAC = Hash based message authentication code
+ Source
+Edit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2023-09-25 18:52:33 UTC
+
+
+
+
+
+
+
+
+
diff --git a/nimword/private/pbkdf2_utils.idx b/nimword/private/pbkdf2_utils.idx
new file mode 100644
index 0000000..b171de8
--- /dev/null
+++ b/nimword/private/pbkdf2_utils.idx
@@ -0,0 +1,7 @@
+nimTitle pbkdf2_utils nimword/private/pbkdf2_utils.html module src/nimword/private/pbkdf2_utils 0
+nim Pbkdf2Error nimword/private/pbkdf2_utils.html#Pbkdf2Error object Pbkdf2Error 8
+nim pbkdf2_sha256 nimword/private/pbkdf2_utils.html#pbkdf2_sha256 Pbkdf2Algorithm.pbkdf2_sha256 10
+nim pbkdf2_sha512 nimword/private/pbkdf2_utils.html#pbkdf2_sha512 Pbkdf2Algorithm.pbkdf2_sha512 10
+nim Pbkdf2Algorithm nimword/private/pbkdf2_utils.html#Pbkdf2Algorithm enum Pbkdf2Algorithm 10
+nim encodeHash nimword/private/pbkdf2_utils.html#encodeHash,Hash,seq[byte],SomeInteger,Pbkdf2Algorithm proc encodeHash(hash: Hash; salt: seq[byte]; iterations: SomeInteger;\n algorithm: Pbkdf2Algorithm): string 51
+nim hashPbkdf2 nimword/private/pbkdf2_utils.html#hashPbkdf2,Password,seq[byte],int,EVP_MD proc hashPbkdf2(password: Password; salt: seq[byte]; iterations: int;\n digestFunction: EVP_MD): Hash 101
diff --git a/nimword/private/types.html b/nimword/private/types.html
new file mode 100644
index 0000000..9d32b2c
--- /dev/null
+++ b/nimword/private/types.html
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+src/nimword/private/types
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
src/nimword/private/types
+
+
+
+ Theme:
+
+ 🌗 Match OS
+ 🌑 Dark
+ 🌕 Light
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
Source
+
Edit
+
+
+
+
+
+
+
+
+
Hash = seq [ byte ]
+
+
+ A convenience type to better express hashes.
+ Source
+Edit
+
+
+
+
+
Password = distinct string
+
+
+ A special type for plain-text password string to prevent performing normal string operations with them. They are security critical and should not be accidentally logged or the like.
+ Source
+Edit
+
+
+
+
+
+
+
+
+
+
+
+
converter toPassword ( str : string ) : Password {.... raises : [ ] , tags : [ ] , forbids : [ ] .}
+
+
+ Converter that implicitly converts any string to a Password type. Makes it easier to use procs with strings.
+ Source
+Edit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2023-09-25 18:52:33 UTC
+
+
+
+
+
+
+
+
+
diff --git a/nimword/private/types.idx b/nimword/private/types.idx
new file mode 100644
index 0000000..23b2202
--- /dev/null
+++ b/nimword/private/types.idx
@@ -0,0 +1,4 @@
+nimTitle types nimword/private/types.html module src/nimword/private/types 0
+nim Password nimword/private/types.html#Password type Password 1
+nim toPassword nimword/private/types.html#toPassword.c,string converter toPassword(str: string): Password 3
+nim Hash nimword/private/types.html#Hash type Hash 5
diff --git a/theindex.html b/theindex.html
new file mode 100644
index 0000000..0c9c374
--- /dev/null
+++ b/theindex.html
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+Index
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+