This is seriously, such a good video. AWS is actually the reason I was curious about the topic in the first place, so your example VPC was 100% relevant to me. You're a stud.
Many thanks for this. As a self-taught developer, trying to define the IP ranges for my VPC subnets was really confusing me. This video explained it perfectly!
THANK YOU SO MUCH this was an amazing video, my professor kept explaining CIDR blocks in class but i never got it so i was freaking out about an asignment he gave us but this video made it so simple for me to understand!!
Ryan Schachte, This is a great presentation. thoughtful, specific, and with the right modulation. One other feature that probably many of us don't know. Which is people with low vision, like, people with Macular degeneration eye problems who see better with black text over white background. So these graphics help to pay attention a lot easier for many people with eye problems. especially older. halfway later it got in opposite directions. white text on black background. which makes it equally harder. Please have it in your mind for further design improvement.
In the IT industry, most would say "fake it till you make it". With that approach, you may never get the opportunity to grasp basic concepts. This lesson has tied up a lot of loose ends on the fundamentals of IPv4. Thank you!
Dude, you are a heaven send. I've been sitting here for the last few days trying to understand this stuff and you just helped me get to 90% understanding. A lot better than the 30% I was at 23 minutes ago..
The best explanation indeed.I was hitting my head for few days searching all over the internet to understand CIDR but to no avail.You made it look so simple.Thank you very much.
This is the best content and presentation available out there to understand CIDR block i.e. choosing IPv4 addresses for AWS VPC and Subnets! It reasons why a certain IPv4 or CIDR block is chosen. Great Job explaining in a way a Novice like me can clearly understand!
Don't mean to sound like a fanboy but that was an awesome video to say the least. Step by step, incremental knowledge and real life application and examples. Great job!!!!!
I would suggest that nodes on a local network (LAN) communicate via Ethernet frames using OSI layer 2 (data link) MAC addresses. Whenever a device wishes to send a message to another device, it needs two things, the source MAC address (which it has) and the destination MAC address of the receiver, which it doesn't have. In order to obtain the missing piece of the puzzle, the destination MAC address, the sender node broadcasts an ARP (Address Resolution Package) package to a Broadcast Address. The switch (the Broadcast Address is associated with the switch) distributes the ARP package to all devices on the network and waits for a reply. Once the reply comes back to the switch, the switch updates its CAM table and sends a reply to the initial enquiring node with the destination MAC address. The sender can now send the Ethernet frame to the destination
Amazing, thank you very much! I've spent the last few days trying to work out CIDR (and how to get the actual IP addresses that are part of it) and this is the first resource that's been clear enough to get me to understand!
This has been so far best content available to actually understand Subnet / CIDR and binary calculations ...you got a subscriber ...amazing explanation
Thanks for the very informative video. It made the whole thing much clearer even though I've been watching a lot of AWS tutorials lately. None of them went into trouble of explaining CIDR blocks.
The best CIDR tutorial out there bruv! Your explanation lives upto your channel name. You just earned yourself a new subscriber. Keep up the good work!
If anyone is confused at 21:35 and further about why the 4th octet of the IP has to be a multiple of 16, then read on. - From 10.0.0.0/20, we already have a range that goes from 10.0.0.0 to 10.0.15.255. - The subnet mask: 11111111.11111111.11110000.00000000 - Now within the initial range, we need another subnet, which is 10.0.0.0/28. - 10.0.0.0/28 implies that the FIRST 28 bits of the IP have to be fixed. - New subnet mask: 11111111.11111111.11111111.11110000 - (32 bits in IPv4) - (FIRST 28 fixed bits in the new subnet) = (4 bits left AT THE END) - 2^4 = 16, so 16 IP addresses are possible for the new subnet. (2^4 since we're talking in Binary.) - Which 16 IP addresses in the given range of 10.0.0.0 to 10.0.15.255 are valid though? - There are multiple groups of contiguous 16 IP addresses that are valid. - IP addresses are composed of a Network ID and a Host (device) ID. - It is important to understand here that the first 28 bits that are supposed to be fixed are only for the routers to understand to understand which bits in the actual IP form the Network ID (the 1s) and which bits form the host IDs (the 0s). So the network ID can change, but the number of bits it can take is constant (= no. of 1s). The host IDs can be any contiguous 16 (2^4) IP addresses from the starting range. Each set of these 16 Host IDs will have a fixed Network ID though. - So it's not that the first 28 bits (Network ID) cannot change. They can change in the initial permissible range (from 10.0.0.0 to 10.0.15.255). They only have to be constant per 16 Host IDs. That is what is meant by the 1s and 0s in the subnet mask. - The first 28 bits are only used for Network ID identification. The ID can change, but once one set is chosen, the Network ID has to be same for the 16 contiguous Host IDs possible. - How do we find the groups of contiguous 16 IPs? - Start flipping bits in the 3rd and 4th octets of the subnet (keeping in mind that the last 4 bits of the 4th octet cannot change and have to be zero to get the proper starting range) and check their decimal values to be in the permissible ranges of 0 to 15 for the 3rd octet and 0 to 255 for the 4th octet. Do not change any bits of the 1st or 2nd octet. - The original subnet mask: 11111111.11111111.11110000.00000000 ^^^^^ (last 4 are fixed at 0. The other zeroes can be varied within the initial range.) - The new subnet mask: 11111111.11111111.11111111.11110000 - Eg: 10.0.0.0/28 is a valid starting range (3rd octet between 0 and 15, 4th octet between 0 and 255 and last 4 bits of 4th octet are zero). So the server will get IPs from 10.0.0.0 to 10.0.0.15. - Eg: 10.0.0.1/28 (ie, 10.0.0.1 to 10.0.0.16) is NOT a valid starting range even though 3rd octet between 0 and 15 and 4th octet between 0 and 255, as the last 4 bits of 4th octet are NOT zero. The last 4 bits have to be zero (unchanged), as there needs to be a way to identify to which subnet an IP address belongs. If IPs are assigned from 10.0.0.1 to 10.0.0.16 (as in the case of 10.0.0.1/28) for server 1, then if another subnet exists and is assigned from 10.0.0.17 to 10.0.0.32 (ie, 10.0.0.17/28) for server 2, then in binary (electronic communication is in binary) the system will not be able to route the communication to the correct server. Why? 16 in a binary octet is 00010000 and 17 is 00010001. The routing system decides the subnet to which the communication needs to be sent on the basis of ignoring the host ID bits and taking them as zeroes (as they are the IPs inside the subnet and it is not concerned with them. It only cares about which subnet it needs to reach. The router inside the subnet will find the exact device.). So with 17 (00010001), the routing system will send the communication to the 1st subnet (10.0.0.1/28) instead of the 2nd (10.0.0.17/28), as it will ignore the first 4 bits and resolve them only on reaching the first server, which will cause an error, as 16 is the last IP of the 1st server. - Eg: 10.0.0.16/28 is the next valid starting IP after 10.0.0.0/28 (3rd octet between 0 and 15, 4th octet between 0 and 255 and last 4 bits of 4th octet are zero). So the server will get IPs from 10.0.0.16 to 10.0.0.31. - Eg: 10.0.0.32/28 is the next valid starting IP after 10.0.0.16/28 (3rd octet between 0 and 15, 4th octet between 0 and 255 and last 4 bits of 4th octet are zero). So the server will get IPs from 10.0.0.32 to 10.0.0.47. - MANY more are possible. - On observation of the above examples, the decimal values of the 4th octet of the valid STARTING IPs are all multiples of 16. I hope that helps! Lmk if you have doubts by leaving a reply, I'll try to answer. I'm also available on Twitter at @harshgkapadia for any doubts. PS: - A good video on finding ranges from the CIDR notation: ruclips.net/video/MmA0-978fSk/видео.html - A good video on finding the usable IP range, Network ID and Broadcast ID from an IP somewhere in the range: ruclips.net/video/POPoAjWFkGg/видео.html
man this helped me out so much!! i was wondering the exact same thing. the bit you said about network id has to be fixed for a given subnet made all the difference!! thanks a lot for this wonderful writeup.
the AWS demonstration is really awesome; was it just me or any Mac user would be curious about how the calculator was deployed in such a convenient and cool way?
I think it'd be nicer to put show the Maths behind things like why there are 4.2 billion addresses. I just derived it and it's 256*256*256*256. For me it makes the whole things less mystical - like where are all these magic numbers coming from. Anyways don't mind me just making myself some notes below: IP addresses - how devices communicate/are located on a network Total IPv4 addresses - 2^32 Class A - 8 bits allocated to the network and 24 bits allocated to the hosts. 2^24 IP addresses allocated to hosts in this range. Class B - 16 bits allocated to the network and 16 bits to the hosts. 2^16 IP addresses allocated to hosts in this range. Class C - 24 bits allocated to the network and 8 bits to the hosts. 2^8 IP addresses -Companies determine how many IPs they need to get the right class range by calculating the least highest number of base 2 addresses A router is assigned an address within a 2^32 in a local network where all the devices in the local network are assigned private addresses. We're only using one public IP address that's assisting potentially hundreds of devices in a single network
What is the difference between creating a subnet with IPv4 CIDR block "10.0.15.16/28" and "10.0.15.32/28", and how many subnets can we create? Awesome video!!!
Based on my understanding: In case of 10.0.0.0/20: binary: 00001010.00000000.0000 | 0000.00000000 (| represent 20). The first half is yours. "00001010.00000000.0000" this part. You cannot change this part. If you assign 10.0.16.0/28,it basically means "00001010.00000000.0001" in the first half. It's not your space anymore. And the reason why it can only be the power of 16 is because when you modifying 00001010.00000000.0000xxxx.0000 | 0000 , the last four digit is reserved. So if we take the first half in this case, 00001010.00000000.0000xxxx.0000 the minimal change you can do is change the last digit 0 to 1. Which adds 16 to the whole number. That's why it can only be the power of 16.
This is seriously, such a good video. AWS is actually the reason I was curious about the topic in the first place, so your example VPC was 100% relevant to me. You're a stud.
THIS IS BEST EXPLANATION I HAVE EVER COME ACCROSS AS FAR AS EXPLAINING HOW THE IP INTERACTS WITH THE INTERNET.THANK SO MUCH RYAN, YOU ARE THE BEST!
CIDR part starts at 12:25. You're welcome.
That's cool!
Thank you king 🤴🏽
no. you can show yourself out
That's helpful, thanks
Wow, watched countless videos and this one is the only video where I feel the concept finally sticks to my head.
Many thanks for this. As a self-taught developer, trying to define the IP ranges for my VPC subnets was really confusing me. This video explained it perfectly!
THANK YOU SO MUCH this was an amazing video, my professor kept explaining CIDR blocks in class but i never got it so i was freaking out about an asignment he gave us but this video made it so simple for me to understand!!
Ryan Schachte, This is a great presentation. thoughtful, specific, and with the right modulation.
One other feature that probably many of us don't know. Which is people with low vision, like, people with Macular degeneration eye problems who see better with black text over white background. So these graphics help to pay attention a lot easier for many people with eye problems. especially older.
halfway later it got in opposite directions. white text on black background. which makes it equally harder. Please have it in your mind for further design improvement.
this is the most explanatory video I've seen so far
In the IT industry, most would say "fake it till you make it". With that approach, you may never get the opportunity to grasp basic concepts. This lesson has tied up a lot of loose ends on the fundamentals of IPv4. Thank you!
This is a very helpful video specially for people having absolutely no idea about networking. Thanks a ton.
Oh my, your english is very clear. I am from Brazil and it's very peaceful to listen to you haha
Dude, you are a heaven send. I've been sitting here for the last few days trying to understand this stuff and you just helped me get to 90% understanding. A lot better than the 30% I was at 23 minutes ago..
Hands down the best video explaining IP Addressing
I've read/watched several tutorials on CIDR but now I FINALLY GET IT!! Thank you! Subscribed.
I'm studying for the AWS Solution Architect Associate certificate and needed by VPC knowledge beefed up. This video really helps!
same! :)
How is it going?
Without a doubt the best video available to learn about IPs, subnets and VPCs!
perfect video for someone like me struggling to define CIDR ranges especially while creating AWS VPC..Thanks Ryan
Finally, an actual video about CIDR that makes sense. Thank you so much!
best CIDR explanation i have ever watch till now
The best explanation indeed.I was hitting my head for few days searching all over the internet to understand CIDR but to no avail.You made it look so simple.Thank you very much.
Great to hear!
You nailed it bro. Even a KG student can understand the networking basics form this video. Kudos
Great tutorial; My networking was a bit rusty but got me up to speed! Thumbs up dude!
Finally i can understand CIDR completely, thank you very much
Amazing video! This is one of the best explanations I have seen so far about this topic.
Great!
I appreciate it!
This is the best content and presentation available out there to understand CIDR block i.e. choosing IPv4 addresses for AWS VPC and Subnets! It reasons why a certain IPv4 or CIDR block is chosen. Great Job explaining in a way a Novice like me can clearly understand!
It's silly how much I would pay for a comprehensive playlist of videos like these.
Don't mean to sound like a fanboy but that was an awesome video to say the least. Step by step, incremental knowledge and real life application and examples. Great job!!!!!
"... internet-connected toothbrush..." - I'll have to see if I can find one of those!
Excellent video, BTW!
why not, it will let the google know when you need a dentist visit. So they can run the ads..
I would suggest that nodes on a local network (LAN) communicate via Ethernet frames using OSI layer 2 (data link) MAC addresses. Whenever a device wishes to send a message to another device, it needs two things, the source MAC address (which it has) and the destination MAC address of the receiver, which it doesn't have. In order to obtain the missing piece of the puzzle, the destination MAC address, the sender node broadcasts an ARP (Address Resolution Package) package to a Broadcast Address. The switch (the Broadcast Address is associated with the switch) distributes the ARP package to all devices on the network and waits for a reply. Once the reply comes back to the switch, the switch updates its CAM table and sends a reply to the initial enquiring node with the destination MAC address. The sender can now send the Ethernet frame to the destination
Amazing, thank you very much! I've spent the last few days trying to work out CIDR (and how to get the actual IP addresses that are part of it) and this is the first resource that's been clear enough to get me to understand!
This has been so far best content available to actually understand Subnet / CIDR and binary calculations ...you got a subscriber ...amazing explanation
Glad you liked it !
This is one of the best videos on all of RUclips . Thank you so much!
Best explanation of IPv4 and CIDR i've seen. Awesome! Thanks!
Thanks for the very informative video. It made the whole thing much clearer even though I've been watching a lot of AWS tutorials lately. None of them went into trouble of explaining CIDR blocks.
Best explanation I had on this topic. Better than the one I got in the AWS new hire training when I joined. Thank you.
Thanks Ryan! It is a very good video. Especially using AWS to show example usage. saved my days
You've done such a fantastic job explaining this. Thank you very much!
Very good explanation of CIDR and IP v4
Thank you so much! I was struggling and you broke it down so simply that I finally understand. I appreciate you
Literally the best video on the topic. Great Work!!
Great Video I was having trouble knowing about ending the IP series but now it is cleared
A complex logic explained in simple terms. Thank you
You explained the concept very well. Thank you.
The best CIDR tutorial out there bruv! Your explanation lives upto your channel name. You just earned yourself a new subscriber. Keep up the good work!
The audio quality is stunning
Great video, great explanation, man! I see how it works now. Btw a great voice too!
Thanks for such a clear explanation....it's cleared quite a few things up for me!
If anyone is confused at 21:35 and further about why the 4th octet of the IP has to be a multiple of 16, then read on.
- From 10.0.0.0/20, we already have a range that goes from 10.0.0.0 to 10.0.15.255.
- The subnet mask: 11111111.11111111.11110000.00000000
- Now within the initial range, we need another subnet, which is 10.0.0.0/28.
- 10.0.0.0/28 implies that the FIRST 28 bits of the IP have to be fixed.
- New subnet mask: 11111111.11111111.11111111.11110000
- (32 bits in IPv4) - (FIRST 28 fixed bits in the new subnet) = (4 bits left AT THE END)
- 2^4 = 16, so 16 IP addresses are possible for the new subnet. (2^4 since we're talking in Binary.)
- Which 16 IP addresses in the given range of 10.0.0.0 to 10.0.15.255 are valid though?
- There are multiple groups of contiguous 16 IP addresses that are valid.
- IP addresses are composed of a Network ID and a Host (device) ID.
- It is important to understand here that the first 28 bits that are supposed to be fixed are only for the routers to understand to understand which bits in the actual IP form the Network ID (the 1s) and which bits form the host IDs (the 0s). So the network ID can change, but the number of bits it can take is constant (= no. of 1s). The host IDs can be any contiguous 16 (2^4) IP addresses from the starting range. Each set of these 16 Host IDs will have a fixed Network ID though.
- So it's not that the first 28 bits (Network ID) cannot change. They can change in the initial permissible range (from 10.0.0.0 to 10.0.15.255). They only have to be constant per 16 Host IDs. That is what is meant by the 1s and 0s in the subnet mask.
- The first 28 bits are only used for Network ID identification. The ID can change, but once one set is chosen, the Network ID has to be same for the 16 contiguous Host IDs possible.
- How do we find the groups of contiguous 16 IPs?
- Start flipping bits in the 3rd and 4th octets of the subnet (keeping in mind that the last 4 bits of the 4th octet cannot change and have to be zero to get the proper starting range) and check their decimal values to be in the permissible ranges of 0 to 15 for the 3rd octet and 0 to 255 for the 4th octet. Do not change any bits of the 1st or 2nd octet.
- The original subnet mask: 11111111.11111111.11110000.00000000
^^^^^ (last 4 are fixed at 0. The other zeroes can be varied within the initial range.)
- The new subnet mask: 11111111.11111111.11111111.11110000
- Eg: 10.0.0.0/28 is a valid starting range (3rd octet between 0 and 15, 4th octet between 0 and 255 and last 4 bits of 4th octet are zero). So the server will get IPs from 10.0.0.0 to 10.0.0.15.
- Eg: 10.0.0.1/28 (ie, 10.0.0.1 to 10.0.0.16) is NOT a valid starting range even though 3rd octet between 0 and 15 and 4th octet between 0 and 255, as the last 4 bits of 4th octet are NOT zero. The last 4 bits have to be zero (unchanged), as there needs to be a way to identify to which subnet an IP address belongs. If IPs are assigned from 10.0.0.1 to 10.0.0.16 (as in the case of 10.0.0.1/28) for server 1, then if another subnet exists and is assigned from 10.0.0.17 to 10.0.0.32 (ie, 10.0.0.17/28) for server 2, then in binary (electronic communication is in binary) the system will not be able to route the communication to the correct server. Why? 16 in a binary octet is 00010000 and 17 is 00010001. The routing system decides the subnet to which the communication needs to be sent on the basis of ignoring the host ID bits and taking them as zeroes (as they are the IPs inside the subnet and it is not concerned with them. It only cares about which subnet it needs to reach. The router inside the subnet will find the exact device.). So with 17 (00010001), the routing system will send the communication to the 1st subnet (10.0.0.1/28) instead of the 2nd (10.0.0.17/28), as it will ignore the first 4 bits and resolve them only on reaching the first server, which will cause an error, as 16 is the last IP of the 1st server.
- Eg: 10.0.0.16/28 is the next valid starting IP after 10.0.0.0/28 (3rd octet between 0 and 15, 4th octet between 0 and 255 and last 4 bits of 4th octet are zero). So the server will get IPs from 10.0.0.16 to 10.0.0.31.
- Eg: 10.0.0.32/28 is the next valid starting IP after 10.0.0.16/28 (3rd octet between 0 and 15, 4th octet between 0 and 255 and last 4 bits of 4th octet are zero). So the server will get IPs from 10.0.0.32 to 10.0.0.47.
- MANY more are possible.
- On observation of the above examples, the decimal values of the 4th octet of the valid STARTING IPs are all multiples of 16.
I hope that helps! Lmk if you have doubts by leaving a reply, I'll try to answer. I'm also available on Twitter at @harshgkapadia for any doubts.
PS:
- A good video on finding ranges from the CIDR notation: ruclips.net/video/MmA0-978fSk/видео.html
- A good video on finding the usable IP range, Network ID and Broadcast ID from an IP somewhere in the range: ruclips.net/video/POPoAjWFkGg/видео.html
Nice writeup
@@TheSimpleEngineer thank you!
man this helped me out so much!! i was wondering the exact same thing. the bit you said about network id has to be fixed for a given subnet made all the difference!! thanks a lot for this wonderful writeup.
@@rachana481 woah! Thank you for going through this huge thing haha. Grateful!
the AWS demonstration is really awesome; was it just me or any Mac user would be curious about how the calculator was deployed in such a convenient and cool way?
Thank you for explaining the CIDR. Awesome job and keep it up.
The best CIDR explanation video ever!! first time i actually get it! AMAZING
I think it'd be nicer to put show the Maths behind things like why there are 4.2 billion addresses. I just derived it and it's 256*256*256*256. For me it makes the whole things less mystical - like where are all these magic numbers coming from.
Anyways don't mind me just making myself some notes below:
IP addresses - how devices communicate/are located on a network
Total IPv4 addresses - 2^32
Class A - 8 bits allocated to the network and 24 bits allocated to the hosts. 2^24 IP addresses allocated to hosts in this range.
Class B - 16 bits allocated to the network and 16 bits to the hosts. 2^16 IP addresses allocated to hosts in this range.
Class C - 24 bits allocated to the network and 8 bits to the hosts. 2^8 IP addresses
-Companies determine how many IPs they need to get the right class range by calculating the least highest number of base 2 addresses
A router is assigned an address within a 2^32 in a local network where all the devices in the local network are assigned private addresses.
We're only using one public IP address that's assisting potentially hundreds of devices in a single network
Wonderfully explained! Clean and concise.
This video is really great. Do you have more videos related to this. Please point me to the correct playlist 👍
You are truly incredible. Thank you for this. SO well explained, Kudos brother!!!
Thank you for this, amazingly well broken down explanation!
good information. I found it useful and in very less time i cleared the doubt i was having. Thank you
Wow! Such a clear explanation. Really made the topic simple.
Awesome video. Will share with my youngins.
Nicely explained. Also very clear voice and thought process. Subscribed :-)
Excellent explanation , Simple Engineer Bro !
Simple engineer explained it simply..!
the best CIDR explanation!
Thanks for this one. Clear explanations finally on IP ranges and subnets!!!
Great video and explanation. Helped me out. Keep it up!
Great intro - appreciate it.
The best video that I found over the network....thanks for such an easy explanation :D
wow, what a great explanation! excellent video
Your explanation is superb! Thank you!
Great effort and very nice presentation. Thanks for sharing!!
Perfectly Explained 👍Thanks
Thank you for making this video!
Very nicely explained.
Thanks for giving clear concept
THANK YOU BUDDY this helped a little with my cybersec course :) so much easier you explaining it haha
Thank you so much but I have question a think this is an example of subnetting but the cidr is deferent!!
You said 2^4 gives you 16 IP addresses... don’t you have to subtract 2 to compensate for Network and broadcast ID’s?
Both are correct. There are 14 usable IP addresses of 16 total IP addresses. Good thinking Wastelander1972
That is correct!
What is the difference between creating a subnet with IPv4 CIDR block "10.0.15.16/28" and "10.0.15.32/28", and how many subnets can we create? Awesome video!!!
Cool video, man! These terms were really confusing when reading about them in A+ test prep...
Based on my understanding:
In case of 10.0.0.0/20:
binary: 00001010.00000000.0000 | 0000.00000000 (| represent 20).
The first half is yours.
"00001010.00000000.0000"
this part. You cannot change this part. If you assign 10.0.16.0/28,it basically means
"00001010.00000000.0001"
in the first half. It's not your space anymore.
And the reason why it can only be the power of 16 is because when you modifying
00001010.00000000.0000xxxx.0000 | 0000
, the last four digit is reserved. So if we take the first half in this case,
00001010.00000000.0000xxxx.0000
the minimal change you can do is change the last digit 0 to 1. Which adds 16 to the whole number. That's why it can only be the power of 16.
Your conclusion was better than the vídeo explanation :D, thx
Clear and understandable. Thank you
Excellent explanation!
Great video man. I've been trying to dive deep into aws vpcs this was great help!
Nice, good luck and thanks! ACloudGuru is a great resource.
Which mic did you use? Your voice is amazing!
Thank you! Studying for my MTA 366 this helped!
Amazing video! Simple explanation it straight away gets into brain! Thank You!
Awesome explanation
Great Video brother- thank you
Very well explained. one more subscriber for sure.
Thank u very much. Great explanation . You make it so simple
Thanks for explaning it well!
Would you mind explaining the routing table used in NAT ?
Awesome video, thanks! What app did you use for your dark chalkboard?
this is excellent - keep up the good work
Thank you. It was an awesome video.
Best explanation I've watched thank you
Very nice explanation!
Amazing Explanation . you nailed it :) I hope everyone finds your vedio to make life easier :D Thank you Sir !!!
Thank you soooo much for this video!!!
Great stuff man!