local f do local S=(CFrame.new()).components function f(f,v,h,l,u)local N,P,s,m,i,Y,V,Q,n,x,D,d=S(f)local t,A,H,E,r,j,c,T,J,L,a,w=S(h)local C,q,K=v.x/2,v.y/2,v.z/2 local b,R,e=l.x/2,l.y/2,l.z/2 local M,z,B=t-N,A-P,H-s local O=(m*M+V*z)+x*B local X=(i*M+Q*z)+D*B local F=(Y*M+n*z)+d*B local o=(E*M+c*z)+L*B local W=(r*M+T*z)+a*B local Z=(j*M+J*z)+w*B local G=o>b and o-b or o<-b and o+b or 0 local p=W>R and W-R or W<-R and W+R or 0 local U=Z>e and Z-e or Z<-e and Z+e or 0 local g=O>C and O-C or O<-C and O+C or 0 local k=X>q and X-q or X<-q and X+q or 0 local y=F>K and F-K or F<-K and F+K or 0 local I=(G*G+p*p)+U*U local fb=(g*g+k*k)+y*y local Sb=C<q and(C<K and C or K)or q<K and q or K local vb=b<R and(b<e and b or e)or R<e and R or e if I<Sb*Sb or fb<vb*vb then return true elseif I>(C*C+q*q)+K*K or fb>(b*b+R*R)+e*e then return false elseif u==nil then local f=(m*E+V*c)+x*L local S=(m*r+V*T)+x*a local v=(m*j+V*J)+x*w local h=(i*E+Q*c)+D*L local l=(i*r+Q*T)+D*a local u=(i*j+Q*J)+D*w local N=(Y*E+n*c)+d*L local P=(Y*r+n*T)+d*a local s=(Y*j+n*J)+d*w local t=e*e local A=b*b local H=R*R local M=C*f local z=q*h local B=K*N local G=C*S local p=q*l local U=K*P local g=C*v local k=q*u local y=K*s local I=((M+z)+B)-o if I*I<A then local f=((G+p)+U)-W if f*f<H then local f=((g+k)+y)-Z if f*f<t then return true end end end local fb=((-M+z)+B)-o if fb*fb<A then local f=((-G+p)+U)-W if f*f<H then local f=((-g+k)+y)-Z if f*f<t then return true end end end local Sb=((M-z)+B)-o if Sb*Sb<A then local f=((G-p)+U)-W if f*f<H then local f=((g-k)+y)-Z if f*f<t then return true end end end local vb=((-M-z)+B)-o if vb*vb<A then local f=((-G-p)+U)-W if f*f<H then local f=((-g-k)+y)-Z if f*f<t then return true end end end local hb=((M+z)-B)-o if hb*hb<A then local f=((G+p)-U)-W if f*f<H then local f=((g+k)-y)-Z if f*f<t then return true end end end local lb=((-M+z)-B)-o if lb*lb<A then local f=((-G+p)-U)-W if f*f<H then local f=((-g+k)-y)-Z if f*f<t then return true end end end local ub=((M-z)-B)-o if ub*ub<A then local f=((G-p)-U)-W if f*f<H then local f=((g-k)-y)-Z if f*f<t then return true end end end local Nb=((-M-z)-B)-o if Nb*Nb<A then local f=((-G-p)-U)-W if f*f<H then local f=((-g-k)-y)-Z if f*f<t then return true end end end local Pb=C*C local sb=q*q local mb=K*K local ib=b*N local Yb=R*P local Vb=b*f local Qb=R*S local nb=b*h local xb=R*l local Db=e*s local db=e*v local tb=e*u local Ab=(((F-K)+ib)+Yb)/s if Ab*Ab<t then local f=((O+Vb)+Qb)-Ab*v if f*f<Pb then local f=((X+nb)+xb)-Ab*u if f*f<sb then return true end end end local Hb=(((F+K)+ib)+Yb)/s if Hb*Hb<t then local f=((O+Vb)+Qb)-Hb*v if f*f<Pb then local f=((X+nb)+xb)-Hb*u if f*f<sb then return true end end end local Eb=(((F-K)-ib)+Yb)/s if Eb*Eb<t then local f=((O-Vb)+Qb)-Eb*v if f*f<Pb then local f=((X-nb)+xb)-Eb*u if f*f<sb then return true end end end local rb=(((F+K)-ib)+Yb)/s if rb*rb<t then local f=((O-Vb)+Qb)-rb*v if f*f<Pb then local f=((X-nb)+xb)-rb*u if f*f<sb then return true end end end local jb=(((F-K)+ib)-Yb)/s if jb*jb<t then local f=((O+Vb)-Qb)-jb*v if f*f<Pb then local f=((X+nb)-xb)-jb*u if f*f<sb then return true end end end local cb=(((F+K)+ib)-Yb)/s if cb*cb<t then local f=((O+Vb)-Qb)-cb*v if f*f<Pb then local f=((X+nb)-xb)-cb*u if f*f<sb then return true end end end local Tb=(((F-K)-ib)-Yb)/s if Tb*Tb<t then local f=((O-Vb)-Qb)-Tb*v if f*f<Pb then local f=((X-nb)-xb)-Tb*u if f*f<sb then return true end end end local Jb=(((F+K)-ib)-Yb)/s if Jb*Jb<t then local f=((O-Vb)-Qb)-Jb*v if f*f<Pb then local f=((X-nb)-xb)-Jb*u if f*f<sb then return true end end end local Lb=(((O-C)+Vb)+Qb)/v if Lb*Lb<t then local f=((X+nb)+xb)-Lb*u if f*f<sb then local f=((F+ib)+Yb)-Lb*s if f*f<mb then return true end end end local ab=(((O+C)+Vb)+Qb)/v if ab*ab<t then local f=((X+nb)+xb)-ab*u if f*f<sb then local f=((F+ib)+Yb)-ab*s if f*f<mb then return true end end end local wb=(((O-C)-Vb)+Qb)/v if wb*wb<t then local f=((X-nb)+xb)-wb*u if f*f<sb then local f=((F-ib)+Yb)-wb*s if f*f<mb then return true end end end local Cb=(((O+C)-Vb)+Qb)/v if Cb*Cb<t then local f=((X-nb)+xb)-Cb*u if f*f<sb then local f=((F-ib)+Yb)-Cb*s if f*f<mb then return true end end end local qb=(((O-C)+Vb)-Qb)/v if qb*qb<t then local f=((X+nb)-xb)-qb*u if f*f<sb then local f=((F+ib)-Yb)-qb*s if f*f<mb then return true end end end local Kb=(((O+C)+Vb)-Qb)/v if Kb*Kb<t then local f=((X+nb)-xb)-Kb*u if f*f<sb then local f=((F+ib)-Yb)-Kb*s if f*f<mb then return true end end end local bb=(((O-C)-Vb)-Qb)/v if bb*bb<t then local f=((X-nb)-xb)-bb*u if f*f<sb then local f=((F-ib)-Yb)-bb*s if f*f<mb then return true end end end local Rb=(((O+C)-Vb)-Qb)/v if Rb*Rb<t then local f=((X-nb)-xb)-Rb*u if f*f<sb then local f=((F-ib)-Yb)-Rb*s if f*f<mb then return true end end end local eb=(((X-q)+nb)+xb)/u if eb*eb<t then local f=((F+ib)+Yb)-eb*s if f*f<mb then local f=((O+Vb)+Qb)-eb*v if f*f<Pb then return true end end end local Mb=(((X+q)+nb)+xb)/u if Mb*Mb<t then local f=((F+ib)+Yb)-Mb*s if f*f<mb then local f=((O+Vb)+Qb)-Mb*v if f*f<Pb then return true end end end local zb=(((X-q)-nb)+xb)/u if zb*zb<t then local f=((F-ib)+Yb)-zb*s if f*f<mb then local f=((O-Vb)+Qb)-zb*v if f*f<Pb then return true end end end local Bb=(((X+q)-nb)+xb)/u if Bb*Bb<t then local f=((F-ib)+Yb)-Bb*s if f*f<mb then local f=((O-Vb)+Qb)-Bb*v if f*f<Pb then return true end end end local Ob=(((X-q)+nb)-xb)/u if Ob*Ob<t then local f=((F+ib)-Yb)-Ob*s if f*f<mb then local f=((O+Vb)-Qb)-Ob*v if f*f<Pb then return true end end end local Xb=(((X+q)+nb)-xb)/u if Xb*Xb<t then local f=((F+ib)-Yb)-Xb*s if f*f<mb then local f=((O+Vb)-Qb)-Xb*v if f*f<Pb then return true end end end local Fb=(((X-q)-nb)-xb)/u if Fb*Fb<t then local f=((F-ib)-Yb)-Fb*s if f*f<mb then local f=((O-Vb)-Qb)-Fb*v if f*f<Pb then return true end end end local ob=(((X+q)-nb)-xb)/u if ob*ob<t then local f=((F-ib)-Yb)-ob*s if f*f<mb then local f=((O-Vb)-Qb)-ob*v if f*f<Pb then return true end end end local Wb=(((F-K)+Yb)+Db)/N if Wb*Wb<A then local S=((O+Qb)+db)-Wb*f if S*S<Pb then local f=((X+xb)+tb)-Wb*h if f*f<sb then return true end end end local Zb=(((F+K)+Yb)+Db)/N if Zb*Zb<A then local S=((O+Qb)+db)-Zb*f if S*S<Pb then local f=((X+xb)+tb)-Zb*h if f*f<sb then return true end end end local Gb=(((F-K)-Yb)+Db)/N if Gb*Gb<A then local S=((O-Qb)+db)-Gb*f if S*S<Pb then local f=((X-xb)+tb)-Gb*h if f*f<sb then return true end end end local pb=(((F+K)-Yb)+Db)/N if pb*pb<A then local S=((O-Qb)+db)-pb*f if S*S<Pb then local f=((X-xb)+tb)-pb*h if f*f<sb then return true end end end local Ub=(((F-K)+Yb)-Db)/N if Ub*Ub<A then local S=((O+Qb)-db)-Ub*f if S*S<Pb then local f=((X+xb)-tb)-Ub*h if f*f<sb then return true end end end local gb=(((F+K)+Yb)-Db)/N if gb*gb<A then local S=((O+Qb)-db)-gb*f if S*S<Pb then local f=((X+xb)-tb)-gb*h if f*f<sb then return true end end end local kb=(((F-K)-Yb)-Db)/N if kb*kb<A then local S=((O-Qb)-db)-kb*f if S*S<Pb then local f=((X-xb)-tb)-kb*h if f*f<sb then return true end end end local yb=(((F+K)-Yb)-Db)/N if yb*yb<A then local S=((O-Qb)-db)-yb*f if S*S<Pb then local f=((X-xb)-tb)-yb*h if f*f<sb then return true end end end local Ib=(((O-C)+Qb)+db)/f if Ib*Ib<A then local f=((X+xb)+tb)-Ib*h if f*f<sb then local f=((F+Yb)+Db)-Ib*N if f*f<mb then return true end end end local fL=(((O+C)+Qb)+db)/f if fL*fL<A then local f=((X+xb)+tb)-fL*h if f*f<sb then local f=((F+Yb)+Db)-fL*N if f*f<mb then return true end end end local SL=(((O-C)-Qb)+db)/f if SL*SL<A then local f=((X-xb)+tb)-SL*h if f*f<sb then local f=((F-Yb)+Db)-SL*N if f*f<mb then return true end end end local vL=(((O+C)-Qb)+db)/f if vL*vL<A then local f=((X-xb)+tb)-vL*h if f*f<sb then local f=((F-Yb)+Db)-vL*N if f*f<mb then return true end end end local hL=(((O-C)+Qb)-db)/f if hL*hL<A then local f=((X+xb)-tb)-hL*h if f*f<sb then local f=((F+Yb)-Db)-hL*N if f*f<mb then return true end end end local lL=(((O+C)+Qb)-db)/f if lL*lL<A then local f=((X+xb)-tb)-lL*h if f*f<sb then local f=((F+Yb)-Db)-lL*N if f*f<mb then return true end end end local uL=(((O-C)-Qb)-db)/f if uL*uL<A then local f=((X-xb)-tb)-uL*h if f*f<sb then local f=((F-Yb)-Db)-uL*N if f*f<mb then return true end end end local NL=(((O+C)-Qb)-db)/f if NL*NL<A then local f=((X-xb)-tb)-NL*h if f*f<sb then local f=((F-Yb)-Db)-NL*N if f*f<mb then return true end end end local PL=(((X-q)+xb)+tb)/h if PL*PL<A then local S=((F+Yb)+Db)-PL*N if S*S<mb then local S=((O+Qb)+db)-PL*f if S*S<Pb then return true end end end local sL=(((X+q)+xb)+tb)/h if sL*sL<A then local S=((F+Yb)+Db)-sL*N if S*S<mb then local S=((O+Qb)+db)-sL*f if S*S<Pb then return true end end end local mL=(((X-q)-xb)+tb)/h if mL*mL<A then local S=((F-Yb)+Db)-mL*N if S*S<mb then local S=((O-Qb)+db)-mL*f if S*S<Pb then return true end end end local iL=(((X+q)-xb)+tb)/h if iL*iL<A then local S=((F-Yb)+Db)-iL*N if S*S<mb then local S=((O-Qb)+db)-iL*f if S*S<Pb then return true end end end local YL=(((X-q)+xb)-tb)/h if YL*YL<A then local S=((F+Yb)-Db)-YL*N if S*S<mb then local S=((O+Qb)-db)-YL*f if S*S<Pb then return true end end end local VL=(((X+q)+xb)-tb)/h if VL*VL<A then local S=((F+Yb)-Db)-VL*N if S*S<mb then local S=((O+Qb)-db)-VL*f if S*S<Pb then return true end end end local QL=(((X-q)-xb)-tb)/h if QL*QL<A then local S=((F-Yb)-Db)-QL*N if S*S<mb then local S=((O-Qb)-db)-QL*f if S*S<Pb then return true end end end local nL=(((X+q)-xb)-tb)/h if nL*nL<A then local S=((F-Yb)-Db)-nL*N if S*S<mb then local S=((O-Qb)-db)-nL*f if S*S<Pb then return true end end end local xL=(((F-K)+Db)+ib)/P if xL*xL<H then local f=((O+db)+Vb)-xL*S if f*f<Pb then local f=((X+tb)+nb)-xL*l if f*f<sb then return true end end end local DL=(((F+K)+Db)+ib)/P if DL*DL<H then local f=((O+db)+Vb)-DL*S if f*f<Pb then local f=((X+tb)+nb)-DL*l if f*f<sb then return true end end end local dL=(((F-K)-Db)+ib)/P if dL*dL<H then local f=((O-db)+Vb)-dL*S if f*f<Pb then local f=((X-tb)+nb)-dL*l if f*f<sb then return true end end end local tL=(((F+K)-Db)+ib)/P if tL*tL<H then local f=((O-db)+Vb)-tL*S if f*f<Pb then local f=((X-tb)+nb)-tL*l if f*f<sb then return true end end end local AL=(((F-K)+Db)-ib)/P if AL*AL<H then local f=((O+db)-Vb)-AL*S if f*f<Pb then local f=((X+tb)-nb)-AL*l if f*f<sb then return true end end end local HL=(((F+K)+Db)-ib)/P if HL*HL<H then local f=((O+db)-Vb)-HL*S if f*f<Pb then local f=((X+tb)-nb)-HL*l if f*f<sb then return true end end end local EL=(((F-K)-Db)-ib)/P if EL*EL<H then local f=((O-db)-Vb)-EL*S if f*f<Pb then local f=((X-tb)-nb)-EL*l if f*f<sb then return true end end end local rL=(((F+K)-Db)-ib)/P if rL*rL<H then local f=((O-db)-Vb)-rL*S if f*f<Pb then local f=((X-tb)-nb)-rL*l if f*f<sb then return true end end end local jL=(((O-C)+db)+Vb)/S if jL*jL<H then local f=((X+tb)+nb)-jL*l if f*f<sb then local f=((F+Db)+ib)-jL*P if f*f<mb then return true end end end local cL=(((O+C)+db)+Vb)/S if cL*cL<H then local f=((X+tb)+nb)-cL*l if f*f<sb then local f=((F+Db)+ib)-cL*P if f*f<mb then return true end end end local TL=(((O-C)-db)+Vb)/S if TL*TL<H then local f=((X-tb)+nb)-TL*l if f*f<sb then local f=((F-Db)+ib)-TL*P if f*f<mb then return true end end end local JL=(((O+C)-db)+Vb)/S if JL*JL<H then local f=((X-tb)+nb)-JL*l if f*f<sb then local f=((F-Db)+ib)-JL*P if f*f<mb then return true end end end local LL=(((O-C)+db)-Vb)/S if LL*LL<H then local f=((X+tb)-nb)-LL*l if f*f<sb then local f=((F+Db)-ib)-LL*P if f*f<mb then return true end end end local aL=(((O+C)+db)-Vb)/S if aL*aL<H then local f=((X+tb)-nb)-aL*l if f*f<sb then local f=((F+Db)-ib)-aL*P if f*f<mb then return true end end end local wL=(((O-C)-db)-Vb)/S if wL*wL<H then local f=((X-tb)-nb)-wL*l if f*f<sb then local f=((F-Db)-ib)-wL*P if f*f<mb then return true end end end local CL=(((O+C)-db)-Vb)/S if CL*CL<H then local f=((X-tb)-nb)-CL*l if f*f<sb then local f=((F-Db)-ib)-CL*P if f*f<mb then return true end end end local qL=(((X-q)+tb)+nb)/l if qL*qL<H then local f=((F+Db)+ib)-qL*P if f*f<mb then local f=((O+db)+Vb)-qL*S if f*f<Pb then return true end end end local KL=(((X+q)+tb)+nb)/l if KL*KL<H then local f=((F+Db)+ib)-KL*P if f*f<mb then local f=((O+db)+Vb)-KL*S if f*f<Pb then return true end end end local bL=(((X-q)-tb)+nb)/l if bL*bL<H then local f=((F-Db)+ib)-bL*P if f*f<mb then local f=((O-db)+Vb)-bL*S if f*f<Pb then return true end end end local RL=(((X+q)-tb)+nb)/l if RL*RL<H then local f=((F-Db)+ib)-RL*P if f*f<mb then local f=((O-db)+Vb)-RL*S if f*f<Pb then return true end end end local eL=(((X-q)+tb)-nb)/l if eL*eL<H then local f=((F+Db)-ib)-eL*P if f*f<mb then local f=((O+db)-Vb)-eL*S if f*f<Pb then return true end end end local ML=(((X+q)+tb)-nb)/l if ML*ML<H then local f=((F+Db)-ib)-ML*P if f*f<mb then local f=((O+db)-Vb)-ML*S if f*f<Pb then return true end end end local zL=(((X-q)-tb)-nb)/l if zL*zL<H then local f=((F-Db)-ib)-zL*P if f*f<mb then local f=((O-db)-Vb)-zL*S if f*f<Pb then return true end end end local BL=(((X+q)-tb)-nb)/l if BL*BL<H then local f=((F-Db)-ib)-BL*P if f*f<mb then local f=((O-db)-Vb)-BL*S if f*f<Pb then return true end end end return false else return u end end end local S=setmetatable local v=(CFrame.new()).components local h=Workspace local l=h.FindPartsInRegion3WithIgnoreList local u=unpack local N=type local P=game.IsA local s=Region3.new local m=Vector3.new local function i(f,S)local h,l,u,N,P,i,Y,V,Q,n,x,D=v(f)local d,t,A=S.x/2,S.y/2,S.z/2 local H=(d*(N<0 and-N or N)+t*(P<0 and-P or P))+A*(i<0 and-i or i)local E=(d*(Y<0 and-Y or Y)+t*(V<0 and-V or V))+A*(Q<0 and-Q or Q)local r=(d*(n<0 and-n or n)+t*(x<0 and-x or x))+A*(D<0 and-D or D)return s(m(h-H,l-E,u-r),m(h+H,l+E,u+r))end local function Y(f,S)local v=N(S)=="\116\097\098\108\101"and S or{S}local P=#v repeat local S=l(h,f,v,math.huge)local u=#v for f=1,#S,1 do v[u+f]=S[f]end until#S<math.huge return{u(v,P+1,#v)}end local function V(f,S)return BoxPointCollision(f.CFrame,f.Size,S)end local function Q(f,S,v)return BoxSphereCollision(f.CFrame,f.Size,S,v)end local function n(S,v,h)return f(S.CFrame,S.Size,v,h)end local function x(S,v)return(not P(v,"\080\097\114\116")or v.Shape=="\066\108\111\099\107")and f(S.CFrame,S.Size,v.CFrame,v.Size)or BoxSphereCollision(S.CFrame,S.Size,v.Position,v.Size.x)end local function D(f,S)local v={}for h=1,#S,1 do if x(f,S[h])then v[#v+1]=S[h]end end return v end local function d(f,S)local v={}local h=Y(f.Region3,S)for S=1,#h,1 do if x(f,h[S])then v[#v+1]=h[S]end end return v end local function t(f,v)local h={CFrame=f,Size=v,Region3=i(f,v),Cast=d,CastPart=x,CastParts=D;CastPoint=V,CastSphere=Q,CastBox=n}return S({},{__index=h,__newindex=function(f,S,v)h[S]=v h.Region3=i(h.CFrame,h.Size)end})end Region.Region3BoundingBox=i Region.FindAllPartsInRegion3=Y Region.BoxPointCollision=BoxPointCollision Region.BoxSphereCollision=BoxSphereCollision Region.BoxCollision=f Region.new=t function Region.FromPart(f)return t(f.CFrame,f.Size)end return Region

