Hello, everyone. Welcome to the Mural Academy webinar on upgrading a large model site. My name is Rajanith Gautaram, developer educator at Mural Academy. And I'm joined by my colleague, Sandram Mardz, who is going to help me facilitate today's session. Our speaker today is Cameron Ball. He's a senior architect at Catalyst IT. And in today's presentation, Cameron is going to share his experiences on upgrading model sites. And in particular, in the session today, he's going to talk about upgrading a large model site. And for those of you who do not know, Cameron was the winner of the best presentation at the MuralMode Global 2023. So we are very excited to have Cameron as our presenter today. And with these words, I will welcome Cameron to start with his presentation. I know that he's got a lot to cover. So over to you, Cameron. Hey, thanks. Yeah, thanks for the welcome. So this is a reimagining of the talk I did at the Global Moot called Upgrading the Largest Moodle in the Southern Hemisphere. And I've got a few slides to talk about the company that I work for, which is Catalyst IT. Got my red catalyst shirt on. We're a Moodle partner, and we're all over the world. And we're pretty good at what we do. And this slide is pretty interesting, because I can show you where I currently am, which is right here. I'm from Perth in Western Australia. And here's another nice picture of our team doing team stuff. Here we are at some conferences and hacking mainframes and all that kind of good stuff. And here's a little bit about myself. I usually do this slide at conferences. My shell is ZShell. My desktop environment is KDE. My terminal emulator is console, and I use Tmux. My text editor is Emacs. And the percentage of larger sites in the hemisphere upgraded is 50. David Integer is 1729. Bia is pale ales. Arms is two. And here's a picture of me. The double hurricane thing is a reference to Global Mood two years ago when I had to fly through two hurricanes to get there. Right, so about the talk, the technicality is moderate. It's not super technical. I don't really do a deep, deep dive into all the technical issues we face. It's more of a high-level overview, but you do need some technical knowledge. Is it a case study? Yes. Is it as glamorous as the title makes it sound? Is probably not. It becomes a lot less glamorous when you realize that most of the world is not actually in the southern hemisphere. I want to set some expectations about the excitement level of the talk. The first Global Mood talk I did was about queuing algorithms, and that's about as exciting as it gets.  This particular instance of the talk might be a bit lower because I don't have all the flashy videos and silly stuff I included when I was at the Global Mood. If you want to see those, you'll have to watch the recording that's up on YouTube. But still, we'll try and make it exciting and fun, right? OK, so prologue, let me give you a bit of background to how it all began. It all actually began at the Global Mood in 2022 when I was having a chat with my colleague, and it went something like, hey, have you ever upgraded Moodle? And I said, I was so smug, I was like, yeah, over 100,000 times because I used to work on Moodle Cloud, and I was in charge of upgrading the sites. But the big difference is those are very small sites, not really big ones. And then, hey, would you like to upgrade the largest Moodle?  I like that emoji. That's why that's like that. But I said yes. And then throughout 2023, that's what I was doing until I came to the Mood to talk about it. So the question is, how big is big? There's lots of ways to measure bigness. Here's one way, which is 5.44 terabytes. And that, it's probably bigger now, but that's the size the database was just before I gave this talk the first time. So it's a bit of a hard number to visualize. So I've put it in slightly different terms. This is the Nintendo Entertainment System, and it has about, well, it has 248 bytes of memory. And so if you express the size of the largest Moodle in the Southern Hemisphere in terms of Nintendos, you get $2,656,250,000 Nintendos. So it's a lot of Nintendos. And if you stacked all the Nintendos on top of each other, I calculated it would get you more than halfway to Mars. So now that you all know how big it is, and how it's easy to visualize way, let's talk about our approach to the upgrade. We had two paths we could go down. One is actually running the Moodle upgrade script on the largest Moodle in the Southern Hemisphere. And the other one is delete the largest Moodle in the Southern Hemisphere and start again. And obviously we didn't really delete it. Like, that's not what we're talking about here, but it's sort of building it again from scratch and migrating the data over. So these are some things we had to think about when making that decision. The existing site has loads of content. Obviously with the database that size, there's heaps of stuff there. The database is full of lots of nonsense as well. Having existed for as long as it didn't being as big as it is, the database is full of weird DB state and things that are just orphaned. And if you've ever worked with the Moodle database, things often get left behind and stuff gets weird pretty quick. And we actually inherited this site from another vendor and there's quite a bit, was quite a bit of customizations in there that we really didn't know what they did, but we hadn't had the time to sort of go through it and clean those up. And here we've got another picture, the state of the largest Moodle in the Southern Hemisphere visual analogy. Sorry, that font should be different. I went through and changed them, but that one I must have missed. Oh, no, no, I wasn't supposed to change this one because there's a little video game thingy. So this is the kind of conversations we were often having with the client here. So, hey, Catalyst, the Moodle's behaving weird. Could be an obscure bug. Can you help us out? And it's like, yeah, yeah, no worries. Catalyst, world-class support and solutions to any issue you may have will solve it. And so later, but not much later. Wow, Catalyst, that was amazing. You solved it in a timely and professional fashion. It's like, yep, no problem, just a bit of invalid DV state, easy as when you're as competent as Catalyst IT. But then the follow-up to that was always, what, how did it become invalid in the first place? And our response often went something like, oh, well, it, we don't really know. Then that's like I said, it's old and big and lots of stuff has happened to us. The database is really, really confusing and hard to untangle. So with that in mind, the path we decided to go down was, oh, sorry, some conclusions here. The existing system presents too many challenges and risks. The technical debt has become unmanageable and I've got an updated visual analogy here. It's not fine, no reason let it last this long and get this bad, revised analogy. Right, so with that in mind, the decision we made was to go Greenfield, start again with a clean database and obviously migrate all the content over. So I wanna take a quick second here to sort of discuss the upgrade philosophy and talk about this word here, amortization. Like there was a, there's the definition of amortization, the usual one. But I like to use it in sort of this context where you, when you're working on these kind of things, it's really tempting to try and automate everything, like as programmers, we really want to write scripts to solve all our problems. I know I do. And sometimes often you end up spending more time writing the script than you would have if you just did the job manually. So throughout the entirety of the project, this was in on my mind and I gave myself some constraints. So only write scripts when it makes sense. So the first thing to think about is how long would it take to do the task by hand? How error prone is the task? How hard are the errors to fix? And how simple would a script be? So I gave myself this limitation. If the script doesn't work in two hours, give up and just do it manually. And I'm talking about things like moving over cohorts or assigning roles and all those kind of things. Yeah, script will be easy, but I might make a mistake. And in reality, it's simple enough to just go into the UI and look at how it is in the old site and then just copy it into the new one. So there aren't that many sites in the Southern Hemisphere, largest Moodle sites in the Southern Hemisphere to practice on. So we were a bit naive when it came to this and the expectation that we had was that we just get rid of Moodle. Something, and then everything would be fantastic. There we go, there's a nice recap of that. In reality, it wasn't that easy. And what you're seeing scroll past the screen now is a checklist of all the things that we had to do to make sure that the new site was working as expected. And there's that one again. Okay, so here's the slide where I start talking about what we actually did. So phase one was core customization analysis. I mentioned there was a bunch of core customizations who didn't really know what they were. So we had to go through those. The requirement here is a way to manually audit every single customization in the code base for each customization, work out what it is, decide if we need it in the new code base. And the strategy for doing that was just identify every piece of code in our code base, which is not part of vanilla Moodle 3.9. And there's a really good tool for that. You might have heard of it, it's called Git. And so there's the Git command and just tack on the WC-L there. And you can see we had 1042 customizations on top of vanilla Moodle 3.9. This is not plugins, this is Moodle core, like stuff that had been done to Moodle core. So the tooling to deal with this was a spreadsheet, keyboard shortcuts to focus windows, small bespoke shell script, which I'll show you in just a second, copy paste and eyeballs. So here's a table that like we used a spreadsheet to keep track of all the customizations. And this is kind of what it looked like. So on the left there you have the commit hash in the 3.9 site, the commit message, a column to track whether or not it's needed in 4.1. If it's an MDL, which some of these are, they're MDLs that have been backported or MDLs that may not have been finished yet, the status of that, and then ultimately the decision on whether we needed it or not. So the workflow was you select a shelf, a cell from the spreadsheet, control C, the commit hash, use the keyboard shortcut to switch to the terminal, run the shell script by pasting the commit hash into it, use your eyeballs, and then use a shortcut to go back to the spreadsheet, move to the appropriate cell and paste the commit hash if it exists in the new code base and check MDL status if necessary. Here's an example of what that shell script looks like. So you run it with a commit hash, you can see it's found it in the largest moodle in the Southern Hemisphere. And then it also found a very similar looking commit in vanilla moodle 4.1. And you can see some of the lines are a little bit different like file lib down, if you can see my cursor down the bottom here, lib file lib has a few different changes to it, but it's mostly the same. So chances are that this is the same thing, maybe with slight refinements, but if these numbers were wildly different, we'd probably go and investigate a little bit more. So I have a demo of that, which I will try to show you real quick. So here's the spreadsheet, not the real spreadsheet. And the workflow is, okay, we've got this commit, so I'm gonna copy that to my clipboard and then I can go down to here, type checkback port, whack it in there and it found it, but then in 4.1 it didn't find anything. So I know from looking before that this, so there's no commit in moodle 4.1, the MDL status of this one is that it's still open and the conclusion is we need it. And so then I can go to the next one, go back here, have a look, same thing, it didn't find it in 4.1, so I come back to here, NA, open, still needed. Then we can have a look at this one and we can say, hey, look, that is pretty much exactly the same in moodle 4.1. In vanilla moodle 4.1, this change exists. So it copied the commit hash of it in 4.1 to the clipboard. You can see down the bottom, this one. So I can just paste it in here so we can track what commit, so it's closed and not needed. And the last one we have in this list, okay, so this one looks like a core hack, right? It doesn't have any MDL, it's not in 4.1. And it says work around. So that's an NA for MDL status and yeah, we need it. Well, maybe we don't need it, we need to go and look at what the hack is in more detail. And so that's how we did that, and that worked really well. So discoveries from this process. We had a list of stuff that we would need to cherry pick into the new code base. And we did find a lot of weird stuff. We found some craft strings, all of those. There's an MDL now to get rid of those. These strings exist in moodle still, I believe, and are just not used anywhere. And generally not much else. Moodle's pretty good here. Like if we had to cherry pick something, it just kind of worked because moodle doesn't really break backwards compatibility. So that worked out really well in our advantage. So the experience for this phase, 7.49 out of 10, I would do it that way again, if I was doing an upgrade project like this with that little script and the spreadsheet, it was super quick, even though there was over a thousand, you know, we just go through, dum, dum, dum, dum, dum, make notes of the ones that need investigating, go investigate them, get rid of them, fix the problem properly, whatever. But yeah, overall that was a really good experience. So phase two, which is plug-ins analysis. The requirement here is we need a way to manually audit every plug-in in the code base. For each plug-in, work out what it is, decide if we need it in the new code base. The strategy was get a bunch of humans to do it. So tooling was a spreadsheet again. Zoom calls, collaboration. And here's an example of what the spreadsheet looked like. We just have the path to the spreadsheet. So path to the plug-in, the type of plug-in, whether it's one of our internal plug-ins, whether we forked it from a community plug-in, whether it's just a vanilla community plug-in, the branch it's on, all that kind of stuff. And we just had to go through. There was about four of us. We just went through the spreadsheet, checked what the plug-in is, if it works in Moodle 4.1, or if it needed any work done on it, then we'd fix it up. Or sometimes just remove the plug-in entirely because the functionality is now provided by core or just not needed anymore. We made some contributions throughout this process. The most significant of which was to Q-Type Stack. We fixed their GitHub actions because it was broken. The tests weren't running properly for different versions of, for Maxima compiled against different LISPs. I'm an Emacs user. And so that was an unexpected joy to get to play with LISP as part of upgrading a Moodle site and get paid for it. Then we improved this project called Maxima Pool Docker, which is abandoned, but we are currently still using it. There's GeoMaxima now, which is a better choice. And we'll probably look to moving to that. But if you use Maxima Pool Docker, we have our own fork called Dockerfile, we have our own fork with a branch called Dockerfile improvements that makes it easier to build the Maxima Pool against a specific version of Q-Type Stack. So you might wanna check that out. Then we had to have some tough conversations about things. It's like, hey, we identified this plugin that we think you don't need. Can we leave it out? It's like, yeah, yeah. And that's to be continued. We'll come back to that later. This right here is a commit in the Q-Type Stack plugin that I'm very happy that I authored. I mean, just look at, that's the commit message. Just look at that. Better normalized floats for cross compatibility between SBCL and GCL Maxima. Doesn't get better than that. And in that commit, I fixed a comment and I changed it to say, Oilers number. Instead of saying the base of the natural logarithms, it now says Oilers number. And you can go look at that in Q-Type Stack, if you want. But for me, that was a fantastic thing that I got to do. And there's Oiler himself who's very pleased with what we did there. And no worries, big E. And also good job coming up with functions. They turned out to be really useful. And even 18th century mathematicians know how competent Catalyst IT is. The experience for this part of the project, 7.71828 subtract E over 10. It was just okay. But I have no idea how to do it better. I mean, it's a very manual process, right? You just have to go through the plugins. There's no real fancy tricks to automate that. Now we're on to the third phase where things start to get a bit interesting. We had to figure out how to migrate configuration. So sure, building the code base is one thing, but then there's the whole Moodle configuration table plus the plugins configuration. So the requirement here was that we had to manually audit every single config value for core and plugins in the database. And for each configuration value, we had to work out what it is, decide if we need it in the new database. And we also need to bring across other things such as user profile fields, roles and the role assignment matrices, like who can assign what role to other people, web services, grade scales, scheduled tasks, cohorts should be in that list as well. And the strategy here was automation. We did start doing some automation here. And there was also a lot of manual work too, exactly like I was talking about before. In some cases, we just decided quicker if we just go into the user interface and click, click. So naive again. One thing we thought we could do was we thought it would be really clever if we took the existing database for the 3.9 site, upgraded the code to Moodle 4.1, ran the upgrade script and then we'd have a new config table with all the appropriate values after the upgrade scripted ran. So then we just restore that back in, just restore those tables right back into the new Moodle and everything's gonna be great and profit. That's what we thought would happen. But in reality, it didn't really work that way because of things that are really good about Moodle and have never caused headaches, lack of referential integrity, back up and restore. Sure, there's more, but that's all that I had written down. But the reality was that there were things in the config table like IDs and there was just like a string of comma separated IDs. And of course, if we bring that back into the new site, the IDs that is referencing might not exist and all sorts of stuff like that. So we were back to manually auditing stuff again. So what we used for this is a thing called Report Custom SQL which is developed by the Open University. Hello to any Open University people who are watching. And PHP scripts and eyeballs again. So for a basic case, all right, so this is an overview of the whole thing. For basic cases, if it's feasible to simply look at the UI in the 3.9 site and click, click, copy, copy, paste, paste things over to the 4.1 site, we did that. For example, grade scales. If the thing has import, export functionality, we'd use that. So roles is a good example. You can just export the roles and then re-import them. If a core API exists, we could use that to make a script. Cohorts was one of those where we were able to make a script. And here's an example of one of those scripts. Very simple, took five minutes to write. I just got all the cohorts out of the database in the 3.9 site, put them in a JSON file, pass the JSON file, looped over them all and ran this script on the new site which created the cohorts in the new site. Pretty easy, pretty straightforward, worked really well. A more complex case is comparing configuration values. This is the CFG table and the plugin CFG table across different versions and environments. For the initial migration of the 3.9 site to the 4.1 UAT, that's like staging environment, we needed to go through every config value in the 3.9 production environment and compare it to the value in the 3.9 UAT environment, compare it to the value in the 3.9 staging environment, compare it to the value in the 3.9 production environment which obviously would be the same because we're going through those values. The value in vanilla Moodle 3.9 and the value in vanilla Moodle 4.1. And by doing that, we sort of gave us an idea of what these configs are and what a sensible value might be in the new site. Oh yeah, and we did also compare it to the value after upgrading from 3.9 to 4.1. So that clever idea about upgrading the 3.9 database to 4.1 turned out to be useful after all because we could see if the upgrade changed the value. And so what we did was we used that report custom SQL plugin to export JSON files of the relevant tables, MDL config and MDL config plugins. And then we wrote a magic script that can help us audit it. So the magic script has the following features. It can create placeholders. So I should say what it does first, it generates a shell script at the end of it that you can just run and it will set all the config values to what you want them to be. And so it could create placeholders in this script so you could go back and fill in sensitive information like database credentials and stuff like that. Ability to create variables. Oh, there you go. That's what I was talking about. Ability to stop and resume. That was cool because there's so many config values. I could sort of do a bunch of them, stop, come back to it later and it would pick up where I left off. It intelligently can skip irrelevant configs. So for example, if it sees that the value is the same in all the environments, it's like, okay, you probably don't need to worry about this one. Let's just set it to what it is everywhere else. And it has a beautiful UI fully compatible with NC escape sequences. That's just a fancy way of saying it works in a terminal. And it was only about 250 lines of code. So that was nice. It sort of fits all the ticks, all the boxes. So we can do a demo of that real quick, hopefully back here. Okay, so in this directory, I have the script generate let me make the text a bit bigger. I have the script generate config commands and I have the various exported JSON files. And all I have to do is run the generate config command script and tell it the name of the shell script. I want it to make config Dutch and then I go. And you can see it's already skipped one of the config. So I've got 850 conflicts to go through. It already determined that the first one I didn't need to worry about. And here we go. We have a config that's different. So I can pick one of these and choose the value I want to fill in. Say for whatever reason I want it to be C. I can just press C. I also have the ability to grep code bases to kind of see where the config is used. That was pretty useful. But for this one, I'll just press C. And then you can see it skipped another one. It's gone to four out of 850. So in this case, what I'll do, I'll just skip it because maybe it's irrelevant. In this case, maybe I'll add a variable. If I press V, I can type variable. Then in this one, I will use skip this config but come back to it because maybe I'm not sure maybe I want to revisit it later. And this one doesn't matter. I'll just skip it and I'll just stop for now. I skipped a whole bunch there, went up to 86. So now if I have a look here, I have config.sh. And it's generated this nice CFG script. There's the variable I made. If I search for it, you can see it's used here. So later, when I know what the value of that's supposed to be, I can fill it in. And you can see it's got all these little things here to set the values. And when I've decided I want to come back and continue auditing the configs, I can just run the script again and just jump back to 17 because that was the one where I said, skip it but come back to it. Now I decide maybe I want it to be A. And then it jumped all the way back to 86, which is where we left off. So that's how that script works. And that was, it's very much a bespoke sort of script. If people are interested in that, you might want to contact Catalyst IT and see if we can work together to get it in a more generic fashion so that other people might be able to use it because the way it is right now, a lot of things are hard coded to our specific use cases. Okay, back to the presentation. An interesting case was the role matrices which I mentioned earlier. So there's quite a few roles on this site and the thing where you can say which roles can assign roles to which other people and that kind of thing was big. And we couldn't find any, maybe there is one. I still don't know of it. There's an easy way to migrate this across. And so what I did, at least from going for 3.9 to 4.1 UAT environment was I just manually did it like I had two screens open and just copied it. And then I did it again. I did that again to go from the UAT environment to the staging environment. And I was thinking a bit like, oh, I sure as a shame that no one invented a way to write code directly in the web browser that would have saved me a lot of clicking. And then I remembered JavaScript exists. And I felt really silly and I figured out a sort of funny way to do it. This JavaScript code you can just run that in the browser on the roles page and it will spit out a big JSON string that has the states of all of the checkboxes. And then on the 4.1 site, you can run this piece of JavaScript code with the string from before and it will set all the checkboxes and then you just press the save button. So I'm gonna, I tried to demo this at the moot and it didn't work because it was really difficult to see the screen, but I will try again. So we need to go back to this slide. And I copy this. Okay, so here I have a more basic example. I've made a nice little pattern here of how the roles can be assigned. So I'm gonna open up my console and I'll just paste in that. And there we go. It spat out this JSON string, which I can now copy and I should be able to go to here. Here's the 4.1 site and you can see it doesn't look like the 3.9 site did. So when I go back over here, I can grab this. Actually, first I need to make this checkbox info JSON. So paste that up and it didn't work. Oh, I know why. Nope, still didn't work. I'm gonna try if it doesn't work this time I'll give up again. No, okay. I don't know why that's not working. I had it working just before I did this, something weird. No, in back ticks. No, I don't know. Wait, do I just need a semicolon at the end? Is that the problem? No, I'm gonna give up. It does work. It sets everything and it's all super nice. Maybe I'll make a separate video of that where it actually works. And the experience of that, I rate it at eight out of 10. The configuration migration script was great. Really, really liked using that and I would do that that way again. And now phase four, which is quality assurance. So the requirement here was to triage issues and fix the real ones. The strategy was to keep fixing things until they're fixed. And the tooling for that was a spreadsheet and patience. So here's the continuation of the tough conversations from before. So catalysts, the functionality provided by a plugin that we wanted removed has stopped functioning. And then of course, that's because we removed the plugin. But oh, we need the functionality provided by the plugin. It's like, oh, so should we install it? And would you like all the configuration for the plugin migrated? Yeah, even after we finalized it and migrating is more difficult now. Yeah. All right, so of course we did it and it was fine. But probably the lesson learned here is we should have just brought across all the plugins and then removed them at the end rather than removing them earlier and then finding out later that they were actually needed. Catalyst provides you with enterprise grade patients. So we made some discoveries throughout this phase. We found plenty of bugs. Here's a few listed. There was a sort of backwards compatibility breaking web service change. You'd have to go look at the MDL, but it's not really, or was it? Actually, I can't remember exactly what that was. We might maybe just go have a look now. What was that one? No, it actually was a backwards compatibility breaking web service change. There was another one where changes to the nav system made some nodes completely inaccessible. This one was really weird. There was something odd that changed which made the embedded question filter go crazy and just start duplicating the question over and over again. I think that one's fixed now. Some minor issue with a format plugin. And an honorable mention to debugging curl headers and proxies. We use proxies and we had a really, really interesting bug. This MDL sets this curl opt and that's fine. But if you're using the header size thing from curl info, that includes the size that it would be before the headers were suppressed. So even though the headers aren't there, this value is as if they are. So any code that uses that header size to pass headers will break on sites with proxies configured. So I followed this MDL. It's not really Moodle's fault. It did bite us with this block panopto. So if you're using that and you have a proxy and things are behaving weirdly, that could be why. The panopto people did respond and I don't think they fully understood what the bug is because they just closed the issue, but the bug is still there. There's a workaround which is documented in the issue. And here's a little summary of how that felt to deal with. So in a debugging curl request, it's pretty fun. Everyone likes it. That should say debugging curl request with proxies. I don't know where that text went. Then reading libcurl documentation. And then of course, reading the libcurl source code. I'm a serious person. This is not sarcastic. I really, really enjoyed taking a deep dive into libcurl to figure out what was going on with a Moodle plugin. So the experience, it's five out of 10. It's not the most fun thing in the world, but in QA never is and there's not really another way to do it. You just have to keep fixing the stuff until it's fixed. So that was it. What's next? We've got to do content migration, as mentioned. Big site, lots of content. They obviously want it in the new site. A lot of that work is done now, because this slide is as if it was in the past, I didn't update it. Working on updating integrations with the student management system, that's still ongoing. Heaps of cool plugins being developed. Some might be open sourced, I'm not sure. And that's it. Contact Catalystite. Multi-region IT service group that provides enterprise-level technical support for open-source software. Thanks for listening. I think we're doing pretty okay for time. Yeah, we've got heaps of time left. So we can do some questions.  Yeah, I think there's some questions in the chat. So this one says, this one says from Matthew, a very interesting presentation. Thanks. Your choice to do a new installation and migrating rather than running the upgrade, model upgrade process on a large dataset implies that the later is bad idea. What are the main issues you were trying to avoid in the model upgrade process or script? Yeah, good question. It's not necessarily a bad idea. It was just a challenge for us because as mentioned, the site is so big. The database is so big and the data in it is not of the highest quality. So running that script is a big unknown. And of course, after upgrading it, all the weird stuff that's in the database is still in the database. One of the main things we wanted to do was sort of get a clean slate. Running the upgrade script wouldn't give us that. The only way to get that is to just start from a fresh site. So I hope that answered your question. There's another question from Celine. While upgrading this large model site, did you have to restore existing courses? And if so, how did you proceed? Yeah, so we guess, yes, we did. And we did some magic where the old site still exists, right? So we just use backup and restore and we wrote a plugin which I don't think is public that writes the backup file to shared file storage that both sites can see. So it gets backed up to the shared storage and then the new site can see. They goes, oh, hey, I've got a course to restore and it restores it. So I mean, it basically backup and restore, right? Another question from Vigendra. How long did the whole migration process take? I think from start to finish, close to a year, like eight months to a year, I can't remember the exact timeframe, but it took a long time to get through everything and test everything's working. Another question from Rohit. What is the downtime in the whole process, including migration? Well, that's part of the magic of doing the greenfield thing, right? Because we had two sites, the 3.9 site never went anywhere. It was always there, always live and students could just be using that. And as soon as the 4.1 site was ready, just tell everyone, hey, please stop using the 3.9 site. So they have different URLs, both still exist with different URLs, just say like, hey, students, use the new site. So no downtime, basically. Okay, there's one other question from Luis. So did you upgrade from model 3.9 to 4.1? If so, why did you choose 4.1 and not one of the new versions of model? I think I did see that in the chat. It's to do with LTS. Yeah, so Moodle 4.1 is a long-term support release as was 3.9. So that's why we went to 4.1 because it will continue to get security fixes whereas some of the other new ones weren't. The next LTS is 4.5, I believe. So at some point we'll be moving to that as well. One more question from Santosh. What do you think about the blue-green approach for the upgrade? I don't know what blue-green approach means, Santosh. I'm sorry, could you rephrase the question? Maybe can answer another one while Santosh rephrases. So there's one more from Vijendra again. What would be an estimated downtime if you did not start with a new site? So if you had to upgrade that existing site here. Yep, so normally we do these kind of things. We're continually upgrading Moodle with security but even the 3.9 site, there's downtime. There always is and we plan for it and we have a window of something like five, six hours, something like that. So it would have been the same for the upgrade. We would have tested it, heaps, and then we would have said, hey, for this eight-hour chunk of time or whatever, site will be down, run the upgrade. If it works, then go live. If it doesn't work, roll back. So yeah, like a eight-hour-ish kind of window. I think Santosh has come up. So he says the blue-green approach means upgrade the site in the backend while the site is live with minimal downtime. I mean, that's, yeah, you could do that. Like upgrade a separate, like have it, upgrade it, and still have one not upgraded and switch it over or something like that. I suppose that's a thing you could do but the way we generally do it is you upgrade and if it doesn't work, you roll it back to how it was before. So I don't really have much experience with that particular approach, sorry. There's a question from Sebastian. Where will you publish the demo of the JavaScript? Where will you publish the demo of the working JavaScript? Good question, I don't know. Maybe I'll get in touch with Moodle and we can sort that out and put it on Moodle's YouTube channel or something like that. I don't know. It won't be on my personal YouTube or anything like that. I'll try to find somewhere more official to put it. There's a question from Louis. I'm not sure if you want to answer, but what did the big upgrade cost? I don't have the details of the costs of it. I'm sorry. I don't think I probably would share it even if I did. A question from Tarsos. Did you run a final upgrade at some point after freezing the old production instance? Or how? So we never... Yeah. Sorry, I finished repeating the question. Yeah. So did you run the final upgrade at some point after freezing the old production instance? Where did you ensure that you had the latest data in the new version? So yeah, as I mentioned, we didn't really upgrade the old site. It's still there. It still exists. All the content is still in it. So we never had to freeze it. We just told people to stop... Well, the institution told people to stop using that and all the academics stop using it and everything. Regarding having the latest data in the new version, we... All of the students' information is stored in an external system, so it's not that critical. What matters is that the cost content is there. And I touched on that earlier with the content migration stuff that we did. I hope that made it a bit clearer. Yeah. A question from Paul. What type of database did you use? Postgres or MySQL? Yeah, it's Postgres. A question from Sebastian. Can you please give us a link to your personal YouTube channel? You can look up camera in 1729 on YouTube and you'll find me, but there's nothing there about Moodle. A question from Vichendra. What professional development was done to get the users familiar with the new site? So, unfortunately, I don't really have any information about that because we, Catalyst, just handled the technical side, handling sort of onboarding, all that kind of stuff was done by the institution. So, I don't know. Sorry. Another question from Nicholas. Fast forward to Moodle 4.5 LTS release. So, will you simply be upgrading a direct upgrade using the upgrade script? Yeah, that's very likely how it will be done going forward now that we've sort of got the database in a much cleaner state. And we've got sort of a handle on everything that's going on in the code base. Yeah, we would be doing rolling upgrades rather than getting rid of everything and starting again. A question from Paul. How big was the DB instance, memory, CPU? Sorry, I don't have that information off the top of my head. I'm not actually a sysadmin, so I'm not in that every day. 5.44 terabytes. Big. Okay, one more question from Santosh. How did you manage migration if the data is continuously generating on the 3.9 life side? At a certain point, it was just said, stop making stuff for the 3.9 side. That's it, just stop. That was handled by the institution, not by us. A question from David. Maybe I've lost something at the beginning, but how did you guys find out the inconsistencies of the previous database? So, I think I understand the question. It's just often we get reports from the institution saying like, hey, this thing's acting really weird or hey, there's an error saying invalid ID that's popping up on some course or some module or whatever and we go in and look at it and we see something as referencing an ID that doesn't exist. So that's what I meant by that. There would have been heaps of stuff, like we didn't find every inconsistency, we just know they were there and cause we were getting like reports every week or so about this kind of thing and just cleaning up, cleaning up, cleaning up. And that was one of the reasons why we sort of wanted to go with the Greenfield thing and have a fresh DB. Okay, we've got two more questions and then we'll wrap up the session. So there's one question from Danielle. Is the old side switched off? The old environment switched off? No, I think it still exists. I'm not 100% sure on that, but I'm pretty sure you can still access it because there could be something there that they want. I don't know what the institution's plans are for the old environment if they're gonna eventually just turn it off completely or what? And the second part to that question is that does the old data have to be retained or is this old data in the new environment? So you've got that old system. Does the data need to be retained there or now that it's migrated, you can just use the new system? Yeah, again, that's something that's up to the institution. Their choice, we just handle things from the technical point of view. I don't know what their particular policies about data retention and all that kind of stuff are. Okay, and the final question from Vigendra. What theme is used for the new site? It's a custom theme specific for the institution that we developed. All right, thank you Cameron and thank you everyone for all the interesting questions. So we had a very active question and answer session. So thank you very much. So we'll wrap up the session now. And yeah, if you've enjoyed the session, we'd love you to consider getting involved further with Moodle Academy. You can visit our Get Involved course which you can access from the front page of the Academy site. You can suggest ideas for new webinar presentations or courses that you'd like to see on Moodle Academy. And if you want, you can also contribute by co-creating our courses or you could be one of the presenters just like in this presentation. And we're always also on the lookout for community members who want to help us translate our Moodle Academy courses. So if you want to help do the translation of our courses, you could jump into our Translate Moodle Academy course and get started and help us translate our courses and existing webinars into different languages. And you can also help spread the word about Moodle Academy. So you could tell your friends and colleagues about the courses we offer and the events that we run. And when you complete a course, you could earn a badge. And if you're an educator, you could consider completing the Moodle Educator Certification. Are you ready for the MEC quiz? And once you take that, one of our certified service providers will support you through the entire certification process. And thank you, everyone. Thank you so much for joining today. And thank you, Cameron, for your wonderful presentation. And thank you for the very active question and answer session. And I hope that everybody found the session very useful. And we hope to see you in a future upcoming webinar on Moodle Academy.


