Hello everybody, I'm Daz Breamwood a scientist at the Media Lab where I run law.mit.edu and this video is an introduction to our chain and there are songs told or in preparation for the Open Media legal hack distributed legal hackathon series you can find out more about that at the legal hackathon.org and I'd like to encourage everybody to look at our chain and these tools and if you're Hacking team and participating in any of the venues around the world Consider using them and see what great stuff you can come up with So we've got a whole team here from from our chain and very impressed to say and they've got some great slides To kind of walk us through who you are and what your tool is and and how people could find it and use it I want to hand it off to Dan Connolly who's a rolling a Rolling developer and involved with the our chain community. So Dan take it away. All right. Thanks a lot so we've got our chain and our song is a is an application using it so There's a lot of blockchain projects and Our chain is addressing scalability is one of the main things it's addressing and so the chain in our chain Actually is concurrent. So this is kind of an interesting visualization of the Casper consensus protocol and the approach to correct by construction stuff So that's a medium article that I'm trusting you're gonna distribute the slides to so that's fun to look at That's an important part of the platform. So our chain is a cooperative. That's the way the governance the project is governance stuff like that Right so the the platform is built on this row calculus Which has got this very simple expression right there It's there's lots more to it, of course, but that's the front side of one page version of the platform right there So that's a lot of where the scalability comes from security It was also sort of built into the platform using capability base security and in some sense the sustainability comes form from the Governance using a cooperative So the core development all happens on github out there in open source. You can just watch the commits as they come in And you can see the release plan and all that kind of stuff nothing up our sleeves Okay, so the cooperative as I mentioned Greg Meredith is the president of the co-op Greg I don't know if you want to say hi So every week every Wednesday at 11 o'clock Pacific time anybody can he Unmute button hi there you go Hello Greg. All right, and everybody can see him every Wednesday at 11 o'clock Pacific time and those were recorded I Talked about the repository And then for developing smart contracts Joshy is your audio working or shall I take it away here? Yeah, I think we're good to go. Can you guys hear me? Yep? Yeah, great. So Kevin is going to show a little bit about our song later Which is a full-scale ready to you know impress anyone kind of DAP and for many of you who are new coming to the platform You might need a gentle introduction or at least a more gentle introduction And so I've put together with the help of Dan and several others here at the co-op Some some resources for that so what we're looking at right now is a tutorial that I've written called learn row line by example and It takes you through starting from that code snippet that just scrolled up is hello world and it takes you through some of the more advanced aspects of the the row line language and it's a It's an interesting language because if you've programmed other languages It might be a little bit of a mind twist at the beginning But once you get the hang of it or if you're coming to row line is your first language It really makes a lot of sense And so I I think that anyone can learn it even if you're just starting at a at a hackathon Some of those other links that I put on the slides include Beginner and intermediate DAP examples So like I said if you want to see how to build one that is like on its way to being enterprise ready K-Van's our song example is a good way to go This is a little more of a hello world level one It's called nth caller and the the read me that Dan's showing there is a walkthrough to build this DAP on Your own from the ground up so my code is there you can make it run And then you can you can build it all by yourself by following this you know one long page of instructions that I have The next link we don't need to see right now, but it's a it's a similar thing It's a minimal social media DAP that runs on our chain and the same thing it has a walkthrough for how to build it all by yourself Both of those projects use this JavaScript API that Dan and I and another developer named Chris have written together And it basically is a nice way to communicate with an R node from JavaScript So if you don't want to be an expert in gRPC or get that far into the weeds We have a really nice wrapper library so you can just make native JavaScript calls And the the final link is a similar library in Python that we didn't write But one of the teams that's building on our chain called proof media did did write for us So all those resources are going to be available at the hackathon for you to use and learn from Right and I'll take all of the what will publish the slides on our site And I'll also go ahead and kind of scrape the core resources and put it on our chain wiki page We have a little wiki page on our github site that we're using you know to get up pages for the event site For all of the tool vendors or the tool you know projects I should say And just encourage you to go wild and you know feel free to curate that and add stuff as we get into the hackathon or after So people can find all your great stuff Wonderful Okay so who's next? Kayvan are you going to talk about operating a node and stuff? You're muted Kayvan So we have this guy for running a node while Kayvan gets booted up here So a lot of us practice this every Tuesday morning We have our testnet running since September There's kind of traditional deployment in your garage or whatever you can also run it on It was on web services at Raspberry Pi Alright Kayvan Excellent thank you So let me share my screen I think that's the way it goes right for me to be able to walk through this One second Go share screen Cool So hopefully everyone can see my screen What I like to talk to you about is about one of our first distributed application, Arsang Arsang is a real-time mobile app Basically you could go and use those references, install it on your Android or iOS version Right now all the installations are free This is basically the beta version I do encourage you to install it and see how it works So besides the mobile app, there is an Arsang or a blockchain back in perspective And that's the part that I really want to talk about today The links there will take you to the repository So why don't I just do that as we talk about The entire project is open source So if you work your way to Arsang and eventually you find Arsang proxy and Arsang acquisition The names say it right there Basically acquisition is the part that we start acquiring the music assets that are coming in From Arsang perspective, music assets are basically just a bunch of files that are coming in And the metadata that's associated with that Arsang tells us how we can put these assets together In a way that it formulates a coherent music that we could distribute So why don't we go to the repo and talk in terms of the diagram Here we go, hopefully everybody can see that So we talked about the acquisition part And once we acquired the music, we put everything in our blockchain implementation Which is our Rnode servers We have a Roland contract that is the meat behind the entire magic This Roland contract basically is composed of a number of wallets that are associated with All the artists that are associated with that music that we're distributing And that really is one of the first, for the first time to my knowledge That regular artists without having to go through a label company Can publish their art, their music In a way that they can monetize it immediately Without having to wait till a label company publishes that and then get paid sometime later Now, as far as the infrastructure goes, again, since this is a mobile app We added some flexibility into the infrastructure by introducing Kubernetes structure So everything is in continuous delivery, everything is through CircleCI And once you check your code in, there is a number of events that get triggered And as a result of that, the entire code gets deployed into a Google Cloud And since we're running on a Kubernetes cluster, we could scale up and down To meet any kind of demands that we experience I do encourage you to go through the GitHub repo Look at the source code, look at this KIT spec that walks you through how the entire infrastructure is built And this project is infrastructure as code, there isn't really any hand-holding to get it to work Is there any questions that I can answer? You know, there probably will be questions people will have And we can curate those through the form at legalhackathon.org And I'll make sure they're available for you to reply to And fill out the documentation on your Wiki page One observation is that the way you framed the business capability, if you will Of this code base being able to instantly and kind of continuously put the power in the hands of the musicians And creators to get their work out there, distributed and to have a mechanism for remuneration Is very, very relevant, it's kind of the center point of the value proposition That we're hoping to have people hack on to come up with more ideas and potential solutions And so I just want to observe that it's directly on point for the theme of the Hackathon series So, back to you Awesome, excellent. I really encourage the people that are interested to actually walk through the repository What you just mentioned, again, the entire project is open source And what you just mentioned is really outlined in this right here The row calculus, the row language that we use for developing arching The entire contract, it's a multi-seq contract, is right here I do encourage you to take a look at it, go through the tutorial And it really should make sense once you look at the tutorial, once you look at the aspect And spend some time on it I'm looking forward to seeing everybody in Boston Great, and if you already did, and I missed it, I apologize But did you want to do a bit of a drill down on our song? Excuse me, what I want to ask is where do people go to just highlight it Install, config, run our song specifically And what kind of dependencies should they be aware that they're going to need I know that it's infrastructure as a service, there's no hand holding But if you could give people a little bit of a leg up and bottom line What the journey is going to be, that would be helpful And what's the key place to look for documentation that will get them into some of the answers that they'll need Certainly, so I'm assuming that we're talking about the back end, the proxy itself You might mention the front end though, you can go to the Google Play Store Right, very good, thank you So these links that we provide here, they basically take you to where you could download the mobile app And here is the Android version So you just go there and download it for free The moment you download it, you're allocated a number of tokens In this case, I think our default for the beta version is 50 tokens That allows you to start playing with music and get a feel for it So what that token will eventually translate to when we're out of the beta version And we're actually in production with a lot more assets is That's how the token gets divided into, or at some time gets monetized And that's how the artist will get paid As users consume the token, that token gets... The value that that token represents will be distributed among the artists accordingly Now going back to the question that you asked me regarding the platform itself So one thing that I have to caution you is we're still in development phase So we are trying to develop this platform and these apps as fast as we can And what that translates to is a lot of time our documentation is a bit lagging Now in this case, our purpose for our song was to showcase a framework Where a developer could come in and literally go to work immediately To develop our song, it took us two and a half... I think Greg mentioned that today or yesterday, two and a half developers And I think we did it inside, you know, by the time we got everybody together We did this project inside a month with two and a half developers And quite frankly, a lot of our time went into building the infrastructure Not so much the coding port The prerequisites for starting to work with our song are outlined in these installs This is a Scala project, and the minimum requirement is to have a JDK8 You need to have SBT installed and you definitely need to have Docker installed Literally walk through the repo, clone it Once you clone it, provide that you have met the installation requirement You should literally just say SVT compile and go Thanks, that's what I was looking for I know maybe because I'm not a great developer by any stretch Somehow just having the authoritative person say that's what I'm supposed to do It goes a long way when I'm looking at a blinking cursor Wondering how to use a brand new tool So that you kind of just saying it out loud, you know, like pointing it out on the readme Goes a long way Great, and I encourage people as people start interacting with our repo Please fork it, please make comments If the readme is not correct, let us know And we'll get it fixed If you come across a problem, probably somebody else has had that too Don't be shy, just let us know, we'll jump on it To run the project, there is certain requirements You do need to set your environment variables The code assumes that these environment variables are set And again, the readme goes through how you might do it And what else can I tell you about it? There is a script in the folder that allows you to do integration tests It also allows you to build the Docker images really quick The project as a whole does use the Redis cache to speed the process And the readme goes through how you could install the Redis cache on Docker locally Now, for deployment purposes, if you want to deploy this into the environment that it's supposed to be That environment is Kubernetes This part here allows you to go through and basically deploy the app into an environment I think the requirement for that is, of course, to have the SDK for Kubernetes and Google Cloud Did that walk you through? Did that answer your question? That's good. I hereby declare victory For real This is really impressive I can't wait to get my pause on it or sit at a table with MIT people that can get their pause on it And ride along to see how this is implemented and deployed And how we can configure it to reflect and support some more innovative business models and legal frameworks There's a lot of opportunity in this space now And we're hoping to catalyze some good idea flow and maybe get some great examples And you heard them, everybody, but I just want to highlight Be a good citizen, make the pull requests If you find errors or if you're able to fill some gaps Be a good community citizen and give back And maybe we'll give you a special prize or an MIT hat or something at the end If you've got a bunch of pull requests merged, then you are good And you're doing it the right way So, thanks. Is there anything that you all want to say at the R-Chain gang by way of wrap-up or closing? Actually, yeah, I'd love to say a little bit here William Gibson, the guy who wrote Neuromancer, he has a famous phrase The street finds its own uses for things And one of the things that we're so excited about is getting this technology in the hands of the brilliant people MIT and Harvard and all those folks up in the Boston area Because we have a feeling that the next 100 geniuses coming out of there Are going to figure out ways of using this technology that we never even thought of And I'm just so excited to see what people will do with this Our song is just one of hundreds and hundreds of applications that we can think of And we have a feeling that there are going to be these people who are thinking about this in ways we never thought of And are going to come up with innovations that strike right to the heart of the problems that we're facing We need to coordinate with each other in a completely different way now And we think that the good folks you're talking to are probably the generation we're going to have to rely on to solve those problems Here, here, so the gauntlet has been thrown down so all you hackers this weekend in New York And over the next few days in Kansas City and Brazil and at MIT, you know, pick up the gauntlet and see what you can do You know, together we are song Okay, well thank you very much for taking the time everybody and we'll look forward to seeing you online Bye bye now