local BoxCollision do
	local components=CFrame.new().components
	function BoxCollision(CFrame0,Size0,CFrame1,Size1,AssumeTrue)
		local	m00,m01,m02,
				m03,m04,m05,
				m06,m07,m08,
				m09,m10,m11	=components(CFrame0)
		local	m12,m13,m14,
				m15,m16,m17,
				m18,m19,m20,
				m21,m22,m23	=components(CFrame1)
		local	m24,m25,m26	=Size0.x/2,Size0.y/2,Size0.z/2
		local	m27,m28,m29	=Size1.x/2,Size1.y/2,Size1.z/2
		local	m30,m31,m32	=m12-m00,m13-m01,m14-m02
		local	m00			=m03*m30+m06*m31+m09*m32
		local	m01			=m04*m30+m07*m31+m10*m32
		local	m02			=m05*m30+m08*m31+m11*m32
		local	m12			=m15*m30+m18*m31+m21*m32
		local	m13			=m16*m30+m19*m31+m22*m32
		local	m14			=m17*m30+m20*m31+m23*m32
		local	m30			=m12>m27 and m12-m27
							or m12<-m27 and m12+m27
							or 0
		local	m31			=m13>m28 and m13-m28
							or m13<-m28 and m13+m28
							or 0
		local	m32			=m14>m29 and m14-m29
							or m14<-m29 and m14+m29
							or 0
		local	m33			=m00>m24 and m00-m24
							or m00<-m24 and m00+m24
							or 0
		local	m34			=m01>m25 and m01-m25
							or m01<-m25 and m01+m25
							or 0
		local	m35			=m02>m26 and m02-m26
							or m02<-m26 and m02+m26
							or 0
		local	m36			=m30*m30+m31*m31+m32*m32
		local	m30			=m33*m33+m34*m34+m35*m35
		local	m31			=m24<m25 and (m24<m26 and m24 or m26)
							or (m25<m26 and m25 or m26)
		local	m32			=m27<m28 and (m27<m29 and m27 or m29)
							or (m28<m29 and m28 or m29)
		if m36<m31*m31 or m30<m32*m32 then
			return true
		elseif m36>m24*m24+m25*m25+m26*m26 or m30>m27*m27+m28*m28+m29*m29 then
			return false
		elseif AssumeTrue==nil then
			--LOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL
			--(This is how you tell if something was made by Axis Angle)
			local m30=m03*m15+m06*m18+m09*m21
			local m31=m03*m16+m06*m19+m09*m22
			local m32=m03*m17+m06*m20+m09*m23
			local m03=m04*m15+m07*m18+m10*m21
			local m06=m04*m16+m07*m19+m10*m22
			local m09=m04*m17+m07*m20+m10*m23
			local m04=m05*m15+m08*m18+m11*m21
			local m07=m05*m16+m08*m19+m11*m22
			local m10=m05*m17+m08*m20+m11*m23
			local m05=m29*m29
			local m08=m27*m27
			local m11=m28*m28
			local m15=m24*m30
			local m16=m25*m03
			local m17=m26*m04
			local m18=m24*m31
			local m19=m25*m06
			local m20=m26*m07
			local m21=m24*m32
			local m22=m25*m09
			local m23=m26*m10
			local m33=m15+m16+m17-m12;if m33*m33<m08 then local m34=m18+m19+m20-m13;if m34*m34<m11 then local m35=m21+m22+m23-m14;if m35*m35<m05 then return true;end;end;end;
			local m33=-m15+m16+m17-m12;if m33*m33<m08 then local m34=-m18+m19+m20-m13;if m34*m34<m11 then local m35=-m21+m22+m23-m14;if m35*m35<m05 then return true;end;end;end;
			local m33=m15-m16+m17-m12;if m33*m33<m08 then local m34=m18-m19+m20-m13;if m34*m34<m11 then local m35=m21-m22+m23-m14;if m35*m35<m05 then return true;end;end;end;
			local m33=-m15-m16+m17-m12;if m33*m33<m08 then local m34=-m18-m19+m20-m13;if m34*m34<m11 then local m35=-m21-m22+m23-m14;if m35*m35<m05 then return true;end;end;end;
			local m33=m15+m16-m17-m12;if m33*m33<m08 then local m34=m18+m19-m20-m13;if m34*m34<m11 then local m35=m21+m22-m23-m14;if m35*m35<m05 then return true;end;end;end;
			local m33=-m15+m16-m17-m12;if m33*m33<m08 then local m34=-m18+m19-m20-m13;if m34*m34<m11 then local m35=-m21+m22-m23-m14;if m35*m35<m05 then return true;end;end;end;
			local m33=m15-m16-m17-m12;if m33*m33<m08 then local m34=m18-m19-m20-m13;if m34*m34<m11 then local m35=m21-m22-m23-m14;if m35*m35<m05 then return true;end;end;end;
			local m33=-m15-m16-m17-m12;if m33*m33<m08 then local m34=-m18-m19-m20-m13;if m34*m34<m11 then local m35=-m21-m22-m23-m14;if m35*m35<m05 then return true;end;end;end;
			local m12=m24*m24
			local m13=m25*m25
			local m14=m26*m26
			local m15=m27*m04
			local m16=m28*m07
			local m17=m27*m30
			local m18=m28*m31
			local m19=m27*m03
			local m20=m28*m06
			local m21=m29*m10
			local m22=m29*m32
			local m23=m29*m09
			local m35=(m02-m26+m15+m16)/m10;if m35*m35<m05 then local m33=m00+m17+m18-m35*m32;if m33*m33<m12 then local m34=m01+m19+m20-m35*m09;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02+m26+m15+m16)/m10;if m35*m35<m05 then local m33=m00+m17+m18-m35*m32;if m33*m33<m12 then local m34=m01+m19+m20-m35*m09;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02-m26-m15+m16)/m10;if m35*m35<m05 then local m33=m00-m17+m18-m35*m32;if m33*m33<m12 then local m34=m01-m19+m20-m35*m09;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02+m26-m15+m16)/m10;if m35*m35<m05 then local m33=m00-m17+m18-m35*m32;if m33*m33<m12 then local m34=m01-m19+m20-m35*m09;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02-m26+m15-m16)/m10;if m35*m35<m05 then local m33=m00+m17-m18-m35*m32;if m33*m33<m12 then local m34=m01+m19-m20-m35*m09;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02+m26+m15-m16)/m10;if m35*m35<m05 then local m33=m00+m17-m18-m35*m32;if m33*m33<m12 then local m34=m01+m19-m20-m35*m09;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02-m26-m15-m16)/m10;if m35*m35<m05 then local m33=m00-m17-m18-m35*m32;if m33*m33<m12 then local m34=m01-m19-m20-m35*m09;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02+m26-m15-m16)/m10;if m35*m35<m05 then local m33=m00-m17-m18-m35*m32;if m33*m33<m12 then local m34=m01-m19-m20-m35*m09;if m34*m34<m13 then return true;end;end;end;
			local m35=(m00-m24+m17+m18)/m32;if m35*m35<m05 then local m33=m01+m19+m20-m35*m09;if m33*m33<m13 then local m34=m02+m15+m16-m35*m10;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00+m24+m17+m18)/m32;if m35*m35<m05 then local m33=m01+m19+m20-m35*m09;if m33*m33<m13 then local m34=m02+m15+m16-m35*m10;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00-m24-m17+m18)/m32;if m35*m35<m05 then local m33=m01-m19+m20-m35*m09;if m33*m33<m13 then local m34=m02-m15+m16-m35*m10;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00+m24-m17+m18)/m32;if m35*m35<m05 then local m33=m01-m19+m20-m35*m09;if m33*m33<m13 then local m34=m02-m15+m16-m35*m10;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00-m24+m17-m18)/m32;if m35*m35<m05 then local m33=m01+m19-m20-m35*m09;if m33*m33<m13 then local m34=m02+m15-m16-m35*m10;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00+m24+m17-m18)/m32;if m35*m35<m05 then local m33=m01+m19-m20-m35*m09;if m33*m33<m13 then local m34=m02+m15-m16-m35*m10;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00-m24-m17-m18)/m32;if m35*m35<m05 then local m33=m01-m19-m20-m35*m09;if m33*m33<m13 then local m34=m02-m15-m16-m35*m10;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00+m24-m17-m18)/m32;if m35*m35<m05 then local m33=m01-m19-m20-m35*m09;if m33*m33<m13 then local m34=m02-m15-m16-m35*m10;if m34*m34<m14 then return true;end;end;end;
			local m35=(m01-m25+m19+m20)/m09;if m35*m35<m05 then local m33=m02+m15+m16-m35*m10;if m33*m33<m14 then local m34=m00+m17+m18-m35*m32;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01+m25+m19+m20)/m09;if m35*m35<m05 then local m33=m02+m15+m16-m35*m10;if m33*m33<m14 then local m34=m00+m17+m18-m35*m32;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01-m25-m19+m20)/m09;if m35*m35<m05 then local m33=m02-m15+m16-m35*m10;if m33*m33<m14 then local m34=m00-m17+m18-m35*m32;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01+m25-m19+m20)/m09;if m35*m35<m05 then local m33=m02-m15+m16-m35*m10;if m33*m33<m14 then local m34=m00-m17+m18-m35*m32;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01-m25+m19-m20)/m09;if m35*m35<m05 then local m33=m02+m15-m16-m35*m10;if m33*m33<m14 then local m34=m00+m17-m18-m35*m32;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01+m25+m19-m20)/m09;if m35*m35<m05 then local m33=m02+m15-m16-m35*m10;if m33*m33<m14 then local m34=m00+m17-m18-m35*m32;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01-m25-m19-m20)/m09;if m35*m35<m05 then local m33=m02-m15-m16-m35*m10;if m33*m33<m14 then local m34=m00-m17-m18-m35*m32;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01+m25-m19-m20)/m09;if m35*m35<m05 then local m33=m02-m15-m16-m35*m10;if m33*m33<m14 then local m34=m00-m17-m18-m35*m32;if m34*m34<m12 then return true;end;end;end;
			local m35=(m02-m26+m16+m21)/m04;if m35*m35<m08 then local m33=m00+m18+m22-m35*m30;if m33*m33<m12 then local m34=m01+m20+m23-m35*m03;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02+m26+m16+m21)/m04;if m35*m35<m08 then local m33=m00+m18+m22-m35*m30;if m33*m33<m12 then local m34=m01+m20+m23-m35*m03;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02-m26-m16+m21)/m04;if m35*m35<m08 then local m33=m00-m18+m22-m35*m30;if m33*m33<m12 then local m34=m01-m20+m23-m35*m03;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02+m26-m16+m21)/m04;if m35*m35<m08 then local m33=m00-m18+m22-m35*m30;if m33*m33<m12 then local m34=m01-m20+m23-m35*m03;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02-m26+m16-m21)/m04;if m35*m35<m08 then local m33=m00+m18-m22-m35*m30;if m33*m33<m12 then local Axi=m01+m20-m23-m35*m03;if Axi*Axi<m13 then return true;end;end;end;
			local m35=(m02+m26+m16-m21)/m04;if m35*m35<m08 then local m33=m00+m18-m22-m35*m30;if m33*m33<m12 then local sAn=m01+m20-m23-m35*m03;if sAn*sAn<m13 then return true;end;end;end;
			local m35=(m02-m26-m16-m21)/m04;if m35*m35<m08 then local m33=m00-m18-m22-m35*m30;if m33*m33<m12 then local gle=m01-m20-m23-m35*m03;if gle*gle<m13 then return true;end;end;end;
			local m35=(m02+m26-m16-m21)/m04;if m35*m35<m08 then local m33=m00-m18-m22-m35*m30;if m33*m33<m12 then local m34=m01-m20-m23-m35*m03;if m34*m34<m13 then return true;end;end;end;
			local m35=(m00-m24+m18+m22)/m30;if m35*m35<m08 then local m33=m01+m20+m23-m35*m03;if m33*m33<m13 then local m34=m02+m16+m21-m35*m04;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00+m24+m18+m22)/m30;if m35*m35<m08 then local m33=m01+m20+m23-m35*m03;if m33*m33<m13 then local m34=m02+m16+m21-m35*m04;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00-m24-m18+m22)/m30;if m35*m35<m08 then local m33=m01-m20+m23-m35*m03;if m33*m33<m13 then local m34=m02-m16+m21-m35*m04;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00+m24-m18+m22)/m30;if m35*m35<m08 then local m33=m01-m20+m23-m35*m03;if m33*m33<m13 then local m34=m02-m16+m21-m35*m04;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00-m24+m18-m22)/m30;if m35*m35<m08 then local m33=m01+m20-m23-m35*m03;if m33*m33<m13 then local m34=m02+m16-m21-m35*m04;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00+m24+m18-m22)/m30;if m35*m35<m08 then local m33=m01+m20-m23-m35*m03;if m33*m33<m13 then local m34=m02+m16-m21-m35*m04;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00-m24-m18-m22)/m30;if m35*m35<m08 then local m33=m01-m20-m23-m35*m03;if m33*m33<m13 then local m34=m02-m16-m21-m35*m04;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00+m24-m18-m22)/m30;if m35*m35<m08 then local m33=m01-m20-m23-m35*m03;if m33*m33<m13 then local m34=m02-m16-m21-m35*m04;if m34*m34<m14 then return true;end;end;end;
			local m35=(m01-m25+m20+m23)/m03;if m35*m35<m08 then local m33=m02+m16+m21-m35*m04;if m33*m33<m14 then local m34=m00+m18+m22-m35*m30;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01+m25+m20+m23)/m03;if m35*m35<m08 then local m33=m02+m16+m21-m35*m04;if m33*m33<m14 then local m34=m00+m18+m22-m35*m30;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01-m25-m20+m23)/m03;if m35*m35<m08 then local m33=m02-m16+m21-m35*m04;if m33*m33<m14 then local m34=m00-m18+m22-m35*m30;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01+m25-m20+m23)/m03;if m35*m35<m08 then local m33=m02-m16+m21-m35*m04;if m33*m33<m14 then local m34=m00-m18+m22-m35*m30;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01-m25+m20-m23)/m03;if m35*m35<m08 then local m33=m02+m16-m21-m35*m04;if m33*m33<m14 then local m34=m00+m18-m22-m35*m30;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01+m25+m20-m23)/m03;if m35*m35<m08 then local m33=m02+m16-m21-m35*m04;if m33*m33<m14 then local m34=m00+m18-m22-m35*m30;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01-m25-m20-m23)/m03;if m35*m35<m08 then local m33=m02-m16-m21-m35*m04;if m33*m33<m14 then local m34=m00-m18-m22-m35*m30;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01+m25-m20-m23)/m03;if m35*m35<m08 then local m33=m02-m16-m21-m35*m04;if m33*m33<m14 then local m34=m00-m18-m22-m35*m30;if m34*m34<m12 then return true;end;end;end;
			local m35=(m02-m26+m21+m15)/m07;if m35*m35<m11 then local m33=m00+m22+m17-m35*m31;if m33*m33<m12 then local m34=m01+m23+m19-m35*m06;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02+m26+m21+m15)/m07;if m35*m35<m11 then local m33=m00+m22+m17-m35*m31;if m33*m33<m12 then local m34=m01+m23+m19-m35*m06;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02-m26-m21+m15)/m07;if m35*m35<m11 then local m33=m00-m22+m17-m35*m31;if m33*m33<m12 then local m34=m01-m23+m19-m35*m06;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02+m26-m21+m15)/m07;if m35*m35<m11 then local m33=m00-m22+m17-m35*m31;if m33*m33<m12 then local m34=m01-m23+m19-m35*m06;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02-m26+m21-m15)/m07;if m35*m35<m11 then local m33=m00+m22-m17-m35*m31;if m33*m33<m12 then local m34=m01+m23-m19-m35*m06;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02+m26+m21-m15)/m07;if m35*m35<m11 then local m33=m00+m22-m17-m35*m31;if m33*m33<m12 then local m34=m01+m23-m19-m35*m06;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02-m26-m21-m15)/m07;if m35*m35<m11 then local m33=m00-m22-m17-m35*m31;if m33*m33<m12 then local m34=m01-m23-m19-m35*m06;if m34*m34<m13 then return true;end;end;end;
			local m35=(m02+m26-m21-m15)/m07;if m35*m35<m11 then local m33=m00-m22-m17-m35*m31;if m33*m33<m12 then local m34=m01-m23-m19-m35*m06;if m34*m34<m13 then return true;end;end;end;
			local m35=(m00-m24+m22+m17)/m31;if m35*m35<m11 then local m33=m01+m23+m19-m35*m06;if m33*m33<m13 then local m34=m02+m21+m15-m35*m07;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00+m24+m22+m17)/m31;if m35*m35<m11 then local m33=m01+m23+m19-m35*m06;if m33*m33<m13 then local m34=m02+m21+m15-m35*m07;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00-m24-m22+m17)/m31;if m35*m35<m11 then local m33=m01-m23+m19-m35*m06;if m33*m33<m13 then local m34=m02-m21+m15-m35*m07;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00+m24-m22+m17)/m31;if m35*m35<m11 then local m33=m01-m23+m19-m35*m06;if m33*m33<m13 then local m34=m02-m21+m15-m35*m07;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00-m24+m22-m17)/m31;if m35*m35<m11 then local m33=m01+m23-m19-m35*m06;if m33*m33<m13 then local m34=m02+m21-m15-m35*m07;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00+m24+m22-m17)/m31;if m35*m35<m11 then local m33=m01+m23-m19-m35*m06;if m33*m33<m13 then local m34=m02+m21-m15-m35*m07;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00-m24-m22-m17)/m31;if m35*m35<m11 then local m33=m01-m23-m19-m35*m06;if m33*m33<m13 then local m34=m02-m21-m15-m35*m07;if m34*m34<m14 then return true;end;end;end;
			local m35=(m00+m24-m22-m17)/m31;if m35*m35<m11 then local m33=m01-m23-m19-m35*m06;if m33*m33<m13 then local m34=m02-m21-m15-m35*m07;if m34*m34<m14 then return true;end;end;end;
			local m35=(m01-m25+m23+m19)/m06;if m35*m35<m11 then local m33=m02+m21+m15-m35*m07;if m33*m33<m14 then local m34=m00+m22+m17-m35*m31;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01+m25+m23+m19)/m06;if m35*m35<m11 then local m33=m02+m21+m15-m35*m07;if m33*m33<m14 then local m34=m00+m22+m17-m35*m31;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01-m25-m23+m19)/m06;if m35*m35<m11 then local m33=m02-m21+m15-m35*m07;if m33*m33<m14 then local m34=m00-m22+m17-m35*m31;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01+m25-m23+m19)/m06;if m35*m35<m11 then local m33=m02-m21+m15-m35*m07;if m33*m33<m14 then local m34=m00-m22+m17-m35*m31;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01-m25+m23-m19)/m06;if m35*m35<m11 then local m33=m02+m21-m15-m35*m07;if m33*m33<m14 then local m34=m00+m22-m17-m35*m31;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01+m25+m23-m19)/m06;if m35*m35<m11 then local m33=m02+m21-m15-m35*m07;if m33*m33<m14 then local m34=m00+m22-m17-m35*m31;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01-m25-m23-m19)/m06;if m35*m35<m11 then local m33=m02-m21-m15-m35*m07;if m33*m33<m14 then local m34=m00-m22-m17-m35*m31;if m34*m34<m12 then return true;end;end;end;
			local m35=(m01+m25-m23-m19)/m06;if m35*m35<m11 then local m33=m02-m21-m15-m35*m07;if m33*m33<m14 then local m34=m00-m22-m17-m35*m31;if m34*m34<m12 then return true;end;end;end;
			return false
		else
			return AssumeTrue
		end
	end