Hi everyone, Joe for JasperJasperysCaseRace.com coming at you with a pack of prism basketball sell-out pack break number one. With one flawless random number block spot being given away, that's a big spot. And we're giving away 10 extra spots within the pack break itself. So big thanks to this group. So yes, that means we're only selling 20 spots outright and half of that group will get spots. Top ten after six, two out of four six times, good luck, one, two, three, four, five and six. We got Eugene Logan, Eugene Hans Hans, John Hans, Eugene Eugene Hans, extra spots going your way after six, put those rooftop symbols next to your name so you know you won those spots. Now let's do the break itself with our second of three dice rolls. So this is for the pack break, six and a six, 12 times, one, two, three, four, five, six, seven, eight, twelve, and then six and a six for the teams, two, three, four, then twelfth and final time. All right, so no trading windows but here's the first half of the list and there's the second half of the list right there, alphabetized print and rip. All right, here's the list right here. Thanks everybody for getting in and let's see what we got in this pack over here. Got emergent, rookie Jalen Suggs, Stefan Marbury, Green Tyrese Halliburton, and in here, red, white and blue, Malik Monk, Larry Nance Jr. and Darius Basely. All right, nothing too crazy here, but there is one gigantic hit in this break and that would be that flawless random number block spot. So let's gather everybody's name for the third and final dice roll. Name on top after nine. We'll get that flawless spot. Good luck. One, two, three, four, five, six, seven, eight and once more ninth and final time. A lot of sad spots here, but I appreciate everybody getting in. On's very close, but no cigar this time. It's going to have to be. So sad times, but I appreciate everybody trying happy times, though, for Eugene, that extra spot coming in handy and last spot mojo. Look at that 70% of the time, 100% of the time. Congrats Eugene. We'll see you in that flawless random number block. Maybe later tonight, jaspyscasebreaks.com.


