Submind YouTube summaries
Thumbnail for Minokawa Community Call - 2026/09/16

Minokawa Community Call - 2026/09/16

Watch on YouTube

Video summary

The Minokawa Community Call from September 16, 2026, focused on refining the implementation strategy for the public event scope and addressing critical technical challenges regarding multi-environment support. The meeting began with an acknowledgment that the current documentation describing implemented features had become purely informational rather than a forward-looking proposal. Consequently, the team agreed to update this document to accurately reflect reality while planning future revisions. A significant portion of the discussion centered on the "multi-environment" issue, where different networks utilize distinct ledgers, but the compact compiler currently supports only a single ledger at a time. This limitation forces the team to either maintain multiple compiler versions or introduce a mechanism to switch between them, prompting a debate over whether a default ledger should exist and how breaking changes in deprecated ledger versions would impact the compiler. To resolve these dependencies, the group explored various architectural approaches, ultimately leaning towards a design where the user experience is defined first by the developer tools rather than the raw compiler flags. Participants discussed whether to expose direct dependency flags like "onchain runtime" or "ZKIR" directly in the compiler or to rely on a higher-level tool that interprets network names (e.g., Mainnet) and automatically resolves the correct combination of runtime and ledger versions based on a compatibility matrix. There was a consensus that while the standard library is technically dependent on both ZKIR and onchain runtime, it should not be treated as ledger-independent. The team recognized that new native functions in the standard library would require specific implementations in both the onchain runtime and ZKIR components, meaning that any change to one component could necessitate updates to the others, making a single universal build impractical. The conversation concluded with a strong agreement to adopt a strategy similar to how operating systems handle machine types, where multiple specialized builds of the compiler are released within a single package. Instead of forcing one monolithic build to support every possible combination of ledgers and runtimes, the team proposed creating distinct binaries tailored to specific target configurations. The updater tool would then automatically select and execute the appropriate build based on the host environment or user request, ensuring that users get the correct version without needing to manually manage complex flag combinations. This approach aims to provide a seamless user experience for developers targeting different networks while avoiding a torturous development process for contributors who need to maintain specific backend dependencies. The meeting ended with an action item for one participant to begin exploring this multi-build architecture, ensuring that future updates can support evolving network requirements without breaking existing contracts or forcing unnecessary version fragmentation.
Read the full video transcript
Hey, Matty. How's it going? >> How are you? >> You're not bad. [laughter] >> No, I mean it. It's I'm not dead. It's uh >> I know it doesn't sound good. No, I I I really do understand. >> All right, I am closing this window. I'm increasing this nice and sharing screen. >> Hi guys. >> Hi Yuri. How's it going? >> I lost my >> but everything else is good. to Okay, I think that's the right one. Can you all see my screen? Okay, let's see. We are one minute in. I'm going to wait for probably a couple of minutes and see if people are going to join. I opened a new batch of tea. It's very good tea. Um, yeah, very fragrant. Which also was a gift from my aunt. They're very specific about their tea. I have lost my specificity since I moved to the US. Um, sadly, as I'm waiting, if anyone has anything for me to add to the agenda, please feel free to raise your hand or just speak up. We have Kevin. I know Jonathan's not going to join today. Um, I don't know about Joe. >> I may have to leave 15 minutes early. >> Oh, there's Joe. >> All right. Before I start, I have a couple of things on the agenda myself, but before I start, anything that anyone wants to discuss that I should add to the agenda so that we can time manage, going once, going twice. All right. So, hello everyone. Thank you for attending. The first thing on the agenda that I have is regarding the public event scope that um has been sitting there for quite a while. Uh that it has been implemented. So uh I think my plan for it is to edit it based on the changes of the implementation and then have TSC review it and just get it in so that there's some document that tracks the implementation. Any objections? >> Um, I think that's a fine way to to proceed here. Um, I think in the future we should try to get ourselves out of this situation, but uh but now it's like becoming anformational quite where it says it describes what we did implement, not a proposal of what we will implement, >> right? >> Yeah. And it's a it does reflect reality. And we also we may revisit this but uh that'll be a different quip. >> Oh, that sounds good. All right. The second thing I have on the agenda is regarding the multi-environment kip. Uh for folks that are not in the loop, um we are at the point of which uh that different networks of midnight are using different uh ledgers. Um but comp the compiler the compact compiler only supports a single ledger at a time which then that for us means that we either have to release and maintain multiple versions uh of the compiler or provide a mechanism that allows us to allows the compiler to switch between between different versions of the ledger. Um, so I'm working on a proposal that uh advocates for the ladder and um how that's going to work is that we're going to introduce a ledger flag uh that allows the user to choose the version of the ledger that they want. Uh in reality because we recommend users using uh the developer tool uh in the developer tool they will have a flag for the network. So the user theoretically does not need to know the version of the ledger that um they need to compile a contract with. Um that being said, it kind of bleeds true and I will get to that point. Um so um I did have a couple of open questions that I think uh are good to kind of uh take the temperature of the room and see what what people think. So the first one is whether we want to have a default ledger. So if a user does not and for the purpose of this I'm not going to talk about the the developer tool. So I'm not going to I'm going to use the ledger flag instead of the network flag. Um so if a user does not provide a ledger flag uh what should happen? Um on one hand I advocated for having the oldest version of the ledger being the uh the default version. uh my assumption is that mainet will probably be on the oldest version of the ledger and that's that's the main reason for that. Um on the other hand given that this um the ledger is the back end of the compiler um having a default ledger then means that every time that we deprecate a version of the ledger this becomes a breaking change for the compiler. Um so question is do we want a default ledger uh that every time we we deprecate a ledger that makes uh a breaking change in the compiler or if we want to require uh the ledger flag being provided. Uh Kevin I see your hand up. >> Yeah I would I would take a step back and say that we can't really ignore the dev tools. we should design this in conjunction with a user experience that we want to provide with dev tools. Um for for the for if if we intend that the the recommended way or the the official way of invoking the compiler is via the dev tools, I'm completely happy saying that you must specify a ledger version that the compiler will not. >> So then that that becomes that you must specify a network. Um, >> no, it could it could be that there's a default network. I mean, so the so dev the user experience that dev tools provides can be that if you just compile a contract, it compiles it for mainet for today's mainet. >> Right. Okay. So your proposal is we have uh a default network that is mainet. So then the default ledger becomes um >> becomes there's no default the compiler itself does not have a defa the compiler itself does not necessarily have a default ledger. The dev tools will invoke the compiler with the appropriate ledger flag and the compiler will not allow itself to be invoked without a ledger flag. That's that's one possible design. But I but I guess my point is that we should take a step back and we should design a user experience that we want. Um and then we should provide an implementation of of that. >> Uh that's fair. I do like I do like um I do like having the default network being mainet and having the developer tool invoke um the appropriate ledger for that which then results in the compiler itself. If I'm calling the compiler itself um I must provide a ledger uh flag. Um, other ideas, other um, or I guess if someone is is um, itching against this idea. >> All right. Um uh going to quickly capture this default uh network to be mainet require the compiler to have a major lag. Okay. Um all right. Uh the second thing that I have is that I think right now uh the standard library is ledger independent. Um >> it's not >> I see. >> Okay. >> All right. Then that answers that. So all right. Uh that's a resounding no. Um >> well it's this has to do with which version of ZKI or is supported by which ledger. Um it's really not that that that it's independent. It is in a sense independent of the ledger. It's just dependent on ZKR and by transitivity. >> Therefore the ledger is certain ledgers don't support certain versions of ZKR. Okay. So then that brings up my fourth question. Is ZKR a separate access of ledger? The design I have right now is that it allows it allows for the introduction not in well it allows for having multiple ZKs for each ledger back end because that's that's what we have on main at the moment and that's that's what I'm going off of. Um, so is that is that going to be the path forward? I'm just going to go from I don't know who raised their hand first, but I'm going to go off of what I see on my screen. Joe, you're first. >> Yeah. Well, I guess my this it's more of a question. I'm just kind of thinking out loud, but um in the previous question um we're requiring the compiler to have a ledger flag and some thoughts in this area are I wonder if a ledger flag is what we actually want because I'm not sure that the ledger flag itself represent our direct dependencies. One approach might be to have um like an onchain runtime version flag instead because the compact runtime actually directly depends on that. Um and then maybe a separate zkir flag. Um and then instead of I don't know like having the ledger flag directly in the compiler maybe we can have a tool like the compact tool that actually understands the um compatibility matrix. And so if I write mainet then it can read a compatibility matrix from somewhere and then just set the onchain runtime and ledger flag or onchain runtime and zkir flags itself. So maybe the flag should only be our direct dependencies and then we have some other tool understand mainet prepro stuff like that. Um, Kevin. >> Yeah. So, so first of all, I was going to say that the order that you see the hands raised are the order that we raise them in. So, so Joe was first. And then I think that I think what you just said, Joe, is an is an absolutely fabulous idea that the the compiler should actually be configured just based on our direct dependencies. Um, and I think that's a really great way to think about the how we want to implement this. >> Well, that's that's the design that I have. I think uh there's um >> the ledger is only indirectly telling us what onchain runtime and Z we can um >> support. My push back on that would be that I also even though we recommend people using developer tools um the compiler itself still should be um user friendly enough and I wonder if the unchained runtime and I could argue against my so let me finish one argument um and the average user probably does not know what unchain runtime is. On the other hand, if I'm arguing that um for a more sophisticated user to use the compiler, that user might actually know onchain runtime. Um okay. So then but then we're talking about now having either a ledger flag or an unchained runtime flag on the on the compiler side and then a zk flag is that >> yeah not but they're not completely independent >> right >> some combinations will not Down. All right. Then this makes this that STD is not is is unchanged on time independent but is not ZKR independent. Did I catch that right? Um >> so that also relies on on on what we're calling from compact runtime right so standard is onchain runtime depend dependent not independent [clears throat] um >> oh yeah oh >> I okay it is zkr dependent but it is also onchain runtime dependent >> I think it's zkir are independent and it's onchain runtime dependent. >> Um, no, I think it's dependent on both. I think it's dependent on both those. So, let's just say >> yeah, so let's just say that we add a new um native to the standard library. we need to have a JavaScript implementation of that native um in the compact runtime and that might require um uh onchain runtime support and we need to have a um support for a ZKIR implementation of that native and that might require changes to ZKIR so a new so a new a new native in the stand like just like let's talk about SEP 256R1 it needs to have or verify proof is a great example Verify proof needs to have ZKIR gates to support it and it needs to have some something exposed in potentially in the onchain onchain runtime to support it. So it's so it's not so it's not independent of either of those. And right now I know that we have a ZKRV3 library that's um and I did not look deep enough to see if that's pulled into the standard library but um >> no we have two we have two ZKIR components. One is the key generation binary um that is compiled from Rust and the other is the zkir wom that we're currently using for testing but will possibly soon be importing into the compact runtime. >> So there's so there's a key generation binary and there is and I and maybe Joe knows more about how we're where we're eventually going to land with this. There's also some potentially some WM code that we have to import into the compact runtime. So this zkirv3 library.com compact is what this is what I'm talking about and this is what is it's also pulled in god can I remember uh in the >> yeah this is a different this is a yeah this this is a different thing this is this is um there are some there are some standard library um circuits and types that are not available in the ZKIRB2 back end, >> right? And then so but then this is pulled in in probably like expand module one and types into the standard library when CB Okay, gotcha. Um um okay. Okay. Um All right. I think that's clear enough. >> So the note just above the note just above there is >> is not is not correct. It's it dep it depends on both. >> Right. is not independent, right? >> It is onchain runtime dependent and it is zkir dependent. >> Oh, it it has a not. Okay, thank you. All right. Uh then we have contract manifest.json which uh at the moment does not record ledger version. Um do we want it to record ledger version? I think we want it to record ZKIR and onchain runtime version. >> Oh yes, >> I I I think that's exactly the answer. I think what what Joe what Joe said is exactly the way we think of this. >> It's going to give me some time. It's also much easier to just say one word instead of three. God help it. Uh yes. Okay. Right. So um coming up to docs um so it would be unfortunate for the docs to reveal the unchained runtime and ZKR versions. Um what I mean by that is for example the ledger ADTS we are generating those um the docs for those in in the compiler. As far as the compiler knows, it doesn't know the network. Um, so it will only know the unchained runtime and zkir. Um, which then it either has to reveal that information in the docs or or possibly via the script that goes and um and grabs the network information from the compatibility metrics that the div tool holds and expose it that way. I just don't like the complexity. Um, I think I answered my question. >> I think there's and I I don't know what the scope is for u what we're trying to arrive at, Parisa. Um but I feel like some sort of series of diagrams would be helpful here um in [clears throat] understanding because I don't know like you can even if we could specify like it suppose we even just had flags in the compiler that said onchain runtime version this and zkir version this we still need to figure out like how the versioning system of the compiler should work of the language which should work and of how that interacts with the different networks that currently exist. And I feel like to understand that we need it. It would be ideal if we had some sort of set cadence for when these networks are updated or promoted or stuff like that. Like Rust itself, for example, as a language has three different trains. They have a nightly, a beta, and then a stable release. and they um update those like promote those every six weeks or something. And so I don't know [clears throat] there's also yeah like I say I guess just a lot of questions about how we even version the compiler here. So long story short um to answer this question I don't think that we could assume that you get like one set of docs for compact um as long as it includes a definition of the ADTS right so you might different docs for mainet for prepro for different compiler versions >> and I also think that anyone who is looking at our ADT definitions is necessarily looking at impact code I think um it actually I don't know if the instruction sequences are included but it seems it seems perfectly it's not okay >> it's okay [clears throat] then yeah >> that's what that's what makes them abstract I think they they they should admit multiple implementations and >> yeah yeah okay so maybe the onchain runtime version is yeah should not be included there >> yeah I mean the uh one one thing that we maybe should consider is should we version the standard library because right now we're not um I could see that if we were in a position where we were not making breaking changes like we're not removing things or changing signatures um in breaking ways we could always say um this of the this feature was introduced in zkir 3.2 to onchain runtime 4.7 or whatever. Um, and we could have just a single set of docs that had uh features that required at least some version of ZKIR and onchain runtime. Um, but if we're making breaking changes, that's a little harder to pull off. >> Yeah, >> I like the idea of versioning the standard library. Um I do not want to rely on I well I would like to know um you know a timeline for promotions and deprecating of um what goes into what network that's not something that I can't rely on um >> out of our control. I think the goal I think the goal is that we go get to this vision of uh something that works like Cardano where there is mainet there is prepro which gives you early access to mainet when a mainet upgrade is coming and there's preview which gives you early access to new features um and there's fairly regular promotion from preview to to through pre-prod to oh for a period of time to mainet um we're not there right now >> yeah So >> yeah and the the I have not talked much about the formatter and fix up tools. Um so the floor is open for people >> there should not >> oh I guess if the standard library is um >> there should not be different formats by the formatter but there might have to be different implementations of the formatter if we make breaking changes to the language Um >> right. And so then if the breaking changes of the language are are unchanged on time or ZK dependent. >> Well just like for instance we've changed the syntax of assert. So you if you have a contract that has the old assert syntax you have to use an old formatter. And if you have a contract that has the new assert syntax with the parenthesis you have to have a new formatter. So there's there are different versions of the formatter as long as we're making breaking language changes. Um when we stop making breaking language changes, you could always format old code with the current latest formatter, I believe. Um and then the fixup tool, the fixups are built into the tool. Um so when we add a fixup, you need you need a version of the tool that has the fixup in it. They're not it's not parameterized over the fixups in any way. it. Um, why wouldn't we just think of these um tools as like independent tools? Like if I work in the TypeScript universe, I I might have a fix up or a format tool and they would be maintained as separate packages with their own versioning scheme. They would in some sense like be dependent on language changes. But I don't see a reason why we would not think of them as like any other format or fix up tools in a different language ecosystem and version them accordingly. >> We could I don't have a strong >> opinion for or against. Um I do well I do think for this proposal I do want to consider this out of scope so that um life would be easier. Okay. And then I have uh a cautionary tale that right now uh I'm I'm uh going off of the assumption that max field is is going to stay the same across all ledgers. Um if if or when that changes uh that also becomes um um becomes um I'm going to wrap them all up in one ledger dependent. Uh so then the same goes for example for midnight inlines and midnight events. Um, so we could either be proactive about this and uh right off the bat in in the breakup of these backends that we have uh consider these uh consider anything that has the potential of becoming dependent on either onchain runtime or ZKR um and do do the same mechanism for them that that we're doing for uh for example midnight natives and um ledger ADTS or be open to when that happens um going back and fixing it. Does that make sense? >> I think you lost me a little bit. I mean I think we need like a >> So right now Yeah. Uh so right now Midnight uh Midnight Natives and Midnight Ledger is being duplicated per back end because they have the they very clearly have the potential or I guess even at this point because of the ZKR they are dependent on the ledgers on the onen runtime. So each backend could have a change in them. So we keep a separate uh midnight um ledger and midnight natives for each back end. For example, Ledger 9.1 and uh 8.0. >> Yeah, let's just let's just let's let's flip it around and talk about the user experience. So let's say that we released a Ledger 11 and it changed the underlying native field from B from BLS 12381 to some other field. Um would we would we want you to be able to invoke the compiler and and select ledger 10 or ledger 11 and would we want to support that user experience? I think we would. Now would how would we support it? How would we implement it? I don't know that. But I think that that would be like an experience that you would want to provide that I could invoke somehow a tool that said compile this contract for mainet ledger 10. compile this contract for preview which has a different native field. Yuri, go ahead. >> Uh it's a pretty interesting challenge that you are trying to figure out and I just wanted to propose to create a new flag like a target. You know there might be different targets and currently you need to figure out which kind of combination you're going to uh support. Is it the Ziki 2 or Ziki 3? Is it a ledger 8 or ledger 9 or ledger 9.8.1? I don't know. So if we can define a target like Z2 ledger 9 blah blah blah like tuple or triple or doesn't matter how many uh variations are going to support because this variations are kind of coupled with each other. I believe that there is combinations that just cannot be uh cannot work together like old version of ZK IR and ledger 9 and all the stuff. So if you can define the list of targets which are finite uh definitions of supported combinations and you can uh add this target flag as in any other compilers like you have you can compile C++ code for one target for another target and it just create different binaries and different packages uh for you. So having target can solve this question. Yeah, I'm done. And >> yeah, so I think Yuri's I think Yuri's right. I think um Kevin's right. Um essentially the saying the same thing. We need to decide what the user experience is. Um and how we go about doing that from there is that we have lots of choices and we should not tie ourselves to a particular choice. Um, so I actually think the compact updater is the is the tool that we should we should decide what that looks like first and everything kind of flows from there. Um, I think the onshine runtime is not the best thing to be talking about. It may be the only thing we can talk about right now, but I think this is more of a of a a shielded level decision um how they're going to version um things. I think that you know if you if if we talk about having uh mainet uh every time mainet uh gets upgraded uh to to something there's there's a version there. It may not be called anything now. Um, but it the end user wants to be able to say I I want I want uh something that will target the the mainet and um and the version of of the onchain runtime we choose as a consequence of that not not the primary choice. Um the version of ZKR is a is a secondary choice. I mean we can actually it's that there are going to be constraints on on which version of Zcar can can be used but but we do have more flexibility there. Um, I'll tell you my experience with um, SHA scheme uh, is that what worked, the only thing that ended up working that really worked in the end for the most part uh, is a um, is a machine type flag that was a combination of operating system and architecture. And that's kind of what we're talking about here. we're we're kind of talking about um because there aren't there is an arbitrary there is no arbitrary combination of these things at any given time. There wasn't always you know a Windows that ran on ARM for example. Um so you couldn't just arbitrarily say I want an ARM 64 running Windows that just didn't exist. Okay. I don't know if it exists now. Um so we had the machine types had sort of both involved Um, I don't really care how we get there, but I think that's that's kind of way we think should think about our backends. And it could be that instead of thinking about compact C taking as uh take there being one build of compact C that takes flags to direct it whether it's onchain runtime or whatever we may really end up with a single release packaging up you know six different builds of compact C each specialized to some combination of these flags that we're talking about um let's not tie ourselves into having compact. It's compact C itself have to be able to have multiple backends and target multiple things. Each build of compact C can target multiple backends um uh as opposed to having one build that targets multiple multiple things. Kevin. >> Yeah, I think that's exactly right. I think for some for some um for some up upgrades that we might be able to support, we might just be able to have some conditional code somewhere in the compiler that the same compiler can just take a flag and for sometimes sometimes you might just want to have a se completely separate binary. Um there was an idea um from from somebody um that uh on the node team that the compiler should just take a node RPC endpoint and say the deploy I want to compile for this network. Um and so we we should also consider is that supported do we provide that as well. I guess the question is, you know, people people can run their own uh copies of the Midnight Network. Um, and uh often do for future, you know, we do ourselves for future uh networks. Um, but you may he may be version locked in the past. I can imagine some consortium of banks running their own midnight network separately from from everybody else and they may be version locked on some some older version. So yeah, I don't know if being able to point to a particular node is the right solution, but um but it's interesting to be able to do uh you know something that's much more contextual than than in the top level tool which is contextual in how I'm going to use this than than on what combination of tools and the combination of tools should be something that falls out of it. For example, even ZKR, we might not want to say I want this version of ZKR. We might want to say I need support for such and such or or um you know, sometimes you do want to say what version of ZK. That's the that's the complicated thing. You might say version 3.2 broke my broke my contract. I want version 3.1. So yeah, I think it's going to be end up being a combination of like individual targets, you know, like a handful of targets that we support at any given time. Um, and then maybe some some flags that allow allow you a little finer control. And these these may be configuration time flags before you build compact C. And they may be they may be uh some of them might be actual flags to compact C. >> Yeah. Okay, that does not leave me better off. >> Yeah, I understand. >> I think that I think the takeaway here is let's let's not define what compacty looks like. Let's define what the tool looks like and then let's let's um lay out the options for how um I don't know how this is like a more of an improvement proposal I mean as opposed to implementation proposal. Um the idea is we want to have this top level functionality and and this should lay out the different options for getting there and we can decide on the actual um in in a later version of it later iteration of the is it quite implementation proposal or or improvement proposal. It's an implementation proposal right? Um it does have uh an implementation section but it is it also has a you know like you you start with defining the problem and the statement of the problem and uh the potential >> trying to remember what the I stands for in CO >> it is improvement I think. >> Okay. All right. All right. Well, then I think it's quite appropriate for us to lay out what we want the user experience to be as the first as first and foremost um from the compact updater tool and then and then try to follow that through to a a useful conclusion. I also think that we we don't want to pull our hair out trying to have one build of compact C that supports everything. So that's why I'm that's why I'm advocating to towards this >> multiple bills of compact C each specialized to a particular target. >> Um but it's all still part of the same release. If you if you invoke shape on on a Mac and you invoke Sha Scheme on a on a Linux machine, you ask for the version, you might very well have the same version, but then if you go ask for the machine type, you'll see it's a different machine type. But it's only >> so you you release the same compiler but then it goes and picks the the machine type based on the host machine. Is that >> Yes. But that happens that happens at configuration time >> and then you run make >> and it builds it builds a version of sha scheme that will target um >> Mac if you're on Mac and it'll build the same version of Sha Scheme but that targets Linux if you're on Linux you know and there's more to it you know it's Linux it's Linux on on this particular architecture it's Mac on this particular architecture and I think that's kind of the model we should go for here so that we don't have like any any one build of compact C having to connect to multiple versions of the runtime or even the ledger. Um so that we basically say here's you know here's the end you know we we we have two flags here we're talking about right now is the onchain runtime and and the ledger. I'm not sure that the onchain runtime is the right the right flag. is probably the right one now, but ultimately it's probably it's probably something more like you know what is the uh node version kind of um and then the onchain runtime is determined by node version but regardless we basically say um you know certain combinations of those two things work on chain runtime plus zkr certain of those work we have a build for each one that works and it's a different But the but the updator knows which one to run. >> Yeah. >> Well, the updator knows which one to run for the defined networks. So, it still does not solve the issue if I'm running my own network. >> Yeah. So you may have to explicitly run, you know, you may we there's always going to be a need for override flags. There's always going to need be need to reach under the covers. So um you may need to you may as as one of those users, you may need to learn which of those builds to run instead of going through the compact updator. Okay, this answers some questions. Opens up a new account of your room. All right. Um, we have 15 minutes. >> I just want to say one more thing. I think >> Yes. >> Yeah, that's fine. I I have to run also to run to an appointment, too. So I have to get off a few minutes, but um I think that this approach that I'm that I'm outlining with multiple builds actually addresses. So we we we need to address the users, you know, we need to give users a good user experience, >> but we also need not to give ourselves a torturous developer experience and our and anybody who wants to contribute to it. And I think this what I've outlined um gives us that that we we have the updater isn't picking a version um but it's picking a build of that version, >> right? And so I think we should we should we should proceed down that path. And what ones we build will be and and what the criteria for which ones we build um we should try to nail down as we finish up the quip. >> Okay. I'll start exploring that. That sounds like a better idea. All right. And with that, uh, if anyone has anything else, now's the time. All right. Uh, folks, you get 14 minutes back. Uh, thank you so much for the conversation and attending the meeting. Have a good rest of your day. Thank you. Bye bye >> bye guys. Hey