diff --git a/dochack.js b/dochack.js
new file mode 100644
index 0000000..8d63833
--- /dev/null
+++ b/dochack.js
@@ -0,0 +1,1619 @@
+/* Generated by the Nim Compiler v2.1.9 */
+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 NTI33555163 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555171 = {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 NTI33555170 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI33555167 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555168 = {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 NNI33555168 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555168.node = NNI33555168;
+NTI33555170.base = NTI33555167;
+NTI33555171.base = NTI33555167;
+var NNI33555167 = {kind: 2, len: 5, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "parent", len: 0, typ: NTI33555170, 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: NTI33555171, name: "up", sons: null}]};
+NTI33555167.node = NNI33555167;
+var NNI33555163 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555163.node = NNI33555163;
+NTI33555167.base = NTI33555163;
+NTI33555168.base = NTI33555167;
+NTI134217741.base = NTI33555168;
+NTI134217743.base = NTI134217741;
+var NNI134217751 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI134217751.node = NNI134217751;
+NTI134217751.base = NTI33555168;
+var NNI134217749 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI134217749.node = NNI134217749;
+NTI134217749.base = NTI33555168;
+var NNI134217745 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI134217745.node = NNI134217745;
+NTI134217745.base = NTI33555168;
+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_p0) {
+ var result = new Array(len_p0);
+ for (var i = 0; i < len_p0; i++) {result[i] = 0;}
+ return result;
+
+
+
+}
+
+function toJSStr(s_p0) {
+ var result_33556891 = null;
+
+ var res_33556932 = newSeq__system_u2476((s_p0).length);
+ var i_33556933 = 0;
+ var j_33556934 = 0;
+ Label1: {
+ Label2: while (true) {
+ if (!(i_33556933 < (s_p0).length)) break Label2;
+ var c_33556935 = s_p0[i_33556933];
+ if ((c_33556935 < 128)) {
+ res_33556932[j_33556934] = String.fromCharCode(c_33556935);
+ i_33556933 += 1;
+ }
+ else {
+ var helper_33556947 = newSeq__system_u2476(0);
+ Label3: {
+ Label4: while (true) {
+ if (!true) break Label4;
+ var code_33556948 = c_33556935.toString(16);
+ if ((((code_33556948) == null ? 0 : (code_33556948).length) == 1)) {
+ helper_33556947.push("%0");;
+ }
+ else {
+ helper_33556947.push("%");;
+ }
+
+ helper_33556947.push(code_33556948);;
+ i_33556933 += 1;
+ if ((((s_p0).length <= i_33556933) || (s_p0[i_33556933] < 128))) {
+ break Label3;
+ }
+
+ c_33556935 = s_p0[i_33556933];
+ }
+ };
+++excHandler;
+ try {
+ res_33556932[j_33556934] = decodeURIComponent(helper_33556947.join(""));
+--excHandler;
+} catch (EXCEPTION) {
+ var prevJSError = lastJSError;
+ lastJSError = EXCEPTION;
+ --excHandler;
+ res_33556932[j_33556934] = helper_33556947.join("");
+ lastJSError = prevJSError;
+ } finally {
+ }
+ }
+
+ j_33556934 += 1;
+ }
+ };
+ if (res_33556932.length < j_33556934) { for (var i = res_33556932.length ; i < j_33556934 ; ++i) res_33556932.push(null); }
+ else { res_33556932.length = j_33556934; };
+ result_33556891 = res_33556932.join("");
+
+ return result_33556891;
+
+}
+
+function raiseException(e_p0, ename_p1) {
+ e_p0.name = ename_p1;
+ if ((excHandler == 0)) {
+ unhandledException(e_p0);
+ }
+
+ throw e_p0;
+
+
+}
+
+function addInt(a_p0, b_p1) {
+ var result = a_p0 + b_p1;
+ checkOverflowInt(result);
+ return result;
+
+
+
+}
+
+function chckRange(i_p0, a_p1, b_p2) {
+ var result_33557309 = 0;
+
+ BeforeRet: {
+ if (((a_p1 <= i_p0) && (i_p0 <= b_p2))) {
+ result_33557309 = i_p0;
+ break BeforeRet;
+ }
+ else {
+ raiseRangeError();
+ }
+
+ };
+
+ return result_33557309;
+
+}
+
+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_p0, src_p1, ti_p2) {
+ var result_33557269 = null;
+
+ switch (ti_p2.kind) {
+ case 21:
+ case 22:
+ case 23:
+ case 5:
+ if (!(isFatPointer__system_u2817(ti_p2))) {
+ result_33557269 = src_p1;
+ }
+ else {
+ result_33557269 = [src_p1[0], src_p1[1]];
+ }
+
+ break;
+ case 19:
+ if (dest_p0 === null || dest_p0 === undefined) {
+ dest_p0 = {};
+ }
+ else {
+ for (var key in dest_p0) { delete dest_p0[key]; }
+ }
+ for (var key in src_p1) { dest_p0[key] = src_p1[key]; }
+ result_33557269 = dest_p0;
+
+ break;
+ case 18:
+ case 17:
+ if (!((ti_p2.base == null))) {
+ result_33557269 = nimCopy(dest_p0, src_p1, ti_p2.base);
+ }
+ else {
+ if ((ti_p2.kind == 17)) {
+ result_33557269 = (dest_p0 === null || dest_p0 === undefined) ? {m_type: ti_p2} : dest_p0;
+ }
+ else {
+ result_33557269 = (dest_p0 === null || dest_p0 === undefined) ? {} : dest_p0;
+ }
+ }
+ nimCopyAux(result_33557269, src_p1, ti_p2.node);
+ break;
+ case 4:
+ case 16:
+ if(ArrayBuffer.isView(src_p1)) {
+ if(dest_p0 === null || dest_p0 === undefined || dest_p0.length != src_p1.length) {
+ dest_p0 = new src_p1.constructor(src_p1);
+ } else {
+ dest_p0.set(src_p1, 0);
+ }
+ result_33557269 = dest_p0;
+ } else {
+ if (src_p1 === null) {
+ result_33557269 = null;
+ }
+ else {
+ if (dest_p0 === null || dest_p0 === undefined || dest_p0.length != src_p1.length) {
+ dest_p0 = new Array(src_p1.length);
+ }
+ result_33557269 = dest_p0;
+ for (var i = 0; i < src_p1.length; ++i) {
+ result_33557269[i] = nimCopy(result_33557269[i], src_p1[i], ti_p2.base);
+ }
+ }
+ }
+
+ break;
+ case 24:
+ case 27:
+ if (src_p1 === null) {
+ result_33557269 = null;
+ }
+ else {
+ if (dest_p0 === null || dest_p0 === undefined || dest_p0.length != src_p1.length) {
+ dest_p0 = new Array(src_p1.length);
+ }
+ result_33557269 = dest_p0;
+ for (var i = 0; i < src_p1.length; ++i) {
+ result_33557269[i] = nimCopy(result_33557269[i], src_p1[i], ti_p2.base);
+ }
+ }
+
+ break;
+ case 28:
+ if (src_p1 !== null) {
+ result_33557269 = src_p1.slice(0);
+ }
+
+ break;
+ default:
+ result_33557269 = src_p1;
+ break;
+ }
+
+ return result_33557269;
+
+}
+
+function chckIndx(i_p0, a_p1, b_p2) {
+ var result_33557304 = 0;
+
+ BeforeRet: {
+ if (((a_p1 <= i_p0) && (i_p0 <= b_p2))) {
+ result_33557304 = i_p0;
+ break BeforeRet;
+ }
+ else {
+ raiseIndexError(i_p0, a_p1, b_p2);
+ }
+
+ };
+
+ return result_33557304;
+
+}
+
+function makeNimstrLit(c_p0) {
+ var result = [];
+ for (var i = 0; i < c_p0.length; ++i) {
+ result[i] = c_p0.charCodeAt(i);
+ }
+ return result;
+
+
+
+}
+
+function subInt(a_p0, b_p1) {
+ var result = a_p0 - b_p1;
+ checkOverflowInt(result);
+ return result;
+
+
+
+}
+
+function cstrToNimstr(c_p0) {
+ var ln = c_p0.length;
+ var result = new Array(ln);
+ var r = 0;
+ for (var i = 0; i < ln; ++i) {
+ var ch = c_p0.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_p0.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_p0, b_p1) {
+ var result = a_p0 * b_p1;
+ 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_p0, b_p1) {
+ var Temporary1;
+
+ var result_33557096 = 0;
+
+ BeforeRet: {
+ if ((b_p1 <= a_p0)) {
+ Temporary1 = a_p0;
+ }
+ else {
+ Temporary1 = b_p1;
+ }
+
+ result_33557096 = Temporary1;
+ break BeforeRet;
+ };
+
+ return result_33557096;
+
+}
+
+function nimMin(a_p0, b_p1) {
+ var Temporary1;
+
+ var result_33557092 = 0;
+
+ BeforeRet: {
+ if ((a_p0 <= b_p1)) {
+ Temporary1 = a_p0;
+ }
+ else {
+ Temporary1 = b_p1;
+ }
+
+ result_33557092 = Temporary1;
+ break BeforeRet;
+ };
+
+ return result_33557092;
+
+}
+
+function addChar(x_p0, c_p1) {
+ x_p0.push(c_p1);
+
+
+}
+var objectID_1157628079 = [0];
+
+function setTheme(theme_p0) {
+ document.documentElement.setAttribute("data-theme", theme_p0);
+ window.localStorage.setItem("theme", theme_p0);
+
+
+}
+
+function add__system_u1931(x_p0, x_p0_Idx, y_p1) {
+ if (x_p0[x_p0_Idx] === null) { x_p0[x_p0_Idx] = []; }
+ var off = x_p0[x_p0_Idx].length;
+ x_p0[x_p0_Idx].length += y_p1.length;
+ for (var i = 0; i < y_p1.length; ++i) {
+ x_p0[x_p0_Idx][off+i] = y_p1.charCodeAt(i);
+ }
+
+
+
+}
+
+function newSeq__system_u2476(len_p0) {
+ var result_33556911 = [];
+
+ result_33556911 = new Array(len_p0); for (var i = 0 ; i < len_p0 ; ++i) { result_33556911[i] = null; }
+ return result_33556911;
+
+}
+
+function unhandledException(e_p0) {
+ var buf_33556639 = [[]];
+ if (!(((e_p0.message).length == 0))) {
+ buf_33556639[0].push.apply(buf_33556639[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_33556639[0].push.apply(buf_33556639[0], e_p0.message);;
+ }
+ else {
+ buf_33556639[0].push.apply(buf_33556639[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_33556639[0].push.apply(buf_33556639[0], [32,91]);;
+ add__system_u1931(buf_33556639, 0, e_p0.name);
+ buf_33556639[0].push.apply(buf_33556639[0], [93,10]);;
+ var cbuf_33556640 = toJSStr(buf_33556639[0]);
+ if (typeof(Error) !== "undefined") {
+ throw new Error(cbuf_33556640);
+ }
+ else {
+ throw cbuf_33556640;
+ }
+
+
+
+}
+
+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_p0) {
+ if (a_p0 > 2147483647 || a_p0 < -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__stdZprivateZdigitsutils_u199(result_p0, result_p0_Idx, x_p1, start_p2, n_p3) {
+ var Temporary1;
+
+ var old_301990093 = (result_p0[result_p0_Idx]).length;
+ if (result_p0[result_p0_Idx].length < (Temporary1 = chckRange(addInt(old_301990093, n_p3), 0, 2147483647), Temporary1)) { for (var i = result_p0[result_p0_Idx].length; i < Temporary1; ++i) result_p0[result_p0_Idx].push(0); }
+ else {result_p0[result_p0_Idx].length = Temporary1; };
+ Label2: {
+ var iHEX60gensym4_301990107 = 0;
+ var i_553649322 = 0;
+ Label3: {
+ Label4: while (true) {
+ if (!(i_553649322 < n_p3)) break Label4;
+ iHEX60gensym4_301990107 = i_553649322;
+ result_p0[result_p0_Idx][chckIndx(addInt(old_301990093, iHEX60gensym4_301990107), 0, (result_p0[result_p0_Idx]).length - 1)] = x_p1.charCodeAt(chckIndx(addInt(start_p2, iHEX60gensym4_301990107), 0, (x_p1).length - 1));
+ i_553649322 = addInt(i_553649322, 1);
+ }
+ };
+ };
+
+
+}
+
+function addChars__stdZprivateZdigitsutils_u195(result_p0, result_p0_Idx, x_p1) {
+ addChars__stdZprivateZdigitsutils_u199(result_p0, result_p0_Idx, x_p1, 0, ((x_p1) == null ? 0 : (x_p1).length));
+
+
+}
+
+function addInt__stdZprivateZdigitsutils_u220(result_p0, result_p0_Idx, x_p1) {
+ addChars__stdZprivateZdigitsutils_u195(result_p0, result_p0_Idx, ((x_p1) + ""));
+
+
+}
+
+function addInt__stdZprivateZdigitsutils_u238(result_p0, result_p0_Idx, x_p1) {
+ addInt__stdZprivateZdigitsutils_u220(result_p0, result_p0_Idx, BigInt(x_p1));
+
+
+}
+
+function HEX24__systemZdollars_u8(x_p0) {
+ var result_385875978 = [[]];
+
+ addInt__stdZprivateZdigitsutils_u238(result_385875978, 0, x_p0);
+
+ return result_385875978[0];
+
+}
+
+function isFatPointer__system_u2817(ti_p0) {
+ var result_33557251 = false;
+
+ BeforeRet: {
+ result_33557251 = !((ConstSet1[ti_p0.base.kind] != undefined));
+ break BeforeRet;
+ };
+
+ return result_33557251;
+
+}
+
+function nimCopyAux(dest_p0, src_p1, n_p2) {
+ switch (n_p2.kind) {
+ case 0:
+ break;
+ case 1:
+ dest_p0[n_p2.offset] = nimCopy(dest_p0[n_p2.offset], src_p1[n_p2.offset], n_p2.typ);
+
+ break;
+ case 2:
+ for (var i = 0; i < n_p2.sons.length; i++) {
+ nimCopyAux(dest_p0, src_p1, n_p2.sons[i]);
+ }
+
+ break;
+ case 3:
+ dest_p0[n_p2.offset] = nimCopy(dest_p0[n_p2.offset], src_p1[n_p2.offset], n_p2.typ);
+ for (var i = 0; i < n_p2.sons.length; ++i) {
+ nimCopyAux(dest_p0, src_p1, n_p2.sons[i][1]);
+ }
+
+ break;
+ }
+
+
+}
+
+function raiseIndexError(i_p0, a_p1, b_p2) {
+ var Temporary1;
+
+ if ((b_p2 < a_p1)) {
+ 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__systemZdollars_u8(i_p0),[32,110,111,116,32,105,110,32],HEX24__systemZdollars_u8(a_p1),[32,46,46,32],HEX24__systemZdollars_u8(b_p2));
+ }
+
+ raiseException({message: nimCopy(null, Temporary1, NTI33554449), parent: null, m_type: NTI134217749, name: null, trace: [], up: null}, "IndexDefect");
+
+
+}
+
+function sysFatal__stdZassertions_u45(message_p1) {
+ raiseException({message: nimCopy(null, message_p1, NTI33554449), m_type: NTI134217745, parent: null, name: null, trace: [], up: null}, "AssertionDefect");
+
+
+}
+
+function raiseAssert__stdZassertions_u43(msg_p0) {
+ sysFatal__stdZassertions_u45(msg_p0);
+
+
+}
+
+function failedAssertImpl__stdZassertions_u85(msg_p0) {
+ raiseAssert__stdZassertions_u43(msg_p0);
+
+
+}
+
+function onDOMLoaded(e_p0) {
+ var Temporary4;
+
+function HEX3Aanonymous__dochack_u64(event_p0) {
+ event_p0.target.parentNode.style.display = "none";
+ event_p0.target.parentNode.nextSibling.style.display = "inline";
+
+
+}
+
+ document.getElementById("theme-select").value = window.localStorage.getItem("theme");
+ Label1: {
+ var pragmaDots_553648191 = null;
+ var colontmp__553649313 = [];
+ colontmp__553649313 = document.getElementsByClassName("pragmadots");
+ var i_553649315 = 0;
+ var L_553649316 = (colontmp__553649313).length;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649315 < L_553649316)) break Label3;
+ pragmaDots_553648191 = colontmp__553649313[chckIndx(i_553649315, 0, (colontmp__553649313).length - 1)];
+ Temporary4 = HEX3Aanonymous__dochack_u64.bind(null); Temporary4.ClP_0 = HEX3Aanonymous__dochack_u64; Temporary4.ClE_0 = null;
+ pragmaDots_553648191.onclick = Temporary4;
+ i_553649315 += 1;
+ if (!(((colontmp__553649313).length == L_553649316))) {
+ failedAssertImpl__stdZassertions_u85(makeNimstrLit("iterators.nim(254, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ };
+ };
+
+
+}
+
+function isWhitespace__dochack_u405(x_p0) {
+ var result_553648535 = false;
+
+ result_553648535 = (((x_p0.nodeName == "#text") && !/\S/.test(x_p0.textContent)) || (x_p0.nodeName == "#comment"));
+
+ return result_553648535;
+
+}
+
+function toToc__dochack_u408(x_p0, father_p1) {
+ var Temporary5;
+ var Temporary6;
+ var Temporary7;
+ var Temporary8;
+ var Temporary15;
+
+ if ((x_p0.nodeName == "UL")) {
+ var f_553648546 = {heading: null, kids: [], sortId: (father_p1.kids).length, doSort: false};
+ var i_553648547 = 0;
+ Label1: {
+ Label2: while (true) {
+ if (!(i_553648547 < x_p0.childNodes.length)) break Label2;
+ var nxt_553648548 = addInt(i_553648547, 1);
+ Label3: {
+ Label4: while (true) {
+ if (!(nxt_553648548 < x_p0.childNodes.length)) Temporary5 = false; else { Temporary5 = isWhitespace__dochack_u405(x_p0.childNodes[nxt_553648548]); } if (!Temporary5) break Label4;
+ nxt_553648548 = addInt(nxt_553648548, 1);
+ }
+ };
+ if (!(nxt_553648548 < x_p0.childNodes.length)) Temporary8 = false; else { Temporary8 = (x_p0.childNodes[i_553648547].nodeName == "LI"); } if (!Temporary8) Temporary7 = false; else { Temporary7 = (x_p0.childNodes[i_553648547].childNodes.length == 1); } if (!Temporary7) Temporary6 = false; else { Temporary6 = (x_p0.childNodes[nxt_553648548].nodeName == "UL"); } if (Temporary6) {
+ var e_553648560 = {heading: x_p0.childNodes[i_553648547].childNodes[0], kids: [], sortId: (f_553648546.kids).length, doSort: false};
+ var it_553648561 = x_p0.childNodes[nxt_553648548];
+ Label9: {
+ var j_553648566 = 0;
+ var colontmp__553649329 = 0;
+ colontmp__553649329 = it_553648561.childNodes.length;
+ var i_553649330 = 0;
+ Label10: {
+ Label11: while (true) {
+ if (!(i_553649330 < colontmp__553649329)) break Label11;
+ j_553648566 = i_553649330;
+ toToc__dochack_u408(it_553648561.childNodes[j_553648566], e_553648560);
+ i_553649330 = addInt(i_553649330, 1);
+ }
+ };
+ };
+ f_553648546.kids.push(e_553648560);;
+ i_553648547 = addInt(nxt_553648548, 1);
+ }
+ else {
+ toToc__dochack_u408(x_p0.childNodes[i_553648547], f_553648546);
+ i_553648547 = addInt(i_553648547, 1);
+ }
+
+ }
+ };
+ father_p1.kids.push(f_553648546);;
+ }
+ else {
+ if (isWhitespace__dochack_u405(x_p0)) {
+ }
+ else {
+ if ((x_p0.nodeName == "LI")) {
+ var idx_553648583 = [];
+ Label12: {
+ var i_553648588 = 0;
+ var colontmp__553649333 = 0;
+ colontmp__553649333 = x_p0.childNodes.length;
+ var i_553649334 = 0;
+ Label13: {
+ Label14: while (true) {
+ if (!(i_553649334 < colontmp__553649333)) break Label14;
+ i_553648588 = i_553649334;
+ if (!(isWhitespace__dochack_u405(x_p0.childNodes[i_553648588]))) {
+ idx_553648583.push(i_553648588);;
+ }
+
+ i_553649334 = addInt(i_553649334, 1);
+ }
+ };
+ };
+ if (!((idx_553648583).length == 2)) Temporary15 = false; else { Temporary15 = (x_p0.childNodes[idx_553648583[chckIndx(1, 0, (idx_553648583).length - 1)]].nodeName == "UL"); } if (Temporary15) {
+ var e_553648604 = {heading: x_p0.childNodes[idx_553648583[chckIndx(0, 0, (idx_553648583).length - 1)]], kids: [], sortId: (father_p1.kids).length, doSort: false};
+ var it_553648605 = x_p0.childNodes[idx_553648583[chckIndx(1, 0, (idx_553648583).length - 1)]];
+ Label16: {
+ var j_553648610 = 0;
+ var colontmp__553649337 = 0;
+ colontmp__553649337 = it_553648605.childNodes.length;
+ var i_553649338 = 0;
+ Label17: {
+ Label18: while (true) {
+ if (!(i_553649338 < colontmp__553649337)) break Label18;
+ j_553648610 = i_553649338;
+ toToc__dochack_u408(it_553648605.childNodes[j_553648610], e_553648604);
+ i_553649338 = addInt(i_553649338, 1);
+ }
+ };
+ };
+ father_p1.kids.push(e_553648604);;
+ }
+ else {
+ Label19: {
+ var i_553648619 = 0;
+ var colontmp__553649341 = 0;
+ colontmp__553649341 = x_p0.childNodes.length;
+ var i_553649342 = 0;
+ Label20: {
+ Label21: while (true) {
+ if (!(i_553649342 < colontmp__553649341)) break Label21;
+ i_553648619 = i_553649342;
+ toToc__dochack_u408(x_p0.childNodes[i_553648619], father_p1);
+ i_553649342 = addInt(i_553649342, 1);
+ }
+ };
+ };
+ }
+
+ }
+ else {
+ father_p1.kids.push({heading: x_p0, kids: [], sortId: (father_p1.kids).length, doSort: false});;
+ }
+ }}
+
+
+}
+
+function extractItems__dochack_u197(x_p0, heading_p1, items_p2, items_p2_Idx) {
+ BeforeRet: {
+ if ((x_p0 == null)) {
+ break BeforeRet;
+ }
+
+ if ((!((x_p0.heading == null)) && (x_p0.heading.textContent == heading_p1))) {
+ Label1: {
+ var i_553648345 = 0;
+ var colontmp__553649345 = 0;
+ colontmp__553649345 = (x_p0.kids).length;
+ var i_553649346 = 0;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649346 < colontmp__553649345)) break Label3;
+ i_553648345 = i_553649346;
+ items_p2[items_p2_Idx].push(x_p0.kids[chckIndx(i_553648345, 0, (x_p0.kids).length - 1)].heading);;
+ i_553649346 = addInt(i_553649346, 1);
+ }
+ };
+ };
+ }
+ else {
+ Label4: {
+ var k_553648370 = null;
+ var i_553649350 = 0;
+ var L_553649351 = (x_p0.kids).length;
+ Label5: {
+ Label6: while (true) {
+ if (!(i_553649350 < L_553649351)) break Label6;
+ k_553648370 = x_p0.kids[chckIndx(i_553649350, 0, (x_p0.kids).length - 1)];
+ extractItems__dochack_u197(k_553648370, heading_p1, items_p2, items_p2_Idx);
+ i_553649350 += 1;
+ if (!(((x_p0.kids).length == L_553649351))) {
+ failedAssertImpl__stdZassertions_u85(makeNimstrLit("iterators.nim(254, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ };
+ };
+ }
+
+ };
+
+
+}
+
+function tree__dochack_u129(tag_p0, kids_p1) {
+ var result_553648260 = null;
+
+ result_553648260 = document.createElement(tag_p0);
+ Label1: {
+ var k_553648273 = null;
+ var i_553649363 = 0;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649363 < (kids_p1).length)) break Label3;
+ k_553648273 = kids_p1[chckIndx(i_553649363, 0, (kids_p1).length - 1)];
+ result_553648260.appendChild(k_553648273);
+ i_553649363 += 1;
+ }
+ };
+ };
+
+ return result_553648260;
+
+}
+
+function text__dochack_u153(s_p0) {
+ var result_553648283 = null;
+
+ result_553648283 = document.createTextNode(s_p0);
+
+ return result_553648283;
+
+}
+
+function uncovered__dochack_u595(x_p0) {
+ var Temporary1;
+
+ var result_553648725 = null;
+
+ BeforeRet: {
+ if ((((x_p0.kids).length == 0) && !((x_p0.heading == null)))) {
+ if (!(x_p0.heading.hasOwnProperty('__karaxMarker__'))) {
+ Temporary1 = x_p0;
+ }
+ else {
+ Temporary1 = null;
+ }
+
+ result_553648725 = Temporary1;
+ break BeforeRet;
+ }
+
+ result_553648725 = {heading: x_p0.heading, kids: [], sortId: x_p0.sortId, doSort: x_p0.doSort};
+ Label2: {
+ var k_553648740 = null;
+ var i_553649370 = 0;
+ var L_553649371 = (x_p0.kids).length;
+ Label3: {
+ Label4: while (true) {
+ if (!(i_553649370 < L_553649371)) break Label4;
+ k_553648740 = x_p0.kids[chckIndx(i_553649370, 0, (x_p0.kids).length - 1)];
+ var y_553648741 = uncovered__dochack_u595(k_553648740);
+ if (!((y_553648741 == null))) {
+ result_553648725.kids.push(y_553648741);;
+ }
+
+ i_553649370 += 1;
+ if (!(((x_p0.kids).length == L_553649371))) {
+ failedAssertImpl__stdZassertions_u85(makeNimstrLit("iterators.nim(254, 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__dochack_u625(orig_p0, news_p1) {
+ var result_553648756 = null;
+
+ result_553648756 = uncovered__dochack_u595(orig_p0);
+ if ((result_553648756 == null)) {
+ result_553648756 = news_p1;
+ }
+ else {
+ Label1: {
+ var i_553648768 = 0;
+ var colontmp__553649366 = 0;
+ colontmp__553649366 = (news_p1.kids).length;
+ var i_553649367 = 0;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649367 < colontmp__553649366)) break Label3;
+ i_553648768 = i_553649367;
+ result_553648756.kids.push(news_p1.kids[chckIndx(i_553648768, 0, (news_p1.kids).length - 1)]);;
+ i_553649367 = addInt(i_553649367, 1);
+ }
+ };
+ };
+ }
+
+
+ return result_553648756;
+
+}
+
+function buildToc__dochack_u645(orig_p0, types_p1, procs_p2) {
+ var result_553648777 = null;
+
+ var newStuff_553648782 = {heading: null, kids: [], doSort: true, sortId: 0};
+ Label1: {
+ var t_553648786 = null;
+ var i_553649358 = 0;
+ var L_553649359 = (types_p1).length;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649358 < L_553649359)) break Label3;
+ t_553648786 = types_p1[chckIndx(i_553649358, 0, (types_p1).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_553649355 = 0;
+ var L_553649356 = (procs_p2).length;
+ Label5: {
+ Label6: while (true) {
+ if (!(i_553649355 < L_553649356)) break Label6;
+ p_553648795 = procs_p2[chckIndx(i_553649355, 0, (procs_p2).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__dochack_u129("A", [text__dochack_u153(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_553649355 += 1;
+ if (!(((procs_p2).length == L_553649356))) {
+ failedAssertImpl__stdZassertions_u85(makeNimstrLit("iterators.nim(254, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ };
+ };
+ newStuff_553648782.kids.push(c_553648791);;
+ i_553649358 += 1;
+ if (!(((types_p1).length == L_553649359))) {
+ failedAssertImpl__stdZassertions_u85(makeNimstrLit("iterators.nim(254, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ };
+ };
+ result_553648777 = mergeTocs__dochack_u625(orig_p0, newStuff_553648782);
+
+ return result_553648777;
+
+}
+
+function add__dochack_u146(parent_p0, kid_p1) {
+ if (((parent_p0.nodeName == "TR") && ((kid_p1.nodeName == "TD") || (kid_p1.nodeName == "TH")))) {
+ var k_553648277 = document.createElement("TD");
+ k_553648277.appendChild(kid_p1);
+ parent_p0.appendChild(k_553648277);
+ }
+ else {
+ parent_p0.appendChild(kid_p1);
+ }
+
+
+
+}
+
+function setClass__dochack_u150(e_p0, value_p1) {
+ e_p0.setAttribute("class", value_p1);
+
+
+}
+
+function toHtml__dochack_u275(x_p0, isRoot_p1) {
+ var Temporary1;
+
+function HEX3Aanonymous__dochack_u295(a_p0, b_p1) {
+ var result_553648426 = 0;
+
+ BeforeRet: {
+ if ((!((a_p0.heading == null)) && !((b_p1.heading == null)))) {
+ var x_553648435 = a_p0.heading.textContent;
+ var y_553648436 = b_p1.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_p0.sortId, b_p1.sortId);
+ break BeforeRet;
+ }
+
+ };
+
+ return result_553648426;
+
+}
+
+ var result_553648406 = null;
+
+ BeforeRet: {
+ if ((x_p0 == null)) {
+ result_553648406 = null;
+ break BeforeRet;
+ }
+
+ if (((x_p0.kids).length == 0)) {
+ if ((x_p0.heading == null)) {
+ result_553648406 = null;
+ break BeforeRet;
+ }
+
+ result_553648406 = x_p0.heading.cloneNode(true);
+ break BeforeRet;
+ }
+
+ result_553648406 = tree__dochack_u129("DIV", []);
+ if ((!((x_p0.heading == null)) && !(x_p0.heading.hasOwnProperty('__karaxMarker__')))) {
+ add__dochack_u146(result_553648406, x_p0.heading.cloneNode(true));
+ }
+
+ var ul_553648422 = tree__dochack_u129("UL", []);
+ if (isRoot_p1) {
+ setClass__dochack_u150(ul_553648422, "simple simple-toc");
+ }
+ else {
+ setClass__dochack_u150(ul_553648422, "simple");
+ }
+
+ if (x_p0.doSort) {
+ Temporary1 = HEX3Aanonymous__dochack_u295.bind(null); Temporary1.ClP_0 = HEX3Aanonymous__dochack_u295; Temporary1.ClE_0 = null;
+ x_p0.kids.sort(Temporary1);
+ }
+
+ Label2: {
+ var k_553648448 = null;
+ var i_553649374 = 0;
+ var L_553649375 = (x_p0.kids).length;
+ Label3: {
+ Label4: while (true) {
+ if (!(i_553649374 < L_553649375)) break Label4;
+ k_553648448 = x_p0.kids[chckIndx(i_553649374, 0, (x_p0.kids).length - 1)];
+ var y_553648449 = toHtml__dochack_u275(k_553648448, false);
+ if (!((y_553648449 == null))) {
+ add__dochack_u146(ul_553648422, tree__dochack_u129("LI", [y_553648449]));
+ }
+
+ i_553649374 += 1;
+ if (!(((x_p0.kids).length == L_553649375))) {
+ failedAssertImpl__stdZassertions_u85(makeNimstrLit("iterators.nim(254, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ };
+ };
+ if (!((ul_553648422.childNodes.length == 0))) {
+ add__dochack_u146(result_553648406, ul_553648422);
+ }
+
+ if ((result_553648406.childNodes.length == 0)) {
+ result_553648406 = null;
+ }
+
+ };
+
+ return result_553648406;
+
+}
+
+function replaceById__dochack_u156(id_p0, newTree_p1) {
+ var x_553648287 = document.getElementById(id_p0);
+ x_553648287.parentNode.replaceChild(newTree_p1, x_553648287);
+ newTree_p1.id = id_p0;
+
+
+}
+
+function togglevis__dochack_u703(d_p0) {
+ if ((d_p0.style.display == "none")) {
+ d_p0.style.display = "inline";
+ }
+ else {
+ d_p0.style.display = "none";
+ }
+
+
+
+}
+
+function groupBy(value_p0) {
+ var toc_553648835 = document.getElementById("toc-list");
+ if ((alternative_553648830[0] == null)) {
+ var tt_553648843 = {heading: null, kids: [], sortId: 0, doSort: false};
+ toToc__dochack_u408(toc_553648835, tt_553648843);
+ tt_553648843 = tt_553648843.kids[chckIndx(0, 0, (tt_553648843.kids).length - 1)];
+ var types_553648848 = [[]];
+ var procs_553648853 = [[]];
+ extractItems__dochack_u197(tt_553648843, "Types", types_553648848, 0);
+ extractItems__dochack_u197(tt_553648843, "Procs", procs_553648853, 0);
+ extractItems__dochack_u197(tt_553648843, "Converters", procs_553648853, 0);
+ extractItems__dochack_u197(tt_553648843, "Methods", procs_553648853, 0);
+ extractItems__dochack_u197(tt_553648843, "Templates", procs_553648853, 0);
+ extractItems__dochack_u197(tt_553648843, "Macros", procs_553648853, 0);
+ extractItems__dochack_u197(tt_553648843, "Iterators", procs_553648853, 0);
+ var ntoc_553648854 = buildToc__dochack_u645(tt_553648843, types_553648848[0], procs_553648853[0]);
+ var x_553648855 = toHtml__dochack_u275(ntoc_553648854, true);
+ alternative_553648830[0] = tree__dochack_u129("DIV", [x_553648855]);
+ }
+
+ if ((value_p0 == "type")) {
+ replaceById__dochack_u156("tocRoot", alternative_553648830[0]);
+ }
+ else {
+ replaceById__dochack_u156("tocRoot", tree__dochack_u129("DIV", []));
+ }
+
+ togglevis__dochack_u703(document.getElementById("toc-list"));
+
+
+}
+
+function HEX5BHEX5D__pureZstrutils_u1259(s_p0, x_p1) {
+ var result_721421552 = [];
+
+ var a_721421554 = x_p1.a;
+ var L_721421556 = addInt(subInt(subInt((s_p0).length, x_p1.b), a_721421554), 1);
+ result_721421552 = nimCopy(null, mnewString(chckRange(L_721421556, 0, 2147483647)), NTI33554449);
+ Label1: {
+ var i_721421561 = 0;
+ var i_553649384 = 0;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649384 < L_721421556)) break Label3;
+ i_721421561 = i_553649384;
+ result_721421552[chckIndx(i_721421561, 0, (result_721421552).length - 1)] = s_p0[chckIndx(addInt(i_721421561, a_721421554), 0, (s_p0).length - 1)];
+ i_553649384 = addInt(i_553649384, 1);
+ }
+ };
+ };
+
+ return result_721421552;
+
+}
+
+function HEX2EHEX2E__stdZenumutils_u103(a_p0, b_p1) {
+ var result_939524206 = ({a: 0, b: 0});
+
+ result_939524206 = nimCopy(result_939524206, {a: a_p0, b: b_p1}, NTI939524179);
+
+ return result_939524206;
+
+}
+async function loadIndex__dochack_u923() {
+ var result_553649053 = null;
+
+ BeforeRet: {
+ var indexURL_553649059 = document.getElementById("indexLink").getAttribute("href");
+ var rootURL_553649084 = HEX5BHEX5D__pureZstrutils_u1259(cstrToNimstr(indexURL_553649059), HEX2EHEX2E__stdZenumutils_u103(0, 14));
+ var resp_553649096 = (await (await fetch(indexURL_553649059)).text());
+ var indexElem_553649097 = document.createElement("div");
+ indexElem_553649097.innerHTML = resp_553649096;
+ Label1: {
+ var href_553649118 = null;
+ var colontmp__553649378 = [];
+ colontmp__553649378 = indexElem_553649097.getElementsByClassName("reference");
+ var i_553649380 = 0;
+ var L_553649381 = (colontmp__553649378).length;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649380 < L_553649381)) break Label3;
+ href_553649118 = colontmp__553649378[chckIndx(i_553649380, 0, (colontmp__553649378).length - 1)];
+ href_553649118.setAttribute("href", toJSStr((rootURL_553649084).concat(cstrToNimstr(href_553649118.getAttribute("href")))));
+ db_553648872[0].push(href_553649118);;
+ contents_553648873[0].push(href_553649118.getAttribute("data-doc-search-tag"));;
+ i_553649380 += 1;
+ if (!(((colontmp__553649378).length == L_553649381))) {
+ failedAssertImpl__stdZassertions_u85(makeNimstrLit("iterators.nim(254, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ };
+ };
+ result_553649053 = undefined;
+ break BeforeRet;
+ };
+
+ return result_553649053;
+
+}
+
+function then__dochack_u1099(future_p0, onSuccess_p1, onReject_p2) {
+ var result_553649233 = null;
+
+ BeforeRet: {
+ var ret_553649243 = null;
+ ret_553649243 = future_p0.then(onSuccess_p1, onReject_p2);
+ result_553649233 = ret_553649243;
+ break BeforeRet;
+ };
+
+ return result_553649233;
+
+}
+
+function nsuToLowerAsciiChar(c_p0) {
+ var result_721420374 = 0;
+
+ if ((ConstSet2[c_p0] != undefined)) {
+ result_721420374 = (c_p0 ^ 32);
+ }
+ else {
+ result_721420374 = c_p0;
+ }
+
+
+ return result_721420374;
+
+}
+
+function fuzzyMatch__fuzzysearch_u16(pattern_p0, str_p1) {
+ 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_p1) == null ? 0 : (str_p1).length)) && (patIndex_704643099 < ((pattern_p0) == null ? 0 : (pattern_p0).length)))) break Label2;
+ Label3: {
+ var patternChar_704643103 = nsuToLowerAsciiChar(pattern_p0.charCodeAt(chckIndx(patIndex_704643099, 0, (pattern_p0).length - 1)));
+ var strChar_704643104 = nsuToLowerAsciiChar(str_p1.charCodeAt(chckIndx(strIndex_704643098, 0, (str_p1).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_p0) == null ? -1 : (pattern_p0).length - 1));
+ if ((!(onBoundary_704643156) && (strIndex_704643098 < ((str_p1) == null ? -1 : (str_p1).length - 1)))) {
+ var nextPatternChar_704643157 = nsuToLowerAsciiChar(pattern_p0.charCodeAt(chckIndx(addInt(patIndex_704643099, 1), 0, (pattern_p0).length - 1)));
+ var nextStrChar_704643158 = nsuToLowerAsciiChar(str_p1.charCodeAt(chckIndx(addInt(strIndex_704643098, 1), 0, (str_p1).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_p1.charCodeAt(chckIndx(subInt(strIndex_704643098, 1), 0, (str_p1).length - 1))] != undefined))) Temporary5 = true; else { if (!(ConstSet7[str_p1.charCodeAt(chckIndx(subInt(strIndex_704643098, 1), 0, (str_p1).length - 1))] != undefined)) Temporary6 = false; else { Temporary6 = (ConstSet8[str_p1.charCodeAt(chckIndx(strIndex_704643098, 0, (str_p1).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_p0) == null ? 0 : (pattern_p0).length))) Temporary7 = false; else { if ((strIndex_704643098 == ((str_p1) == null ? 0 : (str_p1).length))) Temporary8 = true; else { Temporary8 = !((ConstSet9[str_p1.charCodeAt(chckIndx(strIndex_704643098, 0, (str_p1).length - 1))] != undefined)); } Temporary7 = Temporary8; } if (Temporary7) {
+ score_704643100 = addInt(score_704643100, 10);
+ }
+
+ var colontmp__553649397 = nimMax(0, score_704643100);
+ var colontmp__553649398 = (0 < score_704643100);
+ result_704643093 = nimCopy(result_704643093, {Field0: colontmp__553649397, Field1: colontmp__553649398}, NTI704643086);
+
+ return result_704643093;
+
+}
+
+function escapeCString__dochack_u746(x_p0, x_p0_Idx) {
+ var s_553648876 = [];
+ Label1: {
+ var c_553648877 = 0;
+ var iHEX60gensym13_553649401 = 0;
+ var nHEX60gensym13_553649402 = ((x_p0[x_p0_Idx]) == null ? 0 : (x_p0[x_p0_Idx]).length);
+ Label2: {
+ Label3: while (true) {
+ if (!(iHEX60gensym13_553649401 < nHEX60gensym13_553649402)) break Label3;
+ c_553648877 = x_p0[x_p0_Idx].charCodeAt(chckIndx(iHEX60gensym13_553649401, 0, (x_p0[x_p0_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;
+ }
+ iHEX60gensym13_553649401 += 1;
+ }
+ };
+ };
+ x_p0[x_p0_Idx] = toJSStr(s_553648876);
+
+
+}
+
+function dosearch__dochack_u750(value_p0) {
+ var Temporary5;
+
+function HEX3Aanonymous__dochack_u778(a_p0, b_p1) {
+ var result_553648919 = 0;
+
+ result_553648919 = subInt(b_p1["Field1"], a_p0["Field1"]);
+
+ return result_553648919;
+
+}
+
+ var result_553648880 = null;
+
+ BeforeRet: {
+ if (((db_553648872[0]).length == 0)) {
+ break BeforeRet;
+ }
+
+ var ul_553648884 = tree__dochack_u129("UL", []);
+ result_553648880 = tree__dochack_u129("DIV", []);
+ setClass__dochack_u150(result_553648880, "search_results");
+ var matches_553648889 = [];
+ Label1: {
+ var i_553648897 = 0;
+ var colontmp__553649388 = 0;
+ colontmp__553649388 = (db_553648872[0]).length;
+ var i_553649389 = 0;
+ Label2: {
+ Label3: while (true) {
+ if (!(i_553649389 < colontmp__553649388)) break Label3;
+ i_553648897 = i_553649389;
+ 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__fuzzysearch_u16(value_p0, 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_553649389 = addInt(i_553649389, 1);
+ }
+ };
+ };
+ Temporary5 = HEX3Aanonymous__dochack_u778.bind(null); Temporary5.ClP_0 = HEX3Aanonymous__dochack_u778; Temporary5.ClE_0 = null;
+ matches_553648889.sort(Temporary5);
+ Label6: {
+ var i_553648936 = 0;
+ var colontmp__553649392 = 0;
+ colontmp__553649392 = nimMin((matches_553648889).length, 29);
+ var i_553649393 = 0;
+ Label7: {
+ Label8: while (true) {
+ if (!(i_553649393 < colontmp__553649392)) break Label8;
+ i_553648936 = i_553649393;
+ matches_553648889[chckIndx(i_553648936, 0, (matches_553648889).length - 1)]["Field0"].innerHTML = matches_553648889[chckIndx(i_553648936, 0, (matches_553648889).length - 1)]["Field0"].getAttribute("data-doc-search-tag");
+ escapeCString__dochack_u746(matches_553648889[chckIndx(i_553648936, 0, (matches_553648889).length - 1)]["Field0"], "innerHTML");
+ add__dochack_u146(ul_553648884, tree__dochack_u129("LI", [matches_553648889[chckIndx(i_553648936, 0, (matches_553648889).length - 1)]["Field0"]]));
+ i_553649393 = addInt(i_553649393, 1);
+ }
+ };
+ };
+ if ((ul_553648884.childNodes.length == 0)) {
+ add__dochack_u146(result_553648880, tree__dochack_u129("B", [text__dochack_u153("no search results")]));
+ }
+ else {
+ add__dochack_u146(result_553648880, tree__dochack_u129("B", [text__dochack_u153("search results")]));
+ add__dochack_u146(result_553648880, ul_553648884);
+ }
+
+ };
+
+ return result_553648880;
+
+}
+
+function wrapper__dochack_u1084() {
+ var elem_553649213 = document.getElementById("searchInput");
+ var value_553649214 = elem_553649213.value;
+ if (!((((value_553649214) == null ? 0 : (value_553649214).length) == 0))) {
+ if ((oldtoc_553649207[0] == null)) {
+ oldtoc_553649207[0] = document.getElementById("tocRoot");
+ }
+
+ var results_553649218 = dosearch__dochack_u750(value_553649214);
+ replaceById__dochack_u156("tocRoot", results_553649218);
+ }
+ else {
+ if (!((oldtoc_553649207[0] == null))) {
+ replaceById__dochack_u156("tocRoot", oldtoc_553649207[0]);
+ }
+ }
+
+
+}
+
+function search() {
+ var Temporary1;
+
+ if ((loadIndexFut_553649210[0] == null)) {
+ loadIndexFut_553649210[0] = loadIndex__dochack_u923();
+ (then__dochack_u1099(loadIndexFut_553649210[0], wrapper__dochack_u1084, null));
+ }
+
+ if (!((timer_553649208[0] == null))) {
+ clearTimeout(timer_553649208[0]);
+ }
+
+ Temporary1 = wrapper__dochack_u1084.bind(null); Temporary1.ClP_0 = wrapper__dochack_u1084; Temporary1.ClE_0 = null;
+ timer_553649208[0] = setTimeout(Temporary1, 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 Temporary2;
+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_553649207 = [null];
+var timer_553649208 = [null];
+var loadIndexFut_553649210 = [null];
+copyToClipboard();
+Temporary2 = onDOMLoaded.bind(null); Temporary2.ClP_0 = onDOMLoaded; Temporary2.ClE_0 = null;
+window.addEventListener("DOMContentLoaded", Temporary2, false);
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..e1dba2b
--- /dev/null
+++ b/index.html
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+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,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);
+}
+
+@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,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);
+ }
+}
+
+.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..6465fb1
--- /dev/null
+++ b/nimword.html
@@ -0,0 +1,179 @@
+
+
+
+
+
+
+
+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: 2024-08-17 07:24:13 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..f783e35
--- /dev/null
+++ b/nimword/argon2.html
@@ -0,0 +1,216 @@
+
+
+
+
+
+
+
+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 : [ ] , 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: 2024-08-17 07:24:13 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..52834bf
--- /dev/null
+++ b/nimword/pbkdf2_sha256.html
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+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: 2024-08-17 07:24:13 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..b1331fc
--- /dev/null
+++ b/nimword/pbkdf2_sha512.html
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+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: 2024-08-17 07:24:13 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..79c480c
--- /dev/null
+++ b/nimword/private/base64_utils.html
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+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: 2024-08-17 07:24:13 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..09f0234
--- /dev/null
+++ b/nimword/private/pbkdf2_utils.html
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+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: 2024-08-17 07:24:13 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..e295826
--- /dev/null
+++ b/nimword/private/types.html
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+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: 2024-08-17 07:24:13 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..e1dba2b
--- /dev/null
+++ b/theindex.html
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+Index
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+