Namaskar. I am Shiva here, the trainer and motivational speaker and a mission to reach out to a million people. Happy to come back to you today with my 16th Monday motivational story drawn from the scriptures. If you wish to watch the videos posted earlier, please visit the playlist Monday Motivations on my YouTube channel. Are you a leader leading a team of people? Then you must watch this video in order to avoid that big mistake which mostly does do and fail in their missions. A few questions to begin with. What do you think should be the right way to approach for a leader in a team meeting or a group discussion in order to get the inputs from his team members? Should the team leader express his own opinion first before asking for inputs and suggestions from the team members? Or should the leader be the last person expressing his opinion on the matter? Let us take a look at this incident from the Mahabharata in order to understand and appreciate the right approach a leader should adopt while seeking counsel and inputs from his team members. We all know that Pandavas won the battle of Kurukshetra and regained their kingdom. But before the war began, Yudhishthira was in a dilemma on who should be chosen as the supreme commander of the Pandava army. So Yudhishthira wanted to take suggestions and opinions of his brothers. So he called his brothers for a meeting and asked for their opinions and inputs on the matter. Here comes the most important question. Who did Yudhishthira ask first for the opinion? Or did he express his own opinion first? Yudhishthira first of all did not express his own opinion. He did not tell his brothers whom he wanted to propose as the commander of the army. He wanted to hear the opinions of his brothers first. And then he asked Sahadeva, the ingest of the brothers first and not Bhimasena, the eldest of the brothers. Why? That you would come to know as we move further. Sahadeva replied with great enthusiasm that according to him the king of Virata, the Virat Maharaj, is the best fit to be the commander of the army. Then Yudhishthira asked Nakula. Nakula deposed with his brother Sahadeva and said that according to him the king Drupada was the right choice going by his gaze wisdom courage and strength. Dharmapatra then asked Arjuna. And Arjuna came up with another name. Arjuna said according to him Dhristar Jimna should be the chief of the army in the battlefield and he could think of no one else. And then came the third of Bhimasena. And then finally Yudhishthira asked Srikrishna for his opinion. And Srikrishna said though each of the various mentioned by the brothers was worthy of selection. He said he would endorse Arjuna's choice of Dhristar Jimna as the supreme commander of the Pandava army. Accordingly Dhristar Jimna was an anointed as a commander of the Pandava army. So what is the message as a leader that you could draw from this incident in this great scripture the Mahabharata. See Rajagopalachari well known as Rajaji narrates in his book the Mahabharata that in the olden days it was a practice to ascertain the views of the anger ones first before consulting the elders. Why? Why because it instilled enthusiasm in the youngsters and also gave them an opportunity to express their opinions freely without any hesitation. If the elders had expressed their opinions first the youngsters would have some kind of hesitation to express their honest opinions. Hence if you want to obtain the honest opinions of your people you must give the first opportunity to those who are younger in age and lower by their character. To reap the full benefit of the wisdom available in the team a leader should avoid the mistake of expressing first his or her opinion on the matter. That would create an opportunity for the team to express their true ideas. It is appropriate to follow this practice while brainstorming in the teams in the workplace or even among the family members at home. Remember there is a great leader in the room and you are awesome. Thank you for watching this video. Please do subscribe to my YouTube channel and click on the bell icon there. See you again next Monday with another Monday motivation drawn from the scriptures.


