defuddle 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.full.js +1 -19181
- package/dist/index.js +1 -6
- package/package.json +3 -3
- package/dist/index.full.js.map +0 -1
package/dist/index.full.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.full.js","mappings":"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BAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,oBAAoB,IAAI,qBAAqB,IAAI,iJAAiJ,IAAI,IAAI,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,IAAI,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,IAAI,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,IAAI,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,IAAI,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,IAAI,4BAA4B,KAAK,4BAA4B,IAAI,4BAA4B,IAAI,4BAA4B,IAAI,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,IAAI,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,KAAK,6BAA6B,KAAK,6BAA6B,IAAI,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,IAAI,6BAA6B,IAAI,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,IAAI,6BAA6B,IAAI,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,IAAI,6BAA6B,KAAK,6BAA6B,IAAI,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,IAAI,6BAA6B,KAAK,6BAA6B,MAAM,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,8BAA8B,KAAK,8BAA8B,IAAI,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,IAAI,8BAA8B,IAAI,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,IAAI,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,8BAA8B,IAAI,8BAA8B,KAAK,4BAA4B,IAAI,4BAA4B,KAAK,4BAA4B,IAAI,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,IAAI,4BAA4B,KAAK,4BAA4B,IAAI,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,IAAI,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,kCAAkC,KAAK,kCAAkC,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,kCAAkC,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,mCAAmC,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,+BAA+B,KAAK,4BAA4B,KAAK,+BAA+B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,gCAAgC,KAAK,4BAA4B,KAAK,gCAAgC,KAAK,qCAAqC,MAAM,cAAc,WAAW,+BAA+B,YAAY,YAAY,oDAAoD,SAAS,YAAY,aAAa,QAAQ,sCAAsC,SAAS,yBAAyB,cAAc,yCAAyC,6BAA6B,wBAAwB,EAAE,MAAM;AAC3ojJ;;;;;;;;;;ACDa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,YAAY;AACZ,YAAY;AACZ,cAAc;AACd,cAAc;AACd;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE,oEAAoE;AACpE,mEAAmE;AACnE,mEAAmE;AACnE,mEAAmE;AACnE;AACA,qEAAqE;AACrE,oEAAoE;AACpE,2EAA2E;AAC3E,yDAAyD;AACzD,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kCAAkC,qBAAqB;AACvD;AACA;AACA;AACA,aAAa,YAAY;AACzB;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,0BAA0B;AAC9C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB,0BAA0B;AAC5C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;;AAE3B;AACA;AACA,yBAAyB,wCAAwC;AACjE;;AAEA;;AAEA;AACA;AACA;AACA,mBAAmB,uBAAuB,GAAG,mBAAmB;AAChE;AACA;;AAEA;AACA,yBAAyB,OAAO;AAChC;;AAEA;AACA;AACA;AACA,oBAAoB,KAAK,IAAI,oCAAoC;AACjE;AACA;;AAEA;;AAEA;AACA,kBAAkB,0BAA0B;AAC5C;AACA;;AAEA,iBAAiB,QAAQ;;AAEzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;;AAEA;AACA,6BAA6B,wBAAwB;AACrD;AACA,2BAA2B,wCAAwC;AACnE;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,8BAA8B,SAAS,SAAS,SAAS;;AAEzD;AACA;AACA;AACA;AACA,qBAAqB,uBAAuB,GAAG,mBAAmB;AAClE;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,0BAA0B;AAC9C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,wCAAwC;AACnE;;AAEA;;AAEA;AACA;AACA;AACA,qBAAqB,uBAAuB,GAAG,mBAAmB;AAClE;AACA;;AAEA;AACA,2BAA2B,OAAO;AAClC;;AAEA;;AAEA,oBAAoB,0BAA0B;AAC9C;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,oBAAoB;AACpB,oBAAoB;AACpB,IAAI;AACJ;AACA;AACA;AACA,uBAAuB;AACvB,QAAQ;AACR,uBAAuB;AACvB,QAAQ;AACR,uBAAuB;AACvB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,0BAA0B;;AAE1B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,qDAAqD;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA,+CAA+C,eAAe;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,KAAK;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,OAAO;AAClC,8BAA8B,OAAO;AACrC,8BAA8B;AAC9B,4BAA4B,OAAO;AACnC,8BAA8B,OAAO;AACrC,8BAA8B;AAC9B,2BAA2B;AAC3B,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;AAC7C,6CAA6C;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,gBAAgB,4BAA4B;AAC5C;AACA;AACA;;AAEA;AACA,yCAAyC;AACzC,gBAAgB,wBAAwB;AACxC;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA,sDAAsD;AACtD;AACA;;AAEA,sDAAsD;AACtD;AACA;;AAEA,sDAAsD;AACtD;AACA;;AAEA,sDAAsD;AACtD;AACA;;AAEA,sDAAsD;AACtD;AACA;;AAEA,sDAAsD;AACtD;AACA;;AAEA,sDAAsD;AACtD;AACA;;AAEA,sDAAsD;AACtD;AACA;;AAEA,sDAAsD;AACtD;AACA;;AAEA;AACA,sDAAsD;AACtD;AACA;AACA;;AAEA;AACA,gBAAgB,QAAQ;AACxB,sDAAsD;AACtD;AACA;;AAEA,sDAAsD;AACtD;AACA;;AAEA,sDAAsD;AACtD;AACA;;AAEA,sDAAsD;AACtD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB;AACvB,wBAAwB;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,uBAAuB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA,wDAAwD;AACxD,oCAAoC,cAAc;AAClD;AACA,kBAAkB,0BAA0B;AAC5C;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,sBAAsB,2BAA2B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,kBAAkB,4BAA4B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gCAAgC,GAAG;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0EAA0E,EAAE;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,uBAAuB;AACzC;AACA;;AAEA,kBAAkB,uBAAuB;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA,kDAAkD,4BAA4B;AAC9E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,qBAAqB;AACrB;AACA,MAAM;AACN;AACA,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,sCAAsC,mBAAmB;AACzD;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D,2DAA2D;AAC3D,mBAAmB;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA,gDAAgD,kBAAkB;AAClE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,eAAe;AACf;AACA;AACA,uCAAuC;AACvC,eAAe,sBAAsB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,uCAAuC;AACvC;AACA,wBAAwB;AACxB,oBAAoB;AACpB;AACA,uCAAuC,IAAI;AAC3C;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA,4BAA4B,6BAA6B;AACzD,wCAAwC;AACxC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,IAAI;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA,6BAA6B,4CAA4C;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,KAAK;AACpC,gCAAgC,UAAU;AAC1C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,UAAU;AAC1C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,eAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,0BAA0B;AAC1B;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kBAAkB,uBAAuB;AACzC;AACA;AACA;AACA;;AAEA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB;AACtB,sBAAsB;;AAEtB;AACA,6CAA6C;AAC7C;AACA;AACA,yBAAyB,eAAe,EAAE,eAAe;AACzD;AACA,iCAAiC,cAAc;AAC/C;AACA,gCAAgC,qBAAqB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+CAA+C,IAAI;AACnD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA,gCAAgC,QAAQ;AACxC;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA,0BAA0B,QAAQ;AAClC,iDAAiD,QAAQ;AACzD,2CAA2C,SAAS;AACpD;AACA;;AAEA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA,kBAAkB,iBAAiB;AACnC,oBAAoB,oBAAoB;AACxC;AACA;AACA;;AAEA,qCAAqC;AACrC,kBAAkB,oBAAoB;AACtC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,aAAa,2BAA2B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA,8CAA8C,2BAA2B;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wCAAwC,SAAS;AACjD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,wBAAwB;AACxB,wBAAwB;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,CAAC;;AAED;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,WAAW;AACX,CAAC;;AAED,wBAAwB,IAAI,IAAI;AAChC,yCAAyC;AACzC;AACA;AACA,WAAW;AACX,CAAC;;AAED,yBAAyB,IAAI,IAAI;AACjC,0CAA0C;AAC1C;AACA;AACA,WAAW;AACX,CAAC;;AAED,wBAAwB,IAAI,IAAI,IAAI;AACpC;AACA;AACA,4BAA4B;AAC5B;AACA,uCAAuC;AACvC;AACA;AACA;AACA,aAAa;AACb,IAAI;AACJ,aAAa;AACb;AACA,CAAC;;AAED,oBAAoB,IAAI,IAAI;AAC5B;AACA;AACA,8BAA8B,eAAe,aAAa;AAC1D,0CAA0C,cAAc,IAAI;;AAE5D,uBAAuB,IAAI,IAAI;AAC/B;AACA;AACA;AACA,aAAa;AACb,IAAI;AACJ,aAAa;AACb;AACA,CAAC;;AAED;AACA;AACA;AACA,+BAA+B,QAAQ;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,MAAM,QAAQ,WAAW;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,EAAE,QAAQ;AAC5B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B,WAAW,GAAG;;AAE5C;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB,0BAA0B;AAC1B,0BAA0B;;AAE1B;AACA,SAAS;AACT,WAAW;AACX,WAAW;AACX,aAAa;AACb;AACA;AACA;AACA;;AAEA,6BAA6B,EAAE;;AAE/B;AACA,uCAAuC,EAAE;;AAEzC;AACA,uCAAuC,OAAO,IAAI;;AAElD;AACA;;AAEA,UAAU,MAAM;AAChB,kBAAkB,EAAE,MAAM,EAAE,MAAM;AAClC;AACA;AACA,yBAAyB,iBAAiB,KAAK,MAAM;AACrD;;AAEA,IAAI,OAAO;AACX,wCAAwC;AACxC,wCAAwC;;AAExC;AACA;AACA;;AAEA,cAAc,UAAU,IAAI,UAAU,EAAE;AACxC,mCAAmC,UAAU,EAAE,QAAQ,SAAS;;AAEhE,YAAY,QAAQ;AACpB,gBAAgB,QAAQ;AACxB,kBAAkB,QAAQ;AAC1B,gCAAgC,uBAAuB;AACvD,oCAAoC,mBAAmB;AACvD,sCAAsC,kBAAkB;;AAExD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,IAAI;AACJ;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,SAAS,IAAI;AACtC;AACA,uCAAuC,YAAY,YAAY;AAC/D,iBAAiB,IAAI,qBAAqB;AAC1C;AACA,qBAAqB,WAAW,KAAK,SAAS;AAC9C;AACA;AACA,UAA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AmB,MAAM,WAAW,QAAQ,WAAW;AAChF,CAAC,QAAQ,WAAW,cAAc,WAAW;;;AAG7C;AACA;AACA,uCAAuC,eAAe;;AAEtD;AACA,yBAAyB,sBAAsB;AAC/C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF;AAClF;AACA,0EAA0E,EAAE;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA,CAAC;;AAED;AACA;AACA,2BAA2B,OAAO,SAAS,QAAQ;AACnD,2BAA2B,OAAO,QAAQ,OAAO,gBAAgB,QAAQ,OAAO,gBAAgB,QAAQ,QAAQ;AAChH,wDAAwD,UAAU;AAClE,6DAA6D,eAAe,WAAW,cAAc,UAAU;AAC/G,mEAAmE,WAAW,cAAc,WAAW,cAAc,YAAY,cAAc,WAAW;AAC1J,sEAAsE,WAAW,cAAc,WAAW,cAAc,YAAY,cAAc,WAAW;;AAE7J;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,wCAAwC;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,YAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,wBAAwB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,gBAAgB;AAChB,wGAAwG;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,yBAAyB,aAAa;AACtC;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qQAAqQ,EAAE;AACvQ,0NAA0N,EAAE;AAC5N;AACA;AACA,uNAAuN,EAAE;AACzN;AACA;AACA;AACA;AACA,mNAAmN,cAAc;AACjO;AACA,qBAAqB;AACrB;AACA;AACA,SAAS;AACT;AACA,yHAAyH,cAAc;AACvI;AACA,qBAAqB;AACrB;AACA;AACA,SAAS;AACT,sDAAsD;AACtD,+EAA+E,IAAI,uBAAuB;AAC1G,iDAAiD,MAAM,QAAQ,aAAa;AAC5E,qEAAqE;AACrE;AACA,qBAAqB;AACrB;AACA;AACA,SAAS;AACT,WAAW,uBAAuB,SAAS,SAAS,IAAI,KAAK;AAC7D,UAAU,cAAc;AACxB,YAAY,kBAAkB;AAC9B,mBAAmB;AACnB,kBAAkB;AAClB;AACA;AACA;AACA;AACA,WAAW,MAAM,sBAAsB,yDAAyD,aAAa,KAAK;AAClH,uCAAuC,2EAA2E;AAClH;AACA,iBAAiB,sBAAsB,0EAA0E,KAAK,aAAa,KAAK,eAAe;AACvJ,eAAe,sBAAsB,0EAA0E,KAAK,SAAS;AAC7H;AACA;AACA;AACA,WAAW,MAAM,sBAAsB,yDAAyD,aAAa,KAAK;AAClH,uCAAuC,2EAA2E;AAClH;AACA,iBA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B;AAC/D;AACA,mBAAmB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mCAAmC;AACtD;AACA;AACA,qBAAqB,6BAA6B;AAClD;AACA;AACA,OAAO;AACP,oCAAoC;AACpC,KAAK;AACL;AACA;AACA,kBAAkB,YAAY,WAAW,yBAAyB,MAAM,eAAe,2BAA2B,WAAW,gBAAgB,MAAM;AACnJ;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA,gEAAgE,cAAc;AAC9E;AACA;AACA,uBAAuB,KAAK;AAC5B;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA,mCAAmC;AACnC;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD,4CAA4C;AAC5C;AACA,wCAAwC,mCAAmC;AAC3E;AACA,gBAAgB;AAChB,kDAAkD,mCAAmC;AACrF;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB,qBAAqB;AACtC;AACA,qBAAqB,oEAAoE;AACzF;AACA,iBAAiB,+BAA+B;AAChD;AACA,iBAAiB,kCAAkC;AACnD,kBAAkB,qCAAqC;AACvD;AACA,wBAAwB,iEAAiE;AACzF;AACA,qBAAqB,+CAA+C;AACpE;AACA,uBAAuB,iCAAiC;AACxD;AACA,uBAAuB,+BAA+B;AACtD,oBAAoB,6CAA6C;AACjE,iBAAiB,+CAA+C;AAChE;AACA,iBAAiB,mCAAmC;AACpD,mBAAmB,+BAA+B;AAClD,iBAAiB,iCAAiC;AAClD,qBAAqB,gCAAgC;AACrD,kBAAkB,6CAA6C;AAC/D,iBAAiB,iEAAiE;AAClF;AACA,mBAAmB,iCAAiC;AACpD;AAC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;AACjF,cAAc,MAAM;AACpB,iBAAiB,aAAa,4BAA4B,4BAA4B;AACtF;AACA,iBAAiB,aAAa,4BAA4B,8BAA8B;AACxF,gBAAgB,MAAM;AACtB,wCAAwC,6CAA6C;AACrF,iBAAiB,wDAAwD;AACzE;AACA,iBAAiB,aAAa,4BAA4B,8BAA8B;AACxF;AACA,iBAAiB,kDAAkD;AACnE,kBAAkB,iEAAiE;AACnF,+BAA+B,sDAAsD;AACrF,iBAAiB;AACjB,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC,YAAY;AACZ;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,uCAAuC,mBAAmB;AAC1D,wCAAwC,oBAAoB;AAC5D,mDAAmD,kCAAkC;AACrF,oDAAoD,mCAAmC;AACvF,kDAAkD,+BAA+B;AACjF,kDAAkD,+BAA+B;AACjF;AACA,mBAAmB;AACnB,SAAS;AACT;AACA;AACA;AACA;AACA,qBAAqB;AACrB,YAAY;AACZ,qBAAqB;AACrB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,YAAY,QAAQ;AACpB,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA,c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AAmB;AACpC;AACA,iBAAiB;AACjB,OAAO;AACP;AACA;AACA,mBAAmB;AACnB;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,mBAAmB;AACnB;AACA,iBAAiB,4BAA4B;AAC7C,WAAW,MAAM;AACjB,iBAAiB,uBAAuB;AACxC;AACA,iBAAiB;AACjB,OAAO;AACP;AACA,gDAAgD,SAAS;AACzD;AACA,KAAK;AACL;AACA;AACA;AACA,iBAAiB,qBAAqB;AACtC,cAAc,MAAM;AACpB,iBAAiB,+BAA+B;AAChD,UAAU,IAAI,YAAY,MAAM;AAChC,iBAAiB,iBAAiB;AAClC;AACA,iBAAiB;AACjB,OAAO;AACP;AACA;AACA;AACA,uBAAuB,cAAc;AACrC,wBAAwB;AACxB,oCAAoC;AACpC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,iBAAiB,qBAAqB;AACtC,cAAc,MAAM;AACpB,iBAAiB,+BAA+B;AAChD,UAAU,IAAI,YAAY,MAAM;AAChC,iBAAiB,iBAAiB;AAClC;AACA,iBAAiB,6BAA6B;AAC9C;AACA,iBAAiB;AACjB,OAAO;AACP;AACA,iDAAiD,gCAAgC,MAAM,IAAI;AAC3F;AACA;AACA,uBAAuB,cAAc;AACrC,wBAAwB;AACxB,oCAAoC;AACpC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,mBAAmB;AACnB;AACA,iBAAiB,oBAAoB;AACrC;AACA,iBAAiB;AACjB,OAAO;AACP;AACA,+BAA+B,SAAS;AACxC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,qBAAqB;AACtC;AACA,iBAAiB,kCAAkC;AACnD,UAAU,MAAM;AAChB,mBAAmB,mBAAmB;AACtC;AACA,iBAAiB,sCAAsC;AACvD;AACA,iBAAiB,sCAAsC;AACvD;AACA,qBAAqB;AACrB;AACA,mBAAmB,WAAW,mCAAmC,oBAAoB;AACrF;AACA,mBAAmB,mCAAmC;AACtD;AACA,iBAAiB,iCAAiC;AAClD;AACA,iBAAiB,iCAAiC;AAClD,UAAU,IAAI;AACd,mBAAmB,+BAA+B;AAClD,iBAAiB,4CAA4C;AAC7D,mBAAmB;AACnB,OAAO;AACP;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,eAAe;AAC1C,gBAAgB;AAChB,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA,0BAA0B,SAAS;AACnC;AACA;AACA,SAAS;AACT;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA,SAAS;AACT,+CAA+C,SAAS,wCAAwC;AAChG,+BAA+B,SAAS,wBAAwB;AAChE;AACA,qBAAqB,+BAA+B;AACpD;AACA,kDAAkD,MAAM;AACxD,6CAA6C;AAC7C,kDAAkD,MAAM;AACxD,6CAA6C;AAC7C;AACA,yDAAyD,EAAE,QAAQ,EAAE,OAAO;AAC5E,yDAAyD,EAAE,QAAQ,EAAE,OAAO;AAC5E;AACA,2BAA2B;AAC3B,yDAAyD,EAAE,QAAQ,EAAE,OAAO;AAC5E,yDAAyD,EAAE,QAAQ,EAAE,OAAO;AAC5E;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,cAAc;AACd;AACA;AACA,2BAA2B,cAAc;AACzC,gBAAgB;AAChB,2BAA2B,YAAY;AACvC;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,iBAAiB,qBAAqB;AACtC;AACA,iBAAiB,iDAAiD;AAClE;AACA,iBAAiB,kBAAkB;AACnC;AACA,iBAAiB,kDAAkD;AACnE,WAAW,MAAM;AACjB,iBAAiB,oBAAoB;AACrC;AACA,iBAAiB,gCAAgC;AACjD,iBAAiB,oCAAoC;AACrD,UAAU,IAAI;AACd,iBAAiB;AACjB,OAAO;AACP;AACA,8BAA8B,SAAS,wBAAwB;AAC/D,wCAAwC,gBAAgB,MAAM,IAAI;AAClE,+BAA+B,SAAS,wBAAwB;AAChE;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA,qDAAqD,MAAM;AAC3D;AACA;AACA,cAAc;AACd,sBAAsB;AACtB;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,iBAAiB,qBAAqB;AACtC,iBAAiB,uBAAuB;AACxC;AACA,iBAAiB,oDAAoD;AACrE;AACA,iBAAiB,mDAAmD;AACpE;AACA,iBAAiB;AACjB,OAAO;AACP;AACA,+BAA+B,SAAS,0BAA0B;AAClE;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,8CAA8C,KAAK;AACnD;AACA,yBAAyB,yBAAyB;AAClD;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,kCAAkC;AAClC;AACA,SAAS;AACT;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA,0BAA0B,KAAK;AAC/B;AACA,yBAAyB,yBAAyB;AAClD;AACA;AACA,YAAY;AACZ;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA,qCAAqC;AACrC,oBAAoB;AACpB;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA,UAAU;AACV;AACA,qDAAqD;AACrD;AACA;AACA;AACA,gBAAgB,YAAY;AAC5B;AACA;AACA,KAAK;AACL;AACA,oBAAoB;AACpB;AACA,KAAK;AACL;AACA,iBAAiB,oBAAoB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS,SAAS;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,WAAW,GAAG;AACnC,sBAAsB,WAAW,gBAAgB,EAAE,WAAW,gBAAgB;AAC9E,qBAAqB,WAAW,GAAG;AACnC;AACA;AACA,wBAAwB,WAAW,WAAW,GAAG,WAAW,gBAAgB;AAC5E,sBAAsB,WAAW,EAAE,WAAW,gBAAgB;AAC9D,wBAAwB,WAAW,EAAE,WAAW,WAAW,iBAAiB;AAC5E,sBAAsB,WAAW,EAAE,WAAW,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS,SAAS;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,WAAW,GAAG;AACrC;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA,0BAA0B,WAAW,UAAU;AAC/C,wBAAwB,SAAS;AACjC;AACA,YAAY;AACZ;AACA,uBAAuB,WAAW,GAAG;AACrC,wBAAwB,SAAS;AACjC;AACA;AACA,wFAAwF,GAAG;AAC3F,2CAA2C,GAAG;AAC9C,yBAAyB,WAAW,GAAG;AACvC,0BAA0B;AAC1B;AACA;AACA,0BAA0B,WAAW,UAAU;AAC/C,wBAAwB,SAAS;AACjC;AACA,YAAY;AACZ;AACA,2CAA2C,GAAG;AAC9C,yBAAyB,WAAW,GAAG;AACvC,0BAA0B;AAC1B;AACA;AACA,0BAA0B,WAAW,UAAU;AAC/C,wBAAwB,SAAS;AACjC;AACA;AACA,2CAA2C,GAAG;AAC9C,yBAAyB,WAAW,GAAG;AACvC,0BAA0B;AAC1B,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA,0BAA0B,WAAW;AACrC;AACA;AACA;AACA,mEAAmE,EAAE;AACrE,4BAA4B,WAAW;AACvC,YAAY;AACZ,0BAA0B,WAAW;AACrC;AACA;AACA;AACA,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,gBAAgB,eAAe;AACzD,8BAA8B,kBAAkB,OAAO,OAAO,MAAM;AACpE;AACA;AACA,0BAA0B,iCAAiC,gCAAgC;AAC3F,8BAA8B,kBAAkB,OAAO,OAAO,MAAM;AACpE;AACA;AACA;AACA;AACA;AACA,wBAAwB,iCAAiC,gCAAgC;AACzF;AACA;AACA,2BAA2B,iCAAiC,gCAAgC;AAC5F;AACA;AACA,4BAA4B,iCAAiC,gCAAgC;AAC7F;AACA;AACA,+BAA+B,gCAAgC,EAAE,gCAAgC;AACjG;AACA;AACA,kBAAkB,QAAQ,oBAAoB,qCAAqC;AACnF;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,YAAY,mBAAmB;AACtD;AACA,uBAAuB,mBAAmB;AAC1C,YAAY;AACZ,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,EAAE;AACpB;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;AACA,wBAAwB,EAAE;AAC1B;AACA;AACA,qBAAqB,OAAO;AAC5B;AACA;AACA,mCAAmC,aAAa;AAChD;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA,kBAAkB,MAAM;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,2BAA2B,EAAE;AAC7B,2BAA2B,EAAE;AAC7B,2BAA2B,EAAE;AAC7B,2BAA2B,EAAE;AAC7B,2BAA2B,QAAQ;AACnC,2BAA2B,QAAQ;AACnC,2BAA2B,aAAa;AACxC,4BAA4B,qBAAqB;AACjD,4BAA4B,2BAA2B;AACvD,6BAA6B,2BAA2B;AACxD,6BAA6B,8BAA8B;AAC3D,8BAA8B,QAAQ,QAAQ,QAAQ;AACtD,+BAA+B,QAAQ,QAAQ,QAAQ,QAAQ;AAC/D,4BAA4B,aAAa;AACzC,4BAA4B,YAAY;AACxC,2BAA2B,EAAE;AAC7B,2BAA2B,EAAE;AAC7B;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,6BAA6B,IAAI;AACjC,6BAA6B,IAAI;AACjC,6BAA6B,IAAI;AACjC,6BAA6B,IAAI;AACjC,6BAA6B,IAAI;AACjC,8BAA8B,OAAO;AACrC,8BAA8B,OAAO;AACrC,gCAAgC,OAAO;AACvC,oCAAoC,WAAW;AAC/C,sCAAsC,WAAW;AACjD,yCAAyC;AACzC,2CAA2C;AAC3C,uCAAuC;AACvC,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,cAAc,QAAQ;AACtB;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,uDAAuD;;AAEvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,EAAE;AAC/B,6BAA6B,EAAE;AAC/B,6BAA6B,EAAE;AAC/B;AACA;AACA;AACA;AACA,iCAAiC,EAAE;AACnC,mCAAmC,EAAE;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,EAAE;AACrC;AACA;AACA;AACA;AACA;AACA,iCAAiC,EAAE;AACnC,iCAAiC,EAAE;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,UAAU,cAAc;AACpD,uBAAuB,UAAU,cAAc;AAC/C,wBAAwB,oBAAoB;AAC5C,wBAAwB,oBAAoB;AAC5C,wBAAwB,8BAA8B;AACtD,wBAAwB,UAAU,cAAc;AAChD,iCAAiC,8BAA8B;AAC/D,uBAAuB,8BAA8B;AACrD,wBAAwB,8BAA8B;AACtD,6BAA6B,wBAAwB;AACrD,wBAAwB,wBAAwB;AAChD,yBAAyB,UAAU,GAAG,oBAAoB;AAC1D,8BAA8B,yBAAyB;AACvD,wBAAwB,yBAAyB;AACjD,kCAAkC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;;AAEA;AACA,wCAAwC;AACxC;AACA,kBAAkB,iBAAiB;AACnC;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kCAAkC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,OAAO;AAChF;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,mBAAmB;AACnB,sBAAsB;AACtB,uBAAuB,2BAA2B;AAClD,4BAA4B;AAC5B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kBAAkB,aAAa;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,QAAQ;AACR;AACA;AACA,QAAQ,QAAQ;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;;AAEA;AACA;AACA;AACA,uCAAuC,yCAAyC;AAChF,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,uCAAuC,4CAA4C;AACnF,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yBAAyB;AAC/C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC,sBAAsB,4BAA4B;AAClD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC;AACnC,6CAA6C;AAC7C,6CAA6C;AAC7C,wBAAwB;AACxB;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA,oBAAoB,gBAAgB;AACpC,sBAAsB,4BAA4B;AAClD,kDAAkD,cAAc,EAAE,YAAY;AAC9E,mDAAmD,cAAc,EAAE,YAAY;AAC/E;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,yCAAyC;;AAEzC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,UAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,SAAS,YAAY,SAAS;AACjF;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,kBAAkB,aAAa;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,oCAAoC;AACpC,IAAI;AACJ,iCAAiC;AACjC;AACA;AACA;;AAEA;AACA;AACA,IAAI,QAAQ,OAAO,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gCAAgC;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,sBAAsB;AACtB;AACA,oDAAoD,2BAA2B;AAC/E;AACA;AACA,wCAAwC;AACxC;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,sBAAsB;AACtB;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,mBAAmB,UAAU,eAAe;AAC5C;AACA;AACA;AACA;AACA;AACA,UAAU,UAAU;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,6BAA6B,UAAU;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,UAAU;AACvC;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA,UAAU,OAAO,OAAO,GAAG,GAAG,MAAM,MAAM,OAAO,MAAM;AACvD,IAAI,QAAQ,MAAM,OAAO;AACzB;AACA,IAAI,QAAQ;AACZ;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D,qDAAqD;AACrD;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,4BAA4B,kBAAkB;AAC9C;AACA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,CAAC;;AAED;AACA,IAAI,KAAK;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,eAAe;AAC3B;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA,+DAA+D,OAAO;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA,+BAA+B,EAAE,YAAY,EAAE;AAC/C,qCAAqC,EAAE,YAAY,EAAE;AACrD,wBAAwB,KAAK,UAAU,KAAK,GAAG,EAAE;AACjD,6DAA6D,EAAE;AAC/D,mCAAmC,EAAE;AACrC;AACA;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,+BAA+B,mCAAmC;AAClE,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,KAAK;AACL;AACA,iCAAiC;AACjC;AACA;;AAEA;AACA,iCAAiC,MAAM,GAAG;AAC1C;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,eAAe;AAC3B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,iCAAiC;AAC7C;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,yBAAyB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,KAAK,KAAK,WAAW,aAAa,eAAe;AAC3F,aAAa;AACb;AACA;AACA,CAAC;;AAED;;;AAGA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA,8CAA8C;AAC9C;AACA,qCAAqC;AACrC;AACA;;AAEA;AACA,qCAAqC;AACrC;AACA;AACA,2DAA2D,SAAS;AACpE;AACA;AACA,mDAAmD,SAAS;AAC5D;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA,uCAAuC,QAAQ;AAC/C,UAAU,SAAS;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA,QAAQ,6BAA6B;AACrC;AACA;AACA,aAAa;AACb;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA,uBAAuB;AACvB;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,EAAE,OAAO,yBAAyB,OAAO;AAC/D;AACA;AACA;AACA;AACA,wBAAwB,EAAE,OAAO,eAAe,MAAM,oBAAoB;AAC1E;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8DAA8D,SAAS;AACvE;AACA;AACA;AACA;AACA,kDAAkD,SAAS;AAC3D;AACA;;AAEA,uCAAuC,QAAQ;AAC/C,YAAY,SAAS;;AAErB;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA,aAAa;;AAEb;AACA,CAAC;;AAED;AACA;AACA,cAAc,0BAA0B;AACxC,cAAc,0BAA0B;AACxC,eAAe,0BAA0B;AACzC,eAAe,0BAA0B;AACzC,cAAc,2BAA2B;AACzC,cAAc,2BAA2B;AACzC,eAAe,2BAA2B;AAC1C,eAAe,2BAA2B;AAC1C,cAAc,yBAAyB;AACvC,cAAc,yBAAyB;AACvC,eAAe,yBAAyB;AACxC,eAAe,yBAAyB;AACxC,aAAa,yBAAyB;AACtC,aAAa,yBAAyB;AACtC,cAAc,yBAAyB;AACvC,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,iDAAiD;AACjD;AACA,IAAI;AACJ,+CAA+C,cAAc,WAAW,iBAAiB;AACzF,IAAI;AACJ,oDAAoD,WAAW;AAC/D;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA,+BAA+B;AAC/B;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,OAAO;AAC1D;AACA,uBAAuB,0CAA0C,IAAI,sBAAsB;AAC3F,kBAAkB,6CAA6C;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,OAAO,IAAI,MAAM,yBAAyB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,wCAAwC,YAAY;AACpD,wCAAwC,QAAQ;AAChD,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;;AAGD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,gBAAgB,iCAAiC,gBAAgB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,EAAE,UAAU,iBAAiB,EAAE,UAAU;AACtE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,+CAA+C;AAC/C,kBAAkB,4BAA4B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yCAAyC,mBAAmB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,GAAG;AAC5B;AACA;AACA;AACA,oBAAoB,+BAA+B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+BAA+B;AACjD;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA,qCAAqC;AACrC;AACA,yBAAyB;AACzB;AACA;AACA,kBAAkB,+BAA+B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,oCAAoC;AAClD,YAAY,OAAO;AACnB;AACA,6BAA6B,kBAAkB;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,kBAAkB;AAChC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,yBAAyB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,yBAAyB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,kBAAkB;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,eAAe;AAC7B;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,eAAe;AAC7B;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,yBAAyB;AACvC;AACA;;AAEA;AACA,wCAAwC,SAAS;AACjD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wCAAwC,SAAS;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,aAAa;AACb,IAAI;AACJ,0DAA0D,EAAE;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,eAAe;AAC7B,kBAAkB;AAClB,mBAAmB,4BAA4B;AAC/C,wBAAwB;AACxB;;AAEA;AACA;;AAEA;AACA;AACA,sBAAsB,uBAAuB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,oBAAoB;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,yBAAyB;AACrC;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA,0CAA0C,UAAU;AACpD,mBAAmB,iBAAiB;AACpC;AACA;AACA,0CAA0C,UAAU;AACpD;AACA,QAAQ;AACR;AACA;AACA,0CAA0C,UAAU;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,qBAAqB;AACrB,IAAI;AACJ,qBAAqB;AACrB,IAAI;AACJ,qBAAqB;AACrB,IAAI;AACJ,2BAA2B;AAC3B,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,yBAAyB;AACvC;AACA;AACA,+BAA+B,EAAE,WAAW;AAC5C,aAAa,kBAAkB;AAC/B;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,uCAAuC,iBAAiB;AACxD;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV,qDAAqD;AACrD;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR,6CAA6C;AAC7C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV,8BAA8B,sBAAsB;AACpD;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,YAAY,GAAG,GAAG;AAClB,kCAAkC,EAAE,UAAU,GAAG;AACjD;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA,aAAa;AACb;AACA,4DAA4D;AAC5D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,yBAAyB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qDAAqD;AACrD,qDAAqD;AACrD;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,wBAAwB;AACxB,yBAAyB,yCAAyC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,CAAC;;AAED;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,8BAA8B,GAAG;AACjC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,4BAA4B;AAC5B,IAAI;AACJ;AACA;AACA,4BAA4B;AAC5B,IAAI;AACJ;AACA;;AAEA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED,oCAAoC;AACpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;;AAEA;AACA,0BAA0B;AAC1B,kBAAkB,uBAAuB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,uBAAuB,2BAA2B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;;AAGD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,oCAAoC;AAClD;AACA;AACA,wDAAwD,UAAU;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,qCAAqC,OAAO,QAAQ;AACpD,gCAAgC,IAAI,UAAU,IAAI,WAAW,aAAa;AAC1E;AACA,sBAAsB,uBAAuB;AAC7C;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,YAAY,cAAc;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,oCAAoC;AAChD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;;AAEA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA,6CAA6C;AAC7C;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ,qBAAqB;AACrB,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,oBAAoB;AACpB,sCAAsC,UAAU;AAChD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,8BAA8B;AACpE,sCAAsC,gBAAgB;AACtD,sCAAsC,4BAA4B;AAClE,sCAAsC,gBAAgB;AACtD,sCAAsC,2BAA2B;AACjE,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC;AACtC,GAAG;AACH,oBAAoB;AACpB,sCAAsC,UAAU;AAChD,sCAAsC,gBAAgB;AACtD,sCAAsC,sCAAsC;AAC5E,sCAAsC,gBAAgB;AACtD,sCAAsC,8BAA8B;AACpE,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC;AACtC,GAAG;AACH,oBAAoB;AACpB,sCAAsC,UAAU;AAChD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD;AACA,sCAAsC,gBAAgB;AACtD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD;AACA,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,UAAU;AAChD,sCAAsC,gBAAgB;AACtD,sCAAsC;AACtC,GAAG;AACH,oBAAoB;AACpB,sCAAsC,UAAU;AAChD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,4CAA4C;AAClF,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD;AACA,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,UAAU;AAChD,sCAAsC,gBAAgB;AACtD,sCAAsC;AACtC,GAAG;AACH,cAAc;AACd,sCAAsC,UAAU;AAChD,sCAAsC,yBAAyB;AAC/D,sCAAsC,UAAU;AAChD,sCAAsC,+BAA+B;AACrE,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,2BAA2B;AACjE,sCAAsC,2BAA2B;AACjE,sCAAsC,UAAU;AAChD,sCAAsC,yBAAyB;AAC/D,sCAAsC;AACtC,GAAG;AACH,aAAa;AACb,sCAAsC,UAAU;AAChD,sCAAsC,gBAAgB;AACtD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,gBAAgB;AACtD,sCAAsC,UAAU;AAChD,sCAAsC,UAAU;AAChD,sCAAsC;AACtC;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,WAAW;AACX;AACA;AACA,GAAG;AACH,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,qDAAqD,WAAW;AAChE;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,kBAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,uBAAuB,GAAG,iBAAiB;AACxF;AACA;AACA,wDAAwD,+BAA+B;AACvF;AACA,MAAM,iBAAiB;AACvB,KAAK,wBAAwB;AAC7B;AACA,KAAK,+BAA+B;AACpC;AACA,KAAK,+BAA+B;AACpC;AACA;AACA,MAAM,iCAAiC;AACvC,MAAM,yBAAyB,IAAI;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,WAAW;AAC7C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA,sEAAsE;AACtE;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mBAAmB;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4BAA4B;AAClD;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,+BAA+B;AAC/B,SAAS,cAAc;AACvB,MAAM;AACN,SAAS,qBAAqB;AAC9B;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,KAAK;AAC5D;AACA;AACA,qCAAqC;AACrC,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA,4CAA4C,IAAI;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,QAAQ,wBAAwB;AAChC;AACA;AACA,uCAAuC;AACvC;AACA,QAAQ;AACR;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,MAAM;AACN,gDAAgD,gBAAgB;AAChE;AACA,yBAAyB,0CAA0C;AACnE;AACA;AACA;AACA,sBAAsB;AACtB,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,qCAAqC;AACrC,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uBAAuB;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,yBAAyB;AACzB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,cAAc,8BAA8B;AAC5C,cAAc,8BAA8B;AAC5C,cAAc,6BAA6B;AAC3C,cAAc,8BAA8B;AAC5C,cAAc,4BAA4B;AAC1C,cAAc,8BAA8B;AAC5C,cAAc,8BAA8B;AAC5C,cAAc,4BAA4B;AAC1C,cAAc,4BAA4B;AAC1C,cAAc,iCAAiC;AAC/C,cAAc,aAAa;AAC3B,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,0DAA0D,EAAE;AAC5D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,KAAK,UAAU,kBAAkB;AACzE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,eAAe;;AAEf;AACA;;AAEA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wDAAwD;AACxD,sCAAsC;AACtC;AACA;AACA,kBAAkB;;AAElB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;;AAEA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR,sBAAsB;AACtB;;AAEA;AACA;AACA,QAAQ;AACR,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,iBAAiB;AACrC,0BAA0B,8CAA8C;AACxE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,wBAAwB;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,UAAU;AACV,0BAA0B;AAC1B;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;;AAEpB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,sDAAsD,KAAK;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA,iDAAiD,KAAK;AACtD;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA;AACA;;AAEA,oBAAoB,eAAe;AACnC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wDAAwD,KAAK;AAC7D;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD,0EAA0E,KAAK;AAC/E,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,2CAA2C;AAC3C;AACA,2CAA2C;AAC3C,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA,6CAA6C;AAC7C,6BAA6B,OAAO;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wCAAwC,IAAI;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB;AACnB;AACA,kCAAkC;AAClC,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,QAAQ;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,QAAQ;AACR,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,wDAAwD,QAAQ;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,mBAAmB,eAAe,GAAG;AACrC;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA,mDAAmD,OAAO;AAC1D;AACA;AACA;AACA;AACA,yCAAyC,QAAQ,iBAAiB,WAAW;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,gDAAgD;AAChD,gDAAgD;AAChD,gDAAgD;AAChD;AACA;AACA,gDAAgD;AAChD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,mCAAmC;AACnC,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM,yBAAyB;AAC/B;AACA,MAAM,yBAAyB;AAC/B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,4CAA4C;AAC5C;;AAEA,0CAA0C;;AAE1C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA,IAAI,wCAAwC;AAC5C,IAAI,2CAA2C;AAC/C;AACA,MAAM,sCAAsC;AAC5C;;AAEA;AACA,IAAI,eAAe,SAAS,iBAAiB,SAAS,kBAAkB;AACxE,IAAI,eAAe,UAAU,iBAAiB,UAAU,kBAAkB;AAC1E,IAAI,eAAe,MAAM,iBAAiB,MAAM,kBAAkB;AAClE,IAAI,eAAe,OAAO,iBAAiB,OAAO,kBAAkB;AACpE,IAAI,eAAe,QAAQ,iBAAiB,QAAQ,kBAAkB;AACtE,IAAI,eAAe,SAAS,iBAAiB,SAAS,kBAAkB;AACxE,IAAI,eAAe,OAAO,iBAAiB,OAAO,kBAAkB;AACpE,IAAI,eAAe,QAAQ,iBAAiB,QAAQ,kBAAkB;AACtE,IAAI,eAAe,GAAG,iBAAiB,GAAG,kBAAkB;AAC5D;AACA,IAAI,aAAa,YAAY,mBAAmB;AAChD,IAAI,eAAe,YAAY,mBAAmB;;AAElD,IAAI;AACJ;;AAEA;AACA;AACA,WAAW,wCAAwC;AACnD,WAAW,yCAAyC;AACpD,WAAW;AACX;AACA;AACA,MAAM,0CAA0C;AAChD,MAAM;AACN;AACA;;AAEA;AACA,IAAI,eAAe,SAAS,iBAAiB,SAAS,kBAAkB;AACxE,IAAI,eAAe,UAAU,iBAAiB,UAAU,kBAAkB;AAC1E,IAAI,eAAe,MAAM,iBAAiB,MAAM,kBAAkB;AAClE,IAAI,eAAe,OAAO,iBAAiB,OAAO,kBAAkB;AACpE,IAAI,eAAe,QAAQ,iBAAiB,QAAQ,kBAAkB;AACtE,IAAI,eAAe,SAAS,iBAAiB,SAAS,kBAAkB;AACxE,IAAI,eAAe,OAAO,iBAAiB,OAAO,kBAAkB;AACpE,IAAI,eAAe,QAAQ,iBAAiB,QAAQ,kBAAkB;AACtE,IAAI,eAAe,GAAG,iBAAiB,GAAG,kBAAkB;AAC5D,IAAI,aAAa,YAAY,mBAAmB;AAChD,IAAI,eAAe,YAAY;AAC/B;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,kBAAkB,iBAAiB;AACnC;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kBAAkB,4BAA4B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,UAAU;AACV;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA,iCAAiC,mCAAmC;AACpE,IAAI;AACJ;AACA,iCAAiC,mCAAmC;AACpE,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;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","sources":["webpack://defuddle/./node_modules/mathml-to-latex/dist/bundle.min.js","webpack://defuddle/./node_modules/temml/dist/temml.cjs","webpack://defuddle/./src/constants.ts","webpack://defuddle/./src/defuddle.ts","webpack://defuddle/./src/elements/code.ts","webpack://defuddle/./src/elements/headings.ts","webpack://defuddle/./src/elements/math.base.ts","webpack://defuddle/./src/elements/math.full.ts","webpack://defuddle/./src/extractor-registry.ts","webpack://defuddle/./src/extractors/_base.ts","webpack://defuddle/./src/extractors/_conversation.ts","webpack://defuddle/./src/extractors/chatgpt.ts","webpack://defuddle/./src/extractors/claude.ts","webpack://defuddle/./src/extractors/hackernews.ts","webpack://defuddle/./src/extractors/reddit.ts","webpack://defuddle/./src/extractors/twitter.ts","webpack://defuddle/./src/extractors/youtube.ts","webpack://defuddle/./src/metadata.ts","webpack://defuddle/./src/scoring.ts","webpack://defuddle/webpack/bootstrap","webpack://defuddle/./src/index.full.ts"],"sourcesContent":["!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.MathMLToLaTeX=t():e.MathMLToLaTeX=t()}(this,(()=>(()=>{var e={4582:(e,t)=>{\"use strict\";function r(e,t){return void 0===t&&(t=Object),t&&\"function\"==typeof t.freeze?t.freeze(e):e}var a=r({HTML:\"text/html\",isHTML:function(e){return e===a.HTML},XML_APPLICATION:\"application/xml\",XML_TEXT:\"text/xml\",XML_XHTML_APPLICATION:\"application/xhtml+xml\",XML_SVG_IMAGE:\"image/svg+xml\"}),n=r({HTML:\"http://www.w3.org/1999/xhtml\",isHTML:function(e){return e===n.HTML},SVG:\"http://www.w3.org/2000/svg\",XML:\"http://www.w3.org/XML/1998/namespace\",XMLNS:\"http://www.w3.org/2000/xmlns/\"});t.assign=function(e,t){if(null===e||\"object\"!=typeof e)throw new TypeError(\"target is not an object\");for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e},t.find=function(e,t,r){if(void 0===r&&(r=Array.prototype),e&&\"function\"==typeof r.find)return r.find.call(e,t);for(var a=0;a<e.length;a++)if(Object.prototype.hasOwnProperty.call(e,a)){var n=e[a];if(t.call(void 0,n,a,e))return n}},t.freeze=r,t.MIME_TYPE=a,t.NAMESPACE=n},5752:(e,t,r)=>{var a=r(4582),n=r(4722),o=r(6559),i=r(4466),s=n.DOMImplementation,l=a.NAMESPACE,c=i.ParseError,u=i.XMLReader;function h(e){return e.replace(/\\r[\\n\\u0085]/g,\"\\n\").replace(/[\\r\\u0085\\u2028]/g,\"\\n\")}function d(e){this.options=e||{locator:{}}}function m(){this.cdata=!1}function p(e,t){t.lineNumber=e.lineNumber,t.columnNumber=e.columnNumber}function f(e){if(e)return\"\\n@\"+(e.systemId||\"\")+\"#[line:\"+e.lineNumber+\",col:\"+e.columnNumber+\"]\"}function x(e,t,r){return\"string\"==typeof e?e.substr(t,r):e.length>=t+r||t?new java.lang.String(e,t,r)+\"\":e}function g(e,t){e.currentElement?e.currentElement.appendChild(t):e.doc.appendChild(t)}d.prototype.parseFromString=function(e,t){var r=this.options,a=new u,n=r.domBuilder||new m,i=r.errorHandler,s=r.locator,c=r.xmlns||{},d=/\\/x?html?$/.test(t),p=d?o.HTML_ENTITIES:o.XML_ENTITIES;s&&n.setDocumentLocator(s),a.errorHandler=function(e,t,r){if(!e){if(t instanceof m)return t;e=t}var a={},n=e instanceof Function;function o(t){var o=e[t];!o&&n&&(o=2==e.length?function(r){e(t,r)}:e),a[t]=o&&function(e){o(\"[xmldom \"+t+\"]\\t\"+e+f(r))}||function(){}}return r=r||{},o(\"warning\"),o(\"error\"),o(\"fatalError\"),a}(i,n,s),a.domBuilder=r.domBuilder||n,d&&(c[\"\"]=l.HTML),c.xml=c.xml||l.XML;var x=r.normalizeLineEndings||h;return e&&\"string\"==typeof e?a.parse(x(e),c,p):a.errorHandler.error(\"invalid doc source\"),n.doc},m.prototype={startDocument:function(){this.doc=(new s).createDocument(null,null,null),this.locator&&(this.doc.documentURI=this.locator.systemId)},startElement:function(e,t,r,a){var n=this.doc,o=n.createElementNS(e,r||t),i=a.length;g(this,o),this.currentElement=o,this.locator&&p(this.locator,o);for(var s=0;s<i;s++){e=a.getURI(s);var l=a.getValue(s),c=(r=a.getQName(s),n.createAttributeNS(e,r));this.locator&&p(a.getLocator(s),c),c.value=c.nodeValue=l,o.setAttributeNode(c)}},endElement:function(e,t,r){var a=this.currentElement;a.tagName,this.currentElement=a.parentNode},startPrefixMapping:function(e,t){},endPrefixMapping:function(e){},processingInstruction:function(e,t){var r=this.doc.createProcessingInstruction(e,t);this.locator&&p(this.locator,r),g(this,r)},ignorableWhitespace:function(e,t,r){},characters:function(e,t,r){if(e=x.apply(this,arguments)){if(this.cdata)var a=this.doc.createCDATASection(e);else a=this.doc.createTextNode(e);this.currentElement?this.currentElement.appendChild(a):/^\\s*$/.test(e)&&this.doc.appendChild(a),this.locator&&p(this.locator,a)}},skippedEntity:function(e){},endDocument:function(){this.doc.normalize()},setDocumentLocator:function(e){(this.locator=e)&&(e.lineNumber=0)},comment:function(e,t,r){e=x.apply(this,arguments);var a=this.doc.createComment(e);this.locator&&p(this.locator,a),g(this,a)},startCDATA:function(){this.cdata=!0},endCDATA:function(){this.cdata=!1},startDTD:function(e,t,r){var a=this.doc.implementation;if(a&&a.createDocumentType){var n=a.createDocumentType(e,t,r);this.locator&&p(this.locator,n),g(this,n),this.doc.doctype=n}},warning:function(e){console.warn(\"[xmldom warning]\\t\"+e,f(this.locator))},error:function(e){console.error(\"[xmldom error]\\t\"+e,f(this.locator))},fatalError:function(e){throw new c(e,this.locator)}},\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,(function(e){m.prototype[e]=function(){return null}})),t.DOMParser=d},4722:(e,t,r)=>{var a=r(4582),n=a.find,o=a.NAMESPACE;function i(e){return\"\"!==e}function s(e,t){return e.hasOwnProperty(t)||(e[t]=!0),e}function l(e){if(!e)return[];var t=function(e){return e?e.split(/[\\t\\n\\f\\r ]+/).filter(i):[]}(e);return Object.keys(t.reduce(s,{}))}function c(e,t){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])}function u(e,t){var r=e.prototype;if(!(r instanceof t)){function a(){}a.prototype=t.prototype,c(r,a=new a),e.prototype=r=a}r.constructor!=e&&(\"function\"!=typeof e&&console.error(\"unknown Class:\"+e),r.constructor=e)}var h={},d=h.ELEMENT_NODE=1,m=h.ATTRIBUTE_NODE=2,p=h.TEXT_NODE=3,f=h.CDATA_SECTION_NODE=4,x=h.ENTITY_REFERENCE_NODE=5,g=h.ENTITY_NODE=6,w=h.PROCESSING_INSTRUCTION_NODE=7,b=h.COMMENT_NODE=8,v=h.DOCUMENT_NODE=9,C=h.DOCUMENT_TYPE_NODE=10,A=h.DOCUMENT_FRAGMENT_NODE=11,E=h.NOTATION_NODE=12,_={},y={},q=(_.INDEX_SIZE_ERR=(y[1]=\"Index size error\",1),_.DOMSTRING_SIZE_ERR=(y[2]=\"DOMString size error\",2),_.HIERARCHY_REQUEST_ERR=(y[3]=\"Hierarchy request error\",3)),D=(_.WRONG_DOCUMENT_ERR=(y[4]=\"Wrong document\",4),_.INVALID_CHARACTER_ERR=(y[5]=\"Invalid character\",5),_.NO_DATA_ALLOWED_ERR=(y[6]=\"No data allowed\",6),_.NO_MODIFICATION_ALLOWED_ERR=(y[7]=\"No modification allowed\",7),_.NOT_FOUND_ERR=(y[8]=\"Not found\",8)),M=(_.NOT_SUPPORTED_ERR=(y[9]=\"Not supported\",9),_.INUSE_ATTRIBUTE_ERR=(y[10]=\"Attribute in use\",10));function T(e,t){if(t instanceof Error)var r=t;else r=this,Error.call(this,y[e]),this.message=y[e],Error.captureStackTrace&&Error.captureStackTrace(this,T);return r.code=e,t&&(this.message=this.message+\": \"+t),r}function N(){}function O(e,t){this._node=e,this._refresh=t,L(this)}function L(e){var t=e._node._inc||e._node.ownerDocument._inc;if(e._inc!==t){var r=e._refresh(e._node);if(we(e,\"length\",r.length),!e.$$length||r.length<e.$$length)for(var a=r.length;a in e;a++)Object.prototype.hasOwnProperty.call(e,a)&&delete e[a];c(r,e),e._inc=t}}function B(){}function S(e,t){for(var r=e.length;r--;)if(e[r]===t)return r}function F(e,t,r,a){if(a?t[S(t,a)]=r:t[t.length++]=r,e){r.ownerElement=e;var n=e.ownerDocument;n&&(a&&V(n,e,a),function(e,t,r){e&&e._inc++,r.namespaceURI===o.XMLNS&&(t._nsMap[r.prefix?r.localName:\"\"]=r.value)}(n,e,r))}}function P(e,t,r){var a=S(t,r);if(!(a>=0))throw new T(D,new Error(e.tagName+\"@\"+r));for(var n=t.length-1;a<n;)t[a]=t[++a];if(t.length=n,e){var o=e.ownerDocument;o&&(V(o,e,r),r.ownerElement=null)}}function k(){}function R(){}function I(e){return(\"<\"==e?\"<\":\">\"==e&&\">\")||\"&\"==e&&\"&\"||'\"'==e&&\""\"||\"&#\"+e.charCodeAt()+\";\"}function U(e,t){if(t(e))return!0;if(e=e.firstChild)do{if(U(e,t))return!0}while(e=e.nextSibling)}function j(){this.ownerDocument=this}function V(e,t,r,a){e&&e._inc++,r.namespaceURI===o.XMLNS&&delete t._nsMap[r.prefix?r.localName:\"\"]}function G(e,t,r){if(e&&e._inc){e._inc++;var a=t.childNodes;if(r)a[a.length++]=r;else{for(var n=t.firstChild,o=0;n;)a[o++]=n,n=n.nextSibling;a.length=o,delete a[a.length]}}}function $(e,t){var r=t.previousSibling,a=t.nextSibling;return r?r.nextSibling=a:e.firstChild=a,a?a.previousSibling=r:e.lastChild=r,t.parentNode=null,t.previousSibling=null,t.nextSibling=null,G(e.ownerDocument,e),t}function X(e){return e&&e.nodeType===R.DOCUMENT_TYPE_NODE}function H(e){return e&&e.nodeType===R.ELEMENT_NODE}function W(e){return e&&e.nodeType===R.TEXT_NODE}function z(e,t){var r=e.childNodes||[];if(n(r,H)||X(t))return!1;var a=n(r,X);return!(t&&a&&r.indexOf(a)>r.indexOf(t))}function Y(e,t){var r=e.childNodes||[];if(n(r,(function(e){return H(e)&&e!==t})))return!1;var a=n(r,X);return!(t&&a&&r.indexOf(a)>r.indexOf(t))}function J(e,t,r){var a=e.childNodes||[],o=t.childNodes||[];if(t.nodeType===R.DOCUMENT_FRAGMENT_NODE){var i=o.filter(H);if(i.length>1||n(o,W))throw new T(q,\"More than one element or text in fragment\");if(1===i.length&&!z(e,r))throw new T(q,\"Element in fragment can not be inserted before doctype\")}if(H(t)&&!z(e,r))throw new T(q,\"Only one element can be added and only after doctype\");if(X(t)){if(n(a,X))throw new T(q,\"Only one doctype is allowed\");var s=n(a,H);if(r&&a.indexOf(s)<a.indexOf(r))throw new T(q,\"Doctype can only be inserted before an element\");if(!r&&s)throw new T(q,\"Doctype can not be appended since element is present\")}}function Z(e,t,r){var a=e.childNodes||[],o=t.childNodes||[];if(t.nodeType===R.DOCUMENT_FRAGMENT_NODE){var i=o.filter(H);if(i.length>1||n(o,W))throw new T(q,\"More than one element or text in fragment\");if(1===i.length&&!Y(e,r))throw new T(q,\"Element in fragment can not be inserted before doctype\")}if(H(t)&&!Y(e,r))throw new T(q,\"Only one element can be added and only after doctype\");if(X(t)){if(n(a,(function(e){return X(e)&&e!==r})))throw new T(q,\"Only one doctype is allowed\");var s=n(a,H);if(r&&a.indexOf(s)<a.indexOf(r))throw new T(q,\"Doctype can only be inserted before an element\")}}function Q(e,t,r,a){(function(e,t,r){if(!function(e){return e&&(e.nodeType===R.DOCUMENT_NODE||e.nodeType===R.DOCUMENT_FRAGMENT_NODE||e.nodeType===R.ELEMENT_NODE)}(e))throw new T(q,\"Unexpected parent node type \"+e.nodeType);if(r&&r.parentNode!==e)throw new T(D,\"child not in parent\");if(!function(e){return e&&(H(e)||W(e)||X(e)||e.nodeType===R.DOCUMENT_FRAGMENT_NODE||e.nodeType===R.COMMENT_NODE||e.nodeType===R.PROCESSING_INSTRUCTION_NODE)}(t)||X(t)&&e.nodeType!==R.DOCUMENT_NODE)throw new T(q,\"Unexpected node type \"+t.nodeType+\" for parent node type \"+e.nodeType)})(e,t,r),e.nodeType===R.DOCUMENT_NODE&&(a||J)(e,t,r);var n=t.parentNode;if(n&&n.removeChild(t),t.nodeType===A){var o=t.firstChild;if(null==o)return t;var i=t.lastChild}else o=i=t;var s=r?r.previousSibling:e.lastChild;o.previousSibling=s,i.nextSibling=r,s?s.nextSibling=o:e.firstChild=o,null==r?e.lastChild=i:r.previousSibling=i;do{o.parentNode=e}while(o!==i&&(o=o.nextSibling));return G(e.ownerDocument||e,e),t.nodeType==A&&(t.firstChild=t.lastChild=null),t}function K(){this._nsMap={}}function ee(){}function te(){}function re(){}function ae(){}function ne(){}function oe(){}function ie(){}function se(){}function le(){}function ce(){}function ue(){}function he(){}function de(e,t){var r=[],a=9==this.nodeType&&this.documentElement||this,n=a.prefix,o=a.namespaceURI;if(o&&null==n&&null==(n=a.lookupPrefix(o)))var i=[{namespace:o,prefix:null}];return fe(this,r,e,t,i),r.join(\"\")}function me(e,t,r){var a=e.prefix||\"\",n=e.namespaceURI;if(!n)return!1;if(\"xml\"===a&&n===o.XML||n===o.XMLNS)return!1;for(var i=r.length;i--;){var s=r[i];if(s.prefix===a)return s.namespace!==n}return!0}function pe(e,t,r){e.push(\" \",t,'=\"',r.replace(/[<>&\"\\t\\n\\r]/g,I),'\"')}function fe(e,t,r,a,n){if(n||(n=[]),a){if(!(e=a(e)))return;if(\"string\"==typeof e)return void t.push(e)}switch(e.nodeType){case d:var i=e.attributes,s=i.length,l=e.firstChild,c=e.tagName,u=c;if(!(r=o.isHTML(e.namespaceURI)||r)&&!e.prefix&&e.namespaceURI){for(var h,g=0;g<i.length;g++)if(\"xmlns\"===i.item(g).name){h=i.item(g).value;break}if(!h)for(var E=n.length-1;E>=0;E--)if(\"\"===(_=n[E]).prefix&&_.namespace===e.namespaceURI){h=_.namespace;break}if(h!==e.namespaceURI)for(E=n.length-1;E>=0;E--){var _;if((_=n[E]).namespace===e.namespaceURI){_.prefix&&(u=_.prefix+\":\"+c);break}}}t.push(\"<\",u);for(var y=0;y<s;y++)\"xmlns\"==(q=i.item(y)).prefix?n.push({prefix:q.localName,namespace:q.value}):\"xmlns\"==q.nodeName&&n.push({prefix:\"\",namespace:q.value});for(y=0;y<s;y++){var q,D,M;me(q=i.item(y),0,n)&&(pe(t,(D=q.prefix||\"\")?\"xmlns:\"+D:\"xmlns\",M=q.namespaceURI),n.push({prefix:D,namespace:M})),fe(q,t,r,a,n)}if(c===u&&me(e,0,n)&&(pe(t,(D=e.prefix||\"\")?\"xmlns:\"+D:\"xmlns\",M=e.namespaceURI),n.push({prefix:D,namespace:M})),l||r&&!/^(?:meta|link|img|br|hr|input)$/i.test(c)){if(t.push(\">\"),r&&/^script$/i.test(c))for(;l;)l.data?t.push(l.data):fe(l,t,r,a,n.slice()),l=l.nextSibling;else for(;l;)fe(l,t,r,a,n.slice()),l=l.nextSibling;t.push(\"</\",u,\">\")}else t.push(\"/>\");return;case v:case A:for(l=e.firstChild;l;)fe(l,t,r,a,n.slice()),l=l.nextSibling;return;case m:return pe(t,e.name,e.value);case p:return t.push(e.data.replace(/[<&>]/g,I));case f:return t.push(\"<![CDATA[\",e.data,\"]]>\");case b:return t.push(\"\\x3c!--\",e.data,\"--\\x3e\");case C:var T=e.publicId,N=e.systemId;if(t.push(\"<!DOCTYPE \",e.name),T)t.push(\" PUBLIC \",T),N&&\".\"!=N&&t.push(\" \",N),t.push(\">\");else if(N&&\".\"!=N)t.push(\" SYSTEM \",N,\">\");else{var O=e.internalSubset;O&&t.push(\" [\",O,\"]\"),t.push(\">\")}return;case w:return t.push(\"<?\",e.target,\" \",e.data,\"?>\");case x:return t.push(\"&\",e.nodeName,\";\");default:t.push(\"??\",e.nodeName)}}function xe(e,t,r){var a;switch(t.nodeType){case d:(a=t.cloneNode(!1)).ownerDocument=e;case A:break;case m:r=!0}if(a||(a=t.cloneNode(!1)),a.ownerDocument=e,a.parentNode=null,r)for(var n=t.firstChild;n;)a.appendChild(xe(e,n,r)),n=n.nextSibling;return a}function ge(e,t,r){var a=new t.constructor;for(var n in t)if(Object.prototype.hasOwnProperty.call(t,n)){var o=t[n];\"object\"!=typeof o&&o!=a[n]&&(a[n]=o)}switch(t.childNodes&&(a.childNodes=new N),a.ownerDocument=e,a.nodeType){case d:var i=t.attributes,s=a.attributes=new B,l=i.length;s._ownerElement=a;for(var c=0;c<l;c++)a.setAttributeNode(ge(e,i.item(c),!0));break;case m:r=!0}if(r)for(var u=t.firstChild;u;)a.appendChild(ge(e,u,r)),u=u.nextSibling;return a}function we(e,t,r){e[t]=r}_.INVALID_STATE_ERR=(y[11]=\"Invalid state\",11),_.SYNTAX_ERR=(y[12]=\"Syntax error\",12),_.INVALID_MODIFICATION_ERR=(y[13]=\"Invalid modification\",13),_.NAMESPACE_ERR=(y[14]=\"Invalid namespace\",14),_.INVALID_ACCESS_ERR=(y[15]=\"Invalid access\",15),T.prototype=Error.prototype,c(_,T),N.prototype={length:0,item:function(e){return e>=0&&e<this.length?this[e]:null},toString:function(e,t){for(var r=[],a=0;a<this.length;a++)fe(this[a],r,e,t);return r.join(\"\")},filter:function(e){return Array.prototype.filter.call(this,e)},indexOf:function(e){return Array.prototype.indexOf.call(this,e)}},O.prototype.item=function(e){return L(this),this[e]||null},u(O,N),B.prototype={length:0,item:N.prototype.item,getNamedItem:function(e){for(var t=this.length;t--;){var r=this[t];if(r.nodeName==e)return r}},setNamedItem:function(e){var t=e.ownerElement;if(t&&t!=this._ownerElement)throw new T(M);var r=this.getNamedItem(e.nodeName);return F(this._ownerElement,this,e,r),r},setNamedItemNS:function(e){var t,r=e.ownerElement;if(r&&r!=this._ownerElement)throw new T(M);return t=this.getNamedItemNS(e.namespaceURI,e.localName),F(this._ownerElement,this,e,t),t},removeNamedItem:function(e){var t=this.getNamedItem(e);return P(this._ownerElement,this,t),t},removeNamedItemNS:function(e,t){var r=this.getNamedItemNS(e,t);return P(this._ownerElement,this,r),r},getNamedItemNS:function(e,t){for(var r=this.length;r--;){var a=this[r];if(a.localName==t&&a.namespaceURI==e)return a}return null}},k.prototype={hasFeature:function(e,t){return!0},createDocument:function(e,t,r){var a=new j;if(a.implementation=this,a.childNodes=new N,a.doctype=r||null,r&&a.appendChild(r),t){var n=a.createElementNS(e,t);a.appendChild(n)}return a},createDocumentType:function(e,t,r){var a=new oe;return a.name=e,a.nodeName=e,a.publicId=t||\"\",a.systemId=r||\"\",a}},R.prototype={firstChild:null,lastChild:null,previousSibling:null,nextSibling:null,attributes:null,parentNode:null,childNodes:null,ownerDocument:null,nodeValue:null,namespaceURI:null,prefix:null,localName:null,insertBefore:function(e,t){return Q(this,e,t)},replaceChild:function(e,t){Q(this,e,t,Z),t&&this.removeChild(t)},removeChild:function(e){return $(this,e)},appendChild:function(e){return this.insertBefore(e,null)},hasChildNodes:function(){return null!=this.firstChild},cloneNode:function(e){return ge(this.ownerDocument||this,this,e)},normalize:function(){for(var e=this.firstChild;e;){var t=e.nextSibling;t&&t.nodeType==p&&e.nodeType==p?(this.removeChild(t),e.appendData(t.data)):(e.normalize(),e=t)}},isSupported:function(e,t){return this.ownerDocument.implementation.hasFeature(e,t)},hasAttributes:function(){return this.attributes.length>0},lookupPrefix:function(e){for(var t=this;t;){var r=t._nsMap;if(r)for(var a in r)if(Object.prototype.hasOwnProperty.call(r,a)&&r[a]===e)return a;t=t.nodeType==m?t.ownerDocument:t.parentNode}return null},lookupNamespaceURI:function(e){for(var t=this;t;){var r=t._nsMap;if(r&&Object.prototype.hasOwnProperty.call(r,e))return r[e];t=t.nodeType==m?t.ownerDocument:t.parentNode}return null},isDefaultNamespace:function(e){return null==this.lookupPrefix(e)}},c(h,R),c(h,R.prototype),j.prototype={nodeName:\"#document\",nodeType:v,doctype:null,documentElement:null,_inc:1,insertBefore:function(e,t){if(e.nodeType==A){for(var r=e.firstChild;r;){var a=r.nextSibling;this.insertBefore(r,t),r=a}return e}return Q(this,e,t),e.ownerDocument=this,null===this.documentElement&&e.nodeType===d&&(this.documentElement=e),e},removeChild:function(e){return this.documentElement==e&&(this.documentElement=null),$(this,e)},replaceChild:function(e,t){Q(this,e,t,Z),e.ownerDocument=this,t&&this.removeChild(t),H(e)&&(this.documentElement=e)},importNode:function(e,t){return xe(this,e,t)},getElementById:function(e){var t=null;return U(this.documentElement,(function(r){if(r.nodeType==d&&r.getAttribute(\"id\")==e)return t=r,!0})),t},getElementsByClassName:function(e){var t=l(e);return new O(this,(function(r){var a=[];return t.length>0&&U(r.documentElement,(function(n){if(n!==r&&n.nodeType===d){var o=n.getAttribute(\"class\");if(o){var i=e===o;if(!i){var s=l(o);i=t.every((c=s,function(e){return c&&-1!==c.indexOf(e)}))}i&&a.push(n)}}var c})),a}))},createElement:function(e){var t=new K;return t.ownerDocument=this,t.nodeName=e,t.tagName=e,t.localName=e,t.childNodes=new N,(t.attributes=new B)._ownerElement=t,t},createDocumentFragment:function(){var e=new ce;return e.ownerDocument=this,e.childNodes=new N,e},createTextNode:function(e){var t=new re;return t.ownerDocument=this,t.appendData(e),t},createComment:function(e){var t=new ae;return t.ownerDocument=this,t.appendData(e),t},createCDATASection:function(e){var t=new ne;return t.ownerDocument=this,t.appendData(e),t},createProcessingInstruction:function(e,t){var r=new ue;return r.ownerDocument=this,r.tagName=r.nodeName=r.target=e,r.nodeValue=r.data=t,r},createAttribute:function(e){var t=new ee;return t.ownerDocument=this,t.name=e,t.nodeName=e,t.localName=e,t.specified=!0,t},createEntityReference:function(e){var t=new le;return t.ownerDocument=this,t.nodeName=e,t},createElementNS:function(e,t){var r=new K,a=t.split(\":\"),n=r.attributes=new B;return r.childNodes=new N,r.ownerDocument=this,r.nodeName=t,r.tagName=t,r.namespaceURI=e,2==a.length?(r.prefix=a[0],r.localName=a[1]):r.localName=t,n._ownerElement=r,r},createAttributeNS:function(e,t){var r=new ee,a=t.split(\":\");return r.ownerDocument=this,r.nodeName=t,r.name=t,r.namespaceURI=e,r.specified=!0,2==a.length?(r.prefix=a[0],r.localName=a[1]):r.localName=t,r}},u(j,R),K.prototype={nodeType:d,hasAttribute:function(e){return null!=this.getAttributeNode(e)},getAttribute:function(e){var t=this.getAttributeNode(e);return t&&t.value||\"\"},getAttributeNode:function(e){return this.attributes.getNamedItem(e)},setAttribute:function(e,t){var r=this.ownerDocument.createAttribute(e);r.value=r.nodeValue=\"\"+t,this.setAttributeNode(r)},removeAttribute:function(e){var t=this.getAttributeNode(e);t&&this.removeAttributeNode(t)},appendChild:function(e){return e.nodeType===A?this.insertBefore(e,null):function(e,t){return t.parentNode&&t.parentNode.removeChild(t),t.parentNode=e,t.previousSibling=e.lastChild,t.nextSibling=null,t.previousSibling?t.previousSibling.nextSibling=t:e.firstChild=t,e.lastChild=t,G(e.ownerDocument,e,t),t}(this,e)},setAttributeNode:function(e){return this.attributes.setNamedItem(e)},setAttributeNodeNS:function(e){return this.attributes.setNamedItemNS(e)},removeAttributeNode:function(e){return this.attributes.removeNamedItem(e.nodeName)},removeAttributeNS:function(e,t){var r=this.getAttributeNodeNS(e,t);r&&this.removeAttributeNode(r)},hasAttributeNS:function(e,t){return null!=this.getAttributeNodeNS(e,t)},getAttributeNS:function(e,t){var r=this.getAttributeNodeNS(e,t);return r&&r.value||\"\"},setAttributeNS:function(e,t,r){var a=this.ownerDocument.createAttributeNS(e,t);a.value=a.nodeValue=\"\"+r,this.setAttributeNode(a)},getAttributeNodeNS:function(e,t){return this.attributes.getNamedItemNS(e,t)},getElementsByTagName:function(e){return new O(this,(function(t){var r=[];return U(t,(function(a){a===t||a.nodeType!=d||\"*\"!==e&&a.tagName!=e||r.push(a)})),r}))},getElementsByTagNameNS:function(e,t){return new O(this,(function(r){var a=[];return U(r,(function(n){n===r||n.nodeType!==d||\"*\"!==e&&n.namespaceURI!==e||\"*\"!==t&&n.localName!=t||a.push(n)})),a}))}},j.prototype.getElementsByTagName=K.prototype.getElementsByTagName,j.prototype.getElementsByTagNameNS=K.prototype.getElementsByTagNameNS,u(K,R),ee.prototype.nodeType=m,u(ee,R),te.prototype={data:\"\",substringData:function(e,t){return this.data.substring(e,e+t)},appendData:function(e){e=this.data+e,this.nodeValue=this.data=e,this.length=e.length},insertData:function(e,t){this.replaceData(e,0,t)},appendChild:function(e){throw new Error(y[q])},deleteData:function(e,t){this.replaceData(e,t,\"\")},replaceData:function(e,t,r){r=this.data.substring(0,e)+r+this.data.substring(e+t),this.nodeValue=this.data=r,this.length=r.length}},u(te,R),re.prototype={nodeName:\"#text\",nodeType:p,splitText:function(e){var t=this.data,r=t.substring(e);t=t.substring(0,e),this.data=this.nodeValue=t,this.length=t.length;var a=this.ownerDocument.createTextNode(r);return this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling),a}},u(re,te),ae.prototype={nodeName:\"#comment\",nodeType:b},u(ae,te),ne.prototype={nodeName:\"#cdata-section\",nodeType:f},u(ne,te),oe.prototype.nodeType=C,u(oe,R),ie.prototype.nodeType=E,u(ie,R),se.prototype.nodeType=g,u(se,R),le.prototype.nodeType=x,u(le,R),ce.prototype.nodeName=\"#document-fragment\",ce.prototype.nodeType=A,u(ce,R),ue.prototype.nodeType=w,u(ue,R),he.prototype.serializeToString=function(e,t,r){return de.call(e,t,r)},R.prototype.toString=de;try{if(Object.defineProperty){function be(e){switch(e.nodeType){case d:case A:var t=[];for(e=e.firstChild;e;)7!==e.nodeType&&8!==e.nodeType&&t.push(be(e)),e=e.nextSibling;return t.join(\"\");default:return e.nodeValue}}Object.defineProperty(O.prototype,\"length\",{get:function(){return L(this),this.$$length}}),Object.defineProperty(R.prototype,\"textContent\",{get:function(){return be(this)},set:function(e){switch(this.nodeType){case d:case A:for(;this.firstChild;)this.removeChild(this.firstChild);(e||String(e))&&this.appendChild(this.ownerDocument.createTextNode(e));break;default:this.data=e,this.value=e,this.nodeValue=e}}}),we=function(e,t,r){e[\"$$\"+t]=r}}}catch(ve){}t.DocumentType=oe,t.DOMException=T,t.DOMImplementation=k,t.Element=K,t.Node=R,t.NodeList=N,t.XMLSerializer=he},6559:(e,t,r)=>{\"use strict\";var a=r(4582).freeze;t.XML_ENTITIES=a({amp:\"&\",apos:\"'\",gt:\">\",lt:\"<\",quot:'\"'}),t.HTML_ENTITIES=a({Aacute:\"Á\",aacute:\"á\",Abreve:\"Ă\",abreve:\"ă\",ac:\"∾\",acd:\"∿\",acE:\"∾̳\",Acirc:\"Â\",acirc:\"â\",acute:\"´\",Acy:\"А\",acy:\"а\",AElig:\"Æ\",aelig:\"æ\",af:\"\",Afr:\"𝔄\",afr:\"𝔞\",Agrave:\"À\",agrave:\"à\",alefsym:\"ℵ\",aleph:\"ℵ\",Alpha:\"Α\",alpha:\"α\",Amacr:\"Ā\",amacr:\"ā\",amalg:\"⨿\",AMP:\"&\",amp:\"&\",And:\"⩓\",and:\"∧\",andand:\"⩕\",andd:\"⩜\",andslope:\"⩘\",andv:\"⩚\",ang:\"∠\",ange:\"⦤\",angle:\"∠\",angmsd:\"∡\",angmsdaa:\"⦨\",angmsdab:\"⦩\",angmsdac:\"⦪\",angmsdad:\"⦫\",angmsdae:\"⦬\",angmsdaf:\"⦭\",angmsdag:\"⦮\",angmsdah:\"⦯\",angrt:\"∟\",angrtvb:\"⊾\",angrtvbd:\"⦝\",angsph:\"∢\",angst:\"Å\",angzarr:\"⍼\",Aogon:\"Ą\",aogon:\"ą\",Aopf:\"𝔸\",aopf:\"𝕒\",ap:\"≈\",apacir:\"⩯\",apE:\"⩰\",ape:\"≊\",apid:\"≋\",apos:\"'\",ApplyFunction:\"\",approx:\"≈\",approxeq:\"≊\",Aring:\"Å\",aring:\"å\",Ascr:\"𝒜\",ascr:\"𝒶\",Assign:\"≔\",ast:\"*\",asymp:\"≈\",asympeq:\"≍\",Atilde:\"Ã\",atilde:\"ã\",Auml:\"Ä\",auml:\"ä\",awconint:\"∳\",awint:\"⨑\",backcong:\"≌\",backepsilon:\"϶\",backprime:\"‵\",backsim:\"∽\",backsimeq:\"⋍\",Backslash:\"∖\",Barv:\"⫧\",barvee:\"⊽\",Barwed:\"⌆\",barwed:\"⌅\",barwedge:\"⌅\",bbrk:\"⎵\",bbrktbrk:\"⎶\",bcong:\"≌\",Bcy:\"Б\",bcy:\"б\",bdquo:\"„\",becaus:\"∵\",Because:\"∵\",because:\"∵\",bemptyv:\"⦰\",bepsi:\"϶\",bernou:\"ℬ\",Bernoullis:\"ℬ\",Beta:\"Β\",beta:\"β\",beth:\"ℶ\",between:\"≬\",Bfr:\"𝔅\",bfr:\"𝔟\",bigcap:\"⋂\",bigcirc:\"◯\",bigcup:\"⋃\",bigodot:\"⨀\",bigoplus:\"⨁\",bigotimes:\"⨂\",bigsqcup:\"⨆\",bigstar:\"★\",bigtriangledown:\"▽\",bigtriangleup:\"△\",biguplus:\"⨄\",bigvee:\"⋁\",bigwedge:\"⋀\",bkarow:\"⤍\",blacklozenge:\"⧫\",blacksquare:\"▪\",blacktriangle:\"▴\",blacktriangledown:\"▾\",blacktriangleleft:\"◂\",blacktriangleright:\"▸\",blank:\"␣\",blk12:\"▒\",blk14:\"░\",blk34:\"▓\",block:\"█\",bne:\"=⃥\",bnequiv:\"≡⃥\",bNot:\"⫭\",bnot:\"⌐\",Bopf:\"𝔹\",bopf:\"𝕓\",bot:\"⊥\",bottom:\"⊥\",bowtie:\"⋈\",boxbox:\"⧉\",boxDL:\"╗\",boxDl:\"╖\",boxdL:\"╕\",boxdl:\"┐\",boxDR:\"╔\",boxDr:\"╓\",boxdR:\"╒\",boxdr:\"┌\",boxH:\"═\",boxh:\"─\",boxHD:\"╦\",boxHd:\"╤\",boxhD:\"╥\",boxhd:\"┬\",boxHU:\"╩\",boxHu:\"╧\",boxhU:\"╨\",boxhu:\"┴\",boxminus:\"⊟\",boxplus:\"⊞\",boxtimes:\"⊠\",boxUL:\"╝\",boxUl:\"╜\",boxuL:\"╛\",boxul:\"┘\",boxUR:\"╚\",boxUr:\"╙\",boxuR:\"╘\",boxur:\"└\",boxV:\"║\",boxv:\"│\",boxVH:\"╬\",boxVh:\"╫\",boxvH:\"╪\",boxvh:\"┼\",boxVL:\"╣\",boxVl:\"╢\",boxvL:\"╡\",boxvl:\"┤\",boxVR:\"╠\",boxVr:\"╟\",boxvR:\"╞\",boxvr:\"├\",bprime:\"‵\",Breve:\"˘\",breve:\"˘\",brvbar:\"¦\",Bscr:\"ℬ\",bscr:\"𝒷\",bsemi:\"⁏\",bsim:\"∽\",bsime:\"⋍\",bsol:\"\\\\\",bsolb:\"⧅\",bsolhsub:\"⟈\",bull:\"•\",bullet:\"•\",bump:\"≎\",bumpE:\"⪮\",bumpe:\"≏\",Bumpeq:\"≎\",bumpeq:\"≏\",Cacute:\"Ć\",cacute:\"ć\",Cap:\"⋒\",cap:\"∩\",capand:\"⩄\",capbrcup:\"⩉\",capcap:\"⩋\",capcup:\"⩇\",capdot:\"⩀\",CapitalDifferentialD:\"ⅅ\",caps:\"∩︀\",caret:\"⁁\",caron:\"ˇ\",Cayleys:\"ℭ\",ccaps:\"⩍\",Ccaron:\"Č\",ccaron:\"č\",Ccedil:\"Ç\",ccedil:\"ç\",Ccirc:\"Ĉ\",ccirc:\"ĉ\",Cconint:\"∰\",ccups:\"⩌\",ccupssm:\"⩐\",Cdot:\"Ċ\",cdot:\"ċ\",cedil:\"¸\",Cedilla:\"¸\",cemptyv:\"⦲\",cent:\"¢\",CenterDot:\"·\",centerdot:\"·\",Cfr:\"ℭ\",cfr:\"𝔠\",CHcy:\"Ч\",chcy:\"ч\",check:\"✓\",checkmark:\"✓\",Chi:\"Χ\",chi:\"χ\",cir:\"○\",circ:\"ˆ\",circeq:\"≗\",circlearrowleft:\"↺\",circlearrowright:\"↻\",circledast:\"⊛\",circledcirc:\"⊚\",circleddash:\"⊝\",CircleDot:\"⊙\",circledR:\"®\",circledS:\"Ⓢ\",CircleMinus:\"⊖\",CirclePlus:\"⊕\",CircleTimes:\"⊗\",cirE:\"⧃\",cire:\"≗\",cirfnint:\"⨐\",cirmid:\"⫯\",cirscir:\"⧂\",ClockwiseContourIntegral:\"∲\",CloseCurlyDoubleQuote:\"”\",CloseCurlyQuote:\"’\",clubs:\"♣\",clubsuit:\"♣\",Colon:\"∷\",colon:\":\",Colone:\"⩴\",colone:\"≔\",coloneq:\"≔\",comma:\",\",commat:\"@\",comp:\"∁\",compfn:\"∘\",complement:\"∁\",complexes:\"ℂ\",cong:\"≅\",congdot:\"⩭\",Congruent:\"≡\",Conint:\"∯\",conint:\"∮\",ContourIntegral:\"∮\",Copf:\"ℂ\",copf:\"𝕔\",coprod:\"∐\",Coproduct:\"∐\",COPY:\"©\",copy:\"©\",copysr:\"℗\",CounterClockwiseContourIntegral:\"∳\",crarr:\"↵\",Cross:\"⨯\",cross:\"✗\",Cscr:\"𝒞\",cscr:\"𝒸\",csub:\"⫏\",csube:\"⫑\",csup:\"⫐\",csupe:\"⫒\",ctdot:\"⋯\",cudarrl:\"⤸\",cudarrr:\"⤵\",cuepr:\"⋞\",cuesc:\"⋟\",cularr:\"↶\",cularrp:\"⤽\",Cup:\"⋓\",cup:\"∪\",cupbrcap:\"⩈\",CupCap:\"≍\",cupcap:\"⩆\",cupcup:\"⩊\",cupdot:\"⊍\",cupor:\"⩅\",cups:\"∪︀\",curarr:\"↷\",curarrm:\"⤼\",curlyeqprec:\"⋞\",curlyeqsucc:\"⋟\",curlyvee:\"⋎\",curlywedge:\"⋏\",curren:\"¤\",curvearrowleft:\"↶\",curvearrowright:\"↷\",cuvee:\"⋎\",cuwed:\"⋏\",cwconint:\"∲\",cwint:\"∱\",cylcty:\"⌭\",Dagger:\"‡\",dagger:\"†\",daleth:\"ℸ\",Darr:\"↡\",dArr:\"⇓\",darr:\"↓\",dash:\"‐\",Dashv:\"⫤\",dashv:\"⊣\",dbkarow:\"⤏\",dblac:\"˝\",Dcaron:\"Ď\",dcaron:\"ď\",Dcy:\"Д\",dcy:\"д\",DD:\"ⅅ\",dd:\"ⅆ\",ddagger:\"‡\",ddarr:\"⇊\",DDotrahd:\"⤑\",ddotseq:\"⩷\",deg:\"°\",Del:\"∇\",Delta:\"Δ\",delta:\"δ\",demptyv:\"⦱\",dfisht:\"⥿\",Dfr:\"𝔇\",dfr:\"𝔡\",dHar:\"⥥\",dharl:\"⇃\",dharr:\"⇂\",DiacriticalAcute:\"´\",DiacriticalDot:\"˙\",DiacriticalDoubleAcute:\"˝\",DiacriticalGrave:\"`\",DiacriticalTilde:\"˜\",diam:\"⋄\",Diamond:\"⋄\",diamond:\"⋄\",diamondsuit:\"♦\",diams:\"♦\",die:\"¨\",DifferentialD:\"ⅆ\",digamma:\"ϝ\",disin:\"⋲\",div:\"÷\",divide:\"÷\",divideontimes:\"⋇\",divonx:\"⋇\",DJcy:\"Ђ\",djcy:\"ђ\",dlcorn:\"⌞\",dlcrop:\"⌍\",dollar:\"$\",Dopf:\"𝔻\",dopf:\"𝕕\",Dot:\"¨\",dot:\"˙\",DotDot:\"⃜\",doteq:\"≐\",doteqdot:\"≑\",DotEqual:\"≐\",dotminus:\"∸\",dotplus:\"∔\",dotsquare:\"⊡\",doublebarwedge:\"⌆\",DoubleContourIntegral:\"∯\",DoubleDot:\"¨\",DoubleDownArrow:\"⇓\",DoubleLeftArrow:\"⇐\",DoubleLeftRightArrow:\"⇔\",DoubleLeftTee:\"⫤\",DoubleLongLeftArrow:\"⟸\",DoubleLongLeftRightArrow:\"⟺\",DoubleLongRightArrow:\"⟹\",DoubleRightArrow:\"⇒\",DoubleRightTee:\"⊨\",DoubleUpArrow:\"⇑\",DoubleUpDownArrow:\"⇕\",DoubleVerticalBar:\"∥\",DownArrow:\"↓\",Downarrow:\"⇓\",downarrow:\"↓\",DownArrowBar:\"⤓\",DownArrowUpArrow:\"⇵\",DownBreve:\"̑\",downdownarrows:\"⇊\",downharpoonleft:\"⇃\",downharpoonright:\"⇂\",DownLeftRightVector:\"⥐\",DownLeftTeeVector:\"⥞\",DownLeftVector:\"↽\",DownLeftVectorBar:\"⥖\",DownRightTeeVector:\"⥟\",DownRightVector:\"⇁\",DownRightVectorBar:\"⥗\",DownTee:\"⊤\",DownTeeArrow:\"↧\",drbkarow:\"⤐\",drcorn:\"⌟\",drcrop:\"⌌\",Dscr:\"𝒟\",dscr:\"𝒹\",DScy:\"Ѕ\",dscy:\"ѕ\",dsol:\"⧶\",Dstrok:\"Đ\",dstrok:\"đ\",dtdot:\"⋱\",dtri:\"▿\",dtrif:\"▾\",duarr:\"⇵\",duhar:\"⥯\",dwangle:\"⦦\",DZcy:\"Џ\",dzcy:\"џ\",dzigrarr:\"⟿\",Eacute:\"É\",eacute:\"é\",easter:\"⩮\",Ecaron:\"Ě\",ecaron:\"ě\",ecir:\"≖\",Ecirc:\"Ê\",ecirc:\"ê\",ecolon:\"≕\",Ecy:\"Э\",ecy:\"э\",eDDot:\"⩷\",Edot:\"Ė\",eDot:\"≑\",edot:\"ė\",ee:\"ⅇ\",efDot:\"≒\",Efr:\"𝔈\",efr:\"𝔢\",eg:\"⪚\",Egrave:\"È\",egrave:\"è\",egs:\"⪖\",egsdot:\"⪘\",el:\"⪙\",Element:\"∈\",elinters:\"⏧\",ell:\"ℓ\",els:\"⪕\",elsdot:\"⪗\",Emacr:\"Ē\",emacr:\"ē\",empty:\"∅\",emptyset:\"∅\",EmptySmallSquare:\"◻\",emptyv:\"∅\",EmptyVerySmallSquare:\"▫\",emsp:\" \",emsp13:\" \",emsp14:\" \",ENG:\"Ŋ\",eng:\"ŋ\",ensp:\" \",Eogon:\"Ę\",eogon:\"ę\",Eopf:\"𝔼\",eopf:\"𝕖\",epar:\"⋕\",eparsl:\"⧣\",eplus:\"⩱\",epsi:\"ε\",Epsilon:\"Ε\",epsilon:\"ε\",epsiv:\"ϵ\",eqcirc:\"≖\",eqcolon:\"≕\",eqsim:\"≂\",eqslantgtr:\"⪖\",eqslantless:\"⪕\",Equal:\"⩵\",equals:\"=\",EqualTilde:\"≂\",equest:\"≟\",Equilibrium:\"⇌\",equiv:\"≡\",equivDD:\"⩸\",eqvparsl:\"⧥\",erarr:\"⥱\",erDot:\"≓\",Escr:\"ℰ\",escr:\"ℯ\",esdot:\"≐\",Esim:\"⩳\",esim:\"≂\",Eta:\"Η\",eta:\"η\",ETH:\"Ð\",eth:\"ð\",Euml:\"Ë\",euml:\"ë\",euro:\"€\",excl:\"!\",exist:\"∃\",Exists:\"∃\",expectation:\"ℰ\",ExponentialE:\"ⅇ\",exponentiale:\"ⅇ\",fallingdotseq:\"≒\",Fcy:\"Ф\",fcy:\"ф\",female:\"♀\",ffilig:\"ffi\",fflig:\"ff\",ffllig:\"ffl\",Ffr:\"𝔉\",ffr:\"𝔣\",filig:\"fi\",FilledSmallSquare:\"◼\",FilledVerySmallSquare:\"▪\",fjlig:\"fj\",flat:\"♭\",fllig:\"fl\",fltns:\"▱\",fnof:\"ƒ\",Fopf:\"𝔽\",fopf:\"𝕗\",ForAll:\"∀\",forall:\"∀\",fork:\"⋔\",forkv:\"⫙\",Fouriertrf:\"ℱ\",fpartint:\"⨍\",frac12:\"½\",frac13:\"⅓\",frac14:\"¼\",frac15:\"⅕\",frac16:\"⅙\",frac18:\"⅛\",frac23:\"⅔\",frac25:\"⅖\",frac34:\"¾\",frac35:\"⅗\",frac38:\"⅜\",frac45:\"⅘\",frac56:\"⅚\",frac58:\"⅝\",frac78:\"⅞\",frasl:\"⁄\",frown:\"⌢\",Fscr:\"ℱ\",fscr:\"𝒻\",gacute:\"ǵ\",Gamma:\"Γ\",gamma:\"γ\",Gammad:\"Ϝ\",gammad:\"ϝ\",gap:\"⪆\",Gbreve:\"Ğ\",gbreve:\"ğ\",Gcedil:\"Ģ\",Gcirc:\"Ĝ\",gcirc:\"ĝ\",Gcy:\"Г\",gcy:\"г\",Gdot:\"Ġ\",gdot:\"ġ\",gE:\"≧\",ge:\"≥\",gEl:\"⪌\",gel:\"⋛\",geq:\"≥\",geqq:\"≧\",geqslant:\"⩾\",ges:\"⩾\",gescc:\"⪩\",gesdot:\"⪀\",gesdoto:\"⪂\",gesdotol:\"⪄\",gesl:\"⋛︀\",gesles:\"⪔\",Gfr:\"𝔊\",gfr:\"𝔤\",Gg:\"⋙\",gg:\"≫\",ggg:\"⋙\",gimel:\"ℷ\",GJcy:\"Ѓ\",gjcy:\"ѓ\",gl:\"≷\",gla:\"⪥\",glE:\"⪒\",glj:\"⪤\",gnap:\"⪊\",gnapprox:\"⪊\",gnE:\"≩\",gne:\"⪈\",gneq:\"⪈\",gneqq:\"≩\",gnsim:\"⋧\",Gopf:\"𝔾\",gopf:\"𝕘\",grave:\"`\",GreaterEqual:\"≥\",GreaterEqualLess:\"⋛\",GreaterFullEqual:\"≧\",GreaterGreater:\"⪢\",GreaterLess:\"≷\",GreaterSlantEqual:\"⩾\",GreaterTilde:\"≳\",Gscr:\"𝒢\",gscr:\"ℊ\",gsim:\"≳\",gsime:\"⪎\",gsiml:\"⪐\",Gt:\"≫\",GT:\">\",gt:\">\",gtcc:\"⪧\",gtcir:\"⩺\",gtdot:\"⋗\",gtlPar:\"⦕\",gtquest:\"⩼\",gtrapprox:\"⪆\",gtrarr:\"⥸\",gtrdot:\"⋗\",gtreqless:\"⋛\",gtreqqless:\"⪌\",gtrless:\"≷\",gtrsim:\"≳\",gvertneqq:\"≩︀\",gvnE:\"≩︀\",Hacek:\"ˇ\",hairsp:\" \",half:\"½\",hamilt:\"ℋ\",HARDcy:\"Ъ\",hardcy:\"ъ\",hArr:\"⇔\",harr:\"↔\",harrcir:\"⥈\",harrw:\"↭\",Hat:\"^\",hbar:\"ℏ\",Hcirc:\"Ĥ\",hcirc:\"ĥ\",hearts:\"♥\",heartsuit:\"♥\",hellip:\"…\",hercon:\"⊹\",Hfr:\"ℌ\",hfr:\"𝔥\",HilbertSpace:\"ℋ\",hksearow:\"⤥\",hkswarow:\"⤦\",hoarr:\"⇿\",homtht:\"∻\",hookleftarrow:\"↩\",hookrightarrow:\"↪\",Hopf:\"ℍ\",hopf:\"𝕙\",horbar:\"―\",HorizontalLine:\"─\",Hscr:\"ℋ\",hscr:\"𝒽\",hslash:\"ℏ\",Hstrok:\"Ħ\",hstrok:\"ħ\",HumpDownHump:\"≎\",HumpEqual:\"≏\",hybull:\"⁃\",hyphen:\"‐\",Iacute:\"Í\",iacute:\"í\",ic:\"\",Icirc:\"Î\",icirc:\"î\",Icy:\"И\",icy:\"и\",Idot:\"İ\",IEcy:\"Е\",iecy:\"е\",iexcl:\"¡\",iff:\"⇔\",Ifr:\"ℑ\",ifr:\"𝔦\",Igrave:\"Ì\",igrave:\"ì\",ii:\"ⅈ\",iiiint:\"⨌\",iiint:\"∭\",iinfin:\"⧜\",iiota:\"℩\",IJlig:\"IJ\",ijlig:\"ij\",Im:\"ℑ\",Imacr:\"Ī\",imacr:\"ī\",image:\"ℑ\",ImaginaryI:\"ⅈ\",imagline:\"ℐ\",imagpart:\"ℑ\",imath:\"ı\",imof:\"⊷\",imped:\"Ƶ\",Implies:\"⇒\",in:\"∈\",incare:\"℅\",infin:\"∞\",infintie:\"⧝\",inodot:\"ı\",Int:\"∬\",int:\"∫\",intcal:\"⊺\",integers:\"ℤ\",Integral:\"∫\",intercal:\"⊺\",Intersection:\"⋂\",intlarhk:\"⨗\",intprod:\"⨼\",InvisibleComma:\"\",InvisibleTimes:\"\",IOcy:\"Ё\",iocy:\"ё\",Iogon:\"Į\",iogon:\"į\",Iopf:\"𝕀\",iopf:\"𝕚\",Iota:\"Ι\",iota:\"ι\",iprod:\"⨼\",iquest:\"¿\",Iscr:\"ℐ\",iscr:\"𝒾\",isin:\"∈\",isindot:\"⋵\",isinE:\"⋹\",isins:\"⋴\",isinsv:\"⋳\",isinv:\"∈\",it:\"\",Itilde:\"Ĩ\",itilde:\"ĩ\",Iukcy:\"І\",iukcy:\"і\",Iuml:\"Ï\",iuml:\"ï\",Jcirc:\"Ĵ\",jcirc:\"ĵ\",Jcy:\"Й\",jcy:\"й\",Jfr:\"𝔍\",jfr:\"𝔧\",jmath:\"ȷ\",Jopf:\"𝕁\",jopf:\"𝕛\",Jscr:\"𝒥\",jscr:\"𝒿\",Jsercy:\"Ј\",jsercy:\"ј\",Jukcy:\"Є\",jukcy:\"є\",Kappa:\"Κ\",kappa:\"κ\",kappav:\"ϰ\",Kcedil:\"Ķ\",kcedil:\"ķ\",Kcy:\"К\",kcy:\"к\",Kfr:\"𝔎\",kfr:\"𝔨\",kgreen:\"ĸ\",KHcy:\"Х\",khcy:\"х\",KJcy:\"Ќ\",kjcy:\"ќ\",Kopf:\"𝕂\",kopf:\"𝕜\",Kscr:\"𝒦\",kscr:\"𝓀\",lAarr:\"⇚\",Lacute:\"Ĺ\",lacute:\"ĺ\",laemptyv:\"⦴\",lagran:\"ℒ\",Lambda:\"Λ\",lambda:\"λ\",Lang:\"⟪\",lang:\"⟨\",langd:\"⦑\",langle:\"⟨\",lap:\"⪅\",Laplacetrf:\"ℒ\",laquo:\"«\",Larr:\"↞\",lArr:\"⇐\",larr:\"←\",larrb:\"⇤\",larrbfs:\"⤟\",larrfs:\"⤝\",larrhk:\"↩\",larrlp:\"↫\",larrpl:\"⤹\",larrsim:\"⥳\",larrtl:\"↢\",lat:\"⪫\",lAtail:\"⤛\",latail:\"⤙\",late:\"⪭\",lates:\"⪭︀\",lBarr:\"⤎\",lbarr:\"⤌\",lbbrk:\"❲\",lbrace:\"{\",lbrack:\"[\",lbrke:\"⦋\",lbrksld:\"⦏\",lbrkslu:\"⦍\",Lcaron:\"Ľ\",lcaron:\"ľ\",Lcedil:\"Ļ\",lcedil:\"ļ\",lceil:\"⌈\",lcub:\"{\",Lcy:\"Л\",lcy:\"л\",ldca:\"⤶\",ldquo:\"“\",ldquor:\"„\",ldrdhar:\"⥧\",ldrushar:\"⥋\",ldsh:\"↲\",lE:\"≦\",le:\"≤\",LeftAngleBracket:\"⟨\",LeftArrow:\"←\",Leftarrow:\"⇐\",leftarrow:\"←\",LeftArrowBar:\"⇤\",LeftArrowRightArrow:\"⇆\",leftarrowtail:\"↢\",LeftCeiling:\"⌈\",LeftDoubleBracket:\"⟦\",LeftDownTeeVector:\"⥡\",LeftDownVector:\"⇃\",LeftDownVectorBar:\"⥙\",LeftFloor:\"⌊\",leftharpoondown:\"↽\",leftharpoonup:\"↼\",leftleftarrows:\"⇇\",LeftRightArrow:\"↔\",Leftrightarrow:\"⇔\",leftrightarrow:\"↔\",leftrightarrows:\"⇆\",leftrightharpoons:\"⇋\",leftrightsquigarrow:\"↭\",LeftRightVector:\"⥎\",LeftTee:\"⊣\",LeftTeeArrow:\"↤\",LeftTeeVector:\"⥚\",leftthreetimes:\"⋋\",LeftTriangle:\"⊲\",LeftTriangleBar:\"⧏\",LeftTriangleEqual:\"⊴\",LeftUpDownVector:\"⥑\",LeftUpTeeVector:\"⥠\",LeftUpVector:\"↿\",LeftUpVectorBar:\"⥘\",LeftVector:\"↼\",LeftVectorBar:\"⥒\",lEg:\"⪋\",leg:\"⋚\",leq:\"≤\",leqq:\"≦\",leqslant:\"⩽\",les:\"⩽\",lescc:\"⪨\",lesdot:\"⩿\",lesdoto:\"⪁\",lesdotor:\"⪃\",lesg:\"⋚︀\",lesges:\"⪓\",lessapprox:\"⪅\",lessdot:\"⋖\",lesseqgtr:\"⋚\",lesseqqgtr:\"⪋\",LessEqualGreater:\"⋚\",LessFullEqual:\"≦\",LessGreater:\"≶\",lessgtr:\"≶\",LessLess:\"⪡\",lesssim:\"≲\",LessSlantEqual:\"⩽\",LessTilde:\"≲\",lfisht:\"⥼\",lfloor:\"⌊\",Lfr:\"𝔏\",lfr:\"𝔩\",lg:\"≶\",lgE:\"⪑\",lHar:\"⥢\",lhard:\"↽\",lharu:\"↼\",lharul:\"⥪\",lhblk:\"▄\",LJcy:\"Љ\",ljcy:\"љ\",Ll:\"⋘\",ll:\"≪\",llarr:\"⇇\",llcorner:\"⌞\",Lleftarrow:\"⇚\",llhard:\"⥫\",lltri:\"◺\",Lmidot:\"Ŀ\",lmidot:\"ŀ\",lmoust:\"⎰\",lmoustache:\"⎰\",lnap:\"⪉\",lnapprox:\"⪉\",lnE:\"≨\",lne:\"⪇\",lneq:\"⪇\",lneqq:\"≨\",lnsim:\"⋦\",loang:\"⟬\",loarr:\"⇽\",lobrk:\"⟦\",LongLeftArrow:\"⟵\",Longleftarrow:\"⟸\",longleftarrow:\"⟵\",LongLeftRightArrow:\"⟷\",Longleftrightarrow:\"⟺\",longleftrightarrow:\"⟷\",longmapsto:\"⟼\",LongRightArrow:\"⟶\",Longrightarrow:\"⟹\",longrightarrow:\"⟶\",looparrowleft:\"↫\",looparrowright:\"↬\",lopar:\"⦅\",Lopf:\"𝕃\",lopf:\"𝕝\",loplus:\"⨭\",lotimes:\"⨴\",lowast:\"∗\",lowbar:\"_\",LowerLeftArrow:\"↙\",LowerRightArrow:\"↘\",loz:\"◊\",lozenge:\"◊\",lozf:\"⧫\",lpar:\"(\",lparlt:\"⦓\",lrarr:\"⇆\",lrcorner:\"⌟\",lrhar:\"⇋\",lrhard:\"⥭\",lrm:\"\",lrtri:\"⊿\",lsaquo:\"‹\",Lscr:\"ℒ\",lscr:\"𝓁\",Lsh:\"↰\",lsh:\"↰\",lsim:\"≲\",lsime:\"⪍\",lsimg:\"⪏\",lsqb:\"[\",lsquo:\"‘\",lsquor:\"‚\",Lstrok:\"Ł\",lstrok:\"ł\",Lt:\"≪\",LT:\"<\",lt:\"<\",ltcc:\"⪦\",ltcir:\"⩹\",ltdot:\"⋖\",lthree:\"⋋\",ltimes:\"⋉\",ltlarr:\"⥶\",ltquest:\"⩻\",ltri:\"◃\",ltrie:\"⊴\",ltrif:\"◂\",ltrPar:\"⦖\",lurdshar:\"⥊\",luruhar:\"⥦\",lvertneqq:\"≨︀\",lvnE:\"≨︀\",macr:\"¯\",male:\"♂\",malt:\"✠\",maltese:\"✠\",Map:\"⤅\",map:\"↦\",mapsto:\"↦\",mapstodown:\"↧\",mapstoleft:\"↤\",mapstoup:\"↥\",marker:\"▮\",mcomma:\"⨩\",Mcy:\"М\",mcy:\"м\",mdash:\"—\",mDDot:\"∺\",measuredangle:\"∡\",MediumSpace:\" \",Mellintrf:\"ℳ\",Mfr:\"𝔐\",mfr:\"𝔪\",mho:\"℧\",micro:\"µ\",mid:\"∣\",midast:\"*\",midcir:\"⫰\",middot:\"·\",minus:\"−\",minusb:\"⊟\",minusd:\"∸\",minusdu:\"⨪\",MinusPlus:\"∓\",mlcp:\"⫛\",mldr:\"…\",mnplus:\"∓\",models:\"⊧\",Mopf:\"𝕄\",mopf:\"𝕞\",mp:\"∓\",Mscr:\"ℳ\",mscr:\"𝓂\",mstpos:\"∾\",Mu:\"Μ\",mu:\"μ\",multimap:\"⊸\",mumap:\"⊸\",nabla:\"∇\",Nacute:\"Ń\",nacute:\"ń\",nang:\"∠⃒\",nap:\"≉\",napE:\"⩰̸\",napid:\"≋̸\",napos:\"ʼn\",napprox:\"≉\",natur:\"♮\",natural:\"♮\",naturals:\"ℕ\",nbsp:\" \",nbump:\"≎̸\",nbumpe:\"≏̸\",ncap:\"⩃\",Ncaron:\"Ň\",ncaron:\"ň\",Ncedil:\"Ņ\",ncedil:\"ņ\",ncong:\"≇\",ncongdot:\"⩭̸\",ncup:\"⩂\",Ncy:\"Н\",ncy:\"н\",ndash:\"–\",ne:\"≠\",nearhk:\"⤤\",neArr:\"⇗\",nearr:\"↗\",nearrow:\"↗\",nedot:\"≐̸\",NegativeMediumSpace:\"\",NegativeThickSpace:\"\",NegativeThinSpace:\"\",NegativeVeryThinSpace:\"\",nequiv:\"≢\",nesear:\"⤨\",nesim:\"≂̸\",NestedGreaterGreater:\"≫\",NestedLessLess:\"≪\",NewLine:\"\\n\",nexist:\"∄\",nexists:\"∄\",Nfr:\"𝔑\",nfr:\"𝔫\",ngE:\"≧̸\",nge:\"≱\",ngeq:\"≱\",ngeqq:\"≧̸\",ngeqslant:\"⩾̸\",nges:\"⩾̸\",nGg:\"⋙̸\",ngsim:\"≵\",nGt:\"≫⃒\",ngt:\"≯\",ngtr:\"≯\",nGtv:\"≫̸\",nhArr:\"⇎\",nharr:\"↮\",nhpar:\"⫲\",ni:\"∋\",nis:\"⋼\",nisd:\"⋺\",niv:\"∋\",NJcy:\"Њ\",njcy:\"њ\",nlArr:\"⇍\",nlarr:\"↚\",nldr:\"‥\",nlE:\"≦̸\",nle:\"≰\",nLeftarrow:\"⇍\",nleftarrow:\"↚\",nLeftrightarrow:\"⇎\",nleftrightarrow:\"↮\",nleq:\"≰\",nleqq:\"≦̸\",nleqslant:\"⩽̸\",nles:\"⩽̸\",nless:\"≮\",nLl:\"⋘̸\",nlsim:\"≴\",nLt:\"≪⃒\",nlt:\"≮\",nltri:\"⋪\",nltrie:\"⋬\",nLtv:\"≪̸\",nmid:\"∤\",NoBreak:\"\",NonBreakingSpace:\" \",Nopf:\"ℕ\",nopf:\"𝕟\",Not:\"⫬\",not:\"¬\",NotCongruent:\"≢\",NotCupCap:\"≭\",NotDoubleVerticalBar:\"∦\",NotElement:\"∉\",NotEqual:\"≠\",NotEqualTilde:\"≂̸\",NotExists:\"∄\",NotGreater:\"≯\",NotGreaterEqual:\"≱\",NotGreaterFullEqual:\"≧̸\",NotGreaterGreater:\"≫̸\",NotGreaterLess:\"≹\",NotGreaterSlantEqual:\"⩾̸\",NotGreaterTilde:\"≵\",NotHumpDownHump:\"≎̸\",NotHumpEqual:\"≏̸\",notin:\"∉\",notindot:\"⋵̸\",notinE:\"⋹̸\",notinva:\"∉\",notinvb:\"⋷\",notinvc:\"⋶\",NotLeftTriangle:\"⋪\",NotLeftTriangleBar:\"⧏̸\",NotLeftTriangleEqual:\"⋬\",NotLess:\"≮\",NotLessEqual:\"≰\",NotLessGreater:\"≸\",NotLessLess:\"≪̸\",NotLessSlantEqual:\"⩽̸\",NotLessTilde:\"≴\",NotNestedGreaterGreater:\"⪢̸\",NotNestedLessLess:\"⪡̸\",notni:\"∌\",notniva:\"∌\",notnivb:\"⋾\",notnivc:\"⋽\",NotPrecedes:\"⊀\",NotPrecedesEqual:\"⪯̸\",NotPrecedesSlantEqual:\"⋠\",NotReverseElement:\"∌\",NotRightTriangle:\"⋫\",NotRightTriangleBar:\"⧐̸\",NotRightTriangleEqual:\"⋭\",NotSquareSubset:\"⊏̸\",NotSquareSubsetEqual:\"⋢\",NotSquareSuperset:\"⊐̸\",NotSquareSupersetEqual:\"⋣\",NotSubset:\"⊂⃒\",NotSubsetEqual:\"⊈\",NotSucceeds:\"⊁\",NotSucceedsEqual:\"⪰̸\",NotSucceedsSlantEqual:\"⋡\",NotSucceedsTilde:\"≿̸\",NotSuperset:\"⊃⃒\",NotSupersetEqual:\"⊉\",NotTilde:\"≁\",NotTildeEqual:\"≄\",NotTildeFullEqual:\"≇\",NotTildeTilde:\"≉\",NotVerticalBar:\"∤\",npar:\"∦\",nparallel:\"∦\",nparsl:\"⫽⃥\",npart:\"∂̸\",npolint:\"⨔\",npr:\"⊀\",nprcue:\"⋠\",npre:\"⪯̸\",nprec:\"⊀\",npreceq:\"⪯̸\",nrArr:\"⇏\",nrarr:\"↛\",nrarrc:\"⤳̸\",nrarrw:\"↝̸\",nRightarrow:\"⇏\",nrightarrow:\"↛\",nrtri:\"⋫\",nrtrie:\"⋭\",nsc:\"⊁\",nsccue:\"⋡\",nsce:\"⪰̸\",Nscr:\"𝒩\",nscr:\"𝓃\",nshortmid:\"∤\",nshortparallel:\"∦\",nsim:\"≁\",nsime:\"≄\",nsimeq:\"≄\",nsmid:\"∤\",nspar:\"∦\",nsqsube:\"⋢\",nsqsupe:\"⋣\",nsub:\"⊄\",nsubE:\"⫅̸\",nsube:\"⊈\",nsubset:\"⊂⃒\",nsubseteq:\"⊈\",nsubseteqq:\"⫅̸\",nsucc:\"⊁\",nsucceq:\"⪰̸\",nsup:\"⊅\",nsupE:\"⫆̸\",nsupe:\"⊉\",nsupset:\"⊃⃒\",nsupseteq:\"⊉\",nsupseteqq:\"⫆̸\",ntgl:\"≹\",Ntilde:\"Ñ\",ntilde:\"ñ\",ntlg:\"≸\",ntriangleleft:\"⋪\",ntrianglelefteq:\"⋬\",ntriangleright:\"⋫\",ntrianglerighteq:\"⋭\",Nu:\"Ν\",nu:\"ν\",num:\"#\",numero:\"№\",numsp:\" \",nvap:\"≍⃒\",nVDash:\"⊯\",nVdash:\"⊮\",nvDash:\"⊭\",nvdash:\"⊬\",nvge:\"≥⃒\",nvgt:\">⃒\",nvHarr:\"⤄\",nvinfin:\"⧞\",nvlArr:\"⤂\",nvle:\"≤⃒\",nvlt:\"<⃒\",nvltrie:\"⊴⃒\",nvrArr:\"⤃\",nvrtrie:\"⊵⃒\",nvsim:\"∼⃒\",nwarhk:\"⤣\",nwArr:\"⇖\",nwarr:\"↖\",nwarrow:\"↖\",nwnear:\"⤧\",Oacute:\"Ó\",oacute:\"ó\",oast:\"⊛\",ocir:\"⊚\",Ocirc:\"Ô\",ocirc:\"ô\",Ocy:\"О\",ocy:\"о\",odash:\"⊝\",Odblac:\"Ő\",odblac:\"ő\",odiv:\"⨸\",odot:\"⊙\",odsold:\"⦼\",OElig:\"Œ\",oelig:\"œ\",ofcir:\"⦿\",Ofr:\"𝔒\",ofr:\"𝔬\",ogon:\"˛\",Ograve:\"Ò\",ograve:\"ò\",ogt:\"⧁\",ohbar:\"⦵\",ohm:\"Ω\",oint:\"∮\",olarr:\"↺\",olcir:\"⦾\",olcross:\"⦻\",oline:\"‾\",olt:\"⧀\",Omacr:\"Ō\",omacr:\"ō\",Omega:\"Ω\",omega:\"ω\",Omicron:\"Ο\",omicron:\"ο\",omid:\"⦶\",ominus:\"⊖\",Oopf:\"𝕆\",oopf:\"𝕠\",opar:\"⦷\",OpenCurlyDoubleQuote:\"“\",OpenCurlyQuote:\"‘\",operp:\"⦹\",oplus:\"⊕\",Or:\"⩔\",or:\"∨\",orarr:\"↻\",ord:\"⩝\",order:\"ℴ\",orderof:\"ℴ\",ordf:\"ª\",ordm:\"º\",origof:\"⊶\",oror:\"⩖\",orslope:\"⩗\",orv:\"⩛\",oS:\"Ⓢ\",Oscr:\"𝒪\",oscr:\"ℴ\",Oslash:\"Ø\",oslash:\"ø\",osol:\"⊘\",Otilde:\"Õ\",otilde:\"õ\",Otimes:\"⨷\",otimes:\"⊗\",otimesas:\"⨶\",Ouml:\"Ö\",ouml:\"ö\",ovbar:\"⌽\",OverBar:\"‾\",OverBrace:\"⏞\",OverBracket:\"⎴\",OverParenthesis:\"⏜\",par:\"∥\",para:\"¶\",parallel:\"∥\",parsim:\"⫳\",parsl:\"⫽\",part:\"∂\",PartialD:\"∂\",Pcy:\"П\",pcy:\"п\",percnt:\"%\",period:\".\",permil:\"‰\",perp:\"⊥\",pertenk:\"‱\",Pfr:\"𝔓\",pfr:\"𝔭\",Phi:\"Φ\",phi:\"φ\",phiv:\"ϕ\",phmmat:\"ℳ\",phone:\"☎\",Pi:\"Π\",pi:\"π\",pitchfork:\"⋔\",piv:\"ϖ\",planck:\"ℏ\",planckh:\"ℎ\",plankv:\"ℏ\",plus:\"+\",plusacir:\"⨣\",plusb:\"⊞\",pluscir:\"⨢\",plusdo:\"∔\",plusdu:\"⨥\",pluse:\"⩲\",PlusMinus:\"±\",plusmn:\"±\",plussim:\"⨦\",plustwo:\"⨧\",pm:\"±\",Poincareplane:\"ℌ\",pointint:\"⨕\",Popf:\"ℙ\",popf:\"𝕡\",pound:\"£\",Pr:\"⪻\",pr:\"≺\",prap:\"⪷\",prcue:\"≼\",prE:\"⪳\",pre:\"⪯\",prec:\"≺\",precapprox:\"⪷\",preccurlyeq:\"≼\",Precedes:\"≺\",PrecedesEqual:\"⪯\",PrecedesSlantEqual:\"≼\",PrecedesTilde:\"≾\",preceq:\"⪯\",precnapprox:\"⪹\",precneqq:\"⪵\",precnsim:\"⋨\",precsim:\"≾\",Prime:\"″\",prime:\"′\",primes:\"ℙ\",prnap:\"⪹\",prnE:\"⪵\",prnsim:\"⋨\",prod:\"∏\",Product:\"∏\",profalar:\"⌮\",profline:\"⌒\",profsurf:\"⌓\",prop:\"∝\",Proportion:\"∷\",Proportional:\"∝\",propto:\"∝\",prsim:\"≾\",prurel:\"⊰\",Pscr:\"𝒫\",pscr:\"𝓅\",Psi:\"Ψ\",psi:\"ψ\",puncsp:\" \",Qfr:\"𝔔\",qfr:\"𝔮\",qint:\"⨌\",Qopf:\"ℚ\",qopf:\"𝕢\",qprime:\"⁗\",Qscr:\"𝒬\",qscr:\"𝓆\",quaternions:\"ℍ\",quatint:\"⨖\",quest:\"?\",questeq:\"≟\",QUOT:'\"',quot:'\"',rAarr:\"⇛\",race:\"∽̱\",Racute:\"Ŕ\",racute:\"ŕ\",radic:\"√\",raemptyv:\"⦳\",Rang:\"⟫\",rang:\"⟩\",rangd:\"⦒\",range:\"⦥\",rangle:\"⟩\",raquo:\"»\",Rarr:\"↠\",rArr:\"⇒\",rarr:\"→\",rarrap:\"⥵\",rarrb:\"⇥\",rarrbfs:\"⤠\",rarrc:\"⤳\",rarrfs:\"⤞\",rarrhk:\"↪\",rarrlp:\"↬\",rarrpl:\"⥅\",rarrsim:\"⥴\",Rarrtl:\"⤖\",rarrtl:\"↣\",rarrw:\"↝\",rAtail:\"⤜\",ratail:\"⤚\",ratio:\"∶\",rationals:\"ℚ\",RBarr:\"⤐\",rBarr:\"⤏\",rbarr:\"⤍\",rbbrk:\"❳\",rbrace:\"}\",rbrack:\"]\",rbrke:\"⦌\",rbrksld:\"⦎\",rbrkslu:\"⦐\",Rcaron:\"Ř\",rcaron:\"ř\",Rcedil:\"Ŗ\",rcedil:\"ŗ\",rceil:\"⌉\",rcub:\"}\",Rcy:\"Р\",rcy:\"р\",rdca:\"⤷\",rdldhar:\"⥩\",rdquo:\"”\",rdquor:\"”\",rdsh:\"↳\",Re:\"ℜ\",real:\"ℜ\",realine:\"ℛ\",realpart:\"ℜ\",reals:\"ℝ\",rect:\"▭\",REG:\"®\",reg:\"®\",ReverseElement:\"∋\",ReverseEquilibrium:\"⇋\",ReverseUpEquilibrium:\"⥯\",rfisht:\"⥽\",rfloor:\"⌋\",Rfr:\"ℜ\",rfr:\"𝔯\",rHar:\"⥤\",rhard:\"⇁\",rharu:\"⇀\",rharul:\"⥬\",Rho:\"Ρ\",rho:\"ρ\",rhov:\"ϱ\",RightAngleBracket:\"⟩\",RightArrow:\"→\",Rightarrow:\"⇒\",rightarrow:\"→\",RightArrowBar:\"⇥\",RightArrowLeftArrow:\"⇄\",rightarrowtail:\"↣\",RightCeiling:\"⌉\",RightDoubleBracket:\"⟧\",RightDownTeeVector:\"⥝\",RightDownVector:\"⇂\",RightDownVectorBar:\"⥕\",RightFloor:\"⌋\",rightharpoondown:\"⇁\",rightharpoonup:\"⇀\",rightleftarrows:\"⇄\",rightleftharpoons:\"⇌\",rightrightarrows:\"⇉\",rightsquigarrow:\"↝\",RightTee:\"⊢\",RightTeeArrow:\"↦\",RightTeeVector:\"⥛\",rightthreetimes:\"⋌\",RightTriangle:\"⊳\",RightTriangleBar:\"⧐\",RightTriangleEqual:\"⊵\",RightUpDownVector:\"⥏\",RightUpTeeVector:\"⥜\",RightUpVector:\"↾\",RightUpVectorBar:\"⥔\",RightVector:\"⇀\",RightVectorBar:\"⥓\",ring:\"˚\",risingdotseq:\"≓\",rlarr:\"⇄\",rlhar:\"⇌\",rlm:\"\",rmoust:\"⎱\",rmoustache:\"⎱\",rnmid:\"⫮\",roang:\"⟭\",roarr:\"⇾\",robrk:\"⟧\",ropar:\"⦆\",Ropf:\"ℝ\",ropf:\"𝕣\",roplus:\"⨮\",rotimes:\"⨵\",RoundImplies:\"⥰\",rpar:\")\",rpargt:\"⦔\",rppolint:\"⨒\",rrarr:\"⇉\",Rrightarrow:\"⇛\",rsaquo:\"›\",Rscr:\"ℛ\",rscr:\"𝓇\",Rsh:\"↱\",rsh:\"↱\",rsqb:\"]\",rsquo:\"’\",rsquor:\"’\",rthree:\"⋌\",rtimes:\"⋊\",rtri:\"▹\",rtrie:\"⊵\",rtrif:\"▸\",rtriltri:\"⧎\",RuleDelayed:\"⧴\",ruluhar:\"⥨\",rx:\"℞\",Sacute:\"Ś\",sacute:\"ś\",sbquo:\"‚\",Sc:\"⪼\",sc:\"≻\",scap:\"⪸\",Scaron:\"Š\",scaron:\"š\",sccue:\"≽\",scE:\"⪴\",sce:\"⪰\",Scedil:\"Ş\",scedil:\"ş\",Scirc:\"Ŝ\",scirc:\"ŝ\",scnap:\"⪺\",scnE:\"⪶\",scnsim:\"⋩\",scpolint:\"⨓\",scsim:\"≿\",Scy:\"С\",scy:\"с\",sdot:\"⋅\",sdotb:\"⊡\",sdote:\"⩦\",searhk:\"⤥\",seArr:\"⇘\",searr:\"↘\",searrow:\"↘\",sect:\"§\",semi:\";\",seswar:\"⤩\",setminus:\"∖\",setmn:\"∖\",sext:\"✶\",Sfr:\"𝔖\",sfr:\"𝔰\",sfrown:\"⌢\",sharp:\"♯\",SHCHcy:\"Щ\",shchcy:\"щ\",SHcy:\"Ш\",shcy:\"ш\",ShortDownArrow:\"↓\",ShortLeftArrow:\"←\",shortmid:\"∣\",shortparallel:\"∥\",ShortRightArrow:\"→\",ShortUpArrow:\"↑\",shy:\"\",Sigma:\"Σ\",sigma:\"σ\",sigmaf:\"ς\",sigmav:\"ς\",sim:\"∼\",simdot:\"⩪\",sime:\"≃\",simeq:\"≃\",simg:\"⪞\",simgE:\"⪠\",siml:\"⪝\",simlE:\"⪟\",simne:\"≆\",simplus:\"⨤\",simrarr:\"⥲\",slarr:\"←\",SmallCircle:\"∘\",smallsetminus:\"∖\",smashp:\"⨳\",smeparsl:\"⧤\",smid:\"∣\",smile:\"⌣\",smt:\"⪪\",smte:\"⪬\",smtes:\"⪬︀\",SOFTcy:\"Ь\",softcy:\"ь\",sol:\"/\",solb:\"⧄\",solbar:\"⌿\",Sopf:\"𝕊\",sopf:\"𝕤\",spades:\"♠\",spadesuit:\"♠\",spar:\"∥\",sqcap:\"⊓\",sqcaps:\"⊓︀\",sqcup:\"⊔\",sqcups:\"⊔︀\",Sqrt:\"√\",sqsub:\"⊏\",sqsube:\"⊑\",sqsubset:\"⊏\",sqsubseteq:\"⊑\",sqsup:\"⊐\",sqsupe:\"⊒\",sqsupset:\"⊐\",sqsupseteq:\"⊒\",squ:\"□\",Square:\"□\",square:\"□\",SquareIntersection:\"⊓\",SquareSubset:\"⊏\",SquareSubsetEqual:\"⊑\",SquareSuperset:\"⊐\",SquareSupersetEqual:\"⊒\",SquareUnion:\"⊔\",squarf:\"▪\",squf:\"▪\",srarr:\"→\",Sscr:\"𝒮\",sscr:\"𝓈\",ssetmn:\"∖\",ssmile:\"⌣\",sstarf:\"⋆\",Star:\"⋆\",star:\"☆\",starf:\"★\",straightepsilon:\"ϵ\",straightphi:\"ϕ\",strns:\"¯\",Sub:\"⋐\",sub:\"⊂\",subdot:\"⪽\",subE:\"⫅\",sube:\"⊆\",subedot:\"⫃\",submult:\"⫁\",subnE:\"⫋\",subne:\"⊊\",subplus:\"⪿\",subrarr:\"⥹\",Subset:\"⋐\",subset:\"⊂\",subseteq:\"⊆\",subseteqq:\"⫅\",SubsetEqual:\"⊆\",subsetneq:\"⊊\",subsetneqq:\"⫋\",subsim:\"⫇\",subsub:\"⫕\",subsup:\"⫓\",succ:\"≻\",succapprox:\"⪸\",succcurlyeq:\"≽\",Succeeds:\"≻\",SucceedsEqual:\"⪰\",SucceedsSlantEqual:\"≽\",SucceedsTilde:\"≿\",succeq:\"⪰\",succnapprox:\"⪺\",succneqq:\"⪶\",succnsim:\"⋩\",succsim:\"≿\",SuchThat:\"∋\",Sum:\"∑\",sum:\"∑\",sung:\"♪\",Sup:\"⋑\",sup:\"⊃\",sup1:\"¹\",sup2:\"²\",sup3:\"³\",supdot:\"⪾\",supdsub:\"⫘\",supE:\"⫆\",supe:\"⊇\",supedot:\"⫄\",Superset:\"⊃\",SupersetEqual:\"⊇\",suphsol:\"⟉\",suphsub:\"⫗\",suplarr:\"⥻\",supmult:\"⫂\",supnE:\"⫌\",supne:\"⊋\",supplus:\"⫀\",Supset:\"⋑\",supset:\"⊃\",supseteq:\"⊇\",supseteqq:\"⫆\",supsetneq:\"⊋\",supsetneqq:\"⫌\",supsim:\"⫈\",supsub:\"⫔\",supsup:\"⫖\",swarhk:\"⤦\",swArr:\"⇙\",swarr:\"↙\",swarrow:\"↙\",swnwar:\"⤪\",szlig:\"ß\",Tab:\"\\t\",target:\"⌖\",Tau:\"Τ\",tau:\"τ\",tbrk:\"⎴\",Tcaron:\"Ť\",tcaron:\"ť\",Tcedil:\"Ţ\",tcedil:\"ţ\",Tcy:\"Т\",tcy:\"т\",tdot:\"⃛\",telrec:\"⌕\",Tfr:\"𝔗\",tfr:\"𝔱\",there4:\"∴\",Therefore:\"∴\",therefore:\"∴\",Theta:\"Θ\",theta:\"θ\",thetasym:\"ϑ\",thetav:\"ϑ\",thickapprox:\"≈\",thicksim:\"∼\",ThickSpace:\" \",thinsp:\" \",ThinSpace:\" \",thkap:\"≈\",thksim:\"∼\",THORN:\"Þ\",thorn:\"þ\",Tilde:\"∼\",tilde:\"˜\",TildeEqual:\"≃\",TildeFullEqual:\"≅\",TildeTilde:\"≈\",times:\"×\",timesb:\"⊠\",timesbar:\"⨱\",timesd:\"⨰\",tint:\"∭\",toea:\"⤨\",top:\"⊤\",topbot:\"⌶\",topcir:\"⫱\",Topf:\"𝕋\",topf:\"𝕥\",topfork:\"⫚\",tosa:\"⤩\",tprime:\"‴\",TRADE:\"™\",trade:\"™\",triangle:\"▵\",triangledown:\"▿\",triangleleft:\"◃\",trianglelefteq:\"⊴\",triangleq:\"≜\",triangleright:\"▹\",trianglerighteq:\"⊵\",tridot:\"◬\",trie:\"≜\",triminus:\"⨺\",TripleDot:\"⃛\",triplus:\"⨹\",trisb:\"⧍\",tritime:\"⨻\",trpezium:\"⏢\",Tscr:\"𝒯\",tscr:\"𝓉\",TScy:\"Ц\",tscy:\"ц\",TSHcy:\"Ћ\",tshcy:\"ћ\",Tstrok:\"Ŧ\",tstrok:\"ŧ\",twixt:\"≬\",twoheadleftarrow:\"↞\",twoheadrightarrow:\"↠\",Uacute:\"Ú\",uacute:\"ú\",Uarr:\"↟\",uArr:\"⇑\",uarr:\"↑\",Uarrocir:\"⥉\",Ubrcy:\"Ў\",ubrcy:\"ў\",Ubreve:\"Ŭ\",ubreve:\"ŭ\",Ucirc:\"Û\",ucirc:\"û\",Ucy:\"У\",ucy:\"у\",udarr:\"⇅\",Udblac:\"Ű\",udblac:\"ű\",udhar:\"⥮\",ufisht:\"⥾\",Ufr:\"𝔘\",ufr:\"𝔲\",Ugrave:\"Ù\",ugrave:\"ù\",uHar:\"⥣\",uharl:\"↿\",uharr:\"↾\",uhblk:\"▀\",ulcorn:\"⌜\",ulcorner:\"⌜\",ulcrop:\"⌏\",ultri:\"◸\",Umacr:\"Ū\",umacr:\"ū\",uml:\"¨\",UnderBar:\"_\",UnderBrace:\"⏟\",UnderBracket:\"⎵\",UnderParenthesis:\"⏝\",Union:\"⋃\",UnionPlus:\"⊎\",Uogon:\"Ų\",uogon:\"ų\",Uopf:\"𝕌\",uopf:\"𝕦\",UpArrow:\"↑\",Uparrow:\"⇑\",uparrow:\"↑\",UpArrowBar:\"⤒\",UpArrowDownArrow:\"⇅\",UpDownArrow:\"↕\",Updownarrow:\"⇕\",updownarrow:\"↕\",UpEquilibrium:\"⥮\",upharpoonleft:\"↿\",upharpoonright:\"↾\",uplus:\"⊎\",UpperLeftArrow:\"↖\",UpperRightArrow:\"↗\",Upsi:\"ϒ\",upsi:\"υ\",upsih:\"ϒ\",Upsilon:\"Υ\",upsilon:\"υ\",UpTee:\"⊥\",UpTeeArrow:\"↥\",upuparrows:\"⇈\",urcorn:\"⌝\",urcorner:\"⌝\",urcrop:\"⌎\",Uring:\"Ů\",uring:\"ů\",urtri:\"◹\",Uscr:\"𝒰\",uscr:\"𝓊\",utdot:\"⋰\",Utilde:\"Ũ\",utilde:\"ũ\",utri:\"▵\",utrif:\"▴\",uuarr:\"⇈\",Uuml:\"Ü\",uuml:\"ü\",uwangle:\"⦧\",vangrt:\"⦜\",varepsilon:\"ϵ\",varkappa:\"ϰ\",varnothing:\"∅\",varphi:\"ϕ\",varpi:\"ϖ\",varpropto:\"∝\",vArr:\"⇕\",varr:\"↕\",varrho:\"ϱ\",varsigma:\"ς\",varsubsetneq:\"⊊︀\",varsubsetneqq:\"⫋︀\",varsupsetneq:\"⊋︀\",varsupsetneqq:\"⫌︀\",vartheta:\"ϑ\",vartriangleleft:\"⊲\",vartriangleright:\"⊳\",Vbar:\"⫫\",vBar:\"⫨\",vBarv:\"⫩\",Vcy:\"В\",vcy:\"в\",VDash:\"⊫\",Vdash:\"⊩\",vDash:\"⊨\",vdash:\"⊢\",Vdashl:\"⫦\",Vee:\"⋁\",vee:\"∨\",veebar:\"⊻\",veeeq:\"≚\",vellip:\"⋮\",Verbar:\"‖\",verbar:\"|\",Vert:\"‖\",vert:\"|\",VerticalBar:\"∣\",VerticalLine:\"|\",VerticalSeparator:\"❘\",VerticalTilde:\"≀\",VeryThinSpace:\" \",Vfr:\"𝔙\",vfr:\"𝔳\",vltri:\"⊲\",vnsub:\"⊂⃒\",vnsup:\"⊃⃒\",Vopf:\"𝕍\",vopf:\"𝕧\",vprop:\"∝\",vrtri:\"⊳\",Vscr:\"𝒱\",vscr:\"𝓋\",vsubnE:\"⫋︀\",vsubne:\"⊊︀\",vsupnE:\"⫌︀\",vsupne:\"⊋︀\",Vvdash:\"⊪\",vzigzag:\"⦚\",Wcirc:\"Ŵ\",wcirc:\"ŵ\",wedbar:\"⩟\",Wedge:\"⋀\",wedge:\"∧\",wedgeq:\"≙\",weierp:\"℘\",Wfr:\"𝔚\",wfr:\"𝔴\",Wopf:\"𝕎\",wopf:\"𝕨\",wp:\"℘\",wr:\"≀\",wreath:\"≀\",Wscr:\"𝒲\",wscr:\"𝓌\",xcap:\"⋂\",xcirc:\"◯\",xcup:\"⋃\",xdtri:\"▽\",Xfr:\"𝔛\",xfr:\"𝔵\",xhArr:\"⟺\",xharr:\"⟷\",Xi:\"Ξ\",xi:\"ξ\",xlArr:\"⟸\",xlarr:\"⟵\",xmap:\"⟼\",xnis:\"⋻\",xodot:\"⨀\",Xopf:\"𝕏\",xopf:\"𝕩\",xoplus:\"⨁\",xotime:\"⨂\",xrArr:\"⟹\",xrarr:\"⟶\",Xscr:\"𝒳\",xscr:\"𝓍\",xsqcup:\"⨆\",xuplus:\"⨄\",xutri:\"△\",xvee:\"⋁\",xwedge:\"⋀\",Yacute:\"Ý\",yacute:\"ý\",YAcy:\"Я\",yacy:\"я\",Ycirc:\"Ŷ\",ycirc:\"ŷ\",Ycy:\"Ы\",ycy:\"ы\",yen:\"¥\",Yfr:\"𝔜\",yfr:\"𝔶\",YIcy:\"Ї\",yicy:\"ї\",Yopf:\"𝕐\",yopf:\"𝕪\",Yscr:\"𝒴\",yscr:\"𝓎\",YUcy:\"Ю\",yucy:\"ю\",Yuml:\"Ÿ\",yuml:\"ÿ\",Zacute:\"Ź\",zacute:\"ź\",Zcaron:\"Ž\",zcaron:\"ž\",Zcy:\"З\",zcy:\"з\",Zdot:\"Ż\",zdot:\"ż\",zeetrf:\"ℨ\",ZeroWidthSpace:\"\",Zeta:\"Ζ\",zeta:\"ζ\",Zfr:\"ℨ\",zfr:\"𝔷\",ZHcy:\"Ж\",zhcy:\"ж\",zigrarr:\"⇝\",Zopf:\"ℤ\",zopf:\"𝕫\",Zscr:\"𝒵\",zscr:\"𝓏\",zwj:\"\",zwnj:\"\"}),t.entityMap=t.HTML_ENTITIES},8978:(e,t,r)=>{var a=r(4722);t.DOMImplementation=a.DOMImplementation,t.XMLSerializer=a.XMLSerializer,t.DOMParser=r(5752).DOMParser},4466:(e,t,r)=>{var a=r(4582).NAMESPACE,n=/[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/,o=new RegExp(\"[\\\\-\\\\.0-9\"+n.source.slice(1,-1)+\"\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]\"),i=new RegExp(\"^\"+n.source+o.source+\"*(?::\"+n.source+o.source+\"*)?$\");function s(e,t){this.message=e,this.locator=t,Error.captureStackTrace&&Error.captureStackTrace(this,s)}function l(){}function c(e,t){return t.lineNumber=e.lineNumber,t.columnNumber=e.columnNumber,t}function u(e,t,r,n,o,i){function s(e,t,a){r.attributeNames.hasOwnProperty(e)&&i.fatalError(\"Attribute \"+e+\" redefined\"),r.addValue(e,t.replace(/[\\t\\n\\r]/g,\" \").replace(/&#?\\w+;/g,o),a)}for(var l,c=++t,u=0;;){var h=e.charAt(c);switch(h){case\"=\":if(1===u)l=e.slice(t,c),u=3;else{if(2!==u)throw new Error(\"attribute equal must after attrName\");u=3}break;case\"'\":case'\"':if(3===u||1===u){if(1===u&&(i.warning('attribute value must after \"=\"'),l=e.slice(t,c)),t=c+1,!((c=e.indexOf(h,t))>0))throw new Error(\"attribute value no end '\"+h+\"' match\");s(l,d=e.slice(t,c),t-1),u=5}else{if(4!=u)throw new Error('attribute value must after \"=\"');s(l,d=e.slice(t,c),t),i.warning('attribute \"'+l+'\" missed start quot('+h+\")!!\"),t=c+1,u=5}break;case\"/\":switch(u){case 0:r.setTagName(e.slice(t,c));case 5:case 6:case 7:u=7,r.closed=!0;case 4:case 1:break;case 2:r.closed=!0;break;default:throw new Error(\"attribute invalid close char('/')\")}break;case\"\":return i.error(\"unexpected end of input\"),0==u&&r.setTagName(e.slice(t,c)),c;case\">\":switch(u){case 0:r.setTagName(e.slice(t,c));case 5:case 6:case 7:break;case 4:case 1:\"/\"===(d=e.slice(t,c)).slice(-1)&&(r.closed=!0,d=d.slice(0,-1));case 2:2===u&&(d=l),4==u?(i.warning('attribute \"'+d+'\" missed quot(\")!'),s(l,d,t)):(a.isHTML(n[\"\"])&&d.match(/^(?:disabled|checked|selected)$/i)||i.warning('attribute \"'+d+'\" missed value!! \"'+d+'\" instead!!'),s(d,d,t));break;case 3:throw new Error(\"attribute value missed!!\")}return c;case\"\":h=\" \";default:if(h<=\" \")switch(u){case 0:r.setTagName(e.slice(t,c)),u=6;break;case 1:l=e.slice(t,c),u=2;break;case 4:var d=e.slice(t,c);i.warning('attribute \"'+d+'\" missed quot(\")!!'),s(l,d,t);case 5:u=6}else switch(u){case 2:r.tagName,a.isHTML(n[\"\"])&&l.match(/^(?:disabled|checked|selected)$/i)||i.warning('attribute \"'+l+'\" missed value!! \"'+l+'\" instead2!!'),s(l,l,t),t=c,u=1;break;case 5:i.warning('attribute space is required\"'+l+'\"!!');case 6:u=1,t=c;break;case 3:u=4,t=c;break;case 7:throw new Error(\"elements closed character '/' and '>' must be connected to\")}}c++}}function h(e,t,r){for(var n=e.tagName,o=null,i=e.length;i--;){var s=e[i],l=s.qName,c=s.value;if((m=l.indexOf(\":\"))>0)var u=s.prefix=l.slice(0,m),h=l.slice(m+1),d=\"xmlns\"===u&&h;else h=l,u=null,d=\"xmlns\"===l&&\"\";s.localName=h,!1!==d&&(null==o&&(o={},p(r,r={})),r[d]=o[d]=c,s.uri=a.XMLNS,t.startPrefixMapping(d,c))}for(i=e.length;i--;)(u=(s=e[i]).prefix)&&(\"xml\"===u&&(s.uri=a.XML),\"xmlns\"!==u&&(s.uri=r[u||\"\"]));var m;(m=n.indexOf(\":\"))>0?(u=e.prefix=n.slice(0,m),h=e.localName=n.slice(m+1)):(u=null,h=e.localName=n);var f=e.uri=r[u||\"\"];if(t.startElement(f,h,n,e),!e.closed)return e.currentNSMap=r,e.localNSMap=o,!0;if(t.endElement(f,h,n),o)for(u in o)Object.prototype.hasOwnProperty.call(o,u)&&t.endPrefixMapping(u)}function d(e,t,r,a,n){if(/^(?:script|textarea)$/i.test(r)){var o=e.indexOf(\"</\"+r+\">\",t),i=e.substring(t+1,o);if(/[&<]/.test(i))return/^script$/i.test(r)?(n.characters(i,0,i.length),o):(i=i.replace(/&#?\\w+;/g,a),n.characters(i,0,i.length),o)}return t+1}function m(e,t,r,a){var n=a[r];return null==n&&((n=e.lastIndexOf(\"</\"+r+\">\"))<t&&(n=e.lastIndexOf(\"</\"+r)),a[r]=n),n<t}function p(e,t){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])}function f(e,t,r,a){if(\"-\"===e.charAt(t+2))return\"-\"===e.charAt(t+3)?(n=e.indexOf(\"--\\x3e\",t+4))>t?(r.comment(e,t+4,n-t-4),n+3):(a.error(\"Unclosed comment\"),-1):-1;if(\"CDATA[\"==e.substr(t+3,6)){var n=e.indexOf(\"]]>\",t+9);return r.startCDATA(),r.characters(e,t+9,n-t-9),r.endCDATA(),n+3}var o=function(e,t){var r,a=[],n=/'[^']+'|\"[^\"]+\"|[^\\s<>\\/=]+=?|(\\/?\\s*>|<)/g;for(n.lastIndex=t,n.exec(e);r=n.exec(e);)if(a.push(r),r[1])return a}(e,t),i=o.length;if(i>1&&/!doctype/i.test(o[0][0])){var s=o[1][0],l=!1,c=!1;i>3&&(/^public$/i.test(o[2][0])?(l=o[3][0],c=i>4&&o[4][0]):/^system$/i.test(o[2][0])&&(c=o[3][0]));var u=o[i-1];return r.startDTD(s,l,c),r.endDTD(),u.index+u[0].length}return-1}function x(e,t,r){var a=e.indexOf(\"?>\",t);if(a){var n=e.substring(t,a).match(/^<\\?(\\S*)\\s*([\\s\\S]*?)\\s*$/);return n?(n[0].length,r.processingInstruction(n[1],n[2]),a+2):-1}return-1}function g(){this.attributeNames={}}s.prototype=new Error,s.prototype.name=s.name,l.prototype={parse:function(e,t,r){var n=this.domBuilder;n.startDocument(),p(t,t={}),function(e,t,r,n,o){function i(e){var t=e.slice(1,-1);return Object.hasOwnProperty.call(r,t)?r[t]:\"#\"===t.charAt(0)?function(e){if(e>65535){var t=55296+((e-=65536)>>10),r=56320+(1023&e);return String.fromCharCode(t,r)}return String.fromCharCode(e)}(parseInt(t.substr(1).replace(\"x\",\"0x\"))):(o.error(\"entity not found:\"+e),e)}function l(t){if(t>_){var r=e.substring(_,t).replace(/&#?\\w+;/g,i);C&&p(_),n.characters(r,0,t-_),_=t}}function p(t,r){for(;t>=b&&(r=v.exec(e));)w=r.index,b=w+r[0].length,C.lineNumber++;C.columnNumber=t-w+1}for(var w=0,b=0,v=/.*(?:\\r\\n?|\\n)|.*$/g,C=n.locator,A=[{currentNSMap:t}],E={},_=0;;){try{var y=e.indexOf(\"<\",_);if(y<0){if(!e.substr(_).match(/^\\s*$/)){var q=n.doc,D=q.createTextNode(e.substr(_));q.appendChild(D),n.currentElement=D}return}switch(y>_&&l(y),e.charAt(y+1)){case\"/\":var M=e.indexOf(\">\",y+3),T=e.substring(y+2,M).replace(/[ \\t\\n\\r]+$/g,\"\"),N=A.pop();M<0?(T=e.substring(y+2).replace(/[\\s<].*/,\"\"),o.error(\"end tag name: \"+T+\" is not complete:\"+N.tagName),M=y+1+T.length):T.match(/\\s</)&&(T=T.replace(/[\\s<].*/,\"\"),o.error(\"end tag name: \"+T+\" maybe not complete\"),M=y+1+T.length);var O=N.localNSMap,L=N.tagName==T;if(L||N.tagName&&N.tagName.toLowerCase()==T.toLowerCase()){if(n.endElement(N.uri,N.localName,T),O)for(var B in O)Object.prototype.hasOwnProperty.call(O,B)&&n.endPrefixMapping(B);L||o.fatalError(\"end tag name: \"+T+\" is not match the current start tagName:\"+N.tagName)}else A.push(N);M++;break;case\"?\":C&&p(y),M=x(e,y,n);break;case\"!\":C&&p(y),M=f(e,y,n,o);break;default:C&&p(y);var S=new g,F=A[A.length-1].currentNSMap,P=(M=u(e,y,S,F,i,o),S.length);if(!S.closed&&m(e,M,S.tagName,E)&&(S.closed=!0,r.nbsp||o.warning(\"unclosed xml attribute\")),C&&P){for(var k=c(C,{}),R=0;R<P;R++){var I=S[R];p(I.offset),I.locator=c(C,{})}n.locator=k,h(S,n,F)&&A.push(S),n.locator=C}else h(S,n,F)&&A.push(S);a.isHTML(S.uri)&&!S.closed?M=d(e,M,S.tagName,i,n):M++}}catch(e){if(e instanceof s)throw e;o.error(\"element parse error: \"+e),M=-1}M>_?_=M:l(Math.max(y,_)+1)}}(e,t,r,n,this.errorHandler),n.endDocument()}},g.prototype={setTagName:function(e){if(!i.test(e))throw new Error(\"invalid tagName:\"+e);this.tagName=e},addValue:function(e,t,r){if(!i.test(e))throw new Error(\"invalid attribute:\"+e);this.attributeNames[e]=this.length,this[this.length++]={qName:e,value:t,offset:r}},length:0,getLocalName:function(e){return this[e].localName},getLocator:function(e){return this[e].locator},getQName:function(e){return this[e].qName},getURI:function(e){return this[e].uri},getValue:function(e){return this[e].value}},t.XMLReader=l,t.ParseError=s},8917:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.InvalidNumberOfChildrenError=void 0;var a=r(6200);Object.defineProperty(t,\"InvalidNumberOfChildrenError\",{enumerable:!0,get:function(){return a.InvalidNumberOfChildrenError}})},6200:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.InvalidNumberOfChildrenError=void 0;class r extends Error{constructor(e,t,r,a=\"exactly\"){super(`${e} tag must have ${a} ${t} children. It's actually ${r}`),this.name=\"InvalidNumberOfChildrenError\"}}t.InvalidNumberOfChildrenError=r},4279:function(e,t,r){\"use strict\";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!(\"get\"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,n)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)\"default\"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,\"__esModule\",{value:!0}),n(r(828),t),n(r(5975),t),n(r(799),t),n(r(2424),t)},5975:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.JoinWithManySeparators=void 0;class r{constructor(e){this._separators=e}static join(e,t){return new r(t)._join(e)}_join(e){return e.reduce(((e,t,r,a)=>e+t+(r===a.length-1?\"\":this._get(r))),\"\")}_get(e){return this._separators[e]?this._separators[e]:this._separators.length>0?this._separators[this._separators.length-1]:\",\"}}t.JoinWithManySeparators=r},799:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.mathMLElementToLaTeXConverter=void 0;const a=r(5443);t.mathMLElementToLaTeXConverter=e=>new a.MathMLElementToLatexConverterAdapter(e).toLatexConverter()},2424:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.normalizeWhiteSpaces=void 0,t.normalizeWhiteSpaces=e=>e.replace(/\\s+/g,\" \")},7192:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.BracketWrapper=void 0;const a=r(1855);t.BracketWrapper=class{constructor(){this._open=\"{\",this._close=\"}\"}wrap(e){return new a.Wrapper(this._open,this._close).wrap(e)}}},5025:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.GenericWrapper=void 0;const a=r(1855);t.GenericWrapper=class{constructor(e,t){this._open=\"\\\\left\"+e,this._close=\"\\\\right\"+t}wrap(e){return new a.Wrapper(this._open,this._close).wrap(e)}}},828:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.GenericWrapper=t.ParenthesisWrapper=t.BracketWrapper=void 0;var a=r(7192);Object.defineProperty(t,\"BracketWrapper\",{enumerable:!0,get:function(){return a.BracketWrapper}});var n=r(1168);Object.defineProperty(t,\"ParenthesisWrapper\",{enumerable:!0,get:function(){return n.ParenthesisWrapper}});var o=r(5025);Object.defineProperty(t,\"GenericWrapper\",{enumerable:!0,get:function(){return o.GenericWrapper}})},1168:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.ParenthesisWrapper=void 0;const a=r(1855);t.ParenthesisWrapper=class{constructor(){this._open=\"\\\\left(\",this._close=\"\\\\right)\"}wrap(e){return new a.Wrapper(this._open,this._close).wrap(e)}wrapIfMoreThanOneChar(e){return e.length<=1?e:this.wrap(e)}}},1855:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.Wrapper=void 0,t.Wrapper=class{constructor(e,t){this._open=e,this._close=t}wrap(e){return this._open+e+this._close}}},2697:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.VoidMathMLElement=void 0,t.VoidMathMLElement=class{constructor(){this.name=\"void\",this.value=\"\",this.children=[],this.attributes={}}}},4760:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.GenericSpacingWrapper=void 0;const a=r(4279);t.GenericSpacingWrapper=class{constructor(e){this._mathmlElement=e}convert(){return this._mathmlElement.children.map((e=>(0,a.mathMLElementToLaTeXConverter)(e))).map((e=>e.convert())).join(\" \")}}},9376:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.GenericUnderOver=void 0;const a=r(799),n=r(8917),o=r(472);t.GenericUnderOver=class{constructor(e){this._mathmlElement=e}convert(){const{name:e,children:t}=this._mathmlElement,r=t.length;if(2!==r)throw new n.InvalidNumberOfChildrenError(e,2,r);const o=(0,a.mathMLElementToLaTeXConverter)(t[0]).convert(),i=(0,a.mathMLElementToLaTeXConverter)(t[1]).convert();return this._applyCommand(o,i)}_applyCommand(e,t){const r=this._mathmlElement.name.match(/under/)?s.Under:s.Over;return new i(r).apply(e,t)}};class i{constructor(e){this._type=e}apply(e,t){return o.latexAccents.includes(t)?`${t}{${e}}`:`${this._defaultCommand}{${t}}{${e}}`}get _defaultCommand(){return this._type===s.Under?\"\\\\underset\":\"\\\\overset\"}}var s;!function(e){e[e.Under=0]=\"Under\",e[e.Over=1]=\"Over\"}(s||(s={}))},6959:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.Void=t.GenericUnderOver=t.GenericSpacingWrapper=t.MTr=t.MTable=t.MUnderover=t.MText=t.MMultiscripts=t.MSubsup=t.MSub=t.MSup=t.MPhantom=t.MError=t.MEnclose=t.MAction=t.MRoot=t.MFrac=t.MFenced=t.MSqrt=t.MN=t.MO=t.MI=t.Math=void 0;var a=r(393);Object.defineProperty(t,\"Math\",{enumerable:!0,get:function(){return a.Math}});var n=r(7037);Object.defineProperty(t,\"MI\",{enumerable:!0,get:function(){return n.MI}});var o=r(3487);Object.defineProperty(t,\"MO\",{enumerable:!0,get:function(){return o.MO}});var i=r(4464);Object.defineProperty(t,\"MN\",{enumerable:!0,get:function(){return i.MN}});var s=r(8686);Object.defineProperty(t,\"MSqrt\",{enumerable:!0,get:function(){return s.MSqrt}});var l=r(9511);Object.defineProperty(t,\"MFenced\",{enumerable:!0,get:function(){return l.MFenced}});var c=r(6440);Object.defineProperty(t,\"MFrac\",{enumerable:!0,get:function(){return c.MFrac}});var u=r(6052);Object.defineProperty(t,\"MRoot\",{enumerable:!0,get:function(){return u.MRoot}});var h=r(1678);Object.defineProperty(t,\"MAction\",{enumerable:!0,get:function(){return h.MAction}});var d=r(2631);Object.defineProperty(t,\"MEnclose\",{enumerable:!0,get:function(){return d.MEnclose}});var m=r(1840);Object.defineProperty(t,\"MError\",{enumerable:!0,get:function(){return m.MError}});var p=r(7443);Object.defineProperty(t,\"MPhantom\",{enumerable:!0,get:function(){return p.MPhantom}});var f=r(6926);Object.defineProperty(t,\"MSup\",{enumerable:!0,get:function(){return f.MSup}});var x=r(2564);Object.defineProperty(t,\"MSub\",{enumerable:!0,get:function(){return x.MSub}});var g=r(1358);Object.defineProperty(t,\"MSubsup\",{enumerable:!0,get:function(){return g.MSubsup}});var w=r(8303);Object.defineProperty(t,\"MMultiscripts\",{enumerable:!0,get:function(){return w.MMultiscripts}});var b=r(3951);Object.defineProperty(t,\"MText\",{enumerable:!0,get:function(){return b.MText}});var v=r(1222);Object.defineProperty(t,\"MUnderover\",{enumerable:!0,get:function(){return v.MUnderover}});var C=r(2350);Object.defineProperty(t,\"MTable\",{enumerable:!0,get:function(){return C.MTable}});var A=r(1586);Object.defineProperty(t,\"MTr\",{enumerable:!0,get:function(){return A.MTr}});var E=r(4760);Object.defineProperty(t,\"GenericSpacingWrapper\",{enumerable:!0,get:function(){return E.GenericSpacingWrapper}});var _=r(9376);Object.defineProperty(t,\"GenericUnderOver\",{enumerable:!0,get:function(){return _.GenericUnderOver}});var y=r(9165);Object.defineProperty(t,\"Void\",{enumerable:!0,get:function(){return y.Void}})},1678:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MAction=void 0;const a=r(799);t.MAction=class{constructor(e){this._mathmlElement=e}convert(){const{children:e}=this._mathmlElement;return this._isToggle()?e.map((e=>(0,a.mathMLElementToLaTeXConverter)(e))).map((e=>e.convert())).join(\" \\\\Longrightarrow \"):(0,a.mathMLElementToLaTeXConverter)(e[0]).convert()}_isToggle(){const{actiontype:e}=this._mathmlElement.attributes;return\"toggle\"===e||!e}}},393:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.Math=void 0;const a=r(799),n=r(2424);t.Math=class{constructor(e){this._mathmlElement=e}convert(){const e=this._mathmlElement.children.map((e=>(0,a.mathMLElementToLaTeXConverter)(e))).map((e=>e.convert())).join(\" \");return(0,n.normalizeWhiteSpaces)(e)}}},2631:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MEnclose=void 0;const a=r(799);t.MEnclose=class{constructor(e){this._mathmlElement=e}convert(){const e=this._mathmlElement.children.map((e=>(0,a.mathMLElementToLaTeXConverter)(e))).map((e=>e.convert())).join(\" \");return\"actuarial\"===this._notation?`\\\\overline{\\\\left.${e}\\\\right|}`:\"radical\"===this._notation?`\\\\sqrt{${e}}`:[\"box\",\"roundedbox\",\"circle\"].includes(this._notation)?`\\\\boxed{${e}}`:\"left\"===this._notation?`\\\\left|${e}`:\"right\"===this._notation?`${e}\\\\right|`:\"top\"===this._notation?`\\\\overline{${e}}`:\"bottom\"===this._notation?`\\\\underline{${e}}`:\"updiagonalstrike\"===this._notation?`\\\\cancel{${e}}`:\"downdiagonalstrike\"===this._notation?`\\\\bcancel{${e}}`:\"updiagonalarrow\"===this._notation?`\\\\cancelto{}{${e}}`:[\"verticalstrike\",\"horizontalstrike\"].includes(this._notation)?`\\\\hcancel{${e}}`:\"madruwb\"===this._notation?`\\\\underline{${e}\\\\right|}`:\"phasorangle\"===this._notation?`{\\\\angle \\\\underline{${e}}}`:`\\\\overline{\\\\left.\\\\right)${e}}`}get _notation(){return this._mathmlElement.attributes.notation||\"longdiv\"}}},1840:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MError=void 0;const a=r(799);t.MError=class{constructor(e){this._mathmlElement=e}convert(){return`\\\\color{red}{${this._mathmlElement.children.map((e=>(0,a.mathMLElementToLaTeXConverter)(e))).map((e=>e.convert())).join(\" \")}}`}}},9511:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MFenced=void 0;const a=r(799),n=r(4279);t.MFenced=class{constructor(e){this._mathmlElement=e,this._open=this._mathmlElement.attributes.open||\"\",this._close=this._mathmlElement.attributes.close||\"\",this._separators=Array.from(this._mathmlElement.attributes.separators||\"\")}convert(){const e=this._mathmlElement.children.map((e=>(0,a.mathMLElementToLaTeXConverter)(e))).map((e=>e.convert()));return this._isThereRelativeOfName(this._mathmlElement.children,\"mtable\")?new i(this._open,this._close).apply(e):new o(this._open,this._close,this._separators).apply(e)}_isThereRelativeOfName(e,t){return e.some((e=>e.name===t||this._isThereRelativeOfName(e.children,t)))}};class o{constructor(e,t,r){this._open=e||\"(\",this._close=t||\")\",this._separators=r}apply(e){const t=n.JoinWithManySeparators.join(e,this._separators);return new n.GenericWrapper(this._open,this._close).wrap(t)}}class i{constructor(e,t){this._genericCommand=\"matrix\",this._separators=new s(e,t)}apply(e){const t=this._command,r=`\\\\begin{${t}}\\n${e.join(\"\")}\\n\\\\end{${t}}`;return t===this._genericCommand?this._separators.wrap(r):r}get _command(){return this._separators.areParentheses()?\"pmatrix\":this._separators.areSquareBrackets()?\"bmatrix\":this._separators.areBrackets()?\"Bmatrix\":this._separators.areDivides()?\"vmatrix\":this._separators.areParallels()?\"Vmatrix\":this._separators.areNotEqual()?this._genericCommand:\"bmatrix\"}}class s{constructor(e,t){this._open=e,this._close=t}wrap(e){return new n.GenericWrapper(this._open,this._close).wrap(e)}areParentheses(){return this._compare(\"(\",\")\")}areSquareBrackets(){return this._compare(\"[\",\"]\")}areBrackets(){return this._compare(\"{\",\"}\")}areDivides(){return this._compare(\"|\",\"|\")}areParallels(){return this._compare(\"||\",\"||\")}areNotEqual(){return this._open!==this._close}_compare(e,t){return this._open===e&&this._close===t}}},6440:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MFrac=void 0;const a=r(8917),n=r(4279);t.MFrac=class{constructor(e){this._mathmlElement=e}convert(){const{children:e,name:t}=this._mathmlElement,r=e.length;if(2!==r)throw new a.InvalidNumberOfChildrenError(t,2,r);const o=(0,n.mathMLElementToLaTeXConverter)(e[0]).convert(),i=(0,n.mathMLElementToLaTeXConverter)(e[1]).convert();return this._isBevelled()?`${this._wrapIfMoreThanOneChar(o)}/${this._wrapIfMoreThanOneChar(i)}`:`\\\\frac{${o}}{${i}}`}_wrapIfMoreThanOneChar(e){return(new n.ParenthesisWrapper).wrapIfMoreThanOneChar(e)}_isBevelled(){return!!this._mathmlElement.attributes.bevelled}}},7037:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MI=void 0;const a=r(4279),n=r(5406),o=r(6122);t.MI=class{constructor(e){this.utf8Converter=new o.HashUTF8ToLtXConverter,this._mathmlElement=e}convert(){const e=(0,a.normalizeWhiteSpaces)(this._mathmlElement.value);if(\" \"===e)return i.apply(e);const t=e.trim(),r=i.apply(t),n=this.utf8Converter.convert(r);return n!==r?n:this.wrapInMathVariant(r,this.getMathVariant(this._mathmlElement.attributes))}getMathVariant(e){if(e&&e.mathvariant)return e.mathvariant}wrapInMathVariant(e,t){switch(t){case\"bold\":return`\\\\mathbf{${e}}`;case\"italic\":return`\\\\mathit{${e}}`;case\"bold-italic\":return`\\\\mathbf{\\\\mathit{${e}}}`;case\"double-struck\":return`\\\\mathbb{${e}}`;case\"bold-fraktur\":return`\\\\mathbf{\\\\mathfrak{${e}}}`;case\"script\":return`\\\\mathcal{${e}}`;case\"bold-script\":return`\\\\mathbf{\\\\mathcal{${e}}}`;case\"fraktur\":return`\\\\mathfrak{${e}}`;case\"sans-serif\":return`\\\\mathsf{${e}}`;case\"bold-sans-serif\":return`\\\\mathbf{\\\\mathsf{${e}}}`;case\"sans-serif-italic\":return`\\\\mathsf{\\\\mathit{${e}}}`;case\"sans-serif-bold-italic\":return`\\\\mathbf{\\\\mathsf{\\\\mathit{${e}}}}`;case\"monospace\":return`\\\\mathtt{${e}}`;default:return e}}};class i{constructor(e){this._value=e}static apply(e){return new i(e)._apply()}_apply(){return this._findByCharacter()||this._findByGlyph()||this._findByNumber()||(new o.HashUTF8ToLtXConverter).convert(this._value)}_findByCharacter(){return n.allMathSymbolsByChar[this._value]}_findByGlyph(){return n.allMathSymbolsByGlyph[this._value]}_findByNumber(){return n.mathNumberByGlyph[this._value]}}},8303:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MMultiscripts=void 0;const a=r(4279),n=r(8917);t.MMultiscripts=class{constructor(e){this._mathmlElement=e}convert(){const{name:e,children:t}=this._mathmlElement,r=t.length;if(r<3)throw new n.InvalidNumberOfChildrenError(e,3,r,\"at least\");const o=(0,a.mathMLElementToLaTeXConverter)(t[0]).convert();return this._prescriptLatex()+this._wrapInParenthesisIfThereIsSpace(o)+this._postscriptLatex()}_prescriptLatex(){const{children:e}=this._mathmlElement;let t,r;if(this._isPrescripts(e[1]))t=e[2],r=e[3];else{if(!this._isPrescripts(e[3]))return\"\";t=e[4],r=e[5]}return`\\\\_{${(0,a.mathMLElementToLaTeXConverter)(t).convert()}}^{${(0,a.mathMLElementToLaTeXConverter)(r).convert()}}`}_postscriptLatex(){const{children:e}=this._mathmlElement;if(this._isPrescripts(e[1]))return\"\";const t=e[1],r=e[2];return`_{${(0,a.mathMLElementToLaTeXConverter)(t).convert()}}^{${(0,a.mathMLElementToLaTeXConverter)(r).convert()}}`}_wrapInParenthesisIfThereIsSpace(e){return e.match(/\\s+/g)?(new a.ParenthesisWrapper).wrap(e):e}_isPrescripts(e){return\"mprescripts\"===(null==e?void 0:e.name)}}},4464:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MN=void 0;const a=r(4279),n=r(5406);t.MN=class{constructor(e){this._mathmlElement=e}convert(){const e=(0,a.normalizeWhiteSpaces)(this._mathmlElement.value).trim();return n.mathNumberByGlyph[e]||e}}},3487:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MO=void 0;const a=r(4279),n=r(5406);t.MO=class{constructor(e){this._mathmlElement=e}convert(){const e=(0,a.normalizeWhiteSpaces)(this._mathmlElement.value).trim();return o.operate(e)}};class o{constructor(e){this._value=e}static operate(e){return new o(e)._operate()}_operate(){return this._findByCharacter()||this._findByGlyph()||this._findByNumber()||(new n.HashUTF8ToLtXConverter).convert(this._value)}_findByCharacter(){return n.allMathOperatorsByChar[this._value]}_findByGlyph(){return n.allMathOperatorsByGlyph[this._value]}_findByNumber(){return n.mathNumberByGlyph[this._value]}}},7443:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MPhantom=void 0,t.MPhantom=class{constructor(e){this._mathmlElement=e}convert(){return\"\"}}},6052:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MRoot=void 0;const a=r(4279),n=r(8917);t.MRoot=class{constructor(e){this._mathmlElement=e}convert(){const{name:e,children:t}=this._mathmlElement,r=t.length;if(2!==r)throw new n.InvalidNumberOfChildrenError(e,2,r);const o=(0,a.mathMLElementToLaTeXConverter)(t[0]).convert();return`\\\\sqrt[${(0,a.mathMLElementToLaTeXConverter)(t[1]).convert()}]{${o}}`}}},8686:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MSqrt=void 0;const a=r(4279);t.MSqrt=class{constructor(e){this._mathmlElement=e}convert(){return`\\\\sqrt{${this._mathmlElement.children.map((e=>(0,a.mathMLElementToLaTeXConverter)(e))).map((e=>e.convert())).join(\" \")}}`}}},2564:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MSub=void 0;const a=r(4279),n=r(8917);t.MSub=class{constructor(e){this._mathmlElement=e}convert(){const{name:e,children:t}=this._mathmlElement,r=t.length;if(2!==r)throw new n.InvalidNumberOfChildrenError(e,2,r);const a=t[0],o=t[1];return`${this._handleBaseChild(a)}_${this._handleSubscriptChild(o)}`}_handleBaseChild(e){const t=e.children,r=(0,a.mathMLElementToLaTeXConverter)(e).convert();return t.length<=1?r:(new a.ParenthesisWrapper).wrapIfMoreThanOneChar(r)}_handleSubscriptChild(e){const t=(0,a.mathMLElementToLaTeXConverter)(e).convert();return(new a.BracketWrapper).wrap(t)}}},1358:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MSubsup=void 0;const a=r(4279),n=r(8917);t.MSubsup=class{constructor(e){this._mathmlElement=e}convert(){const{name:e,children:t}=this._mathmlElement,r=t.length;if(3!==r)throw new n.InvalidNumberOfChildrenError(e,3,r);const a=t[0],o=t[1],i=t[2];return`${this._handleBaseChild(a)}_${this._handleSubscriptChild(o)}^${this._handleSuperscriptChild(i)}`}_handleBaseChild(e){const t=e.children,r=(0,a.mathMLElementToLaTeXConverter)(e).convert();return t.length<=1?r:(new a.ParenthesisWrapper).wrapIfMoreThanOneChar(r)}_handleSubscriptChild(e){const t=(0,a.mathMLElementToLaTeXConverter)(e).convert();return(new a.BracketWrapper).wrap(t)}_handleSuperscriptChild(e){const t=(0,a.mathMLElementToLaTeXConverter)(e).convert();return(new a.BracketWrapper).wrap(t)}}},6926:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MSup=void 0;const a=r(4279),n=r(8917);t.MSup=class{constructor(e){this._mathmlElement=e}convert(){const{name:e,children:t}=this._mathmlElement,r=t.length;if(2!==r)throw new n.InvalidNumberOfChildrenError(e,2,r);const a=t[0],o=t[1];return`${this._handleBaseChild(a)}^${this._handleExponentChild(o)}`}_handleBaseChild(e){const t=e.children,r=(0,a.mathMLElementToLaTeXConverter)(e).convert();return t.length<=1?r:(new a.ParenthesisWrapper).wrapIfMoreThanOneChar(r)}_handleExponentChild(e){const t=(0,a.mathMLElementToLaTeXConverter)(e).convert();return(new a.BracketWrapper).wrap(t)}}},2350:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MTable=void 0;const a=r(4279);t.MTable=class{constructor(e){this._mathmlElement=e,this._addFlagRecursiveIfName(this._mathmlElement.children,\"mtable\",\"innerTable\")}convert(){const e=this._mathmlElement.children.map((e=>(0,a.mathMLElementToLaTeXConverter)(e))).map((e=>e.convert())).join(\" \\\\\\\\\\n\");return this._hasFlag(\"innerTable\")?this._wrap(e):e}_wrap(e){return`\\\\begin{matrix}${e}\\\\end{matrix}`}_addFlagRecursiveIfName(e,t,r){e.forEach((e=>{e.name===t&&(e.attributes[r]=r),this._addFlagRecursiveIfName(e.children,t,r)}))}_hasFlag(e){return!!this._mathmlElement.attributes[e]}}},3951:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MText=void 0;const a=r(7037);t.MText=class{constructor(e){this._mathmlElement=e}convert(){const{attributes:e,value:t}=this._mathmlElement;return[...t].map((e=>/^[a-zA-Z0-9]$/.test(e)||\" \"===e?{value:e,isAlphanumeric:!0}:{value:e,isAlphanumeric:!1})).reduce(((e,t)=>{if(t.isAlphanumeric){const r=e[e.length-1];if(r&&r.isAlphanumeric)return r.value+=t.value,e}return[...e,t]}),[]).map((t=>t.isAlphanumeric?new n(e.mathvariant).apply(t.value):new a.MI({name:\"mi\",attributes:{},children:[],value:t.value}).convert())).join(\"\")}};class n{constructor(e){this._mathvariant=e||\"normal\"}apply(e){return this._commands.reduce(((t,r,a)=>0===a?`${r}{${e}}`:`${r}{${t}}`),\"\")}get _commands(){switch(this._mathvariant){case\"bold\":return[\"\\\\textbf\"];case\"italic\":return[\"\\\\textit\"];case\"bold-italic\":return[\"\\\\textit\",\"\\\\textbf\"];case\"double-struck\":return[\"\\\\mathbb\"];case\"monospace\":return[\"\\\\mathtt\"];case\"bold-fraktur\":case\"fraktur\":return[\"\\\\mathfrak\"];default:return[\"\\\\text\"]}}}},1586:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MTr=void 0;const a=r(4279);t.MTr=class{constructor(e){this._mathmlElement=e}convert(){return this._mathmlElement.children.map((e=>(0,a.mathMLElementToLaTeXConverter)(e))).map((e=>e.convert())).join(\" & \")}}},1222:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MUnderover=void 0;const a=r(4279),n=r(8917);t.MUnderover=class{constructor(e){this._mathmlElement=e}convert(){const{name:e,children:t}=this._mathmlElement,r=t.length;if(3!==r)throw new n.InvalidNumberOfChildrenError(e,3,r);return`${(0,a.mathMLElementToLaTeXConverter)(t[0]).convert()}_{${(0,a.mathMLElementToLaTeXConverter)(t[1]).convert()}}^{${(0,a.mathMLElementToLaTeXConverter)(t[2]).convert()}}`}}},9165:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.Void=void 0,t.Void=class{constructor(e){this._mathmlElement=e}convert(){return\"\"}}},5443:function(e,t,r){\"use strict\";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!(\"get\"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,n)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,\"default\",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)\"default\"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&a(t,e,r);return n(t,e),t};Object.defineProperty(t,\"__esModule\",{value:!0}),t.MathMLElementToLatexConverterAdapter=void 0;const i=o(r(6959)),s=r(2697);t.MathMLElementToLatexConverterAdapter=class{constructor(e){this._mathMLElement=null!=e?e:new s.VoidMathMLElement}toLatexConverter(){const{name:e}=this._mathMLElement;return new(l[e]||i.GenericSpacingWrapper)(this._mathMLElement)}};const l={math:i.Math,mi:i.MI,mo:i.MO,mn:i.MN,msqrt:i.MSqrt,mfenced:i.MFenced,mfrac:i.MFrac,mroot:i.MRoot,maction:i.MAction,menclose:i.MEnclose,merror:i.MError,mphantom:i.MPhantom,msup:i.MSup,msub:i.MSub,msubsup:i.MSubsup,mmultiscripts:i.MMultiscripts,mtext:i.MText,munderover:i.MUnderover,mtable:i.MTable,mtr:i.MTr,mover:i.GenericUnderOver,munder:i.GenericUnderOver,mrow:i.GenericSpacingWrapper,mpadded:i.GenericSpacingWrapper,void:i.Void}},5243:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.ErrorHandler=void 0,t.ErrorHandler=class{constructor(){this._errors=[],this.errorLocator={}}fixError(e,t){return this._isMissingAttributeValueError(t)?(this._errors.push(t),this._fixMissingAttribute(t,e)):e}isThereAnyErrors(){return this._errors.length>0}cleanErrors(){this._errors=[]}_fixMissingAttribute(e,t){const r=e.split('\"')[1];if(r)return t.replace(this._matchMissingValueForAttribute(r),\"\");for(;this._mathGenericMissingValue().exec(t);)t=t.replace(this._mathGenericMissingValue(),\"$1$3\");return t}_matchMissingValueForAttribute(e){return new RegExp(`(${e}=(?!(\"|')))|(${e}(?!(\"|')))`,\"gm\")}_mathGenericMissingValue(){return/(\\<.* )(\\w+=(?!\\\"|\\'))(.*\\>)/gm}_isMissingAttributeValueError(e){return!!e.includes(\"attribute\")&&!!e.includes(\"missed\")||e.includes(\"attribute value missed\")}}},9208:function(e,t,r){\"use strict\";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!(\"get\"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,n)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)\"default\"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,\"__esModule\",{value:!0}),n(r(9548),t),n(r(5243),t),n(r(1101),t)},1101:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.ElementsToMathMLAdapter=void 0,t.ElementsToMathMLAdapter=class{convert(e){return e.filter((e=>void 0!==e.tagName)).map((e=>this._convertElement(e)))}_convertElement(e){return{name:e.tagName,attributes:this._convertElementAttributes(e.attributes),value:this._hasElementChild(e)?\"\":e.textContent||\"\",children:this._hasElementChild(e)?this.convert(Array.from(e.childNodes)):[]}}_convertElementAttributes(e){return Array.from(e).reduce(((e,t)=>Object.assign({[t.nodeName]:t.nodeValue===t.nodeName?\"\":t.nodeValue},e)),{})}_hasElementChild(e){const t=e.childNodes;return!!t&&0!==t.length&&this._isThereAnyNoTextNode(t)}_isThereAnyNoTextNode(e){return Array.from(e).some((e=>\"#text\"!==e.nodeName))}}},9548:function(e,t,r){\"use strict\";var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.XmlToMathMLAdapter=void 0;const n=a(r(8978));t.XmlToMathMLAdapter=class{constructor(e,t){this._xml=\"\",this._elementsConvertor=e,this._errorHandler=t,this._xmlDOM=new n.default.DOMParser({locator:this._errorHandler.errorLocator,errorHandler:this._fixError.bind(this)})}convert(e){return this._xml=this._removeLineBreaks(e),this._xml=this._removeMsWordPrefixes(this._xml),this._elementsConvertor.convert(this._mathMLElements)}_fixError(e){this._xml=this._errorHandler.fixError(this._xml,e)}_removeLineBreaks(e){return e.replace(/\\n|\\r\\n|\\r/g,\"\")}_removeMsWordPrefixes(e){return e.replace(/mml:/g,\"\")}get _mathMLElements(){let e=this._xmlDOM.parseFromString(this._xml).getElementsByTagName(\"math\");return this._errorHandler.isThereAnyErrors()&&(this._errorHandler.cleanErrors(),e=this._xmlDOM.parseFromString(this._xml).getElementsByTagName(\"math\")),Array.from(e)}}},7941:function(e,t,r){\"use strict\";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!(\"get\"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,n)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)\"default\"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,\"__esModule\",{value:!0}),n(r(8585),t)},8585:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.makeToMathElementsConverter=void 0;const a=r(9208);t.makeToMathElementsConverter=()=>{const e=new a.ElementsToMathMLAdapter,t=new a.ErrorHandler;return new a.XmlToMathMLAdapter(e,t)}},8672:function(e,t,r){\"use strict\";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!(\"get\"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,n)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)\"default\"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,\"__esModule\",{value:!0}),n(r(3798),t)},3798:(e,t,r)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MathMLToLaTeX=void 0;const a=r(5443),n=r(7941);t.MathMLToLaTeX=class{static convert(e){return(0,n.makeToMathElementsConverter)().convert(e).map((e=>new a.MathMLElementToLatexConverterAdapter(e).toLatexConverter())).map((e=>e.convert())).join(\"\").trim()}}},2965:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.allMathOperatorsByChar=void 0,t.allMathOperatorsByChar={_:\"\\\\underline\",\"⏡\":\"\\\\underbrace\",\"⏠\":\"\\\\overbrace\",\"⏟\":\"\\\\underbrace\",\"⏞\":\"\\\\overbrace\",\"⏝\":\"\\\\underbrace\",\"⏜\":\"\\\\overbrace\",\"⎵\":\"\\\\underbrace\",\"⎴\":\"\\\\overbrace\",\"⃜\":\"\\\\square\",\"⃛\":\"\\\\square\",\"⁤\":\"\",\"⁗\":\"''''\",\"‾\":\"\\\\bar\",\"‷\":\"```\",\"‶\":\"``\",\"‵\":\"`\",\"‴\":\"'''\",\"″\":\"''\",\"‟\":\"``\",\"„\":\",,\",\"‛\":\"`\",\"‚\":\",\",\"̂\":\"\\\\hat\",\"˷\":\"\\\\sim\",\"˝\":\"\\\\sim\",\"˜\":\"\\\\sim\",\"˚\":\"\\\\circ\",\"˙\":\"\\\\cdot\",\"˘\":\"\",\"ˍ\":\"\\\\_\",\"ˋ\":\"ˋ\",\"ˊ\":\"ˊ\",\"ˉ\":\"ˉ\",\"ˇ\":\"\",\"ˆ\":\"\\\\hat\",\"º\":\"o\",\"¹\":\"1\",\"¸\":\"¸\",\"´\":\"´\",\"³\":\"3\",\"²\":\"2\",\"°\":\"\\\\circ\",\"¯\":\"\\\\bar\",\"ª\":\"a\",\"¨\":\"\\\\cdot\\\\cdot\",\"~\":\"\\\\sim\",\"`\":\"`\",\"^\":\"\\\\hat\",\"--\":\"--\",\"++\":\"++\",\"&\":\"\\\\&\",\"⁡\":\"\",\"∜\":\"\\\\sqrt[4]{}\",\"∛\":\"\\\\sqrt[3]{}\",\"√\":\"\\\\sqrt{}\",\"ⅆ\":\"d\",\"ⅅ\":\"\\\\mathbb{D}\",\"?\":\"?\",\"@\":\"@\",\"//\":\"//\",\"!!\":\"!!\",\"!\":\"!\",\"♯\":\"\\\\#\",\"♮\":\"\",\"♭\":\"\",\"′\":\"'\",\"<>\":\"<>\",\"**\":\"\\\\star\\\\star\",\"∇\":\"\\\\nabla\",\"∂\":\"\\\\partial\",\"⊙\":\"\\\\bigodot\",\"¬\":\"\\\\neg\",\"∢\":\"\\\\measuredangle\",\"∡\":\"\\\\measuredangle\",\"∠\":\"\\\\angle\",\"÷\":\"\\\\div\",\"/\":\"/\",\"∖\":\"\\\\backslash\",\"\\\\\":\"\\\\backslash\",\"%\":\"\\\\%\",\"⊗\":\"\\\\bigotimes\",\"·\":\"\\\\cdot\",\"⨿\":\"\\\\coprod\",\"⨯\":\"\\\\times\",\"⋅\":\"\\\\cdot\",\"⊡\":\"\\\\boxdot\",\"⊠\":\"\\\\boxtimes\",\"⁢\":\"\",\"⁃\":\"-\",\"•\":\"\\\\cdot\",\"×\":\"\\\\times\",\".\":\".\",\"*\":\"\\\\star\",\"∪\":\"\\\\cup\",\"∩\":\"\\\\cap\",\"∐\":\"\\\\coprod\",\"∏\":\"\\\\prod\",\"≀\":\"\",\"⫿\":\"\",\"⫼\":\"\\\\mid\\\\mid\\\\mid\",\"⨉\":\"\\\\times\",\"⨈\":\"\",\"⨇\":\"\",\"⨆\":\"\\\\sqcup\",\"⨅\":\"\\\\sqcap\",\"⨂\":\"\\\\otimes\",\"⨀\":\"\\\\odot\",\"⋂\":\"\\\\cap\",\"⋁\":\"\\\\vee\",\"⋀\":\"\\\\wedge\",\"⨄\":\"\\\\uplus\",\"⨃\":\"\\\\cup\",\"⋃\":\"\\\\cup\",\"⨜\":\"\\\\underline{\\\\int}\",\"⨛\":\"\\\\overline{\\\\int}\",\"⨚\":\"\\\\int\",\"⨙\":\"\\\\int\",\"⨘\":\"\\\\int\",\"⨗\":\"\\\\int\",\"⨖\":\"\\\\oint\",\"⨕\":\"\\\\oint\",\"⨔\":\"\\\\int\",\"⨓\":\"\\\\int\",\"⨒\":\"\\\\int\",\"⨑\":\"\\\\int\",\"⨐\":\"\\\\int\",\"⨏\":\"\\\\bcancel{\\\\int}\",\"⨎\":\"\",\"⨍\":\"\\\\hcancel{\\\\int}\",\"⨌\":\"\\\\iiiint\",\"∳\":\"\\\\oint\",\"∲\":\"\\\\oint\",\"∱\":\"\\\\int\",\"∰\":\"\\\\oiint\",\"∯\":\"\\\\oiint\",\"∮\":\"\\\\oint\",\"∫\":\"\\\\int\",\"⨁\":\"\\\\oplus\",\"⊘\":\"\\\\oslash\",\"⊖\":\"\\\\ominus\",\"⊕\":\"\\\\oplus\",\"∭\":\"\\\\iiint\",\"∬\":\"\\\\iint\",\"⨋\":\"\",\"⨊\":\"\",\"∑\":\"\\\\sum\",\"⊟\":\"\\\\boxminus\",\"⊞\":\"\\\\boxplus\",\"∔\":\"\\\\dot{+}\",\"∓\":\"+-\",\"−\":\"-\",\"±\":\"\\\\pm\",\"-\":\"-\",\"+\":\"+\",\"⭆\":\"\\\\Rrightarrow\",\"⭅\":\"\\\\Lleftarrow\",\"⧴\":\":\\\\rightarrow\",\"⧯\":\"\",\"⧟\":\"\\\\bullet-\\\\bullet\",\"⦟\":\"\\\\angle\",\"⦞\":\"\\\\measuredangle\",\"⦝\":\"\\\\measuredangle\",\"⦜\":\"\\\\perp\",\"⦛\":\"\\\\measuredangle\",\"⦚\":\"\",\"⦙\":\"\\\\vdots\",\"⥿\":\"\",\"⥾\":\"\",\"⥽\":\"\\\\prec\",\"⥼\":\"\\\\succ\",\"⥻\":\"\\\\underset{\\\\rightarrow}{\\\\supset}\",\"⥺\":\"\",\"⥹\":\"\\\\underset{\\\\rightarrow}{\\\\subset}\",\"⥸\":\"\\\\underset{\\\\rightarrow}{>}\",\"⥷\":\"\",\"⥶\":\"\\\\underset{\\\\leftarrow}{<}\",\"⥵\":\"\\\\underset{\\\\approx}{\\\\rightarrow}\",\"⥴\":\"\\\\underset{\\\\sim}{\\\\rightarrow}\",\"⥳\":\"\\\\underset{\\\\sim}{\\\\leftarrow}\",\"⥲\":\"\\\\overset{\\\\sim}{\\\\rightarrow}\",\"⥱\":\"\\\\overset{=}{\\\\rightarrow}\",\"⥰\":\"\",\"⥯\":\"\",\"⥮\":\"\",\"⥭\":\"\\\\overline{\\\\rightharpoondown}\",\"⥬\":\"\\\\underline{\\\\rightharpoonup}\",\"⥫\":\"\\\\overline{\\\\leftharpoondown}\",\"⥪\":\"\\\\underline{\\\\leftharpoonup}\",\"⥩\":\"\\\\rightleftharpoons\",\"⥨\":\"\\\\rightleftharpoons\",\"⥧\":\"\\\\rightleftharpoons\",\"⥦\":\"\\\\rightleftharpoons\",\"⥥\":\"\\\\Downarrow\",\"⥤\":\"\\\\Rightarrow\",\"⥣\":\"\\\\Uparrow\",\"⥢\":\"\\\\Leftarrow\",\"⥡\":\"\\\\downarrow\",\"⥠\":\"\\\\uparrow\",\"⥟\":\"\\\\rightarrow\",\"⥞\":\"\\\\leftarrow\",\"⥝\":\"\\\\downarrow\",\"⥜\":\"\\\\uparrow\",\"⥛\":\"\\\\rightarrow\",\"⥚\":\"\\\\leftarrow\",\"⥙\":\"\\\\downarrow\",\"⥘\":\"\\\\uparrow\",\"⥗\":\"\\\\rightarrow\",\"⥖\":\"\\\\leftarrow\",\"⥕\":\"\\\\downarrow\",\"⥔\":\"\\\\uparrow\",\"⥓\":\"\\\\rightarrow\",\"⥒\":\"\\\\leftarrow\",\"⥑\":\"\\\\updownarrow\",\"⥐\":\"\\\\leftrightarrow\",\"⥏\":\"\\\\updownarrow\",\"⥎\":\"\\\\leftrightarrow\",\"⥍\":\"\\\\updownarrow\",\"⥌\":\"\\\\updownarrow\",\"⥋\":\"\\\\leftrightarrow\",\"⥊\":\"\\\\leftrightarrow\",\"⥉\":\"\",\"⥈\":\"\\\\leftrightarrow\",\"⥇\":\"\\\\nrightarrow\",\"⥆\":\"\",\"⥅\":\"\",\"⥄\":\"\\\\rightleftarrows\",\"⥃\":\"\\\\leftrightarrows\",\"⥂\":\"\\\\rightleftarrows\",\"⥁\":\"\\\\circlearrowright\",\"⥀\":\"\\\\circlearrowleft\",\"⤿\":\"\\\\rightarrow\",\"⤾\":\"\\\\leftarrow\",\"⤽\":\"\",\"⤼\":\"\",\"⤻\":\"\",\"⤺\":\"\",\"⤹\":\"\",\"⤸\":\"\",\"⤷\":\"\\\\Rsh\",\"⤶\":\"\\\\Lsh\",\"⤵\":\"\\\\downarrow\",\"⤴\":\"\\\\uparrow\",\"⤳\":\"\\\\leadsto\",\"⤲\":\"\",\"⤱\":\"\",\"⤰\":\"\",\"⤯\":\"\",\"⤮\":\"\",\"⤭\":\"\",\"⤬\":\"\\\\times\",\"⤫\":\"\\\\times\",\"⤪\":\"\",\"⤩\":\"\",\"⤨\":\"\",\"⤧\":\"\",\"⤦\":\"\",\"⤥\":\"\",\"⤤\":\"\",\"⤣\":\"\",\"⤢\":\"\",\"⤡\":\"\",\"⤠\":\"\\\\mapsto\\\\cdot\",\"⤟\":\"\\\\cdot\\\\leftarrow\",\"⤞\":\"\\\\rightarrow\\\\cdot\",\"⤝\":\"\\\\leftarrow\",\"⤜\":\"\\\\rightarrow\",\"⤛\":\"\\\\leftarrow\",\"⤚\":\"\\\\rightarrow\",\"⤙\":\"\\\\leftarrow\",\"⤘\":\"\\\\rightarrow\",\"⤗\":\"\\\\rightarrow\",\"⤖\":\"\\\\rightarrow\",\"⤕\":\"\\\\rightarrow\",\"⤔\":\"\\\\rightarrow\",\"⤓\":\"\\\\downarrow\",\"⤒\":\"\\\\uparrow\",\"⤑\":\"\\\\rightarrow\",\"⤐\":\"\\\\rightarrow\",\"⤏\":\"\\\\rightarrow\",\"⤎\":\"\\\\leftarrow\",\"⤍\":\"\\\\rightarrow\",\"⤌\":\"\\\\leftarrow\",\"⤋\":\"\\\\Downarrow\",\"⤊\":\"\\\\Uparrow\",\"⤉\":\"\\\\uparrow\",\"⤈\":\"\\\\downarrow\",\"⤇\":\"\\\\Rightarrow\",\"⤆\":\"\\\\Leftarrow\",\"⤅\":\"\\\\mapsto\",\"⤄\":\"\\\\nLeftrightarrow\",\"⤃\":\"\\\\nRightarrow\",\"⤂\":\"\\\\nLeftarrow\",\"⤁\":\"\\\\rightsquigarrow\",\"⤀\":\"\\\\rightsquigarrow\",\"⟿\":\"\\\\rightsquigarrow\",\"⟾\":\"\\\\Rightarrow\",\"⟽\":\"\\\\Leftarrow\",\"⟼\":\"\\\\mapsto\",\"⟻\":\"\\\\leftarrow\",\"⟺\":\"\\\\Longleftrightarrow\",\"⟹\":\"\\\\Longrightarrow\",\"⟸\":\"\\\\Longleftarrow\",\"⟷\":\"\\\\leftrightarrow\",\"⟶\":\"\\\\rightarrow\",\"⟵\":\"\\\\leftarrow\",\"⟱\":\"\\\\Downarrow\",\"⟰\":\"\\\\Uparrow\",\"⊸\":\"\\\\rightarrow\",\"⇿\":\"\\\\leftrightarrow\",\"⇾\":\"\\\\rightarrow\",\"⇽\":\"\\\\leftarrow\",\"⇼\":\"\\\\nleftrightarrow\",\"⇻\":\"\\\\nrightarrow\",\"⇺\":\"\\\\nleftarrow\",\"⇹\":\"\\\\nleftrightarrow\",\"⇸\":\"\\\\nrightarrow\",\"⇷\":\"\\\\nleftarrow\",\"⇶\":\"\\\\Rrightarrow\",\"⇵\":\"\",\"⇴\":\"\\\\rightarrow\",\"⇳\":\"\\\\Updownarrow\",\"⇲\":\"\\\\searrow\",\"⇱\":\"\\\\nwarrow\",\"⇰\":\"\\\\Leftarrow\",\"⇯\":\"\\\\Uparrow\",\"⇮\":\"\\\\Uparrow\",\"⇭\":\"\\\\Uparrow\",\"⇬\":\"\\\\Uparrow\",\"⇫\":\"\\\\Uparrow\",\"⇪\":\"\\\\Uparrow\",\"⇩\":\"\\\\Downarrow\",\"⇨\":\"\\\\Rightarrow\",\"⇧\":\"\\\\Uparrow\",\"⇦\":\"\\\\Leftarrow\",\"⇥\":\"\\\\rightarrow\",\"⇤\":\"\\\\leftarrow\",\"⇣\":\"\\\\downarrow\",\"⇢\":\"\\\\rightarrow\",\"⇡\":\"\\\\uparrow\",\"⇠\":\"\\\\leftarrow\",\"⇟\":\"\\\\downarrow\",\"⇞\":\"\\\\uparrow\",\"⇝\":\"\\\\rightsquigarrow\",\"⇜\":\"\\\\leftarrow\",\"⇛\":\"\\\\Rrightarrow\",\"⇚\":\"\\\\Lleftarrow\",\"⇙\":\"\\\\swarrow\",\"⇘\":\"\\\\searrow\",\"⇗\":\"\\\\nearrow\",\"⇖\":\"\\\\nwarrow\",\"⇕\":\"\\\\Updownarrow\",\"⇔\":\"\\\\Leftrightarrow\",\"⇓\":\"\\\\Downarrow\",\"⇒\":\"\\\\Rightarrow\",\"⇑\":\"\\\\Uparrow\",\"⇐\":\"\\\\Leftarrow\",\"⇏\":\"\\\\nRightarrow\",\"⇎\":\"\\\\nLeftrightarrow\",\"⇍\":\"\\\\nLeftarrow\",\"⇌\":\"\\\\rightleftharpoons\",\"⇋\":\"\\\\leftrightharpoons\",\"⇊\":\"\\\\downdownarrows\",\"⇉\":\"\\\\rightrightarrows\",\"⇈\":\"\\\\upuparrows\",\"⇇\":\"\\\\leftleftarrows\",\"⇆\":\"\\\\leftrightarrows\",\"⇅\":\"\",\"⇄\":\"\\\\rightleftarrows\",\"⇃\":\"\\\\downharpoonleft\",\"⇂\":\"\\\\downharpoonright\",\"⇁\":\"\\\\rightharpoondown\",\"⇀\":\"\\\\rightharpoonup\",\"↿\":\"\\\\upharpoonleft\",\"↾\":\"\\\\upharpoonright\",\"↽\":\"\\\\leftharpoondown\",\"↼\":\"\\\\leftharpoonup\",\"↻\":\"\\\\circlearrowright\",\"↺\":\"\\\\circlearrowleft\",\"↹\":\"\\\\leftrightarrows\",\"↸\":\"\\\\overline{\\\\nwarrow}\",\"↷\":\"\\\\curvearrowright\",\"↶\":\"\\\\curvearrowleft\",\"↵\":\"\\\\swarrow\",\"↴\":\"\\\\searrow\",\"↳\":\"\\\\Rsh\",\"↲\":\"\\\\Lsh\",\"↱\":\"\\\\Rsh\",\"↰\":\"\\\\Lsh\",\"↯\":\"\\\\swarrow\",\"↮\":\"\",\"↭\":\"\\\\leftrightsquigarrow\",\"↬\":\"\\\\looparrowright\",\"↫\":\"\\\\looparrowleft\",\"↪\":\"\\\\hookrightarrow\",\"↩\":\"\\\\hookleftarrow\",\"↨\":\"\\\\underline{\\\\updownarrow}\",\"↧\":\"\\\\downarrow\",\"↦\":\"\\\\rightarrowtail\",\"↥\":\"\\\\uparrow\",\"↤\":\"\\\\leftarrowtail\",\"↣\":\"\\\\rightarrowtail\",\"↢\":\"\\\\leftarrowtail\",\"↡\":\"\\\\downarrow\",\"↠\":\"\\\\twoheadrightarrow\",\"↟\":\"\\\\uparrow\",\"↞\":\"\\\\twoheadleftarrow\",\"↝\":\"\\\\nearrow\",\"↜\":\"\\\\nwarrow\",\"↛\":\"\",\"↚\":\"\",\"↙\":\"\\\\swarrow\",\"↘\":\"\\\\searrow\",\"↗\":\"\\\\nearrow\",\"↖\":\"\\\\nwarrow\",\"↕\":\"\\\\updownarrow\",\"↔\":\"\\\\leftrightarrow\",\"↓\":\"\\\\downarrow\",\"→\":\"\\\\rightarrow\",\"↑\":\"\\\\uparrow\",\"←\":\"\\\\leftarrow\",\"|||\":\"\\\\left|||\\\\right.\",\"||\":\"\\\\left||\\\\right.\",\"|\":\"\\\\left|\\\\right.\",\"⫾\":\"\",\"⫽\":\"//\",\"⫻\":\"///\",\"⫺\":\"\",\"⫹\":\"\",\"⫸\":\"\",\"⫷\":\"\",\"⫶\":\"\\\\vdots\",\"⫵\":\"\",\"⫴\":\"\",\"⫳\":\"\",\"⫲\":\"\\\\nparallel\",\"⫱\":\"\",\"⫰\":\"\",\"⫯\":\"\",\"⫮\":\"\\\\bcancel{\\\\mid}\",\"⫭\":\"\",\"⫬\":\"\",\"⫫\":\"\",\"⫪\":\"\",\"⫩\":\"\",\"⫨\":\"\\\\underline{\\\\perp}\",\"⫧\":\"\\\\overline{\\\\top}\",\"⫦\":\"\",\"⫥\":\"\",\"⫤\":\"\",\"⫣\":\"\",\"⫢\":\"\",\"⫡\":\"\",\"⫠\":\"\\\\perp\",\"⫟\":\"\\\\top\",\"⫞\":\"\\\\dashv\",\"⫝̸\":\"\",\"⫝\":\"\",\"⫛\":\"\\\\pitchfork\",\"⫚\":\"\",\"⫙\":\"\",\"⫘\":\"\",\"⫗\":\"\",\"⫖\":\"\",\"⫕\":\"\",\"⫔\":\"\",\"⫓\":\"\",\"⫒\":\"\",\"⫑\":\"\",\"⫐\":\"\",\"⫏\":\"\",\"⫎\":\"\",\"⫍\":\"\",\"⫌\":\"\\\\underset{\\\\neq}{\\\\supset}\",\"⫋\":\"\\\\underset{\\\\neq}{\\\\subset}\",\"⫊\":\"\\\\underset{\\\\approx}{\\\\supset}\",\"⫉\":\"\\\\underset{\\\\approx}{\\\\subset}\",\"⫈\":\"\\\\underset{\\\\sim}{\\\\supset}\",\"⫇\":\"\\\\underset{\\\\sim}{\\\\subset}\",\"⫆\":\"\\\\supseteqq\",\"⫅\":\"\\\\subseteqq\",\"⫄\":\"\\\\dot{\\\\supseteq}\",\"⫃\":\"\\\\dot{\\\\subseteq}\",\"⫂\":\"\\\\underset{\\\\times}{\\\\supset}\",\"⫁\":\"\\\\underset{\\\\times}{\\\\subset}\",\"⫀\":\"\\\\underset{+}{\\\\supset}\",\"⪿\":\"\\\\underset{+}{\\\\subset}\",\"⪾\":\"\",\"⪽\":\"\",\"⪼\":\"\\\\gg \",\"⪻\":\"\\\\ll\",\"⪺\":\"\\\\underset{\\\\cancel{\\\\approx}}{\\\\succ}\",\"⪹\":\"\\\\underset{\\\\cancel{\\\\approx}}{\\\\prec}\",\"⪸\":\"\\\\underset{\\\\approx}{\\\\succ}\",\"⪷\":\"\\\\underset{\\\\approx}{\\\\prec}\",\"⪶\":\"\\\\underset{\\\\cancel{=}}{\\\\succ}\",\"⪵\":\"\\\\underset{\\\\cancel{=}}{\\\\prec}\",\"⪴\":\"\\\\underset{=}{\\\\succ}\",\"⪳\":\"\\\\underset{=}{\\\\prec}\",\"⪲\":\"\",\"⪱\":\"\",\"⪮\":\"\",\"⪭\":\"\\\\underline{\\\\hcancel{>}}\",\"⪬\":\"\\\\underline{\\\\hcancel{>}}\",\"⪫\":\"\\\\hcancel{>}\",\"⪪\":\"\\\\hcancel{<}\",\"⪩\":\"\",\"⪨\":\"\",\"⪧\":\"\\\\vartriangleright\",\"⪦\":\"\\\\vartriangleleft\",\"⪥\":\"><\",\"⪤\":\"><\",\"⪣\":\"\\\\underline{\\\\ll}\",\"⪢̸\":\"\\\\cancel{\\\\gg}\",\"⪢\":\"\\\\gg\",\"⪡̸\":\"\\\\cancel{\\\\ll}\",\"⪡\":\"\\\\ll\",\"⪠\":\"\\\\overset{\\\\sim}{\\\\geqq}\",\"⪟\":\"\\\\overset{\\\\sim}{\\\\leqq}\",\"⪞\":\"\\\\overset{\\\\sim}{>}\",\"⪝\":\"\\\\overset{\\\\sim}{<}\",\"⪜\":\"\",\"⪛\":\"\",\"⪚\":\"\\\\overset{=}{>}\",\"⪙\":\"\\\\overset{=}{<}\",\"⪘\":\"\",\"⪗\":\"\",\"⪖\":\"\",\"⪕\":\"\",\"⪔\":\"\",\"⪓\":\"\",\"⪒\":\"\\\\underset{=}{\\\\gtrless}\",\"⪑\":\"\\\\underset{=}{\\\\lessgtr}\",\"⪐\":\"\\\\underset{<}{\\\\gtrsim}\",\"⪏\":\"\\\\underset{>}{\\\\lesssim}\",\"⪎\":\"\\\\underset{\\\\simeq}{>}\",\"⪍\":\"\\\\underset{\\\\simeq}{<}\",\"⪌\":\"\\\\gtreqqless\",\"⪋\":\"\\\\lesseqqgtr\",\"⪊\":\"\\\\underset{\\\\cancel{\\\\approx}}{>}\",\"⪉\":\"\\\\underset{\\\\approx}{<}\",\"⪆\":\"\\\\underset{\\\\approx}{>}\",\"⪅\":\"\\\\underset{\\\\approx}{<}\",\"⪄\":\"\",\"⪃\":\"\",\"⪂\":\"\",\"⪁\":\"\",\"⪀\":\"\",\"⩿\":\"\",\"⩾̸\":\"\\\\bcancel{\\\\geq}\",\"⩾\":\"\\\\geq\",\"⩽̸\":\"\\\\bcancel{\\\\leq}\",\"⩽\":\"\\\\leq\",\"⩼\":\"\",\"⩻\":\"\",\"⩺\":\"\",\"⩹\":\"\",\"⩸\":\"\\\\overset{\\\\dots}{\\\\equiv}\",\"⩷\":\"\",\"⩶\":\"===\",\"⩵\":\"==\",\"⩴\":\"::=\",\"⩳\":\"\",\"⩲\":\"\\\\underset{=}{+}\",\"⩱\":\"\\\\overset{=}{+}\",\"⩰\":\"\\\\overset{\\\\approx}{=}\",\"⩯\":\"\\\\overset{\\\\wedge}{=}\",\"⩮\":\"\\\\overset{*}{=}\",\"⩭\":\"\\\\dot{\\\\approx}\",\"⩬\":\"\",\"⩫\":\"\",\"⩪\":\"\\\\dot{\\\\sim}\",\"⩩\":\"\",\"⩨\":\"\",\"⩧\":\"\\\\dot{\\\\equiv}\",\"⩦\":\"\\\\underset{\\\\cdot}{=}\",\"⩥\":\"\",\"⩤\":\"\",\"⩣\":\"\\\\underset{=}{\\\\vee}\",\"⩢\":\"\\\\overset{=}{\\\\vee}\",\"⩡\":\"ul(vv)\",\"⩠\":\"\\\\underset{=}{\\\\wedge}\",\"⩟\":\"\\\\underline{\\\\wedge}\",\"⩞\":\"\\\\overset{=}{\\\\wedge}\",\"⩝\":\"\\\\hcancel{\\\\vee}\",\"⩜\":\"\\\\hcancel{\\\\wedge}\",\"⩛\":\"\",\"⩚\":\"\",\"⩙\":\"\",\"⩘\":\"\\\\vee\",\"⩗\":\"\\\\wedge\",\"⩖\":\"\",\"⩕\":\"\",\"⩔\":\"\",\"⩓\":\"\",\"⩒\":\"\\\\dot{\\\\vee}\",\"⩑\":\"\\\\dot{\\\\wedge}\",\"⩐\":\"\",\"⩏\":\"\",\"⩎\":\"\",\"⩍\":\"\\\\overline{\\\\cap}\",\"⩌\":\"\\\\overline{\\\\cup}\",\"⩋\":\"\",\"⩊\":\"\",\"⩉\":\"\",\"⩈\":\"\",\"⩇\":\"\",\"⩆\":\"\",\"⩅\":\"\",\"⩄\":\"\",\"⩃\":\"\\\\overline{\\\\cap}\",\"⩂\":\"\\\\overline{\\\\cup}\",\"⩁\":\"\",\"⩀\":\"\",\"⨾\":\"\",\"⨽\":\"\\\\llcorner\",\"⨼\":\"\\\\lrcorner\",\"⨻\":\"\",\"⨺\":\"\",\"⨹\":\"\",\"⨸\":\"\",\"⨷\":\"\",\"⨶\":\"\\\\hat{\\\\otimes}\",\"⨵\":\"\",\"⨴\":\"\",\"⨳\":\"\",\"⨲\":\"\\\\underline{\\\\times}\",\"⨱\":\"\\\\underline{\\\\times}\",\"⨰\":\"\\\\dot{\\\\times}\",\"⨮\":\"\",\"⨭\":\"\",\"⨬\":\"\",\"⨫\":\"\",\"⨪\":\"\",\"⨩\":\"\",\"⨨\":\"\",\"⨧\":\"\",\"⨦\":\"\\\\underset{\\\\sim}{+}\",\"⨥\":\"\\\\underset{\\\\circ}{+}\",\"⨤\":\"\\\\overset{\\\\sim}{+}\",\"⨣\":\"\\\\hat{+}\",\"⨢\":\"\\\\dot{+}\",\"⨡\":\"\\\\upharpoonright\",\"⨠\":\">>\",\"⨟\":\"\",\"⨞\":\"\\\\triangleleft\",\"⨝\":\"\\\\bowtie\",\"⧿\":\"\",\"⧾\":\"+\",\"⧻\":\"\\\\hcancel{|||}\",\"⧺\":\"\\\\hcancel{||}\",\"⧹\":\"\\\\backslash\",\"⧸\":\"/\",\"⧷\":\"hcancel{\\backslash}\",\"⧶\":\"\",\"⧵\":\"\\\\backslash\",\"⧲\":\"\\\\Phi\",\"⧱\":\"\",\"⧰\":\"\",\"⧮\":\"\",\"⧭\":\"\",\"⧬\":\"\",\"⧫\":\"\\\\lozenge\",\"⧪\":\"\",\"⧩\":\"\",\"⧨\":\"\",\"⧧\":\"\\\\ddagger\",\"⧢\":\"\\\\sqcup\\\\sqcup\",\"⧡\":\"\",\"⧠\":\"\\\\square\",\"⧞\":\"\",\"⧝\":\"\",\"⧜\":\"\",\"⧛\":\"\\\\{\\\\{\",\"⧙\":\"\\\\{\",\"⧘\":\"\\\\}\",\"⧗\":\"\",\"⧖\":\"\",\"⧕\":\"\\\\bowtie\",\"⧔\":\"\\\\bowtie\",\"⧓\":\"\\\\bowtie\",\"⧒\":\"\\\\bowtie\",\"⧑\":\"\\\\bowtie\",\"⧐̸\":\"| \\\\not\\\\triangleright\",\"⧐\":\"| \\\\triangleright\",\"⧏̸\":\"\\\\not\\\\triangleleft |\",\"⧏\":\"\\\\triangleleft |\",\"⧎\":\"\",\"⧍\":\"\\\\triangle\",\"⧌\":\"\",\"⧋\":\"\\\\underline{\\\\triangle}\",\"⧊\":\"\\\\dot{\\\\triangle}\",\"⧉\":\"\",\"⧈\":\"\\\\boxed{\\\\circ}\",\"⧇\":\"\\\\boxed{\\\\circ}\",\"⧆\":\"\\\\boxed{\\\\rightarrow}\",\"⧅\":\"\\\\bcancel{\\\\square}\",\"⧄\":\"\\\\cancel{\\\\square}\",\"⧃\":\"\\\\odot\",\"⧂\":\"\\\\odot\",\"⦿\":\"\\\\odot\",\"⦾\":\"\\\\odot\",\"⦽\":\"\\\\varnothing\",\"⦼\":\"\\\\oplus\",\"⦻\":\"\\\\otimes\",\"⦺\":\"\",\"⦹\":\"\\\\varnothing\",\"⦸\":\"\\\\varnothing\",\"⦷\":\"\\\\ominus\",\"⦶\":\"\\\\ominus\",\"⦵\":\"\\\\ominus\",\"⦴\":\"\\\\vec{\\\\varnothing}\",\"⦳\":\"\\\\vec{\\\\varnothing}\",\"⦲\":\"\\\\dot{\\\\varnothing}\",\"⦱\":\"\\\\overline{\\\\varnothing}\",\"⦰\":\"\\\\varnothing\",\"⦯\":\"\",\"⦮\":\"\",\"⦭\":\"\",\"⦬\":\"\",\"⦫\":\"\",\"⦪\":\"\",\"⦩\":\"\",\"⦨\":\"\",\"⦧\":\"\",\"⦦\":\"\",\"⦥\":\"\",\"⦤\":\"\",\"⦣\":\"\",\"⦢\":\"\",\"⦡\":\"\\\\not\\\\lor\",\"⦠\":\"\\\\bcancel{>}\",\"⦂\":\":\",\"⦁\":\"\\\\circ\",\"❘\":\"|\",\"▲\":\"\\\\bigtriangleup\",\"⋿\":\"\\\\Epsilon\",\"⋾\":\"\\\\overline{\\\\ni}\",\"⋽\":\"\\\\overline{\\\\ni}\",\"⋼\":\"\\\\in\",\"⋻\":\"\\\\in\",\"⋺\":\"\\\\in\",\"⋹\":\"\\\\underline{\\\\in}\",\"⋸\":\"\\\\underline{\\\\in}\",\"⋷\":\"\\\\overline{\\\\in}\",\"⋶\":\"\\\\overline{\\\\in}\",\"⋵\":\"\\\\dot{\\\\in}\",\"⋴\":\"\\\\in\",\"⋳\":\"\\\\in\",\"⋲\":\"\\\\in\",\"⋰\":\"\\\\ddots\",\"⋩\":\"\\\\underset{\\\\sim}{\\\\succ}\",\"⋨\":\"\\\\underset{\\\\sim}{\\\\prec}\",\"⋧\":\"\\\\underset{\\\\not\\\\sim}{>}\",\"⋦\":\"\\\\underset{\\\\not\\\\sim}{<}\",\"⋥\":\"\\\\not\\\\sqsupseteq\",\"⋤\":\"\\\\not\\\\sqsubseteq\",\"⋣\":\"\\\\not\\\\sqsupseteq\",\"⋢\":\"\\\\not\\\\sqsubseteq\",\"⋡\":\"\\\\nsucc\",\"⋠\":\"\\\\nprec\",\"⋟\":\"\\\\succ\",\"⋞\":\"\\\\prec\",\"⋝\":\"\\\\overline{>}\",\"⋜\":\"\\\\overline{<}\",\"⋛\":\"\\\\underset{>}{\\\\leq}\",\"⋚\":\"\\\\underset{<}{\\\\geq}\",\"⋕\":\"\\\\#\",\"⋓\":\"\\\\cup\",\"⋒\":\"\\\\cap\",\"⋑\":\"\\\\supset\",\"⋐\":\"\\\\subset\",\"⋏\":\"\\\\wedge\",\"⋎\":\"\\\\vee\",\"⋍\":\"\\\\simeq\",\"⋈\":\"\\\\bowtie\",\"⋇\":\"\\\\ast\",\"⋆\":\"\\\\star\",\"⋄\":\"\\\\diamond\",\"⊿\":\"\\\\triangle\",\"⊾\":\"\\\\measuredangle\",\"⊽\":\"\\\\overline{\\\\lor}\",\"⊼\":\"\\\\overline{\\\\land}\",\"⊻\":\"\\\\underline{\\\\lor}\",\"⊺\":\"\\\\top\",\"⊹\":\"\",\"⊷\":\"\\\\circ\\\\multimap\",\"⊶\":\"\\\\circ\\\\multimap\",\"⊳\":\"\\\\triangleright\",\"⊲\":\"\\\\triangleleft\",\"⊱\":\"\\\\succ\",\"⊰\":\"\\\\prec\",\"⊫\":\"|\\\\models\",\"⊪\":\"|\\\\models\",\"⊧\":\"\\\\models\",\"⊦\":\"\\\\vdash\",\"⊝\":\"\\\\ominus\",\"⊜\":\"\\\\ominus\",\"⊛\":\"\\\\odot\",\"⊚\":\"\\\\odot\",\"⊔\":\"\\\\sqcup\",\"⊓\":\"\\\\sqcap\",\"⊒\":\"\\\\sqsupseteq\",\"⊑\":\"\\\\sqsubseteq\",\"⊐̸\":\"\\\\not\\\\sqsupset\",\"⊐\":\"\\\\sqsupset\",\"⊏̸\":\"\\\\not\\\\sqsubset\",\"⊏\":\"\\\\sqsubset\",\"⊎\":\"\\\\cup\",\"⊍\":\"\\\\cup\",\"⊌\":\"\\\\cup\",\"≿̸\":\"\\\\not\\\\succsim\",\"≿\":\"\\\\succsim\",\"≾\":\"\\\\precsim\",\"≹\":\"\\\\not\\\\overset{>}{<}\",\"≸\":\"\\\\not\\\\overset{>}{<}\",\"≷\":\"\\\\overset{>}{<}\",\"≶\":\"\\\\overset{<}{>}\",\"≵\":\"\\\\not\\\\geg\",\"≴\":\"\\\\not\\\\leq\",\"≳\":\"\\\\geg\",\"≲\":\"\\\\leq\",\"≬\":\"\",\"≧\":\"\\\\geg\",\"≦̸\":\"\\\\not\\\\leq\",\"≦\":\"\\\\leq\",\"≣\":\"\\\\overset{=}{=} \",\"≞\":\"\\\\overset{m}{=} \",\"≝\":\"\\\\overset{def}{=}\",\"≘\":\"=\",\"≖\":\"=\",\"≕\":\"=:\",\"≓\":\"\\\\doteq\",\"≒\":\"\\\\doteq\",\"≑\":\"\\\\doteq\",\"≐\":\"\\\\doteq\",\"≏̸\":\"\",\"≏\":\"\",\"≎̸\":\"\",\"≎\":\"\",\"≌\":\"\\\\approx\",\"≋\":\"\\\\approx\",\"≊\":\"\\\\approx\",\"≂̸\":\"\\\\neq\",\"≂\":\"=\",\"∿\":\"\\\\sim\",\"∾\":\"\\\\infty\",\"∽̱\":\"\\\\sim\",\"∽\":\"\\\\sim\",\"∻\":\"\\\\sim\",\"∺\":\":-:\",\"∹\":\"-:\",\"∸\":\"\\\\bot\",\"∷\":\"::\",\"∶\":\":\",\"∣\":\"|\",\"∟\":\"\\\\llcorner\",\"∙\":\"\\\\cdot\",\"∘\":\"\\\\circ\",\"∗\":\"*\",\"∕\":\"/\",\"∎\":\"\\\\square\",\"∍\":\"\\\\ni\",\"∊\":\"\\\\in\",\"∆\":\"\\\\Delta\",\"⁄\":\"/\",\"⪰̸\":\"\\\\nsucceq\",\"⪰\":\"\\\\succeq\",\"⪯̸\":\"\\\\npreceq\",\"⪯\":\"\\\\preceq\",\"⪈\":\"\\\\ngeqslant\",\"⪇\":\"\\\\nleqslant\",\"⧳\":\"\\\\Phi\",\"⧦\":\"\\\\models\",\"⧥\":\"\\\\not\\\\equiv\",\"⧤\":\"\\\\approx\\\\neq\",\"⧣\":\"\\\\neq\",\"⧁\":\"\\\\circle\",\"⧀\":\"\\\\circle\",\"◦\":\"\\\\circle\",\"◗\":\"\\\\circle\",\"◖\":\"\\\\circle\",\"●\":\"\\\\circle\",\"◎\":\"\\\\circledcirc\",\"◍\":\"\\\\circledcirc\",\"◌\":\"\\\\circledcirc\",\"◉\":\"\\\\circledcirc\",\"◈\":\"\\\\diamond\",\"◇\":\"\\\\diamond\",\"◆\":\"\\\\diamond\",\"◅\":\"\\\\triangleleft\",\"◄\":\"\\\\triangleleft\",\"◃\":\"\\\\triangleleft\",\"◂\":\"\\\\triangleleft\",\"◁\":\"\\\\triangleleft\",\"◀\":\"\\\\triangleleft\",\"▿\":\"\\\\triangledown\",\"▾\":\"\\\\triangledown\",\"▽\":\"\\\\triangledown\",\"▼\":\"\\\\triangledown\",\"▹\":\"\\\\triangleright\",\"▸\":\"\\\\triangleright\",\"▷\":\"\\\\triangleright\",\"▶\":\"\\\\triangleright\",\"▵\":\"\\\\triangle\",\"▴\":\"\\\\triangle\",\"△\":\"\\\\triangle\",\"▱\":\"\\\\square\",\"▰\":\"\\\\square\",\"▯\":\"\\\\square\",\"▮\":\"\\\\square\",\"▭\":\"\\\\square\",\"▫\":\"\\\\square\",\"▪\":\"\\\\square\",\"□\":\"\\\\square\",\"■\":\"\\\\square\",\"⋭\":\"\\\\not\\\\triangleright\",\"⋬\":\"\\\\not\\\\triangleleft\",\"⋫\":\"\\\\not\\\\triangleright\",\"⋪\":\"\\\\not\\\\triangleleft\",\"⋙\":\"\\\\ggg\",\"⋘\":\"\\\\lll\",\"⋗\":\"*>\",\"⋖\":\"<*\",\"⋔\":\"\\\\pitchfork\",\"⋌\":\"\",\"⋋\":\"\",\"⋊\":\"\\\\rtimes\",\"⋉\":\"\\\\ltimes\",\"⊵\":\"\\\\triangleright\",\"⊴\":\"\",\"⊥\":\"\\\\bot\",\"⊁\":\"\\\\nsucc\",\"⊀\":\"\\\\preceq\",\"≽\":\"\\\\succeq\",\"≼\":\"\\\\preceq\",\"≻\":\"\\\\succ\",\"≺\":\"\\\\prec\",\"≱\":\"\\\\geq/\",\"≰\":\"\\\\leq/\",\"≭\":\"\\\\neq\",\"≫̸\":\"\\\\not\\\\gg\",\"≫\":\"\\\\gg\",\"≪̸\":\"\\\\not\\\\ll\",\"≪\":\"\\\\ll\",\"≩\":\"\\\\ngeqslant\",\"≨\":\"\\\\nleqslant\",\"≡\":\"\\\\equiv\",\"≟\":\"\\\\doteq\",\"≜\":\"\\\\triangleq\",\"≛\":\"\\\\doteq\",\"≚\":\"\\\\triangleq\",\"≙\":\"\\\\triangleq\",\"≗\":\"\\\\doteq\",\"≔\":\":=\",\"≍\":\"\\\\asymp\",\"≇\":\"\\\\ncong\",\"≆\":\"\\\\ncong\",\"≅\":\"\\\\cong\",\"≄\":\"\\\\not\\\\simeq\",\"≃\":\"\\\\simeq\",\"≁\":\"\\\\not\\\\sim\",\"∦\":\"\\\\not\\\\parallel\",\"∥\":\"\\\\parallel\",\"∤\":\"\\\\not|\",\"∝\":\"\\\\propto\",\"==\":\"==\",\"=\":\"=\",\":=\":\":=\",\"/=\":\"=\",\"-=\":\"-=\",\"+=\":\"+=\",\"*=\":\"*=\",\"!=\":\"!=\",\"≠\":\"\\\\neq\",\"≢\":\"\\\\equiv /\",\"≉\":\"\\\\approx /\",\"∼\":\"sim\",\"≈\":\"\\\\approx\",\"≮\":\"</\",\"<\":\"<\",\"≯\":\">/\",\">=\":\">=\",\">\":\">\",\"≥\":\"\\\\geq\",\"≤\":\"\\\\leq\",\"<=\":\"<=\",\"⊋\":\"\\\\supsetneq\",\"⊊\":\"\\\\subsetneq\",\"⊉\":\"\\\\nsupseteq\",\"⊈\":\"\\\\nsubseteq\",\"⊇\":\"\\\\supseteq\",\"⊆\":\"\\\\subseteq\",\"⊅\":\"\\\\not\\\\supset\",\"⊄\":\"\\\\not\\\\subset\",\"⊃⃒\":\"\\\\supset |\",\"⊃\":\"\\\\supset\",\"⊂⃒\":\"\\\\subset |\",\"⊂\":\"\\\\subset\",\"∌\":\"\\\\not\\\\in\",\"∉\":\"\\\\notin\",\"∈\":\"\\\\in\",\"∁\":\"C\",\"∄\":\"\\\\nexists\",\"∃\":\"\\\\exists\",\"∀\":\"\\\\forall\",\"∧\":\"\\\\land\",\"&&\":\"\\\\&\\\\&\",\"∨\":\"\\\\lor\",\"⊯\":\"\\\\cancel{\\\\vDash}\",\"⊮\":\"\\\\cancel{\\\\Vdash}\",\"⊭\":\"\\\\nvDash\",\"⊬\":\"\\\\nvDash\",\"⊩\":\"\\\\Vdash\",\"⊨\":\"\\\\vDash\",\"⊤\":\"\\\\top\",\"⊣\":\"\\\\dashv\",\"⊢\":\"\\\\vdash\",\"∋\":\"\\\\ni\",\"⋱\":\"\\\\ddots\",\"⋯\":\"\\\\hdots\",\"⋮\":\"\\\\vdots\",\"…\":\"\\\\hdots\",\"϶\":\"\\\\ni\",\":\":\":\",\"...\":\"\\\\cdots\",\"..\":\"..\",\"->\":\"->\",\"∵\":\"\\\\because\",\"∴\":\"\\\\therefore \",\"⁣\":\"\",\",\":\",\",\";\":\";\",\"⧽\":\"\\\\}\",\"⧼\":\"\\\\{\",\"⦘\":\"\\\\]\",\"⦗\":\"\\\\[\",\"⦖\":\"\\\\ll\",\"⦕\":\"\\\\gg\",\"⦔\":\"\\\\gg\",\"⦓\":\"\\\\ll\",\"⦒\":\"\\\\gg\",\"⦑\":\"\\\\ll\",\"⦐\":\"\\\\]\",\"⦏\":\"\\\\]\",\"⦎\":\"\\\\]\",\"⦍\":\"\\\\[\",\"⦌\":\"\\\\[\",\"⦋\":\"\\\\]\",\"⦊\":\"\\\\triangleright\",\"⦉\":\"\\\\triangleleft\",\"⦈\":\"|\\\\)\",\"⦇\":\"\\\\(|\",\"⦆\":\"|\\\\)\",\"⦅\":\"\\\\(\\\\(\",\"⦄\":\"|\\\\}\",\"⦃\":\"\\\\{|\",\"⦀\":\"\\\\||\",\"⟯\":\"\\\\left. \\\\right]\",\"⟮\":\"\\\\left[ \\\\right.\",\"⟭\":\"\\\\left. \\\\right]]\",\"⟬\":\"\\\\left[[ \\\\right.\",\"⟫\":\"\\\\gg\",\"⟪\":\"\\\\ll\",\"⟩\":\"\\\\rangle\",\"⟨\":\"\\\\langle\",\"⟧\":\"\\\\left. \\\\right]]\",\"⟦\":\"\\\\left[[ \\\\right.\",\"❳\":\"\\\\left.\\\\right)\",\"❲\":\"\\\\left(\\\\right.\",\"〉\":\"\\\\rangle\",\"〈\":\"\\\\langle\",\"⌋\":\"\\\\rfloor\",\"⌊\":\"\\\\lfloor\",\"⌉\":\"\\\\rceil\",\"⌈\":\"\\\\lceil\",\"‖\":\"\\\\parallel\",\"}\":\"\\\\left.\\\\right}\",\"{\":\"\\\\left{\\\\right.\",\"]\":\"\\\\left]\\\\right.\",\"[\":\"\\\\left[\\\\right.\",\")\":\"\\\\left.\\\\right)\",\"(\":\"\\\\left(\\\\right.\",\"”\":'\"',\"“\":\"``\",\"’\":\"'\",\"‘\":\"`\",\"%CE%B1\":\"\\\\alpha\",\"%CE%B2\":\"\\\\beta\",\"%CE%B3\":\"\\\\gamma\",\"%CE%93\":\"\\\\Gamma\",\"%CE%B4\":\"\\\\delta\",\"%CE%94\":\"\\\\Delta\",\"%CF%B5\":\"\\\\epsilon\",\"%CE%B6\":\"\\\\zeta\",\"%CE%B7\":\"\\\\eta\",\"%CE%B8\":\"\\\\theta\",\"%CE%98\":\"\\\\Theta\",\"%CE%B9\":\"\\\\iota\",\"%CE%BA\":\"\\\\kappa\",\"%CE%BB\":\"\\\\lambda\",\"%CE%BC\":\"\\\\mu\",\"%CE%BD\":\"\\\\nu\",\"%CE%BF\":\"\\\\omicron\",\"%CF%80\":\"\\\\pi\",\"%CE%A0\":\"\\\\Pi\",\"%CF%81\":\"\\\\pho\",\"%CF%83\":\"\\\\sigma\",\"%CE%A3\":\"\\\\Sigma\",\"%CF%84\":\"\\\\tau\",\"%CF%85\":\"\\\\upsilon\",\"%CE%A5\":\"\\\\Upsilon\",\"%CF%95\":\"\\\\phi\",\"%CE%A6\":\"\\\\Phi\",\"%CF%87\":\"\\\\chi\",\"%CF%88\":\"\\\\psi\",\"%CE%A8\":\"\\\\Psi\",\"%CF%89\":\"\\\\omega\",\"%CE%A9\":\"\\\\Omega\"}},9039:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.allMathOperatorsByGlyph=void 0,t.allMathOperatorsByGlyph={_:\"\\\\underline\",\"⏡\":\"\\\\underbrace\",\"⏠\":\"\\\\overbrace\",\"⏟\":\"\\\\underbrace\",\"⏞\":\"\\\\overbrace\",\"⏝\":\"\\\\underbrace\",\"⏜\":\"\\\\overbrace\",\"⎵\":\"\\\\underbrace\",\"⎴\":\"\\\\overbrace\",\"⃜\":\"\\\\square\",\"⃛\":\"\\\\square\",\"\":\"\",\"⁗\":\"''''\",\"‾\":\"\\\\overline\",\"‷\":\"```\",\"‶\":\"``\",\"‵\":\"`\",\"‴\":\"'''\",\"″\":\"''\",\"‟\":\"``\",\"„\":\",,\",\"‛\":\"`\",\"‚\":\",\",\"^\":\"\\\\hat\",\"˷\":\"\\\\sim\",\"˝\":\"\\\\sim\",\"˜\":\"\\\\sim\",\"˚\":\"\\\\circ\",\"˙\":\"\\\\cdot\",\"˘\":\" \",ˍ:\"\\\\_\",ˋ:\"ˋ\",ˊ:\"ˊ\",ˉ:\"ˉ\",ˇ:\"\",ˆ:\"\\\\hat\",º:\"o\",\"¹\":\"1\",\"¸\":\",\",\"´\":\"´\",\"³\":\"3\",\"²\":\"2\",\"°\":\"\\\\circ\",\"¯\":\"\\\\bar\",ª:\"a\",\"↛\":\"\\\\nrightarrow\",\"¨\":\"\\\\cdot\\\\cdot\",\"~\":\"\\\\sim\",\"`\":\"`\",\"--\":\"--\",\"++\":\"++\",\"&\":\"\\\\&\",\"∜\":\"\\\\sqrt[4]{}\",\"∛\":\"\\\\sqrt[3]{}\",\"√\":\"\\\\sqrt{}\",ⅆ:\"d\",ⅅ:\"\\\\mathbb{D}\",\"?\":\"?\",\"@\":\"@\",\"//\":\"//\",\"!!\":\"!!\",\"!\":\"!\",\"♯\":\"\\\\#\",\"♮\":\"\",\"♭\":\"\",\"′\":\"'\",\"<>\":\"<>\",\"**\":\"\\\\star\\\\star\",\"∇\":\"\\\\nabla\",\"∂\":\"\\\\partial\",\"⊙\":\"\\\\bigodot\",\"¬\":\"\\\\neg\",\"∢\":\"\\\\measuredangle\",\"∡\":\"\\\\measuredangle\",\"∠\":\"\\\\angle\",\"÷\":\"\\\\div\",\"/\":\"/\",\"∖\":\"\\\\backslash\",\"\\\\\":\"\\\\backslash\",\"%\":\"\\\\%\",\"⊗\":\"\\\\bigotimes\",\"·\":\"\\\\cdot\",\"⨿\":\"\\\\coprod\",\"⨯\":\"\\\\times\",\"⋅\":\"\\\\cdot\",\"⊡\":\"\\\\boxdot\",\"⊠\":\"\\\\boxtimes\",\"\":\"\",\"⁃\":\"-\",\"•\":\"\\\\cdot\",\".\":\".\",\"*\":\"\\\\star\",\"∪\":\"\\\\cup\",\"∩\":\"\\\\cap\",\"∐\":\"\\\\coprod\",\"∏\":\"\\\\prod\",\"≀\":\"\",\"⫿\":\"\",\"⫼\":\"\\\\mid\\\\mid\\\\mid\",\"⨉\":\"\\\\times\",\"⨈\":\"\",\"⨇\":\"\",\"⨆\":\"\\\\sqcup\",\"⨅\":\"\\\\sqcap\",\"⨂\":\"\\\\otimes\",\"⨀\":\"\\\\odot\",\"⋂\":\"\\\\cap\",\"⋁\":\"\\\\vee\",\"⋀\":\"\\\\wedge\",\"⨄\":\"\\\\uplus\",\"⨃\":\"\\\\cup\",\"⋃\":\"\\\\cup\",\"⨜\":\"\\\\underline{\\\\int}\",\"⨛\":\"\\\\overline{\\\\int}\",\"⨚\":\"\\\\int\",\"⨙\":\"\\\\int\",\"⨘\":\"\\\\int\",\"⨗\":\"\\\\int\",\"⨖\":\"\\\\oint\",\"⨕\":\"\\\\oint\",\"⨔\":\"\\\\int\",\"⨓\":\"\\\\int\",\"⨒\":\"\\\\int\",\"⨑\":\"\\\\int\",\"⨐\":\"\\\\int\",\"⨏\":\"\\\\bcancel{\\\\int}\",\"⨎\":\"\",\"⨍\":\"\\\\hcancel{\\\\int}\",\"⨌\":\"\\\\iiiint\",\"∳\":\"\\\\oint\",\"∲\":\"\\\\oint\",\"∱\":\"\\\\int\",\"∰\":\"\\\\oiint\",\"∯\":\"\\\\oiint\",\"∮\":\"\\\\oint\",\"∫\":\"\\\\int\",\"⨁\":\"\\\\oplus\",\"⊘\":\"\\\\oslash\",\"⊖\":\"\\\\ominus\",\"⊕\":\"\\\\oplus\",\"∭\":\"\\\\iiint\",\"∬\":\"\\\\iint\",\"⨋\":\"\",\"⨊\":\"\",\"∑\":\"\\\\sum\",\"⊟\":\"\\\\boxminus\",\"⊞\":\"\\\\boxplus\",\"∔\":\"\\\\dot{+}\",\"∓\":\"+-\",\"−\":\"-\",\"±\":\"\\\\pm\",\"-\":\"-\",\"+\":\"+\",\"⭆\":\"\\\\Rrightarrow\",\"⭅\":\"\\\\Lleftarrow\",\"⧴\":\":\\\\rightarrow\",\"⧯\":\"\",\"⧟\":\"\\\\bullet-\\\\bullet\",\"⦟\":\"\\\\angle\",\"⦞\":\"\\\\measuredangle\",\"⦝\":\"\\\\measuredangle\",\"⦜\":\"\\\\perp\",\"⦛\":\"\\\\measuredangle\",\"⦚\":\"\",\"⦙\":\"\\\\vdots\",\"⥿\":\"\",\"⥾\":\"\",\"⥽\":\"\\\\prec\",\"⥼\":\"\\\\succ\",\"⥻\":\"\\\\underset{\\\\rightarrow}{\\\\supset}\",\"⥺\":\"\",\"⥹\":\"\\\\underset{\\\\rightarrow}{\\\\subset}\",\"⥸\":\"\\\\underset{\\\\rightarrow}{>}\",\"⥷\":\"\",\"⥶\":\"\\\\underset{\\\\leftarrow}{<}\",\"⥵\":\"\\\\underset{\\\\approx}{\\\\rightarrow}\",\"⥴\":\"\\\\underset{\\\\sim}{\\\\rightarrow}\",\"⥳\":\"\\\\underset{\\\\sim}{\\\\leftarrow}\",\"⥲\":\"\\\\overset{\\\\sim}{\\\\rightarrow}\",\"⥱\":\"\\\\overset{=}{\\\\rightarrow}\",\"⥰\":\"\",\"⥯\":\"\",\"⥮\":\"\",\"⥭\":\"\\\\overline{\\\\rightharpoondown}\",\"⥬\":\"\\\\underline{\\\\rightharpoonup}\",\"⥫\":\"\\\\overline{\\\\leftharpoondown}\",\"⥪\":\"\\\\underline{\\\\leftharpoonup}\",\"⥩\":\"\\\\rightleftharpoons\",\"⥨\":\"\\\\rightleftharpoons\",\"⥧\":\"\\\\rightleftharpoons\",\"⥦\":\"\\\\rightleftharpoons\",\"⥥\":\"\\\\Downarrow\",\"⥤\":\"\\\\Rightarrow\",\"⥣\":\"\\\\Uparrow\",\"⥢\":\"\\\\Leftarrow\",\"⥡\":\"\\\\downarrow\",\"⥠\":\"\\\\uparrow\",\"⥟\":\"\\\\rightarrow\",\"⥞\":\"\\\\leftarrow\",\"⥝\":\"\\\\downarrow\",\"⥜\":\"\\\\uparrow\",\"⥛\":\"\\\\rightarrow\",\"⥚\":\"\\\\leftarrow\",\"⥙\":\"\\\\downarrow\",\"⥘\":\"\\\\uparrow\",\"⥗\":\"\\\\rightarrow\",\"⥖\":\"\\\\leftarrow\",\"⥕\":\"\\\\downarrow\",\"⥔\":\"\\\\uparrow\",\"⥓\":\"\\\\rightarrow\",\"⥒\":\"\\\\leftarrow\",\"⥑\":\"\\\\updownarrow\",\"⥐\":\"\\\\leftrightarrow\",\"⥏\":\"\\\\updownarrow\",\"⥎\":\"\\\\leftrightarrow\",\"⥍\":\"\\\\updownarrow\",\"⥌\":\"\\\\updownarrow\",\"⥋\":\"\\\\leftrightarrow\",\"⥊\":\"\\\\leftrightarrow\",\"⥉\":\"\",\"⥈\":\"\\\\leftrightarrow\",\"⥇\":\"\\\\nrightarrow\",\"⥆\":\"\",\"⥅\":\"\",\"⥄\":\"\\\\rightleftarrows\",\"⥃\":\"\\\\leftrightarrows\",\"⥂\":\"\\\\rightleftarrows\",\"⥁\":\"\\\\circlearrowright\",\"⥀\":\"\\\\circlearrowleft\",\"⤿\":\"\\\\rightarrow\",\"⤾\":\"\\\\leftarrow\",\"⤽\":\"\\\\leftarrow\",\"⤼\":\"\\\\rightarrow\",\"⤻\":\"\\\\rightarrow\",\"⤺\":\"\\\\leftarrow\",\"⤹\":\"\\\\downarrow\",\"⤸\":\"\\\\downarrow\",\"⤷\":\"\\\\Rsh\",\"⤶\":\"\\\\Lsh\",\"⤵\":\"\\\\downarrow\",\"⤴\":\"\\\\uparrow\",\"⤳\":\"\\\\rightarrow\",\"⤲\":\"\\\\leftarrow\",\"⤱\":\" \",\"⤰\":\" \",\"⤯\":\" \",\"⤮\":\" \",\"⤭\":\" \",\"⤬\":\"\\\\times\",\"⤫\":\"\\\\times\",\"⤪\":\" \",\"⤩\":\" \",\"⤨\":\" \",\"⤧\":\" \",\"⤦\":\" \",\"⤥\":\" \",\"⤤\":\" \",\"⤣\":\" \",\"⤢\":\" \",\"⤡\":\" \",\"⤠\":\"\\\\mapsto\\\\cdot\",\"⤟\":\"\\\\cdot\\\\leftarrow\",\"⤞\":\"\\\\rightarrow\\\\cdot\",\"⤝\":\"\\\\leftarrow\",\"⤜\":\"\\\\rightarrow\",\"⤛\":\"\\\\leftarrow\",\"⤚\":\"\\\\rightarrow\",\"⤙\":\"\\\\leftarrow\",\"⤘\":\"\\\\rightarrow\",\"⤗\":\"\\\\rightarrow\",\"⤖\":\"\\\\rightarrow\",\"⤕\":\"\\\\rightarrow\",\"⤔\":\"\\\\rightarrow\",\"⤓\":\"\\\\downarrow\",\"⤒\":\"\\\\uparrow\",\"⤑\":\"\\\\rightarrow\",\"⤐\":\"\\\\rightarrow\",\"⤏\":\"\\\\rightarrow\",\"⤎\":\"\\\\leftarrow\",\"⤍\":\"\\\\rightarrow\",\"⤌\":\"\\\\leftarrow\",\"⤋\":\"\\\\Downarrow\",\"⤊\":\"\\\\Uparrow\",\"⤉\":\"\\\\uparrow\",\"⤈\":\"\\\\downarrow\",\"⤇\":\"\\\\Rightarrow\",\"⤆\":\"\\\\Leftarrow\",\"⤅\":\"\\\\mapsto\",\"⤄\":\"\\\\nLeftrightarrow\",\"⤃\":\"\\\\nRightarrow\",\"⤂\":\"\\\\nLeftarrow\",\"⤁\":\"\\\\rightsquigarrow\",\"⤀\":\"\\\\rightsquigarrow\",\"⟿\":\"\\\\rightsquigarrow\",\"⟾\":\"\\\\Rightarrow\",\"⟽\":\"\\\\Leftarrow\",\"⟼\":\"\\\\mapsto\",\"⟻\":\"\\\\leftarrow\",\"⟺\":\"\\\\Longleftrightarrow\",\"⟹\":\"\\\\Longrightarrow\",\"⟸\":\"\\\\Longleftarrow\",\"⟷\":\"\\\\leftrightarrow\",\"⟶\":\"\\\\rightarrow\",\"⟵\":\"\\\\leftarrow\",\"⟱\":\"\\\\Downarrow\",\"⟰\":\"\\\\Uparrow\",\"⊸\":\"\\\\rightarrow\",\"⇿\":\"\\\\leftrightarrow\",\"⇾\":\"\\\\rightarrow\",\"⇽\":\"\\\\leftarrow\",\"⇼\":\"\\\\nleftrightarrow\",\"⇻\":\"\\\\nrightarrow\",\"⇺\":\"\\\\nleftarrow\",\"⇹\":\"\\\\nleftrightarrow\",\"⇸\":\"\\\\nrightarrow\",\"⇷\":\"\\\\nleftarrow\",\"⇶\":\"\\\\Rrightarrow\",\"⇵\":\"\",\"⇴\":\"\\\\rightarrow\",\"⇳\":\"\\\\Updownarrow\",\"⇲\":\"\\\\searrow\",\"⇱\":\"\\\\nwarrow\",\"⇰\":\"\\\\Leftarrow\",\"⇯\":\"\\\\Uparrow\",\"⇮\":\"\\\\Uparrow\",\"⇭\":\"\\\\Uparrow\",\"⇬\":\"\\\\Uparrow\",\"⇫\":\"\\\\Uparrow\",\"⇪\":\"\\\\Uparrow\",\"⇩\":\"\\\\Downarrow\",\"⇨\":\"\\\\Rightarrow\",\"⇧\":\"\\\\Uparrow\",\"⇦\":\"\\\\Leftarrow\",\"⇥\":\"\\\\rightarrow\",\"⇤\":\"\\\\leftarrow\",\"⇣\":\"\\\\downarrow\",\"⇢\":\"\\\\rightarrow\",\"⇡\":\"\\\\uparrow\",\"⇠\":\"\\\\leftarrow\",\"⇟\":\"\\\\downarrow\",\"⇞\":\"\\\\uparrow\",\"⇝\":\"\\\\rightsquigarrow\",\"⇜\":\"\\\\leftarrow\",\"⇛\":\"\\\\Rrightarrow\",\"⇚\":\"\\\\Lleftarrow\",\"⇙\":\"\\\\swarrow\",\"⇘\":\"\\\\searrow\",\"⇗\":\"\\\\nearrow\",\"⇖\":\"\\\\nwarrow\",\"⇕\":\"\\\\Updownarrow\",\"⇔\":\"\\\\Leftrightarrow\",\"⇓\":\"\\\\Downarrow\",\"⇒\":\"\\\\Rightarrow\",\"⇑\":\"\\\\Uparrow\",\"⇐\":\"\\\\Leftarrow\",\"⇏\":\"\\\\nRightarrow\",\"⇎\":\"\\\\nLeftrightarrow\",\"⇍\":\"\\\\nLeftarrow\",\"⇌\":\"\\\\rightleftharpoons\",\"⇋\":\"\\\\leftrightharpoons\",\"⇊\":\"\\\\downdownarrows\",\"⇉\":\"\\\\rightrightarrows\",\"⇈\":\"\\\\upuparrows\",\"⇇\":\"\\\\leftleftarrows\",\"⇆\":\"\\\\leftrightarrows\",\"⇅\":\"\",\"⇄\":\"\\\\rightleftarrows\",\"⇃\":\"\\\\downharpoonleft\",\"⇂\":\"\\\\downharpoonright\",\"⇁\":\"\\\\rightharpoondown\",\"⇀\":\"\\\\rightharpoonup\",\"↿\":\"\\\\upharpoonleft\",\"↾\":\"\\\\upharpoonright\",\"↽\":\"\\\\leftharpoondown\",\"↼\":\"\\\\leftharpoonup\",\"↻\":\"\\\\circlearrowright\",\"↺\":\"\\\\circlearrowleft\",\"↹\":\"\\\\leftrightarrows\",\"↸\":\"\\\\overline{\\\\nwarrow}\",\"↷\":\"\\\\curvearrowright\",\"↶\":\"\\\\curvearrowleft\",\"↵\":\"\\\\swarrow\",\"↴\":\"\\\\searrow\",\"↳\":\"\\\\Rsh\",\"↲\":\"\\\\Lsh\",\"↱\":\"\\\\Rsh\",\"↰\":\"\\\\Lsh\",\"↯\":\"\\\\swarrow\",\"↮\":\"\",\"↭\":\"\\\\leftrightsquigarrow\",\"↬\":\"\\\\looparrowright\",\"↫\":\"\\\\looparrowleft\",\"↪\":\"\\\\hookrightarrow\",\"↩\":\"\\\\hookleftarrow\",\"↨\":\"\\\\underline{\\\\updownarrow}\",\"↧\":\"\\\\downarrow\",\"↦\":\"\\\\rightarrowtail\",\"↥\":\"\\\\uparrow\",\"↤\":\"\\\\leftarrowtail\",\"↣\":\"\\\\rightarrowtail\",\"↢\":\"\\\\leftarrowtail\",\"↡\":\"\\\\downarrow\",\"↠\":\"\\\\twoheadrightarrow\",\"↟\":\"\\\\uparrow\",\"↞\":\"\\\\twoheadleftarrow\",\"↝\":\"\\\\nearrow\",\"↜\":\"\\\\nwarrow\",\"↚\":\"\",\"↙\":\"\\\\swarrow\",\"↘\":\"\\\\searrow\",\"↗\":\"\\\\nearrow\",\"↖\":\"\\\\nwarrow\",\"↕\":\"\\\\updownarrow\",\"↔\":\"\\\\leftrightarrow\",\"↓\":\"\\\\downarrow\",\"→\":\"\\\\rightarrow\",\"↑\":\"\\\\uparrow\",\"←\":\"\\\\leftarrow\",\"|||\":\"\\\\left|||\\\\right.\",\"||\":\"\\\\left||\\\\right.\",\"|\":\"\\\\mid\",\"⫾\":\"\",\"⫽\":\"//\",\"⫻\":\"///\",\"⫺\":\"\",\"⫹\":\"\",\"⫸\":\"\",\"⫷\":\"\",\"⫶\":\"\\\\vdots\",\"⫵\":\"\",\"⫴\":\"\",\"⫳\":\"\",\"⫲\":\"\\\\nparallel\",\"⫱\":\"\",\"⫰\":\"\",\"⫯\":\"\",\"⫮\":\"\\\\bcancel{\\\\mid}\",\"⫭\":\"\",\"⫬\":\"\",\"⫫\":\"\",\"⫪\":\"\",\"⫩\":\"\",\"⫨\":\"\\\\underline{\\\\perp}\",\"⫧\":\"\\\\overline{\\\\top}\",\"⫦\":\"\",\"⫥\":\"\",\"⫤\":\"\",\"⫣\":\"\",\"⫢\":\"\",\"⫡\":\"\",\"⫠\":\"\\\\perp\",\"⫟\":\"\\\\top\",\"⫞\":\"\\\\dashv\",\"⫝̸\":\"\",\"⫝\":\"\",\"⫛\":\"\\\\pitchfork\",\"⫚\":\"\",\"⫙\":\"\",\"⫘\":\"\",\"⫗\":\"\",\"⫖\":\"\",\"⫕\":\"\",\"⫔\":\"\",\"⫓\":\"\",\"⫒\":\"\",\"⫑\":\"\",\"⫐\":\"\",\"⫏\":\"\",\"⫎\":\"\",\"⫍\":\"\",\"⫌\":\"\\\\underset{\\\\neq}{\\\\supset}\",\"⫋\":\"\\\\underset{\\\\neq}{\\\\subset}\",\"⫊\":\"\\\\underset{\\\\approx}{\\\\supset}\",\"⫉\":\"\\\\underset{\\\\approx}{\\\\subset}\",\"⫈\":\"\\\\underset{\\\\sim}{\\\\supset}\",\"⫇\":\"\\\\underset{\\\\sim}{\\\\subset}\",\"⫆\":\"\\\\supseteqq\",\"⫅\":\"\\\\subseteqq\",\"⫄\":\"\\\\dot{\\\\supseteq}\",\"⫃\":\"\\\\dot{\\\\subseteq}\",\"⫂\":\"\\\\underset{\\\\times}{\\\\supset}\",\"⫁\":\"\\\\underset{\\\\times}{\\\\subset}\",\"⫀\":\"\\\\underset{+}{\\\\supset}\",\"⪿\":\"\\\\underset{+}{\\\\subset}\",\"⪾\":\"\",\"⪽\":\"\",\"⪼\":\"\\\\gg \",\"⪻\":\"\\\\ll\",\"⪺\":\"\\\\underset{\\\\cancel{\\\\approx}}{\\\\succ}\",\"⪹\":\"\\\\underset{\\\\cancel{\\\\approx}}{\\\\prec}\",\"⪸\":\"\\\\underset{\\\\approx}{\\\\succ}\",\"⪷\":\"\\\\underset{\\\\approx}{\\\\prec}\",\"⪶\":\"\\\\underset{\\\\cancel{=}}{\\\\succ}\",\"⪵\":\"\\\\underset{\\\\cancel{=}}{\\\\prec}\",\"⪴\":\"\\\\underset{=}{\\\\succ}\",\"⪳\":\"\\\\underset{=}{\\\\prec}\",\"⪲\":\"\",\"⪱\":\"\",\"⪮\":\"\",\"⪭\":\"\\\\underline{\\\\hcancel{>}}\",\"⪬\":\"\\\\underline{\\\\hcancel{>}}\",\"⪫\":\"\\\\hcancel{>}\",\"⪪\":\"\\\\hcancel{<}\",\"⪩\":\"\",\"⪨\":\"\",\"⪧\":\"\\\\vartriangleright\",\"⪦\":\"\\\\vartriangleleft\",\"⪥\":\"><\",\"⪤\":\"><\",\"⪣\":\"\\\\underline{\\\\ll}\",\"⪢̸\":\"\\\\cancel{\\\\gg}\",\"⪢\":\"\\\\gg\",\"⪡̸\":\"\\\\cancel{\\\\ll}\",\"⪡\":\"\\\\ll\",\"⪠\":\"\\\\overset{\\\\sim}{\\\\geqq}\",\"⪟\":\"\\\\overset{\\\\sim}{\\\\leqq}\",\"⪞\":\"\\\\overset{\\\\sim}{>}\",\"⪝\":\"\\\\overset{\\\\sim}{<}\",\"⪜\":\"\",\"⪛\":\"\",\"⪚\":\"\\\\overset{=}{>}\",\"⪙\":\"\\\\overset{=}{<}\",\"⪘\":\"\",\"⪗\":\"\",\"⪖\":\"\",\"⪕\":\"\",\"⪔\":\"\",\"⪓\":\"\",\"⪒\":\"\\\\underset{=}{\\\\gtrless}\",\"⪑\":\"\\\\underset{=}{\\\\lessgtr}\",\"⪐\":\"\\\\underset{<}{\\\\gtrsim}\",\"⪏\":\"\\\\underset{>}{\\\\lesssim}\",\"⪎\":\"\\\\underset{\\\\simeq}{>}\",\"⪍\":\"\\\\underset{\\\\simeq}{<}\",\"⪌\":\"\\\\gtreqqless\",\"⪋\":\"\\\\lesseqqgtr\",\"⪊\":\"\\\\underset{\\\\cancel{\\\\approx}}{>}\",\"⪉\":\"\\\\underset{\\\\approx}{<}\",\"⪆\":\"\\\\underset{\\\\approx}{>}\",\"⪅\":\"\\\\underset{\\\\approx}{<}\",\"⪄\":\"\",\"⪃\":\"\",\"⪂\":\"\",\"⪁\":\"\",\"⪀\":\"\",\"⩿\":\"\",\"⩾̸\":\"\\\\bcancel{\\\\geq}\",\"⩾\":\"\\\\geq\",\"⩽̸\":\"\\\\bcancel{\\\\leq}\",\"⩽\":\"\\\\leq\",\"⩼\":\"\",\"⩻\":\"\",\"⩺\":\"\",\"⩹\":\"\",\"⩸\":\"\\\\overset{\\\\dots}{\\\\equiv}\",\"⩷\":\"\",\"⩶\":\"===\",\"⩵\":\"==\",\"⩴\":\"::=\",\"⩳\":\"\",\"⩲\":\"\\\\underset{=}{+}\",\"⩱\":\"\\\\overset{=}{+}\",\"⩰\":\"\\\\overset{\\\\approx}{=}\",\"⩯\":\"\\\\overset{\\\\wedge}{=}\",\"⩮\":\"\\\\overset{*}{=}\",\"⩭\":\"\\\\dot{\\\\approx}\",\"⩬\":\"\",\"⩫\":\"\",\"⩪\":\"\\\\dot{\\\\sim}\",\"⩩\":\"\",\"⩨\":\"\",\"⩧\":\"\\\\dot{\\\\equiv}\",\"⩦\":\"\\\\underset{\\\\cdot}{=}\",\"⩥\":\"\",\"⩤\":\"\",\"⩣\":\"\\\\underset{=}{\\\\vee}\",\"⩢\":\"\\\\overset{=}{\\\\vee}\",\"⩡\":\"ul(vv)\",\"⩠\":\"\\\\underset{=}{\\\\wedge}\",\"⩟\":\"\\\\underline{\\\\wedge}\",\"⩞\":\"\\\\overset{=}{\\\\wedge}\",\"⩝\":\"\\\\hcancel{\\\\vee}\",\"⩜\":\"\\\\hcancel{\\\\wedge}\",\"⩛\":\"\",\"⩚\":\"\",\"⩙\":\"\",\"⩘\":\"\\\\vee\",\"⩗\":\"\\\\wedge\",\"⩖\":\"\",\"⩕\":\"\",\"⩔\":\"\",\"⩓\":\"\",\"⩒\":\"\\\\dot{\\\\vee}\",\"⩑\":\"\\\\dot{\\\\wedge}\",\"⩐\":\"\",\"⩏\":\"\",\"⩎\":\"\",\"⩍\":\"\\\\overline{\\\\cap}\",\"⩌\":\"\\\\overline{\\\\cup}\",\"⩋\":\"\",\"⩊\":\"\",\"⩉\":\"\",\"⩈\":\"\",\"⩇\":\"\",\"⩆\":\"\",\"⩅\":\"\",\"⩄\":\"\",\"⩃\":\"\\\\overline{\\\\cap}\",\"⩂\":\"\\\\overline{\\\\cup}\",\"⩁\":\"\",\"⩀\":\"\",\"⨾\":\"\",\"⨽\":\"\\\\llcorner\",\"⨼\":\"\\\\lrcorner\",\"⨻\":\"\",\"⨺\":\"\",\"⨹\":\"\",\"⨸\":\"\",\"⨷\":\"\",\"⨶\":\"\\\\hat{\\\\otimes}\",\"⨵\":\"\",\"⨴\":\"\",\"⨳\":\"\",\"⨲\":\"\\\\underline{\\\\times}\",\"⨱\":\"\\\\underline{\\\\times}\",\"⨰\":\"\\\\dot{\\\\times}\",\"⨮\":\"\\\\bigodot\",\"⨭\":\"\\\\bigodot\",\"⨬\":\"\",\"⨫\":\"\",\"⨪\":\"\",\"⨩\":\"\",\"⨨\":\"\",\"⨧\":\"\",\"◻\":\"\\\\Box\",\"⨦\":\"\\\\underset{\\\\sim}{+}\",\"⨥\":\"\\\\underset{\\\\circ}{+}\",\"⨤\":\"\\\\overset{\\\\sim}{+}\",\"⨣\":\"\\\\hat{+}\",\"⨢\":\"\\\\dot{+}\",\"⨡\":\"\\\\upharpoonright\",\"⨠\":\">>\",\"⨟\":\"\",\"⨞\":\"\\\\triangleleft\",\"⨝\":\"\\\\bowtie\",\"⧿\":\"\",\"⧾\":\"+\",\"⧻\":\"\\\\hcancel{|||}\",\"⧺\":\"\\\\hcancel{||}\",\"⧹\":\"\\\\backslash\",\"⧸\":\"/\",\"⧷\":\"hcancel{\\backslash}\",\"⧶\":\"\",\"⧵\":\"\\\\backslash\",\"⧲\":\"\\\\Phi\",\"⧱\":\"\",\"⧰\":\"\",\"⧮\":\"\",\"⧭\":\"\",\"⧬\":\"\",\"⧫\":\"\\\\lozenge\",\"⧪\":\"\",\"⧩\":\"\",\"⧨\":\"\",\"⧧\":\"\\\\ddagger\",\"⧢\":\"\\\\sqcup\\\\sqcup\",\"⧡\":\"\",\"⧠\":\"\\\\square\",\"⧞\":\"\",\"⧝\":\"\",\"⧜\":\"\",\"⧛\":\"\\\\{\\\\{\",\"⧙\":\"\\\\{\",\"⧘\":\"\\\\}\",\"⧗\":\"\",\"⧖\":\"\",\"⧕\":\"\\\\bowtie\",\"⧔\":\"\\\\bowtie\",\"⧓\":\"\\\\bowtie\",\"⧒\":\"\\\\bowtie\",\"⧑\":\"\\\\bowtie\",\"⧐̸\":\"| \\\\not\\\\triangleright\",\"⧐\":\"| \\\\triangleright\",\"⧏̸\":\"\\\\not\\\\triangleleft |\",\"⧏\":\"\\\\triangleleft |\",\"⧎\":\"\",\"⧍\":\"\\\\triangle\",\"⧌\":\"\",\"⧋\":\"\\\\underline{\\\\triangle}\",\"⧊\":\"\\\\dot{\\\\triangle}\",\"⧉\":\"\",\"⧈\":\"\\\\boxed{\\\\circ}\",\"⧇\":\"\\\\boxed{\\\\circ}\",\"⧆\":\"\\\\boxed{\\\\rightarrow}\",\"⧅\":\"\\\\bcancel{\\\\square}\",\"⧄\":\"\\\\cancel{\\\\square}\",\"⧃\":\"\\\\odot\",\"⧂\":\"\\\\odot\",\"⦿\":\"\\\\odot\",\"⦾\":\"\\\\odot\",\"⦽\":\"\\\\varnothing\",\"⦼\":\"\\\\oplus\",\"⦻\":\"\\\\otimes\",\"⦺\":\"\",\"⦹\":\"\\\\varnothing\",\"⦸\":\"\\\\varnothing\",\"⦷\":\"\\\\ominus\",\"⦶\":\"\\\\ominus\",\"⦵\":\"\\\\ominus\",\"⦴\":\"\\\\vec{\\\\varnothing}\",\"⦳\":\"\\\\vec{\\\\varnothing}\",\"⦲\":\"\\\\dot{\\\\varnothing}\",\"⦱\":\"\\\\overline{\\\\varnothing}\",\"⦰\":\"\\\\varnothing\",\"⦯\":\"\\\\measuredangle\",\"⦮\":\"\\\\measuredangle\",\"⦭\":\"\\\\measuredangle\",\"⦬\":\"\\\\measuredangle\",\"⦫\":\"\\\\measuredangle\",\"⦪\":\"\\\\measuredangle\",\"⦩\":\"\\\\measuredangle\",\"⦨\":\"\\\\measuredangle\",\"⦧\":\"\",\"⦦\":\"\",\"⦥\":\"\",\"⦤\":\"\",\"⦣\":\"\\\\ulcorner\",\"⦢\":\"\\\\measuredangle\",\"⦡\":\"\\\\not\\\\lor\",\"⦠\":\"\\\\bcancel{>}\",\"⦂\":\":\",\"⦁\":\"\\\\cdot\",\"❘\":\"\\\\mid\",\"▲\":\"\\\\bigtriangleup\",\"⋿\":\"\\\\Epsilon\",\"⋾\":\"\\\\overline{\\\\ni}\",\"⋽\":\"\\\\overline{\\\\ni}\",\"⋼\":\"\\\\in\",\"⋻\":\"\\\\in\",\"⋺\":\"\\\\in\",\"⋹\":\"\\\\underline{\\\\in}\",\"⋸\":\"\\\\underline{\\\\in}\",\"⋷\":\"\\\\overline{\\\\in}\",\"⋶\":\"\\\\overline{\\\\in}\",\"⋵\":\"\\\\dot{\\\\in}\",\"⋴\":\"\\\\in\",\"⋳\":\"\\\\in\",\"⋲\":\"\\\\in\",\"⋰\":\"\\\\ddots\",\"։\":\":\",\"⋩\":\"\\\\underset{\\\\sim}{\\\\succ}\",\"⋨\":\"\\\\underset{\\\\sim}{\\\\prec}\",\"⋧\":\"\\\\underset{\\\\not\\\\sim}{>}\",\"⋦\":\"\\\\underset{\\\\not\\\\sim}{<}\",\"⋥\":\"\\\\not\\\\sqsupseteq\",\"⋤\":\"\\\\not\\\\sqsubseteq\",\"⋣\":\"\\\\not\\\\sqsupseteq\",\"⋢\":\"\\\\not\\\\sqsubseteq\",\"⋡\":\"\\\\nsucc\",\"⋠\":\"\\\\nprec\",\"⋟\":\"\\\\succ\",\"⋞\":\"\\\\prec\",\"⋝\":\"\\\\overline{>}\",\"⋜\":\"\\\\overline{<}\",\"⋛\":\"\\\\underset{>}{\\\\leq}\",\"⋚\":\"\\\\underset{<}{\\\\geq}\",\"⋕\":\"\\\\#\",\"⋓\":\"\\\\cup\",\"⋒\":\"\\\\cap\",\"⋑\":\"\\\\supset\",\"⋐\":\"\\\\subset\",\"⋏\":\"\\\\wedge\",\"⋎\":\"\\\\vee\",\"⋍\":\"\\\\simeq\",\"⋈\":\"\\\\Join\",\"⋇\":\"\\\\ast\",\"⋆\":\"\\\\star\",\"⋄\":\"\\\\diamond\",\"⊿\":\"\\\\triangle\",\"⊾\":\"\\\\measuredangle\",\"⊽\":\"\\\\overline{\\\\lor}\",\"⊼\":\"\\\\overline{\\\\land}\",\"⊻\":\"\\\\underline{\\\\lor}\",\"⊺\":\"\\\\top\",土:\"\\\\pm\",十:\"+\",\"⊹\":\"\",\"⊷\":\"\\\\circ\\\\multimap\",\"⊶\":\"\\\\circ\\\\multimap\",\"⊳\":\"\\\\triangleright\",\"⊲\":\"\\\\triangleleft\",\"⊱\":\"\\\\succ\",\"⊰\":\"\\\\prec\",\"⊫\":\"|\\\\models\",\"⊪\":\"|\\\\models\",\"⊧\":\"\\\\models\",\"⊦\":\"\\\\vdash\",\"⊝\":\"\\\\ominus\",\"⊜\":\"\\\\ominus\",\"⊛\":\"\\\\odot\",\"⊚\":\"\\\\odot\",\"⊔\":\"\\\\sqcup\",\"⊓\":\"\\\\sqcap\",\"⊒\":\"\\\\sqsupseteq\",\"⊑\":\"\\\\sqsubseteq\",\"⊐̸\":\"\\\\not\\\\sqsupset\",\"⊐\":\"\\\\sqsupset\",\"⊏̸\":\"\\\\not\\\\sqsubset\",\"⊏\":\"\\\\sqsubset\",\"⊎\":\"\\\\cup\",\"⊍\":\"\\\\cup\",\"⊌\":\"\\\\cup\",\"≿̸\":\"\\\\not\\\\succsim\",\"≿\":\"\\\\succsim\",\"≾\":\"\\\\precsim\",\"≹\":\"\\\\not\\\\overset{>}{<}\",\"≸\":\"\\\\not\\\\overset{>}{<}\",\"≷\":\"\\\\overset{>}{<}\",\"≶\":\"\\\\overset{<}{>}\",\"≵\":\"\\\\not\\\\geg\",\"≴\":\"\\\\not\\\\leq\",\"≳\":\"\\\\geg\",\"≲\":\"\\\\leq\",\"≬\":\"\",\"≧\":\"\\\\geg\",\"≦̸\":\"\\\\not\\\\leq\",\"≦\":\"\\\\leq\",\"≣\":\"\\\\overset{=}{=} \",\"≞\":\"\\\\overset{m}{=} \",\"≝\":\"\\\\overset{def}{=}\",\"≘\":\"=\",\"≖\":\"=\",\"≕\":\"=:\",\"≓\":\"\\\\doteq\",\"≒\":\"\\\\doteq\",\"≑\":\"\\\\doteq\",\"≐\":\"\\\\doteq\",\"≏̸\":\"\",\"≏\":\"\",\"≎̸\":\"\",\"≎\":\"\",\"≌\":\"\\\\approx\",\"≋\":\"\\\\approx\",\"≊\":\"\\\\approx\",\"≂̸\":\"\\\\neq\",\"≂\":\"=\",\"∿\":\"\\\\sim\",\"∾\":\"\\\\infty\",\"∽̱\":\"\\\\sim\",\"∽\":\"\\\\sim\",\"∻\":\"\\\\sim\",\"∺\":\":-:\",\"∹\":\"-:\",\"∸\":\"\\\\bot\",\"∷\":\"::\",\"∶\":\":\",\"∣\":\"\\\\mid\",\"∟\":\"\\\\llcorner\",\"∘\":\"\\\\circ\",\"∗\":\"*\",\"∕\":\"/\",\"∎\":\"\\\\square\",\"∍\":\"\\\\ni\",\"∊\":\"\\\\in\",\"∆\":\"\\\\Delta\",\"⁄\":\"/\",\"⪰̸\":\"\\\\nsucceq\",\"⪰\":\"\\\\succeq\",\"⪯̸\":\"\\\\npreceq\",\"⪯\":\"\\\\preceq\",\"⪈\":\"\\\\ngeqslant\",\"⪇\":\"\\\\nleqslant\",\"⧳\":\"\\\\Phi\",\"⧦\":\"\\\\models\",\"⧥\":\"\\\\not\\\\equiv\",\"⧤\":\"\\\\approx\\\\neq\",\"⧣\":\"\\\\neq\",\"⧁\":\"\\\\circle\",\"⧀\":\"\\\\circle\",\"◦\":\"\\\\circle\",\"◗\":\"\\\\circle\",\"◖\":\"\\\\circle\",\"●\":\"\\\\circle\",\"◎\":\"\\\\circledcirc\",\"◍\":\"\\\\circledcirc\",\"◌\":\"\\\\circledcirc\",\"◉\":\"\\\\circledcirc\",\"◈\":\"\\\\diamond\",\"◇\":\"\\\\diamond\",\"◆\":\"\\\\diamond\",\"◅\":\"\\\\triangleleft\",\"◄\":\"\\\\triangleleft\",\"◃\":\"\\\\triangleleft\",\"◂\":\"\\\\triangleleft\",\"◁\":\"\\\\triangleleft\",\"◀\":\"\\\\triangleleft\",\"▿\":\"\\\\triangledown\",\"▾\":\"\\\\triangledown\",\"▽\":\"\\\\triangledown\",\"▼\":\"\\\\triangledown\",\"▹\":\"\\\\triangleright\",\"▸\":\"\\\\triangleright\",\"▷\":\"\\\\triangleright\",\"▶\":\"\\\\triangleright\",\"▵\":\"\\\\triangle\",\"▴\":\"\\\\triangle\",\"△\":\"\\\\triangle\",\"▱\":\"\\\\square\",\"▰\":\"\\\\blacksquare\",\"▯\":\"\\\\square\",\"▮\":\"\\\\blacksquare\",\"▭\":\"\\\\square\",\"▫\":\"\\\\square\",\"▪\":\"\\\\square\",\"□\":\"\\\\square\",\"■\":\"\\\\blacksquare\",\"⋭\":\"\\\\not\\\\triangleright\",\"⋬\":\"\\\\not\\\\triangleleft\",\"⋫\":\"\\\\not\\\\triangleright\",\"⋪\":\"\\\\not\\\\triangleleft\",\"⋙\":\"\\\\ggg\",\"⋘\":\"\\\\lll\",\"⋗\":\"*>\",\"⋖\":\"<*\",\"⋔\":\"\\\\pitchfork\",\"⋌\":\"\",\"⋋\":\"\\\\bowtie\",\"⋊\":\"\\\\ltimes\",\"⋉\":\"\\\\rtimes\",\"⊵\":\"\\\\triangleright\",\"\\\\triangleleft\":\"\",\"⊥\":\"\\\\bot\",\"⊁\":\"\\\\nsucc\",\"⊀\":\"\\\\preceq\",\"≽\":\"\\\\succeq\",\"≼\":\"\\\\preceq\",\"≻\":\"\\\\succ\",\"≺\":\"\\\\prec\",\"≱\":\"\\\\geq/\",\"≰\":\"\\\\leq/\",\"≭\":\"\\\\neq\",\"≫̸\":\"\\\\not\\\\gg\",\"≫\":\"\\\\gg\",\"≪̸\":\"\\\\not\\\\ll\",\"≪\":\"\\\\ll\",\"≩\":\"\\\\ngeqslant\",\"≨\":\"\\\\nleqslant\",\"≡\":\"\\\\equiv\",\"≟\":\"\\\\doteq\",\"≜\":\"\\\\triangleq\",\"≛\":\"\\\\doteq\",\"≚\":\"\\\\triangleq\",\"≙\":\"\\\\triangleq\",\"≗\":\"\\\\doteq\",\"≔\":\":=\",\"≍\":\"\\\\asymp\",\"≇\":\"\\\\ncong\",\"≆\":\"\\\\ncong\",\"≅\":\"\\\\cong\",\"≄\":\"\\\\not\\\\simeq\",\"≃\":\"\\\\simeq\",\"≁\":\"\\\\not\\\\sim\",\"∦\":\"\\\\not\\\\parallel\",\"∥\":\"\\\\parallel\",\"∤\":\"\\\\not|\",\"∝\":\"\\\\propto\",\"==\":\"==\",\"=\":\"=\",\":=\":\":=\",\"/=\":\"=\",\"-=\":\"-=\",\"+=\":\"+=\",\"*=\":\"*=\",\"!=\":\"!=\",\"≠\":\"\\\\neq\",\"≢\":\"\\\\equiv /\",\"≉\":\"\\\\approx /\",\"∼\":\"sim\",\"≈\":\"\\\\approx\",\"≮\":\"</\",\"<\":\"<\",\"≯\":\">/\",\">=\":\">=\",\">\":\">\",\"≥\":\"\\\\geq\",\"≤\":\"\\\\leq\",\"<=\":\"<=\",\"⊋\":\"\\\\supsetneq\",\"⊊\":\"\\\\subsetneq\",\"⊉\":\"\\\\nsupseteq\",\"⊈\":\"\\\\nsubseteq\",\"⊇\":\"\\\\supseteq\",\"⊆\":\"\\\\subseteq\",\"⊅\":\"\\\\not\\\\supset\",\"⊄\":\"\\\\not\\\\subset\",\"⊃⃒\":\"\\\\supset |\",\"⊃\":\"\\\\supset\",\"⊂⃒\":\"\\\\subset |\",\"⊂\":\"\\\\subset\",\"∌\":\"\\\\not\\\\in\",\"∉\":\"\\\\notin\",\"∈\":\"\\\\in\",\"∁\":\"C\",\"∄\":\"\\\\nexists\",\"∃\":\"\\\\exists\",\"∀\":\"\\\\forall\",\"∧\":\"\\\\land\",\"&&\":\"\\\\&\\\\&\",\"∨\":\"\\\\lor\",\"⊯\":\"\\\\cancel{\\\\vDash}\",\"⊮\":\"\\\\cancel{\\\\Vdash}\",\"⊭\":\"\\\\nvDash\",\"⊬\":\"\\\\nvDash\",\"⊩\":\"\\\\Vdash\",\"⊨\":\"\\\\vDash\",\"⊤\":\"\\\\top\",\"⊣\":\"\\\\dashv\",\"⊢\":\"\\\\vdash\",\"∋\":\"\\\\ni\",\"⋱\":\"\\\\ddots\",\"⋯\":\"\\\\hdots\",\"⋮\":\"\\\\vdots\",\"϶\":\"\\\\ni\",\":\":\":\",\"...\":\"\\\\cdots\",\"..\":\"..\",\"->\":\"->\",\"∵\":\"\\\\because\",\"∴\":\"\\\\therefore \",\"\":\"\\\\llbracket\",\",\":\",\",\";\":\";\",\"⧽\":\"\\\\}\",\"⧼\":\"\\\\{\",\"⦘\":\"\\\\]\",\"⦗\":\"\\\\[\",\"⦖\":\"\\\\ll\",\"⦕\":\"\\\\gg\",\"⦔\":\"\\\\gg\",\"⦓\":\"\\\\ll\",\"⦒\":\"\\\\gg\",\"⦑\":\"\\\\ll\",\"⦐\":\"\\\\]\",\"⦏\":\"\\\\]\",\"⦎\":\"\\\\]\",\"⦍\":\"\\\\[\",\"⦌\":\"\\\\[\",\"⦋\":\"\\\\]\",\"⦊\":\"\\\\triangleright\",\"⦉\":\"\\\\triangleleft\",\"⦈\":\"|\\\\)\",\"⦇\":\"\\\\(|\",\"⦆\":\"|\\\\)\",\"⦅\":\"\\\\(\\\\(\",\"⦄\":\"|\\\\}\",\"⦃\":\"\\\\{|\",\"⦀\":\"\\\\||\",\"⟯\":\"\\\\left. \\\\right]\",\"⟮\":\"\\\\left[ \\\\right.\",\"⟭\":\"\\\\left. \\\\right]]\",\"⟬\":\"\\\\left[[ \\\\right.\",\"⟫\":\"\\\\gg\",\"⟪\":\"\\\\ll\",\"⟧\":\"\\\\)|\",\"⟦\":\"\\\\(|\",\"❳\":\"\\\\left.\\\\right)\",\"❲\":\"\\\\left(\\\\right.\",\"〉\":\"\\\\rangle\",\"〈\":\"\\\\langle\",\"⌋\":\"\\\\rfloor\",\"⌊\":\"\\\\lfloor\",\"⌉\":\"\\\\rceil\",\"⌈\":\"\\\\lceil\",\"‖\":\"\\\\parallel\",\"}\":\"\\\\left.\\\\right}\",\"{\":\"\\\\left{\\\\right.\",\"]\":\"\\\\left]\\\\right.\",\"[\":\"\\\\left[\\\\right.\",\")\":\"\\\\left.\\\\right)\",\"(\":\"\\\\left(\\\\right.\",\"”\":'\\\\\"',\"“\":\"\\\\text{``}\",\"’\":\"'\",\"‘\":\"`\",α:\"\\\\alpha\",β:\"\\\\beta\",γ:\"\\\\gamma\",Γ:\"\\\\Gamma\",δ:\"\\\\delta\",Δ:\"\\\\Delta\",ϵ:\"\\\\epsilon\",ζ:\"\\\\zeta\",η:\"\\\\eta\",θ:\"\\\\theta\",Θ:\"\\\\Theta\",ι:\"\\\\iota\",κ:\"\\\\kappa\",λ:\"\\\\lambda\",ν:\"\\\\nu\",ο:\"\\\\omicron\",π:\"\\\\pi\",Π:\"\\\\Pi\",ρ:\"\\\\rho\",σ:\"\\\\sigma\",Σ:\"\\\\Sigma\",τ:\"\\\\tau\",υ:\"\\\\upsilon\",Υ:\"\\\\Upsilon\",ϕ:\"\\\\phi\",Φ:\"\\\\Phi\",χ:\"\\\\chi\",ψ:\"\\\\psi\",Ψ:\"\\\\Psi\",ω:\"\\\\omega\",Ω:\"\\\\Omega\",Ω:\"\\\\Omega\",\"∅\":\"\\\\emptyset\",\"⟲\":\"\\\\circlearrowleft\",\"⟳\":\"\\\\circlearrowright\",\"×\":\"\\\\times\",\"½\":\"\\\\dfrac{1}{2}\",μ:\"\\\\mu\",Ө:\"\\\\theta\",\"✓\":\"\\\\checkmark\",\"⟩\":\"\\\\rangle\",\"⟨\":\"\\\\langle\",\"¼\":\"\\\\dfrac{1}{4}\",\"…\":\"\\\\ldots\",ℏ:\"\\\\hbar\",ℜ:\"\\\\mathfrak{R}\",Ѳ:\"\\\\theta\",Ø:\"\\\\emptyset\",ϱ:\"\\\\varrho\",ф:\"\\\\phi\",ℇ:\"\\\\varepsilon\",T:\"T\",\"∙\":\"\\\\cdot\",Ρ:\"P\",\"∞\":\"\\\\infty\",ᐁ:\"\\\\nabla\",ƞ:\"\\\\eta\",\"⁺\":\"^{+}\",\"⁻\":\"^{-}\",\"⁼\":\"^{=}\",\"⁽\":\"^{(}\",\"⁾\":\"^{)}\",\"〗\":\"\\\\)|\",\"〖\":\"\\\\langle\",\";\":\";\",\"൦\":\"\\\\circ\",\"┴\":\"\\\\perp\",\"✕\":\"\\\\times\",\"⎻\":\"-\",\"»\":\"\\\\gg\",\"⬆\":\"\\\\uparrow\",\"⬇\":\"\\\\downarrow\",\"⬅\":\"\\\\leftarrow\",\"➡\":\"\\\\rightarrow\",\"⎼\":\"-\",\"⎜\":\"\\\\mid\",\"⎥\":\"\\\\mid\",ħ:\"\\\\hbar\",\"⮕\":\"\\\\rightarrow\",\"・\":\"\\\\cdot\",\"¦\":\"\\\\mid\",\"£\":\"\\\\pounds\",\"¥\":\"\\\\yen\",\"✗\":\"\\\\times\",\"✔\":\"\\\\checkmark\",ⁿ:\"^{n}\",\"«\":\"\\\\ll\",เ:\"\\\\prime\",\"†\":\"\\\\dagger\",\"│\":\"\\\\mid\",$:\"\\\\$\",\"#\":\"\\\\#\",\"℃\":\"\\\\text{\\\\textdegree C}\",\"℉\":\"\\\\text{\\\\textdegree F}\",\"█\":\"\\\\blacksquare\",\"℧\":\"\\\\mho\",ⅇ:\"\\\\text{e}\",ɼ:\"r\",\"‡\":\"\\\\ddagger\",ἱ:\"i\",ϒ:\"\\\\Upsilon\",𝛿:\"\\\\delta\",\"˳\":\"\\\\cdot\",ѳ:\"\\\\theta\",𝜙:\"\\\\phi\",П:\"\\\\prod\",о:\"o\",ђ:\"\\\\hbar\",Ʌ:\"\\\\Lambda\",\"।\":\"\\\\mid\",\"€\":\"\\\\euro\",ῡ:\"\\\\bar{u}\",φ:\"\\\\varphi\",ȼ:\"c\",𝞮:\"\\\\epsilon\",Χ:\"\\\\mathsf{X}\",ₙ:\"_{n}\"}},8249:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.allMathSymbolsByChar=void 0,t.allMathSymbolsByChar={\" \":\"\\\\textrm{ }\",\"∃\":\"\\\\exists\",\"∀\":\"\\\\forall\",\"⇔\":\"\\\\iff\",\"⇒\":\"=>\",\"¬\":\"\\\\neg\",\"ℤ\":\"\\\\mathbb{Z}\",\"ℝ\":\"\\\\mathbb{R}\",\"ℚ\":\"\\\\mathbb{Q}\",\"ℕ\":\"\\\\mathbb{N}\",\"ℂ\":\"CC\",\"□\":\"\\\\square\",\"⋄\":\"\\\\diamond\",\"△\":\"\\\\triangle\",\"⌢\":\"\\\\frown\",\"∠\":\"\\\\angle\",\"⋱\":\"\\\\ddots\",\"⋮\":\"\\\\vdots\",\"∵\":\"\\\\because\",\"∴\":\"\\\\therefore\",\"ℵ\":\"\\\\aleph\",\"∅\":\"\\\\oslash\",\"±\":\"\\\\pm\",\"∇\":\"\\\\nabla\",\"∂\":\"\\\\partial\",\"∮\":\"\\\\oint\",\"∫\":\"\\\\int\",\"⋃\":\"\\\\cup\",\"∪\":\"\\\\cup\",\"⋂\":\"\\\\cap\",\"∩\":\"\\\\cap\",\"⋁\":\"\\\\vee\",\"∨\":\"\\\\vee\",\"⋀\":\"\\\\wedge\",\"∧\":\"\\\\wedge\",\"∏\":\"\\\\prod\",\"∑\":\"\\\\sum\",\"⊙\":\"\\\\bigodot\",\"⊗\":\"\\\\bigoplus\",\"⊕\":\"o+\",\"∘\":\"@\",\"⋈\":\"\\\\bowtie\",\"⋊\":\"\\\\rtimes\",\"⋉\":\"\\\\ltimes\",\"÷\":\"\\\\div\",\"×\":\"\\\\times\",\"\\\\\":\"\\\\backslash\",\"⋆\":\"\\\\star\",\"∗\":\"\\\\star\",\"⋅\":\"\\\\cdot\",\"Ω\":\"\\\\Omega\",\"ω\":\"\\\\omega\",\"Ψ\":\"\\\\Psi\",\"ψ\":\"\\\\psi\",\"χ\":\"\\\\chi\",\"φ\":\"\\\\varphi\",\"Φ\":\"\\\\Phi\",\"ϕ\":\"\\\\phi\",\"υ\":\"\\\\upsilon\",\"τ\":\"\\\\tau\",\"Σ\":\"\\\\Sigma\",\"σ\":\"\\\\sigma\",\"ρ\":\"\\\\rho\",\"Π\":\"\\\\Pi\",\"π\":\"\\\\pi\",\"Ξ\":\"\\\\Xi\",\"ξ\":\"\\\\xi\",\"ν\":\"\\\\nu\",\"μ\":\"\\\\mu\",\"Λ\":\"\\\\Lambda\",\"λ\":\"\\\\lambda\",\"κ\":\"\\\\kappa\",\"ι\":\"\\\\iota\",\"ϑ\":\"\\\\vartheta\",\"Θ\":\"\\\\Theta\",\"θ\":\"\\\\theta\",\"η\":\"\\\\eta\",\"ζ\":\"\\\\zeta\",\"ɛ\":\"\\\\varepsilon\",\"ε\":\"\\\\epsilon\",\"Δ\":\"\\\\Delta\",\"δ\":\"\\\\delta\",\"Γ\":\"\\\\Gamma\",\"γ\":\"\\\\gamma\",\"β\":\"\\\\beta\",\"α\":\"\\\\alpha\",\"∞\":\"\\\\infty\",\"\":\"\\\\text{\\\\textdir TRT}\",\"\":\"\\\\text{\\\\textdir LTR}\"}},8171:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.allMathSymbolsByGlyph=void 0,t.allMathSymbolsByGlyph={\" \":\"\\\\textrm{ }\",\"∃\":\"\\\\exists\",\"∀\":\"\\\\forall\",\"⇔\":\"\\\\iff\",\"⇒\":\"\\\\Rightarrow\",\"¬\":\"\\\\neg\",\"□\":\"\\\\square\",\"⋄\":\"\\\\diamond\",\"△\":\"\\\\triangle\",\"⌢\":\"\\\\frown\",\"∠\":\"\\\\angle\",\"⋱\":\"\\\\ddots\",\"⋮\":\"\\\\vdots\",\"∵\":\"\\\\because\",\"∴\":\"\\\\therefore\",ℵ:\"\\\\aleph\",\"∅\":\"\\\\emptyset\",\"±\":\"\\\\pm\",\"∇\":\"\\\\nabla\",\"∂\":\"\\\\partial\",\"∮\":\"\\\\oint\",\"∫\":\"\\\\int\",\"⋃\":\"\\\\cup\",\"∪\":\"\\\\cup\",\"⋂\":\"\\\\cap\",\"∩\":\"\\\\cap\",\"⋁\":\"\\\\vee\",\"∨\":\"\\\\vee\",\"⋀\":\"\\\\wedge\",\"∧\":\"\\\\wedge\",\"∏\":\"\\\\prod\",\"∑\":\"\\\\sum\",\"⊙\":\"\\\\bigodot\",\"⊗\":\"\\\\bigoplus\",\"⊕\":\"o+\",\"∘\":\"@\",\"⋈\":\"\\\\bowtie\",\"⋊\":\"\\\\rtimes\",\"⋉\":\"\\\\ltimes\",\"÷\":\"\\\\div\",\"×\":\"\\\\times\",\"\\\\\":\"\\\\backslash\",\"⋆\":\"\\\\star\",\"∗\":\"\\\\star\",\"⋅\":\"\\\\cdot\",Ω:\"\\\\Omega\",ω:\"\\\\omega\",Ψ:\"\\\\Psi\",ψ:\"\\\\psi\",χ:\"\\\\chi\",φ:\"\\\\varphi\",Φ:\"\\\\Phi\",ϕ:\"\\\\phi\",υ:\"\\\\upsilon\",τ:\"\\\\tau\",Σ:\"\\\\Sigma\",σ:\"\\\\sigma\",ρ:\"\\\\rho\",Π:\"\\\\Pi\",π:\"\\\\pi\",Ξ:\"\\\\Xi\",ξ:\"\\\\xi\",ν:\"\\\\nu\",μ:\"\\\\mu\",Λ:\"\\\\Lambda\",λ:\"\\\\lambda\",κ:\"\\\\kappa\",ι:\"\\\\iota\",ϑ:\"\\\\vartheta\",Θ:\"\\\\Theta\",θ:\"\\\\theta\",η:\"\\\\eta\",ζ:\"\\\\zeta\",ɛ:\"\\\\varepsilon\",ε:\"\\\\epsilon\",Δ:\"\\\\Delta\",δ:\"\\\\delta\",Γ:\"\\\\Gamma\",γ:\"\\\\gamma\",β:\"\\\\beta\",α:\"\\\\alpha\",\"∞\":\"\\\\infty\",ϵ:\"\\\\epsilon\",µ:\"\\\\mu\",\"²\":\"^{2}\",ı:\"\\\\imath\",\"∎\":\"\\\\blacksquare\",ม:\"\\\\mathbf{m}\",Ω:\"\\\\Omega\",\"⟲\":\"\\\\circlearrowleft\",\"⟳\":\"\\\\circlearrowright\",त:\" \",\"¥\":\"\\\\yen\",\"⁽\":\"^{(}\",\"⁾\":\"^{)}\",ß:\"\\\\ss\",Ћ:\"\\\\hbar\",\"⦵\":\"\\\\ominus\",\"⊿\":\"\\\\bigtriangleup\",\"↛'\":\"\\\\nrightarrow\",\"†\":\"\\\\dagger\",เ:\"\\\\prime\",白:\" \",\"⿱\":\" \",ℸ:\"\\\\wp\",퓰:\" \",ⁿ:\"^{n}\",\"✔\":\"\\\\checkmark\",\"✗\":\"\\\\times\",\"½\":\"\\\\dfrac{1}{2}\",Ө:\"\\\\theta\",\"✓\":\"\\\\checkmark\",\"⟩\":\"\\\\rangle\",\"⟨\":\"\\\\langle\",\"〈\":\"\\\\langle\",\"¼\":\"\\\\dfrac{1}{4}\",\"…\":\"\\\\ldots\",ℏ:\"\\\\hbar\",ℜ:\"\\\\mathfrak{R}\",Ѳ:\"\\\\theta\",Ø:\"\\\\emptyset\",ϱ:\"\\\\varrho\",ф:\"\\\\phi\",T:\"T\",\"∙\":\"\\\\cdot\",Ρ:\"P\",ᐁ:\"\\\\nabla\",ƞ:\"\\\\eta\",ɣ:\"\\\\gamma\",ћ:\"\\\\hbar\",Ɛ:\"\\\\varepsilon\",ⅅ:\"\\\\_{D}\",𝜆:\"\\\\lambda\",\"〗\":\"\\\\rangle\",\"〖\":\"\\\\langle\",\";\":\";\",𝑥:\"x\",𝑦:\"y\",𝑧:\"z\",𝑖:\"i\",𝑗:\"j\",𝑘:\"k\",𝑚:\"m\",𝑒:\"e\",𝑟:\"r\",ɳ:\"\\\\eta\",𝛽:\"\\\\beta\",\"⍵\":\"\\\\omega\",℘:\"\\\\wp\",𝜋:\"\\\\pi\",Є:\"\\\\epsilon\",є:\"\\\\epsilon\",𝜀:\"\\\\epsilon\",п:\"\\\\pi\",Ν:\"\\\\nu\",ɵ:\"\\\\theta\",𝜓:\"\\\\psi\",ϴ:\"\\\\theta\",ɸ:\"\\\\phi\",Ӷ:\"\\\\Gamma\",ɭ:\"\\\\ell\",ʋ:\"\\\\upsilon\",𝛟:\"\\\\varphi\",\"⍬\":\"\\\\theta\",Ф:\"\\\\Phi\",𝜑:\"\\\\varphi\",ⅈ:\"i\",ο:\"o\",ơ:\"o\",ƒ:\"f\",\"⍴\":\"\\\\rho\",\"🇽\":\"x\",𝑝:\"p\",𝑞:\"q\",𝑠:\"s\",𝑡:\"t\",𝑢:\"u\",𝑣:\"v\",𝑤:\"w\",𝑎:\"a\",𝑏:\"b\",𝑐:\"c\",𝑑:\"d\",𝑓:\"f\",𝑔:\"g\",𝑙:\"l\",𝑛:\"n\",𝑜:\"o\",𝔀:\"w\",𝚟:\"v\",ṁ:\"m\",\"൦\":\"\\\\circ\",\"┴\":\"\\\\perp\",\"✕\":\"\\\\times\",\"∣\":\"\\\\mid\",Փ:\"\\\\Phi\",\"⎜\":\"\\\\mid\",ħ:\"\\\\hbar\",ፈ:\" \",\"⦨\":\"\\\\llbracket\",ế:\"\\\\hat{e}\",\"¢\":\"\\\\cent\",\"⤹\":\"\\\\downarrow\",\"⤸\":\"\\\\downarrow\",\"⤷\":\"\\\\Rsh\",\"⤶\":\"\\\\Lsh\",\"⤵\":\"\\\\downarrow\",\"⤴\":\"\\\\uparrow\",\"⤳\":\"\\\\rightarrow\",\"|\":\"\\\\mid\",\"⎥\":\"\\\\mid\",\"♥\":\"\\\\heartsuit\",О:\"0\",Υ:\"Y\",х:\"x\",𝓏:\"z\",𝓎:\"y\",𝓍:\"x\",р:\"p\",а:\"a\",\"£\":\"\\\\pounds\",m:\"m\",𝚵:\"\\\\Xi\",\"⓪\":\"\\\\textcircled{0}\",\"①\":\"\\\\textcircled{1}\",\"②\":\"\\\\textcircled{2}\",\"③\":\"\\\\textcircled{3}\",\"④\":\"\\\\textcircled{4}\",\"⑤\":\"\\\\textcircled{5}\",\"⑥\":\"\\\\textcircled{6}\",\"⑦\":\"\\\\textcircled{7}\",\"⑧\":\"\\\\textcircled{8}\",\"⑨\":\"\\\\textcircled{9}\",\"⑩\":\"\\\\textcircled{10}\",\"⑪\":\"\\\\textcircled{11}\",\"⑫\":\"\\\\textcircled{12}\",\"⑬\":\"\\\\textcircled{13}\",\"⑭\":\"\\\\textcircled{14}\",\"⑮\":\"\\\\textcircled{15}\",\"⑯\":\"\\\\textcircled{16}\",\"⑰\":\"\\\\textcircled{17}\",\"⑱\":\"\\\\textcircled{18}\",\"⑲\":\"\\\\textcircled{19}\",\"⑳\":\"\\\\textcircled{20}\",\"㉑\":\"\\\\textcircled{21}\",\"㉒\":\"\\\\textcircled{22}\",\"㉓\":\"\\\\textcircled{23}\",\"㉔\":\"\\\\textcircled{24}\",\"㉕\":\"\\\\textcircled{25}\",\"㉖\":\"\\\\textcircled{26}\",\"㉗\":\"\\\\textcircled{27}\",\"㉘\":\"\\\\textcircled{28}\",\"㉙\":\"\\\\textcircled{29}\",\"㉚\":\"\\\\textcircled{30}\",\"㉛\":\"\\\\textcircled{31}\",\"㉜\":\"\\\\textcircled{32}\",\"㉝\":\"\\\\textcircled{33}\",\"㉞\":\"\\\\textcircled{34}\",\"㉟\":\"\\\\textcircled{35}\",\"㊱\":\"\\\\textcircled{36}\",\"㊲\":\"\\\\textcircled{37}\",\"㊳\":\"\\\\textcircled{38}\",\"㊴\":\"\\\\textcircled{39}\",\"㊵\":\"\\\\textcircled{40}\",\"㊶\":\"\\\\textcircled{41}\",\"㊷\":\"\\\\textcircled{42}\",\"㊸\":\"\\\\textcircled{43}\",\"㊹\":\"\\\\textcircled{44}\",\"㊺\":\"\\\\textcircled{45}\",\"㊻\":\"\\\\textcircled{46}\",\"㊼\":\"\\\\textcircled{47}\",\"㊽\":\"\\\\textcircled{48}\",\"㊾\":\"\\\\textcircled{49}\",\"㊿\":\"\\\\textcircled{50}\",\"&\":\"\\\\&\",\"‖\":\"\\\\parallel\",\"%\":\"\\\\%\",\"“\":\"\\\\text{``}\",$:\"\\\\$\",\"#\":\"\\\\#\",\"℃\":\"\\\\text{\\\\textdegree C}\",\"℉\":\"\\\\text{\\\\textdegree F}\",\"█\":\"\\\\blacksquare\",\"℧\":\"\\\\mho\",\"⌋\":\"\\\\rfloor\",\"⌊\":\"\\\\lfloor\",\"⌉\":\"\\\\rceil\",\"⌈\":\"\\\\lceil\",ℇ:\"\\\\varepsilon\",ⅇ:\"\\\\text{e}\",ɼ:\"r\",\"↛\":\"\\\\nrightarrow\",ˆ:\"\\\\hat{}\",\"‾\":\"\\\\overline\",\"→\":\"\\\\rightarrow\",\"‡\":\"\\\\ddagger\",\"・\":\"\\\\cdot\",\"▱\":\"\\\\square\",\"∆\":\"\\\\Delta\",ἱ:\"i\",\"∡\":\"\\\\angle\",ϒ:\"\\\\Upsilon\",\"↓\":\"\\\\downarrow\",\"↑\":\"\\\\uparrow\",\"»\":\"\\\\gg\",\"⊤\":\"\\\\top\",\"⧸\":\"/\",𝛿:\"\\\\delta\",\"˳\":\"\\\\cdot\",\"։\":\":\",\"⦪\":\"\\\\measuredangle\",\"⦩\":\"\\\\measuredangle\",\"⦫\":\"\\\\measuredangle\",\"⦁\":\"\\\\cdot\",ѳ:\"\\\\theta\",\"⦢\":\"\\\\measuredangle\",\"¸\":\",\",\"⎻\":\"\\\\overline\",\"⟦\":\"\\\\llbracket\",𝜙:\"\\\\phi\",П:\"\\\\prod\",о:\"o\",\"≈\":\"\\\\approx\",\"≤\":\"\\\\leq\",ђ:\"\\\\hbar\",Ʌ:\"\\\\Lambda\",土:\"\\\\pm\",\"⎼\":\"-\",十:\"+\",\"≠\":\"\\\\neq\",\"←\":\"\\\\leftarrow\",\"।\":\"\\\\mid\",\"€\":\"\\\\euro\",\"˘\":\" \",ῡ:\"\\\\bar{u}\",\"∥\":\"\\\\parallel\",\"↔\":\"\\\\leftrightarrow\",\"√\":\"\\\\sqrt{}\",ȼ:\"c\",𝞮:\"\\\\epsilon\",\"·\":\"\\\\cdot\",\"⦬\":\"\\\\measuredangle\",\"⦮\":\"\\\\measuredangle\",\"⦭\":\"\\\\measuredangle\",\"«\":\"\\\\ll\",Χ:\"\\\\mathsf{X}\",\"│\":\"\\\\mid\",\"〉\":\"\\\\rangle\",ₙ:\"_{n}\",\"▫\":\"\\\\square\",\"●\":\"\\\\circle\",\"”\":'\\\\\"'}},5406:function(e,t,r){\"use strict\";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!(\"get\"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,n)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)\"default\"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,\"__esModule\",{value:!0}),n(r(2965),t),n(r(9039),t),n(r(8249),t),n(r(8171),t),n(r(472),t),n(r(4320),t),n(r(6122),t)},472:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.latexAccents=void 0,t.latexAccents=[\"\\\\hat\",\"\\\\bar\",\"\\\\underbrace\",\"\\\\overbrace\"]},4320:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.mathNumberByGlyph=void 0,t.mathNumberByGlyph={\"₀\":\"_{0}\",\"₁\":\"_{1}\",\"₂\":\"_{2}\",\"₃\":\"_{3}\",\"₄\":\"_{4}\",\"₅\":\"_{5}\",\"₆\":\"_{6}\",\"₇\":\"_{7}\",\"₈\":\"_{8}\",\"₉\":\"_{9}\",\"⁰\":\"^{0}\",\"¹\":\"^{1}\",\"²\":\"^{2}\",\"³\":\"^{3}\",\"⁴\":\"^{4}\",\"⁵\":\"^{5}\",\"⁶\":\"^{6}\",\"⁷\":\"^{7}\",\"⁸\":\"^{8}\",\"⁹\":\"^{9}\",ⁿ:\"^{n}\",ₙ:\"_{n}\",\"⓪\":\"\\\\textcircled{0}\",\"①\":\"\\\\textcircled{1}\",\"②\":\"\\\\textcircled{2}\",\"③\":\"\\\\textcircled{3}\",\"④\":\"\\\\textcircled{4}\",\"⑤\":\"\\\\textcircled{5}\",\"⑥\":\"\\\\textcircled{6}\",\"⑦\":\"\\\\textcircled{7}\",\"⑧\":\"\\\\textcircled{8}\",\"⑨\":\"\\\\textcircled{9}\",\"⑩\":\"\\\\textcircled{10}\",\"⑪\":\"\\\\textcircled{11}\",\"⑫\":\"\\\\textcircled{12}\",\"⑬\":\"\\\\textcircled{13}\",\"⑭\":\"\\\\textcircled{14}\",\"⑮\":\"\\\\textcircled{15}\",\"⑯\":\"\\\\textcircled{16}\",\"⑰\":\"\\\\textcircled{17}\",\"⑱\":\"\\\\textcircled{18}\",\"⑲\":\"\\\\textcircled{19}\",\"⑳\":\"\\\\textcircled{20}\",\"㉑\":\"\\\\textcircled{21}\",\"㉒\":\"\\\\textcircled{22}\",\"㉓\":\"\\\\textcircled{23}\",\"㉔\":\"\\\\textcircled{24}\",\"㉕\":\"\\\\textcircled{25}\",\"㉖\":\"\\\\textcircled{26}\",\"㉗\":\"\\\\textcircled{27}\",\"㉘\":\"\\\\textcircled{28}\",\"㉙\":\"\\\\textcircled{29}\",\"㉚\":\"\\\\textcircled{30}\",\"㉛\":\"\\\\textcircled{31}\",\"㉜\":\"\\\\textcircled{32}\",\"㉝\":\"\\\\textcircled{33}\",\"㉞\":\"\\\\textcircled{34}\",\"㉟\":\"\\\\textcircled{35}\",\"㊱\":\"\\\\textcircled{36}\",\"㊲\":\"\\\\textcircled{37}\",\"㊳\":\"\\\\textcircled{38}\",\"㊴\":\"\\\\textcircled{39}\",\"㊵\":\"\\\\textcircled{40}\",\"㊶\":\"\\\\textcircled{41}\",\"㊷\":\"\\\\textcircled{42}\",\"㊸\":\"\\\\textcircled{43}\",\"㊹\":\"\\\\textcircled{44}\",\"㊺\":\"\\\\textcircled{45}\",\"㊻\":\"\\\\textcircled{46}\",\"㊼\":\"\\\\textcircled{47}\",\"㊽\":\"\\\\textcircled{48}\",\"㊾\":\"\\\\textcircled{49}\",\"㊿\":\"\\\\textcircled{50}\",\"½\":\"\\\\dfrac{1}{2}\",\"⅓\":\"\\\\dfrac{1}{3}\",\"⅔\":\"\\\\dfrac{2}{3}\",\"¼\":\"\\\\dfrac{1}{4}\",\"¾\":\"\\\\dfrac{3}{4}\",\"⅕\":\"\\\\dfrac{1}{5}\",\"⅖\":\"\\\\dfrac{2}{5}\",\"⅗\":\"\\\\dfrac{3}{5}\",\"⅘\":\"\\\\dfrac{4}{5}\",\"⅙\":\"\\\\dfrac{1}{6}\",\"⅚\":\"\\\\dfrac{5}{6}\",\"⅐\":\"\\\\dfrac{1}{7}\",\"⅛\":\"\\\\dfrac{1}{8}\",\"⅜\":\"\\\\dfrac{3}{8}\",\"⅝\":\"\\\\dfrac{5}{8}\",\"⅞\":\"\\\\dfrac{7}{8}\",\"⅑\":\"\\\\dfrac{1}{9}\",\"⅒\":\"\\\\dfrac{1}{10}\"}},6122:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.HashUTF8ToLtXConverter=void 0,t.HashUTF8ToLtXConverter=class{convert(e){if(e.match(/[a-z0-9]/i))return e;const t=r[e];if(t){return this.convertAccentCharToLtX(t)||e}return this.convertSpecialCharToLtX(e)||e}convertAccentCharToLtX(e){const{char:t,accent:r}=e,n=a[r];return n?`\\\\${n}{${t}}`:null}convertSpecialCharToLtX(e){const t=n[e];if(!t)return null;const{letter:r,fontCmd:a}=t;return`\\\\${a}{${r}}`}};const r={á:{char:\"a\",accent:\"´\"},à:{char:\"a\",accent:\"`\"},â:{char:\"a\",accent:\"^\"},ã:{char:\"a\",accent:\"~\"},ä:{char:\"a\",accent:\"¨\"},å:{char:\"a\",accent:\"˚\"},ą:{char:\"a\",accent:\"˙\"},ă:{char:\"a\",accent:\"˘\"},ǎ:{char:\"a\",accent:\"ˇ\"},ǟ:{char:\"a\",accent:\"ˆ\"},ǻ:{char:\"a\",accent:\"˙\"},ǡ:{char:\"a\",accent:\"-\"},ā:{char:\"a\",accent:\"-\"},é:{char:\"e\",accent:\"´\"},è:{char:\"e\",accent:\"`\"},ê:{char:\"e\",accent:\"^\"},ë:{char:\"e\",accent:\"¨\"},ę:{char:\"e\",accent:\"˙\"},ě:{char:\"e\",accent:\"ˇ\"},ȇ:{char:\"i\",accent:\"^\"},ё:{char:\"e\",accent:\"¨\"},ē:{char:\"e\",accent:\"-\"},í:{char:\"i\",accent:\"´\"},ì:{char:\"i\",accent:\"`\"},î:{char:\"i\",accent:\"^\"},ï:{char:\"i\",accent:\"¨\"},į:{char:\"i\",accent:\"˙\"},ǐ:{char:\"i\",accent:\"ˇ\"},ȉ:{char:\"i\",accent:\"`\"},ȋ:{char:\"i\",accent:\"¨\"},ī:{char:\"i\",accent:\"-\"},ó:{char:\"o\",accent:\"´\"},ò:{char:\"o\",accent:\"`\"},ô:{char:\"o\",accent:\"^\"},õ:{char:\"o\",accent:\"~\"},ö:{char:\"o\",accent:\"¨\"},ő:{char:\"o\",accent:\"˝\"},ǒ:{char:\"o\",accent:\"ˇ\"},ȍ:{char:\"o\",accent:\"`\"},ȏ:{char:\"o\",accent:\"¨\"},ȫ:{char:\"o\",accent:\"˘\"},ȭ:{char:\"o\",accent:\"˝\"},ȯ:{char:\"o\",accent:\"˙\"},ō:{char:\"o\",accent:\"-\"},ú:{char:\"u\",accent:\"´\"},ù:{char:\"u\",accent:\"`\"},û:{char:\"u\",accent:\"^\"},ü:{char:\"u\",accent:\"¨\"},ű:{char:\"u\",accent:\"˝\"},ǔ:{char:\"u\",accent:\"ˇ\"},ǖ:{char:\"u\",accent:\"¨\"},ǘ:{char:\"u\",accent:\"¨\"},ǚ:{char:\"u\",accent:\"¨\"},ǜ:{char:\"u\",accent:\"¨\"},ȕ:{char:\"u\",accent:\"`\"},ȗ:{char:\"u\",accent:\"¨\"},ū:{char:\"u\",accent:\"-\"},ý:{char:\"y\",accent:\"´\"},ỳ:{char:\"y\",accent:\"`\"},ŷ:{char:\"y\",accent:\"^\"},ÿ:{char:\"y\",accent:\"¨\"},ȳ:{char:\"y\",accent:\"-\"},Á:{char:\"A\",accent:\"´\"},À:{char:\"A\",accent:\"`\"},Â:{char:\"A\",accent:\"^\"},Ã:{char:\"A\",accent:\"~\"},Ä:{char:\"A\",accent:\"¨\"},Å:{char:\"A\",accent:\"˚\"},Å:{char:\"A\",accent:\"˚\"},Ȧ:{char:\"A\",accent:\"˙\"},Ă:{char:\"A\",accent:\"˘\"},Ǎ:{char:\"A\",accent:\"ˇ\"},Ǟ:{char:\"A\",accent:\"˝\"},Ǻ:{char:\"A\",accent:\"˚\"},Ǡ:{char:\"A\",accent:\"-\"},Ā:{char:\"A\",accent:\"-\"},É:{char:\"E\",accent:\"´\"},È:{char:\"E\",accent:\"`\"},Ė:{char:\"E\",accent:\"˙\"},Ê:{char:\"E\",accent:\"^\"},Ë:{char:\"E\",accent:\"¨\"},Ě:{char:\"E\",accent:\"ˇ\"},Ȅ:{char:\"E\",accent:\"`\"},Ȇ:{char:\"E\",accent:\"¨\"},Ē:{char:\"E\",accent:\"-\"},Í:{char:\"I\",accent:\"´\"},Ì:{char:\"I\",accent:\"`\"},Î:{char:\"I\",accent:\"^\"},Ï:{char:\"I\",accent:\"¨\"},Ĭ:{char:\"I\",accent:\"˘\"},Ǐ:{char:\"I\",accent:\"ˇ\"},Ȉ:{char:\"I\",accent:\"`\"},Ȋ:{char:\"I\",accent:\"¨\"},Ī:{char:\"I\",accent:\"-\"},Ó:{char:\"O\",accent:\"´\"},Ò:{char:\"O\",accent:\"`\"},Ô:{char:\"O\",accent:\"^\"},Õ:{char:\"O\",accent:\"~\"},Ö:{char:\"O\",accent:\"¨\"},Ő:{char:\"O\",accent:\"˝\"},Ǒ:{char:\"O\",accent:\"ˇ\"},Ȍ:{char:\"O\",accent:\"`\"},Ȏ:{char:\"O\",accent:\"¨\"},Ȫ:{char:\"O\",accent:\"˘\"},Ȭ:{char:\"O\",accent:\"˝\"},Ȯ:{char:\"O\",accent:\"˙\"},Ō:{char:\"O\",accent:\"-\"},Ú:{char:\"U\",accent:\"´\"},Ù:{char:\"U\",accent:\"`\"},Û:{char:\"U\",accent:\"^\"},Ü:{char:\"U\",accent:\"¨\"},Ű:{char:\"U\",accent:\"˝\"},Ǔ:{char:\"U\",accent:\"ˇ\"},Ǖ:{char:\"U\",accent:\"¨\"},Ȕ:{char:\"U\",accent:\"`\"},Ȗ:{char:\"U\",accent:\"¨\"},Ū:{char:\"U\",accent:\"-\"},Ý:{char:\"Y\",accent:\"´\"},Ỳ:{char:\"Y\",accent:\"`\"},Ŷ:{char:\"Y\",accent:\"^\"},Ÿ:{char:\"Y\",accent:\"¨\"},Ȳ:{char:\"Y\",accent:\"-\"},ñ:{char:\"n\",accent:\"~\"},Ñ:{char:\"N\",accent:\"~\"},ç:{char:\"c\",accent:\"˙\"},Ç:{char:\"C\",accent:\"˙\"},ṽ:{char:\"v\",accent:\"~\"},Ṽ:{char:\"V\",accent:\"~\"},ĵ:{char:\"j\",accent:\"^\"},Ĵ:{char:\"J\",accent:\"^\"},ź:{char:\"z\",accent:\"´\"},Ź:{char:\"Z\",accent:\"´\"},Ż:{char:\"Z\",accent:\"^\"},ż:{char:\"z\",accent:\"^\"},Ž:{char:\"Z\",accent:\"ˇ\"},ž:{char:\"z\",accent:\"ˇ\"},ẑ:{char:\"z\",accent:\"ˆ\"}},a={\"´\":\"grave\",\"`\":\"acute\",\"^\":\"hat\",\"~\":\"tilde\",\"¨\":\"ddot\",\"˚\":\"mathring\",\"˘\":\"breve\",ˇ:\"check\",\"˝\":\"ddot\",\"˙\":\"dot\",\"-\":\"bar\",ˆ:\"hat\",\"˜\":\"tilde\"},n={𝐀:{letter:\"A\",fontCmd:\"mathbf\"},𝐁:{letter:\"B\",fontCmd:\"mathbf\"},𝐂:{letter:\"C\",fontCmd:\"mathbf\"},𝐃:{letter:\"D\",fontCmd:\"mathbf\"},𝐄:{letter:\"E\",fontCmd:\"mathbf\"},Ε:{letter:\"E\",fontCmd:\"mathbf\"},𝐅:{letter:\"F\",fontCmd:\"mathbf\"},𝐆:{letter:\"G\",fontCmd:\"mathbf\"},𝐇:{letter:\"H\",fontCmd:\"mathbf\"},𝐈:{letter:\"I\",fontCmd:\"mathbf\"},𝐉:{letter:\"J\",fontCmd:\"mathbf\"},𝐊:{letter:\"K\",fontCmd:\"mathbf\"},𝐋:{letter:\"L\",fontCmd:\"mathbf\"},𝐌:{letter:\"M\",fontCmd:\"mathbf\"},𝐍:{letter:\"N\",fontCmd:\"mathbf\"},𝐎:{letter:\"O\",fontCmd:\"mathbf\"},𝐏:{letter:\"P\",fontCmd:\"mathbf\"},𝐐:{letter:\"Q\",fontCmd:\"mathbf\"},𝐑:{letter:\"R\",fontCmd:\"mathbf\"},𝐒:{letter:\"S\",fontCmd:\"mathbf\"},𝐓:{letter:\"T\",fontCmd:\"mathbf\"},𝐔:{letter:\"U\",fontCmd:\"mathbf\"},𝐕:{letter:\"V\",fontCmd:\"mathbf\"},𝐖:{letter:\"W\",fontCmd:\"mathbf\"},𝐗:{letter:\"X\",fontCmd:\"mathbf\"},𝞆:{letter:\"X\",fontCmd:\"mathbf\"},𝐘:{letter:\"Y\",fontCmd:\"mathbf\"},𝐙:{letter:\"Z\",fontCmd:\"mathbf\"},\"𝟎\":{letter:\"0\",fontCmd:\"mathbf\"},\"𝟏\":{letter:\"1\",fontCmd:\"mathbf\"},\"𝟐\":{letter:\"2\",fontCmd:\"mathbf\"},\"𝟑\":{letter:\"3\",fontCmd:\"mathbf\"},\"𝟒\":{letter:\"4\",fontCmd:\"mathbf\"},\"𝟓\":{letter:\"5\",fontCmd:\"mathbf\"},\"𝟔\":{letter:\"6\",fontCmd:\"mathbf\"},\"𝟕\":{letter:\"7\",fontCmd:\"mathbf\"},\"𝟖\":{letter:\"8\",fontCmd:\"mathbf\"},\"𝟗\":{letter:\"9\",fontCmd:\"mathbf\"},𝐴:{letter:\"A\",fontCmd:\"mathit\"},𝐵:{letter:\"B\",fontCmd:\"mathit\"},𝐶:{letter:\"C\",fontCmd:\"mathit\"},𝐷:{letter:\"D\",fontCmd:\"mathit\"},𝐸:{letter:\"E\",fontCmd:\"mathit\"},𝐹:{letter:\"F\",fontCmd:\"mathit\"},𝐺:{letter:\"G\",fontCmd:\"mathit\"},𝐻:{letter:\"H\",fontCmd:\"mathit\"},𝐼:{letter:\"I\",fontCmd:\"mathit\"},Ι:{letter:\"I\",fontCmd:\"mathit\"},𝐽:{letter:\"J\",fontCmd:\"mathit\"},𝐾:{letter:\"K\",fontCmd:\"mathit\"},𝐿:{letter:\"L\",fontCmd:\"mathit\"},𝑀:{letter:\"M\",fontCmd:\"mathit\"},𝑁:{letter:\"N\",fontCmd:\"mathit\"},𝑂:{letter:\"O\",fontCmd:\"mathit\"},𝑃:{letter:\"P\",fontCmd:\"mathit\"},𝑄:{letter:\"Q\",fontCmd:\"mathit\"},𝑅:{letter:\"R\",fontCmd:\"mathit\"},𝑆:{letter:\"S\",fontCmd:\"mathit\"},𝑇:{letter:\"T\",fontCmd:\"mathit\"},𝑈:{letter:\"U\",fontCmd:\"mathit\"},𝑉:{letter:\"V\",fontCmd:\"mathit\"},𝑊:{letter:\"W\",fontCmd:\"mathit\"},𝑋:{letter:\"X\",fontCmd:\"mathit\"},𝑌:{letter:\"Y\",fontCmd:\"mathit\"},𝑍:{letter:\"Z\",fontCmd:\"mathit\"},𝔸:{letter:\"A\",fontCmd:\"mathbb\"},𝔹:{letter:\"B\",fontCmd:\"mathbb\"},ℂ:{letter:\"C\",fontCmd:\"mathbb\"},𝔻:{letter:\"D\",fontCmd:\"mathbb\"},𝔼:{letter:\"E\",fontCmd:\"mathbb\"},𝔽:{letter:\"F\",fontCmd:\"mathbb\"},𝔾:{letter:\"G\",fontCmd:\"mathbb\"},ℍ:{letter:\"H\",fontCmd:\"mathbb\"},𝕀:{letter:\"I\",fontCmd:\"mathbb\"},𝕁:{letter:\"J\",fontCmd:\"mathbb\"},𝕂:{letter:\"K\",fontCmd:\"mathbb\"},𝕃:{letter:\"L\",fontCmd:\"mathbb\"},𝕄:{letter:\"M\",fontCmd:\"mathbb\"},ℕ:{letter:\"N\",fontCmd:\"mathbb\"},𝕆:{letter:\"O\",fontCmd:\"mathbb\"},ℙ:{letter:\"P\",fontCmd:\"mathbb\"},ℚ:{letter:\"Q\",fontCmd:\"mathbb\"},ℝ:{letter:\"R\",fontCmd:\"mathbb\"},𝕊:{letter:\"S\",fontCmd:\"mathbb\"},𝕋:{letter:\"T\",fontCmd:\"mathbb\"},𝕌:{letter:\"U\",fontCmd:\"mathbb\"},𝕍:{letter:\"V\",fontCmd:\"mathbb\"},𝕎:{letter:\"W\",fontCmd:\"mathbb\"},𝕏:{letter:\"X\",fontCmd:\"mathbb\"},𝕐:{letter:\"Y\",fontCmd:\"mathbb\"},ℤ:{letter:\"Z\",fontCmd:\"mathbb\"},\"𝟘\":{letter:\"0\",fontCmd:\"mathbb\"},\"𝟙\":{letter:\"1\",fontCmd:\"mathbb\"},\"𝟚\":{letter:\"2\",fontCmd:\"mathbb\"},\"𝟛\":{letter:\"3\",fontCmd:\"mathbb\"},\"𝟜\":{letter:\"4\",fontCmd:\"mathbb\"},\"𝟝\":{letter:\"5\",fontCmd:\"mathbb\"},\"𝟞\":{letter:\"6\",fontCmd:\"mathbb\"},\"𝟟\":{letter:\"7\",fontCmd:\"mathbb\"},\"𝟠\":{letter:\"8\",fontCmd:\"mathbb\"},\"𝟡\":{letter:\"9\",fontCmd:\"mathbb\"},𝒜:{letter:\"A\",fontCmd:\"mathcal\"},𝓐:{letter:\"A\",fontCmd:\"mathcal\"},ℬ:{letter:\"B\",fontCmd:\"mathcal\"},𝒞:{letter:\"C\",fontCmd:\"mathcal\"},𝒟:{letter:\"D\",fontCmd:\"mathcal\"},𝓓:{letter:\"D\",fontCmd:\"mathcal\"},ℰ:{letter:\"E\",fontCmd:\"mathcal\"},ℱ:{letter:\"F\",fontCmd:\"mathcal\"},𝓕:{letter:\"F\",fontCmd:\"mathcal\"},𝒢:{letter:\"G\",fontCmd:\"mathcal\"},ℋ:{letter:\"H\",fontCmd:\"mathcal\"},ℐ:{letter:\"I\",fontCmd:\"mathcal\"},𝒥:{letter:\"J\",fontCmd:\"mathcal\"},𝒦:{letter:\"K\",fontCmd:\"mathcal\"},ℒ:{letter:\"L\",fontCmd:\"mathcal\"},𝓛:{letter:\"L\",fontCmd:\"mathcal\"},ℳ:{letter:\"M\",fontCmd:\"mathcal\"},𝒩:{letter:\"N\",fontCmd:\"mathcal\"},𝒪:{letter:\"O\",fontCmd:\"mathcal\"},𝓞:{letter:\"O\",fontCmd:\"mathcal\"},𝒫:{letter:\"P\",fontCmd:\"mathcal\"},𝒬:{letter:\"Q\",fontCmd:\"mathcal\"},ℛ:{letter:\"R\",fontCmd:\"mathcal\"},𝕽:{letter:\"R\",fontCmd:\"mathcal\"},\"℟\":{letter:\"R\",fontCmd:\"mathcal\"},𝒮:{letter:\"S\",fontCmd:\"mathcal\"},𝒯:{letter:\"T\",fontCmd:\"mathcal\"},𝒰:{letter:\"U\",fontCmd:\"mathcal\"},𝒱:{letter:\"V\",fontCmd:\"mathcal\"},𝒲:{letter:\"W\",fontCmd:\"mathcal\"},𝒳:{letter:\"X\",fontCmd:\"mathcal\"},𝒴:{letter:\"Y\",fontCmd:\"mathcal\"},𝒵:{letter:\"Z\",fontCmd:\"mathcal\"},𝔄:{letter:\"A\",fontCmd:\"mathfrak\"},𝔅:{letter:\"B\",fontCmd:\"mathfrak\"},ℭ:{letter:\"C\",fontCmd:\"mathfrak\"},𝔇:{letter:\"D\",fontCmd:\"mathfrak\"},𝔈:{letter:\"E\",fontCmd:\"mathfrak\"},𝔉:{letter:\"F\",fontCmd:\"mathfrak\"},𝔊:{letter:\"G\",fontCmd:\"mathfrak\"},ℌ:{letter:\"H\",fontCmd:\"mathfrak\"},ℑ:{letter:\"I\",fontCmd:\"mathfrak\"},𝔍:{letter:\"J\",fontCmd:\"mathfrak\"},𝔎:{letter:\"K\",fontCmd:\"mathfrak\"},𝔏:{letter:\"L\",fontCmd:\"mathfrak\"},𝔐:{letter:\"M\",fontCmd:\"mathfrak\"},𝔑:{letter:\"N\",fontCmd:\"mathfrak\"},𝔒:{letter:\"O\",fontCmd:\"mathfrak\"},𝔓:{letter:\"P\",fontCmd:\"mathfrak\"},𝔔:{letter:\"Q\",fontCmd:\"mathfrak\"},ℜ:{letter:\"R\",fontCmd:\"mathfrak\"},𝔖:{letter:\"S\",fontCmd:\"mathfrak\"},𝔗:{letter:\"T\",fontCmd:\"mathfrak\"},𝔘:{letter:\"U\",fontCmd:\"mathfrak\"},𝔙:{letter:\"V\",fontCmd:\"mathfrak\"},𝔚:{letter:\"W\",fontCmd:\"mathfrak\"},𝔛:{letter:\"X\",fontCmd:\"mathfrak\"},𝔜:{letter:\"Y\",fontCmd:\"mathfrak\"},ℨ:{letter:\"Z\",fontCmd:\"mathfrak\"},𝖠:{letter:\"A\",fontCmd:\"mathsf\"},Α:{letter:\"A\",fontCmd:\"mathsf\"},𝖡:{letter:\"B\",fontCmd:\"mathsf\"},Β:{letter:\"B\",fontCmd:\"mathsf\"},𝖢:{letter:\"C\",fontCmd:\"mathsf\"},𝖣:{letter:\"D\",fontCmd:\"mathsf\"},𝖤:{letter:\"E\",fontCmd:\"mathsf\"},𝖥:{letter:\"F\",fontCmd:\"mathsf\"},𝖦:{letter:\"G\",fontCmd:\"mathsf\"},𝖧:{letter:\"H\",fontCmd:\"mathsf\"},𝖨:{letter:\"I\",fontCmd:\"mathsf\"},𝖩:{letter:\"J\",fontCmd:\"mathsf\"},ȷ:{letter:\"J\",fontCmd:\"mathsf\"},𝖪:{letter:\"K\",fontCmd:\"mathsf\"},Κ:{letter:\"K\",fontCmd:\"mathsf\"},𝖫:{letter:\"L\",fontCmd:\"mathsf\"},𝖬:{letter:\"M\",fontCmd:\"mathsf\"},𝖭:{letter:\"N\",fontCmd:\"mathsf\"},𝖮:{letter:\"O\",fontCmd:\"mathsf\"},𝖯:{letter:\"P\",fontCmd:\"mathsf\"},𝖰:{letter:\"Q\",fontCmd:\"mathsf\"},𝖱:{letter:\"R\",fontCmd:\"mathsf\"},𝖲:{letter:\"S\",fontCmd:\"mathsf\"},𝖳:{letter:\"T\",fontCmd:\"mathsf\"},𝖴:{letter:\"U\",fontCmd:\"mathsf\"},𝖵:{letter:\"V\",fontCmd:\"mathsf\"},𝖶:{letter:\"W\",fontCmd:\"mathsf\"},𝖷:{letter:\"X\",fontCmd:\"mathsf\"},Χ:{letter:\"X\",fontCmd:\"mathsf\"},𝖸:{letter:\"Y\",fontCmd:\"mathsf\"},𝖹:{letter:\"Z\",fontCmd:\"mathsf\"},𝚨:{letter:\"A\",fontCmd:\"mathtt\"},𝚩:{letter:\"B\",fontCmd:\"mathtt\"},𝚪:{letter:\"\\\\Gamma\",fontCmd:\"mathtt\"},𝚫:{letter:\"\\\\Delta\",fontCmd:\"mathtt\"},𝚬:{letter:\"E\",fontCmd:\"mathtt\"},𝚭:{letter:\"F\",fontCmd:\"mathtt\"},𝚮:{letter:\"G\",fontCmd:\"mathtt\"},𝚯:{letter:\"\\\\Theta\",fontCmd:\"mathtt\"},𝚰:{letter:\"I\",fontCmd:\"mathtt\"},𝚱:{letter:\"J\",fontCmd:\"mathtt\"},𝚲:{letter:\"\\\\Lambda\",fontCmd:\"mathtt\"},𝚳:{letter:\"L\",fontCmd:\"mathtt\"},𝚴:{letter:\"M\",fontCmd:\"mathtt\"},𝚵:{letter:\"\\\\Pi\",fontCmd:\"mathtt\"},𝚶:{letter:\"O\",fontCmd:\"mathtt\"},𝚷:{letter:\"\\\\Pi\",fontCmd:\"mathtt\"},𝚸:{letter:\"Q\",fontCmd:\"mathtt\"},𝚹:{letter:\"R\",fontCmd:\"mathtt\"},𝚺:{letter:\"S\",fontCmd:\"mathtt\"},𝚻:{letter:\"T\",fontCmd:\"mathtt\"},𝚼:{letter:\"U\",fontCmd:\"mathtt\"},𝚽:{letter:\"\\\\Phi\",fontCmd:\"mathtt\"},𝚾:{letter:\"W\",fontCmd:\"mathtt\"},𝚿:{letter:\"\\\\Psi\",fontCmd:\"mathtt\"},𝛀:{letter:\"\\\\Omega\",fontCmd:\"mathtt\"}}}},t={};function r(a){var n=t[a];if(void 0!==n)return n.exports;var o=t[a]={exports:{}};return e[a].call(o.exports,o,o.exports,r),o.exports}var a={};return(()=>{\"use strict\";var e=a;Object.defineProperty(e,\"__esModule\",{value:!0}),e.MathMLToLaTeX=void 0;var t=r(8672);Object.defineProperty(e,\"MathMLToLaTeX\",{enumerable:!0,get:function(){return t.MathMLToLaTeX}})})(),a})()));\n//# sourceMappingURL=bundle.min.js.map","'use strict';\n\n/**\n * This is the ParseError class, which is the main error thrown by Temml\n * functions when something has gone wrong. This is used to distinguish internal\n * errors from errors in the expression that the user provided.\n *\n * If possible, a caller should provide a Token or ParseNode with information\n * about where in the source string the problem occurred.\n */\nclass ParseError {\n constructor(\n message, // The error message\n token // An object providing position information\n ) {\n let error = \" \" + message;\n let start;\n\n const loc = token && token.loc;\n if (loc && loc.start <= loc.end) {\n // If we have the input and a position, make the error a bit fancier\n\n // Get the input\n const input = loc.lexer.input;\n\n // Prepend some information\n start = loc.start;\n const end = loc.end;\n if (start === input.length) {\n error += \" at end of input: \";\n } else {\n error += \" at position \" + (start + 1) + \": \\n\";\n }\n\n // Underline token in question using combining underscores\n const underlined = input.slice(start, end).replace(/[^]/g, \"$&\\u0332\");\n\n // Extract some context from the input and add it to the error\n let left;\n if (start > 15) {\n left = \"…\" + input.slice(start - 15, start);\n } else {\n left = input.slice(0, start);\n }\n let right;\n if (end + 15 < input.length) {\n right = input.slice(end, end + 15) + \"…\";\n } else {\n right = input.slice(end);\n }\n error += left + underlined + right;\n }\n\n // Some hackery to make ParseError a prototype of Error\n // See http://stackoverflow.com/a/8460753\n const self = new Error(error);\n self.name = \"ParseError\";\n self.__proto__ = ParseError.prototype;\n self.position = start;\n return self;\n }\n}\n\nParseError.prototype.__proto__ = Error.prototype;\n\n//\n/**\n * This file contains a list of utility functions which are useful in other\n * files.\n */\n\n/**\n * Provide a default value if a setting is undefined\n */\nconst deflt = function(setting, defaultIfUndefined) {\n return setting === undefined ? defaultIfUndefined : setting;\n};\n\n// hyphenate and escape adapted from Facebook's React under Apache 2 license\n\nconst uppercase = /([A-Z])/g;\nconst hyphenate = function(str) {\n return str.replace(uppercase, \"-$1\").toLowerCase();\n};\n\nconst ESCAPE_LOOKUP = {\n \"&\": \"&\",\n \">\": \">\",\n \"<\": \"<\",\n '\"': \""\",\n \"'\": \"'\"\n};\n\nconst ESCAPE_REGEX = /[&><\"']/g;\n\n/**\n * Escapes text to prevent scripting attacks.\n */\nfunction escape(text) {\n return String(text).replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]);\n}\n\n/**\n * Sometimes we want to pull out the innermost element of a group. In most\n * cases, this will just be the group itself, but when ordgroups and colors have\n * a single element, we want to pull that out.\n */\nconst getBaseElem = function(group) {\n if (group.type === \"ordgroup\") {\n if (group.body.length === 1) {\n return getBaseElem(group.body[0]);\n } else {\n return group;\n }\n } else if (group.type === \"color\") {\n if (group.body.length === 1) {\n return getBaseElem(group.body[0]);\n } else {\n return group;\n }\n } else if (group.type === \"font\") {\n return getBaseElem(group.body);\n } else {\n return group;\n }\n};\n\n/**\n * TeXbook algorithms often reference \"character boxes\", which are simply groups\n * with a single character in them. To decide if something is a character box,\n * we find its innermost group, and see if it is a single character.\n */\nconst isCharacterBox = function(group) {\n const baseElem = getBaseElem(group);\n\n // These are all the types of groups which hold single characters\n return baseElem.type === \"mathord\" || baseElem.type === \"textord\" || baseElem.type === \"atom\"\n};\n\nconst assert = function(value) {\n if (!value) {\n throw new Error(\"Expected non-null, but got \" + String(value));\n }\n return value;\n};\n\n/**\n * Return the protocol of a URL, or \"_relative\" if the URL does not specify a\n * protocol (and thus is relative), or `null` if URL has invalid protocol\n * (so should be outright rejected).\n */\nconst protocolFromUrl = function(url) {\n // Check for possible leading protocol.\n // https://url.spec.whatwg.org/#url-parsing strips leading whitespace\n // (\\x00) or C0 control (\\x00-\\x1F) characters.\n // eslint-disable-next-line no-control-regex\n const protocol = /^[\\x00-\\x20]*([^\\\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(url);\n if (!protocol) {\n return \"_relative\";\n }\n // Reject weird colons\n if (protocol[2] !== \":\") {\n return null;\n }\n // Reject invalid characters in scheme according to\n // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1\n if (!/^[a-zA-Z][a-zA-Z0-9+\\-.]*$/.test(protocol[1])) {\n return null;\n }\n // Lowercase the protocol\n return protocol[1].toLowerCase();\n};\n\n/**\n * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. The TeXbook\n * gives an acceptable rounding error of 100sp (which would be the nearest\n * 1/6551.6em with our ptPerEm = 10):\n * http://www.ctex.org/documents/shredder/src/texbook.pdf#page=69\n */\nconst round = function(n) {\n return +n.toFixed(4);\n};\n\nvar utils = {\n deflt,\n escape,\n hyphenate,\n getBaseElem,\n isCharacterBox,\n protocolFromUrl,\n round\n};\n\n/**\n * This is a module for storing settings passed into Temml. It correctly handles\n * default settings.\n */\n\n\n/**\n * The main Settings object\n */\nclass Settings {\n constructor(options) {\n // allow null options\n options = options || {};\n this.displayMode = utils.deflt(options.displayMode, false); // boolean\n this.annotate = utils.deflt(options.annotate, false); // boolean\n this.leqno = utils.deflt(options.leqno, false); // boolean\n this.throwOnError = utils.deflt(options.throwOnError, false); // boolean\n this.errorColor = utils.deflt(options.errorColor, \"#b22222\"); // string\n this.macros = options.macros || {};\n this.wrap = utils.deflt(options.wrap, \"tex\"); // \"tex\" | \"=\"\n this.xml = utils.deflt(options.xml, false); // boolean\n this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false); // booelean\n this.strict = utils.deflt(options.strict, false); // boolean\n this.trust = utils.deflt(options.trust, false); // trust context. See html.js.\n this.maxSize = (options.maxSize === undefined\n ? [Infinity, Infinity]\n : Array.isArray(options.maxSize)\n ? options.maxSize\n : [Infinity, Infinity]\n );\n this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000)); // number\n }\n\n /**\n * Check whether to test potentially dangerous input, and return\n * `true` (trusted) or `false` (untrusted). The sole argument `context`\n * should be an object with `command` field specifying the relevant LaTeX\n * command (as a string starting with `\\`), and any other arguments, etc.\n * If `context` has a `url` field, a `protocol` field will automatically\n * get added by this function (changing the specified object).\n */\n isTrusted(context) {\n if (context.url && !context.protocol) {\n const protocol = utils.protocolFromUrl(context.url);\n if (protocol == null) {\n return false\n }\n context.protocol = protocol;\n }\n const trust = typeof this.trust === \"function\" ? this.trust(context) : this.trust;\n return Boolean(trust);\n }\n}\n\n/**\n * All registered functions.\n * `functions.js` just exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary.\n */\nconst _functions = {};\n\n/**\n * All MathML builders. Should be only used in the `define*` and the `build*ML`\n * functions.\n */\nconst _mathmlGroupBuilders = {};\n\nfunction defineFunction({\n type,\n names,\n props,\n handler,\n mathmlBuilder\n}) {\n // Set default values of functions\n const data = {\n type,\n numArgs: props.numArgs,\n argTypes: props.argTypes,\n allowedInArgument: !!props.allowedInArgument,\n allowedInText: !!props.allowedInText,\n allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath,\n numOptionalArgs: props.numOptionalArgs || 0,\n infix: !!props.infix,\n primitive: !!props.primitive,\n handler: handler\n };\n for (let i = 0; i < names.length; ++i) {\n _functions[names[i]] = data;\n }\n if (type) {\n if (mathmlBuilder) {\n _mathmlGroupBuilders[type] = mathmlBuilder;\n }\n }\n}\n\n/**\n * Use this to register only the MathML builder for a function(e.g.\n * if the function's ParseNode is generated in Parser.js rather than via a\n * stand-alone handler provided to `defineFunction`).\n */\nfunction defineFunctionBuilders({ type, mathmlBuilder }) {\n defineFunction({\n type,\n names: [],\n props: { numArgs: 0 },\n handler() {\n throw new Error(\"Should never be called.\")\n },\n mathmlBuilder\n });\n}\n\nconst normalizeArgument = function(arg) {\n return arg.type === \"ordgroup\" && arg.body.length === 1 ? arg.body[0] : arg\n};\n\n// Since the corresponding buildMathML function expects a\n// list of elements, we normalize for different kinds of arguments\nconst ordargument = function(arg) {\n return arg.type === \"ordgroup\" ? arg.body : [arg]\n};\n\n/**\n * This node represents a document fragment, which contains elements, but when\n * placed into the DOM doesn't have any representation itself. It only contains\n * children and doesn't have any DOM node properties.\n */\nclass DocumentFragment {\n constructor(children) {\n this.children = children;\n this.classes = [];\n this.style = {};\n }\n\n hasClass(className) {\n return this.classes.includes(className);\n }\n\n /** Convert the fragment into a node. */\n toNode() {\n const frag = document.createDocumentFragment();\n\n for (let i = 0; i < this.children.length; i++) {\n frag.appendChild(this.children[i].toNode());\n }\n\n return frag;\n }\n\n /** Convert the fragment into HTML markup. */\n toMarkup() {\n let markup = \"\";\n\n // Simply concatenate the markup for the children together.\n for (let i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n return markup;\n }\n\n /**\n * Converts the math node into a string, similar to innerText. Applies to\n * MathDomNode's only.\n */\n toText() {\n // To avoid this, we would subclass documentFragment separately for\n // MathML, but polyfills for subclassing is expensive per PR 1469.\n const toText = (child) => child.toText();\n return this.children.map(toText).join(\"\");\n }\n}\n\n/**\n * These objects store the data about the DOM nodes we create, as well as some\n * extra data. They can then be transformed into real DOM nodes with the\n * `toNode` function or HTML markup using `toMarkup`. They are useful for both\n * storing extra properties on the nodes, as well as providing a way to easily\n * work with the DOM.\n *\n * Similar functions for working with MathML nodes exist in mathMLTree.js.\n *\n */\n\n/**\n * Create an HTML className based on a list of classes. In addition to joining\n * with spaces, we also remove empty classes.\n */\nconst createClass = function(classes) {\n return classes.filter((cls) => cls).join(\" \");\n};\n\nconst initNode = function(classes, style) {\n this.classes = classes || [];\n this.attributes = {};\n this.style = style || {};\n};\n\n/**\n * Convert into an HTML node\n */\nconst toNode = function(tagName) {\n const node = document.createElement(tagName);\n\n // Apply the class\n node.className = createClass(this.classes);\n\n // Apply inline styles\n for (const style in this.style) {\n if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n node.style[style] = this.style[style];\n }\n }\n\n // Apply attributes\n for (const attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) {\n node.setAttribute(attr, this.attributes[attr]);\n }\n }\n\n // Append the children, also as HTML nodes\n for (let i = 0; i < this.children.length; i++) {\n node.appendChild(this.children[i].toNode());\n }\n\n return node;\n};\n\n/**\n * Convert into an HTML markup string\n */\nconst toMarkup = function(tagName) {\n let markup = `<${tagName}`;\n\n // Add the class\n if (this.classes.length) {\n markup += ` class=\"${utils.escape(createClass(this.classes))}\"`;\n }\n\n let styles = \"\";\n\n // Add the styles, after hyphenation\n for (const style in this.style) {\n if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n styles += `${utils.hyphenate(style)}:${this.style[style]};`;\n }\n }\n\n if (styles) {\n markup += ` style=\"${styles}\"`;\n }\n\n // Add the attributes\n for (const attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) {\n markup += ` ${attr}=\"${utils.escape(this.attributes[attr])}\"`;\n }\n }\n\n markup += \">\";\n\n // Add the markup of the children, also as markup\n for (let i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n markup += `</${tagName}>`;\n\n return markup;\n};\n\n/**\n * This node represents a span node, with a className, a list of children, and\n * an inline style.\n *\n */\nclass Span {\n constructor(classes, children, style) {\n initNode.call(this, classes, style);\n this.children = children || [];\n }\n\n setAttribute(attribute, value) {\n this.attributes[attribute] = value;\n }\n\n toNode() {\n return toNode.call(this, \"span\");\n }\n\n toMarkup() {\n return toMarkup.call(this, \"span\");\n }\n}\n\nlet TextNode$1 = class TextNode {\n constructor(text) {\n this.text = text;\n }\n toNode() {\n return document.createTextNode(this.text);\n }\n toMarkup() {\n return utils.escape(this.text);\n }\n};\n\n// Create an <a href=\"…\"> node.\nclass AnchorNode {\n constructor(href, classes, children) {\n this.href = href;\n this.classes = classes;\n this.children = children || [];\n }\n\n toNode() {\n const node = document.createElement(\"a\");\n node.setAttribute(\"href\", this.href);\n if (this.classes.length > 0) {\n node.className = createClass(this.classes);\n }\n for (let i = 0; i < this.children.length; i++) {\n node.appendChild(this.children[i].toNode());\n }\n return node\n }\n\n toMarkup() {\n let markup = `<a href='${utils.escape(this.href)}'`;\n if (this.classes.length > 0) {\n markup += ` class=\"${utils.escape(createClass(this.classes))}\"`;\n }\n markup += \">\";\n for (let i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n markup += \"</a>\";\n return markup\n }\n}\n\n/*\n * This node represents an image embed (<img>) element.\n */\nclass Img {\n constructor(src, alt, style) {\n this.alt = alt;\n this.src = src;\n this.classes = [\"mord\"];\n this.style = style;\n }\n\n hasClass(className) {\n return this.classes.includes(className);\n }\n\n toNode() {\n const node = document.createElement(\"img\");\n node.src = this.src;\n node.alt = this.alt;\n node.className = \"mord\";\n\n // Apply inline styles\n for (const style in this.style) {\n if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n node.style[style] = this.style[style];\n }\n }\n\n return node;\n }\n\n toMarkup() {\n let markup = `<img src='${this.src}' alt='${this.alt}'`;\n\n // Add the styles, after hyphenation\n let styles = \"\";\n for (const style in this.style) {\n if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n styles += `${utils.hyphenate(style)}:${this.style[style]};`;\n }\n }\n if (styles) {\n markup += ` style=\"${utils.escape(styles)}\"`;\n }\n\n markup += \">\";\n return markup;\n }\n}\n\n//\n/**\n * These objects store data about MathML nodes.\n * The `toNode` and `toMarkup` functions create namespaced DOM nodes and\n * HTML text markup respectively.\n */\n\n\nfunction newDocumentFragment(children) {\n return new DocumentFragment(children);\n}\n\n/**\n * This node represents a general purpose MathML node of any type,\n * for example, `\"mo\"` or `\"mspace\"`, corresponding to `<mo>` and\n * `<mspace>` tags).\n */\nclass MathNode {\n constructor(type, children, classes, style) {\n this.type = type;\n this.attributes = {};\n this.children = children || [];\n this.classes = classes || [];\n this.style = style || {}; // Used for <mstyle> elements\n this.label = \"\";\n }\n\n /**\n * Sets an attribute on a MathML node. MathML depends on attributes to convey a\n * semantic content, so this is used heavily.\n */\n setAttribute(name, value) {\n this.attributes[name] = value;\n }\n\n /**\n * Gets an attribute on a MathML node.\n */\n getAttribute(name) {\n return this.attributes[name];\n }\n\n setLabel(value) {\n this.label = value;\n }\n\n /**\n * Converts the math node into a MathML-namespaced DOM element.\n */\n toNode() {\n const node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", this.type);\n\n for (const attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n node.setAttribute(attr, this.attributes[attr]);\n }\n }\n\n if (this.classes.length > 0) {\n node.className = createClass(this.classes);\n }\n\n // Apply inline styles\n for (const style in this.style) {\n if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n node.style[style] = this.style[style];\n }\n }\n\n for (let i = 0; i < this.children.length; i++) {\n node.appendChild(this.children[i].toNode());\n }\n\n return node;\n }\n\n /**\n * Converts the math node into an HTML markup string.\n */\n toMarkup() {\n let markup = \"<\" + this.type;\n\n // Add the attributes\n for (const attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n markup += \" \" + attr + '=\"';\n markup += utils.escape(this.attributes[attr]);\n markup += '\"';\n }\n }\n\n if (this.classes.length > 0) {\n markup += ` class=\"${utils.escape(createClass(this.classes))}\"`;\n }\n\n let styles = \"\";\n\n // Add the styles, after hyphenation\n for (const style in this.style) {\n if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n styles += `${utils.hyphenate(style)}:${this.style[style]};`;\n }\n }\n\n if (styles) {\n markup += ` style=\"${styles}\"`;\n }\n\n markup += \">\";\n\n for (let i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n markup += \"</\" + this.type + \">\";\n\n return markup;\n }\n\n /**\n * Converts the math node into a string, similar to innerText, but escaped.\n */\n toText() {\n return this.children.map((child) => child.toText()).join(\"\");\n }\n}\n\n/**\n * This node represents a piece of text.\n */\nclass TextNode {\n constructor(text) {\n this.text = text;\n }\n\n /**\n * Converts the text node into a DOM text node.\n */\n toNode() {\n return document.createTextNode(this.text);\n }\n\n /**\n * Converts the text node into escaped HTML markup\n * (representing the text itself).\n */\n toMarkup() {\n return utils.escape(this.toText());\n }\n\n /**\n * Converts the text node into a string\n * (representing the text itself).\n */\n toText() {\n return this.text;\n }\n}\n\n// Do not make an <mrow> the only child of a <mstyle>.\n// An <mstyle> acts as its own implicit <mrow>.\nconst wrapWithMstyle = expression => {\n let node;\n if (expression.length === 1 && expression[0].type === \"mrow\") {\n node = expression.pop();\n node.type = \"mstyle\";\n } else {\n node = new MathNode(\"mstyle\", expression);\n }\n return node\n};\n\nvar mathMLTree = {\n MathNode,\n TextNode,\n newDocumentFragment\n};\n\n/**\n * This file provides support for building horizontal stretchy elements.\n */\n\n\n// TODO: Remove when Chromium stretches \\widetilde & \\widehat\nconst estimatedWidth = node => {\n let width = 0;\n if (node.body) {\n for (const item of node.body) {\n width += estimatedWidth(item);\n }\n } else if (node.type === \"supsub\") {\n width += estimatedWidth(node.base);\n if (node.sub) { width += 0.7 * estimatedWidth(node.sub); }\n if (node.sup) { width += 0.7 * estimatedWidth(node.sup); }\n } else if (node.type === \"mathord\" || node.type === \"textord\") {\n for (const ch of node.text.split('')) {\n const codePoint = ch.codePointAt(0);\n if ((0x60 < codePoint && codePoint < 0x7B) || (0x03B0 < codePoint && codePoint < 0x3CA)) {\n width += 0.56; // lower case latin or greek. Use advance width of letter n\n } else if (0x2F < codePoint && codePoint < 0x3A) {\n width += 0.50; // numerals.\n } else {\n width += 0.92; // advance width of letter M\n }\n }\n } else {\n width += 1.0;\n }\n return width\n};\n\nconst stretchyCodePoint = {\n widehat: \"^\",\n widecheck: \"ˇ\",\n widetilde: \"~\",\n wideparen: \"⏜\", // \\u23dc\n utilde: \"~\",\n overleftarrow: \"\\u2190\",\n underleftarrow: \"\\u2190\",\n xleftarrow: \"\\u2190\",\n overrightarrow: \"\\u2192\",\n underrightarrow: \"\\u2192\",\n xrightarrow: \"\\u2192\",\n underbrace: \"\\u23df\",\n overbrace: \"\\u23de\",\n overgroup: \"\\u23e0\",\n overparen: \"⏜\",\n undergroup: \"\\u23e1\",\n underparen: \"\\u23dd\",\n overleftrightarrow: \"\\u2194\",\n underleftrightarrow: \"\\u2194\",\n xleftrightarrow: \"\\u2194\",\n Overrightarrow: \"\\u21d2\",\n xRightarrow: \"\\u21d2\",\n overleftharpoon: \"\\u21bc\",\n xleftharpoonup: \"\\u21bc\",\n overrightharpoon: \"\\u21c0\",\n xrightharpoonup: \"\\u21c0\",\n xLeftarrow: \"\\u21d0\",\n xLeftrightarrow: \"\\u21d4\",\n xhookleftarrow: \"\\u21a9\",\n xhookrightarrow: \"\\u21aa\",\n xmapsto: \"\\u21a6\",\n xrightharpoondown: \"\\u21c1\",\n xleftharpoondown: \"\\u21bd\",\n xtwoheadleftarrow: \"\\u219e\",\n xtwoheadrightarrow: \"\\u21a0\",\n xlongequal: \"=\",\n xrightleftarrows: \"\\u21c4\",\n yields: \"\\u2192\",\n yieldsLeft: \"\\u2190\",\n mesomerism: \"\\u2194\",\n longrightharpoonup: \"\\u21c0\",\n longleftharpoondown: \"\\u21bd\",\n eqrightharpoonup: \"\\u21c0\",\n eqleftharpoondown: \"\\u21bd\",\n \"\\\\cdrightarrow\": \"\\u2192\",\n \"\\\\cdleftarrow\": \"\\u2190\",\n \"\\\\cdlongequal\": \"=\"\n};\n\nconst mathMLnode = function(label) {\n const child = new mathMLTree.TextNode(stretchyCodePoint[label.slice(1)]);\n const node = new mathMLTree.MathNode(\"mo\", [child]);\n node.setAttribute(\"stretchy\", \"true\");\n return node\n};\n\nconst crookedWides = [\"\\\\widetilde\", \"\\\\widehat\", \"\\\\widecheck\", \"\\\\utilde\"];\n\n// TODO: Remove when Chromium stretches \\widetilde & \\widehat\nconst accentNode = (group) => {\n const mo = mathMLnode(group.label);\n if (crookedWides.includes(group.label)) {\n const width = estimatedWidth(group.base);\n if (1 < width && width < 1.6) {\n mo.classes.push(\"tml-crooked-2\");\n } else if (1.6 <= width && width < 2.5) {\n mo.classes.push(\"tml-crooked-3\");\n } else if (2.5 <= width) {\n mo.classes.push(\"tml-crooked-4\");\n }\n }\n return mo\n};\n\nvar stretchy = {\n mathMLnode,\n accentNode\n};\n\n/**\n * This file holds a list of all no-argument functions and single-character\n * symbols (like 'a' or ';').\n *\n * For each of the symbols, there are two properties they can have:\n * - group (required): the ParseNode group type the symbol should have (i.e.\n \"textord\", \"mathord\", etc).\n * - replace: the character that this symbol or function should be\n * replaced with (i.e. \"\\phi\" has a replace value of \"\\u03d5\", the phi\n * character in the main font).\n *\n * The outermost map in the table indicates what mode the symbols should be\n * accepted in (e.g. \"math\" or \"text\").\n */\n\n// Some of these have a \"-token\" suffix since these are also used as `ParseNode`\n// types for raw text tokens, and we want to avoid conflicts with higher-level\n// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by\n// looking up the `symbols` map.\nconst ATOMS = {\n bin: 1,\n close: 1,\n inner: 1,\n open: 1,\n punct: 1,\n rel: 1\n};\nconst NON_ATOMS = {\n \"accent-token\": 1,\n mathord: 1,\n \"op-token\": 1,\n spacing: 1,\n textord: 1\n};\n\nconst symbols = {\n math: {},\n text: {}\n};\n\n/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */\nfunction defineSymbol(mode, group, replace, name, acceptUnicodeChar) {\n symbols[mode][name] = { group, replace };\n\n if (acceptUnicodeChar && replace) {\n symbols[mode][replace] = symbols[mode][name];\n }\n}\n\n// Some abbreviations for commonly used strings.\n// This helps minify the code, and also spotting typos using jshint.\n\n// modes:\nconst math = \"math\";\nconst text = \"text\";\n\n// groups:\nconst accent = \"accent-token\";\nconst bin = \"bin\";\nconst close = \"close\";\nconst inner = \"inner\";\nconst mathord = \"mathord\";\nconst op = \"op-token\";\nconst open = \"open\";\nconst punct = \"punct\";\nconst rel = \"rel\";\nconst spacing = \"spacing\";\nconst textord = \"textord\";\n\n// Now comes the symbol table\n\n// Relation Symbols\ndefineSymbol(math, rel, \"\\u2261\", \"\\\\equiv\", true);\ndefineSymbol(math, rel, \"\\u227a\", \"\\\\prec\", true);\ndefineSymbol(math, rel, \"\\u227b\", \"\\\\succ\", true);\ndefineSymbol(math, rel, \"\\u223c\", \"\\\\sim\", true);\ndefineSymbol(math, rel, \"\\u27c2\", \"\\\\perp\", true);\ndefineSymbol(math, rel, \"\\u2aaf\", \"\\\\preceq\", true);\ndefineSymbol(math, rel, \"\\u2ab0\", \"\\\\succeq\", true);\ndefineSymbol(math, rel, \"\\u2243\", \"\\\\simeq\", true);\ndefineSymbol(math, rel, \"\\u224c\", \"\\\\backcong\", true);\ndefineSymbol(math, rel, \"|\", \"\\\\mid\", true);\ndefineSymbol(math, rel, \"\\u226a\", \"\\\\ll\", true);\ndefineSymbol(math, rel, \"\\u226b\", \"\\\\gg\", true);\ndefineSymbol(math, rel, \"\\u224d\", \"\\\\asymp\", true);\ndefineSymbol(math, rel, \"\\u2225\", \"\\\\parallel\");\ndefineSymbol(math, rel, \"\\u2323\", \"\\\\smile\", true);\ndefineSymbol(math, rel, \"\\u2291\", \"\\\\sqsubseteq\", true);\ndefineSymbol(math, rel, \"\\u2292\", \"\\\\sqsupseteq\", true);\ndefineSymbol(math, rel, \"\\u2250\", \"\\\\doteq\", true);\ndefineSymbol(math, rel, \"\\u2322\", \"\\\\frown\", true);\ndefineSymbol(math, rel, \"\\u220b\", \"\\\\ni\", true);\ndefineSymbol(math, rel, \"\\u220c\", \"\\\\notni\", true);\ndefineSymbol(math, rel, \"\\u221d\", \"\\\\propto\", true);\ndefineSymbol(math, rel, \"\\u22a2\", \"\\\\vdash\", true);\ndefineSymbol(math, rel, \"\\u22a3\", \"\\\\dashv\", true);\ndefineSymbol(math, rel, \"\\u220b\", \"\\\\owns\");\ndefineSymbol(math, rel, \"\\u2258\", \"\\\\arceq\", true);\ndefineSymbol(math, rel, \"\\u2259\", \"\\\\wedgeq\", true);\ndefineSymbol(math, rel, \"\\u225a\", \"\\\\veeeq\", true);\ndefineSymbol(math, rel, \"\\u225b\", \"\\\\stareq\", true);\ndefineSymbol(math, rel, \"\\u225d\", \"\\\\eqdef\", true);\ndefineSymbol(math, rel, \"\\u225e\", \"\\\\measeq\", true);\ndefineSymbol(math, rel, \"\\u225f\", \"\\\\questeq\", true);\ndefineSymbol(math, rel, \"\\u2260\", \"\\\\ne\", true);\ndefineSymbol(math, rel, \"\\u2260\", \"\\\\neq\");\n// unicodemath\ndefineSymbol(math, rel, \"\\u2a75\", \"\\\\eqeq\", true);\ndefineSymbol(math, rel, \"\\u2a76\", \"\\\\eqeqeq\", true);\n// mathtools.sty\ndefineSymbol(math, rel, \"\\u2237\", \"\\\\dblcolon\", true);\ndefineSymbol(math, rel, \"\\u2254\", \"\\\\coloneqq\", true);\ndefineSymbol(math, rel, \"\\u2255\", \"\\\\eqqcolon\", true);\ndefineSymbol(math, rel, \"\\u2239\", \"\\\\eqcolon\", true);\ndefineSymbol(math, rel, \"\\u2A74\", \"\\\\Coloneqq\", true);\n\n// Punctuation\ndefineSymbol(math, punct, \"\\u002e\", \"\\\\ldotp\");\ndefineSymbol(math, punct, \"\\u00b7\", \"\\\\cdotp\");\n\n// Misc Symbols\ndefineSymbol(math, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(text, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(math, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(text, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(math, textord, \"\\u2135\", \"\\\\aleph\", true);\ndefineSymbol(math, textord, \"\\u2200\", \"\\\\forall\", true);\ndefineSymbol(math, textord, \"\\u210f\", \"\\\\hbar\", true);\ndefineSymbol(math, textord, \"\\u2203\", \"\\\\exists\", true);\n// ∇ is actually a unary operator, not binary. But this works.\ndefineSymbol(math, bin, \"\\u2207\", \"\\\\nabla\", true);\ndefineSymbol(math, textord, \"\\u266d\", \"\\\\flat\", true);\ndefineSymbol(math, textord, \"\\u2113\", \"\\\\ell\", true);\ndefineSymbol(math, textord, \"\\u266e\", \"\\\\natural\", true);\ndefineSymbol(math, textord, \"Å\", \"\\\\Angstrom\", true);\ndefineSymbol(text, textord, \"Å\", \"\\\\Angstrom\", true);\ndefineSymbol(math, textord, \"\\u2663\", \"\\\\clubsuit\", true);\ndefineSymbol(math, textord, \"\\u2667\", \"\\\\varclubsuit\", true);\ndefineSymbol(math, textord, \"\\u2118\", \"\\\\wp\", true);\ndefineSymbol(math, textord, \"\\u266f\", \"\\\\sharp\", true);\ndefineSymbol(math, textord, \"\\u2662\", \"\\\\diamondsuit\", true);\ndefineSymbol(math, textord, \"\\u2666\", \"\\\\vardiamondsuit\", true);\ndefineSymbol(math, textord, \"\\u211c\", \"\\\\Re\", true);\ndefineSymbol(math, textord, \"\\u2661\", \"\\\\heartsuit\", true);\ndefineSymbol(math, textord, \"\\u2665\", \"\\\\varheartsuit\", true);\ndefineSymbol(math, textord, \"\\u2111\", \"\\\\Im\", true);\ndefineSymbol(math, textord, \"\\u2660\", \"\\\\spadesuit\", true);\ndefineSymbol(math, textord, \"\\u2664\", \"\\\\varspadesuit\", true);\ndefineSymbol(math, textord, \"\\u2640\", \"\\\\female\", true);\ndefineSymbol(math, textord, \"\\u2642\", \"\\\\male\", true);\ndefineSymbol(math, textord, \"\\u00a7\", \"\\\\S\", true);\ndefineSymbol(text, textord, \"\\u00a7\", \"\\\\S\");\ndefineSymbol(math, textord, \"\\u00b6\", \"\\\\P\", true);\ndefineSymbol(text, textord, \"\\u00b6\", \"\\\\P\");\ndefineSymbol(text, textord, \"\\u263a\", \"\\\\smiley\", true);\ndefineSymbol(math, textord, \"\\u263a\", \"\\\\smiley\", true);\n\n// Math and Text\ndefineSymbol(math, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, textord, \"\\u2020\", \"\\\\textdagger\");\ndefineSymbol(math, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, textord, \"\\u2021\", \"\\\\textdaggerdbl\");\n\n// Large Delimiters\ndefineSymbol(math, close, \"\\u23b1\", \"\\\\rmoustache\", true);\ndefineSymbol(math, open, \"\\u23b0\", \"\\\\lmoustache\", true);\ndefineSymbol(math, close, \"\\u27ef\", \"\\\\rgroup\", true);\ndefineSymbol(math, open, \"\\u27ee\", \"\\\\lgroup\", true);\n\n// Binary Operators\ndefineSymbol(math, bin, \"\\u2213\", \"\\\\mp\", true);\ndefineSymbol(math, bin, \"\\u2296\", \"\\\\ominus\", true);\ndefineSymbol(math, bin, \"\\u228e\", \"\\\\uplus\", true);\ndefineSymbol(math, bin, \"\\u2293\", \"\\\\sqcap\", true);\ndefineSymbol(math, bin, \"\\u2217\", \"\\\\ast\");\ndefineSymbol(math, bin, \"\\u2294\", \"\\\\sqcup\", true);\ndefineSymbol(math, bin, \"\\u25ef\", \"\\\\bigcirc\", true);\ndefineSymbol(math, bin, \"\\u2219\", \"\\\\bullet\", true);\ndefineSymbol(math, bin, \"\\u2021\", \"\\\\ddagger\");\ndefineSymbol(math, bin, \"\\u2240\", \"\\\\wr\", true);\ndefineSymbol(math, bin, \"\\u2a3f\", \"\\\\amalg\");\ndefineSymbol(math, bin, \"\\u0026\", \"\\\\And\"); // from amsmath\ndefineSymbol(math, bin, \"\\u2AFD\", \"\\\\sslash\", true); // from stmaryrd\n\n// Arrow Symbols\ndefineSymbol(math, rel, \"\\u27f5\", \"\\\\longleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21d0\", \"\\\\Leftarrow\", true);\ndefineSymbol(math, rel, \"\\u27f8\", \"\\\\Longleftarrow\", true);\ndefineSymbol(math, rel, \"\\u27f6\", \"\\\\longrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21d2\", \"\\\\Rightarrow\", true);\ndefineSymbol(math, rel, \"\\u27f9\", \"\\\\Longrightarrow\", true);\ndefineSymbol(math, rel, \"\\u2194\", \"\\\\leftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u27f7\", \"\\\\longleftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21d4\", \"\\\\Leftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u27fa\", \"\\\\Longleftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21a4\", \"\\\\mapsfrom\", true);\ndefineSymbol(math, rel, \"\\u21a6\", \"\\\\mapsto\", true);\ndefineSymbol(math, rel, \"\\u27fc\", \"\\\\longmapsto\", true);\ndefineSymbol(math, rel, \"\\u2197\", \"\\\\nearrow\", true);\ndefineSymbol(math, rel, \"\\u21a9\", \"\\\\hookleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21aa\", \"\\\\hookrightarrow\", true);\ndefineSymbol(math, rel, \"\\u2198\", \"\\\\searrow\", true);\ndefineSymbol(math, rel, \"\\u21bc\", \"\\\\leftharpoonup\", true);\ndefineSymbol(math, rel, \"\\u21c0\", \"\\\\rightharpoonup\", true);\ndefineSymbol(math, rel, \"\\u2199\", \"\\\\swarrow\", true);\ndefineSymbol(math, rel, \"\\u21bd\", \"\\\\leftharpoondown\", true);\ndefineSymbol(math, rel, \"\\u21c1\", \"\\\\rightharpoondown\", true);\ndefineSymbol(math, rel, \"\\u2196\", \"\\\\nwarrow\", true);\ndefineSymbol(math, rel, \"\\u21cc\", \"\\\\rightleftharpoons\", true);\ndefineSymbol(math, mathord, \"\\u21af\", \"\\\\lightning\", true);\ndefineSymbol(math, mathord, \"\\u220E\", \"\\\\QED\", true);\ndefineSymbol(math, mathord, \"\\u2030\", \"\\\\permil\", true);\ndefineSymbol(text, textord, \"\\u2030\", \"\\\\permil\");\ndefineSymbol(math, mathord, \"\\u2609\", \"\\\\astrosun\", true);\ndefineSymbol(math, mathord, \"\\u263c\", \"\\\\sun\", true);\ndefineSymbol(math, mathord, \"\\u263e\", \"\\\\leftmoon\", true);\ndefineSymbol(math, mathord, \"\\u263d\", \"\\\\rightmoon\", true);\ndefineSymbol(math, mathord, \"\\u2295\", \"\\\\Earth\");\n\n// AMS Negated Binary Relations\ndefineSymbol(math, rel, \"\\u226e\", \"\\\\nless\", true);\n// Symbol names preceeded by \"@\" each have a corresponding macro.\ndefineSymbol(math, rel, \"\\u2a87\", \"\\\\lneq\", true);\ndefineSymbol(math, rel, \"\\u2268\", \"\\\\lneqq\", true);\ndefineSymbol(math, rel, \"\\u2268\\ufe00\", \"\\\\lvertneqq\");\ndefineSymbol(math, rel, \"\\u22e6\", \"\\\\lnsim\", true);\ndefineSymbol(math, rel, \"\\u2a89\", \"\\\\lnapprox\", true);\ndefineSymbol(math, rel, \"\\u2280\", \"\\\\nprec\", true);\n// unicode-math maps \\u22e0 to \\npreccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u22e0\", \"\\\\npreceq\", true);\ndefineSymbol(math, rel, \"\\u22e8\", \"\\\\precnsim\", true);\ndefineSymbol(math, rel, \"\\u2ab9\", \"\\\\precnapprox\", true);\ndefineSymbol(math, rel, \"\\u2241\", \"\\\\nsim\", true);\ndefineSymbol(math, rel, \"\\u2224\", \"\\\\nmid\", true);\ndefineSymbol(math, rel, \"\\u2224\", \"\\\\nshortmid\");\ndefineSymbol(math, rel, \"\\u22ac\", \"\\\\nvdash\", true);\ndefineSymbol(math, rel, \"\\u22ad\", \"\\\\nvDash\", true);\ndefineSymbol(math, rel, \"\\u22ea\", \"\\\\ntriangleleft\");\ndefineSymbol(math, rel, \"\\u22ec\", \"\\\\ntrianglelefteq\", true);\ndefineSymbol(math, rel, \"\\u2284\", \"\\\\nsubset\", true);\ndefineSymbol(math, rel, \"\\u2285\", \"\\\\nsupset\", true);\ndefineSymbol(math, rel, \"\\u228a\", \"\\\\subsetneq\", true);\ndefineSymbol(math, rel, \"\\u228a\\ufe00\", \"\\\\varsubsetneq\");\ndefineSymbol(math, rel, \"\\u2acb\", \"\\\\subsetneqq\", true);\ndefineSymbol(math, rel, \"\\u2acb\\ufe00\", \"\\\\varsubsetneqq\");\ndefineSymbol(math, rel, \"\\u226f\", \"\\\\ngtr\", true);\ndefineSymbol(math, rel, \"\\u2a88\", \"\\\\gneq\", true);\ndefineSymbol(math, rel, \"\\u2269\", \"\\\\gneqq\", true);\ndefineSymbol(math, rel, \"\\u2269\\ufe00\", \"\\\\gvertneqq\");\ndefineSymbol(math, rel, \"\\u22e7\", \"\\\\gnsim\", true);\ndefineSymbol(math, rel, \"\\u2a8a\", \"\\\\gnapprox\", true);\ndefineSymbol(math, rel, \"\\u2281\", \"\\\\nsucc\", true);\n// unicode-math maps \\u22e1 to \\nsucccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u22e1\", \"\\\\nsucceq\", true);\ndefineSymbol(math, rel, \"\\u22e9\", \"\\\\succnsim\", true);\ndefineSymbol(math, rel, \"\\u2aba\", \"\\\\succnapprox\", true);\n// unicode-math maps \\u2246 to \\simneqq. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u2246\", \"\\\\ncong\", true);\ndefineSymbol(math, rel, \"\\u2226\", \"\\\\nparallel\", true);\ndefineSymbol(math, rel, \"\\u2226\", \"\\\\nshortparallel\");\ndefineSymbol(math, rel, \"\\u22af\", \"\\\\nVDash\", true);\ndefineSymbol(math, rel, \"\\u22eb\", \"\\\\ntriangleright\");\ndefineSymbol(math, rel, \"\\u22ed\", \"\\\\ntrianglerighteq\", true);\ndefineSymbol(math, rel, \"\\u228b\", \"\\\\supsetneq\", true);\ndefineSymbol(math, rel, \"\\u228b\", \"\\\\varsupsetneq\");\ndefineSymbol(math, rel, \"\\u2acc\", \"\\\\supsetneqq\", true);\ndefineSymbol(math, rel, \"\\u2acc\\ufe00\", \"\\\\varsupsetneqq\");\ndefineSymbol(math, rel, \"\\u22ae\", \"\\\\nVdash\", true);\ndefineSymbol(math, rel, \"\\u2ab5\", \"\\\\precneqq\", true);\ndefineSymbol(math, rel, \"\\u2ab6\", \"\\\\succneqq\", true);\ndefineSymbol(math, bin, \"\\u22b4\", \"\\\\unlhd\");\ndefineSymbol(math, bin, \"\\u22b5\", \"\\\\unrhd\");\n\n// AMS Negated Arrows\ndefineSymbol(math, rel, \"\\u219a\", \"\\\\nleftarrow\", true);\ndefineSymbol(math, rel, \"\\u219b\", \"\\\\nrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21cd\", \"\\\\nLeftarrow\", true);\ndefineSymbol(math, rel, \"\\u21cf\", \"\\\\nRightarrow\", true);\ndefineSymbol(math, rel, \"\\u21ae\", \"\\\\nleftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21ce\", \"\\\\nLeftrightarrow\", true);\n\n// AMS Misc\ndefineSymbol(math, rel, \"\\u25b3\", \"\\\\vartriangle\");\ndefineSymbol(math, textord, \"\\u210f\", \"\\\\hslash\");\ndefineSymbol(math, textord, \"\\u25bd\", \"\\\\triangledown\");\ndefineSymbol(math, textord, \"\\u25ca\", \"\\\\lozenge\");\ndefineSymbol(math, textord, \"\\u24c8\", \"\\\\circledS\");\ndefineSymbol(math, textord, \"\\u00ae\", \"\\\\circledR\", true);\ndefineSymbol(text, textord, \"\\u00ae\", \"\\\\circledR\");\ndefineSymbol(text, textord, \"\\u00ae\", \"\\\\textregistered\");\ndefineSymbol(math, textord, \"\\u2221\", \"\\\\measuredangle\", true);\ndefineSymbol(math, textord, \"\\u2204\", \"\\\\nexists\");\ndefineSymbol(math, textord, \"\\u2127\", \"\\\\mho\");\ndefineSymbol(math, textord, \"\\u2132\", \"\\\\Finv\", true);\ndefineSymbol(math, textord, \"\\u2141\", \"\\\\Game\", true);\ndefineSymbol(math, textord, \"\\u2035\", \"\\\\backprime\");\ndefineSymbol(math, textord, \"\\u2036\", \"\\\\backdprime\");\ndefineSymbol(math, textord, \"\\u2037\", \"\\\\backtrprime\");\ndefineSymbol(math, textord, \"\\u25b2\", \"\\\\blacktriangle\");\ndefineSymbol(math, textord, \"\\u25bc\", \"\\\\blacktriangledown\");\ndefineSymbol(math, textord, \"\\u25a0\", \"\\\\blacksquare\");\ndefineSymbol(math, textord, \"\\u29eb\", \"\\\\blacklozenge\");\ndefineSymbol(math, textord, \"\\u2605\", \"\\\\bigstar\");\ndefineSymbol(math, textord, \"\\u2222\", \"\\\\sphericalangle\", true);\ndefineSymbol(math, textord, \"\\u2201\", \"\\\\complement\", true);\n// unicode-math maps U+F0 to \\matheth. We map to AMS function \\eth\ndefineSymbol(math, textord, \"\\u00f0\", \"\\\\eth\", true);\ndefineSymbol(text, textord, \"\\u00f0\", \"\\u00f0\");\ndefineSymbol(math, textord, \"\\u2571\", \"\\\\diagup\");\ndefineSymbol(math, textord, \"\\u2572\", \"\\\\diagdown\");\ndefineSymbol(math, textord, \"\\u25a1\", \"\\\\square\");\ndefineSymbol(math, textord, \"\\u25a1\", \"\\\\Box\");\ndefineSymbol(math, textord, \"\\u25ca\", \"\\\\Diamond\");\n// unicode-math maps U+A5 to \\mathyen. We map to AMS function \\yen\ndefineSymbol(math, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(text, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(math, textord, \"\\u2713\", \"\\\\checkmark\", true);\ndefineSymbol(text, textord, \"\\u2713\", \"\\\\checkmark\");\ndefineSymbol(math, textord, \"\\u2717\", \"\\\\ballotx\", true);\ndefineSymbol(text, textord, \"\\u2717\", \"\\\\ballotx\");\ndefineSymbol(text, textord, \"\\u2022\", \"\\\\textbullet\");\n\n// AMS Hebrew\ndefineSymbol(math, textord, \"\\u2136\", \"\\\\beth\", true);\ndefineSymbol(math, textord, \"\\u2138\", \"\\\\daleth\", true);\ndefineSymbol(math, textord, \"\\u2137\", \"\\\\gimel\", true);\n\n// AMS Greek\ndefineSymbol(math, textord, \"\\u03dd\", \"\\\\digamma\", true);\ndefineSymbol(math, textord, \"\\u03f0\", \"\\\\varkappa\");\n\n// AMS Delimiters\ndefineSymbol(math, open, \"\\u231C\", \"\\\\ulcorner\", true);\ndefineSymbol(math, close, \"\\u231D\", \"\\\\urcorner\", true);\ndefineSymbol(math, open, \"\\u231E\", \"\\\\llcorner\", true);\ndefineSymbol(math, close, \"\\u231F\", \"\\\\lrcorner\", true);\n\n// AMS Binary Relations\ndefineSymbol(math, rel, \"\\u2266\", \"\\\\leqq\", true);\ndefineSymbol(math, rel, \"\\u2a7d\", \"\\\\leqslant\", true);\ndefineSymbol(math, rel, \"\\u2a95\", \"\\\\eqslantless\", true);\ndefineSymbol(math, rel, \"\\u2272\", \"\\\\lesssim\", true);\ndefineSymbol(math, rel, \"\\u2a85\", \"\\\\lessapprox\", true);\ndefineSymbol(math, rel, \"\\u224a\", \"\\\\approxeq\", true);\ndefineSymbol(math, bin, \"\\u22d6\", \"\\\\lessdot\");\ndefineSymbol(math, rel, \"\\u22d8\", \"\\\\lll\", true);\ndefineSymbol(math, rel, \"\\u2276\", \"\\\\lessgtr\", true);\ndefineSymbol(math, rel, \"\\u22da\", \"\\\\lesseqgtr\", true);\ndefineSymbol(math, rel, \"\\u2a8b\", \"\\\\lesseqqgtr\", true);\ndefineSymbol(math, rel, \"\\u2251\", \"\\\\doteqdot\");\ndefineSymbol(math, rel, \"\\u2253\", \"\\\\risingdotseq\", true);\ndefineSymbol(math, rel, \"\\u2252\", \"\\\\fallingdotseq\", true);\ndefineSymbol(math, rel, \"\\u223d\", \"\\\\backsim\", true);\ndefineSymbol(math, rel, \"\\u22cd\", \"\\\\backsimeq\", true);\ndefineSymbol(math, rel, \"\\u2ac5\", \"\\\\subseteqq\", true);\ndefineSymbol(math, rel, \"\\u22d0\", \"\\\\Subset\", true);\ndefineSymbol(math, rel, \"\\u228f\", \"\\\\sqsubset\", true);\ndefineSymbol(math, rel, \"\\u227c\", \"\\\\preccurlyeq\", true);\ndefineSymbol(math, rel, \"\\u22de\", \"\\\\curlyeqprec\", true);\ndefineSymbol(math, rel, \"\\u227e\", \"\\\\precsim\", true);\ndefineSymbol(math, rel, \"\\u2ab7\", \"\\\\precapprox\", true);\ndefineSymbol(math, rel, \"\\u22b2\", \"\\\\vartriangleleft\");\ndefineSymbol(math, rel, \"\\u22b4\", \"\\\\trianglelefteq\");\ndefineSymbol(math, rel, \"\\u22a8\", \"\\\\vDash\", true);\ndefineSymbol(math, rel, \"\\u22ab\", \"\\\\VDash\", true);\ndefineSymbol(math, rel, \"\\u22aa\", \"\\\\Vvdash\", true);\ndefineSymbol(math, rel, \"\\u2323\", \"\\\\smallsmile\");\ndefineSymbol(math, rel, \"\\u2322\", \"\\\\smallfrown\");\ndefineSymbol(math, rel, \"\\u224f\", \"\\\\bumpeq\", true);\ndefineSymbol(math, rel, \"\\u224e\", \"\\\\Bumpeq\", true);\ndefineSymbol(math, rel, \"\\u2267\", \"\\\\geqq\", true);\ndefineSymbol(math, rel, \"\\u2a7e\", \"\\\\geqslant\", true);\ndefineSymbol(math, rel, \"\\u2a96\", \"\\\\eqslantgtr\", true);\ndefineSymbol(math, rel, \"\\u2273\", \"\\\\gtrsim\", true);\ndefineSymbol(math, rel, \"\\u2a86\", \"\\\\gtrapprox\", true);\ndefineSymbol(math, bin, \"\\u22d7\", \"\\\\gtrdot\");\ndefineSymbol(math, rel, \"\\u22d9\", \"\\\\ggg\", true);\ndefineSymbol(math, rel, \"\\u2277\", \"\\\\gtrless\", true);\ndefineSymbol(math, rel, \"\\u22db\", \"\\\\gtreqless\", true);\ndefineSymbol(math, rel, \"\\u2a8c\", \"\\\\gtreqqless\", true);\ndefineSymbol(math, rel, \"\\u2256\", \"\\\\eqcirc\", true);\ndefineSymbol(math, rel, \"\\u2257\", \"\\\\circeq\", true);\ndefineSymbol(math, rel, \"\\u225c\", \"\\\\triangleq\", true);\ndefineSymbol(math, rel, \"\\u223c\", \"\\\\thicksim\");\ndefineSymbol(math, rel, \"\\u2248\", \"\\\\thickapprox\");\ndefineSymbol(math, rel, \"\\u2ac6\", \"\\\\supseteqq\", true);\ndefineSymbol(math, rel, \"\\u22d1\", \"\\\\Supset\", true);\ndefineSymbol(math, rel, \"\\u2290\", \"\\\\sqsupset\", true);\ndefineSymbol(math, rel, \"\\u227d\", \"\\\\succcurlyeq\", true);\ndefineSymbol(math, rel, \"\\u22df\", \"\\\\curlyeqsucc\", true);\ndefineSymbol(math, rel, \"\\u227f\", \"\\\\succsim\", true);\ndefineSymbol(math, rel, \"\\u2ab8\", \"\\\\succapprox\", true);\ndefineSymbol(math, rel, \"\\u22b3\", \"\\\\vartriangleright\");\ndefineSymbol(math, rel, \"\\u22b5\", \"\\\\trianglerighteq\");\ndefineSymbol(math, rel, \"\\u22a9\", \"\\\\Vdash\", true);\ndefineSymbol(math, rel, \"\\u2223\", \"\\\\shortmid\");\ndefineSymbol(math, rel, \"\\u2225\", \"\\\\shortparallel\");\ndefineSymbol(math, rel, \"\\u226c\", \"\\\\between\", true);\ndefineSymbol(math, rel, \"\\u22d4\", \"\\\\pitchfork\", true);\ndefineSymbol(math, rel, \"\\u221d\", \"\\\\varpropto\");\ndefineSymbol(math, rel, \"\\u25c0\", \"\\\\blacktriangleleft\");\n// unicode-math says that \\therefore is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, rel, \"\\u2234\", \"\\\\therefore\", true);\ndefineSymbol(math, rel, \"\\u220d\", \"\\\\backepsilon\");\ndefineSymbol(math, rel, \"\\u25b6\", \"\\\\blacktriangleright\");\n// unicode-math says that \\because is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, rel, \"\\u2235\", \"\\\\because\", true);\ndefineSymbol(math, rel, \"\\u22d8\", \"\\\\llless\");\ndefineSymbol(math, rel, \"\\u22d9\", \"\\\\gggtr\");\ndefineSymbol(math, bin, \"\\u22b2\", \"\\\\lhd\");\ndefineSymbol(math, bin, \"\\u22b3\", \"\\\\rhd\");\ndefineSymbol(math, rel, \"\\u2242\", \"\\\\eqsim\", true);\ndefineSymbol(math, rel, \"\\u2251\", \"\\\\Doteq\", true);\ndefineSymbol(math, rel, \"\\u297d\", \"\\\\strictif\", true);\ndefineSymbol(math, rel, \"\\u297c\", \"\\\\strictfi\", true);\n\n// AMS Binary Operators\ndefineSymbol(math, bin, \"\\u2214\", \"\\\\dotplus\", true);\ndefineSymbol(math, bin, \"\\u2216\", \"\\\\smallsetminus\");\ndefineSymbol(math, bin, \"\\u22d2\", \"\\\\Cap\", true);\ndefineSymbol(math, bin, \"\\u22d3\", \"\\\\Cup\", true);\ndefineSymbol(math, bin, \"\\u2a5e\", \"\\\\doublebarwedge\", true);\ndefineSymbol(math, bin, \"\\u229f\", \"\\\\boxminus\", true);\ndefineSymbol(math, bin, \"\\u229e\", \"\\\\boxplus\", true);\ndefineSymbol(math, bin, \"\\u29C4\", \"\\\\boxslash\", true);\ndefineSymbol(math, bin, \"\\u22c7\", \"\\\\divideontimes\", true);\ndefineSymbol(math, bin, \"\\u22c9\", \"\\\\ltimes\", true);\ndefineSymbol(math, bin, \"\\u22ca\", \"\\\\rtimes\", true);\ndefineSymbol(math, bin, \"\\u22cb\", \"\\\\leftthreetimes\", true);\ndefineSymbol(math, bin, \"\\u22cc\", \"\\\\rightthreetimes\", true);\ndefineSymbol(math, bin, \"\\u22cf\", \"\\\\curlywedge\", true);\ndefineSymbol(math, bin, \"\\u22ce\", \"\\\\curlyvee\", true);\ndefineSymbol(math, bin, \"\\u229d\", \"\\\\circleddash\", true);\ndefineSymbol(math, bin, \"\\u229b\", \"\\\\circledast\", true);\ndefineSymbol(math, bin, \"\\u22ba\", \"\\\\intercal\", true);\ndefineSymbol(math, bin, \"\\u22d2\", \"\\\\doublecap\");\ndefineSymbol(math, bin, \"\\u22d3\", \"\\\\doublecup\");\ndefineSymbol(math, bin, \"\\u22a0\", \"\\\\boxtimes\", true);\ndefineSymbol(math, bin, \"\\u22c8\", \"\\\\bowtie\", true);\ndefineSymbol(math, bin, \"\\u22c8\", \"\\\\Join\");\ndefineSymbol(math, bin, \"\\u27d5\", \"\\\\leftouterjoin\", true);\ndefineSymbol(math, bin, \"\\u27d6\", \"\\\\rightouterjoin\", true);\ndefineSymbol(math, bin, \"\\u27d7\", \"\\\\fullouterjoin\", true);\n\n// stix Binary Operators\ndefineSymbol(math, bin, \"\\u2238\", \"\\\\dotminus\", true);\ndefineSymbol(math, bin, \"\\u27D1\", \"\\\\wedgedot\", true);\ndefineSymbol(math, bin, \"\\u27C7\", \"\\\\veedot\", true);\ndefineSymbol(math, bin, \"\\u2A62\", \"\\\\doublebarvee\", true);\ndefineSymbol(math, bin, \"\\u2A63\", \"\\\\veedoublebar\", true);\ndefineSymbol(math, bin, \"\\u2A5F\", \"\\\\wedgebar\", true);\ndefineSymbol(math, bin, \"\\u2A60\", \"\\\\wedgedoublebar\", true);\ndefineSymbol(math, bin, \"\\u2A54\", \"\\\\Vee\", true);\ndefineSymbol(math, bin, \"\\u2A53\", \"\\\\Wedge\", true);\ndefineSymbol(math, bin, \"\\u2A43\", \"\\\\barcap\", true);\ndefineSymbol(math, bin, \"\\u2A42\", \"\\\\barcup\", true);\ndefineSymbol(math, bin, \"\\u2A48\", \"\\\\capbarcup\", true);\ndefineSymbol(math, bin, \"\\u2A40\", \"\\\\capdot\", true);\ndefineSymbol(math, bin, \"\\u2A47\", \"\\\\capovercup\", true);\ndefineSymbol(math, bin, \"\\u2A46\", \"\\\\cupovercap\", true);\ndefineSymbol(math, bin, \"\\u2A4D\", \"\\\\closedvarcap\", true);\ndefineSymbol(math, bin, \"\\u2A4C\", \"\\\\closedvarcup\", true);\ndefineSymbol(math, bin, \"\\u2A2A\", \"\\\\minusdot\", true);\ndefineSymbol(math, bin, \"\\u2A2B\", \"\\\\minusfdots\", true);\ndefineSymbol(math, bin, \"\\u2A2C\", \"\\\\minusrdots\", true);\ndefineSymbol(math, bin, \"\\u22BB\", \"\\\\Xor\", true);\ndefineSymbol(math, bin, \"\\u22BC\", \"\\\\Nand\", true);\ndefineSymbol(math, bin, \"\\u22BD\", \"\\\\Nor\", true);\ndefineSymbol(math, bin, \"\\u22BD\", \"\\\\barvee\");\ndefineSymbol(math, bin, \"\\u2AF4\", \"\\\\interleave\", true);\ndefineSymbol(math, bin, \"\\u29E2\", \"\\\\shuffle\", true);\ndefineSymbol(math, bin, \"\\u2AF6\", \"\\\\threedotcolon\", true);\ndefineSymbol(math, bin, \"\\u2982\", \"\\\\typecolon\", true);\ndefineSymbol(math, bin, \"\\u223E\", \"\\\\invlazys\", true);\ndefineSymbol(math, bin, \"\\u2A4B\", \"\\\\twocaps\", true);\ndefineSymbol(math, bin, \"\\u2A4A\", \"\\\\twocups\", true);\ndefineSymbol(math, bin, \"\\u2A4E\", \"\\\\Sqcap\", true);\ndefineSymbol(math, bin, \"\\u2A4F\", \"\\\\Sqcup\", true);\ndefineSymbol(math, bin, \"\\u2A56\", \"\\\\veeonvee\", true);\ndefineSymbol(math, bin, \"\\u2A55\", \"\\\\wedgeonwedge\", true);\ndefineSymbol(math, bin, \"\\u29D7\", \"\\\\blackhourglass\", true);\ndefineSymbol(math, bin, \"\\u29C6\", \"\\\\boxast\", true);\ndefineSymbol(math, bin, \"\\u29C8\", \"\\\\boxbox\", true);\ndefineSymbol(math, bin, \"\\u29C7\", \"\\\\boxcircle\", true);\ndefineSymbol(math, bin, \"\\u229C\", \"\\\\circledequal\", true);\ndefineSymbol(math, bin, \"\\u29B7\", \"\\\\circledparallel\", true);\ndefineSymbol(math, bin, \"\\u29B6\", \"\\\\circledvert\", true);\ndefineSymbol(math, bin, \"\\u29B5\", \"\\\\circlehbar\", true);\ndefineSymbol(math, bin, \"\\u27E1\", \"\\\\concavediamond\", true);\ndefineSymbol(math, bin, \"\\u27E2\", \"\\\\concavediamondtickleft\", true);\ndefineSymbol(math, bin, \"\\u27E3\", \"\\\\concavediamondtickright\", true);\ndefineSymbol(math, bin, \"\\u22C4\", \"\\\\diamond\", true);\ndefineSymbol(math, bin, \"\\u29D6\", \"\\\\hourglass\", true);\ndefineSymbol(math, bin, \"\\u27E0\", \"\\\\lozengeminus\", true);\ndefineSymbol(math, bin, \"\\u233D\", \"\\\\obar\", true);\ndefineSymbol(math, bin, \"\\u29B8\", \"\\\\obslash\", true);\ndefineSymbol(math, bin, \"\\u2A38\", \"\\\\odiv\", true);\ndefineSymbol(math, bin, \"\\u29C1\", \"\\\\ogreaterthan\", true);\ndefineSymbol(math, bin, \"\\u29C0\", \"\\\\olessthan\", true);\ndefineSymbol(math, bin, \"\\u29B9\", \"\\\\operp\", true);\ndefineSymbol(math, bin, \"\\u2A37\", \"\\\\Otimes\", true);\ndefineSymbol(math, bin, \"\\u2A36\", \"\\\\otimeshat\", true);\ndefineSymbol(math, bin, \"\\u22C6\", \"\\\\star\", true);\ndefineSymbol(math, bin, \"\\u25B3\", \"\\\\triangle\", true);\ndefineSymbol(math, bin, \"\\u2A3A\", \"\\\\triangleminus\", true);\ndefineSymbol(math, bin, \"\\u2A39\", \"\\\\triangleplus\", true);\ndefineSymbol(math, bin, \"\\u2A3B\", \"\\\\triangletimes\", true);\ndefineSymbol(math, bin, \"\\u27E4\", \"\\\\whitesquaretickleft\", true);\ndefineSymbol(math, bin, \"\\u27E5\", \"\\\\whitesquaretickright\", true);\ndefineSymbol(math, bin, \"\\u2A33\", \"\\\\smashtimes\", true);\n\n// AMS Arrows\n// Note: unicode-math maps \\u21e2 to their own function \\rightdasharrow.\n// We'll map it to AMS function \\dashrightarrow. It produces the same atom.\ndefineSymbol(math, rel, \"\\u21e2\", \"\\\\dashrightarrow\", true);\n// unicode-math maps \\u21e0 to \\leftdasharrow. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u21e0\", \"\\\\dashleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21c7\", \"\\\\leftleftarrows\", true);\ndefineSymbol(math, rel, \"\\u21c6\", \"\\\\leftrightarrows\", true);\ndefineSymbol(math, rel, \"\\u21da\", \"\\\\Lleftarrow\", true);\ndefineSymbol(math, rel, \"\\u219e\", \"\\\\twoheadleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21a2\", \"\\\\leftarrowtail\", true);\ndefineSymbol(math, rel, \"\\u21ab\", \"\\\\looparrowleft\", true);\ndefineSymbol(math, rel, \"\\u21cb\", \"\\\\leftrightharpoons\", true);\ndefineSymbol(math, rel, \"\\u21b6\", \"\\\\curvearrowleft\", true);\n// unicode-math maps \\u21ba to \\acwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u21ba\", \"\\\\circlearrowleft\", true);\ndefineSymbol(math, rel, \"\\u21b0\", \"\\\\Lsh\", true);\ndefineSymbol(math, rel, \"\\u21c8\", \"\\\\upuparrows\", true);\ndefineSymbol(math, rel, \"\\u21bf\", \"\\\\upharpoonleft\", true);\ndefineSymbol(math, rel, \"\\u21c3\", \"\\\\downharpoonleft\", true);\ndefineSymbol(math, rel, \"\\u22b6\", \"\\\\origof\", true);\ndefineSymbol(math, rel, \"\\u22b7\", \"\\\\imageof\", true);\ndefineSymbol(math, rel, \"\\u22b8\", \"\\\\multimap\", true);\ndefineSymbol(math, rel, \"\\u21ad\", \"\\\\leftrightsquigarrow\", true);\ndefineSymbol(math, rel, \"\\u21c9\", \"\\\\rightrightarrows\", true);\ndefineSymbol(math, rel, \"\\u21c4\", \"\\\\rightleftarrows\", true);\ndefineSymbol(math, rel, \"\\u21a0\", \"\\\\twoheadrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21a3\", \"\\\\rightarrowtail\", true);\ndefineSymbol(math, rel, \"\\u21ac\", \"\\\\looparrowright\", true);\ndefineSymbol(math, rel, \"\\u21b7\", \"\\\\curvearrowright\", true);\n// unicode-math maps \\u21bb to \\cwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u21bb\", \"\\\\circlearrowright\", true);\ndefineSymbol(math, rel, \"\\u21b1\", \"\\\\Rsh\", true);\ndefineSymbol(math, rel, \"\\u21ca\", \"\\\\downdownarrows\", true);\ndefineSymbol(math, rel, \"\\u21be\", \"\\\\upharpoonright\", true);\ndefineSymbol(math, rel, \"\\u21c2\", \"\\\\downharpoonright\", true);\ndefineSymbol(math, rel, \"\\u21dd\", \"\\\\rightsquigarrow\", true);\ndefineSymbol(math, rel, \"\\u21dd\", \"\\\\leadsto\");\ndefineSymbol(math, rel, \"\\u21db\", \"\\\\Rrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21be\", \"\\\\restriction\");\n\ndefineSymbol(math, textord, \"\\u2018\", \"`\");\ndefineSymbol(math, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, textord, \"$\", \"\\\\textdollar\");\ndefineSymbol(math, textord, \"¢\", \"\\\\cent\");\ndefineSymbol(text, textord, \"¢\", \"\\\\cent\");\ndefineSymbol(math, textord, \"%\", \"\\\\%\");\ndefineSymbol(text, textord, \"%\", \"\\\\%\");\ndefineSymbol(math, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, textord, \"_\", \"\\\\textunderscore\");\ndefineSymbol(text, textord, \"\\u2423\", \"\\\\textvisiblespace\", true);\ndefineSymbol(math, textord, \"\\u2220\", \"\\\\angle\", true);\ndefineSymbol(math, textord, \"\\u221e\", \"\\\\infty\", true);\ndefineSymbol(math, textord, \"\\u2032\", \"\\\\prime\");\ndefineSymbol(math, textord, \"\\u2033\", \"\\\\dprime\");\ndefineSymbol(math, textord, \"\\u2034\", \"\\\\trprime\");\ndefineSymbol(math, textord, \"\\u2057\", \"\\\\qprime\");\ndefineSymbol(math, textord, \"\\u25b3\", \"\\\\triangle\");\ndefineSymbol(text, textord, \"\\u0391\", \"\\\\Alpha\", true);\ndefineSymbol(text, textord, \"\\u0392\", \"\\\\Beta\", true);\ndefineSymbol(text, textord, \"\\u0393\", \"\\\\Gamma\", true);\ndefineSymbol(text, textord, \"\\u0394\", \"\\\\Delta\", true);\ndefineSymbol(text, textord, \"\\u0395\", \"\\\\Epsilon\", true);\ndefineSymbol(text, textord, \"\\u0396\", \"\\\\Zeta\", true);\ndefineSymbol(text, textord, \"\\u0397\", \"\\\\Eta\", true);\ndefineSymbol(text, textord, \"\\u0398\", \"\\\\Theta\", true);\ndefineSymbol(text, textord, \"\\u0399\", \"\\\\Iota\", true);\ndefineSymbol(text, textord, \"\\u039a\", \"\\\\Kappa\", true);\ndefineSymbol(text, textord, \"\\u039b\", \"\\\\Lambda\", true);\ndefineSymbol(text, textord, \"\\u039c\", \"\\\\Mu\", true);\ndefineSymbol(text, textord, \"\\u039d\", \"\\\\Nu\", true);\ndefineSymbol(text, textord, \"\\u039e\", \"\\\\Xi\", true);\ndefineSymbol(text, textord, \"\\u039f\", \"\\\\Omicron\", true);\ndefineSymbol(text, textord, \"\\u03a0\", \"\\\\Pi\", true);\ndefineSymbol(text, textord, \"\\u03a1\", \"\\\\Rho\", true);\ndefineSymbol(text, textord, \"\\u03a3\", \"\\\\Sigma\", true);\ndefineSymbol(text, textord, \"\\u03a4\", \"\\\\Tau\", true);\ndefineSymbol(text, textord, \"\\u03a5\", \"\\\\Upsilon\", true);\ndefineSymbol(text, textord, \"\\u03a6\", \"\\\\Phi\", true);\ndefineSymbol(text, textord, \"\\u03a7\", \"\\\\Chi\", true);\ndefineSymbol(text, textord, \"\\u03a8\", \"\\\\Psi\", true);\ndefineSymbol(text, textord, \"\\u03a9\", \"\\\\Omega\", true);\ndefineSymbol(math, mathord, \"\\u0391\", \"\\\\Alpha\", true);\ndefineSymbol(math, mathord, \"\\u0392\", \"\\\\Beta\", true);\ndefineSymbol(math, mathord, \"\\u0393\", \"\\\\Gamma\", true);\ndefineSymbol(math, mathord, \"\\u0394\", \"\\\\Delta\", true);\ndefineSymbol(math, mathord, \"\\u0395\", \"\\\\Epsilon\", true);\ndefineSymbol(math, mathord, \"\\u0396\", \"\\\\Zeta\", true);\ndefineSymbol(math, mathord, \"\\u0397\", \"\\\\Eta\", true);\ndefineSymbol(math, mathord, \"\\u0398\", \"\\\\Theta\", true);\ndefineSymbol(math, mathord, \"\\u0399\", \"\\\\Iota\", true);\ndefineSymbol(math, mathord, \"\\u039a\", \"\\\\Kappa\", true);\ndefineSymbol(math, mathord, \"\\u039b\", \"\\\\Lambda\", true);\ndefineSymbol(math, mathord, \"\\u039c\", \"\\\\Mu\", true);\ndefineSymbol(math, mathord, \"\\u039d\", \"\\\\Nu\", true);\ndefineSymbol(math, mathord, \"\\u039e\", \"\\\\Xi\", true);\ndefineSymbol(math, mathord, \"\\u039f\", \"\\\\Omicron\", true);\ndefineSymbol(math, mathord, \"\\u03a0\", \"\\\\Pi\", true);\ndefineSymbol(math, mathord, \"\\u03a1\", \"\\\\Rho\", true);\ndefineSymbol(math, mathord, \"\\u03a3\", \"\\\\Sigma\", true);\ndefineSymbol(math, mathord, \"\\u03a4\", \"\\\\Tau\", true);\ndefineSymbol(math, mathord, \"\\u03a5\", \"\\\\Upsilon\", true);\ndefineSymbol(math, mathord, \"\\u03a6\", \"\\\\Phi\", true);\ndefineSymbol(math, mathord, \"\\u03a7\", \"\\\\Chi\", true);\ndefineSymbol(math, mathord, \"\\u03a8\", \"\\\\Psi\", true);\ndefineSymbol(math, mathord, \"\\u03a9\", \"\\\\Omega\", true);\ndefineSymbol(math, open, \"\\u00ac\", \"\\\\neg\", true);\ndefineSymbol(math, open, \"\\u00ac\", \"\\\\lnot\");\ndefineSymbol(math, textord, \"\\u22a4\", \"\\\\top\");\ndefineSymbol(math, textord, \"\\u22a5\", \"\\\\bot\");\ndefineSymbol(math, textord, \"\\u2205\", \"\\\\emptyset\");\ndefineSymbol(math, textord, \"\\u2300\", \"\\\\varnothing\");\ndefineSymbol(math, mathord, \"\\u03b1\", \"\\\\alpha\", true);\ndefineSymbol(math, mathord, \"\\u03b2\", \"\\\\beta\", true);\ndefineSymbol(math, mathord, \"\\u03b3\", \"\\\\gamma\", true);\ndefineSymbol(math, mathord, \"\\u03b4\", \"\\\\delta\", true);\ndefineSymbol(math, mathord, \"\\u03f5\", \"\\\\epsilon\", true);\ndefineSymbol(math, mathord, \"\\u03b6\", \"\\\\zeta\", true);\ndefineSymbol(math, mathord, \"\\u03b7\", \"\\\\eta\", true);\ndefineSymbol(math, mathord, \"\\u03b8\", \"\\\\theta\", true);\ndefineSymbol(math, mathord, \"\\u03b9\", \"\\\\iota\", true);\ndefineSymbol(math, mathord, \"\\u03ba\", \"\\\\kappa\", true);\ndefineSymbol(math, mathord, \"\\u03bb\", \"\\\\lambda\", true);\ndefineSymbol(math, mathord, \"\\u03bc\", \"\\\\mu\", true);\ndefineSymbol(math, mathord, \"\\u03bd\", \"\\\\nu\", true);\ndefineSymbol(math, mathord, \"\\u03be\", \"\\\\xi\", true);\ndefineSymbol(math, mathord, \"\\u03bf\", \"\\\\omicron\", true);\ndefineSymbol(math, mathord, \"\\u03c0\", \"\\\\pi\", true);\ndefineSymbol(math, mathord, \"\\u03c1\", \"\\\\rho\", true);\ndefineSymbol(math, mathord, \"\\u03c3\", \"\\\\sigma\", true);\ndefineSymbol(math, mathord, \"\\u03c4\", \"\\\\tau\", true);\ndefineSymbol(math, mathord, \"\\u03c5\", \"\\\\upsilon\", true);\ndefineSymbol(math, mathord, \"\\u03d5\", \"\\\\phi\", true);\ndefineSymbol(math, mathord, \"\\u03c7\", \"\\\\chi\", true);\ndefineSymbol(math, mathord, \"\\u03c8\", \"\\\\psi\", true);\ndefineSymbol(math, mathord, \"\\u03c9\", \"\\\\omega\", true);\ndefineSymbol(math, mathord, \"\\u03b5\", \"\\\\varepsilon\", true);\ndefineSymbol(math, mathord, \"\\u03d1\", \"\\\\vartheta\", true);\ndefineSymbol(math, mathord, \"\\u03d6\", \"\\\\varpi\", true);\ndefineSymbol(math, mathord, \"\\u03f1\", \"\\\\varrho\", true);\ndefineSymbol(math, mathord, \"\\u03c2\", \"\\\\varsigma\", true);\ndefineSymbol(math, mathord, \"\\u03c6\", \"\\\\varphi\", true);\ndefineSymbol(math, mathord, \"\\u03d8\", \"\\\\Coppa\", true);\ndefineSymbol(math, mathord, \"\\u03d9\", \"\\\\coppa\", true);\ndefineSymbol(math, mathord, \"\\u03d9\", \"\\\\varcoppa\", true);\ndefineSymbol(math, mathord, \"\\u03de\", \"\\\\Koppa\", true);\ndefineSymbol(math, mathord, \"\\u03df\", \"\\\\koppa\", true);\ndefineSymbol(math, mathord, \"\\u03e0\", \"\\\\Sampi\", true);\ndefineSymbol(math, mathord, \"\\u03e1\", \"\\\\sampi\", true);\ndefineSymbol(math, mathord, \"\\u03da\", \"\\\\Stigma\", true);\ndefineSymbol(math, mathord, \"\\u03db\", \"\\\\stigma\", true);\ndefineSymbol(math, mathord, \"\\u2aeb\", \"\\\\Bot\");\ndefineSymbol(math, bin, \"\\u2217\", \"\\u2217\", true);\ndefineSymbol(math, bin, \"+\", \"+\");\ndefineSymbol(math, bin, \"\\u2217\", \"*\");\ndefineSymbol(math, bin, \"\\u2044\", \"/\", true);\ndefineSymbol(math, bin, \"\\u2044\", \"\\u2044\");\ndefineSymbol(math, bin, \"\\u2212\", \"-\", true);\ndefineSymbol(math, bin, \"\\u22c5\", \"\\\\cdot\", true);\ndefineSymbol(math, bin, \"\\u2218\", \"\\\\circ\", true);\ndefineSymbol(math, bin, \"\\u00f7\", \"\\\\div\", true);\ndefineSymbol(math, bin, \"\\u00b1\", \"\\\\pm\", true);\ndefineSymbol(math, bin, \"\\u00d7\", \"\\\\times\", true);\ndefineSymbol(math, bin, \"\\u2229\", \"\\\\cap\", true);\ndefineSymbol(math, bin, \"\\u222a\", \"\\\\cup\", true);\ndefineSymbol(math, bin, \"\\u2216\", \"\\\\setminus\", true);\ndefineSymbol(math, bin, \"\\u2227\", \"\\\\land\");\ndefineSymbol(math, bin, \"\\u2228\", \"\\\\lor\");\ndefineSymbol(math, bin, \"\\u2227\", \"\\\\wedge\", true);\ndefineSymbol(math, bin, \"\\u2228\", \"\\\\vee\", true);\ndefineSymbol(math, open, \"\\u27e6\", \"\\\\llbracket\", true); // stmaryrd/semantic packages\ndefineSymbol(math, close, \"\\u27e7\", \"\\\\rrbracket\", true);\ndefineSymbol(math, open, \"\\u27e8\", \"\\\\langle\", true);\ndefineSymbol(math, open, \"\\u27ea\", \"\\\\lAngle\", true);\ndefineSymbol(math, open, \"\\u2989\", \"\\\\llangle\", true);\ndefineSymbol(math, open, \"|\", \"\\\\lvert\");\ndefineSymbol(math, open, \"\\u2016\", \"\\\\lVert\", true);\ndefineSymbol(math, textord, \"!\", \"\\\\oc\"); // cmll package\ndefineSymbol(math, textord, \"?\", \"\\\\wn\");\ndefineSymbol(math, textord, \"\\u2193\", \"\\\\shpos\");\ndefineSymbol(math, textord, \"\\u2195\", \"\\\\shift\");\ndefineSymbol(math, textord, \"\\u2191\", \"\\\\shneg\");\ndefineSymbol(math, close, \"?\", \"?\");\ndefineSymbol(math, close, \"!\", \"!\");\ndefineSymbol(math, close, \"‼\", \"‼\");\ndefineSymbol(math, close, \"\\u27e9\", \"\\\\rangle\", true);\ndefineSymbol(math, close, \"\\u27eb\", \"\\\\rAngle\", true);\ndefineSymbol(math, close, \"\\u298a\", \"\\\\rrangle\", true);\ndefineSymbol(math, close, \"|\", \"\\\\rvert\");\ndefineSymbol(math, close, \"\\u2016\", \"\\\\rVert\");\ndefineSymbol(math, open, \"\\u2983\", \"\\\\lBrace\", true); // stmaryrd/semantic packages\ndefineSymbol(math, close, \"\\u2984\", \"\\\\rBrace\", true);\ndefineSymbol(math, rel, \"=\", \"\\\\equal\", true);\ndefineSymbol(math, rel, \":\", \":\");\ndefineSymbol(math, rel, \"\\u2248\", \"\\\\approx\", true);\ndefineSymbol(math, rel, \"\\u2245\", \"\\\\cong\", true);\ndefineSymbol(math, rel, \"\\u2265\", \"\\\\ge\");\ndefineSymbol(math, rel, \"\\u2265\", \"\\\\geq\", true);\ndefineSymbol(math, rel, \"\\u2190\", \"\\\\gets\");\ndefineSymbol(math, rel, \">\", \"\\\\gt\", true);\ndefineSymbol(math, rel, \"\\u2208\", \"\\\\in\", true);\ndefineSymbol(math, rel, \"\\u2209\", \"\\\\notin\", true);\ndefineSymbol(math, rel, \"\\ue020\", \"\\\\@not\");\ndefineSymbol(math, rel, \"\\u2282\", \"\\\\subset\", true);\ndefineSymbol(math, rel, \"\\u2283\", \"\\\\supset\", true);\ndefineSymbol(math, rel, \"\\u2286\", \"\\\\subseteq\", true);\ndefineSymbol(math, rel, \"\\u2287\", \"\\\\supseteq\", true);\ndefineSymbol(math, rel, \"\\u2288\", \"\\\\nsubseteq\", true);\ndefineSymbol(math, rel, \"\\u2288\", \"\\\\nsubseteqq\");\ndefineSymbol(math, rel, \"\\u2289\", \"\\\\nsupseteq\", true);\ndefineSymbol(math, rel, \"\\u2289\", \"\\\\nsupseteqq\");\ndefineSymbol(math, rel, \"\\u22a8\", \"\\\\models\");\ndefineSymbol(math, rel, \"\\u2190\", \"\\\\leftarrow\", true);\ndefineSymbol(math, rel, \"\\u2264\", \"\\\\le\");\ndefineSymbol(math, rel, \"\\u2264\", \"\\\\leq\", true);\ndefineSymbol(math, rel, \"<\", \"\\\\lt\", true);\ndefineSymbol(math, rel, \"\\u2192\", \"\\\\rightarrow\", true);\ndefineSymbol(math, rel, \"\\u2192\", \"\\\\to\");\ndefineSymbol(math, rel, \"\\u2271\", \"\\\\ngeq\", true);\ndefineSymbol(math, rel, \"\\u2271\", \"\\\\ngeqq\");\ndefineSymbol(math, rel, \"\\u2271\", \"\\\\ngeqslant\");\ndefineSymbol(math, rel, \"\\u2270\", \"\\\\nleq\", true);\ndefineSymbol(math, rel, \"\\u2270\", \"\\\\nleqq\");\ndefineSymbol(math, rel, \"\\u2270\", \"\\\\nleqslant\");\ndefineSymbol(math, rel, \"\\u2aeb\", \"\\\\Perp\", true); //cmll package\ndefineSymbol(math, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(math, spacing, \"\\u00a0\", \"\\\\space\");\n// Ref: LaTeX Source 2e: \\DeclareRobustCommand{\\nobreakspace}{%\ndefineSymbol(math, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(text, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(text, spacing, \"\\u00a0\", \" \");\ndefineSymbol(text, spacing, \"\\u00a0\", \"\\\\space\");\ndefineSymbol(text, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(math, spacing, null, \"\\\\nobreak\");\ndefineSymbol(math, spacing, null, \"\\\\allowbreak\");\ndefineSymbol(math, punct, \",\", \",\");\ndefineSymbol(text, punct, \":\", \":\");\ndefineSymbol(math, punct, \";\", \";\");\ndefineSymbol(math, bin, \"\\u22bc\", \"\\\\barwedge\");\ndefineSymbol(math, bin, \"\\u22bb\", \"\\\\veebar\");\ndefineSymbol(math, bin, \"\\u2299\", \"\\\\odot\", true);\n// Firefox turns ⊕ into an emoji. So append \\uFE0E. Define Unicode character in macros, not here.\ndefineSymbol(math, bin, \"\\u2295\\uFE0E\", \"\\\\oplus\");\ndefineSymbol(math, bin, \"\\u2297\", \"\\\\otimes\", true);\ndefineSymbol(math, textord, \"\\u2202\", \"\\\\partial\", true);\ndefineSymbol(math, bin, \"\\u2298\", \"\\\\oslash\", true);\ndefineSymbol(math, bin, \"\\u229a\", \"\\\\circledcirc\", true);\ndefineSymbol(math, bin, \"\\u22a1\", \"\\\\boxdot\", true);\ndefineSymbol(math, bin, \"\\u25b3\", \"\\\\bigtriangleup\");\ndefineSymbol(math, bin, \"\\u25bd\", \"\\\\bigtriangledown\");\ndefineSymbol(math, bin, \"\\u2020\", \"\\\\dagger\");\ndefineSymbol(math, bin, \"\\u22c4\", \"\\\\diamond\");\ndefineSymbol(math, bin, \"\\u25c3\", \"\\\\triangleleft\");\ndefineSymbol(math, bin, \"\\u25b9\", \"\\\\triangleright\");\ndefineSymbol(math, open, \"{\", \"\\\\{\");\ndefineSymbol(text, textord, \"{\", \"\\\\{\");\ndefineSymbol(text, textord, \"{\", \"\\\\textbraceleft\");\ndefineSymbol(math, close, \"}\", \"\\\\}\");\ndefineSymbol(text, textord, \"}\", \"\\\\}\");\ndefineSymbol(text, textord, \"}\", \"\\\\textbraceright\");\ndefineSymbol(math, open, \"{\", \"\\\\lbrace\");\ndefineSymbol(math, close, \"}\", \"\\\\rbrace\");\ndefineSymbol(math, open, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(text, textord, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(math, close, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(text, textord, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(math, open, \"(\", \"\\\\lparen\", true);\ndefineSymbol(math, close, \")\", \"\\\\rparen\", true);\ndefineSymbol(math, open, \"⦇\", \"\\\\llparenthesis\", true);\ndefineSymbol(math, close, \"⦈\", \"\\\\rrparenthesis\", true);\ndefineSymbol(text, textord, \"<\", \"\\\\textless\", true); // in T1 fontenc\ndefineSymbol(text, textord, \">\", \"\\\\textgreater\", true); // in T1 fontenc\ndefineSymbol(math, open, \"\\u230a\", \"\\\\lfloor\", true);\ndefineSymbol(math, close, \"\\u230b\", \"\\\\rfloor\", true);\ndefineSymbol(math, open, \"\\u2308\", \"\\\\lceil\", true);\ndefineSymbol(math, close, \"\\u2309\", \"\\\\rceil\", true);\ndefineSymbol(math, textord, \"\\\\\", \"\\\\backslash\");\ndefineSymbol(math, textord, \"|\", \"|\");\ndefineSymbol(math, textord, \"|\", \"\\\\vert\");\ndefineSymbol(text, textord, \"|\", \"\\\\textbar\", true); // in T1 fontenc\ndefineSymbol(math, textord, \"\\u2016\", \"\\\\|\");\ndefineSymbol(math, textord, \"\\u2016\", \"\\\\Vert\");\ndefineSymbol(text, textord, \"\\u2016\", \"\\\\textbardbl\");\ndefineSymbol(text, textord, \"~\", \"\\\\textasciitilde\");\ndefineSymbol(text, textord, \"\\\\\", \"\\\\textbackslash\");\ndefineSymbol(text, textord, \"^\", \"\\\\textasciicircum\");\ndefineSymbol(math, rel, \"\\u2191\", \"\\\\uparrow\", true);\ndefineSymbol(math, rel, \"\\u21d1\", \"\\\\Uparrow\", true);\ndefineSymbol(math, rel, \"\\u2193\", \"\\\\downarrow\", true);\ndefineSymbol(math, rel, \"\\u21d3\", \"\\\\Downarrow\", true);\ndefineSymbol(math, rel, \"\\u2195\", \"\\\\updownarrow\", true);\ndefineSymbol(math, rel, \"\\u21d5\", \"\\\\Updownarrow\", true);\ndefineSymbol(math, op, \"\\u2210\", \"\\\\coprod\");\ndefineSymbol(math, op, \"\\u22c1\", \"\\\\bigvee\");\ndefineSymbol(math, op, \"\\u22c0\", \"\\\\bigwedge\");\ndefineSymbol(math, op, \"\\u2a04\", \"\\\\biguplus\");\ndefineSymbol(math, op, \"\\u2a04\", \"\\\\bigcupplus\");\ndefineSymbol(math, op, \"\\u2a03\", \"\\\\bigcupdot\");\ndefineSymbol(math, op, \"\\u2a07\", \"\\\\bigdoublevee\");\ndefineSymbol(math, op, \"\\u2a08\", \"\\\\bigdoublewedge\");\ndefineSymbol(math, op, \"\\u22c2\", \"\\\\bigcap\");\ndefineSymbol(math, op, \"\\u22c3\", \"\\\\bigcup\");\ndefineSymbol(math, op, \"\\u222b\", \"\\\\int\");\ndefineSymbol(math, op, \"\\u222b\", \"\\\\intop\");\ndefineSymbol(math, op, \"\\u222c\", \"\\\\iint\");\ndefineSymbol(math, op, \"\\u222d\", \"\\\\iiint\");\ndefineSymbol(math, op, \"\\u220f\", \"\\\\prod\");\ndefineSymbol(math, op, \"\\u2211\", \"\\\\sum\");\ndefineSymbol(math, op, \"\\u2a02\", \"\\\\bigotimes\");\ndefineSymbol(math, op, \"\\u2a01\", \"\\\\bigoplus\");\ndefineSymbol(math, op, \"\\u2a00\", \"\\\\bigodot\");\ndefineSymbol(math, op, \"\\u2a09\", \"\\\\bigtimes\");\ndefineSymbol(math, op, \"\\u222e\", \"\\\\oint\");\ndefineSymbol(math, op, \"\\u222f\", \"\\\\oiint\");\ndefineSymbol(math, op, \"\\u2230\", \"\\\\oiiint\");\ndefineSymbol(math, op, \"\\u2231\", \"\\\\intclockwise\");\ndefineSymbol(math, op, \"\\u2232\", \"\\\\varointclockwise\");\ndefineSymbol(math, op, \"\\u2a0c\", \"\\\\iiiint\");\ndefineSymbol(math, op, \"\\u2a0d\", \"\\\\intbar\");\ndefineSymbol(math, op, \"\\u2a0e\", \"\\\\intBar\");\ndefineSymbol(math, op, \"\\u2a0f\", \"\\\\fint\");\ndefineSymbol(math, op, \"\\u2a12\", \"\\\\rppolint\");\ndefineSymbol(math, op, \"\\u2a13\", \"\\\\scpolint\");\ndefineSymbol(math, op, \"\\u2a15\", \"\\\\pointint\");\ndefineSymbol(math, op, \"\\u2a16\", \"\\\\sqint\");\ndefineSymbol(math, op, \"\\u2a17\", \"\\\\intlarhk\");\ndefineSymbol(math, op, \"\\u2a18\", \"\\\\intx\");\ndefineSymbol(math, op, \"\\u2a19\", \"\\\\intcap\");\ndefineSymbol(math, op, \"\\u2a1a\", \"\\\\intcup\");\ndefineSymbol(math, op, \"\\u2a05\", \"\\\\bigsqcap\");\ndefineSymbol(math, op, \"\\u2a06\", \"\\\\bigsqcup\");\ndefineSymbol(math, op, \"\\u222b\", \"\\\\smallint\");\ndefineSymbol(text, inner, \"\\u2026\", \"\\\\textellipsis\");\ndefineSymbol(math, inner, \"\\u2026\", \"\\\\mathellipsis\");\ndefineSymbol(text, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, inner, \"\\u22f0\", \"\\\\iddots\", true);\ndefineSymbol(math, inner, \"\\u22ef\", \"\\\\@cdots\", true);\ndefineSymbol(math, inner, \"\\u22f1\", \"\\\\ddots\", true);\ndefineSymbol(math, textord, \"\\u22ee\", \"\\\\varvdots\"); // \\vdots is a macro\ndefineSymbol(text, textord, \"\\u22ee\", \"\\\\varvdots\");\ndefineSymbol(math, accent, \"\\u02ca\", \"\\\\acute\");\ndefineSymbol(math, accent, \"\\u0060\", \"\\\\grave\");\ndefineSymbol(math, accent, \"\\u00a8\", \"\\\\ddot\");\ndefineSymbol(math, accent, \"\\u2026\", \"\\\\dddot\");\ndefineSymbol(math, accent, \"\\u2026\\u002e\", \"\\\\ddddot\");\ndefineSymbol(math, accent, \"\\u007e\", \"\\\\tilde\");\ndefineSymbol(math, accent, \"\\u203e\", \"\\\\bar\");\ndefineSymbol(math, accent, \"\\u02d8\", \"\\\\breve\");\ndefineSymbol(math, accent, \"\\u02c7\", \"\\\\check\");\ndefineSymbol(math, accent, \"\\u005e\", \"\\\\hat\");\ndefineSymbol(math, accent, \"\\u2192\", \"\\\\vec\");\ndefineSymbol(math, accent, \"\\u02d9\", \"\\\\dot\");\ndefineSymbol(math, accent, \"\\u02da\", \"\\\\mathring\");\ndefineSymbol(math, mathord, \"\\u0131\", \"\\\\imath\", true);\ndefineSymbol(math, mathord, \"\\u0237\", \"\\\\jmath\", true);\ndefineSymbol(math, textord, \"\\u0131\", \"\\u0131\");\ndefineSymbol(math, textord, \"\\u0237\", \"\\u0237\");\ndefineSymbol(text, textord, \"\\u0131\", \"\\\\i\", true);\ndefineSymbol(text, textord, \"\\u0237\", \"\\\\j\", true);\ndefineSymbol(text, textord, \"\\u00df\", \"\\\\ss\", true);\ndefineSymbol(text, textord, \"\\u00e6\", \"\\\\ae\", true);\ndefineSymbol(text, textord, \"\\u0153\", \"\\\\oe\", true);\ndefineSymbol(text, textord, \"\\u00f8\", \"\\\\o\", true);\ndefineSymbol(math, mathord, \"\\u00f8\", \"\\\\o\", true);\ndefineSymbol(text, textord, \"\\u00c6\", \"\\\\AE\", true);\ndefineSymbol(text, textord, \"\\u0152\", \"\\\\OE\", true);\ndefineSymbol(text, textord, \"\\u00d8\", \"\\\\O\", true);\ndefineSymbol(math, mathord, \"\\u00d8\", \"\\\\O\", true);\ndefineSymbol(text, accent, \"\\u02ca\", \"\\\\'\"); // acute\ndefineSymbol(text, accent, \"\\u02cb\", \"\\\\`\"); // grave\ndefineSymbol(text, accent, \"\\u02c6\", \"\\\\^\"); // circumflex\ndefineSymbol(text, accent, \"\\u02dc\", \"\\\\~\"); // tilde\ndefineSymbol(text, accent, \"\\u02c9\", \"\\\\=\"); // macron\ndefineSymbol(text, accent, \"\\u02d8\", \"\\\\u\"); // breve\ndefineSymbol(text, accent, \"\\u02d9\", \"\\\\.\"); // dot above\ndefineSymbol(text, accent, \"\\u00b8\", \"\\\\c\"); // cedilla\ndefineSymbol(text, accent, \"\\u02da\", \"\\\\r\"); // ring above\ndefineSymbol(text, accent, \"\\u02c7\", \"\\\\v\"); // caron\ndefineSymbol(text, accent, \"\\u00a8\", '\\\\\"'); // diaeresis\ndefineSymbol(text, accent, \"\\u02dd\", \"\\\\H\"); // double acute\ndefineSymbol(math, accent, \"\\u02ca\", \"\\\\'\"); // acute\ndefineSymbol(math, accent, \"\\u02cb\", \"\\\\`\"); // grave\ndefineSymbol(math, accent, \"\\u02c6\", \"\\\\^\"); // circumflex\ndefineSymbol(math, accent, \"\\u02dc\", \"\\\\~\"); // tilde\ndefineSymbol(math, accent, \"\\u02c9\", \"\\\\=\"); // macron\ndefineSymbol(math, accent, \"\\u02d8\", \"\\\\u\"); // breve\ndefineSymbol(math, accent, \"\\u02d9\", \"\\\\.\"); // dot above\ndefineSymbol(math, accent, \"\\u00b8\", \"\\\\c\"); // cedilla\ndefineSymbol(math, accent, \"\\u02da\", \"\\\\r\"); // ring above\ndefineSymbol(math, accent, \"\\u02c7\", \"\\\\v\"); // caron\ndefineSymbol(math, accent, \"\\u00a8\", '\\\\\"'); // diaeresis\ndefineSymbol(math, accent, \"\\u02dd\", \"\\\\H\"); // double acute\n\n// These ligatures are detected and created in Parser.js's `formLigatures`.\nconst ligatures = {\n \"--\": true,\n \"---\": true,\n \"``\": true,\n \"''\": true\n};\n\ndefineSymbol(text, textord, \"\\u2013\", \"--\", true);\ndefineSymbol(text, textord, \"\\u2013\", \"\\\\textendash\");\ndefineSymbol(text, textord, \"\\u2014\", \"---\", true);\ndefineSymbol(text, textord, \"\\u2014\", \"\\\\textemdash\");\ndefineSymbol(text, textord, \"\\u2018\", \"`\", true);\ndefineSymbol(text, textord, \"\\u2018\", \"\\\\textquoteleft\");\ndefineSymbol(text, textord, \"\\u2019\", \"'\", true);\ndefineSymbol(text, textord, \"\\u2019\", \"\\\\textquoteright\");\ndefineSymbol(text, textord, \"\\u201c\", \"``\", true);\ndefineSymbol(text, textord, \"\\u201c\", \"\\\\textquotedblleft\");\ndefineSymbol(text, textord, \"\\u201d\", \"''\", true);\ndefineSymbol(text, textord, \"\\u201d\", \"\\\\textquotedblright\");\n// \\degree from gensymb package\ndefineSymbol(math, textord, \"\\u00b0\", \"\\\\degree\", true);\ndefineSymbol(text, textord, \"\\u00b0\", \"\\\\degree\");\n// \\textdegree from inputenc package\ndefineSymbol(text, textord, \"\\u00b0\", \"\\\\textdegree\", true);\n// TODO: In LaTeX, \\pounds can generate a different character in text and math\n// mode, but among our fonts, only Main-Regular defines this character \"163\".\ndefineSymbol(math, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(math, textord, \"\\u00a3\", \"\\\\mathsterling\", true);\ndefineSymbol(text, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(text, textord, \"\\u00a3\", \"\\\\textsterling\", true);\ndefineSymbol(math, textord, \"\\u2720\", \"\\\\maltese\");\ndefineSymbol(text, textord, \"\\u2720\", \"\\\\maltese\");\ndefineSymbol(math, textord, \"\\u20ac\", \"\\\\euro\", true);\ndefineSymbol(text, textord, \"\\u20ac\", \"\\\\euro\", true);\ndefineSymbol(text, textord, \"\\u20ac\", \"\\\\texteuro\");\ndefineSymbol(math, textord, \"\\u00a9\", \"\\\\copyright\", true);\ndefineSymbol(text, textord, \"\\u00a9\", \"\\\\textcopyright\");\ndefineSymbol(math, textord, \"\\u2300\", \"\\\\diameter\", true);\ndefineSymbol(text, textord, \"\\u2300\", \"\\\\diameter\");\n\n// Italic Greek\ndefineSymbol(math, textord, \"𝛤\", \"\\\\varGamma\");\ndefineSymbol(math, textord, \"𝛥\", \"\\\\varDelta\");\ndefineSymbol(math, textord, \"𝛩\", \"\\\\varTheta\");\ndefineSymbol(math, textord, \"𝛬\", \"\\\\varLambda\");\ndefineSymbol(math, textord, \"𝛯\", \"\\\\varXi\");\ndefineSymbol(math, textord, \"𝛱\", \"\\\\varPi\");\ndefineSymbol(math, textord, \"𝛴\", \"\\\\varSigma\");\ndefineSymbol(math, textord, \"𝛶\", \"\\\\varUpsilon\");\ndefineSymbol(math, textord, \"𝛷\", \"\\\\varPhi\");\ndefineSymbol(math, textord, \"𝛹\", \"\\\\varPsi\");\ndefineSymbol(math, textord, \"𝛺\", \"\\\\varOmega\");\ndefineSymbol(text, textord, \"𝛤\", \"\\\\varGamma\");\ndefineSymbol(text, textord, \"𝛥\", \"\\\\varDelta\");\ndefineSymbol(text, textord, \"𝛩\", \"\\\\varTheta\");\ndefineSymbol(text, textord, \"𝛬\", \"\\\\varLambda\");\ndefineSymbol(text, textord, \"𝛯\", \"\\\\varXi\");\ndefineSymbol(text, textord, \"𝛱\", \"\\\\varPi\");\ndefineSymbol(text, textord, \"𝛴\", \"\\\\varSigma\");\ndefineSymbol(text, textord, \"𝛶\", \"\\\\varUpsilon\");\ndefineSymbol(text, textord, \"𝛷\", \"\\\\varPhi\");\ndefineSymbol(text, textord, \"𝛹\", \"\\\\varPsi\");\ndefineSymbol(text, textord, \"𝛺\", \"\\\\varOmega\");\n\n\n// There are lots of symbols which are the same, so we add them in afterwards.\n// All of these are textords in math mode\nconst mathTextSymbols = '0123456789/@.\"';\nfor (let i = 0; i < mathTextSymbols.length; i++) {\n const ch = mathTextSymbols.charAt(i);\n defineSymbol(math, textord, ch, ch);\n}\n\n// All of these are textords in text mode\nconst textSymbols = '0123456789!@*()-=+\";:?/.,';\nfor (let i = 0; i < textSymbols.length; i++) {\n const ch = textSymbols.charAt(i);\n defineSymbol(text, textord, ch, ch);\n}\n\n// All of these are textords in text mode, and mathords in math mode\nconst letters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nfor (let i = 0; i < letters.length; i++) {\n const ch = letters.charAt(i);\n defineSymbol(math, mathord, ch, ch);\n defineSymbol(text, textord, ch, ch);\n}\n\n// Some more letters in Unicode Basic Multilingual Plane.\nconst narrow = \"ÇÐÞçþℂℍℕℙℚℝℤℎℏℊℋℌℐℑℒℓ℘ℛℜℬℰℱℳℭℨ\";\nfor (let i = 0; i < narrow.length; i++) {\n const ch = narrow.charAt(i);\n defineSymbol(math, mathord, ch, ch);\n defineSymbol(text, textord, ch, ch);\n}\n\n// The next loop loads wide (surrogate pair) characters.\n// We support some letters in the Unicode range U+1D400 to U+1D7FF,\n// Mathematical Alphanumeric Symbols.\nlet wideChar = \"\";\nfor (let i = 0; i < letters.length; i++) {\n // The hex numbers in the next line are a surrogate pair.\n // 0xD835 is the high surrogate for all letters in the range we support.\n // 0xDC00 is the low surrogate for bold A.\n wideChar = String.fromCharCode(0xd835, 0xdc00 + i); // A-Z a-z bold\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdc34 + i); // A-Z a-z italic\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdc68 + i); // A-Z a-z bold italic\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdd04 + i); // A-Z a-z Fractur\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdda0 + i); // A-Z a-z sans-serif\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xddd4 + i); // A-Z a-z sans bold\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xde08 + i); // A-Z a-z sans italic\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xde70 + i); // A-Z a-z monospace\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdd38 + i); // A-Z a-z double struck\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n const ch = letters.charAt(i);\n wideChar = String.fromCharCode(0xd835, 0xdc9c + i); // A-Z a-z calligraphic\n defineSymbol(math, mathord, ch, wideChar);\n defineSymbol(text, textord, ch, wideChar);\n}\n\n// Next, some wide character numerals\nfor (let i = 0; i < 10; i++) {\n wideChar = String.fromCharCode(0xd835, 0xdfce + i); // 0-9 bold\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdfe2 + i); // 0-9 sans serif\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdfec + i); // 0-9 bold sans\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n\n wideChar = String.fromCharCode(0xd835, 0xdff6 + i); // 0-9 monospace\n defineSymbol(math, mathord, wideChar, wideChar);\n defineSymbol(text, textord, wideChar, wideChar);\n}\n\n/*\n * Neither Firefox nor Chrome support hard line breaks or soft line breaks.\n * (Despite https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs)\n * So Temml has work-arounds for both hard and soft breaks.\n * The work-arounds sadly do not work simultaneously. Any top-level hard\n * break makes soft line breaks impossible.\n *\n * Hard breaks are simulated by creating a <mtable> and putting each line in its own <mtr>.\n *\n * To create soft line breaks, Temml avoids using the <semantics> and <annotation> tags.\n * Then the top level of a <math> element can be occupied by <mrow> elements, and the browser\n * will break after a <mrow> if the expression extends beyond the container limit.\n *\n * The default is for soft line breaks after each top-level binary or\n * relational operator, per TeXbook p. 173. So we gather the expression into <mrow>s so that\n * each <mrow> ends in a binary or relational operator.\n *\n * An option is for soft line breaks before an \"=\" sign. That changes the <mrow>s.\n *\n * Soft line breaks will not work in Chromium and Safari, only Firefox.\n *\n * Hopefully browsers will someday do their own linebreaking and we will be able to delete\n * much of this module.\n */\n\nconst openDelims = \"([{⌊⌈⟨⟮⎰⟦⦃\";\nconst closeDelims = \")]}⌋⌉⟩⟯⎱⟦⦄\";\n\nfunction setLineBreaks(expression, wrapMode, isDisplayMode) {\n const mtrs = [];\n let mrows = [];\n let block = [];\n let numTopLevelEquals = 0;\n let i = 0;\n let level = 0;\n while (i < expression.length) {\n while (expression[i] instanceof DocumentFragment) {\n expression.splice(i, 1, ...expression[i].children); // Expand the fragment.\n }\n const node = expression[i];\n if (node.attributes && node.attributes.linebreak &&\n node.attributes.linebreak === \"newline\") {\n // A hard line break. Create a <mtr> for the current block.\n if (block.length > 0) {\n mrows.push(new mathMLTree.MathNode(\"mrow\", block));\n }\n mrows.push(node);\n block = [];\n const mtd = new mathMLTree.MathNode(\"mtd\", mrows);\n mtd.style.textAlign = \"left\";\n mtrs.push(new mathMLTree.MathNode(\"mtr\", [mtd]));\n mrows = [];\n i += 1;\n continue\n }\n block.push(node);\n if (node.type && node.type === \"mo\" && node.children.length === 1 &&\n !Object.prototype.hasOwnProperty.call(node.attributes, \"movablelimits\")) {\n const ch = node.children[0].text;\n if (openDelims.indexOf(ch) > -1) {\n level += 1;\n } else if (closeDelims.indexOf(ch) > -1) {\n level -= 1;\n } else if (level === 0 && wrapMode === \"=\" && ch === \"=\") {\n numTopLevelEquals += 1;\n if (numTopLevelEquals > 1) {\n block.pop();\n // Start a new block. (Insert a soft linebreak.)\n const element = new mathMLTree.MathNode(\"mrow\", block);\n mrows.push(element);\n block = [node];\n }\n } else if (level === 0 && wrapMode === \"tex\" && ch !== \"∇\") {\n // Check if the following node is a \\nobreak text node, e.g. \"~\"\"\n const next = i < expression.length - 1 ? expression[i + 1] : null;\n let glueIsFreeOfNobreak = true;\n if (\n !(\n next &&\n next.type === \"mtext\" &&\n next.attributes.linebreak &&\n next.attributes.linebreak === \"nobreak\"\n )\n ) {\n // We may need to start a new block.\n // First, put any post-operator glue on same line as operator.\n for (let j = i + 1; j < expression.length; j++) {\n const nd = expression[j];\n if (\n nd.type &&\n nd.type === \"mspace\" &&\n !(nd.attributes.linebreak && nd.attributes.linebreak === \"newline\")\n ) {\n block.push(nd);\n i += 1;\n if (\n nd.attributes &&\n nd.attributes.linebreak &&\n nd.attributes.linebreak === \"nobreak\"\n ) {\n glueIsFreeOfNobreak = false;\n }\n } else {\n break;\n }\n }\n }\n if (glueIsFreeOfNobreak) {\n // Start a new block. (Insert a soft linebreak.)\n const element = new mathMLTree.MathNode(\"mrow\", block);\n mrows.push(element);\n block = [];\n }\n }\n }\n i += 1;\n }\n if (block.length > 0) {\n const element = new mathMLTree.MathNode(\"mrow\", block);\n mrows.push(element);\n }\n if (mtrs.length > 0) {\n const mtd = new mathMLTree.MathNode(\"mtd\", mrows);\n mtd.style.textAlign = \"left\";\n const mtr = new mathMLTree.MathNode(\"mtr\", [mtd]);\n mtrs.push(mtr);\n const mtable = new mathMLTree.MathNode(\"mtable\", mtrs);\n if (!isDisplayMode) {\n mtable.setAttribute(\"columnalign\", \"left\");\n mtable.setAttribute(\"rowspacing\", \"0em\");\n }\n return mtable\n }\n return mathMLTree.newDocumentFragment(mrows);\n}\n\n/**\n * This file converts a parse tree into a corresponding MathML tree. The main\n * entry point is the `buildMathML` function, which takes a parse tree from the\n * parser.\n */\n\n\n/**\n * Takes a symbol and converts it into a MathML text node after performing\n * optional replacement from symbols.js.\n */\nconst makeText = function(text, mode, style) {\n if (\n symbols[mode][text] &&\n symbols[mode][text].replace &&\n text.charCodeAt(0) !== 0xd835 &&\n !(\n Object.prototype.hasOwnProperty.call(ligatures, text) &&\n style &&\n ((style.fontFamily && style.fontFamily.slice(4, 6) === \"tt\") ||\n (style.font && style.font.slice(4, 6) === \"tt\"))\n )\n ) {\n text = symbols[mode][text].replace;\n }\n\n return new mathMLTree.TextNode(text);\n};\n\nconst copyChar = (newRow, child) => {\n if (newRow.children.length === 0 ||\n newRow.children[newRow.children.length - 1].type !== \"mtext\") {\n const mtext = new mathMLTree.MathNode(\n \"mtext\",\n [new mathMLTree.TextNode(child.children[0].text)]\n );\n newRow.children.push(mtext);\n } else {\n newRow.children[newRow.children.length - 1].children[0].text += child.children[0].text;\n }\n};\n\nconst consolidateText = mrow => {\n // If possible, consolidate adjacent <mtext> elements into a single element.\n if (mrow.type !== \"mrow\" && mrow.type !== \"mstyle\") { return mrow }\n if (mrow.children.length === 0) { return mrow } // empty group, e.g., \\text{}\n const newRow = new mathMLTree.MathNode(\"mrow\");\n for (let i = 0; i < mrow.children.length; i++) {\n const child = mrow.children[i];\n if (child.type === \"mtext\" && Object.keys(child.attributes).length === 0) {\n copyChar(newRow, child);\n } else if (child.type === \"mrow\") {\n // We'll also check the children of an mrow. One level only. No recursion.\n let canConsolidate = true;\n for (let j = 0; j < child.children.length; j++) {\n const grandChild = child.children[j];\n if (grandChild.type !== \"mtext\" || Object.keys(child.attributes).length !== 0) {\n canConsolidate = false;\n break\n }\n }\n if (canConsolidate) {\n for (let j = 0; j < child.children.length; j++) {\n const grandChild = child.children[j];\n copyChar(newRow, grandChild);\n }\n } else {\n newRow.children.push(child);\n }\n } else {\n newRow.children.push(child);\n }\n }\n for (let i = 0; i < newRow.children.length; i++) {\n if (newRow.children[i].type === \"mtext\") {\n const mtext = newRow.children[i];\n // Firefox does not render a space at either end of an <mtext> string.\n // To get proper rendering, we replace leading or trailing spaces with no-break spaces.\n if (mtext.children[0].text.charAt(0) === \" \") {\n mtext.children[0].text = \"\\u00a0\" + mtext.children[0].text.slice(1);\n }\n const L = mtext.children[0].text.length;\n if (L > 0 && mtext.children[0].text.charAt(L - 1) === \" \") {\n mtext.children[0].text = mtext.children[0].text.slice(0, -1) + \"\\u00a0\";\n }\n for (const [key, value] of Object.entries(mrow.attributes)) {\n mtext.attributes[key] = value;\n }\n }\n }\n if (newRow.children.length === 1 && newRow.children[0].type === \"mtext\") {\n return newRow.children[0]; // A consolidated <mtext>\n } else {\n return newRow\n }\n};\n\n/**\n * Wrap the given array of nodes in an <mrow> node if needed, i.e.,\n * unless the array has length 1. Always returns a single node.\n */\nconst makeRow = function(body, semisimple = false) {\n if (body.length === 1 && !(body[0] instanceof DocumentFragment)) {\n return body[0];\n } else if (!semisimple) {\n // Suppress spacing on <mo> nodes at both ends of the row.\n if (body[0] instanceof MathNode && body[0].type === \"mo\" && !body[0].attributes.fence) {\n body[0].attributes.lspace = \"0em\";\n body[0].attributes.rspace = \"0em\";\n }\n const end = body.length - 1;\n if (body[end] instanceof MathNode && body[end].type === \"mo\" && !body[end].attributes.fence) {\n body[end].attributes.lspace = \"0em\";\n body[end].attributes.rspace = \"0em\";\n }\n }\n return new mathMLTree.MathNode(\"mrow\", body);\n};\n\n/**\n * Check for <mi>.</mi> which is how a dot renders in MathML,\n * or <mo separator=\"true\" lspace=\"0em\" rspace=\"0em\">,</mo>\n * which is how a braced comma {,} renders in MathML\n */\nfunction isNumberPunctuation(group) {\n if (!group) {\n return false\n }\n if (group.type === 'mi' && group.children.length === 1) {\n const child = group.children[0];\n return child instanceof TextNode && child.text === '.'\n } else if (group.type === \"mtext\" && group.children.length === 1) {\n const child = group.children[0];\n return child instanceof TextNode && child.text === '\\u2008' // punctuation space\n } else if (group.type === 'mo' && group.children.length === 1 &&\n group.getAttribute('separator') === 'true' &&\n group.getAttribute('lspace') === '0em' &&\n group.getAttribute('rspace') === '0em') {\n const child = group.children[0];\n return child instanceof TextNode && child.text === ','\n } else {\n return false\n }\n}\nconst isComma = (expression, i) => {\n const node = expression[i];\n const followingNode = expression[i + 1];\n return (node.type === \"atom\" && node.text === \",\") &&\n // Don't consolidate if there is a space after the comma.\n node.loc && followingNode.loc && node.loc.end === followingNode.loc.start\n};\n\nconst isRel = item => {\n return (item.type === \"atom\" && item.family === \"rel\") ||\n (item.type === \"mclass\" && item.mclass === \"mrel\")\n};\n\n/**\n * Takes a list of nodes, builds them, and returns a list of the generated\n * MathML nodes. Also do a couple chores along the way:\n * (1) Suppress spacing when an author wraps an operator w/braces, as in {=}.\n * (2) Suppress spacing between two adjacent relations.\n */\nconst buildExpression = function(expression, style, semisimple = false) {\n if (!semisimple && expression.length === 1) {\n const group = buildGroup$1(expression[0], style);\n if (group instanceof MathNode && group.type === \"mo\") {\n // When TeX writers want to suppress spacing on an operator,\n // they often put the operator by itself inside braces.\n group.setAttribute(\"lspace\", \"0em\");\n group.setAttribute(\"rspace\", \"0em\");\n }\n return [group];\n }\n\n const groups = [];\n const groupArray = [];\n let lastGroup;\n for (let i = 0; i < expression.length; i++) {\n groupArray.push(buildGroup$1(expression[i], style));\n }\n\n for (let i = 0; i < groupArray.length; i++) {\n const group = groupArray[i];\n\n // Suppress spacing between adjacent relations\n if (i < expression.length - 1 && isRel(expression[i]) && isRel(expression[i + 1])) {\n group.setAttribute(\"rspace\", \"0em\");\n }\n if (i > 0 && isRel(expression[i]) && isRel(expression[i - 1])) {\n group.setAttribute(\"lspace\", \"0em\");\n }\n\n // Concatenate numbers\n if (group.type === 'mn' && lastGroup && lastGroup.type === 'mn') {\n // Concatenate <mn>...</mn> followed by <mi>.</mi>\n lastGroup.children.push(...group.children);\n continue\n } else if (isNumberPunctuation(group) && lastGroup && lastGroup.type === 'mn') {\n // Concatenate <mn>...</mn> followed by <mi>.</mi>\n lastGroup.children.push(...group.children);\n continue\n } else if (lastGroup && lastGroup.type === \"mn\" && i < groupArray.length - 1 &&\n groupArray[i + 1].type === \"mn\" && isComma(expression, i)) {\n lastGroup.children.push(...group.children);\n continue\n } else if (group.type === 'mn' && isNumberPunctuation(lastGroup)) {\n // Concatenate <mi>.</mi> followed by <mn>...</mn>\n group.children = [...lastGroup.children, ...group.children];\n groups.pop();\n } else if ((group.type === 'msup' || group.type === 'msub') &&\n group.children.length >= 1 && lastGroup &&\n (lastGroup.type === 'mn' || isNumberPunctuation(lastGroup))) {\n // Put preceding <mn>...</mn> or <mi>.</mi> inside base of\n // <msup><mn>...base...</mn>...exponent...</msup> (or <msub>)\n const base = group.children[0];\n if (base instanceof MathNode && base.type === 'mn' && lastGroup) {\n base.children = [...lastGroup.children, ...base.children];\n groups.pop();\n }\n }\n groups.push(group);\n lastGroup = group;\n }\n return groups\n};\n\n/**\n * Equivalent to buildExpression, but wraps the elements in an <mrow>\n * if there's more than one. Returns a single node instead of an array.\n */\nconst buildExpressionRow = function(expression, style, semisimple = false) {\n return makeRow(buildExpression(expression, style, semisimple), semisimple);\n};\n\n/**\n * Takes a group from the parser and calls the appropriate groupBuilders function\n * on it to produce a MathML node.\n */\nconst buildGroup$1 = function(group, style) {\n if (!group) {\n return new mathMLTree.MathNode(\"mrow\");\n }\n\n if (_mathmlGroupBuilders[group.type]) {\n // Call the groupBuilders function\n const result = _mathmlGroupBuilders[group.type](group, style);\n return result;\n } else {\n throw new ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n }\n};\n\nconst glue$1 = _ => {\n return new mathMLTree.MathNode(\"mtd\", [], [], { padding: \"0\", width: \"50%\" })\n};\n\nconst labelContainers = [\"mrow\", \"mtd\", \"mtable\", \"mtr\"];\nconst getLabel = parent => {\n for (const node of parent.children) {\n if (node.type && labelContainers.includes(node.type)) {\n if (node.classes && node.classes[0] === \"tml-label\") {\n const label = node.label;\n return label\n } else {\n const label = getLabel(node);\n if (label) { return label }\n }\n } else if (!node.type) {\n const label = getLabel(node);\n if (label) { return label }\n }\n }\n};\n\nconst taggedExpression = (expression, tag, style, leqno) => {\n tag = buildExpressionRow(tag[0].body, style);\n tag = consolidateText(tag);\n tag.classes.push(\"tml-tag\");\n\n const label = getLabel(expression); // from a \\label{} function.\n expression = new mathMLTree.MathNode(\"mtd\", [expression]);\n const rowArray = [glue$1(), expression, glue$1()];\n rowArray[leqno ? 0 : 2].classes.push(leqno ? \"tml-left\" : \"tml-right\");\n rowArray[leqno ? 0 : 2].children.push(tag);\n const mtr = new mathMLTree.MathNode(\"mtr\", rowArray, [\"tml-tageqn\"]);\n if (label) { mtr.setAttribute(\"id\", label); }\n const table = new mathMLTree.MathNode(\"mtable\", [mtr]);\n table.style.width = \"100%\";\n table.setAttribute(\"displaystyle\", \"true\");\n return table\n};\n\n/**\n * Takes a full parse tree and settings and builds a MathML representation of\n * it.\n */\nfunction buildMathML(tree, texExpression, style, settings) {\n // Strip off outer tag wrapper for processing below.\n let tag = null;\n if (tree.length === 1 && tree[0].type === \"tag\") {\n tag = tree[0].tag;\n tree = tree[0].body;\n }\n\n const expression = buildExpression(tree, style);\n\n if (expression.length === 1 && expression[0] instanceof AnchorNode) {\n return expression[0]\n }\n\n const wrap = (settings.displayMode || settings.annotate) ? \"none\" : settings.wrap;\n\n const n1 = expression.length === 0 ? null : expression[0];\n let wrapper = expression.length === 1 && tag === null && (n1 instanceof MathNode)\n ? expression[0]\n : setLineBreaks(expression, wrap, settings.displayMode);\n\n if (tag) {\n wrapper = taggedExpression(wrapper, tag, style, settings.leqno);\n }\n\n if (settings.annotate) {\n // Build a TeX annotation of the source\n const annotation = new mathMLTree.MathNode(\n \"annotation\", [new mathMLTree.TextNode(texExpression)]);\n annotation.setAttribute(\"encoding\", \"application/x-tex\");\n wrapper = new mathMLTree.MathNode(\"semantics\", [wrapper, annotation]);\n }\n\n const math = new mathMLTree.MathNode(\"math\", [wrapper]);\n\n if (settings.xml) {\n math.setAttribute(\"xmlns\", \"http://www.w3.org/1998/Math/MathML\");\n }\n if (wrapper.style.width) {\n math.style.width = \"100%\";\n }\n if (settings.displayMode) {\n math.setAttribute(\"display\", \"block\");\n math.style.display = \"block math\"; // necessary in Chromium.\n // Firefox and Safari do not recognize display: \"block math\".\n // Set a class so that the CSS file can set display: block.\n math.classes = [\"tml-display\"];\n }\n return math;\n}\n\nconst smalls = \"acegıȷmnopqrsuvwxyzαγεηικμνοπρςστυχωϕ𝐚𝐜𝐞𝐠𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐮𝐯𝐰𝐱𝐲𝐳\";\nconst talls = \"ABCDEFGHIJKLMNOPQRSTUVWXYZbdfhkltΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩβδλζφθψ\"\n + \"𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙𝐛𝐝𝐟𝐡𝐤𝐥𝐭\";\nconst longSmalls = new Set([\"\\\\alpha\", \"\\\\gamma\", \"\\\\delta\", \"\\\\epsilon\", \"\\\\eta\", \"\\\\iota\",\n \"\\\\kappa\", \"\\\\mu\", \"\\\\nu\", \"\\\\pi\", \"\\\\rho\", \"\\\\sigma\", \"\\\\tau\", \"\\\\upsilon\", \"\\\\chi\", \"\\\\psi\",\n \"\\\\omega\", \"\\\\imath\", \"\\\\jmath\"]);\nconst longTalls = new Set([\"\\\\Gamma\", \"\\\\Delta\", \"\\\\Sigma\", \"\\\\Omega\", \"\\\\beta\", \"\\\\delta\",\n \"\\\\lambda\", \"\\\\theta\", \"\\\\psi\"]);\n\nconst mathmlBuilder$a = (group, style) => {\n const accentNode = group.isStretchy\n ? stretchy.accentNode(group)\n : new mathMLTree.MathNode(\"mo\", [makeText(group.label, group.mode)]);\n\n if (group.label === \"\\\\vec\") {\n accentNode.style.transform = \"scale(0.75) translate(10%, 30%)\";\n } else {\n accentNode.style.mathStyle = \"normal\";\n accentNode.style.mathDepth = \"0\";\n if (needWebkitShift.has(group.label) && utils.isCharacterBox(group.base)) {\n let shift = \"\";\n const ch = group.base.text;\n if (smalls.indexOf(ch) > -1 || longSmalls.has(ch)) { shift = \"tml-xshift\"; }\n if (talls.indexOf(ch) > -1 || longTalls.has(ch)) { shift = \"tml-capshift\"; }\n if (shift) { accentNode.classes.push(shift); }\n }\n }\n if (!group.isStretchy) {\n accentNode.setAttribute(\"stretchy\", \"false\");\n }\n\n const node = new mathMLTree.MathNode((group.label === \"\\\\c\" ? \"munder\" : \"mover\"),\n [buildGroup$1(group.base, style), accentNode]\n );\n\n return node;\n};\n\nconst nonStretchyAccents = new Set([\n \"\\\\acute\",\n \"\\\\grave\",\n \"\\\\ddot\",\n \"\\\\dddot\",\n \"\\\\ddddot\",\n \"\\\\tilde\",\n \"\\\\bar\",\n \"\\\\breve\",\n \"\\\\check\",\n \"\\\\hat\",\n \"\\\\vec\",\n \"\\\\dot\",\n \"\\\\mathring\"\n]);\n\nconst needWebkitShift = new Set([\n \"\\\\acute\",\n \"\\\\bar\",\n \"\\\\breve\",\n \"\\\\check\",\n \"\\\\dot\",\n \"\\\\ddot\",\n \"\\\\grave\",\n \"\\\\hat\",\n \"\\\\mathring\",\n \"\\\\'\", \"\\\\^\", \"\\\\~\", \"\\\\=\", \"\\\\u\", \"\\\\.\", '\\\\\"', \"\\\\r\", \"\\\\H\", \"\\\\v\"\n]);\n\nconst combiningChar = {\n \"\\\\`\": \"\\u0300\",\n \"\\\\'\": \"\\u0301\",\n \"\\\\^\": \"\\u0302\",\n \"\\\\~\": \"\\u0303\",\n \"\\\\=\": \"\\u0304\",\n \"\\\\u\": \"\\u0306\",\n \"\\\\.\": \"\\u0307\",\n '\\\\\"': \"\\u0308\",\n \"\\\\r\": \"\\u030A\",\n \"\\\\H\": \"\\u030B\",\n \"\\\\v\": \"\\u030C\"\n};\n\n// Accents\ndefineFunction({\n type: \"accent\",\n names: [\n \"\\\\acute\",\n \"\\\\grave\",\n \"\\\\ddot\",\n \"\\\\dddot\",\n \"\\\\ddddot\",\n \"\\\\tilde\",\n \"\\\\bar\",\n \"\\\\breve\",\n \"\\\\check\",\n \"\\\\hat\",\n \"\\\\vec\",\n \"\\\\dot\",\n \"\\\\mathring\",\n \"\\\\overparen\",\n \"\\\\widecheck\",\n \"\\\\widehat\",\n \"\\\\wideparen\",\n \"\\\\widetilde\",\n \"\\\\overrightarrow\",\n \"\\\\overleftarrow\",\n \"\\\\Overrightarrow\",\n \"\\\\overleftrightarrow\",\n \"\\\\overgroup\",\n \"\\\\overleftharpoon\",\n \"\\\\overrightharpoon\"\n ],\n props: {\n numArgs: 1\n },\n handler: (context, args) => {\n const base = normalizeArgument(args[0]);\n\n const isStretchy = !nonStretchyAccents.has(context.funcName);\n\n return {\n type: \"accent\",\n mode: context.parser.mode,\n label: context.funcName,\n isStretchy: isStretchy,\n base: base\n };\n },\n mathmlBuilder: mathmlBuilder$a\n});\n\n// Text-mode accents\ndefineFunction({\n type: \"accent\",\n names: [\"\\\\'\", \"\\\\`\", \"\\\\^\", \"\\\\~\", \"\\\\=\", \"\\\\c\", \"\\\\u\", \"\\\\.\", '\\\\\"', \"\\\\r\", \"\\\\H\", \"\\\\v\"],\n props: {\n numArgs: 1,\n allowedInText: true,\n allowedInMath: true,\n argTypes: [\"primitive\"]\n },\n handler: (context, args) => {\n const base = normalizeArgument(args[0]);\n const mode = context.parser.mode;\n\n if (mode === \"math\" && context.parser.settings.strict) {\n // LaTeX only writes a warning. It doesn't stop. We'll issue the same warning.\n // eslint-disable-next-line no-console\n console.log(`Temml parse error: Command ${context.funcName} is invalid in math mode.`);\n }\n\n if (mode === \"text\" && base.text && base.text.length === 1\n && context.funcName in combiningChar && smalls.indexOf(base.text) > -1) {\n // Return a combining accent character\n return {\n type: \"textord\",\n mode: \"text\",\n text: base.text + combiningChar[context.funcName]\n }\n } else {\n // Build up the accent\n return {\n type: \"accent\",\n mode: mode,\n label: context.funcName,\n isStretchy: false,\n base: base\n }\n }\n },\n mathmlBuilder: mathmlBuilder$a\n});\n\ndefineFunction({\n type: \"accentUnder\",\n names: [\n \"\\\\underleftarrow\",\n \"\\\\underrightarrow\",\n \"\\\\underleftrightarrow\",\n \"\\\\undergroup\",\n \"\\\\underparen\",\n \"\\\\utilde\"\n ],\n props: {\n numArgs: 1\n },\n handler: ({ parser, funcName }, args) => {\n const base = args[0];\n return {\n type: \"accentUnder\",\n mode: parser.mode,\n label: funcName,\n base: base\n };\n },\n mathmlBuilder: (group, style) => {\n const accentNode = stretchy.accentNode(group);\n accentNode.style[\"math-depth\"] = 0;\n const node = new mathMLTree.MathNode(\"munder\", [\n buildGroup$1(group.base, style),\n accentNode\n ]);\n return node;\n }\n});\n\n/**\n * This file does conversion between units. In particular, it provides\n * calculateSize to convert other units into CSS units.\n */\n\n\nconst ptPerUnit = {\n // Convert to CSS (Postscipt) points, not TeX points\n // https://en.wikibooks.org/wiki/LaTeX/Lengths and\n // https://tex.stackexchange.com/a/8263\n pt: 800 / 803, // convert TeX point to CSS (Postscript) point\n pc: (12 * 800) / 803, // pica\n dd: ((1238 / 1157) * 800) / 803, // didot\n cc: ((14856 / 1157) * 800) / 803, // cicero (12 didot)\n nd: ((685 / 642) * 800) / 803, // new didot\n nc: ((1370 / 107) * 800) / 803, // new cicero (12 new didot)\n sp: ((1 / 65536) * 800) / 803, // scaled point (TeX's internal smallest unit)\n mm: (25.4 / 72),\n cm: (2.54 / 72),\n in: (1 / 72),\n px: (96 / 72)\n};\n\n/**\n * Determine whether the specified unit (either a string defining the unit\n * or a \"size\" parse node containing a unit field) is valid.\n */\nconst validUnits = [\n \"em\",\n \"ex\",\n \"mu\",\n \"pt\",\n \"mm\",\n \"cm\",\n \"in\",\n \"px\",\n \"bp\",\n \"pc\",\n \"dd\",\n \"cc\",\n \"nd\",\n \"nc\",\n \"sp\"\n];\n\nconst validUnit = function(unit) {\n if (typeof unit !== \"string\") {\n unit = unit.unit;\n }\n return validUnits.indexOf(unit) > -1\n};\n\nconst emScale = styleLevel => {\n const scriptLevel = Math.max(styleLevel - 1, 0);\n return [1, 0.7, 0.5][scriptLevel]\n};\n\n/*\n * Convert a \"size\" parse node (with numeric \"number\" and string \"unit\" fields,\n * as parsed by functions.js argType \"size\") into a CSS value.\n */\nconst calculateSize = function(sizeValue, style) {\n let number = sizeValue.number;\n if (style.maxSize[0] < 0 && number > 0) {\n return { number: 0, unit: \"em\" }\n }\n const unit = sizeValue.unit;\n switch (unit) {\n case \"mm\":\n case \"cm\":\n case \"in\":\n case \"px\": {\n const numInCssPts = number * ptPerUnit[unit];\n if (numInCssPts > style.maxSize[1]) {\n return { number: style.maxSize[1], unit: \"pt\" }\n }\n return { number, unit }; // absolute CSS units.\n }\n case \"em\":\n case \"ex\": {\n // In TeX, em and ex do not change size in \\scriptstyle.\n if (unit === \"ex\") { number *= 0.431; }\n number = Math.min(number / emScale(style.level), style.maxSize[0]);\n return { number: utils.round(number), unit: \"em\" };\n }\n case \"bp\": {\n if (number > style.maxSize[1]) { number = style.maxSize[1]; }\n return { number, unit: \"pt\" }; // TeX bp is a CSS pt. (1/72 inch).\n }\n case \"pt\":\n case \"pc\":\n case \"dd\":\n case \"cc\":\n case \"nd\":\n case \"nc\":\n case \"sp\": {\n number = Math.min(number * ptPerUnit[unit], style.maxSize[1]);\n return { number: utils.round(number), unit: \"pt\" }\n }\n case \"mu\": {\n number = Math.min(number / 18, style.maxSize[0]);\n return { number: utils.round(number), unit: \"em\" }\n }\n default:\n throw new ParseError(\"Invalid unit: '\" + unit + \"'\")\n }\n};\n\n// Helper functions\n\nconst padding$1 = width => {\n const node = new mathMLTree.MathNode(\"mspace\");\n node.setAttribute(\"width\", width + \"em\");\n return node\n};\n\nconst paddedNode = (group, lspace = 0.3, rspace = 0, mustSmash = false) => {\n if (group == null && rspace === 0) { return padding$1(lspace) }\n const row = group ? [group] : [];\n if (lspace !== 0) { row.unshift(padding$1(lspace)); }\n if (rspace > 0) { row.push(padding$1(rspace)); }\n if (mustSmash) {\n // Used for the bottom arrow in a {CD} environment\n const mpadded = new mathMLTree.MathNode(\"mpadded\", row);\n mpadded.setAttribute(\"height\", \"0\");\n return mpadded\n } else {\n return new mathMLTree.MathNode(\"mrow\", row)\n }\n};\n\nconst labelSize = (size, scriptLevel) => Number(size) / emScale(scriptLevel);\n\nconst munderoverNode = (fName, body, below, style) => {\n const arrowNode = stretchy.mathMLnode(fName);\n // Is this the short part of a mhchem equilibrium arrow?\n const isEq = fName.slice(1, 3) === \"eq\";\n const minWidth = fName.charAt(1) === \"x\"\n ? \"1.75\" // mathtools extensible arrows are ≥ 1.75em long\n : fName.slice(2, 4) === \"cd\"\n ? \"3.0\" // cd package arrows\n : isEq\n ? \"1.0\" // The shorter harpoon of a mhchem equilibrium arrow\n : \"2.0\"; // other mhchem arrows\n // TODO: When Firefox supports minsize, use the next line.\n //arrowNode.setAttribute(\"minsize\", String(minWidth) + \"em\")\n arrowNode.setAttribute(\"lspace\", \"0\");\n arrowNode.setAttribute(\"rspace\", (isEq ? \"0.5em\" : \"0\"));\n\n // <munderover> upper and lower labels are set to scriptlevel by MathML\n // So we have to adjust our label dimensions accordingly.\n const labelStyle = style.withLevel(style.level < 2 ? 2 : 3);\n const minArrowWidth = labelSize(minWidth, labelStyle.level);\n // The dummyNode will be inside a <mover> inside a <mover>\n // So it will be at scriptlevel 3\n const dummyWidth = labelSize(minWidth, 3);\n const emptyLabel = paddedNode(null, minArrowWidth.toFixed(4), 0);\n const dummyNode = paddedNode(null, dummyWidth.toFixed(4), 0);\n // The arrow is a little longer than the label. Set a spacer length.\n const space = labelSize((isEq ? 0 : 0.3), labelStyle.level).toFixed(4);\n let upperNode;\n let lowerNode;\n\n const gotUpper = (body && body.body &&\n // \\hphantom visible content\n (body.body.body || body.body.length > 0));\n if (gotUpper) {\n let label = buildGroup$1(body, labelStyle);\n const mustSmash = (fName === \"\\\\\\\\cdrightarrow\" || fName === \"\\\\\\\\cdleftarrow\");\n label = paddedNode(label, space, space, mustSmash);\n // Since Firefox does not support minsize, stack a invisible node\n // on top of the label. Its width will serve as a min-width.\n // TODO: Refactor this after Firefox supports minsize.\n upperNode = new mathMLTree.MathNode(\"mover\", [label, dummyNode]);\n }\n const gotLower = (below && below.body &&\n (below.body.body || below.body.length > 0));\n if (gotLower) {\n let label = buildGroup$1(below, labelStyle);\n label = paddedNode(label, space, space);\n lowerNode = new mathMLTree.MathNode(\"munder\", [label, dummyNode]);\n }\n\n let node;\n if (!gotUpper && !gotLower) {\n node = new mathMLTree.MathNode(\"mover\", [arrowNode, emptyLabel]);\n } else if (gotUpper && gotLower) {\n node = new mathMLTree.MathNode(\"munderover\", [arrowNode, lowerNode, upperNode]);\n } else if (gotUpper) {\n node = new mathMLTree.MathNode(\"mover\", [arrowNode, upperNode]);\n } else {\n node = new mathMLTree.MathNode(\"munder\", [arrowNode, lowerNode]);\n }\n if (minWidth === \"3.0\") { node.style.height = \"1em\"; } // CD environment\n node.setAttribute(\"accent\", \"false\"); // Necessary for MS Word\n return node\n};\n\n// Stretchy arrows with an optional argument\ndefineFunction({\n type: \"xArrow\",\n names: [\n \"\\\\xleftarrow\",\n \"\\\\xrightarrow\",\n \"\\\\xLeftarrow\",\n \"\\\\xRightarrow\",\n \"\\\\xleftrightarrow\",\n \"\\\\xLeftrightarrow\",\n \"\\\\xhookleftarrow\",\n \"\\\\xhookrightarrow\",\n \"\\\\xmapsto\",\n \"\\\\xrightharpoondown\",\n \"\\\\xrightharpoonup\",\n \"\\\\xleftharpoondown\",\n \"\\\\xleftharpoonup\",\n \"\\\\xlongequal\",\n \"\\\\xtwoheadrightarrow\",\n \"\\\\xtwoheadleftarrow\",\n // The next 5 functions are here only to support mhchem\n \"\\\\yields\",\n \"\\\\yieldsLeft\",\n \"\\\\mesomerism\",\n \"\\\\longrightharpoonup\",\n \"\\\\longleftharpoondown\",\n // The next 3 functions are here only to support the {CD} environment.\n \"\\\\\\\\cdrightarrow\",\n \"\\\\\\\\cdleftarrow\",\n \"\\\\\\\\cdlongequal\"\n ],\n props: {\n numArgs: 1,\n numOptionalArgs: 1\n },\n handler({ parser, funcName }, args, optArgs) {\n return {\n type: \"xArrow\",\n mode: parser.mode,\n name: funcName,\n body: args[0],\n below: optArgs[0]\n };\n },\n mathmlBuilder(group, style) {\n // Build the arrow and its labels.\n const node = munderoverNode(group.name, group.body, group.below, style);\n // Create operator spacing for a relation.\n const row = [node];\n row.unshift(padding$1(0.2778));\n row.push(padding$1(0.2778));\n return new mathMLTree.MathNode(\"mrow\", row)\n }\n});\n\nconst arrowComponent = {\n \"\\\\xtofrom\": [\"\\\\xrightarrow\", \"\\\\xleftarrow\"],\n \"\\\\xleftrightharpoons\": [\"\\\\xleftharpoonup\", \"\\\\xrightharpoondown\"],\n \"\\\\xrightleftharpoons\": [\"\\\\xrightharpoonup\", \"\\\\xleftharpoondown\"],\n \"\\\\yieldsLeftRight\": [\"\\\\yields\", \"\\\\yieldsLeft\"],\n // The next three all get the same harpoon glyphs. Only the lengths and paddings differ.\n \"\\\\equilibrium\": [\"\\\\longrightharpoonup\", \"\\\\longleftharpoondown\"],\n \"\\\\equilibriumRight\": [\"\\\\longrightharpoonup\", \"\\\\eqleftharpoondown\"],\n \"\\\\equilibriumLeft\": [\"\\\\eqrightharpoonup\", \"\\\\longleftharpoondown\"]\n};\n\n// Browsers are not good at stretching a glyph that contains a pair of stacked arrows such as ⇄.\n// So we stack a pair of single arrows.\ndefineFunction({\n type: \"stackedArrow\",\n names: [\n \"\\\\xtofrom\", // expfeil\n \"\\\\xleftrightharpoons\", // mathtools\n \"\\\\xrightleftharpoons\", // mathtools\n \"\\\\yieldsLeftRight\", // mhchem\n \"\\\\equilibrium\", // mhchem\n \"\\\\equilibriumRight\",\n \"\\\\equilibriumLeft\"\n ],\n props: {\n numArgs: 1,\n numOptionalArgs: 1\n },\n handler({ parser, funcName }, args, optArgs) {\n const lowerArrowBody = args[0]\n ? {\n type: \"hphantom\",\n mode: parser.mode,\n body: args[0]\n }\n : null;\n const upperArrowBelow = optArgs[0]\n ? {\n type: \"hphantom\",\n mode: parser.mode,\n body: optArgs[0]\n }\n : null;\n return {\n type: \"stackedArrow\",\n mode: parser.mode,\n name: funcName,\n body: args[0],\n upperArrowBelow,\n lowerArrowBody,\n below: optArgs[0]\n };\n },\n mathmlBuilder(group, style) {\n const topLabel = arrowComponent[group.name][0];\n const botLabel = arrowComponent[group.name][1];\n const topArrow = munderoverNode(topLabel, group.body, group.upperArrowBelow, style);\n const botArrow = munderoverNode(botLabel, group.lowerArrowBody, group.below, style);\n let wrapper;\n\n const raiseNode = new mathMLTree.MathNode(\"mpadded\", [topArrow]);\n raiseNode.setAttribute(\"voffset\", \"0.3em\");\n raiseNode.setAttribute(\"height\", \"+0.3em\");\n raiseNode.setAttribute(\"depth\", \"-0.3em\");\n // One of the arrows is given ~zero width. so the other has the same horzontal alignment.\n if (group.name === \"\\\\equilibriumLeft\") {\n const botNode = new mathMLTree.MathNode(\"mpadded\", [botArrow]);\n botNode.setAttribute(\"width\", \"0.5em\");\n wrapper = new mathMLTree.MathNode(\n \"mpadded\",\n [padding$1(0.2778), botNode, raiseNode, padding$1(0.2778)]\n );\n } else {\n raiseNode.setAttribute(\"width\", (group.name === \"\\\\equilibriumRight\" ? \"0.5em\" : \"0\"));\n wrapper = new mathMLTree.MathNode(\n \"mpadded\",\n [padding$1(0.2778), raiseNode, botArrow, padding$1(0.2778)]\n );\n }\n\n wrapper.setAttribute(\"voffset\", \"-0.18em\");\n wrapper.setAttribute(\"height\", \"-0.18em\");\n wrapper.setAttribute(\"depth\", \"+0.18em\");\n return wrapper\n }\n});\n\n/**\n * All registered environments.\n * `environments.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `environments.js`.\n */\nconst _environments = {};\n\nfunction defineEnvironment({ type, names, props, handler, mathmlBuilder }) {\n // Set default values of environments.\n const data = {\n type,\n numArgs: props.numArgs || 0,\n allowedInText: false,\n numOptionalArgs: 0,\n handler\n };\n for (let i = 0; i < names.length; ++i) {\n _environments[names[i]] = data;\n }\n if (mathmlBuilder) {\n _mathmlGroupBuilders[type] = mathmlBuilder;\n }\n}\n\n/**\n * Asserts that the node is of the given type and returns it with stricter\n * typing. Throws if the node's type does not match.\n */\nfunction assertNodeType(node, type) {\n if (!node || node.type !== type) {\n throw new Error(\n `Expected node of type ${type}, but got ` +\n (node ? `node of type ${node.type}` : String(node))\n );\n }\n return node;\n}\n\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\nfunction assertSymbolNodeType(node) {\n const typedNode = checkSymbolNodeType(node);\n if (!typedNode) {\n throw new Error(\n `Expected node of symbol group type, but got ` +\n (node ? `node of type ${node.type}` : String(node))\n );\n }\n return typedNode;\n}\n\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\nfunction checkSymbolNodeType(node) {\n if (node && (node.type === \"atom\" ||\n Object.prototype.hasOwnProperty.call(NON_ATOMS, node.type))) {\n return node;\n }\n return null;\n}\n\nconst cdArrowFunctionName = {\n \">\": \"\\\\\\\\cdrightarrow\",\n \"<\": \"\\\\\\\\cdleftarrow\",\n \"=\": \"\\\\\\\\cdlongequal\",\n A: \"\\\\uparrow\",\n V: \"\\\\downarrow\",\n \"|\": \"\\\\Vert\",\n \".\": \"no arrow\"\n};\n\nconst newCell = () => {\n // Create an empty cell, to be filled below with parse nodes.\n return { type: \"styling\", body: [], mode: \"math\", scriptLevel: \"display\" };\n};\n\nconst isStartOfArrow = (node) => {\n return node.type === \"textord\" && node.text === \"@\";\n};\n\nconst isLabelEnd = (node, endChar) => {\n return (node.type === \"mathord\" || node.type === \"atom\") && node.text === endChar;\n};\n\nfunction cdArrow(arrowChar, labels, parser) {\n // Return a parse tree of an arrow and its labels.\n // This acts in a way similar to a macro expansion.\n const funcName = cdArrowFunctionName[arrowChar];\n switch (funcName) {\n case \"\\\\\\\\cdrightarrow\":\n case \"\\\\\\\\cdleftarrow\":\n return parser.callFunction(funcName, [labels[0]], [labels[1]]);\n case \"\\\\uparrow\":\n case \"\\\\downarrow\": {\n const leftLabel = parser.callFunction(\"\\\\\\\\cdleft\", [labels[0]], []);\n const bareArrow = {\n type: \"atom\",\n text: funcName,\n mode: \"math\",\n family: \"rel\"\n };\n const sizedArrow = parser.callFunction(\"\\\\Big\", [bareArrow], []);\n const rightLabel = parser.callFunction(\"\\\\\\\\cdright\", [labels[1]], []);\n const arrowGroup = {\n type: \"ordgroup\",\n mode: \"math\",\n body: [leftLabel, sizedArrow, rightLabel],\n semisimple: true\n };\n return parser.callFunction(\"\\\\\\\\cdparent\", [arrowGroup], []);\n }\n case \"\\\\\\\\cdlongequal\":\n return parser.callFunction(\"\\\\\\\\cdlongequal\", [], []);\n case \"\\\\Vert\": {\n const arrow = { type: \"textord\", text: \"\\\\Vert\", mode: \"math\" };\n return parser.callFunction(\"\\\\Big\", [arrow], []);\n }\n default:\n return { type: \"textord\", text: \" \", mode: \"math\" };\n }\n}\n\nfunction parseCD(parser) {\n // Get the array's parse nodes with \\\\ temporarily mapped to \\cr.\n const parsedRows = [];\n parser.gullet.beginGroup();\n parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n parser.gullet.beginGroup();\n while (true) {\n // Get the parse nodes for the next row.\n parsedRows.push(parser.parseExpression(false, \"\\\\\\\\\"));\n parser.gullet.endGroup();\n parser.gullet.beginGroup();\n const next = parser.fetch().text;\n if (next === \"&\" || next === \"\\\\\\\\\") {\n parser.consume();\n } else if (next === \"\\\\end\") {\n if (parsedRows[parsedRows.length - 1].length === 0) {\n parsedRows.pop(); // final row ended in \\\\\n }\n break;\n } else {\n throw new ParseError(\"Expected \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n }\n }\n\n let row = [];\n const body = [row];\n\n // Loop thru the parse nodes. Collect them into cells and arrows.\n for (let i = 0; i < parsedRows.length; i++) {\n // Start a new row.\n const rowNodes = parsedRows[i];\n // Create the first cell.\n let cell = newCell();\n\n for (let j = 0; j < rowNodes.length; j++) {\n if (!isStartOfArrow(rowNodes[j])) {\n // If a parseNode is not an arrow, it goes into a cell.\n cell.body.push(rowNodes[j]);\n } else {\n // Parse node j is an \"@\", the start of an arrow.\n // Before starting on the arrow, push the cell into `row`.\n row.push(cell);\n\n // Now collect parseNodes into an arrow.\n // The character after \"@\" defines the arrow type.\n j += 1;\n const arrowChar = assertSymbolNodeType(rowNodes[j]).text;\n\n // Create two empty label nodes. We may or may not use them.\n const labels = new Array(2);\n labels[0] = { type: \"ordgroup\", mode: \"math\", body: [] };\n labels[1] = { type: \"ordgroup\", mode: \"math\", body: [] };\n\n // Process the arrow.\n if (\"=|.\".indexOf(arrowChar) > -1) ; else if (\"<>AV\".indexOf(arrowChar) > -1) {\n // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take\n // two optional labels. E.g. the right-point arrow syntax is\n // really: @>{optional label}>{optional label}>\n // Collect parseNodes into labels.\n for (let labelNum = 0; labelNum < 2; labelNum++) {\n let inLabel = true;\n for (let k = j + 1; k < rowNodes.length; k++) {\n if (isLabelEnd(rowNodes[k], arrowChar)) {\n inLabel = false;\n j = k;\n break;\n }\n if (isStartOfArrow(rowNodes[k])) {\n throw new ParseError(\n \"Missing a \" + arrowChar + \" character to complete a CD arrow.\",\n rowNodes[k]\n );\n }\n\n labels[labelNum].body.push(rowNodes[k]);\n }\n if (inLabel) {\n // isLabelEnd never returned a true.\n throw new ParseError(\n \"Missing a \" + arrowChar + \" character to complete a CD arrow.\",\n rowNodes[j]\n );\n }\n }\n } else {\n throw new ParseError(`Expected one of \"<>AV=|.\" after @.`);\n }\n\n // Now join the arrow to its labels.\n const arrow = cdArrow(arrowChar, labels, parser);\n\n // Wrap the arrow in a styling node\n row.push(arrow);\n // In CD's syntax, cells are implicit. That is, everything that\n // is not an arrow gets collected into a cell. So create an empty\n // cell now. It will collect upcoming parseNodes.\n cell = newCell();\n }\n }\n if (i % 2 === 0) {\n // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell\n // The last cell is not yet pushed into `row`, so:\n row.push(cell);\n } else {\n // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow\n // Remove the empty cell that was placed at the beginning of `row`.\n row.shift();\n }\n row = [];\n body.push(row);\n }\n body.pop();\n\n // End row group\n parser.gullet.endGroup();\n // End array group defining \\\\\n parser.gullet.endGroup();\n\n return {\n type: \"array\",\n mode: \"math\",\n body,\n tags: null,\n labels: new Array(body.length + 1).fill(\"\"),\n envClasses: [\"jot\", \"cd\"],\n cols: [],\n hLinesBeforeRow: new Array(body.length + 1).fill([])\n };\n}\n\n// The functions below are not available for general use.\n// They are here only for internal use by the {CD} environment in placing labels\n// next to vertical arrows.\n\n// We don't need any such functions for horizontal arrows because we can reuse\n// the functionality that already exists for extensible arrows.\n\ndefineFunction({\n type: \"cdlabel\",\n names: [\"\\\\\\\\cdleft\", \"\\\\\\\\cdright\"],\n props: {\n numArgs: 1\n },\n handler({ parser, funcName }, args) {\n return {\n type: \"cdlabel\",\n mode: parser.mode,\n side: funcName.slice(4),\n label: args[0]\n };\n },\n mathmlBuilder(group, style) {\n if (group.label.body.length === 0) {\n return new mathMLTree.MathNode(\"mrow\", style) // empty label\n }\n // Abuse an <mtable> to create vertically centered content.\n const mtd = new mathMLTree.MathNode(\"mtd\", [buildGroup$1(group.label, style)]);\n mtd.style.padding = \"0\";\n const mtr = new mathMLTree.MathNode(\"mtr\", [mtd]);\n const mtable = new mathMLTree.MathNode(\"mtable\", [mtr]);\n const label = new mathMLTree.MathNode(\"mpadded\", [mtable]);\n // Set the label width to zero so that the arrow will be centered under the corner cell.\n label.setAttribute(\"width\", \"0\");\n label.setAttribute(\"displaystyle\", \"false\");\n label.setAttribute(\"scriptlevel\", \"1\");\n if (group.side === \"left\") {\n label.style.display = \"flex\";\n label.style.justifyContent = \"flex-end\";\n }\n return label;\n }\n});\n\ndefineFunction({\n type: \"cdlabelparent\",\n names: [\"\\\\\\\\cdparent\"],\n props: {\n numArgs: 1\n },\n handler({ parser }, args) {\n return {\n type: \"cdlabelparent\",\n mode: parser.mode,\n fragment: args[0]\n };\n },\n mathmlBuilder(group, style) {\n return new mathMLTree.MathNode(\"mrow\", [buildGroup$1(group.fragment, style)]);\n }\n});\n\nconst ordGroup = (body) => {\n return {\n \"type\": \"ordgroup\",\n \"mode\": \"math\",\n \"body\": body,\n \"semisimple\": true\n }\n};\n\nconst phantom = (body, type) => {\n return {\n \"type\": type,\n \"mode\": \"math\",\n \"body\": ordGroup(body)\n }\n};\n\n/*\n * A helper for \\bordermatrix.\n * parseArray() has parsed the tokens as if the environment\n * was \\begin{matrix}. That parse tree is this function’s input.\n * Here, we rearrange the parse tree to get one that will\n * result in TeX \\bordermatrix.\n * The final result includes a {pmatrix}, which is the bottom\n * half of a <mover> element. The top of the <mover> contains\n * the \\bordermatrix headings. The top section also contains the\n * contents of the bottom {pmatrix}. Those elements are hidden via\n * \\hphantom, but they ensure that column widths are the same top and\n * bottom.\n *\n * We also create a left {matrix} with a single column that contains\n * elements shifted out of the matrix. The left {matrix} also\n * contains \\vphantom copies of the other {pmatrix} elements.\n * As before, this ensures consistent row heights of left and main.\n */\n\nconst bordermatrixParseTree = (matrix, delimiters) => {\n const body = matrix.body;\n body[0].shift(); // dispose of top left cell\n\n // Create an array for the left column\n const leftColumnBody = new Array(body.length - 1).fill().map(() => []);\n for (let i = 1; i < body.length; i++) {\n // The visible part of the cell\n leftColumnBody[i - 1].push(body[i].shift());\n // A vphantom with contents from the pmatrix, to set minimum cell height\n const phantomBody = [];\n for (let j = 0; j < body[i].length; j++) {\n phantomBody.push(structuredClone(body[i][j]));\n }\n leftColumnBody[i - 1].push(phantom(phantomBody, \"vphantom\"));\n }\n\n // Create an array for the top row\n const topRowBody = new Array(body.length).fill().map(() => []);\n for (let j = 0; j < body[0].length; j++) {\n topRowBody[0].push(structuredClone(body[0][j]));\n }\n // Copy the rest of the pmatrix, but squashed via \\hphantom\n for (let i = 1; i < body.length; i++) {\n for (let j = 0; j < body[0].length; j++) {\n topRowBody[i].push(phantom(structuredClone(body[i][j]).body, \"hphantom\"));\n }\n }\n\n // Squash the top row of the main {pmatrix}\n for (let j = 0; j < body[0].length; j++) {\n body[0][j] = phantom(structuredClone(body[0][j]).body, \"hphantom\");\n }\n\n // Now wrap the arrays in the proper parse nodes.\n\n const leftColumn = {\n type: \"array\",\n mode: \"math\",\n body: leftColumnBody,\n cols: [{ type: \"align\", align: \"c\" }],\n rowGaps: new Array(leftColumnBody.length - 1).fill(null),\n hLinesBeforeRow: new Array(leftColumnBody.length + 1).fill().map(() => []),\n envClasses: [],\n scriptLevel: \"text\",\n arraystretch: 1,\n labels: new Array(leftColumnBody.length).fill(\"\"),\n arraycolsep: { \"number\": 0.04, unit: \"em\" }\n };\n\n const topRow = {\n type: \"array\",\n mode: \"math\",\n body: topRowBody,\n cols: new Array(topRowBody.length).fill({ type: \"align\", align: \"c\" }),\n rowGaps: new Array(topRowBody.length - 1).fill(null),\n hLinesBeforeRow: new Array(topRowBody.length + 1).fill().map(() => []),\n envClasses: [],\n scriptLevel: \"text\",\n arraystretch: 1,\n labels: new Array(topRowBody.length).fill(\"\"),\n arraycolsep: null\n };\n\n const topWrapper = {\n type: \"styling\",\n mode: \"math\",\n scriptLevel: \"text\", // Must set this explicitly.\n body: [topRow] // Default level is \"script\".\n };\n\n const container = {\n type: \"leftright\",\n mode: \"math\",\n body: [matrix],\n left: delimiters ? delimiters[0] : \"(\",\n right: delimiters ? delimiters[1] : \")\",\n rightColor: undefined\n };\n\n const base = {\n type: \"op\", // The base of a TeX \\overset\n mode: \"math\",\n limits: true,\n alwaysHandleSupSub: true,\n parentIsSupSub: true,\n symbol: false,\n stack: true,\n suppressBaseShift: true,\n body: [container]\n };\n\n const mover = {\n type: \"supsub\", // We're using the MathML equivalent\n mode: \"math\", // of TeX \\overset.\n base: base, // That keeps the {pmatrix} aligned with\n sup: topWrapper, // the math centerline.\n sub: null\n };\n\n return ordGroup([leftColumn, mover])\n};\n\n/**\n * Lexing or parsing positional information for error reporting.\n * This object is immutable.\n */\nclass SourceLocation {\n constructor(lexer, start, end) {\n this.lexer = lexer; // Lexer holding the input string.\n this.start = start; // Start offset, zero-based inclusive.\n this.end = end; // End offset, zero-based exclusive.\n }\n\n /**\n * Merges two `SourceLocation`s from location providers, given they are\n * provided in order of appearance.\n * - Returns the first one's location if only the first is provided.\n * - Returns a merged range of the first and the last if both are provided\n * and their lexers match.\n * - Otherwise, returns null.\n */\n static range(first, second) {\n if (!second) {\n return first && first.loc;\n } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) {\n return null;\n } else {\n return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end);\n }\n }\n}\n\n/**\n * Interface required to break circular dependency between Token, Lexer, and\n * ParseError.\n */\n\n/**\n * The resulting token returned from `lex`.\n *\n * It consists of the token text plus some position information.\n * The position information is essentially a range in an input string,\n * but instead of referencing the bare input string, we refer to the lexer.\n * That way it is possible to attach extra metadata to the input string,\n * like for example a file name or similar.\n *\n * The position information is optional, so it is OK to construct synthetic\n * tokens if appropriate. Not providing available position information may\n * lead to degraded error reporting, though.\n */\nclass Token {\n constructor(\n text, // the text of this token\n loc\n ) {\n this.text = text;\n this.loc = loc;\n }\n\n /**\n * Given a pair of tokens (this and endToken), compute a `Token` encompassing\n * the whole input range enclosed by these two.\n */\n range(\n endToken, // last token of the range, inclusive\n text // the text of the newly constructed token\n ) {\n return new Token(text, SourceLocation.range(this, endToken));\n }\n}\n\n// In TeX, there are actually three sets of dimensions, one for each of\n// textstyle, scriptstyle, and scriptscriptstyle. These are\n// provided in the the arrays below, in that order.\n//\n\n// Math style is not quite the same thing as script level.\nconst StyleLevel = {\n DISPLAY: 0,\n TEXT: 1,\n SCRIPT: 2,\n SCRIPTSCRIPT: 3\n};\n\n/**\n * All registered global/built-in macros.\n * `macros.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `macros.js`.\n */\nconst _macros = {};\n\n// This function might one day accept an additional argument and do more things.\nfunction defineMacro(name, body) {\n _macros[name] = body;\n}\n\n/**\n * Predefined macros for Temml.\n * This can be used to define some commands in terms of others.\n */\n\nconst macros = _macros;\n\n//////////////////////////////////////////////////////////////////////\n// macro tools\n\ndefineMacro(\"\\\\noexpand\", function(context) {\n // The expansion is the token itself; but that token is interpreted\n // as if its meaning were ‘\\relax’ if it is a control sequence that\n // would ordinarily be expanded by TeX’s expansion rules.\n const t = context.popToken();\n if (context.isExpandable(t.text)) {\n t.noexpand = true;\n t.treatAsRelax = true;\n }\n return { tokens: [t], numArgs: 0 };\n});\n\ndefineMacro(\"\\\\expandafter\", function(context) {\n // TeX first reads the token that comes immediately after \\expandafter,\n // without expanding it; let’s call this token t. Then TeX reads the\n // token that comes after t (and possibly more tokens, if that token\n // has an argument), replacing it by its expansion. Finally TeX puts\n // t back in front of that expansion.\n const t = context.popToken();\n context.expandOnce(true); // expand only an expandable token\n return { tokens: [t], numArgs: 0 };\n});\n\n// LaTeX's \\@firstoftwo{#1}{#2} expands to #1, skipping #2\n// TeX source: \\long\\def\\@firstoftwo#1#2{#1}\ndefineMacro(\"\\\\@firstoftwo\", function(context) {\n const args = context.consumeArgs(2);\n return { tokens: args[0], numArgs: 0 };\n});\n\n// LaTeX's \\@secondoftwo{#1}{#2} expands to #2, skipping #1\n// TeX source: \\long\\def\\@secondoftwo#1#2{#2}\ndefineMacro(\"\\\\@secondoftwo\", function(context) {\n const args = context.consumeArgs(2);\n return { tokens: args[1], numArgs: 0 };\n});\n\n// LaTeX's \\@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded)\n// symbol that isn't a space, consuming any spaces but not consuming the\n// first nonspace character. If that nonspace character matches #1, then\n// the macro expands to #2; otherwise, it expands to #3.\ndefineMacro(\"\\\\@ifnextchar\", function(context) {\n const args = context.consumeArgs(3); // symbol, if, else\n context.consumeSpaces();\n const nextToken = context.future();\n if (args[0].length === 1 && args[0][0].text === nextToken.text) {\n return { tokens: args[1], numArgs: 0 };\n } else {\n return { tokens: args[2], numArgs: 0 };\n }\n});\n\n// LaTeX's \\@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol.\n// If it is `*`, then it consumes the symbol, and the macro expands to #1;\n// otherwise, the macro expands to #2 (without consuming the symbol).\n// TeX source: \\def\\@ifstar#1{\\@ifnextchar *{\\@firstoftwo{#1}}}\ndefineMacro(\"\\\\@ifstar\", \"\\\\@ifnextchar *{\\\\@firstoftwo{#1}}\");\n\n// LaTeX's \\TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode\ndefineMacro(\"\\\\TextOrMath\", function(context) {\n const args = context.consumeArgs(2);\n if (context.mode === \"text\") {\n return { tokens: args[0], numArgs: 0 };\n } else {\n return { tokens: args[1], numArgs: 0 };\n }\n});\n\nconst stringFromArg = arg => {\n // Reverse the order of the arg and return a string.\n let str = \"\";\n for (let i = arg.length - 1; i > -1; i--) {\n str += arg[i].text;\n }\n return str\n};\n\n// Lookup table for parsing numbers in base 8 through 16\nconst digitToNumber = {\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3,\n 4: 4,\n 5: 5,\n 6: 6,\n 7: 7,\n 8: 8,\n 9: 9,\n a: 10,\n A: 10,\n b: 11,\n B: 11,\n c: 12,\n C: 12,\n d: 13,\n D: 13,\n e: 14,\n E: 14,\n f: 15,\n F: 15\n};\n\nconst nextCharNumber = context => {\n const numStr = context.future().text;\n if (numStr === \"EOF\") { return [null, \"\"] }\n return [digitToNumber[numStr.charAt(0)], numStr]\n};\n\nconst appendCharNumbers = (number, numStr, base) => {\n for (let i = 1; i < numStr.length; i++) {\n const digit = digitToNumber[numStr.charAt(i)];\n number *= base;\n number += digit;\n }\n return number\n};\n\n// TeX \\char makes a literal character (catcode 12) using the following forms:\n// (see The TeXBook, p. 43)\n// \\char123 -- decimal\n// \\char'123 -- octal\n// \\char\"123 -- hex\n// \\char`x -- character that can be written (i.e. isn't active)\n// \\char`\\x -- character that cannot be written (e.g. %)\n// These all refer to characters from the font, so we turn them into special\n// calls to a function \\@char dealt with in the Parser.\ndefineMacro(\"\\\\char\", function(context) {\n let token = context.popToken();\n let base;\n let number = \"\";\n if (token.text === \"'\") {\n base = 8;\n token = context.popToken();\n } else if (token.text === '\"') {\n base = 16;\n token = context.popToken();\n } else if (token.text === \"`\") {\n token = context.popToken();\n if (token.text[0] === \"\\\\\") {\n number = token.text.charCodeAt(1);\n } else if (token.text === \"EOF\") {\n throw new ParseError(\"\\\\char` missing argument\");\n } else {\n number = token.text.charCodeAt(0);\n }\n } else {\n base = 10;\n }\n if (base) {\n // Parse a number in the given base, starting with first `token`.\n let numStr = token.text;\n number = digitToNumber[numStr.charAt(0)];\n if (number == null || number >= base) {\n throw new ParseError(`Invalid base-${base} digit ${token.text}`);\n }\n number = appendCharNumbers(number, numStr, base);\n let digit;\n [digit, numStr] = nextCharNumber(context);\n while (digit != null && digit < base) {\n number *= base;\n number += digit;\n number = appendCharNumbers(number, numStr, base);\n context.popToken();\n [digit, numStr] = nextCharNumber(context);\n }\n }\n return `\\\\@char{${number}}`;\n});\n\nfunction recreateArgStr(context) {\n // Recreate the macro's original argument string from the array of parse tokens.\n const tokens = context.consumeArgs(1)[0];\n let str = \"\";\n let expectedLoc = tokens[tokens.length - 1].loc.start;\n for (let i = tokens.length - 1; i >= 0; i--) {\n const actualLoc = tokens[i].loc.start;\n if (actualLoc > expectedLoc) {\n // context.consumeArgs has eaten a space.\n str += \" \";\n expectedLoc = actualLoc;\n }\n str += tokens[i].text;\n expectedLoc += tokens[i].text.length;\n }\n return str\n}\n\n// The Latin Modern font renders <mi>√</mi> at the wrong vertical alignment.\n// This macro provides a better rendering.\ndefineMacro(\"\\\\surd\", '\\\\sqrt{\\\\vphantom{|}}');\n\n// See comment for \\oplus in symbols.js.\ndefineMacro(\"\\u2295\", \"\\\\oplus\");\n\n// Since Temml has no \\par, ignore \\long.\ndefineMacro(\"\\\\long\", \"\");\n\n//////////////////////////////////////////////////////////////////////\n// Grouping\n// \\let\\bgroup={ \\let\\egroup=}\ndefineMacro(\"\\\\bgroup\", \"{\");\ndefineMacro(\"\\\\egroup\", \"}\");\n\n// Symbols from latex.ltx:\n// \\def~{\\nobreakspace{}}\n// \\def\\lq{`}\n// \\def\\rq{'}\n// \\def \\aa {\\r a}\ndefineMacro(\"~\", \"\\\\nobreakspace\");\ndefineMacro(\"\\\\lq\", \"`\");\ndefineMacro(\"\\\\rq\", \"'\");\ndefineMacro(\"\\\\aa\", \"\\\\r a\");\n\ndefineMacro(\"\\\\Bbbk\", \"\\\\Bbb{k}\");\n\n// \\mathstrut from the TeXbook, p 360\ndefineMacro(\"\\\\mathstrut\", \"\\\\vphantom{(}\");\n\n// \\underbar from TeXbook p 353\ndefineMacro(\"\\\\underbar\", \"\\\\underline{\\\\text{#1}}\");\n\n//////////////////////////////////////////////////////////////////////\n// LaTeX_2ε\n\n// \\vdots{\\vbox{\\baselineskip4\\p@ \\lineskiplimit\\z@\n// \\kern6\\p@\\hbox{.}\\hbox{.}\\hbox{.}}}\n// We'll call \\varvdots, which gets a glyph from symbols.js.\n// The zero-width rule gets us an equivalent to the vertical 6pt kern.\ndefineMacro(\"\\\\vdots\", \"{\\\\varvdots\\\\rule{0pt}{15pt}}\");\ndefineMacro(\"\\u22ee\", \"\\\\vdots\");\n\n// {array} environment gaps\ndefineMacro(\"\\\\arraystretch\", \"1\"); // line spacing factor times 12pt\ndefineMacro(\"\\\\arraycolsep\", \"6pt\"); // half the width separating columns\n\n//////////////////////////////////////////////////////////////////////\n// amsmath.sty\n// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf\n\n//\\newcommand{\\substack}[1]{\\subarray{c}#1\\endsubarray}\ndefineMacro(\"\\\\substack\", \"\\\\begin{subarray}{c}#1\\\\end{subarray}\");\n\n// \\def\\iff{\\DOTSB\\;\\Longleftrightarrow\\;}\n// \\def\\implies{\\DOTSB\\;\\Longrightarrow\\;}\n// \\def\\impliedby{\\DOTSB\\;\\Longleftarrow\\;}\ndefineMacro(\"\\\\iff\", \"\\\\DOTSB\\\\;\\\\Longleftrightarrow\\\\;\");\ndefineMacro(\"\\\\implies\", \"\\\\DOTSB\\\\;\\\\Longrightarrow\\\\;\");\ndefineMacro(\"\\\\impliedby\", \"\\\\DOTSB\\\\;\\\\Longleftarrow\\\\;\");\n\n// AMSMath's automatic \\dots, based on \\mdots@@ macro.\nconst dotsByToken = {\n \",\": \"\\\\dotsc\",\n \"\\\\not\": \"\\\\dotsb\",\n // \\keybin@ checks for the following:\n \"+\": \"\\\\dotsb\",\n \"=\": \"\\\\dotsb\",\n \"<\": \"\\\\dotsb\",\n \">\": \"\\\\dotsb\",\n \"-\": \"\\\\dotsb\",\n \"*\": \"\\\\dotsb\",\n \":\": \"\\\\dotsb\",\n // Symbols whose definition starts with \\DOTSB:\n \"\\\\DOTSB\": \"\\\\dotsb\",\n \"\\\\coprod\": \"\\\\dotsb\",\n \"\\\\bigvee\": \"\\\\dotsb\",\n \"\\\\bigwedge\": \"\\\\dotsb\",\n \"\\\\biguplus\": \"\\\\dotsb\",\n \"\\\\bigcap\": \"\\\\dotsb\",\n \"\\\\bigcup\": \"\\\\dotsb\",\n \"\\\\prod\": \"\\\\dotsb\",\n \"\\\\sum\": \"\\\\dotsb\",\n \"\\\\bigotimes\": \"\\\\dotsb\",\n \"\\\\bigoplus\": \"\\\\dotsb\",\n \"\\\\bigodot\": \"\\\\dotsb\",\n \"\\\\bigsqcap\": \"\\\\dotsb\",\n \"\\\\bigsqcup\": \"\\\\dotsb\",\n \"\\\\bigtimes\": \"\\\\dotsb\",\n \"\\\\And\": \"\\\\dotsb\",\n \"\\\\longrightarrow\": \"\\\\dotsb\",\n \"\\\\Longrightarrow\": \"\\\\dotsb\",\n \"\\\\longleftarrow\": \"\\\\dotsb\",\n \"\\\\Longleftarrow\": \"\\\\dotsb\",\n \"\\\\longleftrightarrow\": \"\\\\dotsb\",\n \"\\\\Longleftrightarrow\": \"\\\\dotsb\",\n \"\\\\mapsto\": \"\\\\dotsb\",\n \"\\\\longmapsto\": \"\\\\dotsb\",\n \"\\\\hookrightarrow\": \"\\\\dotsb\",\n \"\\\\doteq\": \"\\\\dotsb\",\n // Symbols whose definition starts with \\mathbin:\n \"\\\\mathbin\": \"\\\\dotsb\",\n // Symbols whose definition starts with \\mathrel:\n \"\\\\mathrel\": \"\\\\dotsb\",\n \"\\\\relbar\": \"\\\\dotsb\",\n \"\\\\Relbar\": \"\\\\dotsb\",\n \"\\\\xrightarrow\": \"\\\\dotsb\",\n \"\\\\xleftarrow\": \"\\\\dotsb\",\n // Symbols whose definition starts with \\DOTSI:\n \"\\\\DOTSI\": \"\\\\dotsi\",\n \"\\\\int\": \"\\\\dotsi\",\n \"\\\\oint\": \"\\\\dotsi\",\n \"\\\\iint\": \"\\\\dotsi\",\n \"\\\\iiint\": \"\\\\dotsi\",\n \"\\\\iiiint\": \"\\\\dotsi\",\n \"\\\\idotsint\": \"\\\\dotsi\",\n // Symbols whose definition starts with \\DOTSX:\n \"\\\\DOTSX\": \"\\\\dotsx\"\n};\n\ndefineMacro(\"\\\\dots\", function(context) {\n // TODO: If used in text mode, should expand to \\textellipsis.\n // However, in Temml, \\textellipsis and \\ldots behave the same\n // (in text mode), and it's unlikely we'd see any of the math commands\n // that affect the behavior of \\dots when in text mode. So fine for now\n // (until we support \\ifmmode ... \\else ... \\fi).\n let thedots = \"\\\\dotso\";\n const next = context.expandAfterFuture().text;\n if (next in dotsByToken) {\n thedots = dotsByToken[next];\n } else if (next.slice(0, 4) === \"\\\\not\") {\n thedots = \"\\\\dotsb\";\n } else if (next in symbols.math) {\n if ([\"bin\", \"rel\"].includes(symbols.math[next].group)) {\n thedots = \"\\\\dotsb\";\n }\n }\n return thedots;\n});\n\nconst spaceAfterDots = {\n // \\rightdelim@ checks for the following:\n \")\": true,\n \"]\": true,\n \"\\\\rbrack\": true,\n \"\\\\}\": true,\n \"\\\\rbrace\": true,\n \"\\\\rangle\": true,\n \"\\\\rceil\": true,\n \"\\\\rfloor\": true,\n \"\\\\rgroup\": true,\n \"\\\\rmoustache\": true,\n \"\\\\right\": true,\n \"\\\\bigr\": true,\n \"\\\\biggr\": true,\n \"\\\\Bigr\": true,\n \"\\\\Biggr\": true,\n // \\extra@ also tests for the following:\n $: true,\n // \\extrap@ checks for the following:\n \";\": true,\n \".\": true,\n \",\": true\n};\n\ndefineMacro(\"\\\\dotso\", function(context) {\n const next = context.future().text;\n if (next in spaceAfterDots) {\n return \"\\\\ldots\\\\,\";\n } else {\n return \"\\\\ldots\";\n }\n});\n\ndefineMacro(\"\\\\dotsc\", function(context) {\n const next = context.future().text;\n // \\dotsc uses \\extra@ but not \\extrap@, instead specially checking for\n // ';' and '.', but doesn't check for ','.\n if (next in spaceAfterDots && next !== \",\") {\n return \"\\\\ldots\\\\,\";\n } else {\n return \"\\\\ldots\";\n }\n});\n\ndefineMacro(\"\\\\cdots\", function(context) {\n const next = context.future().text;\n if (next in spaceAfterDots) {\n return \"\\\\@cdots\\\\,\";\n } else {\n return \"\\\\@cdots\";\n }\n});\n\ndefineMacro(\"\\\\dotsb\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsm\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsi\", \"\\\\!\\\\cdots\");\ndefineMacro(\"\\\\idotsint\", \"\\\\dotsi\");\n// amsmath doesn't actually define \\dotsx, but \\dots followed by a macro\n// starting with \\DOTSX implies \\dotso, and then \\extra@ detects this case\n// and forces the added `\\,`.\ndefineMacro(\"\\\\dotsx\", \"\\\\ldots\\\\,\");\n\n// \\let\\DOTSI\\relax\n// \\let\\DOTSB\\relax\n// \\let\\DOTSX\\relax\ndefineMacro(\"\\\\DOTSI\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSB\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSX\", \"\\\\relax\");\n\n// Spacing, based on amsmath.sty's override of LaTeX defaults\n// \\DeclareRobustCommand{\\tmspace}[3]{%\n// \\ifmmode\\mskip#1#2\\else\\kern#1#3\\fi\\relax}\ndefineMacro(\"\\\\tmspace\", \"\\\\TextOrMath{\\\\kern#1#3}{\\\\mskip#1#2}\\\\relax\");\n// \\renewcommand{\\,}{\\tmspace+\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\,\", \"{\\\\tmspace+{3mu}{.1667em}}\");\n// \\let\\thinspace\\,\ndefineMacro(\"\\\\thinspace\", \"\\\\,\");\n// \\def\\>{\\mskip\\medmuskip}\n// \\renewcommand{\\:}{\\tmspace+\\medmuskip{.2222em}}\n// TODO: \\> and math mode of \\: should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\>\", \"\\\\mskip{4mu}\");\ndefineMacro(\"\\\\:\", \"{\\\\tmspace+{4mu}{.2222em}}\");\n// \\let\\medspace\\:\ndefineMacro(\"\\\\medspace\", \"\\\\:\");\n// \\renewcommand{\\;}{\\tmspace+\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip = 5mu plus 5mu\ndefineMacro(\"\\\\;\", \"{\\\\tmspace+{5mu}{.2777em}}\");\n// \\let\\thickspace\\;\ndefineMacro(\"\\\\thickspace\", \"\\\\;\");\n// \\renewcommand{\\!}{\\tmspace-\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\!\", \"{\\\\tmspace-{3mu}{.1667em}}\");\n// \\let\\negthinspace\\!\ndefineMacro(\"\\\\negthinspace\", \"\\\\!\");\n// \\newcommand{\\negmedspace}{\\tmspace-\\medmuskip{.2222em}}\n// TODO: math mode should use \\medmuskip\ndefineMacro(\"\\\\negmedspace\", \"{\\\\tmspace-{4mu}{.2222em}}\");\n// \\newcommand{\\negthickspace}{\\tmspace-\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip\ndefineMacro(\"\\\\negthickspace\", \"{\\\\tmspace-{5mu}{.277em}}\");\n// \\def\\enspace{\\kern.5em }\ndefineMacro(\"\\\\enspace\", \"\\\\kern.5em \");\n// \\def\\enskip{\\hskip.5em\\relax}\ndefineMacro(\"\\\\enskip\", \"\\\\hskip.5em\\\\relax\");\n// \\def\\quad{\\hskip1em\\relax}\ndefineMacro(\"\\\\quad\", \"\\\\hskip1em\\\\relax\");\n// \\def\\qquad{\\hskip2em\\relax}\ndefineMacro(\"\\\\qquad\", \"\\\\hskip2em\\\\relax\");\n\ndefineMacro(\"\\\\AA\", \"\\\\TextOrMath{\\\\Angstrom}{\\\\mathring{A}}\\\\relax\");\n\n// \\tag@in@display form of \\tag\ndefineMacro(\"\\\\tag\", \"\\\\@ifstar\\\\tag@literal\\\\tag@paren\");\ndefineMacro(\"\\\\tag@paren\", \"\\\\tag@literal{({#1})}\");\ndefineMacro(\"\\\\tag@literal\", (context) => {\n if (context.macros.get(\"\\\\df@tag\")) {\n throw new ParseError(\"Multiple \\\\tag\");\n }\n return \"\\\\gdef\\\\df@tag{\\\\text{#1}}\";\n});\ndefineMacro(\"\\\\notag\", \"\\\\nonumber\");\ndefineMacro(\"\\\\nonumber\", \"\\\\gdef\\\\@eqnsw{0}\");\n\n// \\renewcommand{\\bmod}{\\nonscript\\mskip-\\medmuskip\\mkern5mu\\mathbin\n// {\\operator@font mod}\\penalty900\n// \\mkern5mu\\nonscript\\mskip-\\medmuskip}\n// \\newcommand{\\pod}[1]{\\allowbreak\n// \\if@display\\mkern18mu\\else\\mkern8mu\\fi(#1)}\n// \\renewcommand{\\pmod}[1]{\\pod{{\\operator@font mod}\\mkern6mu#1}}\n// \\newcommand{\\mod}[1]{\\allowbreak\\if@display\\mkern18mu\n// \\else\\mkern12mu\\fi{\\operator@font mod}\\,\\,#1}\n// TODO: math mode should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\bmod\", \"\\\\mathbin{\\\\text{mod}}\");\ndefineMacro(\n \"\\\\pod\",\n \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern8mu}{\\\\mkern8mu}{\\\\mkern8mu}(#1)\"\n);\ndefineMacro(\"\\\\pmod\", \"\\\\pod{{\\\\rm mod}\\\\mkern6mu#1}\");\ndefineMacro(\n \"\\\\mod\",\n \"\\\\allowbreak\" +\n \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern12mu}{\\\\mkern12mu}{\\\\mkern12mu}\" +\n \"{\\\\rm mod}\\\\,\\\\,#1\"\n);\n\n//////////////////////////////////////////////////////////////////////\n// LaTeX source2e\n\n// \\expandafter\\let\\expandafter\\@normalcr\n// \\csname\\expandafter\\@gobble\\string\\\\ \\endcsname\n// \\DeclareRobustCommand\\newline{\\@normalcr\\relax}\ndefineMacro(\"\\\\newline\", \"\\\\\\\\\\\\relax\");\n\n// \\def\\TeX{T\\kern-.1667em\\lower.5ex\\hbox{E}\\kern-.125emX\\@}\n// TODO: Doesn't normally work in math mode because \\@ fails.\ndefineMacro(\"\\\\TeX\", \"\\\\textrm{T}\\\\kern-.1667em\\\\raisebox{-.5ex}{E}\\\\kern-.125em\\\\textrm{X}\");\n\ndefineMacro(\n \"\\\\LaTeX\",\n \"\\\\textrm{L}\\\\kern-.35em\\\\raisebox{0.2em}{\\\\scriptstyle A}\\\\kern-.15em\\\\TeX\"\n);\n\ndefineMacro(\n \"\\\\Temml\",\n // eslint-disable-next-line max-len\n \"\\\\textrm{T}\\\\kern-0.2em\\\\lower{0.2em}{\\\\textrm{E}}\\\\kern-0.08em{\\\\textrm{M}\\\\kern-0.08em\\\\raise{0.2em}\\\\textrm{M}\\\\kern-0.08em\\\\textrm{L}}\"\n);\n\n// \\DeclareRobustCommand\\hspace{\\@ifstar\\@hspacer\\@hspace}\n// \\def\\@hspace#1{\\hskip #1\\relax}\n// \\def\\@hspacer#1{\\vrule \\@width\\z@\\nobreak\n// \\hskip #1\\hskip \\z@skip}\ndefineMacro(\"\\\\hspace\", \"\\\\@ifstar\\\\@hspacer\\\\@hspace\");\ndefineMacro(\"\\\\@hspace\", \"\\\\hskip #1\\\\relax\");\ndefineMacro(\"\\\\@hspacer\", \"\\\\rule{0pt}{0pt}\\\\hskip #1\\\\relax\");\n\ndefineMacro(\"\\\\colon\", `\\\\mathpunct{\\\\char\"3a}`);\n\n//////////////////////////////////////////////////////////////////////\n// mathtools.sty\n\ndefineMacro(\"\\\\prescript\", \"\\\\pres@cript{_{#1}^{#2}}{}{#3}\");\n\n//\\providecommand\\ordinarycolon{:}\ndefineMacro(\"\\\\ordinarycolon\", `\\\\char\"3a`);\n// Raise to center on the math axis, as closely as possible.\ndefineMacro(\"\\\\vcentcolon\", \"\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}}\");\n// \\providecommand*\\coloneq{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\coloneq\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"2212}');\n// \\providecommand*\\Coloneq{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\Coloneq\", '\\\\mathrel{\\\\char\"2237\\\\char\"2212}');\n// \\providecommand*\\Eqqcolon{=\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqqcolon\", '\\\\mathrel{\\\\char\"3d\\\\char\"2237}');\n// \\providecommand*\\Eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqcolon\", '\\\\mathrel{\\\\char\"2212\\\\char\"2237}');\n// \\providecommand*\\colonapprox{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\colonapprox\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"2248}');\n// \\providecommand*\\Colonapprox{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\Colonapprox\", '\\\\mathrel{\\\\char\"2237\\\\char\"2248}');\n// \\providecommand*\\colonsim{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\colonsim\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"223c}');\n// \\providecommand*\\Colonsim{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\Colonsim\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"223c}');\n\n//////////////////////////////////////////////////////////////////////\n// colonequals.sty\n\n// Alternate names for mathtools's macros:\ndefineMacro(\"\\\\ratio\", \"\\\\vcentcolon\");\ndefineMacro(\"\\\\coloncolon\", \"\\\\dblcolon\");\ndefineMacro(\"\\\\colonequals\", \"\\\\coloneqq\");\ndefineMacro(\"\\\\coloncolonequals\", \"\\\\Coloneqq\");\ndefineMacro(\"\\\\equalscolon\", \"\\\\eqqcolon\");\ndefineMacro(\"\\\\equalscoloncolon\", \"\\\\Eqqcolon\");\ndefineMacro(\"\\\\colonminus\", \"\\\\coloneq\");\ndefineMacro(\"\\\\coloncolonminus\", \"\\\\Coloneq\");\ndefineMacro(\"\\\\minuscolon\", \"\\\\eqcolon\");\ndefineMacro(\"\\\\minuscoloncolon\", \"\\\\Eqcolon\");\n// \\colonapprox name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonapprox\", \"\\\\Colonapprox\");\n// \\colonsim name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonsim\", \"\\\\Colonsim\");\n\n// Present in newtxmath, pxfonts and txfonts\ndefineMacro(\"\\\\notni\", \"\\\\mathrel{\\\\char`\\u220C}\");\ndefineMacro(\"\\\\limsup\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,sup}\");\ndefineMacro(\"\\\\liminf\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,inf}\");\n\n//////////////////////////////////////////////////////////////////////\n// From amsopn.sty\ndefineMacro(\"\\\\injlim\", \"\\\\DOTSB\\\\operatorname*{inj\\\\,lim}\");\ndefineMacro(\"\\\\projlim\", \"\\\\DOTSB\\\\operatorname*{proj\\\\,lim}\");\ndefineMacro(\"\\\\varlimsup\", \"\\\\DOTSB\\\\operatorname*{\\\\overline{\\\\text{lim}}}\");\ndefineMacro(\"\\\\varliminf\", \"\\\\DOTSB\\\\operatorname*{\\\\underline{\\\\text{lim}}}\");\ndefineMacro(\"\\\\varinjlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underrightarrow{\\\\text{lim}}}\");\ndefineMacro(\"\\\\varprojlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underleftarrow{\\\\text{lim}}}\");\n\ndefineMacro(\"\\\\centerdot\", \"{\\\\medspace\\\\rule{0.167em}{0.189em}\\\\medspace}\");\n\n//////////////////////////////////////////////////////////////////////\n// statmath.sty\n// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf\n\ndefineMacro(\"\\\\argmin\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,min}\");\ndefineMacro(\"\\\\argmax\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,max}\");\ndefineMacro(\"\\\\plim\", \"\\\\DOTSB\\\\operatorname*{plim}\");\n\n//////////////////////////////////////////////////////////////////////\n// MnSymbol.sty\n\ndefineMacro(\"\\\\leftmodels\", \"\\\\mathop{\\\\reflectbox{$\\\\models$}}\");\n\n//////////////////////////////////////////////////////////////////////\n// braket.sty\n// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf\n\ndefineMacro(\"\\\\bra\", \"\\\\mathinner{\\\\langle{#1}|}\");\ndefineMacro(\"\\\\ket\", \"\\\\mathinner{|{#1}\\\\rangle}\");\ndefineMacro(\"\\\\braket\", \"\\\\mathinner{\\\\langle{#1}\\\\rangle}\");\ndefineMacro(\"\\\\Bra\", \"\\\\left\\\\langle#1\\\\right|\");\ndefineMacro(\"\\\\Ket\", \"\\\\left|#1\\\\right\\\\rangle\");\n// A helper for \\Braket and \\Set\nconst replaceVert = (argStr, match) => {\n const ch = match[0] === \"|\" ? \"\\\\vert\" : \"\\\\Vert\";\n const replaceStr = `}\\\\,\\\\middle${ch}\\\\,{`;\n return argStr.slice(0, match.index) + replaceStr + argStr.slice(match.index + match[0].length)\n};\ndefineMacro(\"\\\\Braket\", function(context) {\n let argStr = recreateArgStr(context);\n const regEx = /\\|\\||\\||\\\\\\|/g;\n let match;\n while ((match = regEx.exec(argStr)) !== null) {\n argStr = replaceVert(argStr, match);\n }\n return \"\\\\left\\\\langle{\" + argStr + \"}\\\\right\\\\rangle\"\n});\ndefineMacro(\"\\\\Set\", function(context) {\n let argStr = recreateArgStr(context);\n const match = /\\|\\||\\||\\\\\\|/.exec(argStr);\n if (match) {\n argStr = replaceVert(argStr, match);\n }\n return \"\\\\left\\\\{\\\\:{\" + argStr + \"}\\\\:\\\\right\\\\}\"\n});\ndefineMacro(\"\\\\set\", function(context) {\n const argStr = recreateArgStr(context);\n return \"\\\\{{\" + argStr.replace(/\\|/, \"}\\\\mid{\") + \"}\\\\}\"\n});\n\n//////////////////////////////////////////////////////////////////////\n// actuarialangle.dtx\ndefineMacro(\"\\\\angln\", \"{\\\\angl n}\");\n\n//////////////////////////////////////////////////////////////////////\n// derivative.sty\ndefineMacro(\"\\\\odv\", \"\\\\@ifstar\\\\odv@next\\\\odv@numerator\");\ndefineMacro(\"\\\\odv@numerator\", \"\\\\frac{\\\\mathrm{d}#1}{\\\\mathrm{d}#2}\");\ndefineMacro(\"\\\\odv@next\", \"\\\\frac{\\\\mathrm{d}}{\\\\mathrm{d}#2}#1\");\ndefineMacro(\"\\\\pdv\", \"\\\\@ifstar\\\\pdv@next\\\\pdv@numerator\");\n\nconst pdvHelper = args => {\n const numerator = args[0][0].text;\n const denoms = stringFromArg(args[1]).split(\",\");\n const power = String(denoms.length);\n const numOp = power === \"1\" ? \"\\\\partial\" : `\\\\partial^${power}`;\n let denominator = \"\";\n denoms.map(e => { denominator += \"\\\\partial \" + e.trim() + \"\\\\,\";});\n return [numerator, numOp, denominator.replace(/\\\\,$/, \"\")]\n};\ndefineMacro(\"\\\\pdv@numerator\", function(context) {\n const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2));\n return `\\\\frac{${numOp} ${numerator}}{${denominator}}`\n});\ndefineMacro(\"\\\\pdv@next\", function(context) {\n const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2));\n return `\\\\frac{${numOp}}{${denominator}} ${numerator}`\n});\n\n//////////////////////////////////////////////////////////////////////\n// upgreek.dtx\ndefineMacro(\"\\\\upalpha\", \"\\\\up@greek{\\\\alpha}\");\ndefineMacro(\"\\\\upbeta\", \"\\\\up@greek{\\\\beta}\");\ndefineMacro(\"\\\\upgamma\", \"\\\\up@greek{\\\\gamma}\");\ndefineMacro(\"\\\\updelta\", \"\\\\up@greek{\\\\delta}\");\ndefineMacro(\"\\\\upepsilon\", \"\\\\up@greek{\\\\epsilon}\");\ndefineMacro(\"\\\\upzeta\", \"\\\\up@greek{\\\\zeta}\");\ndefineMacro(\"\\\\upeta\", \"\\\\up@greek{\\\\eta}\");\ndefineMacro(\"\\\\uptheta\", \"\\\\up@greek{\\\\theta}\");\ndefineMacro(\"\\\\upiota\", \"\\\\up@greek{\\\\iota}\");\ndefineMacro(\"\\\\upkappa\", \"\\\\up@greek{\\\\kappa}\");\ndefineMacro(\"\\\\uplambda\", \"\\\\up@greek{\\\\lambda}\");\ndefineMacro(\"\\\\upmu\", \"\\\\up@greek{\\\\mu}\");\ndefineMacro(\"\\\\upnu\", \"\\\\up@greek{\\\\nu}\");\ndefineMacro(\"\\\\upxi\", \"\\\\up@greek{\\\\xi}\");\ndefineMacro(\"\\\\upomicron\", \"\\\\up@greek{\\\\omicron}\");\ndefineMacro(\"\\\\uppi\", \"\\\\up@greek{\\\\pi}\");\ndefineMacro(\"\\\\upalpha\", \"\\\\up@greek{\\\\alpha}\");\ndefineMacro(\"\\\\uprho\", \"\\\\up@greek{\\\\rho}\");\ndefineMacro(\"\\\\upsigma\", \"\\\\up@greek{\\\\sigma}\");\ndefineMacro(\"\\\\uptau\", \"\\\\up@greek{\\\\tau}\");\ndefineMacro(\"\\\\upupsilon\", \"\\\\up@greek{\\\\upsilon}\");\ndefineMacro(\"\\\\upphi\", \"\\\\up@greek{\\\\phi}\");\ndefineMacro(\"\\\\upchi\", \"\\\\up@greek{\\\\chi}\");\ndefineMacro(\"\\\\uppsi\", \"\\\\up@greek{\\\\psi}\");\ndefineMacro(\"\\\\upomega\", \"\\\\up@greek{\\\\omega}\");\n\n//////////////////////////////////////////////////////////////////////\n// cmll package\ndefineMacro(\"\\\\invamp\", '\\\\mathbin{\\\\char\"214b}');\ndefineMacro(\"\\\\parr\", '\\\\mathbin{\\\\char\"214b}');\ndefineMacro(\"\\\\with\", '\\\\mathbin{\\\\char\"26}');\ndefineMacro(\"\\\\multimapinv\", '\\\\mathrel{\\\\char\"27dc}');\ndefineMacro(\"\\\\multimapboth\", '\\\\mathrel{\\\\char\"29df}');\ndefineMacro(\"\\\\scoh\", '{\\\\mkern5mu\\\\char\"2322\\\\mkern5mu}');\ndefineMacro(\"\\\\sincoh\", '{\\\\mkern5mu\\\\char\"2323\\\\mkern5mu}');\ndefineMacro(\"\\\\coh\", `{\\\\mkern5mu\\\\rule{}{0.7em}\\\\mathrlap{\\\\smash{\\\\raise2mu{\\\\char\"2322}}}\n{\\\\smash{\\\\lower4mu{\\\\char\"2323}}}\\\\mkern5mu}`);\ndefineMacro(\"\\\\incoh\", `{\\\\mkern5mu\\\\rule{}{0.7em}\\\\mathrlap{\\\\smash{\\\\raise2mu{\\\\char\"2323}}}\n{\\\\smash{\\\\lower4mu{\\\\char\"2322}}}\\\\mkern5mu}`);\n\n\n//////////////////////////////////////////////////////////////////////\n// chemstyle package\ndefineMacro(\"\\\\standardstate\", \"\\\\text{\\\\tiny\\\\char`⦵}\");\n\n/* eslint-disable */\n/* -*- Mode: JavaScript; indent-tabs-mode:nil; js-indent-level: 2 -*- */\n/* vim: set ts=2 et sw=2 tw=80: */\n\n/*************************************************************\n *\n * Temml mhchem.js\n *\n * This file implements a Temml version of mhchem version 3.3.0.\n * It is adapted from MathJax/extensions/TeX/mhchem.js\n * It differs from the MathJax version as follows:\n * 1. The interface is changed so that it can be called from Temml, not MathJax.\n * 2. \\rlap and \\llap are replaced with \\mathrlap and \\mathllap.\n * 3. The reaction arrow code is simplified. All reaction arrows are rendered\n * using Temml extensible arrows instead of building non-extensible arrows.\n * 4. The ~bond forms are composed entirely of \\rule elements.\n * 5. Two dashes in _getBond are wrapped in braces to suppress spacing. i.e., {-}\n * 6. The electron dot uses \\textbullet instead of \\bullet.\n * 7. \\smash[T] has been removed. (WebKit hides anything inside \\smash{…})\n *\n * This code, as other Temml code, is released under the MIT license.\n * \n * /*************************************************************\n *\n * MathJax/extensions/TeX/mhchem.js\n *\n * Implements the \\ce command for handling chemical formulas\n * from the mhchem LaTeX package.\n *\n * ---------------------------------------------------------------------\n *\n * Copyright (c) 2011-2015 The MathJax Consortium\n * Copyright (c) 2015-2018 Martin Hensel\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//\n// Coding Style\n// - use '' for identifiers that can by minified/uglified\n// - use \"\" for strings that need to stay untouched\n\n// version: \"3.3.0\" for MathJax and Temml\n\n\n// Add \\ce, \\pu, and \\tripleDash to the Temml macros.\n\ndefineMacro(\"\\\\ce\", function(context) {\n return chemParse(context.consumeArgs(1)[0], \"ce\")\n});\n\ndefineMacro(\"\\\\pu\", function(context) {\n return chemParse(context.consumeArgs(1)[0], \"pu\");\n});\n\n// Math fonts do not include glyphs for the ~ form of bonds. So we'll send path geometry\n// So we'll compose characters built from \\rule elements.\ndefineMacro(\"\\\\uniDash\", `{\\\\rule{0.672em}{0.06em}}`)\ndefineMacro(\"\\\\triDash\", `{\\\\rule{0.15em}{0.06em}\\\\kern2mu\\\\rule{0.15em}{0.06em}\\\\kern2mu\\\\rule{0.15em}{0.06em}}`)\ndefineMacro(\"\\\\tripleDash\", `\\\\kern0.075em\\\\raise0.25em{\\\\triDash}\\\\kern0.075em`)\ndefineMacro(\"\\\\tripleDashOverLine\", `\\\\kern0.075em\\\\mathrlap{\\\\raise0.125em{\\\\uniDash}}\\\\raise0.34em{\\\\triDash}\\\\kern0.075em`)\ndefineMacro(\"\\\\tripleDashOverDoubleLine\", `\\\\kern0.075em\\\\mathrlap{\\\\mathrlap{\\\\raise0.48em{\\\\triDash}}\\\\raise0.27em{\\\\uniDash}}{\\\\raise0.05em{\\\\uniDash}}\\\\kern0.075em`)\ndefineMacro(\"\\\\tripleDashBetweenDoubleLine\", `\\\\kern0.075em\\\\mathrlap{\\\\mathrlap{\\\\raise0.48em{\\\\uniDash}}\\\\raise0.27em{\\\\triDash}}{\\\\raise0.05em{\\\\uniDash}}\\\\kern0.075em`)\n\n //\n // This is the main function for handing the \\ce and \\pu commands.\n // It takes the argument to \\ce or \\pu and returns the corresponding TeX string.\n //\n\n var chemParse = function (tokens, stateMachine) {\n // Recreate the argument string from Temml's array of tokens.\n var str = \"\";\n var expectedLoc = tokens.length && tokens[tokens.length - 1].loc.start\n for (var i = tokens.length - 1; i >= 0; i--) {\n if(tokens[i].loc.start > expectedLoc) {\n // context.consumeArgs has eaten a space.\n str += \" \";\n expectedLoc = tokens[i].loc.start;\n }\n str += tokens[i].text;\n expectedLoc += tokens[i].text.length;\n }\n // Call the mhchem core parser.\n var tex = texify.go(mhchemParser.go(str, stateMachine));\n return tex;\n };\n\n //\n // Core parser for mhchem syntax (recursive)\n //\n /** @type {MhchemParser} */\n var mhchemParser = {\n //\n // Parses mchem \\ce syntax\n //\n // Call like\n // go(\"H2O\");\n //\n go: function (input, stateMachine) {\n if (!input) { return []; }\n if (stateMachine === undefined) { stateMachine = 'ce'; }\n var state = '0';\n\n //\n // String buffers for parsing:\n //\n // buffer.a == amount\n // buffer.o == element\n // buffer.b == left-side superscript\n // buffer.p == left-side subscript\n // buffer.q == right-side subscript\n // buffer.d == right-side superscript\n //\n // buffer.r == arrow\n // buffer.rdt == arrow, script above, type\n // buffer.rd == arrow, script above, content\n // buffer.rqt == arrow, script below, type\n // buffer.rq == arrow, script below, content\n //\n // buffer.text_\n // buffer.rm\n // etc.\n //\n // buffer.parenthesisLevel == int, starting at 0\n // buffer.sb == bool, space before\n // buffer.beginsWithBond == bool\n //\n // These letters are also used as state names.\n //\n // Other states:\n // 0 == begin of main part (arrow/operator unlikely)\n // 1 == next entity\n // 2 == next entity (arrow/operator unlikely)\n // 3 == next atom\n // c == macro\n //\n /** @type {Buffer} */\n var buffer = {};\n buffer['parenthesisLevel'] = 0;\n\n input = input.replace(/\\n/g, \" \");\n input = input.replace(/[\\u2212\\u2013\\u2014\\u2010]/g, \"-\");\n input = input.replace(/[\\u2026]/g, \"...\");\n\n //\n // Looks through mhchemParser.transitions, to execute a matching action\n // (recursive)\n //\n var lastInput;\n var watchdog = 10;\n /** @type {ParserOutput[]} */\n var output = [];\n while (true) {\n if (lastInput !== input) {\n watchdog = 10;\n lastInput = input;\n } else {\n watchdog--;\n }\n //\n // Find actions in transition table\n //\n var machine = mhchemParser.stateMachines[stateMachine];\n var t = machine.transitions[state] || machine.transitions['*'];\n iterateTransitions:\n for (var i=0; i<t.length; i++) {\n var matches = mhchemParser.patterns.match_(t[i].pattern, input);\n if (matches) {\n //\n // Execute actions\n //\n var task = t[i].task;\n for (var iA=0; iA<task.action_.length; iA++) {\n var o;\n //\n // Find and execute action\n //\n if (machine.actions[task.action_[iA].type_]) {\n o = machine.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);\n } else if (mhchemParser.actions[task.action_[iA].type_]) {\n o = mhchemParser.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);\n } else {\n throw [\"MhchemBugA\", \"mhchem bug A. Please report. (\" + task.action_[iA].type_ + \")\"]; // Trying to use non-existing action\n }\n //\n // Add output\n //\n mhchemParser.concatArray(output, o);\n }\n //\n // Set next state,\n // Shorten input,\n // Continue with next character\n // (= apply only one transition per position)\n //\n state = task.nextState || state;\n if (input.length > 0) {\n if (!task.revisit) {\n input = matches.remainder;\n }\n if (!task.toContinue) {\n break iterateTransitions;\n }\n } else {\n return output;\n }\n }\n }\n //\n // Prevent infinite loop\n //\n if (watchdog <= 0) {\n throw [\"MhchemBugU\", \"mhchem bug U. Please report.\"]; // Unexpected character\n }\n }\n },\n concatArray: function (a, b) {\n if (b) {\n if (Array.isArray(b)) {\n for (var iB=0; iB<b.length; iB++) {\n a.push(b[iB]);\n }\n } else {\n a.push(b);\n }\n }\n },\n\n patterns: {\n //\n // Matching patterns\n // either regexps or function that return null or {match_:\"a\", remainder:\"bc\"}\n //\n patterns: {\n // property names must not look like integers (\"2\") for correct property traversal order, later on\n 'empty': /^$/,\n 'else': /^./,\n 'else2': /^./,\n 'space': /^\\s/,\n 'space A': /^\\s(?=[A-Z\\\\$])/,\n 'space$': /^\\s$/,\n 'a-z': /^[a-z]/,\n 'x': /^x/,\n 'x$': /^x$/,\n 'i$': /^i$/,\n 'letters': /^(?:[a-zA-Z\\u03B1-\\u03C9\\u0391-\\u03A9?@]|(?:\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\\s+|\\{\\}|(?![a-zA-Z]))))+/,\n '\\\\greek': /^\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\\s+|\\{\\}|(?![a-zA-Z]))/,\n 'one lowercase latin letter $': /^(?:([a-z])(?:$|[^a-zA-Z]))$/,\n '$one lowercase latin letter$ $': /^\\$(?:([a-z])(?:$|[^a-zA-Z]))\\$$/,\n 'one lowercase greek letter $': /^(?:\\$?[\\u03B1-\\u03C9]\\$?|\\$?\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\\s*\\$?)(?:\\s+|\\{\\}|(?![a-zA-Z]))$/,\n 'digits': /^[0-9]+/,\n '-9.,9': /^[+\\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))/,\n '-9.,9 no missing 0': /^[+\\-]?[0-9]+(?:[.,][0-9]+)?/,\n '(-)(9.,9)(e)(99)': function (input) {\n var m = input.match(/^(\\+\\-|\\+\\/\\-|\\+|\\-|\\\\pm\\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))?(\\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))\\))?(?:([eE]|\\s*(\\*|x|\\\\times|\\u00D7)\\s*10\\^)([+\\-]?[0-9]+|\\{[+\\-]?[0-9]+\\}))?/);\n if (m && m[0]) {\n return { match_: m.splice(1), remainder: input.substr(m[0].length) };\n }\n return null;\n },\n '(-)(9)^(-9)': function (input) {\n var m = input.match(/^(\\+\\-|\\+\\/\\-|\\+|\\-|\\\\pm\\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+)?)\\^([+\\-]?[0-9]+|\\{[+\\-]?[0-9]+\\})/);\n if (m && m[0]) {\n return { match_: m.splice(1), remainder: input.substr(m[0].length) };\n }\n return null;\n },\n 'state of aggregation $': function (input) { // ... or crystal system\n var a = mhchemParser.patterns.findObserveGroups(input, \"\", /^\\([a-z]{1,3}(?=[\\),])/, \")\", \"\"); // (aq), (aq,$\\infty$), (aq, sat)\n if (a && a.remainder.match(/^($|[\\s,;\\)\\]\\}])/)) { return a; } // AND end of 'phrase'\n var m = input.match(/^(?:\\((?:\\\\ca\\s?)?\\$[amothc]\\$\\))/); // OR crystal system ($o$) (\\ca$c$)\n if (m) {\n return { match_: m[0], remainder: input.substr(m[0].length) };\n }\n return null;\n },\n '_{(state of aggregation)}$': /^_\\{(\\([a-z]{1,3}\\))\\}/,\n '{[(': /^(?:\\\\\\{|\\[|\\()/,\n ')]}': /^(?:\\)|\\]|\\\\\\})/,\n ', ': /^[,;]\\s*/,\n ',': /^[,;]/,\n '.': /^[.]/,\n '. ': /^([.\\u22C5\\u00B7\\u2022])\\s*/,\n '...': /^\\.\\.\\.(?=$|[^.])/,\n '* ': /^([*])\\s*/,\n '^{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^{\", \"\", \"\", \"}\"); },\n '^($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", \"$\", \"$\", \"\"); },\n '^a': /^\\^([0-9]+|[^\\\\_])/,\n '^\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n '^\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n '^\\\\x': /^\\^(\\\\[a-zA-Z]+)\\s*/,\n '^(-1)': /^\\^(-?\\d+)/,\n '\\'': /^'/,\n '_{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_{\", \"\", \"\", \"}\"); },\n '_($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", \"$\", \"$\", \"\"); },\n '_9': /^_([+\\-]?[0-9]+|[^\\\\])/,\n '_\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n '_\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n '_\\\\x': /^_(\\\\[a-zA-Z]+)\\s*/,\n '^_': /^(?:\\^(?=_)|\\_(?=\\^)|[\\^_]$)/,\n '{}': /^\\{\\}/,\n '{...}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", \"{\", \"}\", \"\"); },\n '{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"{\", \"\", \"\", \"}\"); },\n '$...$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", \"$\", \"$\", \"\"); },\n '${(...)}$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"${\", \"\", \"\", \"}$\"); },\n '$(...)$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"$\", \"\", \"\", \"$\"); },\n '=<>': /^[=<>]/,\n '#': /^[#\\u2261]/,\n '+': /^\\+/,\n '-$': /^-(?=[\\s_},;\\]/]|$|\\([a-z]+\\))/, // -space -, -; -] -/ -$ -state-of-aggregation\n '-9': /^-(?=[0-9])/,\n '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\\s,;\\)\\]\\}]))/,\n '-': /^-/,\n 'pm-operator': /^(?:\\\\pm|\\$\\\\pm\\$|\\+-|\\+\\/-)/,\n 'operator': /^(?:\\+|(?:[\\-=<>]|<<|>>|\\\\approx|\\$\\\\approx\\$)(?=\\s|$|-?[0-9]))/,\n 'arrowUpDown': /^(?:v|\\(v\\)|\\^|\\(\\^\\))(?=$|[\\s,;\\)\\]\\}])/,\n '\\\\bond{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\bond{\", \"\", \"\", \"}\"); },\n '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\\u2192\\u27F6\\u21CC])/,\n 'CMT': /^[CMT](?=\\[)/,\n '[(...)]': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"[\", \"\", \"\", \"]\"); },\n '1st-level escape': /^(&|\\\\\\\\|\\\\hline)\\s*/,\n '\\\\,': /^(?:\\\\[,\\ ;:])/, // \\\\x - but output no space before\n '\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n '\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n '\\\\ca': /^\\\\ca(?:\\s+|(?![a-zA-Z]))/,\n '\\\\x': /^(?:\\\\[a-zA-Z]+\\s*|\\\\[_&{}%])/,\n 'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/, // only those with numbers in front, because the others will be formatted correctly anyway\n 'others': /^[\\/~|]/,\n '\\\\frac{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\frac{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n '\\\\overset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\overset{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n '\\\\underset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\underset{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n '\\\\underbrace{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\underbrace{\", \"\", \"\", \"}_\", \"{\", \"\", \"\", \"}\"); },\n '\\\\color{(...)}0': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color{\", \"\", \"\", \"}\"); },\n '\\\\color{(...)}{(...)}1': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n '\\\\color(...){(...)}2': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color\", \"\\\\\", \"\", /^(?=\\{)/, \"{\", \"\", \"\", \"}\"); },\n '\\\\ce{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\ce{\", \"\", \"\", \"}\"); },\n 'oxidation$': /^(?:[+-][IVX]+|\\\\pm\\s*0|\\$\\\\pm\\$\\s*0)$/,\n 'd-oxidation$': /^(?:[+-]?\\s?[IVX]+|\\\\pm\\s*0|\\$\\\\pm\\$\\s*0)$/, // 0 could be oxidation or charge\n 'roman numeral': /^[IVX]+/,\n '1/2$': /^[+\\-]?(?:[0-9]+|\\$[a-z]\\$|[a-z])\\/[0-9]+(?:\\$[a-z]\\$|[a-z])?$/,\n 'amount': function (input) {\n var match;\n // e.g. 2, 0.5, 1/2, -2, n/2, +; $a$ could be added later in parsing\n match = input.match(/^(?:(?:(?:\\([+\\-]?[0-9]+\\/[0-9]+\\)|[+\\-]?(?:[0-9]+|\\$[a-z]\\$|[a-z])\\/[0-9]+|[+\\-]?[0-9]+[.,][0-9]+|[+\\-]?\\.[0-9]+|[+\\-]?[0-9]+)(?:[a-z](?=\\s*[A-Z]))?)|[+\\-]?[a-z](?=\\s*[A-Z])|\\+(?!\\s))/);\n if (match) {\n return { match_: match[0], remainder: input.substr(match[0].length) };\n }\n var a = mhchemParser.patterns.findObserveGroups(input, \"\", \"$\", \"$\", \"\");\n if (a) { // e.g. $2n-1$, $-$\n match = a.match_.match(/^\\$(?:\\(?[+\\-]?(?:[0-9]*[a-z]?[+\\-])?[0-9]*[a-z](?:[+\\-][0-9]*[a-z]?)?\\)?|\\+|-)\\$$/);\n if (match) {\n return { match_: match[0], remainder: input.substr(match[0].length) };\n }\n }\n return null;\n },\n 'amount2': function (input) { return this['amount'](input); },\n '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/,\n 'formula$': function (input) {\n if (input.match(/^\\([a-z]+\\)$/)) { return null; } // state of aggregation = no formula\n var match = input.match(/^(?:[a-z]|(?:[0-9\\ \\+\\-\\,\\.\\(\\)]+[a-z])+[0-9\\ \\+\\-\\,\\.\\(\\)]*|(?:[a-z][0-9\\ \\+\\-\\,\\.\\(\\)]+)+[a-z]?)$/);\n if (match) {\n return { match_: match[0], remainder: input.substr(match[0].length) };\n }\n return null;\n },\n 'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,\n '/': /^\\s*(\\/)\\s*/,\n '//': /^\\s*(\\/\\/)\\s*/,\n '*': /^\\s*[*.]\\s*/\n },\n findObserveGroups: function (input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) {\n /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */\n var _match = function (input, pattern) {\n if (typeof pattern === \"string\") {\n if (input.indexOf(pattern) !== 0) { return null; }\n return pattern;\n } else {\n var match = input.match(pattern);\n if (!match) { return null; }\n return match[0];\n }\n };\n /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */\n var _findObserveGroups = function (input, i, endChars) {\n var braces = 0;\n while (i < input.length) {\n var a = input.charAt(i);\n var match = _match(input.substr(i), endChars);\n if (match !== null && braces === 0) {\n return { endMatchBegin: i, endMatchEnd: i + match.length };\n } else if (a === \"{\") {\n braces++;\n } else if (a === \"}\") {\n if (braces === 0) {\n throw [\"ExtraCloseMissingOpen\", \"Extra close brace or missing open brace\"];\n } else {\n braces--;\n }\n }\n i++;\n }\n if (braces > 0) {\n return null;\n }\n return null;\n };\n var match = _match(input, begExcl);\n if (match === null) { return null; }\n input = input.substr(match.length);\n match = _match(input, begIncl);\n if (match === null) { return null; }\n var e = _findObserveGroups(input, match.length, endIncl || endExcl);\n if (e === null) { return null; }\n var match1 = input.substring(0, (endIncl ? e.endMatchEnd : e.endMatchBegin));\n if (!(beg2Excl || beg2Incl)) {\n return {\n match_: match1,\n remainder: input.substr(e.endMatchEnd)\n };\n } else {\n var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl);\n if (group2 === null) { return null; }\n /** @type {string[]} */\n var matchRet = [match1, group2.match_];\n return {\n match_: (combine ? matchRet.join(\"\") : matchRet),\n remainder: group2.remainder\n };\n }\n },\n\n //\n // Matching function\n // e.g. match(\"a\", input) will look for the regexp called \"a\" and see if it matches\n // returns null or {match_:\"a\", remainder:\"bc\"}\n //\n match_: function (m, input) {\n var pattern = mhchemParser.patterns.patterns[m];\n if (pattern === undefined) {\n throw [\"MhchemBugP\", \"mhchem bug P. Please report. (\" + m + \")\"]; // Trying to use non-existing pattern\n } else if (typeof pattern === \"function\") {\n return mhchemParser.patterns.patterns[m](input); // cannot use cached var pattern here, because some pattern functions need this===mhchemParser\n } else { // RegExp\n var match = input.match(pattern);\n if (match) {\n var mm;\n if (match[2]) {\n mm = [ match[1], match[2] ];\n } else if (match[1]) {\n mm = match[1];\n } else {\n mm = match[0];\n }\n return { match_: mm, remainder: input.substr(match[0].length) };\n }\n return null;\n }\n }\n },\n\n //\n // Generic state machine actions\n //\n actions: {\n 'a=': function (buffer, m) { buffer.a = (buffer.a || \"\") + m; },\n 'b=': function (buffer, m) { buffer.b = (buffer.b || \"\") + m; },\n 'p=': function (buffer, m) { buffer.p = (buffer.p || \"\") + m; },\n 'o=': function (buffer, m) { buffer.o = (buffer.o || \"\") + m; },\n 'q=': function (buffer, m) { buffer.q = (buffer.q || \"\") + m; },\n 'd=': function (buffer, m) { buffer.d = (buffer.d || \"\") + m; },\n 'rm=': function (buffer, m) { buffer.rm = (buffer.rm || \"\") + m; },\n 'text=': function (buffer, m) { buffer.text_ = (buffer.text_ || \"\") + m; },\n 'insert': function (buffer, m, a) { return { type_: a }; },\n 'insert+p1': function (buffer, m, a) { return { type_: a, p1: m }; },\n 'insert+p1+p2': function (buffer, m, a) { return { type_: a, p1: m[0], p2: m[1] }; },\n 'copy': function (buffer, m) { return m; },\n 'rm': function (buffer, m) { return { type_: 'rm', p1: m || \"\"}; },\n 'text': function (buffer, m) { return mhchemParser.go(m, 'text'); },\n '{text}': function (buffer, m) {\n var ret = [ \"{\" ];\n mhchemParser.concatArray(ret, mhchemParser.go(m, 'text'));\n ret.push(\"}\");\n return ret;\n },\n 'tex-math': function (buffer, m) { return mhchemParser.go(m, 'tex-math'); },\n 'tex-math tight': function (buffer, m) { return mhchemParser.go(m, 'tex-math tight'); },\n 'bond': function (buffer, m, k) { return { type_: 'bond', kind_: k || m }; },\n 'color0-output': function (buffer, m) { return { type_: 'color0', color: m[0] }; },\n 'ce': function (buffer, m) { return mhchemParser.go(m); },\n '1/2': function (buffer, m) {\n /** @type {ParserOutput[]} */\n var ret = [];\n if (m.match(/^[+\\-]/)) {\n ret.push(m.substr(0, 1));\n m = m.substr(1);\n }\n var n = m.match(/^([0-9]+|\\$[a-z]\\$|[a-z])\\/([0-9]+)(\\$[a-z]\\$|[a-z])?$/);\n n[1] = n[1].replace(/\\$/g, \"\");\n ret.push({ type_: 'frac', p1: n[1], p2: n[2] });\n if (n[3]) {\n n[3] = n[3].replace(/\\$/g, \"\");\n ret.push({ type_: 'tex-math', p1: n[3] });\n }\n return ret;\n },\n '9,9': function (buffer, m) { return mhchemParser.go(m, '9,9'); }\n },\n //\n // createTransitions\n // convert { 'letter': { 'state': { action_: 'output' } } } to { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] }\n // with expansion of 'a|b' to 'a' and 'b' (at 2 places)\n //\n createTransitions: function (o) {\n var pattern, state;\n /** @type {string[]} */\n var stateArray;\n var i;\n //\n // 1. Collect all states\n //\n /** @type {Transitions} */\n var transitions = {};\n for (pattern in o) {\n for (state in o[pattern]) {\n stateArray = state.split(\"|\");\n o[pattern][state].stateArray = stateArray;\n for (i=0; i<stateArray.length; i++) {\n transitions[stateArray[i]] = [];\n }\n }\n }\n //\n // 2. Fill states\n //\n for (pattern in o) {\n for (state in o[pattern]) {\n stateArray = o[pattern][state].stateArray || [];\n for (i=0; i<stateArray.length; i++) {\n //\n // 2a. Normalize actions into array: 'text=' ==> [{type_:'text='}]\n // (Note to myself: Resolving the function here would be problematic. It would need .bind (for *this*) and currying (for *option*).)\n //\n /** @type {any} */\n var p = o[pattern][state];\n if (p.action_) {\n p.action_ = [].concat(p.action_);\n for (var k=0; k<p.action_.length; k++) {\n if (typeof p.action_[k] === \"string\") {\n p.action_[k] = { type_: p.action_[k] };\n }\n }\n } else {\n p.action_ = [];\n }\n //\n // 2.b Multi-insert\n //\n var patternArray = pattern.split(\"|\");\n for (var j=0; j<patternArray.length; j++) {\n if (stateArray[i] === '*') { // insert into all\n for (var t in transitions) {\n transitions[t].push({ pattern: patternArray[j], task: p });\n }\n } else {\n transitions[stateArray[i]].push({ pattern: patternArray[j], task: p });\n }\n }\n }\n }\n }\n return transitions;\n },\n stateMachines: {}\n };\n\n //\n // Definition of state machines\n //\n mhchemParser.stateMachines = {\n //\n // \\ce state machines\n //\n //#region ce\n 'ce': { // main parser\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n 'else': {\n '0|1|2': { action_: 'beginsWithBond=false', revisit: true, toContinue: true } },\n 'oxidation$': {\n '0': { action_: 'oxidation-output' } },\n 'CMT': {\n 'r': { action_: 'rdt=', nextState: 'rt' },\n 'rd': { action_: 'rqt=', nextState: 'rdt' } },\n 'arrowUpDown': {\n '0|1|2|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '1' } },\n 'uprightEntities': {\n '0|1|2': { action_: [ 'o=', 'output' ], nextState: '1' } },\n 'orbital': {\n '0|1|2|3': { action_: 'o=', nextState: 'o' } },\n '->': {\n '0|1|2|3': { action_: 'r=', nextState: 'r' },\n 'a|as': { action_: [ 'output', 'r=' ], nextState: 'r' },\n '*': { action_: [ 'output', 'r=' ], nextState: 'r' } },\n '+': {\n 'o': { action_: 'd= kv', nextState: 'd' },\n 'd|D': { action_: 'd=', nextState: 'd' },\n 'q': { action_: 'd=', nextState: 'qd' },\n 'qd|qD': { action_: 'd=', nextState: 'qd' },\n 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' },\n '3': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } },\n 'amount': {\n '0|2': { action_: 'a=', nextState: 'a' } },\n 'pm-operator': {\n '0|1|2|a|as': { action_: [ 'sb=false', 'output', { type_: 'operator', option: '\\\\pm' } ], nextState: '0' } },\n 'operator': {\n '0|1|2|a|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } },\n '-$': {\n 'o|q': { action_: [ 'charge or bond', 'output' ], nextState: 'qd' },\n 'd': { action_: 'd=', nextState: 'd' },\n 'D': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' },\n 'q': { action_: 'd=', nextState: 'qd' },\n 'qd': { action_: 'd=', nextState: 'qd' },\n 'qD|dq': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' } },\n '-9': {\n '3|o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '3' } },\n '- orbital overlap': {\n 'o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' },\n 'd': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' } },\n '-': {\n '0|1|2': { action_: [ { type_: 'output', option: 1 }, 'beginsWithBond=true', { type_: 'bond', option: \"-\" } ], nextState: '3' },\n '3': { action_: { type_: 'bond', option: \"-\" } },\n 'a': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' },\n 'as': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: \"-\" } ], nextState: '3' },\n 'b': { action_: 'b=' },\n 'o': { action_: { type_: '- after o/d', option: false }, nextState: '2' },\n 'q': { action_: { type_: '- after o/d', option: false }, nextState: '2' },\n 'd|qd|dq': { action_: { type_: '- after o/d', option: true }, nextState: '2' },\n 'D|qD|p': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' } },\n 'amount2': {\n '1|3': { action_: 'a=', nextState: 'a' } },\n 'letters': {\n '0|1|2|3|a|as|b|p|bp|o': { action_: 'o=', nextState: 'o' },\n 'q|dq': { action_: ['output', 'o='], nextState: 'o' },\n 'd|D|qd|qD': { action_: 'o after d', nextState: 'o' } },\n 'digits': {\n 'o': { action_: 'q=', nextState: 'q' },\n 'd|D': { action_: 'q=', nextState: 'dq' },\n 'q': { action_: [ 'output', 'o=' ], nextState: 'o' },\n 'a': { action_: 'o=', nextState: 'o' } },\n 'space A': {\n 'b|p|bp': {} },\n 'space': {\n 'a': { nextState: 'as' },\n '0': { action_: 'sb=false' },\n '1|2': { action_: 'sb=true' },\n 'r|rt|rd|rdt|rdq': { action_: 'output', nextState: '0' },\n '*': { action_: [ 'output', 'sb=true' ], nextState: '1'} },\n '1st-level escape': {\n '1|2': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ] },\n '*': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ], nextState: '0' } },\n '[(...)]': {\n 'r|rt': { action_: 'rd=', nextState: 'rd' },\n 'rd|rdt': { action_: 'rq=', nextState: 'rdq' } },\n '...': {\n 'o|d|D|dq|qd|qD': { action_: [ 'output', { type_: 'bond', option: \"...\" } ], nextState: '3' },\n '*': { action_: [ { type_: 'output', option: 1 }, { type_: 'insert', option: 'ellipsis' } ], nextState: '1' } },\n '. |* ': {\n '*': { action_: [ 'output', { type_: 'insert', option: 'addition compound' } ], nextState: '1' } },\n 'state of aggregation $': {\n '*': { action_: [ 'output', 'state of aggregation' ], nextState: '1' } },\n '{[(': {\n 'a|as|o': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' },\n '0|1|2|3': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' },\n '*': { action_: [ 'output', 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' } },\n ')]}': {\n '0|1|2|3|b|p|bp|o': { action_: [ 'o=', 'parenthesisLevel--' ], nextState: 'o' },\n 'a|as|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=', 'parenthesisLevel--' ], nextState: 'o' } },\n ', ': {\n '*': { action_: [ 'output', 'comma' ], nextState: '0' } },\n '^_': { // ^ and _ without a sensible argument\n '*': { } },\n '^{(...)}|^($...$)': {\n '0|1|2|as': { action_: 'b=', nextState: 'b' },\n 'p': { action_: 'b=', nextState: 'bp' },\n '3|o': { action_: 'd= kv', nextState: 'D' },\n 'q': { action_: 'd=', nextState: 'qD' },\n 'd|D|qd|qD|dq': { action_: [ 'output', 'd=' ], nextState: 'D' } },\n '^a|^\\\\x{}{}|^\\\\x{}|^\\\\x|\\'': {\n '0|1|2|as': { action_: 'b=', nextState: 'b' },\n 'p': { action_: 'b=', nextState: 'bp' },\n '3|o': { action_: 'd= kv', nextState: 'd' },\n 'q': { action_: 'd=', nextState: 'qd' },\n 'd|qd|D|qD': { action_: 'd=' },\n 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' } },\n '_{(state of aggregation)}$': {\n 'd|D|q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } },\n '_{(...)}|_($...$)|_9|_\\\\x{}{}|_\\\\x{}|_\\\\x': {\n '0|1|2|as': { action_: 'p=', nextState: 'p' },\n 'b': { action_: 'p=', nextState: 'bp' },\n '3|o': { action_: 'q=', nextState: 'q' },\n 'd|D': { action_: 'q=', nextState: 'dq' },\n 'q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } },\n '=<>': {\n '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: '3' } },\n '#': {\n '0|1|2|3|a|as|o': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: \"#\" } ], nextState: '3' } },\n '{}': {\n '*': { action_: { type_: 'output', option: 1 }, nextState: '1' } },\n '{...}': {\n '0|1|2|3|a|as|b|p|bp': { action_: 'o=', nextState: 'o' },\n 'o|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } },\n '$...$': {\n 'a': { action_: 'a=' }, // 2$n$\n '0|1|2|3|as|b|p|bp|o': { action_: 'o=', nextState: 'o' }, // not 'amount'\n 'as|o': { action_: 'o=' },\n 'q|d|D|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } },\n '\\\\bond{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: \"3\" } },\n '\\\\frac{(...)}': {\n '*': { action_: [ { type_: 'output', option: 1 }, 'frac-output' ], nextState: '3' } },\n '\\\\overset{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'overset-output' ], nextState: '3' } },\n '\\\\underset{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'underset-output' ], nextState: '3' } },\n '\\\\underbrace{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'underbrace-output' ], nextState: '3' } },\n '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'color-output' ], nextState: '3' } },\n '\\\\color{(...)}0': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'color0-output' ] } },\n '\\\\ce{(...)}': {\n '*': { action_: [ { type_: 'output', option: 2 }, 'ce' ], nextState: '3' } },\n '\\\\,': {\n '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '1' } },\n '\\\\x{}{}|\\\\x{}|\\\\x': {\n '0|1|2|3|a|as|b|p|bp|o|c0': { action_: [ 'o=', 'output' ], nextState: '3' },\n '*': { action_: ['output', 'o=', 'output' ], nextState: '3' } },\n 'others': {\n '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '3' } },\n 'else2': {\n 'a': { action_: 'a to o', nextState: 'o', revisit: true },\n 'as': { action_: [ 'output', 'sb=true' ], nextState: '1', revisit: true },\n 'r|rt|rd|rdt|rdq': { action_: [ 'output' ], nextState: '0', revisit: true },\n '*': { action_: [ 'output', 'copy' ], nextState: '3' } }\n }),\n actions: {\n 'o after d': function (buffer, m) {\n var ret;\n if ((buffer.d || \"\").match(/^[0-9]+$/)) {\n var tmp = buffer.d;\n buffer.d = undefined;\n ret = this['output'](buffer);\n buffer.b = tmp;\n } else {\n ret = this['output'](buffer);\n }\n mhchemParser.actions['o='](buffer, m);\n return ret;\n },\n 'd= kv': function (buffer, m) {\n buffer.d = m;\n buffer.dType = 'kv';\n },\n 'charge or bond': function (buffer, m) {\n if (buffer['beginsWithBond']) {\n /** @type {ParserOutput[]} */\n var ret = [];\n mhchemParser.concatArray(ret, this['output'](buffer));\n mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, \"-\"));\n return ret;\n } else {\n buffer.d = m;\n }\n },\n '- after o/d': function (buffer, m, isAfterD) {\n var c1 = mhchemParser.patterns.match_('orbital', buffer.o || \"\");\n var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || \"\");\n var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || \"\");\n var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || \"\");\n var hyphenFollows = m===\"-\" && ( c1 && c1.remainder===\"\" || c2 || c3 || c4 );\n if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) {\n buffer.o = '$' + buffer.o + '$';\n }\n /** @type {ParserOutput[]} */\n var ret = [];\n if (hyphenFollows) {\n mhchemParser.concatArray(ret, this['output'](buffer));\n ret.push({ type_: 'hyphen' });\n } else {\n c1 = mhchemParser.patterns.match_('digits', buffer.d || \"\");\n if (isAfterD && c1 && c1.remainder==='') {\n mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m));\n mhchemParser.concatArray(ret, this['output'](buffer));\n } else {\n mhchemParser.concatArray(ret, this['output'](buffer));\n mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, \"-\"));\n }\n }\n return ret;\n },\n 'a to o': function (buffer) {\n buffer.o = buffer.a;\n buffer.a = undefined;\n },\n 'sb=true': function (buffer) { buffer.sb = true; },\n 'sb=false': function (buffer) { buffer.sb = false; },\n 'beginsWithBond=true': function (buffer) { buffer['beginsWithBond'] = true; },\n 'beginsWithBond=false': function (buffer) { buffer['beginsWithBond'] = false; },\n 'parenthesisLevel++': function (buffer) { buffer['parenthesisLevel']++; },\n 'parenthesisLevel--': function (buffer) { buffer['parenthesisLevel']--; },\n 'state of aggregation': function (buffer, m) {\n return { type_: 'state of aggregation', p1: mhchemParser.go(m, 'o') };\n },\n 'comma': function (buffer, m) {\n var a = m.replace(/\\s*$/, '');\n var withSpace = (a !== m);\n if (withSpace && buffer['parenthesisLevel'] === 0) {\n return { type_: 'comma enumeration L', p1: a };\n } else {\n return { type_: 'comma enumeration M', p1: a };\n }\n },\n 'output': function (buffer, m, entityFollows) {\n // entityFollows:\n // undefined = if we have nothing else to output, also ignore the just read space (buffer.sb)\n // 1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1)\n // 2 = 1 + the entity can have an amount, so output a\\, instead of converting it to o (can only apply to states a|as)\n /** @type {ParserOutput | ParserOutput[]} */\n var ret;\n if (!buffer.r) {\n ret = [];\n if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) {\n //ret = [];\n } else {\n if (buffer.sb) {\n ret.push({ type_: 'entitySkip' });\n }\n if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows!==2) {\n buffer.o = buffer.a;\n buffer.a = undefined;\n } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) {\n buffer.o = buffer.a;\n buffer.d = buffer.b;\n buffer.q = buffer.p;\n buffer.a = buffer.b = buffer.p = undefined;\n } else {\n if (buffer.o && buffer.dType==='kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || \"\")) {\n buffer.dType = 'oxidation';\n } else if (buffer.o && buffer.dType==='kv' && !buffer.q) {\n buffer.dType = undefined;\n }\n }\n ret.push({\n type_: 'chemfive',\n a: mhchemParser.go(buffer.a, 'a'),\n b: mhchemParser.go(buffer.b, 'bd'),\n p: mhchemParser.go(buffer.p, 'pq'),\n o: mhchemParser.go(buffer.o, 'o'),\n q: mhchemParser.go(buffer.q, 'pq'),\n d: mhchemParser.go(buffer.d, (buffer.dType === 'oxidation' ? 'oxidation' : 'bd')),\n dType: buffer.dType\n });\n }\n } else { // r\n /** @type {ParserOutput[]} */\n var rd;\n if (buffer.rdt === 'M') {\n rd = mhchemParser.go(buffer.rd, 'tex-math');\n } else if (buffer.rdt === 'T') {\n rd = [ { type_: 'text', p1: buffer.rd || \"\" } ];\n } else {\n rd = mhchemParser.go(buffer.rd);\n }\n /** @type {ParserOutput[]} */\n var rq;\n if (buffer.rqt === 'M') {\n rq = mhchemParser.go(buffer.rq, 'tex-math');\n } else if (buffer.rqt === 'T') {\n rq = [ { type_: 'text', p1: buffer.rq || \"\"} ];\n } else {\n rq = mhchemParser.go(buffer.rq);\n }\n ret = {\n type_: 'arrow',\n r: buffer.r,\n rd: rd,\n rq: rq\n };\n }\n for (var p in buffer) {\n if (p !== 'parenthesisLevel' && p !== 'beginsWithBond') {\n delete buffer[p];\n }\n }\n return ret;\n },\n 'oxidation-output': function (buffer, m) {\n var ret = [ \"{\" ];\n mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation'));\n ret.push(\"}\");\n return ret;\n },\n 'frac-output': function (buffer, m) {\n return { type_: 'frac-ce', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n },\n 'overset-output': function (buffer, m) {\n return { type_: 'overset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n },\n 'underset-output': function (buffer, m) {\n return { type_: 'underset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n },\n 'underbrace-output': function (buffer, m) {\n return { type_: 'underbrace', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n },\n 'color-output': function (buffer, m) {\n return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1]) };\n },\n 'r=': function (buffer, m) { buffer.r = m; },\n 'rdt=': function (buffer, m) { buffer.rdt = m; },\n 'rd=': function (buffer, m) { buffer.rd = m; },\n 'rqt=': function (buffer, m) { buffer.rqt = m; },\n 'rq=': function (buffer, m) { buffer.rq = m; },\n 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; }\n }\n },\n 'a': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n '1/2$': {\n '0': { action_: '1/2' } },\n 'else': {\n '0': { nextState: '1', revisit: true } },\n '$(...)$': {\n '*': { action_: 'tex-math tight', nextState: '1' } },\n ',': {\n '*': { action_: { type_: 'insert', option: 'commaDecimal' } } },\n 'else2': {\n '*': { action_: 'copy' } }\n }),\n actions: {}\n },\n 'o': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n '1/2$': {\n '0': { action_: '1/2' } },\n 'else': {\n '0': { nextState: '1', revisit: true } },\n 'letters': {\n '*': { action_: 'rm' } },\n '\\\\ca': {\n '*': { action_: { type_: 'insert', option: 'circa' } } },\n '\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'copy' } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n '{(...)}': {\n '*': { action_: '{text}' } },\n 'else2': {\n '*': { action_: 'copy' } }\n }),\n actions: {}\n },\n 'text': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n '{...}': {\n '*': { action_: 'text=' } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n '\\\\greek': {\n '*': { action_: [ 'output', 'rm' ] } },\n '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: [ 'output', 'copy' ] } },\n 'else': {\n '*': { action_: 'text=' } }\n }),\n actions: {\n 'output': function (buffer) {\n if (buffer.text_) {\n /** @type {ParserOutput} */\n var ret = { type_: 'text', p1: buffer.text_ };\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n }\n },\n 'pq': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n 'state of aggregation $': {\n '*': { action_: 'state of aggregation' } },\n 'i$': {\n '0': { nextState: '!f', revisit: true } },\n '(KV letters),': {\n '0': { action_: 'rm', nextState: '0' } },\n 'formula$': {\n '0': { nextState: 'f', revisit: true } },\n '1/2$': {\n '0': { action_: '1/2' } },\n 'else': {\n '0': { nextState: '!f', revisit: true } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n '{(...)}': {\n '*': { action_: 'text' } },\n 'a-z': {\n 'f': { action_: 'tex-math' } },\n 'letters': {\n '*': { action_: 'rm' } },\n '-9.,9': {\n '*': { action_: '9,9' } },\n ',': {\n '*': { action_: { type_: 'insert+p1', option: 'comma enumeration S' } } },\n '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n '*': { action_: 'color-output' } },\n '\\\\color{(...)}0': {\n '*': { action_: 'color0-output' } },\n '\\\\ce{(...)}': {\n '*': { action_: 'ce' } },\n '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'copy' } },\n 'else2': {\n '*': { action_: 'copy' } }\n }),\n actions: {\n 'state of aggregation': function (buffer, m) {\n return { type_: 'state of aggregation subscript', p1: mhchemParser.go(m, 'o') };\n },\n 'color-output': function (buffer, m) {\n return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'pq') };\n }\n }\n },\n 'bd': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n 'x$': {\n '0': { nextState: '!f', revisit: true } },\n 'formula$': {\n '0': { nextState: 'f', revisit: true } },\n 'else': {\n '0': { nextState: '!f', revisit: true } },\n '-9.,9 no missing 0': {\n '*': { action_: '9,9' } },\n '.': {\n '*': { action_: { type_: 'insert', option: 'electron dot' } } },\n 'a-z': {\n 'f': { action_: 'tex-math' } },\n 'x': {\n '*': { action_: { type_: 'insert', option: 'KV x' } } },\n 'letters': {\n '*': { action_: 'rm' } },\n '\\'': {\n '*': { action_: { type_: 'insert', option: 'prime' } } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n '{(...)}': {\n '*': { action_: 'text' } },\n '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n '*': { action_: 'color-output' } },\n '\\\\color{(...)}0': {\n '*': { action_: 'color0-output' } },\n '\\\\ce{(...)}': {\n '*': { action_: 'ce' } },\n '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'copy' } },\n 'else2': {\n '*': { action_: 'copy' } }\n }),\n actions: {\n 'color-output': function (buffer, m) {\n return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'bd') };\n }\n }\n },\n 'oxidation': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n 'roman numeral': {\n '*': { action_: 'roman-numeral' } },\n '${(...)}$|$(...)$': {\n '*': { action_: 'tex-math' } },\n 'else': {\n '*': { action_: 'copy' } }\n }),\n actions: {\n 'roman-numeral': function (buffer, m) { return { type_: 'roman numeral', p1: m || \"\" }; }\n }\n },\n 'tex-math': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n '\\\\ce{(...)}': {\n '*': { action_: [ 'output', 'ce' ] } },\n '{...}|\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'o=' } },\n 'else': {\n '*': { action_: 'o=' } }\n }),\n actions: {\n 'output': function (buffer) {\n if (buffer.o) {\n /** @type {ParserOutput} */\n var ret = { type_: 'tex-math', p1: buffer.o };\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n }\n },\n 'tex-math tight': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n '\\\\ce{(...)}': {\n '*': { action_: [ 'output', 'ce' ] } },\n '{...}|\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n '*': { action_: 'o=' } },\n '-|+': {\n '*': { action_: 'tight operator' } },\n 'else': {\n '*': { action_: 'o=' } }\n }),\n actions: {\n 'tight operator': function (buffer, m) { buffer.o = (buffer.o || \"\") + \"{\"+m+\"}\"; },\n 'output': function (buffer) {\n if (buffer.o) {\n /** @type {ParserOutput} */\n var ret = { type_: 'tex-math', p1: buffer.o };\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n }\n },\n '9,9': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': {} },\n ',': {\n '*': { action_: 'comma' } },\n 'else': {\n '*': { action_: 'copy' } }\n }),\n actions: {\n 'comma': function () { return { type_: 'commaDecimal' }; }\n }\n },\n //#endregion\n //\n // \\pu state machines\n //\n //#region pu\n 'pu': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n 'space$': {\n '*': { action_: [ 'output', 'space' ] } },\n '{[(|)]}': {\n '0|a': { action_: 'copy' } },\n '(-)(9)^(-9)': {\n '0': { action_: 'number^', nextState: 'a' } },\n '(-)(9.,9)(e)(99)': {\n '0': { action_: 'enumber', nextState: 'a' } },\n 'space': {\n '0|a': {} },\n 'pm-operator': {\n '0|a': { action_: { type_: 'operator', option: '\\\\pm' }, nextState: '0' } },\n 'operator': {\n '0|a': { action_: 'copy', nextState: '0' } },\n '//': {\n 'd': { action_: 'o=', nextState: '/' } },\n '/': {\n 'd': { action_: 'o=', nextState: '/' } },\n '{...}|else': {\n '0|d': { action_: 'd=', nextState: 'd' },\n 'a': { action_: [ 'space', 'd=' ], nextState: 'd' },\n '/|q': { action_: 'q=', nextState: 'q' } }\n }),\n actions: {\n 'enumber': function (buffer, m) {\n /** @type {ParserOutput[]} */\n var ret = [];\n if (m[0] === \"+-\" || m[0] === \"+/-\") {\n ret.push(\"\\\\pm \");\n } else if (m[0]) {\n ret.push(m[0]);\n }\n if (m[1]) {\n mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));\n if (m[2]) {\n if (m[2].match(/[,.]/)) {\n mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9'));\n } else {\n ret.push(m[2]);\n }\n }\n m[3] = m[4] || m[3];\n if (m[3]) {\n m[3] = m[3].trim();\n if (m[3] === \"e\" || m[3].substr(0, 1) === \"*\") {\n ret.push({ type_: 'cdot' });\n } else {\n ret.push({ type_: 'times' });\n }\n }\n }\n if (m[3]) {\n ret.push(\"10^{\"+m[5]+\"}\");\n }\n return ret;\n },\n 'number^': function (buffer, m) {\n /** @type {ParserOutput[]} */\n var ret = [];\n if (m[0] === \"+-\" || m[0] === \"+/-\") {\n ret.push(\"\\\\pm \");\n } else if (m[0]) {\n ret.push(m[0]);\n }\n mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));\n ret.push(\"^{\"+m[2]+\"}\");\n return ret;\n },\n 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; },\n 'space': function () { return { type_: 'pu-space-1' }; },\n 'output': function (buffer) {\n /** @type {ParserOutput | ParserOutput[]} */\n var ret;\n var md = mhchemParser.patterns.match_('{(...)}', buffer.d || \"\");\n if (md && md.remainder === '') { buffer.d = md.match_; }\n var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || \"\");\n if (mq && mq.remainder === '') { buffer.q = mq.match_; }\n if (buffer.d) {\n buffer.d = buffer.d.replace(/\\u00B0C|\\^oC|\\^{o}C/g, \"{}^{\\\\circ}C\");\n buffer.d = buffer.d.replace(/\\u00B0F|\\^oF|\\^{o}F/g, \"{}^{\\\\circ}F\");\n }\n if (buffer.q) { // fraction\n buffer.q = buffer.q.replace(/\\u00B0C|\\^oC|\\^{o}C/g, \"{}^{\\\\circ}C\");\n buffer.q = buffer.q.replace(/\\u00B0F|\\^oF|\\^{o}F/g, \"{}^{\\\\circ}F\");\n var b5 = {\n d: mhchemParser.go(buffer.d, 'pu'),\n q: mhchemParser.go(buffer.q, 'pu')\n };\n if (buffer.o === '//') {\n ret = { type_: 'pu-frac', p1: b5.d, p2: b5.q };\n } else {\n ret = b5.d;\n if (b5.d.length > 1 || b5.q.length > 1) {\n ret.push({ type_: ' / ' });\n } else {\n ret.push({ type_: '/' });\n }\n mhchemParser.concatArray(ret, b5.q);\n }\n } else { // no fraction\n ret = mhchemParser.go(buffer.d, 'pu-2');\n }\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n },\n 'pu-2': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '*': { action_: 'output' } },\n '*': {\n '*': { action_: [ 'output', 'cdot' ], nextState: '0' } },\n '\\\\x': {\n '*': { action_: 'rm=' } },\n 'space': {\n '*': { action_: [ 'output', 'space' ], nextState: '0' } },\n '^{(...)}|^(-1)': {\n '1': { action_: '^(-1)' } },\n '-9.,9': {\n '0': { action_: 'rm=', nextState: '0' },\n '1': { action_: '^(-1)', nextState: '0' } },\n '{...}|else': {\n '*': { action_: 'rm=', nextState: '1' } }\n }),\n actions: {\n 'cdot': function () { return { type_: 'tight cdot' }; },\n '^(-1)': function (buffer, m) { buffer.rm += \"^{\"+m+\"}\"; },\n 'space': function () { return { type_: 'pu-space-2' }; },\n 'output': function (buffer) {\n /** @type {ParserOutput | ParserOutput[]} */\n var ret = [];\n if (buffer.rm) {\n var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || \"\");\n if (mrm && mrm.remainder === '') {\n ret = mhchemParser.go(mrm.match_, 'pu');\n } else {\n ret = { type_: 'rm', p1: buffer.rm };\n }\n }\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n },\n 'pu-9,9': {\n transitions: mhchemParser.createTransitions({\n 'empty': {\n '0': { action_: 'output-0' },\n 'o': { action_: 'output-o' } },\n ',': {\n '0': { action_: [ 'output-0', 'comma' ], nextState: 'o' } },\n '.': {\n '0': { action_: [ 'output-0', 'copy' ], nextState: 'o' } },\n 'else': {\n '*': { action_: 'text=' } }\n }),\n actions: {\n 'comma': function () { return { type_: 'commaDecimal' }; },\n 'output-0': function (buffer) {\n /** @type {ParserOutput[]} */\n var ret = [];\n buffer.text_ = buffer.text_ || \"\";\n if (buffer.text_.length > 4) {\n var a = buffer.text_.length % 3;\n if (a === 0) { a = 3; }\n for (var i=buffer.text_.length-3; i>0; i-=3) {\n ret.push(buffer.text_.substr(i, 3));\n ret.push({ type_: '1000 separator' });\n }\n ret.push(buffer.text_.substr(0, a));\n ret.reverse();\n } else {\n ret.push(buffer.text_);\n }\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n },\n 'output-o': function (buffer) {\n /** @type {ParserOutput[]} */\n var ret = [];\n buffer.text_ = buffer.text_ || \"\";\n if (buffer.text_.length > 4) {\n var a = buffer.text_.length - 3;\n for (var i=0; i<a; i+=3) {\n ret.push(buffer.text_.substr(i, 3));\n ret.push({ type_: '1000 separator' });\n }\n ret.push(buffer.text_.substr(i));\n } else {\n ret.push(buffer.text_);\n }\n for (var p in buffer) { delete buffer[p]; }\n return ret;\n }\n }\n }\n //#endregion\n };\n\n //\n // texify: Take MhchemParser output and convert it to TeX\n //\n /** @type {Texify} */\n var texify = {\n go: function (input, isInner) { // (recursive, max 4 levels)\n if (!input) { return \"\"; }\n var res = \"\";\n var cee = false;\n for (var i=0; i < input.length; i++) {\n var inputi = input[i];\n if (typeof inputi === \"string\") {\n res += inputi;\n } else {\n res += texify._go2(inputi);\n if (inputi.type_ === '1st-level escape') { cee = true; }\n }\n }\n if (!isInner && !cee && res) {\n res = \"{\" + res + \"}\";\n }\n return res;\n },\n _goInner: function (input) {\n if (!input) { return input; }\n return texify.go(input, true);\n },\n _go2: function (buf) {\n /** @type {undefined | string} */\n var res;\n switch (buf.type_) {\n case 'chemfive':\n res = \"\";\n var b5 = {\n a: texify._goInner(buf.a),\n b: texify._goInner(buf.b),\n p: texify._goInner(buf.p),\n o: texify._goInner(buf.o),\n q: texify._goInner(buf.q),\n d: texify._goInner(buf.d)\n };\n //\n // a\n //\n if (b5.a) {\n if (b5.a.match(/^[+\\-]/)) { b5.a = \"{\"+b5.a+\"}\"; }\n res += b5.a + \"\\\\,\";\n }\n //\n // b and p\n //\n if (b5.b || b5.p) {\n res += \"{\\\\vphantom{X}}\";\n res += \"^{\\\\hphantom{\"+(b5.b||\"\")+\"}}_{\\\\hphantom{\"+(b5.p||\"\")+\"}}\";\n res += \"{\\\\vphantom{X}}\";\n // In the next two lines, I've removed \\smash[t] (ron)\n // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n //res += \"^{\\\\smash[t]{\\\\vphantom{2}}\\\\mathllap{\"+(b5.b||\"\")+\"}}\";\n res += \"^{\\\\vphantom{2}\\\\mathllap{\"+(b5.b||\"\")+\"}}\";\n //res += \"_{\\\\vphantom{2}\\\\mathllap{\\\\smash[t]{\"+(b5.p||\"\")+\"}}}\";\n res += \"_{\\\\vphantom{2}\\\\mathllap{\"+(b5.p||\"\")+\"}}\";\n }\n //\n // o\n //\n if (b5.o) {\n if (b5.o.match(/^[+\\-]/)) { b5.o = \"{\"+b5.o+\"}\"; }\n res += b5.o;\n }\n //\n // q and d\n //\n if (buf.dType === 'kv') {\n if (b5.d || b5.q) {\n res += \"{\\\\vphantom{X}}\";\n }\n if (b5.d) {\n res += \"^{\"+b5.d+\"}\";\n }\n if (b5.q) {\n // In the next line, I've removed \\smash[t] (ron)\n // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n //res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n res += \"_{\"+b5.q+\"}\";\n }\n } else if (buf.dType === 'oxidation') {\n if (b5.d) {\n res += \"{\\\\vphantom{X}}\";\n res += \"^{\"+b5.d+\"}\";\n }\n if (b5.q) {\n // A Firefox bug adds a bogus depth to <mphantom>, so we change \\vphantom{X} to {}\n // TODO: Reinstate \\vphantom{X} when the Firefox bug is fixed.\n// res += \"{\\\\vphantom{X}}\";\n res += \"{{}}\";\n // In the next line, I've removed \\smash[t] (ron)\n // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n //res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n res += \"_{\"+b5.q+\"}\";\n }\n } else {\n if (b5.q) {\n // TODO: Reinstate \\vphantom{X} when the Firefox bug is fixed.\n// res += \"{\\\\vphantom{X}}\";\n res += \"{{}}\";\n // In the next line, I've removed \\smash[t] (ron)\n // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n //res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n res += \"_{\"+b5.q+\"}\";\n }\n if (b5.d) {\n // TODO: Reinstate \\vphantom{X} when the Firefox bug is fixed.\n// res += \"{\\\\vphantom{X}}\";\n res += \"{{}}\";\n res += \"^{\"+b5.d+\"}\";\n }\n }\n break;\n case 'rm':\n res = \"\\\\mathrm{\"+buf.p1+\"}\";\n break;\n case 'text':\n if (buf.p1.match(/[\\^_]/)) {\n buf.p1 = buf.p1.replace(\" \", \"~\").replace(\"-\", \"\\\\text{-}\");\n res = \"\\\\mathrm{\"+buf.p1+\"}\";\n } else {\n res = \"\\\\text{\"+buf.p1+\"}\";\n }\n break;\n case 'roman numeral':\n res = \"\\\\mathrm{\"+buf.p1+\"}\";\n break;\n case 'state of aggregation':\n res = \"\\\\mskip2mu \"+texify._goInner(buf.p1);\n break;\n case 'state of aggregation subscript':\n res = \"\\\\mskip1mu \"+texify._goInner(buf.p1);\n break;\n case 'bond':\n res = texify._getBond(buf.kind_);\n if (!res) {\n throw [\"MhchemErrorBond\", \"mhchem Error. Unknown bond type (\" + buf.kind_ + \")\"];\n }\n break;\n case 'frac':\n var c = \"\\\\frac{\" + buf.p1 + \"}{\" + buf.p2 + \"}\";\n res = \"\\\\mathchoice{\\\\textstyle\"+c+\"}{\"+c+\"}{\"+c+\"}{\"+c+\"}\";\n break;\n case 'pu-frac':\n var d = \"\\\\frac{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n res = \"\\\\mathchoice{\\\\textstyle\"+d+\"}{\"+d+\"}{\"+d+\"}{\"+d+\"}\";\n break;\n case 'tex-math':\n res = buf.p1 + \" \";\n break;\n case 'frac-ce':\n res = \"\\\\frac{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n break;\n case 'overset':\n res = \"\\\\overset{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n break;\n case 'underset':\n res = \"\\\\underset{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n break;\n case 'underbrace':\n res = \"\\\\underbrace{\" + texify._goInner(buf.p1) + \"}_{\" + texify._goInner(buf.p2) + \"}\";\n break;\n case 'color':\n res = \"{\\\\color{\" + buf.color1 + \"}{\" + texify._goInner(buf.color2) + \"}}\";\n break;\n case 'color0':\n res = \"\\\\color{\" + buf.color + \"}\";\n break;\n case 'arrow':\n var b6 = {\n rd: texify._goInner(buf.rd),\n rq: texify._goInner(buf.rq)\n };\n var arrow = texify._getArrow(buf.r);\n if (b6.rq) { arrow += \"[{\\\\rm \" + b6.rq + \"}]\"; }\n if (b6.rd) {\n arrow += \"{\\\\rm \" + b6.rd + \"}\";\n } else {\n arrow += \"{}\";\n }\n res = arrow;\n break;\n case 'operator':\n res = texify._getOperator(buf.kind_);\n break;\n case '1st-level escape':\n res = buf.p1+\" \"; // &, \\\\\\\\, \\\\hlin\n break;\n case 'space':\n res = \" \";\n break;\n case 'entitySkip':\n res = \"~\";\n break;\n case 'pu-space-1':\n res = \"~\";\n break;\n case 'pu-space-2':\n res = \"\\\\mkern3mu \";\n break;\n case '1000 separator':\n res = \"\\\\mkern2mu \";\n break;\n case 'commaDecimal':\n res = \"{,}\";\n break;\n case 'comma enumeration L':\n res = \"{\"+buf.p1+\"}\\\\mkern6mu \";\n break;\n case 'comma enumeration M':\n res = \"{\"+buf.p1+\"}\\\\mkern3mu \";\n break;\n case 'comma enumeration S':\n res = \"{\"+buf.p1+\"}\\\\mkern1mu \";\n break;\n case 'hyphen':\n res = \"\\\\text{-}\";\n break;\n case 'addition compound':\n res = \"\\\\,{\\\\cdot}\\\\,\";\n break;\n case 'electron dot':\n res = \"\\\\mkern1mu \\\\text{\\\\textbullet}\\\\mkern1mu \";\n break;\n case 'KV x':\n res = \"{\\\\times}\";\n break;\n case 'prime':\n res = \"\\\\prime \";\n break;\n case 'cdot':\n res = \"\\\\cdot \";\n break;\n case 'tight cdot':\n res = \"\\\\mkern1mu{\\\\cdot}\\\\mkern1mu \";\n break;\n case 'times':\n res = \"\\\\times \";\n break;\n case 'circa':\n res = \"{\\\\sim}\";\n break;\n case '^':\n res = \"uparrow\";\n break;\n case 'v':\n res = \"downarrow\";\n break;\n case 'ellipsis':\n res = \"\\\\ldots \";\n break;\n case '/':\n res = \"/\";\n break;\n case ' / ':\n res = \"\\\\,/\\\\,\";\n break;\n default:\n assertNever(buf);\n throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"]; // Missing texify rule or unknown MhchemParser output\n }\n assertString(res);\n return res;\n },\n _getArrow: function (a) {\n switch (a) {\n case \"->\": return \"\\\\yields\";\n case \"\\u2192\": return \"\\\\yields\";\n case \"\\u27F6\": return \"\\\\yields\";\n case \"<-\": return \"\\\\yieldsLeft\";\n case \"<->\": return \"\\\\mesomerism\";\n case \"<-->\": return \"\\\\yieldsLeftRight\";\n case \"<=>\": return \"\\\\equilibrium\";\n case \"\\u21CC\": return \"\\\\equilibrium\";\n case \"<=>>\": return \"\\\\equilibriumRight\";\n case \"<<=>\": return \"\\\\equilibriumLeft\";\n default:\n assertNever(a);\n throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n }\n },\n _getBond: function (a) {\n switch (a) {\n case \"-\": return \"{-}\";\n case \"1\": return \"{-}\";\n case \"=\": return \"{=}\";\n case \"2\": return \"{=}\";\n case \"#\": return \"{\\\\equiv}\";\n case \"3\": return \"{\\\\equiv}\";\n case \"~\": return \"{\\\\tripleDash}\";\n case \"~-\": return \"{\\\\tripleDashOverLine}\";\n case \"~=\": return \"{\\\\tripleDashOverDoubleLine}\";\n case \"~--\": return \"{\\\\tripleDashOverDoubleLine}\";\n case \"-~-\": return \"{\\\\tripleDashBetweenDoubleLine}\";\n case \"...\": return \"{{\\\\cdot}{\\\\cdot}{\\\\cdot}}\";\n case \"....\": return \"{{\\\\cdot}{\\\\cdot}{\\\\cdot}{\\\\cdot}}\";\n case \"->\": return \"{\\\\rightarrow}\";\n case \"<-\": return \"{\\\\leftarrow}\";\n case \"<\": return \"{<}\";\n case \">\": return \"{>}\";\n default:\n assertNever(a);\n throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n }\n },\n _getOperator: function (a) {\n switch (a) {\n case \"+\": return \" {}+{} \";\n case \"-\": return \" {}-{} \";\n case \"=\": return \" {}={} \";\n case \"<\": return \" {}<{} \";\n case \">\": return \" {}>{} \";\n case \"<<\": return \" {}\\\\ll{} \";\n case \">>\": return \" {}\\\\gg{} \";\n case \"\\\\pm\": return \" {}\\\\pm{} \";\n case \"\\\\approx\": return \" {}\\\\approx{} \";\n case \"$\\\\approx$\": return \" {}\\\\approx{} \";\n case \"v\": return \" \\\\downarrow{} \";\n case \"(v)\": return \" \\\\downarrow{} \";\n case \"^\": return \" \\\\uparrow{} \";\n case \"(^)\": return \" \\\\uparrow{} \";\n default:\n assertNever(a);\n throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n }\n }\n };\n\n //\n // Helpers for code analysis\n // Will show type error at calling position\n //\n /** @param {number} a */\n function assertNever(a) {}\n /** @param {string} a */\n function assertString(a) {}\n\n/* eslint-disable no-undef */\n\n//////////////////////////////////////////////////////////////////////\n// texvc.sty\n\n// The texvc package contains macros available in mediawiki pages.\n// We omit the functions deprecated at\n// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax\n\n// We also omit texvc's \\O, which conflicts with \\text{\\O}\n\ndefineMacro(\"\\\\darr\", \"\\\\downarrow\");\ndefineMacro(\"\\\\dArr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\Darr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\lang\", \"\\\\langle\");\ndefineMacro(\"\\\\rang\", \"\\\\rangle\");\ndefineMacro(\"\\\\uarr\", \"\\\\uparrow\");\ndefineMacro(\"\\\\uArr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\Uarr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\N\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\R\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Z\", \"\\\\mathbb{Z}\");\ndefineMacro(\"\\\\alef\", \"\\\\aleph\");\ndefineMacro(\"\\\\alefsym\", \"\\\\aleph\");\ndefineMacro(\"\\\\bull\", \"\\\\bullet\");\ndefineMacro(\"\\\\clubs\", \"\\\\clubsuit\");\ndefineMacro(\"\\\\cnums\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Complex\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Dagger\", \"\\\\ddagger\");\ndefineMacro(\"\\\\diamonds\", \"\\\\diamondsuit\");\ndefineMacro(\"\\\\empty\", \"\\\\emptyset\");\ndefineMacro(\"\\\\exist\", \"\\\\exists\");\ndefineMacro(\"\\\\harr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\hArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Harr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\hearts\", \"\\\\heartsuit\");\ndefineMacro(\"\\\\image\", \"\\\\Im\");\ndefineMacro(\"\\\\infin\", \"\\\\infty\");\ndefineMacro(\"\\\\isin\", \"\\\\in\");\ndefineMacro(\"\\\\larr\", \"\\\\leftarrow\");\ndefineMacro(\"\\\\lArr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\Larr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\lrarr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\lrArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Lrarr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\natnums\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\plusmn\", \"\\\\pm\");\ndefineMacro(\"\\\\rarr\", \"\\\\rightarrow\");\ndefineMacro(\"\\\\rArr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\Rarr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\real\", \"\\\\Re\");\ndefineMacro(\"\\\\reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\sdot\", \"\\\\cdot\");\ndefineMacro(\"\\\\sect\", \"\\\\S\");\ndefineMacro(\"\\\\spades\", \"\\\\spadesuit\");\ndefineMacro(\"\\\\sub\", \"\\\\subset\");\ndefineMacro(\"\\\\sube\", \"\\\\subseteq\");\ndefineMacro(\"\\\\supe\", \"\\\\supseteq\");\ndefineMacro(\"\\\\thetasym\", \"\\\\vartheta\");\ndefineMacro(\"\\\\weierp\", \"\\\\wp\");\n\n/* eslint-disable no-undef */\n\n/****************************************************\n *\n * physics.js\n *\n * Implements the Physics Package for LaTeX input.\n *\n * ---------------------------------------------------------------------\n *\n * The original version of this file is licensed as follows:\n * Copyright (c) 2015-2016 Kolen Cheung <https://github.com/ickc/MathJax-third-party-extensions>.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ---------------------------------------------------------------------\n *\n * This file has been revised from the original in the following ways:\n * 1. The interface is changed so that it can be called from Temml, not MathJax.\n * 2. \\Re and \\Im are not used, to avoid conflict with existing LaTeX letters.\n *\n * This revision of the file is released under the MIT license.\n * https://mit-license.org/\n */\ndefineMacro(\"\\\\quantity\", \"{\\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\qty\", \"{\\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\pqty\", \"{\\\\left( #1 \\\\right)}\");\ndefineMacro(\"\\\\bqty\", \"{\\\\left[ #1 \\\\right]}\");\ndefineMacro(\"\\\\vqty\", \"{\\\\left\\\\vert #1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\Bqty\", \"{\\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\absolutevalue\", \"{\\\\left\\\\vert #1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\abs\", \"{\\\\left\\\\vert #1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\norm\", \"{\\\\left\\\\Vert #1 \\\\right\\\\Vert}\");\ndefineMacro(\"\\\\evaluated\", \"{\\\\left.#1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\eval\", \"{\\\\left.#1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\order\", \"{\\\\mathcal{O} \\\\left( #1 \\\\right)}\");\ndefineMacro(\"\\\\commutator\", \"{\\\\left[ #1 , #2 \\\\right]}\");\ndefineMacro(\"\\\\comm\", \"{\\\\left[ #1 , #2 \\\\right]}\");\ndefineMacro(\"\\\\anticommutator\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\acomm\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\poissonbracket\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\pb\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\vectorbold\", \"{\\\\boldsymbol{ #1 }}\");\ndefineMacro(\"\\\\vb\", \"{\\\\boldsymbol{ #1 }}\");\ndefineMacro(\"\\\\vectorarrow\", \"{\\\\vec{\\\\boldsymbol{ #1 }}}\");\ndefineMacro(\"\\\\va\", \"{\\\\vec{\\\\boldsymbol{ #1 }}}\");\ndefineMacro(\"\\\\vectorunit\", \"{{\\\\boldsymbol{\\\\hat{ #1 }}}}\");\ndefineMacro(\"\\\\vu\", \"{{\\\\boldsymbol{\\\\hat{ #1 }}}}\");\ndefineMacro(\"\\\\dotproduct\", \"\\\\mathbin{\\\\boldsymbol\\\\cdot}\");\ndefineMacro(\"\\\\vdot\", \"{\\\\boldsymbol\\\\cdot}\");\ndefineMacro(\"\\\\crossproduct\", \"\\\\mathbin{\\\\boldsymbol\\\\times}\");\ndefineMacro(\"\\\\cross\", \"\\\\mathbin{\\\\boldsymbol\\\\times}\");\ndefineMacro(\"\\\\cp\", \"\\\\mathbin{\\\\boldsymbol\\\\times}\");\ndefineMacro(\"\\\\gradient\", \"{\\\\boldsymbol\\\\nabla}\");\ndefineMacro(\"\\\\grad\", \"{\\\\boldsymbol\\\\nabla}\");\ndefineMacro(\"\\\\divergence\", \"{\\\\grad\\\\vdot}\");\n//defineMacro(\"\\\\div\", \"{\\\\grad\\\\vdot}\"); Not included in Temml. Conflicts w/LaTeX \\div\ndefineMacro(\"\\\\curl\", \"{\\\\grad\\\\cross}\");\ndefineMacro(\"\\\\laplacian\", \"\\\\nabla^2\");\ndefineMacro(\"\\\\tr\", \"{\\\\operatorname{tr}}\");\ndefineMacro(\"\\\\Tr\", \"{\\\\operatorname{Tr}}\");\ndefineMacro(\"\\\\rank\", \"{\\\\operatorname{rank}}\");\ndefineMacro(\"\\\\erf\", \"{\\\\operatorname{erf}}\");\ndefineMacro(\"\\\\Res\", \"{\\\\operatorname{Res}}\");\ndefineMacro(\"\\\\principalvalue\", \"{\\\\mathcal{P}}\");\ndefineMacro(\"\\\\pv\", \"{\\\\mathcal{P}}\");\ndefineMacro(\"\\\\PV\", \"{\\\\operatorname{P.V.}}\");\n// Temml does not use the next two lines. They conflict with LaTeX letters.\n//defineMacro(\"\\\\Re\", \"{\\\\operatorname{Re} \\\\left\\\\{ #1 \\\\right\\\\}}\");\n//defineMacro(\"\\\\Im\", \"{\\\\operatorname{Im} \\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\qqtext\", \"{\\\\quad\\\\text{ #1 }\\\\quad}\");\ndefineMacro(\"\\\\qq\", \"{\\\\quad\\\\text{ #1 }\\\\quad}\");\ndefineMacro(\"\\\\qcomma\", \"{\\\\text{,}\\\\quad}\");\ndefineMacro(\"\\\\qc\", \"{\\\\text{,}\\\\quad}\");\ndefineMacro(\"\\\\qcc\", \"{\\\\quad\\\\text{c.c.}\\\\quad}\");\ndefineMacro(\"\\\\qif\", \"{\\\\quad\\\\text{if}\\\\quad}\");\ndefineMacro(\"\\\\qthen\", \"{\\\\quad\\\\text{then}\\\\quad}\");\ndefineMacro(\"\\\\qelse\", \"{\\\\quad\\\\text{else}\\\\quad}\");\ndefineMacro(\"\\\\qotherwise\", \"{\\\\quad\\\\text{otherwise}\\\\quad}\");\ndefineMacro(\"\\\\qunless\", \"{\\\\quad\\\\text{unless}\\\\quad}\");\ndefineMacro(\"\\\\qgiven\", \"{\\\\quad\\\\text{given}\\\\quad}\");\ndefineMacro(\"\\\\qusing\", \"{\\\\quad\\\\text{using}\\\\quad}\");\ndefineMacro(\"\\\\qassume\", \"{\\\\quad\\\\text{assume}\\\\quad}\");\ndefineMacro(\"\\\\qsince\", \"{\\\\quad\\\\text{since}\\\\quad}\");\ndefineMacro(\"\\\\qlet\", \"{\\\\quad\\\\text{let}\\\\quad}\");\ndefineMacro(\"\\\\qfor\", \"{\\\\quad\\\\text{for}\\\\quad}\");\ndefineMacro(\"\\\\qall\", \"{\\\\quad\\\\text{all}\\\\quad}\");\ndefineMacro(\"\\\\qeven\", \"{\\\\quad\\\\text{even}\\\\quad}\");\ndefineMacro(\"\\\\qodd\", \"{\\\\quad\\\\text{odd}\\\\quad}\");\ndefineMacro(\"\\\\qinteger\", \"{\\\\quad\\\\text{integer}\\\\quad}\");\ndefineMacro(\"\\\\qand\", \"{\\\\quad\\\\text{and}\\\\quad}\");\ndefineMacro(\"\\\\qor\", \"{\\\\quad\\\\text{or}\\\\quad}\");\ndefineMacro(\"\\\\qas\", \"{\\\\quad\\\\text{as}\\\\quad}\");\ndefineMacro(\"\\\\qin\", \"{\\\\quad\\\\text{in}\\\\quad}\");\ndefineMacro(\"\\\\differential\", \"{\\\\text{d}}\");\ndefineMacro(\"\\\\dd\", \"{\\\\text{d}}\");\ndefineMacro(\"\\\\derivative\", \"{\\\\frac{\\\\text{d}{ #1 }}{\\\\text{d}{ #2 }}}\");\ndefineMacro(\"\\\\dv\", \"{\\\\frac{\\\\text{d}{ #1 }}{\\\\text{d}{ #2 }}}\");\ndefineMacro(\"\\\\partialderivative\", \"{\\\\frac{\\\\partial{ #1 }}{\\\\partial{ #2 }}}\");\ndefineMacro(\"\\\\variation\", \"{\\\\delta}\");\ndefineMacro(\"\\\\var\", \"{\\\\delta}\");\ndefineMacro(\"\\\\functionalderivative\", \"{\\\\frac{\\\\delta{ #1 }}{\\\\delta{ #2 }}}\");\ndefineMacro(\"\\\\fdv\", \"{\\\\frac{\\\\delta{ #1 }}{\\\\delta{ #2 }}}\");\ndefineMacro(\"\\\\innerproduct\", \"{\\\\left\\\\langle {#1} \\\\mid { #2} \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\outerproduct\",\n \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\dyad\",\n \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\ketbra\",\n \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\op\",\n \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\expectationvalue\", \"{\\\\left\\\\langle {#1 } \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\expval\", \"{\\\\left\\\\langle {#1 } \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\ev\", \"{\\\\left\\\\langle {#1 } \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\matrixelement\",\n \"{\\\\left\\\\langle{ #1 }\\\\right\\\\vert{ #2 }\\\\left\\\\vert{#3}\\\\right\\\\rangle}\");\ndefineMacro(\"\\\\matrixel\",\n \"{\\\\left\\\\langle{ #1 }\\\\right\\\\vert{ #2 }\\\\left\\\\vert{#3}\\\\right\\\\rangle}\");\ndefineMacro(\"\\\\mel\",\n \"{\\\\left\\\\langle{ #1 }\\\\right\\\\vert{ #2 }\\\\left\\\\vert{#3}\\\\right\\\\rangle}\");\n\n// Helper functions\nfunction getHLines(parser) {\n // Return an array. The array length = number of hlines.\n // Each element in the array tells if the line is dashed.\n const hlineInfo = [];\n parser.consumeSpaces();\n let nxt = parser.fetch().text;\n if (nxt === \"\\\\relax\") {\n parser.consume();\n parser.consumeSpaces();\n nxt = parser.fetch().text;\n }\n while (nxt === \"\\\\hline\" || nxt === \"\\\\hdashline\") {\n parser.consume();\n hlineInfo.push(nxt === \"\\\\hdashline\");\n parser.consumeSpaces();\n nxt = parser.fetch().text;\n }\n return hlineInfo;\n}\n\nconst validateAmsEnvironmentContext = context => {\n const settings = context.parser.settings;\n if (!settings.displayMode) {\n throw new ParseError(`{${context.envName}} can be used only in display mode.`);\n }\n};\n\nconst sizeRegEx$1 = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/;\nconst arrayGaps = macros => {\n let arraystretch = macros.get(\"\\\\arraystretch\");\n if (typeof arraystretch !== \"string\") {\n arraystretch = stringFromArg(arraystretch.tokens);\n }\n arraystretch = isNaN(arraystretch) ? null : Number(arraystretch);\n let arraycolsepStr = macros.get(\"\\\\arraycolsep\");\n if (typeof arraycolsepStr !== \"string\") {\n arraycolsepStr = stringFromArg(arraycolsepStr.tokens);\n }\n const match = sizeRegEx$1.exec(arraycolsepStr);\n const arraycolsep = match\n ? { number: +(match[1] + match[2]), unit: match[3] }\n : null;\n return [arraystretch, arraycolsep]\n};\n\nconst checkCellForLabels = cell => {\n // Check if the author wrote a \\tag{} inside this cell.\n let rowLabel = \"\";\n for (let i = 0; i < cell.length; i++) {\n if (cell[i].type === \"label\") {\n if (rowLabel) { throw new ParseError((\"Multiple \\\\labels in one row\")) }\n rowLabel = cell[i].string;\n }\n }\n return rowLabel\n};\n\n// autoTag (an argument to parseArray) can be one of three values:\n// * undefined: Regular (not-top-level) array; no tags on each row\n// * true: Automatic equation numbering, overridable by \\tag\n// * false: Tags allowed on each row, but no automatic numbering\n// This function *doesn't* work with the \"split\" environment name.\nfunction getAutoTag(name) {\n if (name.indexOf(\"ed\") === -1) {\n return name.indexOf(\"*\") === -1;\n }\n // return undefined;\n}\n\n/**\n * Parse the body of the environment, with rows delimited by \\\\ and\n * columns delimited by &, and create a nested list in row-major order\n * with one group per cell. If given an optional argument scriptLevel\n * (\"text\", \"display\", etc.), then each cell is cast into that scriptLevel.\n */\nfunction parseArray(\n parser,\n {\n cols, // [{ type: string , align: l|c|r|null }]\n envClasses, // align(ed|at|edat) | array | cases | cd | small | multline\n autoTag, // boolean\n singleRow, // boolean\n emptySingleRow, // boolean\n maxNumCols, // number\n leqno, // boolean\n arraystretch, // number | null\n arraycolsep // size value | null\n},\n scriptLevel\n) {\n const endToken = envClasses && envClasses.includes(\"bordermatrix\") ? \"}\" : \"\\\\end\";\n parser.gullet.beginGroup();\n if (!singleRow) {\n // \\cr is equivalent to \\\\ without the optional size argument (see below)\n // TODO: provide helpful error when \\cr is used outside array environment\n parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n }\n\n // Start group for first cell\n parser.gullet.beginGroup();\n\n let row = [];\n const body = [row];\n const rowGaps = [];\n const labels = [];\n\n const hLinesBeforeRow = [];\n\n const tags = (autoTag != null ? [] : undefined);\n\n // amsmath uses \\global\\@eqnswtrue and \\global\\@eqnswfalse to represent\n // whether this row should have an equation number. Simulate this with\n // a \\@eqnsw macro set to 1 or 0.\n function beginRow() {\n if (autoTag) {\n parser.gullet.macros.set(\"\\\\@eqnsw\", \"1\", true);\n }\n }\n function endRow() {\n if (tags) {\n if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n tags.push(parser.subparse([new Token(\"\\\\df@tag\")]));\n parser.gullet.macros.set(\"\\\\df@tag\", undefined, true);\n } else {\n tags.push(Boolean(autoTag) &&\n parser.gullet.macros.get(\"\\\\@eqnsw\") === \"1\");\n }\n }\n }\n beginRow();\n\n // Test for \\hline at the top of the array.\n hLinesBeforeRow.push(getHLines(parser));\n\n while (true) {\n // Parse each cell in its own group (namespace)\n let cell = parser.parseExpression(false, singleRow ? \"\\\\end\" : \"\\\\\\\\\");\n parser.gullet.endGroup();\n parser.gullet.beginGroup();\n\n cell = {\n type: \"ordgroup\",\n mode: parser.mode,\n body: cell,\n semisimple: true\n };\n row.push(cell);\n const next = parser.fetch().text;\n if (next === \"&\") {\n if (maxNumCols && row.length === maxNumCols) {\n if (envClasses.includes(\"array\")) {\n if (parser.settings.strict) {\n throw new ParseError(\"Too few columns \" + \"specified in the {array} column argument.\",\n parser.nextToken)\n }\n } else if (maxNumCols === 2) {\n throw new ParseError(\"The split environment accepts no more than two columns\",\n parser.nextToken);\n } else {\n throw new ParseError(\"The equation environment accepts only one column\",\n parser.nextToken)\n }\n }\n parser.consume();\n } else if (next === endToken) {\n endRow();\n // Arrays terminate newlines with `\\crcr` which consumes a `\\cr` if\n // the last line is empty. However, AMS environments keep the\n // empty row if it's the only one.\n // NOTE: Currently, `cell` is the last item added into `row`.\n if (row.length === 1 && cell.body.length === 0 && (body.length > 1 || !emptySingleRow)) {\n body.pop();\n }\n labels.push(checkCellForLabels(cell.body));\n if (hLinesBeforeRow.length < body.length + 1) {\n hLinesBeforeRow.push([]);\n }\n break;\n } else if (next === \"\\\\\\\\\") {\n parser.consume();\n let size;\n // \\def\\Let@{\\let\\\\\\math@cr}\n // \\def\\math@cr{...\\math@cr@}\n // \\def\\math@cr@{\\new@ifnextchar[\\math@cr@@{\\math@cr@@[\\z@]}}\n // \\def\\math@cr@@[#1]{...\\math@cr@@@...}\n // \\def\\math@cr@@@{\\cr}\n if (parser.gullet.future().text !== \" \") {\n size = parser.parseSizeGroup(true);\n }\n rowGaps.push(size ? size.value : null);\n endRow();\n\n labels.push(checkCellForLabels(cell.body));\n\n // check for \\hline(s) following the row separator\n hLinesBeforeRow.push(getHLines(parser));\n\n row = [];\n body.push(row);\n beginRow();\n } else {\n throw new ParseError(\"Expected & or \\\\\\\\ or \\\\cr or \" + endToken, parser.nextToken);\n }\n }\n\n // End cell group\n parser.gullet.endGroup();\n // End array group defining \\cr\n parser.gullet.endGroup();\n\n return {\n type: \"array\",\n mode: parser.mode,\n body,\n cols,\n rowGaps,\n hLinesBeforeRow,\n envClasses,\n autoTag,\n scriptLevel,\n tags,\n labels,\n leqno,\n arraystretch,\n arraycolsep\n };\n}\n\n// Decides on a scriptLevel for cells in an array according to whether the given\n// environment name starts with the letter 'd'.\nfunction dCellStyle(envName) {\n return envName.slice(0, 1) === \"d\" ? \"display\" : \"text\"\n}\n\nconst alignMap = {\n c: \"center \",\n l: \"left \",\n r: \"right \"\n};\n\nconst glue = group => {\n const glueNode = new mathMLTree.MathNode(\"mtd\", []);\n glueNode.style = { padding: \"0\", width: \"50%\" };\n if (group.envClasses.includes(\"multline\")) {\n glueNode.style.width = \"7.5%\";\n }\n return glueNode\n};\n\nconst mathmlBuilder$9 = function(group, style) {\n const tbl = [];\n const numRows = group.body.length;\n const hlines = group.hLinesBeforeRow;\n\n for (let i = 0; i < numRows; i++) {\n const rw = group.body[i];\n const row = [];\n const cellLevel = group.scriptLevel === \"text\"\n ? StyleLevel.TEXT\n : group.scriptLevel === \"script\"\n ? StyleLevel.SCRIPT\n : StyleLevel.DISPLAY;\n\n for (let j = 0; j < rw.length; j++) {\n const mtd = new mathMLTree.MathNode(\n \"mtd\",\n [buildGroup$1(rw[j], style.withLevel(cellLevel))]\n );\n\n if (group.envClasses.includes(\"multline\")) {\n const align = i === 0 ? \"left\" : i === numRows - 1 ? \"right\" : \"center\";\n mtd.setAttribute(\"columnalign\", align);\n if (align !== \"center\") {\n mtd.classes.push(\"tml-\" + align);\n }\n }\n row.push(mtd);\n }\n const numColumns = group.body[0].length;\n // Fill out a short row with empty <mtd> elements.\n for (let k = 0; k < numColumns - rw.length; k++) {\n row.push(new mathMLTree.MathNode(\"mtd\", [], style));\n }\n if (group.autoTag) {\n const tag = group.tags[i];\n let tagElement;\n if (tag === true) { // automatic numbering\n tagElement = new mathMLTree.MathNode(\"mtext\", [new Span([\"tml-eqn\"])]);\n } else if (tag === false) {\n // \\nonumber/\\notag or starred environment\n tagElement = new mathMLTree.MathNode(\"mtext\", [], []);\n } else { // manual \\tag\n tagElement = buildExpressionRow(tag[0].body, style.withLevel(cellLevel), true);\n tagElement = consolidateText(tagElement);\n tagElement.classes = [\"tml-tag\"];\n }\n if (tagElement) {\n row.unshift(glue(group));\n row.push(glue(group));\n if (group.leqno) {\n row[0].children.push(tagElement);\n row[0].classes.push(\"tml-left\");\n } else {\n row[row.length - 1].children.push(tagElement);\n row[row.length - 1].classes.push(\"tml-right\");\n }\n }\n }\n const mtr = new mathMLTree.MathNode(\"mtr\", row, []);\n const label = group.labels.shift();\n if (label && group.tags && group.tags[i]) {\n mtr.setAttribute(\"id\", label);\n if (Array.isArray(group.tags[i])) { mtr.classes.push(\"tml-tageqn\"); }\n }\n\n // Write horizontal rules\n if (i === 0 && hlines[0].length > 0) {\n if (hlines[0].length === 2) {\n mtr.children.forEach(cell => { cell.style.borderTop = \"0.15em double\"; });\n } else {\n mtr.children.forEach(cell => {\n cell.style.borderTop = hlines[0][0] ? \"0.06em dashed\" : \"0.06em solid\";\n });\n }\n }\n if (hlines[i + 1].length > 0) {\n if (hlines[i + 1].length === 2) {\n mtr.children.forEach(cell => { cell.style.borderBottom = \"0.15em double\"; });\n } else {\n mtr.children.forEach(cell => {\n cell.style.borderBottom = hlines[i + 1][0] ? \"0.06em dashed\" : \"0.06em solid\";\n });\n }\n }\n\n // Check for \\hphantom \\from \\bordermatrix\n let mustSquashRow = true;\n for (let j = 0; j < mtr.children.length; j++) {\n const child = mtr.children[j].children[0];\n if (!(child && child.type === \"mpadded\" && child.attributes.height === \"0px\")) {\n mustSquashRow = false;\n break\n }\n }\n if (mustSquashRow) {\n // All the cell contents are \\hphantom. Squash the padding.\n for (let j = 0; j < mtr.children.length; j++) {\n mtr.children[j].style.paddingTop = \"0\";\n mtr.children[j].style.paddingBottom = \"0\";\n }\n }\n\n tbl.push(mtr);\n }\n\n if (group.arraystretch && group.arraystretch !== 1) {\n // In LaTeX, \\arraystretch is a factor applied to a 12pt strut height.\n // It defines a baseline to baseline distance.\n // Here, we do an approximation of that approach.\n const pad = String(1.4 * group.arraystretch - 0.8) + \"ex\";\n for (let i = 0; i < tbl.length; i++) {\n for (let j = 0; j < tbl[i].children.length; j++) {\n tbl[i].children[j].style.paddingTop = pad;\n tbl[i].children[j].style.paddingBottom = pad;\n }\n }\n }\n\n let sidePadding;\n let sidePadUnit;\n if (group.envClasses.length > 0) {\n sidePadding = group.envClasses.includes(\"abut\")\n ? \"0\"\n : group.envClasses.includes(\"cases\")\n ? \"0\"\n : group.envClasses.includes(\"small\")\n ? \"0.1389\"\n : group.envClasses.includes(\"cd\")\n ? \"0.25\"\n : \"0.4\"; // default side padding\n sidePadUnit = \"em\";\n }\n if (group.arraycolsep) {\n const arraySidePad = calculateSize(group.arraycolsep, style);\n sidePadding = arraySidePad.number.toFixed(4);\n sidePadUnit = arraySidePad.unit;\n }\n if (sidePadding) {\n const numCols = tbl.length === 0 ? 0 : tbl[0].children.length;\n\n const sidePad = (j, hand) => {\n if (j === 0 && hand === 0) { return \"0\" }\n if (j === numCols - 1 && hand === 1) { return \"0\" }\n if (group.envClasses[0] !== \"align\") { return sidePadding }\n if (hand === 1) { return \"0\" }\n if (group.autoTag) {\n return (j % 2) ? \"1\" : \"0\"\n } else {\n return (j % 2) ? \"0\" : \"1\"\n }\n };\n\n // Side padding\n for (let i = 0; i < tbl.length; i++) {\n for (let j = 0; j < tbl[i].children.length; j++) {\n tbl[i].children[j].style.paddingLeft = `${sidePad(j, 0)}${sidePadUnit}`;\n tbl[i].children[j].style.paddingRight = `${sidePad(j, 1)}${sidePadUnit}`;\n }\n }\n }\n if (group.envClasses.length === 0) {\n // Set zero padding on side of the matrix\n for (let i = 0; i < tbl.length; i++) {\n tbl[i].children[0].style.paddingLeft = \"0em\";\n if (tbl[i].children.length === tbl[0].children.length) {\n tbl[i].children[tbl[i].children.length - 1].style.paddingRight = \"0em\";\n }\n }\n }\n\n if (group.envClasses.length > 0) {\n // Justification\n const align = group.envClasses.includes(\"align\") || group.envClasses.includes(\"alignat\");\n for (let i = 0; i < tbl.length; i++) {\n const row = tbl[i];\n if (align) {\n for (let j = 0; j < row.children.length; j++) {\n // Chromium does not recognize text-align: left. Use -webkit-\n // TODO: Remove -webkit- when Chromium no longer needs it.\n row.children[j].classes = [\"tml-\" + (j % 2 ? \"left\" : \"right\")];\n }\n if (group.autoTag) {\n const k = group.leqno ? 0 : row.children.length - 1;\n row.children[k].classes = [\"tml-\" + (group.leqno ? \"left\" : \"right\")];\n }\n }\n if (row.children.length > 1 && group.envClasses.includes(\"cases\")) {\n row.children[1].style.paddingLeft = \"1em\";\n }\n\n if (group.envClasses.includes(\"cases\") || group.envClasses.includes(\"subarray\")) {\n for (const cell of row.children) {\n cell.classes.push(\"tml-left\");\n }\n }\n }\n }\n\n let table = new mathMLTree.MathNode(\"mtable\", tbl);\n if (group.envClasses.length > 0) {\n // Top & bottom padding\n if (group.envClasses.includes(\"jot\")) {\n table.classes.push(\"tml-jot\");\n } else if (group.envClasses.includes(\"small\")) {\n table.classes.push(\"tml-small\");\n }\n }\n if (group.scriptLevel === \"display\") { table.setAttribute(\"displaystyle\", \"true\"); }\n\n if (group.autoTag || group.envClasses.includes(\"multline\")) {\n table.style.width = \"100%\";\n }\n\n // Column separator lines and column alignment\n let align = \"\";\n\n if (group.cols && group.cols.length > 0) {\n const cols = group.cols;\n let prevTypeWasAlign = false;\n let iStart = 0;\n let iEnd = cols.length;\n\n while (cols[iStart].type === \"separator\") {\n iStart += 1;\n }\n while (cols[iEnd - 1].type === \"separator\") {\n iEnd -= 1;\n }\n\n if (cols[0].type === \"separator\") {\n const sep = cols[1].type === \"separator\"\n ? \"0.15em double\"\n : cols[0].separator === \"|\"\n ? \"0.06em solid \"\n : \"0.06em dashed \";\n for (const row of table.children) {\n row.children[0].style.borderLeft = sep;\n }\n }\n let iCol = group.autoTag ? 0 : -1;\n for (let i = iStart; i < iEnd; i++) {\n if (cols[i].type === \"align\") {\n const colAlign = alignMap[cols[i].align];\n align += colAlign;\n iCol += 1;\n for (const row of table.children) {\n if (colAlign.trim() !== \"center\" && iCol < row.children.length) {\n row.children[iCol].classes = [\"tml-\" + colAlign.trim()];\n }\n }\n prevTypeWasAlign = true;\n } else if (cols[i].type === \"separator\") {\n // MathML accepts only single lines between cells.\n // So we read only the first of consecutive separators.\n if (prevTypeWasAlign) {\n const sep = cols[i + 1].type === \"separator\"\n ? \"0.15em double\"\n : cols[i].separator === \"|\"\n ? \"0.06em solid\"\n : \"0.06em dashed\";\n for (const row of table.children) {\n if (iCol < row.children.length) {\n row.children[iCol].style.borderRight = sep;\n }\n }\n }\n prevTypeWasAlign = false;\n }\n }\n if (cols[cols.length - 1].type === \"separator\") {\n const sep = cols[cols.length - 2].type === \"separator\"\n ? \"0.15em double\"\n : cols[cols.length - 1].separator === \"|\"\n ? \"0.06em solid\"\n : \"0.06em dashed\";\n for (const row of table.children) {\n row.children[row.children.length - 1].style.borderRight = sep;\n row.children[row.children.length - 1].style.paddingRight = \"0.4em\";\n }\n }\n }\n if (group.autoTag) {\n // allow for glue cells on each side\n align = \"left \" + (align.length > 0 ? align : \"center \") + \"right \";\n }\n if (align) {\n // Firefox reads this attribute, not the -webkit-left|right written above.\n // TODO: When Chrome no longer needs \"-webkit-\", use CSS and delete the next line.\n table.setAttribute(\"columnalign\", align.trim());\n }\n\n if (group.envClasses.includes(\"small\")) {\n // A small array. Wrap in scriptstyle.\n table = new mathMLTree.MathNode(\"mstyle\", [table]);\n table.setAttribute(\"scriptlevel\", \"1\");\n }\n\n return table\n};\n\n// Convenience function for align, align*, aligned, alignat, alignat*, alignedat, split.\nconst alignedHandler = function(context, args) {\n if (context.envName.indexOf(\"ed\") === -1) {\n validateAmsEnvironmentContext(context);\n }\n const isSplit = context.envName === \"split\";\n const cols = [];\n const res = parseArray(\n context.parser,\n {\n cols,\n emptySingleRow: true,\n autoTag: isSplit ? undefined : getAutoTag(context.envName),\n envClasses: [\"abut\", \"jot\"], // set row spacing & provisional column spacing\n maxNumCols: context.envName === \"split\" ? 2 : undefined,\n leqno: context.parser.settings.leqno\n },\n \"display\"\n );\n\n // Determining number of columns.\n // 1. If the first argument is given, we use it as a number of columns,\n // and makes sure that each row doesn't exceed that number.\n // 2. Otherwise, just count number of columns = maximum number\n // of cells in each row (\"aligned\" mode -- isAligned will be true).\n //\n // At the same time, prepend empty group {} at beginning of every second\n // cell in each row (starting with second cell) so that operators become\n // binary. This behavior is implemented in amsmath's \\start@aligned.\n let numMaths;\n let numCols = 0;\n const isAlignedAt = context.envName.indexOf(\"at\") > -1;\n if (args[0] && isAlignedAt) {\n // alignat environment takes an argument w/ number of columns\n let arg0 = \"\";\n for (let i = 0; i < args[0].body.length; i++) {\n const textord = assertNodeType(args[0].body[i], \"textord\");\n arg0 += textord.text;\n }\n if (isNaN(arg0)) {\n throw new ParseError(\"The alignat enviroment requires a numeric first argument.\")\n }\n numMaths = Number(arg0);\n numCols = numMaths * 2;\n }\n res.body.forEach(function(row) {\n if (isAlignedAt) {\n // Case 1\n const curMaths = row.length / 2;\n if (numMaths < curMaths) {\n throw new ParseError(\n \"Too many math in a row: \" + `expected ${numMaths}, but got ${curMaths}`,\n row[0]\n );\n }\n } else if (numCols < row.length) {\n // Case 2\n numCols = row.length;\n }\n });\n\n // Adjusting alignment.\n // In aligned mode, we add one \\qquad between columns;\n // otherwise we add nothing.\n for (let i = 0; i < numCols; ++i) {\n let align = \"r\";\n if (i % 2 === 1) {\n align = \"l\";\n }\n cols[i] = {\n type: \"align\",\n align: align\n };\n }\n if (context.envName === \"split\") ; else if (isAlignedAt) {\n res.envClasses.push(\"alignat\"); // Sets justification\n } else {\n res.envClasses[0] = \"align\"; // Sets column spacing & justification\n }\n return res;\n};\n\n// Arrays are part of LaTeX, defined in lttab.dtx so its documentation\n// is part of the source2e.pdf file of LaTeX2e source documentation.\n// {darray} is an {array} environment where cells are set in \\displaystyle,\n// as defined in nccmath.sty.\ndefineEnvironment({\n type: \"array\",\n names: [\"array\", \"darray\"],\n props: {\n numArgs: 1\n },\n handler(context, args) {\n // Since no types are specified above, the two possibilities are\n // - The argument is wrapped in {} or [], in which case Parser's\n // parseGroup() returns an \"ordgroup\" wrapping some symbol node.\n // - The argument is a bare symbol node.\n const symNode = checkSymbolNodeType(args[0]);\n const colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n const cols = colalign.map(function(nde) {\n const node = assertSymbolNodeType(nde);\n const ca = node.text;\n if (\"lcr\".indexOf(ca) !== -1) {\n return {\n type: \"align\",\n align: ca\n };\n } else if (ca === \"|\") {\n return {\n type: \"separator\",\n separator: \"|\"\n };\n } else if (ca === \":\") {\n return {\n type: \"separator\",\n separator: \":\"\n };\n }\n throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n });\n const [arraystretch, arraycolsep] = arrayGaps(context.parser.gullet.macros);\n const res = {\n cols,\n envClasses: [\"array\"],\n maxNumCols: cols.length,\n arraystretch,\n arraycolsep\n };\n return parseArray(context.parser, res, dCellStyle(context.envName));\n },\n mathmlBuilder: mathmlBuilder$9\n});\n\n// The matrix environments of amsmath build on the array environment\n// of LaTeX, which is discussed above.\n// The mathtools package adds starred versions of the same environments.\n// These have an optional argument to choose left|center|right justification.\ndefineEnvironment({\n type: \"array\",\n names: [\n \"matrix\",\n \"pmatrix\",\n \"bmatrix\",\n \"Bmatrix\",\n \"vmatrix\",\n \"Vmatrix\",\n \"matrix*\",\n \"pmatrix*\",\n \"bmatrix*\",\n \"Bmatrix*\",\n \"vmatrix*\",\n \"Vmatrix*\"\n ],\n props: {\n numArgs: 0\n },\n handler(context) {\n const delimiters = {\n matrix: null,\n pmatrix: [\"(\", \")\"],\n bmatrix: [\"[\", \"]\"],\n Bmatrix: [\"\\\\{\", \"\\\\}\"],\n vmatrix: [\"|\", \"|\"],\n Vmatrix: [\"\\\\Vert\", \"\\\\Vert\"]\n }[context.envName.replace(\"*\", \"\")];\n // \\hskip -\\arraycolsep in amsmath\n let colAlign = \"c\";\n const payload = {\n envClasses: [],\n cols: []\n };\n if (context.envName.charAt(context.envName.length - 1) === \"*\") {\n // It's one of the mathtools starred functions.\n // Parse the optional alignment argument.\n const parser = context.parser;\n parser.consumeSpaces();\n if (parser.fetch().text === \"[\") {\n parser.consume();\n parser.consumeSpaces();\n colAlign = parser.fetch().text;\n if (\"lcr\".indexOf(colAlign) === -1) {\n throw new ParseError(\"Expected l or c or r\", parser.nextToken);\n }\n parser.consume();\n parser.consumeSpaces();\n parser.expect(\"]\");\n parser.consume();\n payload.cols = [];\n }\n }\n const res = parseArray(context.parser, payload, \"text\");\n res.cols = new Array(res.body[0].length).fill({ type: \"align\", align: colAlign });\n const [arraystretch, arraycolsep] = arrayGaps(context.parser.gullet.macros);\n res.arraystretch = arraystretch;\n if (arraycolsep && !(arraycolsep === 6 && arraycolsep === \"pt\")) {\n res.arraycolsep = arraycolsep;\n }\n return delimiters\n ? {\n type: \"leftright\",\n mode: context.mode,\n body: [res],\n left: delimiters[0],\n right: delimiters[1],\n rightColor: undefined // \\right uninfluenced by \\color in array\n }\n : res;\n },\n mathmlBuilder: mathmlBuilder$9\n});\n\ndefineEnvironment({\n type: \"array\",\n names: [\"bordermatrix\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n const payload = { cols: [], envClasses: [\"bordermatrix\"] };\n const res = parseArray(context.parser, payload, \"text\");\n res.cols = new Array(res.body[0].length).fill({ type: \"align\", align: \"c\" });\n res.envClasses = [];\n res.arraystretch = 1;\n if (context.envName === \"matrix\") { return res}\n return bordermatrixParseTree(res, context.delimiters)\n },\n mathmlBuilder: mathmlBuilder$9\n});\n\ndefineEnvironment({\n type: \"array\",\n names: [\"smallmatrix\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n const payload = { type: \"small\" };\n const res = parseArray(context.parser, payload, \"script\");\n res.envClasses = [\"small\"];\n return res;\n },\n mathmlBuilder: mathmlBuilder$9\n});\n\ndefineEnvironment({\n type: \"array\",\n names: [\"subarray\"],\n props: {\n numArgs: 1\n },\n handler(context, args) {\n // Parsing of {subarray} is similar to {array}\n const symNode = checkSymbolNodeType(args[0]);\n const colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n const cols = colalign.map(function(nde) {\n const node = assertSymbolNodeType(nde);\n const ca = node.text;\n // {subarray} only recognizes \"l\" & \"c\"\n if (\"lc\".indexOf(ca) !== -1) {\n return {\n type: \"align\",\n align: ca\n };\n }\n throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n });\n if (cols.length > 1) {\n throw new ParseError(\"{subarray} can contain only one column\");\n }\n let res = {\n cols,\n envClasses: [\"small\"]\n };\n res = parseArray(context.parser, res, \"script\");\n if (res.body.length > 0 && res.body[0].length > 1) {\n throw new ParseError(\"{subarray} can contain only one column\");\n }\n return res;\n },\n mathmlBuilder: mathmlBuilder$9\n});\n\n// A cases environment (in amsmath.sty) is almost equivalent to\n// \\def\n// \\left\\{\\begin{array}{@{}l@{\\quad}l@{}} … \\end{array}\\right.\n// {dcases} is a {cases} environment where cells are set in \\displaystyle,\n// as defined in mathtools.sty.\n// {rcases} is another mathtools environment. It's brace is on the right side.\ndefineEnvironment({\n type: \"array\",\n names: [\"cases\", \"dcases\", \"rcases\", \"drcases\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n const payload = {\n cols: [],\n envClasses: [\"cases\"]\n };\n const res = parseArray(context.parser, payload, dCellStyle(context.envName));\n return {\n type: \"leftright\",\n mode: context.mode,\n body: [res],\n left: context.envName.indexOf(\"r\") > -1 ? \".\" : \"\\\\{\",\n right: context.envName.indexOf(\"r\") > -1 ? \"\\\\}\" : \".\",\n rightColor: undefined\n };\n },\n mathmlBuilder: mathmlBuilder$9\n});\n\n// In the align environment, one uses ampersands, &, to specify number of\n// columns in each row, and to locate spacing between each column.\n// align gets automatic numbering. align* and aligned do not.\n// The alignedat environment can be used in math mode.\ndefineEnvironment({\n type: \"array\",\n names: [\"align\", \"align*\", \"aligned\", \"split\"],\n props: {\n numArgs: 0\n },\n handler: alignedHandler,\n mathmlBuilder: mathmlBuilder$9\n});\n\n// alignat environment is like an align environment, but one must explicitly\n// specify maximum number of columns in each row, and can adjust where spacing occurs.\ndefineEnvironment({\n type: \"array\",\n names: [\"alignat\", \"alignat*\", \"alignedat\"],\n props: {\n numArgs: 1\n },\n handler: alignedHandler,\n mathmlBuilder: mathmlBuilder$9\n});\n\n// A gathered environment is like an array environment with one centered\n// column, but where rows are considered lines so get \\jot line spacing\n// and contents are set in \\displaystyle.\ndefineEnvironment({\n type: \"array\",\n names: [\"gathered\", \"gather\", \"gather*\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n if (context.envName !== \"gathered\") {\n validateAmsEnvironmentContext(context);\n }\n const res = {\n cols: [],\n envClasses: [\"abut\", \"jot\"],\n autoTag: getAutoTag(context.envName),\n emptySingleRow: true,\n leqno: context.parser.settings.leqno\n };\n return parseArray(context.parser, res, \"display\");\n },\n mathmlBuilder: mathmlBuilder$9\n});\n\ndefineEnvironment({\n type: \"array\",\n names: [\"equation\", \"equation*\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n validateAmsEnvironmentContext(context);\n const res = {\n autoTag: getAutoTag(context.envName),\n emptySingleRow: true,\n singleRow: true,\n maxNumCols: 1,\n envClasses: [\"align\"],\n leqno: context.parser.settings.leqno\n };\n return parseArray(context.parser, res, \"display\");\n },\n mathmlBuilder: mathmlBuilder$9\n});\n\ndefineEnvironment({\n type: \"array\",\n names: [\"multline\", \"multline*\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n validateAmsEnvironmentContext(context);\n const res = {\n autoTag: context.envName === \"multline\",\n maxNumCols: 1,\n envClasses: [\"jot\", \"multline\"],\n leqno: context.parser.settings.leqno\n };\n return parseArray(context.parser, res, \"display\");\n },\n mathmlBuilder: mathmlBuilder$9\n});\n\ndefineEnvironment({\n type: \"array\",\n names: [\"CD\"],\n props: {\n numArgs: 0\n },\n handler(context) {\n validateAmsEnvironmentContext(context);\n return parseCD(context.parser);\n },\n mathmlBuilder: mathmlBuilder$9\n});\n\n// Catch \\hline outside array environment\ndefineFunction({\n type: \"text\", // Doesn't matter what this is.\n names: [\"\\\\hline\", \"\\\\hdashline\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n allowedInMath: true\n },\n handler(context, args) {\n throw new ParseError(`${context.funcName} valid only within array environment`);\n }\n});\n\nconst environments = _environments;\n\n// \\bordermatrix from TeXbook pp 177 & 361\n// Optional argument from Herbert Voß, Math mode, p 20\n// Ref: https://tug.ctan.org/obsolete/info/math/voss/mathmode/Mathmode.pdf\n\ndefineFunction({\n type: \"bordermatrix\",\n names: [\"\\\\bordermatrix\", \"\\\\matrix\"],\n props: {\n numArgs: 0,\n numOptionalArgs: 1\n },\n handler: ({ parser, funcName }, args, optArgs) => {\n // Find out if the author has defined custom delimiters\n let delimiters = [\"(\", \")\"];\n if (funcName === \"\\\\bordermatrix\" && optArgs[0] && optArgs[0].body) {\n const body = optArgs[0].body;\n if (body.length === 2 && body[0].type === \"atom\" && body[1].type === \"atom\") {\n if (body[0].family === \"open\" && body[1].family === \"close\") {\n delimiters = [body[0].text, body[1].text];\n }\n }\n }\n // consume the opening brace\n parser.consumeSpaces();\n parser.consume();\n\n // Pass control to the environment handler in array.js.\n const env = environments[\"bordermatrix\"];\n const context = {\n mode: parser.mode,\n envName: funcName.slice(1),\n delimiters,\n parser\n };\n const result = env.handler(context);\n parser.expect(\"}\", true);\n return result\n }\n});\n\n// \\@char is an internal function that takes a grouped decimal argument like\n// {123} and converts into symbol with code 123. It is used by the *macro*\n// \\char defined in macros.js.\ndefineFunction({\n type: \"textord\",\n names: [\"\\\\@char\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler({ parser, token }, args) {\n const arg = assertNodeType(args[0], \"ordgroup\");\n const group = arg.body;\n let number = \"\";\n for (let i = 0; i < group.length; i++) {\n const node = assertNodeType(group[i], \"textord\");\n number += node.text;\n }\n const code = parseInt(number);\n if (isNaN(code)) {\n throw new ParseError(`\\\\@char has non-numeric argument ${number}`, token)\n }\n return {\n type: \"textord\",\n mode: parser.mode,\n text: String.fromCodePoint(code)\n }\n }\n});\n\n// Helpers\nconst htmlRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6})$/i;\nconst htmlOrNameRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i;\nconst RGBregEx = /^ *\\d{1,3} *(?:, *\\d{1,3} *){2}$/;\nconst rgbRegEx = /^ *[10](?:\\.\\d*)? *(?:, *[10](?:\\.\\d*)? *){2}$/;\nconst xcolorHtmlRegEx = /^[a-f0-9]{6}$/i;\nconst toHex = num => {\n let str = num.toString(16);\n if (str.length === 1) { str = \"0\" + str; }\n return str\n};\n\n// Colors from Tables 4.1 and 4.2 of the xcolor package.\n// Table 4.1 (lower case) RGB values are taken from chroma and xcolor.dtx.\n// Table 4.2 (Capitalizzed) values were sampled, because Chroma contains a unreliable\n// conversion from cmyk to RGB. See https://tex.stackexchange.com/a/537274.\nconst xcolors = JSON.parse(`{\n \"Apricot\": \"#ffb484\",\n \"Aquamarine\": \"#08b4bc\",\n \"Bittersweet\": \"#c84c14\",\n \"blue\": \"#0000FF\",\n \"Blue\": \"#303494\",\n \"BlueGreen\": \"#08b4bc\",\n \"BlueViolet\": \"#503c94\",\n \"BrickRed\": \"#b8341c\",\n \"brown\": \"#BF8040\",\n \"Brown\": \"#802404\",\n \"BurntOrange\": \"#f8941c\",\n \"CadetBlue\": \"#78749c\",\n \"CarnationPink\": \"#f884b4\",\n \"Cerulean\": \"#08a4e4\",\n \"CornflowerBlue\": \"#40ace4\",\n \"cyan\": \"#00FFFF\",\n \"Cyan\": \"#08acec\",\n \"Dandelion\": \"#ffbc44\",\n \"darkgray\": \"#404040\",\n \"DarkOrchid\": \"#a8548c\",\n \"Emerald\": \"#08ac9c\",\n \"ForestGreen\": \"#089c54\",\n \"Fuchsia\": \"#90348c\",\n \"Goldenrod\": \"#ffdc44\",\n \"gray\": \"#808080\",\n \"Gray\": \"#98949c\",\n \"green\": \"#00FF00\",\n \"Green\": \"#08a44c\",\n \"GreenYellow\": \"#e0e474\",\n \"JungleGreen\": \"#08ac9c\",\n \"Lavender\": \"#f89cc4\",\n \"lightgray\": \"#c0c0c0\",\n \"lime\": \"#BFFF00\",\n \"LimeGreen\": \"#90c43c\",\n \"magenta\": \"#FF00FF\",\n \"Magenta\": \"#f0048c\",\n \"Mahogany\": \"#b0341c\",\n \"Maroon\": \"#b03434\",\n \"Melon\": \"#f89c7c\",\n \"MidnightBlue\": \"#086494\",\n \"Mulberry\": \"#b03c94\",\n \"NavyBlue\": \"#086cbc\",\n \"olive\": \"#7F7F00\",\n \"OliveGreen\": \"#407c34\",\n \"orange\": \"#FF8000\",\n \"Orange\": \"#f8843c\",\n \"OrangeRed\": \"#f0145c\",\n \"Orchid\": \"#b074ac\",\n \"Peach\": \"#f8945c\",\n \"Periwinkle\": \"#8074bc\",\n \"PineGreen\": \"#088c74\",\n \"pink\": \"#ff7f7f\",\n \"Plum\": \"#98248c\",\n \"ProcessBlue\": \"#08b4ec\",\n \"purple\": \"#BF0040\",\n \"Purple\": \"#a0449c\",\n \"RawSienna\": \"#983c04\",\n \"red\": \"#ff0000\",\n \"Red\": \"#f01c24\",\n \"RedOrange\": \"#f86434\",\n \"RedViolet\": \"#a0246c\",\n \"Rhodamine\": \"#f0549c\",\n \"Royallue\": \"#0874bc\",\n \"RoyalPurple\": \"#683c9c\",\n \"RubineRed\": \"#f0047c\",\n \"Salmon\": \"#f8948c\",\n \"SeaGreen\": \"#30bc9c\",\n \"Sepia\": \"#701404\",\n \"SkyBlue\": \"#48c4dc\",\n \"SpringGreen\": \"#c8dc64\",\n \"Tan\": \"#e09c74\",\n \"teal\": \"#007F7F\",\n \"TealBlue\": \"#08acb4\",\n \"Thistle\": \"#d884b4\",\n \"Turquoise\": \"#08b4cc\",\n \"violet\": \"#800080\",\n \"Violet\": \"#60449c\",\n \"VioletRed\": \"#f054a4\",\n \"WildStrawberry\": \"#f0246c\",\n \"yellow\": \"#FFFF00\",\n \"Yellow\": \"#fff404\",\n \"YellowGreen\": \"#98cc6c\",\n \"YellowOrange\": \"#ffa41c\"\n}`);\n\nconst colorFromSpec = (model, spec) => {\n let color = \"\";\n if (model === \"HTML\") {\n if (!htmlRegEx.test(spec)) {\n throw new ParseError(\"Invalid HTML input.\")\n }\n color = spec;\n } else if (model === \"RGB\") {\n if (!RGBregEx.test(spec)) {\n throw new ParseError(\"Invalid RGB input.\")\n }\n spec.split(\",\").map(e => { color += toHex(Number(e.trim())); });\n } else {\n if (!rgbRegEx.test(spec)) {\n throw new ParseError(\"Invalid rbg input.\")\n }\n spec.split(\",\").map(e => {\n const num = Number(e.trim());\n if (num > 1) { throw new ParseError(\"Color rgb input must be < 1.\") }\n color += toHex(Number((num * 255).toFixed(0)));\n });\n }\n if (color.charAt(0) !== \"#\") { color = \"#\" + color; }\n return color\n};\n\nconst validateColor = (color, macros, token) => {\n const macroName = `\\\\\\\\color@${color}`; // from \\defineColor.\n const match = htmlOrNameRegEx.exec(color);\n if (!match) { throw new ParseError(\"Invalid color: '\" + color + \"'\", token) }\n // We allow a 6-digit HTML color spec without a leading \"#\".\n // This follows the xcolor package's HTML color model.\n // Predefined color names are all missed by this RegEx pattern.\n if (xcolorHtmlRegEx.test(color)) {\n return \"#\" + color\n } else if (color.charAt(0) === \"#\") {\n return color\n } else if (macros.has(macroName)) {\n color = macros.get(macroName).tokens[0].text;\n } else if (xcolors[color]) {\n color = xcolors[color];\n }\n return color\n};\n\nconst mathmlBuilder$8 = (group, style) => {\n // In LaTeX, color is not supposed to change the spacing of any node.\n // So instead of wrapping the group in an <mstyle>, we apply\n // the color individually to each node and return a document fragment.\n let expr = buildExpression(group.body, style.withColor(group.color));\n expr = expr.map(e => {\n e.style.color = group.color;\n return e\n });\n return mathMLTree.newDocumentFragment(expr)\n};\n\ndefineFunction({\n type: \"color\",\n names: [\"\\\\textcolor\"],\n props: {\n numArgs: 2,\n numOptionalArgs: 1,\n allowedInText: true,\n argTypes: [\"raw\", \"raw\", \"original\"]\n },\n handler({ parser, token }, args, optArgs) {\n const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n let color = \"\";\n if (model) {\n const spec = assertNodeType(args[0], \"raw\").string;\n color = colorFromSpec(model, spec);\n } else {\n color = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros, token);\n }\n const body = args[1];\n return {\n type: \"color\",\n mode: parser.mode,\n color,\n isTextColor: true,\n body: ordargument(body)\n }\n },\n mathmlBuilder: mathmlBuilder$8\n});\n\ndefineFunction({\n type: \"color\",\n names: [\"\\\\color\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1,\n allowedInText: true,\n argTypes: [\"raw\", \"raw\"]\n },\n handler({ parser, breakOnTokenText, token }, args, optArgs) {\n const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n let color = \"\";\n if (model) {\n const spec = assertNodeType(args[0], \"raw\").string;\n color = colorFromSpec(model, spec);\n } else {\n color = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros, token);\n }\n\n // Parse out the implicit body that should be colored.\n const body = parser.parseExpression(true, breakOnTokenText, true);\n\n return {\n type: \"color\",\n mode: parser.mode,\n color,\n isTextColor: false,\n body\n }\n },\n mathmlBuilder: mathmlBuilder$8\n});\n\ndefineFunction({\n type: \"color\",\n names: [\"\\\\definecolor\"],\n props: {\n numArgs: 3,\n allowedInText: true,\n argTypes: [\"raw\", \"raw\", \"raw\"]\n },\n handler({ parser, funcName, token }, args) {\n const name = assertNodeType(args[0], \"raw\").string;\n if (!/^[A-Za-z]+$/.test(name)) {\n throw new ParseError(\"Color name must be latin letters.\", token)\n }\n const model = assertNodeType(args[1], \"raw\").string;\n if (![\"HTML\", \"RGB\", \"rgb\"].includes(model)) {\n throw new ParseError(\"Color model must be HTML, RGB, or rgb.\", token)\n }\n const spec = assertNodeType(args[2], \"raw\").string;\n const color = colorFromSpec(model, spec);\n parser.gullet.macros.set(`\\\\\\\\color@${name}`, { tokens: [{ text: color }], numArgs: 0 });\n return { type: \"internal\", mode: parser.mode }\n }\n // No mathmlBuilder. The point of \\definecolor is to set a macro.\n});\n\n// Row breaks within tabular environments, and line breaks at top level\n\n\n// \\DeclareRobustCommand\\\\{...\\@xnewline}\ndefineFunction({\n type: \"cr\",\n names: [\"\\\\\\\\\"],\n props: {\n numArgs: 0,\n numOptionalArgs: 0,\n allowedInText: true\n },\n\n handler({ parser }, args, optArgs) {\n const size = parser.gullet.future().text === \"[\" ? parser.parseSizeGroup(true) : null;\n const newLine = !parser.settings.displayMode;\n return {\n type: \"cr\",\n mode: parser.mode,\n newLine,\n size: size && assertNodeType(size, \"size\").value\n }\n },\n\n // The following builder is called only at the top level,\n // not within tabular/array environments.\n\n mathmlBuilder(group, style) {\n // MathML 3.0 calls for newline to occur in an <mo> or an <mspace>.\n // Ref: https://www.w3.org/TR/MathML3/chapter3.html#presm.linebreaking\n const node = new mathMLTree.MathNode(\"mo\");\n if (group.newLine) {\n node.setAttribute(\"linebreak\", \"newline\");\n if (group.size) {\n const size = calculateSize(group.size, style);\n node.setAttribute(\"height\", size.number + size.unit);\n }\n }\n return node\n }\n});\n\nconst globalMap = {\n \"\\\\global\": \"\\\\global\",\n \"\\\\long\": \"\\\\\\\\globallong\",\n \"\\\\\\\\globallong\": \"\\\\\\\\globallong\",\n \"\\\\def\": \"\\\\gdef\",\n \"\\\\gdef\": \"\\\\gdef\",\n \"\\\\edef\": \"\\\\xdef\",\n \"\\\\xdef\": \"\\\\xdef\",\n \"\\\\let\": \"\\\\\\\\globallet\",\n \"\\\\futurelet\": \"\\\\\\\\globalfuture\"\n};\n\nconst checkControlSequence = (tok) => {\n const name = tok.text;\n if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n throw new ParseError(\"Expected a control sequence\", tok);\n }\n return name;\n};\n\nconst getRHS = (parser) => {\n let tok = parser.gullet.popToken();\n if (tok.text === \"=\") {\n // consume optional equals\n tok = parser.gullet.popToken();\n if (tok.text === \" \") {\n // consume one optional space\n tok = parser.gullet.popToken();\n }\n }\n return tok;\n};\n\nconst letCommand = (parser, name, tok, global) => {\n let macro = parser.gullet.macros.get(tok.text);\n if (macro == null) {\n // don't expand it later even if a macro with the same name is defined\n // e.g., \\let\\foo=\\frac \\def\\frac{\\relax} \\frac12\n tok.noexpand = true;\n macro = {\n tokens: [tok],\n numArgs: 0,\n // reproduce the same behavior in expansion\n unexpandable: !parser.gullet.isExpandable(tok.text)\n };\n }\n parser.gullet.macros.set(name, macro, global);\n};\n\n// <assignment> -> <non-macro assignment>|<macro assignment>\n// <non-macro assignment> -> <simple assignment>|\\global<non-macro assignment>\n// <macro assignment> -> <definition>|<prefix><macro assignment>\n// <prefix> -> \\global|\\long|\\outer\ndefineFunction({\n type: \"internal\",\n names: [\n \"\\\\global\",\n \"\\\\long\",\n \"\\\\\\\\globallong\" // can’t be entered directly\n ],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler({ parser, funcName }) {\n parser.consumeSpaces();\n const token = parser.fetch();\n if (globalMap[token.text]) {\n // Temml doesn't have \\par, so ignore \\long\n if (funcName === \"\\\\global\" || funcName === \"\\\\\\\\globallong\") {\n token.text = globalMap[token.text];\n }\n return assertNodeType(parser.parseFunction(), \"internal\");\n }\n throw new ParseError(`Invalid token after macro prefix`, token);\n }\n});\n\n// Basic support for macro definitions: \\def, \\gdef, \\edef, \\xdef\n// <definition> -> <def><control sequence><definition text>\n// <def> -> \\def|\\gdef|\\edef|\\xdef\n// <definition text> -> <parameter text><left brace><balanced text><right brace>\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\def\", \"\\\\gdef\", \"\\\\edef\", \"\\\\xdef\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler({ parser, funcName }) {\n let tok = parser.gullet.popToken();\n const name = tok.text;\n if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n throw new ParseError(\"Expected a control sequence\", tok);\n }\n\n let numArgs = 0;\n let insert;\n const delimiters = [[]];\n // <parameter text> contains no braces\n while (parser.gullet.future().text !== \"{\") {\n tok = parser.gullet.popToken();\n if (tok.text === \"#\") {\n // If the very last character of the <parameter text> is #, so that\n // this # is immediately followed by {, TeX will behave as if the {\n // had been inserted at the right end of both the parameter text\n // and the replacement text.\n if (parser.gullet.future().text === \"{\") {\n insert = parser.gullet.future();\n delimiters[numArgs].push(\"{\");\n break;\n }\n\n // A parameter, the first appearance of # must be followed by 1,\n // the next by 2, and so on; up to nine #’s are allowed\n tok = parser.gullet.popToken();\n if (!/^[1-9]$/.test(tok.text)) {\n throw new ParseError(`Invalid argument number \"${tok.text}\"`);\n }\n if (parseInt(tok.text) !== numArgs + 1) {\n throw new ParseError(`Argument number \"${tok.text}\" out of order`);\n }\n numArgs++;\n delimiters.push([]);\n } else if (tok.text === \"EOF\") {\n throw new ParseError(\"Expected a macro definition\");\n } else {\n delimiters[numArgs].push(tok.text);\n }\n }\n // replacement text, enclosed in '{' and '}' and properly nested\n let { tokens } = parser.gullet.consumeArg();\n if (insert) {\n tokens.unshift(insert);\n }\n\n if (funcName === \"\\\\edef\" || funcName === \"\\\\xdef\") {\n tokens = parser.gullet.expandTokens(tokens);\n if (tokens.length > parser.gullet.settings.maxExpand) {\n throw new ParseError(\"Too many expansions in an \" + funcName);\n }\n tokens.reverse(); // to fit in with stack order\n }\n // Final arg is the expansion of the macro\n parser.gullet.macros.set(\n name,\n { tokens, numArgs, delimiters },\n funcName === globalMap[funcName]\n );\n return { type: \"internal\", mode: parser.mode };\n }\n});\n\n// <simple assignment> -> <let assignment>\n// <let assignment> -> \\futurelet<control sequence><token><token>\n// | \\let<control sequence><equals><one optional space><token>\n// <equals> -> <optional spaces>|<optional spaces>=\ndefineFunction({\n type: \"internal\",\n names: [\n \"\\\\let\",\n \"\\\\\\\\globallet\" // can’t be entered directly\n ],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler({ parser, funcName }) {\n const name = checkControlSequence(parser.gullet.popToken());\n parser.gullet.consumeSpaces();\n const tok = getRHS(parser);\n letCommand(parser, name, tok, funcName === \"\\\\\\\\globallet\");\n return { type: \"internal\", mode: parser.mode };\n }\n});\n\n// ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf\ndefineFunction({\n type: \"internal\",\n names: [\n \"\\\\futurelet\",\n \"\\\\\\\\globalfuture\" // can’t be entered directly\n ],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler({ parser, funcName }) {\n const name = checkControlSequence(parser.gullet.popToken());\n const middle = parser.gullet.popToken();\n const tok = parser.gullet.popToken();\n letCommand(parser, name, tok, funcName === \"\\\\\\\\globalfuture\");\n parser.gullet.pushToken(tok);\n parser.gullet.pushToken(middle);\n return { type: \"internal\", mode: parser.mode };\n }\n});\n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\newcommand\", \"\\\\renewcommand\", \"\\\\providecommand\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler({ parser, funcName }) {\n let name = \"\";\n const tok = parser.gullet.popToken();\n if (tok.text === \"{\") {\n name = checkControlSequence(parser.gullet.popToken());\n parser.gullet.popToken();\n } else {\n name = checkControlSequence(tok);\n }\n\n const exists = parser.gullet.isDefined(name);\n if (exists && funcName === \"\\\\newcommand\") {\n throw new ParseError(\n `\\\\newcommand{${name}} attempting to redefine ${name}; use \\\\renewcommand`\n );\n }\n if (!exists && funcName === \"\\\\renewcommand\") {\n throw new ParseError(\n `\\\\renewcommand{${name}} when command ${name} does not yet exist; use \\\\newcommand`\n );\n }\n\n let numArgs = 0;\n if (parser.gullet.future().text === \"[\") {\n let tok = parser.gullet.popToken();\n tok = parser.gullet.popToken();\n if (!/^[0-9]$/.test(tok.text)) {\n throw new ParseError(`Invalid number of arguments: \"${tok.text}\"`);\n }\n numArgs = parseInt(tok.text);\n tok = parser.gullet.popToken();\n if (tok.text !== \"]\") {\n throw new ParseError(`Invalid argument \"${tok.text}\"`);\n }\n }\n\n // replacement text, enclosed in '{' and '}' and properly nested\n const { tokens } = parser.gullet.consumeArg();\n\n if (!(funcName === \"\\\\providecommand\" && parser.gullet.macros.has(name))) {\n // Ignore \\providecommand\n parser.gullet.macros.set(\n name,\n { tokens, numArgs }\n );\n }\n\n return { type: \"internal\", mode: parser.mode };\n\n }\n});\n\n// Extra data needed for the delimiter handler down below\nconst delimiterSizes = {\n \"\\\\bigl\": { mclass: \"mopen\", size: 1 },\n \"\\\\Bigl\": { mclass: \"mopen\", size: 2 },\n \"\\\\biggl\": { mclass: \"mopen\", size: 3 },\n \"\\\\Biggl\": { mclass: \"mopen\", size: 4 },\n \"\\\\bigr\": { mclass: \"mclose\", size: 1 },\n \"\\\\Bigr\": { mclass: \"mclose\", size: 2 },\n \"\\\\biggr\": { mclass: \"mclose\", size: 3 },\n \"\\\\Biggr\": { mclass: \"mclose\", size: 4 },\n \"\\\\bigm\": { mclass: \"mrel\", size: 1 },\n \"\\\\Bigm\": { mclass: \"mrel\", size: 2 },\n \"\\\\biggm\": { mclass: \"mrel\", size: 3 },\n \"\\\\Biggm\": { mclass: \"mrel\", size: 4 },\n \"\\\\big\": { mclass: \"mord\", size: 1 },\n \"\\\\Big\": { mclass: \"mord\", size: 2 },\n \"\\\\bigg\": { mclass: \"mord\", size: 3 },\n \"\\\\Bigg\": { mclass: \"mord\", size: 4 }\n};\n\nconst delimiters = [\n \"(\",\n \"\\\\lparen\",\n \")\",\n \"\\\\rparen\",\n \"[\",\n \"\\\\lbrack\",\n \"]\",\n \"\\\\rbrack\",\n \"\\\\{\",\n \"\\\\lbrace\",\n \"\\\\}\",\n \"\\\\rbrace\",\n \"⦇\",\n \"\\\\llparenthesis\",\n \"⦈\",\n \"\\\\rrparenthesis\",\n \"\\\\lfloor\",\n \"\\\\rfloor\",\n \"\\u230a\",\n \"\\u230b\",\n \"\\\\lceil\",\n \"\\\\rceil\",\n \"\\u2308\",\n \"\\u2309\",\n \"<\",\n \">\",\n \"\\\\langle\",\n \"\\u27e8\",\n \"\\\\rangle\",\n \"\\u27e9\",\n \"\\\\lAngle\",\n \"\\u27ea\",\n \"\\\\rAngle\",\n \"\\u27eb\",\n \"\\\\llangle\",\n \"⦉\",\n \"\\\\rrangle\",\n \"⦊\",\n \"\\\\lt\",\n \"\\\\gt\",\n \"\\\\lvert\",\n \"\\\\rvert\",\n \"\\\\lVert\",\n \"\\\\rVert\",\n \"\\\\lgroup\",\n \"\\\\rgroup\",\n \"\\u27ee\",\n \"\\u27ef\",\n \"\\\\lmoustache\",\n \"\\\\rmoustache\",\n \"\\u23b0\",\n \"\\u23b1\",\n \"\\\\llbracket\",\n \"\\\\rrbracket\",\n \"\\u27e6\",\n \"\\u27e6\",\n \"\\\\lBrace\",\n \"\\\\rBrace\",\n \"\\u2983\",\n \"\\u2984\",\n \"/\",\n \"\\\\backslash\",\n \"|\",\n \"\\\\vert\",\n \"\\\\|\",\n \"\\\\Vert\",\n \"\\u2016\",\n \"\\\\uparrow\",\n \"\\\\Uparrow\",\n \"\\\\downarrow\",\n \"\\\\Downarrow\",\n \"\\\\updownarrow\",\n \"\\\\Updownarrow\",\n \".\"\n];\n\n// Export isDelimiter for benefit of parser.\nconst dels = [\"}\", \"\\\\left\", \"\\\\middle\", \"\\\\right\"];\nconst isDelimiter = str => str.length > 0 &&\n (delimiters.includes(str) || delimiterSizes[str] || dels.includes(str));\n\n// Metrics of the different sizes. Found by looking at TeX's output of\n// $\\bigl| // \\Bigl| \\biggl| \\Biggl| \\showlists$\n// Used to create stacked delimiters of appropriate sizes in makeSizedDelim.\nconst sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];\n\n// Delimiter functions\nfunction checkDelimiter(delim, context) {\n const symDelim = checkSymbolNodeType(delim);\n if (symDelim && delimiters.includes(symDelim.text)) {\n // If a character is not in the MathML operator dictionary, it will not stretch.\n // Replace such characters w/characters that will stretch.\n if ([\"<\", \"\\\\lt\"].includes(symDelim.text)) { symDelim.text = \"⟨\"; }\n if ([\">\", \"\\\\gt\"].includes(symDelim.text)) { symDelim.text = \"⟩\"; }\n return symDelim;\n } else if (symDelim) {\n throw new ParseError(`Invalid delimiter '${symDelim.text}' after '${context.funcName}'`, delim);\n } else {\n throw new ParseError(`Invalid delimiter type '${delim.type}'`, delim);\n }\n}\n\n// / \\\nconst needExplicitStretch = [\"\\u002F\", \"\\u005C\", \"\\\\backslash\", \"\\\\vert\", \"|\"];\n\ndefineFunction({\n type: \"delimsizing\",\n names: [\n \"\\\\bigl\",\n \"\\\\Bigl\",\n \"\\\\biggl\",\n \"\\\\Biggl\",\n \"\\\\bigr\",\n \"\\\\Bigr\",\n \"\\\\biggr\",\n \"\\\\Biggr\",\n \"\\\\bigm\",\n \"\\\\Bigm\",\n \"\\\\biggm\",\n \"\\\\Biggm\",\n \"\\\\big\",\n \"\\\\Big\",\n \"\\\\bigg\",\n \"\\\\Bigg\"\n ],\n props: {\n numArgs: 1,\n argTypes: [\"primitive\"]\n },\n handler: (context, args) => {\n const delim = checkDelimiter(args[0], context);\n\n return {\n type: \"delimsizing\",\n mode: context.parser.mode,\n size: delimiterSizes[context.funcName].size,\n mclass: delimiterSizes[context.funcName].mclass,\n delim: delim.text\n };\n },\n mathmlBuilder: (group) => {\n const children = [];\n\n if (group.delim === \".\") { group.delim = \"\"; }\n children.push(makeText(group.delim, group.mode));\n\n const node = new mathMLTree.MathNode(\"mo\", children);\n\n if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n // Only some of the delimsizing functions act as fences, and they\n // return \"mopen\" or \"mclose\" mclass.\n node.setAttribute(\"fence\", \"true\");\n } else {\n // Explicitly disable fencing if it's not a fence, to override the\n // defaults.\n node.setAttribute(\"fence\", \"false\");\n }\n if (needExplicitStretch.includes(group.delim) || group.delim.indexOf(\"arrow\") > -1) {\n // We have to explicitly set stretchy to true.\n node.setAttribute(\"stretchy\", \"true\");\n }\n node.setAttribute(\"symmetric\", \"true\"); // Needed for tall arrows in Firefox.\n node.setAttribute(\"minsize\", sizeToMaxHeight[group.size] + \"em\");\n node.setAttribute(\"maxsize\", sizeToMaxHeight[group.size] + \"em\");\n return node;\n }\n});\n\nfunction assertParsed(group) {\n if (!group.body) {\n throw new Error(\"Bug: The leftright ParseNode wasn't fully parsed.\");\n }\n}\n\ndefineFunction({\n type: \"leftright-right\",\n names: [\"\\\\right\"],\n props: {\n numArgs: 1,\n argTypes: [\"primitive\"]\n },\n handler: (context, args) => {\n return {\n type: \"leftright-right\",\n mode: context.parser.mode,\n delim: checkDelimiter(args[0], context).text\n };\n }\n});\n\ndefineFunction({\n type: \"leftright\",\n names: [\"\\\\left\"],\n props: {\n numArgs: 1,\n argTypes: [\"primitive\"]\n },\n handler: (context, args) => {\n const delim = checkDelimiter(args[0], context);\n\n const parser = context.parser;\n // Parse out the implicit body\n ++parser.leftrightDepth;\n // parseExpression stops before '\\\\right' or `\\\\middle`\n let body = parser.parseExpression(false, null, true);\n let nextToken = parser.fetch();\n while (nextToken.text === \"\\\\middle\") {\n // `\\middle`, from the ε-TeX package, ends one group and starts another group.\n // We had to parse this expression with `breakOnMiddle` enabled in order\n // to get TeX-compliant parsing of \\over.\n // But we do not want, at this point, to end on \\middle, so continue\n // to parse until we fetch a `\\right`.\n parser.consume();\n const middle = parser.fetch().text;\n if (!symbols.math[middle]) {\n throw new ParseError(`Invalid delimiter '${middle}' after '\\\\middle'`);\n }\n checkDelimiter({ type: \"atom\", mode: \"math\", text: middle }, { funcName: \"\\\\middle\" });\n body.push({ type: \"middle\", mode: \"math\", delim: middle });\n parser.consume();\n body = body.concat(parser.parseExpression(false, null, true));\n nextToken = parser.fetch();\n }\n --parser.leftrightDepth;\n // Check the next token\n parser.expect(\"\\\\right\", false);\n const right = assertNodeType(parser.parseFunction(), \"leftright-right\");\n return {\n type: \"leftright\",\n mode: parser.mode,\n body,\n left: delim.text,\n right: right.delim\n };\n },\n mathmlBuilder: (group, style) => {\n assertParsed(group);\n const inner = buildExpression(group.body, style);\n\n if (group.left === \".\") { group.left = \"\"; }\n const leftNode = new mathMLTree.MathNode(\"mo\", [makeText(group.left, group.mode)]);\n leftNode.setAttribute(\"fence\", \"true\");\n leftNode.setAttribute(\"form\", \"prefix\");\n if (group.left === \"/\" || group.left === \"\\u005C\" || group.left.indexOf(\"arrow\") > -1) {\n leftNode.setAttribute(\"stretchy\", \"true\");\n }\n inner.unshift(leftNode);\n\n if (group.right === \".\") { group.right = \"\"; }\n const rightNode = new mathMLTree.MathNode(\"mo\", [makeText(group.right, group.mode)]);\n rightNode.setAttribute(\"fence\", \"true\");\n rightNode.setAttribute(\"form\", \"postfix\");\n if (group.right === \"\\u2216\" || group.right.indexOf(\"arrow\") > -1) {\n rightNode.setAttribute(\"stretchy\", \"true\");\n }\n if (group.body.length > 0) {\n const lastElement = group.body[group.body.length - 1];\n if (lastElement.type === \"color\" && !lastElement.isTextColor) {\n // \\color is a switch. If the last element is of type \"color\" then\n // the user set the \\color switch and left it on.\n // A \\right delimiter turns the switch off, but the delimiter itself gets the color.\n rightNode.setAttribute(\"mathcolor\", lastElement.color);\n }\n }\n inner.push(rightNode);\n\n return makeRow(inner);\n }\n});\n\ndefineFunction({\n type: \"middle\",\n names: [\"\\\\middle\"],\n props: {\n numArgs: 1,\n argTypes: [\"primitive\"]\n },\n handler: (context, args) => {\n const delim = checkDelimiter(args[0], context);\n if (!context.parser.leftrightDepth) {\n throw new ParseError(\"\\\\middle without preceding \\\\left\", delim);\n }\n\n return {\n type: \"middle\",\n mode: context.parser.mode,\n delim: delim.text\n };\n },\n mathmlBuilder: (group, style) => {\n const textNode = makeText(group.delim, group.mode);\n const middleNode = new mathMLTree.MathNode(\"mo\", [textNode]);\n middleNode.setAttribute(\"fence\", \"true\");\n if (group.delim.indexOf(\"arrow\") > -1) {\n middleNode.setAttribute(\"stretchy\", \"true\");\n }\n // The next line is not semantically correct, but\n // Chromium fails to stretch if it is not there.\n middleNode.setAttribute(\"form\", \"prefix\");\n // MathML gives 5/18em spacing to each <mo> element.\n // \\middle should get delimiter spacing instead.\n middleNode.setAttribute(\"lspace\", \"0.05em\");\n middleNode.setAttribute(\"rspace\", \"0.05em\");\n return middleNode;\n }\n});\n\nconst padding = _ => {\n const node = new mathMLTree.MathNode(\"mspace\");\n node.setAttribute(\"width\", \"3pt\");\n return node\n};\n\nconst mathmlBuilder$7 = (group, style) => {\n let node;\n if (group.label.indexOf(\"colorbox\") > -1 || group.label === \"\\\\boxed\") {\n // MathML core does not support +width attribute in <mpadded>.\n // Firefox does not reliably add side padding.\n // Insert <mspace>\n node = new mathMLTree.MathNode(\"mrow\", [\n padding(),\n buildGroup$1(group.body, style),\n padding()\n ]);\n } else {\n node = new mathMLTree.MathNode(\"menclose\", [buildGroup$1(group.body, style)]);\n }\n switch (group.label) {\n case \"\\\\overline\":\n node.setAttribute(\"notation\", \"top\"); // for Firefox & WebKit\n node.classes.push(\"tml-overline\"); // for Chromium\n break\n case \"\\\\underline\":\n node.setAttribute(\"notation\", \"bottom\");\n node.classes.push(\"tml-underline\");\n break\n case \"\\\\cancel\":\n node.setAttribute(\"notation\", \"updiagonalstrike\");\n node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"tml-cancel\", \"upstrike\"]));\n break\n case \"\\\\bcancel\":\n node.setAttribute(\"notation\", \"downdiagonalstrike\");\n node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"tml-cancel\", \"downstrike\"]));\n break\n case \"\\\\sout\":\n node.setAttribute(\"notation\", \"horizontalstrike\");\n node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"tml-cancel\", \"sout\"]));\n break\n case \"\\\\xcancel\":\n node.setAttribute(\"notation\", \"updiagonalstrike downdiagonalstrike\");\n node.classes.push(\"tml-xcancel\");\n break\n case \"\\\\longdiv\":\n node.setAttribute(\"notation\", \"longdiv\");\n node.classes.push(\"longdiv-top\");\n node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"longdiv-arc\"]));\n break\n case \"\\\\phase\":\n node.setAttribute(\"notation\", \"phasorangle\");\n node.classes.push(\"phasor-bottom\");\n node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"phasor-angle\"]));\n break\n case \"\\\\textcircled\":\n node.setAttribute(\"notation\", \"circle\");\n node.classes.push(\"circle-pad\");\n node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"textcircle\"]));\n break\n case \"\\\\angl\":\n node.setAttribute(\"notation\", \"actuarial\");\n node.classes.push(\"actuarial\");\n break\n case \"\\\\boxed\":\n // \\newcommand{\\boxed}[1]{\\fbox{\\m@th$\\displaystyle#1$}} from amsmath.sty\n node.setAttribute(\"notation\", \"box\");\n node.classes.push(\"tml-box\");\n node.setAttribute(\"scriptlevel\", \"0\");\n node.setAttribute(\"displaystyle\", \"true\");\n break\n case \"\\\\fbox\":\n node.setAttribute(\"notation\", \"box\");\n node.classes.push(\"tml-fbox\");\n break\n case \"\\\\fcolorbox\":\n case \"\\\\colorbox\": {\n // <menclose> doesn't have a good notation option for \\colorbox.\n // So use <mpadded> instead. Set some attributes that come\n // included with <menclose>.\n //const fboxsep = 3; // 3 pt from LaTeX source2e\n //node.setAttribute(\"height\", `+${2 * fboxsep}pt`)\n //node.setAttribute(\"voffset\", `${fboxsep}pt`)\n const style = { padding: \"3pt 0 3pt 0\" };\n\n if (group.label === \"\\\\fcolorbox\") {\n style.border = \"0.0667em solid \" + String(group.borderColor);\n }\n node.style = style;\n break\n }\n }\n if (group.backgroundColor) {\n node.setAttribute(\"mathbackground\", group.backgroundColor);\n }\n return node;\n};\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\colorbox\"],\n props: {\n numArgs: 2,\n numOptionalArgs: 1,\n allowedInText: true,\n argTypes: [\"raw\", \"raw\", \"text\"]\n },\n handler({ parser, funcName }, args, optArgs) {\n const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n let color = \"\";\n if (model) {\n const spec = assertNodeType(args[0], \"raw\").string;\n color = colorFromSpec(model, spec);\n } else {\n color = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros);\n }\n const body = args[1];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n backgroundColor: color,\n body\n };\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\fcolorbox\"],\n props: {\n numArgs: 3,\n numOptionalArgs: 1,\n allowedInText: true,\n argTypes: [\"raw\", \"raw\", \"raw\", \"text\"]\n },\n handler({ parser, funcName }, args, optArgs) {\n const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n let borderColor = \"\";\n let backgroundColor;\n if (model) {\n const borderSpec = assertNodeType(args[0], \"raw\").string;\n const backgroundSpec = assertNodeType(args[0], \"raw\").string;\n borderColor = colorFromSpec(model, borderSpec);\n backgroundColor = colorFromSpec(model, backgroundSpec);\n } else {\n borderColor = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros);\n backgroundColor = validateColor(assertNodeType(args[1], \"raw\").string, parser.gullet.macros);\n }\n const body = args[2];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n backgroundColor,\n borderColor,\n body\n };\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\fbox\"],\n props: {\n numArgs: 1,\n argTypes: [\"hbox\"],\n allowedInText: true\n },\n handler({ parser }, args) {\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: \"\\\\fbox\",\n body: args[0]\n };\n }\n});\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\angl\", \"\\\\cancel\", \"\\\\bcancel\", \"\\\\xcancel\", \"\\\\sout\", \"\\\\overline\",\n \"\\\\boxed\", \"\\\\longdiv\", \"\\\\phase\"],\n props: {\n numArgs: 1\n },\n handler({ parser, funcName }, args) {\n const body = args[0];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n body\n };\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\underline\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler({ parser, funcName }, args) {\n const body = args[0];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n body\n };\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\textcircled\"],\n props: {\n numArgs: 1,\n argTypes: [\"text\"],\n allowedInArgument: true,\n allowedInText: true\n },\n handler({ parser, funcName }, args) {\n const body = args[0];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n body\n };\n },\n mathmlBuilder: mathmlBuilder$7\n});\n\n// Environment delimiters. HTML/MathML rendering is defined in the corresponding\n// defineEnvironment definitions.\ndefineFunction({\n type: \"environment\",\n names: [\"\\\\begin\", \"\\\\end\"],\n props: {\n numArgs: 1,\n argTypes: [\"text\"]\n },\n handler({ parser, funcName }, args) {\n const nameGroup = args[0];\n if (nameGroup.type !== \"ordgroup\") {\n throw new ParseError(\"Invalid environment name\", nameGroup);\n }\n let envName = \"\";\n for (let i = 0; i < nameGroup.body.length; ++i) {\n envName += assertNodeType(nameGroup.body[i], \"textord\").text;\n }\n\n if (funcName === \"\\\\begin\") {\n // begin...end is similar to left...right\n if (!Object.prototype.hasOwnProperty.call(environments, envName )) {\n throw new ParseError(\"No such environment: \" + envName, nameGroup);\n }\n // Build the environment object. Arguments and other information will\n // be made available to the begin and end methods using properties.\n const env = environments[envName];\n const { args, optArgs } = parser.parseArguments(\"\\\\begin{\" + envName + \"}\", env);\n const context = {\n mode: parser.mode,\n envName,\n parser\n };\n const result = env.handler(context, args, optArgs);\n parser.expect(\"\\\\end\", false);\n const endNameToken = parser.nextToken;\n const end = assertNodeType(parser.parseFunction(), \"environment\");\n if (end.name !== envName) {\n throw new ParseError(\n `Mismatch: \\\\begin{${envName}} matched by \\\\end{${end.name}}`,\n endNameToken\n );\n }\n return result;\n }\n\n return {\n type: \"environment\",\n mode: parser.mode,\n name: envName,\n nameGroup\n };\n }\n});\n\ndefineFunction({\n type: \"envTag\",\n names: [\"\\\\env@tag\"],\n props: {\n numArgs: 1,\n argTypes: [\"math\"]\n },\n handler({ parser }, args) {\n return {\n type: \"envTag\",\n mode: parser.mode,\n body: args[0]\n };\n },\n mathmlBuilder(group, style) {\n return new mathMLTree.MathNode(\"mrow\");\n }\n});\n\ndefineFunction({\n type: \"noTag\",\n names: [\"\\\\env@notag\"],\n props: {\n numArgs: 0\n },\n handler({ parser }) {\n return {\n type: \"noTag\",\n mode: parser.mode\n };\n },\n mathmlBuilder(group, style) {\n return new mathMLTree.MathNode(\"mrow\");\n }\n});\n\nconst isLongVariableName = (group, font) => {\n if (font !== \"mathrm\" || group.body.type !== \"ordgroup\" || group.body.body.length === 1) {\n return false\n }\n if (group.body.body[0].type !== \"mathord\") { return false }\n for (let i = 1; i < group.body.body.length; i++) {\n const parseNodeType = group.body.body[i].type;\n if (!(parseNodeType === \"mathord\" ||\n (parseNodeType === \"textord\" && !isNaN(group.body.body[i].text)))) {\n return false\n }\n }\n return true\n};\n\nconst mathmlBuilder$6 = (group, style) => {\n const font = group.font;\n const newStyle = style.withFont(font);\n const mathGroup = buildGroup$1(group.body, newStyle);\n\n if (mathGroup.children.length === 0) { return mathGroup } // empty group, e.g., \\mathrm{}\n if (font === \"boldsymbol\" && [\"mo\", \"mpadded\", \"mrow\"].includes(mathGroup.type)) {\n mathGroup.style.fontWeight = \"bold\";\n return mathGroup\n }\n // Check if it is possible to consolidate elements into a single <mi> element.\n if (isLongVariableName(group, font)) {\n // This is a \\mathrm{…} group. It gets special treatment because symbolsOrd.js\n // wraps <mi> elements with <mrow>s to work around a Firefox bug.\n const mi = mathGroup.children[0].children[0];\n delete mi.attributes.mathvariant;\n for (let i = 1; i < mathGroup.children.length; i++) {\n mi.children[0].text += mathGroup.children[i].type === \"mn\"\n ? mathGroup.children[i].children[0].text\n : mathGroup.children[i].children[0].children[0].text;\n }\n // Wrap in a <mrow> to prevent the same Firefox bug.\n const bogus = new mathMLTree.MathNode(\"mtext\", new mathMLTree.TextNode(\"\\u200b\"));\n return new mathMLTree.MathNode(\"mrow\", [bogus, mi])\n }\n let canConsolidate = mathGroup.children[0].type === \"mo\";\n for (let i = 1; i < mathGroup.children.length; i++) {\n if (mathGroup.children[i].type === \"mo\" && font === \"boldsymbol\") {\n mathGroup.children[i].style.fontWeight = \"bold\";\n }\n if (mathGroup.children[i].type !== \"mi\") { canConsolidate = false; }\n const localVariant = mathGroup.children[i].attributes &&\n mathGroup.children[i].attributes.mathvariant || \"\";\n if (localVariant !== \"normal\") { canConsolidate = false; }\n }\n if (!canConsolidate) { return mathGroup }\n // Consolidate the <mi> elements.\n const mi = mathGroup.children[0];\n for (let i = 1; i < mathGroup.children.length; i++) {\n mi.children.push(mathGroup.children[i].children[0]);\n }\n if (mi.attributes.mathvariant && mi.attributes.mathvariant === \"normal\") {\n // Workaround for a Firefox bug that renders spurious space around\n // a <mi mathvariant=\"normal\">\n // Ref: https://bugs.webkit.org/show_bug.cgi?id=129097\n // We insert a text node that contains a zero-width space and wrap in an mrow.\n // TODO: Get rid of this <mi> workaround when the Firefox bug is fixed.\n const bogus = new mathMLTree.MathNode(\"mtext\", new mathMLTree.TextNode(\"\\u200b\"));\n return new mathMLTree.MathNode(\"mrow\", [bogus, mi])\n }\n return mi\n};\n\nconst fontAliases = {\n \"\\\\Bbb\": \"\\\\mathbb\",\n \"\\\\bold\": \"\\\\mathbf\",\n \"\\\\frak\": \"\\\\mathfrak\",\n \"\\\\bm\": \"\\\\boldsymbol\"\n};\n\ndefineFunction({\n type: \"font\",\n names: [\n // styles\n \"\\\\mathrm\",\n \"\\\\mathit\",\n \"\\\\mathbf\",\n \"\\\\mathnormal\",\n \"\\\\up@greek\",\n \"\\\\boldsymbol\",\n\n // families\n \"\\\\mathbb\",\n \"\\\\mathcal\",\n \"\\\\mathfrak\",\n \"\\\\mathscr\",\n \"\\\\mathsf\",\n \"\\\\mathsfit\",\n \"\\\\mathtt\",\n\n // aliases\n \"\\\\Bbb\",\n \"\\\\bm\",\n \"\\\\bold\",\n \"\\\\frak\"\n ],\n props: {\n numArgs: 1,\n allowedInArgument: true\n },\n handler: ({ parser, funcName }, args) => {\n const body = normalizeArgument(args[0]);\n let func = funcName;\n if (func in fontAliases) {\n func = fontAliases[func];\n }\n return {\n type: \"font\",\n mode: parser.mode,\n font: func.slice(1),\n body\n };\n },\n mathmlBuilder: mathmlBuilder$6\n});\n\n// Old font changing functions\ndefineFunction({\n type: \"font\",\n names: [\"\\\\rm\", \"\\\\sf\", \"\\\\tt\", \"\\\\bf\", \"\\\\it\", \"\\\\cal\"],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler: ({ parser, funcName, breakOnTokenText }, args) => {\n const { mode } = parser;\n const body = parser.parseExpression(true, breakOnTokenText, true);\n const fontStyle = `math${funcName.slice(1)}`;\n\n return {\n type: \"font\",\n mode: mode,\n font: fontStyle,\n body: {\n type: \"ordgroup\",\n mode: parser.mode,\n body\n }\n };\n },\n mathmlBuilder: mathmlBuilder$6\n});\n\nconst stylArray = [\"display\", \"text\", \"script\", \"scriptscript\"];\nconst scriptLevel = { auto: -1, display: 0, text: 0, script: 1, scriptscript: 2 };\n\nconst mathmlBuilder$5 = (group, style) => {\n // Track the scriptLevel of the numerator and denominator.\n // We may need that info for \\mathchoice or for adjusting em dimensions.\n const childOptions = group.scriptLevel === \"auto\"\n ? style.incrementLevel()\n : group.scriptLevel === \"display\"\n ? style.withLevel(StyleLevel.TEXT)\n : group.scriptLevel === \"text\"\n ? style.withLevel(StyleLevel.SCRIPT)\n : style.withLevel(StyleLevel.SCRIPTSCRIPT);\n\n // Chromium (wrongly) continues to shrink fractions beyond scriptscriptlevel.\n // So we check for levels that Chromium shrinks too small.\n // If necessary, set an explicit fraction depth.\n const numer = buildGroup$1(group.numer, childOptions);\n const denom = buildGroup$1(group.denom, childOptions);\n if (style.level === 3) {\n numer.style.mathDepth = \"2\";\n numer.setAttribute(\"scriptlevel\", \"2\");\n denom.style.mathDepth = \"2\";\n denom.setAttribute(\"scriptlevel\", \"2\");\n }\n\n let node = new mathMLTree.MathNode(\"mfrac\", [numer, denom]);\n\n if (!group.hasBarLine) {\n node.setAttribute(\"linethickness\", \"0px\");\n } else if (group.barSize) {\n const ruleWidth = calculateSize(group.barSize, style);\n node.setAttribute(\"linethickness\", ruleWidth.number + ruleWidth.unit);\n }\n\n if (group.leftDelim != null || group.rightDelim != null) {\n const withDelims = [];\n\n if (group.leftDelim != null) {\n const leftOp = new mathMLTree.MathNode(\"mo\", [\n new mathMLTree.TextNode(group.leftDelim.replace(\"\\\\\", \"\"))\n ]);\n leftOp.setAttribute(\"fence\", \"true\");\n withDelims.push(leftOp);\n }\n\n withDelims.push(node);\n\n if (group.rightDelim != null) {\n const rightOp = new mathMLTree.MathNode(\"mo\", [\n new mathMLTree.TextNode(group.rightDelim.replace(\"\\\\\", \"\"))\n ]);\n rightOp.setAttribute(\"fence\", \"true\");\n withDelims.push(rightOp);\n }\n\n node = makeRow(withDelims);\n }\n\n if (group.scriptLevel !== \"auto\") {\n node = new mathMLTree.MathNode(\"mstyle\", [node]);\n node.setAttribute(\"displaystyle\", String(group.scriptLevel === \"display\"));\n node.setAttribute(\"scriptlevel\", scriptLevel[group.scriptLevel]);\n }\n\n return node;\n};\n\ndefineFunction({\n type: \"genfrac\",\n names: [\n \"\\\\dfrac\",\n \"\\\\frac\",\n \"\\\\tfrac\",\n \"\\\\dbinom\",\n \"\\\\binom\",\n \"\\\\tbinom\",\n \"\\\\\\\\atopfrac\", // can’t be entered directly\n \"\\\\\\\\bracefrac\",\n \"\\\\\\\\brackfrac\" // ditto\n ],\n props: {\n numArgs: 2,\n allowedInArgument: true\n },\n handler: ({ parser, funcName }, args) => {\n const numer = args[0];\n const denom = args[1];\n let hasBarLine = false;\n let leftDelim = null;\n let rightDelim = null;\n let scriptLevel = \"auto\";\n\n switch (funcName) {\n case \"\\\\dfrac\":\n case \"\\\\frac\":\n case \"\\\\tfrac\":\n hasBarLine = true;\n break;\n case \"\\\\\\\\atopfrac\":\n hasBarLine = false;\n break;\n case \"\\\\dbinom\":\n case \"\\\\binom\":\n case \"\\\\tbinom\":\n leftDelim = \"(\";\n rightDelim = \")\";\n break;\n case \"\\\\\\\\bracefrac\":\n leftDelim = \"\\\\{\";\n rightDelim = \"\\\\}\";\n break;\n case \"\\\\\\\\brackfrac\":\n leftDelim = \"[\";\n rightDelim = \"]\";\n break;\n default:\n throw new Error(\"Unrecognized genfrac command\");\n }\n\n switch (funcName) {\n case \"\\\\dfrac\":\n case \"\\\\dbinom\":\n scriptLevel = \"display\";\n break;\n case \"\\\\tfrac\":\n case \"\\\\tbinom\":\n scriptLevel = \"text\";\n break;\n }\n\n return {\n type: \"genfrac\",\n mode: parser.mode,\n continued: false,\n numer,\n denom,\n hasBarLine,\n leftDelim,\n rightDelim,\n scriptLevel,\n barSize: null\n };\n },\n mathmlBuilder: mathmlBuilder$5\n});\n\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\cfrac\"],\n props: {\n numArgs: 2\n },\n handler: ({ parser, funcName }, args) => {\n const numer = args[0];\n const denom = args[1];\n\n return {\n type: \"genfrac\",\n mode: parser.mode,\n continued: true,\n numer,\n denom,\n hasBarLine: true,\n leftDelim: null,\n rightDelim: null,\n scriptLevel: \"display\",\n barSize: null\n };\n }\n});\n\n// Infix generalized fractions -- these are not rendered directly, but replaced\n// immediately by one of the variants above.\ndefineFunction({\n type: \"infix\",\n names: [\"\\\\over\", \"\\\\choose\", \"\\\\atop\", \"\\\\brace\", \"\\\\brack\"],\n props: {\n numArgs: 0,\n infix: true\n },\n handler({ parser, funcName, token }) {\n let replaceWith;\n switch (funcName) {\n case \"\\\\over\":\n replaceWith = \"\\\\frac\";\n break;\n case \"\\\\choose\":\n replaceWith = \"\\\\binom\";\n break;\n case \"\\\\atop\":\n replaceWith = \"\\\\\\\\atopfrac\";\n break;\n case \"\\\\brace\":\n replaceWith = \"\\\\\\\\bracefrac\";\n break;\n case \"\\\\brack\":\n replaceWith = \"\\\\\\\\brackfrac\";\n break;\n default:\n throw new Error(\"Unrecognized infix genfrac command\");\n }\n return {\n type: \"infix\",\n mode: parser.mode,\n replaceWith,\n token\n };\n }\n});\n\nconst delimFromValue = function(delimString) {\n let delim = null;\n if (delimString.length > 0) {\n delim = delimString;\n delim = delim === \".\" ? null : delim;\n }\n return delim;\n};\n\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\genfrac\"],\n props: {\n numArgs: 6,\n allowedInArgument: true,\n argTypes: [\"math\", \"math\", \"size\", \"text\", \"math\", \"math\"]\n },\n handler({ parser }, args) {\n const numer = args[4];\n const denom = args[5];\n\n // Look into the parse nodes to get the desired delimiters.\n const leftNode = normalizeArgument(args[0]);\n const leftDelim = leftNode.type === \"atom\" && leftNode.family === \"open\"\n ? delimFromValue(leftNode.text)\n : null;\n const rightNode = normalizeArgument(args[1]);\n const rightDelim =\n rightNode.type === \"atom\" && rightNode.family === \"close\"\n ? delimFromValue(rightNode.text)\n : null;\n\n const barNode = assertNodeType(args[2], \"size\");\n let hasBarLine;\n let barSize = null;\n if (barNode.isBlank) {\n // \\genfrac acts differently than \\above.\n // \\genfrac treats an empty size group as a signal to use a\n // standard bar size. \\above would see size = 0 and omit the bar.\n hasBarLine = true;\n } else {\n barSize = barNode.value;\n hasBarLine = barSize.number > 0;\n }\n\n // Find out if we want displaystyle, textstyle, etc.\n let scriptLevel = \"auto\";\n let styl = args[3];\n if (styl.type === \"ordgroup\") {\n if (styl.body.length > 0) {\n const textOrd = assertNodeType(styl.body[0], \"textord\");\n scriptLevel = stylArray[Number(textOrd.text)];\n }\n } else {\n styl = assertNodeType(styl, \"textord\");\n scriptLevel = stylArray[Number(styl.text)];\n }\n\n return {\n type: \"genfrac\",\n mode: parser.mode,\n numer,\n denom,\n continued: false,\n hasBarLine,\n barSize,\n leftDelim,\n rightDelim,\n scriptLevel\n };\n },\n mathmlBuilder: mathmlBuilder$5\n});\n\n// \\above is an infix fraction that also defines a fraction bar size.\ndefineFunction({\n type: \"infix\",\n names: [\"\\\\above\"],\n props: {\n numArgs: 1,\n argTypes: [\"size\"],\n infix: true\n },\n handler({ parser, funcName, token }, args) {\n return {\n type: \"infix\",\n mode: parser.mode,\n replaceWith: \"\\\\\\\\abovefrac\",\n barSize: assertNodeType(args[0], \"size\").value,\n token\n };\n }\n});\n\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\\\\\abovefrac\"],\n props: {\n numArgs: 3,\n argTypes: [\"math\", \"size\", \"math\"]\n },\n handler: ({ parser, funcName }, args) => {\n const numer = args[0];\n const barSize = assert(assertNodeType(args[1], \"infix\").barSize);\n const denom = args[2];\n\n const hasBarLine = barSize.number > 0;\n return {\n type: \"genfrac\",\n mode: parser.mode,\n numer,\n denom,\n continued: false,\n hasBarLine,\n barSize,\n leftDelim: null,\n rightDelim: null,\n scriptLevel: \"auto\"\n };\n },\n\n mathmlBuilder: mathmlBuilder$5\n});\n\n// \\hbox is provided for compatibility with LaTeX functions that act on a box.\n// This function by itself doesn't do anything but set scriptlevel to \\textstyle\n// and prevent a soft line break.\n\ndefineFunction({\n type: \"hbox\",\n names: [\"\\\\hbox\"],\n props: {\n numArgs: 1,\n argTypes: [\"hbox\"],\n allowedInArgument: true,\n allowedInText: false\n },\n handler({ parser }, args) {\n return {\n type: \"hbox\",\n mode: parser.mode,\n body: ordargument(args[0])\n };\n },\n mathmlBuilder(group, style) {\n const newStyle = style.withLevel(StyleLevel.TEXT);\n const mrow = buildExpressionRow(group.body, newStyle);\n return consolidateText(mrow)\n }\n});\n\nconst mathmlBuilder$4 = (group, style) => {\n const accentNode = stretchy.mathMLnode(group.label);\n accentNode.style[\"math-depth\"] = 0;\n return new mathMLTree.MathNode(group.isOver ? \"mover\" : \"munder\", [\n buildGroup$1(group.base, style),\n accentNode\n ]);\n};\n\n// Horizontal stretchy braces\ndefineFunction({\n type: \"horizBrace\",\n names: [\"\\\\overbrace\", \"\\\\underbrace\"],\n props: {\n numArgs: 1\n },\n handler({ parser, funcName }, args) {\n return {\n type: \"horizBrace\",\n mode: parser.mode,\n label: funcName,\n isOver: /^\\\\over/.test(funcName),\n base: args[0]\n };\n },\n mathmlBuilder: mathmlBuilder$4\n});\n\ndefineFunction({\n type: \"href\",\n names: [\"\\\\href\"],\n props: {\n numArgs: 2,\n argTypes: [\"url\", \"original\"],\n allowedInText: true\n },\n handler: ({ parser, token }, args) => {\n const body = args[1];\n const href = assertNodeType(args[0], \"url\").url;\n\n if (\n !parser.settings.isTrusted({\n command: \"\\\\href\",\n url: href\n })\n ) {\n throw new ParseError(`Function \"\\\\href\" is not trusted`, token)\n }\n\n return {\n type: \"href\",\n mode: parser.mode,\n href,\n body: ordargument(body)\n };\n },\n mathmlBuilder: (group, style) => {\n const math = new MathNode(\"math\", [buildExpressionRow(group.body, style)]);\n const anchorNode = new AnchorNode(group.href, [], [math]);\n return anchorNode\n }\n});\n\ndefineFunction({\n type: \"href\",\n names: [\"\\\\url\"],\n props: {\n numArgs: 1,\n argTypes: [\"url\"],\n allowedInText: true\n },\n handler: ({ parser, token }, args) => {\n const href = assertNodeType(args[0], \"url\").url;\n\n if (\n !parser.settings.isTrusted({\n command: \"\\\\url\",\n url: href\n })\n ) {\n throw new ParseError(`Function \"\\\\url\" is not trusted`, token)\n }\n\n const chars = [];\n for (let i = 0; i < href.length; i++) {\n let c = href[i];\n if (c === \"~\") {\n c = \"\\\\textasciitilde\";\n }\n chars.push({\n type: \"textord\",\n mode: \"text\",\n text: c\n });\n }\n const body = {\n type: \"text\",\n mode: parser.mode,\n font: \"\\\\texttt\",\n body: chars\n };\n return {\n type: \"href\",\n mode: parser.mode,\n href,\n body: ordargument(body)\n };\n }\n});\n\ndefineFunction({\n type: \"html\",\n names: [\"\\\\class\", \"\\\\id\", \"\\\\style\", \"\\\\data\"],\n props: {\n numArgs: 2,\n argTypes: [\"raw\", \"original\"],\n allowedInText: true\n },\n handler: ({ parser, funcName, token }, args) => {\n const value = assertNodeType(args[0], \"raw\").string;\n const body = args[1];\n\n if (parser.settings.strict) {\n throw new ParseError(`Function \"${funcName}\" is disabled in strict mode`, token)\n }\n\n let trustContext;\n const attributes = {};\n\n switch (funcName) {\n case \"\\\\class\":\n attributes.class = value;\n trustContext = {\n command: \"\\\\class\",\n class: value\n };\n break;\n case \"\\\\id\":\n attributes.id = value;\n trustContext = {\n command: \"\\\\id\",\n id: value\n };\n break;\n case \"\\\\style\":\n attributes.style = value;\n trustContext = {\n command: \"\\\\style\",\n style: value\n };\n break;\n case \"\\\\data\": {\n const data = value.split(\",\");\n for (let i = 0; i < data.length; i++) {\n const keyVal = data[i].split(\"=\");\n if (keyVal.length !== 2) {\n throw new ParseError(\"Error parsing key-value for \\\\data\");\n }\n attributes[\"data-\" + keyVal[0].trim()] = keyVal[1].trim();\n }\n\n trustContext = {\n command: \"\\\\data\",\n attributes\n };\n break;\n }\n default:\n throw new Error(\"Unrecognized html command\");\n }\n\n if (!parser.settings.isTrusted(trustContext)) {\n throw new ParseError(`Function \"${funcName}\" is not trusted`, token)\n }\n return {\n type: \"html\",\n mode: parser.mode,\n attributes,\n body: ordargument(body)\n };\n },\n mathmlBuilder: (group, style) => {\n const element = buildExpressionRow(group.body, style);\n\n const classes = [];\n if (group.attributes.class) {\n classes.push(...group.attributes.class.trim().split(/\\s+/));\n }\n element.classes = classes;\n\n for (const attr in group.attributes) {\n if (attr !== \"class\" && Object.prototype.hasOwnProperty.call(group.attributes, attr)) {\n element.setAttribute(attr, group.attributes[attr]);\n }\n }\n\n return element;\n }\n});\n\nconst sizeData = function(str) {\n if (/^[-+]? *(\\d+(\\.\\d*)?|\\.\\d+)$/.test(str)) {\n // str is a number with no unit specified.\n // default unit is bp, per graphix package.\n return { number: +str, unit: \"bp\" }\n } else {\n const match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(str);\n if (!match) {\n throw new ParseError(\"Invalid size: '\" + str + \"' in \\\\includegraphics\");\n }\n const data = {\n number: +(match[1] + match[2]), // sign + magnitude, cast to number\n unit: match[3]\n };\n if (!validUnit(data)) {\n throw new ParseError(\"Invalid unit: '\" + data.unit + \"' in \\\\includegraphics.\");\n }\n return data\n }\n};\n\ndefineFunction({\n type: \"includegraphics\",\n names: [\"\\\\includegraphics\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1,\n argTypes: [\"raw\", \"url\"],\n allowedInText: false\n },\n handler: ({ parser, token }, args, optArgs) => {\n let width = { number: 0, unit: \"em\" };\n let height = { number: 0.9, unit: \"em\" }; // sorta character sized.\n let totalheight = { number: 0, unit: \"em\" };\n let alt = \"\";\n\n if (optArgs[0]) {\n const attributeStr = assertNodeType(optArgs[0], \"raw\").string;\n\n // Parser.js does not parse key/value pairs. We get a string.\n const attributes = attributeStr.split(\",\");\n for (let i = 0; i < attributes.length; i++) {\n const keyVal = attributes[i].split(\"=\");\n if (keyVal.length === 2) {\n const str = keyVal[1].trim();\n switch (keyVal[0].trim()) {\n case \"alt\":\n alt = str;\n break\n case \"width\":\n width = sizeData(str);\n break\n case \"height\":\n height = sizeData(str);\n break\n case \"totalheight\":\n totalheight = sizeData(str);\n break\n default:\n throw new ParseError(\"Invalid key: '\" + keyVal[0] + \"' in \\\\includegraphics.\")\n }\n }\n }\n }\n\n const src = assertNodeType(args[0], \"url\").url;\n\n if (alt === \"\") {\n // No alt given. Use the file name. Strip away the path.\n alt = src;\n alt = alt.replace(/^.*[\\\\/]/, \"\");\n alt = alt.substring(0, alt.lastIndexOf(\".\"));\n }\n\n if (\n !parser.settings.isTrusted({\n command: \"\\\\includegraphics\",\n url: src\n })\n ) {\n throw new ParseError(`Function \"\\\\includegraphics\" is not trusted`, token)\n }\n\n return {\n type: \"includegraphics\",\n mode: parser.mode,\n alt: alt,\n width: width,\n height: height,\n totalheight: totalheight,\n src: src\n }\n },\n mathmlBuilder: (group, style) => {\n const height = calculateSize(group.height, style);\n const depth = { number: 0, unit: \"em\" };\n\n if (group.totalheight.number > 0) {\n if (group.totalheight.unit === height.unit &&\n group.totalheight.number > height.number) {\n depth.number = group.totalheight.number - height.number;\n depth.unit = height.unit;\n }\n }\n\n let width = 0;\n if (group.width.number > 0) {\n width = calculateSize(group.width, style);\n }\n\n const graphicStyle = { height: height.number + depth.number + \"em\" };\n if (width.number > 0) {\n graphicStyle.width = width.number + width.unit;\n }\n if (depth.number > 0) {\n graphicStyle.verticalAlign = -depth.number + depth.unit;\n }\n\n const node = new Img(group.src, group.alt, graphicStyle);\n node.height = height;\n node.depth = depth;\n return new mathMLTree.MathNode(\"mtext\", [node])\n }\n});\n\n// Horizontal spacing commands\n\n\n// TODO: \\hskip and \\mskip should support plus and minus in lengths\n\ndefineFunction({\n type: \"kern\",\n names: [\"\\\\kern\", \"\\\\mkern\", \"\\\\hskip\", \"\\\\mskip\"],\n props: {\n numArgs: 1,\n argTypes: [\"size\"],\n primitive: true,\n allowedInText: true\n },\n handler({ parser, funcName, token }, args) {\n const size = assertNodeType(args[0], \"size\");\n if (parser.settings.strict) {\n const mathFunction = funcName[1] === \"m\"; // \\mkern, \\mskip\n const muUnit = size.value.unit === \"mu\";\n if (mathFunction) {\n if (!muUnit) {\n throw new ParseError(`LaTeX's ${funcName} supports only mu units, ` +\n `not ${size.value.unit} units`, token)\n }\n if (parser.mode !== \"math\") {\n throw new ParseError(`LaTeX's ${funcName} works only in math mode`, token)\n }\n } else {\n // !mathFunction\n if (muUnit) {\n throw new ParseError(`LaTeX's ${funcName} doesn't support mu units`, token)\n }\n }\n }\n return {\n type: \"kern\",\n mode: parser.mode,\n dimension: size.value\n };\n },\n mathmlBuilder(group, style) {\n const dimension = calculateSize(group.dimension, style);\n const ch = dimension.unit === \"em\" ? spaceCharacter(dimension.number) : \"\";\n if (group.mode === \"text\" && ch.length > 0) {\n const character = new mathMLTree.TextNode(ch);\n return new mathMLTree.MathNode(\"mtext\", [character]);\n } else {\n const node = new mathMLTree.MathNode(\"mspace\");\n node.setAttribute(\"width\", dimension.number + dimension.unit);\n if (dimension.number < 0) {\n node.style.marginLeft = dimension.number + dimension.unit;\n }\n return node;\n }\n }\n});\n\nconst spaceCharacter = function(width) {\n if (width >= 0.05555 && width <= 0.05556) {\n return \"\\u200a\"; //  \n } else if (width >= 0.1666 && width <= 0.1667) {\n return \"\\u2009\"; //  \n } else if (width >= 0.2222 && width <= 0.2223) {\n return \"\\u2005\"; //  \n } else if (width >= 0.2777 && width <= 0.2778) {\n return \"\\u2005\\u200a\"; //   \n } else {\n return \"\";\n }\n};\n\n// Limit valid characters to a small set, for safety.\nconst invalidIdRegEx = /[^A-Za-z_0-9-]/g;\n\ndefineFunction({\n type: \"label\",\n names: [\"\\\\label\"],\n props: {\n numArgs: 1,\n argTypes: [\"raw\"]\n },\n handler({ parser }, args) {\n return {\n type: \"label\",\n mode: parser.mode,\n string: args[0].string.replace(invalidIdRegEx, \"\")\n };\n },\n mathmlBuilder(group, style) {\n // Return a no-width, no-ink element with an HTML id.\n const node = new mathMLTree.MathNode(\"mrow\", [], [\"tml-label\"]);\n if (group.string.length > 0) {\n node.setLabel(group.string);\n }\n return node\n }\n});\n\n// Horizontal overlap functions\n\nconst textModeLap = [\"\\\\clap\", \"\\\\llap\", \"\\\\rlap\"];\n\ndefineFunction({\n type: \"lap\",\n names: [\"\\\\mathllap\", \"\\\\mathrlap\", \"\\\\mathclap\", \"\\\\clap\", \"\\\\llap\", \"\\\\rlap\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: ({ parser, funcName, token }, args) => {\n if (textModeLap.includes(funcName)) {\n if (parser.settings.strict && parser.mode !== \"text\") {\n throw new ParseError(`{${funcName}} can be used only in text mode.\n Try \\\\math${funcName.slice(1)}`, token)\n }\n funcName = funcName.slice(1);\n } else {\n funcName = funcName.slice(5);\n }\n const body = args[0];\n return {\n type: \"lap\",\n mode: parser.mode,\n alignment: funcName,\n body\n }\n },\n mathmlBuilder: (group, style) => {\n // mathllap, mathrlap, mathclap\n let strut;\n if (group.alignment === \"llap\") {\n // We need an invisible strut with the same depth as the group.\n // We can't just read the depth, so we use \\vphantom methods.\n const phantomInner = buildExpression(ordargument(group.body), style);\n const phantom = new mathMLTree.MathNode(\"mphantom\", phantomInner);\n strut = new mathMLTree.MathNode(\"mpadded\", [phantom]);\n strut.setAttribute(\"width\", \"0px\");\n }\n\n const inner = buildGroup$1(group.body, style);\n let node;\n if (group.alignment === \"llap\") {\n inner.style.position = \"absolute\";\n inner.style.right = \"0\";\n inner.style.bottom = `0`; // If we could have read the ink depth, it would go here.\n node = new mathMLTree.MathNode(\"mpadded\", [strut, inner]);\n } else {\n node = new mathMLTree.MathNode(\"mpadded\", [inner]);\n }\n\n if (group.alignment === \"rlap\") {\n if (group.body.body.length > 0 && group.body.body[0].type === \"genfrac\") {\n // In Firefox, a <mpadded> squashes the 3/18em padding of a child \\frac. Put it back.\n node.setAttribute(\"lspace\", \"0.16667em\");\n }\n } else {\n const offset = group.alignment === \"llap\" ? \"-1\" : \"-0.5\";\n node.setAttribute(\"lspace\", offset + \"width\");\n if (group.alignment === \"llap\") {\n node.style.position = \"relative\";\n } else {\n node.style.display = \"flex\";\n node.style.justifyContent = \"center\";\n }\n }\n node.setAttribute(\"width\", \"0px\");\n return node\n }\n});\n\n// Switching from text mode back to math mode\ndefineFunction({\n type: \"ordgroup\",\n names: [\"\\\\(\", \"$\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n allowedInMath: false\n },\n handler({ funcName, parser }, args) {\n const outerMode = parser.mode;\n parser.switchMode(\"math\");\n const close = funcName === \"\\\\(\" ? \"\\\\)\" : \"$\";\n const body = parser.parseExpression(false, close);\n parser.expect(close);\n parser.switchMode(outerMode);\n return {\n type: \"ordgroup\",\n mode: parser.mode,\n body\n };\n }\n});\n\n// Check for extra closing math delimiters\ndefineFunction({\n type: \"text\", // Doesn't matter what this is.\n names: [\"\\\\)\", \"\\\\]\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n allowedInMath: false\n },\n handler(context, token) {\n throw new ParseError(`Mismatched ${context.funcName}`, token);\n }\n});\n\nconst chooseStyle = (group, style) => {\n switch (style.level) {\n case StyleLevel.DISPLAY: // 0\n return group.display;\n case StyleLevel.TEXT: // 1\n return group.text;\n case StyleLevel.SCRIPT: // 2\n return group.script;\n case StyleLevel.SCRIPTSCRIPT: // 3\n return group.scriptscript;\n default:\n return group.text;\n }\n};\n\ndefineFunction({\n type: \"mathchoice\",\n names: [\"\\\\mathchoice\"],\n props: {\n numArgs: 4,\n primitive: true\n },\n handler: ({ parser }, args) => {\n return {\n type: \"mathchoice\",\n mode: parser.mode,\n display: ordargument(args[0]),\n text: ordargument(args[1]),\n script: ordargument(args[2]),\n scriptscript: ordargument(args[3])\n };\n },\n mathmlBuilder: (group, style) => {\n const body = chooseStyle(group, style);\n return buildExpressionRow(body, style);\n }\n});\n\nconst textAtomTypes = [\"text\", \"textord\", \"mathord\", \"atom\"];\n\nfunction mathmlBuilder$3(group, style) {\n let node;\n const inner = buildExpression(group.body, style);\n\n if (group.mclass === \"minner\") {\n node = new mathMLTree.MathNode(\"mpadded\", inner);\n } else if (group.mclass === \"mord\") {\n if (group.isCharacterBox || inner[0].type === \"mathord\") {\n node = inner[0];\n node.type = \"mi\";\n if (node.children.length === 1 && node.children[0].text && node.children[0].text === \"∇\") {\n node.setAttribute(\"mathvariant\", \"normal\");\n }\n } else {\n node = new mathMLTree.MathNode(\"mi\", inner);\n }\n } else {\n node = new mathMLTree.MathNode(\"mrow\", inner);\n if (group.mustPromote) {\n node = inner[0];\n node.type = \"mo\";\n if (group.isCharacterBox && group.body[0].text && /[A-Za-z]/.test(group.body[0].text)) {\n node.setAttribute(\"mathvariant\", \"italic\");\n }\n } else {\n node = new mathMLTree.MathNode(\"mrow\", inner);\n }\n\n // Set spacing based on what is the most likely adjacent atom type.\n // See TeXbook p170.\n const doSpacing = style.level < 2; // Operator spacing is zero inside a (sub|super)script.\n if (node.type === \"mrow\") {\n if (doSpacing ) {\n if (group.mclass === \"mbin\") {\n // medium space\n node.children.unshift(padding$1(0.2222));\n node.children.push(padding$1(0.2222));\n } else if (group.mclass === \"mrel\") {\n // thickspace\n node.children.unshift(padding$1(0.2778));\n node.children.push(padding$1(0.2778));\n } else if (group.mclass === \"mpunct\") {\n node.children.push(padding$1(0.1667));\n } else if (group.mclass === \"minner\") {\n node.children.unshift(padding$1(0.0556)); // 1 mu is the most likely option\n node.children.push(padding$1(0.0556));\n }\n }\n } else {\n if (group.mclass === \"mbin\") {\n // medium space\n node.attributes.lspace = (doSpacing ? \"0.2222em\" : \"0\");\n node.attributes.rspace = (doSpacing ? \"0.2222em\" : \"0\");\n } else if (group.mclass === \"mrel\") {\n // thickspace\n node.attributes.lspace = (doSpacing ? \"0.2778em\" : \"0\");\n node.attributes.rspace = (doSpacing ? \"0.2778em\" : \"0\");\n } else if (group.mclass === \"mpunct\") {\n node.attributes.lspace = \"0em\";\n node.attributes.rspace = (doSpacing ? \"0.1667em\" : \"0\");\n } else if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n node.attributes.lspace = \"0em\";\n node.attributes.rspace = \"0em\";\n } else if (group.mclass === \"minner\" && doSpacing) {\n node.attributes.lspace = \"0.0556em\"; // 1 mu is the most likely option\n node.attributes.width = \"+0.1111em\";\n }\n }\n\n if (!(group.mclass === \"mopen\" || group.mclass === \"mclose\")) {\n delete node.attributes.stretchy;\n delete node.attributes.form;\n }\n }\n return node;\n}\n\n// Math class commands except \\mathop\ndefineFunction({\n type: \"mclass\",\n names: [\n \"\\\\mathord\",\n \"\\\\mathbin\",\n \"\\\\mathrel\",\n \"\\\\mathopen\",\n \"\\\\mathclose\",\n \"\\\\mathpunct\",\n \"\\\\mathinner\"\n ],\n props: {\n numArgs: 1,\n primitive: true\n },\n handler({ parser, funcName }, args) {\n const body = args[0];\n const isCharacterBox = utils.isCharacterBox(body);\n // We should not wrap a <mo> around a <mi> or <mord>. That would be invalid MathML.\n // In that case, we instead promote the text contents of the body to the parent.\n let mustPromote = true;\n const mord = { type: \"mathord\", text: \"\", mode: parser.mode };\n const arr = (body.body) ? body.body : [body];\n for (const arg of arr) {\n if (textAtomTypes.includes(arg.type)) {\n if (symbols[parser.mode][arg.text]) {\n mord.text += symbols[parser.mode][arg.text].replace;\n } else if (arg.text) {\n mord.text += arg.text;\n } else if (arg.body) {\n arg.body.map(e => { mord.text += e.text; });\n }\n } else {\n mustPromote = false;\n break\n }\n }\n if (mustPromote && funcName === \"\\\\mathord\" && mord.type === \"mathord\"\n && mord.text.length > 1) {\n return mord\n } else {\n return {\n type: \"mclass\",\n mode: parser.mode,\n mclass: \"m\" + funcName.slice(5),\n body: ordargument(mustPromote ? mord : body),\n isCharacterBox,\n mustPromote\n };\n }\n },\n mathmlBuilder: mathmlBuilder$3\n});\n\nconst binrelClass = (arg) => {\n // \\binrel@ spacing varies with (bin|rel|ord) of the atom in the argument.\n // (by rendering separately and with {}s before and after, and measuring\n // the change in spacing). We'll do roughly the same by detecting the\n // atom type directly.\n const atom = arg.type === \"ordgroup\" && arg.body.length ? arg.body[0] : arg;\n if (atom.type === \"atom\" && (atom.family === \"bin\" || atom.family === \"rel\")) {\n return \"m\" + atom.family;\n } else {\n return \"mord\";\n }\n};\n\n// \\@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord.\n// This is equivalent to \\binrel@{x}\\binrel@@{y} in AMSTeX.\ndefineFunction({\n type: \"mclass\",\n names: [\"\\\\@binrel\"],\n props: {\n numArgs: 2\n },\n handler({ parser }, args) {\n return {\n type: \"mclass\",\n mode: parser.mode,\n mclass: binrelClass(args[0]),\n body: ordargument(args[1]),\n isCharacterBox: utils.isCharacterBox(args[1])\n };\n }\n});\n\n// Build a relation or stacked op by placing one symbol on top of another\ndefineFunction({\n type: \"mclass\",\n names: [\"\\\\stackrel\", \"\\\\overset\", \"\\\\underset\"],\n props: {\n numArgs: 2\n },\n handler({ parser, funcName }, args) {\n const baseArg = args[1];\n const shiftedArg = args[0];\n\n const baseOp = {\n type: \"op\",\n mode: baseArg.mode,\n limits: true,\n alwaysHandleSupSub: true,\n parentIsSupSub: false,\n symbol: false,\n stack: true,\n suppressBaseShift: funcName !== \"\\\\stackrel\",\n body: ordargument(baseArg)\n };\n\n return {\n type: \"supsub\",\n mode: shiftedArg.mode,\n base: baseOp,\n sup: funcName === \"\\\\underset\" ? null : shiftedArg,\n sub: funcName === \"\\\\underset\" ? shiftedArg : null\n };\n },\n mathmlBuilder: mathmlBuilder$3\n});\n\n// Helper function\nconst buildGroup = (el, style, noneNode) => {\n if (!el) { return noneNode }\n const node = buildGroup$1(el, style);\n if (node.type === \"mrow\" && node.children.length === 0) { return noneNode }\n return node\n};\n\ndefineFunction({\n type: \"multiscript\",\n names: [\"\\\\sideset\", \"\\\\pres@cript\"], // See macros.js for \\prescript\n props: {\n numArgs: 3\n },\n handler({ parser, funcName, token }, args) {\n if (args[2].body.length === 0) {\n throw new ParseError(funcName + `cannot parse an empty base.`)\n }\n const base = args[2].body[0];\n if (parser.settings.strict && funcName === \"\\\\sideset\" && !base.symbol) {\n throw new ParseError(`The base of \\\\sideset must be a big operator. Try \\\\prescript.`)\n }\n\n if ((args[0].body.length > 0 && args[0].body[0].type !== \"supsub\") ||\n (args[1].body.length > 0 && args[1].body[0].type !== \"supsub\")) {\n throw new ParseError(\"\\\\sideset can parse only subscripts and \" +\n \"superscripts in its first two arguments\", token)\n }\n\n // The prescripts and postscripts come wrapped in a supsub.\n const prescripts = args[0].body.length > 0 ? args[0].body[0] : null;\n const postscripts = args[1].body.length > 0 ? args[1].body[0] : null;\n\n if (!prescripts && !postscripts) {\n return base\n } else if (!prescripts) {\n // It's not a multi-script. Get a \\textstyle supsub.\n return {\n type: \"styling\",\n mode: parser.mode,\n scriptLevel: \"text\",\n body: [{\n type: \"supsub\",\n mode: parser.mode,\n base,\n sup: postscripts.sup,\n sub: postscripts.sub\n }]\n }\n } else {\n return {\n type: \"multiscript\",\n mode: parser.mode,\n isSideset: funcName === \"\\\\sideset\",\n prescripts,\n postscripts,\n base\n }\n }\n },\n mathmlBuilder(group, style) {\n const base = buildGroup$1(group.base, style);\n\n const prescriptsNode = new mathMLTree.MathNode(\"mprescripts\");\n const noneNode = new mathMLTree.MathNode(\"none\");\n let children = [];\n\n const preSub = buildGroup(group.prescripts.sub, style, noneNode);\n const preSup = buildGroup(group.prescripts.sup, style, noneNode);\n if (group.isSideset) {\n // This seems silly, but LaTeX does this. Firefox ignores it, which does not make me sad.\n preSub.setAttribute(\"style\", \"text-align: left;\");\n preSup.setAttribute(\"style\", \"text-align: left;\");\n }\n\n if (group.postscripts) {\n const postSub = buildGroup(group.postscripts.sub, style, noneNode);\n const postSup = buildGroup(group.postscripts.sup, style, noneNode);\n children = [base, postSub, postSup, prescriptsNode, preSub, preSup];\n } else {\n children = [base, prescriptsNode, preSub, preSup];\n }\n\n return new mathMLTree.MathNode(\"mmultiscripts\", children);\n }\n});\n\ndefineFunction({\n type: \"not\",\n names: [\"\\\\not\"],\n props: {\n numArgs: 1,\n primitive: true,\n allowedInText: false\n },\n handler({ parser }, args) {\n const isCharacterBox = utils.isCharacterBox(args[0]);\n let body;\n if (isCharacterBox) {\n body = ordargument(args[0]);\n if (body[0].text.charAt(0) === \"\\\\\") {\n body[0].text = symbols.math[body[0].text].replace;\n }\n // \\u0338 is the Unicode Combining Long Solidus Overlay\n body[0].text = body[0].text.slice(0, 1) + \"\\u0338\" + body[0].text.slice(1);\n } else {\n // When the argument is not a character box, TeX does an awkward, poorly placed overlay.\n // We'll do the same.\n const notNode = { type: \"textord\", mode: \"math\", text: \"\\u0338\" };\n const kernNode = { type: \"kern\", mode: \"math\", dimension: { number: -0.6, unit: \"em\" } };\n body = [notNode, kernNode, args[0]];\n }\n return {\n type: \"not\",\n mode: parser.mode,\n body,\n isCharacterBox\n };\n },\n mathmlBuilder(group, style) {\n if (group.isCharacterBox) {\n const inner = buildExpression(group.body, style, true);\n return inner[0]\n } else {\n return buildExpressionRow(group.body, style)\n }\n }\n});\n\n// Limits, symbols\n\n// Some helpers\n\nconst ordAtomTypes = [\"textord\", \"mathord\", \"atom\"];\n\n// Most operators have a large successor symbol, but these don't.\nconst noSuccessor = [\"\\\\smallint\"];\n\n// Math operators (e.g. \\sin) need a space between these types and themselves:\nconst ordTypes = [\"textord\", \"mathord\", \"ordgroup\", \"close\", \"leftright\", \"font\"];\n\n// NOTE: Unlike most `builders`s, this one handles not only \"op\", but also\n// \"supsub\" since some of them (like \\int) can affect super/subscripting.\n\nconst setSpacing = node => {\n // The user wrote a \\mathop{…} function. Change spacing from default to OP spacing.\n // The most likely spacing for an OP is a thin space per TeXbook p170.\n node.attributes.lspace = \"0.1667em\";\n node.attributes.rspace = \"0.1667em\";\n};\n\nconst mathmlBuilder$2 = (group, style) => {\n let node;\n\n if (group.symbol) {\n // This is a symbol. Just add the symbol.\n node = new MathNode(\"mo\", [makeText(group.name, group.mode)]);\n if (noSuccessor.includes(group.name)) {\n node.setAttribute(\"largeop\", \"false\");\n } else {\n node.setAttribute(\"movablelimits\", \"false\");\n }\n if (group.fromMathOp) { setSpacing(node); }\n } else if (group.body) {\n // This is an operator with children. Add them.\n node = new MathNode(\"mo\", buildExpression(group.body, style));\n if (group.fromMathOp) { setSpacing(node); }\n } else {\n // This is a text operator. Add all of the characters from the operator's name.\n node = new MathNode(\"mi\", [new TextNode(group.name.slice(1))]);\n\n if (!group.parentIsSupSub) {\n // Append an invisible <mo>⁡</mo>.\n // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n const operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n const row = [node, operator];\n // Set spacing\n if (group.needsLeadingSpace) {\n const lead = new MathNode(\"mspace\");\n lead.setAttribute(\"width\", \"0.1667em\"); // thin space.\n row.unshift(lead);\n }\n if (!group.isFollowedByDelimiter) {\n const trail = new MathNode(\"mspace\");\n trail.setAttribute(\"width\", \"0.1667em\"); // thin space.\n row.push(trail);\n }\n node = new MathNode(\"mrow\", row);\n }\n }\n\n return node;\n};\n\nconst singleCharBigOps = {\n \"\\u220F\": \"\\\\prod\",\n \"\\u2210\": \"\\\\coprod\",\n \"\\u2211\": \"\\\\sum\",\n \"\\u22c0\": \"\\\\bigwedge\",\n \"\\u22c1\": \"\\\\bigvee\",\n \"\\u22c2\": \"\\\\bigcap\",\n \"\\u22c3\": \"\\\\bigcup\",\n \"\\u2a00\": \"\\\\bigodot\",\n \"\\u2a01\": \"\\\\bigoplus\",\n \"\\u2a02\": \"\\\\bigotimes\",\n \"\\u2a04\": \"\\\\biguplus\",\n \"\\u2a05\": \"\\\\bigsqcap\",\n \"\\u2a06\": \"\\\\bigsqcup\",\n \"\\u2a03\": \"\\\\bigcupdot\",\n \"\\u2a07\": \"\\\\bigdoublevee\",\n \"\\u2a08\": \"\\\\bigdoublewedge\",\n \"\\u2a09\": \"\\\\bigtimes\"\n};\n\ndefineFunction({\n type: \"op\",\n names: [\n \"\\\\coprod\",\n \"\\\\bigvee\",\n \"\\\\bigwedge\",\n \"\\\\biguplus\",\n \"\\\\bigcupplus\",\n \"\\\\bigcupdot\",\n \"\\\\bigcap\",\n \"\\\\bigcup\",\n \"\\\\bigdoublevee\",\n \"\\\\bigdoublewedge\",\n \"\\\\intop\",\n \"\\\\prod\",\n \"\\\\sum\",\n \"\\\\bigotimes\",\n \"\\\\bigoplus\",\n \"\\\\bigodot\",\n \"\\\\bigsqcap\",\n \"\\\\bigsqcup\",\n \"\\\\bigtimes\",\n \"\\\\smallint\",\n \"\\u220F\",\n \"\\u2210\",\n \"\\u2211\",\n \"\\u22c0\",\n \"\\u22c1\",\n \"\\u22c2\",\n \"\\u22c3\",\n \"\\u2a00\",\n \"\\u2a01\",\n \"\\u2a02\",\n \"\\u2a04\",\n \"\\u2a06\"\n ],\n props: {\n numArgs: 0\n },\n handler: ({ parser, funcName }, args) => {\n let fName = funcName;\n if (fName.length === 1) {\n fName = singleCharBigOps[fName];\n }\n return {\n type: \"op\",\n mode: parser.mode,\n limits: true,\n parentIsSupSub: false,\n symbol: true,\n stack: false, // This is true for \\stackrel{}, not here.\n name: fName\n };\n },\n mathmlBuilder: mathmlBuilder$2\n});\n\n// Note: calling defineFunction with a type that's already been defined only\n// works because the same mathmlBuilder is being used.\ndefineFunction({\n type: \"op\",\n names: [\"\\\\mathop\"],\n props: {\n numArgs: 1,\n primitive: true\n },\n handler: ({ parser }, args) => {\n const body = args[0];\n // It would be convienient to just wrap a <mo> around the argument.\n // But if the argument is a <mi> or <mord>, that would be invalid MathML.\n // In that case, we instead promote the text contents of the body to the parent.\n const arr = (body.body) ? body.body : [body];\n const isSymbol = arr.length === 1 && ordAtomTypes.includes(arr[0].type);\n return {\n type: \"op\",\n mode: parser.mode,\n limits: true,\n parentIsSupSub: false,\n symbol: isSymbol,\n fromMathOp: true,\n stack: false,\n name: isSymbol ? arr[0].text : null,\n body: isSymbol ? null : ordargument(body)\n };\n },\n mathmlBuilder: mathmlBuilder$2\n});\n\n// There are 2 flags for operators; whether they produce limits in\n// displaystyle, and whether they are symbols and should grow in\n// displaystyle. These four groups cover the four possible choices.\n\nconst singleCharIntegrals = {\n \"\\u222b\": \"\\\\int\",\n \"\\u222c\": \"\\\\iint\",\n \"\\u222d\": \"\\\\iiint\",\n \"\\u222e\": \"\\\\oint\",\n \"\\u222f\": \"\\\\oiint\",\n \"\\u2230\": \"\\\\oiiint\",\n \"\\u2231\": \"\\\\intclockwise\",\n \"\\u2232\": \"\\\\varointclockwise\",\n \"\\u2a0c\": \"\\\\iiiint\",\n \"\\u2a0d\": \"\\\\intbar\",\n \"\\u2a0e\": \"\\\\intBar\",\n \"\\u2a0f\": \"\\\\fint\",\n \"\\u2a12\": \"\\\\rppolint\",\n \"\\u2a13\": \"\\\\scpolint\",\n \"\\u2a15\": \"\\\\pointint\",\n \"\\u2a16\": \"\\\\sqint\",\n \"\\u2a17\": \"\\\\intlarhk\",\n \"\\u2a18\": \"\\\\intx\",\n \"\\u2a19\": \"\\\\intcap\",\n \"\\u2a1a\": \"\\\\intcup\"\n};\n\n// No limits, not symbols\ndefineFunction({\n type: \"op\",\n names: [\n \"\\\\arcsin\",\n \"\\\\arccos\",\n \"\\\\arctan\",\n \"\\\\arctg\",\n \"\\\\arcctg\",\n \"\\\\arg\",\n \"\\\\ch\",\n \"\\\\cos\",\n \"\\\\cosec\",\n \"\\\\cosh\",\n \"\\\\cot\",\n \"\\\\cotg\",\n \"\\\\coth\",\n \"\\\\csc\",\n \"\\\\ctg\",\n \"\\\\cth\",\n \"\\\\deg\",\n \"\\\\dim\",\n \"\\\\exp\",\n \"\\\\hom\",\n \"\\\\ker\",\n \"\\\\lg\",\n \"\\\\ln\",\n \"\\\\log\",\n \"\\\\sec\",\n \"\\\\sin\",\n \"\\\\sinh\",\n \"\\\\sh\",\n \"\\\\sgn\",\n \"\\\\tan\",\n \"\\\\tanh\",\n \"\\\\tg\",\n \"\\\\th\"\n ],\n props: {\n numArgs: 0\n },\n handler({ parser, funcName }) {\n const prevAtomType = parser.prevAtomType;\n const next = parser.gullet.future().text;\n return {\n type: \"op\",\n mode: parser.mode,\n limits: false,\n parentIsSupSub: false,\n symbol: false,\n stack: false,\n isFollowedByDelimiter: isDelimiter(next),\n needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType),\n name: funcName\n };\n },\n mathmlBuilder: mathmlBuilder$2\n});\n\n// Limits, not symbols\ndefineFunction({\n type: \"op\",\n names: [\"\\\\det\", \"\\\\gcd\", \"\\\\inf\", \"\\\\lim\", \"\\\\max\", \"\\\\min\", \"\\\\Pr\", \"\\\\sup\"],\n props: {\n numArgs: 0\n },\n handler({ parser, funcName }) {\n const prevAtomType = parser.prevAtomType;\n const next = parser.gullet.future().text;\n return {\n type: \"op\",\n mode: parser.mode,\n limits: true,\n parentIsSupSub: false,\n symbol: false,\n stack: false,\n isFollowedByDelimiter: isDelimiter(next),\n needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType),\n name: funcName\n };\n },\n mathmlBuilder: mathmlBuilder$2\n});\n\n// No limits, symbols\ndefineFunction({\n type: \"op\",\n names: [\n \"\\\\int\",\n \"\\\\iint\",\n \"\\\\iiint\",\n \"\\\\iiiint\",\n \"\\\\oint\",\n \"\\\\oiint\",\n \"\\\\oiiint\",\n \"\\\\intclockwise\",\n \"\\\\varointclockwise\",\n \"\\\\intbar\",\n \"\\\\intBar\",\n \"\\\\fint\",\n \"\\\\rppolint\",\n \"\\\\scpolint\",\n \"\\\\pointint\",\n \"\\\\sqint\",\n \"\\\\intlarhk\",\n \"\\\\intx\",\n \"\\\\intcap\",\n \"\\\\intcup\",\n \"\\u222b\",\n \"\\u222c\",\n \"\\u222d\",\n \"\\u222e\",\n \"\\u222f\",\n \"\\u2230\",\n \"\\u2231\",\n \"\\u2232\",\n \"\\u2a0c\",\n \"\\u2a0d\",\n \"\\u2a0e\",\n \"\\u2a0f\",\n \"\\u2a12\",\n \"\\u2a13\",\n \"\\u2a15\",\n \"\\u2a16\",\n \"\\u2a17\",\n \"\\u2a18\",\n \"\\u2a19\",\n \"\\u2a1a\"\n ],\n props: {\n numArgs: 0\n },\n handler({ parser, funcName }) {\n let fName = funcName;\n if (fName.length === 1) {\n fName = singleCharIntegrals[fName];\n }\n return {\n type: \"op\",\n mode: parser.mode,\n limits: false,\n parentIsSupSub: false,\n symbol: true,\n stack: false,\n name: fName\n };\n },\n mathmlBuilder: mathmlBuilder$2\n});\n\n// NOTE: Unlike most builders, this one handles not only\n// \"operatorname\", but also \"supsub\" since \\operatorname* can\n// affect super/subscripting.\n\nconst mathmlBuilder$1 = (group, style) => {\n let expression = buildExpression(group.body, style.withFont(\"mathrm\"));\n\n // Is expression a string or has it something like a fraction?\n let isAllString = true; // default\n for (let i = 0; i < expression.length; i++) {\n let node = expression[i];\n if (node instanceof mathMLTree.MathNode) {\n if ((node.type === \"mrow\" || node.type === \"mpadded\") && node.children.length === 1 &&\n node.children[0] instanceof mathMLTree.MathNode) {\n node = node.children[0];\n }\n switch (node.type) {\n case \"mi\":\n case \"mn\":\n case \"ms\":\n case \"mtext\":\n break; // Do nothing yet.\n case \"mspace\":\n {\n if (node.attributes.width) {\n const width = node.attributes.width.replace(\"em\", \"\");\n const ch = spaceCharacter(Number(width));\n if (ch === \"\") {\n isAllString = false;\n } else {\n expression[i] = new mathMLTree.MathNode(\"mtext\", [new mathMLTree.TextNode(ch)]);\n }\n }\n }\n break\n case \"mo\": {\n const child = node.children[0];\n if (node.children.length === 1 && child instanceof mathMLTree.TextNode) {\n child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n } else {\n isAllString = false;\n }\n break\n }\n default:\n isAllString = false;\n }\n } else {\n isAllString = false;\n }\n }\n\n if (isAllString) {\n // Write a single TextNode instead of multiple nested tags.\n const word = expression.map((node) => node.toText()).join(\"\");\n expression = [new mathMLTree.TextNode(word)];\n } else if (\n expression.length === 1\n && [\"mover\", \"munder\"].includes(expression[0].type) &&\n (expression[0].children[0].type === \"mi\" || expression[0].children[0].type === \"mtext\")\n ) {\n expression[0].children[0].type = \"mi\";\n if (group.parentIsSupSub) {\n return new mathMLTree.MathNode(\"mrow\", expression)\n } else {\n const operator = new mathMLTree.MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n return mathMLTree.newDocumentFragment([expression[0], operator])\n }\n }\n\n let wrapper;\n if (isAllString) {\n wrapper = new mathMLTree.MathNode(\"mi\", expression);\n if (expression[0].text.length === 1) {\n wrapper.setAttribute(\"mathvariant\", \"normal\");\n }\n } else {\n wrapper = new mathMLTree.MathNode(\"mrow\", expression);\n }\n\n if (!group.parentIsSupSub) {\n // Append an <mo>⁡</mo>.\n // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n const operator = new mathMLTree.MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n const fragment = [wrapper, operator];\n if (group.needsLeadingSpace) {\n // LaTeX gives operator spacing, but a <mi> gets ord spacing.\n // So add a leading space.\n const space = new mathMLTree.MathNode(\"mspace\");\n space.setAttribute(\"width\", \"0.1667em\"); // thin space.\n fragment.unshift(space);\n }\n if (!group.isFollowedByDelimiter) {\n const trail = new mathMLTree.MathNode(\"mspace\");\n trail.setAttribute(\"width\", \"0.1667em\"); // thin space.\n fragment.push(trail);\n }\n return mathMLTree.newDocumentFragment(fragment)\n }\n\n return wrapper\n};\n\n// \\operatorname\n// amsopn.dtx: \\mathop{#1\\kern\\z@\\operator@font#3}\\newmcodes@\ndefineFunction({\n type: \"operatorname\",\n names: [\"\\\\operatorname@\", \"\\\\operatornamewithlimits\"],\n props: {\n numArgs: 1,\n allowedInArgument: true\n },\n handler: ({ parser, funcName }, args) => {\n const body = args[0];\n const prevAtomType = parser.prevAtomType;\n const next = parser.gullet.future().text;\n return {\n type: \"operatorname\",\n mode: parser.mode,\n body: ordargument(body),\n alwaysHandleSupSub: (funcName === \"\\\\operatornamewithlimits\"),\n limits: false,\n parentIsSupSub: false,\n isFollowedByDelimiter: isDelimiter(next),\n needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType)\n };\n },\n mathmlBuilder: mathmlBuilder$1\n});\n\ndefineMacro(\"\\\\operatorname\",\n \"\\\\@ifstar\\\\operatornamewithlimits\\\\operatorname@\");\n\ndefineFunctionBuilders({\n type: \"ordgroup\",\n mathmlBuilder(group, style) {\n return buildExpressionRow(group.body, style, group.semisimple);\n }\n});\n\ndefineFunction({\n type: \"phantom\",\n names: [\"\\\\phantom\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: ({ parser }, args) => {\n const body = args[0];\n return {\n type: \"phantom\",\n mode: parser.mode,\n body: ordargument(body)\n };\n },\n mathmlBuilder: (group, style) => {\n const inner = buildExpression(group.body, style);\n return new mathMLTree.MathNode(\"mphantom\", inner);\n }\n});\n\ndefineFunction({\n type: \"hphantom\",\n names: [\"\\\\hphantom\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: ({ parser }, args) => {\n const body = args[0];\n return {\n type: \"hphantom\",\n mode: parser.mode,\n body\n };\n },\n mathmlBuilder: (group, style) => {\n const inner = buildExpression(ordargument(group.body), style);\n const phantom = new mathMLTree.MathNode(\"mphantom\", inner);\n const node = new mathMLTree.MathNode(\"mpadded\", [phantom]);\n node.setAttribute(\"height\", \"0px\");\n node.setAttribute(\"depth\", \"0px\");\n return node;\n }\n});\n\ndefineFunction({\n type: \"vphantom\",\n names: [\"\\\\vphantom\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: ({ parser }, args) => {\n const body = args[0];\n return {\n type: \"vphantom\",\n mode: parser.mode,\n body\n };\n },\n mathmlBuilder: (group, style) => {\n const inner = buildExpression(ordargument(group.body), style);\n const phantom = new mathMLTree.MathNode(\"mphantom\", inner);\n const node = new mathMLTree.MathNode(\"mpadded\", [phantom]);\n node.setAttribute(\"width\", \"0px\");\n return node;\n }\n});\n\n// In LaTeX, \\pmb is a simulation of bold font.\n// The version of \\pmb in ambsy.sty works by typesetting three copies of the argument\n// with small offsets. We use CSS font-weight:bold.\n\ndefineFunction({\n type: \"pmb\",\n names: [\"\\\\pmb\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler({ parser }, args) {\n return {\n type: \"pmb\",\n mode: parser.mode,\n body: ordargument(args[0])\n }\n },\n mathmlBuilder(group, style) {\n const inner = buildExpression(group.body, style);\n // Wrap with an <mstyle> element.\n const node = wrapWithMstyle(inner);\n node.setAttribute(\"style\", \"font-weight:bold\");\n return node\n }\n});\n\n// \\raise, \\lower, and \\raisebox\n\nconst mathmlBuilder = (group, style) => {\n const newStyle = style.withLevel(StyleLevel.TEXT);\n const node = new mathMLTree.MathNode(\"mpadded\", [buildGroup$1(group.body, newStyle)]);\n const dy = calculateSize(group.dy, style);\n node.setAttribute(\"voffset\", dy.number + dy.unit);\n // Add padding, which acts to increase height in Chromium.\n // TODO: Figure out some way to change height in Firefox w/o breaking Chromium.\n if (dy.number > 0) {\n node.style.padding = dy.number + dy.unit + \" 0 0 0\";\n } else {\n node.style.padding = \"0 0 \" + Math.abs(dy.number) + dy.unit + \" 0\";\n }\n return node\n};\n\ndefineFunction({\n type: \"raise\",\n names: [\"\\\\raise\", \"\\\\lower\"],\n props: {\n numArgs: 2,\n argTypes: [\"size\", \"primitive\"],\n primitive: true\n },\n handler({ parser, funcName }, args) {\n const amount = assertNodeType(args[0], \"size\").value;\n if (funcName === \"\\\\lower\") { amount.number *= -1; }\n const body = args[1];\n return {\n type: \"raise\",\n mode: parser.mode,\n dy: amount,\n body\n };\n },\n mathmlBuilder\n});\n\n\ndefineFunction({\n type: \"raise\",\n names: [\"\\\\raisebox\"],\n props: {\n numArgs: 2,\n argTypes: [\"size\", \"hbox\"],\n allowedInText: true\n },\n handler({ parser, funcName }, args) {\n const amount = assertNodeType(args[0], \"size\").value;\n const body = args[1];\n return {\n type: \"raise\",\n mode: parser.mode,\n dy: amount,\n body\n };\n },\n mathmlBuilder\n});\n\ndefineFunction({\n type: \"ref\",\n names: [\"\\\\ref\", \"\\\\eqref\"],\n props: {\n numArgs: 1,\n argTypes: [\"raw\"]\n },\n handler({ parser, funcName }, args) {\n return {\n type: \"ref\",\n mode: parser.mode,\n funcName,\n string: args[0].string.replace(invalidIdRegEx, \"\")\n };\n },\n mathmlBuilder(group, style) {\n // Create an empty <a> node. Set a class and an href attribute.\n // The post-processor will populate with the target's tag or equation number.\n const classes = group.funcName === \"\\\\ref\" ? [\"tml-ref\"] : [\"tml-ref\", \"tml-eqref\"];\n return new AnchorNode(\"#\" + group.string, classes, null)\n }\n});\n\ndefineFunction({\n type: \"reflect\",\n names: [\"\\\\reflectbox\"],\n props: {\n numArgs: 1,\n argTypes: [\"hbox\"],\n allowedInText: true\n },\n handler({ parser }, args) {\n return {\n type: \"reflect\",\n mode: parser.mode,\n body: args[0]\n };\n },\n mathmlBuilder(group, style) {\n const node = buildGroup$1(group.body, style);\n node.style.transform = \"scaleX(-1)\";\n return node\n }\n});\n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\relax\"],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler({ parser }) {\n return {\n type: \"internal\",\n mode: parser.mode\n };\n }\n});\n\ndefineFunction({\n type: \"rule\",\n names: [\"\\\\rule\"],\n props: {\n numArgs: 2,\n numOptionalArgs: 1,\n allowedInText: true,\n allowedInMath: true,\n argTypes: [\"size\", \"size\", \"size\"]\n },\n handler({ parser }, args, optArgs) {\n const shift = optArgs[0];\n const width = assertNodeType(args[0], \"size\");\n const height = assertNodeType(args[1], \"size\");\n return {\n type: \"rule\",\n mode: parser.mode,\n shift: shift && assertNodeType(shift, \"size\").value,\n width: width.value,\n height: height.value\n };\n },\n mathmlBuilder(group, style) {\n const width = calculateSize(group.width, style);\n const height = calculateSize(group.height, style);\n const shift = group.shift\n ? calculateSize(group.shift, style)\n : { number: 0, unit: \"em\" };\n const color = (style.color && style.getColor()) || \"black\";\n\n const rule = new mathMLTree.MathNode(\"mspace\");\n if (width.number > 0 && height.number > 0) {\n rule.setAttribute(\"mathbackground\", color);\n }\n rule.setAttribute(\"width\", width.number + width.unit);\n rule.setAttribute(\"height\", height.number + height.unit);\n if (shift.number === 0) { return rule }\n\n const wrapper = new mathMLTree.MathNode(\"mpadded\", [rule]);\n if (shift.number >= 0) {\n wrapper.setAttribute(\"height\", \"+\" + shift.number + shift.unit);\n } else {\n wrapper.setAttribute(\"height\", shift.number + shift.unit);\n wrapper.setAttribute(\"depth\", \"+\" + -shift.number + shift.unit);\n }\n wrapper.setAttribute(\"voffset\", shift.number + shift.unit);\n return wrapper;\n }\n});\n\n// The size mappings are taken from TeX with \\normalsize=10pt.\n// We don't have to track script level. MathML does that.\nconst sizeMap = {\n \"\\\\tiny\": 0.5,\n \"\\\\sixptsize\": 0.6,\n \"\\\\Tiny\": 0.6,\n \"\\\\scriptsize\": 0.7,\n \"\\\\footnotesize\": 0.8,\n \"\\\\small\": 0.9,\n \"\\\\normalsize\": 1.0,\n \"\\\\large\": 1.2,\n \"\\\\Large\": 1.44,\n \"\\\\LARGE\": 1.728,\n \"\\\\huge\": 2.074,\n \"\\\\Huge\": 2.488\n};\n\ndefineFunction({\n type: \"sizing\",\n names: [\n \"\\\\tiny\",\n \"\\\\sixptsize\",\n \"\\\\Tiny\",\n \"\\\\scriptsize\",\n \"\\\\footnotesize\",\n \"\\\\small\",\n \"\\\\normalsize\",\n \"\\\\large\",\n \"\\\\Large\",\n \"\\\\LARGE\",\n \"\\\\huge\",\n \"\\\\Huge\"\n ],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler: ({ breakOnTokenText, funcName, parser }, args) => {\n if (parser.settings.strict && parser.mode === \"math\") {\n // eslint-disable-next-line no-console\n console.log(`Temml strict-mode warning: Command ${funcName} is invalid in math mode.`);\n }\n const body = parser.parseExpression(false, breakOnTokenText, true);\n return {\n type: \"sizing\",\n mode: parser.mode,\n funcName,\n body\n };\n },\n mathmlBuilder: (group, style) => {\n const newStyle = style.withFontSize(sizeMap[group.funcName]);\n const inner = buildExpression(group.body, newStyle);\n // Wrap with an <mstyle> element.\n const node = wrapWithMstyle(inner);\n const factor = (sizeMap[group.funcName] / style.fontSize).toFixed(4);\n node.setAttribute(\"mathsize\", factor + \"em\");\n return node;\n }\n});\n\n// smash, with optional [tb], as in AMS\n\ndefineFunction({\n type: \"smash\",\n names: [\"\\\\smash\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1,\n allowedInText: true\n },\n handler: ({ parser }, args, optArgs) => {\n let smashHeight = false;\n let smashDepth = false;\n const tbArg = optArgs[0] && assertNodeType(optArgs[0], \"ordgroup\");\n if (tbArg) {\n // Optional [tb] argument is engaged.\n // ref: amsmath: \\renewcommand{\\smash}[1][tb]{%\n // def\\mb@t{\\ht}\\def\\mb@b{\\dp}\\def\\mb@tb{\\ht\\z@\\z@\\dp}%\n let letter = \"\";\n for (let i = 0; i < tbArg.body.length; ++i) {\n const node = tbArg.body[i];\n // TODO: Write an AssertSymbolNode\n letter = node.text;\n if (letter === \"t\") {\n smashHeight = true;\n } else if (letter === \"b\") {\n smashDepth = true;\n } else {\n smashHeight = false;\n smashDepth = false;\n break;\n }\n }\n } else {\n smashHeight = true;\n smashDepth = true;\n }\n\n const body = args[0];\n return {\n type: \"smash\",\n mode: parser.mode,\n body,\n smashHeight,\n smashDepth\n };\n },\n mathmlBuilder: (group, style) => {\n const node = new mathMLTree.MathNode(\"mpadded\", [buildGroup$1(group.body, style)]);\n\n if (group.smashHeight) {\n node.setAttribute(\"height\", \"0px\");\n }\n\n if (group.smashDepth) {\n node.setAttribute(\"depth\", \"0px\");\n }\n\n return node;\n }\n});\n\ndefineFunction({\n type: \"sqrt\",\n names: [\"\\\\sqrt\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1\n },\n handler({ parser }, args, optArgs) {\n const index = optArgs[0];\n const body = args[0];\n return {\n type: \"sqrt\",\n mode: parser.mode,\n body,\n index\n };\n },\n mathmlBuilder(group, style) {\n const { body, index } = group;\n return index\n ? new mathMLTree.MathNode(\"mroot\", [\n buildGroup$1(body, style),\n buildGroup$1(index, style.incrementLevel())\n ])\n : new mathMLTree.MathNode(\"msqrt\", [buildGroup$1(body, style)]);\n }\n});\n\nconst styleMap = {\n display: 0,\n text: 1,\n script: 2,\n scriptscript: 3\n};\n\nconst styleAttributes = {\n display: [\"0\", \"true\"],\n text: [\"0\", \"false\"],\n script: [\"1\", \"false\"],\n scriptscript: [\"2\", \"false\"]\n};\n\ndefineFunction({\n type: \"styling\",\n names: [\"\\\\displaystyle\", \"\\\\textstyle\", \"\\\\scriptstyle\", \"\\\\scriptscriptstyle\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler({ breakOnTokenText, funcName, parser }, args) {\n // parse out the implicit body\n const body = parser.parseExpression(true, breakOnTokenText, true);\n\n const scriptLevel = funcName.slice(1, funcName.length - 5);\n return {\n type: \"styling\",\n mode: parser.mode,\n // Figure out what scriptLevel to use by pulling out the scriptLevel from\n // the function name\n scriptLevel,\n body\n };\n },\n mathmlBuilder(group, style) {\n // Figure out what scriptLevel we're changing to.\n const newStyle = style.withLevel(styleMap[group.scriptLevel]);\n // The style argument in the next line does NOT directly set a MathML script level.\n // It just tracks the style level, in case we need to know it for supsub or mathchoice.\n const inner = buildExpression(group.body, newStyle);\n // Wrap with an <mstyle> element.\n const node = wrapWithMstyle(inner);\n\n const attr = styleAttributes[group.scriptLevel];\n\n // Here is where we set the MathML script level.\n node.setAttribute(\"scriptlevel\", attr[0]);\n node.setAttribute(\"displaystyle\", attr[1]);\n\n return node;\n }\n});\n\n/**\n * Sometimes, groups perform special rules when they have superscripts or\n * subscripts attached to them. This function lets the `supsub` group know that\n * Sometimes, groups perform special rules when they have superscripts or\n * its inner element should handle the superscripts and subscripts instead of\n * handling them itself.\n */\n\n// Helpers\nconst symbolRegEx = /^m(over|under|underover)$/;\n\n// Super scripts and subscripts, whose precise placement can depend on other\n// functions that precede them.\ndefineFunctionBuilders({\n type: \"supsub\",\n mathmlBuilder(group, style) {\n // Is the inner group a relevant horizontal brace?\n let isBrace = false;\n let isOver;\n let isSup;\n let appendApplyFunction = false;\n let appendSpace = false;\n let needsLeadingSpace = false;\n\n if (group.base && group.base.type === \"horizBrace\") {\n isSup = !!group.sup;\n if (isSup === group.base.isOver) {\n isBrace = true;\n isOver = group.base.isOver;\n }\n }\n\n if (group.base && !group.base.stack &&\n (group.base.type === \"op\" || group.base.type === \"operatorname\")) {\n group.base.parentIsSupSub = true;\n appendApplyFunction = !group.base.symbol;\n appendSpace = appendApplyFunction && !group.isFollowedByDelimiter;\n needsLeadingSpace = group.base.needsLeadingSpace;\n }\n\n const children = group.base && group.base.stack\n ? [buildGroup$1(group.base.body[0], style)]\n : [buildGroup$1(group.base, style)];\n\n // Note regarding scriptstyle level.\n // (Sub|super)scripts should not shrink beyond MathML scriptlevel 2 aka \\scriptscriptstyle\n // Ref: https://w3c.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes\n // (BTW, MathML scriptlevel 2 is equal to Temml level 3.)\n // But Chromium continues to shrink the (sub|super)scripts. So we explicitly set scriptlevel 2.\n\n const childStyle = style.inSubOrSup();\n if (group.sub) {\n const sub = buildGroup$1(group.sub, childStyle);\n if (style.level === 3) { sub.setAttribute(\"scriptlevel\", \"2\"); }\n children.push(sub);\n }\n\n if (group.sup) {\n const sup = buildGroup$1(group.sup, childStyle);\n if (style.level === 3) { sup.setAttribute(\"scriptlevel\", \"2\"); }\n const testNode = sup.type === \"mrow\" ? sup.children[0] : sup;\n if ((testNode && testNode.type === \"mo\" && testNode.classes.includes(\"tml-prime\"))\n && group.base && group.base.text && \"fF\".indexOf(group.base.text) > -1) {\n // Chromium does not address italic correction on prime. Prevent f′ from overlapping.\n testNode.classes.push(\"prime-pad\");\n }\n children.push(sup);\n }\n\n let nodeType;\n if (isBrace) {\n nodeType = isOver ? \"mover\" : \"munder\";\n } else if (!group.sub) {\n const base = group.base;\n if (\n base &&\n base.type === \"op\" &&\n base.limits &&\n (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub)\n ) {\n nodeType = \"mover\";\n } else if (\n base &&\n base.type === \"operatorname\" &&\n base.alwaysHandleSupSub &&\n (base.limits || style.level === StyleLevel.DISPLAY)\n ) {\n nodeType = \"mover\";\n } else {\n nodeType = \"msup\";\n }\n } else if (!group.sup) {\n const base = group.base;\n if (\n base &&\n base.type === \"op\" &&\n base.limits &&\n (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub)\n ) {\n nodeType = \"munder\";\n } else if (\n base &&\n base.type === \"operatorname\" &&\n base.alwaysHandleSupSub &&\n (base.limits || style.level === StyleLevel.DISPLAY)\n ) {\n nodeType = \"munder\";\n } else {\n nodeType = \"msub\";\n }\n } else {\n const base = group.base;\n if (base && ((base.type === \"op\" && base.limits) || base.type === \"multiscript\") &&\n (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub)\n ) {\n nodeType = \"munderover\";\n } else if (\n base &&\n base.type === \"operatorname\" &&\n base.alwaysHandleSupSub &&\n (style.level === StyleLevel.DISPLAY || base.limits)\n ) {\n nodeType = \"munderover\";\n } else {\n nodeType = \"msubsup\";\n }\n }\n\n let node = new mathMLTree.MathNode(nodeType, children);\n if (appendApplyFunction) {\n // Append an <mo>⁡</mo>.\n // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n const operator = new mathMLTree.MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n if (needsLeadingSpace) {\n const space = new mathMLTree.MathNode(\"mspace\");\n space.setAttribute(\"width\", \"0.1667em\"); // thin space.\n node = mathMLTree.newDocumentFragment([space, node, operator]);\n } else {\n node = mathMLTree.newDocumentFragment([node, operator]);\n }\n if (appendSpace) {\n const space = new mathMLTree.MathNode(\"mspace\");\n space.setAttribute(\"width\", \"0.1667em\"); // thin space.\n node.children.push(space);\n }\n } else if (symbolRegEx.test(nodeType)) {\n // Wrap in a <mrow>. Otherwise Firefox stretchy parens will not stretch to include limits.\n node = new mathMLTree.MathNode(\"mrow\", [node]);\n }\n\n return node\n }\n});\n\n// Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js.\n\nconst short = [\"\\\\shortmid\", \"\\\\nshortmid\", \"\\\\shortparallel\",\n \"\\\\nshortparallel\", \"\\\\smallsetminus\"];\n\nconst arrows = [\"\\\\Rsh\", \"\\\\Lsh\", \"\\\\restriction\"];\n\nconst isArrow = str => {\n if (str.length === 1) {\n const codePoint = str.codePointAt(0);\n return (0x218f < codePoint && codePoint < 0x2200)\n }\n return str.indexOf(\"arrow\") > -1 || str.indexOf(\"harpoon\") > -1 || arrows.includes(str)\n};\n\ndefineFunctionBuilders({\n type: \"atom\",\n mathmlBuilder(group, style) {\n const node = new mathMLTree.MathNode(\"mo\", [makeText(group.text, group.mode)]);\n if (group.family === \"punct\") {\n node.setAttribute(\"separator\", \"true\");\n } else if (group.family === \"open\" || group.family === \"close\") {\n // Delims built here should not stretch vertically.\n // See delimsizing.js for stretchy delims.\n if (group.family === \"open\") {\n node.setAttribute(\"form\", \"prefix\");\n // Set an explicit attribute for stretch. Otherwise Firefox may do it wrong.\n node.setAttribute(\"stretchy\", \"false\");\n } else if (group.family === \"close\") {\n node.setAttribute(\"form\", \"postfix\");\n node.setAttribute(\"stretchy\", \"false\");\n }\n } else if (group.text === \"\\\\mid\") {\n // Firefox messes up this spacing if at the end of an <mrow>. See it explicitly.\n node.setAttribute(\"lspace\", \"0.22em\"); // medium space\n node.setAttribute(\"rspace\", \"0.22em\");\n node.setAttribute(\"stretchy\", \"false\");\n } else if (group.family === \"rel\" && isArrow(group.text)) {\n node.setAttribute(\"stretchy\", \"false\");\n } else if (short.includes(group.text)) {\n node.setAttribute(\"mathsize\", \"70%\");\n } else if (group.text === \":\") {\n // \":\" is not in the MathML operator dictionary. Give it BIN spacing.\n node.attributes.lspace = \"0.2222em\";\n node.attributes.rspace = \"0.2222em\";\n } else if (group.needsSpacing) {\n // Fix a MathML bug that occurs when a <mo> is between two <mtext> elements.\n if (group.family === \"bin\") {\n return new mathMLTree.MathNode(\"mrow\", [padding$1(0.222), node, padding$1(0.222)])\n } else {\n // REL spacing\n return new mathMLTree.MathNode(\"mrow\", [padding$1(0.2778), node, padding$1(0.2778)])\n }\n }\n return node;\n }\n});\n\n/**\n * Maps TeX font commands to \"mathvariant\" attribute in buildMathML.js\n */\nconst fontMap = {\n // styles\n mathbf: \"bold\",\n mathrm: \"normal\",\n textit: \"italic\",\n mathit: \"italic\",\n mathnormal: \"italic\",\n\n // families\n mathbb: \"double-struck\",\n mathcal: \"script\",\n mathfrak: \"fraktur\",\n mathscr: \"script\",\n mathsf: \"sans-serif\",\n mathtt: \"monospace\"\n};\n\n/**\n * Returns the math variant as a string or null if none is required.\n */\nconst getVariant = function(group, style) {\n // Handle font specifiers as best we can.\n // Chromium does not support the MathML mathvariant attribute.\n // So we'll use Unicode replacement characters instead.\n // But first, determine the math variant.\n\n // Deal with the \\textit, \\textbf, etc., functions.\n if (style.fontFamily === \"texttt\") {\n return \"monospace\"\n } else if (style.fontFamily === \"textsc\") {\n return \"normal\"; // handled via character substitution in symbolsOrd.js.\n } else if (style.fontFamily === \"textsf\") {\n if (style.fontShape === \"textit\" && style.fontWeight === \"textbf\") {\n return \"sans-serif-bold-italic\"\n } else if (style.fontShape === \"textit\") {\n return \"sans-serif-italic\"\n } else if (style.fontWeight === \"textbf\") {\n return \"sans-serif-bold\"\n } else {\n return \"sans-serif\"\n }\n } else if (style.fontShape === \"textit\" && style.fontWeight === \"textbf\") {\n return \"bold-italic\"\n } else if (style.fontShape === \"textit\") {\n return \"italic\"\n } else if (style.fontWeight === \"textbf\") {\n return \"bold\"\n }\n\n // Deal with the \\mathit, mathbf, etc, functions.\n const font = style.font;\n if (!font || font === \"mathnormal\") {\n return null\n }\n\n const mode = group.mode;\n switch (font) {\n case \"mathit\":\n return \"italic\"\n case \"mathrm\": {\n const codePoint = group.text.codePointAt(0);\n // LaTeX \\mathrm returns italic for Greek characters.\n return (0x03ab < codePoint && codePoint < 0x03cf) ? \"italic\" : \"normal\"\n }\n case \"greekItalic\":\n return \"italic\"\n case \"up@greek\":\n return \"normal\"\n case \"boldsymbol\":\n case \"mathboldsymbol\":\n return \"bold-italic\"\n case \"mathbf\":\n return \"bold\"\n case \"mathbb\":\n return \"double-struck\"\n case \"mathfrak\":\n return \"fraktur\"\n case \"mathscr\":\n case \"mathcal\":\n return \"script\"\n case \"mathsf\":\n return \"sans-serif\"\n case \"mathsfit\":\n return \"sans-serif-italic\"\n case \"mathtt\":\n return \"monospace\"\n }\n\n let text = group.text;\n if (symbols[mode][text] && symbols[mode][text].replace) {\n text = symbols[mode][text].replace;\n }\n\n return Object.prototype.hasOwnProperty.call(fontMap, font) ? fontMap[font] : null\n};\n\n// Chromium does not support the MathML `mathvariant` attribute.\n// Instead, we replace ASCII characters with Unicode characters that\n// are defined in the font as bold, italic, double-struck, etc.\n// This module identifies those Unicode code points.\n\n// First, a few helpers.\nconst script = Object.freeze({\n B: 0x20EA, // Offset from ASCII B to Unicode script B\n E: 0x20EB,\n F: 0x20EB,\n H: 0x20C3,\n I: 0x20C7,\n L: 0x20C6,\n M: 0x20E6,\n R: 0x20C9,\n e: 0x20CA,\n g: 0x20A3,\n o: 0x20C5\n});\n\nconst frak = Object.freeze({\n C: 0x20EA,\n H: 0x20C4,\n I: 0x20C8,\n R: 0x20CA,\n Z: 0x20CE\n});\n\nconst bbb = Object.freeze({\n C: 0x20BF, // blackboard bold\n H: 0x20C5,\n N: 0x20C7,\n P: 0x20C9,\n Q: 0x20C9,\n R: 0x20CB,\n Z: 0x20CA\n});\n\nconst bold = Object.freeze({\n \"\\u03f5\": 0x1D2E7, // lunate epsilon\n \"\\u03d1\": 0x1D30C, // vartheta\n \"\\u03f0\": 0x1D2EE, // varkappa\n \"\\u03c6\": 0x1D319, // varphi\n \"\\u03f1\": 0x1D2EF, // varrho\n \"\\u03d6\": 0x1D30B // varpi\n});\n\nconst boldItalic = Object.freeze({\n \"\\u03f5\": 0x1D35B, // lunate epsilon\n \"\\u03d1\": 0x1D380, // vartheta\n \"\\u03f0\": 0x1D362, // varkappa\n \"\\u03c6\": 0x1D38D, // varphi\n \"\\u03f1\": 0x1D363, // varrho\n \"\\u03d6\": 0x1D37F // varpi\n});\n\nconst boldsf = Object.freeze({\n \"\\u03f5\": 0x1D395, // lunate epsilon\n \"\\u03d1\": 0x1D3BA, // vartheta\n \"\\u03f0\": 0x1D39C, // varkappa\n \"\\u03c6\": 0x1D3C7, // varphi\n \"\\u03f1\": 0x1D39D, // varrho\n \"\\u03d6\": 0x1D3B9 // varpi\n});\n\nconst bisf = Object.freeze({\n \"\\u03f5\": 0x1D3CF, // lunate epsilon\n \"\\u03d1\": 0x1D3F4, // vartheta\n \"\\u03f0\": 0x1D3D6, // varkappa\n \"\\u03c6\": 0x1D401, // varphi\n \"\\u03f1\": 0x1D3D7, // varrho\n \"\\u03d6\": 0x1D3F3 // varpi\n});\n\n// Code point offsets below are derived from https://www.unicode.org/charts/PDF/U1D400.pdf\nconst offset = Object.freeze({\n upperCaseLatin: { // A-Z\n \"normal\": ch => { return 0 },\n \"bold\": ch => { return 0x1D3BF },\n \"italic\": ch => { return 0x1D3F3 },\n \"bold-italic\": ch => { return 0x1D427 },\n \"script\": ch => { return script[ch] || 0x1D45B },\n \"script-bold\": ch => { return 0x1D48F },\n \"fraktur\": ch => { return frak[ch] || 0x1D4C3 },\n \"fraktur-bold\": ch => { return 0x1D52B },\n \"double-struck\": ch => { return bbb[ch] || 0x1D4F7 },\n \"sans-serif\": ch => { return 0x1D55F },\n \"sans-serif-bold\": ch => { return 0x1D593 },\n \"sans-serif-italic\": ch => { return 0x1D5C7 },\n \"sans-serif-bold-italic\": ch => { return 0x1D63C },\n \"monospace\": ch => { return 0x1D62F }\n },\n lowerCaseLatin: { // a-z\n \"normal\": ch => { return 0 },\n \"bold\": ch => { return 0x1D3B9 },\n \"italic\": ch => { return ch === \"h\" ? 0x20A6 : 0x1D3ED },\n \"bold-italic\": ch => { return 0x1D421 },\n \"script\": ch => { return script[ch] || 0x1D455 },\n \"script-bold\": ch => { return 0x1D489 },\n \"fraktur\": ch => { return 0x1D4BD },\n \"fraktur-bold\": ch => { return 0x1D525 },\n \"double-struck\": ch => { return 0x1D4F1 },\n \"sans-serif\": ch => { return 0x1D559 },\n \"sans-serif-bold\": ch => { return 0x1D58D },\n \"sans-serif-italic\": ch => { return 0x1D5C1 },\n \"sans-serif-bold-italic\": ch => { return 0x1D5F5 },\n \"monospace\": ch => { return 0x1D629 }\n },\n upperCaseGreek: { // A-Ω\n \"normal\": ch => { return 0 },\n \"bold\": ch => { return 0x1D317 },\n \"italic\": ch => { return 0x1D351 },\n // \\boldsymbol actually returns upright bold for upperCaseGreek\n \"bold-italic\": ch => { return 0x1D317 },\n \"script\": ch => { return 0 },\n \"script-bold\": ch => { return 0 },\n \"fraktur\": ch => { return 0 },\n \"fraktur-bold\": ch => { return 0 },\n \"double-struck\": ch => { return 0 },\n // Unicode has no code points for regular-weight san-serif Greek. Use bold.\n \"sans-serif\": ch => { return 0x1D3C5 },\n \"sans-serif-bold\": ch => { return 0x1D3C5 },\n \"sans-serif-italic\": ch => { return 0 },\n \"sans-serif-bold-italic\": ch => { return 0x1D3FF },\n \"monospace\": ch => { return 0 }\n },\n lowerCaseGreek: { // α-ω\n \"normal\": ch => { return 0 },\n \"bold\": ch => { return 0x1D311 },\n \"italic\": ch => { return 0x1D34B },\n \"bold-italic\": ch => { return ch === \"\\u03d5\" ? 0x1D37E : 0x1D385 },\n \"script\": ch => { return 0 },\n \"script-bold\": ch => { return 0 },\n \"fraktur\": ch => { return 0 },\n \"fraktur-bold\": ch => { return 0 },\n \"double-struck\": ch => { return 0 },\n // Unicode has no code points for regular-weight san-serif Greek. Use bold.\n \"sans-serif\": ch => { return 0x1D3BF },\n \"sans-serif-bold\": ch => { return 0x1D3BF },\n \"sans-serif-italic\": ch => { return 0 },\n \"sans-serif-bold-italic\": ch => { return 0x1D3F9 },\n \"monospace\": ch => { return 0 }\n },\n varGreek: { // \\varGamma, etc\n \"normal\": ch => { return 0 },\n \"bold\": ch => { return bold[ch] || -51 },\n \"italic\": ch => { return 0 },\n \"bold-italic\": ch => { return boldItalic[ch] || 0x3A },\n \"script\": ch => { return 0 },\n \"script-bold\": ch => { return 0 },\n \"fraktur\": ch => { return 0 },\n \"fraktur-bold\": ch => { return 0 },\n \"double-struck\": ch => { return 0 },\n \"sans-serif\": ch => { return boldsf[ch] || 0x74 },\n \"sans-serif-bold\": ch => { return boldsf[ch] || 0x74 },\n \"sans-serif-italic\": ch => { return 0 },\n \"sans-serif-bold-italic\": ch => { return bisf[ch] || 0xAE },\n \"monospace\": ch => { return 0 }\n },\n numeral: { // 0-9\n \"normal\": ch => { return 0 },\n \"bold\": ch => { return 0x1D79E },\n \"italic\": ch => { return 0 },\n \"bold-italic\": ch => { return 0 },\n \"script\": ch => { return 0 },\n \"script-bold\": ch => { return 0 },\n \"fraktur\": ch => { return 0 },\n \"fraktur-bold\": ch => { return 0 },\n \"double-struck\": ch => { return 0x1D7A8 },\n \"sans-serif\": ch => { return 0x1D7B2 },\n \"sans-serif-bold\": ch => { return 0x1D7BC },\n \"sans-serif-italic\": ch => { return 0 },\n \"sans-serif-bold-italic\": ch => { return 0 },\n \"monospace\": ch => { return 0x1D7C6 }\n }\n});\n\nconst variantChar = (ch, variant) => {\n const codePoint = ch.codePointAt(0);\n const block = 0x40 < codePoint && codePoint < 0x5b\n ? \"upperCaseLatin\"\n : 0x60 < codePoint && codePoint < 0x7b\n ? \"lowerCaseLatin\"\n : (0x390 < codePoint && codePoint < 0x3AA)\n ? \"upperCaseGreek\"\n : 0x3B0 < codePoint && codePoint < 0x3CA || ch === \"\\u03d5\"\n ? \"lowerCaseGreek\"\n : 0x1D6E1 < codePoint && codePoint < 0x1D6FC || bold[ch]\n ? \"varGreek\"\n : (0x2F < codePoint && codePoint < 0x3A)\n ? \"numeral\"\n : \"other\";\n return block === \"other\"\n ? ch\n : String.fromCodePoint(codePoint + offset[block][variant](ch))\n};\n\nconst smallCaps = Object.freeze({\n a: \"ᴀ\",\n b: \"ʙ\",\n c: \"ᴄ\",\n d: \"ᴅ\",\n e: \"ᴇ\",\n f: \"ꜰ\",\n g: \"ɢ\",\n h: \"ʜ\",\n i: \"ɪ\",\n j: \"ᴊ\",\n k: \"ᴋ\",\n l: \"ʟ\",\n m: \"ᴍ\",\n n: \"ɴ\",\n o: \"ᴏ\",\n p: \"ᴘ\",\n q: \"ǫ\",\n r: \"ʀ\",\n s: \"s\",\n t: \"ᴛ\",\n u: \"ᴜ\",\n v: \"ᴠ\",\n w: \"ᴡ\",\n x: \"x\",\n y: \"ʏ\",\n z: \"ᴢ\"\n});\n\n// \"mathord\" and \"textord\" ParseNodes created in Parser.js from symbol Groups in\n// src/symbols.js.\n\nconst numberRegEx = /^\\d(?:[\\d,.]*\\d)?$/;\nconst latinRegEx = /[A-Ba-z]/;\nconst primes = new Set([\"\\\\prime\", \"\\\\dprime\", \"\\\\trprime\", \"\\\\qprime\",\n \"\\\\backprime\", \"\\\\backdprime\", \"\\\\backtrprime\"]);\n\nconst italicNumber = (text, variant, tag) => {\n const mn = new mathMLTree.MathNode(tag, [text]);\n const wrapper = new mathMLTree.MathNode(\"mstyle\", [mn]);\n wrapper.style[\"font-style\"] = \"italic\";\n wrapper.style[\"font-family\"] = \"Cambria, 'Times New Roman', serif\";\n if (variant === \"bold-italic\") { wrapper.style[\"font-weight\"] = \"bold\"; }\n return wrapper\n};\n\ndefineFunctionBuilders({\n type: \"mathord\",\n mathmlBuilder(group, style) {\n const text = makeText(group.text, group.mode, style);\n const codePoint = text.text.codePointAt(0);\n // Test for upper-case Greek\n const defaultVariant = (0x0390 < codePoint && codePoint < 0x03aa) ? \"normal\" : \"italic\";\n const variant = getVariant(group, style) || defaultVariant;\n if (variant === \"script\") {\n text.text = variantChar(text.text, variant);\n return new mathMLTree.MathNode(\"mi\", [text], [style.font])\n } else if (variant !== \"italic\") {\n text.text = variantChar(text.text, variant);\n }\n let node = new mathMLTree.MathNode(\"mi\", [text]);\n // TODO: Handle U+1D49C - U+1D4CF per https://www.unicode.org/charts/PDF/U1D400.pdf\n if (variant === \"normal\") {\n node.setAttribute(\"mathvariant\", \"normal\");\n if (text.text.length === 1) {\n // A Firefox bug will apply spacing here, but there should be none. Fix it.\n node = new mathMLTree.MathNode(\"mpadded\", [node]);\n node.setAttribute(\"lspace\", \"0\");\n node.setAttribute(\"rspace\", \"0\");\n }\n }\n return node\n }\n});\n\ndefineFunctionBuilders({\n type: \"textord\",\n mathmlBuilder(group, style) {\n let ch = group.text;\n const codePoint = ch.codePointAt(0);\n if (style.fontFamily === \"textsc\") {\n // Convert small latin letters to small caps.\n if (96 < codePoint && codePoint < 123) {\n ch = smallCaps[ch];\n }\n }\n const text = makeText(ch, group.mode, style);\n const variant = getVariant(group, style) || \"normal\";\n\n let node;\n if (numberRegEx.test(group.text)) {\n const tag = group.mode === \"text\" ? \"mtext\" : \"mn\";\n if (variant === \"italic\" || variant === \"bold-italic\") {\n return italicNumber(text, variant, tag)\n } else {\n if (variant !== \"normal\") {\n text.text = text.text.split(\"\").map(c => variantChar(c, variant)).join(\"\");\n }\n node = new mathMLTree.MathNode(tag, [text]);\n }\n } else if (group.mode === \"text\") {\n if (variant !== \"normal\") {\n text.text = variantChar(text.text, variant);\n }\n node = new mathMLTree.MathNode(\"mtext\", [text]);\n } else if (primes.has(group.text)) {\n node = new mathMLTree.MathNode(\"mo\", [text]);\n // TODO: If/when Chromium uses ssty variant for prime, remove the next line.\n node.classes.push(\"tml-prime\");\n } else {\n const origText = text.text;\n if (variant !== \"italic\") {\n text.text = variantChar(text.text, variant);\n }\n node = new mathMLTree.MathNode(\"mi\", [text]);\n if (text.text === origText && latinRegEx.test(origText)) {\n node.setAttribute(\"mathvariant\", \"italic\");\n }\n }\n return node\n }\n});\n\n// A map of CSS-based spacing functions to their CSS class.\nconst cssSpace = {\n \"\\\\nobreak\": \"nobreak\",\n \"\\\\allowbreak\": \"allowbreak\"\n};\n\n// A lookup table to determine whether a spacing function/symbol should be\n// treated like a regular space character. If a symbol or command is a key\n// in this table, then it should be a regular space character. Furthermore,\n// the associated value may have a `className` specifying an extra CSS class\n// to add to the created `span`.\nconst regularSpace = {\n \" \": {},\n \"\\\\ \": {},\n \"~\": {\n className: \"nobreak\"\n },\n \"\\\\space\": {},\n \"\\\\nobreakspace\": {\n className: \"nobreak\"\n }\n};\n\n// ParseNode<\"spacing\"> created in Parser.js from the \"spacing\" symbol Groups in\n// src/symbols.js.\ndefineFunctionBuilders({\n type: \"spacing\",\n mathmlBuilder(group, style) {\n let node;\n\n if (Object.prototype.hasOwnProperty.call(regularSpace, group.text)) {\n // Firefox does not render a space in a <mtext> </mtext>. So write a no-break space.\n // TODO: If Firefox fixes that bug, uncomment the next line and write ch into the node.\n //const ch = (regularSpace[group.text].className === \"nobreak\") ? \"\\u00a0\" : \" \"\n node = new mathMLTree.MathNode(\"mtext\", [new mathMLTree.TextNode(\"\\u00a0\")]);\n } else if (Object.prototype.hasOwnProperty.call(cssSpace, group.text)) {\n // MathML 3.0 calls for nobreak to occur in an <mo>, not an <mtext>\n // Ref: https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs\n node = new mathMLTree.MathNode(\"mo\");\n if (group.text === \"\\\\nobreak\") {\n node.setAttribute(\"linebreak\", \"nobreak\");\n }\n } else {\n throw new ParseError(`Unknown type of space \"${group.text}\"`)\n }\n\n return node\n }\n});\n\ndefineFunctionBuilders({\n type: \"tag\"\n});\n\n// For a \\tag, the work usually done in a mathmlBuilder is instead done in buildMathML.js.\n// That way, a \\tag can be pulled out of the parse tree and wrapped around the outer node.\n\n// Non-mathy text, possibly in a font\nconst textFontFamilies = {\n \"\\\\text\": undefined,\n \"\\\\textrm\": \"textrm\",\n \"\\\\textsf\": \"textsf\",\n \"\\\\texttt\": \"texttt\",\n \"\\\\textnormal\": \"textrm\",\n \"\\\\textsc\": \"textsc\" // small caps\n};\n\nconst textFontWeights = {\n \"\\\\textbf\": \"textbf\",\n \"\\\\textmd\": \"textmd\"\n};\n\nconst textFontShapes = {\n \"\\\\textit\": \"textit\",\n \"\\\\textup\": \"textup\"\n};\n\nconst styleWithFont = (group, style) => {\n const font = group.font;\n // Checks if the argument is a font family or a font style.\n if (!font) {\n return style;\n } else if (textFontFamilies[font]) {\n return style.withTextFontFamily(textFontFamilies[font]);\n } else if (textFontWeights[font]) {\n return style.withTextFontWeight(textFontWeights[font]);\n } else if (font === \"\\\\emph\") {\n return style.fontShape === \"textit\"\n ? style.withTextFontShape(\"textup\")\n : style.withTextFontShape(\"textit\")\n }\n return style.withTextFontShape(textFontShapes[font])\n};\n\ndefineFunction({\n type: \"text\",\n names: [\n // Font families\n \"\\\\text\",\n \"\\\\textrm\",\n \"\\\\textsf\",\n \"\\\\texttt\",\n \"\\\\textnormal\",\n \"\\\\textsc\",\n // Font weights\n \"\\\\textbf\",\n \"\\\\textmd\",\n // Font Shapes\n \"\\\\textit\",\n \"\\\\textup\",\n \"\\\\emph\"\n ],\n props: {\n numArgs: 1,\n argTypes: [\"text\"],\n allowedInArgument: true,\n allowedInText: true\n },\n handler({ parser, funcName }, args) {\n const body = args[0];\n return {\n type: \"text\",\n mode: parser.mode,\n body: ordargument(body),\n font: funcName\n };\n },\n mathmlBuilder(group, style) {\n const newStyle = styleWithFont(group, style);\n const mrow = buildExpressionRow(group.body, newStyle);\n return consolidateText(mrow)\n }\n});\n\n// \\vcenter: Vertically center the argument group on the math axis.\n\ndefineFunction({\n type: \"vcenter\",\n names: [\"\\\\vcenter\"],\n props: {\n numArgs: 1,\n argTypes: [\"original\"],\n allowedInText: false\n },\n handler({ parser }, args) {\n return {\n type: \"vcenter\",\n mode: parser.mode,\n body: args[0]\n };\n },\n mathmlBuilder(group, style) {\n // Use a math table to create vertically centered content.\n const mtd = new mathMLTree.MathNode(\"mtd\", [buildGroup$1(group.body, style)]);\n mtd.style.padding = \"0\";\n const mtr = new mathMLTree.MathNode(\"mtr\", [mtd]);\n return new mathMLTree.MathNode(\"mtable\", [mtr])\n }\n});\n\ndefineFunction({\n type: \"verb\",\n names: [\"\\\\verb\"],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler(context, args, optArgs) {\n // \\verb and \\verb* are dealt with directly in Parser.js.\n // If we end up here, it's because of a failure to match the two delimiters\n // in the regex in Lexer.js. LaTeX raises the following error when \\verb is\n // terminated by end of line (or file).\n throw new ParseError(\"\\\\verb ended by end of line instead of matching delimiter\");\n },\n mathmlBuilder(group, style) {\n const text = new mathMLTree.TextNode(makeVerb(group));\n const node = new mathMLTree.MathNode(\"mtext\", [text]);\n node.setAttribute(\"mathvariant\", \"monospace\");\n return node;\n }\n});\n\n/**\n * Converts verb group into body string.\n *\n * \\verb* replaces each space with an open box \\u2423\n * \\verb replaces each space with a no-break space \\xA0\n */\nconst makeVerb = (group) => group.body.replace(/ /g, group.star ? \"\\u2423\" : \"\\xA0\");\n\n/** Include this to ensure that all functions are defined. */\n\nconst functions = _functions;\n\n/**\n * The Lexer class handles tokenizing the input in various ways. Since our\n * parser expects us to be able to backtrack, the lexer allows lexing from any\n * given starting point.\n *\n * Its main exposed function is the `lex` function, which takes a position to\n * lex from and a type of token to lex. It defers to the appropriate `_innerLex`\n * function.\n *\n * The various `_innerLex` functions perform the actual lexing of different\n * kinds.\n */\n\n\n/* The following tokenRegex\n * - matches typical whitespace (but not NBSP etc.) using its first two groups\n * - does not match any control character \\x00-\\x1f except whitespace\n * - does not match a bare backslash\n * - matches any ASCII character except those just mentioned\n * - does not match the BMP private use area \\uE000-\\uF8FF\n * - does not match bare surrogate code units\n * - matches any BMP character except for those just described\n * - matches any valid Unicode surrogate pair\n * - mathches numerals\n * - matches a backslash followed by one or more whitespace characters\n * - matches a backslash followed by one or more letters then whitespace\n * - matches a backslash followed by any BMP character\n * Capturing groups:\n * [1] regular whitespace\n * [2] backslash followed by whitespace\n * [3] anything else, which may include:\n * [4] left character of \\verb*\n * [5] left character of \\verb\n * [6] backslash followed by word, excluding any trailing whitespace\n * Just because the Lexer matches something doesn't mean it's valid input:\n * If there is no matching function or symbol definition, the Parser will\n * still reject the input.\n */\nconst spaceRegexString = \"[ \\r\\n\\t]\";\nconst controlWordRegexString = \"\\\\\\\\[a-zA-Z@]+\";\nconst controlSymbolRegexString = \"\\\\\\\\[^\\uD800-\\uDFFF]\";\nconst controlWordWhitespaceRegexString = `(${controlWordRegexString})${spaceRegexString}*`;\nconst controlSpaceRegexString = \"\\\\\\\\(\\n|[ \\r\\t]+\\n?)[ \\r\\t]*\";\nconst combiningDiacriticalMarkString = \"[\\u0300-\\u036f]\";\nconst combiningDiacriticalMarksEndRegex = new RegExp(`${combiningDiacriticalMarkString}+$`);\nconst tokenRegexString =\n `(${spaceRegexString}+)|` + // whitespace\n `${controlSpaceRegexString}|` + // whitespace\n \"([!-\\\\[\\\\]-\\u2027\\u202A-\\uD7FF\\uF900-\\uFFFF]\" + // single codepoint\n `${combiningDiacriticalMarkString}*` + // ...plus accents\n \"|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\" + // surrogate pair\n `${combiningDiacriticalMarkString}*` + // ...plus accents\n \"|\\\\\\\\verb\\\\*([^]).*?\\\\4\" + // \\verb*\n \"|\\\\\\\\verb([^*a-zA-Z]).*?\\\\5\" + // \\verb unstarred\n `|${controlWordWhitespaceRegexString}` + // \\macroName + spaces\n `|${controlSymbolRegexString})`; // \\\\, \\', etc.\n\n/** Main Lexer class */\nclass Lexer {\n constructor(input, settings) {\n // Separate accents from characters\n this.input = input;\n this.settings = settings;\n this.tokenRegex = new RegExp(tokenRegexString, 'g');\n // Category codes. The lexer only supports comment characters (14) for now.\n // MacroExpander additionally distinguishes active (13).\n this.catcodes = {\n \"%\": 14, // comment character\n \"~\": 13 // active character\n };\n }\n\n setCatcode(char, code) {\n this.catcodes[char] = code;\n }\n\n /**\n * This function lexes a single token.\n */\n lex() {\n const input = this.input;\n const pos = this.tokenRegex.lastIndex;\n if (pos === input.length) {\n return new Token(\"EOF\", new SourceLocation(this, pos, pos));\n }\n const match = this.tokenRegex.exec(input);\n if (match === null || match.index !== pos) {\n throw new ParseError(\n `Unexpected character: '${input[pos]}'`,\n new Token(input[pos], new SourceLocation(this, pos, pos + 1))\n );\n }\n const text = match[6] || match[3] || (match[2] ? \"\\\\ \" : \" \");\n\n if (this.catcodes[text] === 14) {\n // comment character\n const nlIndex = input.indexOf(\"\\n\", this.tokenRegex.lastIndex);\n if (nlIndex === -1) {\n this.tokenRegex.lastIndex = input.length; // EOF\n if (this.settings.strict) {\n throw new ParseError(\"% comment has no terminating newline; LaTeX would \" +\n \"fail because of commenting the end of math mode\")\n }\n } else {\n this.tokenRegex.lastIndex = nlIndex + 1;\n }\n return this.lex();\n }\n\n return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex));\n }\n}\n\n/**\n * A `Namespace` refers to a space of nameable things like macros or lengths,\n * which can be `set` either globally or local to a nested group, using an\n * undo stack similar to how TeX implements this functionality.\n * Performance-wise, `get` and local `set` take constant time, while global\n * `set` takes time proportional to the depth of group nesting.\n */\n\n\nclass Namespace {\n /**\n * Both arguments are optional. The first argument is an object of\n * built-in mappings which never change. The second argument is an object\n * of initial (global-level) mappings, which will constantly change\n * according to any global/top-level `set`s done.\n */\n constructor(builtins = {}, globalMacros = {}) {\n this.current = globalMacros;\n this.builtins = builtins;\n this.undefStack = [];\n }\n\n /**\n * Start a new nested group, affecting future local `set`s.\n */\n beginGroup() {\n this.undefStack.push({});\n }\n\n /**\n * End current nested group, restoring values before the group began.\n */\n endGroup() {\n if (this.undefStack.length === 0) {\n throw new ParseError(\n \"Unbalanced namespace destruction: attempt \" +\n \"to pop global namespace; please report this as a bug\"\n );\n }\n const undefs = this.undefStack.pop();\n for (const undef in undefs) {\n if (Object.prototype.hasOwnProperty.call(undefs, undef )) {\n if (undefs[undef] === undefined) {\n delete this.current[undef];\n } else {\n this.current[undef] = undefs[undef];\n }\n }\n }\n }\n\n /**\n * Detect whether `name` has a definition. Equivalent to\n * `get(name) != null`.\n */\n has(name) {\n return Object.prototype.hasOwnProperty.call(this.current, name ) ||\n Object.prototype.hasOwnProperty.call(this.builtins, name );\n }\n\n /**\n * Get the current value of a name, or `undefined` if there is no value.\n *\n * Note: Do not use `if (namespace.get(...))` to detect whether a macro\n * is defined, as the definition may be the empty string which evaluates\n * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or\n * `if (namespace.has(...))`.\n */\n get(name) {\n if (Object.prototype.hasOwnProperty.call(this.current, name )) {\n return this.current[name];\n } else {\n return this.builtins[name];\n }\n }\n\n /**\n * Set the current value of a name, and optionally set it globally too.\n * Local set() sets the current value and (when appropriate) adds an undo\n * operation to the undo stack. Global set() may change the undo\n * operation at every level, so takes time linear in their number.\n */\n set(name, value, global = false) {\n if (global) {\n // Global set is equivalent to setting in all groups. Simulate this\n // by destroying any undos currently scheduled for this name,\n // and adding an undo with the *new* value (in case it later gets\n // locally reset within this environment).\n for (let i = 0; i < this.undefStack.length; i++) {\n delete this.undefStack[i][name];\n }\n if (this.undefStack.length > 0) {\n this.undefStack[this.undefStack.length - 1][name] = value;\n }\n } else {\n // Undo this set at end of this group (possibly to `undefined`),\n // unless an undo is already in place, in which case that older\n // value is the correct one.\n const top = this.undefStack[this.undefStack.length - 1];\n if (top && !Object.prototype.hasOwnProperty.call(top, name )) {\n top[name] = this.current[name];\n }\n }\n this.current[name] = value;\n }\n}\n\n/**\n * This file contains the “gullet” where macros are expanded\n * until only non-macro tokens remain.\n */\n\n\n// List of commands that act like macros but aren't defined as a macro,\n// function, or symbol. Used in `isDefined`.\nconst implicitCommands = {\n \"^\": true, // Parser.js\n _: true, // Parser.js\n \"\\\\limits\": true, // Parser.js\n \"\\\\nolimits\": true // Parser.js\n};\n\nclass MacroExpander {\n constructor(input, settings, mode) {\n this.settings = settings;\n this.expansionCount = 0;\n this.feed(input);\n // Make new global namespace\n this.macros = new Namespace(macros, settings.macros);\n this.mode = mode;\n this.stack = []; // contains tokens in REVERSE order\n }\n\n /**\n * Feed a new input string to the same MacroExpander\n * (with existing macros etc.).\n */\n feed(input) {\n this.lexer = new Lexer(input, this.settings);\n }\n\n /**\n * Switches between \"text\" and \"math\" modes.\n */\n switchMode(newMode) {\n this.mode = newMode;\n }\n\n /**\n * Start a new group nesting within all namespaces.\n */\n beginGroup() {\n this.macros.beginGroup();\n }\n\n /**\n * End current group nesting within all namespaces.\n */\n endGroup() {\n this.macros.endGroup();\n }\n\n /**\n * Returns the topmost token on the stack, without expanding it.\n * Similar in behavior to TeX's `\\futurelet`.\n */\n future() {\n if (this.stack.length === 0) {\n this.pushToken(this.lexer.lex());\n }\n return this.stack[this.stack.length - 1]\n }\n\n /**\n * Remove and return the next unexpanded token.\n */\n popToken() {\n this.future(); // ensure non-empty stack\n return this.stack.pop();\n }\n\n /**\n * Add a given token to the token stack. In particular, this get be used\n * to put back a token returned from one of the other methods.\n */\n pushToken(token) {\n this.stack.push(token);\n }\n\n /**\n * Append an array of tokens to the token stack.\n */\n pushTokens(tokens) {\n this.stack.push(...tokens);\n }\n\n /**\n * Find an macro argument without expanding tokens and append the array of\n * tokens to the token stack. Uses Token as a container for the result.\n */\n scanArgument(isOptional) {\n let start;\n let end;\n let tokens;\n if (isOptional) {\n this.consumeSpaces(); // \\@ifnextchar gobbles any space following it\n if (this.future().text !== \"[\") {\n return null;\n }\n start = this.popToken(); // don't include [ in tokens\n ({ tokens, end } = this.consumeArg([\"]\"]));\n } else {\n ({ tokens, start, end } = this.consumeArg());\n }\n\n // indicate the end of an argument\n this.pushToken(new Token(\"EOF\", end.loc));\n\n this.pushTokens(tokens);\n return start.range(end, \"\");\n }\n\n /**\n * Consume all following space tokens, without expansion.\n */\n consumeSpaces() {\n for (;;) {\n const token = this.future();\n if (token.text === \" \") {\n this.stack.pop();\n } else {\n break;\n }\n }\n }\n\n /**\n * Consume an argument from the token stream, and return the resulting array\n * of tokens and start/end token.\n */\n consumeArg(delims) {\n // The argument for a delimited parameter is the shortest (possibly\n // empty) sequence of tokens with properly nested {...} groups that is\n // followed ... by this particular list of non-parameter tokens.\n // The argument for an undelimited parameter is the next nonblank\n // token, unless that token is ‘{’, when the argument will be the\n // entire {...} group that follows.\n const tokens = [];\n const isDelimited = delims && delims.length > 0;\n if (!isDelimited) {\n // Ignore spaces between arguments. As the TeXbook says:\n // \"After you have said ‘\\def\\row#1#2{...}’, you are allowed to\n // put spaces between the arguments (e.g., ‘\\row x n’), because\n // TeX doesn’t use single spaces as undelimited arguments.\"\n this.consumeSpaces();\n }\n const start = this.future();\n let tok;\n let depth = 0;\n let match = 0;\n do {\n tok = this.popToken();\n tokens.push(tok);\n if (tok.text === \"{\") {\n ++depth;\n } else if (tok.text === \"}\") {\n --depth;\n if (depth === -1) {\n throw new ParseError(\"Extra }\", tok);\n }\n } else if (tok.text === \"EOF\") {\n throw new ParseError(\n \"Unexpected end of input in a macro argument\" +\n \", expected '\" +\n (delims && isDelimited ? delims[match] : \"}\") +\n \"'\",\n tok\n );\n }\n if (delims && isDelimited) {\n if ((depth === 0 || (depth === 1 && delims[match] === \"{\")) && tok.text === delims[match]) {\n ++match;\n if (match === delims.length) {\n // don't include delims in tokens\n tokens.splice(-match, match);\n break;\n }\n } else {\n match = 0;\n }\n }\n } while (depth !== 0 || isDelimited);\n // If the argument found ... has the form ‘{<nested tokens>}’,\n // ... the outermost braces enclosing the argument are removed\n if (start.text === \"{\" && tokens[tokens.length - 1].text === \"}\") {\n tokens.pop();\n tokens.shift();\n }\n tokens.reverse(); // to fit in with stack order\n return { tokens, start, end: tok };\n }\n\n /**\n * Consume the specified number of (delimited) arguments from the token\n * stream and return the resulting array of arguments.\n */\n consumeArgs(numArgs, delimiters) {\n if (delimiters) {\n if (delimiters.length !== numArgs + 1) {\n throw new ParseError(\"The length of delimiters doesn't match the number of args!\");\n }\n const delims = delimiters[0];\n for (let i = 0; i < delims.length; i++) {\n const tok = this.popToken();\n if (delims[i] !== tok.text) {\n throw new ParseError(\"Use of the macro doesn't match its definition\", tok);\n }\n }\n }\n\n const args = [];\n for (let i = 0; i < numArgs; i++) {\n args.push(this.consumeArg(delimiters && delimiters[i + 1]).tokens);\n }\n return args;\n }\n\n /**\n * Expand the next token only once if possible.\n *\n * If the token is expanded, the resulting tokens will be pushed onto\n * the stack in reverse order, and the number of such tokens will be\n * returned. This number might be zero or positive.\n *\n * If not, the return value is `false`, and the next token remains at the\n * top of the stack.\n *\n * In either case, the next token will be on the top of the stack,\n * or the stack will be empty (in case of empty expansion\n * and no other tokens).\n *\n * Used to implement `expandAfterFuture` and `expandNextToken`.\n *\n * If expandableOnly, only expandable tokens are expanded and\n * an undefined control sequence results in an error.\n */\n expandOnce(expandableOnly) {\n const topToken = this.popToken();\n const name = topToken.text;\n const expansion = !topToken.noexpand ? this._getExpansion(name) : null;\n if (expansion == null || (expandableOnly && expansion.unexpandable)) {\n if (expandableOnly && expansion == null && name[0] === \"\\\\\" && !this.isDefined(name)) {\n throw new ParseError(\"Undefined control sequence: \" + name);\n }\n this.pushToken(topToken);\n return false;\n }\n this.expansionCount++;\n if (this.expansionCount > this.settings.maxExpand) {\n throw new ParseError(\n \"Too many expansions: infinite loop or \" + \"need to increase maxExpand setting\"\n );\n }\n let tokens = expansion.tokens;\n const args = this.consumeArgs(expansion.numArgs, expansion.delimiters);\n if (expansion.numArgs) {\n // paste arguments in place of the placeholders\n tokens = tokens.slice(); // make a shallow copy\n for (let i = tokens.length - 1; i >= 0; --i) {\n let tok = tokens[i];\n if (tok.text === \"#\") {\n if (i === 0) {\n throw new ParseError(\"Incomplete placeholder at end of macro body\", tok);\n }\n tok = tokens[--i]; // next token on stack\n if (tok.text === \"#\") {\n // ## → #\n tokens.splice(i + 1, 1); // drop first #\n } else if (/^[1-9]$/.test(tok.text)) {\n // replace the placeholder with the indicated argument\n tokens.splice(i, 2, ...args[+tok.text - 1]);\n } else {\n throw new ParseError(\"Not a valid argument number\", tok);\n }\n }\n }\n }\n // Concatenate expansion onto top of stack.\n this.pushTokens(tokens);\n return tokens.length;\n }\n\n /**\n * Expand the next token only once (if possible), and return the resulting\n * top token on the stack (without removing anything from the stack).\n * Similar in behavior to TeX's `\\expandafter\\futurelet`.\n * Equivalent to expandOnce() followed by future().\n */\n expandAfterFuture() {\n this.expandOnce();\n return this.future();\n }\n\n /**\n * Recursively expand first token, then return first non-expandable token.\n */\n expandNextToken() {\n for (;;) {\n if (this.expandOnce() === false) { // fully expanded\n const token = this.stack.pop();\n // The token after \\noexpand is interpreted as if its meaning were ‘\\relax’\n if (token.treatAsRelax) {\n token.text = \"\\\\relax\";\n }\n return token\n }\n }\n\n // This pathway is impossible.\n throw new Error(); // eslint-disable-line no-unreachable\n }\n\n /**\n * Fully expand the given macro name and return the resulting list of\n * tokens, or return `undefined` if no such macro is defined.\n */\n expandMacro(name) {\n return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined;\n }\n\n /**\n * Fully expand the given token stream and return the resulting list of\n * tokens. Note that the input tokens are in reverse order, but the\n * output tokens are in forward order.\n */\n expandTokens(tokens) {\n const output = [];\n const oldStackLength = this.stack.length;\n this.pushTokens(tokens);\n while (this.stack.length > oldStackLength) {\n // Expand only expandable tokens\n if (this.expandOnce(true) === false) { // fully expanded\n const token = this.stack.pop();\n if (token.treatAsRelax) {\n // the expansion of \\noexpand is the token itself\n token.noexpand = false;\n token.treatAsRelax = false;\n }\n output.push(token);\n }\n }\n return output;\n }\n\n /**\n * Fully expand the given macro name and return the result as a string,\n * or return `undefined` if no such macro is defined.\n */\n expandMacroAsText(name) {\n const tokens = this.expandMacro(name);\n if (tokens) {\n return tokens.map((token) => token.text).join(\"\");\n } else {\n return tokens;\n }\n }\n\n /**\n * Returns the expanded macro as a reversed array of tokens and a macro\n * argument count. Or returns `null` if no such macro.\n */\n _getExpansion(name) {\n const definition = this.macros.get(name);\n if (definition == null) {\n // mainly checking for undefined here\n return definition;\n }\n // If a single character has an associated catcode other than 13\n // (active character), then don't expand it.\n if (name.length === 1) {\n const catcode = this.lexer.catcodes[name];\n if (catcode != null && catcode !== 13) {\n return\n }\n }\n const expansion = typeof definition === \"function\" ? definition(this) : definition;\n if (typeof expansion === \"string\") {\n let numArgs = 0;\n if (expansion.indexOf(\"#\") !== -1) {\n const stripped = expansion.replace(/##/g, \"\");\n while (stripped.indexOf(\"#\" + (numArgs + 1)) !== -1) {\n ++numArgs;\n }\n }\n const bodyLexer = new Lexer(expansion, this.settings);\n const tokens = [];\n let tok = bodyLexer.lex();\n while (tok.text !== \"EOF\") {\n tokens.push(tok);\n tok = bodyLexer.lex();\n }\n tokens.reverse(); // to fit in with stack using push and pop\n const expanded = { tokens, numArgs };\n return expanded;\n }\n\n return expansion;\n }\n\n /**\n * Determine whether a command is currently \"defined\" (has some\n * functionality), meaning that it's a macro (in the current group),\n * a function, a symbol, or one of the special commands listed in\n * `implicitCommands`.\n */\n isDefined(name) {\n return (\n this.macros.has(name) ||\n Object.prototype.hasOwnProperty.call(functions, name ) ||\n Object.prototype.hasOwnProperty.call(symbols.math, name ) ||\n Object.prototype.hasOwnProperty.call(symbols.text, name ) ||\n Object.prototype.hasOwnProperty.call(implicitCommands, name )\n );\n }\n\n /**\n * Determine whether a command is expandable.\n */\n isExpandable(name) {\n const macro = this.macros.get(name);\n return macro != null\n ? typeof macro === \"string\" || typeof macro === \"function\" || !macro.unexpandable\n : Object.prototype.hasOwnProperty.call(functions, name ) && !functions[name].primitive;\n }\n}\n\n// Helpers for Parser.js handling of Unicode (sub|super)script characters.\n\nconst unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/;\n\nconst uSubsAndSups = Object.freeze({\n '₊': '+',\n '₋': '-',\n '₌': '=',\n '₍': '(',\n '₎': ')',\n '₀': '0',\n '₁': '1',\n '₂': '2',\n '₃': '3',\n '₄': '4',\n '₅': '5',\n '₆': '6',\n '₇': '7',\n '₈': '8',\n '₉': '9',\n '\\u2090': 'a',\n '\\u2091': 'e',\n '\\u2095': 'h',\n '\\u1D62': 'i',\n '\\u2C7C': 'j',\n '\\u2096': 'k',\n '\\u2097': 'l',\n '\\u2098': 'm',\n '\\u2099': 'n',\n '\\u2092': 'o',\n '\\u209A': 'p',\n '\\u1D63': 'r',\n '\\u209B': 's',\n '\\u209C': 't',\n '\\u1D64': 'u',\n '\\u1D65': 'v',\n '\\u2093': 'x',\n '\\u1D66': 'β',\n '\\u1D67': 'γ',\n '\\u1D68': 'ρ',\n '\\u1D69': '\\u03d5',\n '\\u1D6A': 'χ',\n '⁺': '+',\n '⁻': '-',\n '⁼': '=',\n '⁽': '(',\n '⁾': ')',\n '⁰': '0',\n '¹': '1',\n '²': '2',\n '³': '3',\n '⁴': '4',\n '⁵': '5',\n '⁶': '6',\n '⁷': '7',\n '⁸': '8',\n '⁹': '9',\n '\\u1D2C': 'A',\n '\\u1D2E': 'B',\n '\\u1D30': 'D',\n '\\u1D31': 'E',\n '\\u1D33': 'G',\n '\\u1D34': 'H',\n '\\u1D35': 'I',\n '\\u1D36': 'J',\n '\\u1D37': 'K',\n '\\u1D38': 'L',\n '\\u1D39': 'M',\n '\\u1D3A': 'N',\n '\\u1D3C': 'O',\n '\\u1D3E': 'P',\n '\\u1D3F': 'R',\n '\\u1D40': 'T',\n '\\u1D41': 'U',\n '\\u2C7D': 'V',\n '\\u1D42': 'W',\n '\\u1D43': 'a',\n '\\u1D47': 'b',\n '\\u1D9C': 'c',\n '\\u1D48': 'd',\n '\\u1D49': 'e',\n '\\u1DA0': 'f',\n '\\u1D4D': 'g',\n '\\u02B0': 'h',\n '\\u2071': 'i',\n '\\u02B2': 'j',\n '\\u1D4F': 'k',\n '\\u02E1': 'l',\n '\\u1D50': 'm',\n '\\u207F': 'n',\n '\\u1D52': 'o',\n '\\u1D56': 'p',\n '\\u02B3': 'r',\n '\\u02E2': 's',\n '\\u1D57': 't',\n '\\u1D58': 'u',\n '\\u1D5B': 'v',\n '\\u02B7': 'w',\n '\\u02E3': 'x',\n '\\u02B8': 'y',\n '\\u1DBB': 'z',\n '\\u1D5D': 'β',\n '\\u1D5E': 'γ',\n '\\u1D5F': 'δ',\n '\\u1D60': '\\u03d5',\n '\\u1D61': 'χ',\n '\\u1DBF': 'θ'\n});\n\n// Used for Unicode input of calligraphic and script letters\nconst asciiFromScript = Object.freeze({\n \"\\ud835\\udc9c\": \"A\",\n \"\\u212c\": \"B\",\n \"\\ud835\\udc9e\": \"C\",\n \"\\ud835\\udc9f\": \"D\",\n \"\\u2130\": \"E\",\n \"\\u2131\": \"F\",\n \"\\ud835\\udca2\": \"G\",\n \"\\u210B\": \"H\",\n \"\\u2110\": \"I\",\n \"\\ud835\\udca5\": \"J\",\n \"\\ud835\\udca6\": \"K\",\n \"\\u2112\": \"L\",\n \"\\u2133\": \"M\",\n \"\\ud835\\udca9\": \"N\",\n \"\\ud835\\udcaa\": \"O\",\n \"\\ud835\\udcab\": \"P\",\n \"\\ud835\\udcac\": \"Q\",\n \"\\u211B\": \"R\",\n \"\\ud835\\udcae\": \"S\",\n \"\\ud835\\udcaf\": \"T\",\n \"\\ud835\\udcb0\": \"U\",\n \"\\ud835\\udcb1\": \"V\",\n \"\\ud835\\udcb2\": \"W\",\n \"\\ud835\\udcb3\": \"X\",\n \"\\ud835\\udcb4\": \"Y\",\n \"\\ud835\\udcb5\": \"Z\"\n});\n\n// Mapping of Unicode accent characters to their LaTeX equivalent in text and\n// math mode (when they exist).\nvar unicodeAccents = {\n \"\\u0301\": { text: \"\\\\'\", math: \"\\\\acute\" },\n \"\\u0300\": { text: \"\\\\`\", math: \"\\\\grave\" },\n \"\\u0308\": { text: '\\\\\"', math: \"\\\\ddot\" },\n \"\\u0303\": { text: \"\\\\~\", math: \"\\\\tilde\" },\n \"\\u0304\": { text: \"\\\\=\", math: \"\\\\bar\" },\n \"\\u0306\": { text: \"\\\\u\", math: \"\\\\breve\" },\n \"\\u030c\": { text: \"\\\\v\", math: \"\\\\check\" },\n \"\\u0302\": { text: \"\\\\^\", math: \"\\\\hat\" },\n \"\\u0307\": { text: \"\\\\.\", math: \"\\\\dot\" },\n \"\\u030a\": { text: \"\\\\r\", math: \"\\\\mathring\" },\n \"\\u030b\": { text: \"\\\\H\" },\n '\\u0327': { text: '\\\\c' }\n};\n\nvar unicodeSymbols = {\n \"á\": \"á\",\n \"à\": \"à\",\n \"ä\": \"ä\",\n \"ǟ\": \"ǟ\",\n \"ã\": \"ã\",\n \"ā\": \"ā\",\n \"ă\": \"ă\",\n \"ắ\": \"ắ\",\n \"ằ\": \"ằ\",\n \"ẵ\": \"ẵ\",\n \"ǎ\": \"ǎ\",\n \"â\": \"â\",\n \"ấ\": \"ấ\",\n \"ầ\": \"ầ\",\n \"ẫ\": \"ẫ\",\n \"ȧ\": \"ȧ\",\n \"ǡ\": \"ǡ\",\n \"å\": \"å\",\n \"ǻ\": \"ǻ\",\n \"ḃ\": \"ḃ\",\n \"ć\": \"ć\",\n \"č\": \"č\",\n \"ĉ\": \"ĉ\",\n \"ċ\": \"ċ\",\n \"ď\": \"ď\",\n \"ḋ\": \"ḋ\",\n \"é\": \"é\",\n \"è\": \"è\",\n \"ë\": \"ë\",\n \"ẽ\": \"ẽ\",\n \"ē\": \"ē\",\n \"ḗ\": \"ḗ\",\n \"ḕ\": \"ḕ\",\n \"ĕ\": \"ĕ\",\n \"ě\": \"ě\",\n \"ê\": \"ê\",\n \"ế\": \"ế\",\n \"ề\": \"ề\",\n \"ễ\": \"ễ\",\n \"ė\": \"ė\",\n \"ḟ\": \"ḟ\",\n \"ǵ\": \"ǵ\",\n \"ḡ\": \"ḡ\",\n \"ğ\": \"ğ\",\n \"ǧ\": \"ǧ\",\n \"ĝ\": \"ĝ\",\n \"ġ\": \"ġ\",\n \"ḧ\": \"ḧ\",\n \"ȟ\": \"ȟ\",\n \"ĥ\": \"ĥ\",\n \"ḣ\": \"ḣ\",\n \"í\": \"í\",\n \"ì\": \"ì\",\n \"ï\": \"ï\",\n \"ḯ\": \"ḯ\",\n \"ĩ\": \"ĩ\",\n \"ī\": \"ī\",\n \"ĭ\": \"ĭ\",\n \"ǐ\": \"ǐ\",\n \"î\": \"î\",\n \"ǰ\": \"ǰ\",\n \"ĵ\": \"ĵ\",\n \"ḱ\": \"ḱ\",\n \"ǩ\": \"ǩ\",\n \"ĺ\": \"ĺ\",\n \"ľ\": \"ľ\",\n \"ḿ\": \"ḿ\",\n \"ṁ\": \"ṁ\",\n \"ń\": \"ń\",\n \"ǹ\": \"ǹ\",\n \"ñ\": \"ñ\",\n \"ň\": \"ň\",\n \"ṅ\": \"ṅ\",\n \"ó\": \"ó\",\n \"ò\": \"ò\",\n \"ö\": \"ö\",\n \"ȫ\": \"ȫ\",\n \"õ\": \"õ\",\n \"ṍ\": \"ṍ\",\n \"ṏ\": \"ṏ\",\n \"ȭ\": \"ȭ\",\n \"ō\": \"ō\",\n \"ṓ\": \"ṓ\",\n \"ṑ\": \"ṑ\",\n \"ŏ\": \"ŏ\",\n \"ǒ\": \"ǒ\",\n \"ô\": \"ô\",\n \"ố\": \"ố\",\n \"ồ\": \"ồ\",\n \"ỗ\": \"ỗ\",\n \"ȯ\": \"ȯ\",\n \"ȱ\": \"ȱ\",\n \"ő\": \"ő\",\n \"ṕ\": \"ṕ\",\n \"ṗ\": \"ṗ\",\n \"ŕ\": \"ŕ\",\n \"ř\": \"ř\",\n \"ṙ\": \"ṙ\",\n \"ś\": \"ś\",\n \"ṥ\": \"ṥ\",\n \"š\": \"š\",\n \"ṧ\": \"ṧ\",\n \"ŝ\": \"ŝ\",\n \"ṡ\": \"ṡ\",\n \"ẗ\": \"ẗ\",\n \"ť\": \"ť\",\n \"ṫ\": \"ṫ\",\n \"ú\": \"ú\",\n \"ù\": \"ù\",\n \"ü\": \"ü\",\n \"ǘ\": \"ǘ\",\n \"ǜ\": \"ǜ\",\n \"ǖ\": \"ǖ\",\n \"ǚ\": \"ǚ\",\n \"ũ\": \"ũ\",\n \"ṹ\": \"ṹ\",\n \"ū\": \"ū\",\n \"ṻ\": \"ṻ\",\n \"ŭ\": \"ŭ\",\n \"ǔ\": \"ǔ\",\n \"û\": \"û\",\n \"ů\": \"ů\",\n \"ű\": \"ű\",\n \"ṽ\": \"ṽ\",\n \"ẃ\": \"ẃ\",\n \"ẁ\": \"ẁ\",\n \"ẅ\": \"ẅ\",\n \"ŵ\": \"ŵ\",\n \"ẇ\": \"ẇ\",\n \"ẘ\": \"ẘ\",\n \"ẍ\": \"ẍ\",\n \"ẋ\": \"ẋ\",\n \"ý\": \"ý\",\n \"ỳ\": \"ỳ\",\n \"ÿ\": \"ÿ\",\n \"ỹ\": \"ỹ\",\n \"ȳ\": \"ȳ\",\n \"ŷ\": \"ŷ\",\n \"ẏ\": \"ẏ\",\n \"ẙ\": \"ẙ\",\n \"ź\": \"ź\",\n \"ž\": \"ž\",\n \"ẑ\": \"ẑ\",\n \"ż\": \"ż\",\n \"Á\": \"Á\",\n \"À\": \"À\",\n \"Ä\": \"Ä\",\n \"Ǟ\": \"Ǟ\",\n \"Ã\": \"Ã\",\n \"Ā\": \"Ā\",\n \"Ă\": \"Ă\",\n \"Ắ\": \"Ắ\",\n \"Ằ\": \"Ằ\",\n \"Ẵ\": \"Ẵ\",\n \"Ǎ\": \"Ǎ\",\n \"Â\": \"Â\",\n \"Ấ\": \"Ấ\",\n \"Ầ\": \"Ầ\",\n \"Ẫ\": \"Ẫ\",\n \"Ȧ\": \"Ȧ\",\n \"Ǡ\": \"Ǡ\",\n \"Å\": \"Å\",\n \"Ǻ\": \"Ǻ\",\n \"Ḃ\": \"Ḃ\",\n \"Ć\": \"Ć\",\n \"Č\": \"Č\",\n \"Ĉ\": \"Ĉ\",\n \"Ċ\": \"Ċ\",\n \"Ď\": \"Ď\",\n \"Ḋ\": \"Ḋ\",\n \"É\": \"É\",\n \"È\": \"È\",\n \"Ë\": \"Ë\",\n \"Ẽ\": \"Ẽ\",\n \"Ē\": \"Ē\",\n \"Ḗ\": \"Ḗ\",\n \"Ḕ\": \"Ḕ\",\n \"Ĕ\": \"Ĕ\",\n \"Ě\": \"Ě\",\n \"Ê\": \"Ê\",\n \"Ế\": \"Ế\",\n \"Ề\": \"Ề\",\n \"Ễ\": \"Ễ\",\n \"Ė\": \"Ė\",\n \"Ḟ\": \"Ḟ\",\n \"Ǵ\": \"Ǵ\",\n \"Ḡ\": \"Ḡ\",\n \"Ğ\": \"Ğ\",\n \"Ǧ\": \"Ǧ\",\n \"Ĝ\": \"Ĝ\",\n \"Ġ\": \"Ġ\",\n \"Ḧ\": \"Ḧ\",\n \"Ȟ\": \"Ȟ\",\n \"Ĥ\": \"Ĥ\",\n \"Ḣ\": \"Ḣ\",\n \"Í\": \"Í\",\n \"Ì\": \"Ì\",\n \"Ï\": \"Ï\",\n \"Ḯ\": \"Ḯ\",\n \"Ĩ\": \"Ĩ\",\n \"Ī\": \"Ī\",\n \"Ĭ\": \"Ĭ\",\n \"Ǐ\": \"Ǐ\",\n \"Î\": \"Î\",\n \"İ\": \"İ\",\n \"Ĵ\": \"Ĵ\",\n \"Ḱ\": \"Ḱ\",\n \"Ǩ\": \"Ǩ\",\n \"Ĺ\": \"Ĺ\",\n \"Ľ\": \"Ľ\",\n \"Ḿ\": \"Ḿ\",\n \"Ṁ\": \"Ṁ\",\n \"Ń\": \"Ń\",\n \"Ǹ\": \"Ǹ\",\n \"Ñ\": \"Ñ\",\n \"Ň\": \"Ň\",\n \"Ṅ\": \"Ṅ\",\n \"Ó\": \"Ó\",\n \"Ò\": \"Ò\",\n \"Ö\": \"Ö\",\n \"Ȫ\": \"Ȫ\",\n \"Õ\": \"Õ\",\n \"Ṍ\": \"Ṍ\",\n \"Ṏ\": \"Ṏ\",\n \"Ȭ\": \"Ȭ\",\n \"Ō\": \"Ō\",\n \"Ṓ\": \"Ṓ\",\n \"Ṑ\": \"Ṑ\",\n \"Ŏ\": \"Ŏ\",\n \"Ǒ\": \"Ǒ\",\n \"Ô\": \"Ô\",\n \"Ố\": \"Ố\",\n \"Ồ\": \"Ồ\",\n \"Ỗ\": \"Ỗ\",\n \"Ȯ\": \"Ȯ\",\n \"Ȱ\": \"Ȱ\",\n \"Ő\": \"Ő\",\n \"Ṕ\": \"Ṕ\",\n \"Ṗ\": \"Ṗ\",\n \"Ŕ\": \"Ŕ\",\n \"Ř\": \"Ř\",\n \"Ṙ\": \"Ṙ\",\n \"Ś\": \"Ś\",\n \"Ṥ\": \"Ṥ\",\n \"Š\": \"Š\",\n \"Ṧ\": \"Ṧ\",\n \"Ŝ\": \"Ŝ\",\n \"Ṡ\": \"Ṡ\",\n \"Ť\": \"Ť\",\n \"Ṫ\": \"Ṫ\",\n \"Ú\": \"Ú\",\n \"Ù\": \"Ù\",\n \"Ü\": \"Ü\",\n \"Ǘ\": \"Ǘ\",\n \"Ǜ\": \"Ǜ\",\n \"Ǖ\": \"Ǖ\",\n \"Ǚ\": \"Ǚ\",\n \"Ũ\": \"Ũ\",\n \"Ṹ\": \"Ṹ\",\n \"Ū\": \"Ū\",\n \"Ṻ\": \"Ṻ\",\n \"Ŭ\": \"Ŭ\",\n \"Ǔ\": \"Ǔ\",\n \"Û\": \"Û\",\n \"Ů\": \"Ů\",\n \"Ű\": \"Ű\",\n \"Ṽ\": \"Ṽ\",\n \"Ẃ\": \"Ẃ\",\n \"Ẁ\": \"Ẁ\",\n \"Ẅ\": \"Ẅ\",\n \"Ŵ\": \"Ŵ\",\n \"Ẇ\": \"Ẇ\",\n \"Ẍ\": \"Ẍ\",\n \"Ẋ\": \"Ẋ\",\n \"Ý\": \"Ý\",\n \"Ỳ\": \"Ỳ\",\n \"Ÿ\": \"Ÿ\",\n \"Ỹ\": \"Ỹ\",\n \"Ȳ\": \"Ȳ\",\n \"Ŷ\": \"Ŷ\",\n \"Ẏ\": \"Ẏ\",\n \"Ź\": \"Ź\",\n \"Ž\": \"Ž\",\n \"Ẑ\": \"Ẑ\",\n \"Ż\": \"Ż\",\n \"ά\": \"ά\",\n \"ὰ\": \"ὰ\",\n \"ᾱ\": \"ᾱ\",\n \"ᾰ\": \"ᾰ\",\n \"έ\": \"έ\",\n \"ὲ\": \"ὲ\",\n \"ή\": \"ή\",\n \"ὴ\": \"ὴ\",\n \"ί\": \"ί\",\n \"ὶ\": \"ὶ\",\n \"ϊ\": \"ϊ\",\n \"ΐ\": \"ΐ\",\n \"ῒ\": \"ῒ\",\n \"ῑ\": \"ῑ\",\n \"ῐ\": \"ῐ\",\n \"ό\": \"ό\",\n \"ὸ\": \"ὸ\",\n \"ύ\": \"ύ\",\n \"ὺ\": \"ὺ\",\n \"ϋ\": \"ϋ\",\n \"ΰ\": \"ΰ\",\n \"ῢ\": \"ῢ\",\n \"ῡ\": \"ῡ\",\n \"ῠ\": \"ῠ\",\n \"ώ\": \"ώ\",\n \"ὼ\": \"ὼ\",\n \"Ύ\": \"Ύ\",\n \"Ὺ\": \"Ὺ\",\n \"Ϋ\": \"Ϋ\",\n \"Ῡ\": \"Ῡ\",\n \"Ῠ\": \"Ῠ\",\n \"Ώ\": \"Ώ\",\n \"Ὼ\": \"Ὼ\"\n};\n\n/* eslint no-constant-condition:0 */\n\nconst binLeftCancellers = [\"bin\", \"op\", \"open\", \"punct\", \"rel\"];\nconst sizeRegEx = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/;\nconst textRegEx = /^ *\\\\text/;\n\n/**\n * This file contains the parser used to parse out a TeX expression from the\n * input. Since TeX isn't context-free, standard parsers don't work particularly\n * well.\n *\n * The strategy of this parser is as such:\n *\n * The main functions (the `.parse...` ones) take a position in the current\n * parse string to parse tokens from. The lexer (found in Lexer.js, stored at\n * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When\n * individual tokens are needed at a position, the lexer is called to pull out a\n * token, which is then used.\n *\n * The parser has a property called \"mode\" indicating the mode that\n * the parser is currently in. Currently it has to be one of \"math\" or\n * \"text\", which denotes whether the current environment is a math-y\n * one or a text-y one (e.g. inside \\text). Currently, this serves to\n * limit the functions which can be used in text mode.\n *\n * The main functions then return an object which contains the useful data that\n * was parsed at its given point, and a new position at the end of the parsed\n * data. The main functions can call each other and continue the parsing by\n * using the returned position as a new starting point.\n *\n * There are also extra `.handle...` functions, which pull out some reused\n * functionality into self-contained functions.\n *\n * The functions return ParseNodes.\n */\n\nclass Parser {\n constructor(input, settings, isPreamble = false) {\n // Start in math mode\n this.mode = \"math\";\n // Create a new macro expander (gullet) and (indirectly via that) also a\n // new lexer (mouth) for this parser (stomach, in the language of TeX)\n this.gullet = new MacroExpander(input, settings, this.mode);\n // Store the settings for use in parsing\n this.settings = settings;\n // Are we defining a preamble?\n this.isPreamble = isPreamble;\n // Count leftright depth (for \\middle errors)\n this.leftrightDepth = 0;\n this.prevAtomType = \"\";\n }\n\n /**\n * Checks a result to make sure it has the right type, and throws an\n * appropriate error otherwise.\n */\n expect(text, consume = true) {\n if (this.fetch().text !== text) {\n throw new ParseError(`Expected '${text}', got '${this.fetch().text}'`, this.fetch());\n }\n if (consume) {\n this.consume();\n }\n }\n\n /**\n * Discards the current lookahead token, considering it consumed.\n */\n consume() {\n this.nextToken = null;\n }\n\n /**\n * Return the current lookahead token, or if there isn't one (at the\n * beginning, or if the previous lookahead token was consume()d),\n * fetch the next token as the new lookahead token and return it.\n */\n fetch() {\n if (this.nextToken == null) {\n this.nextToken = this.gullet.expandNextToken();\n }\n return this.nextToken;\n }\n\n /**\n * Switches between \"text\" and \"math\" modes.\n */\n switchMode(newMode) {\n this.mode = newMode;\n this.gullet.switchMode(newMode);\n }\n\n /**\n * Main parsing function, which parses an entire input.\n */\n parse() {\n // Create a group namespace for every $...$, $$...$$, \\[...\\].)\n // A \\def is then valid only within that pair of delimiters.\n this.gullet.beginGroup();\n\n if (this.settings.colorIsTextColor) {\n // Use old \\color behavior (same as LaTeX's \\textcolor) if requested.\n // We do this within the group for the math expression, so it doesn't\n // pollute settings.macros.\n this.gullet.macros.set(\"\\\\color\", \"\\\\textcolor\");\n }\n\n // Try to parse the input\n const parse = this.parseExpression(false);\n\n // If we succeeded, make sure there's an EOF at the end\n this.expect(\"EOF\");\n\n if (this.isPreamble) {\n const macros = Object.create(null);\n Object.entries(this.gullet.macros.current).forEach(([key, value]) => {\n macros[key] = value;\n });\n this.gullet.endGroup();\n return macros\n }\n\n // The only local macro that we want to save is from \\tag.\n const tag = this.gullet.macros.get(\"\\\\df@tag\");\n\n // End the group namespace for the expression\n this.gullet.endGroup();\n\n if (tag) { this.gullet.macros.current[\"\\\\df@tag\"] = tag; }\n\n return parse;\n }\n\n static get endOfExpression() {\n return [\"}\", \"\\\\endgroup\", \"\\\\end\", \"\\\\right\", \"\\\\endtoggle\", \"&\"];\n }\n\n /**\n * Fully parse a separate sequence of tokens as a separate job.\n * Tokens should be specified in reverse order, as in a MacroDefinition.\n */\n subparse(tokens) {\n // Save the next token from the current job.\n const oldToken = this.nextToken;\n this.consume();\n\n // Run the new job, terminating it with an excess '}'\n this.gullet.pushToken(new Token(\"}\"));\n this.gullet.pushTokens(tokens);\n const parse = this.parseExpression(false);\n this.expect(\"}\");\n\n // Restore the next token from the current job.\n this.nextToken = oldToken;\n\n return parse;\n }\n\n/**\n * Parses an \"expression\", which is a list of atoms.\n *\n * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This\n * happens when functions have higher precedence han infix\n * nodes in implicit parses.\n *\n * `breakOnTokenText`: The text of the token that the expression should end\n * with, or `null` if something else should end the\n * expression.\n *\n * `breakOnMiddle`: \\color, \\over, and old styling functions work on an implicit group.\n * These groups end just before the usual tokens, but they also\n * end just before `\\middle`.\n */\n parseExpression(breakOnInfix, breakOnTokenText, breakOnMiddle) {\n const body = [];\n this.prevAtomType = \"\";\n // Keep adding atoms to the body until we can't parse any more atoms (either\n // we reached the end, a }, or a \\right)\n while (true) {\n // Ignore spaces in math mode\n if (this.mode === \"math\") {\n this.consumeSpaces();\n }\n const lex = this.fetch();\n if (Parser.endOfExpression.indexOf(lex.text) !== -1) {\n break;\n }\n if (breakOnTokenText && lex.text === breakOnTokenText) {\n break;\n }\n if (breakOnMiddle && lex.text === \"\\\\middle\") {\n break\n }\n if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) {\n break;\n }\n const atom = this.parseAtom(breakOnTokenText);\n if (!atom) {\n break;\n } else if (atom.type === \"internal\") {\n continue;\n }\n body.push(atom);\n // Keep a record of the atom type, so that op.js can set correct spacing.\n this.prevAtomType = atom.type === \"atom\" ? atom.family : atom.type;\n }\n if (this.mode === \"text\") {\n this.formLigatures(body);\n }\n return this.handleInfixNodes(body);\n }\n\n /**\n * Rewrites infix operators such as \\over with corresponding commands such\n * as \\frac.\n *\n * There can only be one infix operator per group. If there's more than one\n * then the expression is ambiguous. This can be resolved by adding {}.\n */\n handleInfixNodes(body) {\n let overIndex = -1;\n let funcName;\n\n for (let i = 0; i < body.length; i++) {\n if (body[i].type === \"infix\") {\n if (overIndex !== -1) {\n throw new ParseError(\"only one infix operator per group\", body[i].token);\n }\n overIndex = i;\n funcName = body[i].replaceWith;\n }\n }\n\n if (overIndex !== -1 && funcName) {\n let numerNode;\n let denomNode;\n\n const numerBody = body.slice(0, overIndex);\n const denomBody = body.slice(overIndex + 1);\n\n if (numerBody.length === 1 && numerBody[0].type === \"ordgroup\") {\n numerNode = numerBody[0];\n } else {\n numerNode = { type: \"ordgroup\", mode: this.mode, body: numerBody };\n }\n\n if (denomBody.length === 1 && denomBody[0].type === \"ordgroup\") {\n denomNode = denomBody[0];\n } else {\n denomNode = { type: \"ordgroup\", mode: this.mode, body: denomBody };\n }\n\n let node;\n if (funcName === \"\\\\\\\\abovefrac\") {\n node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []);\n } else {\n node = this.callFunction(funcName, [numerNode, denomNode], []);\n }\n return [node];\n } else {\n return body;\n }\n }\n\n /**\n * Handle a subscript or superscript with nice errors.\n */\n handleSupSubscript(\n name // For error reporting.\n ) {\n const symbolToken = this.fetch();\n const symbol = symbolToken.text;\n this.consume();\n this.consumeSpaces(); // ignore spaces before sup/subscript argument\n const group = this.parseGroup(name);\n\n if (!group) {\n throw new ParseError(\"Expected group after '\" + symbol + \"'\", symbolToken);\n }\n\n return group;\n }\n\n /**\n * Converts the textual input of an unsupported command into a text node\n * contained within a color node whose color is determined by errorColor\n */\n formatUnsupportedCmd(text) {\n const textordArray = [];\n\n for (let i = 0; i < text.length; i++) {\n textordArray.push({ type: \"textord\", mode: \"text\", text: text[i] });\n }\n\n const textNode = {\n type: \"text\",\n mode: this.mode,\n body: textordArray\n };\n\n const colorNode = {\n type: \"color\",\n mode: this.mode,\n color: this.settings.errorColor,\n body: [textNode]\n };\n\n return colorNode;\n }\n\n /**\n * Parses a group with optional super/subscripts.\n */\n parseAtom(breakOnTokenText) {\n // The body of an atom is an implicit group, so that things like\n // \\left(x\\right)^2 work correctly.\n const base = this.parseGroup(\"atom\", breakOnTokenText);\n\n // In text mode, we don't have superscripts or subscripts\n if (this.mode === \"text\") {\n return base;\n }\n\n // Note that base may be empty (i.e. null) at this point.\n\n let superscript;\n let subscript;\n while (true) {\n // Guaranteed in math mode, so eat any spaces first.\n this.consumeSpaces();\n\n // Lex the first token\n const lex = this.fetch();\n\n if (lex.text === \"\\\\limits\" || lex.text === \"\\\\nolimits\") {\n // We got a limit control\n if (base && base.type === \"op\") {\n const limits = lex.text === \"\\\\limits\";\n base.limits = limits;\n base.alwaysHandleSupSub = true;\n } else if (base && base.type === \"operatorname\") {\n if (base.alwaysHandleSupSub) {\n base.limits = lex.text === \"\\\\limits\";\n }\n } else {\n throw new ParseError(\"Limit controls must follow a math operator\", lex);\n }\n this.consume();\n } else if (lex.text === \"^\") {\n // We got a superscript start\n if (superscript) {\n throw new ParseError(\"Double superscript\", lex);\n }\n superscript = this.handleSupSubscript(\"superscript\");\n } else if (lex.text === \"_\") {\n // We got a subscript start\n if (subscript) {\n throw new ParseError(\"Double subscript\", lex);\n }\n subscript = this.handleSupSubscript(\"subscript\");\n } else if (lex.text === \"'\") {\n // We got a prime\n if (superscript) {\n throw new ParseError(\"Double superscript\", lex);\n }\n const prime = { type: \"textord\", mode: this.mode, text: \"\\\\prime\" };\n\n // Many primes can be grouped together, so we handle this here\n const primes = [prime];\n this.consume();\n // Keep lexing tokens until we get something that's not a prime\n while (this.fetch().text === \"'\") {\n // For each one, add another prime to the list\n primes.push(prime);\n this.consume();\n }\n // If there's a superscript following the primes, combine that\n // superscript in with the primes.\n if (this.fetch().text === \"^\") {\n primes.push(this.handleSupSubscript(\"superscript\"));\n }\n // Put everything into an ordgroup as the superscript\n superscript = { type: \"ordgroup\", mode: this.mode, body: primes };\n } else if (uSubsAndSups[lex.text]) {\n // A Unicode subscript or superscript character.\n // We treat these similarly to the unicode-math package.\n // So we render a string of Unicode (sub|super)scripts the\n // same as a (sub|super)script of regular characters.\n const isSub = unicodeSubRegEx.test(lex.text);\n const subsupTokens = [];\n subsupTokens.push(new Token(uSubsAndSups[lex.text]));\n this.consume();\n // Continue fetching tokens to fill out the group.\n while (true) {\n const token = this.fetch().text;\n if (!(uSubsAndSups[token])) { break }\n if (unicodeSubRegEx.test(token) !== isSub) { break }\n subsupTokens.unshift(new Token(uSubsAndSups[token]));\n this.consume();\n }\n // Now create a (sub|super)script.\n const body = this.subparse(subsupTokens);\n if (isSub) {\n subscript = { type: \"ordgroup\", mode: \"math\", body };\n } else {\n superscript = { type: \"ordgroup\", mode: \"math\", body };\n }\n } else {\n // If it wasn't ^, _, a Unicode (sub|super)script, or ', stop parsing super/subscripts\n break;\n }\n }\n\n if (superscript || subscript) {\n if (base && base.type === \"multiscript\" && !base.postscripts) {\n // base is the result of a \\prescript function.\n // Write the sub- & superscripts into the multiscript element.\n base.postscripts = { sup: superscript, sub: subscript };\n return base\n } else {\n // We got either a superscript or subscript, create a supsub\n const isFollowedByDelimiter = (!base || base.type !== \"op\" && base.type !== \"operatorname\")\n ? undefined\n : isDelimiter(this.nextToken.text);\n return {\n type: \"supsub\",\n mode: this.mode,\n base: base,\n sup: superscript,\n sub: subscript,\n isFollowedByDelimiter\n }\n }\n } else {\n // Otherwise return the original body\n return base;\n }\n }\n\n /**\n * Parses an entire function, including its base and all of its arguments.\n */\n parseFunction(\n breakOnTokenText,\n name // For determining its context\n ) {\n const token = this.fetch();\n const func = token.text;\n const funcData = functions[func];\n if (!funcData) {\n return null;\n }\n this.consume(); // consume command token\n\n if (name && name !== \"atom\" && !funcData.allowedInArgument) {\n throw new ParseError(\n \"Got function '\" + func + \"' with no arguments\" + (name ? \" as \" + name : \"\"),\n token\n );\n } else if (this.mode === \"text\" && !funcData.allowedInText) {\n throw new ParseError(\"Can't use function '\" + func + \"' in text mode\", token);\n } else if (this.mode === \"math\" && funcData.allowedInMath === false) {\n throw new ParseError(\"Can't use function '\" + func + \"' in math mode\", token);\n }\n\n const prevAtomType = this.prevAtomType;\n const { args, optArgs } = this.parseArguments(func, funcData);\n this.prevAtomType = prevAtomType;\n return this.callFunction(func, args, optArgs, token, breakOnTokenText);\n }\n\n /**\n * Call a function handler with a suitable context and arguments.\n */\n callFunction(name, args, optArgs, token, breakOnTokenText) {\n const context = {\n funcName: name,\n parser: this,\n token,\n breakOnTokenText\n };\n const func = functions[name];\n if (func && func.handler) {\n return func.handler(context, args, optArgs);\n } else {\n throw new ParseError(`No function handler for ${name}`);\n }\n }\n\n /**\n * Parses the arguments of a function or environment\n */\n parseArguments(\n func, // Should look like \"\\name\" or \"\\begin{name}\".\n funcData\n ) {\n const totalArgs = funcData.numArgs + funcData.numOptionalArgs;\n if (totalArgs === 0) {\n return { args: [], optArgs: [] };\n }\n\n const args = [];\n const optArgs = [];\n\n for (let i = 0; i < totalArgs; i++) {\n let argType = funcData.argTypes && funcData.argTypes[i];\n const isOptional = i < funcData.numOptionalArgs;\n\n if (\n (funcData.primitive && argType == null) ||\n // \\sqrt expands into primitive if optional argument doesn't exist\n (funcData.type === \"sqrt\" && i === 1 && optArgs[0] == null)\n ) {\n argType = \"primitive\";\n }\n\n const arg = this.parseGroupOfType(`argument to '${func}'`, argType, isOptional);\n if (isOptional) {\n optArgs.push(arg);\n } else if (arg != null) {\n args.push(arg);\n } else {\n // should be unreachable\n throw new ParseError(\"Null argument, please report this as a bug\");\n }\n }\n\n return { args, optArgs };\n }\n\n /**\n * Parses a group when the mode is changing.\n */\n parseGroupOfType(name, type, optional) {\n switch (type) {\n case \"size\":\n return this.parseSizeGroup(optional);\n case \"url\":\n return this.parseUrlGroup(optional);\n case \"math\":\n case \"text\":\n return this.parseArgumentGroup(optional, type);\n case \"hbox\": {\n // hbox argument type wraps the argument in the equivalent of\n // \\hbox, which is like \\text but switching to \\textstyle size.\n const group = this.parseArgumentGroup(optional, \"text\");\n return group != null\n ? {\n type: \"styling\",\n mode: group.mode,\n body: [group],\n scriptLevel: \"text\" // simulate \\textstyle\n }\n : null;\n }\n case \"raw\": {\n const token = this.parseStringGroup(\"raw\", optional);\n return token != null\n ? {\n type: \"raw\",\n mode: \"text\",\n string: token.text\n }\n : null;\n }\n case \"primitive\": {\n if (optional) {\n throw new ParseError(\"A primitive argument cannot be optional\");\n }\n const group = this.parseGroup(name);\n if (group == null) {\n throw new ParseError(\"Expected group as \" + name, this.fetch());\n }\n return group;\n }\n case \"original\":\n case null:\n case undefined:\n return this.parseArgumentGroup(optional);\n default:\n throw new ParseError(\"Unknown group type as \" + name, this.fetch());\n }\n }\n\n /**\n * Discard any space tokens, fetching the next non-space token.\n */\n consumeSpaces() {\n while (true) {\n const ch = this.fetch().text;\n // \\ufe0e is the Unicode variation selector to supress emoji. Ignore it.\n if (ch === \" \" || ch === \"\\u00a0\" || ch === \"\\ufe0e\") {\n this.consume();\n } else {\n break\n }\n }\n }\n\n /**\n * Parses a group, essentially returning the string formed by the\n * brace-enclosed tokens plus some position information.\n */\n parseStringGroup(\n modeName, // Used to describe the mode in error messages.\n optional\n ) {\n const argToken = this.gullet.scanArgument(optional);\n if (argToken == null) {\n return null;\n }\n let str = \"\";\n let nextToken;\n while ((nextToken = this.fetch()).text !== \"EOF\") {\n str += nextToken.text;\n this.consume();\n }\n this.consume(); // consume the end of the argument\n argToken.text = str;\n return argToken;\n }\n\n /**\n * Parses a regex-delimited group: the largest sequence of tokens\n * whose concatenated strings match `regex`. Returns the string\n * formed by the tokens plus some position information.\n */\n parseRegexGroup(\n regex,\n modeName // Used to describe the mode in error messages.\n ) {\n const firstToken = this.fetch();\n let lastToken = firstToken;\n let str = \"\";\n let nextToken;\n while ((nextToken = this.fetch()).text !== \"EOF\" && regex.test(str + nextToken.text)) {\n lastToken = nextToken;\n str += lastToken.text;\n this.consume();\n }\n if (str === \"\") {\n throw new ParseError(\"Invalid \" + modeName + \": '\" + firstToken.text + \"'\", firstToken);\n }\n return firstToken.range(lastToken, str);\n }\n\n /**\n * Parses a size specification, consisting of magnitude and unit.\n */\n parseSizeGroup(optional) {\n let res;\n let isBlank = false;\n // don't expand before parseStringGroup\n this.gullet.consumeSpaces();\n if (!optional && this.gullet.future().text !== \"{\") {\n res = this.parseRegexGroup(/^[-+]? *(?:$|\\d+|\\d+\\.\\d*|\\.\\d*) *[a-z]{0,2} *$/, \"size\");\n } else {\n res = this.parseStringGroup(\"size\", optional);\n }\n if (!res) {\n return null;\n }\n if (!optional && res.text.length === 0) {\n // Because we've tested for what is !optional, this block won't\n // affect \\kern, \\hspace, etc. It will capture the mandatory arguments\n // to \\genfrac and \\above.\n res.text = \"0pt\"; // Enable \\above{}\n isBlank = true; // This is here specifically for \\genfrac\n }\n const match = sizeRegEx.exec(res.text);\n if (!match) {\n throw new ParseError(\"Invalid size: '\" + res.text + \"'\", res);\n }\n const data = {\n number: +(match[1] + match[2]), // sign + magnitude, cast to number\n unit: match[3]\n };\n if (!validUnit(data)) {\n throw new ParseError(\"Invalid unit: '\" + data.unit + \"'\", res);\n }\n return {\n type: \"size\",\n mode: this.mode,\n value: data,\n isBlank\n };\n }\n\n /**\n * Parses an URL, checking escaped letters and allowed protocols,\n * and setting the catcode of % as an active character (as in \\hyperref).\n */\n parseUrlGroup(optional) {\n this.gullet.lexer.setCatcode(\"%\", 13); // active character\n this.gullet.lexer.setCatcode(\"~\", 12); // other character\n const res = this.parseStringGroup(\"url\", optional);\n this.gullet.lexer.setCatcode(\"%\", 14); // comment character\n this.gullet.lexer.setCatcode(\"~\", 13); // active character\n if (res == null) {\n return null;\n }\n // hyperref package allows backslashes alone in href, but doesn't\n // generate valid links in such cases; we interpret this as\n // \"undefined\" behaviour, and keep them as-is. Some browser will\n // replace backslashes with forward slashes.\n let url = res.text.replace(/\\\\([#$%&~_^{}])/g, \"$1\");\n url = res.text.replace(/{\\u2044}/g, \"/\");\n return {\n type: \"url\",\n mode: this.mode,\n url\n };\n }\n\n /**\n * Parses an argument with the mode specified.\n */\n parseArgumentGroup(optional, mode) {\n const argToken = this.gullet.scanArgument(optional);\n if (argToken == null) {\n return null;\n }\n const outerMode = this.mode;\n if (mode) {\n // Switch to specified mode\n this.switchMode(mode);\n }\n\n this.gullet.beginGroup();\n const expression = this.parseExpression(false, \"EOF\");\n // TODO: find an alternative way to denote the end\n this.expect(\"EOF\"); // expect the end of the argument\n this.gullet.endGroup();\n const result = {\n type: \"ordgroup\",\n mode: this.mode,\n loc: argToken.loc,\n body: expression\n };\n\n if (mode) {\n // Switch mode back\n this.switchMode(outerMode);\n }\n return result;\n }\n\n /**\n * Parses an ordinary group, which is either a single nucleus (like \"x\")\n * or an expression in braces (like \"{x+y}\") or an implicit group, a group\n * that starts at the current position, and ends right before a higher explicit\n * group ends, or at EOF.\n */\n parseGroup(\n name, // For error reporting.\n breakOnTokenText\n ) {\n const firstToken = this.fetch();\n const text = firstToken.text;\n\n let result;\n // Try to parse an open brace or \\begingroup\n if (text === \"{\" || text === \"\\\\begingroup\" || text === \"\\\\toggle\") {\n this.consume();\n const groupEnd = text === \"{\"\n ? \"}\"\n : text === \"\\\\begingroup\"\n ? \"\\\\endgroup\"\n : \"\\\\endtoggle\";\n\n this.gullet.beginGroup();\n // If we get a brace, parse an expression\n const expression = this.parseExpression(false, groupEnd);\n const lastToken = this.fetch();\n this.expect(groupEnd); // Check that we got a matching closing brace\n this.gullet.endGroup();\n result = {\n type: (lastToken.text === \"\\\\endtoggle\" ? \"toggle\" : \"ordgroup\"),\n mode: this.mode,\n loc: SourceLocation.range(firstToken, lastToken),\n body: expression,\n // A group formed by \\begingroup...\\endgroup is a semi-simple group\n // which doesn't affect spacing in math mode, i.e., is transparent.\n // https://tex.stackexchange.com/questions/1930/\n semisimple: text === \"\\\\begingroup\" || undefined\n };\n } else {\n // If there exists a function with this name, parse the function.\n // Otherwise, just return a nucleus\n result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol();\n if (result == null && text[0] === \"\\\\\" &&\n !Object.prototype.hasOwnProperty.call(implicitCommands, text )) {\n result = this.formatUnsupportedCmd(text);\n this.consume();\n }\n }\n return result;\n }\n\n /**\n * Form ligature-like combinations of characters for text mode.\n * This includes inputs like \"--\", \"---\", \"``\" and \"''\".\n * The result will simply replace multiple textord nodes with a single\n * character in each value by a single textord node having multiple\n * characters in its value. The representation is still ASCII source.\n * The group will be modified in place.\n */\n formLigatures(group) {\n let n = group.length - 1;\n for (let i = 0; i < n; ++i) {\n const a = group[i];\n const v = a.text;\n if (v === \"-\" && group[i + 1].text === \"-\") {\n if (i + 1 < n && group[i + 2].text === \"-\") {\n group.splice(i, 3, {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(a, group[i + 2]),\n text: \"---\"\n });\n n -= 2;\n } else {\n group.splice(i, 2, {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(a, group[i + 1]),\n text: \"--\"\n });\n n -= 1;\n }\n }\n if ((v === \"'\" || v === \"`\") && group[i + 1].text === v) {\n group.splice(i, 2, {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(a, group[i + 1]),\n text: v + v\n });\n n -= 1;\n }\n }\n }\n\n /**\n * Parse a single symbol out of the string. Here, we handle single character\n * symbols and special functions like \\verb.\n */\n parseSymbol() {\n const nucleus = this.fetch();\n let text = nucleus.text;\n\n if (/^\\\\verb[^a-zA-Z]/.test(text)) {\n this.consume();\n let arg = text.slice(5);\n const star = arg.charAt(0) === \"*\";\n if (star) {\n arg = arg.slice(1);\n }\n // Lexer's tokenRegex is constructed to always have matching\n // first/last characters.\n if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) {\n throw new ParseError(`\\\\verb assertion failed --\n please report what input caused this bug`);\n }\n arg = arg.slice(1, -1); // remove first and last char\n return {\n type: \"verb\",\n mode: \"text\",\n body: arg,\n star\n };\n }\n // At this point, we should have a symbol, possibly with accents.\n // First expand any accented base symbol according to unicodeSymbols.\n if (Object.prototype.hasOwnProperty.call(unicodeSymbols, text[0]) &&\n this.mode === \"math\" && !symbols[this.mode][text[0]]) {\n // This behavior is not strict (XeTeX-compatible) in math mode.\n if (this.settings.strict && this.mode === \"math\") {\n throw new ParseError(`Accented Unicode text character \"${text[0]}\" used in ` + `math mode`,\n nucleus\n );\n }\n text = unicodeSymbols[text[0]] + text.slice(1);\n }\n // Strip off any combining characters\n const match = this.mode === \"math\"\n ? combiningDiacriticalMarksEndRegex.exec(text)\n : null;\n if (match) {\n text = text.substring(0, match.index);\n if (text === \"i\") {\n text = \"\\u0131\"; // dotless i, in math and text mode\n } else if (text === \"j\") {\n text = \"\\u0237\"; // dotless j, in math and text mode\n }\n }\n // Recognize base symbol\n let symbol;\n if (symbols[this.mode][text]) {\n let group = symbols[this.mode][text].group;\n if (group === \"bin\" && binLeftCancellers.includes(this.prevAtomType)) {\n // Change from a binary operator to a unary (prefix) operator\n group = \"open\";\n }\n const loc = SourceLocation.range(nucleus);\n let s;\n if (Object.prototype.hasOwnProperty.call(ATOMS, group )) {\n const family = group;\n s = {\n type: \"atom\",\n mode: this.mode,\n family,\n loc,\n text\n };\n if ((family === \"rel\" || family === \"bin\") && this.prevAtomType === \"text\") {\n if (textRegEx.test(loc.lexer.input.slice(loc.end))) {\n s.needsSpacing = true; // Fix a MathML bug.\n }\n }\n } else {\n if (asciiFromScript[text]) {\n // Unicode 14 disambiguates chancery from roundhand.\n // See https://www.unicode.org/charts/PDF/U1D400.pdf\n this.consume();\n const nextCode = this.fetch().text.charCodeAt(0);\n // mathcal is Temml default. Use mathscript if called for.\n const font = nextCode === 0xfe01 ? \"mathscr\" : \"mathcal\";\n if (nextCode === 0xfe00 || nextCode === 0xfe01) { this.consume(); }\n return {\n type: \"font\",\n mode: \"math\",\n font,\n body: { type: \"mathord\", mode: \"math\", loc, text: asciiFromScript[text] }\n }\n }\n // Default ord character. No disambiguation necessary.\n s = {\n type: group,\n mode: this.mode,\n loc,\n text\n };\n }\n symbol = s;\n } else if (text.charCodeAt(0) >= 0x80 || combiningDiacriticalMarksEndRegex.exec(text)) {\n // no symbol for e.g. ^\n if (this.settings.strict && this.mode === \"math\") {\n throw new ParseError(`Unicode text character \"${text[0]}\" used in math mode`, nucleus)\n }\n // All nonmathematical Unicode characters are rendered as if they\n // are in text mode (wrapped in \\text) because that's what it\n // takes to render them in LaTeX.\n symbol = {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(nucleus),\n text\n };\n } else {\n return null; // EOF, ^, _, {, }, etc.\n }\n this.consume();\n // Transform combining characters into accents\n if (match) {\n for (let i = 0; i < match[0].length; i++) {\n const accent = match[0][i];\n if (!unicodeAccents[accent]) {\n throw new ParseError(`Unknown accent ' ${accent}'`, nucleus);\n }\n const command = unicodeAccents[accent][this.mode] ||\n unicodeAccents[accent].text;\n if (!command) {\n throw new ParseError(`Accent ${accent} unsupported in ${this.mode} mode`, nucleus);\n }\n symbol = {\n type: \"accent\",\n mode: this.mode,\n loc: SourceLocation.range(nucleus),\n label: command,\n isStretchy: false,\n base: symbol\n };\n }\n }\n return symbol;\n }\n}\n\n/**\n * Parses an expression using a Parser, then returns the parsed result.\n */\nconst parseTree = function(toParse, settings) {\n if (!(typeof toParse === \"string\" || toParse instanceof String)) {\n throw new TypeError(\"Temml can only parse string typed expression\")\n }\n const parser = new Parser(toParse, settings);\n // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n delete parser.gullet.macros.current[\"\\\\df@tag\"];\n\n let tree = parser.parse();\n\n // LaTeX ignores a \\tag placed outside an AMS environment.\n if (!(tree.length > 0 && tree[0].type && tree[0].type === \"array\" && tree[0].addEqnNum)) {\n // If the input used \\tag, it will set the \\df@tag macro to the tag.\n // In this case, we separately parse the tag and wrap the tree.\n if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n if (!settings.displayMode) {\n throw new ParseError(\"\\\\tag works only in display mode\")\n }\n parser.gullet.feed(\"\\\\df@tag\");\n tree = [\n {\n type: \"tag\",\n mode: \"text\",\n body: tree,\n tag: parser.parse()\n }\n ];\n }\n }\n\n return tree\n};\n\n/**\n * This file contains information about the style that the mathmlBuilder carries\n * around with it. Data is held in an `Style` object, and when\n * recursing, a new `Style` object can be created with the `.with*` functions.\n */\n\nconst subOrSupLevel = [2, 2, 3, 3];\n\n/**\n * This is the main Style class. It contains the current style.level, color, and font.\n *\n * Style objects should not be modified. To create a new Style with\n * different properties, call a `.with*` method.\n */\nclass Style {\n constructor(data) {\n // Style.level can be 0 | 1 | 2 | 3, which correspond to\n // displaystyle, textstyle, scriptstyle, and scriptscriptstyle.\n // style.level usually does not directly set MathML's script level. MathML does that itself.\n // However, Chromium does not stop shrinking after scriptscriptstyle, so we do explicitly\n // set a scriptlevel attribute in those conditions.\n // We also use style.level to track math style so that we can get the correct\n // scriptlevel when needed in supsub.js, mathchoice.js, or for dimensions in em.\n this.level = data.level;\n this.color = data.color; // string | void\n // A font family applies to a group of fonts (i.e. SansSerif), while a font\n // represents a specific font (i.e. SansSerif Bold).\n // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm\n this.font = data.font || \"\"; // string\n this.fontFamily = data.fontFamily || \"\"; // string\n this.fontSize = data.fontSize || 1.0; // number\n this.fontWeight = data.fontWeight || \"\";\n this.fontShape = data.fontShape || \"\";\n this.maxSize = data.maxSize; // [number, number]\n }\n\n /**\n * Returns a new style object with the same properties as \"this\". Properties\n * from \"extension\" will be copied to the new style object.\n */\n extend(extension) {\n const data = {\n level: this.level,\n color: this.color,\n font: this.font,\n fontFamily: this.fontFamily,\n fontSize: this.fontSize,\n fontWeight: this.fontWeight,\n fontShape: this.fontShape,\n maxSize: this.maxSize\n };\n\n for (const key in extension) {\n if (Object.prototype.hasOwnProperty.call(extension, key)) {\n data[key] = extension[key];\n }\n }\n\n return new Style(data);\n }\n\n withLevel(n) {\n return this.extend({\n level: n\n });\n }\n\n incrementLevel() {\n return this.extend({\n level: Math.min(this.level + 1, 3)\n });\n }\n\n inSubOrSup() {\n return this.extend({\n level: subOrSupLevel[this.level]\n })\n }\n\n /**\n * Create a new style object with the given color.\n */\n withColor(color) {\n return this.extend({\n color: color\n });\n }\n\n /**\n * Creates a new style object with the given math font or old text font.\n * @type {[type]}\n */\n withFont(font) {\n return this.extend({\n font\n });\n }\n\n /**\n * Create a new style objects with the given fontFamily.\n */\n withTextFontFamily(fontFamily) {\n return this.extend({\n fontFamily,\n font: \"\"\n });\n }\n\n /**\n * Creates a new style object with the given font size\n */\n withFontSize(num) {\n return this.extend({\n fontSize: num\n });\n }\n\n /**\n * Creates a new style object with the given font weight\n */\n withTextFontWeight(fontWeight) {\n return this.extend({\n fontWeight,\n font: \"\"\n });\n }\n\n /**\n * Creates a new style object with the given font weight\n */\n withTextFontShape(fontShape) {\n return this.extend({\n fontShape,\n font: \"\"\n });\n }\n\n /**\n * Gets the CSS color of the current style object\n */\n getColor() {\n return this.color;\n }\n}\n\n/* Temml Post Process\n * Populate the text contents of each \\ref & \\eqref\n *\n * As with other Temml code, this file is released under terms of the MIT license.\n * https://mit-license.org/\n */\n\nconst version = \"0.11.02\";\n\nfunction postProcess(block) {\n const labelMap = {};\n let i = 0;\n\n // Get a collection of the parents of each \\tag & auto-numbered equation\n const amsEqns = document.getElementsByClassName('tml-eqn');\n for (let parent of amsEqns) {\n // AMS automatically numbered equation.\n // Assign an id.\n i += 1;\n parent.setAttribute(\"id\", \"tml-eqn-\" + String(i));\n // No need to write a number into the text content of the element.\n // A CSS counter has done that even if this postProcess() function is not used.\n\n // Find any \\label that refers to an AMS automatic eqn number.\n while (true) {\n if (parent.tagName === \"mtable\") { break }\n const labels = parent.getElementsByClassName(\"tml-label\");\n if (labels.length > 0) {\n const id = parent.attributes.id.value;\n labelMap[id] = String(i);\n break\n } else {\n parent = parent.parentElement;\n }\n }\n }\n\n // Find \\labels associated with \\tag\n const taggedEqns = document.getElementsByClassName('tml-tageqn');\n for (const parent of taggedEqns) {\n const labels = parent.getElementsByClassName(\"tml-label\");\n if (labels.length > 0) {\n const tags = parent.getElementsByClassName(\"tml-tag\");\n if (tags.length > 0) {\n const id = parent.attributes.id.value;\n labelMap[id] = tags[0].textContent;\n }\n }\n }\n\n // Populate \\ref & \\eqref text content\n const refs = block.getElementsByClassName(\"tml-ref\");\n [...refs].forEach(ref => {\n const attr = ref.getAttribute(\"href\");\n let str = labelMap[attr.slice(1)];\n if (ref.className.indexOf(\"tml-eqref\") === -1) {\n // \\ref. Omit parens.\n str = str.replace(/^\\(/, \"\");\n str = str.replace(/\\)$/, \"\");\n } else {\n // \\eqref. Include parens\n if (str.charAt(0) !== \"(\") { str = \"(\" + str; }\n if (str.slice(-1) !== \")\") { str = str + \")\"; }\n }\n const mtext = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"mtext\");\n mtext.appendChild(document.createTextNode(str));\n const math = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"math\");\n math.appendChild(mtext);\n ref.textContent = '';\n ref.appendChild(math);\n });\n}\n\nconst findEndOfMath = function(delimiter, text, startIndex) {\n // Adapted from\n // https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx\n let index = startIndex;\n let braceLevel = 0;\n\n const delimLength = delimiter.length;\n\n while (index < text.length) {\n const character = text[index];\n\n if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) {\n return index;\n } else if (character === \"\\\\\") {\n index++;\n } else if (character === \"{\") {\n braceLevel++;\n } else if (character === \"}\") {\n braceLevel--;\n }\n\n index++;\n }\n\n return -1;\n};\n\nconst escapeRegex = function(string) {\n return string.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n};\n\nconst amsRegex = /^\\\\(?:begin|(?:eq)?ref){/;\n\nconst splitAtDelimiters = function(text, delimiters) {\n let index;\n const data = [];\n\n const regexLeft = new RegExp(\n \"(\" + delimiters.map((x) => escapeRegex(x.left)).join(\"|\") + \")\"\n );\n\n while (true) {\n index = text.search(regexLeft);\n if (index === -1) {\n break;\n }\n if (index > 0) {\n data.push({\n type: \"text\",\n data: text.slice(0, index)\n });\n text = text.slice(index); // now text starts with delimiter\n }\n // ... so this always succeeds:\n const i = delimiters.findIndex((delim) => text.startsWith(delim.left));\n index = findEndOfMath(delimiters[i].right, text, delimiters[i].left.length);\n if (index === -1) {\n break;\n }\n const rawData = text.slice(0, index + delimiters[i].right.length);\n const math = amsRegex.test(rawData)\n ? rawData\n : text.slice(delimiters[i].left.length, index);\n data.push({\n type: \"math\",\n data: math,\n rawData,\n display: delimiters[i].display\n });\n text = text.slice(index + delimiters[i].right.length);\n }\n\n if (text !== \"\") {\n data.push({\n type: \"text\",\n data: text\n });\n }\n\n return data;\n};\n\nconst defaultDelimiters = [\n { left: \"$$\", right: \"$$\", display: true },\n { left: \"\\\\(\", right: \"\\\\)\", display: false },\n // LaTeX uses $…$, but it ruins the display of normal `$` in text:\n // {left: \"$\", right: \"$\", display: false},\n // $ must come after $$\n\n // Render AMS environments even if outside $$…$$ delimiters.\n { left: \"\\\\begin{equation}\", right: \"\\\\end{equation}\", display: true },\n { left: \"\\\\begin{equation*}\", right: \"\\\\end{equation*}\", display: true },\n { left: \"\\\\begin{align}\", right: \"\\\\end{align}\", display: true },\n { left: \"\\\\begin{align*}\", right: \"\\\\end{align*}\", display: true },\n { left: \"\\\\begin{alignat}\", right: \"\\\\end{alignat}\", display: true },\n { left: \"\\\\begin{alignat*}\", right: \"\\\\end{alignat*}\", display: true },\n { left: \"\\\\begin{gather}\", right: \"\\\\end{gather}\", display: true },\n { left: \"\\\\begin{gather*}\", right: \"\\\\end{gather*}\", display: true },\n { left: \"\\\\begin{CD}\", right: \"\\\\end{CD}\", display: true },\n // Ditto \\ref & \\eqref\n { left: \"\\\\ref{\", right: \"}\", display: false },\n { left: \"\\\\eqref{\", right: \"}\", display: false },\n\n { left: \"\\\\[\", right: \"\\\\]\", display: true }\n];\n\nconst firstDraftDelimiters = {\n \"$\": [\n { left: \"$$\", right: \"$$\", display: true },\n { left: \"$`\", right: \"`$\", display: false },\n { left: \"$\", right: \"$\", display: false }\n ],\n \"(\": [\n { left: \"\\\\[\", right: \"\\\\]\", display: true },\n { left: \"\\\\(\", right: \"\\\\)\", display: false }\n ]\n};\n\nconst amsDelimiters = [\n { left: \"\\\\begin{equation}\", right: \"\\\\end{equation}\", display: true },\n { left: \"\\\\begin{equation*}\", right: \"\\\\end{equation*}\", display: true },\n { left: \"\\\\begin{align}\", right: \"\\\\end{align}\", display: true },\n { left: \"\\\\begin{align*}\", right: \"\\\\end{align*}\", display: true },\n { left: \"\\\\begin{alignat}\", right: \"\\\\end{alignat}\", display: true },\n { left: \"\\\\begin{alignat*}\", right: \"\\\\end{alignat*}\", display: true },\n { left: \"\\\\begin{gather}\", right: \"\\\\end{gather}\", display: true },\n { left: \"\\\\begin{gather*}\", right: \"\\\\end{gather*}\", display: true },\n { left: \"\\\\begin{CD}\", right: \"\\\\end{CD}\", display: true },\n { left: \"\\\\ref{\", right: \"}\", display: false },\n { left: \"\\\\eqref{\", right: \"}\", display: false }\n];\n\nconst delimitersFromKey = key => {\n if (key === \"$\" || key === \"(\") {\n return firstDraftDelimiters[key];\n } else if (key === \"$+\" || key === \"(+\") {\n const firstDraft = firstDraftDelimiters[key.slice(0, 1)];\n return firstDraft.concat(amsDelimiters)\n } else if (key === \"ams\") {\n return amsDelimiters\n } else if (key === \"all\") {\n return (firstDraftDelimiters[\"(\"]).concat(firstDraftDelimiters[\"$\"]).concat(amsDelimiters)\n } else {\n return defaultDelimiters\n }\n};\n\n/* Note: optionsCopy is mutated by this method. If it is ever exposed in the\n * API, we should copy it before mutating.\n */\nconst renderMathInText = function(text, optionsCopy) {\n const data = splitAtDelimiters(text, optionsCopy.delimiters);\n if (data.length === 1 && data[0].type === \"text\") {\n // There is no formula in the text.\n // Let's return null which means there is no need to replace\n // the current text node with a new one.\n return null;\n }\n\n const fragment = document.createDocumentFragment();\n\n for (let i = 0; i < data.length; i++) {\n if (data[i].type === \"text\") {\n fragment.appendChild(document.createTextNode(data[i].data));\n } else {\n const span = document.createElement(\"span\");\n let math = data[i].data;\n // Override any display mode defined in the settings with that\n // defined by the text itself\n optionsCopy.displayMode = data[i].display;\n try {\n if (optionsCopy.preProcess) {\n math = optionsCopy.preProcess(math);\n }\n // Importing render() from temml.js would be a circular dependency.\n // So call the global version.\n // eslint-disable-next-line no-undef\n temml.render(math, span, optionsCopy);\n } catch (e) {\n if (!(e instanceof ParseError)) {\n throw e;\n }\n optionsCopy.errorCallback(\n \"Temml auto-render: Failed to parse `\" + data[i].data + \"` with \",\n e\n );\n fragment.appendChild(document.createTextNode(data[i].rawData));\n continue;\n }\n fragment.appendChild(span);\n }\n }\n\n return fragment;\n};\n\nconst renderElem = function(elem, optionsCopy) {\n for (let i = 0; i < elem.childNodes.length; i++) {\n const childNode = elem.childNodes[i];\n if (childNode.nodeType === 3) {\n // Text node\n const frag = renderMathInText(childNode.textContent, optionsCopy);\n if (frag) {\n i += frag.childNodes.length - 1;\n elem.replaceChild(frag, childNode);\n }\n } else if (childNode.nodeType === 1) {\n // Element node\n const className = \" \" + childNode.className + \" \";\n const shouldRender =\n optionsCopy.ignoredTags.indexOf(childNode.nodeName.toLowerCase()) === -1 &&\n optionsCopy.ignoredClasses.every((x) => className.indexOf(\" \" + x + \" \") === -1);\n\n if (shouldRender) {\n renderElem(childNode, optionsCopy);\n }\n }\n // Otherwise, it's something else, and ignore it.\n }\n};\n\nconst renderMathInElement = function(elem, options) {\n if (!elem) {\n throw new Error(\"No element provided to render\");\n }\n\n const optionsCopy = {};\n\n // Object.assign(optionsCopy, option)\n for (const option in options) {\n if (Object.prototype.hasOwnProperty.call(options, option)) {\n optionsCopy[option] = options[option];\n }\n }\n\n if (optionsCopy.fences) {\n optionsCopy.delimiters = delimitersFromKey(optionsCopy.fences);\n } else {\n optionsCopy.delimiters = optionsCopy.delimiters || defaultDelimiters;\n }\n optionsCopy.ignoredTags = optionsCopy.ignoredTags || [\n \"script\",\n \"noscript\",\n \"style\",\n \"textarea\",\n \"pre\",\n \"code\",\n \"option\"\n ];\n optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || [];\n // eslint-disable-next-line no-console\n optionsCopy.errorCallback = optionsCopy.errorCallback || console.error;\n\n // Enable sharing of global macros defined via `\\gdef` between different\n // math elements within a single call to `renderMathInElement`.\n optionsCopy.macros = optionsCopy.macros || {};\n\n renderElem(elem, optionsCopy);\n postProcess(elem);\n};\n\n/* eslint no-console:0 */\n/**\n * This is the main entry point for Temml. Here, we expose functions for\n * rendering expressions either to DOM nodes or to markup strings.\n *\n * We also expose the ParseError class to check if errors thrown from Temml are\n * errors in the expression, or errors in javascript handling.\n */\n\n\n/**\n * @type {import('./temml').render}\n * Parse and build an expression, and place that expression in the DOM node\n * given.\n */\nlet render = function(expression, baseNode, options = {}) {\n baseNode.textContent = \"\";\n const alreadyInMathElement = baseNode.tagName.toLowerCase() === \"math\";\n if (alreadyInMathElement) { options.wrap = \"none\"; }\n const math = renderToMathMLTree(expression, options);\n if (alreadyInMathElement) {\n // The <math> element already exists. Populate it.\n baseNode.textContent = \"\";\n math.children.forEach(e => { baseNode.appendChild(e.toNode()); });\n } else if (math.children.length > 1) {\n baseNode.textContent = \"\";\n math.children.forEach(e => { baseNode.appendChild(e.toNode()); });\n } else {\n baseNode.appendChild(math.toNode());\n }\n};\n\n// Temml's styles don't work properly in quirks mode. Print out an error, and\n// disable rendering.\nif (typeof document !== \"undefined\") {\n if (document.compatMode !== \"CSS1Compat\") {\n typeof console !== \"undefined\" &&\n console.warn(\n \"Warning: Temml doesn't work in quirks mode. Make sure your \" +\n \"website has a suitable doctype.\"\n );\n\n render = function() {\n throw new ParseError(\"Temml doesn't work in quirks mode.\");\n };\n }\n}\n\n/**\n * @type {import('./temml').renderToString}\n * Parse and build an expression, and return the markup for that.\n */\nconst renderToString = function(expression, options) {\n const markup = renderToMathMLTree(expression, options).toMarkup();\n return markup;\n};\n\n/**\n * @type {import('./temml').generateParseTree}\n * Parse an expression and return the parse tree.\n */\nconst generateParseTree = function(expression, options) {\n const settings = new Settings(options);\n return parseTree(expression, settings);\n};\n\n/**\n * @type {import('./temml').definePreamble}\n * Take an expression which contains a preamble.\n * Parse it and return the macros.\n */\nconst definePreamble = function(expression, options) {\n const settings = new Settings(options);\n settings.macros = {};\n if (!(typeof expression === \"string\" || expression instanceof String)) {\n throw new TypeError(\"Temml can only parse string typed expression\")\n }\n const parser = new Parser(expression, settings, true);\n // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n delete parser.gullet.macros.current[\"\\\\df@tag\"];\n const macros = parser.parse();\n return macros\n};\n\n/**\n * If the given error is a Temml ParseError,\n * renders the invalid LaTeX as a span with hover title giving the Temml\n * error message. Otherwise, simply throws the error.\n */\nconst renderError = function(error, expression, options) {\n if (options.throwOnError || !(error instanceof ParseError)) {\n throw error;\n }\n const node = new Span([\"temml-error\"], [new TextNode$1(expression + \"\\n\\n\" + error.toString())]);\n node.style.color = options.errorColor;\n node.style.whiteSpace = \"pre-line\";\n return node;\n};\n\n/**\n * @type {import('./temml').renderToMathMLTree}\n * Generates and returns the Temml build tree. This is used for advanced\n * use cases (like rendering to custom output).\n */\nconst renderToMathMLTree = function(expression, options) {\n const settings = new Settings(options);\n try {\n const tree = parseTree(expression, settings);\n const style = new Style({\n level: settings.displayMode ? StyleLevel.DISPLAY : StyleLevel.TEXT,\n maxSize: settings.maxSize\n });\n return buildMathML(tree, expression, style, settings);\n } catch (error) {\n return renderError(error, expression, settings);\n }\n};\n\n/** @type {import('./temml').default} */\nvar temml$1 = {\n /**\n * Current Temml version\n */\n version: version,\n /**\n * Renders the given LaTeX into MathML, and adds\n * it as a child to the specified DOM node.\n */\n render,\n /**\n * Renders the given LaTeX into MathML string,\n * for sending to the client.\n */\n renderToString,\n /**\n * Finds all the math delimiters in a given element of a running HTML document\n * and converts the contents of each instance into a <math> element.\n */\n renderMathInElement,\n /**\n * Post-process an entire HTML block.\n * Writes AMS auto-numbers and implements \\ref{}.\n * Typcally called once, after a loop has rendered many individual spans.\n */\n postProcess,\n /**\n * Temml error, usually during parsing.\n */\n ParseError,\n /**\n * Creates a set of macros with document-wide scope.\n */\n definePreamble,\n /**\n * Parses the given LaTeX into Temml's internal parse tree structure,\n * without rendering to HTML or MathML.\n *\n * NOTE: This method is not currently recommended for public use.\n * The internal tree representation is unstable and is very likely\n * to change. Use at your own risk.\n */\n __parse: generateParseTree,\n /**\n * Renders the given LaTeX into a MathML internal DOM tree\n * representation, without flattening that representation to a string.\n *\n * NOTE: This method is not currently recommended for public use.\n * The internal tree representation is unstable and is very likely\n * to change. Use at your own risk.\n */\n __renderToMathMLTree: renderToMathMLTree,\n /**\n * adds a new symbol to builtin symbols table\n */\n __defineSymbol: defineSymbol,\n /**\n * adds a new macro to builtin macro list\n */\n __defineMacro: defineMacro\n};\n\nmodule.exports = temml$1;\n","// Entry point elements\n// These are the elements that will be used to find the main content\nexport const ENTRY_POINT_ELEMENTS = [\n\t'article',\n\t'[role=\"article\"]',\n\t'.post-content',\n\t'.article-content',\n\t'#article-content',\n\t'.article_post',\n\t'.entry-content',\n\t'.content-article',\n\t'.markdown-body',\n\t'main',\n\t'[role=\"main\"]',\n\t'body' // ensures there is always a match\n];\n\nexport const MOBILE_WIDTH = 600;\nexport const BLOCK_ELEMENTS = ['div', 'section', 'article', 'main'];\n\n// Elements that should not be unwrapped\nexport const PRESERVE_ELEMENTS = new Set([\n\t'pre', 'code', 'table', 'thead', 'tbody', 'tr', 'td', 'th',\n\t'ul', 'ol', 'li', 'dl', 'dt', 'dd',\n\t'figure', 'figcaption', 'picture',\n\t'details', 'summary',\n\t'blockquote',\n\t'form', 'fieldset'\n]);\n\n// Inline elements that should not be unwrapped\nexport const INLINE_ELEMENTS = new Set([\n\t'a', 'span', 'strong', 'em', 'i', 'b', 'u', 'code', 'br', 'small',\n\t'sub', 'sup', 'mark', 'del', 'ins', 'q', 'abbr', 'cite', 'time'\n]);\n\n// Hidden elements that should be removed\nexport const HIDDEN_ELEMENT_SELECTORS = [\n\t'[hidden]',\n \t'[aria-hidden=\"true\"]:not([class*=\"math\"])',\n\t'[style*=\"display: none\"]:not([class*=\"math\"])',\n\t'[style*=\"display:none\"]:not([class*=\"math\"])',\n\t'[style*=\"visibility: hidden\"]',\n\t'[style*=\"visibility:hidden\"]',\n\t'.hidden',\n\t'.invisible'\n].join(',');\n\n// Selectors to be removed\nexport const EXACT_SELECTORS = [\n\t// scripts, styles\n\t'noscript',\n\t'script:not([type^=\"math/\"])',\n\t'style',\n\t'meta',\n\t'link',\n\n\t// ads\n\t'.ad:not([class*=\"gradient\"])',\n\t'[class^=\"ad-\" i]',\n\t'[class$=\"-ad\" i]',\n\t'[id^=\"ad-\" i]',\n\t'[id$=\"-ad\" i]',\n\t'[role=\"banner\" i]',\n\t'.promo',\n\t'.Promo',\n\t'#barrier-page', // ft.com\n\n\t// comments\n\t'[id=\"comments\" i]',\n\n\t// header, nav\n\t'header',\n\t'.header:not(.banner)',\n\t'#header',\n\t'#Header',\n\t'#banner',\n\t'#Banner',\n\t'nav',\n\t'.navigation',\n\t'#navigation',\n\t'[role=\"navigation\" i]',\n\t'[role=\"dialog\" i]',\n\t'[role*=\"complementary\" i]',\n\t'[class*=\"pagination\" i]',\n\t'.menu',\n\t'#menu',\n\t'#siteSub',\n\t'.fixed',\n\n\t// metadata\n\t'.author',\n\t'.Author',\n\t'.contributor',\n\t'.date',\n\t'[data-date]',\n\t'.meta',\n\t'.tags',\n\t'.toc',\n\t'.Toc',\n\t'#toc',\n\t'#title',\n\t'#Title',\n\t'#articleTag',\n\t'[href*=\"/category\"]',\n\t'[href*=\"/categories\"]',\n\t'[href*=\"/tag/\"]',\n\t'[href*=\"/tags/\"]',\n\t'[href*=\"/topics\"]',\n\t'[href*=\"author\"]',\n\t'[href*=\"#toc\"]',\n\t'[href=\"#top\"]',\n\t'[href=\"#Top\"]',\n\t'[href=\"#site-content\"]',\n\t'[href=\"#main-content\"]',\n\t'[href^=\"#main\"]',\n\t'[src*=\"author\"]',\n\n\t// footer\n\t'footer',\n\n\t// inputs, forms, elements\n\t'.aside',\n\t'aside',\n\t'button',\n\t\t// '[role=\"button\"]', Medium images\n\t'canvas',\n\t'dialog',\n\t'fieldset',\n\t'form',\n\t'input:not([type=\"checkbox\"])',\n\t'label',\n\t'option',\n\t'select',\n\t'textarea',\n\t'time',\n\n\t// iframes\n\t'instaread-player',\n\t'iframe:not([src*=\"youtube\"]):not([src*=\"youtu.be\"]):not([src*=\"vimeo\"]):not([src*=\"twitter\"]):not([src*=\"x.com\"]):not([src*=\"datawrapper\"])',\n\n\t// logos\n\t'[class=\"logo\" i]',\n\t'#logo',\n\t'#Logo',\n\n\t// newsletter\n\t'#newsletter',\n\t'#Newsletter',\n\n\t// hidden for print\n\t'.noprint',\n\t'[data-link-name*=\"skip\" i]',\n\t'[data-print-layout=\"hide\" i]',\n\t'[data-block=\"donotprint\" i]',\n\n\t// footnotes, citations\n\t'[class*=\"clickable-icon\" i]',\n\t'li span[class*=\"ltx_tag\" i][class*=\"ltx_tag_item\" i]',\n\t'a[href^=\"#\"][class*=\"anchor\" i]',\n\t'a[href^=\"#\"][class*=\"ref\" i]',\n\n\t// link lists\n\t'[data-container*=\"most-viewed\" i]',\n\n\t// sidebar\n\t'.sidebar',\n\t'.Sidebar',\n\t'#sidebar',\n\t'#Sidebar',\n\t'#sitesub',\n\t\n\t// other\n\t'.gutter',\n\t'#primaryaudio', // NPR\n\t'#NYT_ABOVE_MAIN_CONTENT_REGION',\n\t'[data-testid=\"photoviewer-children-figure\"] > span', // New York Times\n\t'table.infobox',\n\t'.pencraft:not(.pc-display-contents)', // Substack\n\t'[data-optimizely=\"related-articles-section\" i]' // The Economist\n];\n\n// Attributes to test against for partial matches\nexport const TEST_ATTRIBUTES = [\n\t'class',\n\t'id',\n\t'data-test',\n\t'data-testid',\n\t'data-test-id',\n\t'data-qa',\n\t'data-cy'\n];\n\n// Removal patterns tested against attributes above\n// Case insensitive, partial matches allowed\nexport const PARTIAL_SELECTORS = [\n\t'a-statement',\n\t'access-wall',\n\t'activitypub',\n\t'actioncall',\n\t'after_main_article',\n\t'appendix',\n\t'avatar',\n\t'advert',\n//\t'-ad-', howtogeek.com\n\t'adlayout',\n\t'ad-tldr',\n\t'ad-placement',\n\t'_ad_',\n\t'allterms',\n\t'alert-box',\n\t'around-the-web',\n\t'aroundpages',\n\t'article-author',\n\t'article-bottom-section',\n\t'article-bottom',\n\t'article-category',\n\t'article-citation',\n\t'article__copy',\n\t'article_date',\n\t'article-end ',\n\t'article_header',\n\t'article-header',\n\t'article__header',\n\t'article__hero',\n\t'article__info',\n\t'article-info',\n\t'article-meta',\n\t'article_meta',\n\t'article__meta',\n\t'article-subject',\n\t'article_subject',\n\t'article-snippet',\n\t'article-separator',\n\t'article--share',\n\t'article--topics',\n\t'articletags',\n\t'article-tags',\n\t'article_tags',\n\t'article-title',\n\t'article_title',\n\t'articletopics',\n\t'article-topics',\n//\t'article-type',\n\t'article--lede', // The Verge\n\t'articlewell',\n\t'associated-people',\n\t'audio-card',\n//\t'author', Gwern\n\t'author-bio',\n\t'author-box',\n\t'author-info',\n\t'author-mini-bio',\n\t'author-name',\n\t'author-publish-info',\n\t'authored-by',\n\n\t'back-to-top',\n\t'backlink_container',\n\t'backlinks-section',\n//\t'banner',\n\t'bio-block',\n\t'biobox',\n\t'blog-pager',\n\t'bookmark-',\n\t'-bookmark',\n\t'bottominfo',\n\t'bottom-of-article',\n\t'bottom-wrapper',\n\t'brand-bar',\n\t'breadcrumb',\n\t'button-wrapper',\n\t'buttons-container',\n\t'btn-',\n\t'-btn',\n\t'byline',\n\n\t'captcha',\n\t'card-text',\n\t'card-media',\n\t'card-post',\n//\t'carousel',\n\t'cat_header',\n\t'catlinks',\n\t'chapter-list', // The Economist\n\t'collections',\n\t'comments',\n//\t'-comment', Syntax highlighting\n\t'commentbox',\n\t'comment-button',\n\t'commentcomp',\n\t'comment-content',\n\t'comment-count',\n\t'comment-form',\n\t'comment-number',\n\t'comment-respond',\n\t'comment-thread',\n\t'complementary',\n\t'consent',\n\t'content-card', // The Verge\n\t'content-topics',\n\t'contentpromo',\n\t'context-bar',\n\t'context-widget', // Reuters\n\t'core-collateral',\n\t'creative-commons_',\n\t'_cta',\n\t'-cta',\n\t'cta-',\n\t'cta_',\n\t'current-issue', // The Nation\n\t'custom-list-number',\n\n\t'dateline',\n\t'dateheader',\n\t'date-header',\n\t'date_header-',\n//\t'dialog',\n\t'disclaimer',\n\t'disclosure',\n\t'discussion',\n\t'discuss_',\n\t'disqus',\n\t'donate',\n\t'donation',\n\t'dropdown', // Ars Technica\n\n\t'eletters',\n\t'emailsignup',\n\t'engagement-widget',\n\t'entry-author-info',\n\t'entry-categories',\n\t'entry-date',\n\t'entry-meta',\n\t'entry-title',\n\t'entry-utility',\n\t'eyebrow',\n\t'expand-reduce',\n\t'externallinkembedwrapper', // The New Yorker\n\t'extra-services',\n\t'extra-title',\n\t\n\t'facebook',\n\t'fancy-box',\n\t'favorite',\n\t'feedback',\n\t'feed-links',\n\t'field-site-sections',\n\t'fixheader',\n\t'floating-vid',\n//\t'follow',\n\t'footer',\n\t'footnote-back',\n\t'footnoteback',\n\t'for-you',\n\t'frontmatter',\n\t'further-reading',\n\t'fullbleedheader',\n\t\n\t'gated-',\n\t'gh-feed',\n\t'gist-meta',\n//\t'global',\n//\t'google',\n\t'goog-',\n\t'graph-view',\n\n\t'hamburger',\n\t'header_logo',\n\t'header-logo',\n\t'header-pattern', // The Verge\n\t'headlines',\n\t'hero-list',\n\t'hide-for-print',\n\t'hide-print',\n\t'hide-when-no-script',\n\t'hidden-print',\n\t'hidden-sidenote',\n\t'hidden-accessibility',\n\n\t'infoline',\n\t'instacartIntegration',\n\t'interlude',\n\t'interaction',\n\t'itemendrow',\n\t'jumplink',\n\t'jump-to-',\n\n\t'keepreading',\n\t'keep-reading',\n\t'keep_reading',\n//\t'keyword', // used in syntax highlighting\n\t'keyword_wrap',\n\t'kicker',\n\n\t'labstab', // Arxiv\n\t'-labels',\n\t'language-name',\n\t'latest-content',\n\t'-ledes-', // The Verge\n\t'-license',\n\t'lightbox-popup',\n\t'like-button',\n\t'link-box',\n\t'links-grid', // BBC\n\t'links-title', // BBC\n\t'listing-dynamic-terms', // Boston Review\n\t'list-tags',\n\t'listinks',\n\t'loading',\n\t'loa-info',\n\t'logo_container',\n\t'ltx_role_refnum', // Arxiv\n\t'ltx_tag_bibitem',\n\t'ltx_error',\n\n\t'masthead',\n\t'marketing',\n\t'media-inquiry',\n\t'-menu',\n\t'menu-',\n//\t'meta-', syntax highlighting\n\t'metadata',\n\t'might-like',\n\t'minibio',\n\t'more-about',\n\t'_modal',\n\t'-modal',\n\t'more-',\n\t'morenews',\n\t'morestories',\n\t'most-read',\n\t'move-helper',\n\t'mw-editsection',\n\t'mw-cite-backlink',\n\t'mw-indicators',\n\t'mw-jump-link',\n\n\t'nav-',\n\t'nav_',\n\t'navbar',\n//\t'navigation',\n\t'next-',\n\t'newsgallery',\n\t'news-story-title',\n//\t'newsletter', used on Substack\n\t'newsletter_',\n\t'newsletter-form',\n\t'newsletter-signup',\n\t'newslettersignup',\n\t'newsletterwidget',\n\t'newsletterwrapper',\n\t'not-found',\n\t'notessection',\n\t'nomobile',\n\t'noprint',\n\n\t'open-slideshow',\n\t'originally-published', // Mercury News\n\t'outline-view',\n\t'overlay',\n\n\t'page-title',\n\t'paywall_message',\n\t'-partners',\n\t'plea',\n\t'popular',\n//\t'popup', Gwern\n\t'popup_links',\n\t'pop-up',\n\t'popover',\n\t'post-author',\n\t'post-bottom',\n\t'post__category',\n\t'postcomment',\n\t'postdate',\n\t'post-date',\n\t'post_date',\n\t'post-feeds',\n\t'postinfo',\n\t'post-info',\n\t'post_info',\n\t'post-inline-date',\n\t'post-links',\n\t'post_list',\n\t'post_meta',\n\t'post-meta',\n\t'postmeta',\n\t'post-navigation',\n\t'postsnippet',\n\t'post_snippet',\n\t'post-snippet',\n\t'post-subject',\n\t'posttax',\n\t'post-tax',\n\t'post_tax',\n\t'posttag',\n\t'post_tag',\n\t'post-tag',\n\t'post_time',\n\t'posttitle',\n\t'post-title',\n\t'post_title',\n\t'post__title',\n\t'post-ufi-button',\n//\t'preview', used on Obsidian Publish\n\t'prevnext',\n\t'prev_next',\n\t'prev-next',\n\t'previousnext',\n\t'press-inquiries',\n\t'print-none',\n\t'print-header',\n\t'privacy-notice',\n\t'privacy-settings',\n\t'profile',\n//\t'promo',\n\t'promo_article',\n\t'promo-box',\n\t'pubdate',\n\t'pub_date',\n\t'pub-date',\n\t'publication-date',\n\t'publicationName', // Medium\n\n\t'qr-code',\n\t'qr_code',\n\t'quick_up',\n\n\t'_rail',\n\t'ratingssection',\n\t'read_also',\n\t'readmore',\n\t'read-next',\n\t'read_next',\n\t'read_time',\n\t'read-time',\n\t'reading_time',\n\t'reading-time',\n\t'reading-list',\n\t'recent-',\n\t'recent-articles',\n\t'recentpost',\n\t'recent_post',\n\t'recent-post',\n\t'recommend',\n\t'redirectedfrom',\n\t'recirc',\n\t'register',\n\t'related',\n\t'relevant',\n\t'reversefootnote',\n\n\t'screen-reader-text',\n\t'section-nav',\n//\t'share',\n//\t'-share', scitechdaily.com\n\t'share-box',\n\t'sharedaddy',\n\t'share-icons',\n\t'sharelinks',\n\t'share-print',\n\t'share-section',\n\t'sidebartitle',\n\t'sidebar_',\n\t'sidebar-content',\n\t'similar-',\n\t'similar_',\n\t'similars-',\n\t'sideitems',\n\t'sidebar-author',\n\t'sidebar-item',\n\t'side-box',\n\t'side-logo',\n\t'site-index',\n\t'site-header',\n\t'site-logo',\n\t'site-name',\n\t'site-wordpress',\n//\t'skip-',\n//\t'skip-link', TechCrunch\n\t'skip-content',\n\t'c-skip-link',\n\t'_skip-link',\n\t'-slider',\n\t'slug-wrap',\n\t'social',\n\t'speechify-ignore',\n\t'sponsor',\n\t'springercitation',\n//\t'-stats',\n\t'_stats',\n//\t'sticky',\n\t'storyreadtime', // Medium\n\t'storypublishdate', // Medium\n\t'subject-label',\n\t'subhead',\n\t'submenu',\n//\t'subscribe',\n\n\t'_tags',\n\t'tags__item',\n\t'tag_list',\n\t'taxonomy',\n\t'table-content',\n\t'table-of-contents',\n\t'tabs-',\n//\t'teaser', Nature\n\t'terminaltout',\n\t'time-rubric',\n\t'timestamp',\n\t'time-to-read',\n\t'tip_off',\n\t'tiptout',\n\t'-tout-',\n\t'-toc',\n\t'toggle-caption',\n//\t'toolbar', prism.js\n\t'tooltip',\n\t'topbar',\n\t'topic-list',\n//\t'top-section',\n\t'top-wrapper',\n\t'tree-item',\n\t'trending',\n\t'trust-feat',\n\t'trust-badge',\n\t'twitter',\n\n\t'u-hide',\n\t'viewbottom',\n\t'visually-hidden',\n\t'welcomebox'\n//\t'widget-'\n];\n\n// Selectors for footnotes and citations\nexport const FOOTNOTE_INLINE_REFERENCES = [\n\t'sup.reference',\n\t'cite.ltx_cite',\n\t'sup[id^=\"fnr\"]',\n\t'sup[id^=\"fnref:\"]',\n\t'span.footnote-link',\n\t'a.citation',\n\t'a[id^=\"ref-link\"]',\n\t'a[href^=\"#fn\"]',\n\t'a[href^=\"#cite\"]',\n\t'a[href^=\"#reference\"]',\n\t'a[href^=\"#footnote\"]',\n\t'a[href^=\"#r\"]', // Common in academic papers\n\t'a[href^=\"#b\"]', // Common for bibliography references\n\t'a[href*=\"cite_note\"]',\n\t'a[href*=\"cite_ref\"]',\n\t'a.footnote-anchor', // Substack\n\t'span.footnote-hovercard-target a', // Substack\n\t'a[role=\"doc-biblioref\"]', // Science.org\n\t'a[id^=\"fnref\"]',\n\t'a[id^=\"ref-link\"]', // Nature.com\n].join(',');\n\nexport const FOOTNOTE_LIST_SELECTORS = [\n\t'div.footnote ol',\n\t'div.footnotes ol',\n\t'div[role=\"doc-endnotes\"]',\n\t'div[role=\"doc-footnotes\"]',\n\t'ol.footnotes-list',\n\t'ol.footnotes',\n\t'ol.references',\n\t'ol[class*=\"article-references\"]',\n\t'section.footnotes ol',\n\t'section[role=\"doc-endnotes\"]',\n\t'section[role=\"doc-footnotes\"]',\n\t'section[role=\"doc-bibliography\"]',\n\t'ul.footnotes-list',\n\t'ul.ltx_biblist',\n\t'div.footnote[data-component-name=\"FootnoteToDOM\"]' // Substack\n].join(',');\n\n// Elements that are allowed to be empty\n// These are not removed even if they have no content\nexport const ALLOWED_EMPTY_ELEMENTS = new Set([\n\t'area',\n\t'audio',\n\t'base',\n\t'br',\n\t'circle',\n\t'col',\n\t'defs',\n\t'ellipse',\n\t'embed',\n\t'figure',\n\t'g',\n\t'hr',\n\t'iframe',\n\t'img',\n\t'input',\n\t'line',\n\t'link',\n\t'mask',\n\t'meta',\n\t'object',\n\t'param',\n\t'path',\n\t'pattern',\n\t'picture',\n\t'polygon',\n\t'polyline',\n\t'rect',\n\t'source',\n\t'stop',\n\t'svg',\n\t'td',\n\t'th',\n\t'track',\n\t'use',\n\t'video',\n\t'wbr'\n]);\n\n// Attributes to keep\nexport const ALLOWED_ATTRIBUTES = new Set([\n\t'alt',\n\t'allow',\n\t'allowfullscreen',\n\t'aria-label',\n\t'checked',\n\t'colspan',\n\t'controls',\n\t'data-latex',\n\t'data-src',\n\t'data-srcset',\n\t'data-lang',\n\t'dir',\n\t'display',\n\t'frameborder',\n\t'headers',\n\t'height',\n\t'href',\n\t'lang',\n\t'role',\n\t'rowspan',\n\t'src',\n\t'srcset',\n\t'title',\n\t'type',\n\t'width',\n\n\t// MathML attributes\n\t'accent',\n\t'accentunder',\n\t'align',\n\t'columnalign',\n\t'columnlines',\n\t'columnspacing',\n\t'columnspan',\n\t'data-mjx-texclass',\n\t'depth',\n\t'displaystyle',\n\t'fence',\n\t'frame',\n\t'framespacing',\n\t'linethickness',\n\t'lspace',\n\t'mathsize',\n\t'mathvariant',\n\t'maxsize',\n\t'minsize',\n\t'movablelimits',\n\t'notation',\n\t'rowalign',\n\t'rowlines',\n\t'rowspacing',\n\t'rowspan',\n\t'rspace',\n\t'scriptlevel',\n\t'separator',\n\t'stretchy',\n\t'symmetric',\n\t'voffset',\n\t'xmlns'\n]);\nexport const ALLOWED_ATTRIBUTES_DEBUG = new Set([\n\t'class',\n\t'id',\n]);","import { MetadataExtractor } from './metadata';\nimport { DefuddleOptions, DefuddleResponse, DefuddleMetadata } from './types';\nimport { ExtractorRegistry } from './extractor-registry';\nimport { \n\tHIDDEN_ELEMENT_SELECTORS,\n\tMOBILE_WIDTH,\n\tBLOCK_ELEMENTS,\n\tPRESERVE_ELEMENTS,\n\tINLINE_ELEMENTS,\n\tALLOWED_ATTRIBUTES,\n\tALLOWED_ATTRIBUTES_DEBUG,\n\tEXACT_SELECTORS,\n\tPARTIAL_SELECTORS,\n\tFOOTNOTE_LIST_SELECTORS,\n\tFOOTNOTE_INLINE_REFERENCES,\n\tENTRY_POINT_ELEMENTS,\n\tALLOWED_EMPTY_ELEMENTS,\n\tTEST_ATTRIBUTES\n} from './constants';\n\nimport { mathRules } from './elements/math.full';\nimport { codeBlockRules } from './elements/code';\nimport { headingRules } from './elements/headings';\nimport { ContentScorer, ContentScore } from './scoring';\n\n// Element standardization rules\n// Maps selectors to their target HTML element name\ninterface StandardizationRule {\n\tselector: string;\n\telement: string;\n\ttransform?: (el: Element) => Element;\n}\n\nconst ELEMENT_STANDARDIZATION_RULES: StandardizationRule[] = [\n\t...mathRules,\n\t...codeBlockRules,\n\t...headingRules,\n\n\t// Convert divs with paragraph role to actual paragraphs\n\t{ \n\t\tselector: 'div[data-testid^=\"paragraph\"], div[role=\"paragraph\"]', \n\t\telement: 'p',\n\t\ttransform: (el: Element): Element => {\n\t\t\tconst p = document.createElement('p');\n\t\t\t\n\t\t\t// Copy innerHTML\n\t\t\tp.innerHTML = el.innerHTML;\n\t\t\t\n\t\t\t// Copy allowed attributes\n\t\t\tArray.from(el.attributes).forEach(attr => {\n\t\t\t\tif (ALLOWED_ATTRIBUTES.has(attr.name)) {\n\t\t\t\t\tp.setAttribute(attr.name, attr.value);\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\treturn p;\n\t\t}\n\t},\n\t// Convert divs with list roles to actual lists\n\t{ \n\t\tselector: 'div[role=\"list\"]', \n\t\telement: 'ul',\n\t\t// Custom handler for list type detection and transformation\n\t\ttransform: (el: Element): Element => {\n\t\t\t// First determine if this is an ordered list\n\t\t\tconst firstItem = el.querySelector('div[role=\"listitem\"] .label');\n\t\t\tconst label = firstItem?.textContent?.trim() || '';\n\t\t\tconst isOrdered = label.match(/^\\d+\\)/);\n\t\t\t\n\t\t\t// Create the appropriate list type\n\t\t\tconst list = document.createElement(isOrdered ? 'ol' : 'ul');\n\t\t\t\n\t\t\t// Process each list item\n\t\t\tconst items = el.querySelectorAll('div[role=\"listitem\"]');\n\t\t\titems.forEach(item => {\n\t\t\t\tconst li = document.createElement('li');\n\t\t\t\tconst content = item.querySelector('.content');\n\t\t\t\t\n\t\t\t\tif (content) {\n\t\t\t\t\t// Convert any paragraph divs inside content\n\t\t\t\t\tconst paragraphDivs = content.querySelectorAll('div[role=\"paragraph\"]');\n\t\t\t\t\tparagraphDivs.forEach(div => {\n\t\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\t\tp.innerHTML = div.innerHTML;\n\t\t\t\t\t\tdiv.replaceWith(p);\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t// Convert any nested lists recursively\n\t\t\t\t\tconst nestedLists = content.querySelectorAll('div[role=\"list\"]');\n\t\t\t\t\tnestedLists.forEach(nestedList => {\n\t\t\t\t\t\tconst firstNestedItem = nestedList.querySelector('div[role=\"listitem\"] .label');\n\t\t\t\t\t\tconst nestedLabel = firstNestedItem?.textContent?.trim() || '';\n\t\t\t\t\t\tconst isNestedOrdered = nestedLabel.match(/^\\d+\\)/);\n\t\t\t\t\t\t\n\t\t\t\t\t\tconst newNestedList = document.createElement(isNestedOrdered ? 'ol' : 'ul');\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Process nested items\n\t\t\t\t\t\tconst nestedItems = nestedList.querySelectorAll('div[role=\"listitem\"]');\n\t\t\t\t\t\tnestedItems.forEach(nestedItem => {\n\t\t\t\t\t\t\tconst nestedLi = document.createElement('li');\n\t\t\t\t\t\t\tconst nestedContent = nestedItem.querySelector('.content');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (nestedContent) {\n\t\t\t\t\t\t\t\t// Convert paragraph divs in nested items\n\t\t\t\t\t\t\t\tconst nestedParagraphs = nestedContent.querySelectorAll('div[role=\"paragraph\"]');\n\t\t\t\t\t\t\t\tnestedParagraphs.forEach(div => {\n\t\t\t\t\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\t\t\t\t\tp.innerHTML = div.innerHTML;\n\t\t\t\t\t\t\t\t\tdiv.replaceWith(p);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tnestedLi.innerHTML = nestedContent.innerHTML;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tnewNestedList.appendChild(nestedLi);\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\tnestedList.replaceWith(newNestedList);\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tli.innerHTML = content.innerHTML;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlist.appendChild(li);\n\t\t\t});\n\t\t\t\n\t\t\treturn list;\n\t\t}\n\t},\n\t{ \n\t\tselector: 'div[role=\"listitem\"]', \n\t\telement: 'li',\n\t\t// Custom handler for list item content\n\t\ttransform: (el: Element): Element => {\n\t\t\tconst content = el.querySelector('.content');\n\t\t\tif (!content) return el;\n\t\t\t\n\t\t\t// Convert any paragraph divs inside content\n\t\t\tconst paragraphDivs = content.querySelectorAll('div[role=\"paragraph\"]');\n\t\t\tparagraphDivs.forEach(div => {\n\t\t\t\tconst p = document.createElement('p');\n\t\t\t\tp.innerHTML = div.innerHTML;\n\t\t\t\tdiv.replaceWith(p);\n\t\t\t});\n\t\t\t\n\t\t\treturn content;\n\t\t}\n\t}\n];\n\ninterface FootnoteData {\n\tcontent: Element | string;\n\toriginalId: string;\n\trefs: string[];\n}\n\ninterface FootnoteCollection {\n\t[footnoteNumber: number]: FootnoteData;\n}\n\ninterface StyleChange {\n\tselector: string;\n\tstyles: string;\n}\n\nexport class Defuddle {\n\tprivate doc: Document;\n\tprivate options: DefuddleOptions;\n\tprivate debug: boolean;\n\n\t/**\n\t * Create a new Defuddle instance\n\t * @param doc - The document to parse\n\t * @param options - Options for parsing\n\t */\n\tconstructor(doc: Document, options: DefuddleOptions = {}) {\n\t\tthis.doc = doc;\n\t\tthis.options = options;\n\t\tthis.debug = options.debug || false;\n\t}\n\n\t/**\n\t * Parse the document and extract its main content\n\t */\n\tparse(): DefuddleResponse {\n\t\tconst startTime = Date.now();\n\n\t\t// Extract metadata first since we'll need it in multiple places\n\t\tconst schemaOrgData = MetadataExtractor.extractSchemaOrgData(this.doc);\n\t\tconst metadata = MetadataExtractor.extract(this.doc, schemaOrgData);\n\n\t\ttry {\n\t\t\t// Try to use a specific extractor first\n\t\t\tconst url = this.options.url || this.doc.URL;\n\t\t\tconst extractor = ExtractorRegistry.findExtractor(this.doc, url, schemaOrgData);\n\t\t\tif (extractor && extractor.canExtract()) {\n\t\t\t\tconst extracted = extractor.extract();\n\t\t\t\tconst endTime = Date.now();\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\tcontent: extracted.contentHtml,\n\t\t\t\t\ttitle: extracted.variables?.title || metadata.title,\n\t\t\t\t\tdescription: metadata.description,\n\t\t\t\t\tdomain: metadata.domain,\n\t\t\t\t\tfavicon: metadata.favicon,\n\t\t\t\t\timage: metadata.image,\n\t\t\t\t\tpublished: extracted.variables?.published || metadata.published,\n\t\t\t\t\tauthor: extracted.variables?.author || metadata.author,\n\t\t\t\t\tsite: metadata.site,\n\t\t\t\t\tschemaOrgData: metadata.schemaOrgData,\n\t\t\t\t\twordCount: this.countWords(extracted.contentHtml),\n\t\t\t\t\tparseTime: Math.round(endTime - startTime),\n\t\t\t\t\textractorType: extractor.constructor.name.replace('Extractor', '').toLowerCase()\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Evaluate styles and sizes on original document\n\t\t\tconst mobileStyles = this._evaluateMediaQueries(this.doc);\n\t\t\t\n\t\t\t// Check for small images in original document, excluding lazy-loaded ones\n\t\t\tconst smallImages = this.findSmallImages(this.doc);\n\t\t\t\n\t\t\t// Clone document\n\t\t\tconst clone = this.doc.cloneNode(true) as Document;\n\t\t\t\n\t\t\t// Apply mobile style to clone\n\t\t\tthis.applyMobileStyles(clone, mobileStyles);\n\n\t\t\t// Find main content\n\t\t\tconst mainContent = this.findMainContent(clone);\n\t\t\tif (!mainContent) {\n\t\t\t\tconst endTime = Date.now();\n\t\t\t\treturn {\n\t\t\t\t\tcontent: this.doc.body.innerHTML,\n\t\t\t\t\t...metadata,\n\t\t\t\t\twordCount: this.countWords(this.doc.body.innerHTML),\n\t\t\t\t\tparseTime: Math.round(endTime - startTime)\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Remove small images identified from original document\n\t\t\tthis.removeSmallImages(clone, smallImages);\n\n\t\t\t// Perform other destructive operations on the clone\n\t\t\tthis.removeHiddenElements(clone);\n\t\t\tthis.removeClutter(clone);\n\n\t\t\t// Clean up the main content\n\t\t\tthis.cleanContent(mainContent, metadata);\n\n\t\t\tconst content = mainContent ? mainContent.outerHTML : this.doc.body.innerHTML;\n\t\t\tconst endTime = Date.now();\n\n\t\t\treturn {\n\t\t\t\tcontent,\n\t\t\t\t...metadata,\n\t\t\t\twordCount: this.countWords(content),\n\t\t\t\tparseTime: Math.round(endTime - startTime)\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error('Defuddle', 'Error processing document:', error);\n\t\t\tconst endTime = Date.now();\n\t\t\treturn {\n\t\t\t\tcontent: this.doc.body.innerHTML,\n\t\t\t\t...metadata,\n\t\t\t\twordCount: this.countWords(this.doc.body.innerHTML),\n\t\t\t\tparseTime: Math.round(endTime - startTime)\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate countWords(content: string): number {\n\t\t// Create a temporary div to parse HTML content\n\t\tconst tempDiv = this.doc.createElement('div');\n\t\ttempDiv.innerHTML = content;\n\n\t\t// Get text content, removing extra whitespace\n\t\tconst text = tempDiv.textContent || '';\n\t\tconst words = text\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ' ') // Replace multiple spaces with single space\n\t\t\t.split(' ')\n\t\t\t.filter(word => word.length > 0); // Filter out empty strings\n\n\t\treturn words.length;\n\t}\n\n\t// Make all other methods private by removing the static keyword and using private\n\tprivate _log(...args: any[]): void {\n\t\tif (this.debug) {\n\t\t\tconsole.log('Defuddle:', ...args);\n\t\t}\n\t}\n\n\tprivate _evaluateMediaQueries(doc: Document): StyleChange[] {\n\t\tconst mobileStyles: StyleChange[] = [];\n\t\tconst maxWidthRegex = /max-width[^:]*:\\s*(\\d+)/;\n\n\t\ttry {\n\t\t\t// Get all styles, including inline styles\n\t\t\tconst sheets = Array.from(doc.styleSheets).filter(sheet => {\n\t\t\t\ttry {\n\t\t\t\t\t// Access rules once to check validity\n\t\t\t\t\tsheet.cssRules;\n\t\t\t\t\treturn true;\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Expected error for cross-origin stylesheets or Node.js environment\n\t\t\t\t\tif (e instanceof DOMException && e.name === 'SecurityError') {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\t// Process all sheets in a single pass\n\t\t\tconst mediaRules = sheets.flatMap(sheet => {\n\t\t\t\ttry {\n\t\t\t\t\t// Check if we're in a browser environment where CSSMediaRule is available\n\t\t\t\t\tif (typeof CSSMediaRule === 'undefined') {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Array.from(sheet.cssRules)\n\t\t\t\t\t\t.filter((rule): rule is CSSMediaRule => \n\t\t\t\t\t\t\trule instanceof CSSMediaRule &&\n\t\t\t\t\t\t\trule.conditionText.includes('max-width')\n\t\t\t\t\t\t);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (this.debug) {\n\t\t\t\t\t\tconsole.warn('Defuddle: Failed to process stylesheet:', e);\n\t\t\t\t\t}\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Process all media rules in a single pass\n\t\t\tmediaRules.forEach(rule => {\n\t\t\t\tconst match = rule.conditionText.match(maxWidthRegex);\n\t\t\t\tif (match) {\n\t\t\t\t\tconst maxWidth = parseInt(match[1]);\n\t\t\t\t\t\n\t\t\t\t\tif (MOBILE_WIDTH <= maxWidth) {\n\t\t\t\t\t\t// Batch process all style rules\n\t\t\t\t\t\tconst styleRules = Array.from(rule.cssRules)\n\t\t\t\t\t\t\t.filter((r): r is CSSStyleRule => r instanceof CSSStyleRule);\n\n\t\t\t\t\t\tstyleRules.forEach(cssRule => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tmobileStyles.push({\n\t\t\t\t\t\t\t\t\tselector: cssRule.selectorText,\n\t\t\t\t\t\t\t\t\tstyles: cssRule.style.cssText\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\tif (this.debug) {\n\t\t\t\t\t\t\t\t\tconsole.warn('Defuddle: Failed to process CSS rule:', e);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.error('Defuddle: Error evaluating media queries:', e);\n\t\t}\n\n\t\treturn mobileStyles;\n\t}\n\n\tprivate applyMobileStyles(doc: Document, mobileStyles: StyleChange[]) {\n\t\tlet appliedCount = 0;\n\n\t\tmobileStyles.forEach(({selector, styles}) => {\n\t\t\ttry {\n\t\t\t\tconst elements = doc.querySelectorAll(selector);\n\t\t\t\telements.forEach(element => {\n\t\t\t\t\telement.setAttribute('style', \n\t\t\t\t\t\t(element.getAttribute('style') || '') + styles\n\t\t\t\t\t);\n\t\t\t\t\tappliedCount++;\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('Defuddle', 'Error applying styles for selector:', selector, e);\n\t\t\t}\n\t\t});\n\n\t}\n\n\tprivate getWindow(doc: Document): Window | null {\n\t\t// First try defaultView\n\t\tif (doc.defaultView) {\n\t\t\treturn doc.defaultView;\n\t\t}\n\t\t\n\t\t// Then try ownerWindow\n\t\tif ((doc as any).ownerWindow) {\n\t\t\treturn (doc as any).ownerWindow;\n\t\t}\n\t\t\n\t\t// Finally try to get window from document\n\t\tif ((doc as any).window) {\n\t\t\treturn (doc as any).window;\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\n\tprivate getComputedStyle(element: Element): CSSStyleDeclaration | null {\n\t\tconst win = this.getWindow(element.ownerDocument);\n\t\tif (!win) return null;\n\t\treturn win.getComputedStyle(element);\n\t}\n\n\tprivate removeHiddenElements(doc: Document) {\n\t\tlet count = 0;\n\t\tconst elementsToRemove = new Set<Element>();\n\n\t\t// First pass: Get all elements matching hidden selectors\n\t\tconst hiddenElements = doc.querySelectorAll(HIDDEN_ELEMENT_SELECTORS);\n\t\thiddenElements.forEach(el => elementsToRemove.add(el));\n\t\tcount += hiddenElements.length;\n\n\t\t// Second pass: Get all elements and check their styles\n\t\tconst allElements = Array.from(doc.getElementsByTagName('*'));\n\n\t\t// Process styles in batches to minimize layout thrashing\n\t\tconst BATCH_SIZE = 100;\n\t\tfor (let i = 0; i < allElements.length; i += BATCH_SIZE) {\n\t\t\tconst batch = allElements.slice(i, i + BATCH_SIZE);\n\t\t\t\n\t\t\t// Read phase - gather all computedStyles\n\t\t\tconst styles = batch.map(element => {\n\t\t\t\ttry {\n\t\t\t\t\treturn element.ownerDocument.defaultView?.getComputedStyle(element);\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// If we can't get computed style, check inline styles\n\t\t\t\t\tconst style = element.getAttribute('style');\n\t\t\t\t\tif (!style) return null;\n\t\t\t\t\t\n\t\t\t\t\t// Create a temporary style element to parse inline styles\n\t\t\t\t\tconst tempStyle = doc.createElement('style');\n\t\t\t\t\ttempStyle.textContent = `* { ${style} }`;\n\t\t\t\t\tdoc.head.appendChild(tempStyle);\n\t\t\t\t\tconst computedStyle = element.ownerDocument.defaultView?.getComputedStyle(element);\n\t\t\t\t\tdoc.head.removeChild(tempStyle);\n\t\t\t\t\treturn computedStyle;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\t// Write phase - mark elements for removal\n\t\t\tbatch.forEach((element, index) => {\n\t\t\t\tconst computedStyle = styles[index];\n\t\t\t\tif (computedStyle && (\n\t\t\t\t\tcomputedStyle.display === 'none' ||\n\t\t\t\t\tcomputedStyle.visibility === 'hidden' ||\n\t\t\t\t\tcomputedStyle.opacity === '0'\n\t\t\t\t)) {\n\t\t\t\t\telementsToRemove.add(element);\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Final pass: Batch remove all hidden elements\n\t\telementsToRemove.forEach(el => el.remove());\n\n\t\tthis._log('Removed hidden elements:', count);\n\t}\n\n\tprivate removeClutter(doc: Document) {\n\t\tconst startTime = Date.now();\n\t\tlet exactSelectorCount = 0;\n\t\tlet partialSelectorCount = 0;\n\n\t\t// Track all elements to be removed\n\t\tconst elementsToRemove = new Set<Element>();\n\n\t\t// First collect elements matching exact selectors\n\t\tconst exactElements = doc.querySelectorAll(EXACT_SELECTORS.join(','));\n\t\texactElements.forEach(el => {\n\t\t\tif (el?.parentNode) {\n\t\t\t\telementsToRemove.add(el);\n\t\t\t\texactSelectorCount++;\n\t\t\t}\n\t\t});\n\n\t\t// Pre-compile regexes and combine into a single regex for better performance\n\t\tconst combinedPattern = PARTIAL_SELECTORS.join('|');\n\t\tconst partialRegex = new RegExp(combinedPattern, 'i');\n\n\t\t// Create an efficient attribute selector for elements we care about\n\t\tconst attributeSelector = TEST_ATTRIBUTES.map(attr => `[${attr}]`).join(',');\n\t\tconst allElements = doc.querySelectorAll(attributeSelector);\n\n\t\t// Process elements for partial matches\n\t\tallElements.forEach(el => {\n\t\t\t// Skip if already marked for removal\n\t\t\tif (elementsToRemove.has(el)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Get all relevant attributes and combine into a single string\n\t\t\tconst attrs = TEST_ATTRIBUTES.map(attr => {\n\t\t\t\tif (attr === 'class') {\n\t\t\t\t\treturn el.className && typeof el.className === 'string' ? el.className : '';\n\t\t\t\t}\n\t\t\t\tif (attr === 'id') {\n\t\t\t\t\treturn el.id || '';\n\t\t\t\t}\n\t\t\t\treturn el.getAttribute(attr) || '';\n\t\t\t}).join(' ').toLowerCase();\n\n\t\t\t// Skip if no attributes to check\n\t\t\tif (!attrs.trim()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check for partial match using single regex test\n\t\t\tif (partialRegex.test(attrs)) {\n\t\t\t\telementsToRemove.add(el);\n\t\t\t\tpartialSelectorCount++;\n\t\t\t}\n\t\t});\n\n\t\t// Remove all collected elements in a single pass\n\t\telementsToRemove.forEach(el => el.remove());\n\n\t\tconst endTime = Date.now();\n\t\tthis._log('Removed clutter elements:', {\n\t\t\texactSelectors: exactSelectorCount,\n\t\t\tpartialSelectors: partialSelectorCount,\n\t\t\ttotal: elementsToRemove.size,\n\t\t\tprocessingTime: `${(endTime - startTime).toFixed(2)}ms`\n\t\t});\n\t}\n\n\tprivate flattenDivs(element: Element) {\n\t\tlet processedCount = 0;\n\t\tconst startTime = Date.now();\n\n\t\t// Process in batches to maintain performance\n\t\tlet keepProcessing = true;\n\n\t\tconst shouldPreserveElement = (el: Element): boolean => {\n\t\t\tconst tagName = el.tagName.toLowerCase();\n\t\t\t\n\t\t\t// Check if element should be preserved\n\t\t\tif (PRESERVE_ELEMENTS.has(tagName)) return true;\n\t\t\t\n\t\t\t// Check for semantic roles\n\t\t\tconst role = el.getAttribute('role');\n\t\t\tif (role && ['article', 'main', 'navigation', 'banner', 'contentinfo'].includes(role)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\t// Check for semantic classes\n\t\t\tconst className = el.className;\n\t\t\tif (typeof className === 'string' && className.toLowerCase().match(/(?:article|main|content|footnote|reference|bibliography)/)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Check if div contains mixed content types that should be preserved\n\t\t\tif (tagName === 'div') {\n\t\t\t\tconst children = Array.from(el.children);\n\t\t\t\tconst hasPreservedElements = children.some(child => \n\t\t\t\t\tPRESERVE_ELEMENTS.has(child.tagName.toLowerCase()) ||\n\t\t\t\t\tchild.getAttribute('role') === 'article' ||\n\t\t\t\t\t(child.className && typeof child.className === 'string' && \n\t\t\t\t\t\tchild.className.toLowerCase().match(/(?:article|main|content|footnote|reference|bibliography)/))\n\t\t\t\t);\n\t\t\t\tif (hasPreservedElements) return true;\n\t\t\t}\n\t\t\t\n\t\t\treturn false;\n\t\t};\n\n\t\tconst isWrapperDiv = (div: Element): boolean => {\n\t\t\t// Check if it's just empty space\n\t\t\tif (!div.textContent?.trim()) return true;\n\n\t\t\t// Check if it only contains other divs or block elements\n\t\t\tconst children = Array.from(div.children);\n\t\t\tif (children.length === 0) return true;\n\t\t\t\n\t\t\t// Check if all children are block elements\n\t\t\tconst allBlockElements = children.every(child => {\n\t\t\t\tconst tag = child.tagName.toLowerCase();\n\t\t\t\treturn tag === 'div' || tag === 'p' || tag === 'h1' || tag === 'h2' || \n\t\t\t\t\t tag === 'h3' || tag === 'h4' || tag === 'h5' || tag === 'h6' ||\n\t\t\t\t\t tag === 'ul' || tag === 'ol' || tag === 'pre' || tag === 'blockquote' ||\n\t\t\t\t\t tag === 'figure';\n\t\t\t});\n\t\t\tif (allBlockElements) return true;\n\n\t\t\t// Check for common wrapper patterns\n\t\t\tconst className = div.className.toLowerCase();\n\t\t\tconst isWrapper = /(?:wrapper|container|layout|row|col|grid|flex|outer|inner|content-area)/i.test(className);\n\t\t\tif (isWrapper) return true;\n\n\t\t\t// Check if it has excessive whitespace or empty text nodes\n\t\t\tconst textNodes = Array.from(div.childNodes).filter(node => \n\t\t\t\tnode.nodeType === 3 && node.textContent?.trim() // 3 is TEXT_NODE\n\t\t\t);\n\t\t\tif (textNodes.length === 0) return true;\n\n\t\t\t// Check if it's a div that only contains block elements\n\t\t\tconst hasOnlyBlockElements = children.length > 0 && !children.some(child => {\n\t\t\t\tconst tag = child.tagName.toLowerCase();\n\t\t\t\treturn INLINE_ELEMENTS.has(tag);\n\t\t\t});\n\t\t\tif (hasOnlyBlockElements) return true;\n\n\t\t\treturn false;\n\t\t};\n\n\t\t// Function to process a single div\n\t\tconst processDiv = (div: Element): boolean => {\n\t\t\t// Skip processing if div has been removed or should be preserved\n\t\t\tif (!div.isConnected || shouldPreserveElement(div)) return false;\n\n\t\t\t// Case 1: Empty div or div with only whitespace\n\t\t\tif (!div.hasChildNodes() || !div.textContent?.trim()) {\n\t\t\t\tdiv.remove();\n\t\t\t\tprocessedCount++;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Case 2: Top-level div - be more aggressive\n\t\t\tif (div.parentElement === element) {\n\t\t\t\tconst children = Array.from(div.children);\n\t\t\t\tconst hasOnlyBlockElements = children.length > 0 && !children.some(child => {\n\t\t\t\t\tconst tag = child.tagName.toLowerCase();\n\t\t\t\t\treturn INLINE_ELEMENTS.has(tag);\n\t\t\t\t});\n\n\t\t\t\tif (hasOnlyBlockElements) {\n\t\t\t\t\tconst fragment = this.doc.createDocumentFragment();\n\t\t\t\t\twhile (div.firstChild) {\n\t\t\t\t\t\tfragment.appendChild(div.firstChild);\n\t\t\t\t\t}\n\t\t\t\t\tdiv.replaceWith(fragment);\n\t\t\t\t\tprocessedCount++;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Case 3: Wrapper div - merge up aggressively\n\t\t\tif (isWrapperDiv(div)) {\n\t\t\t\t// Special case: if div only contains block elements, merge them up\n\t\t\t\tconst children = Array.from(div.children);\n\t\t\t\tconst onlyBlockElements = !children.some(child => {\n\t\t\t\t\tconst tag = child.tagName.toLowerCase();\n\t\t\t\t\treturn INLINE_ELEMENTS.has(tag);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tif (onlyBlockElements) {\n\t\t\t\t\tconst fragment = this.doc.createDocumentFragment();\n\t\t\t\t\twhile (div.firstChild) {\n\t\t\t\t\t\tfragment.appendChild(div.firstChild);\n\t\t\t\t\t}\n\t\t\t\t\tdiv.replaceWith(fragment);\n\t\t\t\t\tprocessedCount++;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Otherwise handle as normal wrapper\n\t\t\t\tconst fragment = this.doc.createDocumentFragment();\n\t\t\t\twhile (div.firstChild) {\n\t\t\t\t\tfragment.appendChild(div.firstChild);\n\t\t\t\t}\n\t\t\t\tdiv.replaceWith(fragment);\n\t\t\t\tprocessedCount++;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Case 4: Div only contains text content - convert to paragraph\n\t\t\tif (!div.children.length && div.textContent?.trim()) {\n\t\t\t\tconst p = this.doc.createElement('p');\n\t\t\t\tp.textContent = div.textContent;\n\t\t\t\tdiv.replaceWith(p);\n\t\t\t\tprocessedCount++;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Case 5: Div has single child\n\t\t\tif (div.children.length === 1) {\n\t\t\t\tconst child = div.firstElementChild!;\n\t\t\t\tconst childTag = child.tagName.toLowerCase();\n\t\t\t\t\n\t\t\t\t// Don't unwrap if child is inline or should be preserved\n\t\t\t\tif (!INLINE_ELEMENTS.has(childTag) && !shouldPreserveElement(child)) {\n\t\t\t\t\tdiv.replaceWith(child);\n\t\t\t\t\tprocessedCount++;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Case 6: Deeply nested div - merge up\n\t\t\tlet nestingDepth = 0;\n\t\t\tlet parent = div.parentElement;\n\t\t\twhile (parent) {\n\t\t\t\tif (parent.tagName.toLowerCase() === 'div') {\n\t\t\t\t\tnestingDepth++;\n\t\t\t\t}\n\t\t\t\tparent = parent.parentElement;\n\t\t\t}\n\n\t\t\tif (nestingDepth > 0) { // Changed from > 1 to > 0 to be more aggressive\n\t\t\t\tconst fragment = this.doc.createDocumentFragment();\n\t\t\t\twhile (div.firstChild) {\n\t\t\t\t\tfragment.appendChild(div.firstChild);\n\t\t\t\t}\n\t\t\t\tdiv.replaceWith(fragment);\n\t\t\t\tprocessedCount++;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\t// First pass: Process top-level divs\n\t\tconst processTopLevelDivs = () => {\n\t\t\tconst topDivs = Array.from(element.children).filter(\n\t\t\t\tel => el.tagName.toLowerCase() === 'div'\n\t\t\t);\n\t\t\t\n\t\t\tlet modified = false;\n\t\t\ttopDivs.forEach(div => {\n\t\t\t\tif (processDiv(div)) {\n\t\t\t\t\tmodified = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn modified;\n\t\t};\n\n\t\t// Second pass: Process remaining divs from deepest to shallowest\n\t\tconst processRemainingDivs = () => {\n\t\t\tconst allDivs = Array.from(element.getElementsByTagName('div'))\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\t// Count nesting depth\n\t\t\t\t\tconst getDepth = (el: Element): number => {\n\t\t\t\t\t\tlet depth = 0;\n\t\t\t\t\t\tlet parent = el.parentElement;\n\t\t\t\t\t\twhile (parent) {\n\t\t\t\t\t\t\tif (parent.tagName.toLowerCase() === 'div') depth++;\n\t\t\t\t\t\t\tparent = parent.parentElement;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn depth;\n\t\t\t\t\t};\n\t\t\t\t\treturn getDepth(b) - getDepth(a); // Process deepest first\n\t\t\t\t});\n\n\t\t\tlet modified = false;\n\t\t\tallDivs.forEach(div => {\n\t\t\t\tif (processDiv(div)) {\n\t\t\t\t\tmodified = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn modified;\n\t\t};\n\n\t\t// Final cleanup pass - aggressively flatten remaining divs\n\t\tconst finalCleanup = () => {\n\t\t\tconst remainingDivs = Array.from(element.getElementsByTagName('div'));\n\t\t\tlet modified = false;\n\t\t\t\n\t\t\tremainingDivs.forEach(div => {\n\t\t\t\t// Check if div only contains paragraphs\n\t\t\t\tconst children = Array.from(div.children);\n\t\t\t\tconst onlyParagraphs = children.every(child => child.tagName.toLowerCase() === 'p');\n\t\t\t\t\n\t\t\t\tif (onlyParagraphs || (!shouldPreserveElement(div) && isWrapperDiv(div))) {\n\t\t\t\t\tconst fragment = this.doc.createDocumentFragment();\n\t\t\t\t\twhile (div.firstChild) {\n\t\t\t\t\t\tfragment.appendChild(div.firstChild);\n\t\t\t\t\t}\n\t\t\t\t\tdiv.replaceWith(fragment);\n\t\t\t\t\tprocessedCount++;\n\t\t\t\t\tmodified = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn modified;\n\t\t};\n\n\t\t// Execute all passes until no more changes\n\t\tdo {\n\t\t\t\tkeepProcessing = false;\n\t\t\t\tif (processTopLevelDivs()) keepProcessing = true;\n\t\t\t\tif (processRemainingDivs()) keepProcessing = true;\n\t\t\t\tif (finalCleanup()) keepProcessing = true;\n\t\t\t} while (keepProcessing);\n\n\t\tconst endTime = Date.now();\n\t\tthis._log('Flattened divs:', {\n\t\t\tcount: processedCount,\n\t\t\tprocessingTime: `${(endTime - startTime).toFixed(2)}ms`\n\t\t});\n\t}\n\n\tprivate cleanContent(element: Element, metadata: DefuddleMetadata) {\n\t\tthis.standardizeSpaces(element);\n\n\t\t// Remove HTML comments\n\t\tthis.removeHtmlComments(element);\n\t\t\n\t\t// Handle H1 elements - remove first one and convert others to H2\n\t\tthis.standardizeHeadings(element, metadata.title);\n\t\t\n\t\t// Standardize footnotes and citations\n\t\tthis.standardizeFootnotes(element);\n\n\t\t// Handle lazy-loaded images\n\t\tthis.handleLazyImages(element);\n\n\t\t// Convert embedded content to standard formats\n\t\tthis.standardizeElements(element);\n\n\t\t// If not debug mode, do the full cleanup\n\t\tif (!this.debug) {\n\t\t\t// First pass of div flattening\n\t\t\tthis.flattenDivs(element);\n\t\t\t\n\t\t\t// Strip unwanted attributes\n\t\t\tthis.stripUnwantedAttributes(element);\n\n\t\t\t// Remove empty elements\n\t\t\tthis.removeEmptyElements(element);\n\n\t\t\t// Remove trailing headings\n\t\t\tthis.removeTrailingHeadings(element);\n\n\t\t\t// Final pass of div flattening after cleanup operations\n\t\t\tthis.flattenDivs(element);\n\n\t\t\t// Standardize consecutive br elements\n\t\t\tthis.stripExtraBrElements(element);\n\n\t\t\t// Clean up empty lines\n\t\t\tthis.removeEmptyLines(element);\n\t\t} else {\n\t\t\t// In debug mode, still do basic cleanup but preserve structure\n\t\t\tthis.stripUnwantedAttributes(element);\n\t\t\tthis.removeEmptyElements(element);\n\t\t\tthis.removeTrailingHeadings(element);\n\t\t\tthis.stripExtraBrElements(element);\n\t\t\tthis._log('Debug mode: Skipping div flattening to preserve structure');\n\t\t}\n\t}\n\n\tprivate standardizeSpaces(element: Element) {\n\t\tconst processNode = (node: Node) => {\n\t\t\t// Skip pre and code elements\n\t\t\tif (node.nodeType === 1) { // ELEMENT_NODE\n\t\t\t\tconst tag = (node as Element).tagName.toLowerCase();\n\t\t\t\tif (tag === 'pre' || tag === 'code') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Process text nodes\n\t\t\tif (node.nodeType === 3) { // TEXT_NODE\n\t\t\t\tconst text = node.textContent || '';\n\t\t\t\t// Replace with regular spaces, except when it's a single between words\n\t\t\t\tconst newText = text.replace(/\\xA0+/g, (match) => {\n\t\t\t\t\t// If it's a single between word characters, preserve it\n\t\t\t\t\tif (match.length === 1) {\n\t\t\t\t\t\tconst prev = node.previousSibling?.textContent?.slice(-1);\n\t\t\t\t\t\tconst next = node.nextSibling?.textContent?.charAt(0);\n\t\t\t\t\t\tif (prev?.match(/\\w/) && next?.match(/\\w/)) {\n\t\t\t\t\t\t\treturn '\\xA0';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn ' '.repeat(match.length);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tif (newText !== text) {\n\t\t\t\t\tnode.textContent = newText;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Process children recursively\n\t\t\tif (node.hasChildNodes()) {\n\t\t\t\tArray.from(node.childNodes).forEach(processNode);\n\t\t\t}\n\t\t};\n\n\t\tprocessNode(element);\n\t}\n\n\tprivate removeTrailingHeadings(element: Element) {\n\t\tlet removedCount = 0;\n\n\t\tconst hasContentAfter = (el: Element): boolean => {\n\t\t\t// Check if there's any meaningful content after this element\n\t\t\tlet nextContent = '';\n\t\t\tlet sibling = el.nextSibling;\n\n\t\t\t// First check direct siblings\n\t\t\twhile (sibling) {\n\t\t\t\tif (sibling.nodeType === 3) { // TEXT_NODE\n\t\t\t\t\tnextContent += sibling.textContent || '';\n\t\t\t\t} else if (sibling.nodeType === 1) { // ELEMENT_NODE\n\t\t\t\t\t// If we find an element sibling, check its content\n\t\t\t\t\tnextContent += (sibling as Element).textContent || '';\n\t\t\t\t}\n\t\t\t\tsibling = sibling.nextSibling;\n\t\t\t}\n\n\t\t\t// If we found meaningful content at this level, return true\n\t\t\tif (nextContent.trim()) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// If no content found at this level and we have a parent,\n\t\t\t// check for content after the parent\n\t\t\tconst parent = el.parentElement;\n\t\t\tif (parent && parent !== element) {\n\t\t\t\treturn hasContentAfter(parent);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\t// Process all headings from bottom to top\n\t\tconst headings = Array.from(element.querySelectorAll('h1, h2, h3, h4, h5, h6'))\n\t\t\t.reverse();\n\n\t\theadings.forEach(heading => {\n\t\t\tif (!hasContentAfter(heading)) {\n\t\t\t\theading.remove();\n\t\t\t\tremovedCount++;\n\t\t\t} else {\n\t\t\t\t// Stop processing once we find a heading with content after it\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\n\t\tif (removedCount > 0) {\n\t\t\tthis._log('Removed trailing headings:', removedCount);\n\t\t}\n\t}\n\n\tprivate standardizeHeadings(element: Element, title: string) {\n\t\tconst normalizeText = (text: string): string => {\n\t\t\treturn text\n\t\t\t\t.replace(/\\u00A0/g, ' ') // Convert non-breaking spaces to regular spaces\n\t\t\t\t.replace(/\\s+/g, ' ') // Normalize all whitespace to single spaces\n\t\t\t\t.trim()\n\t\t\t\t.toLowerCase();\n\t\t};\n\n\t\tconst h1s = element.getElementsByTagName('h1');\n\n\t\tArray.from(h1s).forEach(h1 => {\n\t\t\tconst h2 = document.createElement('h2');\n\t\t\th2.innerHTML = h1.innerHTML;\n\t\t\t// Copy allowed attributes\n\t\t\tArray.from(h1.attributes).forEach(attr => {\n\t\t\t\tif (ALLOWED_ATTRIBUTES.has(attr.name)) {\n\t\t\t\t\th2.setAttribute(attr.name, attr.value);\n\t\t\t\t}\n\t\t\t});\n\t\t\th1.parentNode?.replaceChild(h2, h1);\n\t\t});\n\n\t\t// Remove first H2 if it matches title\n\t\tconst h2s = element.getElementsByTagName('h2');\n\t\tif (h2s.length > 0) {\n\t\t\tconst firstH2 = h2s[0];\n\t\t\tconst firstH2Text = normalizeText(firstH2.textContent || '');\n\t\t\tconst normalizedTitle = normalizeText(title);\n\t\t\tif (normalizedTitle && normalizedTitle === firstH2Text) {\n\t\t\t\tfirstH2.remove();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate removeHtmlComments(element: Element) {\n\t\tlet removedCount = 0;\n\n\t\t// Get all elements and check their child nodes\n\t\tconst allElements = Array.from(element.getElementsByTagName('*'));\n\t\t\n\t\t// Process each element's child nodes\n\t\tallElements.forEach(el => {\n\t\t\tconst childNodes = Array.from(el.childNodes);\n\t\t\tchildNodes.forEach(node => {\n\t\t\t\tif (node.nodeType === 8) { // 8 is the node type for comments\n\t\t\t\t\tnode.remove();\n\t\t\t\t\tremovedCount++;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tthis._log('Removed HTML comments:', removedCount);\n\t}\n\n\tprivate stripUnwantedAttributes(element: Element) {\n\t\tlet attributeCount = 0;\n\n\t\tconst processElement = (el: Element) => {\n\t\t\t// Skip SVG elements - preserve all their attributes\n\t\t\tif (el.tagName.toLowerCase() === 'svg' || el.namespaceURI === 'http://www.w3.org/2000/svg') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst attributes = Array.from(el.attributes);\n\t\t\tconst tag = el.tagName.toLowerCase();\n\t\t\t\n\t\t\tattributes.forEach(attr => {\n\t\t\t\tconst attrName = attr.name.toLowerCase();\n\t\t\t\tconst attrValue = attr.value;\n\n\t\t\t\t// Special cases for preserving specific attributes\n\t\t\t\tif (\n\t\t\t\t\t// Preserve footnote IDs\n\t\t\t\t\t(attrName === 'id' && (\n\t\t\t\t\t\tattrValue.startsWith('fnref:') || // Footnote reference\n\t\t\t\t\t\tattrValue.startsWith('fn:') || // Footnote content\n\t\t\t\t\t\tattrValue === 'footnotes' // Footnotes container\n\t\t\t\t\t)) ||\n\t\t\t\t\t// Preserve code block language classes and footnote backref class\n\t\t\t\t\t(attrName === 'class' && (\n\t\t\t\t\t\t(tag === 'code' && attrValue.startsWith('language-')) ||\n\t\t\t\t\t\tattrValue === 'footnote-backref'\n\t\t\t\t\t))\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// In debug mode, allow debug attributes and data- attributes\n\t\t\t\tif (this.debug) {\n\t\t\t\t\tif (!ALLOWED_ATTRIBUTES.has(attrName) && \n\t\t\t\t\t\t!ALLOWED_ATTRIBUTES_DEBUG.has(attrName) && \n\t\t\t\t\t\t!attrName.startsWith('data-')) {\n\t\t\t\t\t\tel.removeAttribute(attr.name);\n\t\t\t\t\t\tattributeCount++;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// In normal mode, only allow standard attributes\n\t\t\t\t\tif (!ALLOWED_ATTRIBUTES.has(attrName)) {\n\t\t\t\t\t\tel.removeAttribute(attr.name);\n\t\t\t\t\t\tattributeCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tprocessElement(element);\n\t\telement.querySelectorAll('*').forEach(processElement);\n\n\t\tthis._log('Stripped attributes:', attributeCount);\n\t}\n\n\tprivate removeEmptyElements(element: Element) {\n\t\tlet removedCount = 0;\n\t\tlet iterations = 0;\n\t\tlet keepRemoving = true;\n\n\t\twhile (keepRemoving) {\n\t\t\titerations++;\n\t\t\tkeepRemoving = false;\n\t\t\t// Get all elements without children, working from deepest first\n\t\t\tconst emptyElements = Array.from(element.getElementsByTagName('*')).filter(el => {\n\t\t\t\tif (ALLOWED_EMPTY_ELEMENTS.has(el.tagName.toLowerCase())) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Check if element has only whitespace or \n\t\t\t\tconst textContent = el.textContent || '';\n\t\t\t\tconst hasOnlyWhitespace = textContent.trim().length === 0;\n\t\t\t\tconst hasNbsp = textContent.includes('\\u00A0'); // Unicode non-breaking space\n\t\t\t\t\n\t\t\t\t// Check if element has no meaningful children\n\t\t\t\tconst hasNoChildren = !el.hasChildNodes() || \n\t\t\t\t\t(Array.from(el.childNodes).every(node => {\n\t\t\t\t\t\tif (node.nodeType === 3) { // TEXT_NODE\n\t\t\t\t\t\t\tconst nodeText = node.textContent || '';\n\t\t\t\t\t\t\treturn nodeText.trim().length === 0 && !nodeText.includes('\\u00A0');\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}));\n\n\t\t\t\t// Special case: Check for divs that only contain spans with commas\n\t\t\t\tif (el.tagName.toLowerCase() === 'div') {\n\t\t\t\t\tconst children = Array.from(el.children);\n\t\t\t\t\tconst hasOnlyCommaSpans = children.length > 0 && children.every(child => {\n\t\t\t\t\t\tif (child.tagName.toLowerCase() !== 'span') return false;\n\t\t\t\t\t\tconst content = child.textContent?.trim() || '';\n\t\t\t\t\t\treturn content === ',' || content === '' || content === ' ';\n\t\t\t\t\t});\n\t\t\t\t\tif (hasOnlyCommaSpans) return true;\n\t\t\t\t}\n\n\t\t\t\treturn hasOnlyWhitespace && !hasNbsp && hasNoChildren;\n\t\t\t});\n\n\t\t\tif (emptyElements.length > 0) {\n\t\t\t\temptyElements.forEach(el => {\n\t\t\t\t\tel.remove();\n\t\t\t\t\tremovedCount++;\n\t\t\t\t});\n\t\t\t\tkeepRemoving = true;\n\t\t\t}\n\t\t}\n\n\t\tthis._log('Removed empty elements:', removedCount, 'iterations:', iterations);\n\t}\n\n\tprivate stripExtraBrElements(element: Element) {\n\t\tlet processedCount = 0;\n\t\tconst startTime = Date.now();\n\n\t\t// Get all br elements directly\n\t\tconst brElements = Array.from(element.getElementsByTagName('br'));\n\n\t\t// Keep track of consecutive br elements\n\t\tlet consecutiveBrs: Element[] = [];\n\n\t\t// Helper to process collected br elements\n\t\tconst processBrs = () => {\n\t\t\tif (consecutiveBrs.length > 2) {\n\t\t\t\t// Keep only two br elements\n\t\t\t\tfor (let i = 2; i < consecutiveBrs.length; i++) {\n\t\t\t\t\tconsecutiveBrs[i].remove();\n\t\t\t\t\tprocessedCount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconsecutiveBrs = [];\n\t\t};\n\n\t\t// Process all br elements\n\t\tbrElements.forEach(currentNode => {\n\t\t\t// Check if this br is consecutive with previous ones\n\t\t\tlet isConsecutive = false;\n\t\t\tif (consecutiveBrs.length > 0) {\n\t\t\t\tconst lastBr = consecutiveBrs[consecutiveBrs.length - 1];\n\t\t\t\tlet node: Node | null = currentNode.previousSibling;\n\t\t\t\t\n\t\t\t\t// Skip whitespace text nodes\n\t\t\t\twhile (node && node.nodeType === 3 && !node.textContent?.trim()) {\n\t\t\t\t\tnode = node.previousSibling;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (node === lastBr) {\n\t\t\t\t\tisConsecutive = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isConsecutive) {\n\t\t\t\tconsecutiveBrs.push(currentNode);\n\t\t\t} else {\n\t\t\t\t// Process any previously collected brs before starting new group\n\t\t\t\tprocessBrs();\n\t\t\t\tconsecutiveBrs = [currentNode];\n\t\t\t}\n\t\t});\n\n\t\t// Process any remaining br elements\n\t\tprocessBrs();\n\n\t\tconst endTime = Date.now();\n\t\tthis._log('Standardized br elements:', {\n\t\t\tremoved: processedCount,\n\t\t\tprocessingTime: `${(endTime - startTime).toFixed(2)}ms`\n\t\t});\n\t}\n\n\tprivate removeEmptyLines(element: Element) {\n\t\tlet removedCount = 0;\n\t\tconst startTime = Date.now();\n\n\t\t// First pass: remove empty text nodes\n\t\tconst removeEmptyTextNodes = (node: Node) => {\n\t\t\t// Skip if inside pre or code\n\t\t\tif (node instanceof Element) {\n\t\t\t\tconst tag = node.tagName.toLowerCase();\n\t\t\t\tif (tag === 'pre' || tag === 'code') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Process children first (depth-first)\n\t\t\tconst children = Array.from(node.childNodes);\n\t\t\tchildren.forEach(removeEmptyTextNodes);\n\n\t\t\t// Then handle this node\n\t\t\tif (node.nodeType === Node.TEXT_NODE) {\n\t\t\t\tconst text = node.textContent || '';\n\t\t\t\t// If it's completely empty or just special characters/whitespace, remove it\n\t\t\t\tif (!text || text.match(/^[\\u200C\\u200B\\u200D\\u200E\\u200F\\uFEFF\\xA0\\s]*$/)) {\n\t\t\t\t\tnode.parentNode?.removeChild(node);\n\t\t\t\t\tremovedCount++;\n\t\t\t\t} else {\n\t\t\t\t\t// Clean up the text content while preserving important spaces\n\t\t\t\t\tconst newText = text\n\t\t\t\t\t\t.replace(/\\n{3,}/g, '\\n\\n') // More than 2 newlines -> 2 newlines\n\t\t\t\t\t\t.replace(/^[\\n\\r\\t]+/, '') // Remove leading newlines/tabs (preserve spaces)\n\t\t\t\t\t\t.replace(/[\\n\\r\\t]+$/, '') // Remove trailing newlines/tabs (preserve spaces)\n\t\t\t\t\t\t.replace(/[ \\t]*\\n[ \\t]*/g, '\\n') // Remove spaces around newlines\n\t\t\t\t\t\t.replace(/[ \\t]{3,}/g, ' ') // 3+ spaces -> 1 space\n\t\t\t\t\t\t.replace(/^[ ]+$/, ' ') // Multiple spaces between elements -> single space\n\t\t\t\t\t\t.replace(/\\s+([,.!?:;])/g, '$1') // Remove spaces before punctuation\n\t\t\t\t\t\t// Clean up zero-width characters and multiple non-breaking spaces\n\t\t\t\t\t\t.replace(/[\\u200C\\u200B\\u200D\\u200E\\u200F\\uFEFF]+/g, '')\n\t\t\t\t\t\t.replace(/(?:\\xA0){2,}/g, '\\xA0'); // Multiple -> single \n\n\t\t\t\t\tif (newText !== text) {\n\t\t\t\t\t\tnode.textContent = newText;\n\t\t\t\t\t\tremovedCount += text.length - newText.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Second pass: clean up empty elements and normalize spacing\n\t\tconst cleanupEmptyElements = (node: Node) => {\n\t\t\tif (!(node instanceof Element)) return;\n\n\t\t\t// Skip pre and code elements\n\t\t\tconst tag = node.tagName.toLowerCase();\n\t\t\tif (tag === 'pre' || tag === 'code') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Process children first (depth-first)\n\t\t\tArray.from(node.children).forEach(cleanupEmptyElements);\n\n\t\t\t// Then normalize this element's whitespace\n\t\t\tnode.normalize(); // Combine adjacent text nodes\n\n\t\t\t// Special handling for block elements\n\t\t\tconst isBlockElement = this.getComputedStyle(node)?.display === 'block';\n\t\t\t\n\t\t\t// Only remove empty text nodes at the start and end if they contain just newlines/tabs\n\t\t\t// For block elements, also remove spaces\n\t\t\tconst startPattern = isBlockElement ? /^[\\n\\r\\t \\u200C\\u200B\\u200D\\u200E\\u200F\\uFEFF\\xA0]*$/ : /^[\\n\\r\\t\\u200C\\u200B\\u200D\\u200E\\u200F\\uFEFF]*$/;\n\t\t\tconst endPattern = isBlockElement ? /^[\\n\\r\\t \\u200C\\u200B\\u200D\\u200E\\u200F\\uFEFF\\xA0]*$/ : /^[\\n\\r\\t\\u200C\\u200B\\u200D\\u200E\\u200F\\uFEFF]*$/;\n\t\t\t\n\t\t\twhile (node.firstChild && \n\t\t\t\t node.firstChild.nodeType === Node.TEXT_NODE && \n\t\t\t\t (node.firstChild.textContent || '').match(startPattern)) {\n\t\t\t\tnode.removeChild(node.firstChild);\n\t\t\t\tremovedCount++;\n\t\t\t}\n\t\t\t\n\t\t\twhile (node.lastChild && \n\t\t\t\t node.lastChild.nodeType === Node.TEXT_NODE && \n\t\t\t\t (node.lastChild.textContent || '').match(endPattern)) {\n\t\t\t\tnode.removeChild(node.lastChild);\n\t\t\t\tremovedCount++;\n\t\t\t}\n\n\t\t\t// Ensure there's a space between inline elements if needed\n\t\t\tif (!isBlockElement) {\n\t\t\t\tconst children = Array.from(node.childNodes);\n\t\t\t\tfor (let i = 0; i < children.length - 1; i++) {\n\t\t\t\t\tconst current = children[i];\n\t\t\t\t\tconst next = children[i + 1];\n\n\t\t\t\t\t// Only add space between elements or between element and text\n\t\t\t\t\tif (current instanceof Element || next instanceof Element) {\n\t\t\t\t\t\t// Don't add space if next content starts with punctuation\n\t\t\t\t\t\tconst nextContent = next.textContent || '';\n\t\t\t\t\t\tconst currentContent = current.textContent || '';\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!nextContent.match(/^[,.!?:;]/) && \n\t\t\t\t\t\t\t!currentContent.match(/[,.!?:;]$/)) {\n\t\t\t\t\t\t\t// Check if there's already a space\n\t\t\t\t\t\t\tconst hasSpace = (current.nodeType === Node.TEXT_NODE && \n\t\t\t\t\t\t\t\t\t\t\t(current.textContent || '').endsWith(' ')) ||\n\t\t\t\t\t\t\t\t\t\t\t(next.nodeType === Node.TEXT_NODE && \n\t\t\t\t\t\t\t\t\t\t\t(next.textContent || '').startsWith(' '));\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (!hasSpace) {\n\t\t\t\t\t\t\t\tconst space = document.createTextNode(' ');\n\t\t\t\t\t\t\t\tnode.insertBefore(space, next);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Run both passes\n\t\tremoveEmptyTextNodes(element);\n\t\tcleanupEmptyElements(element);\n\n\t\tconst endTime = Date.now();\n\t\tthis._log('Removed empty lines:', {\n\t\t\tcharactersRemoved: removedCount,\n\t\t\tprocessingTime: `${(endTime - startTime).toFixed(2)}ms`\n\t\t});\n\t}\n\n\tprivate createFootnoteItem(\n\t\tfootnoteNumber: number,\n\t\tcontent: string | Element,\n\t\trefs: string[]\n\t): HTMLLIElement {\n\t\tconst doc = content instanceof Element ? content.ownerDocument : this.doc;\n\t\tconst newItem = doc.createElement('li');\n\t\tnewItem.className = 'footnote';\n\t\tnewItem.id = `fn:${footnoteNumber}`;\n\n\t\t// Handle content\n\t\tif (typeof content === 'string') {\n\t\t\tconst paragraph = doc.createElement('p');\n\t\t\tparagraph.innerHTML = content;\n\t\t\tnewItem.appendChild(paragraph);\n\t\t} else {\n\t\t\t// Get all paragraphs from the content\n\t\t\tconst paragraphs = Array.from(content.querySelectorAll('p'));\n\t\t\tif (paragraphs.length === 0) {\n\t\t\t\t// If no paragraphs, wrap content in a paragraph\n\t\t\t\tconst paragraph = doc.createElement('p');\n\t\t\t\tparagraph.innerHTML = content.innerHTML;\n\t\t\t\tnewItem.appendChild(paragraph);\n\t\t\t} else {\n\t\t\t\t// Copy existing paragraphs\n\t\t\t\tparagraphs.forEach(p => {\n\t\t\t\t\tconst newP = doc.createElement('p');\n\t\t\t\t\tnewP.innerHTML = p.innerHTML;\n\t\t\t\t\tnewItem.appendChild(newP);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Add backlink(s) to the last paragraph\n\t\tconst lastParagraph = newItem.querySelector('p:last-of-type') || newItem;\n\t\trefs.forEach((refId, index) => {\n\t\t\tconst backlink = doc.createElement('a');\n\t\t\tbacklink.href = `#${refId}`;\n\t\t\tbacklink.title = 'return to article';\n\t\t\tbacklink.className = 'footnote-backref';\n\t\t\tbacklink.innerHTML = '↩';\n\t\t\tif (index < refs.length - 1) {\n\t\t\t\tbacklink.innerHTML += ' ';\n\t\t\t}\n\t\t\tlastParagraph.appendChild(backlink);\n\t\t});\n\n\t\treturn newItem;\n\t}\n\n\tprivate collectFootnotes(element: Element): FootnoteCollection {\n\t\tconst footnotes: FootnoteCollection = {};\n\t\tlet footnoteCount = 1;\n\t\tconst processedIds = new Set<string>(); // Track processed IDs\n\n\t\t// Collect all footnotes and their IDs from footnote lists\n\t\tconst footnoteLists = element.querySelectorAll(FOOTNOTE_LIST_SELECTORS);\n\t\tfootnoteLists.forEach(list => {\n\t\t\t// Substack has individual footnote divs with no parent\n\t\t\tif (list.matches('div.footnote[data-component-name=\"FootnoteToDOM\"]')) {\n\t\t\t\tconst anchor = list.querySelector('a.footnote-number');\n\t\t\t\tconst content = list.querySelector('.footnote-content');\n\t\t\t\tif (anchor && content) {\n\t\t\t\t\tconst id = anchor.id.replace('footnote-', '').toLowerCase();\n\t\t\t\t\tif (id && !processedIds.has(id)) {\n\t\t\t\t\t\tfootnotes[footnoteCount] = {\n\t\t\t\t\t\t\tcontent: content,\n\t\t\t\t\t\t\toriginalId: id,\n\t\t\t\t\t\t\trefs: []\n\t\t\t\t\t\t};\n\t\t\t\t\t\tprocessedIds.add(id);\n\t\t\t\t\t\tfootnoteCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Common format using OL/UL and LI elements\n\t\t\tconst items = list.querySelectorAll('li, div[role=\"listitem\"]');\n\t\t\titems.forEach(li => {\n\t\t\t\tlet id = '';\n\t\t\t\tlet content: Element | null = null;\n\n\t\t\t\t// Handle citations with .citations class\n\t\t\t\tconst citationsDiv = li.querySelector('.citations');\n\t\t\t\tif (citationsDiv?.id?.toLowerCase().startsWith('r')) {\n\t\t\t\t\tid = citationsDiv.id.toLowerCase();\n\t\t\t\t\t// Look for citation content within the citations div\n\t\t\t\t\tconst citationContent = citationsDiv.querySelector('.citation-content');\n\t\t\t\t\tif (citationContent) {\n\t\t\t\t\t\tcontent = citationContent;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Extract ID from various formats\n\t\t\t\t\tif (li.id.toLowerCase().startsWith('bib.bib')) {\n\t\t\t\t\t\tid = li.id.replace('bib.bib', '').toLowerCase();\n\t\t\t\t\t} else if (li.id.toLowerCase().startsWith('fn:')) {\n\t\t\t\t\t\tid = li.id.replace('fn:', '').toLowerCase();\n\t\t\t\t\t} else if (li.id.toLowerCase().startsWith('fn')) {\n\t\t\t\t\t\tid = li.id.replace('fn', '').toLowerCase();\n\t\t\t\t\t// Nature.com\n\t\t\t\t\t} else if (li.hasAttribute('data-counter')) {\n\t\t\t\t\t\tid = li.getAttribute('data-counter')?.replace(/\\.$/, '')?.toLowerCase() || '';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst match = li.id.split('/').pop()?.match(/cite_note-(.+)/);\n\t\t\t\t\t\tid = match ? match[1].toLowerCase() : li.id.toLowerCase();\n\t\t\t\t\t}\n\t\t\t\t\tcontent = li;\n\t\t\t\t}\n\n\t\t\t\tif (id && !processedIds.has(id)) {\n\t\t\t\t\tfootnotes[footnoteCount] = {\n\t\t\t\t\t\tcontent: content || li,\n\t\t\t\t\t\toriginalId: id,\n\t\t\t\t\t\trefs: []\n\t\t\t\t\t};\n\t\t\t\t\tprocessedIds.add(id);\n\t\t\t\t\tfootnoteCount++;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn footnotes;\n\t}\n\n\tprivate findOuterFootnoteContainer(el: Element): Element {\n\t\tlet current: Element | null = el;\n\t\tlet parent: Element | null = el.parentElement;\n\t\t\n\t\t// Keep going up until we find an element that's not a span or sup\n\t\twhile (parent && (\n\t\t\tparent.tagName.toLowerCase() === 'span' || \n\t\t\tparent.tagName.toLowerCase() === 'sup'\n\t\t)) {\n\t\t\tcurrent = parent;\n\t\t\tparent = parent.parentElement;\n\t\t}\n\t\t\n\t\treturn current;\n\t}\n\n\t// Every footnote reference should be a sup element with an anchor inside\n\t// e.g. <sup id=\"fnref:1\"><a href=\"#fn:1\">1</a></sup>\n\tprivate createFootnoteReference(footnoteNumber: string, refId: string): HTMLElement {\n\t\tconst sup = this.doc.createElement('sup');\n\t\tsup.id = refId;\n\t\tconst link = this.doc.createElement('a');\n\t\tlink.href = `#fn:${footnoteNumber}`;\n\t\tlink.textContent = footnoteNumber;\n\t\tsup.appendChild(link);\n\t\treturn sup;\n\t}\n\n\tprivate standardizeFootnotes(element: Element) {\n\t\tconst footnotes = this.collectFootnotes(element);\n\n\t\t// Standardize inline footnotes using the collected IDs\n\t\tconst footnoteInlineReferences = element.querySelectorAll(FOOTNOTE_INLINE_REFERENCES);\n\t\t\n\t\t// Group references by their parent sup element\n\t\tconst supGroups = new Map<Element, Element[]>();\n\t\t\n\t\tfootnoteInlineReferences.forEach(el => {\n\t\t\tif (!(el instanceof HTMLElement)) return;\n\n\t\t\tlet footnoteId = '';\n\t\t\tlet footnoteContent = '';\n\n\t\t\t// Extract footnote ID based on element type\n\t\t\t// Nature.com\n\t\t\tif (el.matches('a[id^=\"ref-link\"]')) {\n\t\t\t\tfootnoteId = el.textContent?.trim() || '';\n\t\t\t// Science.org\n\t\t\t} else if (el.matches('a[role=\"doc-biblioref\"]')) {\n\t\t\t\tconst xmlRid = el.getAttribute('data-xml-rid');\n\t\t\t\tif (xmlRid) {\n\t\t\t\t\tfootnoteId = xmlRid;\n\t\t\t\t} else {\n\t\t\t\t\tconst href = el.getAttribute('href');\n\t\t\t\t\tif (href?.startsWith('#core-R')) {\n\t\t\t\t\t\tfootnoteId = href.replace('#core-', '');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t// Substack\n\t\t\t} else if (el.matches('a.footnote-anchor, span.footnote-hovercard-target a')) {\n\t\t\t\tconst id = el.id?.replace('footnote-anchor-', '') || '';\n\t\t\t\tif (id) {\n\t\t\t\t\tfootnoteId = id.toLowerCase();\n\t\t\t\t}\n\t\t\t// Arxiv\n\t\t\t} else if (el.matches('cite.ltx_cite')) {\n\t\t\t\tconst link = el.querySelector('a');\n\t\t\t\tif (link) {\n\t\t\t\t\tconst href = link.getAttribute('href');\n\t\t\t\t\tif (href) {\n\t\t\t\t\t\tconst match = href.split('/').pop()?.match(/bib\\.bib(\\d+)/);\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\tfootnoteId = match[1].toLowerCase();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (el.matches('sup.reference')) {\n\t\t\t\tconst links = el.querySelectorAll('a');\n\t\t\t\tArray.from(links).forEach(link => {\n\t\t\t\t\tconst href = link.getAttribute('href');\n\t\t\t\t\tif (href) {\n\t\t\t\t\t\tconst match = href.split('/').pop()?.match(/(?:cite_note|cite_ref)-(.+)/);\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\tfootnoteId = match[1].toLowerCase();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (el.matches('sup[id^=\"fnref:\"]')) {\n\t\t\t\tfootnoteId = el.id.replace('fnref:', '').toLowerCase();\n\t\t\t} else if (el.matches('sup[id^=\"fnr\"]')) {\n\t\t\t\tfootnoteId = el.id.replace('fnr', '').toLowerCase();\n\t\t\t} else if (el.matches('span.footnote-reference')) {\n\t\t\t\tfootnoteId = el.getAttribute('data-footnote-id') || '';\n\t\t\t} else if (el.matches('span.footnote-link')) {\n\t\t\t\tfootnoteId = el.getAttribute('data-footnote-id') || '';\n\t\t\t\tfootnoteContent = el.getAttribute('data-footnote-content') || '';\n\t\t\t} else if (el.matches('a.citation')) {\n\t\t\t\tfootnoteId = el.textContent?.trim() || '';\n\t\t\t\tfootnoteContent = el.getAttribute('href') || '';\n\t\t\t} else if (el.matches('a[id^=\"fnref\"]')) {\n\t\t\t\tfootnoteId = el.id.replace('fnref', '').toLowerCase();\n\t\t\t} else {\n\t\t\t\t// Other citation types\n\t\t\t\tconst href = el.getAttribute('href');\n\t\t\t\tif (href) {\n\t\t\t\t\tconst id = href.replace(/^[#]/, '');\n\t\t\t\t\tfootnoteId = id.toLowerCase();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (footnoteId) {\n\t\t\t\t// Find the footnote number by matching the original ID\n\t\t\t\tconst footnoteEntry = Object.entries(footnotes).find(\n\t\t\t\t\t([_, data]) => data.originalId === footnoteId.toLowerCase()\n\t\t\t\t);\n\n\t\t\t\tif (footnoteEntry) {\n\t\t\t\t\tconst [footnoteNumber, footnoteData] = footnoteEntry;\n\t\t\t\t\t\n\t\t\t\t\t// Create footnote reference ID\n\t\t\t\t\tconst refId = footnoteData.refs.length > 0 ? \n\t\t\t\t\t\t`fnref:${footnoteNumber}-${footnoteData.refs.length + 1}` : \n\t\t\t\t\t\t`fnref:${footnoteNumber}`;\n\t\t\t\t\t\n\t\t\t\t\tfootnoteData.refs.push(refId);\n\n\t\t\t\t\t// Find the outermost container (span or sup)\n\t\t\t\t\tconst container = this.findOuterFootnoteContainer(el);\n\t\t\t\t\t\n\t\t\t\t\t// If container is a sup, group references\n\t\t\t\t\tif (container.tagName.toLowerCase() === 'sup') {\n\t\t\t\t\t\tif (!supGroups.has(container)) {\n\t\t\t\t\t\t\tsupGroups.set(container, []);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst group = supGroups.get(container)!;\n\t\t\t\t\t\tgroup.push(this.createFootnoteReference(footnoteNumber, refId));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Replace the container directly\n\t\t\t\t\t\tcontainer.replaceWith(this.createFootnoteReference(footnoteNumber, refId));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Handle grouped references\n\t\tsupGroups.forEach((references, container) => {\n\t\t\tif (references.length > 0) {\n\t\t\t\t// Create a document fragment to hold all the references\n\t\t\t\tconst fragment = this.doc.createDocumentFragment();\n\t\t\t\t\n\t\t\t\t// Add each reference as its own sup element\n\t\t\t\treferences.forEach((ref, index) => {\n\t\t\t\t\tconst link = ref.querySelector('a');\n\t\t\t\t\tif (link) {\n\t\t\t\t\t\tconst sup = this.doc.createElement('sup');\n\t\t\t\t\t\tsup.id = ref.id;\n\t\t\t\t\t\tsup.appendChild(link.cloneNode(true));\n\t\t\t\t\t\tfragment.appendChild(sup);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tcontainer.replaceWith(fragment);\n\t\t\t}\n\t\t});\n\n\t\t// Create the standardized footnote list\n\t\tconst newList = this.doc.createElement('div');\n\t\tnewList.id = 'footnotes';\n\t\tconst orderedList = this.doc.createElement('ol');\n\n\t\t// Create footnote items in order\n\t\tObject.entries(footnotes).forEach(([number, data]) => {\n\t\t\tconst newItem = this.createFootnoteItem(\n\t\t\t\tparseInt(number),\n\t\t\t\tdata.content,\n\t\t\t\tdata.refs\n\t\t\t);\n\t\t\torderedList.appendChild(newItem);\n\t\t});\n\n\t\t// Remove original footnote lists\n\t\tconst footnoteLists = element.querySelectorAll(FOOTNOTE_LIST_SELECTORS);\n\t\tfootnoteLists.forEach(list => list.remove());\n\n\t\t// If we have any footnotes, add the new list to the document\n\t\tif (orderedList.children.length > 0) {\n\t\t\tnewList.appendChild(orderedList);\n\t\t\telement.appendChild(newList);\n\t\t}\n\t}\n\n\tprivate handleLazyImages(element: Element) {\n\t\tlet processedCount = 0;\n\t\tconst lazyImages = element.querySelectorAll('img[data-src], img[data-srcset]');\n\n\t\tlazyImages.forEach(img => {\n\t\t\t// Check if element is an image by checking tag name and required properties\n\t\t\tif (img.tagName.toLowerCase() !== 'img' || !('src' in img) || !('srcset' in img)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Handle data-src\n\t\t\tconst dataSrc = img.getAttribute('data-src');\n\t\t\tif (dataSrc && !img.getAttribute('src')) {\n\t\t\t\timg.setAttribute('src', dataSrc);\n\t\t\t\tprocessedCount++;\n\t\t\t}\n\n\t\t\t// Handle data-srcset\n\t\t\tconst dataSrcset = img.getAttribute('data-srcset');\n\t\t\tif (dataSrcset && !img.getAttribute('srcset')) {\n\t\t\t\timg.setAttribute('srcset', dataSrcset);\n\t\t\t\tprocessedCount++;\n\t\t\t}\n\n\t\t\t// Remove lazy loading related classes and attributes\n\t\t\timg.classList.remove('lazy', 'lazyload');\n\t\t\timg.removeAttribute('data-ll-status');\n\t\t\timg.removeAttribute('data-src');\n\t\t\timg.removeAttribute('data-srcset');\n\t\t});\n\n\t\tthis._log('Processed lazy images:', processedCount);\n\t}\n\n\tprivate standardizeElements(element: Element) {\n\t\tlet processedCount = 0;\n\n\t\t// Convert elements based on standardization rules\n\t\tELEMENT_STANDARDIZATION_RULES.forEach(rule => {\n\t\t\tconst elements = element.querySelectorAll(rule.selector);\n\t\t\telements.forEach(el => {\n\t\t\t\tif (rule.transform) {\n\t\t\t\t\t// If there's a transform function, use it to create the new element\n\t\t\t\t\tconst transformed = rule.transform(el);\n\t\t\t\t\tel.replaceWith(transformed);\n\t\t\t\t\tprocessedCount++;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// Convert lite-youtube elements\n\t\tconst liteYoutubeElements = element.querySelectorAll('lite-youtube');\n\t\tliteYoutubeElements.forEach(el => {\n\t\t\tconst videoId = el.getAttribute('videoid');\n\t\t\tif (!videoId) return;\n\n\t\t\tconst iframe = document.createElement('iframe');\n\t\t\tiframe.width = '560';\n\t\t\tiframe.height = '315';\n\t\t\tiframe.src = `https://www.youtube.com/embed/${videoId}`;\n\t\t\tiframe.title = el.getAttribute('videotitle') || 'YouTube video player';\n\t\t\tiframe.frameBorder = '0';\n\t\t\tiframe.allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share';\n\t\t\tiframe.setAttribute('allowfullscreen', '');\n\n\t\t\tel.replaceWith(iframe);\n\t\t\tprocessedCount++;\n\t\t});\n\n\t\tthis._log('Converted embedded elements:', processedCount);\n\t}\n\n\t// Find small IMG and SVG elements\n\tprivate findSmallImages(doc: Document): Set<string> {\n\t\tconst MIN_DIMENSION = 33;\n\t\tconst smallImages = new Set<string>();\n\t\tconst transformRegex = /scale\\(([\\d.]+)\\)/;\n\t\tconst startTime = Date.now();\n\t\tlet processedCount = 0;\n\n\t\t// 1. Read phase - Gather all elements in a single pass\n\t\tconst elements = [\n\t\t\t...Array.from(doc.getElementsByTagName('img')),\n\t\t\t...Array.from(doc.getElementsByTagName('svg'))\n\t\t].filter(element => {\n\t\t\t// Skip lazy-loaded images that haven't been processed yet\n\t\t\t// and math images which may be small\n\t\t\tif (element.tagName.toLowerCase() === 'img') {\n\t\t\t\tconst ignoredImage = element.classList.contains('lazy') || \n\t\t\t\t\telement.classList.contains('lazyload') ||\n\t\t\t\t\telement.classList.contains('latex') ||\n\t\t\t\t\telement.hasAttribute('decoding') ||\n\t\t\t\t\telement.hasAttribute('data-src') ||\n\t\t\t\t\telement.hasAttribute('data-srcset') ||\n\t\t\t\t\telement.hasAttribute('loading');\n\t\t\t\treturn !ignoredImage;\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\tif (elements.length === 0) {\n\t\t\treturn smallImages;\n\t\t}\n\n\t\t// 2. Batch process - Collect all measurements in one go\n\t\tconst measurements = elements.map(element => ({\n\t\t\telement,\n\t\t\t// Static attributes (no reflow)\n\t\t\tnaturalWidth: element.tagName.toLowerCase() === 'img' ? \n\t\t\t\tparseInt(element.getAttribute('width') || '0') || 0 : 0,\n\t\t\tnaturalHeight: element.tagName.toLowerCase() === 'img' ? \n\t\t\t\tparseInt(element.getAttribute('height') || '0') || 0 : 0,\n\t\t\tattrWidth: parseInt(element.getAttribute('width') || '0'),\n\t\t\tattrHeight: parseInt(element.getAttribute('height') || '0')\n\t\t}));\n\n\t\t// 3. Batch compute styles - Process in chunks to avoid long tasks\n\t\tconst BATCH_SIZE = 50;\n\t\tfor (let i = 0; i < measurements.length; i += BATCH_SIZE) {\n\t\t\tconst batch = measurements.slice(i, i + BATCH_SIZE);\n\t\t\t\n\t\t\ttry {\n\t\t\t\t// Read phase - compute all styles at once\n\t\t\t\tconst styles = batch.map(({ element }) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn element.ownerDocument.defaultView?.getComputedStyle(element);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Get bounding rectangles if available\n\t\t\t\tconst rects = batch.map(({ element }) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn element.getBoundingClientRect();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t// Process phase - no DOM operations\n\t\t\t\tbatch.forEach((measurement, index) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst style = styles[index];\n\t\t\t\t\t\tconst rect = rects[index];\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!style) return;\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Get transform scale in the same batch\n\t\t\t\t\t\tconst transform = style.transform;\n\t\t\t\t\t\tconst scale = transform ? \n\t\t\t\t\t\t\tparseFloat(transform.match(transformRegex)?.[1] || '1') : 1;\n\n\t\t\t\t\t\t// Calculate effective dimensions\n\t\t\t\t\t\tconst widths = [\n\t\t\t\t\t\t\tmeasurement.naturalWidth,\n\t\t\t\t\t\t\tmeasurement.attrWidth,\n\t\t\t\t\t\t\tparseInt(style.width) || 0,\n\t\t\t\t\t\t\trect ? rect.width * scale : 0\n\t\t\t\t\t\t].filter(dim => typeof dim === 'number' && dim > 0);\n\n\t\t\t\t\t\tconst heights = [\n\t\t\t\t\t\t\tmeasurement.naturalHeight,\n\t\t\t\t\t\t\tmeasurement.attrHeight,\n\t\t\t\t\t\t\tparseInt(style.height) || 0,\n\t\t\t\t\t\t\trect ? rect.height * scale : 0\n\t\t\t\t\t\t].filter(dim => typeof dim === 'number' && dim > 0);\n\n\t\t\t\t\t\t// Decision phase - no DOM operations\n\t\t\t\t\t\tif (widths.length > 0 && heights.length > 0) {\n\t\t\t\t\t\t\tconst effectiveWidth = Math.min(...widths);\n\t\t\t\t\t\t\tconst effectiveHeight = Math.min(...heights);\n\n\t\t\t\t\t\t\tif (effectiveWidth < MIN_DIMENSION || effectiveHeight < MIN_DIMENSION) {\n\t\t\t\t\t\t\t\tconst identifier = this.getElementIdentifier(measurement.element);\n\t\t\t\t\t\t\t\tif (identifier) {\n\t\t\t\t\t\t\t\t\tsmallImages.add(identifier);\n\t\t\t\t\t\t\t\t\tprocessedCount++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (this.debug) {\n\t\t\t\t\t\t\tconsole.warn('Defuddle: Failed to process element dimensions:', e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tif (this.debug) {\n\t\t\t\t\tconsole.warn('Defuddle: Failed to process batch:', e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst endTime = Date.now();\n\t\tthis._log('Found small elements:', {\n\t\t\tcount: processedCount,\n\t\t\tprocessingTime: `${(endTime - startTime).toFixed(2)}ms`\n\t\t});\n\n\t\treturn smallImages;\n\t}\n\n\tprivate removeSmallImages(doc: Document, smallImages: Set<string>) {\n\t\tlet removedCount = 0;\n\n\t\t['img', 'svg'].forEach(tag => {\n\t\t\tconst elements = doc.getElementsByTagName(tag);\n\t\t\tArray.from(elements).forEach(element => {\n\t\t\t\tconst identifier = this.getElementIdentifier(element);\n\t\t\t\tif (identifier && smallImages.has(identifier)) {\n\t\t\t\t\telement.remove();\n\t\t\t\t\tremovedCount++;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tthis._log('Removed small elements:', removedCount);\n\t}\n\n\tprivate getElementIdentifier(element: Element): string | null {\n\t\t// Try to create a unique identifier using various attributes\n\t\tif (element.tagName.toLowerCase() === 'img') {\n\t\t\t// For lazy-loaded images, use data-src as identifier if available\n\t\t\tconst dataSrc = element.getAttribute('data-src');\n\t\t\tif (dataSrc) return `src:${dataSrc}`;\n\t\t\t\n\t\t\tconst src = element.getAttribute('src') || '';\n\t\t\tconst srcset = element.getAttribute('srcset') || '';\n\t\t\tconst dataSrcset = element.getAttribute('data-srcset');\n\t\t\t\n\t\t\tif (src) return `src:${src}`;\n\t\t\tif (srcset) return `srcset:${srcset}`;\n\t\t\tif (dataSrcset) return `srcset:${dataSrcset}`;\n\t\t}\n\n\t\tconst id = element.id || '';\n\t\tconst className = element.className || '';\n\t\tconst viewBox = element.tagName.toLowerCase() === 'svg' ? element.getAttribute('viewBox') || '' : '';\n\t\t\n\t\tif (id) return `id:${id}`;\n\t\tif (viewBox) return `viewBox:${viewBox}`;\n\t\tif (className) return `class:${className}`;\n\t\t\n\t\treturn null;\n\t}\n\n\tprivate findMainContent(doc: Document): Element | null {\n\t\t// Find all potential content containers\n\t\tconst candidates: { element: Element; score: number }[] = [];\n\n\t\tENTRY_POINT_ELEMENTS.forEach((selector, index) => {\n\t\t\tconst elements = doc.querySelectorAll(selector);\n\t\t\telements.forEach(element => {\n\t\t\t\t// Base score from selector priority (earlier = higher)\n\t\t\t\tlet score = (ENTRY_POINT_ELEMENTS.length - index) * 10;\n\t\t\t\t\n\t\t\t\t// Add score based on content analysis\n\t\t\t\tscore += ContentScorer.scoreElement(element);\n\t\t\t\t\n\t\t\t\tcandidates.push({ element, score });\n\t\t\t});\n\t\t});\n\n\t\tif (candidates.length === 0) {\n\t\t\t// Fall back to scoring block elements\n\t\t\treturn this.findContentByScoring(doc);\n\t\t}\n\n\t\t// Sort by score descending\n\t\tcandidates.sort((a, b) => b.score - a.score);\n\t\t\n\t\tif (this.debug) {\n\t\t\tthis._log('Content candidates:', candidates.map(c => ({\n\t\t\t\telement: c.element.tagName,\n\t\t\t\tselector: this.getElementSelector(c.element),\n\t\t\t\tscore: c.score\n\t\t\t})));\n\t\t}\n\n\t\t// If we only matched body, try table-based detection\n\t\tif (candidates.length === 1 && candidates[0].element.tagName.toLowerCase() === 'body') {\n\t\t\tconst tableContent = this.findTableBasedContent(doc);\n\t\t\tif (tableContent) {\n\t\t\t\treturn tableContent;\n\t\t\t}\n\t\t}\n\n\t\treturn candidates[0].element;\n\t}\n\n\tprivate findTableBasedContent(doc: Document): Element | null {\n\t\t// First check if this looks like an old-style table-based layout\n\t\tconst tables = Array.from(doc.getElementsByTagName('table'));\n\t\tconst hasTableLayout = tables.some(table => {\n\t\t\tconst width = parseInt(table.getAttribute('width') || '0');\n\t\t\tconst style = this.getComputedStyle(table);\n\t\t\treturn width > 400 || \n\t\t\t\t(style?.width.includes('px') && parseInt(style.width) > 400) ||\n\t\t\t\ttable.getAttribute('align') === 'center' ||\n\t\t\t\ttable.className.toLowerCase().includes('content') ||\n\t\t\t\ttable.className.toLowerCase().includes('article');\n\t\t});\n\n\t\tif (!hasTableLayout) {\n\t\t\treturn null; // Don't try table-based extraction for modern layouts\n\t\t}\n\n\t\tconst cells = Array.from(doc.getElementsByTagName('td'));\n\t\treturn ContentScorer.findBestElement(cells);\n\t}\n\n\tprivate findContentByScoring(doc: Document): Element | null {\n\t\tconst candidates: ContentScore[] = [];\n\n\t\tBLOCK_ELEMENTS.forEach((tag: string) => {\n\t\t\tArray.from(doc.getElementsByTagName(tag)).forEach((element: Element) => {\n\t\t\t\tconst score = ContentScorer.scoreElement(element);\n\t\t\t\tif (score > 0) {\n\t\t\t\t\tcandidates.push({ score, element });\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn candidates.length > 0 ? candidates.sort((a, b) => b.score - a.score)[0].element : null;\n\t}\n\n\tprivate getElementSelector(element: Element): string {\n\t\tconst parts: string[] = [];\n\t\tlet current: Element | null = element;\n\t\t\n\t\twhile (current && current !== this.doc.documentElement) {\n\t\t\tlet selector = current.tagName.toLowerCase();\n\t\t\tif (current.id) {\n\t\t\t\tselector += '#' + current.id;\n\t\t\t} else if (current.className && typeof current.className === 'string') {\n\t\t\t\tselector += '.' + current.className.trim().split(/\\s+/).join('.');\n\t\t\t}\n\t\t\tparts.unshift(selector);\n\t\t\tcurrent = current.parentElement;\n\t\t}\n\t\t\n\t\treturn parts.join(' > ');\n\t}\n} ","import { ALLOWED_ATTRIBUTES } from '../constants';\n\n// Language patterns\nconst HIGHLIGHTER_PATTERNS = [\n\t/^language-(\\w+)$/, // language-javascript\n\t/^lang-(\\w+)$/, // lang-javascript\n\t/^(\\w+)-code$/, // javascript-code\n\t/^code-(\\w+)$/, // code-javascript\n\t/^syntax-(\\w+)$/, // syntax-javascript\n\t/^code-snippet__(\\w+)$/, // code-snippet__javascript\n\t/^highlight-(\\w+)$/, // highlight-javascript\n\t/^(\\w+)-snippet$/, // javascript-snippet\n\n\t// fallback\n\t/(?:^|\\s)(?:language|lang|brush|syntax)-(\\w+)(?:\\s|$)/i\n];\n\n// Languages to detect in code blocks\nconst CODE_LANGUAGES = new Set([\n\t'abap',\n\t'actionscript',\n\t'ada',\n\t'adoc',\n\t'agda',\n\t'antlr4',\n\t'applescript',\n\t'arduino',\n\t'armasm',\n\t'asciidoc',\n\t'aspnet',\n\t'atom',\n\t'bash',\n\t'batch',\n\t'c',\n\t'clojure',\n\t'cmake',\n\t'cobol',\n\t'coffeescript',\n\t'cpp', 'c++',\n\t'crystal',\n\t'csharp', 'cs',\n\t'dart',\n\t'django',\n\t'dockerfile',\n\t'dotnet',\n\t'elixir',\n\t'elm',\n\t'erlang',\n\t'fortran',\n\t'fsharp',\n\t'gdscript',\n\t'gitignore',\n\t'glsl',\n\t'golang',\n\t'gradle',\n\t'graphql',\n\t'groovy',\n\t'haskell', 'hs',\n\t'haxe',\n\t'hlsl',\n\t'html',\n\t'idris',\n\t'java',\n\t'javascript', 'js', 'jsx',\n\t'jsdoc',\n\t'json', 'jsonp',\n\t'julia',\n\t'kotlin',\n\t'latex',\n\t'lisp', 'elisp',\n\t'livescript',\n\t'lua',\n\t'makefile',\n\t'markdown', 'md',\n\t'markup',\n\t'masm',\n\t'mathml',\n\t'matlab',\n\t'mongodb',\n\t'mysql',\n\t'nasm',\n\t'nginx',\n\t'nim',\n\t'nix',\n\t'objc',\n\t'ocaml',\n\t'pascal',\n\t'perl',\n\t'php',\n\t'postgresql',\n\t'powershell',\n\t'prolog',\n\t'puppet',\n\t'python',\n\t'regex',\n\t'rss',\n\t'ruby', 'rb',\n\t'rust',\n\t'scala',\n\t'scheme',\n\t'shell', 'sh',\n\t'solidity',\n\t'sparql',\n\t'sql',\n\t'ssml',\n\t'svg',\n\t'swift',\n\t'tcl',\n\t'terraform',\n\t'tex',\n\t'toml',\n\t'typescript', 'ts', 'tsx',\n\t'unrealscript',\n\t'verilog',\n\t'vhdl',\n\t'webassembly', 'wasm',\n\t'xml',\n\t'yaml', 'yml',\n\t'zig'\n]);\n\n// Convert code blocks with different syntax highlighters and line numbers\n// to a standard <pre> and <code> element with a language attribute\nexport const codeBlockRules = [\n\t{\n\t\tselector: [\n\t\t\t// Basic code blocks\n\t\t\t'pre',\n\t\t\t\n\t\t\t// Common syntax highlighter containers\n\t\t\t'div[class*=\"prismjs\"]',\n\t\t\t'.syntaxhighlighter',\n\t\t\t'.highlight',\n\t\t\t'.highlight-source',\n\t\t\t'.wp-block-syntaxhighlighter-code',\n\t\t\t'.wp-block-code',\n\t\t\t'div[class*=\"language-\"]'\n\t\t].join(', '),\n\t\telement: 'pre',\n\t\ttransform: (el: Element): Element => {\n\t\t\tif (!(el instanceof HTMLElement)) return el;\n\n\t\t\tconst getCodeLanguage = (element: HTMLElement): string => {\n\t\t\t\t// Check data-lang attribute first\n\t\t\t\tconst dataLang = element.getAttribute('data-lang') || element.getAttribute('data-language');\n\t\t\t\tif (dataLang) {\n\t\t\t\t\treturn dataLang.toLowerCase();\n\t\t\t\t}\n\n\t\t\t\t// Check class names for patterns and supported languages\n\t\t\t\tconst classNames = Array.from(element.classList);\n\t\t\t\t\n\t\t\t\t// Check for syntax highlighter specific format\n\t\t\t\tif (element.classList.contains('syntaxhighlighter')) {\n\t\t\t\t\tconst langClass = classNames.find(c => !['syntaxhighlighter', 'nogutter'].includes(c));\n\t\t\t\t\tif (langClass && CODE_LANGUAGES.has(langClass.toLowerCase())) {\n\t\t\t\t\t\treturn langClass.toLowerCase();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Check patterns\n\t\t\t\tfor (const className of classNames) {\n\t\t\t\t\tfor (const pattern of HIGHLIGHTER_PATTERNS) {\n\t\t\t\t\t\tconst match = className.toLowerCase().match(pattern);\n\t\t\t\t\t\tif (match && match[1] && CODE_LANGUAGES.has(match[1].toLowerCase())) {\n\t\t\t\t\t\t\treturn match[1].toLowerCase();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If all else fails, check for bare language names\n\t\t\t\tfor (const className of classNames) {\n\t\t\t\t\tif (CODE_LANGUAGES.has(className.toLowerCase())) {\n\t\t\t\t\t\treturn className.toLowerCase();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn '';\n\t\t\t};\n\n\t\t\t// Try to get the language from the element and its ancestors\n\t\t\tlet language = '';\n\t\t\tlet currentElement: HTMLElement | null = el;\n\t\t\t\n\t\t\twhile (currentElement && !language) {\n\t\t\t\tlanguage = getCodeLanguage(currentElement);\n\t\t\t\t\n\t\t\t\t// Also check for code elements within the current element\n\t\t\t\tif (!language && currentElement.querySelector('code')) {\n\t\t\t\t\tlanguage = getCodeLanguage(currentElement.querySelector('code')!);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcurrentElement = currentElement.parentElement;\n\t\t\t}\n\n\t\t\t// Extract content from WordPress syntax highlighter\n\t\t\tconst extractWordPressContent = (element: HTMLElement): string => {\n\t\t\t\t// Handle WordPress syntax highlighter table format\n\t\t\t\tconst codeContainer = element.querySelector('.syntaxhighlighter table .code .container');\n\t\t\t\tif (codeContainer) {\n\t\t\t\t\treturn Array.from(codeContainer.children)\n\t\t\t\t\t\t.map(line => {\n\t\t\t\t\t\t\tconst codeParts = Array.from(line.querySelectorAll('code'))\n\t\t\t\t\t\t\t\t.map(code => {\n\t\t\t\t\t\t\t\t\tlet text = code.textContent || '';\n\t\t\t\t\t\t\t\t\tif (code.classList.contains('spaces')) {\n\t\t\t\t\t\t\t\t\t\ttext = ' '.repeat(text.length);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn text;\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.join('');\n\t\t\t\t\t\t\treturn codeParts || line.textContent || '';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('\\n');\n\t\t\t\t}\n\n\t\t\t\t// Handle WordPress syntax highlighter non-table format\n\t\t\t\tconst codeLines = element.querySelectorAll('.code .line');\n\t\t\t\tif (codeLines.length > 0) {\n\t\t\t\t\treturn Array.from(codeLines)\n\t\t\t\t\t\t.map(line => {\n\t\t\t\t\t\t\tconst codeParts = Array.from(line.querySelectorAll('code'))\n\t\t\t\t\t\t\t\t.map(code => code.textContent || '')\n\t\t\t\t\t\t\t\t.join('');\n\t\t\t\t\t\t\treturn codeParts || line.textContent || '';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('\\n');\n\t\t\t\t}\n\n\t\t\t\treturn '';\n\t\t\t};\n\n\t\t\t// Recursively extract text content while preserving structure\n\t\t\tconst extractStructuredText = (element: Node): string => {\n\t\t\t\tif (element.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\treturn element.textContent || '';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlet text = '';\n\t\t\t\tif (element instanceof HTMLElement) {\n\t\t\t\t\t// Handle explicit line breaks\n\t\t\t\t\tif (element.tagName === 'BR') {\n\t\t\t\t\t\treturn '\\n';\n\t\t\t\t\t}\n\n\t\t\t\t\t// Handle common line-based code formats\n\t\t\t\t\t// This covers various syntax highlighter implementations that use\n\t\t\t\t\t// divs or spans to represent individual lines\n\t\t\t\t\tif (element.matches('div[class*=\"line\"], span[class*=\"line\"], .ec-line, [data-line-number], [data-line]')) {\n\t\t\t\t\t\t// Try to find the actual code content in common structures:\n\t\t\t\t\t\t// 1. A dedicated code container\n\t\t\t\t\t\tconst codeContainer = element.querySelector('.code, .content, [class*=\"code-\"], [class*=\"content-\"]');\n\t\t\t\t\t\tif (codeContainer) {\n\t\t\t\t\t\t\treturn (codeContainer.textContent || '') + '\\n';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// 2. Line number is in a separate element\n\t\t\t\t\t\tconst lineNumber = element.querySelector('.line-number, .gutter, [class*=\"line-number\"], [class*=\"gutter\"]');\n\t\t\t\t\t\tif (lineNumber) {\n\t\t\t\t\t\t\tconst withoutLineNum = Array.from(element.childNodes)\n\t\t\t\t\t\t\t\t.filter(node => !lineNumber.contains(node))\n\t\t\t\t\t\t\t\t.map(node => extractStructuredText(node))\n\t\t\t\t\t\t\t\t.join('');\n\t\t\t\t\t\t\treturn withoutLineNum + '\\n';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// 3. Fallback to the entire line content\n\t\t\t\t\t\treturn element.textContent + '\\n';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\telement.childNodes.forEach(child => {\n\t\t\t\t\t\ttext += extractStructuredText(child);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn text;\n\t\t\t};\n\n\t\t\t// Extract content based on element type\n\t\t\tlet codeContent = '';\n\t\t\tif (el.matches('.syntaxhighlighter, .wp-block-syntaxhighlighter-code')) {\n\t\t\t\tcodeContent = extractWordPressContent(el);\n\t\t\t}\n\t\t\t\n\t\t\t// If no content extracted from WordPress format, use structured text extraction\n\t\t\tif (!codeContent) {\n\t\t\t\tcodeContent = extractStructuredText(el);\n\t\t\t}\n\n\t\t\t// Clean up the content\n\t\t\tcodeContent = codeContent\n\t\t\t\t.replace(/^\\s+|\\s+$/g, '') // Trim start/end whitespace\n\t\t\t\t.replace(/\\t/g, ' ') // Convert tabs to spaces\n\t\t\t\t.replace(/\\n{3,}/g, '\\n\\n') // Normalize multiple newlines\n\t\t\t\t.replace(/\\u00a0/g, ' ') // Replace non-breaking spaces\n\t\t\t\t.replace(/^\\n+/, '') // Remove extra newlines at start\n\t\t\t\t.replace(/\\n+$/, ''); // Remove extra newlines at end\n\n\t\t\t// Create new pre element\n\t\t\tconst newPre = document.createElement('pre');\n\n\t\t\t// Create code element\n\t\t\tconst code = document.createElement('code');\n\t\t\tif (language) {\n\t\t\t\tcode.setAttribute('data-lang', language);\n\t\t\t\tcode.setAttribute('class', `language-${language}`);\n\t\t\t}\n\t\t\tcode.textContent = codeContent;\n\t\t\t\n\t\t\tnewPre.appendChild(code);\n\t\t\treturn newPre;\n\t\t}\n\t}\n];","import { ALLOWED_ATTRIBUTES } from \"../constants\";\n\nexport const headingRules = [\n // Simplify headings by removing internal navigation elements\n\t{\n\t\tselector: 'h1, h2, h3, h4, h5, h6',\n\t\telement: 'keep',\n\t\ttransform: (el: Element): Element => {\n\t\t\t// Get document from element's owner document\n\t\t\tconst doc = el.ownerDocument;\n\t\t\tif (!doc) {\n\t\t\t\tconsole.warn('No document available');\n\t\t\t\treturn el;\n\t\t\t}\n\n\t\t\t// Create new heading of same level\n\t\t\tconst newHeading = doc.createElement(el.tagName);\n\t\t\t\n\t\t\t// Copy allowed attributes from original heading\n\t\t\tArray.from(el.attributes).forEach(attr => {\n\t\t\t\tif (ALLOWED_ATTRIBUTES.has(attr.name)) {\n\t\t\t\t\tnewHeading.setAttribute(attr.name, attr.value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Clone the element so we can modify it without affecting the original\n\t\t\tconst clone = el.cloneNode(true) as Element;\n\n\t\t\t// First extract text from navigation elements before removing them\n\t\t\tconst navigationText = new Map<Element, string>();\n\t\t\t\n\t\t\t// Find all navigation elements and store their text content\n\t\t\tArray.from(clone.querySelectorAll('*')).forEach(child => {\n\t\t\t\tlet shouldRemove = false;\n\t\t\t\t\n\t\t\t\tif (child instanceof HTMLAnchorElement) {\n\t\t\t\t\tconst href = child.getAttribute('href');\n\t\t\t\t\tif (href?.includes('#') || href?.startsWith('#')) {\n\t\t\t\t\t\tnavigationText.set(child, child.textContent?.trim() || '');\n\t\t\t\t\t\tshouldRemove = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (child.classList.contains('anchor')) {\n\t\t\t\t\tnavigationText.set(child, child.textContent?.trim() || '');\n\t\t\t\t\tshouldRemove = true;\n\t\t\t\t}\n\t\t\t\tif (child instanceof HTMLButtonElement) {\n\t\t\t\t\tshouldRemove = true;\n\t\t\t\t}\n\t\t\t\tif ((child instanceof HTMLSpanElement || child instanceof HTMLDivElement) && \n\t\t\t\t\tchild.querySelector('a[href^=\"#\"]')) {\n\t\t\t\t\tconst anchor = child.querySelector('a[href^=\"#\"]');\n\t\t\t\t\tif (anchor) {\n\t\t\t\t\t\tnavigationText.set(child, anchor.textContent?.trim() || '');\n\t\t\t\t\t}\n\t\t\t\t\tshouldRemove = true;\n\t\t\t\t}\n\n\t\t\t\tif (shouldRemove) {\n\t\t\t\t\t// If this element contains the only text content of its parent,\n\t\t\t\t\t// store its text to be used for the parent\n\t\t\t\t\tconst parent = child.parentElement;\n\t\t\t\t\tif (parent && parent !== clone && \n\t\t\t\t\t\tparent.textContent?.trim() === child.textContent?.trim()) {\n\t\t\t\t\t\tnavigationText.set(parent, child.textContent?.trim() || '');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Remove navigation elements\n\t\t\tconst toRemove = Array.from(clone.querySelectorAll('*')).filter(child => {\n\t\t\t\tif (child instanceof HTMLAnchorElement) {\n\t\t\t\t\tconst href = child.getAttribute('href');\n\t\t\t\t\treturn href?.includes('#') || href?.startsWith('#');\n\t\t\t\t}\n\t\t\t\tif (child.classList.contains('anchor')) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (child instanceof HTMLButtonElement) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif ((child instanceof HTMLSpanElement || child instanceof HTMLDivElement) && \n\t\t\t\t\tchild.querySelector('a[href^=\"#\"]')) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\ttoRemove.forEach(element => element.remove());\n\n\t\t\t// Get the text content after removing navigation elements\n\t\t\tlet textContent = clone.textContent?.trim() || '';\n\n\t\t\t// If we lost all text content but had navigation text, use that instead\n\t\t\tif (!textContent && navigationText.size > 0) {\n\t\t\t\ttextContent = Array.from(navigationText.values())[0];\n\t\t\t}\n\n\t\t\t// Set the clean text content\n\t\t\tnewHeading.textContent = textContent;\n\t\t\t\n\t\t\treturn newHeading;\n\t\t}\n\t}\n];","export interface MathData {\n\tmathml: string;\n\tlatex: string | null;\n\tisBlock: boolean;\n}\n\nexport const getMathMLFromElement = (el: Element): MathData | null => {\n\t// 1. Direct MathML content\n\tif (el.tagName.toLowerCase() === 'math') {\n\t\tconst isBlock = el.getAttribute('display') === 'block';\n\t\treturn {\n\t\t\tmathml: el.outerHTML,\n\t\t\tlatex: el.getAttribute('alttext') || null,\n\t\t\tisBlock\n\t\t};\n\t}\n\n\t// 2. MathML in data-mathml attribute\n\tconst mathmlStr = el.getAttribute('data-mathml');\n\tif (mathmlStr) {\n\t\tconst tempDiv = document.createElement('div');\n\t\ttempDiv.innerHTML = mathmlStr;\n\t\tconst mathElement = tempDiv.querySelector('math');\n\t\tif (mathElement) {\n\t\t\tconst isBlock = mathElement.getAttribute('display') === 'block';\n\t\t\treturn {\n\t\t\t\tmathml: mathElement.outerHTML,\n\t\t\t\tlatex: mathElement.getAttribute('alttext') || null,\n\t\t\t\tisBlock\n\t\t\t};\n\t\t}\n\t}\n\n\t// 3. MathJax assistive MathML\n\tconst assistiveMmlContainer = el.querySelector('.MJX_Assistive_MathML, mjx-assistive-mml');\n\t\n\tif (assistiveMmlContainer) {\n\t\tconst mathElement = assistiveMmlContainer.querySelector('math');\n\t\t\n\t\tif (mathElement) {\n\t\t\t// Check both the math element and container for display mode\n\t\t\tconst mathDisplayAttr = mathElement.getAttribute('display');\n\t\t\tconst containerDisplayAttr = assistiveMmlContainer.getAttribute('display');\t\t \n\t\t\tconst isBlock = mathDisplayAttr === 'block' || containerDisplayAttr === 'block';\n\t\t\t\n\t\t\treturn {\n\t\t\t\tmathml: mathElement.outerHTML,\n\t\t\t\tlatex: mathElement.getAttribute('alttext') || null,\n\t\t\t\tisBlock\n\t\t\t};\n\t\t}\n\t}\n\n\t// 4. KaTeX MathML\n\tconst katexMathml = el.querySelector('.katex-mathml math');\n\tif (katexMathml) {\n\t\treturn {\n\t\t\tmathml: katexMathml.outerHTML,\n\t\t\tlatex: null, // We'll get LaTeX separately for KaTeX\n\t\t\tisBlock: false // We'll determine this from container\n\t\t};\n\t}\n\n\treturn null;\n};\n\nexport const getBasicLatexFromElement = (el: Element): string | null => {\n\t// Direct data-latex attribute\n\tconst dataLatex = el.getAttribute('data-latex');\n\tif (dataLatex) {\n\t\treturn dataLatex;\n\t}\n\n\t// WordPress LaTeX images\n\tif (el.tagName.toLowerCase() === 'img' && el.classList.contains('latex')) {\n\t\t// Try alt text first as it's cleaner\n\t\tconst altLatex = el.getAttribute('alt');\n\t\tif (altLatex) {\n\t\t\treturn altLatex;\n\t\t}\n\t\t\n\t\t// Fallback to extracting from URL\n\t\tconst src = el.getAttribute('src');\n\t\tif (src) {\n\t\t\tconst match = src.match(/latex\\.php\\?latex=([^&]+)/);\n\t\t\tif (match) {\n\t\t\t\treturn decodeURIComponent(match[1])\n\t\t\t\t\t.replace(/\\+/g, ' ') // Replace + with spaces\n\t\t\t\t\t.replace(/%5C/g, '\\\\'); // Fix escaped backslashes\n\t\t\t}\n\t\t}\n\t}\n\n\t// LaTeX in annotation\n\tconst annotation = el.querySelector('annotation[encoding=\"application/x-tex\"]');\n\tif (annotation?.textContent) {\n\t\treturn annotation.textContent.trim();\n\t}\n\n\t// KaTeX formats\n\tif (el.matches('.katex')) {\n\t\tconst katexAnnotation = el.querySelector('.katex-mathml annotation[encoding=\"application/x-tex\"]');\n\t\tif (katexAnnotation?.textContent) {\n\t\t\treturn katexAnnotation.textContent.trim();\n\t\t}\n\t}\n\n\t// MathJax scripts\n\tif (el.matches('script[type=\"math/tex\"]') || el.matches('script[type=\"math/tex; mode=display\"]')) {\n\t\treturn el.textContent?.trim() || null;\n\t}\n\n\t// Check for sibling script element\n\tif (el.parentElement) {\n\t\tconst siblingScript = el.parentElement.querySelector('script[type=\"math/tex\"], script[type=\"math/tex; mode=display\"]');\n\t\tif (siblingScript) {\n\t\t\treturn siblingScript.textContent?.trim() || null;\n\t\t}\n\t}\n\n\t// Fallback to alt text or text content\n\treturn el.getAttribute('alt') || el.textContent?.trim() || null;\n};\n\nexport const isBlockDisplay = (el: Element): boolean => {\n\t// Check explicit display attribute\n\tconst displayAttr = el.getAttribute('display');\n\tif (displayAttr === 'block') {\n\t\treturn true;\n\t}\n\n\t// Check common class names\n\tconst classNames = el.className.toLowerCase();\n\tif (classNames.includes('display') || classNames.includes('block')) {\n\t\treturn true;\n\t}\n\n\t// Check container classes\n\tconst container = el.closest('.katex-display, .MathJax_Display, [data-display=\"block\"]');\n\tif (container) {\n\t\treturn true;\n\t}\n\n\t// Check if preceded by block element\n\tconst prevElement = el.previousElementSibling;\n\tif (prevElement?.tagName.toLowerCase() === 'p') {\n\t\treturn true;\n\t}\n\n\t// Check specific formats\n\tif (el.matches('.mwe-math-fallback-image-display')) {\n\t\treturn true;\n\t}\n\n\t// Check KaTeX display mode\n\tif (el.matches('.katex')) {\n\t\t// KaTeX elements are inline by default\n\t\t// Only block if explicitly marked as display\n\t\treturn el.closest('.katex-display') !== null;\n\t}\n\n\t// Check MathJax v3 display attribute\n\tif (el.hasAttribute('display')) {\n\t\treturn el.getAttribute('display') === 'true';\n\t}\n\n\t// Check MathJax script display attribute\n\tif (el.matches('script[type=\"math/tex; mode=display\"]')) {\n\t\treturn true;\n\t}\n\n\tif (el.hasAttribute('display')) {\n\t\treturn el.getAttribute('display') === 'true';\n\t}\n\n\t// Check parent container display attribute\n\tconst parentContainer = el.closest('[display]');\n\tif (parentContainer) {\n\t\treturn parentContainer.getAttribute('display') === 'true';\n\t}\n\n\treturn false;\n};\n\n// Shared selector for math elements\nexport const mathSelectors = [\n\t// WordPress LaTeX images\n\t'img.latex[src*=\"latex.php\"]',\n\n\t// MathJax elements (v2 and v3)\n\t'span.MathJax',\n\t'mjx-container',\n\t'script[type=\"math/tex\"]',\n\t'script[type=\"math/tex; mode=display\"]',\n\t'.MathJax_Preview + script[type=\"math/tex\"]',\n\t'.MathJax_Display',\n\t'.MathJax_SVG',\n\t'.MathJax_MathML',\n\n\t// MediaWiki math elements\n\t'.mwe-math-element',\n\t'.mwe-math-fallback-image-inline',\n\t'.mwe-math-fallback-image-display',\n\t'.mwe-math-mathml-inline',\n\t'.mwe-math-mathml-display',\n\n\t// KaTeX elements\n\t'.katex',\n\t'.katex-display',\n\t'.katex-mathml',\n\t'.katex-html',\n\t'[data-katex]',\n\t'script[type=\"math/katex\"]',\n\n\t// Generic math elements and other formats\n\t'math',\n\t'[data-math]',\n\t'[data-latex]',\n\t'[data-tex]',\n\t'script[type^=\"math/\"]',\n\t'annotation[encoding=\"application/x-tex\"]'\n].join(','); ","import { MathMLToLaTeX } from 'mathml-to-latex';\nimport * as temml from 'temml';\nimport {\n\tMathData,\n\tgetMathMLFromElement,\n\tgetBasicLatexFromElement,\n\tisBlockDisplay,\n\tmathSelectors\n} from './math.base';\n\nexport const getLatexFromElement = (el: Element): string | null => {\n\t// First try basic LaTeX extraction\n\tconst basicLatex = getBasicLatexFromElement(el);\n\tif (basicLatex) {\n\t\treturn basicLatex;\n\t}\n\n\t// If no LaTeX found but we have MathML, convert it\n\tconst mathData = getMathMLFromElement(el);\n\tif (mathData?.mathml) {\n\t\ttry {\n\t\t\treturn MathMLToLaTeX.convert(mathData.mathml);\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to convert MathML to LaTeX:', e);\n\t\t}\n\t}\n\n\treturn null;\n};\n\nexport const createCleanMathEl = (mathData: MathData | null, latex: string | null, isBlock: boolean, doc: Document): Element => {\n\tconst cleanMathEl = doc.createElement('math');\n\n\tcleanMathEl.setAttribute('xmlns', 'http://www.w3.org/1998/Math/MathML');\n\tcleanMathEl.setAttribute('display', isBlock ? 'block' : 'inline');\n\tcleanMathEl.setAttribute('data-latex', latex || '');\n\n\t// First try to use existing MathML content\n\tif (mathData?.mathml) {\n\t\tconst tempDiv = doc.createElement('div');\n\t\ttempDiv.innerHTML = mathData.mathml;\n\t\tconst mathContent = tempDiv.querySelector('math');\n\t\tif (mathContent) {\n\t\t\tcleanMathEl.innerHTML = mathContent.innerHTML;\n\t\t}\n\t}\n\t// If no MathML but we have LaTeX, convert it\n\telse if (latex) {\n\t\ttry {\n\t\t\tconst mathml = temml.renderToString(latex, {\n\t\t\t\tdisplayMode: isBlock,\n\t\t\t\tthrowOnError: false\n\t\t\t});\n\t\t\tconst tempDiv = doc.createElement('div');\n\t\t\ttempDiv.innerHTML = mathml;\n\t\t\tconst mathContent = tempDiv.querySelector('math');\n\t\t\tif (mathContent) {\n\t\t\t\tcleanMathEl.innerHTML = mathContent.innerHTML;\n\t\t\t} else {\n\t\t\t\tcleanMathEl.textContent = latex; // Fallback to LaTeX as text\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to convert LaTeX to MathML:', e);\n\t\t\tcleanMathEl.textContent = latex; // Fallback to LaTeX as text\n\t\t}\n\t}\n\n\treturn cleanMathEl;\n};\n\nexport const mathRules = [\n\t{\n\t\tselector: mathSelectors,\n\t\telement: 'math',\n\t\ttransform: (el: Element): Element => {\n\t\t\t// Check if element is an HTMLElement by checking for common properties\n\t\t\tif (!('style' in el) || !('className' in el)) {\n\t\t\t\treturn el;\n\t\t\t}\n\n\t\t\tconst mathData = getMathMLFromElement(el);\n\t\t\tconst latex = getLatexFromElement(el);\n\t\t\tconst isBlock = isBlockDisplay(el);\n\t\t\tconst cleanMathEl = createCleanMathEl(mathData, latex, isBlock, el.ownerDocument);\n\n\t\t\t// Clean up any associated math scripts after we've extracted their content\n\t\t\tif (el.parentElement) {\n\t\t\t\t// Remove all math-related scripts and previews\n\t\t\t\tconst mathElements = el.parentElement.querySelectorAll(\n\t\t\t\t\t'script[type^=\"math/\"], .MathJax_Preview, script[type=\"text/javascript\"][src*=\"mathjax\"], script[type=\"text/javascript\"][src*=\"katex\"]'\n\t\t\t\t);\n\t\t\t\tmathElements.forEach(el => el.remove());\n\t\t\t}\n\n\t\t\treturn cleanMathEl;\n\t\t}\n\t}\n]; ","import { BaseExtractor } from './extractors/_base';\n\n// Extractors\nimport { RedditExtractor } from './extractors/reddit';\nimport { TwitterExtractor } from './extractors/twitter';\nimport { YoutubeExtractor } from './extractors/youtube';\nimport { HackerNewsExtractor } from './extractors/hackernews';\nimport { ChatGPTExtractor } from './extractors/chatgpt';\nimport { ClaudeExtractor } from './extractors/claude';\n\ntype ExtractorConstructor = new (document: Document, url: string, schemaOrgData?: any) => BaseExtractor;\n\ninterface ExtractorMapping {\n\tpatterns: (string | RegExp)[];\n\textractor: ExtractorConstructor;\n}\n\nexport class ExtractorRegistry {\n\tprivate static mappings: ExtractorMapping[] = [];\n\tprivate static domainCache: Map<string, ExtractorConstructor | null> = new Map();\n\n\tstatic initialize() {\n\t\t// Register all extractors with their URL patterns\n\t\tthis.register({\n\t\t\tpatterns: [\n\t\t\t\t'twitter.com',\n\t\t\t\t/\\/x\\.com\\/.*/,\n\t\t\t],\n\t\t\textractor: TwitterExtractor\n\t\t});\n\n\t\tthis.register({\n\t\t\tpatterns: [\n\t\t\t\t'reddit.com',\n\t\t\t\t'old.reddit.com',\n\t\t\t\t'new.reddit.com',\n\t\t\t\t/^https:\\/\\/[^\\/]+\\.reddit\\.com/\n\t\t\t],\n\t\t\textractor: RedditExtractor\n\t\t});\n\n\t\tthis.register({\n\t\t\tpatterns: [\n\t\t\t\t'youtube.com',\n\t\t\t\t'youtu.be',\n\t\t\t\t/youtube\\.com\\/watch\\?v=.*/,\n\t\t\t\t/youtu\\.be\\/.*/\n\t\t\t],\n\t\t\textractor: YoutubeExtractor\n\t\t});\n\n\t\tthis.register({\n\t\t\tpatterns: [\n\t\t\t\t/news\\.ycombinator\\.com\\/item\\?id=.*/\n\t\t\t],\n\t\t\textractor: HackerNewsExtractor\n\t\t});\n\n\t\tthis.register({\n\t\t\tpatterns: [\n\t\t\t\t/^https?:\\/\\/chatgpt\\.com\\/(c|share)\\/.*/\n\t\t\t],\n\t\t\textractor: ChatGPTExtractor\n\t\t});\n\n\t\tthis.register({\n\t\t\tpatterns: [\n\t\t\t\t/^https?:\\/\\/claude\\.ai\\/(chat|share)\\/.*/\n\t\t\t],\n\t\t\textractor: ClaudeExtractor\n\t\t});\n\t}\n\n\tstatic register(mapping: ExtractorMapping) {\n\t\tthis.mappings.push(mapping);\n\t}\n\n\tstatic findExtractor(document: Document, url: string, schemaOrgData?: any): BaseExtractor | null {\n\t\ttry {\n\t\t\tconst domain = new URL(url).hostname;\n\t\t\t\n\t\t\t// Check cache first\n\t\t\tif (this.domainCache.has(domain)) {\n\t\t\t\tconst cachedExtractor = this.domainCache.get(domain);\n\t\t\t\treturn cachedExtractor ? new cachedExtractor(document, url, schemaOrgData) : null;\n\t\t\t}\n\n\t\t\t// Find matching extractor\n\t\t\tfor (const { patterns, extractor } of this.mappings) {\n\t\t\t\tconst matches = patterns.some(pattern => {\n\t\t\t\t\tif (pattern instanceof RegExp) {\n\t\t\t\t\t\treturn pattern.test(url);\n\t\t\t\t\t}\n\t\t\t\t\treturn domain.includes(pattern);\n\t\t\t\t});\n\n\t\t\t\tif (matches) {\n\t\t\t\t\t// Cache the result\n\t\t\t\t\tthis.domainCache.set(domain, extractor);\n\t\t\t\t\treturn new extractor(document, url, schemaOrgData);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Cache the negative result\n\t\t\tthis.domainCache.set(domain, null);\n\t\t\treturn null;\n\n\t\t} catch (error) {\n\t\t\tconsole.error('Error in findExtractor:', error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tstatic clearCache() {\n\t\tthis.domainCache.clear();\n\t}\n}\n\n// Initialize extractors\nExtractorRegistry.initialize();\n","import { ExtractorResult, ExtractorVariables, ExtractedContent } from '../types/extractors';\n\nexport abstract class BaseExtractor {\n\tprotected document: Document;\n\tprotected url: string;\n\tprotected schemaOrgData?: any;\n\n\tconstructor(document: Document, url: string, schemaOrgData?: any) {\n\t\tthis.document = document;\n\t\tthis.url = url;\n\t\tthis.schemaOrgData = schemaOrgData;\n\t}\n\n\tabstract canExtract(): boolean;\n\tabstract extract(): ExtractorResult;\n} ","import { BaseExtractor } from './_base';\nimport { ConversationMessage, ConversationMetadata, Footnote, ExtractorResult } from '../types/extractors';\nimport { Defuddle } from '../defuddle';\n\nexport abstract class ConversationExtractor extends BaseExtractor {\n\tprotected abstract extractMessages(): ConversationMessage[];\n\tprotected abstract getMetadata(): ConversationMetadata;\n\tprotected getFootnotes(): Footnote[] {\n\t\treturn [];\n\t}\n\n\textract(): ExtractorResult {\n\t\tconst messages = this.extractMessages();\n\t\tconst metadata = this.getMetadata();\n\t\tconst footnotes = this.getFootnotes();\n\t\tconst rawContentHtml = this.createContentHtml(messages, footnotes);\n\n\t\t// Create a temporary document to run Defuddle on our content\n\t\tconst tempDoc = document.implementation.createHTMLDocument();\n\t\tconst container = tempDoc.createElement('article');\n\t\tcontainer.innerHTML = rawContentHtml;\n\t\ttempDoc.body.appendChild(container);\n\n\t\t// Run Defuddle on our formatted content\n\t\tconst defuddled = new Defuddle(tempDoc).parse();\n\t\tconst contentHtml = defuddled.content;\n\n\t\treturn {\n\t\t\tcontent: contentHtml,\n\t\t\tcontentHtml: contentHtml,\n\t\t\textractedContent: {\n\t\t\t\tmessageCount: messages.length.toString(),\n\t\t\t},\n\t\t\tvariables: {\n\t\t\t\ttitle: metadata.title || 'Conversation',\n\t\t\t\tsite: metadata.site,\n\t\t\t\tdescription: metadata.description || `${metadata.site} conversation with ${messages.length} messages`,\n\t\t\t\twordCount: defuddled.wordCount?.toString() || '',\n\t\t\t}\n\t\t};\n\t}\n\n\tprotected createContentHtml(messages: ConversationMessage[], footnotes: Footnote[]): string {\n\t\tconst messagesHtml = messages.map((message, index) => {\n\t\t\tconst timestampHtml = message.timestamp ? \n\t\t\t\t`<div class=\"message-timestamp\">${message.timestamp}</div>` : '';\n\n\t\t\t// Check if content already has paragraph tags\n\t\t\tconst hasParagraphs = /<p[^>]*>[\\s\\S]*?<\\/p>/i.test(message.content);\n\t\t\tconst contentHtml = hasParagraphs ? message.content : `<p>${message.content}</p>`;\n\n\t\t\t// Add metadata to data attributes\n\t\t\tconst dataAttributes = message.metadata ? \n\t\t\t\tObject.entries(message.metadata)\n\t\t\t\t\t.map(([key, value]) => `data-${key}=\"${value}\"`)\n\t\t\t\t\t.join(' ') : '';\n\n\t\t\treturn `\n\t\t\t<div class=\"message message-${message.author.toLowerCase()}\" ${dataAttributes}>\n\t\t\t\t<div class=\"message-header\">\n\t\t\t\t\t<p class=\"message-author\"><strong>${message.author}</strong></p>\n\t\t\t\t\t${timestampHtml}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"message-content\">\n\t\t\t\t\t${contentHtml}\n\t\t\t\t</div>\n\t\t\t</div>${index < messages.length - 1 ? '\\n<hr>' : ''}`;\n\t\t}).join('\\n').trim();\n\n\t\t// Add footnotes section if we have any\n\t\tconst footnotesHtml = footnotes.length > 0 ? `\n\t\t\t<div id=\"footnotes\">\n\t\t\t\t<ol>\n\t\t\t\t\t${footnotes.map((footnote, index) => `\n\t\t\t\t\t\t<li class=\"footnote\" id=\"fn:${index + 1}\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t<a href=\"${footnote.url}\" target=\"_blank\">${footnote.text}</a> <a href=\"#fnref:${index + 1}\" class=\"footnote-backref\">↩</a>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t`).join('')}\n\t\t\t\t</ol>\n\t\t\t</div>` : '';\n\n\t\treturn `${messagesHtml}\\n${footnotesHtml}`.trim();\n\t}\n} ","import { ConversationExtractor } from './_conversation';\nimport { ConversationMessage, ConversationMetadata, Footnote } from '../types/extractors';\n\nexport class ChatGPTExtractor extends ConversationExtractor {\n\tprivate articles: NodeListOf<Element> | null;\n\tprivate footnotes: Footnote[];\n\tprivate footnoteCounter: number;\n\n\tconstructor(document: Document, url: string) {\n\t\tsuper(document, url);\n\t\tthis.articles = document.querySelectorAll('article[data-testid^=\"conversation-turn-\"]');\n\t\tthis.footnotes = [];\n\t\tthis.footnoteCounter = 0;\n\t}\n\n\tcanExtract(): boolean {\n\t\treturn !!this.articles && this.articles.length > 0;\n\t}\n\n\tprotected extractMessages(): ConversationMessage[] {\n\t\tconst messages: ConversationMessage[] = [];\n\t\tthis.footnotes = [];\n\t\tthis.footnoteCounter = 0;\n\n\t\tif (!this.articles) return messages;\n\n\t\tthis.articles.forEach((article) => {\n\t\t\t// Get the localized author text from the sr-only heading and clean it\n\t\t\tconst authorElement = article.querySelector('h5.sr-only, h6.sr-only');\n\t\t\tconst authorText = authorElement?.textContent\n\t\t\t\t?.trim()\n\t\t\t\t?.replace(/:\\s*$/, '') // Remove colon and any trailing whitespace\n\t\t\t\t|| '';\n\n\t\t\tlet currentAuthorRole = '';\n\n\t\t\tconst authorRole = article.getAttribute('data-message-author-role');\n\t\t\tif (authorRole) {\n\t\t\t\tcurrentAuthorRole = authorRole;\n\t\t\t}\n\n\t\t\tlet messageContent = article.innerHTML || '';\n\t\t\tmessageContent = messageContent.replace(/\\u200B/g, '');\n\n\t\t\t// Remove specific elements from the message content\n\t\t\tconst tempDiv = document.createElement('div');\n\t\t\ttempDiv.innerHTML = messageContent;\n\t\t\ttempDiv.querySelectorAll('h5.sr-only, h6.sr-only, span[data-state=\"closed\"]').forEach(el => el.remove());\n\t\t\tmessageContent = tempDiv.innerHTML;\n\n\t\t\t// Process inline references using regex to find the containers\n\t\t\t// Look for spans containing citation links, replacing entire structure\n\t\t\tconst containerPattern = /(?:<\\/p>)?<div class=\"relative inline-flex[^>]*>.*?<\\/div>|<span[^>]*>(?:<div class=\"relative inline-flex[^>]*>|<div[^>]*class=\"[^\"]*relative inline-flex[^>]*>).*?<\\/div><\\/span>/g;\n\t\t\tmessageContent = messageContent.replace(containerPattern, (match) => {\n\t\t\t\t// Extract URL from the match\n\t\t\t\tconst urlMatch = match.match(/href=\"([^\"]+)\"/);\n\t\t\t\tif (!urlMatch) return match;\n\n\t\t\t\tconst url = urlMatch[1];\n\t\t\t\tlet domain = '';\n\t\t\t\tlet fragmentText = '';\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\t// Extract domain without www.\n\t\t\t\t\tdomain = new URL(url).hostname.replace(/^www\\./, '');\n\t\t\t\t\t\n\t\t\t\t\t// Extract and decode the fragment text if it exists\n\t\t\t\t\tconst hashParts = url.split('#:~:text=');\n\t\t\t\t\tif (hashParts.length > 1) {\n\t\t\t\t\t\tfragmentText = decodeURIComponent(hashParts[1]);\n\t\t\t\t\t\t// Replace URL-encoded commas and clean up\n\t\t\t\t\t\tfragmentText = fragmentText.replace(/%2C/g, ',');\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Split the fragment into start and end if it contains a comma\n\t\t\t\t\t\tconst parts = fragmentText.split(',');\n\t\t\t\t\t\tif (parts.length > 1 && parts[0].trim()) {\n\t\t\t\t\t\t\t// Only show first part with ellipsis if it has content\n\t\t\t\t\t\t\tfragmentText = ` — ${parts[0].trim()}...`;\n\t\t\t\t\t\t} else if (parts[0].trim()) {\n\t\t\t\t\t\t\t// If no comma but has content, wrap the whole text\n\t\t\t\t\t\t\tfragmentText = ` — ${fragmentText.trim()}`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// If no content, don't show fragment text at all\n\t\t\t\t\t\t\tfragmentText = '';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tdomain = url;\n\t\t\t\t}\n\n\t\t\t\t// Check if this URL already exists in our footnotes\n\t\t\t\tlet footnoteIndex = this.footnotes.findIndex(fn => fn.url === url);\n\t\t\t\tif (footnoteIndex === -1) {\n\t\t\t\t\t// Only create new footnote if URL doesn't exist\n\t\t\t\t\tthis.footnoteCounter++;\n\t\t\t\t\tfootnoteIndex = this.footnoteCounter; // Keep it 1-based\n\t\t\t\t\tthis.footnotes.push({ \n\t\t\t\t\t\turl, \n\t\t\t\t\t\ttext: `<a href=\"${url}\">${domain}</a>${fragmentText}`\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Use existing footnote index (already 1-based since we never subtracted 1)\n\t\t\t\t\tfootnoteIndex++;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Return just the footnote reference\n\t\t\t\treturn `<span class=\"\" data-state=\"closed\"><sup id=\"fnref:${footnoteIndex}\"><a href=\"#fn:${footnoteIndex}\">${footnoteIndex}</a></sup></span>`;\n\t\t\t});\n\n\t\t\t// Clean up any empty spans and stray paragraph tags\n\t\t\tmessageContent = messageContent\n\t\t\t\t.replace(/<span[^>]*>\\s*<\\/span>/g, '')\n\t\t\t\t.replace(/<p[^>]*>\\s*<\\/p>/g, '');\n\n\t\t\tmessages.push({\n\t\t\t\tauthor: authorText,\n\t\t\t\tcontent: messageContent.trim(),\n\t\t\t\tmetadata: {\n\t\t\t\t\trole: currentAuthorRole || 'unknown'\n\t\t\t\t}\n\t\t\t});\n\n\t\t});\n\n\t\treturn messages;\n\t}\n\n\tprotected getFootnotes(): Footnote[] {\n\t\treturn this.footnotes;\n\t}\n\n\tprotected getMetadata(): ConversationMetadata {\n\t\tconst title = this.getTitle();\n\t\tconst messages = this.extractMessages();\n\n\t\treturn {\n\t\t\ttitle,\n\t\t\tsite: 'ChatGPT',\n\t\t\turl: this.url,\n\t\t\tmessageCount: messages.length,\n\t\t\tdescription: `ChatGPT conversation with ${messages.length} messages`\n\t\t};\n\t}\n\n\tprivate getTitle(): string {\n\t\t// Try to get the page title first\n\t\tconst pageTitle = this.document.title?.trim();\n\t\tif (pageTitle && pageTitle !== 'ChatGPT') {\n\t\t\treturn pageTitle;\n\t\t}\n\n\t\t// Fall back to first user message\n\t\tconst firstUserTurn = this.articles?.item(0)?.querySelector('.text-message');\n\t\tif (firstUserTurn) {\n\t\t\tconst text = firstUserTurn.textContent || '';\n\t\t\t// Truncate to first 50 characters if longer\n\t\t\treturn text.length > 50 ? text.slice(0, 50) + '...' : text;\n\t\t}\n\n\t\treturn 'ChatGPT Conversation';\n\t}\n} ","import { ConversationExtractor } from './_conversation';\nimport { ConversationMessage, ConversationMetadata } from '../types/extractors';\n\nexport class ClaudeExtractor extends ConversationExtractor {\n\tprivate articles: NodeListOf<Element> | null;\n\n\tconstructor(document: Document, url: string) {\n\t\tsuper(document, url);\n\t\t// Find all message blocks - both user and assistant messages\n\t\tthis.articles = document.querySelectorAll('div[data-testid=\"user-message\"], div[data-testid=\"assistant-message\"], div.font-claude-message');\n\t}\n\n\tcanExtract(): boolean {\n\t\treturn !!this.articles && this.articles.length > 0;\n\t}\n\n\tprotected extractMessages(): ConversationMessage[] {\n\t\tconst messages: ConversationMessage[] = [];\n\n\t\tif (!this.articles) return messages;\n\n\t\tthis.articles.forEach((article) => {\n\t\t\tlet role: string;\n\t\t\tlet content: string;\n\n\t\t\tif (article.hasAttribute('data-testid')) {\n\t\t\t\t// Handle user messages\n\t\t\t\tif (article.getAttribute('data-testid') === 'user-message') {\n\t\t\t\t\trole = 'you';\n\t\t\t\t\tcontent = article.innerHTML;\n\t\t\t\t}\n\t\t\t\t// Skip non-message elements\n\t\t\t\telse {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (article.classList.contains('font-claude-message')) {\n\t\t\t\t// Handle Claude messages\n\t\t\t\trole = 'assistant';\n\t\t\t\tcontent = article.innerHTML;\n\t\t\t} else {\n\t\t\t\t// Skip unknown elements\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (content) {\n\t\t\t\tmessages.push({\n\t\t\t\t\tauthor: role === 'you' ? 'You' : 'Claude',\n\t\t\t\t\tcontent: content.trim(),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\trole: role\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn messages;\n\t}\n\n\tprotected getMetadata(): ConversationMetadata {\n\t\tconst title = this.getTitle();\n\t\tconst messages = this.extractMessages();\n\n\t\treturn {\n\t\t\ttitle,\n\t\t\tsite: 'Claude',\n\t\t\turl: this.url,\n\t\t\tmessageCount: messages.length,\n\t\t\tdescription: `Claude conversation with ${messages.length} messages`\n\t\t};\n\t}\n\n\tprivate getTitle(): string {\n\t\t// Try to get the page title first\n\t\tconst pageTitle = this.document.title?.trim();\n\t\tif (pageTitle && pageTitle !== 'Claude') {\n\t\t\t// Remove ' - Claude' suffix if present\n\t\t\treturn pageTitle.replace(/ - Claude$/, '');\n\t\t}\n\n\t\t// Try to get title from header\n\t\tconst headerTitle = this.document.querySelector('header .font-tiempos')?.textContent?.trim();\n\t\tif (headerTitle) {\n\t\t\treturn headerTitle;\n\t\t}\n\n\t\t// Fall back to first user message\n\t\tconst firstUserMessage = this.articles?.item(0)?.querySelector('[data-testid=\"user-message\"]');\n\t\tif (firstUserMessage) {\n\t\t\tconst text = firstUserMessage.textContent || '';\n\t\t\t// Truncate to first 50 characters if longer\n\t\t\treturn text.length > 50 ? text.slice(0, 50) + '...' : text;\n\t\t}\n\n\t\treturn 'Claude Conversation';\n\t}\n} ","import { BaseExtractor } from './_base';\nimport { ExtractorResult } from '../types/extractors';\n\nexport class HackerNewsExtractor extends BaseExtractor {\n\tprivate mainPost: Element | null;\n\tprivate isCommentPage: boolean;\n\tprivate mainComment: Element | null;\n\n\tconstructor(document: Document, url: string) {\n\t\tsuper(document, url);\n\t\tthis.mainPost = document.querySelector('.fatitem');\n\t\tthis.isCommentPage = this.detectCommentPage();\n\t\tthis.mainComment = this.isCommentPage ? this.findMainComment() : null;\n\t}\n\n\tprivate detectCommentPage(): boolean {\n\t\t// Check if we're on a comment page by looking for a parent link in the navigation\n\t\treturn !!this.mainPost?.querySelector('.navs a[href*=\"parent\"]');\n\t}\n\n\tprivate findMainComment(): Element | null {\n\t\t// The main comment is the first comment in the fatitem\n\t\tconst comment = this.mainPost?.querySelector('.comment');\n\t\treturn comment || null;\n\t}\n\n\tcanExtract(): boolean {\n\t\treturn !!this.mainPost;\n\t}\n\n\textract(): ExtractorResult {\n\t\tconst postContent = this.getPostContent();\n\t\tconst comments = this.extractComments();\n\n\t\tconst contentHtml = this.createContentHtml(postContent, comments);\n\t\tconst postTitle = this.getPostTitle();\n\t\tconst postAuthor = this.getPostAuthor();\n\t\tconst description = this.createDescription();\n\t\tconst published = this.getPostDate();\n\n\t\treturn {\n\t\t\tcontent: contentHtml,\n\t\t\tcontentHtml: contentHtml,\n\t\t\textractedContent: {\n\t\t\t\tpostId: this.getPostId(),\n\t\t\t\tpostAuthor,\n\t\t\t},\n\t\t\tvariables: {\n\t\t\t\ttitle: postTitle,\n\t\t\t\tauthor: postAuthor,\n\t\t\t\tsite: 'Hacker News',\n\t\t\t\tdescription,\n\t\t\t\tpublished,\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate createContentHtml(postContent: string, comments: string): string {\n\t\treturn `\n\t\t\t<div class=\"hackernews-post\">\n\t\t\t\t<div class=\"post-content\">\n\t\t\t\t\t${postContent}\n\t\t\t\t</div>\n\t\t\t\t${comments ? `\n\t\t\t\t\t<hr>\n\t\t\t\t\t<h2>Comments</h2>\n\t\t\t\t\t<div class=\"hackernews-comments\">\n\t\t\t\t\t\t${comments}\n\t\t\t\t\t</div>\n\t\t\t\t` : ''}\n\t\t\t</div>\n\t\t`.trim();\n\t}\n\n\tprivate getPostContent(): string {\n\t\tif (!this.mainPost) return '';\n\n\t\t// If this is a comment page, use the comment as the main content\n\t\tif (this.isCommentPage && this.mainComment) {\n\t\t\tconst author = this.mainComment.querySelector('.hnuser')?.textContent || '[deleted]';\n\t\t\tconst commentText = this.mainComment.querySelector('.commtext')?.innerHTML || '';\n\t\t\tconst timeElement = this.mainComment.querySelector('.age');\n\t\t\tconst timestamp = timeElement?.getAttribute('title') || '';\n\t\t\tconst date = timestamp.split('T')[0] || '';\n\t\t\tconst points = this.mainComment.querySelector('.score')?.textContent?.trim() || '';\n\t\t\tconst parentUrl = this.mainPost.querySelector('.navs a[href*=\"parent\"]')?.getAttribute('href') || '';\n\t\t\t\n\t\t\treturn `\n\t\t\t\t<div class=\"comment main-comment\">\n\t\t\t\t\t<div class=\"comment-metadata\">\n\t\t\t\t\t\t<span class=\"comment-author\"><strong>${author}</strong></span> •\n\t\t\t\t\t\t<span class=\"comment-date\">${date}</span>\n\t\t\t\t\t\t${points ? ` • <span class=\"comment-points\">${points}</span>` : ''}\n\t\t\t\t\t\t${parentUrl ? ` • <a href=\"https://news.ycombinator.com/${parentUrl}\" class=\"parent-link\">parent</a>` : ''}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"comment-content\">${commentText}</div>\n\t\t\t\t</div>\n\t\t\t`.trim();\n\t\t}\n\n\t\t// Otherwise handle regular post content\n\t\tconst titleRow = this.mainPost.querySelector('tr.athing');\n\t\tconst subRow = titleRow?.nextElementSibling;\n\t\tconst url = titleRow?.querySelector('.titleline a')?.getAttribute('href') || '';\n\n\t\tlet content = '';\n\t\tif (url) {\n\t\t\tcontent += `<p><a href=\"${url}\" target=\"_blank\">${url}</a></p>`;\n\t\t}\n\n\t\tconst text = this.mainPost.querySelector('.toptext');\n\t\tif (text) {\n\t\t\tcontent += `<div class=\"post-text\">${text.innerHTML}</div>`;\n\t\t}\n\n\t\treturn content;\n\t}\n\n\tprivate extractComments(): string {\n\t\tconst comments = Array.from(this.document.querySelectorAll('tr.comtr'));\n\t\treturn this.processComments(comments);\n\t}\n\n\tprivate processComments(comments: Element[]): string {\n\t\tlet html = '';\n\t\tconst processedIds = new Set<string>();\n\t\tlet currentDepth = -1;\n\t\tlet blockquoteStack: number[] = [];\n\n\t\tfor (const comment of comments) {\n\t\t\tconst id = comment.getAttribute('id');\n\t\t\tif (!id || processedIds.has(id)) continue;\n\t\t\tprocessedIds.add(id);\n\n\t\t\tconst indent = comment.querySelector('.ind img')?.getAttribute('width') || '0';\n\t\t\tconst depth = parseInt(indent) / 40;\n\t\t\tconst commentText = comment.querySelector('.commtext');\n\t\t\tconst author = comment.querySelector('.hnuser')?.textContent || '[deleted]';\n\t\t\tconst timeElement = comment.querySelector('.age');\n\t\t\tconst points = comment.querySelector('.score')?.textContent?.trim() || '';\n\t\t\t\n\t\t\tif (!commentText) continue;\n\n\t\t\t// Get the comment URL\n\t\t\tconst commentUrl = `https://news.ycombinator.com/item?id=${id}`;\n\t\t\t\n\t\t\t// Get the timestamp from the title attribute and extract the date portion\n\t\t\tconst timestamp = timeElement?.getAttribute('title') || '';\n\t\t\tconst date = timestamp.split('T')[0] || '';\n\t\t\t\n\t\t\t// For top-level comments, close all previous blockquotes and start fresh\n\t\t\tif (depth === 0) {\n\t\t\t\twhile (blockquoteStack.length > 0) {\n\t\t\t\t\thtml += '</blockquote>';\n\t\t\t\t\tblockquoteStack.pop();\n\t\t\t\t}\n\t\t\t\thtml += '<blockquote>';\n\t\t\t\tblockquoteStack = [0];\n\t\t\t\tcurrentDepth = 0;\n\t\t\t}\n\t\t\t// For nested comments\n\t\t\telse {\n\t\t\t\t// If we're moving back up the tree\n\t\t\t\tif (depth < currentDepth) {\n\t\t\t\t\twhile (blockquoteStack.length > 0 && blockquoteStack[blockquoteStack.length - 1] >= depth) {\n\t\t\t\t\t\thtml += '</blockquote>';\n\t\t\t\t\t\tblockquoteStack.pop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If we're going deeper\n\t\t\t\telse if (depth > currentDepth) {\n\t\t\t\t\thtml += '<blockquote>';\n\t\t\t\t\tblockquoteStack.push(depth);\n\t\t\t\t}\n\t\t\t\t// If we're at the same depth, no need to close or open blockquotes\n\t\t\t}\n\n\t\t\thtml += `<div class=\"comment\">\n\t<div class=\"comment-metadata\">\n\t\t<span class=\"comment-author\"><strong>${author}</strong></span> •\n\t\t<a href=\"${commentUrl}\" class=\"comment-link\">${date}</a>\n\t\t${points ? ` • <span class=\"comment-points\">${points}</span>` : ''}\n\t</div>\n\t<div class=\"comment-content\">${commentText.innerHTML}</div>\n</div>`;\n\n\t\t\tcurrentDepth = depth;\n\t\t}\n\n\t\t// Close any remaining blockquotes\n\t\twhile (blockquoteStack.length > 0) {\n\t\t\thtml += '</blockquote>';\n\t\t\tblockquoteStack.pop();\n\t\t}\n\n\t\treturn html;\n\t}\n\n\tprivate getPostId(): string {\n\t\tconst match = this.url.match(/id=(\\d+)/);\n\t\treturn match?.[1] || '';\n\t}\n\n\tprivate getPostTitle(): string {\n\t\tif (this.isCommentPage && this.mainComment) {\n\t\t\tconst author = this.mainComment.querySelector('.hnuser')?.textContent || '[deleted]';\n\t\t\tconst commentText = this.mainComment.querySelector('.commtext')?.textContent || '';\n\t\t\t// Use first 50 characters of comment as title\n\t\t\tconst preview = commentText.trim().slice(0, 50) + (commentText.length > 50 ? '...' : '');\n\t\t\treturn `Comment by ${author}: ${preview}`;\n\t\t}\n\t\treturn this.mainPost?.querySelector('.titleline')?.textContent?.trim() || '';\n\t}\n\n\tprivate getPostAuthor(): string {\n\t\treturn this.mainPost?.querySelector('.hnuser')?.textContent?.trim() || '';\n\t}\n\n\tprivate createDescription(): string {\n\t\tconst title = this.getPostTitle();\n\t\tconst author = this.getPostAuthor();\n\t\tif (this.isCommentPage) {\n\t\t\treturn `Comment by ${author} on Hacker News`;\n\t\t}\n\t\treturn `${title} - by ${author} on Hacker News`;\n\t}\n\n\tprivate getPostDate(): string {\n\t\tif (!this.mainPost) return '';\n\t\t\n\t\tconst timeElement = this.mainPost.querySelector('.age');\n\t\tconst timestamp = timeElement?.getAttribute('title') || '';\n\t\treturn timestamp.split('T')[0] || '';\n\t}\n} ","import { BaseExtractor } from './_base';\nimport { ExtractorResult } from '../types/extractors';\n\nexport class RedditExtractor extends BaseExtractor {\n\tprivate shredditPost: Element | null;\n\n\tconstructor(document: Document, url: string) {\n\t\tsuper(document, url);\n\t\tthis.shredditPost = document.querySelector('shreddit-post');\n\t}\n\n\tcanExtract(): boolean {\n\t\treturn !!this.shredditPost;\n\t}\n\n\textract(): ExtractorResult {\n\t\tconst postContent = this.getPostContent();\n\t\tconst comments = this.extractComments();\n\n\t\tconst contentHtml = this.createContentHtml(postContent, comments);\n\t\tconst postTitle = this.document.querySelector('h1')?.textContent?.trim() || '';\n\t\tconst subreddit = this.getSubreddit();\n\t\tconst postAuthor = this.getPostAuthor();\n\t\tconst description = this.createDescription(postContent);\n\n\t\treturn {\n\t\t\tcontent: contentHtml,\n\t\t\tcontentHtml: contentHtml,\n\t\t\textractedContent: {\n\t\t\t\tpostId: this.getPostId(),\n\t\t\t\tsubreddit,\n\t\t\t\t postAuthor,\n\t\t\t},\n\t\t\tvariables: {\n\t\t\t\ttitle: postTitle,\n\t\t\t\tauthor: postAuthor,\n\t\t\t\tsite: `r/${subreddit}`,\n\t\t\t\tdescription,\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate getPostContent(): string {\n\t\tconst textBody = this.shredditPost?.querySelector('[slot=\"text-body\"]')?.innerHTML || '';\n\t\tconst mediaBody = this.shredditPost?.querySelector('#post-image')?.outerHTML || '';\n\t\t\n\t\treturn textBody + mediaBody;\n\t}\n\n\tprivate createContentHtml(postContent: string, comments: string): string {\n\t\treturn `\n\t\t\t<div class=\"reddit-post\">\n\t\t\t\t<div class=\"post-content\">\n\t\t\t\t\t${postContent}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t${comments ? `\n\t\t\t\t<hr>\n\t\t\t\t<h2>Comments</h2>\n\t\t\t\t<div class=\"reddit-comments\">\n\t\t\t\t\t${comments}\n\t\t\t\t</div>\n\t\t\t` : ''}\n\t\t`.trim();\n\t}\n\n\tprivate extractComments(): string {\n\t\tconst comments = Array.from(this.document.querySelectorAll('shreddit-comment'));\n\t\treturn this.processComments(comments);\n\t}\n\n\tprivate getPostId(): string {\n\t\tconst match = this.url.match(/comments\\/([a-zA-Z0-9]+)/);\n\t\treturn match?.[1] || '';\n\t}\n\n\tprivate getSubreddit(): string {\n\t\tconst match = this.url.match(/\\/r\\/([^/]+)/);\n\t\treturn match?.[1] || '';\n\t}\n\n\tprivate getPostAuthor(): string {\n\t\treturn this.shredditPost?.getAttribute('author') || '';\n\t}\n\n\tprivate createDescription(postContent: string): string {\n\t\tif (!postContent) return '';\n\n\t\tconst tempDiv = document.createElement('div');\n\t\ttempDiv.innerHTML = postContent;\n\t\treturn tempDiv.textContent?.trim()\n\t\t\t.slice(0, 140)\n\t\t\t.replace(/\\s+/g, ' ') || '';\n\t}\n\n\tprivate processComments(comments: Element[]): string {\n\t\tlet html = '';\n\t\tlet currentDepth = -1;\n\t\tlet blockquoteStack: number[] = []; // Keep track of open blockquotes at each depth\n\n\t\tfor (const comment of comments) {\n\t\t\tconst depth = parseInt(comment.getAttribute('depth') || '0');\n\t\t\tconst author = comment.getAttribute('author') || '';\n\t\t\tconst score = comment.getAttribute('score') || '0';\n\t\t\tconst permalink = comment.getAttribute('permalink') || '';\n\t\t\tconst content = comment.querySelector('[slot=\"comment\"]')?.innerHTML || '';\n\t\t\t\n\t\t\t// Get timestamp from faceplate-timeago element\n\t\t\tconst timeElement = comment.querySelector('faceplate-timeago');\n\t\t\tconst timestamp = timeElement?.getAttribute('ts') || '';\n\t\t\tconst date = timestamp ? new Date(timestamp).toISOString().split('T')[0] : '';\n\t\t\t\n\t\t\t// For top-level comments, close all previous blockquotes and start fresh\n\t\t\tif (depth === 0) {\n\t\t\t\t// Close all open blockquotes\n\t\t\t\twhile (blockquoteStack.length > 0) {\n\t\t\t\t\thtml += '</blockquote>';\n\t\t\t\t\tblockquoteStack.pop();\n\t\t\t\t}\n\t\t\t\thtml += '<blockquote>';\n\t\t\t\tblockquoteStack = [0];\n\t\t\t\tcurrentDepth = 0;\n\t\t\t}\n\t\t\t// For nested comments\n\t\t\telse {\n\t\t\t\t// If we're moving back up the tree\n\t\t\t\tif (depth < currentDepth) {\n\t\t\t\t\t// Close blockquotes until we reach the current depth\n\t\t\t\t\twhile (blockquoteStack.length > 0 && blockquoteStack[blockquoteStack.length - 1] >= depth) {\n\t\t\t\t\t\thtml += '</blockquote>';\n\t\t\t\t\t\tblockquoteStack.pop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If we're going deeper\n\t\t\t\telse if (depth > currentDepth) {\n\t\t\t\t\thtml += '<blockquote>';\n\t\t\t\t\tblockquoteStack.push(depth);\n\t\t\t\t}\n\t\t\t\t// If we're at the same depth, no need to close or open blockquotes\n\t\t\t}\n\n\t\t\thtml += `<div class=\"comment\">\n\t<div class=\"comment-metadata\">\n\t\t<span class=\"comment-author\"><strong>${author}</strong></span> •\n\t\t<a href=\"https://reddit.com${permalink}\" class=\"comment-link\">${score} points</a> •\n\t\t<span class=\"comment-date\">${date}</span>\n\t</div>\n\t<div class=\"comment-content\">${content}</div>\n</div>`;\n\n\t\t\tcurrentDepth = depth;\n\t\t}\n\n\t\t// Close any remaining blockquotes\n\t\twhile (blockquoteStack.length > 0) {\n\t\t\thtml += '</blockquote>';\n\t\t\tblockquoteStack.pop();\n\t\t}\n\n\t\treturn html;\n\t}\n} ","import { BaseExtractor } from './_base';\nimport { ExtractorResult } from '../types/extractors';\n\nexport class TwitterExtractor extends BaseExtractor {\n\tprivate mainTweet: Element | null = null;\n\tprivate threadTweets: Element[] = [];\n\n\tconstructor(document: Document, url: string) {\n\t\tsuper(document, url);\n\t\t\n\t\t// Get all tweets from the timeline\n\t\tconst timeline = document.querySelector('[aria-label=\"Timeline: Conversation\"]');\n\t\tif (!timeline) {\n\t\t\t// Try to find a single tweet if not in timeline view\n\t\t\tconst singleTweet = document.querySelector('article[data-testid=\"tweet\"]');\n\t\t\tif (singleTweet) {\n\t\t\t\tthis.mainTweet = singleTweet;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Get all tweets before any section with \"Discover more\" or similar headings\n\t\tconst allTweets = Array.from(timeline.querySelectorAll('article[data-testid=\"tweet\"]'));\n\t\tconst firstSection = timeline.querySelector('section, h2')?.parentElement;\n\t\t\n\t\tif (firstSection) {\n\t\t\t// Filter out tweets that appear after the first section\n\t\t\tallTweets.forEach((tweet, index) => {\n\t\t\t\tif (firstSection.compareDocumentPosition(tweet) & Node.DOCUMENT_POSITION_FOLLOWING) {\n\t\t\t\t\tallTweets.splice(index);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Set main tweet and thread tweets\n\t\tthis.mainTweet = allTweets[0] || null;\n\t\tthis.threadTweets = allTweets.slice(1);\n\t}\n\n\tcanExtract(): boolean {\n\t\treturn !!this.mainTweet;\n\t}\n\n\textract(): ExtractorResult {\n\t\tconst mainContent = this.extractTweet(this.mainTweet);\n\t\tconst threadContent = this.threadTweets.map(tweet => this.extractTweet(tweet)).join('\\n<hr>\\n');\n\t\t\n\t\tconst contentHtml = `\n\t\t\t<div class=\"tweet-thread\">\n\t\t\t\t<div class=\"main-tweet\">\n\t\t\t\t\t${mainContent}\n\t\t\t\t</div>\n\t\t\t\t${threadContent ? `\n\t\t\t\t\t<hr>\n\t\t\t\t\t<div class=\"thread-tweets\">\n\t\t\t\t\t\t${threadContent}\n\t\t\t\t\t</div>\n\t\t\t\t` : ''}\n\t\t\t</div>\n\t\t`.trim();\n\n\t\tconst tweetId = this.getTweetId();\n\t\tconst tweetAuthor = this.getTweetAuthor();\n\t\tconst description = this.createDescription(this.mainTweet);\n\n\t\treturn {\n\t\t\tcontent: contentHtml,\n\t\t\tcontentHtml: contentHtml,\n\t\t\textractedContent: {\n\t\t\t\ttweetId,\n\t\t\t\ttweetAuthor,\n\t\t\t},\n\t\t\tvariables: {\n\t\t\t\ttitle: `Thread by ${tweetAuthor}`,\n\t\t\t\tauthor: tweetAuthor,\n\t\t\t\tsite: 'X (Twitter)',\n\t\t\t\tdescription,\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate formatTweetText(text: string): string {\n\t\tif (!text) return '';\n\n\t\t// Create a temporary div to parse and clean the HTML\n\t\tconst tempDiv = document.createElement('div');\n\t\ttempDiv.innerHTML = text;\n\n\t\t// Convert links to plain text with @ handles\n\t\ttempDiv.querySelectorAll('a').forEach(link => {\n\t\t\tconst handle = link.textContent?.trim() || '';\n\t\t\tlink.replaceWith(handle);\n\t\t});\n\n\t\t// Remove unnecessary spans and divs but keep their content\n\t\ttempDiv.querySelectorAll('span, div').forEach(element => {\n\t\t\telement.replaceWith(...Array.from(element.childNodes));\n\t\t});\n\n\t\t// Get cleaned text and split into paragraphs\n\t\tconst cleanText = tempDiv.innerHTML;\n\t\tconst paragraphs = cleanText.split('\\n')\n\t\t\t.map(line => line.trim())\n\t\t\t.filter(line => line);\n\n\t\t// Wrap each paragraph in <p> tags\n\t\treturn paragraphs.map(p => `<p>${p}</p>`).join('\\n');\n\t}\n\n\tprivate extractTweet(tweet: Element | null): string {\n\t\tif (!tweet) return '';\n\n\t\t// Clone the tweet element to modify it\n\t\tconst tweetClone = tweet.cloneNode(true) as Element;\n\t\t\n\t\t// Convert emoji images to text\n\t\ttweetClone.querySelectorAll('img[src*=\"/emoji/\"]').forEach(img => {\n\t\t\tif (img instanceof HTMLImageElement && img.alt) {\n\t\t\t\timg.replaceWith(img.alt);\n\t\t\t}\n\t\t});\n\n\t\tconst tweetText = tweetClone.querySelector('[data-testid=\"tweetText\"]')?.innerHTML || '';\n\t\tconst formattedText = this.formatTweetText(tweetText);\n\t\tconst images = this.extractImages(tweet);\n\t\t\n\t\t// Get author info and date\n\t\tconst userInfo = this.extractUserInfo(tweet);\n\t\t\n\t\t// Extract quoted tweet if present\n\t\tconst quotedTweet = tweet.querySelector('[aria-labelledby*=\"id__\"]')?.querySelector('[data-testid=\"User-Name\"]')?.closest('[aria-labelledby*=\"id__\"]');\n\t\tconst quotedContent = quotedTweet ? this.extractTweet(quotedTweet) : '';\n\n\t\treturn `\n\t\t\t<div class=\"tweet\">\n\t\t\t\t<div class=\"tweet-header\">\n\t\t\t\t\t<span class=\"tweet-author\"><strong>${userInfo.fullName}</strong> <span class=\"tweet-handle\">${userInfo.handle}</span></span>\n\t\t\t\t\t${userInfo.date ? `<a href=\"${userInfo.permalink}\" class=\"tweet-date\">${userInfo.date}</a>` : ''}\n\t\t\t\t</div>\n\t\t\t\t${formattedText ? `<div class=\"tweet-text\">${formattedText}</div>` : ''}\n\t\t\t\t${images.length ? `\n\t\t\t\t\t<div class=\"tweet-media\">\n\t\t\t\t\t\t${images.join('\\n')}\n\t\t\t\t\t</div>\n\t\t\t\t` : ''}\n\t\t\t\t${quotedContent ? `\n\t\t\t\t\t<blockquote class=\"quoted-tweet\">\n\t\t\t\t\t\t${quotedContent}\n\t\t\t\t\t</blockquote>\n\t\t\t\t` : ''}\n\t\t\t</div>\n\t\t`.trim();\n\t}\n\n\tprivate extractUserInfo(tweet: Element) {\n\t\tconst nameElement = tweet.querySelector('[data-testid=\"User-Name\"]');\n\t\tif (!nameElement) return { fullName: '', handle: '', date: '', permalink: '' };\n\n\t\t// Try to get name and handle from links first (main tweet structure)\n\t\tconst links = nameElement.querySelectorAll('a');\n\t\tlet fullName = links?.[0]?.textContent?.trim() || '';\n\t\tlet handle = links?.[1]?.textContent?.trim() || '';\n\n\t\t// If links don't have the info, try to get from spans (quoted tweet structure)\n\t\tif (!fullName || !handle) {\n\t\t\tfullName = nameElement.querySelector('span[style*=\"color: rgb(15, 20, 25)\"] span')?.textContent?.trim() || '';\n\t\t\thandle = nameElement.querySelector('span[style*=\"color: rgb(83, 100, 113)\"]')?.textContent?.trim() || '';\n\t\t}\n\n\t\tconst timestamp = tweet.querySelector('time');\n\t\tconst datetime = timestamp?.getAttribute('datetime') || '';\n\t\tconst date = datetime ? new Date(datetime).toISOString().split('T')[0] : '';\n\t\tconst permalink = timestamp?.closest('a')?.href || '';\n\n\t\treturn { fullName, handle, date, permalink };\n\t}\n\n\tprivate extractImages(tweet: Element): string[] {\n\t\t// Look for images in different containers\n\t\tconst imageContainers = [\n\t\t\t'[data-testid=\"tweetPhoto\"]',\n\t\t\t'[data-testid=\"tweet-image\"]',\n\t\t\t'img[src*=\"media\"]'\n\t\t];\n\n\t\tconst images: string[] = [];\n\t\t\n\t\t// Skip images that are inside quoted tweets\n\t\tconst quotedTweet = tweet.querySelector('[aria-labelledby*=\"id__\"]')?.querySelector('[data-testid=\"User-Name\"]')?.closest('[aria-labelledby*=\"id__\"]');\n\t\t\n\t\tfor (const selector of imageContainers) {\n\t\t\tconst elements = tweet.querySelectorAll(selector);\n\t\t\t\n\t\t\telements.forEach(img => {\n\t\t\t\t// Skip if the image is inside a quoted tweet\n\t\t\t\tif (quotedTweet?.contains(img)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check if element is an image by checking tag name and required properties\n\t\t\t\tif (img.tagName.toLowerCase() === 'img' && 'src' in img) {\n\t\t\t\t\tconst highQualitySrc = (img as Element).getAttribute('src')?.replace(/&name=\\w+$/, '&name=large') || '';\n\t\t\t\t\tconst cleanAlt = (img as Element).getAttribute('alt')?.replace(/\\s+/g, ' ').trim() || '';\n\t\t\t\t\timages.push(`<img src=\"${highQualitySrc}\" alt=\"${cleanAlt}\" />`);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn images;\n\t}\n\n\tprivate getTweetId(): string {\n\t\tconst match = this.url.match(/status\\/(\\d+)/);\n\t\treturn match?.[1] || '';\n\t}\n\n\tprivate getTweetAuthor(): string {\n\t\tconst nameElement = this.mainTweet?.querySelector('[data-testid=\"User-Name\"]');\n\t\tconst links = nameElement?.querySelectorAll('a');\n\t\tconst handle = links?.[1]?.textContent?.trim() || '';\n\t\treturn handle.startsWith('@') ? handle : `@${handle}`;\n\t}\n\n\tprivate createDescription(tweet: Element | null): string {\n\t\tif (!tweet) return '';\n\n\t\tconst tweetText = tweet.querySelector('[data-testid=\"tweetText\"]')?.textContent || '';\n\t\treturn tweetText.trim().slice(0, 140).replace(/\\s+/g, ' ');\n\t}\n} ","import { BaseExtractor } from './_base';\nimport { ExtractorResult } from '../types/extractors';\n\nexport class YoutubeExtractor extends BaseExtractor {\n\tprivate videoElement: HTMLVideoElement | null;\n\tprotected override schemaOrgData: any;\n\n\tconstructor(document: Document, url: string, schemaOrgData?: any) {\n\t\tsuper(document, url, schemaOrgData);\n\t\tthis.videoElement = document.querySelector('video');\n\t\tthis.schemaOrgData = schemaOrgData;\n\t}\n\n\tcanExtract(): boolean {\n\t\treturn true;\n\t}\n\n\textract(): ExtractorResult {\n\t\tconst videoData = this.getVideoData();\n\t\tconst description = videoData.description || '';\n\t\tconst formattedDescription = this.formatDescription(description);\n\t\tconst contentHtml = `<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/${this.getVideoId()}?si=_m0qv33lAuJFoGNh\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe><br>${formattedDescription}`;\n\n\t\treturn {\n\t\t\tcontent: contentHtml,\n\t\t\tcontentHtml: contentHtml,\n\t\t\textractedContent: {\n\t\t\t\tvideoId: this.getVideoId(),\n\t\t\t\tauthor: videoData.author || '',\n\t\t\t},\n\t\t\tvariables: {\n\t\t\t\ttitle: videoData.name || '',\n\t\t\t\tauthor: videoData.author || '',\n\t\t\t\tsite: 'YouTube',\n\t\t\t\timage: Array.isArray(videoData.thumbnailUrl) ? videoData.thumbnailUrl[0] || '' : '',\n\t\t\t\tpublished: videoData.uploadDate,\n\t\t\t\tdescription: description.slice(0, 200).trim(),\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate formatDescription(description: string): string {\n\t\treturn `<p>${description.replace(/\\n/g, '<br>')}</p>`;\n\t}\n\n\tprivate getVideoData(): any {\n\t\tif (!this.schemaOrgData) return {};\n\n\t\tconst videoData = Array.isArray(this.schemaOrgData)\n\t\t\t? this.schemaOrgData.find(item => item['@type'] === 'VideoObject')\n\t\t\t: this.schemaOrgData['@type'] === 'VideoObject' ? this.schemaOrgData : null;\n\n\t\treturn videoData || {};\n\t}\n\n\tprivate getVideoId(): string {\n\t\tconst urlParams = new URLSearchParams(new URL(this.url).search);\n\t\treturn urlParams.get('v') || '';\n\t}\n} ","import { DefuddleMetadata } from './types';\n\nexport class MetadataExtractor {\n\tstatic extract(doc: Document, schemaOrgData: any): DefuddleMetadata {\n\t\tlet domain = '';\n\t\tlet url = '';\n\n\t\ttry {\n\t\t\t// Try to get URL from document location\n\t\t\turl = doc.location?.href || '';\n\t\t\t\n\t\t\t// If no URL from location, try other sources\n\t\t\tif (!url) {\n\t\t\t\turl = this.getMetaContent(doc, \"property\", \"og:url\") ||\n\t\t\t\t\tthis.getMetaContent(doc, \"property\", \"twitter:url\") ||\n\t\t\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'url') ||\n\t\t\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'mainEntityOfPage.url') ||\n\t\t\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'mainEntity.url') ||\n\t\t\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'WebSite.url') ||\n\t\t\t\t\tdoc.querySelector('link[rel=\"canonical\"]')?.getAttribute('href') || '';\n\t\t\t}\n\n\t\t\tif (url) {\n\t\t\t\ttry {\n\t\t\t\t\tdomain = new URL(url).hostname.replace(/^www\\./, '');\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.warn('Failed to parse URL:', e);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// If URL parsing fails, try to get from base tag\n\t\t\tconst baseTag = doc.querySelector('base[href]');\n\t\t\tif (baseTag) {\n\t\t\t\ttry {\n\t\t\t\t\turl = baseTag.getAttribute('href') || '';\n\t\t\t\t\tdomain = new URL(url).hostname.replace(/^www\\./, '');\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.warn('Failed to parse base URL:', e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\ttitle: this.getTitle(doc, schemaOrgData),\n\t\t\tdescription: this.getDescription(doc, schemaOrgData),\n\t\t\tdomain,\n\t\t\tfavicon: this.getFavicon(doc, url),\n\t\t\timage: this.getImage(doc, schemaOrgData),\n\t\t\tpublished: this.getPublished(doc, schemaOrgData),\n\t\t\tauthor: this.getAuthor(doc, schemaOrgData),\n\t\t\tsite: this.getSite(doc, schemaOrgData),\n\t\t\tschemaOrgData,\n\t\t\twordCount: 0,\n\t\t\tparseTime: 0\n\t\t};\n\t}\n\n\tprivate static getAuthor(doc: Document, schemaOrgData: any): string {\n\t\treturn (\n\t\t\tthis.getMetaContent(doc, \"name\", \"sailthru.author\") ||\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'author.name') ||\n\t\t\tthis.getMetaContent(doc, \"property\", \"author\") ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"byl\") ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"author\") ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"authorList\") ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"copyright\") ||\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'copyrightHolder.name') ||\n\t\t\tthis.getMetaContent(doc, \"property\", \"og:site_name\") ||\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'publisher.name') ||\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'sourceOrganization.name') ||\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'isPartOf.name') ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"twitter:creator\") ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"application-name\") ||\n\t\t\t''\n\t\t);\n\t}\n\n\tprivate static getSite(doc: Document, schemaOrgData: any): string {\n\t\treturn (\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'publisher.name') ||\n\t\t\tthis.getMetaContent(doc, \"property\", \"og:site_name\") ||\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'WebSite.name') ||\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'sourceOrganization.name') ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"copyright\") ||\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'copyrightHolder.name') ||\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'isPartOf.name') ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"application-name\") ||\n\t\t\tthis.getAuthor(doc, schemaOrgData) ||\n\t\t\t''\n\t\t);\n\t}\n\n\tprivate static getTitle(doc: Document, schemaOrgData: any): string {\n\t\tconst rawTitle = (\n\t\t\tthis.getMetaContent(doc, \"property\", \"og:title\") ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"twitter:title\") ||\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'headline') ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"title\") ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"sailthru.title\") ||\n\t\t\tdoc.querySelector('title')?.textContent?.trim() ||\n\t\t\t''\n\t\t);\n\n\t\treturn this.cleanTitle(rawTitle, this.getSite(doc, schemaOrgData));\n\t}\n\n\tprivate static cleanTitle(title: string, siteName: string): string {\n\t\tif (!title || !siteName) return title;\n\n\t\t// Remove site name if it exists\n\t\tconst siteNameEscaped = siteName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\t\tconst patterns = [\n\t\t\t`\\\\s*[\\\\|\\\\-–—]\\\\s*${siteNameEscaped}\\\\s*$`, // Title | Site Name\n\t\t\t`^\\\\s*${siteNameEscaped}\\\\s*[\\\\|\\\\-–—]\\\\s*`, // Site Name | Title\n\t\t];\n\t\t\n\t\tfor (const pattern of patterns) {\n\t\t\tconst regex = new RegExp(pattern, 'i');\n\t\t\tif (regex.test(title)) {\n\t\t\t\ttitle = title.replace(regex, '');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn title.trim();\n\t}\n\n\tprivate static getDescription(doc: Document, schemaOrgData: any): string {\n\t\treturn (\n\t\t\tthis.getMetaContent(doc, \"name\", \"description\") ||\n\t\t\tthis.getMetaContent(doc, \"property\", \"description\") ||\n\t\t\tthis.getMetaContent(doc, \"property\", \"og:description\") ||\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'description') ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"twitter:description\") ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"sailthru.description\") ||\n\t\t\t''\n\t\t);\n\t}\n\n\tprivate static getImage(doc: Document, schemaOrgData: any): string {\n\t\treturn (\n\t\t\tthis.getMetaContent(doc, \"property\", \"og:image\") ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"twitter:image\") ||\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'image.url') ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"sailthru.image.full\") ||\n\t\t\t''\n\t\t);\n\t}\n\n\tprivate static getFavicon(doc: Document, baseUrl: string): string {\n\t\tconst iconFromMeta = this.getMetaContent(doc, \"property\", \"og:image:favicon\");\n\t\tif (iconFromMeta) return iconFromMeta;\n\n\t\tconst iconLink = doc.querySelector(\"link[rel='icon']\")?.getAttribute(\"href\");\n\t\tif (iconLink) return iconLink;\n\n\t\tconst shortcutLink = doc.querySelector(\"link[rel='shortcut icon']\")?.getAttribute(\"href\");\n\t\tif (shortcutLink) return shortcutLink;\n\n\t\t// Only try to construct favicon URL if we have a valid base URL\n\t\tif (baseUrl) {\n\t\t\ttry {\n\t\t\t\treturn new URL(\"/favicon.ico\", baseUrl).href;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.warn('Failed to construct favicon URL:', e);\n\t\t\t}\n\t\t}\n\n\t\treturn '';\n\t}\n\n\tprivate static getPublished(doc: Document, schemaOrgData: any): string {\n\t\treturn (\n\t\t\tthis.getSchemaProperty(doc, schemaOrgData, 'datePublished') ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"publishDate\") ||\n\t\t\tthis.getMetaContent(doc, \"property\", \"article:published_time\") ||\n\t\t\tthis.getTimeElement(doc) ||\n\t\t\tthis.getMetaContent(doc, \"name\", \"sailthru.date\") ||\n\t\t\t''\n\t\t);\n\t}\n\n\tprivate static getMetaContent(doc: Document, attr: string, value: string): string {\n\t\tconst selector = `meta[${attr}]`;\n\t\tconst element = Array.from(doc.querySelectorAll(selector))\n\t\t\t.find(el => el.getAttribute(attr)?.toLowerCase() === value.toLowerCase());\n\t\tconst content = element ? element.getAttribute(\"content\")?.trim() ?? \"\" : \"\";\n\t\treturn this.decodeHTMLEntities(content, doc);\n\t}\n\n\tprivate static getTimeElement(doc: Document): string {\n\t\tconst selector = `time`;\n\t\tconst element = Array.from(doc.querySelectorAll(selector))[0];\n\t\tconst content = element ? (element.getAttribute(\"datetime\")?.trim() ?? element.textContent?.trim() ?? \"\") : \"\";\n\t\treturn this.decodeHTMLEntities(content, doc);\n\t}\n\n\tprivate static decodeHTMLEntities(text: string, doc: Document): string {\n\t\tconst textarea = doc.createElement('textarea');\n\t\ttextarea.innerHTML = text;\n\t\treturn textarea.value;\n\t}\n\n\tprivate static getSchemaProperty(doc: Document, schemaOrgData: any, property: string, defaultValue: string = ''): string {\n\t\tif (!schemaOrgData) return defaultValue;\n\n\t\tconst searchSchema = (data: any, props: string[], fullPath: string, isExactMatch: boolean = true): string[] => {\n\t\t\tif (typeof data === 'string') {\n\t\t\t\treturn props.length === 0 ? [data] : [];\n\t\t\t}\n\t\t\t\n\t\t\tif (!data || typeof data !== 'object') {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tif (Array.isArray(data)) {\n\t\t\t\tconst currentProp = props[0];\n\t\t\t\tif (/^\\[\\d+\\]$/.test(currentProp)) {\n\t\t\t\t\tconst index = parseInt(currentProp.slice(1, -1));\n\t\t\t\t\tif (data[index]) {\n\t\t\t\t\t\treturn searchSchema(data[index], props.slice(1), fullPath, isExactMatch);\n\t\t\t\t\t}\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (props.length === 0 && data.every(item => typeof item === 'string' || typeof item === 'number')) {\n\t\t\t\t\treturn data.map(String);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn data.flatMap(item => searchSchema(item, props, fullPath, isExactMatch));\n\t\t\t}\n\n\t\t\tconst [currentProp, ...remainingProps] = props;\n\t\t\t\n\t\t\tif (!currentProp) {\n\t\t\t\tif (typeof data === 'string') return [data];\n\t\t\t\tif (typeof data === 'object' && data.name) {\n\t\t\t\t\treturn [data.name];\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tif (data.hasOwnProperty(currentProp)) {\n\t\t\t\treturn searchSchema(data[currentProp], remainingProps, \n\t\t\t\t\tfullPath ? `${fullPath}.${currentProp}` : currentProp, true);\n\t\t\t}\n\n\t\t\tif (!isExactMatch) {\n\t\t\t\tconst nestedResults: string[] = [];\n\t\t\t\tfor (const key in data) {\n\t\t\t\t\tif (typeof data[key] === 'object') {\n\t\t\t\t\t\tconst results = searchSchema(data[key], props, \n\t\t\t\t\t\t\tfullPath ? `${fullPath}.${key}` : key, false);\n\t\t\t\t\t\tnestedResults.push(...results);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (nestedResults.length > 0) {\n\t\t\t\t\treturn nestedResults;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn [];\n\t\t};\n\n\t\ttry {\n\t\t\tlet results = searchSchema(schemaOrgData, property.split('.'), '', true);\n\t\t\tif (results.length === 0) {\n\t\t\t\tresults = searchSchema(schemaOrgData, property.split('.'), '', false);\n\t\t\t}\n\t\t\tconst result = results.length > 0 ? results.filter(Boolean).join(', ') : defaultValue;\n\t\t\treturn this.decodeHTMLEntities(result, doc);\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error in getSchemaProperty for ${property}:`, error);\n\t\t\treturn defaultValue;\n\t\t}\n\t}\n\n\tstatic extractSchemaOrgData(doc: Document): any {\n\t\tconst schemaScripts = doc.querySelectorAll('script[type=\"application/ld+json\"]');\n\t\tconst schemaData: any[] = [];\n\n\t\tschemaScripts.forEach(script => {\n\t\t\tlet jsonContent = script.textContent || '';\n\t\t\t\n\t\t\ttry {\n\t\t\t\tjsonContent = jsonContent\n\t\t\t\t\t.replace(/\\/\\*[\\s\\S]*?\\*\\/|^\\s*\\/\\/.*$/gm, '')\n\t\t\t\t\t.replace(/^\\s*<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>\\s*$/, '$1')\n\t\t\t\t\t.replace(/^\\s*(\\*\\/|\\/\\*)\\s*|\\s*(\\*\\/|\\/\\*)\\s*$/g, '')\n\t\t\t\t\t.trim();\n\t\t\t\t\t\n\t\t\t\tconst jsonData = JSON.parse(jsonContent);\n\n\t\t\t\tif (jsonData['@graph'] && Array.isArray(jsonData['@graph'])) {\n\t\t\t\t\tschemaData.push(...jsonData['@graph']);\n\t\t\t\t} else {\n\t\t\t\t\tschemaData.push(jsonData);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Error parsing schema.org data:', error);\n\t\t\t\tconsole.error('Problematic JSON content:', jsonContent);\n\t\t\t}\n\t\t});\n\n\t\treturn schemaData;\n\t}\n}","import { FOOTNOTE_INLINE_REFERENCES } from './constants';\n\nexport interface ContentScore {\n\tscore: number;\n\telement: Element;\n}\n\nexport class ContentScorer {\n\tstatic scoreElement(element: Element): number {\n\t\tlet score = 0;\n\n\t\t// Text density\n\t\tconst text = element.textContent || '';\n\t\tconst words = text.split(/\\s+/).length;\n\t\tscore += words;\n\n\t\t// Paragraph ratio\n\t\tconst paragraphs = element.getElementsByTagName('p').length;\n\t\tscore += paragraphs * 10;\n\n\t\t// Link density (penalize high link density)\n\t\tconst links = element.getElementsByTagName('a').length;\n\t\tconst linkDensity = links / (words || 1);\n\t\tscore -= linkDensity * 5;\n\n\t\t// Image ratio (penalize high image density)\n\t\tconst images = element.getElementsByTagName('img').length;\n\t\tconst imageDensity = images / (words || 1);\n\t\tscore -= imageDensity * 3;\n\n\t\t// Position bonus (center/right elements)\n\t\ttry {\n\t\t\tconst style = element.getAttribute('style') || '';\n\t\t\tconst align = element.getAttribute('align') || '';\n\t\t\tconst isRightSide = style.includes('float: right') || \n\t\t\t\t\t\t\t style.includes('text-align: right') || \n\t\t\t\t\t\t\t align === 'right';\n\t\t\tif (isRightSide) score += 5;\n\t\t} catch (e) {\n\t\t\t// Ignore position if we can't get style\n\t\t}\n\n\t\t// Content indicators\n\t\tconst hasDate = /\\b(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\\s+\\d{1,2},?\\s+\\d{4}\\b/i.test(text);\n\t\tif (hasDate) score += 10;\n\n\t\tconst hasAuthor = /\\b(?:by|written by|author:)\\s+[A-Za-z\\s]+\\b/i.test(text);\n\t\tif (hasAuthor) score += 10;\n\n\t\t// Check for common content classes/attributes\n\t\tconst className = element.className.toLowerCase();\n\t\tif (className.includes('content') || className.includes('article') || className.includes('post')) {\n\t\t\tscore += 15;\n\t\t}\n\n\t\t// Check for footnotes/references\n\t\tconst hasFootnotes = element.querySelector(FOOTNOTE_INLINE_REFERENCES);\n\t\tif (hasFootnotes) score += 10;\n\n\t\t// Check for nested tables (penalize)\n\t\tconst nestedTables = element.getElementsByTagName('table').length;\n\t\tscore -= nestedTables * 5;\n\n\t\t// Additional scoring for table cells\n\t\tif (element.tagName.toLowerCase() === 'td') {\n\t\t\t// Table cells get a bonus for being in the main content area\n\t\t\tconst parentTable = element.closest('table');\n\t\t\tif (parentTable) {\n\t\t\t\t// Only favor cells in tables that look like old-style content layouts\n\t\t\t\tconst tableWidth = parseInt(parentTable.getAttribute('width') || '0');\n\t\t\t\tconst tableAlign = parentTable.getAttribute('align') || '';\n\t\t\t\tconst tableClass = parentTable.className.toLowerCase();\n\t\t\t\tconst isTableLayout = \n\t\t\t\t\ttableWidth > 400 || // Common width for main content tables\n\t\t\t\t\ttableAlign === 'center' ||\n\t\t\t\t\ttableClass.includes('content') ||\n\t\t\t\t\ttableClass.includes('article');\n\n\t\t\t\tif (isTableLayout) {\n\t\t\t\t\t// Additional checks to ensure this is likely the main content cell\n\t\t\t\t\tconst allCells = Array.from(parentTable.getElementsByTagName('td'));\n\t\t\t\t\tconst cellIndex = allCells.indexOf(element as HTMLTableCellElement);\n\t\t\t\t\tconst isCenterCell = cellIndex > 0 && cellIndex < allCells.length - 1;\n\t\t\t\t\t\n\t\t\t\t\tif (isCenterCell) {\n\t\t\t\t\t\tscore += 10;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn score;\n\t}\n\n\tstatic findBestElement(elements: Element[], minScore: number = 50): Element | null {\n\t\tlet bestElement: Element | null = null;\n\t\tlet bestScore = 0;\n\n\t\telements.forEach(element => {\n\t\t\tconst score = this.scoreElement(element);\n\t\t\tif (score > bestScore) {\n\t\t\t\tbestScore = score;\n\t\t\t\tbestElement = element;\n\t\t\t}\n\t\t});\n\n\t\treturn bestScore > minScore ? bestElement : null;\n\t}\n} ","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","import { Defuddle } from './defuddle';\nimport { DefuddleOptions, DefuddleResponse } from './types';\n\n// Export types\nexport type { DefuddleOptions, DefuddleResponse };\n\n// Export Defuddle as default\nexport default Defuddle;\n\n// This file exists to ensure proper type generation for the full bundle\n// The actual math module switching is handled by webpack's alias configuration "],"names":[],"sourceRoot":""}
|