end


local setmetatable	=setmetatable
local components	=CFrame.new().components
local Workspace		=Workspace
local BoxCast		=Workspace.FindPartsInRegion3WithIgnoreList
local unpack		=unpack
local type			=type
local IsA			=game.IsA
local r3			=Region3.new
local v3			=Vector3.new



local function Region3BoundingBox(CFrame,Size)
 	local	x,y,z,
			xx,yx,zx,
			xy,yy,zy,
			xz,yz,zz=components(CFrame)
	local	sx,sy,sz=Size.x/2,Size.y/2,Size.z/2
	local	px		=sx*(xx<0 and -xx or xx)
					+sy*(yx<0 and -yx or yx)
					+sz*(zx<0 and -zx or zx)
	local	py		=sx*(xy<0 and -xy or xy)
					+sy*(yy<0 and -yy or yy)
					+sz*(zy<0 and -zy or zy)
	local	pz		=sx*(xz<0 and -xz or xz)
					+sy*(yz<0 and -yz or yz)
					+sz*(zz<0 and -zz or zz)
	return			r3(v3(x-px,y-py,z-pz),v3(x+px,y+py,z+pz))
end



local function FindAllPartsInRegion3(Region3,Ignore)
	local Ignore=type(Ignore)=="table" and Ignore or {Ignore}
	local Last=#Ignore
	repeat
		local Parts=BoxCast(Workspace,Region3,Ignore,math.huge)
		local Start=#Ignore
		for i=1,#Parts do
			Ignore[Start+i]=Parts[i]
		end
	until #Parts<math.huge;
	return {unpack(Ignore,Last+1,#Ignore)}
end



local function CastPoint(Region,Point)
	return BoxPointCollision(Region.CFrame,Region.Size,Point)
end



local function CastSphere(Region,Center,Radius)
	return BoxSphereCollision(Region.CFrame,Region.Size,Center,Radius)
end



local function CastBox(Region,CFrame,Size)
	return BoxCollision(Region.CFrame,Region.Size,CFrame,Size)
end



local function CastPart(Region,Part)
	return	(not IsA(Part,"Part") or Part.Shape=="Block") and
			BoxCollision(Region.CFrame,Region.Size,Part.CFrame,Part.Size)
			or BoxSphereCollision(Region.CFrame,Region.Size,Part.Position,Part.Size.x)
end



local function CastParts(Region,Parts)
	local Inside={}
	for i=1,#Parts do
		if CastPart(Region,Parts[i]) then
			Inside[#Inside+1]=Parts[i]
		end
	end
	return Inside
end



local function Cast(Region,Ignore)
	local Inside={}
	local Parts=FindAllPartsInRegion3(Region.Region3,Ignore)
	for i=1,#Parts do
		if CastPart(Region,Parts[i]) then
			Inside[#Inside+1]=Parts[i]
		end
	end
	return Inside
end



local function NewRegion(CFrame,Size)
	local Object	={
		CFrame		=CFrame;
		Size		=Size;
		Region3		=Region3BoundingBox(CFrame,Size);
		Cast		=Cast;
		CastPart	=CastPart;
		CastParts	=CastParts;
		CastPoint	=CastPoint;
		CastSphere	=CastSphere;
		CastBox		=CastBox;
					}
	return			setmetatable({},{
		__index=Object;
		__newindex=function(_,Index,Value)
			Object[Index]=Value
			Object.Region3=Region3BoundingBox(Object.CFrame,Object.Size)
		end;
					})
end



Region.Region3BoundingBox	=Region3BoundingBox
Region.FindAllPartsInRegion3=FindAllPartsInRegion3
Region.BoxPointCollision	=BoxPointCollision
Region.BoxSphereCollision	=BoxSphereCollision
Region.BoxCollision			=BoxCollision
Region.new					=NewRegion
function Region.FromPart(Part)
	return NewRegion(Part.CFrame,Part.Size)
end

return Region