A serious game system is similar to a serious game, which is basically a learning game or a training game, but a serious game system is more open-ended. It's not prescriptive, it's not predetermined. The learning outcomes aren't decided in advance, but they're actually emergent in the system itself through the participants. Their perspectives, their concerns, their agency, what it is they need to achieve as stakeholders, if they're depending on what sort of part of society they're representing, and it begins with a dialogue about what would they like to achieve, what are the challenges, and what are the most difficult things they have, and what do they share, what commonalities do they have, and then this is worked out through several iterations that actually all of these feed into the game structure, so the game grows as the stakeholders give evidence, as they give experience, as they play through different scenarios, they see what works, what doesn't work, or they negotiate with each other, sometimes they laugh with each other, sometimes they laugh at each other, sometimes they laugh at us, so there's a lot of playfulness, especially in the beginning, about how to do this, and then it becomes more and more formalized as the game grows through each iteration. The stakeholders have been able to explore what site, and also suggest what type of ecotechnologies that they should be using, or they would like to use in different problems, so EcoSelect, that's where they do it in the board game, but the board game that we've developed, the serious game system in the first iterations of the board game, also is implemented in a digital game, because as you go along, there's so much data, there's so much information, there's so many parameters that are operating, you need really the sort of the help of a computer to do all the calculations, so with the digital version, which is the exact same version of the board game, then you're able to do all the math, the system does the math for you, so you're able to concentrate on your decision making process, also you're able to monitor the ecotechs and see if they are in fact performing as you would hope so. The serious game system has a lot of variety of stakeholders to really test the different ecotechnologies and to evaluate them and see how they would like to use them, so it's very different perhaps for someone from the municipalities, or the waterworks, or forestry, or agriculture, or biogas industry, there's a lot of different perspectives, so it's good for them, and it's good for the system to see how all these play together, and how they need to accommodate, or at least take into consideration the agency, the roles, the responsibilities of each other. It's interesting to see the stakeholders deliberating, and they're playing the game, and different things emerge, and they're negotiating, because especially in the serious game system in the beginning, they're also negotiating over the values of some things, even sometimes the rules, well what does this mean? What does this mean in real life? And then when they're competing with each other, they also want to win, even though they know this game is part of science. So they're trying to win, so it's really funny to see that the conflict in themselves of trying to be scientific and trying to win the game at the same time, and surprisingly enough, a lot of people really like to win, even though it's a scientific game. The serious game system has been useful to Bono's return, because it's actually helped the stakeholders see their actions in agency in a more systemic context. So not only do they play against the system, they play against each other. So while one stakeholder might be trying to achieve a goal, another stakeholder might be trying to achieve a different goal, and sometimes they collaborate, and sometimes they conflict, and sometimes they know about these collaborations and conflicts, and sometimes they don't. So by playing through a systemic way, you can actually see this. And the interesting thing about a serious game system is that you make consequential actions in the system, but it's an inconsequential space. So you can't break a game. So the Baltic Sea region doesn't suffer if the players do something radically inappropriate in a game to see what happens. There's nothing at risk. You get the learning outcomes, but you don't get the risks. I think one of the takeaways from the project for me has been really seeing the stakeholder engagement. So if you ask a stakeholder to do something, you predetermined and you have an idea about it, they will accommodate you. But if you ask them what they think about something, why is what they do important for them? What is it they want to achieve? How do they think that that would impact the Baltic Sea region in the long term? And if you ask them about what is it they tell their children about what they do and how they provide some sort of positive impact in our environment, they'll tell you a different story. So getting the stakeholders and allowing them to tell the story that they want to tell anyways, and putting that into a system and having them work out the details around that and to realize the sort of heroic difficulty of much of what they do on a daily basis. I think that was a really interesting takeaway from the project.


