better-rtplot 0.4.4__tar.gz → 0.4.6__tar.gz
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.
- {better_rtplot-0.4.4 → better_rtplot-0.4.6}/PKG-INFO +1 -1
- {better_rtplot-0.4.4 → better_rtplot-0.4.6}/pyproject.toml +2 -2
- {better_rtplot-0.4.4 → better_rtplot-0.4.6}/rtplot/client.py +18 -0
- {better_rtplot-0.4.4 → better_rtplot-0.4.6}/rtplot/interactive_test.py +1 -1
- {better_rtplot-0.4.4 → better_rtplot-0.4.6}/rtplot/server_browser.py +41 -2
- {better_rtplot-0.4.4 → better_rtplot-0.4.6}/rtplot/static/index.html +41 -1
- better_rtplot-0.4.6/rtplot/static/katex/auto-render.min.js +1 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- better_rtplot-0.4.6/rtplot/static/katex/katex.min.css +1 -0
- better_rtplot-0.4.6/rtplot/static/katex/katex.min.js +1 -0
- {better_rtplot-0.4.4 → better_rtplot-0.4.6}/LICENSE +0 -0
- {better_rtplot-0.4.4 → better_rtplot-0.4.6}/README.md +0 -0
- {better_rtplot-0.4.4 → better_rtplot-0.4.6}/rtplot/saved_plots/.gitignore +0 -0
- {better_rtplot-0.4.4 → better_rtplot-0.4.6}/rtplot/server.py +0 -0
- {better_rtplot-0.4.4 → better_rtplot-0.4.6}/rtplot/server_browser_gui.py +0 -0
- {better_rtplot-0.4.4 → better_rtplot-0.4.6}/rtplot/static/uPlot.iife.min.js +0 -0
- {better_rtplot-0.4.4 → better_rtplot-0.4.6}/rtplot/static/uPlot.min.css +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "better-rtplot"
|
|
3
|
-
version = "0.4.
|
|
3
|
+
version = "0.4.6"
|
|
4
4
|
description = ""
|
|
5
5
|
authors = ["jmontp <jmontp@umich.edu>"]
|
|
6
6
|
license = "GPL V3.0"
|
|
7
7
|
readme = "README.md"
|
|
8
8
|
packages = [{include = "rtplot"}]
|
|
9
|
-
include = ["rtplot/static/*"]
|
|
9
|
+
include = ["rtplot/static/*", "rtplot/static/katex/*", "rtplot/static/katex/fonts/*"]
|
|
10
10
|
|
|
11
11
|
[tool.poetry.dependencies]
|
|
12
12
|
python = ">= 3.9, < 3.13"
|
|
@@ -25,6 +25,13 @@ control_socket.setsockopt(zmq.RCVHWM, 1000)
|
|
|
25
25
|
_control_slider_values = {}
|
|
26
26
|
_control_button_events = []
|
|
27
27
|
|
|
28
|
+
# Cached payload of the most recent initialize_plots() call. The server
|
|
29
|
+
# uses this to recover from its own crashes: when its tab loses the
|
|
30
|
+
# config, it pushes a "resend_config" control event over the return
|
|
31
|
+
# channel, and poll_controls() re-PUBs this dict so the plot reattaches
|
|
32
|
+
# without the user restarting their script. None until first call.
|
|
33
|
+
plot_desc_dict = None
|
|
34
|
+
|
|
28
35
|
#Global variable to keep track of last connected address
|
|
29
36
|
# default is fixed publisher mode, therefore you don't connect
|
|
30
37
|
# to an address
|
|
@@ -506,6 +513,13 @@ def poll_controls():
|
|
|
506
513
|
(cleared after this call).
|
|
507
514
|
|
|
508
515
|
Call this from your tight loop before computing the next sample.
|
|
516
|
+
|
|
517
|
+
Also transparently handles ``resend_config`` requests from the server:
|
|
518
|
+
if the server crashed and reconnected (or the user clicked the
|
|
519
|
+
Reconnect button on a tab), it asks us to re-publish the cached
|
|
520
|
+
initialize_plots() payload so the plot rewires without the user
|
|
521
|
+
restarting their script. The request is consumed silently — the
|
|
522
|
+
returned ControlState only ever contains slider/button events.
|
|
509
523
|
"""
|
|
510
524
|
global _control_button_events
|
|
511
525
|
while True:
|
|
@@ -520,6 +534,10 @@ def poll_controls():
|
|
|
520
534
|
_control_button_events.append(event.get("id"))
|
|
521
535
|
elif evtype == "slider":
|
|
522
536
|
_control_slider_values[event.get("id")] = float(event.get("value", 0.0))
|
|
537
|
+
elif evtype == "resend_config":
|
|
538
|
+
if plot_desc_dict is not None:
|
|
539
|
+
socket.send_string(SENDING_PLOT_UPDATE)
|
|
540
|
+
socket.send_json(plot_desc_dict)
|
|
523
541
|
|
|
524
542
|
buttons = _control_button_events
|
|
525
543
|
_control_button_events = []
|
|
@@ -101,7 +101,7 @@ def step_slider_to(slider_id, label, target, tol=0.25):
|
|
|
101
101
|
def main():
|
|
102
102
|
# Outbound to the server — the rtplot browser server defaults to binding
|
|
103
103
|
# 5555, so in local-plot mode the client is the one that connects.
|
|
104
|
-
client.local_plot()
|
|
104
|
+
# client.local_plot()
|
|
105
105
|
|
|
106
106
|
plot_cfg = {
|
|
107
107
|
"names": ["live signal"],
|
|
@@ -921,6 +921,10 @@ async def create_connect_tab(
|
|
|
921
921
|
tabs[t.id] = t
|
|
922
922
|
_open_tab_sockets(t)
|
|
923
923
|
t.receiver_task = asyncio.create_task(zmq_receiver(t))
|
|
924
|
+
# If the client at the other end is already running and only called
|
|
925
|
+
# initialize_plots() once at its startup, this nudges it to resend
|
|
926
|
+
# the cached config so the new tab populates without a script restart.
|
|
927
|
+
asyncio.create_task(_request_config_resend(t))
|
|
924
928
|
if persist:
|
|
925
929
|
save_persisted_tabs()
|
|
926
930
|
await broadcast_tab_list()
|
|
@@ -956,13 +960,47 @@ async def rename_tab(tab_id: str, new_name: str):
|
|
|
956
960
|
await broadcast_tab(tab_id)
|
|
957
961
|
|
|
958
962
|
|
|
963
|
+
async def _request_config_resend(tab: "Tab"):
|
|
964
|
+
"""Nudge a still-running client to re-send its initialize_plots() payload.
|
|
965
|
+
|
|
966
|
+
The common scenario: the server crashed (or was restarted) mid-session
|
|
967
|
+
and lost the plot config it received the first time the client called
|
|
968
|
+
``initialize_plots()``. The client is still happily streaming data,
|
|
969
|
+
but the new server has nothing to plot it on. This sends a
|
|
970
|
+
``{"type": "resend_config"}`` control event over the tab's PUSH
|
|
971
|
+
socket; the client's poll_controls() loop intercepts it and re-sends
|
|
972
|
+
the cached config so the plot picks back up without the user having
|
|
973
|
+
to restart their script.
|
|
974
|
+
|
|
975
|
+
Retries on a brief schedule because the client's PULL socket may need
|
|
976
|
+
a moment to auto-reconnect to the freshly bound PUSH socket — a
|
|
977
|
+
one-shot DONTWAIT send to a peer-less PUSH gets silently dropped.
|
|
978
|
+
Stops early once we see ``tab.initialized`` flip to True (the client
|
|
979
|
+
has answered) so we don't spam.
|
|
980
|
+
"""
|
|
981
|
+
for i, delay in enumerate((0.4, 1.0, 2.0)):
|
|
982
|
+
await asyncio.sleep(delay)
|
|
983
|
+
if tab.ctrl_sock is None:
|
|
984
|
+
return
|
|
985
|
+
if i > 0 and tab.initialized:
|
|
986
|
+
return
|
|
987
|
+
try:
|
|
988
|
+
await tab.ctrl_sock.send_json(
|
|
989
|
+
{"type": "resend_config"}, flags=zmq.DONTWAIT
|
|
990
|
+
)
|
|
991
|
+
except (zmq.Again, zmq.ZMQError):
|
|
992
|
+
pass
|
|
993
|
+
|
|
994
|
+
|
|
959
995
|
async def reconnect_tab(tab_id: str):
|
|
960
996
|
"""Close and reopen ``tab_id``'s sockets, restart its receiver task.
|
|
961
997
|
|
|
962
998
|
The tab's buffer and plot config are preserved — if the sender on
|
|
963
999
|
the other side is still running the same stream we avoid a visible
|
|
964
|
-
flash to empty.
|
|
965
|
-
|
|
1000
|
+
flash to empty. After the sockets come back up we ask the (likely
|
|
1001
|
+
still-running) client to re-send its plot config so the connection
|
|
1002
|
+
recovers cleanly even if the server itself restarted in the
|
|
1003
|
+
meantime.
|
|
966
1004
|
"""
|
|
967
1005
|
t = tabs.get(tab_id)
|
|
968
1006
|
if t is None:
|
|
@@ -976,6 +1014,7 @@ async def reconnect_tab(tab_id: str):
|
|
|
976
1014
|
t.data_rate_hz = 0.0
|
|
977
1015
|
t._last_rx_ts = 0.0
|
|
978
1016
|
t.receiver_task = asyncio.create_task(zmq_receiver(t))
|
|
1017
|
+
asyncio.create_task(_request_config_resend(t))
|
|
979
1018
|
await broadcast_tab(tab_id)
|
|
980
1019
|
|
|
981
1020
|
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<title>rtplot</title>
|
|
6
6
|
<link rel="stylesheet" href="/static/uPlot.min.css" />
|
|
7
|
+
<link rel="stylesheet" href="/static/katex/katex.min.css" />
|
|
7
8
|
<style>
|
|
8
9
|
html, body { margin: 0; padding: 0; height: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #fafafa; color: #222; }
|
|
9
10
|
|
|
@@ -188,6 +189,8 @@
|
|
|
188
189
|
</div>
|
|
189
190
|
<div id="plots" class="row"></div>
|
|
190
191
|
<script src="/static/uPlot.iife.min.js"></script>
|
|
192
|
+
<script src="/static/katex/katex.min.js"></script>
|
|
193
|
+
<script src="/static/katex/auto-render.min.js"></script>
|
|
191
194
|
<script>
|
|
192
195
|
(function () {
|
|
193
196
|
const COLOR_MAP = {
|
|
@@ -207,6 +210,22 @@
|
|
|
207
210
|
return 'rgb(0,0,0)';
|
|
208
211
|
}
|
|
209
212
|
|
|
213
|
+
// ---- LaTeX rendering ($...$ inline, $$...$$ display) ----
|
|
214
|
+
// KaTeX's auto-render walks an element's text nodes looking for the
|
|
215
|
+
// configured delimiters, so plain labels without `$` are completely
|
|
216
|
+
// unaffected. Errors don't throw — they render as the raw source so
|
|
217
|
+
// a typo in someone's label can't blow up the whole page.
|
|
218
|
+
const _latexDelims = [
|
|
219
|
+
{ left: '$$', right: '$$', display: true },
|
|
220
|
+
{ left: '$', right: '$', display: false },
|
|
221
|
+
];
|
|
222
|
+
function renderLatexIn(el) {
|
|
223
|
+
if (!el || typeof renderMathInElement !== 'function') return;
|
|
224
|
+
try {
|
|
225
|
+
renderMathInElement(el, { delimiters: _latexDelims, throwOnError: false });
|
|
226
|
+
} catch (e) { /* swallow — keep the page alive */ }
|
|
227
|
+
}
|
|
228
|
+
|
|
210
229
|
const plotsDiv = document.getElementById('plots');
|
|
211
230
|
const statusDiv = document.getElementById('status');
|
|
212
231
|
const wsStatus = document.getElementById('ws-status');
|
|
@@ -661,7 +680,20 @@
|
|
|
661
680
|
if (!values) return;
|
|
662
681
|
for (const [id, val] of Object.entries(values)) {
|
|
663
682
|
const node = controlElements.displays[id];
|
|
664
|
-
if (node)
|
|
683
|
+
if (!node) continue;
|
|
684
|
+
const text = formatDisplay(id, val);
|
|
685
|
+
// Re-render the value as LaTeX whenever it contains a delimiter
|
|
686
|
+
// so streamed text fields can show live equations. Plain numeric
|
|
687
|
+
// displays stay on the cheap textContent path.
|
|
688
|
+
if (typeof text === 'string' && text.indexOf('$') !== -1) {
|
|
689
|
+
node.textContent = '';
|
|
690
|
+
const span = document.createElement('span');
|
|
691
|
+
span.textContent = text;
|
|
692
|
+
node.appendChild(span);
|
|
693
|
+
renderLatexIn(node);
|
|
694
|
+
} else {
|
|
695
|
+
node.textContent = text;
|
|
696
|
+
}
|
|
665
697
|
}
|
|
666
698
|
}
|
|
667
699
|
|
|
@@ -782,6 +814,10 @@
|
|
|
782
814
|
totalTraces = traceOffset;
|
|
783
815
|
applySliderValues(cfg.slider_values);
|
|
784
816
|
applyDisplayValues(cfg.display_values);
|
|
817
|
+
// Render LaTeX in everything we just built: uPlot's title,
|
|
818
|
+
// x/y axis labels, and legend (all rendered as HTML), plus the
|
|
819
|
+
// control rows that were appended above.
|
|
820
|
+
renderLatexIn(plotsDiv);
|
|
785
821
|
applyVisibleSamples();
|
|
786
822
|
scheduleRender();
|
|
787
823
|
}
|
|
@@ -1004,6 +1040,10 @@
|
|
|
1004
1040
|
add.title = 'Add a tab that connects to a remote device';
|
|
1005
1041
|
add.addEventListener('click', openCreateForm);
|
|
1006
1042
|
tabbar.appendChild(add);
|
|
1043
|
+
|
|
1044
|
+
// Render LaTeX inside tab names (endpoints stay literal — they're
|
|
1045
|
+
// network addresses, not math).
|
|
1046
|
+
tabbar.querySelectorAll('.tab-name').forEach(renderLatexIn);
|
|
1007
1047
|
}
|
|
1008
1048
|
|
|
1009
1049
|
function beginRename(tabEl, id, currentName) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={771:function(t){t.exports=e}},n={};function r(e){var o=n[e];if(void 0!==o)return o.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var o={};return function(){r.d(o,{default:function(){return d}});var e=r(771),t=r.n(e);const n=function(e,t,n){let r=n,o=0;const i=e.length;for(;r<t.length;){const n=t[r];if(o<=0&&t.slice(r,r+i)===e)return r;"\\"===n?r++:"{"===n?o++:"}"===n&&o--,r++}return-1},i=/^\\begin{/;var a=function(e,t){let r;const o=[],a=new RegExp("("+t.map((e=>e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))).join("|")+")");for(;r=e.search(a),-1!==r;){r>0&&(o.push({type:"text",data:e.slice(0,r)}),e=e.slice(r));const a=t.findIndex((t=>e.startsWith(t.left)));if(r=n(t[a].right,e,t[a].left.length),-1===r)break;const l=e.slice(0,r+t[a].right.length),s=i.test(l)?l:e.slice(t[a].left.length,r);o.push({type:"math",data:s,rawData:l,display:t[a].display}),e=e.slice(r+t[a].right.length)}return""!==e&&o.push({type:"text",data:e}),o};const l=function(e,n){const r=a(e,n.delimiters);if(1===r.length&&"text"===r[0].type)return null;const o=document.createDocumentFragment();for(let e=0;e<r.length;e++)if("text"===r[e].type)o.appendChild(document.createTextNode(r[e].data));else{const i=document.createElement("span");let a=r[e].data;n.displayMode=r[e].display;try{n.preProcess&&(a=n.preProcess(a)),t().render(a,i,n)}catch(i){if(!(i instanceof t().ParseError))throw i;n.errorCallback("KaTeX auto-render: Failed to parse `"+r[e].data+"` with ",i),o.appendChild(document.createTextNode(r[e].rawData));continue}o.appendChild(i)}return o},s=function(e,t){for(let n=0;n<e.childNodes.length;n++){const r=e.childNodes[n];if(3===r.nodeType){let o=r.textContent,i=r.nextSibling,a=0;for(;i&&i.nodeType===Node.TEXT_NODE;)o+=i.textContent,i=i.nextSibling,a++;const s=l(o,t);if(s){for(let e=0;e<a;e++)r.nextSibling.remove();n+=s.childNodes.length-1,e.replaceChild(s,r)}else n+=a}else if(1===r.nodeType){const e=" "+r.className+" ";-1===t.ignoredTags.indexOf(r.nodeName.toLowerCase())&&t.ignoredClasses.every((t=>-1===e.indexOf(" "+t+" ")))&&s(r,t)}}};var d=function(e,t){if(!e)throw new Error("No element provided to render");const n={};for(const e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);n.delimiters=n.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],n.ignoredTags=n.ignoredTags||["script","noscript","style","textarea","pre","code","option"],n.ignoredClasses=n.ignoredClasses||[],n.errorCallback=n.errorCallback||console.error,n.macros=n.macros||{},s(e,n)}}(),o=o.default}()}));
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype")}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.11"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}
|