Hi, my name is John, I'm a librarian at the University of Alabama and this is a quick walkthrough for faculty and staff on how to request electronic course reserves and add a library specialist to your Blackboard Learn course shell to help you with the upload process. First, make a reserve request with the appropriate library by emailing a copy of the reserves request form and your syllabus to the appropriate library staff. You can find this info and the form at the course reserves faculty instructions page on the library's website and I've provided a link in the description to this page. This form includes the instructions you need to follow to fill it out. The header field will be how the files will be titled in your Blackboard shell. After you submit the form and your syllabus, a library specialist will be in contact with you over email and you'll then need to add them to your course as a course builder so they can upload the reserve readings. To do this, start at the course home page, make sure that the edit mode is toggled to on, scroll down the left hand column and if the column is hidden just click to pop it out and then we'll get a list of your users. Click find users to enroll and for my example I'll use a name from the instructions page. So copy the username and then you want to paste that in and change the role to course builder and click submit. You should now see the person that you've added in your users list listed as a course builder. The staff member will add your readings and remove themselves from the course once they are finished. And that's basically it, so thanks for watching and if you prefer to upload your readings yourself, see the link in the video description for a walkthrough of that process.


What is going on guys, today I am back with another Destiny 2 video and today I bring you guys this kind of exploit of how you can get plenty of extra time, it isn't unlimited but plenty of extra time during this week's nightfall strike, the Sava Friends song. Now I know a lot of people are finding it pretty difficult to do, which is fair enough, this also can be done within the Prestige version 2, so if you want to change this to Prestige and do it very fine team you can. I'm going to demonstrate this to you guys though solo, as you can demonstrate it quite easily solo, I wouldn't recommend a strike solo though, unless you are a true boss player, which I am not. So basically we are load up a strike and I will get to the point of where you do this and then we will resume the video from there. Ok so once you spawn into the nightfall strike you just want to head to that first room, you will notice we start with roughly 14 minutes to do this. Doing this solo obviously time is going to go down a lot quicker and I am not going to have enough time getting to the next. But obviously it is just demonstration, this doesn't matter, you can do this in a fire team and you will get plenty of time and you will do this strike really easy. So you just want to come up here, I am just going to ignore every anomaly if there is any anomalies around here, I am just going to quickly showcase this to you guys, so you can get this done. So you have come to this room right here, within this room hopefully these leave me alone, don't hurt me people, thank you very much, get scalped. So yeah you have come to this room right here, you will see a few hive here, you need to take these out which we will do now, so once you have taken out these hive you will have to scan this door. So you scan the door or hack the door whatever. And what then happens is two more hive enemies drop, but within this space here there is three anomalies, one there, one on your right side or left side depending on how you are looking and one over there. Simple as that, so when we take out these anomalies, I mean when we take out these hive enemies sorry, we will resume the video and show you guys how you can exploit these anomalies. Okay so once you have taken out the two waves, this door will open behind this door, there are a few more hive enemies, behind that door there are either more hive enemies which you need to take out and behind that other door there is two caped knights and there is also an auger so you need to take them out too. We shouldn't take you too long. Okay so once you have taken out the last knight as we have just done there, new objectives as you will see will pop up and that door will open. Now there is an anomaly here as well which we saw the three in that far room, there is one there. So what you simply need to do is you need to run to this next area as we do so here. So keep going, keep going, keep going, shame you can't pull out your sparrow but it doesn't really matter, you get two minutes each run so yeah. So once you get to this area right here you will see a new area will load up a bottom so once that happens you turn back on yourself and head back to the cellarium I think it is called as we do right here. As you can see we go back to this area and we can see the anomalies are back so there is one and the others are in here and there is three in here. So there is one there, just like so, there is one there, just like so and there is one there just like so. So you can get two minutes per each run, it takes you about 20-25 seconds to run to the next area and then run back so you are gaining just over a minute and a half doing this each run. Now it isn't unlimited, you will get a maximum time of each pop up on your screen when you have done this too much and that is literally the maximum time you can earn during one of these strikes. So yeah, if you are fast enough getting through this first part with the fire team you will get a lot of time to carry on with this nightfall with it, it is as simple as that. So we will demonstrate it one more time and then we will end the video people. Okay so yes just keep going, keep going, keep going, there we go, we see it is back, there is another one, woohoo, 30 seconds, there is another one up there, just like so. To reload, one on your right and one on your left, it is as simple as that people. Now before we actually end the video do you guys want to win some juicy loot? I've got emblem calls, I've got sparrow calls, I've got gift cards, I've got much more. To win some simply drop a like and a video and leave a comment down below. Also join my discord server linked within that video description people. Also guys a massive shout out to Midelife Crisis for showing me this exploit. His Destiny 2 channel can be found linked within that video description. But yes guys that is the end of the video, I hope this helps you out if you are struggling with this week's nightfall. Thanks as always for stopping by, if you are new around here and enjoy daily Destiny videos be sure to subscribe and hopefully people I will see you on that next one.