So who qualifies as your dependent? Dependents qualify in child for child tax credit and credit for other dependents. So when you're asking whether or not they qualify for the dependent, oftentimes then there's a couple of things related to that. Do they qualify for a dependent, which might change a filing status with regards to pushing someone up from single to head of household. Do they qualify for the dependent and then give you a tax benefit of either the child tax credit, the bigger benefit or the other dependents credit. That would be the next kind of scenario or set of questions. Follow the steps below to find out if a person qualifies as your dependent and to find out if your dependent qualifies you to take the child tax credit or the credit for other dependents. If you have more than four dependents, check the box under dependents on page four of form 1040 or 1040 SR and include a statement showing the information required in column one through four. So there's only limited information on the first page of the form 1040 with regards to the number of dependents. So if you got a whole bunch of them, then you might have to add, tack on another sheet there. Tip, how the dependents you claim are those you list by name and social security number SSN and the dependents section on form 1040, 1040 SR. So clearly if you're claiming them as a dependent, if you're putting something on the tax return for a child tax credit or other dependent credit, then it should be reflected on page one. And the IRS is going to want to know the name and the number. Note that if there's any kind of custody issues and that's where things get kind of in the gray area for a dependent, for example, you can't have two people claiming the dependent because that would be kind of like double dipping on the benefits of basically the dependent. And the IRS will be able to pick that up typically just without even like an intensive audit, usually just with their computer system because the IRS will have the name and the social security number of the dependent. So if two people claim them, then that's going to cause problems on the IRS side of things. And sometimes you won't even be able to file the return if you're trying to electronically file and someone else had already claimed them as a dependent using the name and social security number, for example. So those are going to be important components before you begin, see the definition of social security number later. So obviously we can get into who has a social security number versus the TIN number and entering that into the system. If you want to claim the child tax credit or the credit for other dependents, you and your spouse of filing jointly must have an SSN social security number or ITIN issued on or before the due date of your 2022 return, including extensions. If an ITIN is applied for on or before the due date of a 2022 return, including extensions and the IRS issues an ITIN as a result of the application, the IRS will consider the ITIN as issued on or before the due date of the return. So next time we'll get into basically the questionnaire and a more formal kind of question and answer process to determine if someone qualifies as a dependent and if so, then can you get the child tax credit, the better of the two credits? And if not, can you still get the dependent credit for the dependent?


