@seedtactics/insight-client 16.8.4-beta.0 → 16.8.4-beta.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/assets/index-BLYS5tHD.js +388 -0
- package/dist/assets/index-DXfAwuj-.css +1 -0
- package/dist/assets/roboto-cyrillic-300-normal-D0x1uCa7.woff +0 -0
- package/dist/assets/roboto-cyrillic-400-normal-BepgbcUK.woff +0 -0
- package/dist/assets/roboto-cyrillic-500-normal-C8ZOEKN4.woff +0 -0
- package/dist/assets/roboto-cyrillic-700-normal-D8g9KsRf.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-300-normal-C0UYUNTV.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-400-normal-DhDk0Xwi.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-500-normal-SCgicl0l.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-700-normal-BWOtdzfy.woff +0 -0
- package/dist/assets/roboto-greek-300-normal-xS8CB6LN.woff +0 -0
- package/dist/assets/roboto-greek-400-normal-D904r64h.woff +0 -0
- package/dist/assets/roboto-greek-500-normal-XBIQOowA.woff +0 -0
- package/dist/assets/roboto-greek-700-normal-xQsEWSIA.woff +0 -0
- package/dist/assets/roboto-latin-300-normal-Dqn3NW0Y.woff +0 -0
- package/dist/assets/roboto-latin-400-normal-D27F5sTu.woff +0 -0
- package/dist/assets/roboto-latin-500-normal-fsTFPL3E.woff +0 -0
- package/dist/assets/roboto-latin-700-normal-YuyVweIx.woff +0 -0
- package/dist/assets/roboto-latin-ext-300-normal-B0-sTZUp.woff +0 -0
- package/dist/assets/roboto-latin-ext-400-normal-CIveymTr.woff +0 -0
- package/dist/assets/roboto-latin-ext-500-normal-C1cK9xmS.woff +0 -0
- package/dist/assets/roboto-latin-ext-700-normal-BDePAh3g.woff +0 -0
- package/dist/assets/roboto-math-300-normal-CkwMvXpj.woff +0 -0
- package/dist/assets/roboto-math-400-normal-D6sS4O5l.woff +0 -0
- package/dist/assets/roboto-math-500-normal-BNGXE_xU.woff +0 -0
- package/dist/assets/roboto-math-700-normal-DbhUef31.woff +0 -0
- package/dist/assets/roboto-symbols-300-normal-CBIeSvs3.woff +0 -0
- package/dist/assets/roboto-symbols-400-normal-C7tGlxgb.woff +0 -0
- package/dist/assets/roboto-symbols-500-normal-DFnofPUt.woff +0 -0
- package/dist/assets/roboto-symbols-700-normal-C59U6HqI.woff +0 -0
- package/dist/assets/roboto-vietnamese-300-normal-CYjuQheQ.woff +0 -0
- package/dist/assets/roboto-vietnamese-400-normal-Bf76hAzZ.woff +0 -0
- package/dist/assets/roboto-vietnamese-500-normal-BgoYVz-9.woff +0 -0
- package/dist/assets/roboto-vietnamese-700-normal-kpkdMgbf.woff +0 -0
- package/dist/bootstrap.d.ts +5 -0
- package/dist/bootstrap.js +56 -0
- package/dist/cell-status/custom-state.d.ts +9 -0
- package/dist/cell-status/custom-state.js +42 -0
- package/dist/cell-status/loading.js +5 -0
- package/dist/components/App.d.ts +2 -0
- package/dist/components/App.js +1 -1
- package/dist/components/operations/Programs.js +1 -1
- package/dist/components/station-monitor/BasketLoadStationWork.d.ts +15 -0
- package/dist/components/station-monitor/BasketLoadStationWork.js +147 -0
- package/dist/components/station-monitor/LoadStation.d.ts +2 -0
- package/dist/components/station-monitor/LoadStation.js +26 -17
- package/dist/components/station-monitor/Material.js +21 -4
- package/dist/components/station-monitor/MoveMaterialArrows.js +1 -1
- package/dist/components/station-monitor/QuarantineButton.js +5 -2
- package/dist/components/station-monitor/QueuesAddMaterial.js +2 -1
- package/dist/components/station-monitor/SystemOverview.js +8 -4
- package/dist/data/all-material-bins.js +10 -0
- package/dist/data/current-cycles.js +22 -20
- package/dist/data/move-arrows.d.ts +1 -0
- package/dist/data/move-arrows.js +18 -2
- package/dist/data/queue-material.js +2 -0
- package/dist/index.html +2 -2
- package/dist/index.js +7 -15
- package/dist/network/api.d.ts +10 -1
- package/dist/network/api.js +9 -0
- package/dist/network/backend.d.ts +2 -0
- package/dist/network/backend.js +14 -9
- package/package.json +8 -7
- package/dist/assets/index-4ivKxo2f.js +0 -388
- package/dist/assets/index-CbqW4-gR.css +0 -1
- package/dist/assets/roboto-cyrillic-300-normal-DEFNdjk5.woff +0 -0
- package/dist/assets/roboto-cyrillic-400-normal-Bjg-1-sg.woff +0 -0
- package/dist/assets/roboto-cyrillic-500-normal-CBKMylY4.woff +0 -0
- package/dist/assets/roboto-cyrillic-700-normal-DhZFXDSN.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-300-normal-D7ank4TF.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-400-normal-CaK1767H.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-500-normal-DqF2hftb.woff +0 -0
- package/dist/assets/roboto-cyrillic-ext-700-normal-CI7FH63F.woff +0 -0
- package/dist/assets/roboto-greek-300-normal-C_Dgaih9.woff +0 -0
- package/dist/assets/roboto-greek-400-normal-Bb5mj_fZ.woff +0 -0
- package/dist/assets/roboto-greek-500-normal-oCqhoyfc.woff +0 -0
- package/dist/assets/roboto-greek-700-normal-DjRqqLBV.woff +0 -0
- package/dist/assets/roboto-latin-300-normal-BARJ-h6h.woff +0 -0
- package/dist/assets/roboto-latin-400-normal-DyYNIH4P.woff +0 -0
- package/dist/assets/roboto-latin-500-normal-DQZyH_nt.woff +0 -0
- package/dist/assets/roboto-latin-700-normal-DLgJJpmK.woff +0 -0
- package/dist/assets/roboto-latin-ext-300-normal-CTCCHkZF.woff +0 -0
- package/dist/assets/roboto-latin-ext-400-normal-scX0fKtV.woff +0 -0
- package/dist/assets/roboto-latin-ext-500-normal-Cyc0AKLz.woff +0 -0
- package/dist/assets/roboto-latin-ext-700-normal-BUhwtWwy.woff +0 -0
- package/dist/assets/roboto-math-300-normal-Ds0YpBw2.woff +0 -0
- package/dist/assets/roboto-math-400-normal-C9RxBKAh.woff +0 -0
- package/dist/assets/roboto-math-500-normal-C-7mKPO3.woff +0 -0
- package/dist/assets/roboto-math-700-normal-DVoD5t2k.woff +0 -0
- package/dist/assets/roboto-symbols-300-normal-BCnjhQd_.woff +0 -0
- package/dist/assets/roboto-symbols-400-normal-DLYbZahX.woff +0 -0
- package/dist/assets/roboto-symbols-500-normal-F7c8nfcH.woff +0 -0
- package/dist/assets/roboto-symbols-700-normal-BoS6HWkc.woff +0 -0
- package/dist/assets/roboto-vietnamese-300-normal-INUupD3o.woff +0 -0
- package/dist/assets/roboto-vietnamese-400-normal-DnpnVwnf.woff +0 -0
- package/dist/assets/roboto-vietnamese-500-normal-D380IkQ8.woff +0 -0
- package/dist/assets/roboto-vietnamese-700-normal-DsFyXAL4.woff +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pre code.hljs{padding:1em;display:block;overflow-x:auto}code.hljs{padding:3px 5px}.hljs{color:#444;background:#f3f3f3}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:700}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#800}.hljs-title,.hljs-section{color:#800;font-weight:700}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:url(/assets/roboto-cyrillic-ext-300-normal-DIxttMbC.woff2)format("woff2"),url(/assets/roboto-cyrillic-ext-300-normal-C0UYUNTV.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:url(/assets/roboto-cyrillic-300-normal-DzUz0kzv.woff2)format("woff2"),url(/assets/roboto-cyrillic-300-normal-D0x1uCa7.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:url(data:font/woff2;base64,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)format("woff2"),url(data:font/woff;base64,d09GRgABAAAAAAWoAA8AAAAABuQAAQABAAAAAAAAAAAAAAAAAAAAAAAAAABHREVGAAABWAAAABQAAAAUAA8ACUdQT1MAAAFsAAAAHgAAAB5EdEx1R1NVQgAAAYwAAAAzAAAANJMNggJPUy8yAAABwAAAAE0AAABgc6bgx1NUQVQAAAIQAAAARQAAAFpfmEARY21hcAAAAlgAAABAAAAAXj5j4n9nYXNwAAACmAAAAAwAAAAMAAgAGWdseWYAAAKkAAABJwAAAS7SLFJAaGVhZAAAA8wAAAA2AAAANgzosE5oaGVhAAAEBAAAAB8AAAAkCqkNkmhtdHgAAAQkAAAAHwAAACQXOQALbG9jYQAABEQAAAATAAAAFAFRAaltYXhwAAAEWAAAABwAAAAgACkBIW5hbWUAAAR0AAABHQAAAlQzIV4ocG9zdAAABZQAAAATAAAAIP9tAGQAAQAAAAwAAAAAAAAAAQAIAAEAAQABAAAACgAcABwAAURGTFQACAAEAAAAAP//AAAAAAAAeNpjYGRgYOBiMAJCFhc3nxAGueTKohwGqfSi1GwGqZzEkjwGKQYQYAER//+DSADdjQkeAHjaY2BhKWXUYWBlYGCdxWrMwMAoD6GZLzKkMTEwMAAxFDgABRmQgLu/vztIUN6XjeEfA0Ma+ywmBgUGxvkgORYr1g1ASoGBGQC5wwm6AAAAeNoFwTECAUEABLDMLmihVgGovAgAdOD7l4joqRip2Cj/0+eWKf/r7ZOF3D/7V7aKjoGxoGTuhAhZZ4OqKFmA0ACO+QdEAAAAeNpjYGBgAmJmIBYBkoxgmoXBC0jzMXAA5djAKngZFBgWyPv+/w/kofBBOv5/+//kf/qD3WDdPAwIwAQA0KYN+QABAAIACAAI//8AD3jaHQ+zYi1B9MzsneS9WJtUsc1toia2baOKbXWxbZTbxzb2O2Jz5wbHBhDIBGDMCA8MyMB/UABlAKSqr0oQMv7P6P/HjJnoijvoLVIVl5AifUQWlGJGFBFGiPAfoYSPFGvEGgVcgStET3GG/DBOBsBQJ72SXJMdYMESALEaStjQwAZznJM7dnTQwQznZPMTUcIsq6HzE3HHkuvQPqGxXhgMDxsQ6huFgdBql+KFvNy5Yjf3krnc/LkiF8ZkdPiNT07m34ZHh19/jVd6Mt541hMc3HPWON508Wtc/G5PlVThDCIA+fuIU3dkGWPOkdXQ1JI1MUHJbfXrdKXQxs4+IELSpojcWXp0lRLnmW5qb9QqldJD6RVxJBdgAsQbQBZkaB7AN67mYkIAAAEAAAADA9fYf2NwXw889QAbCAAAAAAAxPARLgAAAADljVAD+h/91QkbCHMAAAAJAAIAAAAAAAB42mNgZGBgz/nHw8DAafFL/p8rpzQHAxrgBABswQRRAHjaY+5hSGGAAsbPEMyazVDHtJ0hAcze+O8kAGyLCFQAeNpjYGDQhcMchm4gnA4AE2QC+wB42mNgZGBg4GRYySDKUMbADuYhADMDIwAd5AFLeNp1kLVVBUAQRS/uZEiGu7sluLumyHd3aYBCiIkohwoog3eWweGs3X07sjNAAw+UUVJeI34qwbiEVl6MS2nk2biMUR6Ny7/YVNDLvXGl9JhxI7PMv3FJD7WMGvdRT6dxv7jZeEg29caTItghww0Rgtyxr91PQMoV3g8+JE6KqLO6kuohI10vGgnSLDKmERd7ieETxchYRCmktY+6GH5Odd5qZbRGvuS7lE1KlkHn3c6UPMaZYIYl3SbFk8x+U7c40tgS/RNTuleUJcINqW9W7V+s1tzPi7IwxfJNaLRzLsWr87v3sazjhPRy5+xXyLqexKWnde//1R0/QWeRVZRR7mQZdWpcw08E70ff0tJT3yq6cxWkNYLigVfQmleEAAAAeNpjYGYAg/9ZDCkMWAAAKh8B0QA=)format("woff");unicode-range:U+1F??}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:url(/assets/roboto-greek-300-normal-DJEM9B4Z.woff2)format("woff2"),url(/assets/roboto-greek-300-normal-xS8CB6LN.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:url(/assets/roboto-math-300-normal-5dF_7mZP.woff2)format("woff2"),url(/assets/roboto-math-300-normal-CkwMvXpj.woff)format("woff");unicode-range:U+302-303,U+305,U+307-308,U+310,U+312,U+315,U+31A,U+326-327,U+32C,U+32F-330,U+332-333,U+338,U+33A,U+346,U+34D,U+391-3A1,U+3A3-3A9,U+3B1-3C9,U+3D1,U+3D5-3D6,U+3F0-3F1,U+3F4-3F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE??}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:url(/assets/roboto-symbols-300-normal-DDU7avhj.woff2)format("woff2"),url(/assets/roboto-symbols-300-normal-CBIeSvs3.woff)format("woff");unicode-range:U+1-C,U+E-1F,U+7F-9F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+28??,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B??,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F0??,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F7??,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB??}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:url(/assets/roboto-vietnamese-300-normal-BPvXm_f1.woff2)format("woff2"),url(/assets/roboto-vietnamese-300-normal-CYjuQheQ.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:url(/assets/roboto-latin-ext-300-normal-B90pq-BC.woff2)format("woff2"),url(/assets/roboto-latin-ext-300-normal-B0-sTZUp.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:url(/assets/roboto-latin-300-normal-CCzlftfr.woff2)format("woff2"),url(/assets/roboto-latin-300-normal-Dqn3NW0Y.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/roboto-cyrillic-ext-400-normal-qHufge6k.woff2)format("woff2"),url(/assets/roboto-cyrillic-ext-400-normal-DhDk0Xwi.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/roboto-cyrillic-400-normal-CBPI_iaY.woff2)format("woff2"),url(/assets/roboto-cyrillic-400-normal-BepgbcUK.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:url(data:font/woff2;base64,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)format("woff2"),url(data:font/woff;base64,d09GRgABAAAAAAXAAA8AAAAABwAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAABHREVGAAABWAAAABQAAAAUAA8ACUdQT1MAAAFsAAAAHgAAAB5EdEx1R1NVQgAAAYwAAAAzAAAANJMNggJPUy8yAAABwAAAAE0AAABgdArg2VNUQVQAAAIQAAAASwAAAF5fnUM1Y21hcAAAAlwAAABAAAAAXj5j4n9nYXNwAAACnAAAAAwAAAAMAAgAGWdseWYAAAKoAAABNgAAATZnhEGkaGVhZAAAA+AAAAA2AAAANgz5sE5oaGVhAAAEGAAAAB8AAAAkCroNqWhtdHgAAAQ4AAAAHwAAACQX6f/DbG9jYQAABFgAAAATAAAAFAFZAbFtYXhwAAAEbAAAABwAAAAgACkBIW5hbWUAAASIAAABIgAAAmI2jl6RcG9zdAAABawAAAATAAAAIP9tAGQAAQAAAAwAAAAAAAAAAQAIAAEAAQABAAAACgAcABwAAURGTFQACAAEAAAAAP//AAAAAAAAeNpjYGRgYOBiMAJCFhc3nxAGueTKohwGqfSi1GwGqZzEkjwGKQYQYAER//+DSADdjQkeAHjaY2BhaWecwMDKwMA6i9WYgYFRHkIzX2RIY2JgYABiKHAACjIgAXd/f3eQoLwvG8M/BoY09llMDAoMjPNBcixWrBuAlAIDMwDj2QowAAAAeNoNx7EBAUAQALDcPWhhAQCoTAQAOrCGgQxHugihoaCjYCHfu8cphryPp0dMxPmxvsVSqmnpCWSM7VCEjEV8yC+K/H8Cgh/DnghvAHjaY2BgYAJiZiAWAZKMYJqFwQtI8zFwAOXYwCp4GRQYFsj7/v8P5KHwQTr+f/v/5H/6g91g3TwMCMAEANCmDfkAAQACAAgACP//AA8ABQBkAAADKAWwAAMABgAJAAwADwAAAREhEQUBASUJAyEJAgMo/TwCjv7vARH9qAEN/vMBKv7+AgP9/QECAQEFsPpQBbBU/Xz9fAwCeAJ4/UT9ogVE/aICXgAAAgB3/+wFCgXEABUAKwAAARUUAgYGIyImJgI1NTQSNjYzMhYWEgM1NC4CIyIOAhUVFB4CMzI+AgUKUprXhYHXnVZVnNeBhdebU781ZpNdWpFnODhpkVpekmU0AwZcpP78tmBgtgEEpFykAQO3YGC3/v3/AF6CyIhGRojIgl6DyYlGRonJAAACAHAEcQLJBdcABQAPAAABNRMzFQMlNTMVFBYXByYmAZJ0w9/+hqcqKklWXASEEQFCFf7C/lVPSGgtOi2P///+eP/sBVAF1gAmAAVGAAAHAAb+CP//AAAAAQAAAAMD16RtfYpfDzz1ABsIAAAAAADE8BEuAAAAAOWNUAP6Gv3VCTEIcwAAAAkAAgAAAAAAAHjaY2BkYGDP+cfDwMDp9UvqnxenIQcDGuAEAHAbBHkAeNpj7mFIYYACxj8QzNrIUM6syFAAZh//VwEAaU4HvgB42mNgYNCFwwKGfiCcDQATpAMLAHjaY2BkYGDgZFjJIMpQxsAO5iEAMwMjAB3kAUt42izGNQHDAABFwRfmrMWtzFxFFVIrRQGREE3Zg/+mAxLeWBh2AGRGqhvEhqmbpBS6xZlctxnz1x3mPHWXMQ895c6+uzEjZKoviOnry/qxvq36IIusCIIgCgY36R3uDhvcXbfj7j63J4Bxe+WRv9L6sea2pHBLjTA50kT5Ju6ZJCV7okiFPNr4lsaoybU4SlQ5Yt1R9B6nQMJbgVrHj0RFnDVphSRvnhFXzbXqKy6rqw1r/fJVUZ1GDwRs+2uDTXY59rXlfYu9IQ/BsIehH9c8O669zYg5/BpSnrtKtKWdPnRy2HQEfEjinsPZvFDxzGiJop5T6p4pmXX5XhjrWlLvKqjrZY2oyjxSio4kOeK9flbllaFKotrDcjvmffEHVntaWwAAeNpjYGYAg/9ZDCkMWAAAKh8B0QA=)format("woff");unicode-range:U+1F??}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/roboto-greek-400-normal-ai2Z1K3C.woff2)format("woff2"),url(/assets/roboto-greek-400-normal-D904r64h.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/roboto-math-400-normal-BEFej5gc.woff2)format("woff2"),url(/assets/roboto-math-400-normal-D6sS4O5l.woff)format("woff");unicode-range:U+302-303,U+305,U+307-308,U+310,U+312,U+315,U+31A,U+326-327,U+32C,U+32F-330,U+332-333,U+338,U+33A,U+346,U+34D,U+391-3A1,U+3A3-3A9,U+3B1-3C9,U+3D1,U+3D5-3D6,U+3F0-3F1,U+3F4-3F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE??}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/roboto-symbols-400-normal-CB1Ce4Gk.woff2)format("woff2"),url(/assets/roboto-symbols-400-normal-C7tGlxgb.woff)format("woff");unicode-range:U+1-C,U+E-1F,U+7F-9F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+28??,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B??,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F0??,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F7??,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB??}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/roboto-vietnamese-400-normal-D2PTxGxD.woff2)format("woff2"),url(/assets/roboto-vietnamese-400-normal-Bf76hAzZ.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/roboto-latin-ext-400-normal-C3tdtHj3.woff2)format("woff2"),url(/assets/roboto-latin-ext-400-normal-CIveymTr.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/roboto-latin-400-normal-BqEyEoaF.woff2)format("woff2"),url(/assets/roboto-latin-400-normal-D27F5sTu.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/roboto-cyrillic-ext-500-normal-BWC_xYeb.woff2)format("woff2"),url(/assets/roboto-cyrillic-ext-500-normal-SCgicl0l.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/roboto-cyrillic-500-normal-CLao9AfR.woff2)format("woff2"),url(/assets/roboto-cyrillic-500-normal-C8ZOEKN4.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:url(data:font/woff2;base64,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)format("woff2"),url(data:font/woff;base64,d09GRgABAAAAAAW0AA8AAAAABvAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAABHREVGAAABWAAAABQAAAAUAA8ACUdQT1MAAAFsAAAAHgAAAB5EdEx1R1NVQgAAAYwAAAAzAAAANJMNggJPUy8yAAABwAAAAE0AAABgdG7g5lNUQVQAAAIQAAAASAAAAFpfmkDZY21hcAAAAlgAAABAAAAAXj5j4n9nYXNwAAACmAAAAAwAAAAMAAgAGWdseWYAAAKkAAABNAAAATRvqliEaGVhZAAAA9gAAAA2AAAANg01sE5oaGVhAAAEEAAAAB8AAAAkCvYNwWhtdHgAAAQwAAAAHwAAACQX6v+ZbG9jYQAABFAAAAATAAAAFAFXAa9tYXhwAAAEZAAAABwAAAAgACkBIW5hbWUAAASAAAABIAAAAlw0y15acG9zdAAABaAAAAATAAAAIP9tAGQAAQAAAAwAAAAAAAAAAQAIAAEAAQABAAAACgAcABwAAURGTFQACAAEAAAAAP//AAAAAAAAeNpjYGRgYOBiMAJCFhc3nxAGueTKohwGqfSi1GwGqZzEkjwGKQYQYAER//+DSADdjQkeAHjaY2BhmcL4hYGVgYF1FqsxAwOjPIRmvsiQxsTAwADEUOAAFGRAAu7+/u4gQXlfNoZ/DAxp7LOYGBQYGOeD5FisWDcAKQUGZgAMLQqhAAAAeNoFwbWBAlEABcB5f8/SA2Ii3KEi3DOscQpgRsSfCg0VRsprez+mzetwvKcnp/vqmoXiR01TUNK1RYSM80alKOmB8AGd+wgOeNpjYGBgAmJmIBYBkoxgmoXBC0jzMXAA5djAKngZFBgWyPv+/w/kofBBOv5/+//kf/qD3WDdPAwIwAQA0KYN+QABAAIACAAI//8ADwAFAGQAAAMoBbAAAwAGAAkADAAPAAABESERBQEBJQkDIQkCAyj9PAKO/u8BEf2oAQ3+8wEq/v4CA/39AQIBAQWw+lAFsFT9fP18DAJ4Anj9RP2iBUT9ogJeAAACAGX/7AUdBcQAFQArAAABFRQCBgYjIiYmAjU1NBI2NjMyFhYSBzU0LgIjIg4CFRUUHgIzMj4CBR1Wn96Hht2iWVih3YaH3qBX+y9bhFNTglswMF2CU1SCWi8DAFCl/vq4YWG4AQalUKUBBblhYbn++/VSert/QUF/u3pSeryBQUGBvAACAGQEcALGBdcABQAPAAABNRMzFQMlNTMVFBYXByYmAYtyyeL+gKgmKk1PXASEFAE/Ff7C+VpUQmInSCiN///+bP/sBWMF1gAmAAVGAAAHAAb+CP//AAEAAAADA9eV91UeXw889QAbCAAAAAAAxPARLgAAAADljVAD+ib91QlhCHMAAAAJAAIAAAAAAAB42mNgZGBgz/nHw8DAmfdL7Z8dZyIHAxrgBAB3RwTNAHjaY+5hSGGAAsa/EMzazJDKLM2QAmaf/JcDAGf/B5UAeNpjYGDQhcN8hj4gnAUAE5QDBwB42mNgZGBg4GRYySDKUMbADuYhADMDIwAd5AFLeNp1kMVRBTAURQ/ubJEN7u62wd11C9/dtQXKoAGkIiqgBu5kgnyb2Ml9lhegjRdqqKptEn9UNVquopsvy9W082m5hlneLNf+86ljmGfL9dJjlttZZh3DVUM0M2t5hFYGLY+KOy1PiVstz4vgiBRPhPDj5Aw3LlGaMA+4RV58sp8TJSFNftL98klJl0UjRpJ1ZjSiYjcRPKIIKZtTijzcTJscXq51OrRSWlMFFe/FCfn6TXwvC4qZZY4lNnSbF8+zXKAecKFxIKqc9VrsFYV4IlHg11vgt2Pen5eP7drWnNPo5VaKW2dh/CUJnQFZnMZ/i7ROn+k0qftoyR958RuPtLJM45Rn2KhRDS8h3L+/l5SeKOjKaXpIavjFY99C5llgeNpjYGYAg/9ZDCkMWAAAKh8B0QA=)format("woff");unicode-range:U+1F??}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/roboto-greek-500-normal-C9AnhcmC.woff2)format("woff2"),url(/assets/roboto-greek-500-normal-XBIQOowA.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/roboto-math-500-normal-C4NU9gLX.woff2)format("woff2"),url(/assets/roboto-math-500-normal-BNGXE_xU.woff)format("woff");unicode-range:U+302-303,U+305,U+307-308,U+310,U+312,U+315,U+31A,U+326-327,U+32C,U+32F-330,U+332-333,U+338,U+33A,U+346,U+34D,U+391-3A1,U+3A3-3A9,U+3B1-3C9,U+3D1,U+3D5-3D6,U+3F0-3F1,U+3F4-3F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE??}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/roboto-symbols-500-normal-B_CZKVJS.woff2)format("woff2"),url(/assets/roboto-symbols-500-normal-DFnofPUt.woff)format("woff");unicode-range:U+1-C,U+E-1F,U+7F-9F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+28??,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B??,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F0??,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F7??,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB??}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/roboto-vietnamese-500-normal-B3ncpOoB.woff2)format("woff2"),url(/assets/roboto-vietnamese-500-normal-BgoYVz-9.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/roboto-latin-ext-500-normal-pMCM9Ixg.woff2)format("woff2"),url(/assets/roboto-latin-ext-500-normal-C1cK9xmS.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/roboto-latin-500-normal-7RbcRiD8.woff2)format("woff2"),url(/assets/roboto-latin-500-normal-fsTFPL3E.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/roboto-cyrillic-ext-700-normal-DmFxo5wj.woff2)format("woff2"),url(/assets/roboto-cyrillic-ext-700-normal-BWOtdzfy.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/roboto-cyrillic-700-normal-C2o7G-SM.woff2)format("woff2"),url(/assets/roboto-cyrillic-700-normal-D8g9KsRf.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:url(data:font/woff2;base64,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)format("woff2"),url(data:font/woff;base64,d09GRgABAAAAAAWsAA8AAAAABuQAAQABAAAAAAAAAAAAAAAAAAAAAAAAAABHREVGAAABWAAAABQAAAAUAA8ACUdQT1MAAAFsAAAAHgAAAB5EdEx1R1NVQgAAAYwAAAAzAAAANJMNggJPUy8yAAABwAAAAEsAAABgdTbg0VNUQVQAAAIMAAAARwAAAFpfnEGhY21hcAAAAlQAAABAAAAAXj5j4n9nYXNwAAAClAAAAAwAAAAMAAgAGWdseWYAAAKgAAABMQAAATZvegfsaGVhZAAAA9QAAAA2AAAANg1psE5oaGVhAAAEDAAAAB8AAAAkCykN1GhtdHgAAAQsAAAAHwAAACQX6P92bG9jYQAABEwAAAATAAAAFAFZAbFtYXhwAAAEYAAAABwAAAAgACkBIW5hbWUAAAR8AAABGwAAAkozllu+cG9zdAAABZgAAAATAAAAIP9tAGQAAQAAAAwAAAAAAAAAAQAIAAEAAQABAAAACgAcABwAAURGTFQACAAEAAAAAP//AAAAAAAAeNpjYGRgYOBiMAJCFhc3nxAGueTKohwGqfSi1GwGqZzEkjwGKQYQYAER//+DSADdjQkeAHjaTcW7DUBAAADQ5z6M4XbQqXQqsYWhNLeCASxhIVGIxGuelGo4ZfKeB5r+PV62gOAzEf3M6zor9EvrZuv2oGgqpDEfKOID+HEKVQB42gXBsQEBARAAsNw9aKFWAQAmAgAdWM5wnwihoUBHgZn8Hd/X6PO7XN8xErf37hkbqaalK5AxdEQIYpl/FFLGCAQlmhEH2QB42mNgYGACYmYgFgGSjGCahcELSPMxcADl2MAqeBkUGBbI+/7/D+Sh8EE6/n/7/+R/+oPdYN08DAjABADQpg35AAEAAgAIAAj//wAPeNodjzVUA0EURf/8ZRLcIw3uTrSJNLi7+x563Klw71ucclMmFdbi1p/Q4a47izytL1BoBeBiqQAcyMANPMEHgPiF+VFCoty4MDfkYkUzLrA74iduEC/2ROIZQ04UCRJChc9iKpSLw+KwJ/Zjv5guLtHfYiMAQqV0TZPpLiggAYAoAlEmiwiPjkaDQe9vNOq0SqU/NeiTMSLcGxWKwGDUaa1Ik2tXnDPTzrW62lXn9IxztY4dxZf25uf3lMT/f29xPH5mrLF3O8/bietaxjqRO3jewT6us7qFfoulX+jO6rINWK0DNgCEWpd23KUXQP/JDAE6BRdl0CkClSp5dDQZ79i/ZIMbEQml2fUuo2piVrCt18Zqa0NYWeS0JDH+l6GbnkM00EwAOciYmyT9AMF6YZEAAAAAAQAAAAMD15Zf+khfDzz1ABsIAAAAAADE8BEuAAAAAOWNUAP6Mf3VCYkIcwABAAkAAgAAAAAAAHjaY2BkYGDP+cfDwMDZ88vwnzFnJwcDGuAEAH1DBRMAeNpj7mFIYYACxr8QzNrCEMYszhAFZp/6lwQAZr4HcAB42mNgYNCFwwKGfiCcDQATpAMLAHjaY2BkYGDgZFjJIMpQxsAO5iEAMwMjAB3kAUt42m2QA24FQBRFT+2GRVjbVlDbjFPr29hMsYNyQY27gMZJbyYv+MjTmYcRUMMrRRQUVwDv/BkXUM2vcSHl/BgX0c+3cTH1PBuX0EnauFT5a+NaJhnEcUEHlbQbd1FNo3G3uNp4CJ1lPKosbBDlAi8PXHHGjeId98rtEiCMz9XOlL0mqrwqkiARZhmSBMQ3+LkV+YnaPsoQkR90e9xxqHgpi8oGWJT3cs0pN6pGeHCzzYwxyDAjTDCn1ah4lMmM2WZsNqN3jT3Jmij/ORYzqkvu5inC2HvtxBFJM8fK3Chmnr1PWPFRlSvXv0DM/UlA+YjW3Tm/c8eD64hxySBXBPC5bEByh5cb7N+IKB/OuP2V6hdEJA/inn+ATFaOAHjaY2BmAIP/WQwpDFgAACofAdEA)format("woff");unicode-range:U+1F??}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/roboto-greek-700-normal-0aHWxGLu.woff2)format("woff2"),url(/assets/roboto-greek-700-normal-xQsEWSIA.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/roboto-math-700-normal-B8YqGHVc.woff2)format("woff2"),url(/assets/roboto-math-700-normal-DbhUef31.woff)format("woff");unicode-range:U+302-303,U+305,U+307-308,U+310,U+312,U+315,U+31A,U+326-327,U+32C,U+32F-330,U+332-333,U+338,U+33A,U+346,U+34D,U+391-3A1,U+3A3-3A9,U+3B1-3C9,U+3D1,U+3D5-3D6,U+3F0-3F1,U+3F4-3F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE??}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/roboto-symbols-700-normal-BiFDindJ.woff2)format("woff2"),url(/assets/roboto-symbols-700-normal-C59U6HqI.woff)format("woff");unicode-range:U+1-C,U+E-1F,U+7F-9F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+28??,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B??,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F0??,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F7??,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB??}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/roboto-vietnamese-700-normal-BEVeWqJt.woff2)format("woff2"),url(/assets/roboto-vietnamese-700-normal-kpkdMgbf.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/roboto-latin-ext-700-normal-DSBUz0N1.woff2)format("woff2"),url(/assets/roboto-latin-ext-700-normal-BDePAh3g.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/roboto-latin-700-normal-BZpUvMxY.woff2)format("woff2"),url(/assets/roboto-latin-700-normal-YuyVweIx.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
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,56 @@
|
|
|
1
|
+
/* Copyright (c) 2026, John Lenz
|
|
2
|
+
|
|
3
|
+
All rights reserved.
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
* Redistributions of source code must retain the above copyright
|
|
9
|
+
notice, this list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
* Redistributions in binary form must reproduce the above
|
|
12
|
+
copyright notice, this list of conditions and the following
|
|
13
|
+
disclaimer in the documentation and/or other materials provided
|
|
14
|
+
with the distribution.
|
|
15
|
+
|
|
16
|
+
* Neither the name of John Lenz, Black Maple Software, SeedTactics,
|
|
17
|
+
nor the names of other contributors may be used to endorse or
|
|
18
|
+
promote products derived from this software without specific
|
|
19
|
+
prior written permission.
|
|
20
|
+
|
|
21
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
22
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
23
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
24
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
25
|
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
26
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
27
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
28
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
29
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
30
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
31
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
32
|
+
*/
|
|
33
|
+
import { createStore } from "jotai";
|
|
34
|
+
import { registerNetworkBackend } from "./network/backend.js";
|
|
35
|
+
import { fmsInformation, loadInfo } from "./network/server-settings.js";
|
|
36
|
+
import { render } from "./renderer.js";
|
|
37
|
+
/**
|
|
38
|
+
* Starts one complete FMS Insight application with optional statically composed custom pages.
|
|
39
|
+
*/
|
|
40
|
+
export async function bootstrapInsight(appProps = {}, rootElement) {
|
|
41
|
+
const root = rootElement ?? document.getElementById("root");
|
|
42
|
+
if (!root) {
|
|
43
|
+
throw new Error("Unable to start FMS Insight: no root element was provided or found");
|
|
44
|
+
}
|
|
45
|
+
registerNetworkBackend();
|
|
46
|
+
const store = createStore();
|
|
47
|
+
store.set(fmsInformation, await loadInfo());
|
|
48
|
+
render(appProps, root, store);
|
|
49
|
+
if ("serviceWorker" in navigator) {
|
|
50
|
+
void navigator.serviceWorker.getRegistrations().then((registrations) => {
|
|
51
|
+
for (const registration of registrations) {
|
|
52
|
+
void registration.unregister();
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Atom } from "jotai";
|
|
2
|
+
/**
|
|
3
|
+
* The latest complete application-specific snapshot received from the Insight server.
|
|
4
|
+
* Consumers must validate this opaque value before interpreting it.
|
|
5
|
+
*/
|
|
6
|
+
export declare const customState: Atom<unknown>;
|
|
7
|
+
export declare const replaceCustomState: import("jotai").WritableAtom<null, [state: unknown], void> & {
|
|
8
|
+
init: null;
|
|
9
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/* Copyright (c) 2026, John Lenz
|
|
2
|
+
|
|
3
|
+
All rights reserved.
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
* Redistributions of source code must retain the above copyright
|
|
9
|
+
notice, this list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
* Redistributions in binary form must reproduce the above
|
|
12
|
+
copyright notice, this list of conditions and the following
|
|
13
|
+
disclaimer in the documentation and/or other materials provided
|
|
14
|
+
with the distribution.
|
|
15
|
+
|
|
16
|
+
* Neither the name of John Lenz, Black Maple Software, SeedTactics,
|
|
17
|
+
nor the names of other contributors may be used to endorse or
|
|
18
|
+
promote products derived from this software without specific
|
|
19
|
+
prior written permission.
|
|
20
|
+
|
|
21
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
22
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
23
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
24
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
25
|
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
26
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
27
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
28
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
29
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
30
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
31
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
32
|
+
*/
|
|
33
|
+
import { atom } from "jotai";
|
|
34
|
+
const customStateRW = atom(null);
|
|
35
|
+
/**
|
|
36
|
+
* The latest complete application-specific snapshot received from the Insight server.
|
|
37
|
+
* Consumers must validate this opaque value before interpreting it.
|
|
38
|
+
*/
|
|
39
|
+
export const customState = customStateRW;
|
|
40
|
+
export const replaceCustomState = atom(null, (_, set, state) => {
|
|
41
|
+
set(customStateRW, state);
|
|
42
|
+
});
|
|
@@ -36,6 +36,7 @@ import * as simUse from "./sim-station-use.js";
|
|
|
36
36
|
import * as schJobs from "./scheduled-jobs.js";
|
|
37
37
|
import * as buffers from "./buffers.js";
|
|
38
38
|
import * as currentSt from "./current-status.js";
|
|
39
|
+
import * as customSt from "./custom-state.js";
|
|
39
40
|
import * as insp from "./inspections.js";
|
|
40
41
|
import * as mats from "./material-summary.js";
|
|
41
42
|
import * as names from "./names.js";
|
|
@@ -51,6 +52,9 @@ import { atom } from "jotai";
|
|
|
51
52
|
const lastEventCounterRW = atom(null);
|
|
52
53
|
export const lastEventCounter = lastEventCounterRW;
|
|
53
54
|
export const onServerEvent = atom(null, (_, set, evt) => {
|
|
55
|
+
if (evt.evt.newCurrentStatus) {
|
|
56
|
+
set(customSt.replaceCustomState, evt.evt.newCurrentStatus.customState ?? null);
|
|
57
|
+
}
|
|
54
58
|
set(simProd.updateLast30JobProduction, evt);
|
|
55
59
|
set(simUse.updateLast30SimStatUse, evt);
|
|
56
60
|
set(schJobs.updateLast30Jobs, evt);
|
|
@@ -97,6 +101,7 @@ export const onLoadLast30Log = atom(null, (_, set, log) => {
|
|
|
97
101
|
});
|
|
98
102
|
export const onLoadCurrentSt = atom(null, (_, set, curSt) => {
|
|
99
103
|
set(currentSt.setCurrentStatus, curSt);
|
|
104
|
+
set(customSt.replaceCustomState, curSt.customState ?? null);
|
|
100
105
|
set(names.setNamesFromCurrentStatus, curSt);
|
|
101
106
|
});
|
|
102
107
|
export const onLoadSpecificMonthJobs = atom(null, (_, set, historicData) => {
|
package/dist/components/App.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ReactNode, ComponentType } from "react";
|
|
2
2
|
import { ChooseModeItem } from "./ChooseMode.js";
|
|
3
3
|
import * as serverSettings from "../network/server-settings.js";
|
|
4
|
+
import type { SubmitBasketLoadStationCommand } from "./station-monitor/BasketLoadStationWork.js";
|
|
4
5
|
export declare function NavTabs({ children }: {
|
|
5
6
|
children?: ReactNode;
|
|
6
7
|
}): import("react").JSX.Element;
|
|
@@ -10,6 +11,7 @@ export interface AppProps {
|
|
|
10
11
|
readonly page: ReactNode;
|
|
11
12
|
};
|
|
12
13
|
readonly chooseModes?: (i: serverSettings.FMSInfoAndUser) => ReadonlyArray<ChooseModeItem> | null;
|
|
14
|
+
readonly submitBasketLoadStationCommand?: SubmitBasketLoadStationCommand;
|
|
13
15
|
}
|
|
14
16
|
declare const App: import("react").MemoExoticComponent<(props: AppProps) => import("react").JSX.Element>;
|
|
15
17
|
export default App;
|
package/dist/components/App.js
CHANGED
|
@@ -310,7 +310,7 @@ const App = memo(function App(props) {
|
|
|
310
310
|
else {
|
|
311
311
|
switch (route.route) {
|
|
312
312
|
case routes.RouteLocation.Station_LoadMonitor:
|
|
313
|
-
page = (_jsx(LoadStation, { loadNum: route.loadNum, queues: route.queues, completed: route.completed }));
|
|
313
|
+
page = (_jsx(LoadStation, { loadNum: route.loadNum, queues: route.queues, completed: route.completed, submitBasketLoadStationCommand: props.submitBasketLoadStationCommand }));
|
|
314
314
|
nav1 = StationToolbar;
|
|
315
315
|
nav2 = StationToolbarOverviewButton;
|
|
316
316
|
showOperator = true;
|
|
@@ -249,7 +249,7 @@ export function ProgramSummaryTable() {
|
|
|
249
249
|
function ProgramContentCode() {
|
|
250
250
|
const ct = useAtomValue(programContent);
|
|
251
251
|
const [highlighted, setHighlighted] = useState(null);
|
|
252
|
-
const worker = useMemo(() => new Worker(new URL("./ProgramHighlight.
|
|
252
|
+
const worker = useMemo(() => new Worker(new URL("./ProgramHighlight.js", import.meta.url), { type: "module" }), []);
|
|
253
253
|
useEffect(() => {
|
|
254
254
|
let set = (h) => setHighlighted(h);
|
|
255
255
|
const handleMessage = (event) => set(event.data);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as api from "../../network/api.js";
|
|
2
|
+
import { MatCardFontSize } from "./Material.js";
|
|
3
|
+
export interface BasketLoadStationCommand {
|
|
4
|
+
readonly workId: string;
|
|
5
|
+
}
|
|
6
|
+
export type SubmitBasketLoadStationCommand = (stationNumber: number, command: BasketLoadStationCommand) => Promise<"accepted" | "conflict">;
|
|
7
|
+
interface BasketLoadStationWorkflowProps {
|
|
8
|
+
readonly stationNumber: number;
|
|
9
|
+
readonly basket: Readonly<api.IBasketStatus>;
|
|
10
|
+
readonly material: ReadonlyArray<Readonly<api.IInProcessMaterial>>;
|
|
11
|
+
readonly fsize: MatCardFontSize;
|
|
12
|
+
readonly submitCommand: SubmitBasketLoadStationCommand | undefined;
|
|
13
|
+
}
|
|
14
|
+
export declare function BasketLoadStationWorkflow({ stationNumber, basket, material, fsize, submitCommand, }: BasketLoadStationWorkflowProps): import("react").JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/* Copyright (c) 2026, John Lenz
|
|
3
|
+
|
|
4
|
+
All rights reserved.
|
|
5
|
+
|
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
|
7
|
+
modification, are permitted provided that the following conditions are met:
|
|
8
|
+
|
|
9
|
+
* Redistributions of source code must retain the above copyright
|
|
10
|
+
notice, this list of conditions and the following disclaimer.
|
|
11
|
+
* Redistributions in binary form must reproduce the above copyright
|
|
12
|
+
notice, this list of conditions and the following disclaimer in the
|
|
13
|
+
documentation and/or other materials provided with the distribution.
|
|
14
|
+
* Neither the name of John Lenz, Black Maple Software, SeedTactics,
|
|
15
|
+
nor the names of other contributors may be used to endorse or
|
|
16
|
+
promote products derived from this software without specific
|
|
17
|
+
prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
20
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
21
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
22
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
23
|
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
24
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
25
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
26
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
27
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
28
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
30
|
+
*/
|
|
31
|
+
import { useEffect, useMemo, useState } from "react";
|
|
32
|
+
import { Alert, Box, Button, Card, CardContent, Stack, Typography } from "@mui/material";
|
|
33
|
+
import { LazySeq } from "@seedtactics/immutable-collections";
|
|
34
|
+
import * as api from "../../network/api.js";
|
|
35
|
+
import { InProcMaterial } from "./Material.js";
|
|
36
|
+
import { MoveMaterialArrowNode } from "./MoveMaterialArrows.js";
|
|
37
|
+
import { MoveMaterialNodeKindType } from "../../data/move-arrows.js";
|
|
38
|
+
function isPositiveInteger(value) {
|
|
39
|
+
return Number.isInteger(value) && (value ?? 0) > 0;
|
|
40
|
+
}
|
|
41
|
+
function isNonBlank(value) {
|
|
42
|
+
return typeof value === "string" && value.trim() !== "";
|
|
43
|
+
}
|
|
44
|
+
function actionPhase(mat, basketId) {
|
|
45
|
+
if (mat.location.type === api.LocType.InBasket &&
|
|
46
|
+
mat.location.basketId === basketId &&
|
|
47
|
+
(mat.action.type === api.ActionType.UnloadToInProcess ||
|
|
48
|
+
mat.action.type === api.ActionType.UnloadToCompletedMaterial)) {
|
|
49
|
+
if (!isPositiveInteger(mat.location.basketSlot)) {
|
|
50
|
+
return "invalid";
|
|
51
|
+
}
|
|
52
|
+
return "unload";
|
|
53
|
+
}
|
|
54
|
+
if (mat.action.type === api.ActionType.LoadingToBasket) {
|
|
55
|
+
if (!isPositiveInteger(mat.action.loadToBasketId))
|
|
56
|
+
return "invalid";
|
|
57
|
+
if (mat.action.loadToBasketId !== basketId)
|
|
58
|
+
return undefined;
|
|
59
|
+
if (!isPositiveInteger(mat.action.loadToBasketSlot) ||
|
|
60
|
+
(mat.location.type !== api.LocType.Free &&
|
|
61
|
+
(mat.location.type !== api.LocType.InQueue || !isNonBlank(mat.location.currentQueue)))) {
|
|
62
|
+
return "invalid";
|
|
63
|
+
}
|
|
64
|
+
return "load";
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
function confirmableWork(material, basketId) {
|
|
69
|
+
const classifiedActions = LazySeq.of(material)
|
|
70
|
+
.collect((mat) => {
|
|
71
|
+
const phase = actionPhase(mat, basketId);
|
|
72
|
+
return phase === undefined ? undefined : { phase, workId: mat.action.workId };
|
|
73
|
+
})
|
|
74
|
+
.toRArray();
|
|
75
|
+
if (classifiedActions.some(({ phase }) => phase === "invalid")) {
|
|
76
|
+
return { type: "inconsistent" };
|
|
77
|
+
}
|
|
78
|
+
const phaseActions = classifiedActions.filter((action) => action.phase !== "invalid");
|
|
79
|
+
if (phaseActions.length === 0)
|
|
80
|
+
return { type: "none" };
|
|
81
|
+
const tagged = phaseActions.filter((action) => isNonBlank(action.workId));
|
|
82
|
+
const workIds = LazySeq.of(tagged).toHashSet(({ workId }) => workId);
|
|
83
|
+
const phases = LazySeq.of(tagged).toHashSet(({ phase }) => phase);
|
|
84
|
+
if (tagged.length !== phaseActions.length || workIds.size !== 1 || phases.size !== 1) {
|
|
85
|
+
return { type: "inconsistent" };
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
type: "confirmable",
|
|
89
|
+
work: { workId: tagged[0].workId, phase: tagged[0].phase },
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function loadingSource(mat) {
|
|
93
|
+
if (mat.location.type === api.LocType.InQueue && mat.location.currentQueue) {
|
|
94
|
+
return mat.location.currentQueue;
|
|
95
|
+
}
|
|
96
|
+
return "raw material";
|
|
97
|
+
}
|
|
98
|
+
function SlotMaterial({ material, fsize, }) {
|
|
99
|
+
return material.map((mat) => (_jsx(MoveMaterialArrowNode, { kind: { type: MoveMaterialNodeKindType.Material, material: mat }, children: _jsx(InProcMaterial, { mat: mat, fsize: fsize }) }, mat.materialID)));
|
|
100
|
+
}
|
|
101
|
+
export function BasketLoadStationWorkflow({ stationNumber, basket, material, fsize, submitCommand, }) {
|
|
102
|
+
const [submission, setSubmission] = useState("idle");
|
|
103
|
+
const workState = useMemo(() => confirmableWork(material, basket.basketId), [basket.basketId, material]);
|
|
104
|
+
const work = workState.type === "confirmable" ? workState.work : undefined;
|
|
105
|
+
useEffect(() => setSubmission("idle"), [work?.workId]);
|
|
106
|
+
const materialBySlot = useMemo(() => LazySeq.of(material)
|
|
107
|
+
.filter((mat) => mat.location.type === api.LocType.InBasket &&
|
|
108
|
+
mat.location.basketId === basket.basketId &&
|
|
109
|
+
mat.location.basketSlot !== undefined)
|
|
110
|
+
.groupBy((mat) => mat.location.basketSlot ?? 0)
|
|
111
|
+
.toHashMap((entry) => entry), [basket.basketId, material]);
|
|
112
|
+
const loadsBySlot = useMemo(() => LazySeq.of(material)
|
|
113
|
+
.filter((mat) => mat.action.type === api.ActionType.LoadingToBasket &&
|
|
114
|
+
mat.action.loadToBasketId === basket.basketId &&
|
|
115
|
+
mat.action.loadToBasketSlot !== undefined)
|
|
116
|
+
.groupBy((mat) => mat.action.loadToBasketSlot ?? 0)
|
|
117
|
+
.toHashMap((entry) => entry), [basket.basketId, material]);
|
|
118
|
+
const slots = useMemo(() => LazySeq.of(basket.emptySlots ?? [])
|
|
119
|
+
.concat(basket.unknownSlots ?? [])
|
|
120
|
+
.concat(materialBySlot.keysToLazySeq())
|
|
121
|
+
.concat(loadsBySlot.keysToLazySeq())
|
|
122
|
+
.distinctBy((slot) => slot)
|
|
123
|
+
.toSortedArray((slot) => slot), [basket.emptySlots, basket.unknownSlots, materialBySlot, loadsBySlot]);
|
|
124
|
+
async function submit() {
|
|
125
|
+
if (work === undefined || submitCommand === undefined)
|
|
126
|
+
return;
|
|
127
|
+
setSubmission("submitting");
|
|
128
|
+
try {
|
|
129
|
+
setSubmission(await submitCommand(stationNumber, { workId: work.workId }));
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
setSubmission("error");
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const submissionDisabled = submission === "submitting" || submission === "accepted" || submission === "conflict";
|
|
136
|
+
const buttonLabel = work?.phase === "unload" ? "Unload Complete" : "Load Complete";
|
|
137
|
+
return (_jsxs(Stack, { spacing: 2, sx: { mt: 2 }, children: [_jsx(Typography, { variant: "h6", children: "Basket slots" }), _jsx(Box, { sx: {
|
|
138
|
+
display: "grid",
|
|
139
|
+
gridTemplateColumns: "repeat(auto-fit, minmax(15em, 1fr))",
|
|
140
|
+
gap: 2,
|
|
141
|
+
}, children: slots.map((slot) => {
|
|
142
|
+
const slotMaterial = materialBySlot.get(slot) ?? [];
|
|
143
|
+
const loads = loadsBySlot.get(slot) ?? [];
|
|
144
|
+
const isUnknown = basket.unknownSlots?.includes(slot) === true;
|
|
145
|
+
return (_jsx(Card, { "data-testid": `basket-load-station-slot-${slot}`, variant: "outlined", children: _jsxs(CardContent, { children: [_jsxs(Typography, { variant: "h6", children: ["Slot ", slot] }), slotMaterial.length > 0 ? (_jsx(SlotMaterial, { material: slotMaterial, fsize: fsize })) : (_jsx(Typography, { color: isUnknown ? "warning.main" : "text.secondary", children: isUnknown ? "Unknown" : "Empty" })), loads.map((mat, index) => (_jsxs(Box, { sx: { mt: 1 }, children: [_jsxs(Typography, { children: ["Load from ", loadingSource(mat)] }), _jsxs(Typography, { variant: "body2", color: "text.secondary", children: [mat.partName, " \u00B7 Process ", mat.action.processAfterLoad ?? mat.process] })] }, `${mat.jobUnique}-${mat.process}-${index}`)))] }) }, slot));
|
|
146
|
+
}) }), work && submitCommand ? (_jsx(Box, { sx: { display: "flex", justifyContent: "flex-end" }, children: _jsx(Button, { variant: "contained", disabled: submissionDisabled, onClick: () => void submit(), children: buttonLabel }) })) : work ? (_jsx(Alert, { severity: "warning", children: "Basket work confirmation is not configured." })) : workState.type === "inconsistent" ? (_jsx(Alert, { severity: "warning", children: "Basket work is inconsistent. Wait for refreshed material actions before confirming." })) : null, submission === "accepted" ? (_jsx(Alert, { severity: "success", children: "Confirmation accepted. Waiting for refreshed work." })) : submission === "conflict" ? (_jsx(Alert, { severity: "warning", children: "Basket work changed before confirmation. Review the refreshed slots and try again." })) : submission === "error" ? (_jsx(Alert, { severity: "error", children: "Unable to confirm basket work. No work was assumed complete." })) : null] }));
|
|
147
|
+
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { ReactNode } from "react";
|
|
2
|
+
import { SubmitBasketLoadStationCommand } from "./BasketLoadStationWork.js";
|
|
2
3
|
interface LoadStationProps {
|
|
3
4
|
readonly loadNum: number;
|
|
4
5
|
readonly queues: ReadonlyArray<string>;
|
|
5
6
|
readonly completed: boolean;
|
|
6
7
|
readonly whiteBackground?: boolean;
|
|
8
|
+
readonly submitBasketLoadStationCommand?: SubmitBasketLoadStationCommand;
|
|
7
9
|
}
|
|
8
10
|
export declare function LoadStation(props: LoadStationProps): import("react").JSX.Element;
|
|
9
11
|
declare function LoadStationCheckWidth(props: LoadStationProps): ReactNode;
|