diff --git a/dochack.js b/dochack.js
new file mode 100644
index 0000000..84342a6
--- /dev/null
+++ b/dochack.js
@@ -0,0 +1,2036 @@
+/* Generated by the Nim Compiler v1.6.18 */
+var framePtr = null;
+var excHandler = 0;
+var lastJSError = null;
+var NTI637534222 = {size: 0, kind: 18, base: null, node: null, finalizer: null};
+var NTI486539805 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI620757084 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757083 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757082 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757081 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757080 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757079 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757078 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757077 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757076 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757075 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757074 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757073 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757072 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757071 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757070 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757069 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757068 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757067 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757066 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757065 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757064 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757063 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757062 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757061 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757060 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI620757133 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI620757022 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI620757180 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757177 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI620757176 = {size: 0, kind: 18, base: null, node: null, finalizer: null};
+var NTI620757057 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI620757179 = {size: 0, kind: 18, base: null, node: null, finalizer: null};
+var NTI620757058 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI620757126 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI620757016 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI620757115 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI620757127 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI620757017 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI620757114 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI620757113 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI620757132 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI620757021 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI620757112 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI620757111 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI620757128 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI620757018 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI620757110 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI620757118 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI620757129 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI620757019 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI620757117 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI33554456 = {size: 0,kind: 31,base: null,node: null,finalizer: null};
+var NTI620757131 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI620757130 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI620757020 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI33554466 = {size: 0,kind: 1,base: null,node: null,finalizer: null};
+var NTI620757102 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI620757006 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI620757116 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI620757010 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI620757109 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI620757009 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI620757007 = {size: 0, kind: 14, base: null, node: null, finalizer: null};
+var NTI620757108 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI620757107 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI620757106 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI620757105 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI620757008 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI620757436 = {size: 0, kind: 24, base: null, node: null, finalizer: null};
+var NTI33555127 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555131 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555133 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555086 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555168 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI33554439 = {size: 0,kind: 28,base: null,node: null,finalizer: null};
+var NTI33554440 = {size: 0,kind: 29,base: null,node: null,finalizer: null};
+var NTI33555167 = {size: 0, kind: 22, base: null, node: null, finalizer: null};
+var NTI33555115 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555116 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555123 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555125 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NNI33555125 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555125.node = NNI33555125;
+var NNI33555123 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555123.node = NNI33555123;
+var NNI33555116 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555116.node = NNI33555116;
+NTI33555167.base = NTI33555115;
+NTI33555168.base = NTI33555115;
+var NNI33555115 = {kind: 2, len: 5, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "parent", len: 0, typ: NTI33555167, name: "parent", sons: null},
+{kind: 1, offset: "name", len: 0, typ: NTI33554440, name: "name", sons: null},
+{kind: 1, offset: "message", len: 0, typ: NTI33554439, name: "msg", sons: null},
+{kind: 1, offset: "trace", len: 0, typ: NTI33554439, name: "trace", sons: null},
+{kind: 1, offset: "up", len: 0, typ: NTI33555168, name: "up", sons: null}]};
+NTI33555115.node = NNI33555115;
+var NNI33555086 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555086.node = NNI33555086;
+NTI33555115.base = NTI33555086;
+NTI33555116.base = NTI33555115;
+NTI33555123.base = NTI33555116;
+NTI33555125.base = NTI33555123;
+var NNI33555133 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555133.node = NNI33555133;
+NTI33555133.base = NTI33555116;
+var NNI33555131 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555131.node = NNI33555131;
+NTI33555131.base = NTI33555116;
+var NNI33555127 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555127.node = NNI33555127;
+NTI33555127.base = NTI33555116;
+NTI620757106.base = NTI620757008;
+NTI620757107.base = NTI620757008;
+NTI620757108.base = NTI620757008;
+var NNI620757007 = {kind: 2, offset: 0, typ: null, name: null, len: 12, sons: {"1": {kind: 1, offset: 1, typ: NTI620757007, name: "ElementNode", len: 0, sons: null},
+"2": {kind: 1, offset: 2, typ: NTI620757007, name: "AttributeNode", len: 0, sons: null},
+"3": {kind: 1, offset: 3, typ: NTI620757007, name: "TextNode", len: 0, sons: null},
+"4": {kind: 1, offset: 4, typ: NTI620757007, name: "CDATANode", len: 0, sons: null},
+"5": {kind: 1, offset: 5, typ: NTI620757007, name: "EntityRefNode", len: 0, sons: null},
+"6": {kind: 1, offset: 6, typ: NTI620757007, name: "EntityNode", len: 0, sons: null},
+"7": {kind: 1, offset: 7, typ: NTI620757007, name: "ProcessingInstructionNode", len: 0, sons: null},
+"8": {kind: 1, offset: 8, typ: NTI620757007, name: "CommentNode", len: 0, sons: null},
+"9": {kind: 1, offset: 9, typ: NTI620757007, name: "DocumentNode", len: 0, sons: null},
+"10": {kind: 1, offset: 10, typ: NTI620757007, name: "DocumentTypeNode", len: 0, sons: null},
+"11": {kind: 1, offset: 11, typ: NTI620757007, name: "DocumentFragmentNode", len: 0, sons: null},
+"12": {kind: 1, offset: 12, typ: NTI620757007, name: "NotationNode", len: 0, sons: null}}};
+NTI620757007.node = NNI620757007;
+var NNI620757102 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI620757102.node = NNI620757102;
+NTI620757102.base = NTI33555086;
+NTI620757006.base = NTI620757102;
+NTI620757131.base = NTI620757010;
+var NNI620757130 = {kind: 2, len: 10, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "acceptCharset", len: 0, typ: NTI33554440, name: "acceptCharset", sons: null},
+{kind: 1, offset: "action", len: 0, typ: NTI33554440, name: "action", sons: null},
+{kind: 1, offset: "autocomplete", len: 0, typ: NTI33554440, name: "autocomplete", sons: null},
+{kind: 1, offset: "elements", len: 0, typ: NTI620757131, name: "elements", sons: null},
+{kind: 1, offset: "encoding", len: 0, typ: NTI33554440, name: "encoding", sons: null},
+{kind: 1, offset: "enctype", len: 0, typ: NTI33554440, name: "enctype", sons: null},
+{kind: 1, offset: "length", len: 0, typ: NTI33554456, name: "length", sons: null},
+{kind: 1, offset: "method", len: 0, typ: NTI33554440, name: "method", sons: null},
+{kind: 1, offset: "noValidate", len: 0, typ: NTI33554466, name: "noValidate", sons: null},
+{kind: 1, offset: "target", len: 0, typ: NTI33554440, name: "target", sons: null}]};
+NTI620757130.node = NNI620757130;
+NTI620757130.base = NTI620757116;
+NTI620757020.base = NTI620757130;
+var NNI620757129 = {kind: 2, len: 5, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "defaultSelected", len: 0, typ: NTI33554466, name: "defaultSelected", sons: null},
+{kind: 1, offset: "selected", len: 0, typ: NTI33554466, name: "selected", sons: null},
+{kind: 1, offset: "selectedIndex", len: 0, typ: NTI33554456, name: "selectedIndex", sons: null},
+{kind: 1, offset: "text", len: 0, typ: NTI33554440, name: "text", sons: null},
+{kind: 1, offset: "value", len: 0, typ: NTI33554440, name: "value", sons: null}]};
+NTI620757129.node = NNI620757129;
+NTI620757129.base = NTI620757116;
+NTI620757019.base = NTI620757129;
+NTI620757117.base = NTI620757019;
+NTI620757118.base = NTI620757019;
+var NNI620757116 = {kind: 2, len: 20, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "className", len: 0, typ: NTI33554440, name: "className", sons: null},
+{kind: 1, offset: "classList", len: 0, typ: NTI620757006, name: "classList", sons: null},
+{kind: 1, offset: "checked", len: 0, typ: NTI33554466, name: "checked", sons: null},
+{kind: 1, offset: "defaultChecked", len: 0, typ: NTI33554466, name: "defaultChecked", sons: null},
+{kind: 1, offset: "defaultValue", len: 0, typ: NTI33554440, name: "defaultValue", sons: null},
+{kind: 1, offset: "disabled", len: 0, typ: NTI33554466, name: "disabled", sons: null},
+{kind: 1, offset: "form", len: 0, typ: NTI620757020, name: "form", sons: null},
+{kind: 1, offset: "name", len: 0, typ: NTI33554440, name: "name", sons: null},
+{kind: 1, offset: "readOnly", len: 0, typ: NTI33554466, name: "readOnly", sons: null},
+{kind: 1, offset: "options", len: 0, typ: NTI620757117, name: "options", sons: null},
+{kind: 1, offset: "selectedOptions", len: 0, typ: NTI620757118, name: "selectedOptions", sons: null},
+{kind: 1, offset: "clientWidth", len: 0, typ: NTI33554456, name: "clientWidth", sons: null},
+{kind: 1, offset: "clientHeight", len: 0, typ: NTI33554456, name: "clientHeight", sons: null},
+{kind: 1, offset: "contentEditable", len: 0, typ: NTI33554440, name: "contentEditable", sons: null},
+{kind: 1, offset: "isContentEditable", len: 0, typ: NTI33554466, name: "isContentEditable", sons: null},
+{kind: 1, offset: "dir", len: 0, typ: NTI33554440, name: "dir", sons: null},
+{kind: 1, offset: "offsetHeight", len: 0, typ: NTI33554456, name: "offsetHeight", sons: null},
+{kind: 1, offset: "offsetWidth", len: 0, typ: NTI33554456, name: "offsetWidth", sons: null},
+{kind: 1, offset: "offsetLeft", len: 0, typ: NTI33554456, name: "offsetLeft", sons: null},
+{kind: 1, offset: "offsetTop", len: 0, typ: NTI33554456, name: "offsetTop", sons: null}]};
+NTI620757116.node = NNI620757116;
+NTI620757116.base = NTI620757105;
+NTI620757010.base = NTI620757116;
+var NNI620757128 = {kind: 2, len: 3, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "text", len: 0, typ: NTI33554440, name: "text", sons: null},
+{kind: 1, offset: "x", len: 0, typ: NTI33554456, name: "x", sons: null},
+{kind: 1, offset: "y", len: 0, typ: NTI33554456, name: "y", sons: null}]};
+NTI620757128.node = NNI620757128;
+NTI620757128.base = NTI620757116;
+NTI620757018.base = NTI620757128;
+NTI620757110.base = NTI620757018;
+NTI620757111.base = NTI620757020;
+var NNI620757132 = {kind: 2, len: 8, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "border", len: 0, typ: NTI33554456, name: "border", sons: null},
+{kind: 1, offset: "complete", len: 0, typ: NTI33554466, name: "complete", sons: null},
+{kind: 1, offset: "height", len: 0, typ: NTI33554456, name: "height", sons: null},
+{kind: 1, offset: "hspace", len: 0, typ: NTI33554456, name: "hspace", sons: null},
+{kind: 1, offset: "lowsrc", len: 0, typ: NTI33554440, name: "lowsrc", sons: null},
+{kind: 1, offset: "src", len: 0, typ: NTI33554440, name: "src", sons: null},
+{kind: 1, offset: "vspace", len: 0, typ: NTI33554456, name: "vspace", sons: null},
+{kind: 1, offset: "width", len: 0, typ: NTI33554456, name: "width", sons: null}]};
+NTI620757132.node = NNI620757132;
+NTI620757132.base = NTI620757116;
+NTI620757021.base = NTI620757132;
+NTI620757112.base = NTI620757021;
+NTI620757113.base = NTI620757010;
+var NNI620757127 = {kind: 2, len: 6, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "height", len: 0, typ: NTI33554456, name: "height", sons: null},
+{kind: 1, offset: "hspace", len: 0, typ: NTI33554456, name: "hspace", sons: null},
+{kind: 1, offset: "src", len: 0, typ: NTI33554440, name: "src", sons: null},
+{kind: 1, offset: "width", len: 0, typ: NTI33554456, name: "width", sons: null},
+{kind: 1, offset: "type", len: 0, typ: NTI33554440, name: "type", sons: null},
+{kind: 1, offset: "vspace", len: 0, typ: NTI33554456, name: "vspace", sons: null}]};
+NTI620757127.node = NNI620757127;
+NTI620757127.base = NTI620757116;
+NTI620757017.base = NTI620757127;
+NTI620757114.base = NTI620757017;
+var NNI620757126 = {kind: 2, len: 4, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "target", len: 0, typ: NTI33554440, name: "target", sons: null},
+{kind: 1, offset: "text", len: 0, typ: NTI33554440, name: "text", sons: null},
+{kind: 1, offset: "x", len: 0, typ: NTI33554456, name: "x", sons: null},
+{kind: 1, offset: "y", len: 0, typ: NTI33554456, name: "y", sons: null}]};
+NTI620757126.node = NNI620757126;
+NTI620757126.base = NTI620757116;
+NTI620757016.base = NTI620757126;
+NTI620757115.base = NTI620757016;
+var NNI620757176 = {kind: 1, offset: "then", len: 0, typ: NTI620757177, name: "then", sons: null};
+NTI620757176.node = NNI620757176;
+NTI620757057.base = NTI620757176;
+var NNI620757179 = {kind: 2, len: 2, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "ready", len: 0, typ: NTI620757057, name: "ready", sons: null},
+{kind: 1, offset: "onloadingdone", len: 0, typ: NTI620757180, name: "onloadingdone", sons: null}]};
+NTI620757179.node = NNI620757179;
+NTI620757058.base = NTI620757179;
+var NNI620757109 = {kind: 2, len: 23, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "activeElement", len: 0, typ: NTI620757010, name: "activeElement", sons: null},
+{kind: 1, offset: "documentElement", len: 0, typ: NTI620757010, name: "documentElement", sons: null},
+{kind: 1, offset: "alinkColor", len: 0, typ: NTI33554440, name: "alinkColor", sons: null},
+{kind: 1, offset: "bgColor", len: 0, typ: NTI33554440, name: "bgColor", sons: null},
+{kind: 1, offset: "body", len: 0, typ: NTI620757010, name: "body", sons: null},
+{kind: 1, offset: "charset", len: 0, typ: NTI33554440, name: "charset", sons: null},
+{kind: 1, offset: "cookie", len: 0, typ: NTI33554440, name: "cookie", sons: null},
+{kind: 1, offset: "defaultCharset", len: 0, typ: NTI33554440, name: "defaultCharset", sons: null},
+{kind: 1, offset: "fgColor", len: 0, typ: NTI33554440, name: "fgColor", sons: null},
+{kind: 1, offset: "head", len: 0, typ: NTI620757010, name: "head", sons: null},
+{kind: 1, offset: "lastModified", len: 0, typ: NTI33554440, name: "lastModified", sons: null},
+{kind: 1, offset: "linkColor", len: 0, typ: NTI33554440, name: "linkColor", sons: null},
+{kind: 1, offset: "referrer", len: 0, typ: NTI33554440, name: "referrer", sons: null},
+{kind: 1, offset: "title", len: 0, typ: NTI33554440, name: "title", sons: null},
+{kind: 1, offset: "URL", len: 0, typ: NTI33554440, name: "URL", sons: null},
+{kind: 1, offset: "vlinkColor", len: 0, typ: NTI33554440, name: "vlinkColor", sons: null},
+{kind: 1, offset: "anchors", len: 0, typ: NTI620757110, name: "anchors", sons: null},
+{kind: 1, offset: "forms", len: 0, typ: NTI620757111, name: "forms", sons: null},
+{kind: 1, offset: "images", len: 0, typ: NTI620757112, name: "images", sons: null},
+{kind: 1, offset: "applets", len: 0, typ: NTI620757113, name: "applets", sons: null},
+{kind: 1, offset: "embeds", len: 0, typ: NTI620757114, name: "embeds", sons: null},
+{kind: 1, offset: "links", len: 0, typ: NTI620757115, name: "links", sons: null},
+{kind: 1, offset: "fonts", len: 0, typ: NTI620757058, name: "fonts", sons: null}]};
+NTI620757109.node = NNI620757109;
+NTI620757109.base = NTI620757105;
+NTI620757009.base = NTI620757109;
+var NNI620757133 = {kind: 2, len: 368, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "alignContent", len: 0, typ: NTI33554440, name: "alignContent", sons: null},
+{kind: 1, offset: "alignItems", len: 0, typ: NTI33554440, name: "alignItems", sons: null},
+{kind: 1, offset: "alignSelf", len: 0, typ: NTI33554440, name: "alignSelf", sons: null},
+{kind: 1, offset: "all", len: 0, typ: NTI33554440, name: "all", sons: null},
+{kind: 1, offset: "animation", len: 0, typ: NTI33554440, name: "animation", sons: null},
+{kind: 1, offset: "animationDelay", len: 0, typ: NTI33554440, name: "animationDelay", sons: null},
+{kind: 1, offset: "animationDirection", len: 0, typ: NTI33554440, name: "animationDirection", sons: null},
+{kind: 1, offset: "animationDuration", len: 0, typ: NTI33554440, name: "animationDuration", sons: null},
+{kind: 1, offset: "animationFillMode", len: 0, typ: NTI33554440, name: "animationFillMode", sons: null},
+{kind: 1, offset: "animationIterationCount", len: 0, typ: NTI33554440, name: "animationIterationCount", sons: null},
+{kind: 1, offset: "animationName", len: 0, typ: NTI33554440, name: "animationName", sons: null},
+{kind: 1, offset: "animationPlayState", len: 0, typ: NTI33554440, name: "animationPlayState", sons: null},
+{kind: 1, offset: "animationTimingFunction", len: 0, typ: NTI33554440, name: "animationTimingFunction", sons: null},
+{kind: 1, offset: "backdropFilter", len: 0, typ: NTI33554440, name: "backdropFilter", sons: null},
+{kind: 1, offset: "backfaceVisibility", len: 0, typ: NTI33554440, name: "backfaceVisibility", sons: null},
+{kind: 1, offset: "background", len: 0, typ: NTI33554440, name: "background", sons: null},
+{kind: 1, offset: "backgroundAttachment", len: 0, typ: NTI33554440, name: "backgroundAttachment", sons: null},
+{kind: 1, offset: "backgroundBlendMode", len: 0, typ: NTI33554440, name: "backgroundBlendMode", sons: null},
+{kind: 1, offset: "backgroundClip", len: 0, typ: NTI33554440, name: "backgroundClip", sons: null},
+{kind: 1, offset: "backgroundColor", len: 0, typ: NTI33554440, name: "backgroundColor", sons: null},
+{kind: 1, offset: "backgroundImage", len: 0, typ: NTI33554440, name: "backgroundImage", sons: null},
+{kind: 1, offset: "backgroundOrigin", len: 0, typ: NTI33554440, name: "backgroundOrigin", sons: null},
+{kind: 1, offset: "backgroundPosition", len: 0, typ: NTI33554440, name: "backgroundPosition", sons: null},
+{kind: 1, offset: "backgroundRepeat", len: 0, typ: NTI33554440, name: "backgroundRepeat", sons: null},
+{kind: 1, offset: "backgroundSize", len: 0, typ: NTI33554440, name: "backgroundSize", sons: null},
+{kind: 1, offset: "blockSize", len: 0, typ: NTI33554440, name: "blockSize", sons: null},
+{kind: 1, offset: "border", len: 0, typ: NTI33554440, name: "border", sons: null},
+{kind: 1, offset: "borderBlock", len: 0, typ: NTI33554440, name: "borderBlock", sons: null},
+{kind: 1, offset: "borderBlockColor", len: 0, typ: NTI33554440, name: "borderBlockColor", sons: null},
+{kind: 1, offset: "borderBlockEnd", len: 0, typ: NTI33554440, name: "borderBlockEnd", sons: null},
+{kind: 1, offset: "borderBlockEndColor", len: 0, typ: NTI33554440, name: "borderBlockEndColor", sons: null},
+{kind: 1, offset: "borderBlockEndStyle", len: 0, typ: NTI33554440, name: "borderBlockEndStyle", sons: null},
+{kind: 1, offset: "borderBlockEndWidth", len: 0, typ: NTI33554440, name: "borderBlockEndWidth", sons: null},
+{kind: 1, offset: "borderBlockStart", len: 0, typ: NTI33554440, name: "borderBlockStart", sons: null},
+{kind: 1, offset: "borderBlockStartColor", len: 0, typ: NTI33554440, name: "borderBlockStartColor", sons: null},
+{kind: 1, offset: "borderBlockStartStyle", len: 0, typ: NTI33554440, name: "borderBlockStartStyle", sons: null},
+{kind: 1, offset: "borderBlockStartWidth", len: 0, typ: NTI33554440, name: "borderBlockStartWidth", sons: null},
+{kind: 1, offset: "borderBlockStyle", len: 0, typ: NTI33554440, name: "borderBlockStyle", sons: null},
+{kind: 1, offset: "borderBlockWidth", len: 0, typ: NTI33554440, name: "borderBlockWidth", sons: null},
+{kind: 1, offset: "borderBottom", len: 0, typ: NTI33554440, name: "borderBottom", sons: null},
+{kind: 1, offset: "borderBottomColor", len: 0, typ: NTI33554440, name: "borderBottomColor", sons: null},
+{kind: 1, offset: "borderBottomLeftRadius", len: 0, typ: NTI33554440, name: "borderBottomLeftRadius", sons: null},
+{kind: 1, offset: "borderBottomRightRadius", len: 0, typ: NTI33554440, name: "borderBottomRightRadius", sons: null},
+{kind: 1, offset: "borderBottomStyle", len: 0, typ: NTI33554440, name: "borderBottomStyle", sons: null},
+{kind: 1, offset: "borderBottomWidth", len: 0, typ: NTI33554440, name: "borderBottomWidth", sons: null},
+{kind: 1, offset: "borderCollapse", len: 0, typ: NTI33554440, name: "borderCollapse", sons: null},
+{kind: 1, offset: "borderColor", len: 0, typ: NTI33554440, name: "borderColor", sons: null},
+{kind: 1, offset: "borderEndEndRadius", len: 0, typ: NTI33554440, name: "borderEndEndRadius", sons: null},
+{kind: 1, offset: "borderEndStartRadius", len: 0, typ: NTI33554440, name: "borderEndStartRadius", sons: null},
+{kind: 1, offset: "borderImage", len: 0, typ: NTI33554440, name: "borderImage", sons: null},
+{kind: 1, offset: "borderImageOutset", len: 0, typ: NTI33554440, name: "borderImageOutset", sons: null},
+{kind: 1, offset: "borderImageRepeat", len: 0, typ: NTI33554440, name: "borderImageRepeat", sons: null},
+{kind: 1, offset: "borderImageSlice", len: 0, typ: NTI33554440, name: "borderImageSlice", sons: null},
+{kind: 1, offset: "borderImageSource", len: 0, typ: NTI33554440, name: "borderImageSource", sons: null},
+{kind: 1, offset: "borderImageWidth", len: 0, typ: NTI33554440, name: "borderImageWidth", sons: null},
+{kind: 1, offset: "borderInline", len: 0, typ: NTI33554440, name: "borderInline", sons: null},
+{kind: 1, offset: "borderInlineColor", len: 0, typ: NTI33554440, name: "borderInlineColor", sons: null},
+{kind: 1, offset: "borderInlineEnd", len: 0, typ: NTI33554440, name: "borderInlineEnd", sons: null},
+{kind: 1, offset: "borderInlineEndColor", len: 0, typ: NTI33554440, name: "borderInlineEndColor", sons: null},
+{kind: 1, offset: "borderInlineEndStyle", len: 0, typ: NTI33554440, name: "borderInlineEndStyle", sons: null},
+{kind: 1, offset: "borderInlineEndWidth", len: 0, typ: NTI33554440, name: "borderInlineEndWidth", sons: null},
+{kind: 1, offset: "borderInlineStart", len: 0, typ: NTI33554440, name: "borderInlineStart", sons: null},
+{kind: 1, offset: "borderInlineStartColor", len: 0, typ: NTI33554440, name: "borderInlineStartColor", sons: null},
+{kind: 1, offset: "borderInlineStartStyle", len: 0, typ: NTI33554440, name: "borderInlineStartStyle", sons: null},
+{kind: 1, offset: "borderInlineStartWidth", len: 0, typ: NTI33554440, name: "borderInlineStartWidth", sons: null},
+{kind: 1, offset: "borderInlineStyle", len: 0, typ: NTI33554440, name: "borderInlineStyle", sons: null},
+{kind: 1, offset: "borderInlineWidth", len: 0, typ: NTI33554440, name: "borderInlineWidth", sons: null},
+{kind: 1, offset: "borderLeft", len: 0, typ: NTI33554440, name: "borderLeft", sons: null},
+{kind: 1, offset: "borderLeftColor", len: 0, typ: NTI33554440, name: "borderLeftColor", sons: null},
+{kind: 1, offset: "borderLeftStyle", len: 0, typ: NTI33554440, name: "borderLeftStyle", sons: null},
+{kind: 1, offset: "borderLeftWidth", len: 0, typ: NTI33554440, name: "borderLeftWidth", sons: null},
+{kind: 1, offset: "borderRadius", len: 0, typ: NTI33554440, name: "borderRadius", sons: null},
+{kind: 1, offset: "borderRight", len: 0, typ: NTI33554440, name: "borderRight", sons: null},
+{kind: 1, offset: "borderRightColor", len: 0, typ: NTI33554440, name: "borderRightColor", sons: null},
+{kind: 1, offset: "borderRightStyle", len: 0, typ: NTI33554440, name: "borderRightStyle", sons: null},
+{kind: 1, offset: "borderRightWidth", len: 0, typ: NTI33554440, name: "borderRightWidth", sons: null},
+{kind: 1, offset: "borderSpacing", len: 0, typ: NTI33554440, name: "borderSpacing", sons: null},
+{kind: 1, offset: "borderStartEndRadius", len: 0, typ: NTI33554440, name: "borderStartEndRadius", sons: null},
+{kind: 1, offset: "borderStartStartRadius", len: 0, typ: NTI33554440, name: "borderStartStartRadius", sons: null},
+{kind: 1, offset: "borderStyle", len: 0, typ: NTI33554440, name: "borderStyle", sons: null},
+{kind: 1, offset: "borderTop", len: 0, typ: NTI33554440, name: "borderTop", sons: null},
+{kind: 1, offset: "borderTopColor", len: 0, typ: NTI33554440, name: "borderTopColor", sons: null},
+{kind: 1, offset: "borderTopLeftRadius", len: 0, typ: NTI33554440, name: "borderTopLeftRadius", sons: null},
+{kind: 1, offset: "borderTopRightRadius", len: 0, typ: NTI33554440, name: "borderTopRightRadius", sons: null},
+{kind: 1, offset: "borderTopStyle", len: 0, typ: NTI33554440, name: "borderTopStyle", sons: null},
+{kind: 1, offset: "borderTopWidth", len: 0, typ: NTI33554440, name: "borderTopWidth", sons: null},
+{kind: 1, offset: "borderWidth", len: 0, typ: NTI33554440, name: "borderWidth", sons: null},
+{kind: 1, offset: "bottom", len: 0, typ: NTI33554440, name: "bottom", sons: null},
+{kind: 1, offset: "boxDecorationBreak", len: 0, typ: NTI33554440, name: "boxDecorationBreak", sons: null},
+{kind: 1, offset: "boxShadow", len: 0, typ: NTI33554440, name: "boxShadow", sons: null},
+{kind: 1, offset: "boxSizing", len: 0, typ: NTI33554440, name: "boxSizing", sons: null},
+{kind: 1, offset: "breakAfter", len: 0, typ: NTI33554440, name: "breakAfter", sons: null},
+{kind: 1, offset: "breakBefore", len: 0, typ: NTI33554440, name: "breakBefore", sons: null},
+{kind: 1, offset: "breakInside", len: 0, typ: NTI33554440, name: "breakInside", sons: null},
+{kind: 1, offset: "captionSide", len: 0, typ: NTI33554440, name: "captionSide", sons: null},
+{kind: 1, offset: "caretColor", len: 0, typ: NTI33554440, name: "caretColor", sons: null},
+{kind: 1, offset: "clear", len: 0, typ: NTI33554440, name: "clear", sons: null},
+{kind: 1, offset: "clip", len: 0, typ: NTI33554440, name: "clip", sons: null},
+{kind: 1, offset: "clipPath", len: 0, typ: NTI33554440, name: "clipPath", sons: null},
+{kind: 1, offset: "color", len: 0, typ: NTI33554440, name: "color", sons: null},
+{kind: 1, offset: "colorAdjust", len: 0, typ: NTI33554440, name: "colorAdjust", sons: null},
+{kind: 1, offset: "columnCount", len: 0, typ: NTI33554440, name: "columnCount", sons: null},
+{kind: 1, offset: "columnFill", len: 0, typ: NTI33554440, name: "columnFill", sons: null},
+{kind: 1, offset: "columnGap", len: 0, typ: NTI33554440, name: "columnGap", sons: null},
+{kind: 1, offset: "columnRule", len: 0, typ: NTI33554440, name: "columnRule", sons: null},
+{kind: 1, offset: "columnRuleColor", len: 0, typ: NTI33554440, name: "columnRuleColor", sons: null},
+{kind: 1, offset: "columnRuleStyle", len: 0, typ: NTI33554440, name: "columnRuleStyle", sons: null},
+{kind: 1, offset: "columnRuleWidth", len: 0, typ: NTI33554440, name: "columnRuleWidth", sons: null},
+{kind: 1, offset: "columnSpan", len: 0, typ: NTI33554440, name: "columnSpan", sons: null},
+{kind: 1, offset: "columnWidth", len: 0, typ: NTI33554440, name: "columnWidth", sons: null},
+{kind: 1, offset: "columns", len: 0, typ: NTI33554440, name: "columns", sons: null},
+{kind: 1, offset: "contain", len: 0, typ: NTI33554440, name: "contain", sons: null},
+{kind: 1, offset: "content", len: 0, typ: NTI33554440, name: "content", sons: null},
+{kind: 1, offset: "counterIncrement", len: 0, typ: NTI33554440, name: "counterIncrement", sons: null},
+{kind: 1, offset: "counterReset", len: 0, typ: NTI33554440, name: "counterReset", sons: null},
+{kind: 1, offset: "counterSet", len: 0, typ: NTI33554440, name: "counterSet", sons: null},
+{kind: 1, offset: "cursor", len: 0, typ: NTI33554440, name: "cursor", sons: null},
+{kind: 1, offset: "direction", len: 0, typ: NTI33554440, name: "direction", sons: null},
+{kind: 1, offset: "display", len: 0, typ: NTI33554440, name: "display", sons: null},
+{kind: 1, offset: "emptyCells", len: 0, typ: NTI33554440, name: "emptyCells", sons: null},
+{kind: 1, offset: "filter", len: 0, typ: NTI33554440, name: "filter", sons: null},
+{kind: 1, offset: "flex", len: 0, typ: NTI33554440, name: "flex", sons: null},
+{kind: 1, offset: "flexBasis", len: 0, typ: NTI33554440, name: "flexBasis", sons: null},
+{kind: 1, offset: "flexDirection", len: 0, typ: NTI33554440, name: "flexDirection", sons: null},
+{kind: 1, offset: "flexFlow", len: 0, typ: NTI33554440, name: "flexFlow", sons: null},
+{kind: 1, offset: "flexGrow", len: 0, typ: NTI33554440, name: "flexGrow", sons: null},
+{kind: 1, offset: "flexShrink", len: 0, typ: NTI33554440, name: "flexShrink", sons: null},
+{kind: 1, offset: "flexWrap", len: 0, typ: NTI33554440, name: "flexWrap", sons: null},
+{kind: 1, offset: "cssFloat", len: 0, typ: NTI33554440, name: "cssFloat", sons: null},
+{kind: 1, offset: "font", len: 0, typ: NTI33554440, name: "font", sons: null},
+{kind: 1, offset: "fontFamily", len: 0, typ: NTI33554440, name: "fontFamily", sons: null},
+{kind: 1, offset: "fontFeatureSettings", len: 0, typ: NTI33554440, name: "fontFeatureSettings", sons: null},
+{kind: 1, offset: "fontKerning", len: 0, typ: NTI33554440, name: "fontKerning", sons: null},
+{kind: 1, offset: "fontLanguageOverride", len: 0, typ: NTI33554440, name: "fontLanguageOverride", sons: null},
+{kind: 1, offset: "fontOpticalSizing", len: 0, typ: NTI33554440, name: "fontOpticalSizing", sons: null},
+{kind: 1, offset: "fontSize", len: 0, typ: NTI33554440, name: "fontSize", sons: null},
+{kind: 1, offset: "fontSizeAdjust", len: 0, typ: NTI33554440, name: "fontSizeAdjust", sons: null},
+{kind: 1, offset: "fontStretch", len: 0, typ: NTI33554440, name: "fontStretch", sons: null},
+{kind: 1, offset: "fontStyle", len: 0, typ: NTI33554440, name: "fontStyle", sons: null},
+{kind: 1, offset: "fontSynthesis", len: 0, typ: NTI33554440, name: "fontSynthesis", sons: null},
+{kind: 1, offset: "fontVariant", len: 0, typ: NTI33554440, name: "fontVariant", sons: null},
+{kind: 1, offset: "fontVariantAlternates", len: 0, typ: NTI33554440, name: "fontVariantAlternates", sons: null},
+{kind: 1, offset: "fontVariantCaps", len: 0, typ: NTI33554440, name: "fontVariantCaps", sons: null},
+{kind: 1, offset: "fontVariantEastAsian", len: 0, typ: NTI33554440, name: "fontVariantEastAsian", sons: null},
+{kind: 1, offset: "fontVariantLigatures", len: 0, typ: NTI33554440, name: "fontVariantLigatures", sons: null},
+{kind: 1, offset: "fontVariantNumeric", len: 0, typ: NTI33554440, name: "fontVariantNumeric", sons: null},
+{kind: 1, offset: "fontVariantPosition", len: 0, typ: NTI33554440, name: "fontVariantPosition", sons: null},
+{kind: 1, offset: "fontVariationSettings", len: 0, typ: NTI33554440, name: "fontVariationSettings", sons: null},
+{kind: 1, offset: "fontWeight", len: 0, typ: NTI33554440, name: "fontWeight", sons: null},
+{kind: 1, offset: "gap", len: 0, typ: NTI33554440, name: "gap", sons: null},
+{kind: 1, offset: "grid", len: 0, typ: NTI33554440, name: "grid", sons: null},
+{kind: 1, offset: "gridArea", len: 0, typ: NTI33554440, name: "gridArea", sons: null},
+{kind: 1, offset: "gridAutoColumns", len: 0, typ: NTI33554440, name: "gridAutoColumns", sons: null},
+{kind: 1, offset: "gridAutoFlow", len: 0, typ: NTI33554440, name: "gridAutoFlow", sons: null},
+{kind: 1, offset: "gridAutoRows", len: 0, typ: NTI33554440, name: "gridAutoRows", sons: null},
+{kind: 1, offset: "gridColumn", len: 0, typ: NTI33554440, name: "gridColumn", sons: null},
+{kind: 1, offset: "gridColumnEnd", len: 0, typ: NTI33554440, name: "gridColumnEnd", sons: null},
+{kind: 1, offset: "gridColumnStart", len: 0, typ: NTI33554440, name: "gridColumnStart", sons: null},
+{kind: 1, offset: "gridRow", len: 0, typ: NTI33554440, name: "gridRow", sons: null},
+{kind: 1, offset: "gridRowEnd", len: 0, typ: NTI33554440, name: "gridRowEnd", sons: null},
+{kind: 1, offset: "gridRowStart", len: 0, typ: NTI33554440, name: "gridRowStart", sons: null},
+{kind: 1, offset: "gridTemplate", len: 0, typ: NTI33554440, name: "gridTemplate", sons: null},
+{kind: 1, offset: "gridTemplateAreas", len: 0, typ: NTI33554440, name: "gridTemplateAreas", sons: null},
+{kind: 1, offset: "gridTemplateColumns", len: 0, typ: NTI33554440, name: "gridTemplateColumns", sons: null},
+{kind: 1, offset: "gridTemplateRows", len: 0, typ: NTI33554440, name: "gridTemplateRows", sons: null},
+{kind: 1, offset: "hangingPunctuation", len: 0, typ: NTI33554440, name: "hangingPunctuation", sons: null},
+{kind: 1, offset: "height", len: 0, typ: NTI33554440, name: "height", sons: null},
+{kind: 1, offset: "hyphens", len: 0, typ: NTI33554440, name: "hyphens", sons: null},
+{kind: 1, offset: "imageOrientation", len: 0, typ: NTI33554440, name: "imageOrientation", sons: null},
+{kind: 1, offset: "imageRendering", len: 0, typ: NTI33554440, name: "imageRendering", sons: null},
+{kind: 1, offset: "inlineSize", len: 0, typ: NTI33554440, name: "inlineSize", sons: null},
+{kind: 1, offset: "inset", len: 0, typ: NTI33554440, name: "inset", sons: null},
+{kind: 1, offset: "insetBlock", len: 0, typ: NTI33554440, name: "insetBlock", sons: null},
+{kind: 1, offset: "insetBlockEnd", len: 0, typ: NTI33554440, name: "insetBlockEnd", sons: null},
+{kind: 1, offset: "insetBlockStart", len: 0, typ: NTI33554440, name: "insetBlockStart", sons: null},
+{kind: 1, offset: "insetInline", len: 0, typ: NTI33554440, name: "insetInline", sons: null},
+{kind: 1, offset: "insetInlineEnd", len: 0, typ: NTI33554440, name: "insetInlineEnd", sons: null},
+{kind: 1, offset: "insetInlineStart", len: 0, typ: NTI33554440, name: "insetInlineStart", sons: null},
+{kind: 1, offset: "isolation", len: 0, typ: NTI33554440, name: "isolation", sons: null},
+{kind: 1, offset: "justifyContent", len: 0, typ: NTI33554440, name: "justifyContent", sons: null},
+{kind: 1, offset: "justifyItems", len: 0, typ: NTI33554440, name: "justifyItems", sons: null},
+{kind: 1, offset: "justifySelf", len: 0, typ: NTI33554440, name: "justifySelf", sons: null},
+{kind: 1, offset: "left", len: 0, typ: NTI33554440, name: "left", sons: null},
+{kind: 1, offset: "letterSpacing", len: 0, typ: NTI33554440, name: "letterSpacing", sons: null},
+{kind: 1, offset: "lineBreak", len: 0, typ: NTI33554440, name: "lineBreak", sons: null},
+{kind: 1, offset: "lineHeight", len: 0, typ: NTI33554440, name: "lineHeight", sons: null},
+{kind: 1, offset: "listStyle", len: 0, typ: NTI33554440, name: "listStyle", sons: null},
+{kind: 1, offset: "listStyleImage", len: 0, typ: NTI33554440, name: "listStyleImage", sons: null},
+{kind: 1, offset: "listStylePosition", len: 0, typ: NTI33554440, name: "listStylePosition", sons: null},
+{kind: 1, offset: "listStyleType", len: 0, typ: NTI33554440, name: "listStyleType", sons: null},
+{kind: 1, offset: "margin", len: 0, typ: NTI33554440, name: "margin", sons: null},
+{kind: 1, offset: "marginBlock", len: 0, typ: NTI33554440, name: "marginBlock", sons: null},
+{kind: 1, offset: "marginBlockEnd", len: 0, typ: NTI33554440, name: "marginBlockEnd", sons: null},
+{kind: 1, offset: "marginBlockStart", len: 0, typ: NTI33554440, name: "marginBlockStart", sons: null},
+{kind: 1, offset: "marginBottom", len: 0, typ: NTI33554440, name: "marginBottom", sons: null},
+{kind: 1, offset: "marginInline", len: 0, typ: NTI33554440, name: "marginInline", sons: null},
+{kind: 1, offset: "marginInlineEnd", len: 0, typ: NTI33554440, name: "marginInlineEnd", sons: null},
+{kind: 1, offset: "marginInlineStart", len: 0, typ: NTI33554440, name: "marginInlineStart", sons: null},
+{kind: 1, offset: "marginLeft", len: 0, typ: NTI33554440, name: "marginLeft", sons: null},
+{kind: 1, offset: "marginRight", len: 0, typ: NTI33554440, name: "marginRight", sons: null},
+{kind: 1, offset: "marginTop", len: 0, typ: NTI33554440, name: "marginTop", sons: null},
+{kind: 1, offset: "mask", len: 0, typ: NTI33554440, name: "mask", sons: null},
+{kind: 1, offset: "maskBorder", len: 0, typ: NTI33554440, name: "maskBorder", sons: null},
+{kind: 1, offset: "maskBorderMode", len: 0, typ: NTI33554440, name: "maskBorderMode", sons: null},
+{kind: 1, offset: "maskBorderOutset", len: 0, typ: NTI33554440, name: "maskBorderOutset", sons: null},
+{kind: 1, offset: "maskBorderRepeat", len: 0, typ: NTI33554440, name: "maskBorderRepeat", sons: null},
+{kind: 1, offset: "maskBorderSlice", len: 0, typ: NTI33554440, name: "maskBorderSlice", sons: null},
+{kind: 1, offset: "maskBorderSource", len: 0, typ: NTI33554440, name: "maskBorderSource", sons: null},
+{kind: 1, offset: "maskBorderWidth", len: 0, typ: NTI33554440, name: "maskBorderWidth", sons: null},
+{kind: 1, offset: "maskClip", len: 0, typ: NTI33554440, name: "maskClip", sons: null},
+{kind: 1, offset: "maskComposite", len: 0, typ: NTI33554440, name: "maskComposite", sons: null},
+{kind: 1, offset: "maskImage", len: 0, typ: NTI33554440, name: "maskImage", sons: null},
+{kind: 1, offset: "maskMode", len: 0, typ: NTI33554440, name: "maskMode", sons: null},
+{kind: 1, offset: "maskOrigin", len: 0, typ: NTI33554440, name: "maskOrigin", sons: null},
+{kind: 1, offset: "maskPosition", len: 0, typ: NTI33554440, name: "maskPosition", sons: null},
+{kind: 1, offset: "maskRepeat", len: 0, typ: NTI33554440, name: "maskRepeat", sons: null},
+{kind: 1, offset: "maskSize", len: 0, typ: NTI33554440, name: "maskSize", sons: null},
+{kind: 1, offset: "maskType", len: 0, typ: NTI33554440, name: "maskType", sons: null},
+{kind: 1, offset: "maxBlockSize", len: 0, typ: NTI33554440, name: "maxBlockSize", sons: null},
+{kind: 1, offset: "maxHeight", len: 0, typ: NTI33554440, name: "maxHeight", sons: null},
+{kind: 1, offset: "maxInlineSize", len: 0, typ: NTI33554440, name: "maxInlineSize", sons: null},
+{kind: 1, offset: "maxWidth", len: 0, typ: NTI33554440, name: "maxWidth", sons: null},
+{kind: 1, offset: "minBlockSize", len: 0, typ: NTI33554440, name: "minBlockSize", sons: null},
+{kind: 1, offset: "minHeight", len: 0, typ: NTI33554440, name: "minHeight", sons: null},
+{kind: 1, offset: "minInlineSize", len: 0, typ: NTI33554440, name: "minInlineSize", sons: null},
+{kind: 1, offset: "minWidth", len: 0, typ: NTI33554440, name: "minWidth", sons: null},
+{kind: 1, offset: "mixBlendMode", len: 0, typ: NTI33554440, name: "mixBlendMode", sons: null},
+{kind: 1, offset: "objectFit", len: 0, typ: NTI33554440, name: "objectFit", sons: null},
+{kind: 1, offset: "objectPosition", len: 0, typ: NTI33554440, name: "objectPosition", sons: null},
+{kind: 1, offset: "offset", len: 0, typ: NTI33554440, name: "offset", sons: null},
+{kind: 1, offset: "offsetAnchor", len: 0, typ: NTI33554440, name: "offsetAnchor", sons: null},
+{kind: 1, offset: "offsetDistance", len: 0, typ: NTI33554440, name: "offsetDistance", sons: null},
+{kind: 1, offset: "offsetPath", len: 0, typ: NTI33554440, name: "offsetPath", sons: null},
+{kind: 1, offset: "offsetRotate", len: 0, typ: NTI33554440, name: "offsetRotate", sons: null},
+{kind: 1, offset: "opacity", len: 0, typ: NTI33554440, name: "opacity", sons: null},
+{kind: 1, offset: "order", len: 0, typ: NTI33554440, name: "order", sons: null},
+{kind: 1, offset: "orphans", len: 0, typ: NTI33554440, name: "orphans", sons: null},
+{kind: 1, offset: "outline", len: 0, typ: NTI33554440, name: "outline", sons: null},
+{kind: 1, offset: "outlineColor", len: 0, typ: NTI33554440, name: "outlineColor", sons: null},
+{kind: 1, offset: "outlineOffset", len: 0, typ: NTI33554440, name: "outlineOffset", sons: null},
+{kind: 1, offset: "outlineStyle", len: 0, typ: NTI33554440, name: "outlineStyle", sons: null},
+{kind: 1, offset: "outlineWidth", len: 0, typ: NTI33554440, name: "outlineWidth", sons: null},
+{kind: 1, offset: "overflow", len: 0, typ: NTI33554440, name: "overflow", sons: null},
+{kind: 1, offset: "overflowAnchor", len: 0, typ: NTI33554440, name: "overflowAnchor", sons: null},
+{kind: 1, offset: "overflowBlock", len: 0, typ: NTI33554440, name: "overflowBlock", sons: null},
+{kind: 1, offset: "overflowInline", len: 0, typ: NTI33554440, name: "overflowInline", sons: null},
+{kind: 1, offset: "overflowWrap", len: 0, typ: NTI33554440, name: "overflowWrap", sons: null},
+{kind: 1, offset: "overflowX", len: 0, typ: NTI33554440, name: "overflowX", sons: null},
+{kind: 1, offset: "overflowY", len: 0, typ: NTI33554440, name: "overflowY", sons: null},
+{kind: 1, offset: "overscrollBehavior", len: 0, typ: NTI33554440, name: "overscrollBehavior", sons: null},
+{kind: 1, offset: "overscrollBehaviorBlock", len: 0, typ: NTI33554440, name: "overscrollBehaviorBlock", sons: null},
+{kind: 1, offset: "overscrollBehaviorInline", len: 0, typ: NTI33554440, name: "overscrollBehaviorInline", sons: null},
+{kind: 1, offset: "overscrollBehaviorX", len: 0, typ: NTI33554440, name: "overscrollBehaviorX", sons: null},
+{kind: 1, offset: "overscrollBehaviorY", len: 0, typ: NTI33554440, name: "overscrollBehaviorY", sons: null},
+{kind: 1, offset: "padding", len: 0, typ: NTI33554440, name: "padding", sons: null},
+{kind: 1, offset: "paddingBlock", len: 0, typ: NTI33554440, name: "paddingBlock", sons: null},
+{kind: 1, offset: "paddingBlockEnd", len: 0, typ: NTI33554440, name: "paddingBlockEnd", sons: null},
+{kind: 1, offset: "paddingBlockStart", len: 0, typ: NTI33554440, name: "paddingBlockStart", sons: null},
+{kind: 1, offset: "paddingBottom", len: 0, typ: NTI33554440, name: "paddingBottom", sons: null},
+{kind: 1, offset: "paddingInline", len: 0, typ: NTI33554440, name: "paddingInline", sons: null},
+{kind: 1, offset: "paddingInlineEnd", len: 0, typ: NTI33554440, name: "paddingInlineEnd", sons: null},
+{kind: 1, offset: "paddingInlineStart", len: 0, typ: NTI33554440, name: "paddingInlineStart", sons: null},
+{kind: 1, offset: "paddingLeft", len: 0, typ: NTI33554440, name: "paddingLeft", sons: null},
+{kind: 1, offset: "paddingRight", len: 0, typ: NTI33554440, name: "paddingRight", sons: null},
+{kind: 1, offset: "paddingTop", len: 0, typ: NTI33554440, name: "paddingTop", sons: null},
+{kind: 1, offset: "pageBreakAfter", len: 0, typ: NTI33554440, name: "pageBreakAfter", sons: null},
+{kind: 1, offset: "pageBreakBefore", len: 0, typ: NTI33554440, name: "pageBreakBefore", sons: null},
+{kind: 1, offset: "pageBreakInside", len: 0, typ: NTI33554440, name: "pageBreakInside", sons: null},
+{kind: 1, offset: "paintOrder", len: 0, typ: NTI33554440, name: "paintOrder", sons: null},
+{kind: 1, offset: "perspective", len: 0, typ: NTI33554440, name: "perspective", sons: null},
+{kind: 1, offset: "perspectiveOrigin", len: 0, typ: NTI33554440, name: "perspectiveOrigin", sons: null},
+{kind: 1, offset: "placeContent", len: 0, typ: NTI33554440, name: "placeContent", sons: null},
+{kind: 1, offset: "placeItems", len: 0, typ: NTI33554440, name: "placeItems", sons: null},
+{kind: 1, offset: "placeSelf", len: 0, typ: NTI33554440, name: "placeSelf", sons: null},
+{kind: 1, offset: "pointerEvents", len: 0, typ: NTI33554440, name: "pointerEvents", sons: null},
+{kind: 1, offset: "position", len: 0, typ: NTI33554440, name: "position", sons: null},
+{kind: 1, offset: "quotes", len: 0, typ: NTI33554440, name: "quotes", sons: null},
+{kind: 1, offset: "resize", len: 0, typ: NTI33554440, name: "resize", sons: null},
+{kind: 1, offset: "right", len: 0, typ: NTI33554440, name: "right", sons: null},
+{kind: 1, offset: "rotate", len: 0, typ: NTI33554440, name: "rotate", sons: null},
+{kind: 1, offset: "rowGap", len: 0, typ: NTI33554440, name: "rowGap", sons: null},
+{kind: 1, offset: "scale", len: 0, typ: NTI33554440, name: "scale", sons: null},
+{kind: 1, offset: "scrollBehavior", len: 0, typ: NTI33554440, name: "scrollBehavior", sons: null},
+{kind: 1, offset: "scrollMargin", len: 0, typ: NTI33554440, name: "scrollMargin", sons: null},
+{kind: 1, offset: "scrollMarginBlock", len: 0, typ: NTI33554440, name: "scrollMarginBlock", sons: null},
+{kind: 1, offset: "scrollMarginBlockEnd", len: 0, typ: NTI33554440, name: "scrollMarginBlockEnd", sons: null},
+{kind: 1, offset: "scrollMarginBlockStart", len: 0, typ: NTI33554440, name: "scrollMarginBlockStart", sons: null},
+{kind: 1, offset: "scrollMarginBottom", len: 0, typ: NTI33554440, name: "scrollMarginBottom", sons: null},
+{kind: 1, offset: "scrollMarginInline", len: 0, typ: NTI33554440, name: "scrollMarginInline", sons: null},
+{kind: 1, offset: "scrollMarginInlineEnd", len: 0, typ: NTI33554440, name: "scrollMarginInlineEnd", sons: null},
+{kind: 1, offset: "scrollMarginInlineStart", len: 0, typ: NTI33554440, name: "scrollMarginInlineStart", sons: null},
+{kind: 1, offset: "scrollMarginLeft", len: 0, typ: NTI33554440, name: "scrollMarginLeft", sons: null},
+{kind: 1, offset: "scrollMarginRight", len: 0, typ: NTI33554440, name: "scrollMarginRight", sons: null},
+{kind: 1, offset: "scrollMarginTop", len: 0, typ: NTI33554440, name: "scrollMarginTop", sons: null},
+{kind: 1, offset: "scrollPadding", len: 0, typ: NTI33554440, name: "scrollPadding", sons: null},
+{kind: 1, offset: "scrollPaddingBlock", len: 0, typ: NTI33554440, name: "scrollPaddingBlock", sons: null},
+{kind: 1, offset: "scrollPaddingBlockEnd", len: 0, typ: NTI33554440, name: "scrollPaddingBlockEnd", sons: null},
+{kind: 1, offset: "scrollPaddingBlockStart", len: 0, typ: NTI33554440, name: "scrollPaddingBlockStart", sons: null},
+{kind: 1, offset: "scrollPaddingBottom", len: 0, typ: NTI33554440, name: "scrollPaddingBottom", sons: null},
+{kind: 1, offset: "scrollPaddingInline", len: 0, typ: NTI33554440, name: "scrollPaddingInline", sons: null},
+{kind: 1, offset: "scrollPaddingInlineEnd", len: 0, typ: NTI33554440, name: "scrollPaddingInlineEnd", sons: null},
+{kind: 1, offset: "scrollPaddingInlineStart", len: 0, typ: NTI33554440, name: "scrollPaddingInlineStart", sons: null},
+{kind: 1, offset: "scrollPaddingLeft", len: 0, typ: NTI33554440, name: "scrollPaddingLeft", sons: null},
+{kind: 1, offset: "scrollPaddingRight", len: 0, typ: NTI33554440, name: "scrollPaddingRight", sons: null},
+{kind: 1, offset: "scrollPaddingTop", len: 0, typ: NTI33554440, name: "scrollPaddingTop", sons: null},
+{kind: 1, offset: "scrollSnapAlign", len: 0, typ: NTI33554440, name: "scrollSnapAlign", sons: null},
+{kind: 1, offset: "scrollSnapStop", len: 0, typ: NTI33554440, name: "scrollSnapStop", sons: null},
+{kind: 1, offset: "scrollSnapType", len: 0, typ: NTI33554440, name: "scrollSnapType", sons: null},
+{kind: 1, offset: "scrollbar3dLightColor", len: 0, typ: NTI33554440, name: "scrollbar3dLightColor", sons: null},
+{kind: 1, offset: "scrollbarArrowColor", len: 0, typ: NTI33554440, name: "scrollbarArrowColor", sons: null},
+{kind: 1, offset: "scrollbarBaseColor", len: 0, typ: NTI33554440, name: "scrollbarBaseColor", sons: null},
+{kind: 1, offset: "scrollbarColor", len: 0, typ: NTI33554440, name: "scrollbarColor", sons: null},
+{kind: 1, offset: "scrollbarDarkshadowColor", len: 0, typ: NTI33554440, name: "scrollbarDarkshadowColor", sons: null},
+{kind: 1, offset: "scrollbarFaceColor", len: 0, typ: NTI33554440, name: "scrollbarFaceColor", sons: null},
+{kind: 1, offset: "scrollbarHighlightColor", len: 0, typ: NTI33554440, name: "scrollbarHighlightColor", sons: null},
+{kind: 1, offset: "scrollbarShadowColor", len: 0, typ: NTI33554440, name: "scrollbarShadowColor", sons: null},
+{kind: 1, offset: "scrollbarTrackColor", len: 0, typ: NTI33554440, name: "scrollbarTrackColor", sons: null},
+{kind: 1, offset: "scrollbarWidth", len: 0, typ: NTI33554440, name: "scrollbarWidth", sons: null},
+{kind: 1, offset: "shapeImageThreshold", len: 0, typ: NTI33554440, name: "shapeImageThreshold", sons: null},
+{kind: 1, offset: "shapeMargin", len: 0, typ: NTI33554440, name: "shapeMargin", sons: null},
+{kind: 1, offset: "shapeOutside", len: 0, typ: NTI33554440, name: "shapeOutside", sons: null},
+{kind: 1, offset: "tabSize", len: 0, typ: NTI33554440, name: "tabSize", sons: null},
+{kind: 1, offset: "tableLayout", len: 0, typ: NTI33554440, name: "tableLayout", sons: null},
+{kind: 1, offset: "textAlign", len: 0, typ: NTI33554440, name: "textAlign", sons: null},
+{kind: 1, offset: "textAlignLast", len: 0, typ: NTI33554440, name: "textAlignLast", sons: null},
+{kind: 1, offset: "textCombineUpright", len: 0, typ: NTI33554440, name: "textCombineUpright", sons: null},
+{kind: 1, offset: "textDecoration", len: 0, typ: NTI33554440, name: "textDecoration", sons: null},
+{kind: 1, offset: "textDecorationColor", len: 0, typ: NTI33554440, name: "textDecorationColor", sons: null},
+{kind: 1, offset: "textDecorationLine", len: 0, typ: NTI33554440, name: "textDecorationLine", sons: null},
+{kind: 1, offset: "textDecorationSkipInk", len: 0, typ: NTI33554440, name: "textDecorationSkipInk", sons: null},
+{kind: 1, offset: "textDecorationStyle", len: 0, typ: NTI33554440, name: "textDecorationStyle", sons: null},
+{kind: 1, offset: "textDecorationThickness", len: 0, typ: NTI33554440, name: "textDecorationThickness", sons: null},
+{kind: 1, offset: "textEmphasis", len: 0, typ: NTI33554440, name: "textEmphasis", sons: null},
+{kind: 1, offset: "textEmphasisColor", len: 0, typ: NTI33554440, name: "textEmphasisColor", sons: null},
+{kind: 1, offset: "textEmphasisPosition", len: 0, typ: NTI33554440, name: "textEmphasisPosition", sons: null},
+{kind: 1, offset: "textEmphasisStyle", len: 0, typ: NTI33554440, name: "textEmphasisStyle", sons: null},
+{kind: 1, offset: "textIndent", len: 0, typ: NTI33554440, name: "textIndent", sons: null},
+{kind: 1, offset: "textJustify", len: 0, typ: NTI33554440, name: "textJustify", sons: null},
+{kind: 1, offset: "textOrientation", len: 0, typ: NTI33554440, name: "textOrientation", sons: null},
+{kind: 1, offset: "textOverflow", len: 0, typ: NTI33554440, name: "textOverflow", sons: null},
+{kind: 1, offset: "textRendering", len: 0, typ: NTI33554440, name: "textRendering", sons: null},
+{kind: 1, offset: "textShadow", len: 0, typ: NTI33554440, name: "textShadow", sons: null},
+{kind: 1, offset: "textTransform", len: 0, typ: NTI33554440, name: "textTransform", sons: null},
+{kind: 1, offset: "textUnderlineOffset", len: 0, typ: NTI33554440, name: "textUnderlineOffset", sons: null},
+{kind: 1, offset: "textUnderlinePosition", len: 0, typ: NTI33554440, name: "textUnderlinePosition", sons: null},
+{kind: 1, offset: "top", len: 0, typ: NTI33554440, name: "top", sons: null},
+{kind: 1, offset: "touchAction", len: 0, typ: NTI33554440, name: "touchAction", sons: null},
+{kind: 1, offset: "transform", len: 0, typ: NTI33554440, name: "transform", sons: null},
+{kind: 1, offset: "transformBox", len: 0, typ: NTI33554440, name: "transformBox", sons: null},
+{kind: 1, offset: "transformOrigin", len: 0, typ: NTI33554440, name: "transformOrigin", sons: null},
+{kind: 1, offset: "transformStyle", len: 0, typ: NTI33554440, name: "transformStyle", sons: null},
+{kind: 1, offset: "transition", len: 0, typ: NTI33554440, name: "transition", sons: null},
+{kind: 1, offset: "transitionDelay", len: 0, typ: NTI33554440, name: "transitionDelay", sons: null},
+{kind: 1, offset: "transitionDuration", len: 0, typ: NTI33554440, name: "transitionDuration", sons: null},
+{kind: 1, offset: "transitionProperty", len: 0, typ: NTI33554440, name: "transitionProperty", sons: null},
+{kind: 1, offset: "transitionTimingFunction", len: 0, typ: NTI33554440, name: "transitionTimingFunction", sons: null},
+{kind: 1, offset: "translate", len: 0, typ: NTI33554440, name: "translate", sons: null},
+{kind: 1, offset: "unicodeBidi", len: 0, typ: NTI33554440, name: "unicodeBidi", sons: null},
+{kind: 1, offset: "verticalAlign", len: 0, typ: NTI33554440, name: "verticalAlign", sons: null},
+{kind: 1, offset: "visibility", len: 0, typ: NTI33554440, name: "visibility", sons: null},
+{kind: 1, offset: "whiteSpace", len: 0, typ: NTI33554440, name: "whiteSpace", sons: null},
+{kind: 1, offset: "widows", len: 0, typ: NTI33554440, name: "widows", sons: null},
+{kind: 1, offset: "width", len: 0, typ: NTI33554440, name: "width", sons: null},
+{kind: 1, offset: "willChange", len: 0, typ: NTI33554440, name: "willChange", sons: null},
+{kind: 1, offset: "wordBreak", len: 0, typ: NTI33554440, name: "wordBreak", sons: null},
+{kind: 1, offset: "wordSpacing", len: 0, typ: NTI33554440, name: "wordSpacing", sons: null},
+{kind: 1, offset: "writingMode", len: 0, typ: NTI33554440, name: "writingMode", sons: null},
+{kind: 1, offset: "zIndex", len: 0, typ: NTI33554440, name: "zIndex", sons: null}]};
+NTI620757133.node = NNI620757133;
+NTI620757133.base = NTI33555086;
+NTI620757022.base = NTI620757133;
+var NNI620757105 = {kind: 2, len: 22, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "attributes", len: 0, typ: NTI620757106, name: "attributes", sons: null},
+{kind: 1, offset: "childNodes", len: 0, typ: NTI620757107, name: "childNodes", sons: null},
+{kind: 1, offset: "children", len: 0, typ: NTI620757108, name: "children", sons: null},
+{kind: 1, offset: "data", len: 0, typ: NTI33554440, name: "data", sons: null},
+{kind: 1, offset: "firstChild", len: 0, typ: NTI620757008, name: "firstChild", sons: null},
+{kind: 1, offset: "lastChild", len: 0, typ: NTI620757008, name: "lastChild", sons: null},
+{kind: 1, offset: "nextSibling", len: 0, typ: NTI620757008, name: "nextSibling", sons: null},
+{kind: 1, offset: "nodeName", len: 0, typ: NTI33554440, name: "nodeName", sons: null},
+{kind: 1, offset: "nodeType", len: 0, typ: NTI620757007, name: "nodeType", sons: null},
+{kind: 1, offset: "nodeValue", len: 0, typ: NTI33554440, name: "nodeValue", sons: null},
+{kind: 1, offset: "parentNode", len: 0, typ: NTI620757008, name: "parentNode", sons: null},
+{kind: 1, offset: "content", len: 0, typ: NTI620757008, name: "content", sons: null},
+{kind: 1, offset: "previousSibling", len: 0, typ: NTI620757008, name: "previousSibling", sons: null},
+{kind: 1, offset: "ownerDocument", len: 0, typ: NTI620757009, name: "ownerDocument", sons: null},
+{kind: 1, offset: "innerHTML", len: 0, typ: NTI33554440, name: "innerHTML", sons: null},
+{kind: 1, offset: "outerHTML", len: 0, typ: NTI33554440, name: "outerHTML", sons: null},
+{kind: 1, offset: "innerText", len: 0, typ: NTI33554440, name: "innerText", sons: null},
+{kind: 1, offset: "textContent", len: 0, typ: NTI33554440, name: "textContent", sons: null},
+{kind: 1, offset: "style", len: 0, typ: NTI620757022, name: "style", sons: null},
+{kind: 1, offset: "baseURI", len: 0, typ: NTI33554440, name: "baseURI", sons: null},
+{kind: 1, offset: "parentElement", len: 0, typ: NTI620757010, name: "parentElement", sons: null},
+{kind: 1, offset: "isConnected", len: 0, typ: NTI33554466, name: "isConnected", sons: null}]};
+NTI620757105.node = NNI620757105;
+var NNI620757060 = {kind: 2, len: 24, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "onabort", len: 0, typ: NTI620757061, name: "onabort", sons: null},
+{kind: 1, offset: "onblur", len: 0, typ: NTI620757062, name: "onblur", sons: null},
+{kind: 1, offset: "onchange", len: 0, typ: NTI620757063, name: "onchange", sons: null},
+{kind: 1, offset: "onclick", len: 0, typ: NTI620757064, name: "onclick", sons: null},
+{kind: 1, offset: "ondblclick", len: 0, typ: NTI620757065, name: "ondblclick", sons: null},
+{kind: 1, offset: "onerror", len: 0, typ: NTI620757066, name: "onerror", sons: null},
+{kind: 1, offset: "onfocus", len: 0, typ: NTI620757067, name: "onfocus", sons: null},
+{kind: 1, offset: "onkeydown", len: 0, typ: NTI620757068, name: "onkeydown", sons: null},
+{kind: 1, offset: "onkeypress", len: 0, typ: NTI620757069, name: "onkeypress", sons: null},
+{kind: 1, offset: "onkeyup", len: 0, typ: NTI620757070, name: "onkeyup", sons: null},
+{kind: 1, offset: "onload", len: 0, typ: NTI620757071, name: "onload", sons: null},
+{kind: 1, offset: "onmousedown", len: 0, typ: NTI620757072, name: "onmousedown", sons: null},
+{kind: 1, offset: "onmousemove", len: 0, typ: NTI620757073, name: "onmousemove", sons: null},
+{kind: 1, offset: "onmouseout", len: 0, typ: NTI620757074, name: "onmouseout", sons: null},
+{kind: 1, offset: "onmouseover", len: 0, typ: NTI620757075, name: "onmouseover", sons: null},
+{kind: 1, offset: "onmouseup", len: 0, typ: NTI620757076, name: "onmouseup", sons: null},
+{kind: 1, offset: "onreset", len: 0, typ: NTI620757077, name: "onreset", sons: null},
+{kind: 1, offset: "onselect", len: 0, typ: NTI620757078, name: "onselect", sons: null},
+{kind: 1, offset: "onstorage", len: 0, typ: NTI620757079, name: "onstorage", sons: null},
+{kind: 1, offset: "onsubmit", len: 0, typ: NTI620757080, name: "onsubmit", sons: null},
+{kind: 1, offset: "onunload", len: 0, typ: NTI620757081, name: "onunload", sons: null},
+{kind: 1, offset: "onloadstart", len: 0, typ: NTI620757082, name: "onloadstart", sons: null},
+{kind: 1, offset: "onprogress", len: 0, typ: NTI620757083, name: "onprogress", sons: null},
+{kind: 1, offset: "onloadend", len: 0, typ: NTI620757084, name: "onloadend", sons: null}]};
+NTI620757060.node = NNI620757060;
+NTI620757060.base = NTI33555086;
+NTI620757105.base = NTI620757060;
+NTI620757008.base = NTI620757105;
+NTI620757436.base = NTI620757008;
+NTI486539805.base = NTI33554440;
+var NNI637534222 = {kind: 2, len: 2, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "Field0", len: 0, typ: NTI33554456, name: "Field0", sons: null},
+{kind: 1, offset: "Field1", len: 0, typ: NTI33554466, name: "Field1", sons: null}]};
+NTI637534222.node = NNI637534222;
+
+function makeNimstrLit(c_33556801) {
+ var result = [];
+ for (var i = 0; i < c_33556801.length; ++i) {
+ result[i] = c_33556801.charCodeAt(i);
+ }
+ return result;
+
+
+
+}
+
+function toJSStr(s_33556807) {
+ var Temporary5;
+
+ var result_33556808 = null;
+
+ var res_33556842 = newSeq_33556825((s_33556807).length);
+ var i_33556843 = 0;
+ var j_33556844 = 0;
+ Label1: do {
+ Label2: while (true) {
+ if (!(i_33556843 < (s_33556807).length)) break Label2;
+ var c_33556845 = s_33556807[i_33556843];
+ if ((c_33556845 < 128)) {
+ res_33556842[j_33556844] = String.fromCharCode(c_33556845);
+ i_33556843 += 1;
+ }
+ else {
+ var helper_33556857 = newSeq_33556825(0);
+ Label3: do {
+ Label4: while (true) {
+ if (!true) break Label4;
+ var code_33556858 = c_33556845.toString(16);
+ if ((((code_33556858) == null ? 0 : (code_33556858).length) == 1)) {
+ helper_33556857.push("%0");;
+ }
+ else {
+ helper_33556857.push("%");;
+ }
+
+ helper_33556857.push(code_33556858);;
+ i_33556843 += 1;
+ if (((s_33556807).length <= i_33556843)) Temporary5 = true; else { Temporary5 = (s_33556807[i_33556843] < 128); } if (Temporary5) {
+ break Label3;
+ }
+
+ c_33556845 = s_33556807[i_33556843];
+ }
+ } while (false);
+++excHandler;
+ try {
+ res_33556842[j_33556844] = decodeURIComponent(helper_33556857.join(""));
+--excHandler;
+} catch (EXCEPTION) {
+ var prevJSError = lastJSError;
+ lastJSError = EXCEPTION;
+ --excHandler;
+ res_33556842[j_33556844] = helper_33556857.join("");
+ lastJSError = prevJSError;
+ } finally {
+ }
+ }
+
+ j_33556844 += 1;
+ }
+ } while (false);
+ if (res_33556842.length < j_33556844) { for (var i = res_33556842.length ; i < j_33556844 ; ++i) res_33556842.push(null); }
+ else { res_33556842.length = j_33556844; };
+ result_33556808 = res_33556842.join("");
+
+ return result_33556808;
+
+}
+
+function raiseException(e_33556667, ename_33556668) {
+ e_33556667.name = ename_33556668;
+ if ((excHandler == 0)) {
+ unhandledException(e_33556667);
+ }
+
+ throw e_33556667;
+
+
+}
+
+function addInt(a_33556940, b_33556941) {
+ var result = a_33556940 + b_33556941;
+ checkOverflowInt(result);
+ return result;
+
+
+
+}
+
+function mnewString(len_33556893) {
+ return new Array(len_33556893);
+
+
+
+}
+
+function chckRange(i_33557189, a_33557190, b_33557191) {
+ var Temporary1;
+
+ var result_33557192 = 0;
+
+ BeforeRet: do {
+ if (!(a_33557190 <= i_33557189)) Temporary1 = false; else { Temporary1 = (i_33557189 <= b_33557191); } if (Temporary1) {
+ result_33557192 = i_33557189;
+ break BeforeRet;
+ }
+ else {
+ raiseRangeError();
+ }
+
+ } while (false);
+
+ return result_33557192;
+
+}
+
+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_33557140, src_33557141, ti_33557142) {
+ var result_33557151 = null;
+
+ switch (ti_33557142.kind) {
+ case 21:
+ case 22:
+ case 23:
+ case 5:
+ if (!(isFatPointer_33557131(ti_33557142))) {
+ result_33557151 = src_33557141;
+ }
+ else {
+ result_33557151 = [src_33557141[0], src_33557141[1]];
+ }
+
+ break;
+ case 19:
+ if (dest_33557140 === null || dest_33557140 === undefined) {
+ dest_33557140 = {};
+ }
+ else {
+ for (var key in dest_33557140) { delete dest_33557140[key]; }
+ }
+ for (var key in src_33557141) { dest_33557140[key] = src_33557141[key]; }
+ result_33557151 = dest_33557140;
+
+ break;
+ case 18:
+ case 17:
+ if (!((ti_33557142.base == null))) {
+ result_33557151 = nimCopy(dest_33557140, src_33557141, ti_33557142.base);
+ }
+ else {
+ if ((ti_33557142.kind == 17)) {
+ result_33557151 = (dest_33557140 === null || dest_33557140 === undefined) ? {m_type: ti_33557142} : dest_33557140;
+ }
+ else {
+ result_33557151 = (dest_33557140 === null || dest_33557140 === undefined) ? {} : dest_33557140;
+ }
+ }
+ nimCopyAux(result_33557151, src_33557141, ti_33557142.node);
+ break;
+ case 24:
+ case 4:
+ case 27:
+ case 16:
+ if (src_33557141 === null) {
+ result_33557151 = null;
+ }
+ else {
+ if (dest_33557140 === null || dest_33557140 === undefined || dest_33557140.length != src_33557141.length) {
+ dest_33557140 = new Array(src_33557141.length);
+ }
+ result_33557151 = dest_33557140;
+ for (var i = 0; i < src_33557141.length; ++i) {
+ result_33557151[i] = nimCopy(result_33557151[i], src_33557141[i], ti_33557142.base);
+ }
+ }
+
+ break;
+ case 28:
+ if (src_33557141 !== null) {
+ result_33557151 = src_33557141.slice(0);
+ }
+
+ break;
+ default:
+ result_33557151 = src_33557141;
+ break;
+ }
+
+ return result_33557151;
+
+}
+
+function chckIndx(i_33557184, a_33557185, b_33557186) {
+ var Temporary1;
+
+ var result_33557187 = 0;
+
+ BeforeRet: do {
+ if (!(a_33557185 <= i_33557184)) Temporary1 = false; else { Temporary1 = (i_33557184 <= b_33557186); } if (Temporary1) {
+ result_33557187 = i_33557184;
+ break BeforeRet;
+ }
+ else {
+ raiseIndexError(i_33557184, a_33557185, b_33557186);
+ }
+
+ } while (false);
+
+ return result_33557187;
+
+}
+
+function subInt(a_33556944, b_33556945) {
+ var result = a_33556944 - b_33556945;
+ checkOverflowInt(result);
+ return result;
+
+
+
+}
+var ConstSet2 = setConstr([65, 90]);
+var ConstSet3 = setConstr(95, 32, 46);
+var ConstSet4 = setConstr(95, 32, 46);
+
+function mulInt(a_33556948, b_33556949) {
+ var result = a_33556948 * b_33556949;
+ 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_33556998, b_33556999) {
+ var Temporary1;
+
+ var result_33557000 = 0;
+
+ BeforeRet: do {
+ if ((b_33556999 <= a_33556998)) {
+ Temporary1 = a_33556998;
+ }
+ else {
+ Temporary1 = b_33556999;
+ }
+
+ result_33557000 = Temporary1;
+ break BeforeRet;
+ } while (false);
+
+ return result_33557000;
+
+}
+
+function nimMin(a_33556994, b_33556995) {
+ var Temporary1;
+
+ var result_33556996 = 0;
+
+ BeforeRet: do {
+ if ((a_33556994 <= b_33556995)) {
+ Temporary1 = a_33556994;
+ }
+ else {
+ Temporary1 = b_33556995;
+ }
+
+ result_33556996 = Temporary1;
+ break BeforeRet;
+ } while (false);
+
+ return result_33556996;
+
+}
+
+function addChar(x_33557255, c_33557256) {
+ x_33557255.push(c_33557256);
+
+
+}
+if (!Math.trunc) {
+ Math.trunc = function(v) {
+ v = +v;
+ if (!isFinite(v)) return v;
+ return (v - v % 1) || (v < 0 ? -0 : v === 0 ? v : 0);
+ };
+}
+
+var alternative_486539858 = [null];
+
+function add_33556419(x_33556420, x_33556420_Idx, y_33556421) {
+ if (x_33556420[x_33556420_Idx] === null) { x_33556420[x_33556420_Idx] = []; }
+ var off = x_33556420[x_33556420_Idx].length;
+ x_33556420[x_33556420_Idx].length += y_33556421.length;
+ for (var i = 0; i < y_33556421.length; ++i) {
+ x_33556420[x_33556420_Idx][off+i] = y_33556421.charCodeAt(i);
+ }
+
+
+
+}
+
+function newSeq_33556825(len_33556827) {
+ var result_33556828 = [];
+
+ result_33556828 = new Array(len_33556827); for (var i = 0 ; i < len_33556827 ; ++i) { result_33556828[i] = null; }
+ return result_33556828;
+
+}
+
+function unhandledException(e_33556663) {
+ var buf_33556664 = [[]];
+ if (!(((e_33556663.message).length == 0))) {
+ buf_33556664[0].push.apply(buf_33556664[0], makeNimstrLit("Error: unhandled exception: "));;
+ buf_33556664[0].push.apply(buf_33556664[0], e_33556663.message);;
+ }
+ else {
+ buf_33556664[0].push.apply(buf_33556664[0], makeNimstrLit("Error: unhandled exception"));;
+ }
+
+ buf_33556664[0].push.apply(buf_33556664[0], makeNimstrLit(" ["));;
+ add_33556419(buf_33556664, 0, e_33556663.name);
+ buf_33556664[0].push.apply(buf_33556664[0], makeNimstrLit("]\x0A"));;
+ var cbuf_33556665 = toJSStr(buf_33556664[0]);
+ if (typeof(Error) !== "undefined") {
+ throw new Error(cbuf_33556665);
+ }
+ else {
+ throw cbuf_33556665;
+ }
+
+
+
+}
+
+function raiseOverflow() {
+ raiseException({message: makeNimstrLit("over- or underflow"), parent: null, m_type: NTI33555125, name: null, trace: [], up: null}, "OverflowDefect");
+
+
+}
+
+function checkOverflowInt(a_33556938) {
+ if (a_33556938 > 2147483647 || a_33556938 < -2147483648) raiseOverflow();
+
+
+
+}
+
+function isWhitespace_486539572(text_486539573) {
+ return !/[^\s]/.test(text_486539573);
+
+
+
+}
+
+function isWhitespace_486539575(x_486539576) {
+ var Temporary1;
+ var Temporary2;
+
+ var result_486539577 = false;
+
+ if (!(x_486539576.nodeName == "#text")) Temporary2 = false; else { Temporary2 = isWhitespace_486539572(x_486539576.textContent); } if (Temporary2) Temporary1 = true; else { Temporary1 = (x_486539576.nodeName == "#comment"); } result_486539577 = Temporary1;
+
+ return result_486539577;
+
+}
+
+function raiseRangeError() {
+ raiseException({message: makeNimstrLit("value out of range"), parent: null, m_type: NTI33555133, name: null, trace: [], up: null}, "RangeDefect");
+
+
+}
+
+function addChars_251658415(result_251658417, result_251658417_Idx, x_251658418, start_251658419, n_251658420) {
+ var old_251658421 = (result_251658417[result_251658417_Idx]).length;
+ (result_251658417[result_251658417_Idx].length = chckRange(addInt(old_251658421, n_251658420), 0, 2147483647));
+ Label1: do {
+ var iHEX60gensym4_251658435 = 0;
+ var i_486539917 = 0;
+ Label2: do {
+ Label3: while (true) {
+ if (!(i_486539917 < n_251658420)) break Label3;
+ iHEX60gensym4_251658435 = i_486539917;
+ result_251658417[result_251658417_Idx][chckIndx(addInt(old_251658421, iHEX60gensym4_251658435), 0, (result_251658417[result_251658417_Idx]).length - 1)] = x_251658418.charCodeAt(chckIndx(addInt(start_251658419, iHEX60gensym4_251658435), 0, (x_251658418).length - 1));
+ i_486539917 = addInt(i_486539917, 1);
+ }
+ } while (false);
+ } while (false);
+
+
+}
+
+function addChars_251658411(result_251658413, result_251658413_Idx, x_251658414) {
+ addChars_251658415(result_251658413, result_251658413_Idx, x_251658414, 0, ((x_251658414) == null ? 0 : (x_251658414).length));
+
+
+}
+
+function addInt_251658436(result_251658437, result_251658437_Idx, x_251658438) {
+ addChars_251658411(result_251658437, result_251658437_Idx, ((x_251658438) + ""));
+
+
+}
+
+function addInt_251658457(result_251658458, result_251658458_Idx, x_251658459) {
+ addInt_251658436(result_251658458, result_251658458_Idx, x_251658459);
+
+
+}
+
+function HEX24_352321539(x_352321540) {
+ var result_352321541 = [[]];
+
+ addInt_251658457(result_352321541, 0, x_352321540);
+
+ return result_352321541[0];
+
+}
+
+function isFatPointer_33557131(ti_33557132) {
+ var result_33557133 = false;
+
+ BeforeRet: do {
+ result_33557133 = !((ConstSet1[ti_33557132.base.kind] != undefined));
+ break BeforeRet;
+ } while (false);
+
+ return result_33557133;
+
+}
+
+function nimCopyAux(dest_33557144, src_33557145, n_33557146) {
+ switch (n_33557146.kind) {
+ case 0:
+ break;
+ case 1:
+ dest_33557144[n_33557146.offset] = nimCopy(dest_33557144[n_33557146.offset], src_33557145[n_33557146.offset], n_33557146.typ);
+
+ break;
+ case 2:
+ for (var i = 0; i < n_33557146.sons.length; i++) {
+ nimCopyAux(dest_33557144, src_33557145, n_33557146.sons[i]);
+ }
+
+ break;
+ case 3:
+ dest_33557144[n_33557146.offset] = nimCopy(dest_33557144[n_33557146.offset], src_33557145[n_33557146.offset], n_33557146.typ);
+ for (var i = 0; i < n_33557146.sons.length; ++i) {
+ nimCopyAux(dest_33557144, src_33557145, n_33557146.sons[i][1]);
+ }
+
+ break;
+ }
+
+
+}
+
+function raiseIndexError(i_33556754, a_33556755, b_33556756) {
+ var Temporary1;
+
+ if ((b_33556756 < a_33556755)) {
+ Temporary1 = makeNimstrLit("index out of bounds, the container is empty");
+ }
+ else {
+ Temporary1 = (makeNimstrLit("index ") || []).concat(HEX24_352321539(i_33556754) || [],makeNimstrLit(" not in ") || [],HEX24_352321539(a_33556755) || [],makeNimstrLit(" .. ") || [],HEX24_352321539(b_33556756) || []);
+ }
+
+ raiseException({message: nimCopy(null, Temporary1, NTI33554439), parent: null, m_type: NTI33555131, name: null, trace: [], up: null}, "IndexDefect");
+
+
+}
+
+function toToc_486539578(x_486539579, father_486539580) {
+ var Temporary5;
+ var Temporary6;
+ var Temporary7;
+ var Temporary8;
+ var Temporary15;
+
+ if ((x_486539579.nodeName == "UL")) {
+ var f_486539588 = {heading: null, kids: [], sortId: (father_486539580.kids).length, doSort: false};
+ var i_486539589 = 0;
+ Label1: do {
+ Label2: while (true) {
+ if (!(i_486539589 < x_486539579.childNodes.length)) break Label2;
+ var nxt_486539590 = addInt(i_486539589, 1);
+ Label3: do {
+ Label4: while (true) {
+ if (!(nxt_486539590 < x_486539579.childNodes.length)) Temporary5 = false; else { Temporary5 = isWhitespace_486539575(x_486539579.childNodes[nxt_486539590]); } if (!Temporary5) break Label4;
+ nxt_486539590 = addInt(nxt_486539590, 1);
+ }
+ } while (false);
+ if (!(nxt_486539590 < x_486539579.childNodes.length)) Temporary8 = false; else { Temporary8 = (x_486539579.childNodes[i_486539589].nodeName == "LI"); } if (!Temporary8) Temporary7 = false; else { Temporary7 = (x_486539579.childNodes[i_486539589].childNodes.length == 1); } if (!Temporary7) Temporary6 = false; else { Temporary6 = (x_486539579.childNodes[nxt_486539590].nodeName == "UL"); } if (Temporary6) {
+ var e_486539602 = {heading: x_486539579.childNodes[i_486539589].childNodes[0], kids: [], sortId: (f_486539588.kids).length, doSort: false};
+ var it_486539603 = x_486539579.childNodes[nxt_486539590];
+ Label9: do {
+ var j_486539608 = 0;
+ var colontmp__486539896 = 0;
+ colontmp__486539896 = it_486539603.childNodes.length;
+ var i_486539897 = 0;
+ Label10: do {
+ Label11: while (true) {
+ if (!(i_486539897 < colontmp__486539896)) break Label11;
+ j_486539608 = i_486539897;
+ toToc_486539578(it_486539603.childNodes[j_486539608], e_486539602);
+ i_486539897 = addInt(i_486539897, 1);
+ }
+ } while (false);
+ } while (false);
+ f_486539588.kids.push(e_486539602);;
+ i_486539589 = addInt(nxt_486539590, 1);
+ }
+ else {
+ toToc_486539578(x_486539579.childNodes[i_486539589], f_486539588);
+ i_486539589 = addInt(i_486539589, 1);
+ }
+
+ }
+ } while (false);
+ father_486539580.kids.push(f_486539588);;
+ }
+ else {
+ if (isWhitespace_486539575(x_486539579)) {
+ }
+ else {
+ if ((x_486539579.nodeName == "LI")) {
+ var idx_486539625 = [];
+ Label12: do {
+ var i_486539630 = 0;
+ var colontmp__486539900 = 0;
+ colontmp__486539900 = x_486539579.childNodes.length;
+ var i_486539901 = 0;
+ Label13: do {
+ Label14: while (true) {
+ if (!(i_486539901 < colontmp__486539900)) break Label14;
+ i_486539630 = i_486539901;
+ if (!(isWhitespace_486539575(x_486539579.childNodes[i_486539630]))) {
+ idx_486539625.push(i_486539630);;
+ }
+
+ i_486539901 = addInt(i_486539901, 1);
+ }
+ } while (false);
+ } while (false);
+ if (!((idx_486539625).length == 2)) Temporary15 = false; else { Temporary15 = (x_486539579.childNodes[idx_486539625[chckIndx(1, 0, (idx_486539625).length - 1)]].nodeName == "UL"); } if (Temporary15) {
+ var e_486539646 = {heading: x_486539579.childNodes[idx_486539625[chckIndx(0, 0, (idx_486539625).length - 1)]], kids: [], sortId: (father_486539580.kids).length, doSort: false};
+ var it_486539647 = x_486539579.childNodes[idx_486539625[chckIndx(1, 0, (idx_486539625).length - 1)]];
+ Label16: do {
+ var j_486539652 = 0;
+ var colontmp__486539904 = 0;
+ colontmp__486539904 = it_486539647.childNodes.length;
+ var i_486539905 = 0;
+ Label17: do {
+ Label18: while (true) {
+ if (!(i_486539905 < colontmp__486539904)) break Label18;
+ j_486539652 = i_486539905;
+ toToc_486539578(it_486539647.childNodes[j_486539652], e_486539646);
+ i_486539905 = addInt(i_486539905, 1);
+ }
+ } while (false);
+ } while (false);
+ father_486539580.kids.push(e_486539646);;
+ }
+ else {
+ Label19: do {
+ var i_486539661 = 0;
+ var colontmp__486539908 = 0;
+ colontmp__486539908 = x_486539579.childNodes.length;
+ var i_486539909 = 0;
+ Label20: do {
+ Label21: while (true) {
+ if (!(i_486539909 < colontmp__486539908)) break Label21;
+ i_486539661 = i_486539909;
+ toToc_486539578(x_486539579.childNodes[i_486539661], father_486539580);
+ i_486539909 = addInt(i_486539909, 1);
+ }
+ } while (false);
+ } while (false);
+ }
+
+ }
+ else {
+ father_486539580.kids.push({heading: x_486539579, kids: [], sortId: (father_486539580.kids).length, doSort: false});;
+ }
+ }}
+
+
+}
+
+function extractItems_486539398(x_486539399, heading_486539400, items_486539401, items_486539401_Idx) {
+ var Temporary1;
+
+ BeforeRet: do {
+ if ((x_486539399 == null)) {
+ break BeforeRet;
+ }
+
+ if (!!((x_486539399.heading == null))) Temporary1 = false; else { Temporary1 = (x_486539399.heading.textContent == heading_486539400); } if (Temporary1) {
+ Label2: do {
+ var i_486539418 = 0;
+ var colontmp__486539920 = 0;
+ colontmp__486539920 = (x_486539399.kids).length;
+ var i_486539921 = 0;
+ Label3: do {
+ Label4: while (true) {
+ if (!(i_486539921 < colontmp__486539920)) break Label4;
+ i_486539418 = i_486539921;
+ items_486539401[items_486539401_Idx].push(x_486539399.kids[chckIndx(i_486539418, 0, (x_486539399.kids).length - 1)].heading);;
+ i_486539921 = addInt(i_486539921, 1);
+ }
+ } while (false);
+ } while (false);
+ }
+ else {
+ Label5: do {
+ var i_486539430 = 0;
+ var colontmp__486539924 = 0;
+ colontmp__486539924 = (x_486539399.kids).length;
+ var i_486539925 = 0;
+ Label6: do {
+ Label7: while (true) {
+ if (!(i_486539925 < colontmp__486539924)) break Label7;
+ i_486539430 = i_486539925;
+ var it_486539431 = x_486539399.kids[chckIndx(i_486539430, 0, (x_486539399.kids).length - 1)];
+ extractItems_486539398(it_486539431, heading_486539400, items_486539401, items_486539401_Idx);
+ i_486539925 = addInt(i_486539925, 1);
+ }
+ } while (false);
+ } while (false);
+ }
+
+ } while (false);
+
+
+}
+
+function tree_486539271(tag_486539272, kids_486539273) {
+ var result_486539274 = null;
+
+ result_486539274 = document.createElement(toJSStr(tag_486539272));
+ Label1: do {
+ var k_486539287 = null;
+ var i_486539938 = 0;
+ Label2: do {
+ Label3: while (true) {
+ if (!(i_486539938 < (kids_486539273).length)) break Label3;
+ k_486539287 = kids_486539273[chckIndx(i_486539938, 0, (kids_486539273).length - 1)];
+ result_486539274.appendChild(k_486539287);
+ i_486539938 = addInt(i_486539938, 1);
+ }
+ } while (false);
+ } while (false);
+
+ return result_486539274;
+
+}
+
+function text_486539325(s_486539326) {
+ var result_486539327 = null;
+
+ result_486539327 = document.createTextNode(s_486539326);
+
+ return result_486539327;
+
+}
+
+function sysFatal_218103842(message_218103845) {
+ raiseException({message: nimCopy(null, message_218103845, NTI33554439), m_type: NTI33555127, parent: null, name: null, trace: [], up: null}, "AssertionDefect");
+
+
+}
+
+function raiseAssert_218103840(msg_218103841) {
+ sysFatal_218103842(msg_218103841);
+
+
+}
+
+function failedAssertImpl_218103864(msg_218103865) {
+ raiseAssert_218103840(msg_218103865);
+
+
+}
+
+function uncovered_486539727(x_486539728) {
+ var Temporary1;
+ var Temporary2;
+
+ var result_486539729 = null;
+
+ BeforeRet: do {
+ if (!((x_486539728.kids).length == 0)) Temporary1 = false; else { Temporary1 = !((x_486539728.heading == null)); } if (Temporary1) {
+ if (!(x_486539728.heading.hasOwnProperty('__karaxMarker__'))) {
+ Temporary2 = x_486539728;
+ }
+ else {
+ Temporary2 = null;
+ }
+
+ result_486539729 = Temporary2;
+ break BeforeRet;
+ }
+
+ result_486539729 = {heading: x_486539728.heading, kids: [], sortId: x_486539728.sortId, doSort: x_486539728.doSort};
+ Label3: do {
+ var i_486539748 = 0;
+ var colontmp__486539945 = 0;
+ colontmp__486539945 = (x_486539728.kids).length;
+ var i_486539946 = 0;
+ Label4: do {
+ Label5: while (true) {
+ if (!(i_486539946 < colontmp__486539945)) break Label5;
+ i_486539748 = i_486539946;
+ var y_486539749 = uncovered_486539727(x_486539728.kids[chckIndx(i_486539748, 0, (x_486539728.kids).length - 1)]);
+ if (!((y_486539749 == null))) {
+ result_486539729.kids.push(y_486539749);;
+ }
+
+ i_486539946 = addInt(i_486539946, 1);
+ }
+ } while (false);
+ } while (false);
+ if (((result_486539729.kids).length == 0)) {
+ result_486539729 = null;
+ }
+
+ } while (false);
+
+ return result_486539729;
+
+}
+
+function mergeTocs_486539761(orig_486539762, news_486539763) {
+ var result_486539764 = null;
+
+ result_486539764 = uncovered_486539727(orig_486539762);
+ if ((result_486539764 == null)) {
+ result_486539764 = news_486539763;
+ }
+ else {
+ Label1: do {
+ var i_486539776 = 0;
+ var colontmp__486539941 = 0;
+ colontmp__486539941 = (news_486539763.kids).length;
+ var i_486539942 = 0;
+ Label2: do {
+ Label3: while (true) {
+ if (!(i_486539942 < colontmp__486539941)) break Label3;
+ i_486539776 = i_486539942;
+ result_486539764.kids.push(news_486539763.kids[chckIndx(i_486539776, 0, (news_486539763.kids).length - 1)]);;
+ i_486539942 = addInt(i_486539942, 1);
+ }
+ } while (false);
+ } while (false);
+ }
+
+
+ return result_486539764;
+
+}
+
+function buildToc_486539781(orig_486539782, types_486539783, procs_486539784) {
+ var Temporary7;
+
+ var result_486539785 = null;
+
+ var newStuff_486539790 = {heading: null, kids: [], doSort: true, sortId: 0};
+ Label1: do {
+ var t_486539812 = null;
+ var i_486539933 = 0;
+ var L_486539934 = (types_486539783).length;
+ Label2: do {
+ Label3: while (true) {
+ if (!(i_486539933 < L_486539934)) break Label3;
+ t_486539812 = types_486539783[chckIndx(i_486539933, 0, (types_486539783).length - 1)];
+ var c_486539817 = {heading: t_486539812.cloneNode(true), kids: [], doSort: true, sortId: 0};
+ t_486539812.__karaxMarker__ = true;
+ Label4: do {
+ var p_486539821 = null;
+ var i_486539930 = 0;
+ var L_486539931 = (procs_486539784).length;
+ Label5: do {
+ Label6: while (true) {
+ if (!(i_486539930 < L_486539931)) break Label6;
+ p_486539821 = procs_486539784[chckIndx(i_486539930, 0, (procs_486539784).length - 1)];
+ if (!(p_486539821.hasOwnProperty('__karaxMarker__'))) {
+ var xx_486539822 = p_486539821.parentNode.getElementsByClassName("attachedType");
+ if (!((xx_486539822).length == 1)) Temporary7 = false; else { Temporary7 = (xx_486539822[chckIndx(0, 0, (xx_486539822).length - 1)].textContent == t_486539812.textContent); } if (Temporary7) {
+ var q_486539827 = tree_486539271(makeNimstrLit("A"), [text_486539325(p_486539821.title)]);
+ q_486539827.setAttribute("href", p_486539821.getAttribute("href"));
+ c_486539817.kids.push({heading: q_486539827, kids: [], sortId: 0, doSort: false});;
+ p_486539821.__karaxMarker__ = true;
+ }
+
+ }
+
+ i_486539930 = addInt(i_486539930, 1);
+ if (!(((procs_486539784).length == L_486539931))) {
+ failedAssertImpl_218103864(makeNimstrLit("iterators.nim(240, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ } while (false);
+ } while (false);
+ newStuff_486539790.kids.push(c_486539817);;
+ i_486539933 = addInt(i_486539933, 1);
+ if (!(((types_486539783).length == L_486539934))) {
+ failedAssertImpl_218103864(makeNimstrLit("iterators.nim(240, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ } while (false);
+ } while (false);
+ result_486539785 = mergeTocs_486539761(orig_486539782, newStuff_486539790);
+
+ return result_486539785;
+
+}
+
+function add_486539315(parent_486539316, kid_486539317) {
+ var Temporary1;
+ var Temporary2;
+
+ if (!(parent_486539316.nodeName == "TR")) Temporary1 = false; else { if ((kid_486539317.nodeName == "TD")) Temporary2 = true; else { Temporary2 = (kid_486539317.nodeName == "TH"); } Temporary1 = Temporary2; } if (Temporary1) {
+ var k_486539318 = document.createElement("TD");
+ k_486539318.appendChild(kid_486539317);
+ parent_486539316.appendChild(k_486539318);
+ }
+ else {
+ parent_486539316.appendChild(kid_486539317);
+ }
+
+
+
+}
+
+function setClass_486539319(e_486539320, value_486539321) {
+ e_486539320.setAttribute("class", toJSStr(value_486539321));
+
+
+}
+
+function toHtml_486539441(x_486539442, isRoot_486539443) {
+ var Temporary1;
+
+function HEX3Aanonymous_486539461(a_486539462, b_486539463) {
+ var Temporary1;
+
+ var result_486539464 = 0;
+
+ BeforeRet: do {
+ if (!!((a_486539462.heading == null))) Temporary1 = false; else { Temporary1 = !((b_486539463.heading == null)); } if (Temporary1) {
+ var x_486539473 = a_486539462.heading.textContent;
+ var y_486539474 = b_486539463.heading.textContent;
+ if ((x_486539473 < y_486539474)) {
+ result_486539464 = -1;
+ break BeforeRet;
+ }
+
+ if ((y_486539474 < x_486539473)) {
+ result_486539464 = 1;
+ break BeforeRet;
+ }
+
+ result_486539464 = 0;
+ break BeforeRet;
+ }
+ else {
+ result_486539464 = subInt(a_486539462.sortId, b_486539463.sortId);
+ break BeforeRet;
+ }
+
+ } while (false);
+
+ return result_486539464;
+
+ }
+
+ var result_486539444 = null;
+
+ BeforeRet: do {
+ if ((x_486539442 == null)) {
+ result_486539444 = null;
+ break BeforeRet;
+ }
+
+ if (((x_486539442.kids).length == 0)) {
+ if ((x_486539442.heading == null)) {
+ result_486539444 = null;
+ break BeforeRet;
+ }
+
+ result_486539444 = x_486539442.heading.cloneNode(true);
+ break BeforeRet;
+ }
+
+ result_486539444 = tree_486539271(makeNimstrLit("DIV"), []);
+ if (!!((x_486539442.heading == null))) Temporary1 = false; else { Temporary1 = !(x_486539442.heading.hasOwnProperty('__karaxMarker__')); } if (Temporary1) {
+ add_486539315(result_486539444, x_486539442.heading.cloneNode(true));
+ }
+
+ var ul_486539460 = tree_486539271(makeNimstrLit("UL"), []);
+ if (isRoot_486539443) {
+ setClass_486539319(ul_486539460, makeNimstrLit("simple simple-toc"));
+ }
+ else {
+ setClass_486539319(ul_486539460, makeNimstrLit("simple"));
+ }
+
+ if (x_486539442.doSort) {
+ x_486539442.kids.sort(HEX3Aanonymous_486539461);
+ }
+
+ Label2: do {
+ var k_486539503 = null;
+ var i_486539950 = 0;
+ var L_486539951 = (x_486539442.kids).length;
+ Label3: do {
+ Label4: while (true) {
+ if (!(i_486539950 < L_486539951)) break Label4;
+ k_486539503 = x_486539442.kids[chckIndx(i_486539950, 0, (x_486539442.kids).length - 1)];
+ var y_486539504 = toHtml_486539441(k_486539503, false);
+ if (!((y_486539504 == null))) {
+ add_486539315(ul_486539460, tree_486539271(makeNimstrLit("LI"), [y_486539504]));
+ }
+
+ i_486539950 = addInt(i_486539950, 1);
+ if (!(((x_486539442.kids).length == L_486539951))) {
+ failedAssertImpl_218103864(makeNimstrLit("iterators.nim(240, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ } while (false);
+ } while (false);
+ if (!((ul_486539460.childNodes.length == 0))) {
+ add_486539315(result_486539444, ul_486539460);
+ }
+
+ if ((result_486539444.childNodes.length == 0)) {
+ result_486539444 = null;
+ }
+
+ } while (false);
+
+ return result_486539444;
+
+}
+
+function replaceById_486539330(id_486539331, newTree_486539332) {
+ var x_486539333 = document.getElementById(id_486539331);
+ x_486539333.parentNode.replaceChild(newTree_486539332, x_486539333);
+ newTree_486539332.id = id_486539331;
+
+
+}
+
+function togglevis_486539859(d_486539860) {
+ if (d_486539860.style.display == 'none')
+ d_486539860.style.display = 'inline';
+ else
+ d_486539860.style.display = 'none';
+
+
+
+}
+
+function groupBy(value_486539862) {
+ var toc_486539863 = document.getElementById("toc-list");
+ if ((alternative_486539858[0] == null)) {
+ var tt_486539871 = {heading: null, kids: [], sortId: 0, doSort: false};
+ toToc_486539578(toc_486539863, tt_486539871);
+ tt_486539871 = tt_486539871.kids[chckIndx(0, 0, (tt_486539871.kids).length - 1)];
+ var types_486539876 = [[]];
+ var procs_486539881 = [[]];
+ extractItems_486539398(tt_486539871, "Types", types_486539876, 0);
+ extractItems_486539398(tt_486539871, "Procs", procs_486539881, 0);
+ extractItems_486539398(tt_486539871, "Converters", procs_486539881, 0);
+ extractItems_486539398(tt_486539871, "Methods", procs_486539881, 0);
+ extractItems_486539398(tt_486539871, "Templates", procs_486539881, 0);
+ extractItems_486539398(tt_486539871, "Macros", procs_486539881, 0);
+ extractItems_486539398(tt_486539871, "Iterators", procs_486539881, 0);
+ var ntoc_486539882 = buildToc_486539781(tt_486539871, types_486539876[0], procs_486539881[0]);
+ var x_486539883 = toHtml_486539441(ntoc_486539882, true);
+ alternative_486539858[0] = tree_486539271(makeNimstrLit("DIV"), [x_486539883]);
+ }
+
+ if ((value_486539862 == "type")) {
+ replaceById_486539330("tocRoot", alternative_486539858[0]);
+ }
+ else {
+ replaceById_486539330("tocRoot", tree_486539271(makeNimstrLit("DIV"), []));
+ }
+
+ togglevis_486539859(document.getElementById("toc-list"));
+
+
+}
+var db_486539953 = [[]];
+var contents_486539954 = [[]];
+var oldtoc_486540119 = [null];
+var timer_486540120 = [null];
+
+function nsuToLowerAsciiChar(c_654311492) {
+ var result_654311493 = 0;
+
+ if ((ConstSet2[c_654311492] != undefined)) {
+ result_654311493 = (c_654311492 ^ 32);
+ }
+ else {
+ result_654311493 = c_654311492;
+ }
+
+
+ return result_654311493;
+
+}
+
+function fuzzyMatch_637534224(pattern_637534225, str_637534226) {
+ var Temporary4;
+ var Temporary5;
+ var Temporary6;
+ var Temporary7;
+ var Temporary8;
+
+ var result_637534229 = {Field0: 0, Field1: false};
+
+ var scoreState_637534230 = -100;
+ var headerMatched_637534231 = false;
+ var unmatchedLeadingCharCount_637534232 = 0;
+ var consecutiveMatchCount_637534233 = 0;
+ var strIndex_637534234 = 0;
+ var patIndex_637534235 = 0;
+ var score_637534236 = 0;
+ Label1: do {
+ Label2: while (true) {
+ if (!((strIndex_637534234 < ((str_637534226) == null ? 0 : (str_637534226).length)) && (patIndex_637534235 < ((pattern_637534225) == null ? 0 : (pattern_637534225).length)))) break Label2;
+ Label3: do {
+ var patternChar_637534239 = nsuToLowerAsciiChar(pattern_637534225.charCodeAt(chckIndx(patIndex_637534235, 0, (pattern_637534225).length - 1)));
+ var strChar_637534240 = nsuToLowerAsciiChar(str_637534226.charCodeAt(chckIndx(strIndex_637534234, 0, (str_637534226).length - 1)));
+ if ((ConstSet3[patternChar_637534239] != undefined)) {
+ patIndex_637534235 = addInt(patIndex_637534235, 1);
+ break Label3;
+ }
+
+ if ((ConstSet4[strChar_637534240] != undefined)) {
+ strIndex_637534234 = addInt(strIndex_637534234, 1);
+ break Label3;
+ }
+
+ if ((!(headerMatched_637534231) && (strChar_637534240 == 58))) {
+ headerMatched_637534231 = true;
+ scoreState_637534230 = -100;
+ score_637534236 = ((Math.floor((0.5 * score_637534236))) | 0);
+ patIndex_637534235 = 0;
+ strIndex_637534234 = addInt(strIndex_637534234, 1);
+ break Label3;
+ }
+
+ if ((strChar_637534240 == patternChar_637534239)) {
+ switch (scoreState_637534230) {
+ case -100:
+ case 20:
+ scoreState_637534230 = 10;
+ break;
+ case 0:
+ scoreState_637534230 = 5;
+ score_637534236 = addInt(score_637534236, scoreState_637534230);
+ break;
+ case 10:
+ case 5:
+ consecutiveMatchCount_637534233 = addInt(consecutiveMatchCount_637534233, 1);
+ scoreState_637534230 = 5;
+ score_637534236 = addInt(score_637534236, mulInt(5, consecutiveMatchCount_637534233));
+ if ((scoreState_637534230 == 10)) {
+ score_637534236 = addInt(score_637534236, 10);
+ }
+
+ var onBoundary_637534292 = (patIndex_637534235 == ((pattern_637534225) == null ? -1 : (pattern_637534225).length - 1));
+ if ((!(onBoundary_637534292) && (strIndex_637534234 < ((str_637534226) == null ? -1 : (str_637534226).length - 1)))) {
+ var nextPatternChar_637534293 = nsuToLowerAsciiChar(pattern_637534225.charCodeAt(chckIndx(addInt(patIndex_637534235, 1), 0, (pattern_637534225).length - 1)));
+ var nextStrChar_637534294 = nsuToLowerAsciiChar(str_637534226.charCodeAt(chckIndx(addInt(strIndex_637534234, 1), 0, (str_637534226).length - 1)));
+ if (!!((ConstSet5[nextStrChar_637534294] != undefined))) Temporary4 = false; else { Temporary4 = !((nextStrChar_637534294 == nextPatternChar_637534293)); } onBoundary_637534292 = Temporary4;
+ }
+
+ if (onBoundary_637534292) {
+ scoreState_637534230 = 20;
+ score_637534236 = addInt(score_637534236, scoreState_637534230);
+ }
+
+ break;
+ case -1:
+ case -3:
+ if (!((ConstSet6[str_637534226.charCodeAt(chckIndx(subInt(strIndex_637534234, 1), 0, (str_637534226).length - 1))] != undefined))) Temporary5 = true; else { if (!(ConstSet7[str_637534226.charCodeAt(chckIndx(subInt(strIndex_637534234, 1), 0, (str_637534226).length - 1))] != undefined)) Temporary6 = false; else { Temporary6 = (ConstSet8[str_637534226.charCodeAt(chckIndx(strIndex_637534234, 0, (str_637534226).length - 1))] != undefined); } Temporary5 = Temporary6; } var isLeadingChar_637534318 = Temporary5;
+ if (isLeadingChar_637534318) {
+ scoreState_637534230 = 10;
+ }
+ else {
+ scoreState_637534230 = 0;
+ score_637534236 = addInt(score_637534236, scoreState_637534230);
+ }
+
+ break;
+ }
+ patIndex_637534235 = addInt(patIndex_637534235, 1);
+ }
+ else {
+ switch (scoreState_637534230) {
+ case -100:
+ scoreState_637534230 = -3;
+ score_637534236 = addInt(score_637534236, scoreState_637534230);
+ break;
+ case 5:
+ scoreState_637534230 = -1;
+ score_637534236 = addInt(score_637534236, scoreState_637534230);
+ consecutiveMatchCount_637534233 = 0;
+ break;
+ case -3:
+ if ((unmatchedLeadingCharCount_637534232 < 3)) {
+ scoreState_637534230 = -3;
+ score_637534236 = addInt(score_637534236, scoreState_637534230);
+ }
+
+ unmatchedLeadingCharCount_637534232 = addInt(unmatchedLeadingCharCount_637534232, 1);
+ break;
+ default:
+ scoreState_637534230 = -1;
+ score_637534236 = addInt(score_637534236, scoreState_637534230);
+ break;
+ }
+ }
+
+ strIndex_637534234 = addInt(strIndex_637534234, 1);
+ } while (false);
+ }
+ } while (false);
+ if (!(patIndex_637534235 == ((pattern_637534225) == null ? 0 : (pattern_637534225).length))) Temporary7 = false; else { if ((strIndex_637534234 == ((str_637534226) == null ? 0 : (str_637534226).length))) Temporary8 = true; else { Temporary8 = !((ConstSet9[str_637534226.charCodeAt(chckIndx(strIndex_637534234, 0, (str_637534226).length - 1))] != undefined)); } Temporary7 = Temporary8; } if (Temporary7) {
+ score_637534236 = addInt(score_637534236, 10);
+ }
+
+ var colontmp__486540180 = nimMax(0, score_637534236);
+ var colontmp__486540181 = (0 < score_637534236);
+ result_637534229 = nimCopy(result_637534229, {Field0: colontmp__486540180, Field1: colontmp__486540181}, NTI637534222);
+
+ return result_637534229;
+
+}
+
+function escapeCString_486539957(x_486539958, x_486539958_Idx) {
+ var s_486539959 = [];
+ Label1: do {
+ var c_486539960 = 0;
+ var iHEX60gensym6_486540184 = 0;
+ var nHEX60gensym6_486540185 = ((x_486539958[x_486539958_Idx]) == null ? 0 : (x_486539958[x_486539958_Idx]).length);
+ Label2: do {
+ Label3: while (true) {
+ if (!(iHEX60gensym6_486540184 < nHEX60gensym6_486540185)) break Label3;
+ c_486539960 = x_486539958[x_486539958_Idx].charCodeAt(chckIndx(iHEX60gensym6_486540184, 0, (x_486539958[x_486539958_Idx]).length - 1));
+ switch (c_486539960) {
+ case 60:
+ s_486539959.push.apply(s_486539959, makeNimstrLit("<"));;
+ break;
+ case 62:
+ s_486539959.push.apply(s_486539959, makeNimstrLit(">"));;
+ break;
+ default:
+ addChar(s_486539959, c_486539960);;
+ break;
+ }
+ iHEX60gensym6_486540184 = addInt(iHEX60gensym6_486540184, 1);
+ }
+ } while (false);
+ } while (false);
+ x_486539958[x_486539958_Idx] = toJSStr(s_486539959);
+
+
+}
+
+function text_486539322(s_486539323) {
+ var result_486539324 = null;
+
+ result_486539324 = document.createTextNode(toJSStr(s_486539323));
+
+ return result_486539324;
+
+}
+
+function dosearch_486539961(value_486539962) {
+
+function HEX3Aanonymous_486540018(a_486540023, b_486540024) {
+ var result_486540029 = 0;
+
+ result_486540029 = subInt(b_486540024["Field1"], a_486540023["Field1"]);
+
+ return result_486540029;
+
+ }
+
+ var result_486539963 = null;
+
+ if (((db_486539953[0]).length == 0)) {
+ var stuff_486539967 = null;
+ var request = new XMLHttpRequest();
+ request.open("GET", "theindex.html", false);
+ request.send(null);
+
+ var doc = document.implementation.createHTMLDocument("theindex");
+ doc.documentElement.innerHTML = request.responseText;
+
+ //parser=new DOMParser();
+ //doc=parser.parseFromString("", "text/html");
+
+ stuff_486539967 = doc.documentElement;
+
+ db_486539953[0] = nimCopy(null, stuff_486539967.getElementsByClassName("reference"), NTI620757436);
+ contents_486539954[0] = nimCopy(null, [], NTI486539805);
+ Label1: do {
+ var ahref_486539992 = null;
+ var i_486540165 = 0;
+ var L_486540166 = (db_486539953[0]).length;
+ Label2: do {
+ Label3: while (true) {
+ if (!(i_486540165 < L_486540166)) break Label3;
+ ahref_486539992 = db_486539953[0][chckIndx(i_486540165, 0, (db_486539953[0]).length - 1)];
+ contents_486539954[0].push(ahref_486539992.getAttribute("data-doc-search-tag"));;
+ i_486540165 = addInt(i_486540165, 1);
+ if (!(((db_486539953[0]).length == L_486540166))) {
+ failedAssertImpl_218103864(makeNimstrLit("iterators.nim(240, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+ }
+
+ }
+ } while (false);
+ } while (false);
+ }
+
+ var ul_486539997 = tree_486539271(makeNimstrLit("UL"), []);
+ result_486539963 = tree_486539271(makeNimstrLit("DIV"), []);
+ setClass_486539319(result_486539963, makeNimstrLit("search_results"));
+ var matches_486540002 = [];
+ Label4: do {
+ var i_486540010 = 0;
+ var colontmp__486540170 = 0;
+ colontmp__486540170 = (db_486539953[0]).length;
+ var i_486540171 = 0;
+ Label5: do {
+ Label6: while (true) {
+ if (!(i_486540171 < colontmp__486540170)) break Label6;
+ i_486540010 = i_486540171;
+ Label7: do {
+ var c_486540011 = contents_486539954[0][chckIndx(i_486540010, 0, (contents_486539954[0]).length - 1)];
+ if (((c_486540011 == "Examples") || (c_486540011 == "PEG construction"))) {
+ break Label7;
+ }
+
+ var colontmp__486540177 = fuzzyMatch_637534224(value_486539962, c_486540011);
+ var score_486540012 = colontmp__486540177["Field0"];
+ var matched_486540013 = colontmp__486540177["Field1"];
+ if (matched_486540013) {
+ matches_486540002.push({Field0: db_486539953[0][chckIndx(i_486540010, 0, (db_486539953[0]).length - 1)], Field1: score_486540012});;
+ }
+
+ } while (false);
+ i_486540171 = addInt(i_486540171, 1);
+ }
+ } while (false);
+ } while (false);
+ matches_486540002.sort(HEX3Aanonymous_486540018);
+ Label8: do {
+ var i_486540046 = 0;
+ var colontmp__486540174 = 0;
+ colontmp__486540174 = nimMin((matches_486540002).length, 29);
+ var i_486540175 = 0;
+ Label9: do {
+ Label10: while (true) {
+ if (!(i_486540175 < colontmp__486540174)) break Label10;
+ i_486540046 = i_486540175;
+ matches_486540002[chckIndx(i_486540046, 0, (matches_486540002).length - 1)]["Field0"].innerHTML = matches_486540002[chckIndx(i_486540046, 0, (matches_486540002).length - 1)]["Field0"].getAttribute("data-doc-search-tag");
+ escapeCString_486539957(matches_486540002[chckIndx(i_486540046, 0, (matches_486540002).length - 1)]["Field0"], "innerHTML");
+ add_486539315(ul_486539997, tree_486539271(makeNimstrLit("LI"), [matches_486540002[chckIndx(i_486540046, 0, (matches_486540002).length - 1)]["Field0"]]));
+ i_486540175 = addInt(i_486540175, 1);
+ }
+ } while (false);
+ } while (false);
+ if ((ul_486539997.childNodes.length == 0)) {
+ add_486539315(result_486539963, tree_486539271(makeNimstrLit("B"), [text_486539322(makeNimstrLit("no search results"))]));
+ }
+ else {
+ add_486539315(result_486539963, tree_486539271(makeNimstrLit("B"), [text_486539322(makeNimstrLit("search results"))]));
+ add_486539315(result_486539963, ul_486539997);
+ }
+
+
+ return result_486539963;
+
+}
+
+function search() {
+
+function wrapper_486540131() {
+ var elem_486540132 = document.getElementById("searchInput");
+ var value_486540133 = elem_486540132.value;
+ if (!((((value_486540133) == null ? 0 : (value_486540133).length) == 0))) {
+ if ((oldtoc_486540119[0] == null)) {
+ oldtoc_486540119[0] = document.getElementById("tocRoot");
+ }
+
+ var results_486540137 = dosearch_486539961(value_486540133);
+ replaceById_486539330("tocRoot", results_486540137);
+ }
+ else {
+ if (!((oldtoc_486540119[0] == null))) {
+ replaceById_486539330("tocRoot", oldtoc_486540119[0]);
+ }
+ }
+
+
+ }
+
+ if (!((timer_486540120[0] == null))) {
+ clearTimeout(timer_486540120[0]);
+ }
+
+ timer_486540120[0] = setTimeout(wrapper_486540131, 400);
+
+
+}
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..5ba945b
--- /dev/null
+++ b/index.html
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+ Please follow this link .
+
+
\ No newline at end of file
diff --git a/nimdoc.out.css b/nimdoc.out.css
new file mode 100644
index 0000000..4abea9c
--- /dev/null
+++ b/nimdoc.out.css
@@ -0,0 +1,1016 @@
+/*
+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;
+}
+
+[data-theme="dark"] {
+ --primary-background: #171921;
+ --secondary-background: #1e202a;
+ --third-background: #2b2e3b;
+ --info-background: #008000;
+ --warning-background: #807000;
+ --error-background: #c03000;
+ --border: #0e1014;
+ --text: #fff;
+ --anchor: #8be9fd;
+ --anchor-focus: #8be9fd;
+ --input-focus: #8be9fd;
+ --strong: #bd93f9;
+ --hint: #7A7C85;
+ --nim-sprite-base64: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARMAAABMCAYAAABOBlMuAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjE4OjIyKzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDplZGViMzU3MC1iNmZjLWQy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");
+
+ --keyword: #ff79c6;
+ --identifier: #f8f8f2;
+ --comment: #6272a4;
+ --operator: #ff79c6;
+ --punctuation: #f8f8f2;
+ --other: #f8f8f2;
+ --escapeSequence: #bd93f9;
+ --number: #bd93f9;
+ --literal: #f1fa8c;
+ --program: #9090c0;
+ --option: #90b010;
+ --raw-data: #8be9fd;
+}
+
+.theme-switch-wrapper {
+ display: flex;
+ align-items: center;
+}
+
+.theme-switch-wrapper em {
+ margin-left: 10px;
+ font-size: 1rem;
+}
+
+.theme-switch {
+ display: inline-block;
+ height: 22px;
+ position: relative;
+ width: 50px;
+}
+
+.theme-switch input {
+ display: none;
+}
+
+.slider {
+ background-color: #ccc;
+ bottom: 0;
+ cursor: pointer;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ transition: .4s;
+}
+
+.slider:before {
+ background-color: #fff;
+ bottom: 4px;
+ content: "";
+ height: 13px;
+ left: 4px;
+ position: absolute;
+ transition: .4s;
+ width: 13px;
+}
+
+input:checked + .slider {
+ background-color: #66bb6a;
+}
+
+input:checked + .slider:before {
+ transform: translateX(26px);
+}
+
+.slider.round {
+ border-radius: 17px;
+}
+
+.slider.round:before {
+ border-radius: 50%;
+}
+
+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%;
+}
+
+.column:first-child,
+.columns:first-child {
+ margin-left: 0; }
+
+.three.columns {
+ width: 22%;
+}
+
+.nine.columns {
+ width: 77.0%; }
+
+.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.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;
+}
+
+.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;
+}
+
+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; }
+
+.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: 3em;
+ padding: 1em;
+ border: 1px solid #4d4d4d;
+}
+
+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/regex.html b/regex.html
new file mode 100644
index 0000000..a8ddc23
--- /dev/null
+++ b/regex.html
@@ -0,0 +1,1348 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex
+
+
+
+
+
+
+
+
+
+
+
src/regex
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
A library for parsing, compiling, and executing regular expressions. The match time is linear in the length of the text and the regular expression. So, it can handle input from untrusted users. The syntax is similar to PCRE but lacks a few features that can not be implemented while keeping the space/time complexity guarantees, ex: backreferences.
+
+
. any character except new line ( includes new line with s flag )
+\ d digit ( \ p { Nd } )
+\ D not digit
+\ pN One - letter name Unicode character class
+\ p { Greek } Unicode character class ( general category or script )
+\ PN Negated one - letter name Unicode character class
+\ P { Greek } negated Unicode character class ( general category or script )
+
[ xyz ] A character class matching either x , y or z ( union ) .
+[ ^ xyz ] A character class matching any character except x , y and z .
+[ a - z ] A character class matching any character in range a - z .
+[ [ : alpha : ] ] ASCII character class ( [ A - Za - z ] )
+[ [ : ^ alpha : ] ] Negated ASCII character class ( [ ^ A - Za - z ] )
+[ \ [ \ ] ] Escaping in character classes ( matching [ or ] )
+
xy concatenation ( x followed by y )
+x | y alternation ( x or y , prefer x )
+
x * zero or more of x ( greedy )
+x + one or more of x ( greedy )
+x ? zero or one of x ( greedy )
+x *? zero or more of x ( ungreedy / lazy )
+x +? one or more of x ( ungreedy / lazy )
+x ?? zero or one of x ( ungreedy / lazy )
+x { n , m } at least n x and at most m x ( greedy )
+x { n , } at least n x ( greedy )
+x { n } exactly n x
+x { n , m } ? at least n x and at most m x ( ungreedy / lazy )
+x { n , } ? at least n x ( ungreedy / lazy )
+x { n } ? exactly n x
+
^ the beginning of text ( or start - of - line with multi - line mode )
+$ the end of text ( or end - of - line with multi - line mode )
+\ A only the beginning of text ( even with multi - line mode enabled )
+\ z only the end of text ( even with multi - line mode enabled )
+\ b a Unicode word boundary ( \ w on one side and \ W , \ A , or \ z on other )
+\ B not a Unicode word boundary
+
( exp ) numbered capture group ( indexed by opening parenthesis )
+( ? P < name > exp ) named ( also numbered ) capture group ( allowed chars : [ _0 - 9 a - zA - Z ] )
+( ?: exp ) non - capturing group
+( ? flags ) set flags within current group
+( ? flags : exp ) set flags for exp ( non - capturing ) Flags are each a single character. For example, (?x) sets the flag x and (?-x) clears the flag x. Multiple flags can be set or cleared at the same time: (?xy) sets both the x and y flags, (?x-y) sets the x flag and clears the y flag, and (?-xy) clears both the x and y flags.
+
i case - insensitive : letters match both upper and lower case
+m multi - line mode : ^ and $ match begin / end of line
+s allow . to match \ L ( new line )
+U swap the meaning of x * and x *? ( un - greedy mode )
+u Unicode support ( enabled by default )
+x ignore whitespace and allow line comments ( starting with All flags are disabled by default unless stated otherwise
+
The regex accepts passing a set of flags:
+
regexCaseless same as ( ? i )
+regexMultiline same as ( ? m )
+regexDotAll same as ( ? s )
+regexUngreedy same as ( ? U )
+regexAscii same as ( ?- u )
+regexExtended same as ( ? x )
+regexArbitraryBytes treat both the regex and the input text
+ as arbitrary byte sequences Note:
+Read the
Match arbitrary bytes section to learn more about the arbitrary bytes mode and ascii mode
+
+
\* literal * , works for any punctuation character : \.+*? ( ) | [ ] { } ^$
+\ a bell ( \ x07 )
+\ f form feed ( \ x0C )
+\ t horizontal tab
+\ n new line ( \ L )
+\ r carriage return
+\ v vertical tab ( \ x0B )
+\ 123 octal character code ( up to three digits )
+\ x7F hex character code ( exactly two digits )
+\ x { 10 FFFF } any hex character code corresponding to a Unicode code point
+\ u007F hex character code ( exactly four digits )
+\ U0010FFFF hex character code ( exactly eight digits )
+
These classes are based on the definitions provided in UTS#18
+
\ d digit ( \ p { Nd } )
+\ D not digit
+\ s whitespace ( \ p { White_Space } )
+\ S not whitespace
+\ w word character ( \ p { Alphabetic } + \ p { M } + \ d + \ p { Pc } + \ p { Join_Control } )
+\ W not word character
+
[ [ : alnum : ] ] alphanumeric ( [ 0 - 9 A - Za - z ] )
+[ [ : alpha : ] ] alphabetic ( [ A - Za - z ] )
+[ [ : ascii : ] ] ASCII ( [ \ x00 -\ x7F ] )
+[ [ : blank : ] ] blank ( [ \ t ] )
+[ [ : cntrl : ] ] control ( [ \ x00 -\ x1F \ x7F ] )
+[ [ : digit : ] ] digits ( [ 0 - 9 ] )
+[ [ : graph : ] ] graphical ( [ !-~ ] )
+[ [ : lower : ] ] lower case ( [ a - z ] )
+[ [ : print : ] ] printable ( [ -~ ] )
+[ [ : punct : ] ] punctuation ( [ !-/:-@\ [ - ` { -~ ] )
+[ [ : space : ] ] whitespace ( [ \ t \ n \ v \ f \ r ] )
+[ [ : upper : ] ] upper case ( [ A - Z ] )
+[ [ : word : ] ] word characters ( [ 0 - 9 A - Za - z_ ] )
+[ [ : xdigit : ] ] hex digit ( [ 0 - 9 A - Fa - f ] )
+
( ?= regex ) A positive lookahead assertion
+( ?! regex ) A negative lookahead assertion
+( ?<= regex ) A positive lookbehind assertion
+( ?<! regex ) A negative lookbehind assertion Any regex expression is a valid lookaround; groups are captured as well. Beware, lookarounds containing repetitions (* , + , and {n,} ) may run in polynomial time.
+
+
+
The match function match a text from start to end, similar to ^regex$ . This means the whole text needs to match the regex for this function to return true .
+
let text = "nim c --styleCheck:hint --colors:off regex.nim"
+var m = RegexMatch2 ( )
+if match ( text , re2"nim c (?:--(\w+:\w+) *)+ (\w+).nim" , m ) :
+ doAssert text [ m . group ( 0 ) ] == "colors:off"
+ doAssert text [ m . group ( 1 ) ] == "regex"
+else :
+ doAssert false , "no match"
+
Like most other regex engines, this library only captures the last repetition in a repeated group (* , + , {n} ). Note how in the previous example both styleCheck:hint and colors:off are matched in the same group but only the last captured match (colors:off ) is returned.
+
To check if a capture group did match you can use reNonCapture . For example doAssert m.group(0) != reNonCapture . This is useful to disambiguate empty captures and non-matched captures. Since both return an empty string when slicing the text.
+
The space complexity for captures is O(regex_len * groups_count) , and so it can be used to match untrusted text.
+
+
The find function will find the first piece of text that match a given regex.
+
let text = """
+The Continental's email list:
+john_wick@continental.com
+winston@continental.com
+ms_perkins@continental.com
+"""
+var match = ""
+var capture = ""
+var m = RegexMatch2 ( )
+if find ( text , re2"(\w+)@\w+\.\w+" , m ) :
+ match = text [ m . boundaries ]
+ capture = text [ m . group ( 0 ) ]
+doAssert match == "john_wick@continental.com"
+doAssert capture == "john_wick"
+
The findAll function will find all pieces of text that match a given regex, returning their boundaries and captures/submatches.
+
let text = """
+The Continental's email list:
+john_wick@continental.com
+winston@continental.com
+ms_perkins@continental.com
+"""
+var matches = newSeq [ string ] ( )
+var captures = newSeq [ string ] ( )
+for m in findAll ( text , re2"(\w+)@\w+\.\w+" ) :
+ matches . add text [ m . boundaries ]
+ captures . add text [ m . group ( 0 ) ]
+doAssert matches == @ [
+ "john_wick@continental.com" ,
+ "winston@continental.com" ,
+ "ms_perkins@continental.com"
+]
+doAssert captures == @ [ "john_wick" , "winston" , "ms_perkins" ]
+
Verbose mode ( ? x ) makes regexes more readable by allowing comments and multi-lines within the regular expression itself. The caveat is spaces and pound signs must be scaped to be matched.
+
const exp = re2"""(?x)
+\# # the hashtag
+\w+ # hashtag words
+"""
+let text = "#NimLang"
+doAssert match ( text , exp )
+
The match macro is sometimes more convenient, and faster than the function version. It will run a full match on the whole string, similar to ^ regex $ .
+
A matches: seq[string] variable is injected into the scope, and it contains the submatches for every capture group.
+
var matched = false
+let text = "[my link](https://example.com)"
+match text , rex"\[([^\]]+)\]\((https?://[^)]+)\)" :
+ doAssert matches == @ [ "my link" , "https://example.com" ]
+ matched = true
+doAssert matched
+
UTF-8 validation on the input text is only done in debug mode for perf reasons. The behaviour on invalid UTF-8 input (i.e: malformed, corrupted, truncated, etc) when compiling in release/danger mode is currently undefined, and it will likely result in an internal AssertionDefect or some other error.
+
What can be done about this is validating the input text to avoid passing invalid input to the match function.
+
import unicode
+
+doAssert validateUtf8 ( "abc" ) == - 1
+
+doAssert validateUtf8 ( " \xf8 \xa1 \xa1 \xa1 \xa1 " ) != - 1 Note at the time of writting this, Nim's validateUtf8 is not strict enough and so you are better off using nim-unicodeplus's verifyUtf8 function.
+
+
Setting the regexArbitraryBytes flag will treat both the regex and the input text as byte sequences. This flag makes ascii mode the default.
+
Note:
+Do not confuse this with ascii mode. Setting the regex to ascii mode (?-u) alone is not enough to match arbitrary bytes, since both the input and regex will be treated as UTF8.
+
const flags = { regexArbitraryBytes }
+doAssert match ( " \xff " , re2 ( r"\xff" , flags ) )
+doAssert match ( " \xf8 \xa1 \xa1 \xa1 \xa1 " , re2 ( r".+" , flags ) ) Beware of (un)expected behaviour when mixin UTF-8 characters.
+
const flags = { regexArbitraryBytes }
+doAssert match ( "Ⓐ" , re2 ( r"Ⓐ" , flags ) )
+doAssert match ( "ⒶⒶ" , re2 ( r"(Ⓐ)+" , flags ) )
+doAssert not match ( "ⒶⒶ" , re2 ( r"Ⓐ+" , flags ) ) The last line in the above example won't match because the regex is parsed as a byte sequence. The Ⓐ character is composed of multiple bytes (\xe2\x92\xb6 ), and only the last byte is affected by the + operator.
+
+
Passing a regex literal or assigning it to a const will compile the regex at compile time. Errors in the expression will be catched at compile time this way.
+
Do not confuse the regex compilation with the matching operation. The following examples do the matching at runtime. But matching at compile-time is supported as well.
+
let text = "abc"
+block :
+ const rexp = re2".+"
+ doAssert match ( text , rexp )
+block :
+ doAssert match ( text , re2".+" )
+block :
+ func myFn ( s : string , exp : static string ) =
+ const rexp = re2 ( exp )
+ doAssert match ( s , rexp )
+ myFn ( text , r".+" ) Using a const can avoid confusion when passing flags:
+
let text = "abc"
+block :
+ const rexp = re2 ( r".+" , { regexDotAll } )
+ doAssert match ( text , rexp )
+block :
+ doAssert match ( text , re2 ( r".+" , { regexDotAll } ) )
+block :
+
+
+ let flags = { regexDotAll }
+ doAssert match ( text , re2 ( r".+" , flags ) )
+
+
Most of the time compiling the regex at runtime can be avoided, and it should be avoided. Nim has really good compile-time capabilities like reading files, constructing strings, and so on. However, it cannot be helped in cases where the regex is passed to the program at runtime (from terminal input, network, or text files).
+
To compile the regex at runtime pass the regex expression as a var/let .
+
let text = "abc"
+block :
+ var rexp = r".+"
+ doAssert match ( text , re2 ( rexp ) )
+block :
+ let rexp = r".+"
+ doAssert match ( text , re2 ( rexp ) )
+block :
+ func myFn ( s : string , exp : string ) =
+ doAssert match ( s , re2 ( exp ) )
+ myFn ( text , r".+" )
+
+
+
+regex/types , regex/common , regex/compiler , regex/nfatype , regex/nfafindall , regex/nfafindall2 , regex/nfamatch , regex/nfamatch2 , regex/litopt , regex/nfamacro , regex/parser , regex/exptransformation , regex/dotgraph
+
+
+
+
+
+
+
func contains ( s : string ; pattern : Regex ) : bool {.... raises : [ ] ,
+ deprecated : "use contains(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use contains(string, Regex2) instead
+
+
+
+
+
+
+
+
func contains ( s : string ; pattern : Regex2 ) : bool {.... raises : [ ] , tags : [ RootEffect ] .}
+
+
+
+Example:
+doAssert re2"bc" in "abcd"
+doAssert re2"(23)+" in "23232"
+doAssert re2"^(23)+$" notin "23232"
+
+
+
+
+
func endsWith ( s : string ; pattern : Regex ) : bool {.... raises : [ ] ,
+ deprecated : "use endsWith(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use endsWith(string, Regex2) instead
+
+
+
+
+
+
+
+
func endsWith ( s : string ; pattern : Regex2 ) : bool {.... raises : [ ] , tags : [ RootEffect ] .}
+
+
+return whether the string ends with the pattern or not
+Example:
+doAssert "abc" . endsWith ( re2"\w" )
+doAssert not "abc" . endsWith ( re2"\d" )
+
+
+
+
+
func escapeRe ( s : string ) : string {.... raises : [ ] , tags : [ ] .}
+
+
+Escape special regex characters in s so that it can be matched verbatim
+
+
+
+
+
func find ( s : string ; pattern : Regex2 ; m : var RegexMatch2 ; start = 0 ) : bool {.
+ ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+search through the string looking for the first location where there is a match
+Example:
+var m = RegexMatch2 ( )
+doAssert "abcd" . find ( re2"bc" , m ) and
+ m . boundaries == 1 .. 2
+doAssert not "abcd" . find ( re2"de" , m )
+doAssert "2222" . find ( re2"(22)*" , m ) and
+ m . group ( 0 ) == 2 .. 3
+
+
+
+
+
func find ( s : string ; pattern : Regex ; m : var RegexMatch ; start = 0 ) : bool {.
+ ... raises : [ ] , deprecated : "use find(string, Regex2, var RegexMatch2) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use find(string, Regex2, var RegexMatch2) instead
+
+
+
+
+
+
+
+
func findAll ( s : string ; pattern : Regex2 ; start = 0 ) : seq [ RegexMatch2 ] {.
+ ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+
+
+
+
+
+
func findAll ( s : string ; pattern : Regex ; start = 0 ) : seq [ RegexMatch ] {.
+ ... raises : [ ] , deprecated : "use findAll(string, Regex2) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use findAll(string, Regex2) instead
+
+
+
+
+
+
+
+
func findAllBounds ( s : string ; pattern : Regex2 ; start = 0 ) : seq [ Slice [ int ] ] {.
+ ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+
+
+
+
+
+
func findAllBounds ( s : string ; pattern : Regex ; start = 0 ) : seq [ Slice [ int ] ] {.
+ ... raises : [ ] , deprecated : "use findAllBounds(string, Regex2) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use findAllBounds(string, Regex2) instead
+
+
+
+
+
+
+
+
func findAndCaptureAll ( s : string ; pattern : Regex ) : seq [ string ] {.... raises : [ ] ,
+ deprecated : "use findAll(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use findAll(string, Regex2) instead
+
+
+
+
+
+
+
+
func group ( m : RegexMatch2 ; i : int ) : Slice [ int ] {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+return slice for a given group. Slice of start > end are empty matches (i.e.: re2"(\d?)" ) and they are included same as in PCRE.
+Example:
+let text = "abc"
+var m = RegexMatch2 ( )
+doAssert text . match ( re2"(\w)+" , m )
+doAssert text [ m . group ( 0 ) ] == "c"
+
+
+
+
+
func group ( m : RegexMatch2 ; s : string ) : Slice [ int ] {.inline , ... raises : [ KeyError ] ,
+ tags : [ ] .}
+
+
+return slices for a given named group
+Example:
+let text = "abc"
+var m = RegexMatch2 ( )
+doAssert text . match ( re2"(?P<foo>\w)+" , m )
+doAssert text [ m . group ( "foo" ) ] == "c"
+
+
+
+
+
func group ( m : RegexMatch ; groupName : string ; text : string ) : seq [ string ] {.
+ inline , ... raises : [ KeyError ] , deprecated , tags : [ ] .}
+
+
+ Deprecated
+
+
+
+
+
+
+
+
func group ( m : RegexMatch ; i : int ) : seq [ Slice [ int ] ] {.inline , ... raises : [ ] ,
+ deprecated : "use group(RegexMatch2, int)" , tags : [ ] .}
+
+
+ Deprecated: use group(RegexMatch2, int)
+
+
+
+
+
+
+
+
func group ( m : RegexMatch ; i : int ; text : string ) : seq [ string ] {.inline ,
+ ... raises : [ ] , deprecated , tags : [ ] .}
+
+
+ Deprecated
+
+
+
+
+
+
+
+
func group ( m : RegexMatch ; s : string ) : seq [ Slice [ int ] ] {.inline ,
+ ... raises : [ KeyError ] , deprecated : "use group(RegexMatch2, string)" , tags : [ ] .}
+
+
+ Deprecated: use group(RegexMatch2, string)
+
+
+
+
+
+
+
+
func groupFirstCapture ( m : RegexMatch ; groupName : string ; text : string ) : string {.
+ inline , ... raises : [ KeyError ] , deprecated , tags : [ ] .}
+
+
+ Deprecated
+
+
+
+
+
+
+
+
func groupFirstCapture ( m : RegexMatch ; i : int ; text : string ) : string {.inline ,
+ ... raises : [ ] , deprecated , tags : [ ] .}
+
+
+ Deprecated
+
+
+
+
+
+
+
+
func groupLastCapture ( m : RegexMatch ; groupName : string ; text : string ) : string {.
+ inline , ... raises : [ KeyError ] ,
+ deprecated : "use group(RegexMatch2, string) instead" , tags : [ ] .}
+
+
+ Deprecated: use group(RegexMatch2, string) instead
+
+
+
+
+
+
+
+
func groupLastCapture ( m : RegexMatch ; i : int ; text : string ) : string {.inline ,
+ ... raises : [ ] , deprecated : "use group(RegexMatch2, int) instead" , tags : [ ] .}
+
+
+ Deprecated: use group(RegexMatch2, int) instead
+
+
+
+
+
+
+
+
func groupNames ( m : RegexMatch ) : seq [ string ] {.inline , ... raises : [ ] ,
+ deprecated : "use groupNames(RegexMatch2)" , tags : [ ] .}
+
+
+ Deprecated: use groupNames(RegexMatch2)
+
+
+
+
+
+
+
+
func groupNames ( m : RegexMatch2 ) : seq [ string ] {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+return the names of capturing groups.
+Example:
+let text = "hello world"
+var m = RegexMatch2 ( )
+doAssert text . match ( re2"(?P<greet>hello) (?P<who>world)" , m )
+doAssert m . groupNames == @ [ "greet" , "who" ]
+
+
+
+
+
func groupsCount ( m : RegexMatch ) : int {.inline , ... raises : [ ] , deprecated : "use groupsCount(RegexMatch2)" ,
+ tags : [ ] .}
+
+
+ Deprecated: use groupsCount(RegexMatch2)
+
+
+
+
+
+
+
+
func groupsCount ( m : RegexMatch2 ) : int {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+return the number of capturing groups
+Example:
+var m = RegexMatch2 ( )
+doAssert "ab" . match ( re2"(a)(b)" , m )
+doAssert m . groupsCount == 2
+
+
+
+
+
func isInitialized ( re : Regex ) : bool {.inline , ... raises : [ ] , deprecated : "use isInitialized(Regex2) instead" ,
+ tags : [ ] .}
+
+
+ Deprecated: use isInitialized(Regex2) instead
+
+
+
+
+
+
+
+
func isInitialized ( re : Regex2 ) : bool {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+Check whether the regex has been initialized
+Example:
+var re : Regex2
+doAssert not re . isInitialized
+re = re2"foo"
+doAssert re . isInitialized
+
+
+
+
+
func match ( s : string ; pattern : Regex ) : bool {.... raises : [ ] ,
+ deprecated : "use match(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use match(string, Regex2) instead
+
+
+
+
+
+
+
+
func match ( s : string ; pattern : Regex2 ) : bool {.... raises : [ ] , tags : [ RootEffect ] .}
+
+
+
+
+
+
+
+
func match ( s : string ; pattern : Regex2 ; m : var RegexMatch2 ; start = 0 ) : bool {.
+ ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+return a match if the whole string matches the regular expression. This is similar to find(text, re"^regex$", m) but has better performance
+Example:
+var m = RegexMatch2 ( )
+doAssert "abcd" . match ( re2"abcd" , m )
+doAssert not "abcd" . match ( re2"abc" , m )
+
+
+
+
+
func match ( s : string ; pattern : Regex ; m : var RegexMatch ; start = 0 ) : bool {.
+ ... raises : [ ] ,
+ deprecated : "use match(string, Regex2, var RegexMatch2) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use match(string, Regex2, var RegexMatch2) instead
+
+
+
+
+
+
+
+
func re ( s : static string ) : static [ Regex ] {.
+ ... deprecated : "use re2(static string) instead" .}
+
+
+ Deprecated: use re2(static string) instead
+
+
+
+
+
+
+
+
func re ( s : string ) : Regex {.... raises : [ RegexError ] ,
+ deprecated : "use re2(string) instead" , tags : [ ] .}
+
+
+ Deprecated: use re2(string) instead
+
+
+
+
+
+
+
+
func re2 ( s : static string ; flags : static RegexFlags = { } ) : static [ Regex2 ]
+
+
+Parse and compile a regular expression at compile-time
+
+
+
+
+
func re2 ( s : string ; flags : RegexFlags = { } ) : Regex2 {.... raises : [ RegexError ] ,
+ tags : [ ] .}
+
+
+Parse and compile a regular expression at run-time
+Example:
+let abcx = re2"abc\w"
+let abcx2 = re2 ( r"abc\w" )
+let pat = r"abc\w"
+let abcx3 = re2 ( pat )
+
+
+
+
+
func replace ( s : string ; pattern : Regex2 ;
+ by : proc ( m : RegexMatch2 ; s : string ) : string ; limit = 0 ) : string {.
+ ... raises : [ ] , effectsOf : by , ... tags : [ RootEffect ] .}
+
+
+Replace matched substrings.
+If limit is given, at most limit replacements are done. limit of 0 means there is no limit
+
+Example:
+proc removeStars ( m : RegexMatch2 , s : string ) : string =
+ result = s [ m . group ( 0 ) ]
+ if result == "*" :
+ result = ""
+let text = "**this is a test**"
+doAssert text . replace ( re2"(\*)" , removeStars ) == "this is a test"
+
+
+
+
+
func replace ( s : string ; pattern : Regex2 ; by : string ; limit = 0 ) : string {.
+ ... raises : [ ValueError ] , tags : [ RootEffect ] .}
+
+
+Replace matched substrings.
+Matched groups can be accessed with $N notation, where N is the group's index, starting at 1 (1-indexed). $$ means literal $ .
+If limit is given, at most limit replacements are done. limit of 0 means there is no limit
+
+Example:
+doAssert "aaa" . replace ( re2"a" , "b" , 1 ) == "baa"
+doAssert "abc" . replace ( re2"(a(b)c)" , "m($1) m($2)" ) ==
+ "m(abc) m(b)"
+doAssert "Nim is awesome!" . replace ( re2"(\w\B)" , "$1_" ) ==
+ "N_i_m i_s a_w_e_s_o_m_e!"
+
+
+
+
+
func replace ( s : string ; pattern : Regex ;
+ by : proc ( m : RegexMatch ; s : string ) : string ; limit = 0 ) : string {.
+ ... raises : [ ] , effectsOf : by , ... deprecated : "use replace(string, Regex2, proc(RegexMatch2, string): string) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use replace(string, Regex2, proc(RegexMatch2, string): string) instead
+
+
+
+
+
+
+
+
func replace ( s : string ; pattern : Regex ; by : string ; limit = 0 ) : string {.
+ ... raises : [ ValueError ] ,
+ deprecated : "use replace(string, Regex2, string) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use replace(string, Regex2, string) instead
+
+
+
+
+
+
+
+
func rex ( s : string ) : RegexLit {.... raises : [ ] , tags : [ ] .}
+
+
+Raw regex literal string
+
+
+
+
+
func split ( s : string ; sep : Regex ) : seq [ string ] {.... raises : [ ] ,
+ deprecated : "use split(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use split(string, Regex2) instead
+
+
+
+
+
+
+
+
func split ( s : string ; sep : Regex2 ) : seq [ string ] {.... raises : [ ] , tags : [ RootEffect ] .}
+
+
+return not matched substrings
+Example:
+doAssert split ( "11a22Ϊ33Ⓐ44弢55" , re2"\d+" ) ==
+ @ [ "" , "a" , "Ϊ" , "Ⓐ" , "弢" , "" ]
+
+
+
+
+
func splitIncl ( s : string ; sep : Regex ) : seq [ string ] {.... raises : [ ] ,
+ deprecated : "use splitIncl(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use splitIncl(string, Regex2) instead
+
+
+
+
+
+
+
+
func splitIncl ( s : string ; sep : Regex2 ) : seq [ string ] {.... raises : [ ] ,
+ tags : [ RootEffect ] .}
+
+
+return not matched substrings, including captured groups
+Example:
+let
+ parts = splitIncl ( "a,b" , re2"(,)" )
+ expected = @ [ "a" , "," , "b" ]
+doAssert parts == expected
+
+
+
+
+
func startsWith ( s : string ; pattern : Regex2 ; start = 0 ) : bool {.... raises : [ ] ,
+ tags : [ RootEffect ] .}
+
+
+return whether the string starts with the pattern or not
+Example:
+doAssert "abc" . startsWith ( re2"\w" )
+doAssert not "abc" . startsWith ( re2"\d" )
+
+
+
+
+
func startsWith ( s : string ; pattern : Regex ; start = 0 ) : bool {.... raises : [ ] ,
+ deprecated : "use startsWith(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use startsWith(string, Regex2) instead
+
+
+
+
+
+
+
+
func toPattern ( s : string ) : Regex {.... raises : [ RegexError ] ,
+ deprecated : "Use `re2(string)` instead" ,
+ tags : [ ] .}
+
+
+ Deprecated: Use `re2(string)` instead
+
+
+
+
+
+
+
+
+
+
+
+
+
iterator findAll ( s : string ; pattern : Regex2 ; start = 0 ) : RegexMatch2 {.inline ,
+ ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+search through the string and return each match. Empty matches (start > end) are included
+Example:
+let text = "abcabc"
+var bounds = newSeq [ Slice [ int ] ] ( )
+var found = newSeq [ string ] ( )
+for m in findAll ( text , re2"bc" ) :
+ bounds . add m . boundaries
+ found . add text [ m . boundaries ]
+doAssert bounds == @ [ 1 .. 2 , 4 .. 5 ]
+doAssert found == @ [ "bc" , "bc" ]
+
+
+
+
+
iterator findAll ( s : string ; pattern : Regex ; start = 0 ) : RegexMatch {.inline ,
+ ... raises : [ ] , deprecated : "use findAll(string, Regex2) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use findAll(string, Regex2) instead
+
+
+
+
+
+
+
+
iterator findAllBounds ( s : string ; pattern : Regex2 ; start = 0 ) : Slice [ int ] {.
+ inline , ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+search through the string and return each match. Empty matches (start > end) are included
+Example:
+let text = "abcabc"
+var bounds = newSeq [ Slice [ int ] ] ( )
+for bd in findAllBounds ( text , re2"bc" ) :
+ bounds . add bd
+doAssert bounds == @ [ 1 .. 2 , 4 .. 5 ]
+
+
+
+
+
iterator findAllBounds ( s : string ; pattern : Regex ; start = 0 ) : Slice [ int ] {.
+ inline , ... raises : [ ] , deprecated : "use findAllBounds(string, Regex2) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use findAllBounds(string, Regex2) instead
+
+
+
+
+
+
+
+
iterator group ( m : RegexMatch ; i : int ) : Slice [ int ] {.inline , ... raises : [ ] ,
+ deprecated , tags : [ ] .}
+
+
+ Deprecated
+
+
+
+
+
+
+
+
iterator group ( m : RegexMatch ; s : string ) : Slice [ int ] {.inline ,
+ ... raises : [ KeyError ] , deprecated , tags : [ ] .}
+
+
+ Deprecated
+
+
+
+
+
+
+
+
iterator split ( s : string ; sep : Regex ) : string {.inline , ... raises : [ ] ,
+ deprecated : "use split(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use split(string, Regex2) instead
+
+
+
+
+
+
+
+
iterator split ( s : string ; sep : Regex2 ) : string {.inline , ... raises : [ ] ,
+ tags : [ RootEffect ] .}
+
+
+return not matched substrings
+Example:
+var found = newSeq [ string ] ( )
+for s in split ( "11a22Ϊ33Ⓐ44弢55" , re2"\d+" ) :
+ found . add s
+doAssert found == @ [ "" , "a" , "Ϊ" , "Ⓐ" , "弢" , "" ]
+
+
+
+
+
+
+
+
+
+
macro match ( text : string ; regex : RegexLit ; body : untyped ) : untyped
+
+
+return a match if the whole string matches the regular expression. This is similar to the match function, but faster. Notice it requires a raw regex literal string as second parameter; the regex must be known at compile time, and cannot be a var/let/const
+A matches: seq[string] variable is injected into the scope, and it contains the submatches for every capture group. If a group is repeated (ex: ( \\ w ) + ), it will contain the last capture for that group.
+Note: Only available in Nim +1.1
+
+Example:
+match "abc" , rex"(a(b)c)" :
+ doAssert matches == @ [ "abc" , "b" ]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:18:19 UTC
+
+
+
+
+
+
+
diff --git a/regex.idx b/regex.idx
new file mode 100644
index 0000000..b876f39
--- /dev/null
+++ b/regex.idx
@@ -0,0 +1,80 @@
+reNonCapture regex.html#reNonCapture regex: reNonCapture
+rex regex.html#rex,string regex: rex(s: string): RegexLit
+re2 regex.html#re2,string,RegexFlags regex: re2(s: string; flags: RegexFlags = {}): Regex2
+re2 regex.html#re2,staticstring,staticRegexFlags regex: re2(s: static string; flags: static RegexFlags = {}): static[Regex2]
+group regex.html#group,RegexMatch2,int regex: group(m: RegexMatch2; i: int): Slice[int]
+group regex.html#group,RegexMatch2,string regex: group(m: RegexMatch2; s: string): Slice[int]
+groupsCount regex.html#groupsCount,RegexMatch2 regex: groupsCount(m: RegexMatch2): int
+groupNames regex.html#groupNames,RegexMatch2 regex: groupNames(m: RegexMatch2): seq[string]
+match regex.html#match.m,string,RegexLit,untyped regex: match(text: string; regex: RegexLit; body: untyped): untyped
+match regex.html#match,string,Regex2,RegexMatch2,int regex: match(s: string; pattern: Regex2; m: var RegexMatch2; start = 0): bool
+match regex.html#match,string,Regex2 regex: match(s: string; pattern: Regex2): bool
+findAll regex.html#findAll.i,string,Regex2,int regex: findAll(s: string; pattern: Regex2; start = 0): RegexMatch2
+findAll regex.html#findAll,string,Regex2,int regex: findAll(s: string; pattern: Regex2; start = 0): seq[RegexMatch2]
+findAllBounds regex.html#findAllBounds.i,string,Regex2,int regex: findAllBounds(s: string; pattern: Regex2; start = 0): Slice[int]
+findAllBounds regex.html#findAllBounds,string,Regex2,int regex: findAllBounds(s: string; pattern: Regex2; start = 0): seq[Slice[int]]
+find regex.html#find,string,Regex2,RegexMatch2,int regex: find(s: string; pattern: Regex2; m: var RegexMatch2; start = 0): bool
+contains regex.html#contains,string,Regex2 regex: contains(s: string; pattern: Regex2): bool
+split regex.html#split.i,string,Regex2 regex: split(s: string; sep: Regex2): string
+split regex.html#split,string,Regex2 regex: split(s: string; sep: Regex2): seq[string]
+splitIncl regex.html#splitIncl,string,Regex2 regex: splitIncl(s: string; sep: Regex2): seq[string]
+startsWith regex.html#startsWith,string,Regex2,int regex: startsWith(s: string; pattern: Regex2; start = 0): bool
+endsWith regex.html#endsWith,string,Regex2 regex: endsWith(s: string; pattern: Regex2): bool
+replace regex.html#replace,string,Regex2,string,int regex: replace(s: string; pattern: Regex2; by: string; limit = 0): string
+replace regex.html#replace,string,Regex2,proc(RegexMatch2,string),int regex: replace(s: string; pattern: Regex2;\n by: proc (m: RegexMatch2; s: string): string; limit = 0): string
+isInitialized regex.html#isInitialized,Regex2 regex: isInitialized(re: Regex2): bool
+escapeRe regex.html#escapeRe,string regex: escapeRe(s: string): string
+re regex.html#re,string regex: re(s: string): Regex
+re regex.html#re,staticstring regex: re(s: static string): static[Regex]
+toPattern regex.html#toPattern,string regex: toPattern(s: string): Regex
+group regex.html#group.i,RegexMatch,int regex: group(m: RegexMatch; i: int): Slice[int]
+group regex.html#group,RegexMatch,int regex: group(m: RegexMatch; i: int): seq[Slice[int]]
+group regex.html#group,RegexMatch,int,string regex: group(m: RegexMatch; i: int; text: string): seq[string]
+groupFirstCapture regex.html#groupFirstCapture,RegexMatch,int,string regex: groupFirstCapture(m: RegexMatch; i: int; text: string): string
+groupLastCapture regex.html#groupLastCapture,RegexMatch,int,string regex: groupLastCapture(m: RegexMatch; i: int; text: string): string
+group regex.html#group.i,RegexMatch,string regex: group(m: RegexMatch; s: string): Slice[int]
+group regex.html#group,RegexMatch,string regex: group(m: RegexMatch; s: string): seq[Slice[int]]
+group regex.html#group,RegexMatch,string,string regex: group(m: RegexMatch; groupName: string; text: string): seq[string]
+groupFirstCapture regex.html#groupFirstCapture,RegexMatch,string,string regex: groupFirstCapture(m: RegexMatch; groupName: string; text: string): string
+groupLastCapture regex.html#groupLastCapture,RegexMatch,string,string regex: groupLastCapture(m: RegexMatch; groupName: string; text: string): string
+groupsCount regex.html#groupsCount,RegexMatch regex: groupsCount(m: RegexMatch): int
+groupNames regex.html#groupNames,RegexMatch regex: groupNames(m: RegexMatch): seq[string]
+match regex.html#match,string,Regex,RegexMatch,int regex: match(s: string; pattern: Regex; m: var RegexMatch; start = 0): bool
+match regex.html#match,string,Regex regex: match(s: string; pattern: Regex): bool
+findAll regex.html#findAll.i,string,Regex,int regex: findAll(s: string; pattern: Regex; start = 0): RegexMatch
+findAll regex.html#findAll,string,Regex,int regex: findAll(s: string; pattern: Regex; start = 0): seq[RegexMatch]
+findAllBounds regex.html#findAllBounds.i,string,Regex,int regex: findAllBounds(s: string; pattern: Regex; start = 0): Slice[int]
+findAllBounds regex.html#findAllBounds,string,Regex,int regex: findAllBounds(s: string; pattern: Regex; start = 0): seq[Slice[int]]
+findAndCaptureAll regex.html#findAndCaptureAll,string,Regex regex: findAndCaptureAll(s: string; pattern: Regex): seq[string]
+contains regex.html#contains,string,Regex regex: contains(s: string; pattern: Regex): bool
+find regex.html#find,string,Regex,RegexMatch,int regex: find(s: string; pattern: Regex; m: var RegexMatch; start = 0): bool
+split regex.html#split.i,string,Regex regex: split(s: string; sep: Regex): string
+split regex.html#split,string,Regex regex: split(s: string; sep: Regex): seq[string]
+splitIncl regex.html#splitIncl,string,Regex regex: splitIncl(s: string; sep: Regex): seq[string]
+startsWith regex.html#startsWith,string,Regex,int regex: startsWith(s: string; pattern: Regex; start = 0): bool
+endsWith regex.html#endsWith,string,Regex regex: endsWith(s: string; pattern: Regex): bool
+replace regex.html#replace,string,Regex,string,int regex: replace(s: string; pattern: Regex; by: string; limit = 0): string
+replace regex.html#replace,string,Regex,proc(RegexMatch,string),int regex: replace(s: string; pattern: Regex; by: proc (m: RegexMatch; s: string): string;\n limit = 0): string
+isInitialized regex.html#isInitialized,Regex regex: isInitialized(re: Regex): bool
+Syntax regex.html#syntax Syntax
+Matching one character regex.html#syntax-matching-one-character Matching one character
+Character classes regex.html#syntax-character-classes Character classes
+Composites regex.html#syntax-composites Composites
+Repetitions regex.html#syntax-repetitions Repetitions
+Empty matches regex.html#syntax-empty-matches Empty matches
+Grouping and flags regex.html#syntax-grouping-and-flags Grouping and flags
+Escape sequences regex.html#syntax-escape-sequences Escape sequences
+Perl character classes (Unicode friendly) regex.html#syntax-perl-character-classes-unicode-friendly Perl character classes (Unicode friendly)
+ASCII character classes regex.html#syntax-ascii-character-classes ASCII character classes
+Lookaround Assertions regex.html#syntax-lookaround-assertions Lookaround Assertions
+Examples regex.html#examples Examples
+Match regex.html#examples-match Match
+Captures regex.html#examples-captures Captures
+Find regex.html#examples-find Find
+Find All regex.html#examples-find-all Find All
+Verbose Mode regex.html#examples-verbose-mode Verbose Mode
+Match Macro regex.html#examples-match-macro Match Macro
+Invalid UTF-8 input text regex.html#examples-invalid-utfminus8-input-text Invalid UTF-8 input text
+Match arbitrary bytes regex.html#examples-match-arbitrary-bytes Match arbitrary bytes
+Compile the regex at compile time regex.html#examples-compile-the-regex-at-compile-time Compile the regex at compile time
+Compile the regex at runtime regex.html#examples-compile-the-regex-at-runtime Compile the regex at runtime
diff --git a/regex/.keep b/regex/.keep
new file mode 100644
index 0000000..5396b83
--- /dev/null
+++ b/regex/.keep
@@ -0,0 +1 @@
+#keep
\ No newline at end of file
diff --git a/regex/common.html b/regex/common.html
new file mode 100644
index 0000000..90fdcf2
--- /dev/null
+++ b/regex/common.html
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/common
+
+
+
+
+
+
+
+
+
+
+
src/regex/common
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
proc `%%` ( formatstr : string ; a : openArray [ string ] ) : string {.noSideEffect ,
+ ... raises : [ ] , tags : [ ] .}
+
+
+same as "$#" % ["foo"] but returns empty string on error
+
+
+
+
+
proc `%%` ( formatstr : string ; a : string ) : string {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
proc `<=` ( x , y : Rune ) : bool {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
func bwRuneAt ( s : string ; n : int ) : Rune {.... raises : [ ] , tags : [ ] .}
+
+
+Take rune ending at n
+
+
+
+
+
proc cmp ( x , y : Rune ) : int {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
proc toRune ( s : string ) : Rune {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
func verifyUtf8 ( s : string ) : int {.... raises : [ ] , tags : [ ] .}
+
+
+Return - 1 if s is a valid utf-8 string. Otherwise, return the index of the first bad char.
+
+
+
+
+
+
+
+
+
+
template bwFastRuneAt ( s : string ; n : var int ; result : var Rune ) : untyped
+
+
+Take rune ending at n
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:57 UTC
+
+
+
+
+
+
+
diff --git a/regex/common.idx b/regex/common.idx
new file mode 100644
index 0000000..d14f207
--- /dev/null
+++ b/regex/common.idx
@@ -0,0 +1,11 @@
+RegexError regex/common.html#RegexError common: RegexError
+invalidRune regex/common.html#invalidRune common: invalidRune
+lineBreakRune regex/common.html#lineBreakRune common: lineBreakRune
+toRune regex/common.html#toRune,string common: toRune(s: string): Rune
+`<=` regex/common.html#<=,Rune,Rune common: `<=`(x, y: Rune): bool
+cmp regex/common.html#cmp,Rune,Rune common: cmp(x, y: Rune): int
+bwRuneAt regex/common.html#bwRuneAt,string,int common: bwRuneAt(s: string; n: int): Rune
+bwFastRuneAt regex/common.html#bwFastRuneAt.t,string,int,Rune common: bwFastRuneAt(s: string; n: var int; result: var Rune): untyped
+`%%` regex/common.html#%%,string,openArray[string] common: `%%`(formatstr: string; a: openArray[string]): string
+`%%` regex/common.html#%%,string,string common: `%%`(formatstr: string; a: string): string
+verifyUtf8 regex/common.html#verifyUtf8,string common: verifyUtf8(s: string): int
diff --git a/regex/compiler.html b/regex/compiler.html
new file mode 100644
index 0000000..bced8aa
--- /dev/null
+++ b/regex/compiler.html
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/compiler
+
+
+
+
+
+
+
+
+
+
+
src/regex/compiler
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
func reCt ( s : string ; flags : RegexFlags = { } ) : Regex {.compileTime ,
+ ... raises : [ RegexError ] , tags : [ ] .}
+
+
+
+
+
+
+
+
func reImpl ( s : string ; flags : RegexFlags = { } ) : Regex {.... raises : [ RegexError ] ,
+ tags : [ ] .}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/compiler.idx b/regex/compiler.idx
new file mode 100644
index 0000000..d1675bb
--- /dev/null
+++ b/regex/compiler.idx
@@ -0,0 +1,2 @@
+reImpl regex/compiler.html#reImpl,string,RegexFlags compiler: reImpl(s: string; flags: RegexFlags = {}): Regex
+reCt regex/compiler.html#reCt,string,RegexFlags compiler: reCt(s: string; flags: RegexFlags = {}): Regex
diff --git a/regex/dotgraph.html b/regex/dotgraph.html
new file mode 100644
index 0000000..48a2d56
--- /dev/null
+++ b/regex/dotgraph.html
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/dotgraph
+
+
+
+
+
+
+
+
+
+
+
src/regex/dotgraph
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
func graph ( nfa : Nfa ) : string {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
func graph ( regex : Regex ) : string {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
func graphToFile ( regex : Regex ; dir : string ) {.... raises : [ ] , tags : [ WriteIOEffect ] .}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/dotgraph.idx b/regex/dotgraph.idx
new file mode 100644
index 0000000..72f49b1
--- /dev/null
+++ b/regex/dotgraph.idx
@@ -0,0 +1,3 @@
+graph regex/dotgraph.html#graph,Nfa dotgraph: graph(nfa: Nfa): string
+graph regex/dotgraph.html#graph,Regex dotgraph: graph(regex: Regex): string
+graphToFile regex/dotgraph.html#graphToFile,Regex,string dotgraph: graphToFile(regex: Regex; dir: string)
diff --git a/regex/exptransformation.html b/regex/exptransformation.html
new file mode 100644
index 0000000..bc62f02
--- /dev/null
+++ b/regex/exptransformation.html
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/exptransformation
+
+
+
+
+
+
+
+
+
+
+
src/regex/exptransformation
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
GroupsCapture = object
+ count * : int16
+ names * : OrderedTable [ string , int16 ]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/exptransformation.idx b/regex/exptransformation.idx
new file mode 100644
index 0000000..4355703
--- /dev/null
+++ b/regex/exptransformation.idx
@@ -0,0 +1,3 @@
+GroupsCapture regex/exptransformation.html#GroupsCapture exptransformation: GroupsCapture
+toAtoms regex/exptransformation.html#toAtoms,Exp,GroupsCapture,RegexFlags exptransformation: toAtoms(exp: Exp; groups: var GroupsCapture; flags: RegexFlags = {}): AtomsExp
+transformExp regex/exptransformation.html#transformExp,Exp,GroupsCapture,RegexFlags exptransformation: transformExp(exp: Exp; groups: var GroupsCapture; flags: RegexFlags = {}): RpnExp
diff --git a/regex/exptype.html b/regex/exptype.html
new file mode 100644
index 0000000..8b67b3e
--- /dev/null
+++ b/regex/exptype.html
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/exptype
+
+
+
+
+
+
+
+
+
+
+
src/regex/exptype
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Exp = object
+ s * : seq [ Node ]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/exptype.idx b/regex/exptype.idx
new file mode 100644
index 0000000..da31e1d
--- /dev/null
+++ b/regex/exptype.idx
@@ -0,0 +1,2 @@
+Exp regex/exptype.html#Exp exptype: Exp
+AtomsExp regex/exptype.html#AtomsExp exptype: AtomsExp
diff --git a/regex/litopt.html b/regex/litopt.html
new file mode 100644
index 0000000..9965167
--- /dev/null
+++ b/regex/litopt.html
@@ -0,0 +1,204 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/litopt
+
+
+
+
+
+
+
+
+
+
+
src/regex/litopt
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
Literals optimization. This is about optimizing the find operation by quickly searching Regular Expression literals within the input string. See issue #59.
+
+
+
+
+
+
LitOpt = object
+ lit * : Rune
+ lits * : string
+ bytelits * : string
+ nfa * : Nfa
+
+
+
+
+
+
+
+
+
+
+
+
+
+
func canOpt ( litOpt : LitOpt ) : bool {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/litopt.idx b/regex/litopt.idx
new file mode 100644
index 0000000..7b0164f
--- /dev/null
+++ b/regex/litopt.idx
@@ -0,0 +1,3 @@
+LitOpt regex/litopt.html#LitOpt litopt: LitOpt
+canOpt regex/litopt.html#canOpt,LitOpt litopt: canOpt(litOpt: LitOpt): bool
+litopt3 regex/litopt.html#litopt3,RpnExp,RegexFlags litopt: litopt3(exp: RpnExp; flags: RegexFlags = {}): LitOpt
diff --git a/regex/nfa.html b/regex/nfa.html
new file mode 100644
index 0000000..dc5e2c1
--- /dev/null
+++ b/regex/nfa.html
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/nfa
+
+
+
+
+
+
+
+
+
+
+
src/regex/nfa
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
func eRemoval ( eNfa : Enfa ) : Nfa {.... raises : [ ] , tags : [ ] .}
+
+
+Remove e-transitions and return remaining state transtions and submatches, and zero matches. Transitions are added in matching order (BFS), which may help matching performance
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/nfa.idx b/regex/nfa.idx
new file mode 100644
index 0000000..e9f2c56
--- /dev/null
+++ b/regex/nfa.idx
@@ -0,0 +1,4 @@
+eNfa regex/nfa.html#eNfa,RpnExp nfa: eNfa(exp: RpnExp): Enfa
+eRemoval regex/nfa.html#eRemoval,Enfa nfa: eRemoval(eNfa: Enfa): Nfa
+subExps regex/nfa.html#subExps,RpnExp nfa: subExps(exp: RpnExp): RpnExp
+nfa2 regex/nfa.html#nfa2,RpnExp nfa: nfa2(exp: RpnExp): Nfa
diff --git a/regex/nfafindall.html b/regex/nfafindall.html
new file mode 100644
index 0000000..48c84a8
--- /dev/null
+++ b/regex/nfafindall.html
@@ -0,0 +1,274 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/nfafindall
+
+
+
+
+
+
+
+
+
+
+
src/regex/nfafindall
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
DEPRECATED
+
+
+
+
+
+
+
func dummyMatch ( ms : var RegexMatches ; i : int ) {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+hack to support split last value. we need to add the end boundary if it has not matched the end (no match implies this too)
+
+
+
+
+
+
+
+
+
+
+
+
+
iterator bounds ( ms : RegexMatches ) : Slice [ int ] {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
iterator items ( ms : RegexMatches ) : MatchItemIdx {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/nfafindall.idx b/regex/nfafindall.idx
new file mode 100644
index 0000000..3400374
--- /dev/null
+++ b/regex/nfafindall.idx
@@ -0,0 +1,7 @@
+RegexMatches regex/nfafindall.html#RegexMatches nfafindall: RegexMatches
+bounds regex/nfafindall.html#bounds.i,RegexMatches nfafindall: bounds(ms: RegexMatches): Slice[int]
+items regex/nfafindall.html#items.i,RegexMatches nfafindall: items(ms: RegexMatches): MatchItemIdx
+fillMatchImpl regex/nfafindall.html#fillMatchImpl,RegexMatch,MatchItemIdx,RegexMatches,Regex nfafindall: fillMatchImpl(m: var RegexMatch; mi: MatchItemIdx; ms: RegexMatches;\n regex: Regex)
+dummyMatch regex/nfafindall.html#dummyMatch,RegexMatches,int nfafindall: dummyMatch(ms: var RegexMatches; i: int)
+findSomeImpl regex/nfafindall.html#findSomeImpl,string,Regex,RegexMatches,Natural,set[MatchFlag] nfafindall: findSomeImpl(text: string; regex: Regex; ms: var RegexMatches;\n start: Natural = 0; flags: set[MatchFlag] = {}): int
+findSomeOptImpl regex/nfafindall.html#findSomeOptImpl,string,Regex,RegexMatches,Natural nfafindall: findSomeOptImpl(text: string; regex: Regex; ms: var RegexMatches; start: Natural): int
diff --git a/regex/nfafindall2.html b/regex/nfafindall2.html
new file mode 100644
index 0000000..99c6d8a
--- /dev/null
+++ b/regex/nfafindall2.html
@@ -0,0 +1,277 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/nfafindall2
+
+
+
+
+
+
+
+
+
+
+
src/regex/nfafindall2
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
Linear time NFA findAll
+
+
+
+
+
+
+
func dummyMatch ( ms : var RegexMatches2 ; i : int ) {.... raises : [ ] , tags : [ ] .}
+
+
+hack to support split last value. we need to add the end boundary if it has not matched the end (no match implies this too)
+
+
+
+
+
+
+
+
+
+
+
+
+
iterator bounds ( ms : RegexMatches2 ) : Slice [ int ] {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
iterator items ( ms : RegexMatches2 ) : MatchItemIdx {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/nfafindall2.idx b/regex/nfafindall2.idx
new file mode 100644
index 0000000..f2a90fe
--- /dev/null
+++ b/regex/nfafindall2.idx
@@ -0,0 +1,7 @@
+RegexMatches2 regex/nfafindall2.html#RegexMatches2 nfafindall2: RegexMatches2
+bounds regex/nfafindall2.html#bounds.i,RegexMatches2 nfafindall2: bounds(ms: RegexMatches2): Slice[int]
+items regex/nfafindall2.html#items.i,RegexMatches2 nfafindall2: items(ms: RegexMatches2): MatchItemIdx
+fillMatchImpl regex/nfafindall2.html#fillMatchImpl,RegexMatch2,MatchItemIdx,RegexMatches2,Regex nfafindall2: fillMatchImpl(m: var RegexMatch2; mi: MatchItemIdx; ms: RegexMatches2;\n regex: Regex)
+dummyMatch regex/nfafindall2.html#dummyMatch,RegexMatches2,int nfafindall2: dummyMatch(ms: var RegexMatches2; i: int)
+findSomeImpl regex/nfafindall2.html#findSomeImpl,string,Regex,RegexMatches2,Natural,MatchFlags nfafindall2: findSomeImpl(text: string; regex: Regex; ms: var RegexMatches2;\n start: Natural = 0; flags: MatchFlags = {}): int
+findSomeOptImpl regex/nfafindall2.html#findSomeOptImpl,string,Regex,RegexMatches2,Natural,MatchFlags nfafindall2: findSomeOptImpl(text: string; regex: Regex; ms: var RegexMatches2;\n start: Natural; flags: MatchFlags = {}): int
diff --git a/regex/nfamacro.html b/regex/nfamacro.html
new file mode 100644
index 0000000..49bf2af
--- /dev/null
+++ b/regex/nfamacro.html
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/nfamacro
+
+
+
+
+
+
+
+
+
+
+
src/regex/nfamacro
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
NFA matcher for static regexes
+
+
+
+
+
+
proc matchImpl ( text , expLit , body : NimNode ) : NimNode {.... raises : [ RegexError ] ,
+ tags : [ RootEffect ] .}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/nfamacro.idx b/regex/nfamacro.idx
new file mode 100644
index 0000000..228212e
--- /dev/null
+++ b/regex/nfamacro.idx
@@ -0,0 +1 @@
+matchImpl regex/nfamacro.html#matchImpl,NimNode,NimNode,NimNode nfamacro: matchImpl(text, expLit, body: NimNode): NimNode
diff --git a/regex/nfamatch.html b/regex/nfamatch.html
new file mode 100644
index 0000000..1287b5a
--- /dev/null
+++ b/regex/nfamatch.html
@@ -0,0 +1,257 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/nfamatch
+
+
+
+
+
+
+
+
+
+
+
src/regex/nfamatch
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
DEPRECATED
+
+
+
+
+
+
+
func matchImpl ( text : string ; regex : Regex ; m : var RegexMatch ; start = 0 ) : bool {.
+ ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+
+
+
+
+
+
+
func startsWithImpl ( text : string ; regex : Regex ; start : int ) : bool {.... raises : [ ] ,
+ tags : [ RootEffect ] .}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/nfamatch.idx b/regex/nfamatch.idx
new file mode 100644
index 0000000..0b87631
--- /dev/null
+++ b/regex/nfamatch.idx
@@ -0,0 +1,6 @@
+Lookaround regex/nfamatch.html#Lookaround nfamatch: Lookaround
+lookAroundTpl regex/nfamatch.html#lookAroundTpl.t nfamatch: lookAroundTpl(): untyped
+reversedMatchImpl regex/nfamatch.html#reversedMatchImpl,Submatches,Submatches,string,Nfa,Lookaround,int,int nfamatch: reversedMatchImpl(smA, smB: var Submatches; text: string; nfa: Nfa;\n look: var Lookaround; start, limit: int): int
+initLook regex/nfamatch.html#initLook.t nfamatch: initLook(): Lookaround
+matchImpl regex/nfamatch.html#matchImpl,string,Regex,RegexMatch,int nfamatch: matchImpl(text: string; regex: Regex; m: var RegexMatch; start = 0): bool
+startsWithImpl regex/nfamatch.html#startsWithImpl,string,Regex,int nfamatch: startsWithImpl(text: string; regex: Regex; start: int): bool
diff --git a/regex/nfamatch2.html b/regex/nfamatch2.html
new file mode 100644
index 0000000..a39aff3
--- /dev/null
+++ b/regex/nfamatch2.html
@@ -0,0 +1,269 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/nfamatch2
+
+
+
+
+
+
+
+
+
+
+
src/regex/nfamatch2
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
NFA matcher for non-static regexes
+
+
+
+
+
+
+
func epsilonMatch ( matched : var bool ; captx : var int32 ; capts : var Capts3 ;
+ look : var Lookaround ; ntn : Node ; text : string ; i : int ;
+ cPrev : int32 ; c : Rune ; flags : MatchFlags ; bwMatch = false ) {.
+ ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+
+
+
+
+
+
+
+
func startsWithImpl2 ( text : string ; regex : Regex ; start : int ) : bool {.... raises : [ ] ,
+ tags : [ RootEffect ] .}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/nfamatch2.idx b/regex/nfamatch2.idx
new file mode 100644
index 0000000..c3ce45f
--- /dev/null
+++ b/regex/nfamatch2.idx
@@ -0,0 +1,6 @@
+Lookaround regex/nfamatch2.html#Lookaround nfamatch2: Lookaround
+epsilonMatch regex/nfamatch2.html#epsilonMatch,bool,int32,Capts3,Lookaround,Node,string,int,int32,Rune,MatchFlags nfamatch2: epsilonMatch(matched: var bool; captx: var int32; capts: var Capts3;\n look: var Lookaround; ntn: Node; text: string; i: int;\n cPrev: int32; c: Rune; flags: MatchFlags; bwMatch = false)
+reversedMatchImpl regex/nfamatch2.html#reversedMatchImpl,Submatches,Submatches,string,Nfa,Lookaround,int,int,int,MatchFlags nfamatch2: reversedMatchImpl(smA, smB: var Submatches; text: string; nfa: Nfa;\n look: var Lookaround; groupsLen: int; start, limit: int;\n flags: MatchFlags = {}): int
+initLook regex/nfamatch2.html#initLook.t nfamatch2: initLook(): Lookaround
+matchImpl regex/nfamatch2.html#matchImpl,string,Regex,RegexMatch2,int,MatchFlags nfamatch2: matchImpl(text: string; regex: Regex; m: var RegexMatch2; start = 0;\n flags: MatchFlags = {}): bool
+startsWithImpl2 regex/nfamatch2.html#startsWithImpl2,string,Regex,int nfamatch2: startsWithImpl2(text: string; regex: Regex; start: int): bool
diff --git a/regex/nfatype.html b/regex/nfatype.html
new file mode 100644
index 0000000..98ec69b
--- /dev/null
+++ b/regex/nfatype.html
@@ -0,0 +1,875 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/nfatype
+
+
+
+
+
+
+
+
+
+
+
src/regex/nfatype
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
Types used by the NFA
+
+
+
+
+
+
Bounds = Slice [ int ]
+
+
+
+
+
+
+
+
+
CaptNode = object
+ parent * : CaptIdx
+ bound * : int
+ idx * : int16
+
+
+
+
+
+
+
+
+
+
Capts3 = object
+ s : seq [ Slice [ int ] ]
+ groupsLen : Natural
+ blockSize : Natural
+ blockSizeL2 : Natural
+ states : seq [ CaptState ]
+ free : seq [ int16 ]
+ freezeId : CaptState
+
+
+
+Seq of captures divided into blocks of power of 2 len. One block per parallel state. A seq/set to keep track of used blocks. A seq of free blocks for reusing
+
+
+
+
+
+
Captures = seq [ seq [ Slice [ int ] ] ]
+
+
+
+
+
+
+
+
MatchFlag = enum
+ mfShortestMatch , mfNoCaptures , mfFindMatch , mfFindMatchOpt , mfAnchored ,
+ mfBwMatch , mfReverseCapts , mfBytesInput
+
+
+
+
+
+
+
+
+
+
+
Regex = object
+ nfa * : Nfa
+ groupsCount * : int16
+ namedGroups * : OrderedTable [ string , int16 ]
+ flags * : RegexFlags
+ litOpt * : LitOpt
+
+
+
+deprecated
+
+
+
+
+
Regex2 = distinct Regex
+
+
+a compiled regular expression
+
+
+
+
+
RegexLit = distinct string
+
+
+raw regex literal string
+
+
+
+
+
RegexMatch = object
+ captures * : Captures
+ namedGroups * : OrderedTable [ string , int16 ]
+ boundaries * : Slice [ int ]
+
+
+
+deprecated
+
+
+
+
+
RegexMatch2 = object
+ captures * : seq [ Slice [ int ] ]
+ namedGroups * : OrderedTable [ string , int16 ]
+ boundaries * : Slice [ int ]
+
+
+
+result from matching operations
+
+
+
+
+
+
+
Submatches = ref object
+ sx : seq [ PState ]
+ ss : seq [ int16 ]
+ si : int16
+
+
+
+Parallel states would be a better name. This is a sparse set
+
+
+
+
+
+
+
+
+
+
+
func `[]` ( capts : Capts3 ; i , j : Natural ) : Slice [ int ] {.inline , ... raises : [ ] ,
+ tags : [ ] .}
+
+
+
+
+
+
+
+
func `[]` ( capts : var Capts3 ; i , j : Natural ) : var Slice [ int ] {.inline ,
+ ... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
+
+
func cap ( sm : Submatches ) : int {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
func clear ( capts : var Capts3 ) {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
func clear ( m : var RegexMatch ) {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
+
func clear ( sm : var Submatches ) {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
+
+
func freeze ( capts : var Capts3 ) : CaptState {.... raises : [ ] , tags : [ ] .}
+
+
+Freeze all in use capts. Return freezeId
+
+
+
+
+
func grow ( sm : var SmLookaround ) {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
func hasState ( sm : Submatches ; n : int16 ) : bool {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
func initCapts3 ( groupsLen : int ) : Capts3 {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
+
func len ( sm : Submatches ) : int {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
+
+
+
func recycle ( capts : var Capts3 ) {.... raises : [ ] , tags : [ ] .}
+
+
+Free recyclable entries Set initial/keepAlive entries to recyclable
+
+
+
+
+
+
func reverse ( capts : var Capts ; a , b : int32 ) : int32 {.... raises : [ ] , tags : [ ] .}
+
+
+reverse capture indices from a to b; return head
+
+
+
+
+
+
func setLen ( sm : var Submatches ; size : int ) {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
template toRegex ( r ) : untyped
+
+
+
+
+
+
+
+
template toRegex2 ( r ) : untyped
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/nfatype.idx b/regex/nfatype.idx
new file mode 100644
index 0000000..b36f880
--- /dev/null
+++ b/regex/nfatype.idx
@@ -0,0 +1,61 @@
+nonCapture regex/nfatype.html#nonCapture nfatype: nonCapture
+CaptState regex/nfatype.html#CaptState nfatype: CaptState
+CaptIdx regex/nfatype.html#CaptIdx nfatype: CaptIdx
+Capts3 regex/nfatype.html#Capts3 nfatype: Capts3
+`[]` regex/nfatype.html#[],Capts3,Natural,Natural nfatype: `[]`(capts: Capts3; i, j: Natural): Slice[int]
+`[]` regex/nfatype.html#[],Capts3,Natural,Natural_2 nfatype: `[]`(capts: var Capts3; i, j: Natural): var Slice[int]
+initCapts3 regex/nfatype.html#initCapts3,int nfatype: initCapts3(groupsLen: int): Capts3
+keepAlive regex/nfatype.html#keepAlive,Capts3,CaptIdx nfatype: keepAlive(capts: var Capts3; captIdx: CaptIdx)
+freeze regex/nfatype.html#freeze,Capts3 nfatype: freeze(capts: var Capts3): CaptState
+unfreeze regex/nfatype.html#unfreeze,Capts3,CaptState nfatype: unfreeze(capts: var Capts3; freezeId: CaptState)
+diverge regex/nfatype.html#diverge,Capts3,CaptIdx nfatype: diverge(capts: var Capts3; captIdx: CaptIdx): CaptIdx
+recycle regex/nfatype.html#recycle,Capts3 nfatype: recycle(capts: var Capts3)
+notRecyclable regex/nfatype.html#notRecyclable,Capts3,CaptIdx nfatype: notRecyclable(capts: var Capts3; captIdx: CaptIdx)
+recyclable regex/nfatype.html#recyclable,Capts3,CaptIdx nfatype: recyclable(capts: var Capts3; captIdx: CaptIdx)
+clear regex/nfatype.html#clear,Capts3 nfatype: clear(capts: var Capts3)
+CaptNode regex/nfatype.html#CaptNode nfatype: CaptNode
+Capts regex/nfatype.html#Capts nfatype: Capts
+Captures regex/nfatype.html#Captures nfatype: Captures
+constructSubmatches regex/nfatype.html#constructSubmatches,Captures,Capts,int,int nfatype: constructSubmatches(captures: var Captures; capts: Capts; capt, size: int)
+reverse regex/nfatype.html#reverse,Capts,int32,int32 nfatype: reverse(capts: var Capts; a, b: int32): int32
+mfShortestMatch regex/nfatype.html#mfShortestMatch MatchFlag.mfShortestMatch
+mfNoCaptures regex/nfatype.html#mfNoCaptures MatchFlag.mfNoCaptures
+mfFindMatch regex/nfatype.html#mfFindMatch MatchFlag.mfFindMatch
+mfFindMatchOpt regex/nfatype.html#mfFindMatchOpt MatchFlag.mfFindMatchOpt
+mfAnchored regex/nfatype.html#mfAnchored MatchFlag.mfAnchored
+mfBwMatch regex/nfatype.html#mfBwMatch MatchFlag.mfBwMatch
+mfReverseCapts regex/nfatype.html#mfReverseCapts MatchFlag.mfReverseCapts
+mfBytesInput regex/nfatype.html#mfBytesInput MatchFlag.mfBytesInput
+MatchFlag regex/nfatype.html#MatchFlag nfatype: MatchFlag
+MatchFlags regex/nfatype.html#MatchFlags nfatype: MatchFlags
+toMatchFlags regex/nfatype.html#toMatchFlags,RegexFlags nfatype: toMatchFlags(f: RegexFlags): MatchFlags
+RegexLit regex/nfatype.html#RegexLit nfatype: RegexLit
+Regex regex/nfatype.html#Regex nfatype: Regex
+RegexMatch regex/nfatype.html#RegexMatch nfatype: RegexMatch
+RegexMatch2 regex/nfatype.html#RegexMatch2 nfatype: RegexMatch2
+Regex2 regex/nfatype.html#Regex2 nfatype: Regex2
+toRegex2 regex/nfatype.html#toRegex2.t nfatype: toRegex2(r): untyped
+toRegex regex/nfatype.html#toRegex.t nfatype: toRegex(r): untyped
+clear regex/nfatype.html#clear,RegexMatch nfatype: clear(m: var RegexMatch)
+clear regex/nfatype.html#clear,RegexMatch2 nfatype: clear(m: var RegexMatch2)
+NodeIdx regex/nfatype.html#NodeIdx nfatype: NodeIdx
+Bounds regex/nfatype.html#Bounds nfatype: Bounds
+PState regex/nfatype.html#PState nfatype: PState
+Submatches regex/nfatype.html#Submatches nfatype: Submatches
+newSubmatches regex/nfatype.html#newSubmatches,int nfatype: newSubmatches(size: int): Submatches
+`[]` regex/nfatype.html#[],Submatches,int nfatype: `[]`(sm: Submatches; i: int): PState
+hasState regex/nfatype.html#hasState,Submatches,int16 nfatype: hasState(sm: Submatches; n: int16): bool
+add regex/nfatype.html#add,Submatches,PState nfatype: add(sm: var Submatches; item: PState)
+len regex/nfatype.html#len,Submatches nfatype: len(sm: Submatches): int
+clear regex/nfatype.html#clear,Submatches nfatype: clear(sm: var Submatches)
+items regex/nfatype.html#items.i,Submatches nfatype: items(sm: Submatches): PState
+cap regex/nfatype.html#cap,Submatches nfatype: cap(sm: Submatches): int
+setLen regex/nfatype.html#setLen,Submatches,int nfatype: setLen(sm: var Submatches; size: int)
+SmLookaroundItem regex/nfatype.html#SmLookaroundItem nfatype: SmLookaroundItem
+SmLookaround regex/nfatype.html#SmLookaround nfatype: SmLookaround
+setLen regex/nfatype.html#setLen,SmLookaroundItem,int nfatype: setLen(item: var SmLookaroundItem; size: int)
+last regex/nfatype.html#last.t,SmLookaround nfatype: last(sm: SmLookaround): untyped
+lastA regex/nfatype.html#lastA.t,SmLookaround nfatype: lastA(sm: SmLookaround): untyped
+lastB regex/nfatype.html#lastB.t,SmLookaround nfatype: lastB(sm: SmLookaround): untyped
+grow regex/nfatype.html#grow,SmLookaround nfatype: grow(sm: var SmLookaround)
+removeLast regex/nfatype.html#removeLast,SmLookaround nfatype: removeLast(sm: var SmLookaround)
diff --git a/regex/nodematch.html b/regex/nodematch.html
new file mode 100644
index 0000000..2a79345
--- /dev/null
+++ b/regex/nodematch.html
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/nodematch
+
+
+
+
+
+
+
+
+
+
+
src/regex/nodematch
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
func match ( n : Node ; r : Rune ) : bool {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+match for Node of matchable kind. Return whether the node matches the current character or not
+
+
+
+
+
func match ( n : Node ; r : Rune ; nxt : Rune ) : bool {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+match for Node of assertion kind. Return whether the node matches the current characters or not
+
+
+
+
+
func swapCase ( r : Rune ) : Rune {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/nodematch.idx b/regex/nodematch.idx
new file mode 100644
index 0000000..4304fe4
--- /dev/null
+++ b/regex/nodematch.idx
@@ -0,0 +1,3 @@
+match regex/nodematch.html#match,Node,Rune,Rune nodematch: match(n: Node; r: Rune; nxt: Rune): bool
+swapCase regex/nodematch.html#swapCase,Rune nodematch: swapCase(r: Rune): Rune
+match regex/nodematch.html#match,Node,Rune nodematch: match(n: Node; r: Rune): bool
diff --git a/regex/parser.html b/regex/parser.html
new file mode 100644
index 0000000..ab992da
--- /dev/null
+++ b/regex/parser.html
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/parser
+
+
+
+
+
+
+
+
+
+
+
src/regex/parser
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
func parse ( expression : string ; flags : RegexFlags = { } ) : Exp {.
+ ... raises : [ RegexError ] , tags : [ ] .}
+
+
+convert a string regex expression into a Node expression
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/parser.idx b/regex/parser.idx
new file mode 100644
index 0000000..2dd897f
--- /dev/null
+++ b/regex/parser.idx
@@ -0,0 +1 @@
+parse regex/parser.html#parse,string,RegexFlags parser: parse(expression: string; flags: RegexFlags = {}): Exp
diff --git a/regex/scanner.html b/regex/scanner.html
new file mode 100644
index 0000000..338601b
--- /dev/null
+++ b/regex/scanner.html
@@ -0,0 +1,359 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/scanner
+
+
+
+
+
+
+
+
+
+
+
src/regex/scanner
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Scanner [ T ] = ref object
+ raw * : string
+ s * : seq [ T ]
+ pos * : int
+
+
+
+A scanner is a common construct for reading data
+
+
+
+
+
+
+
+
+
+
+
func find ( sc : Scanner [ Rune ] ; r : Rune ) : int {.... raises : [ ] , tags : [ ] .}
+
+
+return number of consumed chars. The scanner's position is not moved. -1 is returned when char is not found
+
+
+
+
+
+
+
func next [ T ] ( sc : Scanner [ T ] ) : T
+
+
+return current item and consume it
+
+
+
+
+
+
func peek ( sc : Scanner [ Rune ] ) : Rune {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
func peek ( sc : Scanner [ Rune ] ; n : int ) : Rune {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
+
proc scan ( raw : string ; bytesMode = false ) : Scanner [ Rune ] {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
iterator items [ T ] ( sc : Scanner [ T ] ) : T
+
+
+the yielded item gets consumed
+
+
+
+
+
iterator mitems [ T ] ( sc : var Scanner [ T ] ) : var T
+
+
+the yielded item gets consumed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/scanner.idx b/regex/scanner.idx
new file mode 100644
index 0000000..f91ab43
--- /dev/null
+++ b/regex/scanner.idx
@@ -0,0 +1,15 @@
+Scanner regex/scanner.html#Scanner scanner: Scanner
+newScanner regex/scanner.html#newScanner,seq[T] scanner: newScanner[T](s: seq[T]): Scanner[T]
+scan regex/scanner.html#scan,seq[T] scanner: scan[T](s: seq[T]): Scanner[T]
+scan regex/scanner.html#scan,string scanner: scan(raw: string; bytesMode = false): Scanner[Rune]
+items regex/scanner.html#items.i,Scanner[T] scanner: items[T](sc: Scanner[T]): T
+mitems regex/scanner.html#mitems.i,Scanner[T] scanner: mitems[T](sc: var Scanner[T]): var T
+finished regex/scanner.html#finished,Scanner[T] scanner: finished[T](sc: Scanner[T]): bool
+prev regex/scanner.html#prev,Scanner[T] scanner: prev[T](sc: Scanner[T]): T
+curr regex/scanner.html#curr,Scanner[T] scanner: curr[T](sc: Scanner[T]): T
+next regex/scanner.html#next,Scanner[T] scanner: next[T](sc: Scanner[T]): T
+peek regex/scanner.html#peek,Scanner[Rune] scanner: peek(sc: Scanner[Rune]): Rune
+peek regex/scanner.html#peek,Scanner[Node] scanner: peek(sc: Scanner[Node]): Node
+peek regex/scanner.html#peek.i,Scanner[T] scanner: peek[T](sc: Scanner[T]): (T, T)
+peek regex/scanner.html#peek,Scanner[Rune],int scanner: peek(sc: Scanner[Rune]; n: int): Rune
+find regex/scanner.html#find,Scanner[Rune],Rune scanner: find(sc: Scanner[Rune]; r: Rune): int
diff --git a/regex/types.html b/regex/types.html
new file mode 100644
index 0000000..fd9c8f2
--- /dev/null
+++ b/regex/types.html
@@ -0,0 +1,655 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex/types
+
+
+
+
+
+
+
+
+
+
+
src/regex/types
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Enfa = object
+ s * : seq [ Node ]
+
+
+
+
+
+
+
+
+
Flag = enum
+ flagCaseInsensitive , flagNotCaseInsensitive , flagMultiLine , flagNotMultiLine ,
+ flagAnyMatchNewLine , flagNotAnyMatchNewLine , flagUnGreedy , flagNotUnGreedy ,
+ flagUnicode , flagNotUnicode , flagVerbose , flagNotVerbose
+
+
+
+
+
+
+
+
Nfa = object
+ s * : seq [ Node ]
+
+
+
+
+
+
+
+
+
Node = object
+ kind * : NodeKind
+ cp * : Rune
+ next * : seq [ int16 ]
+ isGreedy * : bool
+ uid * : NodeUid
+ idx * : int16
+ isCapturing * : bool
+ name * : string
+ flags * : seq [ Flag ]
+ min * , max * : int16
+ cps * : HashSet [ Rune ]
+ ranges * : seq [ Slice [ Rune ] ]
+ shorthands * : seq [ Node ]
+ cc * : UnicodeCategorySet
+ subExp * : SubExp
+
+
+
+
+
+
+
+
+
NodeKind = enum
+ reChar , reCharCi , reJoiner , reGroupStart , reGroupEnd , reFlags , reOr ,
+ reZeroOrMore , reOneOrMore , reZeroOrOne , reRepRange , reStartSym , reEndSym ,
+ reStartSymML , reEndSymML , reStart , reEnd , reWordBoundary , reNotWordBoundary ,
+ reWord , reDigit , reWhiteSpace , reUCC , reNotAlphaNum , reNotDigit ,
+ reNotWhiteSpace , reNotUCC , reAny , reAnyNl , reWordBoundaryAscii ,
+ reNotWordBoundaryAscii , reWordAscii , reDigitAscii , reWhiteSpaceAscii ,
+ reNotAlphaNumAscii , reNotDigitAscii , reNotWhiteSpaceAscii , reInSet , reNotSet ,
+ reLookahead , reLookbehind , reNotLookahead , reNotLookbehind , reSkip , reEoe
+
+
+
+
+
+
+
+
+
RegexFlag = enum
+ regexArbitraryBytes , regexAscii , regexCaseless , regexDotAll , regexExtended ,
+ regexMultiline , regexUngreedy
+
+
+
+
+
+
+
+
+
+
SubExp = object
+ nfa * : Nfa
+ rpn * : RpnExp
+ reverseCapts * : bool
+
+
+
+
+
+
+
+
+
+
+
+
+
+
assertionKind = { reStartSym , reEndSym , reStartSymML , reEndSymML , reStart , reEnd ,
+ reWordBoundary , reNotWordBoundary , reWordBoundaryAscii ,
+ reNotWordBoundaryAscii , reLookahead , reLookbehind ,
+ reNotLookahead , reNotLookbehind }
+
+
+
+
+
+
+
+
groupKind = { reGroupStart , reGroupEnd }
+
+
+
+
+
+
+
+
groupStartKind = { reGroupStart , reLookahead .. reNotLookbehind }
+
+
+
+
+
+
+
+
+
lookaroundKind = { reLookahead , reLookbehind , reNotLookahead , reNotLookbehind }
+
+
+
+
+
+
+
+
+
matchableKind = { reChar , reCharCi , reWord , reDigit , reWhiteSpace , reUCC ,
+ reNotAlphaNum , reNotDigit , reNotWhiteSpace , reNotUCC , reAny ,
+ reAnyNl , reInSet , reNotSet , reWordAscii , reDigitAscii ,
+ reWhiteSpaceAscii , reNotAlphaNumAscii , reNotDigitAscii ,
+ reNotWhiteSpaceAscii }
+
+
+
+
+
+
+
+
opKind = { reJoiner , reOr , reZeroOrMore , reOneOrMore , reZeroOrOne , reRepRange }
+
+
+
+
+
+
+
+
+
shorthandKind = { reWord , reDigit , reWhiteSpace , reUCC , reNotAlphaNum ,
+ reNotDigit , reNotWhiteSpace , reNotUCC , reWordAscii ,
+ reDigitAscii , reWhiteSpaceAscii , reNotAlphaNumAscii ,
+ reNotDigitAscii , reNotWhiteSpaceAscii }
+
+
+
+
+
+
+
+
+
+
+
+
+
func `$` ( n : Node ) : string {.... raises : [ ] , tags : [ ] .}
+
+
+return the string representation of a Node . The string is always equivalent to the original expression but not necessarily equal
+
+
+
+
+
func initEoeNode ( ) : Node {.... raises : [ ] , tags : [ ] .}
+
+
+return the end-of-expression Node . This is a dummy node that marks a match as successful
+
+
+
+
+
func initGroupStart ( name : string = "" ; flags : seq [ Flag ] = @ [ ] ;
+ isCapturing = true ) : Node {.... raises : [ ] , tags : [ ] .}
+
+
+return a reGroupStart node
+
+
+
+
+
func initJoinerNode ( ) : Node {.... raises : [ ] , tags : [ ] .}
+
+
+return a Node of reJoiner kind. Joiners are temporary nodes, they serve to generate the NFA but they are never part of it
+
+
+
+
+
func initNotSetNode ( ) : Node {.... raises : [ ] , tags : [ ] .}
+
+
+return a negated set Node , parsed from an expression such as [^a-z]
+
+
+
+
+
func initSetNode ( ) : Node {.... raises : [ ] , tags : [ ] .}
+
+
+return a set Node , parsed from an expression such as [a-z]
+
+
+
+
+
+
func initSkipNode ( next : openArray [ int16 ] ) : Node {.... raises : [ ] , tags : [ ] .}
+
+
+Return a dummy node that should be skipped while traversing the NFA
+
+
+
+
+
func isEmpty ( n : Node ) : bool {.... raises : [ ] , tags : [ ] .}
+
+
+check if a set Node is empty
+
+
+
+
+
+
func toCharNode ( r : Rune ) : Node {.... raises : [ ] , tags : [ ] .}
+
+
+return a Node that is meant to be matched against text characters
+
+
+
+
+
func toFlag ( fl : RegexFlag ) : Flag {.... raises : [ ] , tags : [ ] .}
+
+
+Public flag to internal flag
+
+
+
+
+
func toFlags ( fls : RegexFlags ) : set [ Flag ] {.... raises : [ ] , tags : [ ] .}
+
+
+Public flags to internal flags
+
+
+
+
+
+
func toString ( n : seq [ Node ] ) : string {.... raises : [ ] , tags : [ ] .}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:58 UTC
+
+
+
+
+
+
+
diff --git a/regex/types.idx b/regex/types.idx
new file mode 100644
index 0000000..98c1c9d
--- /dev/null
+++ b/regex/types.idx
@@ -0,0 +1,99 @@
+regexArbitraryBytes regex/types.html#regexArbitraryBytes RegexFlag.regexArbitraryBytes
+regexAscii regex/types.html#regexAscii RegexFlag.regexAscii
+regexCaseless regex/types.html#regexCaseless RegexFlag.regexCaseless
+regexDotAll regex/types.html#regexDotAll RegexFlag.regexDotAll
+regexExtended regex/types.html#regexExtended RegexFlag.regexExtended
+regexMultiline regex/types.html#regexMultiline RegexFlag.regexMultiline
+regexUngreedy regex/types.html#regexUngreedy RegexFlag.regexUngreedy
+RegexFlag regex/types.html#RegexFlag types: RegexFlag
+RegexFlags regex/types.html#RegexFlags types: RegexFlags
+RpnExp regex/types.html#RpnExp types: RpnExp
+Enfa regex/types.html#Enfa types: Enfa
+Nfa regex/types.html#Nfa types: Nfa
+flagCaseInsensitive regex/types.html#flagCaseInsensitive Flag.flagCaseInsensitive
+flagNotCaseInsensitive regex/types.html#flagNotCaseInsensitive Flag.flagNotCaseInsensitive
+flagMultiLine regex/types.html#flagMultiLine Flag.flagMultiLine
+flagNotMultiLine regex/types.html#flagNotMultiLine Flag.flagNotMultiLine
+flagAnyMatchNewLine regex/types.html#flagAnyMatchNewLine Flag.flagAnyMatchNewLine
+flagNotAnyMatchNewLine regex/types.html#flagNotAnyMatchNewLine Flag.flagNotAnyMatchNewLine
+flagUnGreedy regex/types.html#flagUnGreedy Flag.flagUnGreedy
+flagNotUnGreedy regex/types.html#flagNotUnGreedy Flag.flagNotUnGreedy
+flagUnicode regex/types.html#flagUnicode Flag.flagUnicode
+flagNotUnicode regex/types.html#flagNotUnicode Flag.flagNotUnicode
+flagVerbose regex/types.html#flagVerbose Flag.flagVerbose
+flagNotVerbose regex/types.html#flagNotVerbose Flag.flagNotVerbose
+Flag regex/types.html#Flag types: Flag
+reChar regex/types.html#reChar NodeKind.reChar
+reCharCi regex/types.html#reCharCi NodeKind.reCharCi
+reJoiner regex/types.html#reJoiner NodeKind.reJoiner
+reGroupStart regex/types.html#reGroupStart NodeKind.reGroupStart
+reGroupEnd regex/types.html#reGroupEnd NodeKind.reGroupEnd
+reFlags regex/types.html#reFlags NodeKind.reFlags
+reOr regex/types.html#reOr NodeKind.reOr
+reZeroOrMore regex/types.html#reZeroOrMore NodeKind.reZeroOrMore
+reOneOrMore regex/types.html#reOneOrMore NodeKind.reOneOrMore
+reZeroOrOne regex/types.html#reZeroOrOne NodeKind.reZeroOrOne
+reRepRange regex/types.html#reRepRange NodeKind.reRepRange
+reStartSym regex/types.html#reStartSym NodeKind.reStartSym
+reEndSym regex/types.html#reEndSym NodeKind.reEndSym
+reStartSymML regex/types.html#reStartSymML NodeKind.reStartSymML
+reEndSymML regex/types.html#reEndSymML NodeKind.reEndSymML
+reStart regex/types.html#reStart NodeKind.reStart
+reEnd regex/types.html#reEnd NodeKind.reEnd
+reWordBoundary regex/types.html#reWordBoundary NodeKind.reWordBoundary
+reNotWordBoundary regex/types.html#reNotWordBoundary NodeKind.reNotWordBoundary
+reWord regex/types.html#reWord NodeKind.reWord
+reDigit regex/types.html#reDigit NodeKind.reDigit
+reWhiteSpace regex/types.html#reWhiteSpace NodeKind.reWhiteSpace
+reUCC regex/types.html#reUCC NodeKind.reUCC
+reNotAlphaNum regex/types.html#reNotAlphaNum NodeKind.reNotAlphaNum
+reNotDigit regex/types.html#reNotDigit NodeKind.reNotDigit
+reNotWhiteSpace regex/types.html#reNotWhiteSpace NodeKind.reNotWhiteSpace
+reNotUCC regex/types.html#reNotUCC NodeKind.reNotUCC
+reAny regex/types.html#reAny NodeKind.reAny
+reAnyNl regex/types.html#reAnyNl NodeKind.reAnyNl
+reWordBoundaryAscii regex/types.html#reWordBoundaryAscii NodeKind.reWordBoundaryAscii
+reNotWordBoundaryAscii regex/types.html#reNotWordBoundaryAscii NodeKind.reNotWordBoundaryAscii
+reWordAscii regex/types.html#reWordAscii NodeKind.reWordAscii
+reDigitAscii regex/types.html#reDigitAscii NodeKind.reDigitAscii
+reWhiteSpaceAscii regex/types.html#reWhiteSpaceAscii NodeKind.reWhiteSpaceAscii
+reNotAlphaNumAscii regex/types.html#reNotAlphaNumAscii NodeKind.reNotAlphaNumAscii
+reNotDigitAscii regex/types.html#reNotDigitAscii NodeKind.reNotDigitAscii
+reNotWhiteSpaceAscii regex/types.html#reNotWhiteSpaceAscii NodeKind.reNotWhiteSpaceAscii
+reInSet regex/types.html#reInSet NodeKind.reInSet
+reNotSet regex/types.html#reNotSet NodeKind.reNotSet
+reLookahead regex/types.html#reLookahead NodeKind.reLookahead
+reLookbehind regex/types.html#reLookbehind NodeKind.reLookbehind
+reNotLookahead regex/types.html#reNotLookahead NodeKind.reNotLookahead
+reNotLookbehind regex/types.html#reNotLookbehind NodeKind.reNotLookbehind
+reSkip regex/types.html#reSkip NodeKind.reSkip
+reEoe regex/types.html#reEoe NodeKind.reEoe
+NodeKind regex/types.html#NodeKind types: NodeKind
+NodeUid regex/types.html#NodeUid types: NodeUid
+Node regex/types.html#Node types: Node
+SubExp regex/types.html#SubExp types: SubExp
+toCharNode regex/types.html#toCharNode,Rune types: toCharNode(r: Rune): Node
+initJoinerNode regex/types.html#initJoinerNode types: initJoinerNode(): Node
+initEoeNode regex/types.html#initEoeNode types: initEoeNode(): Node
+initSetNode regex/types.html#initSetNode types: initSetNode(): Node
+initNotSetNode regex/types.html#initNotSetNode types: initNotSetNode(): Node
+initGroupStart regex/types.html#initGroupStart,string,seq[Flag] types: initGroupStart(name: string = ""; flags: seq[Flag] = @[]; isCapturing = true): Node
+initSkipNode regex/types.html#initSkipNode types: initSkipNode(): Node
+initSkipNode regex/types.html#initSkipNode,openArray[int16] types: initSkipNode(next: openArray[int16]): Node
+isEmpty regex/types.html#isEmpty,Node types: isEmpty(n: Node): bool
+opKind regex/types.html#opKind types: opKind
+assertionKind regex/types.html#assertionKind types: assertionKind
+lookaroundKind regex/types.html#lookaroundKind types: lookaroundKind
+lookaheadKind regex/types.html#lookaheadKind types: lookaheadKind
+lookbehindKind regex/types.html#lookbehindKind types: lookbehindKind
+shorthandKind regex/types.html#shorthandKind types: shorthandKind
+matchableKind regex/types.html#matchableKind types: matchableKind
+repetitionKind regex/types.html#repetitionKind types: repetitionKind
+groupKind regex/types.html#groupKind types: groupKind
+groupStartKind regex/types.html#groupStartKind types: groupStartKind
+isEpsilonTransition regex/types.html#isEpsilonTransition,Node types: isEpsilonTransition(n: Node): bool
+`$` regex/types.html#$,Node types: `$`(n: Node): string
+toString regex/types.html#toString,seq[Node] types: toString(n: seq[Node]): string
+toFlag regex/types.html#toFlag,RegexFlag types: toFlag(fl: RegexFlag): Flag
+toFlags regex/types.html#toFlags,RegexFlags types: toFlags(fls: RegexFlags): set[Flag]
+toFlagsSeq regex/types.html#toFlagsSeq,RegexFlags types: toFlagsSeq(fls: RegexFlags): seq[Flag]
diff --git a/theindex.html b/theindex.html
new file mode 100644
index 0000000..1608a36
--- /dev/null
+++ b/theindex.html
@@ -0,0 +1,1152 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Index
+
+
+
+
+
+
+
+
+
+
+
Index
+ Modules:
regex ,
regex/common ,
regex/compiler ,
regex/dotgraph ,
regex/exptransformation ,
regex/exptype ,
regex/litopt ,
regex/nfa ,
regex/nfafindall ,
regex/nfafindall2 ,
regex/nfamacro ,
regex/nfamatch ,
regex/nfamatch2 ,
regex/nfatype ,
regex/nodematch ,
regex/parser ,
regex/scanner ,
regex/types .
API symbols
+
`$`:
+`%%`:
+`<=`:
+`[]`:
+add:
+assertionKind:
+AtomsExp:
+bounds:
+Bounds:
+bwFastRuneAt:
+bwRuneAt:
+canOpt:
+cap:
+CaptIdx:
+CaptNode:
+Capts:
+Capts3:
+CaptState:
+Captures:
+clear:
+cmp:
+constructSubmatches:
+contains:
+curr:
+diverge:
+dummyMatch:
+endsWith:
+eNfa:
+Enfa:
+epsilonMatch:
+eRemoval:
+escapeRe:
+Exp:
+fillMatchImpl:
+find:
+findAll:
+findAllBounds:
+findAndCaptureAll:
+findSomeImpl:
+findSomeOptImpl:
+finished:
+Flag:
+flagAnyMatchNewLine:
+flagCaseInsensitive:
+flagMultiLine:
+flagNotAnyMatchNewLine:
+flagNotCaseInsensitive:
+flagNotMultiLine:
+flagNotUnGreedy:
+flagNotUnicode:
+flagNotVerbose:
+flagUnGreedy:
+flagUnicode:
+flagVerbose:
+freeze:
+graph:
+graphToFile:
+group:
+groupFirstCapture:
+groupKind:
+groupLastCapture:
+groupNames:
+GroupsCapture:
+groupsCount:
+groupStartKind:
+grow:
+hasState:
+initCapts3:
+initEoeNode:
+initGroupStart:
+initJoinerNode:
+initLook:
+initNotSetNode:
+initSetNode:
+initSkipNode:
+invalidRune:
+isEmpty:
+isEpsilonTransition:
+isInitialized:
+items:
+keepAlive:
+last:
+lastA:
+lastB:
+len:
+lineBreakRune:
+LitOpt:
+litopt3:
+lookaheadKind:
+Lookaround:
+lookaroundKind:
+lookAroundTpl:
+lookbehindKind:
+match:
+matchableKind:
+MatchFlag:
+MatchFlags:
+matchImpl:
+mfAnchored:
+mfBwMatch:
+mfBytesInput:
+mfFindMatch:
+mfFindMatchOpt:
+mfNoCaptures:
+mfReverseCapts:
+mfShortestMatch:
+mitems:
+newScanner:
+newSubmatches:
+next:
+Nfa:
+nfa2:
+Node:
+NodeIdx:
+NodeKind:
+NodeUid:
+nonCapture:
+notRecyclable:
+opKind:
+parse:
+peek:
+prev:
+PState:
+re:
+re2:
+reAny:
+reAnyNl:
+reChar:
+reCharCi:
+reCt:
+recyclable:
+recycle:
+reDigit:
+reDigitAscii:
+reEnd:
+reEndSym:
+reEndSymML:
+reEoe:
+reFlags:
+Regex:
+Regex2:
+regexArbitraryBytes:
+regexAscii:
+regexCaseless:
+regexDotAll:
+RegexError:
+regexExtended:
+RegexFlag:
+RegexFlags:
+RegexLit:
+RegexMatch:
+RegexMatch2:
+RegexMatches:
+RegexMatches2:
+regexMultiline:
+regexUngreedy:
+reGroupEnd:
+reGroupStart:
+reImpl:
+reInSet:
+reJoiner:
+reLookahead:
+reLookbehind:
+removeLast:
+reNonCapture:
+reNotAlphaNum:
+reNotAlphaNumAscii:
+reNotDigit:
+reNotDigitAscii:
+reNotLookahead:
+reNotLookbehind:
+reNotSet:
+reNotUCC:
+reNotWhiteSpace:
+reNotWhiteSpaceAscii:
+reNotWordBoundary:
+reNotWordBoundaryAscii:
+reOneOrMore:
+reOr:
+repetitionKind:
+replace:
+reRepRange:
+reSkip:
+reStart:
+reStartSym:
+reStartSymML:
+reUCC:
+reverse:
+reversedMatchImpl:
+reWhiteSpace:
+reWhiteSpaceAscii:
+reWord:
+reWordAscii:
+reWordBoundary:
+reWordBoundaryAscii:
+rex:
+reZeroOrMore:
+reZeroOrOne:
+RpnExp:
+scan:
+Scanner:
+setLen:
+shorthandKind:
+SmLookaround:
+SmLookaroundItem:
+split:
+splitIncl:
+startsWith:
+startsWithImpl:
+startsWithImpl2:
+SubExp:
+subExps:
+Submatches:
+swapCase:
+toAtoms:
+toCharNode:
+toFlag:
+toFlags:
+toFlagsSeq:
+toMatchFlags:
+toPattern:
+toRegex:
+toRegex2:
+toRune:
+toString:
+transformExp:
+unfreeze:
+verifyUtf8:
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:18:19 UTC
+
+
+
+
+
+
+
diff --git a/ugh/nimdoc.out.css b/ugh/nimdoc.out.css
new file mode 100644
index 0000000..4abea9c
--- /dev/null
+++ b/ugh/nimdoc.out.css
@@ -0,0 +1,1016 @@
+/*
+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,iVBORw0KGgoAAAANSUhEUgAAAN4AAAA9CAYAAADCt9ebAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjAzOjQ4KzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMjoyODo0MSswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMjoyODo0MSswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozMzM0ZjAxYS0yMDExLWE1NGQtOTVjNy1iOTgxMDFlMDFhMmEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzMzNGYwMWEtMjAxMS1hNTRkLTk1YzctYjk4MTAxZTAxYTJhIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MzMzNGYwMWEtMjAxMS1hNTRkLTk1YzctYjk4MTAxZTAxYTJhIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDozMzM0ZjAxYS0yMDExLWE1NGQtOTVjNy1iOTgxMDFlMDFhMmEiIHN0RXZ0OndoZW49IjIwMTktMTItMDNUMDE6MDM6NDgrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4wIChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4PsixkAAAJ5klEQVR4nO2dfbBUZR3HP3vvxVD0zo0ACXxBuQMoQjJ1DfMl0NIhNcuSZqQhfGt6UWtK06xJexkrmywVRTQlHCIdtclC0zBJvYIvvEUgZpc3XyC7RVbKlQu1/fHdbc+uu2fPOfs85+y55/nMnBl2z+5zfnc5v/M8z+8119XVRYroAG4HfgvMT1YUR4MMAa4HLkhakCRoSVqAELwLeBY4C7gF+D6QS1QiR1ROAJ4Dzk9akKQwoXhtwL4GxvHjU8AKoNPz3leAu4HBFq+bAyZZHD9rDAK+BywDDklYlkQxoXhfAtYAEw2MVckQYBHwU6or99nA08BBFq49GngUeBIYaWH8rNEJdAOXA60Jy5I4jSreSOBKYDzwBPCJhiUqcSjwe2BWnc9NLnxuvMFrnwqsAqYBBwBfNzh2FpmNfs9jkhakWcg1aFxZiH5UL3cDnwf+Xue7BwFjgFHAOwuv24tyob3cO0LIshP4EbCn8Pq/wKvA9sLxMvCvOmPsA1yDZnHv/nEv2mM+F0IeR4m8z7lM7tMbUbzj0CxX7YfbAXwaWFJ4PRrNIu9FS9KJyEIZN68CG4DnkRJtLBw7gHHAYuDdNb77EDAjBhkHIk7xKoiqeK3IwjilzuceQJvoZjdQ/AMZaeoZiWYgBXSEwyleBW0Rv3cR9ZUO4LSI48fN2wN+bi5wJNBvUZaBSCaVy48oxpVhwDdMC5ISxpJRh6/DLGEUrxXt29YBQ+2IkwquR76ofZIWxJFegireNLSnm48skFmmDfmiVgJHJyuKI620ADOpbWEcDPwYOZKD7OmyxCTkXL+wzueOiEEWR8poQb60V4A7kLm/yFjgKeALuM1xLfYDbkX+zEGe98cAX0Oui6viF8vR7OS6urragW2UZr21wK+Aiwlu7XPoN3sYOAd4H6WH1SnA0qSEcjQnRT/e1bgnsw16kGPez4/lyCBF48oNwL+TFGSAsgCndI4qFBVvJ0owdZhjL3CnxfHzBo8+YBMyol0CHBijrKbHS/LoA7Yio9sPgJNr/QHekLGR6MffL+KP4SjnHmQxtoXNmbQP+CHyV75hYDzTIWNpWkU8iR5mq71vVsZqXgtcFqNQ/wG2IOtfD8oi6AX+Ujj+isKz8sBrnu+1okyGdmD/wnEgcDClTIdRyJRvI1cvCMciq7At4rj5eoCPAusbHCfLigda/VyKgi+AtyreMGAzykGzQQ/wO+BxSlkCuy1dq8hw5OieUjimYT+x9bHCdWwS1823Ez1EXmhgjKwrXpHzkduuanbCtzGX+NkPPAj8GincNkPjNkIO5dadUjiOB95m+BonopQpm8R58/0JJbHWy2eshVM8sRvdbyurKV4Hmoka2WA/iwwLP6d+QmzSdKC92GzK/W9R+Q3woQbHCELcN991wJcjftcpXolngKm18vFmoVonYcgDv0Qz5pqGREuOTuA8lPYUZbndh0LJNpkUqgZx33xvomim7RG+6xSvnOm1gqQXoyiMoKxFs8VZpFfpQHvQK4HDUPnAsBa9bxGP0tUjF+IYCkxFew+/G3owdq20pgjzt3uPRscs/o43IaOhH2f4ZaAPRyZQP6vgbuCbyGext87F0sgIZFI/N8BnlwBnolovcWAjq/uzwM0+55cBJ0UYN84ZL+rfbnLMM4FfUDv7Z1XlCe8FetETbleNL7+CZrnvMjCVDuTOOA84Hf+96ga0PC8qXY50FQsuMg+41+d8p885R4n7gdt8zo+qvDkmUF4fZQXwEbS+99KDMhlWkw0eALqQglXyDDCdcovf+4lv5jPNXJ9zWc/FDMMdPudGVCreRlTWwVtWbynwYVQQCFSp61Q042WJLUjB1nneuw8tvXo97x1Lugvg+j1Mo9boySLVHtJFWqsthx5GlbSGeN5bigrHdqPl52Zj4qWLXvTQWY4KOX2ccgPMBLRcuy9+0YzhguXN4GuYq2Zc2R/NZg+hfYt3/9ZCepdQthmB4vIWIYOTbWyWzGt2Y0izG1fqjlltxnsdpbPMRMmd3lqTTumqMw7FZY5G5mSHw5dalreiRWYGWjbZ7gYUlFa0xOtIWA4vk1E6zWEoI+FvyYrjSAO1FG8DCmQGKd+DJFsGogWVVFiP/GWbga9Svg9NgtPQvnd04fUNCcriSBF+vqZ5nn9PQ+Xs4q401oI6EP0R+BkyXoAeAtcgBfwidnvkVaMVFTO6n1JoWTfqiONw1MVP8e6l3GVwOPJZXW5VItGGiuduAu5CZdOrMQJ1CHqpIFccS+LxaD/3Hcr7vF0Xw7UdAwQ/xduLGkJ6aUMhVAuwU006B3wM+ZLmozJ5QRhWkGs9yjKw1fhwDsq8eE/F+y+i1CeHIxD1wppupXrA5xyUOjQHMzU3cyjTeS2aaaN2Fzoc1bhch3xspuqBTkDulQVUz1q4mYEbNuewQD3FexGFS1VjOLoRHwOOinj9HAooXY2CSidHHKeSI5GFcRWNdSxqR7VH1iHHeTV24R+X53C8hSCBvPPqnD8B+AOygn6OYAm0ORSGthLl8B0d4DtRmIKsoMsJF1U/Hi1dt6DusIN8PrsIlUdwOAITpDFlC6q3MTbgmHm011qGepOvQSXPipyOCujW6rxqk0dRWYsVFe8PRSn5JxWOoEvdfOGzfnF5tnCRK+bGi33MoB1hL0U5d1H5J5oVD6A5mp8sQS6KSWh5e0jEcR4BPmhKqJA4xTM3XuxjBlW8DuRacDU3y0myNbNTPHPjxT5m0GTN15A/zVFiI+HKYzgc/ydMlrRfgmQWuYn0F91xJEQYxVuDnMcOrQAWJi2EI72ErQviwqLEQpQ+5XBEIqzi3YWLwF+BMiMcjshEqYR1Gdk1KmxBsaR9SQviSDdRFK8fxVU+YliWZmcbcq7vSFoQR/qJWvuxD0WgLDYoSzPzAqowtjVhORwDhEaKru4GPoliGgcyy4Hj0DLT4TBCo9WO88jQ8Bns97lLghvRTOfqqDiMYqrM+HyUYdBtaLykeRmlK12C9rQOh1FM1vd/HqUIzaT5e+LVoh/VxByHShs6HFaw0VjjHhTxP5d0LT+fRnu5q3HuAodlbHW02Q5cDByM+sw1642cRylCx6PeZiuTFScUFxK+f19QovaRS+t4tsasxhvABbZbSfUCV6CM7qtQl6Fm4E1U22UqcAYqvZ42fgJMxH6vdYc5nkBlSW6Pq4fbS6hb6jg0u9yGug7FyS5U1+UcVBbwbFSuMM1sQ1bXK4A9CcviqM0e9H80HdUxCpwIa4McygA/GfgAcCJqmGKKXUixupEv7nHsLc2agWNQ0d9OzC+PHNHIo1XeLCoe8kkqXiUtwKFoWXoEKqk3BpWLaC8cXsV8HT1J+tFTZKvn+DMqFZi1knvtyKg1O2lBHADcCVxEedNSAP4HJcsr0NNWHVUAAAAASUVORK5CYII=");
+
+ --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;
+}
+
+[data-theme="dark"] {
+ --primary-background: #171921;
+ --secondary-background: #1e202a;
+ --third-background: #2b2e3b;
+ --info-background: #008000;
+ --warning-background: #807000;
+ --error-background: #c03000;
+ --border: #0e1014;
+ --text: #fff;
+ --anchor: #8be9fd;
+ --anchor-focus: #8be9fd;
+ --input-focus: #8be9fd;
+ --strong: #bd93f9;
+ --hint: #7A7C85;
+ --nim-sprite-base64: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARMAAABMCAYAAABOBlMuAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjE4OjIyKzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDplZGViMzU3MC1iNmZjLWQy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");
+
+ --keyword: #ff79c6;
+ --identifier: #f8f8f2;
+ --comment: #6272a4;
+ --operator: #ff79c6;
+ --punctuation: #f8f8f2;
+ --other: #f8f8f2;
+ --escapeSequence: #bd93f9;
+ --number: #bd93f9;
+ --literal: #f1fa8c;
+ --program: #9090c0;
+ --option: #90b010;
+ --raw-data: #8be9fd;
+}
+
+.theme-switch-wrapper {
+ display: flex;
+ align-items: center;
+}
+
+.theme-switch-wrapper em {
+ margin-left: 10px;
+ font-size: 1rem;
+}
+
+.theme-switch {
+ display: inline-block;
+ height: 22px;
+ position: relative;
+ width: 50px;
+}
+
+.theme-switch input {
+ display: none;
+}
+
+.slider {
+ background-color: #ccc;
+ bottom: 0;
+ cursor: pointer;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ transition: .4s;
+}
+
+.slider:before {
+ background-color: #fff;
+ bottom: 4px;
+ content: "";
+ height: 13px;
+ left: 4px;
+ position: absolute;
+ transition: .4s;
+ width: 13px;
+}
+
+input:checked + .slider {
+ background-color: #66bb6a;
+}
+
+input:checked + .slider:before {
+ transform: translateX(26px);
+}
+
+.slider.round {
+ border-radius: 17px;
+}
+
+.slider.round:before {
+ border-radius: 50%;
+}
+
+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%;
+}
+
+.column:first-child,
+.columns:first-child {
+ margin-left: 0; }
+
+.three.columns {
+ width: 22%;
+}
+
+.nine.columns {
+ width: 77.0%; }
+
+.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.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;
+}
+
+.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;
+}
+
+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; }
+
+.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: 3em;
+ padding: 1em;
+ border: 1px solid #4d4d4d;
+}
+
+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/ugh/ugh.html b/ugh/ugh.html
new file mode 100644
index 0000000..186f5c3
--- /dev/null
+++ b/ugh/ugh.html
@@ -0,0 +1,1348 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+src/regex
+
+
+
+
+
+
+
+
+
+
+
src/regex
+
+
+
+
+
+ Search:
+
+
+ Group by:
+
+ Section
+ Type
+
+
+
+
+
+
+
+
+
+
A library for parsing, compiling, and executing regular expressions. The match time is linear in the length of the text and the regular expression. So, it can handle input from untrusted users. The syntax is similar to PCRE but lacks a few features that can not be implemented while keeping the space/time complexity guarantees, ex: backreferences.
+
+
. any character except new line ( includes new line with s flag )
+\ d digit ( \ p { Nd } )
+\ D not digit
+\ pN One - letter name Unicode character class
+\ p { Greek } Unicode character class ( general category or script )
+\ PN Negated one - letter name Unicode character class
+\ P { Greek } negated Unicode character class ( general category or script )
+
[ xyz ] A character class matching either x , y or z ( union ) .
+[ ^ xyz ] A character class matching any character except x , y and z .
+[ a - z ] A character class matching any character in range a - z .
+[ [ : alpha : ] ] ASCII character class ( [ A - Za - z ] )
+[ [ : ^ alpha : ] ] Negated ASCII character class ( [ ^ A - Za - z ] )
+[ \ [ \ ] ] Escaping in character classes ( matching [ or ] )
+
xy concatenation ( x followed by y )
+x | y alternation ( x or y , prefer x )
+
x * zero or more of x ( greedy )
+x + one or more of x ( greedy )
+x ? zero or one of x ( greedy )
+x *? zero or more of x ( ungreedy / lazy )
+x +? one or more of x ( ungreedy / lazy )
+x ?? zero or one of x ( ungreedy / lazy )
+x { n , m } at least n x and at most m x ( greedy )
+x { n , } at least n x ( greedy )
+x { n } exactly n x
+x { n , m } ? at least n x and at most m x ( ungreedy / lazy )
+x { n , } ? at least n x ( ungreedy / lazy )
+x { n } ? exactly n x
+
^ the beginning of text ( or start - of - line with multi - line mode )
+$ the end of text ( or end - of - line with multi - line mode )
+\ A only the beginning of text ( even with multi - line mode enabled )
+\ z only the end of text ( even with multi - line mode enabled )
+\ b a Unicode word boundary ( \ w on one side and \ W , \ A , or \ z on other )
+\ B not a Unicode word boundary
+
( exp ) numbered capture group ( indexed by opening parenthesis )
+( ? P < name > exp ) named ( also numbered ) capture group ( allowed chars : [ _0 - 9 a - zA - Z ] )
+( ?: exp ) non - capturing group
+( ? flags ) set flags within current group
+( ? flags : exp ) set flags for exp ( non - capturing ) Flags are each a single character. For example, (?x) sets the flag x and (?-x) clears the flag x. Multiple flags can be set or cleared at the same time: (?xy) sets both the x and y flags, (?x-y) sets the x flag and clears the y flag, and (?-xy) clears both the x and y flags.
+
i case - insensitive : letters match both upper and lower case
+m multi - line mode : ^ and $ match begin / end of line
+s allow . to match \ L ( new line )
+U swap the meaning of x * and x *? ( un - greedy mode )
+u Unicode support ( enabled by default )
+x ignore whitespace and allow line comments ( starting with All flags are disabled by default unless stated otherwise
+
The regex accepts passing a set of flags:
+
regexCaseless same as ( ? i )
+regexMultiline same as ( ? m )
+regexDotAll same as ( ? s )
+regexUngreedy same as ( ? U )
+regexAscii same as ( ?- u )
+regexExtended same as ( ? x )
+regexArbitraryBytes treat both the regex and the input text
+ as arbitrary byte sequences Note:
+Read the
Match arbitrary bytes section to learn more about the arbitrary bytes mode and ascii mode
+
+
\* literal * , works for any punctuation character : \.+*? ( ) | [ ] { } ^$
+\ a bell ( \ x07 )
+\ f form feed ( \ x0C )
+\ t horizontal tab
+\ n new line ( \ L )
+\ r carriage return
+\ v vertical tab ( \ x0B )
+\ 123 octal character code ( up to three digits )
+\ x7F hex character code ( exactly two digits )
+\ x { 10 FFFF } any hex character code corresponding to a Unicode code point
+\ u007F hex character code ( exactly four digits )
+\ U0010FFFF hex character code ( exactly eight digits )
+
These classes are based on the definitions provided in UTS#18
+
\ d digit ( \ p { Nd } )
+\ D not digit
+\ s whitespace ( \ p { White_Space } )
+\ S not whitespace
+\ w word character ( \ p { Alphabetic } + \ p { M } + \ d + \ p { Pc } + \ p { Join_Control } )
+\ W not word character
+
[ [ : alnum : ] ] alphanumeric ( [ 0 - 9 A - Za - z ] )
+[ [ : alpha : ] ] alphabetic ( [ A - Za - z ] )
+[ [ : ascii : ] ] ASCII ( [ \ x00 -\ x7F ] )
+[ [ : blank : ] ] blank ( [ \ t ] )
+[ [ : cntrl : ] ] control ( [ \ x00 -\ x1F \ x7F ] )
+[ [ : digit : ] ] digits ( [ 0 - 9 ] )
+[ [ : graph : ] ] graphical ( [ !-~ ] )
+[ [ : lower : ] ] lower case ( [ a - z ] )
+[ [ : print : ] ] printable ( [ -~ ] )
+[ [ : punct : ] ] punctuation ( [ !-/:-@\ [ - ` { -~ ] )
+[ [ : space : ] ] whitespace ( [ \ t \ n \ v \ f \ r ] )
+[ [ : upper : ] ] upper case ( [ A - Z ] )
+[ [ : word : ] ] word characters ( [ 0 - 9 A - Za - z_ ] )
+[ [ : xdigit : ] ] hex digit ( [ 0 - 9 A - Fa - f ] )
+
( ?= regex ) A positive lookahead assertion
+( ?! regex ) A negative lookahead assertion
+( ?<= regex ) A positive lookbehind assertion
+( ?<! regex ) A negative lookbehind assertion Any regex expression is a valid lookaround; groups are captured as well. Beware, lookarounds containing repetitions (* , + , and {n,} ) may run in polynomial time.
+
+
+
The match function match a text from start to end, similar to ^regex$ . This means the whole text needs to match the regex for this function to return true .
+
let text = "nim c --styleCheck:hint --colors:off regex.nim"
+var m = RegexMatch2 ( )
+if match ( text , re2"nim c (?:--(\w+:\w+) *)+ (\w+).nim" , m ) :
+ doAssert text [ m . group ( 0 ) ] == "colors:off"
+ doAssert text [ m . group ( 1 ) ] == "regex"
+else :
+ doAssert false , "no match"
+
Like most other regex engines, this library only captures the last repetition in a repeated group (* , + , {n} ). Note how in the previous example both styleCheck:hint and colors:off are matched in the same group but only the last captured match (colors:off ) is returned.
+
To check if a capture group did match you can use reNonCapture . For example doAssert m.group(0) != reNonCapture . This is useful to disambiguate empty captures and non-matched captures. Since both return an empty string when slicing the text.
+
The space complexity for captures is O(regex_len * groups_count) , and so it can be used to match untrusted text.
+
+
The find function will find the first piece of text that match a given regex.
+
let text = """
+The Continental's email list:
+john_wick@continental.com
+winston@continental.com
+ms_perkins@continental.com
+"""
+var match = ""
+var capture = ""
+var m = RegexMatch2 ( )
+if find ( text , re2"(\w+)@\w+\.\w+" , m ) :
+ match = text [ m . boundaries ]
+ capture = text [ m . group ( 0 ) ]
+doAssert match == "john_wick@continental.com"
+doAssert capture == "john_wick"
+
The findAll function will find all pieces of text that match a given regex, returning their boundaries and captures/submatches.
+
let text = """
+The Continental's email list:
+john_wick@continental.com
+winston@continental.com
+ms_perkins@continental.com
+"""
+var matches = newSeq [ string ] ( )
+var captures = newSeq [ string ] ( )
+for m in findAll ( text , re2"(\w+)@\w+\.\w+" ) :
+ matches . add text [ m . boundaries ]
+ captures . add text [ m . group ( 0 ) ]
+doAssert matches == @ [
+ "john_wick@continental.com" ,
+ "winston@continental.com" ,
+ "ms_perkins@continental.com"
+]
+doAssert captures == @ [ "john_wick" , "winston" , "ms_perkins" ]
+
Verbose mode ( ? x ) makes regexes more readable by allowing comments and multi-lines within the regular expression itself. The caveat is spaces and pound signs must be scaped to be matched.
+
const exp = re2"""(?x)
+\# # the hashtag
+\w+ # hashtag words
+"""
+let text = "#NimLang"
+doAssert match ( text , exp )
+
The match macro is sometimes more convenient, and faster than the function version. It will run a full match on the whole string, similar to ^ regex $ .
+
A matches: seq[string] variable is injected into the scope, and it contains the submatches for every capture group.
+
var matched = false
+let text = "[my link](https://example.com)"
+match text , rex"\[([^\]]+)\]\((https?://[^)]+)\)" :
+ doAssert matches == @ [ "my link" , "https://example.com" ]
+ matched = true
+doAssert matched
+
UTF-8 validation on the input text is only done in debug mode for perf reasons. The behaviour on invalid UTF-8 input (i.e: malformed, corrupted, truncated, etc) when compiling in release/danger mode is currently undefined, and it will likely result in an internal AssertionDefect or some other error.
+
What can be done about this is validating the input text to avoid passing invalid input to the match function.
+
import unicode
+
+doAssert validateUtf8 ( "abc" ) == - 1
+
+doAssert validateUtf8 ( " \xf8 \xa1 \xa1 \xa1 \xa1 " ) != - 1 Note at the time of writting this, Nim's validateUtf8 is not strict enough and so you are better off using nim-unicodeplus's verifyUtf8 function.
+
+
Setting the regexArbitraryBytes flag will treat both the regex and the input text as byte sequences. This flag makes ascii mode the default.
+
Note:
+Do not confuse this with ascii mode. Setting the regex to ascii mode (?-u) alone is not enough to match arbitrary bytes, since both the input and regex will be treated as UTF8.
+
const flags = { regexArbitraryBytes }
+doAssert match ( " \xff " , re2 ( r"\xff" , flags ) )
+doAssert match ( " \xf8 \xa1 \xa1 \xa1 \xa1 " , re2 ( r".+" , flags ) ) Beware of (un)expected behaviour when mixin UTF-8 characters.
+
const flags = { regexArbitraryBytes }
+doAssert match ( "Ⓐ" , re2 ( r"Ⓐ" , flags ) )
+doAssert match ( "ⒶⒶ" , re2 ( r"(Ⓐ)+" , flags ) )
+doAssert not match ( "ⒶⒶ" , re2 ( r"Ⓐ+" , flags ) ) The last line in the above example won't match because the regex is parsed as a byte sequence. The Ⓐ character is composed of multiple bytes (\xe2\x92\xb6 ), and only the last byte is affected by the + operator.
+
+
Passing a regex literal or assigning it to a const will compile the regex at compile time. Errors in the expression will be catched at compile time this way.
+
Do not confuse the regex compilation with the matching operation. The following examples do the matching at runtime. But matching at compile-time is supported as well.
+
let text = "abc"
+block :
+ const rexp = re2".+"
+ doAssert match ( text , rexp )
+block :
+ doAssert match ( text , re2".+" )
+block :
+ func myFn ( s : string , exp : static string ) =
+ const rexp = re2 ( exp )
+ doAssert match ( s , rexp )
+ myFn ( text , r".+" ) Using a const can avoid confusion when passing flags:
+
let text = "abc"
+block :
+ const rexp = re2 ( r".+" , { regexDotAll } )
+ doAssert match ( text , rexp )
+block :
+ doAssert match ( text , re2 ( r".+" , { regexDotAll } ) )
+block :
+
+
+ let flags = { regexDotAll }
+ doAssert match ( text , re2 ( r".+" , flags ) )
+
+
Most of the time compiling the regex at runtime can be avoided, and it should be avoided. Nim has really good compile-time capabilities like reading files, constructing strings, and so on. However, it cannot be helped in cases where the regex is passed to the program at runtime (from terminal input, network, or text files).
+
To compile the regex at runtime pass the regex expression as a var/let .
+
let text = "abc"
+block :
+ var rexp = r".+"
+ doAssert match ( text , re2 ( rexp ) )
+block :
+ let rexp = r".+"
+ doAssert match ( text , re2 ( rexp ) )
+block :
+ func myFn ( s : string , exp : string ) =
+ doAssert match ( s , re2 ( exp ) )
+ myFn ( text , r".+" )
+
+
+
+types , common , compiler , nfatype , nfafindall , nfafindall2 , nfamatch , nfamatch2 , litopt , nfamacro , parser , exptransformation , dotgraph
+
+
+
+
+
+
+
func contains ( s : string ; pattern : Regex ) : bool {.... raises : [ ] ,
+ deprecated : "use contains(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use contains(string, Regex2) instead
+
+
+
+
+
+
+
+
func contains ( s : string ; pattern : Regex2 ) : bool {.... raises : [ ] , tags : [ RootEffect ] .}
+
+
+
+Example:
+doAssert re2"bc" in "abcd"
+doAssert re2"(23)+" in "23232"
+doAssert re2"^(23)+$" notin "23232"
+
+
+
+
+
func endsWith ( s : string ; pattern : Regex ) : bool {.... raises : [ ] ,
+ deprecated : "use endsWith(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use endsWith(string, Regex2) instead
+
+
+
+
+
+
+
+
func endsWith ( s : string ; pattern : Regex2 ) : bool {.... raises : [ ] , tags : [ RootEffect ] .}
+
+
+return whether the string ends with the pattern or not
+Example:
+doAssert "abc" . endsWith ( re2"\w" )
+doAssert not "abc" . endsWith ( re2"\d" )
+
+
+
+
+
func escapeRe ( s : string ) : string {.... raises : [ ] , tags : [ ] .}
+
+
+Escape special regex characters in s so that it can be matched verbatim
+
+
+
+
+
func find ( s : string ; pattern : Regex2 ; m : var RegexMatch2 ; start = 0 ) : bool {.
+ ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+search through the string looking for the first location where there is a match
+Example:
+var m = RegexMatch2 ( )
+doAssert "abcd" . find ( re2"bc" , m ) and
+ m . boundaries == 1 .. 2
+doAssert not "abcd" . find ( re2"de" , m )
+doAssert "2222" . find ( re2"(22)*" , m ) and
+ m . group ( 0 ) == 2 .. 3
+
+
+
+
+
func find ( s : string ; pattern : Regex ; m : var RegexMatch ; start = 0 ) : bool {.
+ ... raises : [ ] , deprecated : "use find(string, Regex2, var RegexMatch2) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use find(string, Regex2, var RegexMatch2) instead
+
+
+
+
+
+
+
+
func findAll ( s : string ; pattern : Regex2 ; start = 0 ) : seq [ RegexMatch2 ] {.
+ ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+
+
+
+
+
+
func findAll ( s : string ; pattern : Regex ; start = 0 ) : seq [ RegexMatch ] {.
+ ... raises : [ ] , deprecated : "use findAll(string, Regex2) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use findAll(string, Regex2) instead
+
+
+
+
+
+
+
+
func findAllBounds ( s : string ; pattern : Regex2 ; start = 0 ) : seq [ Slice [ int ] ] {.
+ ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+
+
+
+
+
+
func findAllBounds ( s : string ; pattern : Regex ; start = 0 ) : seq [ Slice [ int ] ] {.
+ ... raises : [ ] , deprecated : "use findAllBounds(string, Regex2) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use findAllBounds(string, Regex2) instead
+
+
+
+
+
+
+
+
func findAndCaptureAll ( s : string ; pattern : Regex ) : seq [ string ] {.... raises : [ ] ,
+ deprecated : "use findAll(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use findAll(string, Regex2) instead
+
+
+
+
+
+
+
+
func group ( m : RegexMatch2 ; i : int ) : Slice [ int ] {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+return slice for a given group. Slice of start > end are empty matches (i.e.: re2"(\d?)" ) and they are included same as in PCRE.
+Example:
+let text = "abc"
+var m = RegexMatch2 ( )
+doAssert text . match ( re2"(\w)+" , m )
+doAssert text [ m . group ( 0 ) ] == "c"
+
+
+
+
+
func group ( m : RegexMatch2 ; s : string ) : Slice [ int ] {.inline , ... raises : [ KeyError ] ,
+ tags : [ ] .}
+
+
+return slices for a given named group
+Example:
+let text = "abc"
+var m = RegexMatch2 ( )
+doAssert text . match ( re2"(?P<foo>\w)+" , m )
+doAssert text [ m . group ( "foo" ) ] == "c"
+
+
+
+
+
func group ( m : RegexMatch ; groupName : string ; text : string ) : seq [ string ] {.
+ inline , ... raises : [ KeyError ] , deprecated , tags : [ ] .}
+
+
+ Deprecated
+
+
+
+
+
+
+
+
func group ( m : RegexMatch ; i : int ) : seq [ Slice [ int ] ] {.inline , ... raises : [ ] ,
+ deprecated : "use group(RegexMatch2, int)" , tags : [ ] .}
+
+
+ Deprecated: use group(RegexMatch2, int)
+
+
+
+
+
+
+
+
func group ( m : RegexMatch ; i : int ; text : string ) : seq [ string ] {.inline ,
+ ... raises : [ ] , deprecated , tags : [ ] .}
+
+
+ Deprecated
+
+
+
+
+
+
+
+
func group ( m : RegexMatch ; s : string ) : seq [ Slice [ int ] ] {.inline ,
+ ... raises : [ KeyError ] , deprecated : "use group(RegexMatch2, string)" , tags : [ ] .}
+
+
+ Deprecated: use group(RegexMatch2, string)
+
+
+
+
+
+
+
+
func groupFirstCapture ( m : RegexMatch ; groupName : string ; text : string ) : string {.
+ inline , ... raises : [ KeyError ] , deprecated , tags : [ ] .}
+
+
+ Deprecated
+
+
+
+
+
+
+
+
func groupFirstCapture ( m : RegexMatch ; i : int ; text : string ) : string {.inline ,
+ ... raises : [ ] , deprecated , tags : [ ] .}
+
+
+ Deprecated
+
+
+
+
+
+
+
+
func groupLastCapture ( m : RegexMatch ; groupName : string ; text : string ) : string {.
+ inline , ... raises : [ KeyError ] ,
+ deprecated : "use group(RegexMatch2, string) instead" , tags : [ ] .}
+
+
+ Deprecated: use group(RegexMatch2, string) instead
+
+
+
+
+
+
+
+
func groupLastCapture ( m : RegexMatch ; i : int ; text : string ) : string {.inline ,
+ ... raises : [ ] , deprecated : "use group(RegexMatch2, int) instead" , tags : [ ] .}
+
+
+ Deprecated: use group(RegexMatch2, int) instead
+
+
+
+
+
+
+
+
func groupNames ( m : RegexMatch ) : seq [ string ] {.inline , ... raises : [ ] ,
+ deprecated : "use groupNames(RegexMatch2)" , tags : [ ] .}
+
+
+ Deprecated: use groupNames(RegexMatch2)
+
+
+
+
+
+
+
+
func groupNames ( m : RegexMatch2 ) : seq [ string ] {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+return the names of capturing groups.
+Example:
+let text = "hello world"
+var m = RegexMatch2 ( )
+doAssert text . match ( re2"(?P<greet>hello) (?P<who>world)" , m )
+doAssert m . groupNames == @ [ "greet" , "who" ]
+
+
+
+
+
func groupsCount ( m : RegexMatch ) : int {.inline , ... raises : [ ] , deprecated : "use groupsCount(RegexMatch2)" ,
+ tags : [ ] .}
+
+
+ Deprecated: use groupsCount(RegexMatch2)
+
+
+
+
+
+
+
+
func groupsCount ( m : RegexMatch2 ) : int {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+return the number of capturing groups
+Example:
+var m = RegexMatch2 ( )
+doAssert "ab" . match ( re2"(a)(b)" , m )
+doAssert m . groupsCount == 2
+
+
+
+
+
func isInitialized ( re : Regex ) : bool {.inline , ... raises : [ ] , deprecated : "use isInitialized(Regex2) instead" ,
+ tags : [ ] .}
+
+
+ Deprecated: use isInitialized(Regex2) instead
+
+
+
+
+
+
+
+
func isInitialized ( re : Regex2 ) : bool {.inline , ... raises : [ ] , tags : [ ] .}
+
+
+Check whether the regex has been initialized
+Example:
+var re : Regex2
+doAssert not re . isInitialized
+re = re2"foo"
+doAssert re . isInitialized
+
+
+
+
+
func match ( s : string ; pattern : Regex ) : bool {.... raises : [ ] ,
+ deprecated : "use match(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use match(string, Regex2) instead
+
+
+
+
+
+
+
+
func match ( s : string ; pattern : Regex2 ) : bool {.... raises : [ ] , tags : [ RootEffect ] .}
+
+
+
+
+
+
+
+
func match ( s : string ; pattern : Regex2 ; m : var RegexMatch2 ; start = 0 ) : bool {.
+ ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+return a match if the whole string matches the regular expression. This is similar to find(text, re"^regex$", m) but has better performance
+Example:
+var m = RegexMatch2 ( )
+doAssert "abcd" . match ( re2"abcd" , m )
+doAssert not "abcd" . match ( re2"abc" , m )
+
+
+
+
+
func match ( s : string ; pattern : Regex ; m : var RegexMatch ; start = 0 ) : bool {.
+ ... raises : [ ] ,
+ deprecated : "use match(string, Regex2, var RegexMatch2) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use match(string, Regex2, var RegexMatch2) instead
+
+
+
+
+
+
+
+
func re ( s : static string ) : static [ Regex ] {.
+ ... deprecated : "use re2(static string) instead" .}
+
+
+ Deprecated: use re2(static string) instead
+
+
+
+
+
+
+
+
func re ( s : string ) : Regex {.... raises : [ RegexError ] ,
+ deprecated : "use re2(string) instead" , tags : [ ] .}
+
+
+ Deprecated: use re2(string) instead
+
+
+
+
+
+
+
+
func re2 ( s : static string ; flags : static RegexFlags = { } ) : static [ Regex2 ]
+
+
+Parse and compile a regular expression at compile-time
+
+
+
+
+
func re2 ( s : string ; flags : RegexFlags = { } ) : Regex2 {.... raises : [ RegexError ] ,
+ tags : [ ] .}
+
+
+Parse and compile a regular expression at run-time
+Example:
+let abcx = re2"abc\w"
+let abcx2 = re2 ( r"abc\w" )
+let pat = r"abc\w"
+let abcx3 = re2 ( pat )
+
+
+
+
+
func replace ( s : string ; pattern : Regex2 ;
+ by : proc ( m : RegexMatch2 ; s : string ) : string ; limit = 0 ) : string {.
+ ... raises : [ ] , effectsOf : by , ... tags : [ RootEffect ] .}
+
+
+Replace matched substrings.
+If limit is given, at most limit replacements are done. limit of 0 means there is no limit
+
+Example:
+proc removeStars ( m : RegexMatch2 , s : string ) : string =
+ result = s [ m . group ( 0 ) ]
+ if result == "*" :
+ result = ""
+let text = "**this is a test**"
+doAssert text . replace ( re2"(\*)" , removeStars ) == "this is a test"
+
+
+
+
+
func replace ( s : string ; pattern : Regex2 ; by : string ; limit = 0 ) : string {.
+ ... raises : [ ValueError ] , tags : [ RootEffect ] .}
+
+
+Replace matched substrings.
+Matched groups can be accessed with $N notation, where N is the group's index, starting at 1 (1-indexed). $$ means literal $ .
+If limit is given, at most limit replacements are done. limit of 0 means there is no limit
+
+Example:
+doAssert "aaa" . replace ( re2"a" , "b" , 1 ) == "baa"
+doAssert "abc" . replace ( re2"(a(b)c)" , "m($1) m($2)" ) ==
+ "m(abc) m(b)"
+doAssert "Nim is awesome!" . replace ( re2"(\w\B)" , "$1_" ) ==
+ "N_i_m i_s a_w_e_s_o_m_e!"
+
+
+
+
+
func replace ( s : string ; pattern : Regex ;
+ by : proc ( m : RegexMatch ; s : string ) : string ; limit = 0 ) : string {.
+ ... raises : [ ] , effectsOf : by , ... deprecated : "use replace(string, Regex2, proc(RegexMatch2, string): string) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use replace(string, Regex2, proc(RegexMatch2, string): string) instead
+
+
+
+
+
+
+
+
func replace ( s : string ; pattern : Regex ; by : string ; limit = 0 ) : string {.
+ ... raises : [ ValueError ] ,
+ deprecated : "use replace(string, Regex2, string) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use replace(string, Regex2, string) instead
+
+
+
+
+
+
+
+
func rex ( s : string ) : RegexLit {.... raises : [ ] , tags : [ ] .}
+
+
+Raw regex literal string
+
+
+
+
+
func split ( s : string ; sep : Regex ) : seq [ string ] {.... raises : [ ] ,
+ deprecated : "use split(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use split(string, Regex2) instead
+
+
+
+
+
+
+
+
func split ( s : string ; sep : Regex2 ) : seq [ string ] {.... raises : [ ] , tags : [ RootEffect ] .}
+
+
+return not matched substrings
+Example:
+doAssert split ( "11a22Ϊ33Ⓐ44弢55" , re2"\d+" ) ==
+ @ [ "" , "a" , "Ϊ" , "Ⓐ" , "弢" , "" ]
+
+
+
+
+
func splitIncl ( s : string ; sep : Regex ) : seq [ string ] {.... raises : [ ] ,
+ deprecated : "use splitIncl(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use splitIncl(string, Regex2) instead
+
+
+
+
+
+
+
+
func splitIncl ( s : string ; sep : Regex2 ) : seq [ string ] {.... raises : [ ] ,
+ tags : [ RootEffect ] .}
+
+
+return not matched substrings, including captured groups
+Example:
+let
+ parts = splitIncl ( "a,b" , re2"(,)" )
+ expected = @ [ "a" , "," , "b" ]
+doAssert parts == expected
+
+
+
+
+
func startsWith ( s : string ; pattern : Regex2 ; start = 0 ) : bool {.... raises : [ ] ,
+ tags : [ RootEffect ] .}
+
+
+return whether the string starts with the pattern or not
+Example:
+doAssert "abc" . startsWith ( re2"\w" )
+doAssert not "abc" . startsWith ( re2"\d" )
+
+
+
+
+
func startsWith ( s : string ; pattern : Regex ; start = 0 ) : bool {.... raises : [ ] ,
+ deprecated : "use startsWith(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use startsWith(string, Regex2) instead
+
+
+
+
+
+
+
+
func toPattern ( s : string ) : Regex {.... raises : [ RegexError ] ,
+ deprecated : "Use `re2(string)` instead" ,
+ tags : [ ] .}
+
+
+ Deprecated: Use `re2(string)` instead
+
+
+
+
+
+
+
+
+
+
+
+
+
iterator findAll ( s : string ; pattern : Regex2 ; start = 0 ) : RegexMatch2 {.inline ,
+ ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+search through the string and return each match. Empty matches (start > end) are included
+Example:
+let text = "abcabc"
+var bounds = newSeq [ Slice [ int ] ] ( )
+var found = newSeq [ string ] ( )
+for m in findAll ( text , re2"bc" ) :
+ bounds . add m . boundaries
+ found . add text [ m . boundaries ]
+doAssert bounds == @ [ 1 .. 2 , 4 .. 5 ]
+doAssert found == @ [ "bc" , "bc" ]
+
+
+
+
+
iterator findAll ( s : string ; pattern : Regex ; start = 0 ) : RegexMatch {.inline ,
+ ... raises : [ ] , deprecated : "use findAll(string, Regex2) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use findAll(string, Regex2) instead
+
+
+
+
+
+
+
+
iterator findAllBounds ( s : string ; pattern : Regex2 ; start = 0 ) : Slice [ int ] {.
+ inline , ... raises : [ ] , tags : [ RootEffect ] .}
+
+
+search through the string and return each match. Empty matches (start > end) are included
+Example:
+let text = "abcabc"
+var bounds = newSeq [ Slice [ int ] ] ( )
+for bd in findAllBounds ( text , re2"bc" ) :
+ bounds . add bd
+doAssert bounds == @ [ 1 .. 2 , 4 .. 5 ]
+
+
+
+
+
iterator findAllBounds ( s : string ; pattern : Regex ; start = 0 ) : Slice [ int ] {.
+ inline , ... raises : [ ] , deprecated : "use findAllBounds(string, Regex2) instead" ,
+ tags : [ RootEffect ] .}
+
+
+ Deprecated: use findAllBounds(string, Regex2) instead
+
+
+
+
+
+
+
+
iterator group ( m : RegexMatch ; i : int ) : Slice [ int ] {.inline , ... raises : [ ] ,
+ deprecated , tags : [ ] .}
+
+
+ Deprecated
+
+
+
+
+
+
+
+
iterator group ( m : RegexMatch ; s : string ) : Slice [ int ] {.inline ,
+ ... raises : [ KeyError ] , deprecated , tags : [ ] .}
+
+
+ Deprecated
+
+
+
+
+
+
+
+
iterator split ( s : string ; sep : Regex ) : string {.inline , ... raises : [ ] ,
+ deprecated : "use split(string, Regex2) instead" , tags : [ RootEffect ] .}
+
+
+ Deprecated: use split(string, Regex2) instead
+
+
+
+
+
+
+
+
iterator split ( s : string ; sep : Regex2 ) : string {.inline , ... raises : [ ] ,
+ tags : [ RootEffect ] .}
+
+
+return not matched substrings
+Example:
+var found = newSeq [ string ] ( )
+for s in split ( "11a22Ϊ33Ⓐ44弢55" , re2"\d+" ) :
+ found . add s
+doAssert found == @ [ "" , "a" , "Ϊ" , "Ⓐ" , "弢" , "" ]
+
+
+
+
+
+
+
+
+
+
macro match ( text : string ; regex : RegexLit ; body : untyped ) : untyped
+
+
+return a match if the whole string matches the regular expression. This is similar to the match function, but faster. Notice it requires a raw regex literal string as second parameter; the regex must be known at compile time, and cannot be a var/let/const
+A matches: seq[string] variable is injected into the scope, and it contains the submatches for every capture group. If a group is repeated (ex: ( \\ w ) + ), it will contain the last capture for that group.
+Note: Only available in Nim +1.1
+
+Example:
+match "abc" , rex"(a(b)c)" :
+ doAssert matches == @ [ "abc" , "b" ]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Made with Nim. Generated: 2024-11-28 07:17:02 UTC
+
+
+
+
+
+
+