I was indeed muted. Sorry about that. Now I'm not muted. I hope. As I was saying, thank you little Annie for the happy affiliate. Thank you Moomijumala for letting me know I was muted. That could have been bad. So we put it up at the VS Code today. And so it's a bit better than VIN because the Haskell language server works great. I mean, you can also set up for VIN, but I haven't done that yet. Does the audio work today or now? I hope so. Let's start with day four of the VIN code. Ah, it's fine now. Great. Thank you. And I made like a last minute change. So that was what happened. Anyway, let's go. Day four. Scratch cards. So we were missing snow. We got thrown up by a trebuchet. We found some gears for the gondola. And now we are trying to do something. Okay, so we hook it up. Circle of snow. Oh, there's more. It's warmer than it was on Snow Island. Humid. There's an owl sitting on the cross station. Oh, hello. I'm not sure. That does sound like something. This island island. But the gardener will know. He's, there's a lot of lore this year. Yeah, so yesterday we did three days. Hopefully we can do the same today. I don't think so. Because it's supposed to be tricky, especially in day five. But we'll see how far we get. In the next two or three hours. All right.  So beyond the lookout. It's an Easter egg. All right. So different island when you come up with a quick better naming scheme. Okay, let you borrow my boat. You go with the gardener got all these scratch cars. Can't figure out what I want. There's got dozen scratch out with the opac covering. So I just scratch up here. Got one. So this number set up. I work a bar, a list of winning numbers and the list of numbers you have. Okay. Okay. As far as the elf has been able to figure out, you have to figure out which of the numbers you have appear in the list of winning numbers. The first match makes a card worth one point and each match after the first double sub point value of that card. Okay. And cool. So let's get parsing. Example. Example is going to be a list of strings. Example equals put this in here. Let's op it all in. Okay. And what is it complaining about now? I think it's not actually complaining. I think it's just slow. Let's go here. Day four. Day four. Day four and time day four. Yeah. There's no parser. Okay. Cool. So let's say data card. So we're going to ask card ID and we're going to have nums. We're actually going to have this to be a set of integers. And we're going to have winning. Let's just make this a list because it's easier to parse it that way. And then winning. Maybe we have to fix it later. Let's see. Deriving. Thank you. Show. It kind of keeps on to the parse errors quite long. There was an error here. What is up here? Let me see. That's how you do data now. Maybe it has some illegal character. No, I'm not getting the parser anymore. I don't know what happened there. Let's see. We just arrived. Show. Now parse card is going to be string to card. And parse card stir. So first we're going to say a card space rest. Split at split at how long is it? One, two, three, four, five. Split at five string. And then we are going to say CID stir rest. It's going to be span is digit import. Thanks Fabian. I think Fabian has tuned in every year. It is a whole vibe. It's been a long journey. Okay. Now we are going to let's just say that this is equal to card array add int set stir. And we are going to say here a language gg 2021. And let's do print map parse card. Oh, no. Card. An example. Okay. We parse the numbers. Yeah. Okazaki, for those who don't know, wrote the book on functional data structures in like 95. And it's just it's been the standard since then. Let me see. We had like split on somewhere here. Maybe it was in day three. I feel like what was it day two? Yeah. Split on. I'm just going to copy paste it. I should have like a U2 library that I import from. I don't know. I feel like then you have to watch every show to know that continuity, which is a bit annoying. Okay. Then we're going to say a so ns stir, ns stir, we stir is going to be split on. And then we're going to split on this bar character here. Okay. And then, okay, we're actually going to ignore the first character here. Or no, actually. Okay. And then we're going to take ns stir. It's going to be split on ns stir. And we stir is going to be split on ns stir. And then we are going to say map read add int. We're actually going to trace it now. Yeah. So parser combinators make parsing this super easy. But they also introduce like backtracking and stuff. So it's actually not that bad to just hand roll a parser. If you know exactly the format, right? Okay. I need to dump the semicolon and then let's filter, not no. So I was actually working on, I'm working on right now something where I just, I don't have that much memory. Like I have a 500 megabyte file and I need to parse it. And I don't have the memory to kind of be backtracking all the thing.  So I can actually just hand write the parser. And because I know exactly the format, it's a lot more efficient that way. So yeah. So parser combinators are super good if you're doing something complex enough, but they're not always the best. Let me see. Okay. Let's see. 48, 48, 83, 16, 17. Okay. Okay. As far as yours, you have to figure which of the numbers you have here in the list. Okay. So now we're just going to do and gg. So the one I read is also just like the default read parser combinator. parser combinator read, which is this read P. And then you can just kind of integrate with a read instance. So then you just basically define the read instance using this read P. And you have to flip between read P and that other one, which is read S. And then you can go from read S to like a read instance. And it's super nice, but it introduces backtracking. So and which is fine when if you're but if you're running out of memory, you might need to hand roll something. And even so this one is not the greatest, but then I moved on to a I didn't go to mega parser, but I went to like the other parser, like one of the parser libraries as opposed to be super efficient, and it was still slow. So it's okay to hand write a parser if you know exactly the format like we do here. So let's say import data.set qualified data.set set. So now to do part one solve is we're going to take a card and we're going to turn an end a num winning. So num winning of a card. And we don't care about the ID here. NSVS is equal to be going to be set dot from list NS. And set dot from list BS. And then we're going to do a set dot intersect. I think it's like that. So we're just taking the intersection, yeah, intersection. And then we are going to do set dot size of this. Okay, let's now do map num winning.parseCard 422100 card one has five winning numbers. Okay, which okay, so here have card one has five winning numbers. Yes. And then you have often you have four of them. Yeah. Okay. So we have four. And then it's eight points. So let's write a two to the power of the number of winning. This is the power of none. Okay, we need to do from integral, but it's actually yeah, so we need them. We need to remove one first. So I'll get eight points, two points, two points, one. And here we're getting 0.5. Because because if it's going to be negative one, okay, let's just do it differently. f let f equals, I have number is equal to f and larger than zero, then two to the power of n minus one, else zero. And we're gonna, we're gonna do this. Let's do it. There's also a pred function for removing one. What do you mean? Ah, but the predecessor function. Yeah, okay. So if you negate, yes, that's a good one. Let's see. Eight, two, zero, two, two, zero. And then do some 13. Let's do part one. And then we need to put f here. And let's say print part one, for example, 13. I actually want an int here. Two integral. Maybe I need to do a round. Nice. Let's see. 13 points. We get the possible input. Let's see, a new file. Okay. Now read file input into a print dot part one dot lines, preload dot read no parts. That's not good. Let's see here. Trace, show, ID. And let's just print out the string card. Oh, okay, because it has more spaces in it. Let's just say rest is drop while not pasted it. Okay. Right. Now I don't need to show anymore. Two, two, six, four, seven. Let's see. All right. Part one done. Boom. 26 minutes. Not bad. Okay. Your part of writing. So when you realize it was already printed in the back of your card sometime, you win copies of the scratch card below the winning card equal to the number of matches. So if card 10 were to have five matching numbers, you would win one copy of each card, 11, 12, 13, 14, 15 copies of scratch cards that scored like normal scratch cards and have the same card number as the card they copied. Okay. So if you win a copy of card 10 and it has five extra ones. Okay. So this is going to be some functional memorization, I think. Let's see. So you win a copy. Okay. Cards two, three, four. Original card two has two matching numbers. So you win one copy each of cards three and four. Your copy of card two also wins one copy of cards three and four. Your four instances of card three. Wow. You win four copies. Okay. So process all the original copies, scratch cards until no more scratch cards or one, including the original set of scratch cards. How many total scratch cards do you end up with? Okay. So first of all, we don't need to care about the actual numbers. Okay. So we are going to we're going to do part two string. So first we're going to just return a list of the cards. Okay. Part two, example equals. Okay. So we're going to map. Okay. We first we have to parse the card. And then we are going to say card to see it. And we're going to say card, ad and winning card. So let's print. So just for each of the cards, we're going to see how many of them are winning. So one wins four, two wins, two, three wins. Okay. So we're just working with these numbers. We don't care about the actual numbers on the card, which is good. Your 14 instances of card five, one original and 13 copies have no matching numbers and window markets. One instance of card six. So now we have to figure out a good data structure or algorithm here. Let's see. Let's see. Okay. I think maybe we can just get away with something quite simple. So we'll have like a list where P two, so we're going to take the list of ends of ends of ends. So what I want to do is I want to say P two. So if I have here, so I'm just going to take the first card and I'm going to say I have one instance of it. And then I'm just going to add kind of instance numbers to each of them. I'm going to see if it works. Okay. So this is going to be like this. Okay. So now I'm going to construct a new list and start. Start is equal to, so it's going to be one X and map zero to X's. So then I have one copy of the first card and then zero of all the others. Okay. Now go. Empty is just going to be empty.  This is copies. And I don't care about the ID, but I care about the wins here. It's going to be X's. This is going to be, this is going to be C. So this is going to be the number of the cards. And this is the ID and X's. Okay. This, so for this one, I'm going to say a where. And so the edit and the rest is going to be split at win X's. Okay. And so then for added, I'm going to say edit prime is equal to map and C is going to be, so it's going to be an, okay. So we're going to add number times ANC on edit. And then what we're going to do is we're just going to return C. See, concatenate it with go edit prime rest. Okay. Right. I need to combine these lists. Let's just say go start. Okay. No, this is not, it's actually not like this because this is going to take, if it's zero, it's just going to say one. I think it's maybe just N plus AN. Let's see what happens now. So I added with one copy of card one, two inches of card two. Ah, no, one inches of card two because all of them have one. I start with one of all of them. So I get one inches of card one, two of inches of card two, two, four of card three, eight of card four, 14 of card five, and one of card six. Excellent. Now, how many total scratch cards do you end up with? Ding, ding, ding, ding. Let's see some map first. So starting on the example, let's run it and see if we got the right number. All right. We did day four in 40 minutes. Nice. Let's go for day five. It's going to be tricky. Hmm. But we're doing quite well. Let me actually, I forgot to do this yesterday, get init, get add, we had old Haskell files and then let's do code. Don't get ignore. Oh, okay. Days one, two, three, and four. Okay. I don't have a repo actually. All funny games, little day five part two. Okay. Anyway, we have an hour and a half or more. So let's start with day five. Let's see. We create a new directory, day five. We open up day five that it just says module main where main equals print part one, example part one. Example is going to be strings usually. Example equals an update list. Okay. Okay. Do cd day five. Okay. Let's see. You take the boat by the gardener, garden, water source, island, island is the water source. Okay. We ran out of the sand to filter it. Can't make snow with dirty water. Don't worry. It's over. It gets more soon. I've been missing making. Okay. So much pressure. Okay. While you barely have time to agree to this request when it brings up another, while you wait for the ferry, maybe you can help us with our food production problem. The latest island, island, almanac, blah, blah, blah. The almanac has, oh my God. That's a lot of stuff. Let me just see the input. Okay. This time I'm actually going to just put the example. So in a file, because it's quite long. Yeah. Now we're getting into there. Let's see. Okay. And so what is an almanac? Okay. See the soil map. So it's 514. Okay. It's all the seeds that need to be planted. It also lists what type of soil to use for each kind of seed. What type of fertilizer to use for each kind of soil. What type of water to use for each kind of fertilizer and so on. Every type of seed, soil, fertilizer, and so on. It's divided by the number, but numbers are reused by each category. So I want to do this. He doesn't want to do this. Okay. Seed to soil map, fertilizer to water map, water to light map, light to temperature map, temperature to humidity map, humidity to location map. Because I always describe how to convert from numbers from source category to numbers to destination category. That is section seeds. That is our seed number, the source to a soil number and its corresponding destination. One more. It's got entire ranges of numbers. It can't be converted. It's like extremely contrived, right? Each line within a map contains three numbers. The destination range start, the source range start, and the range length. Okay. So it's always three numbers. Okay. Okay. So let's just start parsing this. Almanac, data almanac is equal to almanac seeds, seed to soil. Let's just start with these triplets. Then soil fertilizer, soil to fertilizer. Okay. Fertilizer to water, water to light, temperature to humidity, and then humidity to... Okay. First we're gonna do where LS equals and lines example. So what I'm gonna do now is I'm going to... We're just gonna split this list on the spaces. So we're gonna copy the split on function again, but now we will change it to be an equality. Actually, a... Okay. C string, R, R, S, and not equal to C. I think this is actually correct already. So, and now I'm just gonna do here a split on, let's just see what it does. G, C, D, F, I, L, H, S, O, D, 5, 10, D, 5. Okay. And we seem to have managed. So now a seeds equals... So this is actually gonna be like this.  It's gonna be a seed string. That's gonna be special. And then it's just the rest in order. Have you already done the first tone day? Yes. Keep on posting these to YouTube like last year. I do, but because I'm a Twitch affiliate, I actually... It has to wait 24 hours before it can be posted anywhere else. So I've uploaded the video and it will be available at 11 o'clock. So in two hours for the first three days. But now we're trying to catch up with... So we did day four and day five is supposed to be hard. So I hope it works out. Okay. Seed string. Okay. It's gonna be seed string. Let's just make it like this. So SDS. Okay. And then SDS. No, because I want to do the same transformation of all these. Okay. Seeds is gonna be seed stir. So we're just gonna say seeds space. Okay. And rest is gonna be split at length seeds. Seed string.  So we're gonna say endsters is split on rest. And then this is gonna be equal to map read add int. Endsters language. I don't know if I can have guards here actually. Okay. So the seed string here is a list of strings. Right. But we know it's just gonna be one line. No. That was the problem. In the input. Yeah. It's also one line. Good. So we have the seeds. Now for the rest it's actually gonna be rest prime is equal to map tail on rest. Okay. Just warning me that it's partial. That's okay. That's the rest prime. Okay. Then we're gonna map. So num list where pass. Oh no. Okay. So let's see. Maybe we're actually gonna give the pairs here. Right. Okay. Okay. PR. Let's just say PR stir is equal to case. Endsters split on R1. And then it's gonna be ABC is gonna be map read add int. Endsters is equal to A, B, C. And this is gonna be string here. And then we're gonna we're gonna map the tail and map PR tail. And now this is gonna be a list of these. Right. Nice. Okay. Okay. The parsing is happening. So now I'm just gonna call this maps. Okay. I'm not gonna because we're probably gonna transform it anyway. So max seeds. Maps. Okay. Because it's like you know. This is one to two, two to three, three to four, four to five, five to six, six to seven. Now let's see what happens now. Rather than list every source number and it's corresponding. Maps are the same. So each line within the map contains the destination range start, the source range start, and the range length. Okay. So 98 corresponds to 50 and 99 corresponds to 51. Okay. Second line means that 50, 48. And because the destination is the first one, the source is the second, right? Okay. Any source numbers that aren't mapped correspond to the same destination. So seed number 10 corresponds to soil number 10. Okay. Yeah. So seed 79, soil 81, light 74, temperature 88, humidity 78, location 82. Okay. But do the maps never overlap I guess, right? Yeah. I'm actually gonna flip it. I know it's different in the example, but it's just quite annoying. So 48 goes to 52. So we wanna check the, so I'm gonna, what I'm gonna do is, so it's a range, right? So, okay. How do we go? Here's 79. It's not in the second one, but it's in the, okay, let's just define first the function. That's very simple. In range, int, in range. Well, this is the source destination length. I don't actually care about the destination. I just wanna know if I less than equal to s and no, that s is less than equal to i and i is less than equal to s plus l. Boom. So this gives me whether it is in range. Now, let's see. So transform is gonna give me transform. It's gonna give me int. There's a list of ranges and it'll give me a new int. Transform int i to, okay, it's empty. It's just the same. Transform i source test, range, m at if case, in range, im equals. Otherwise, equals to transform i axis. Now, if it's in the range, that means that we want to do a destination minus source. So we just do it like this. So we're gonna say, see, because this one is like, so 98, 99 correspond to 50 and 51, right? 50 and 51, right?  Now, this is gonna be as 50 minus 98, which is gonna be minus something that transforms it, right? Shouldn't it be i? Yes, that's a good point. It should be within the range, right? Let me see. So 50, so this one is gonna be 50 and 51. Yeah, exactly. So it's less than, okay. Now we're gonna say transform all, takes an int and a list of list of int, int, int, to an int. Transform all is equal to, is equal to folder. And I never remember what is the type of folder. Yeah, so it's a folder. It's gonna, we're gonna transform, transform. So it's gonna take the range and the number, okay? And we are going to transform with the, let me just flip these here, just so we make it fit into folder more easily. Okay, so we're gonna transform, we don't need to do this, then transform and the initial element is the i and then the list. Okay, so let me now do a part one. We see we have that somewhere here, right? Let's put that further down here. This is gonna be list of ints. We're not gonna use these almanacs. This is gonna be list of ints. And we're just gonna say map, flip, transform all, maps, see it's ding, ding, ding, ding. A transform, all right, 1843, 87, 42. Okay, that's not good. Ah, because it's soil number, seed 79, hmm, dollar take one. So it goes to seed soil 81, 14, 57 methods, transform works, but my folder is messed up, 81, fertilizer 81. So 14, 14 is now going to, ah, sorry, it's because it's fold R and not fold L. So it's going in the opposite direction, which is kind of annoying. But so we're not gonna build up so many thunks here. So it doesn't, it doesn't actually matter. Nice. This is part racing. All right, now it actually works. So we get 82, 43, 86, 35. Okay. So part one is minimum of this. Ding, ding, ding, ding, ding. Okay, no, read file part one. Okay, that's a pretty big minimum. Boom, part one. Fold R is more efficient than fold L. Yes. Because it's because of laziness.  Well, fold L versus fold R, fold R. So it is subtle.  See? So here's a fold R. So here you have fold R. So this is a list and then you're applying the function, right? So here you can apply the function to one right away, right? Because you already have the first argument. And also the 0th element, right? It's the end, right? So you can kind of apply it right away versus with fold F. You have to kind of wait. It's a bit, it's a bit difficult to explain. See? So fold R is like this, right? So F, high one, right? So you can finish doing this and then you start doing this, right?  So FXY can be computed using only value of X. Yeah. So, but you can't get away with fold L prime, which is strict. So and then it forces the application right away. Otherwise it kind of builds up a bunch of thunks because it doesn't need to evaluate them right away. So I should, I should explain this better, but it is a, it's a subtle point. So if you have a lot of stuff, it might not be better, but here we don't have so much stuff because we only have like five lists. So it's fine. Okay. Let's continue to part two. This one is apparently hard, but we have 45 minutes for our initial budget. Okay. Three minutes reading. Line looks like a seeds line. Actually it describes a range of seed number. Little Annie Jess Brotson. Hot sip. Not bad. It's quite hot, but good for the throat. 79, 14 values. Oh my God. Second range. Yeah. This is going to be messed up. And it will be very nice if we could transform an entire range at once. Let me, let me just check in out and just see what happens if we do it the crazy bad way. Um, so seed two ranges to seed two ranges. X, Y, rest axis. Okay. So, um, it's going to be equal to X. Right. X comma dot dot comma X plus Y. Right. It's a dot dot dot. How do I always forget this in text? Okay. So there's one. Ah, there's no comma. I think it's not going to compile. Uh, so this is a list of ints. So it is only a few plugins seeds, but we can stream it, which is amazing. Uh, wait, let me just see. One, two, five. I always forget this. It's because I have this extra parenthesis here. It will think it's a list of lists. Okay. Now let's, uh, let's see how bad it is on the example. It should be quite easy on the example, but, uh, because it's not, it's just 28 numbers, but, uh, let's break out the big guns compile with optimizations. Okay. Now it's going to be crazy slow, but I just want to see. Because it's, uh, it's not going to, I'm also, um, um, if it's a few billion, actually, int is not good. Int can take a, uh, it's going to be slow, but, uh, okay. Now we need to figure out how to, how to basically transform a range. I'm going to take a short break, but I'll be right back. Yeah, but this will be running in the meantime. I'll be back in one minute. I'm back. I went to the bathroom, but I had an idea. Um, instead of representing seeds as one int, we should represent it as a range. And, uh, what is a range? Well, a range is actually a list of ranges, right? Because each transformation is going to affect a part of the range, right? So, uh, let's see how we do this. Um, let's just say here, um, transform range integer, integer. And then we have these guys, but not with the, uh, okay. So, uh, transform range. Okay. And then transform all ranges. It's going to be folder or transform range. There's his folder prime still there. Transform all ranges. And let's just make sure that these are all evaluated. So now we just need to implement this transform range function. And then we're good. So the base case is easy. I equals empty. It's going to be empty transform range. So, uh, first of all, we have to, we're gonna have to loop or both. So let's have a, let's look good this way. Transform range, uh, i, x, m, m's is equal to, um, range prime of i and m. So we're going to operate on all the i's here. Let's see. So the affected and unaffected, we're going to be transform range i, n. And then we are going to say transform range unaffected m's. What is this? We are going to prefix it with these ones. Okay. Transform range prime of a, so if there's none left. Okay. So let's see. Let me see here. Transform range prime m is going to be affected so far. I've been affected so far. a, f, u, a, f, i, and then let me do it this way, not actually this way. I think it compiles better. Um, I don't care about the m here. So the empty case is easy. Now we have to write that difficult one, which is going to be transform range prime. So now we're just looking at one. So it's just source destination and links. a, f, u, a, f. And here we are looking at, we are looking at the, um, this current range. So range start, range end, no range start, range length. Okay. Case. RS less than or equal to S. So the source. And so if we're in the range, S less than RL. Okay. Um, so here we're in the range. So now we have to split this up. And we have to split it up by saying, um, so the range here is, um, are you going to split it up? So now we know that this particular range is affected, but how many are affected? Uh, so that it affects, um, so let's just do an if statement. So if, uh, no, sorry, this is going to be RS plus RL. So if a RL is less than or equal to R, so then it just affects the whole range. Okay. Then we just, um, we say transform range, uh, prime RNG. And then all of them are affected in, in a prime, uh, UAF axis. So we're gonna have another case here otherwise. So if it's not in the range, I might be that the RS less than or equal to S might be that part of the range is affected, right? I'm getting a bit confused with other ranges. But the thing is that because you might be splitting up a range, but I mean you get the idea what we're trying to do here. We just have to get this tricky function right. Let me just, uh, see the example. Okay. Let me see, um, transform range prime. So this is the function we're trying to write. And we have, uh, this map source destination, right? And we have, uh, this range, uh, range start, range out. Okay. Transform range, prime. Uh, let's say it starts at one and it's gonna shift everything by one. It can shift five numbers by one. And we are talking about range starts at one and ends at 10. So what this is going to do is it's going to return two new ranges. It's going to return two new ranges, right? It's so, uh, so because it's the numbers one, two, three, four, five, eight, nine, 10. No, that's making it even more difficult. Zero, two, zero and the range length is 10. So it's going to return the ranges, right? It's going to say that, uh, zero. This is a range now. And it's going to return the range, uh, zero, come on one. So zero has been affected. And then these are going to be shifted by one. So it's going to be two, three, four, five, six. And then the other ones are going to be unaffected. So that's going to be six. So this is actually going to be, um, two, two and five, right? The range length is not affected. Uh, well, it is affected. So it's going to affect two, five of these. And then starting at six, there's going to be one, two, three, four. So what's going to happen is that we're also going to have to merge ranges. Okay. So let's see. Let's just make this easy, right? So where the change is equal to D minus S. This is the change we're going to apply to the range. Um, here we're not going to change their length. So as you can say, RS plus D minus S. This is the change operator. I was going to put life to it. Yeah. So the real problem is how to split the range into the correct, like the affected parts and unaffected parts. Uh, okay. So, and then this is going to be UF, MAPC affected. I think this is actually just a trick. Okay. So we have, um, S, two, S plus R. And now what part of this is, uh, what, what part of this intersects with a RS to RS plus R. Okay. Um, this is a tough one. So we'll finish this one and then we'll go to burn. Okay. So let's see. Um, if S plus R, if S is less than or equal to RS, and, uh, S plus R is larger than equal to RS, then we're in the range, right? And then there is some intersection or it's actually this or, um, RS plus RL. Oh, there's a lot of like equalities that are going on here. Let's just see. Okay. So let's just say here, so we're going to take, um, so if the range is less than or equal to S, and, uh, there's, so if there's zero, so now we're going to say zero to one, right? Um, and, um, an RS plus RL, and so larger than S, then we have something unaffected in the beginning. UAF is equal to, um, it's actually just going to be RS to the range start to the length of it is a RS minus S. Ah, okay. I can probably just do it like this. Uh, that you are, you're so unaffected lower, it's just RS and then RS minus S. UAF higher, so the higher part of the range is going to start at, um, S plus R, and the length is going to be, um, something, and then we just kind of filter out, then in F, S and UAF L larger than zero, filter larger than zero, second. Otherwise it's just an empty list, filter something here also, and then, uh, UAF is just UAF L, UAF high. This is such a, because it's not like an interesting data structure problem, right? I think we just, if we just have, get this correct and it's fine. So let's just write the affected range. The affected range, uh, this is also just a case if it's like connected, if it's all within, right? Yeah, this is like, um, it's like an intersection problem, right? And so let's just write out the ranges, okay? R1 is equal to S, S plus R. R2 is equal to RS, RS plus RL. Now I want to see how, how, how they intersect, specifically how RS intersects, R2 intersects with R1. So if R2 is entirely within, so case one, then we just have S, RS plus R, RS, case two, is that they are like this. Case three is, um, is, um, the other case, right? So it's S, RS, S plus RL and case four is just, you know, no intersection at all. Okay, so now let's just compute the cases. Okay, AF, UAF is equal to case, um, case, uh, R1. Okay, so let's check here. So if S is less than or equal to RS and, um, RS plus RL is less than S plus R, case one, case two is S is less than equal to RS plus RL. And, uh, no, okay, case, this is RS less than or equal to S. I think we need more here. And RS plus RL, so RS, so S is less than RS. Okay, so this is RS less than or equal to S and S less than or equal to RS less than RS plus RL and RS plus RL are less than S plus R. Uh, ah, yes, good point. RS is S plus R plus RL. Okay, let's renumerate these because otherwise it's going to get confusing. Two, three, four, five. Let's actually start with this because it's the easiest case in some sense. Um, yeah, let's just do it over. Okay, here we have that RS plus RL is less than, is less than S and, uh, this is actually two cases, right? Or S plus R is less than RS. So then the effected is empty and the unaffected is just RS. Okay, so we've done, uh, let's move right here. I remember doing something similar when I was writing a video game engine thing where you do collision checks, but then you don't have to, um, you don't have to do too much. Actually, um, because then you just need to check the collision here and actually find the range that comes out. Okay. Okay, so here we have S is less than RS and RS plus RL is less than S plus R. So here the entire range is affected and none of it is unaffected. Now we're going to get nowhere into the non trivial cases. So here RS, I'm probably missing more like checks, but it's okay. RS is less than equal to S and S plus R is less than RS plus RL. Okay, here what's affected. So what's affected is, uh, it's just sourced to, so S to R is affected, but unaffected is going to be RS, S minus RS, um, and uh, S plus R to RS plus RL minus RS plus R. I think it's like this. Here RS is less than equal to S and RS plus RL is less than S plus R and S is less than equal to RS plus RL. Yeah, I think that's how you do the same thing here. So here the affected range is, um, start set S and RS plus RL minus S. Okay, and then the unaffected ranges are two, the unaffected one is RS, S minus RS, um, and RS plus RL, RS plus RL, and then um, S plus R minus. So there's some, uh, similar to this case, right? Which is good. Okay, I hope this is, uh, we're not messing it up completely here. Case five. Okay, here S is less than equal to RS and RS is less than equal to S plus R and um, S plus R is less than equal to RS plus RL. Okay, so here the affected range is from RS to, um, S plus R minus RS, and the unaffected range is a, ah, sorry, right? Okay, so here S is within the range, so here S is outside the range. So the unaffected range is actually from S plus R to RS plus RL minus RS. Okay, otherwise error transform range prime uncut case show R1 or R2. That RS plus RS, where does it say RS plus RS? Did I fix it? Okay, we ran it for 15 minutes, it didn't work. And now we're just going to say AFUAF, uh-huh, line 82. All right, so the affected range was correct, um, but actually, so here we're dealing with, we're supposed to be doing, uh, this case. So S to RS correct. And then this is RS to S minus RS, that's correct. This is, uh, S plus R, which is correct. But, uh, you're right, so RS plus RL, uh-huh, wait, so RS plus RL here is, um, this is going to be 10. Let's see, we are indeed in case three. So the second one is wrong. The sixth is correct, but so RS plus RL is supposed to be 10. Okay, and it is 10, but S plus R, I have to have, uh, parentheses. Okay, this is good. And then we're going to just do C on AF. Okay, so now to see if this actually works. Okay, now we have the transform range for one of them. Now let's go back to here. Okay, transform range, form range, mms is equal to, um, so here you're going to say where go. Now we have to kind of look through it. Yes, I know that it's going to be an off by one error somewhere, but we can only hope. Okay, um, okay, so first we do, um, transform range prime. Okay, so empty. Okay, so now we go again and it's going to be, uh, it's going to be affected, unaffected, transform AF, UAF. Okay, and we start off with this and this and I. Okay, and, uh, this is just AF, UAF. Now let's do it here again. Uh, this is affected, unaffected. That's one map. This is going to be equal to, uh, AF and, uh, transform range, uh, UAF, mms, range prime, AF UAF, uh, rrs is equal to, uh, where? AFn, UAFn is equal to transform one range, uh, and here's the m and here's the r, transform one range, a, these can actually be, uh, let's just make them into int, int maker. Okay, so what is the loop here? So we transform one range and we take one of them and then we just, yeah, we just loop kind of, okay, yeah, exactly. We're not adding anything. It's going to be, uh, transform range prime, AF, AFn, UAF, UAFn, rrs. Now let's look at the example. Let's put that, uh, here and now we're just going to look at what happens for the example. Okay, for the first part of the example print, transform one range, no, transform range, transform range, okay, and we're just going to put the 59, 14, 55, 55, 13, okay, and then the maps are, um, no, right, 98, 52, and 50, 52, 48, 57, 13, 57, 13, all right, good. So after the first round, 81, 14, let's see, part two, transform all, transform all ranges and then see, see two ranges. We got to change this one to just be the ranges. Okay, now it's saying transform all ranges. Now I want to just get the, okay, I think what I'm trying to do is, um, transform all ranges, change ranges, sheets, maps on the example, but here it turns an empty list. It's not good. Okay, one minute again, another bathroom break. It's all the tea I'm drinking, it'll be right back. Okay, it's not doing very well. Let's just see first, okay, so then, then transform range, this is actually supposed to be I, okay, so 50 and then 48 of them are bombed by two, and then from, so I don't think this is correct, right? So from 79, so that's 89, okay, that one is not affected by the first one because it doesn't start at 98, and then for 52, so 298, basically, it's going to get shifted by two. Okay, so that's okay. So this is the correct for the first one, and then for the second one, 15 to 37, from 15, so 15 plus 37 is 40, 15 plus 37, 45 plus 7, that's 52. Okay, so that shouldn't affect anything. Um, 52, 53, 54, that's not affected either. Okay, so the second one, the third one doesn't affect any of 15 to 0 to 15, and that matches what we saw before, right? Okay, now let's take three, so from 58, three, we're gonna take eight. Okay, let's just do all of them now. Ah, okay, now it actually worked. I don't know, yeah, maybe I just didn't compile when I ran before. It's definitely not by one somewhere because we're getting a lot of zero ranges. Let's just see, now let's just filter larger than 0.2, and then we're just gonna take the minimum. Okay, so it works for the, this one, the example. Now let's check if we are really killed by those up by one errors, or what? We should really be filtering out those zero ranges right away. Um, okay, there's an uncut case after the first map in the input. That's not good. Um, let's make this nicer. Okay, so here, this is s and s plus r, and then this is rs plus, ah, okay, so here they're equal. I think this should be a little less than, maybe that's the problem here. Um, yes, we'll meet you Muala. You've helped a lot so far, but uh, that's not really helping. Uh, so here we have the case that the end points are equal. Okay, so this one, so it's actually, um, it's this case right here, except the end points are equal. I'm just gonna make all of these equal, and screw it. The minimum was zero. That does not seem correct. Some of them are zero. I'm gonna see if this one works, but I don't think it will. Oh my god, it was the right answer. Okay, we completed day five. Boom. It only took us, uh, an hour, an hour and a half, or two hours. I think two hours, yeah, because we finished day three in like 45 minutes, the day four and four five minutes. Okay, cool. Let me just see, uh, why some of these were zero. So this is RSRL, RSRL, S, or RS, S plus R, S, and none of these seeds are zero. RS, RS plus RL. I don't know why some of them would be zero, because, um, so change changes them, right? So RS plus D minus S, are some of these ranges zero? Like are some of these numbers the same? Uh, so here we have zero source. So I guess it just, for some of them, it just, you know, I worked too long on this, um, already. Like there's just, there's just some case where, um, where it, like the change will be, it's gonna, it's gonna change, um, into a zero and that's, it's doing that. So the length is the same, but, um, so then D minus S becomes RS for some reason, but it's still, that's okay, right? Because some of these, like zero is a valid seed, like index, right? So I don't, I don't know exactly. So I think one of these should not be, maybe one of these should be like a less, not a less than or equal to, so the sum off by one error somewhere, but we got away with it, um, which is good. Anyway, that's all for today. Day one, two and three will be up in 10 minutes on the YouTube channel. And now I'm gonna upload this to the YouTube channel and then it will be available. 11 o'clock tomorrow, European time. I'll probably stream tomorrow as well. We got to keep going if we want to catch up. A, heard a mixed message is about six and seven, but you know, we're at least on day six now. And, uh, so if we do six and seven tomorrow, then we're only one behind, right? So then we can do eight and nine, but you know, it's not really, okay, so six and seven are both really chill, seven, okay. So tomorrow we might be able to do six, seven and start on eight, and then we're probably, we're about to catch up. So we'll see, we'll see what happens. I might have to stream later also because I'm going for a Christmas market thing, I think. Anyway, thanks for tuning in. I hope you enjoyed some Advertisement Code. And what was the key takeaway here? Day four, it was just parsing and then some number stuff. Day five, I think the key takeaway here is if you're getting overwhelmed, just split it into cases and then write all the cases down. Because it wasn't any like, oh, you can just do minus, minus and then it works. Because it was really, you really had to do a case by case. And it worked out. We had a weird part at the end. And if anyone knows why, please comment. I would like to know. All right, thank you so much. See you again tomorrow. Bye-bye. And then, yes, okay. See you again tomorrow. Bye-bye.