All right, Sabre Traders, good morning. We had to clear the frog there. I'm gonna throw a good morning and happy Friday, might I say to all of our Traders and members alike here. Great to see everybody this January 26th, shortly after 9 a.m. There we go, a lot better down the pipe there. Great to see Michael, Leda Grant and all of our students and members alike joining us here. Phil, Mark, Lynn, Margaret and all of our members here, Rich, John, et cetera. Kathleen, great to see you. Let me ask what's everybody up to for this weekend coming up here. Of course, TGIF, right? So I hope everybody has some exciting plans lined up for this weekend and, well, if not exciting, perhaps just more laid back, relaxed, taking your eyes off this computer screen of yours and at least enjoying the weekend. I got this big festival in Tampa Bay in Tampa. It's called Gasparilla Festival. So it's big, kind of parade outdoors and all these boats going around, pirates. It's actually pretty fun. So looking forward to that, Kathleen has her granddaughter's volleyball game, very exciting for her. I know how big she is into her grandchildren's sports every week, pretty much. So love to see that. Let me know from everybody else. Kevin says, rotting Mardi Gras float in Louisiana there. Is it Mardi Gras weekend as well, Kevin? That I had no idea. I'm not as in tune. So if it is Mardi Gras weekend already, Mardi Gras float going on. Interesting, very nice from Kevin. If they timed that between Mardi Gras and Gasparilla, I guess that makes sense. Kevin says, no, it's an early parade. Okay, okay. All right, there we go. There we go. Hey, who doesn't like two Mardi Gras, right? So nice to see from Kevin. Let me know from everybody else. Michael, Phil, all of us here just joining us. But hey, we got a lot of stocks to talk about here, don't we? So CRBP just before had a nice little pop a moment ago. This was pretty crazy. This was very thinly traded out there on the order book. So even right as I logged in, right at 8.30 Eastern time, I mentioned, hey, pretty much, it's a Friday. We're not expecting too much out there to start. And who wants to go into the weekend feeling like crap, just after taking a bad losing trade or kind of being overly aggressive and you don't need to. So, hey, this could have moved up higher. Maybe my tune would have been changed. It's like, oh, this made the best move ever. Well, it did pop up nicely after eight o'clock. But again, it was more where the volume came in from 8.30. And then we ended up making a little money on it. Did all right on it. I got like 17 cents on it, which in the grand scheme could have done a lot better. It was making like 25, 50 cent moves per minute, pretty much. So it's really to say, if it's not making that big cleaner pop that you're looking for, well, it's gonna make a big reaction, a big move just the other direction, right? So I'm happy I'm out of this thing by now. The news out on CRPP, actually, let me just check the chat board here. We always like to post the news in the chat when we have the time and chance to at least. So earlier, if you check just above, Rich wrote this, I believe. Looks like some sort of drug that came out. Next generation, Nectin-4 targeting antibody drug, blah, blah, blah, blah, blah. All right, so the interesting part here is that it doesn't even describe phase one, phase two, phase three, as far as like the stage in which it's being tested at, but hey, we don't really need that as much. It's just more for the curious mind. This is still up 68%. We're gonna still put it on our list. It's obviously the very volatile. So I actually hope the order book fills in a lot more by the time the opening bell hits here. See more orders out there, even sell orders that can create resistance. Give me something, right? Roger, that's right. I'll be rooting Roger on here this weekend. The NFC championship, I wouldn't know much about that as a depressed Giants fan, but Roger has his Detroit Lions there, rooting him on for sure. Patrick watching his grandkids as well. Cool, very nice. All right, so, hey, CRBP on our list here to begin. We had another trader earlier this morning, PCS, ooh. Well, you had to figure that was gonna happen sooner than later, right? That was real time in the moment, just on this one candle. I had no idea that was gonna happen, obviously. So this was a stock just from yesterday popped up pretty nicely in the morning session. This is even the after hours that you could see from last night, but it was more from the morning session in which the stock had a nice pop, took off pretty well, broke over big pre-market resistance right off of 370, 365-ish, and then chopped around from that point. So we lost interest in it, heading into the late morning, the early afternoon. I guess by 345 this had one final pop to it, right? I guess it did have that last final pop just before the close and then higher in the after hours. But we're not really trading these stocks going into the after hours, nevertheless. But yeah, this is why pretty much because for as much as it did pop in the after hours, it could make that reaction the other way. And especially after going up 100% or whatnot gapping up overnight like that. So let me just check the news on Benzinga here for this stock, this type of drop-off, it could be natural profit-taking, but we did just cover this to a great degree in class in phase one. In the phase one stock course, that was just from Wednesday this week. So this would be interesting timing here for PCSA to do a, let's see if I'm right, common stock offering. No, not yet at least. I mean, that candle just hit. So maybe Benzinga even just gonna post it here in a moment, but that is a big boy drop, right? That type of drop is usually sell-off right after such a big move, but a lot of times for these cheap, low-float crap stocks like these that we don't swing trade, we day trade. We love them on the day trade, we hate them on the swing trade, right? Well, after they make the day trade, a lot of times they'll see news of like common stock offering coming out, direct offering of shares that came out. So I'll update you actually as I'm watching my news feed Benzinga Pro, it would not shock me if that just happens here. All right, so, well, we're gonna write PCSA off our watch list, scrap that right there from our watch list for right now and see what we could add, at least for the meantime, is CRBP. We got this IVP stock, it's that cheapy, so odds are we're not gonna trade it. That PHUN stock, that was kind of an anomaly from last week with DWACC and Trump. Oh, really quick, and I had this, it was a great comment, it was a great comment from a member in our room, like just kind of thinking about speculation, like what happens if Republican Party makes Trump the official nominee very soon, right? Well, of course you're gonna see those stocks like DWACC, PHUN, Rumble even now. Take off, yes, absolutely, and we will trade them. But don't hold your breath in terms of buying it now. Just once we see the news come out, we will react from that point and we will gladly look to trade it on the way back up again. But you don't wanna fall in love with any concept or thought if there's no momentum behind it at the time. So a lot of these trades that we're even seeing on the gainers list right now, they have a good momentum right now. Hey, fun, PHUN, speaking of, right? We just said that, PHUN, DWACC, I mean, it's up 2%, but just very spotty graph, paper thin order book. So that's not the type of trade we wanna follow really ever only when news is coming out. All right, so you got these Bitcoin stocks popping up pretty nicely. Actually, how about this? I'll try and get this up in time here, but we spoke about this a week ago where I was looking for a bounce on Bitcoin. It was right from 39.5 and it broke below it. It broke below their small amount, but I even told you like, hey, this is something long-term. This is a swing, something I don't care if it drops lower just for a meanwhile. Well, we're getting a pretty good pump for the time being back up on Bitcoin. So it broke below my 39.5 here. I was shouting that out even just as it was pulling back from 45, 44. I was, Mara was down 17, 16% on a day. I was like, no, I think that we're gonna see more on Bitcoin. So I missed maybe one or two smaller bounces on Mara, but I was waiting for this to happen. So it dropped off even more than my level, that's fine, but ended up moving back up, starting to get a better squeeze here of late this morning at least Bitcoin popping back up just over a thousand points there from 40,000. So looking pretty good. I like it. And with that, you have the miners up big right now. You have Canon, yeah, Mara, which obviously, you know, I'll put on our main watch list there, M-A-R-A, we're not gonna follow every one of them. I did put hut on the pre-market list because that was up the most. I was thinking maybe that would have more eyes on it over time. It did nothing in pre-market. So I'm gonna pass on that at least for now. It really marries the lead horse. So you know when Bitcoins pop and we're seeing coin go to obviously with that, we're seeing Mara go with that and all these other miners, but we don't need to put all of these on our watch list. It's gonna distract you from other trades that are perhaps easier and ones that you should have had more focal point on. Riot, again, this is like a really good one. So kind of a sister-sister stock with Mara, big brother, whatever you wanna call it. Riot would probably be the number two next to Mara there, but all right, SOXS, inverse ETF there. Let's just check in on the spy. Typically for a Friday, you're not gonna see as much. So had a small little move up early in pre-market, popping up a little bit after heading into this meeting, but we'll see if there's a lot more from where that came from. I certainly think there will be. Just, hey, do we get it at the open coming up? Do we get it later in the day? Does it come Monday next week? So I'm rooting for a new pop-up here. Obviously we broke all-time highs on the spy heading into this week. Can't go against the market. I'd strongly advise against that, right? So let's see what we could add from our losers list here. Obviously PCSA in the dump now. Let me just jump back to Benzinga Pro there. Was I right?  I love to say I told you so because, well, that's the case. They announced a $10 million offering. That's basically what happened. A common stock offering or a direct offering of shares valued at $10 million total. So it's what we teach. It's what we teach in class, folks, right? Well, what we also teach is earnings, right? Intel going right back to Benzinga Pro here. We'll just at least relay this news report to you. Intel earnings, they ended up beating the estimate on sales and their EPS beat. So what happened? Did they lower guidance? Just like we teach, they issued guidance below estimates. There we go. So that's the new snippet on Intel. No surprise there. Well, I mean, at first you might look at the earnings and the EPS and the REV, and they're like, whoa, they beat, wait, why is it down? Well, the not surprising part is the fact that they lowered guidance for probably this entire year ahead. So that is really the bigger talking point with most earnings reports that are out. So I like that Intel is a potential short. We'll follow that at least initially. Maybe it can make a bounce later on. And well, that's all I got. I got three stocks here to work with for the meantime right now. So for Kevin Grant, Michael Gary, got Pat, Roger, Barbara, all of our students here. Let me know if there's anything I'm missing. I have a lengthy question just through a member joining us right now. I believe I just phased one student.  I want to have to take the time to kind of go through there. But I will look to answer you back just over time here. You've got a lot going on right before this open. We've got the trading coming up. So I want to give you a good answer. And I'll write you back just right before we start class. All right, so what else we got? Anyone else at least with stocks that we're looking at here? Anything that we missed as far as a stock that is popping, dropping, going from left to right on the chart? That's CRBP on our list already. Like we said, that one is really the only thing kind of looking strong, moving upward pretty much. Mara, actually Mara, I'm sorry, the other one. But Mara's a little more flat. We're hoping to see a pop on Bitcoin. We'll move up higher there. And we can get a good move on Mara likely from that point. If you want me to slip Coinbase on our list at this point, because it's up near 5%, I could do that now because we didn't really have too many other stocks to add on there. That I could at least do maybe. But I think that that's going to wrap it up for the meantime, folks. All right, so that's all I got. Hey, for all of our students here, I'll be back on the mic just in about 15, 20 minutes, just right when the market opens up, right? Right at 9.30 every morning, every single morning at the opening bell. So for all of our members on social media, Facebook, Live, LinkedIn, Twitter, YouTube. Hey, we appreciate you joining us each and every day, each and every afternoon. We stream live Monday through Friday, 9.30 in the morning and 2.30 in the afternoon. I'm sorry, 9 AM Eastern every morning and 2.30 PM Eastern in the afternoon. You could follow us right at CybertradingU, at CybertradingU on all of our social media streams and platforms. If you're interested in joining us inside our live trading room for next week, just scan that QR code on the top left of the stream, just to get yourself access to a week-long trial, get access to our pre-recorded workshops, our live workshop every Tuesday, and of course, just all of our students and instructors, the camaraderie inside our main chat. But for all of us there right now, I'll look forward to talking to you all soon, coming up here just at the opening bell. Take care.