From e15f2453399d0506692a64cdc190d4239a7c6661 Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sat, 23 Oct 2021 07:40:40 -0400 Subject: [PATCH 01/13] vendor ENet --- vendor/ENet/callbacks.odin | 7 + vendor/ENet/enet.odin | 392 +++++++++++++++++++++++++++++++++++++ vendor/ENet/lib/enet.lib | Bin 0 -> 48016 bytes vendor/ENet/lib/enet64.lib | Bin 0 -> 52236 bytes vendor/ENet/list.odin | 10 + vendor/ENet/protocol.odin | 164 ++++++++++++++++ vendor/ENet/time.odin | 23 +++ vendor/ENet/unix.odin | 59 ++++++ vendor/ENet/win32.odin | 81 ++++++++ 9 files changed, 736 insertions(+) create mode 100644 vendor/ENet/callbacks.odin create mode 100644 vendor/ENet/enet.odin create mode 100644 vendor/ENet/lib/enet.lib create mode 100644 vendor/ENet/lib/enet64.lib create mode 100644 vendor/ENet/list.odin create mode 100644 vendor/ENet/protocol.odin create mode 100644 vendor/ENet/time.odin create mode 100644 vendor/ENet/unix.odin create mode 100644 vendor/ENet/win32.odin diff --git a/vendor/ENet/callbacks.odin b/vendor/ENet/callbacks.odin new file mode 100644 index 000000000..444c191d6 --- /dev/null +++ b/vendor/ENet/callbacks.odin @@ -0,0 +1,7 @@ +package ENet + +Callbacks :: struct { + malloc: proc "c" (size: uint) -> rawptr, + free: proc "c" (memory: rawptr), + no_memory: proc "c" (), +} \ No newline at end of file diff --git a/vendor/ENet/enet.odin b/vendor/ENet/enet.odin new file mode 100644 index 000000000..175766ef1 --- /dev/null +++ b/vendor/ENet/enet.odin @@ -0,0 +1,392 @@ +package ENet + +when ODIN_OS == "windows" { + when ODIN_ARCH == "amd64" { + foreign import ENet "lib/enet64.lib" + } else { + foreign import ENet "lib/enet.lib" + } +} else { + foreign import ENet "system:enet" +} + +VERSION_MAJOR :: u8(1) +VERSION_MINOR :: u8(3) +VERSION_PATCH :: u8(17) + +VERSION_CREATE :: #force_inline proc(major, minor, patch: u8) -> u32 { + return (u32(major) << 16) | (u32(minor) << 8) | u32(patch) +} + +VERSION_GET_MAJOR :: #force_inline proc(version: u32) -> u8 { + return u8((version >> 16) & 0xff) +} +VERSION_GET_MINOR :: #force_inline proc(version: u32) -> u8 { + return u8((version >> 8) & 0xff); +} +VERSION_GET_PATCH :: #force_inline proc(version: u32) -> u8 { + return u8(version & 0xff); +} + +// Odin does not have "macros" or compile-time evaluation of functions, so the +// following is just the same as. +// VERSION :: VERSION_CREATE(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH); +VERSION :: (u32(VERSION_MAJOR) << 16) | (u32(VERSION_MINOR) << 8) | u32(VERSION_PATCH) + +// Network byte order is always Big Endian. Instead of using the method ENet +// uses (leveraging {n,h}to{n,h}{s,l}), we can just use Odin's endianess types +// to get the correct byte swaps, if any. +HOST_TO_NET_16 :: #force_inline proc(value: u16) -> u16 { + return transmute(u16)u16be(value) +} + +HOST_TO_NET_32 :: #force_inline proc(value: u32) -> u32 { + return transmute(u32)u32be(value) +} + +NET_TO_HOST_16 :: #force_inline proc(value: u16) -> u16 { + return u16(transmute(u16be)value) +} + +NET_TO_HOST_32 :: #force_inline proc(value: u32) -> u32 { + return u32(transmute(u32be)value) +} + +Version :: u32; + +SocketType :: enum i32 { + STREAM = 1, + DATAGRAM = 2, +} + +SocketWait :: enum i32 { + NONE = 0, + SEND = 1 << 0, + RECEIVE = 1 << 1, + INTERRUPT = 1 << 2, +} + +SocketOption :: enum i32 { + NONBLOCK = 1, + BROADCAST = 2, + RCVBUF = 3, + SNDBUF = 4, + REUSEADDR = 5, + RCVTIMEO = 6, + SNDTIMEO = 7, + ERROR = 8, + NODELAY = 9, +} + +SocketShutdown :: enum i32 { + READ = 0, + WRITE = 1, + READ_WRITE = 2, +} + +HOST_ANY :: u32(0) +HOST_BROADCAST :: u32(0xffffffff) +PORT_ANY :: u16(0) + +Address :: struct { + host: u32, + port: u16, +} + +PacketFlag :: enum i32 { + RELIABLE = 1 << 0, + UNSEQUENCED = 1 << 1, + NO_ALLOCATE = 1 << 2, + UNRELIABLE_FRAGMENT = 1 << 3, + FLAG_SENT = 1 << 8, +} + +PacketFreeCallback :: proc "c" (packet: ^Packet); + +Packet :: struct { + referenceCount: uint, + flags: u32, + data: [^]u8, + dataLength: uint, + freeCallback: PacketFreeCallback, + userData: rawptr, +} + +Acknowledgment :: struct { + acknowledgementList: ListNode, + sentTime: u32, + command: Protocol, +} + +OutgoingCommand :: struct { + outgoingCommandList: ListNode, + reliableSequenceNumber: u16, + unreliableSequenceNumber: u16, + sentTime: u32, + roundTripTimeout: u32, + roundTripTimeoutLimit: u32, + fragmentOffset: u32, + fragmentLength: u16, + sendAttempts: u16, + command: Protocol, + packet: ^Packet, +} + +IncomingCommand :: struct { + incomingCommandList: ListNode, + reliableSequenceNumber: u16, + unreliableSequenceNumber: u16, + command: Protocol, + fragmentCount: u32, + fragmentsRemaining: u32, + fragments: [^]u32, + packet: ^Packet, +} + +PeerState :: enum i32 { + DISCONNECTED, + CONNECTING, + ACKNOWLEDGING_CONNECT, + CONNECTION_PENDING, + CONNECTION_SUCCEEDED, + CONNECTED, + DISCONNECT_LATER, + DISCONNECTING, + ACKNOWLEDGING_DISCONNECT, + ZOMBIE, +} + +BUFFER_MAXIMUM :: (1 + 2 * PROTOCOL_MAXIMUM_PACKET_COMMANDS) + +HOST_RECEIVE_BUFFER_SIZE :: 256 * 1024 +HOST_SEND_BUFFER_SIZE :: 256 * 1024 +HOST_BANDWIDTH_THROTTLE_INTERVAL :: 1000 +HOST_DEFAULT_MTU :: 1400 +HOST_DEFAULT_MAXIMUM_PACKET_SIZE :: 32 * 1024 * 1024 +HOST_DEFAULT_MAXIMUM_WAITING_DATA :: 32 * 1024 * 1024 + +PEER_DEFAULT_ROUND_TRIP_TIME :: 500 +PEER_DEFAULT_PACKET_THROTTLE :: 32 +PEER_PACKET_THROTTLE_SCALE :: 32 +PEER_PACKET_THROTTLE_COUNTER :: 7 +PEER_PACKET_THROTTLE_ACCELERATION :: 2 +PEER_PACKET_THROTTLE_DECELERATION :: 2 +PEER_PACKET_THROTTLE_INTERVAL :: 5000 +PEER_PACKET_LOSS_SCALE :: 1 << 16 +PEER_PACKET_LOSS_INTERVAL :: 10000 +PEER_WINDOW_SIZE_SCALE :: 64 * 1024 +PEER_TIMEOUT_LIMIT :: 32 +PEER_TIMEOUT_MINIMUM :: 5000 +PEER_TIMEOUT_MAXIMUM :: 30000 +PEER_PING_INTERVAL :: 500 +PEER_UNSEQUENCED_WINDOWS :: 64 +PEER_UNSEQUENCED_WINDOW_SIZE :: 1024 +PEER_FREE_UNSEQUENCED_WINDOWS :: 32 +PEER_RELIABLE_WINDOWS :: 16 +PEER_RELIABLE_WINDOW_SIZE :: 0x1000 +PEER_FREE_RELIABLE_WINDOWS :: 8 + +Channel :: struct { + outgoingReliableSequenceNumber: u16, + outgoingUnreliableSequenceNumber: u16, + usedReliableWindows: u16, + reliableWindows: [PEER_RELIABLE_WINDOWS]u16, + incomingReliableSequenceNumber: u16, + incomingUnreliableSequenceNumber: u16, + incomingReliableCommands: List, + incomingUnreliableCommands: List, +} + +PeerFlag :: enum i32 { + NEEDS_DISPATCH, +} + +Peer :: struct { + dispatchList: ListNode, + host: ^Host, + outgoingPeerID: u16, + incomingPeerID: u16, + connectID: u32, + outgoingSessionID: u8, + incomingSessionID: u8, + address: Address, + data: rawptr, + state: PeerState, + channels: [^]Channel, + channelCount: uint, + incomingBandwidth: u32, + outgoingBandwidth: u32, + incomingBandwidthThrottleEpoch: u32, + outgoingBandwidthThrottleEpoch: u32, + incomingDataTotal: u32, + outgoingDataTotal: u32, + lastSendTime: u32, + lastReceiveTime: u32, + nextTimeout: u32, + earliestTimeout: u32, + packetLossEpoch: u32, + packetsSent: u32, + packetsLost: u32, + packetLoss: u32, + packetLossVariance: u32, + packetThrottle: u32, + packetThrottleLimit: u32, + packetThrottleCounter: u32, + packetThrottleEpoch: u32, + packetThrottleAcceleration: u32, + packetThrottleDeceleration: u32, + packetThrottleInterval: u32, + pingInterval: u32, + timeoutLimit: u32, + timeoutMinimum: u32, + timeoutMaximum: u32, + lastRoundTripTime: u32, + lowestRoundTripTime: u32, + lastRoundTripTimeVariance: u32, + highestRoundTripTimeVariance: u32, + roundTripTime: u32, + roundTripTimeVariance: u32, + mtu: u32, + windowSize: u32, + reliableDataInTransit: u32, + outgoingReliableSequenceNumber: u16, + acknowledgements: List, + sentReliableCommands: List, + sentUnreliableCommands: List, + outgoingCommands: List, + dispatchedCommands: List, + flags: u16, + reserved: u16, + incomingUnsequencedGroup: u16, + outgoingUnsequencedGroup: u16, + unsequencedWindow: [PEER_UNSEQUENCED_WINDOW_SIZE / 32]u32, + eventData: u32, + totalWaitingData: uint, +} + +Compressor :: struct { + context_: rawptr, + compress: proc "c" (context_: rawptr, inBuffers: [^]Buffer, inBufferCount: uint, inLimit: uint, outData: [^]u8, outLimit: uint) -> uint, + decompress: proc "c" (context_: rawptr, inData: [^]u8, inLimit: uint, outData: [^]u8, outLimit: uint) -> uint, + destroy: proc "c" (context_: rawptr), +} + +ChecksumCallback :: proc "c" (buffers: [^]Buffer, bufferCount: uint) -> u32 +InterceptCallback :: proc "c" (host: ^Host, event: ^Event) -> i32 + +Host :: struct { + socket: Socket, + address: Address, + incomingBandwidth: u32, + outgoingBandwidth: u32, + bandwidthThrottleEpoch: u32, + mtu: u32, + randomSeed: u32, + recalculateBandwidthLimits: i32, + peers: [^]Peer, + peerCount: uint, + channelLimit: uint, + serviceTime: u32, + dispatchQueue: List, + continueSending: i32, + packetSize: uint, + headerFlags: u16, + commands: [PROTOCOL_MAXIMUM_PACKET_COMMANDS]Protocol, + commandCount: uint, + buffers: [BUFFER_MAXIMUM]Buffer, + bufferCount: uint, + checksum: ChecksumCallback, + compressor: Compressor, + packetData: [2][PROTOCOL_MAXIMUM_MTU]u8, + receivedAddress: Address, + receivedData: [^]u8, + receivedDataLength: uint, + totalSentData: u32, + totalSentPackets: u32, + totalReceivedData: u32, + totalReceivedPackets: u32, + intercept: InterceptCallback, + connectedPeers: uint, + bandwidthLimitedPeers: uint, + duplicatePeers: uint, + maximumPacketSize: uint, + maximumWaitingData: uint, +} + +EventType :: enum i32 { + NONE = 0, + CONNECT = 1, + DISCONNECT = 2, + RECEIVE = 3, +} + +Event :: struct { + type: EventType, + peer: ^Peer, + channelID: u8, + data: u32, + packet: ^Packet, +} + +@(default_calling_convention="c", link_prefix="enet_") +foreign ENet { + initialize :: proc() -> i32 --- + initialize_with_callbacks :: proc(version: Version, inits: ^Callbacks) -> i32 --- + deinitialize :: proc() --- + linked_version :: proc() -> Version --- + time_get :: proc() -> u32 --- + time_set :: proc(u32) --- + + socket_create :: proc(SocketType) -> Socket --- + socket_bind :: proc(Socket, ^Address) -> i32 --- + socket_get_address :: proc(Socket, ^Address) -> i32 --- + socket_listen :: proc(Socket, i32) -> i32 --- + socket_accept :: proc(Socket, ^Address) -> Socket --- + socket_connect :: proc(Socket, ^Address) -> i32 --- + socket_send :: proc(Socket, ^Address, ^Buffer, uint) -> i32 --- + socket_receive :: proc(Socket, ^Address, ^Buffer, uint) -> i32 --- + socket_wait :: proc(Socket, ^u32, u32) -> i32 --- + socket_set_option :: proc(Socket, SocketOption, i32) -> i32 --- + socket_get_option :: proc(Socket, SocketOption, ^i32) -> i32 --- + socket_shutdown :: proc(Socket, SocketShutdown) -> i32 --- + socket_destroy :: proc(Socket) --- + socketset_select :: proc(Socket, ^SocketSet, ^SocketSet, u32) -> i32 --- + + address_set_host_ip :: proc(address: ^Address, hostName: cstring) -> i32 --- + address_set_host :: proc(address: ^Address, hostName: cstring) -> i32 --- + address_get_host_ip :: proc(address: ^Address, hostName: cstring, nameLength: uint) -> i32 --- + address_get_host :: proc(address: ^Address, hostName: cstring, nameLength: uint) -> i32 --- + + packet_create :: proc(rawptr, uint, u32) -> ^Packet --- + packet_destroy :: proc(^Packet) --- + packet_resize :: proc(^Packet, uint) -> i32 --- + crc32 :: proc(^Buffer, uint) -> u32 --- + + host_create :: proc(^Address, uint, uint, u32, u32) -> ^Host --- + host_destroy :: proc(^Host) --- + host_connect :: proc(^Host, ^Address, uint, u32) -> ^Peer --- + host_check_events :: proc(^Host, ^Event) -> i32 --- + host_service :: proc(^Host, ^Event, u32) -> i32 --- + host_flush :: proc(^Host) --- + host_broadcast :: proc(^Host, u8, ^Packet) --- + host_compress :: proc(^Host, ^Compressor) --- + host_compress_with_range_coder :: proc(^Host) -> i32 --- + host_channel_limit :: proc(^Host, uint) --- + host_bandwidth_limit :: proc(^Host, u32, u32) --- + + peer_send :: proc(^Peer, u8, ^Packet) -> i32 --- + peer_receive :: proc(^Peer, ^u8) -> ^Packet --- + peer_ping :: proc(^Peer) --- + peer_ping_interval :: proc(^Peer, u32) --- + peer_timeout :: proc(^Peer, u32, u32, u32) --- + peer_reset :: proc(^Peer) --- + peer_disconnect :: proc(^Peer, u32) --- + peer_disconnect_now :: proc(^Peer, u32) --- + peer_disconnect_later :: proc(^Peer, u32) --- + peer_throttle_configure :: proc(^Peer, u32, u32, u32) --- + + range_coder_create :: proc() -> rawptr --- + range_coder_destroy :: proc(rawptr) --- + range_coder_compress :: proc(rawptr, [^]Buffer, uint, uint, [^]u8, uint) -> uint --- + range_coder_decompress :: proc(rawptr, [^]u8, uint, [^]u8, uint) -> uint --- +} \ No newline at end of file diff --git a/vendor/ENet/lib/enet.lib b/vendor/ENet/lib/enet.lib new file mode 100644 index 0000000000000000000000000000000000000000..f713886a8293a264b346dc02fe341ef41706a560 GIT binary patch literal 48016 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 literal 0 HcmV?d00001 diff --git a/vendor/ENet/lib/enet64.lib b/vendor/ENet/lib/enet64.lib new file mode 100644 index 0000000000000000000000000000000000000000..21e4edf4aea3ef53326a0cd406af655ed1c22889 GIT binary patch literal 52236 zcmY$iNi0gvu;bEKKm`U!TnHPPR8TOqurz`wN#J5&VDMyMU|)fXc?}pC(6O2t0|P#6 zt--*6j_toNFd$=(A_fL(;(~b$49Ix>B?boC;MBa-lK9NL%#zH+oXo1!`0~t>jQHfl zoSdY@u>@*OMt*TgJWMIX$w-DUfE^7{gRTk1Q4l5h zd3mYHB}kf*it-avk`s%O#bA~pDND{s%*#v7iORGV5g3P@1_{_YL)S|M)9ApP&=BDPCBC7=38=sh*otIyplbVvA znwy%3EMJ^jQd$t7Us{r$4>B`3KQ}iqF9q31Xk36?o0gegS_BJ4Pym43fut6z+Yy5C zIf*5y&`1P(14$|`zZ}V+;#3qjKs@fnz(oRONG9iLj3 znpXmK5Lmc4wWusJ85*>R@&=+YB^6x+tfwe3FC{-WzBn}%8eb)uxvBB#u!I8U!IMp5 zN(!h*i3g=cus8Df6X-P_cIjZF-86Tz)o(7=; zC|MgK26AC>Y7V@BgowtMCuWu~FuIOv<8>IJz^2dV}pK$;L-d>qVeZ{CPs#`P>*gVk8UpxkJbYvRvxV< zOI$oUT~s(e^VhkkaCmh3sBrL$xu|gPYqEk2@aT3D0I6j6=wuaOU|{fQJ|giFB(dZF z|Ns9%+V6sd4uiR`zwpbqfFv1q2r@G=98S}N@jaT~So{|SNr4Pw^=Lj~aTsK+#(z<; zsogFr8elvz3B|yI-iLf`y*3Zh2;&v5|t2fuW^= ziGdjd1A{380|ThR$HL$WXSKmuv*E1GaF!p`WEQY1KtaF=c7YfJ$b}%!i-TDpX^_j9 z89*u_ED*`Zz`(!^b|;9(%mC5>VS(HWkp-n9h?or2f6NS^lmL-cfs1LtSvm|13=mnp zw9K4TkmU>v4FCQ!Fr+gg@>()f97OSh2(U{P7??o84CNzJdQc810fKS{1A_%L+!+}Z z7(k*73_c7D44}|Qh(s_jFo5C!B7&SVLDn!cg5n00AEAabFfbtJN|33{jGz#J*a%aF zoFhRp%pk*Hl2BR?DK~;b9byht5=tTGL{N@kW(4I$P`ZICfKo|N8st)DMmZ=CmCA*4 zL7@R{*FwcWBH-37l+OSTvBaeOB1Aa_Qd0}^e-Ws3P^qe_g46_vDh<*?g~uSG+=M73 zs(G!4({u(dSmP903@boNT}Vj_VM9n*Ic#QZ3=u#ohc(1-m%|f;q2(|rqkzg}22eO) zmc#HsLSj%-4hJwWFiZhuC=~NB%V7@&28Jgh3=Abu_X*)EhoNdo|VEFO%9 zU!UifcVO^1_>jee@#c#y|Ns9_V|Hc&X@ILOz0&!?qxpzNblhQhx!ZcOgd1F5r}4|X zFfbfWLzKxN^Blt+!yH2$LqfyDf;}4FbTBY5xEen3Xg%rCdCjBqY?@1Fib@^-ltaF) z2YfnvR9-MJFz`<~z;TGbHHndd!LQeZ&Eq&YW4Rjs_t*g{(HI#S7(6;1IeaX?@i)x{ zae94J>h^5+%lOdO@(h2=3`Pb9SN`pRTrQozT{K^( zxwc*^x#h~gJ(4HQ)$&&Hc}M>3rwuQC|7dur^LXct@88oLEf1B2I`VHn#J~RdYbBS? z7vFF2Z$IF8@HxoU#a#T`#5|ghF*7tV2Vi}^6z~7s}#=wx) z39=-Z1>~;PAa{8%UVh!0HUZ?-UN^>rk0cyBuX|b^<8KS%U|`_i=EmsJ8^(0-fq*0D zaZk%@{B6!03=AHd|7jCIMyGZ9sOWhx zUVf?c|NsBaDb4aAf4d7i1A`;~ z_7D{g%@h3FUx58@#=^kh(e0yRVR*a41r&1EeR?Aq!8xGwln>*h4kp6`9><*+nVA_F zjyrLJ5>HxZ6z?%7eg+@SM-ah)&yJouQ!@RD~gi;QRIA(svgkK+!EOiT<6 zzM6-QJAi}1^WZO*w9WwDV-BF8c;IpH2TPi3X8=c9rz?YZZ;lL~BmZ^>o;1g12QF66 z&eP2Y*wY+49eC1g8UB~4Ir49h;7Dt|&ELA70URj~T%8BgF22+}!FU*?j4REtGlIvJ zf4c)8)We>ZANX59F+pd5Lj_m;~Y0VByOyJm6 zVq{?Og!$&Sf3Jv4nqy}auTSS?*A6ZZ&BLC@oxr~GIQW~z5gNUYpt$wbd<5}d1WTGr zXDGx&FSWp#kip~NV;0|D5edWFj{Mu47$Ie=Bmedw7RL@Ja0%&2>sU+iJNB-?j zpfZ-fMGWd(PsT&9kMVCm1xjR|y*ykme184^pXSKy#FPfohtN`b@#Uj`|Nl?mZ?<7! zVBp^#0LrqZfp8C90(l7H7q~|>55xQc@>7~)XAm!%huDxj6ba8y9*h@WZvO`=V;mSf zx*@3oldnZp1Sr|=?`xkcpzsF7}YkiYrh@BjZjI!}Ppjz{wWMvvwi6$eIe@!H|> zzbph~L>;Jdapd3b!oru<>7r8S+4%b}KLbOV8=@@tJkA1YKr(oOIthjcz{)`R4!zud z>GkXXe~)Gt6$eJBDdoGsR`_(rs93zz`St(5=fOuT-n}v+u7;ODl^-N>__qhMAXk2u zN<|$R55a0bEsz62wcj~V$>Pz=Bm83L4@A|6P+58nlHp&@{PX|6tKn@>A(R2qljhPH zqmtm+DBEqoU_( zc%avXkx}zU=Rr_09-6m6xe!zmfl3@`HcWHrbO7hU zw9a5QAI%347eb07m(J_pY}x6el3;k?W#;ey|6TaEMKd-ZWCl4sfPedW*Is8vmyQ^f z2(ZJmT=};jaM3&n@IKQw370PATp=I-N$L7OKX|A1-JZX-NzZw3Q z3pCWIWc>E&j#07TZ=3Y%|9=oOz!g*}ZF5GH6TvKw(8TBnZi-zh6?0@fU;qEVwEG1rkG3Clxw*~^LF|NjSN z*#MW$<1U)FK(%#-Bmeqe;5sgafBP%2Pe4sh{%tNQ5zPmfQKPi6MkVVP1E_>Z;Gcfr z<Kzk{3gSr z^R(ef-_`@5JQ2q~<)CltNl^RqAb)ETsE%yC&EFEq#K7RwUBm$z);R8>0&Ya^gET2Y z{XPbt?kOr4KmoTC)CToo{NT~O2Q1*hya!yvf{H{1k6tGM5W~Q;*Wtgb;Qq!^g)HG1_OVK7#paK;-X^U(VU~A!RXUnz~Rx&;n92mVwex(M^I}| z!3ER?igV@PrsmO`qY?+I!95vo`&i!QZ@CSw<4aU5K#2@odA801x0?MJJq|u&F}&o_ z%VG?w%soJry@C&Q z8-MEzCI*J)W30^w*j)|Zra5*NgKBhV9*@p*;0A!EEC2Rljx<-0(g%#-7JxIX1>n>x zVvy$8=?u~l%#-HY`j)?SClk2!9nFX2t5*I0pd41BV!^-NnZuEP+Zj-+pw)tzfx)LY z4(u^k!?z%xxpXKv?g7PCnoDN}uj5`26IPT$i&13Hbvko&9!l#BW#Hdl%;VB|!tfIR z_LJYgId&f8-|o!Cc*2o?{Xtj$^=BO!54@J-muGP4JmA@Uh|%%jLym(lBpgAxp~LCF zb1w^ri{SxCks<2eG_*-{? zYW!YEa&a~M=0Vu1BDhs-uO~b5Z@&i8cJL94Z?BE8BmXvcM0ps_;@II1Z8y1tYZzHa z#$%5B+ub1zr~7|F<^KZ~PsZb~kMheiK#N7sULO7z0w2NUqC2Rla%V!)R(kg3^1smb z%)v)2p!UrMP~9Q#z~I8a{e|Hrm(CL|{M*kte*fyizy8E)1w{EkM0^TEXN}GP46?nHQ++ivvY3|8^H=>jclKt%(jT@>fpe2nqsEl|4)+zxsTN|Zd!2bj}3oxzRka&Di_dufi1e||BP zb@6Y{=12o&AVqLwI&=AS-h2kMT)@)$Hbb$;?-yyek(&80&L)VbF@mgdr##0$xGptJ~Sw)}&oMNlK#L-STz zX8{YSh0yq1IYpDBu8|3BdPb%s`t&Y-&gFQ|Uh z0!2yZ$Cr}7Avx$Vf3pmzc?W5>^S4e0mBG+*2_9yK-#i#^rF9nZf`&pgkGXUx5fNf+ z;1G-c{r|sf>wywIP#Gfna{F&kVh0U+GWb|t=WkgKYV1J@CZs~C^s!Ip1yEfKs;pkN zf}9M^92}s`vHh#zTTq4I!FUhUJ%=@(!&o}p!1=S&4V*nC7?1LAcY|b3P$mN zuTMjBrU&E47v*n3Eoe8Uv`#lBxbo7gFUvuhx%1=8Ge6-G4o+LHov&ScQyD>#-h7zZ zm4EvimyQTV56v5%ou5JRfAAN}%M4IcMxJ3OXb1>tya_zs72(l&8Y}@CtV{9ALY^@_^|BqW~v^z#()|s2-3Riy&rz z1|g8=8ycZ=3=qwx=f7#Lm&f##4H7(NIwFtiFYFt`vg z51}E0y%{3?LqC#zR3tf#9r%sj;C2 zNSy+B)`J}sPz)dV85p#{EX>(w18xQe9YzL*7+$afusUqB&k$Kul9E{u(2Qsd+Ef;{ z+2;fX28J^rb35>nD*#&(*UcT02(Ome1T8_>b}5?WAkYK@t?mX8KkE534cou$l%ULFvD68@OM~( zx}Dv8jypgdm0chLVm@35RHh(=7#LU>c7Ym=Fri(bQo?ZuNE{~Q(Hq7AW`oS<0*w-v zDR}g{|M#%{&%nU214MZ6JO2PHVRlpK%oFhF_47Cg>SD&gD!@)Rh3*y=P`T#OS)-zn z#-9%k-cC0WP#>0op@J1OqUdm1Z5^O_ZU}P%lzF^u2P6rDlpa7ZPav2a+Te(1@;Kf$1FFm8c-sa9^8r*XzhK)1 zEd~aV_56ZuFTk$p`vIof7I490IMdAl6s;cJVHzHc7d$Kv@i&78#Xa_OzEj@O|G=)v zqw_MNci_=^!=tlUz@xYO0m$K+7mhhA{`WZegZY@V!ha9`^~XJqJA-N_hO|y+DR6jt z^mc;=Okr$LiyOukV1zlMw_5?u?!4*Ico^g)h%$8d9p-N;2Q}8g6LA)>e&b=-s)lYp zkLI8MOIRVAyZtmEjLwf>8Z<2kn!rQo^Xz6(@#u8pc=_@#Xm$lD)xpxF2eAnclIFn4 z4{X`XX&@sJVF#KG1h>{SJUY*LfJU3@Kw;R;30Ca^_h_7k2jdM7%frP*X%jqfg@&Jo z2jdA3%fm%?J-Wf^0Mv{V_2`}kN(dgUmr6K2IuHK8{s3j4y&%Gq-|dA*raLq}m1}q~ ze(MF5Ph!uC2FApZoOYtYz>#_>=`vo*ee* zbaMa~DcPWzjBYlM&ODFfZji~$PB)cqcZKEyjGgWZoo+JS?joRaDut1O;ou8_gAaIY zA;p;wBLl(T3Nkml0qtd{1| z=?zUhz1|KU&4&XZ(RAE-8z}#|8eZ}^?z|7g^f>N(3`(B^)7@?kX)c|?TYMN_fMRI& zjwaC5$#y>}(7>GmbdgTCEJ$s4AE++^5;x)B?xv7-@BjyhWA^`YcOS^roh~XC|1WpG z>~vAF`G2|FU!c=P#R0?+>2y(X0jXNTz`)SyqT&H!&w;RgK|u}2pD;E!p~LdqX^-wsP-zM3X||p$;q&NjhGdijB~1S>c(i^iQT@!H&&Ds< z3{v%(Ki^M)U$A=x7kD`qWV#>he~;r}1)!*d*n>LV&*0JPgjTCu@aPP*fUg$l3>0wb zbQC%6r~<0k4o^TEjjizPJOlQ$W9Knf?GhD<&clw4|DH25Fz~ktGBGfCcJEOE7399% zEh-v@{V*-sUu0OWxvTu@rXLpH;hO6PF?~gn> zKOB6;=Gb}Jvl|rcnWw-p&XVA1@FwfPrgIg1N(K#B(|ScT<@qG!IK z9JT?pgfG)a1)Rwp_k&Gm{0PradqFA7)$(#NuS@3*!%GJrusVMK)Opm$@*ID2DQLj1 z^CM_T6uxS$+tH%=1#9yU#`5BB$AH!YB{`OnF(v7a{OgZ7et!;j>V@vWl+FwM>yI9M z!Rlgppv=pq^T5Fetd@uP+xbC0?!0Pv$?^Nw&PGt(Y}wcYT7$;c38p(EW18PHx@sPF z)jV|E5!A+FfDAqycT53CVIw#N`dFUiZz}r#|9|WM5>D`lt0|bn-+G9Ffx)rcMMVYV zb&&a>X%_>>?iv*V&(4pI$6Zvw)w*xy1yCq?GJXQZg9Nx-i&3%RmuCP^%76dtV|lGO z#G~_*;oEL6i{_WC%|98-+KSj*0-e_JCDBv^%W3#%%k~81tOO^#veWo4hB%-0=J)DzW(?B{|-o`+~RL% z1;?HXB=$TyKY22K@BtOY5}*P~-i3joyUL>1|2N2a>XuP4B}$!5AYWTHK|>WxA9n(W zu@snhJoVyUtsnkpqL5d;b3a?_+t5zuEo&|NoBr zxnP&7jHSZZ}v;xt-?HS)$_L*zKbt z^8YHR?6ZuED6#GQ3Ff#!iZ!3kS00@oVMQG{Px*HHsA%|tT=#kgQtAW;QMX?RMEC0h zNMjchCNT1_Gw>vF7_cX>6|e@d9ALV@z<@HM!N3v9S(Sz1GZO=YD%iZ=aF#wZ%zaL9Rw$g60cTBPhMBUP8D{cV zP%MGXTgCzl7Xwz9n{DB&R#pZENwB&eRt5$sFiW0|fk6$-TF=J7pblm&VP{~_1hXb_ z!PNcWf~jL>fw}$-8)SS7)Z1ZT;0CW@1+gJ4&Ssd4 zK=BA+fl3RAEGWbvVxSQy2n#d<1(5}{^C4oOln7ygMxY?Fpiv-*7-$3v!UByzL1aOr zClE2vYE=jelx`uipi~PH1C1O(STPI?3=mn&(JS!i0m{e~D2+qA(hT4cB~Xb75=6rw zzcw&~8a1GC7LcS70|Nsnw}Ewm1i+((pge~V0l5m4^AIB03=9mQ{D%-}2IXLOWRvGY z^CCnI<_H%kk3zd{V0*Ex!i7p8QRIzqfpRXAA)xUkr1kKSRk)y19+W;1>L4RK5I(3I z%ghK$QxHBfxeLkxjmzL#se2Tv21J2+^b8CaK};xyh}?zpK;<42LvCs=XoCn;3>IJD zW*%4!Ch`Z&0}(J0UU=-oM8M52kP`43U=YIwLroBd2xtWsNG-%YAXX8Enl=oP2^b<9 zF+>hvh+IJtdBn)T0117>nq*L_k4N5!0v15o90C?W*=hn7q35PJBv;4BXXX~fXO!gU z6*C~%&>dmOV}sC*Dad|<3SsQo0qtqQvb_eh>jq^j57^%rdyqgod*YK3oAnAn+r*Hz zuR(1^2~)&yCRjCOyA__@UP!yc62be9P)q~wdjjo(0y%}05l}-zGo%qvP;O*k*vABE zEr9A$ro*#b|?5Szgxn@HsiNEB3GoMB{O(12up@Z1AP z9k!884yYQCJ`e_tfP(hlfL4M)x7noe=N#Y{WCZV=0rxCDIxl#12Xc6Ha(HwGaCmew zftFAst@HKhJmJyp$>Gs0;L$1Q(dos3*0b~J_Tup9yx`d_;MpnY)9J+lF)e_@6J#Qj zPp2b_jtPbbJh}xvEKijPLDq$PbPIvk2wI*h{Q{aF1Mi_x0@V+w7~~&N>k34JYA4X1 z7*K5vszrmKb6ud488m(aDt$ri^R>_&FogEjfXoD$1(~aYus|eap9-j@0OC=92MnmC z05KWVQh=~PEd_|ZnDse0FOXHAgIbxOP=nO5Ape5w28A6$#1T|igWKV-+5pt@0EHt& z4RX!_C0u4kQ22t(LSWj>J%REI!X6L{bM6V0S75ChkO~NnhfoZlvH)AHn+2-n!Se}- zIs_Eb$ORynPu^~2q=Fu@85vQUK{u#?Cu|^W2npN6Vq|Ct*;ELg%>lWef#Dsry^O6a zOJIiVVR-;*@PgJogL@FQf=B0R&}Kzrk8Vc= zkQ15yU-;(C!BWcS(d{h&l7WuNci!}9KB5o}Znwck?Lh)aWie>0O!FJCiJjLxECVHq z*}ge)u#|{V zV|k!hdIG3m?>uGX@&Di}4*qQ?9gRggJ1=@#9w>e0+5DQ(v-yyKXY=p>r6;~$jE?j8 z59)m~fJa_IJ!S^S-JqU=Yv)0i&VxHZC6#0IL&g&B9iR=fjypl4j^7S4Ir6(4bnHCn z*nCpq+d&pbepe_@;M+kC1drp}K>-Ah<=a681dr+4K?ekn@!(5#5U=y#!H1HLohKa| zKW>*j$g-lrk>B-XFAFEgE{IU;Nk@K-F8hts9=gek}kAPYSY zg2&`x;k|;fgu|ut-sN|WoFAJHGG6@A{8ORym0KrIvuE=GM$g6{pjjpU)*b);|3A+9 zhZ$0#!eX)2>fitWh9}`64_cFgK0?FF#K3CAXu!zM!oY6CY`~PjSOD4@0b6mh2$ZRz zdnms#K-QRmtW0Bs?6WIiWMGJejtvm1gF!1vAnQs%yAB~NP~8I(XJG)1;Dc%a76#BH z9E4@U2wQ97!w6f65(>4Mg`tFzfdP~_Ss13kS@+?iCokb*w#+bfk<75Mm8T34_d|*x z$SM&K8^QwB)1X?0maAAW>wak6fmZv2+yRONa19NrltCOc3>qZ@wQ|8~z;d9r6DXb# zBA%etDvY260;~H$V-29Z4;pl1W=Jkd4gnp*0MZT-!E6nHVjAWikUDbv=`5h2h8O@P zk?R|fBr_wZ#(_#gDdf6_6*R(wW4A19$1$ij#nu`C8HYRy0BKU!fP}#q6h67Bxyc2U zU@o|Zg{T2-mV=0a)J($Cs({2HO5YSJgwpqciea8vk_kV;CdE0(+1LoV>x;MJ2=1GK zx@CyA2jR6Oh6YAPkmd*IBm>Zx1p|YIB4j5zw$_J%IAkr!70@6a0|Nu7-9<@H3e=j1 zgeQW;*82Ftz`zg#DiRRN7(lHGVfreoj7#KjUMX)+>+Yh7yfLSlg|a#li4^qveI-58dE7neK_8nMunFWe%DbAS%Jt@!_-yE)ebA6G4R_c=m#M zB52;h#qy9Nzx#zwFbAoXa2#wN$VCtn!oib$;8sI-CultZXtJ-j8O*XgSOT5D1vL@A zm9X(|a}e!d^XM**@aXmr@MzX!L~f!$n?v1h5+0h(ps^Vb@NxsxRtIdF6fDXw&j8)y z+x*7Bqx0OiM$pn>M*h}o;N>iR;N=p%^T3ql%@P@YdDxN|$TAv_Zio`go2Ab^y8A$J z=+Qe5Oj({Tm3Zw0S_=SI3K73qq62BwbbCaATz}7_S(CB!257bgI&%#=^x^e!SSzc$ z4^$X>^v(lQmZwX_URxuYNDxWO(v5Zdx@iMdDTZ_uiUZfl58w>Q}DTp+*mx7dQ_7`wd#JX%kd9`QhE zD?RDa?dJeqbOBna;L+{o0bW_~3A6&Em!$!+i1&mCXj|V+uvn#mM{lNsN4LC(kSX^Xg;ps(R?((1KCqQ$~ZhaufGIs z8G%@M+zr&wWbiod1{#P59XVnEnMFJdmVdbuwDS_ev;^&g2aljY_?4*qwB}`?g#PcP z1o~nZ2Kd}=nRItxfJe8ZKH^T$R zn?Nl)koyk4WKMJGYyt)3@g|TYNYLYW6R6~YGQq1}Kq=~Y6KDz^B>LH7wMXa0_?Io< z#qSObF5O-MuB|6QLA(+gS}Vb!_3|ZXVa9|VUlW^kI%$5F1Fo$ncNmm{b{V*w=$yEQfq}uLvk~NNm(I>DU{heNbVRT9x<}_Zm(HX7 z+kzN9tOGrYtvz~0Cb{r$cV`0cWMmF>;NR}0=F)i}?cfWZ&QmVE9s+3xU-6_lTApy^ zcRI+w{Zg+N8~^qLmIrI1c7jqUIO##VzQ+99-!{9YaCr1WO3cnfof!h3`SaQN1sy~_ z^XK~u@C$mVeCE#&SKt>6Fo9~l0a>mQAB#wD&4)NFFVxRBy#4wCIDNz2-<|2ezpYBs zqw^g9HZKj2&dXpk__qhEcrYGf3`=RK*8I=k0?OYG{M(N6ZwuBy|t?OfAoTa?{ z+xyHI85qEFIv%}{^11UC%DSk(%B8lM*pvMzI5z7^8Z@r&(5R&uk8foA=oHK>wyvn!;`zZ!JA_f zbkaHlG(14t(mYf^3xhHYItxsWJAm>ogU4|P&~zNA3jX}FPuJhFAZ9>E zTjJthp8W+<0$O9k;n9p*Kpc0r05$%=K@t}aTT2P?j{(d-;8h{o9=*+wdL2yhx2$Gh zU^wn<0qSLRP6icS9?eHUb;;qh3B4Xan}0Huy=y&C@(L7dAu2jAZhZUyzdJ-lr}H9} z1Hk?d$alyAV1N_=AQyo*-FWmiL)uPYioezI|Ns9lTz+5EooAdGziERYis;`30Q= zAeE7G0>7X$QibF!!7td1QXx4*YqDn0U;(Jg0aZxHouSoKGblrWL?QK3GpK+DaY1>C zU$7ZmFFDB=UP|li205*>8C);j0M$#)==D-s=VVY(aJ(6*dOF?=id#?_m z7p!Rn5}mCFN(>x#y8H(nL2#+FLI+eTxO94eatJg}q`81{3ba&sp$^(m-|Z~`)(y@f z!2*yR!rz|#@BjaoX`pBYmk*%R(V~$?717q_d30Xo-*(Bf^NdgDF^^uBNgW|7D&S@# zv!es3RPpRQ$luBjYVBJGdhj>1f|u*Ls0es=dq{X#cQ9y!me;=rtyt@ZY?tYT4#h#T4#kGBBU}@JUR;^ zJet`UU;O>?|G(jZm!Mg1$c&X&uZ!h>!%LpuzjwN*DA=U)T%kRe|zLFe3wl z;cdhJhL=1b%fMcCgPL#f`lK^L!I6La`81c#3a~3dTjEt6JKQut3>C)?H%-uXQnfV4 zPB$IU=24CR7rK2^6hM5v|5rPIHXmnn>~u5uf3@3B!m-oMK`{7NQia2NjUY2SbKC{2Csn!HEldJFMtbZPs`&z{O*wL0iKW@5v`yy1AID&kL62H zZ_Wj_lpVS)0w!1b65KiUXg=ZrX<_@ae63@{$u=SAlXm=yV=OrnF|z{)mW%C1~9(ED3-L@6O{dfBgObzw-y!W)DU-AIq2gE!tq? zA^8vNPoK_*9-W6?2!Qtab^E9o_*lLyeP(z7ya5(w9B7cN^Z3h^s8!qqq`e~=F5OF1 zK#un4JPQsYkIw5poyS}|&w?$1w$!XYLt14TuvVD`xK-xTnE`5?H za#81FpUy`fy(>Z8$k#dW_Ksuc3CGTZX^sb9@T55&e8~ek7O7bplz^KL2)OcZKM6Yj z!?F1wo2%tP{$9`)WS?$j56fHpEj%DoyFup@K=!&gegkg|X5?@A1!|IaOM@J4`MD&H zf19%is5!=2;?2L^TfmWjyQ^B7<-yXHZf8*YLKke>6VP5*tfsvMoj=rh=k;1}dBnfn zSt!l16SVqS+Qag5=^_uyPy8*3pIB_2NA$s8V?hhJU? ziGgN%;0J9T_Uy)Gz*q1}(pU$d&Sx)uAoVlIjLAsp8Mo$N;Qo$B=e?IFk<>%lGYX(l zq3$39kIwTxorisT!wh^ZFY&j4j;eI&cJgp-J;2`zYNYaScT;oW-|i*Qe1I{{#qtDy zE9ewT&&~^=b*iAG&*0eY0UBn=bmiafApmMZJ6fJBjdtwzaB=B8;oHs7da~Dr<3DKT z#@F&f>BY28H#NfpzTFNS9=-jbs7vc~gACJrYX=8fiGfG2n}dg?n?s2lXn8zn$1P|z zJE&Rv^8cUz|3N1BSRN|f32Uf%bh`_9bpAqwe{(Nwv{=yUGY!!3P2Fo$ zW`L4#uSo-V>oap9s4imzZwUhooN&^G;>7WX>JDS78@@5Gq|8{4A zG|NNfPhAbc%Z>#+x*I^-qdYBJR6u=a{$`NpT%h~5d^%6T>L5rdUQ!D#yTD1;v-2n@ zhem@sscEjAwcwlw?p8YT3%Wx3m5%&^zL1WkV`r|5Bfns%iDPH3hi_+Tgy(TrP|J&< z^(}u3XuVhCUvPEV76B?bpgZI|o9!4%xqP5okmeA82fyf4e^m zq$qX)B|@L>9u<(VW9M;K%MUJ{2l-o?z@uDo9v;164&Wl?KPZ`RV+Ti6Nw%xyhw_ND z36Rh^ST5;e`GLRb&cFZv%lRN>isf@&>#aVdt`Wbjw-sErbgId;Z z1InlH`X1umL*<+xU2UM9v=EDLmOgzc4KkxQ&cW62|4Si|E94y*nvcpKe9P)_@F|lA zEQC8<1Het6PEhHAya&;FM6~t!1n!r-P9KZxhu%K=N10y3N17iVb zqzH=9XDiY9Aajh6%wfecn+clP41&&Vf_BpVw(cFY*4+qg ztvkqEBdEC`vz#!^0@W^{P790%t;Ph+Zh`udLM)(s!oZ-w!oc9p0$Nwez!1Q~z)-^i zS!vzC!oaYO6|&NK11kf=K~@F^(D>X1Rt5%k=o)wdHU@^%Y><<1FR(E%uz?Oz1kKWN zFfgpHHpSc(q!1G?*3=G$K7#KjA?Ew!1 z!xMf6hAE(3>HG`~xdIFfps}w40S1N@LJSO`4%G%B28LzA3=E+D(*|J%2GG0^XnbEq zjDaCSlz~Ayf8M&Cfgbs#wq8#Dq3 z;)5_uEsRZQ#(5(HWM4E3!&L?bP&b5uh2buo<;Vz=^<;#}g65P#EB{#-TH&(u7#SEq zvym(eC*kUD!DT!fG>}Z6mTMC!`2xt9-vv`~Mv%eBmt6>LAcMY8D32%5I1q+u*X-m|<>t2xonSvlv-mb{u7at>M1`XT5{7{=!*2 z@D=_!Yzz#bx{QTkIU555=%i*AhSzKi4Eo^J{CVuKHT<$1u(kf-955ZH;4FJim~0Fu zOm+b$B-OJpIB>yaW4U0m3%OvjVcak`XTn+aaMn~fYYCi{!UHp}fCpyYIv$vLjl3{7 zPv?cn^7FyOjQJQC48eZ$<%5~Biw}}lSr|_8!NTApA554v%^@RTn-xOg{;+tus|y^K$E(V6&VmQ&`2zV1sW-a$b$GF%nWuV zgas-|AhMuc9S||l!Y~L6l(QkSpwbm023o5LVSxsjAhMvjWQZ7O_zA)S?dpKYf`;lL zVxV0e5EiIe1d#=;w19|#25ccL(5?=MENG+(A_m%424R6pYlv(PbfpS2_>6goENJ}< zM79Dh3o6GUvY;k9L>5$gL&QKOJA?(ASBA)fY9@#nsH}&uK&?iIET|^{5d#gdL0F&> zZHO#r76l>(sv96I(8wD^7Bqwa5d+PWLs)wl7#JY3pc(`sb_DMF6L8rxa52z89Yh_d zo`L9vtqo#k01ebZWI;6#L>AP)gouIKHxSkvxXG||#R6LN0=}(*1$^nMK&Szw0#JJaAp(kTP^$qU0*XaY+W{f63DiL5%<2n7;gfG~X_6p{$&;7c$Uwq24T6|M%B4nZ5O zA!=YE4H#;sV2CWh5ZQ4u;4Z3=z<-MudAX_e}9IW9}pZt(Y3U9%@8i50z4y zn_KA&xlc>a($Lb>1pA^p)SX+9#dvuo`58IT9bF(c^r|TEUIOHc&cLhlz=uCUSN@@_ z21MQf2G)wa4WWSei>ttTk@j?f`ML1h)}U5H_m;uTg{>DfP(T0(8$!Z%Dj1rYnLw^3 zM64C$Gh<)?uQbJS>rsL(WUZhLs9D9pzyP|!h?2E}kerQ5V!QPS)DG$abwQAng4Y0| z?YaWB$vE^G7PkLDXy!ed2U*=eKV$y}G<*_orl;n`W2z%S^^@R>i~+k#)v7c_Di?7=S>ssP@| zAj-tR(Cw_?!R#d9*?dF+bkh6}{_V~xKAo>U7>|RvA3!EFyVWpyG#@qau#QpD01f>* zYqT8T?*yIdz`s3MfPb5}X6N;^gYS9LI%`ydJgogZ_?tm%<2`zLIzb2edocSsfcD@y z@V9_G>C)|@5&{}fZ+Q!fp>AnV?0{nvWPa%a-_EbFwL_l0u34U)FMK;6dTJi<*s*#Q z1b80&!Q#We{(xt1D=6kYH4l0o{K?W>XTj#%*$PTPzMZ|GlmfZXq1#0z#smE@VaQx2 z=-f+CWHWd`0v5EAzB@!E0<_BmoS49l1C7=)y!;26;Q+^5XD*l-qvF87-C51I^>&GB zTI+#Q&|%XqDnYwIUUBI>c==J9BWEy+BmedbX^zbX{K%Iq7X9@oG7dnGwe0sr)J$)>}6n_io)&|g`!cHF*$fSx-w~va4N9Q4* z&XeE-;Mncv07?X%&LW^FOml4X%V20=Yy)))UOobkS2}>wL9_-mW!R{AGJ;Y^EJ!rj zf?qHdlsd9K_yuzn8mcuI_&Y(z82NO*_U-)h@+a5;hVE(LG`W5nsMFyB$pE0l&D;mF z=HM$<7t2$Q{7x4wFY>n^0ByT)Q2}-37+x;<1Dfz>NNarbpFfQ|SdG6GG)(Nmzx}*N z=XuB8K>p@O{ArCffo%Wz`P)HfZteQd3_5WRw609^q+{nL$IHK5I!|7H1R4c*;k?v( zioeAJG{m|WG@uF}D|TddbLey{czFpr7VOb^)3@`FPv>iJ5WO`1`~Sah=U2z$ZjdOQ z3p#fdv>4XIvJDj7{H+&2BE4;(R;Pz0nBs2*9Z=%Y3tp??VF{-ATUUS<)=b+0O25#7 z`*gQKMHgW6 zf8F2}9><+6K+W;vY@oF5(HY0l=_Uf231tAUf7XCaVIOY(!C5*Ls>K~to-%;e@26EudQvK$Etx;;++90z8nf2U?BA2HJ@Matzo^ zA8V+dOwh`WX7G9zMo=LModiI$4wC;3zrC~qDTkFeX!TKrPd9j1mS^XAkIpG7pq%Q_ z?Wy6@nW7Tm(%Aw&%-*-#-2i$#jpK25NOb}_pXMNc^FDUa)jcagiOIL~uV?4`37);} z0-*D4K<9TkcDH+g&J#Mo-?9~Sob(S){+2b23=F>Aum+qb)LPsS)dBd!L!%Z!?Sm82dHlB z%mEb^E-C@9ReU->f(!HJ!;sZ4u$d^5`c-|i>o(V5NRahw@62<6%7n&9~V$}v|4Mo0c_VWMfBu1p=F zjA@;&pkmNZ!14c;v`$wxNB(VY;Q4SC{?Z8UQH=I+4A-|7dJ z4^goItzUqw)lYM5_IF@>X#zSf2oi?PKbXom9FMz#Q(W^8#uCovAI$u1G9aHf?*Ydf z1ApszRt5&gVkVPp761}z~5%b%D~{+dHp3jxG(|@JTW*PcLkR`NL5+q3m`VQ7ZmHz1wx+P@d}^{%AOf?@)y64W%`6NIuHC*4E}bVFwcQ(R z|3|B_^0yU&78~`JD}ZM96+J-y0nK!_fBXNx^*{-yucbYIivXx$(+y5v;Dfv_f({7l zcJFZP_H_Wwc}FpWjuZ3m@aTWJUc*rW5OXZKW4GO&v8CPM z7KdZEtAl5^FN0_256|9s0ngs);AGm_Uh)6`e{d4_?9LbHJnmt6w^ZsSD1X5xDZBFp zJS^|>w{U?Y#a>E7T2 zDmRvc?yu|ib@1r?*zG6+aznSHgh#ib<{`(qATDv?ce~_jd7=D_Yj=2yE9kZc zYfvWcbZ-GI{3`ta|Nl!+iI224p?N>3jAScS^Rz5iC{^&av@ex*?4AzF!-)KgP~ZBW zzXLS; z&;S3woCmI&L8Hx}qxZJEX1E%Dd+7;kEXXr-p3*!72^#)3(D>kfNt<=>rbF|8>HfXy%>># zJYcm%=>_l-Zdm#-Jn*s#RItGK9=)uf?n3iJevfXJ6Ne{&mimHrmVtAmtKk9A>BcuZ zogKg{abB+b{{KJfj(GI;S?6VNKMZup&~Z@6GQeAG$DKeGDuc&yC(y_`gGV>C`NoB4 zz8ynvzJbn-Ew_O--ykR3cDI4rsK?zP%{TB-=pLQL9G%W0yFqP;PSn+O6F}{^DNsGI z_S;9OhU1{sr3_$gVDF;o1*Zp}-gS`n8<^s6aRuE*13JeU;u?=mXGr@^7u0?O-G0FU zG8}BCk2O?J1}MOx3&uP^i=7}vA)0m2_S@~3pp8i2Qw3jw_A#LZw*v!8d#>>fxRUNX zR820FdF69Cr?0Fob2XyEyI1XD6@OOBCjuCAE?OygszTn8%qH;qE z)UIezc>tn2*QkKboAv}Xe?cdUHn*tU0TrpBRZ&Vlov(a4AO61pb~*zyG^mz?EBPrZ zpu?#>ntw6!w|xbRw17?G-wwXdDFCvR33Os9s7~%Y4qAiR_?+QDnq%X`|NI{O`>%sW z6N)@KFM@h6piA3+*?S!PY436HpMCQqCXa*v?LC?w{_|*l_RpjF5L5GWCXdF0|M(dg zJQ|Pv0#VJ!*?e0Mc<{S?^x${-l?J+;hM&Jhn;Cp*(n()yAJDi?G^py%JPB&H`7-;c zXgGEUTKIOJ12wN4K({sh;^c2J2RDfVRU9p+fTM%Im>g1 zmkW0uI{1pG`4O|DRhS}wD!`}`%0KlX3g9mgZ>;b5>10A8k-*OtX6t&le$;0wKe>-S=zys8? z@aeql+xo4P%c0>P6MySW(9tW~y_p~}47#-pVk+oL4hQ~i-#n99w)-&t`2PTO7on%M zn@4e$BjOm(IMCI+5Uno!+fR7)>hSwo_o#ptsFXW_f)A7&JuHtFnR+s}K+>4y(Q=LB zE-IjDYX+ZQXExCBo{-?X1@GK|DiqKvdk@fEpYXN6zO8Rdq8+<^8Cp-41oO)?fb*nB z;}K9n0qfKvuQdeK)`)!EVgb6ysPiE>E4|eI^Z!4jcG?Fwzd1(*)QQOewJti}K~53( z>3rzYoulI7)A{K|&qr{+FF6kCv^0U@P!d`q7=3`qtOb__DWGOjw~LB{i{=Y(W27wJ zqj!!9s0r}e&b9LeD8CJT zc%g+_=OIT>A?Bh9x@k9BjkSEW;enT+CB3eO-(H%7+A73+Ms3IpmEja zSD=duwjXFdDA0U>&GI0BALtaq25ScXj&0na3nK`;2*-h)SbLRma4FYq^k z$H=yoGQe}eMUX6L8M7?7&IgYNU-keU<+~ju!}#9A@&|v@Y7o2g^~>Mj_8B5vCWBfU z-Yg!Sf1$4T=5Xw611%DO@p&9O+dvBmAbiKpHc-BQ=>?8zggM@SL5)B+@D>?P&*nAY z1D+YXy;-2U>Hc5q2AS*@@c)`)r(1|)w_5?=rlu)gJuNPNFuG5_*-)L7#J)s z@Vg&^oQCcQIiVYRD0+qU+#rQ3?%9gpm}ivs3ixFdQfhKY1W_hi*3v_wC zBfrxD%Y*!Fs-V-wKk{!s02&32NNarfA9VZWO&84@mWTLTL!?gMS7@;nY6 zu>f^oG*5tbRe2t7gY8L5bL?yb+2zvtLGuS}|Lwt-%%440`}Bg=^@GX}&^4wJu;K+& zw166F;0y)s(yj*GDb*dL5&)+|=pz=J|iU z+nWP)fhdRpI%~cH#1QCoQ7QR<9W<_A;n?^Cv~-ideey5R(qR{s1pelZU;qC*b{>Q! z4*vFXkX(0+N{OT8VgBY!5RZTRH5bhrj-cbaBf)#KTvQ^uLsT+6x(h5kdMgY(EWej% z@o)D~OS3%1-wX==*FtHaTPe1H>iX_74v+#){_So8X_g1epL+D}0oRy2K`U20I`4rZ zvE=ho&>gNCKA^+K4}fA4R7s?DPEmnOR!jlwaOn(D$pD$p-~zJW1>{VR)&m}$$M{?J z|NQ^IyGA9!qdP31^GD~;gD+S;dPN{xvoAkrW#Vt``ThTYbDjsIb1#n+CzD6FTZBh< zfP{zT#WFU>&P%SEw_G}Jdh`ZMcrbeixOQFu+tXa`lg{)^MC0xa1H}YZ3C5VjddQN zLmSG}J-huJ__sH1^Jid4YdugR-u!|wtrNyANcID5Ka=3!=FH~U;ikyH&6(Y?!%d;vo8$krU7*6& z7DVv7AKC?Kb=ramey2l@mTjPAUS;f#onQti176z&DiFc!(>GwH8JByCTT|r|_48EPE9FCo? zA}=@o`2Qa~+_e+5Sr;jZICdWN>~;JPOCGbn{r~R?y9xkw>br&q<3SJ5exZhMpzWCl zUdzMVN4~A!eE3~Hz;6@aZ(ha1z|b9F(R!)maq}<6lBcjHt!02p=?!?BHqA0XgTG}r zI|Bpgq_5ZeL1`US>*@RjwVF8jTa-bCF1%Rf-+lsgT)zXTnRB4?SeoG_$HoVs`h@e8 zW9P-*E(V7G{~a42f|aKRDgBe&cufaPgI6CwMZ?vAYk%ceL&UE$Ay|ckBc+9J?X1*3&?1`atmmX1I3ufmRfP z&SsEv>^$JAc>>yKD`RuiJm}ha!qpO-zsen4yW2npIyUbE8NdKDwzCbazq1WA1q5ka zy7IfWfz&v5LagX)15MGl9sqj*lo}n6yMY!+GVr?`^6cFPO2&?zZaI)N>e&s>kuLn( zf*Cz5zm^KU>;d&QyK@;lEWh%%)N?T~q*=QPl)iPb3e_xq4mQ)n@*RImDi;HTuXUJ5 zu>+_|@y)&z;L9B5z`y+j|MmkOj0b!eFSzh;k6=p!U05Isy38QWr4zy}LRxc;N)ZEpr`xCh|3O7-0RMImXus02+s~r;Cug|^ zBpF_Q^!-pP=swq0p)ddcH#}o3;pg8b-28~Y;TH>k>%Y&Si#4|&@aP1!=)g(p=sXA-u1Ns9!4r0qQQAk) zF$Ef+4C>jL=K(5%L9I;3PB$4)mlre$593<5w+^&}0qQ1z2L(ZukOYAsOhW%HlkVR@Cm zxfZmUu=9gQXN*dPM>psS`_6YBoku5tE?K$_+5iT+5!LVjXeT3>)JSvblmiEmN3WlQ zNAoer%%8_`H_+`742B0hj=O5Ar&mBk^ouga0^%=pj(9xm- zIyD5uF6n4dSS$wIu(qf$l;P=xk8|Ek1|v zL^@kkKnu`8ygrb@oh{&13Sd5{>DJkz0;+1jd{D!!vqc3|gZ#hd(F<`U?AliUYTA$kDXRS^IwaJ(&cE45;-V;n?^K z(wjN@7Sx*wQOV$M-t`vLn>p-jJqJ3zvGVQz|J^<+37|v5=Dz*^U-Lv~iAsd!G5+@c zx1eIH+{35W-@(W7T!}kq^rAaNr3Bnn0{3KYF)%Q^R)ftifOf4a74h+JcN0o;v^>Dy z91glZu)B=I)AA!|Un`_{a}(4@(eUlO2|6vd^A@P!2Tc~h8vY)jvF!u=ErJktWq^At zCouae58grgD&0OR5sae&l-URhoI6E)8Xx;?%<3SFN0C^JDc>%{Uq~|i@ z9k^NN(fJGJf|srDKxL!@1FSzL3F^DFgJuJeJy*p7>C5<7o-4ijQXMqa3aTl5dwWz4 zNP(Jm4}W-ci-CroLA6HbFOO~?u^%3tKEgjh<+$c456x?gznUNY@a+85{ELIXY3$nWeHfSOwQK?5JnbpZ^e_mC3iOTIt<{~vrI(0SBVI{{-aAE#Z7!=vwJpZqC9(vsfH9g?}|Nk#DfB*k) z_{|a2!Sm_-=)gY(a$t1xF=ofkG7I<-0j(cD{{QdU>!acU+PM$y5~RU5?r(YX|9@}5 zZ_sFdyA){Z-I~Ft^CN!;XhI*H6fj)c8U{KE0BRsu3Bt58&;|9Nu6`&e149>saPYUr zzXIhKw+J6=4+;L(z*qnOyI8xq@V9h;;>YO~s7166v`!1!jPtNOTPpSvv}i# z)w3m)4Ye8!l^@fZYtHpawpF>$g{+L8oauK+{&x zii4tG9GtD%)!1a1xIX&NffFu_ zhp+|koKGOj!3iGJ(goQD8qNp16f*(Jzd)pDuo6T9WO?!bKe&Kx-}vkQf7o&)9{$$5 z&tWMrLV~~b{BuwW40GXc*#c@qA9xO`ZhXZ4rFHrU|9ffo71mBX?q&fhfL|v60Yx`6 ze{1hMkV9QmzzdRI*1tni$jrdNfXH<*pd^7klQ_NvnStV2Xtu=ks_4uA|6gwh^>9F4 zo7RTE|Np=I4cc1{+Ix-d_H@wwW$633L29wwJqGIjFv9kZW77w|xm_CL=5|mF`GQsr zGB7X%ure^TvoV18m4Ox$Ea!vlx7@(Tz_6c>0eqLz0X_zXN1&k=(B5i328KWZ$em>g z0t^fZx(p1U{eNX53=9Es3=Df@85m|rGcZI*GcXh?GB8Mi(wZUz1CJyF!x?b~24`^w zhW}y=40o~Ytp>RZ6k8w~wj>?2&k@9jiG$WKfcT)v6c7y)2hYVbFo1W)fy6Cmmd*yVV=)`-j&n!Nr!r#V&BdOnDE#w~U<|W{M0q%w%(Jm`mru#a42|Om^ad`SJ>U zk8(U8%=ImB)@DA)t_8@BW6;zf3xhd7%#K)o*q+@T{4l+*`C&d+7l7HeUI4ald7l8x zyc$8+p54EKu$$Nx3d3aY3&X@fX%ciiG7Ceh2yCD6aS_-a;7s@);1*Gs9cM*hdNsvh ztmR@blb?&h?veWrXR(XJ#O&d$6XGzv{1PzME(w?mKsf~Bs&q-1>`FKLVA z`;n!kVSA53xec;wJy#kQYICGvdaGn$p}R>27OT%>V0LuK!a{t%EKEnT989)L9>xOQ zK?_NpK?*Qawkg2$vVihBc;~da5==+A5^P`kEG1Y-{#JtRK{r%}sgqNI?cLUfv-nkE zX;MrTws-rwDs1m|ff~%EwQyD!oHZTJ3RH)M+HQ4Ns9jcv?c$cvgyj!AO_+IQaIx8% zu(WmzF7^^G)}jSDZ=8jpOdFQ&+qGf&V=kQaSQ{1}?m95rvUFf3AA*a$hO_u|VX{WL zFdd*03v#O-sQiPlKqVjKemziG2N466b`Tb**oDY~NA!49uSO^QWw;Uo1+FK401MMw`ut0muA+j(Z zL3TBRWFfnnAuO1WSU@dv@Lh?JUCj_#n2%V%yX7HbARj?kFdwlnz zdKRPx)J9`q04);*)wT!`(1o@i_(0ti*ltzOY1g2d7orAppD?IK2JKoyxRJbl!U+8^ z7Un)-(5^L@EQH3~Ck)!&g<9F`A?;NIhZrMhDGlgO42T&p5_G&2h>dTbFldDgNDT-> z!jK8nECO-idw}^cM5Hi8)Zikpa5l#f0iB%)F&L%>boL^uNIHhDY77z3c~hvm7GS8^ zgduVYL*zDw$SVwy9~dG$kYEDs&j&BdWMI(65b;70!G5a*Xn_{0FFH|lf#fiEO&`Ee zL(Hz}zZkl7Az29O3kPg_q@lSvJ~<;bIXfQx!oOmMWXR^(;LNI2=muEW=F<3-%;JK? zlH`o|%)I3M+|0c6c&OrHy@JG|5%pab{I2L_heB!?c{z z;tV7{#JQU;*T#XIM-_L|}X7%?-`WAhHQuDQ%$I zmw};8n1R6!u}gj)4Oth(IC`3~C#G;ALP?5{B?WsTq`7u%#*ms9zx} zLFNTG1bZ~TIRLtWjuEs`s5eAK0Wx9HdARjJsT1hzV+9+=Qq8o3FF4Yge=wHHgV%vW z)!guCJOa`jjkxasA_HDR|N1_^JOhMv6~0Epqxp>nk`WU?=Wu#JZmZ*$cVS?FvQgAS z%+v;t{(#gYUz!TuGtqe(qD1pXCrpt-G~_&f$a$;=plft4d-Mh|dUT#|ur~1M3{lbG zZ{=rXU}&(?<8KAsr|i+|#pKZ&#R%G4uF+7%Xiys3V5!I7ngtG+KqimgNJg-}hDt^Q z{?=yDg?b>pUSN4Nz5K19<9r${8TebZKqpWi=ro6&S?|#sqN3plT6quJ&I%q%v<0m^ z;%^77kOA!?(eSW5&EEpPHKy~FhvqGh=3mVG{f`(J7&4bJt@Hfb4m3Xd|DWOi!3P4I$6kWA!A`*Cy7Dxb zStT(DbLs;eI*x%aa)FPT<8V*88q{YuOJqP-sz7{IFL3aI1jr5l890xy|V;KqoC+_JAGe585ukp4MC;z*Hg#-jw?hlq{m-Uh;uX@a%Sw@aSgfX6R%C z-{Pnd9fx$E6C^z-baO%ulZK=l=uy&Y@Oz3ZKNL&)^g2Lx{6g+&0-L1}9T$HXvMl=} zWX}l1JcDjVkIvH&BRgGGbUb=}RCFA7fLegNKxH4)n$`m)`X1d9u-(uemdDEUu~`GU zNdT0kTo@R-xuJT&S8|pffmnVUo#(4kihX`LY| z3dh|*1p`A`ryHL~>+KRz(Aofq!Jy4mO5MzzE-EUHJ3yrvc$dsih$Lt$#*_p6+YWpO zZS8?L3$Z^AbUzL#|2cScUOw)kq66058=_+1)9a$512>^WyxT>^gnzq_icu#sL^Q3_ znFSo64$;V&nICkY#v2WgAM0B$@q1i=s77^#2C|L`hL@UuGJ$uN@lQGAYIvae5F?@p z0hK4sZ#+P=wh7I@IQiS{Kywzo;4-4~l4ml@1Rur&{~!4D`luv8Ry^$j_3c1YpomyQ zwcX<|Xo(-lgEqVB(pVZgT~ur!u6%tB6dq8sK$ZBe|Np^fg(x7*dc6rM&m_RWfK7f9 zR35b29E<$Re9#ssh;u=vVp9S-$QltxQ1jTZ+xJo)VIC_EC4W%P&jrQJ|CgUZVvzE> z`Hcrytoav5si8-&i;9hJ=RugeY(S0#tx!>L+`%pYyG{T-M3J^xO+cjQ&TFuwoYv{0 zq6bdK{M-FlKzoN3Ku2wWQ}=Nf70@x9(2EK@I&Z-e@lTL0rEWG*!iGeU;icvu|4aBf zFCdB+2dF;7OSZh}_`PuwN10szYN*d7ez@z!+|57dx2eM`ek=P-8`29Eqh6g~UK<8zj z&ZEAaXFzA%fa-mZ)=MQWh6lhw3n~Oa#YO@sG?PHG$6ZuF7dSJ3!Y&UK;?U&_AbwIe zvq$IWP8XFFXfg2$v~diSzG7TEAApPijV3X8bp8afK_hMqpcOixy)>ZQ01fHx5S18E zNQr}kxd5^)2C008_#GoYUa!o8L-GKyC{GCCLO( z64U^(B0x*03_ubwAXh?MeB4C^>RcB@^9STer*AGQkqxCupt}P=QJVrP#F9GMAdXDy zbYtm`QHcTXC9H^!1K%eGx>EMQ>wb9o3{eVBT_s|+Zt4u6d3**2ewQ0?ZHBjB?}0Rv zwx&(+Xny12*?GyO^Te*pzDWYj2N}OV0y*3QKH9QHi4|Ed*r2PZFZ>sT41`Fs)tpgsN*TBYlbe{hHs2jAk2^<2)TT}u- z)dm9t1DXvNTr&?qjCWD7S;1H$?9thy62Zj40M!EOM66&c;RVGsI6y%H9=&V8=6Uqi zs5rP9o&>wU*PGE3bOQD-uty-yY&}rndK^^ZGL(uN9`I;90&*rONg$=~PSCYJ;8s%W zffD9sK1R@4^w1MLS`U<*Xy#*j4Xu**O_(r&k%O6mgVBNkbYUqY3nK%I6KEWgfdS5j z%{_w7ltwr9A{@>0FA0%U}s=h&jC3L z8+86k zVv`wQGc}+kb&&I!L5t?(!KR#q%U)!F%|bOYLdM%!7|z34@=P$XcsL7mVk78?H5LX& zX4omug3JsI&R~;OnIW^?EDRaUuz9NrxNHwxb_rbXUr?Na^-8h8X0Sjj2_feT7qLK6 z1Pj9g7T8?TH5SOpb1V#BSzvQJa;yvt=3rCYSRs997KSXiSQnhN3eGwUXZ?b+WZ7V* zfKJ)61eq?Trk#hE(QirUz~+u zC!7UJRnp)SP(jTd2n#gRr3e-S%?m-qK-Cq51xjHMSwsSy0~}A_f{lg0Mg-79tCp>4J!X%6JG1G}8r<1$5HZjy3J42yiZVnNR4PEkKqsj}SfJ7YA`2=TAY!0-7zhh= zm<>c0)P{kGflk$hut3{VA+n${4k8BXy+T-^Jqr+7(0Wsd7^pmfut2?Dh%BgFfrx?f zC4>c9$O@4KjkiI>K${;REKrF9kp-2Z5HZjyRR{}I20>&&=dMA-KxGkx1==tJkp=Dj zg@}PpQHHQUEMz7VBnz3zgs@;K7BZ6w5d)=I2n&{CAv2i}F;I$y zuwW?`+gv4NOb=y160`*j*Qktt9)3QA3o`9qKl=uCJ}dO(P{GeBw* zhzMx7-6^pcd_g&A+69Ce7(zj{8q6+`F$^HrfZ_w93nT8xLHqQn+fdy1+BGkMB&8DK9FZ~y!3q=GJN1%EXp-Y{SfdN#TB1AyF zSWumc5CP5UfofKSNGc-(1E_vQh*W`2Z)Qh!VILy{1E{V=sF@E^gK`G-W{^3Y$htr` zGk|Jeh%U?#Wl*gQDuqB{3BlxzD1*vUh<+G}IhPBHIhZVj#+=IqjiiD~Y=}IF)Wev| z1(mMg0TPfj9D~mO0dYX1$=F7(L2^%#QY@qi4LT(oBm=?_5yb2z19bLM79s&s0u?dD z5CPq10agH?6As5vla3)$jUm#GAuRorD55796U@B}FCqpb85t1j@O^B}F-@d0;NM)y%|z zeI~gcZZb$0sHFu-Rp5CH@DyKWUS>&VVh()bG$j>X1U#Qtl$e*2pBrDCnwkQc6$6!A z@#(412{tefJ{_5ul2VjfTpVAVS`rV|oml|Ugf4+9nvP33Oah`DI)#{&nFnDWQsaG*fF>yv8bf90D2fTD2AL; z(=+n|Qj0S4Q=p>Z!H&*3sfl?g%3SkOP!xf*x~GmYJ7Y z5}#L+pNOso6emzI&}2F6)NFA4K^&W&S_1MSl3~cR?a=sxCia=v6K0Z9y(apuPI5@S00RUv bool { + return a - b >= TIME_OVERFLOW +} + +TIME_GREATER :: #force_inline proc(a, b: u32) -> bool { + return b - a >= TIME_OVERFLOW +} + +TIME_LESS_EQUAL :: #force_inline proc(a, b: u32) -> bool { + return !TIME_GREATER(a, b) +} + +TIME_GREATER_EQUAL :: #force_inline proc(a, b: u32) -> bool { + return TIME_LESS(a, b) +} + +TIME_DIFFERENCE :: #force_inline proc(a, b: u32) -> u32 { + return a - b >= TIME_OVERFLOW ? b - a : a - b +} \ No newline at end of file diff --git a/vendor/ENet/unix.odin b/vendor/ENet/unix.odin new file mode 100644 index 000000000..ea6b84199 --- /dev/null +++ b/vendor/ENet/unix.odin @@ -0,0 +1,59 @@ +//+build linux, darwin, freebsd +package ENet + +// When we implement the appropriate bindings for Unix, the section separated +// by `{` and `}` here can be removed in favor of using the bindings. +// { +import "core:c" + +@(private="file") FD_SETSIZE :: 1024 + +@(private="file") fd_set :: struct { + fds_bits: [FD_SETSIZE / 8 / size_of(c.long)]c.ulong, +} + +@(private="file") FD_ZERO :: #force_inline proc(s: ^fd_set) { + for i := size_of(fd_set) / size_of(c.long); i != 0; i -= 1 { + s.fds_bits[i] = 0; + } +} + +@(private="file") FD_SET :: #force_inline proc(d: i32, s: ^fd_set) { + s.fds_bits[d / (8 * size_of(c.long))] |= c.ulong(1) << (c.ulong(d) % (8 * size_of(c.ulong))) +} + +@(private="file") FD_CLR :: #force_inline proc(d: i32, s: ^fd_set) { + s.fds_bits[d / (8 * size_of(c.long))] &= ~(c.ulong(1) << (c.ulong(d) % (8 * size_of(c.ulong)))) +} + +@(private="file") FD_ISSET :: #force_inline proc(d: i32, s: ^fd_set) -> bool { + return (s.fds_bits[d / (8 * size_of(c.long))] & c.ulong(1) << (c.ulong(d) % (8 * size_of(c.ulong)))) != 0 +} +// } + +Socket :: distinct i32 + +SOCKET_NULL :: Socket(-1) + +Buffer :: struct { + data: rawptr, + dataLength: uint, +} + +SocketSet :: distinct fd_set + +SOCKETSET_EMPTY :: #force_inline proc(sockset: ^SocketSet) { + FD_ZERO(cast(^fd_set)sockset) +} + +SOCKETSET_ADD :: #force_inline proc(sockset: ^SocketSet, socket: Socket) { + FD_SET(i32(socket), cast(^fd_set)sockset) +} + +SOCKETSET_REMOVE :: #force_inline proc(sockset: ^SocketSet, socket: Socket) { + FD_CLR(i32(socket), cast(^fd_set)sockset) +} + +SOCKSET_CHECK :: #force_inline proc(sockset: ^SocketSet, socket: Socket) -> bool { + return FD_ISSET(i32(socket), cast(^fd_set)sockset) +} \ No newline at end of file diff --git a/vendor/ENet/win32.odin b/vendor/ENet/win32.odin new file mode 100644 index 000000000..5f07a895f --- /dev/null +++ b/vendor/ENet/win32.odin @@ -0,0 +1,81 @@ +//+build windows +package ENet + +// When we implement the appropriate bindings for Windows, the section separated +// by `{` and `}` here can be removed in favor of using the bindings. +// { +foreign WinSock2 import "system:Ws2_32.lib" + +@(private="file", default_calling_convention="c") +foreign WinSock2 { + __WSAFDIsSet :: proc(fd: SOCKET, s: ^fd_set) -> i32 --- +} + +@(private="file") SOCKET :: uintptr + +@(private="file") FD_SETSIZE :: 64 + +@(private="file") fs_set :: struct { + fd_count: u32, + fd_array: [FD_SETSIZE]SOCKET, +} + +@(private="file") FD_CLR :: proc(fd: SOCKET, s: ^fd_set) { + for i := u32(0); i < s.fd_count; i += 1 { + if s.fd_array[i] == fd { + for i < s.fd_count - 1 { + s.fd_array[i] = s.fd_array[i + 1] + i += 1 + } + s.fd_count -= 1 + break + } + } +} + +@(private="file") FD_SET :: proc(fd: SOCKET, s: ^fd_set) { + for i := u32(0); i < s.fd_count; i += 1 { + if s.fd_array[i] == fd { + return + } + } + if s.fd_count >= FD_SETSIZE do return + s.fd_array[s.fd_count] = fd + s.fd_count += 1 +} + +@(private="file") FD_ZERO proc #force_inline (s: ^fd_set) { + s.fd_count = 0 +} + +@(private="file") FD_ISSET proc #force_inline (fd: SOCKET, s: ^fd_set) -> bool { + return __WSAFDIsSet(fd, s) != 0 +} +// } + +Socket :: distinct Socket + +SOCKET_NULL :: Socket(~0) + +Buffer :: struct { + data: rawptr, + dataLength: uint, +} + +SocketSet :: distinct fd_set + +SOCKETSET_EMPTY :: #force_inline proc(sockset: ^SocketSet) { + FD_ZERO(cast(^fd_set)sockset) +} + +SOCKETSET_ADD :: #force_inline proc(sockset: ^SocketSet, socket: Socket) { + FD_SET(i32(socket), cast(^fd_set)sockset) +} + +SOCKETSET_REMOVE :: #force_inline proc(sockset: ^SocketSet, socket: Socket) { + FD_CLR(i32(socket), cast(^fd_set)sockset) +} + +SOCKSET_CHECK :: #force_inline proc(sockset: ^SocketSet, socket: Socket) -> bool { + return FD_ISSET(i32(socket), cast(^fd_set)sockset) +} \ No newline at end of file From 88d6407092f82119c67fe89de740882f603d8f6d Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sat, 23 Oct 2021 07:51:47 -0400 Subject: [PATCH 02/13] oops, semicolon --- vendor/ENet/enet.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/ENet/enet.odin b/vendor/ENet/enet.odin index 175766ef1..2446dc816 100644 --- a/vendor/ENet/enet.odin +++ b/vendor/ENet/enet.odin @@ -22,10 +22,10 @@ VERSION_GET_MAJOR :: #force_inline proc(version: u32) -> u8 { return u8((version >> 16) & 0xff) } VERSION_GET_MINOR :: #force_inline proc(version: u32) -> u8 { - return u8((version >> 8) & 0xff); + return u8((version >> 8) & 0xff) } VERSION_GET_PATCH :: #force_inline proc(version: u32) -> u8 { - return u8(version & 0xff); + return u8(version & 0xff) } // Odin does not have "macros" or compile-time evaluation of functions, so the From 71ae424aa84f7f385267f30df12a95c6038395dd Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sat, 23 Oct 2021 07:56:37 -0400 Subject: [PATCH 03/13] add LICENSE --- vendor/ENet/LICENSE | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 vendor/ENet/LICENSE diff --git a/vendor/ENet/LICENSE b/vendor/ENet/LICENSE new file mode 100644 index 000000000..6906f8eb0 --- /dev/null +++ b/vendor/ENet/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2002-2020 Lee Salzman + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From 7c336a6a82883446896dff12211051d5946af851 Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sat, 23 Oct 2021 08:12:46 -0400 Subject: [PATCH 04/13] update vendor README.md --- vendor/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/vendor/README.md b/vendor/README.md index aced06b3c..918e19217 100644 --- a/vendor/README.md +++ b/vendor/README.md @@ -109,3 +109,12 @@ See also LICENSE.txt in the `glfw` directory itself. `portmidi_s.lib` is available under PortMidi's [MIT](https://sourceforge.net/projects/portmedia/) license. See also LICENSE.txt in the `portmidi` directory itself. + + +## ENet + +[ENet](http://enet.bespin.org/) Reliable UDP networking library. + +`enet.lib` and `enet64.lib` are available under ENet's [zlib/libpng](http://enet.bespin.org/License.html) license. + +See also LICENSE in the `ENet` directory iself. \ No newline at end of file From e6fb4ee26558aa1184d8a6624de2e67413a5070a Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sat, 23 Oct 2021 08:13:03 -0400 Subject: [PATCH 05/13] typo --- vendor/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/README.md b/vendor/README.md index 918e19217..826654c79 100644 --- a/vendor/README.md +++ b/vendor/README.md @@ -117,4 +117,4 @@ See also LICENSE.txt in the `portmidi` directory itself. `enet.lib` and `enet64.lib` are available under ENet's [zlib/libpng](http://enet.bespin.org/License.html) license. -See also LICENSE in the `ENet` directory iself. \ No newline at end of file +See also LICENSE in the `ENet` directory itself. \ No newline at end of file From a074c367fff1e2839dc6413b53b1ad0c99620337 Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sat, 23 Oct 2021 08:25:02 -0400 Subject: [PATCH 06/13] actually got the license wrong, it's MIT --- vendor/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/README.md b/vendor/README.md index 826654c79..31751f8c7 100644 --- a/vendor/README.md +++ b/vendor/README.md @@ -115,6 +115,6 @@ See also LICENSE.txt in the `portmidi` directory itself. [ENet](http://enet.bespin.org/) Reliable UDP networking library. -`enet.lib` and `enet64.lib` are available under ENet's [zlib/libpng](http://enet.bespin.org/License.html) license. +`enet.lib` and `enet64.lib` are available under ENet's [MIT](http://enet.bespin.org/License.html) license. See also LICENSE in the `ENet` directory itself. \ No newline at end of file From 357d085ffbe16725463cd22dcf9f0fc12513c2c8 Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sat, 23 Oct 2021 13:09:54 -0400 Subject: [PATCH 07/13] use multi pointer here, cstring was incorrect --- vendor/ENet/enet.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/ENet/enet.odin b/vendor/ENet/enet.odin index 2446dc816..d71538800 100644 --- a/vendor/ENet/enet.odin +++ b/vendor/ENet/enet.odin @@ -354,8 +354,8 @@ foreign ENet { address_set_host_ip :: proc(address: ^Address, hostName: cstring) -> i32 --- address_set_host :: proc(address: ^Address, hostName: cstring) -> i32 --- - address_get_host_ip :: proc(address: ^Address, hostName: cstring, nameLength: uint) -> i32 --- - address_get_host :: proc(address: ^Address, hostName: cstring, nameLength: uint) -> i32 --- + address_get_host_ip :: proc(address: ^Address, hostName: [^]u8, nameLength: uint) -> i32 --- + address_get_host :: proc(address: ^Address, hostName: [^]u8, nameLength: uint) -> i32 --- packet_create :: proc(rawptr, uint, u32) -> ^Packet --- packet_destroy :: proc(^Packet) --- From 37d3a8a8613c94e036e3e719a448ba29859f1654 Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sun, 24 Oct 2021 10:54:46 -0400 Subject: [PATCH 08/13] fixes for windows --- vendor/ENet/enet.odin | 12 ++++++++++-- vendor/ENet/win32.odin | 18 +++++++++--------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/vendor/ENet/enet.odin b/vendor/ENet/enet.odin index d71538800..b92de9aa6 100644 --- a/vendor/ENet/enet.odin +++ b/vendor/ENet/enet.odin @@ -2,9 +2,17 @@ package ENet when ODIN_OS == "windows" { when ODIN_ARCH == "amd64" { - foreign import ENet "lib/enet64.lib" + foreign import ENet { + "lib/enet64.lib", + "system:Ws2_32.lib", + "system:Winmm.lib", + } } else { - foreign import ENet "lib/enet.lib" + foreign import ENet { + "lib/enet.lib", + "system:Ws2_32.lib", + "system:Winmm.lib", + } } } else { foreign import ENet "system:enet" diff --git a/vendor/ENet/win32.odin b/vendor/ENet/win32.odin index 5f07a895f..1df35ee45 100644 --- a/vendor/ENet/win32.odin +++ b/vendor/ENet/win32.odin @@ -4,7 +4,7 @@ package ENet // When we implement the appropriate bindings for Windows, the section separated // by `{` and `}` here can be removed in favor of using the bindings. // { -foreign WinSock2 import "system:Ws2_32.lib" +foreign import WinSock2 "system:Ws2_32.lib" @(private="file", default_calling_convention="c") foreign WinSock2 { @@ -15,7 +15,7 @@ foreign WinSock2 { @(private="file") FD_SETSIZE :: 64 -@(private="file") fs_set :: struct { +@(private="file") fd_set :: struct { fd_count: u32, fd_array: [FD_SETSIZE]SOCKET, } @@ -44,18 +44,18 @@ foreign WinSock2 { s.fd_count += 1 } -@(private="file") FD_ZERO proc #force_inline (s: ^fd_set) { +@(private="file") FD_ZERO :: #force_inline proc (s: ^fd_set) { s.fd_count = 0 } -@(private="file") FD_ISSET proc #force_inline (fd: SOCKET, s: ^fd_set) -> bool { +@(private="file") FD_ISSET :: #force_inline proc (fd: SOCKET, s: ^fd_set) -> bool { return __WSAFDIsSet(fd, s) != 0 } // } -Socket :: distinct Socket +Socket :: distinct SOCKET -SOCKET_NULL :: Socket(~0) +SOCKET_NULL :: Socket(~uintptr(0)) Buffer :: struct { data: rawptr, @@ -69,13 +69,13 @@ SOCKETSET_EMPTY :: #force_inline proc(sockset: ^SocketSet) { } SOCKETSET_ADD :: #force_inline proc(sockset: ^SocketSet, socket: Socket) { - FD_SET(i32(socket), cast(^fd_set)sockset) + FD_SET(SOCKET(socket), cast(^fd_set)sockset) } SOCKETSET_REMOVE :: #force_inline proc(sockset: ^SocketSet, socket: Socket) { - FD_CLR(i32(socket), cast(^fd_set)sockset) + FD_CLR(SOCKET(socket), cast(^fd_set)sockset) } SOCKSET_CHECK :: #force_inline proc(sockset: ^SocketSet, socket: Socket) -> bool { - return FD_ISSET(i32(socket), cast(^fd_set)sockset) + return FD_ISSET(SOCKET(socket), cast(^fd_set)sockset) } \ No newline at end of file From 98490454b6baf6b0c024bfa2871d5db467bee0e7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 26 Oct 2021 12:50:34 +0100 Subject: [PATCH 09/13] Remove unneeded semicolons --- vendor/ENet/enet.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/ENet/enet.odin b/vendor/ENet/enet.odin index b92de9aa6..8d068fbfc 100644 --- a/vendor/ENet/enet.odin +++ b/vendor/ENet/enet.odin @@ -60,7 +60,7 @@ NET_TO_HOST_32 :: #force_inline proc(value: u32) -> u32 { return u32(transmute(u32be)value) } -Version :: u32; +Version :: u32 SocketType :: enum i32 { STREAM = 1, @@ -109,7 +109,7 @@ PacketFlag :: enum i32 { FLAG_SENT = 1 << 8, } -PacketFreeCallback :: proc "c" (packet: ^Packet); +PacketFreeCallback :: proc "c" (packet: ^Packet) Packet :: struct { referenceCount: uint, From ce8ddd0c3f7e7c6387297420f1b05ab3674a5631 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 26 Oct 2021 12:50:48 +0100 Subject: [PATCH 10/13] Add vendor:ENet to all_vendor.odin --- examples/all/all_vendor.odin | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/all/all_vendor.odin b/examples/all/all_vendor.odin index 1ca04380f..777c184f9 100644 --- a/examples/all/all_vendor.odin +++ b/examples/all/all_vendor.odin @@ -11,6 +11,7 @@ import SDLNet "vendor:sdl2/net" import MIX "vendor:sdl2/mixer" import TTF "vendor:sdl2/ttf" import vk "vendor:vulkan" +import ENet "vendor:ENet" _ :: glfw _ :: gl @@ -21,4 +22,5 @@ _ :: IMG _ :: SDLNet _ :: MIX _ :: TTF -_ :: vk \ No newline at end of file +_ :: vk +_ :: ENet \ No newline at end of file From c64674c39e4d2b28a5d937083d2edffcaf886959 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 26 Oct 2021 13:38:48 +0100 Subject: [PATCH 11/13] Remove unnecessary `assert`s --- core/runtime/dynamic_map_internal.odin | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/core/runtime/dynamic_map_internal.odin b/core/runtime/dynamic_map_internal.odin index 8b1e253c2..7b148dcaa 100644 --- a/core/runtime/dynamic_map_internal.odin +++ b/core/runtime/dynamic_map_internal.odin @@ -190,8 +190,6 @@ __slice_resize :: proc(array_: ^$T/[]$E, new_count: int, allocator: Allocator, l return true } - assert(allocator.procedure != nil) - old_size := array.len*size_of(T) new_size := new_count*size_of(T) @@ -256,7 +254,7 @@ __dynamic_map_get :: proc(h: Map_Header, hash: Map_Hash) -> rawptr { __dynamic_map_set :: proc(h: Map_Header, hash: Map_Hash, value: rawptr, loc := #caller_location) -> ^Map_Entry_Header #no_bounds_check { index: int - assert(value != nil) + // assert(value != nil) if len(h.m.hashes) == 0 { __dynamic_map_reserve(h, INITIAL_MAP_CAP, loc) @@ -290,7 +288,7 @@ __dynamic_map_set :: proc(h: Map_Header, hash: Map_Hash, value: rawptr, loc := # if __dynamic_map_full(h) { __dynamic_map_grow(h, loc) index = __dynamic_map_find(h, hash).entry_index - assert(index >= 0) + // assert(index >= 0) } return __dynamic_map_get_entry(h, index) @@ -315,12 +313,6 @@ __dynamic_map_hash_equal :: proc "contextless" (h: Map_Header, a, b: Map_Hash) - __dynamic_map_find :: proc(using h: Map_Header, hash: Map_Hash) -> Map_Find_Result #no_bounds_check { fr := Map_Find_Result{-1, -1, -1} if n := uintptr(len(m.hashes)); n > 0 { - for i in 0..= 0 { @@ -329,7 +321,7 @@ __dynamic_map_find :: proc(using h: Map_Header, hash: Map_Hash) -> Map_Find_Resu if __dynamic_map_hash_equal(h, entry_hash, hash) { return fr } - assert(entry.next < m.entries.len) + // assert(entry.next < m.entries.len) fr.entry_prev = fr.entry_index fr.entry_index = entry.next @@ -358,7 +350,7 @@ __dynamic_map_delete_key :: proc(using h: Map_Header, hash: Map_Hash) { } __dynamic_map_get_entry :: proc(using h: Map_Header, index: int) -> ^Map_Entry_Header { - assert(0 <= index && index < m.entries.len) + // assert(0 <= index && index < m.entries.len) return (^Map_Entry_Header)(uintptr(m.entries.data) + uintptr(index*entry_size)) } From 9331ebebcc0e83e2b04de7b0ab16dd102430aaf9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 26 Oct 2021 14:24:21 +0100 Subject: [PATCH 12/13] Add `#no_bounds_check` to sorting procedures --- core/slice/sort.odin | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/core/slice/sort.odin b/core/slice/sort.odin index 0114fe18f..d9755ad0e 100644 --- a/core/slice/sort.odin +++ b/core/slice/sort.odin @@ -152,8 +152,8 @@ _max_depth :: proc(n: int) -> int { // 2*ceil(log2(n+1)) } @(private) -_quick_sort :: proc(data: $T/[]$E, a, b, max_depth: int) where ORD(E) { - median3 :: proc(data: T, m1, m0, m2: int) { +_quick_sort :: proc(data: $T/[]$E, a, b, max_depth: int) where ORD(E) #no_bounds_check { + median3 :: proc(data: T, m1, m0, m2: int) #no_bounds_check { if data[m1] < data[m0] { swap(data, m1, m0) } @@ -165,7 +165,7 @@ _quick_sort :: proc(data: $T/[]$E, a, b, max_depth: int) where ORD(E) { } } - do_pivot :: proc(data: T, lo, hi: int) -> (midlo, midhi: int) { + do_pivot :: proc(data: T, lo, hi: int) -> (midlo, midhi: int) #no_bounds_check { m := int(uint(lo+hi)>>1) if hi-lo > 40 { s := (hi-lo)/8 @@ -265,7 +265,7 @@ _quick_sort :: proc(data: $T/[]$E, a, b, max_depth: int) where ORD(E) { } @(private) -_insertion_sort :: proc(data: $T/[]$E, a, b: int) where ORD(E) { +_insertion_sort :: proc(data: $T/[]$E, a, b: int) where ORD(E) #no_bounds_check { for i in a+1.. a && data[j] < data[j-1]; j -= 1 { swap(data, j, j-1) @@ -274,8 +274,8 @@ _insertion_sort :: proc(data: $T/[]$E, a, b: int) where ORD(E) { } @(private) -_heap_sort :: proc(data: $T/[]$E, a, b: int) where ORD(E) { - sift_down :: proc(data: T, lo, hi, first: int) { +_heap_sort :: proc(data: $T/[]$E, a, b: int) where ORD(E) #no_bounds_check { + sift_down :: proc(data: T, lo, hi, first: int) #no_bounds_check { root := lo for { child := 2*root + 1 @@ -312,8 +312,8 @@ _heap_sort :: proc(data: $T/[]$E, a, b: int) where ORD(E) { @(private) -_quick_sort_less :: proc(data: $T/[]$E, a, b, max_depth: int, less: proc(i, j: E) -> bool) { - median3 :: proc(data: T, m1, m0, m2: int, less: proc(i, j: E) -> bool) { +_quick_sort_less :: proc(data: $T/[]$E, a, b, max_depth: int, less: proc(i, j: E) -> bool) #no_bounds_check { + median3 :: proc(data: T, m1, m0, m2: int, less: proc(i, j: E) -> bool) #no_bounds_check { if less(data[m1], data[m0]) { swap(data, m1, m0) } @@ -325,7 +325,7 @@ _quick_sort_less :: proc(data: $T/[]$E, a, b, max_depth: int, less: proc(i, j: E } } - do_pivot :: proc(data: T, lo, hi: int, less: proc(i, j: E) -> bool) -> (midlo, midhi: int) { + do_pivot :: proc(data: T, lo, hi: int, less: proc(i, j: E) -> bool) -> (midlo, midhi: int) #no_bounds_check { m := int(uint(lo+hi)>>1) if hi-lo > 40 { s := (hi-lo)/8 @@ -424,7 +424,7 @@ _quick_sort_less :: proc(data: $T/[]$E, a, b, max_depth: int, less: proc(i, j: E } @(private) -_insertion_sort_less :: proc(data: $T/[]$E, a, b: int, less: proc(i, j: E) -> bool) { +_insertion_sort_less :: proc(data: $T/[]$E, a, b: int, less: proc(i, j: E) -> bool) #no_bounds_check { for i in a+1.. a && less(data[j], data[j-1]); j -= 1 { swap(data, j, j-1) @@ -433,8 +433,8 @@ _insertion_sort_less :: proc(data: $T/[]$E, a, b: int, less: proc(i, j: E) -> bo } @(private) -_heap_sort_less :: proc(data: $T/[]$E, a, b: int, less: proc(i, j: E) -> bool) { - sift_down :: proc(data: T, lo, hi, first: int, less: proc(i, j: E) -> bool) { +_heap_sort_less :: proc(data: $T/[]$E, a, b: int, less: proc(i, j: E) -> bool) #no_bounds_check { + sift_down :: proc(data: T, lo, hi, first: int, less: proc(i, j: E) -> bool) #no_bounds_check { root := lo for { child := 2*root + 1 @@ -471,8 +471,8 @@ _heap_sort_less :: proc(data: $T/[]$E, a, b: int, less: proc(i, j: E) -> bool) { @(private) -_quick_sort_cmp :: proc(data: $T/[]$E, a, b, max_depth: int, cmp: proc(i, j: E) -> Ordering) { - median3 :: proc(data: T, m1, m0, m2: int, cmp: proc(i, j: E) -> Ordering) { +_quick_sort_cmp :: proc(data: $T/[]$E, a, b, max_depth: int, cmp: proc(i, j: E) -> Ordering) #no_bounds_check { + median3 :: proc(data: T, m1, m0, m2: int, cmp: proc(i, j: E) -> Ordering) #no_bounds_check { if cmp(data[m1], data[m0]) == .Less { swap(data, m1, m0) } @@ -484,7 +484,7 @@ _quick_sort_cmp :: proc(data: $T/[]$E, a, b, max_depth: int, cmp: proc(i, j: E) } } - do_pivot :: proc(data: T, lo, hi: int, cmp: proc(i, j: E) -> Ordering) -> (midlo, midhi: int) { + do_pivot :: proc(data: T, lo, hi: int, cmp: proc(i, j: E) -> Ordering) -> (midlo, midhi: int) #no_bounds_check { m := int(uint(lo+hi)>>1) if hi-lo > 40 { s := (hi-lo)/8 @@ -583,7 +583,7 @@ _quick_sort_cmp :: proc(data: $T/[]$E, a, b, max_depth: int, cmp: proc(i, j: E) } @(private) -_insertion_sort_cmp :: proc(data: $T/[]$E, a, b: int, cmp: proc(i, j: E) -> Ordering) { +_insertion_sort_cmp :: proc(data: $T/[]$E, a, b: int, cmp: proc(i, j: E) -> Ordering) #no_bounds_check { for i in a+1.. a && cmp(data[j], data[j-1]) == .Less; j -= 1 { swap(data, j, j-1) @@ -592,8 +592,8 @@ _insertion_sort_cmp :: proc(data: $T/[]$E, a, b: int, cmp: proc(i, j: E) -> Orde } @(private) -_heap_sort_cmp :: proc(data: $T/[]$E, a, b: int, cmp: proc(i, j: E) -> Ordering) { - sift_down :: proc(data: T, lo, hi, first: int, cmp: proc(i, j: E) -> Ordering) { +_heap_sort_cmp :: proc(data: $T/[]$E, a, b: int, cmp: proc(i, j: E) -> Ordering) #no_bounds_check { + sift_down :: proc(data: T, lo, hi, first: int, cmp: proc(i, j: E) -> Ordering) #no_bounds_check { root := lo for { child := 2*root + 1 From 802df731835b6bac632a999a26e65708efa0f308 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 26 Oct 2021 14:47:59 +0100 Subject: [PATCH 13/13] Remove unneeded call --- core/runtime/dynamic_map_internal.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/runtime/dynamic_map_internal.odin b/core/runtime/dynamic_map_internal.odin index 7b148dcaa..4d4c51d6a 100644 --- a/core/runtime/dynamic_map_internal.odin +++ b/core/runtime/dynamic_map_internal.odin @@ -287,7 +287,7 @@ __dynamic_map_set :: proc(h: Map_Header, hash: Map_Hash, value: rawptr, loc := # if __dynamic_map_full(h) { __dynamic_map_grow(h, loc) - index = __dynamic_map_find(h, hash).entry_index + // index = __dynamic_map_find(h, hash).entry_index // assert(index >= 0) }