fqRY;S&>!jtzhpTphYV%Ka8+WvyD@KQ
z7+xG%&J0#j_qYIsi28#_*h$iQWL?o>>uhJ-LmvN=aTj1=R$H^e!l(ikAwV1o=$?Fb
zvOcJ5XaoX+y{#=Pvoiks-vg1h4i3|f#5Q{>gfIR8kn@X&l84po1!@Bt+Y()T=0Yh+
zI$8nbB+_J4Utgaai1_WJn3
zK?u`UXv5XsZ{Syo!5q7O`gaOxh}?ahx2B27_~33*SQ9q!
zP@I~yf~tPt)!#$lVOTij>tSFWZ@F3vI_q2;0D>L>Pi0e3c**d->xXpWjy^#Dze`&G
z@PK3iE2u$}qgg+1G7md)gpv=|UHqWh;g0J0mw4wtlspb)bntMATeG8a$lY1G&y9?J
zuHX6Itbm)LYTs0M2T#IXF#^roS87p?M-#JWx;O%{1t{oKc6?`I`JDZz~
z#sSw>BN1KzmR6OODS5P#8vCGF-UbZ}$Qd-CoJ@rHl9Q9y^5>ImOytQJdU({^8Y?JZ
z?s&HoMaXK+o%@I;Uj`OQyuEMCyi3Pu0X)G(Fz^0ra_U%2Dk`c?W=vh&jf{WrR$C#t
zy8KW0jHg&>7QB)$W(-AVki>0`uLCm
z6a!GDv;b2OrH+jwRAv0M_(alI>c8P4X0EFSl;1&SyRo@h#J5AK2LAWS_Ossr0h8Ed(a+()}P267VP*$N#UC#Jm>
z24*P__3TCYo$kOWKv!iFfyzH9pd
zg5fJGD}Pnp`o;6(0j|YYzO4Mc?7z%Z^Xv)erddP$Y7Tjfq|s~6&+nU%Q{-|fdLgEl
zB2LYxI0r_aQ6|4ozcLUzn`#zxSERBs=?*|A;`lR2Ve>gv)^s=6Nz-x%JJo!3A{@^>Cqndqv1B
zyDM-;2HlV^UCwXhm080hgX>F!>Y+q1O)`Jt6La}
zv4Le|h*t!GRzL1g&0Yf-6qG?3c;G0QAz*|dLs6a$Kq#N@$>cwDr=mk&P9ku08T~(?
zicWa$0k6-vj5|IxH3`z)3gP}^eXo%MY*NJ~C6m8?VE`Q`z+&M{`yI6^cmx27>ol+s
z@|#wl61pko`0`gz2USsCxWV#4aV-shi`Wm>-+G_e9F%S^~Sb`yE{{I$E{HLU%N8npB
zhXH#mU9WCu4P1!eKY#k))EALQoF}-^4U(5Yn!X8+SDOq79ZU`%Zg~s&Q<1)E`ry)@
z{66uSAEWL6U&tjY#ExtTQ#Fm2j&t3{3Re)&VMVRIU=Bs~$
zjcS9&Pyit~b`TBm=DeTgj
zO#Y2ir9~x^TL8Azyq`AV=o~HVCIY|6RJ!lLI{r7pbUjc{cX#4aEgaCqB
zkDD72z;xREE;$7q=RrM&LmdEU0npUHkHXzaJvKD-={NRj$H)4zpFn&BL=E_`l}
z!eO-6_tde2uF=~wGl{NuFsJ=V00pIargFqhybC3=vaR8j#lR3+4_~F-)#sNB9SUwzf9I&d$!~uTiXlNRs#P7$8KiAa@;hPEZ$&6XajW+Dx18
zqVq7F*!|hrS>~iQ*3IQ#1t+J<(zEd?NT_+C1h@;>24S(WT>}+J0fJw(r2C+~2XH5S
zZ-65pJufUF5nByG?x*JDkOoYz!B{(;<>VfXW}+8ZVYus(8!p5Irj0!hp1Ou?#w$Fm
zi30UU^r?@VGWRwYxApMmF3#Rjo{622738z*qE}gfQJ4ZRW%LE6MnXy&KWvEyR^%Y;kp0sDzm1KGG6j0W!o-1;SMfN6
zwFn}dB?!I)%0fC;i0OatTvXTWKRfpg$z_16Y*GQBDJNU?uL(5}pHMFx&JVQMJm8m>
zmKJTiqUpzvdZ{nRx_wUQ7Z(>pTvypuR8;!dR2wir9cMp9%FaqkNFR6N=LYI*pNs0p|z|J)z`*x-mUq1Lxn1eu1y`~Dfw
zaysAM!$R*}BJnSHt6)W2uCu}&q2?jOTLCUCxpCeA4F?M11FI?TiW5hifZNEJb^$3I
zpavZZPs`;kGIVyZH8jO2NF_{|v=9X9s!dyB?>Uy8n=7d>=O1on{y;r+&2aw)vcDkD
z<4TX5n`!R>!o3ZkXHlOxVxWeU*zE-|HqcWrw)G?;gzgEWP}?FtSLX>JEItN+FEUws
zDJ(gL>OnpL6nB6!-tY|<86G`=3@aZVp`x^`9CcWLKy~x4K09k56iR6KN4fR_WNSErGbOfa_5AKvToSrKQ
zzbo9bmLDPebMk5z%N3AYUa3aK2zs|-#Tn1-ioY^TRxRuIZoc1j!5g8ZlHa*>4GkOQD518d6rE8~QS-bne?4TBx3{e)I{-BQdFahR9Pzbk
z|HOy=uMBHpH-&d%Z#=slH<_#`^>}1dqB2{Ss)d=^Luu#ZjjUP(_Dh&zJlp^zpFxM?D1Igt)a9n>Ce686f
z$CkYHAZs#1)`h=FC%h|um$%`e&+w4&4A2_HA#*AK0U+&^R=e5OkG4;F)`AJ;^ije6sQ&H;2Kxnr60SJ46qd&2{97S_?9B%94GB{hVW8|G=
z0?eB=0JIL23%rMhc!Bgdq85h-9i|l#5rGXf_r=qtMbC`p3L!5KmzYIwXJVpd<>l-2
zHs$$ZRE1}I`dY#L7^Shnn~?KYMBN8|FnExc(8Uz4#8C_^-fXj^*#b`%Z%{
zH#Sk3iD8kzsb)YHaiLVZX3c7i
z06Lf-3O#4z5?txbokPO|T$d6(v4^j@xlLJcmA}7BswzpI)rxFOY_hTZScw%Uo8>-P
zLXDl-r~?8$CVu$40N{5RELr+R?d=(SA}!HWu*X9*8HR$Xf>>>x&y8^3*4NbJB9c*z
zjtWTvRCD?G7z~2y9^{sh10tE{poV4$)RbFy0uD&ViK3)R
zN#5)CE2i|map48#!a2<#%8;NXlXW$H+5`64PQ&C85C{d-iA%MADmyMdh7(ZzE-v;i=tQC&%-5m~
z#-Q}~clSF~>%F}PT3bh`mzukghoWe?IY*vN36@?_Py42c0{Iu;eg55`{AOH6{jv8x
z5L|1ZnF)WXE2pC6A<|c}HY}l+4p$LY&p#B{u=-IPpw8hVWtUag&eA9F+F*n^-
z$Ia9I{_YRrOW3I8
zk~^VHoNA>z(4r-JHX1x%Zxib<7(lla;=ysV-9Hu5S_syq0!S{E*}DHn6W1Bl)Ru)45fq4mf)pXNNEhj1f)4~S
z6zT97DL$%{QR$$d5D=**6p2zqX`u-FsK
z)F%}$O7##DgP;M(E#tX|f_{4sUE}EK}>Z%Jc`aJoGjL5esqyoyK%9^pp&LL(@VI&RH
zIS(gY+NK&ELCgs1UYQD57;7MI7^X`T-K7klaqc;vHGQS0&K$`x0^RcaPE_7-Pwnh4H2j*iPZ5G@f(Y!u-R0
zw?_VWeD*$(y?uu~6fr-V7h5E$9|`01*vo#;qHM$9(Lk=Aj$zGVnhIEh-n;#`+Plpg
z-iO~oI(VV#o_qV@D|k}#*DcL)YMSMFdE$Uz@NviMU>B-Sezd><-lR2hu?sZy2D<|p
zKfxXJM$b`fQm@FLoZI&kw~Mx4Lej}{q!efa^e;(k-C`lbxylc
zz@Sh-FL1oGvokK(5_r=nX-1P&+NdSJ^2a6TH@3UJ;e?sk$R*XW$Jr;*o88uq`X-A2
zQlOuS1+eZbK*RY6nERCIbkx>by@9ST*#hX#RN@m*>i$AS{1OKC-vR2Lz9+J*MpC)?
zK%A(zrYMppPEV&c4G#W2m{3Hv^1i#0&WDd+^{1*qJi>4p=9KVH!t9~ni;yA4YdVul
zuwOTZH8b1X*ywrpuH?)1-RB(Z_|4wD1~+xJ@R!>E0zE-k^L5IZzfb6uGL|=@?Hn8s
zgpT2ZWpg(CyKRoTHIb9fH)2+2F9JIpIYfCPwQ6(=v;eNGYY`Y=5GA`M1)@qf_6N%@
zH!Wlc%>f|YQjS;a=Jo4B`=j~lF{btcp;<0L%gbb{YXYdW59;f|`E>aSQeZuyjQgcDUm~x)XtHIGTz~k2xL`lDps!XQ!o+Zo;(ebmriiM8vl>9HA
z*E)Y1Kayu27HyzxKba9Q<0h_aXk1)hR91umJ{1Tv;X}`@3K>!us2at~kzQLnl!fCR
zKn6Xi>g=08C}>q52zCu_*nR}GKAiG84>ANKCwM!-L3QxRs{45os>5=vPb{x7EI2UmC^4gAfa;2PC!&bsjOz#xz5yYjCE~tKPSID2+}#|0`9#M6GP
zd4xytcsJIo0NLN8%Ry6aUU9%iDSkkkm&bdfK?P>}!u7Tq-vC@6$Y&;M_&5eJn4(8%
zm!_oY2Q4bteG1d#a!~B~+32;Yw|Wk_yjo)Uhn+p5nU-Y>HN&u!oq_JJ
zS?uAa;#)qaRWo0NEr^MZFk%`HXd>Tlhtj0?-DQt@#}8mW
zf~lGG)9RVDj#!X`M43NP{~?rWH&k4wrEyN2NhmKz)8*cQ$qnR%_}B^$%AaLOJ%Qnm
z1Ixzz@bGZ1)P)Kerb}$473w(HtkuKEigfZ3W~RP5ESs$m(_7ChP_}rq%|GMWk)G5L
zJKVxWSp*ujo86CD$0WWny?UC@M`L>X@GC7I#ng1dRH90rh&avyWtQePnrq@3in32R
zbMu@Fm-SHQvB^bA(Gj{q&!rCQyprB0-YHN7x)?Ujp-|r+D6<7dt%*<8>oEHTn=~5Oc!CoTuidzKWUjB$ipR={*$Z3_JVH%ZmW_=v|v{
zS5IhVHozAljdD(iZyURlrQ_aDx5>$J
zO$)*acI7Gmj-Q{O|C2b}=iAWo`88ezIUQ~mg^S-Y9qV6hb95rN8rUZ49)
zS!WIOsnCaMvM$Mvt74ve~s$cfkjpYG^8xgd{@)ve!y_L|f^U%fT
zzujH&TijziiGV|9GE@bg%i-%w2+c39e{1;q`FW~@?Yd5qFfYF{As)ZW=A35^Cludf
zupoz|=d1)FNh+%G{GIQq%{$8qoFtn40j10bY3nEXUag|}QU@1ayn)DkZ+d-|kQKun
z2M=nKH)%!RUZW93)T9q5ycg7}
zb&li|2ddj0O+5Fe&2GH8N03&kT??c`1X$0S6Qg+2*gjOTe1?&8{!C+osBgWRz7Bo0
z*M8AE6Bu7$;zgNlfCpUG{}Ig((P+G*NAIi1(mGdli~}wKwh4#B0VdmcvHHg{$O~H+
zNjs5Zl)cnu7AD@pz>aPKJI+{>A&jTn0QRqYpo~lcl{NfreGS-9$YI?#1lc;cTT3`E
zq%cuubwb%}P4Xq>Ivo^cB`cUj5q0s?!ounLy-nGt)};!5w*jUEIKreKk8QisDN_sB
zCX1UG0OI{2b{6!Ts<{Q@!!N#*?6tA>RB4_BPk1-a6}}030Lvx8fo!pK?1G3U$d$7v
i+8*q&!~w;lJPTvnNmT1*?G-`5$NZAD$qQqTd;bA9)q33k
diff --git a/tgstation.dme b/tgstation.dme
index e8a1f8bf1fd..50b0b51f978 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3693,6 +3693,7 @@
#include "code\modules\wiremod\preset\speech_relay.dm"
#include "code\modules\wiremod\shell\airlock.dm"
#include "code\modules\wiremod\shell\bot.dm"
+#include "code\modules\wiremod\shell\brain_computer_interface.dm"
#include "code\modules\wiremod\shell\compact_remote.dm"
#include "code\modules\wiremod\shell\controller.dm"
#include "code\modules\wiremod\shell\drone.dm"
diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js b/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js
index a28f880d39c..3667c66f9fd 100644
--- a/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js
+++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js
@@ -232,7 +232,7 @@ export class IntegratedCircuit extends Component {
backgroundImage={resolveAsset('grid_background.png')}
imageWidth={900}
>
- {components.map((comp, index) => (
+ {components.map((comp, index) => comp && (
{
const connections = [];
for (const comp of components) {
+ if (comp === null) {
+ continue;
+ }
+
for (const port of comp.input_ports) {
if (port.connected_to === NULL_REF) continue;
const output_port = locations[port.connected_to];