Transcription: OpenAgents Episode 071 - PHP Host Functions
June 9, 2026 ยท View on GitHub
Source: https://twitter.com/OpenAgentsInc/status/1754643881172328732 Wiki source: https://raw.githubusercontent.com/wiki/OpenAgentsInc/openagents/Video-Series.md Media title: OpenAgents - Episode 071: PHP Host Functions We extend our Plugin model to use the... Upload date: 20240205 Transcription model: mlx-whisper/mlx-community/whisper-tiny Generated at: 2026-06-01T19:06:38Z
Machine-generated transcript. Review speaker labels and wording before using this as quote-grade source material.
[00:00] Christopher David: Guess who got a green screen and who doesn't know how to configure the color spill.
[00:05] Christopher David: So we're going black and white. That's okay. We'll keep leveling up. Okay, so last video was three hours.
[00:12] Christopher David: Let's not do that again for a while. Okay. But yeah, getting host functions working VR
[00:19] Christopher David: going environment and then putting it behind an L4 or two endpoint and using that in our flow. That was amazing.
[00:28] Christopher David: So
[00:30] Christopher David: Let's now go
[00:33] Christopher David: Test out the host functions of PHP. Oh, we kind of skipped over that. Just because I like the L4 or two idea
[00:40] Christopher David: but in this
[00:42] Christopher David: video we're going to use the new
[00:45] Christopher David: PHP SDK
[00:48] Christopher David: Host functions support
[00:51] Christopher David: So this is what we're using already to like load the plugins into our environment to execute them
[00:57] Christopher David: They did not until recently have host functions support. They just add to this and
[01:02] Christopher David: So we're going to try to get this working. So let's read the docs
[01:12] Christopher David: Let's see
[01:13] Christopher David: So X is in PHP host SDK
[01:18] Christopher David: This stuff we're already doing
[01:20] Christopher David: And host functions note
[01:25] Christopher David: Host function support is experimental due to usage of callback with FIFI and may leak memory. All right. Let's extend our count values example a little bit instead of storing the total in an
[01:35] Christopher David: Ephemeral plugin ver
[01:36] Christopher David: Let's store it in a persistent key value store
[01:40] Christopher David: Wazom can't use our KV store on its own. This is where host functions come in
[01:45] Christopher David: Host functions allows to grant new capabilities to our plugins from our application
[01:49] Christopher David: They are simply some go
[01:51] Christopher David: Functions. I don't think they have to be go functions
[01:55] Christopher David: Just like everyone's trying to get me to use go. That's okay
[01:58] Christopher David: We could we write which can be passed out and invoke from any language inside the plugin
[02:03] Christopher David: Let's load the manifest like usual but load up this count vowels KV store plugin
[02:09] Christopher David: Note the source code for this is here and is written in rust
[02:12] Christopher David: But it could be written in any of our PDK languages call unlike our previous plugin
[02:16] Christopher David: Express you to provide host functions that satisfy our its important interface for a KV store
[02:21] Christopher David: We want to expose two functions for a plugin void KV ranked
[02:25] Christopher David: Key string value array of bytes okay, which writes a byte value to a key and byte KV
[02:32] Christopher David: Okay, I can't think in terms of bytes. I'm just gonna trust that this is all of those what you say
[02:36] Christopher David: It's gonna do which reads the bytes blah blah blah
[02:38] Christopher David: Pretend this is red is here's the host functions
[02:41] Christopher David: Literally just like a little dummy KV store okay
[02:46] Christopher David: Bites to in blah blah blah
[02:49] Christopher David: And then we pass it cool. So the plugin provides memory pointers which the SDK automatically converts it to a string
[02:56] Christopher David: Similarly when a host function returns a string the SDK allocates it in the plugin memory and provides a pointer box of the plugin
[03:02] Christopher David: For a manual memory management request current plugin as the first parameter of the host function. I don't know
[03:11] Christopher David: Okay, and then here
[03:14] Christopher David: It's just an example that working
[03:17] Christopher David: Nice
[03:19] Christopher David: So you can manually manage the memory if you want
[03:22] Christopher David: Strain blah blah. Okay, I've separately pasted this into challenge ebt stain today
[03:29] Christopher David: We are adding host functions support to our level after this X and D
[03:33] Christopher David: Read the docs and get ready to help me implement host functions when I give you our code
[03:41] Christopher David: Okay
[03:46] Christopher David: All right, so I want to do like a
[03:51] Christopher David: Very simple. Maybe we'll get their demo code working
[03:56] Christopher David: Do we have tests like a plugin test?
[04:02] Christopher David: It has an image so that's that can execute plugin function
[04:11] Christopher David: Okay, so here's one thing I want to try if we do
[04:17] Christopher David: If we remove this from integration and
[04:21] Christopher David: We see if we open up a new one of these
[04:26] Christopher David: And we'll miss it right here
[04:28] Christopher David: If we go to the name jense now can we do pf
[04:35] Christopher David: Execute plugin
[04:38] Christopher David: Say what's that one I'm gonna say
[04:46] Christopher David: Okay
[04:51] Christopher David: And let's um
[04:53] Christopher David: Just dv it just because I want to see it. I want to see it
[05:03] Christopher David: All right
[05:05] Christopher David: So
[05:09] Christopher David: Let's do this let's copy all of this
[05:17] Christopher David: And then go back to here and say here's our unit test for plugins
[05:26] Christopher David: Note the can execute plugin function test
[05:31] Christopher David: Let's
[05:33] Christopher David: Let's write a new test that
[05:43] Christopher David: Tests that PHP host functions work
[05:47] Christopher David: Using the same count vowels
[05:51] Christopher David: Code from the
[05:54] Christopher David: Read me I paste it
[05:57] Christopher David: Use the same
[05:59] Christopher David: URL for that count vowels
[06:03] Christopher David: One when we define the plugin
[06:07] Christopher David: Together with the rest of the test that might just be enough for it to actually write us a task. Let's see
[06:15] Christopher David: Do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it do it
[06:19] Christopher David: Oh
[06:21] Christopher David: You need to ensure that your plugin model is equipped to handle instantiation. We are obviously these all pass you can see I'm passing in URL
[06:29] Christopher David: So just do it
[06:32] Christopher David: PHP host functions work with the plugin
[06:41] Christopher David: Doesn't do imports
[06:49] Christopher David: New
[06:55] Christopher David: Exitism plugin
[06:59] Christopher David: Yeah, definitely don't want all that stuff in my test file
[07:08] Christopher David: But let's put it there for now and just kind of see if it works
[07:19] Christopher David: Let's just see if it works
[07:42] Christopher David: And we don't want this to say integration oops
[07:49] Christopher David: Now
[07:56] Christopher David: Woooo it no like this oh I guess I have to update the SDK
[08:10] Christopher David: Yeah, I need update the SDK the one oh, oh, that's running
[08:19] Christopher David: How do I get it? I want it
[08:41] Christopher David: Thanks first I need to update the
[08:44] Christopher David: Exitism
[08:47] Christopher David: Exitism
[08:50] Christopher David: PDK
[08:51] Christopher David: E
[08:53] Christopher David: SDK to
[08:56] Christopher David: The latest version one point up when oh how do I do it?
[09:01] Christopher David: I'm so used to NPM commands that I like tend to accidentally run the wrong thing with composer and update everything
[09:07] Christopher David: I where I don't want to do
[09:14] Christopher David: Okay
[09:25] Christopher David: Carrot one point up let's try it
[09:28] Christopher David: Okay
[09:41] Christopher David: And update only that one
[09:43] Christopher David: Okay
[09:55] Christopher David: Okay
[10:06] Christopher David: Okay
[10:13] Christopher David: How I reload this so it stops winding
[10:25] Christopher David: Loads
[10:27] Christopher David: Oops
[10:37] Christopher David: I don't even know how to figure out what this is complaining about
[10:41] Christopher David: Wow, let's just try running it see what happens
[10:51] Christopher David: All right pf
[10:54] Christopher David: First function
[11:03] Christopher David: All right, we skipped ahead a little bit because we figured out with the Exitism team that we have to upgrade PHP to
[11:10] Christopher David: version 8.3 all right that now works this uses some the host functions thing uses some
[11:16] Christopher David: FFI dohicky
[11:18] Christopher David: You know, I use it it uses a thinging okay to use a technical term all right
[11:21] Christopher David: So we have this
[11:24] Christopher David: Test dumb demy dummy function working we're able to create a host function fine and now we're working on this kind of like it's in the unit test
[11:33] Christopher David: But it's kind of a feature test where
[11:35] Christopher David: Running the stuff to call a host function now this one here is gonna fail because it's using some
[11:43] Christopher David: New code and chat to be to give us
[11:46] Christopher David: For sort of like our implementation says you should probably call plug-in colon and
[11:52] Christopher David: host function
[11:54] Christopher David: Why though why does it want to do this? Let's let's read what chat GPDs will actually do in here. So
[12:00] Christopher David: We're setting them up key value store. We're defining this thing if needed for host function parsing reading stuff
[12:06] Christopher David: Defining a kv read host function with these i64 string bubble blot which is from the example
[12:13] Christopher David: code defined the kv right host function sure
[12:17] Christopher David: Uh
[12:19] Christopher David: Calling with a plug-in. Yeah, I
[12:22] Christopher David: Don't know why this is needed why why why are you doing this?
[12:28] Christopher David: Let's just try um getting rid of this kind of do it fancy like and do like shift v
[12:33] Christopher David: j
[12:35] Christopher David: jcc boom
[12:38] Christopher David: someday i'll be fast at that. There's way to do that with a few or keystrokes but
[12:43] Christopher David: um
[12:45] Christopher David: assuming they get to code and they're code out of curiosity how does it fail out if it does it will probably fail what it what happens
[12:53] Christopher David: Unable to load plug-in
[12:56] Christopher David: Unable to create xism plug-in unord import xism colon host size user colon colon kv read has not been defined
[13:04] Christopher David: oh
[13:12] Christopher David: Because we need to define it else. Okay, let me let me get back to the actual like xism
[13:18] Christopher David: Demo code and not use this
[13:21] Christopher David: bastardized charity version of it
[13:24] Christopher David: host functions
[13:27] Christopher David: new plug-in
[13:35] Christopher David: So I don't know if we've exposed that part of it
[13:42] Christopher David: plug-in is new plug-in we need to pass these imports to the plug-in to create them
[13:49] Christopher David: All imports of a plug-in must be satisfied. Okay, so this just might be
[13:53] Christopher David: um we didn't implement that part of it. I don't know if this has to be assigned when you create the plug-in
[14:00] Christopher David: But let's just go take a look at where we're doing that and if i'm cool i'll do gb there and boom there we go
[14:06] Christopher David: Okay, so plug-in when i'm doing parts we are doing i think this
[14:17] Christopher David: call
[14:23] Christopher David: Okay, so i might just be able to pass in the functions
[14:27] Christopher David: come back to here. Yeah, yeah, yeah, yeah, yeah, yeah, see if we're gonna do
[14:35] Christopher David: Functions boom right there and then over here in plug-in
[14:40] Christopher David: we're gonna say you can optionally give me some
[14:45] Christopher David: functions
[14:47] Christopher David: oops
[14:49] Christopher David: So just say i don't know, optionally pass in functions to go to the plug-in
[14:57] Christopher David: and it can just call this you know what this can be mixed
[15:02] Christopher David: is it mixed i don't know anything about piece we type mixed you know functions
[15:08] Christopher David: equals
[15:10] Christopher David: nothing
[15:12] Christopher David: okay and then
[15:15] Christopher David: just like hurl it into the hurl it into there
[15:20] Christopher David: plug-in call or do you want me to find it
[15:24] Christopher David: want me to find it and then you call it
[15:32] Christopher David: Yeah, maybe and then make sure we're passing those in
[15:38] Christopher David: we are
[15:41] Christopher David: Okay, the first thing i want to do is
[15:44] Christopher David: DDL with this does
[15:49] Christopher David: just make sure we have some kind of output there
[15:53] Christopher David: we do
[15:57] Christopher David: Now we're initializing the kd store every time so if i run it again it's still gonna be three
[16:02] Christopher David: because the state is resetting between test runs but if i
[16:06] Christopher David: run it twice
[16:15] Christopher David: i would hope to see
[16:23] Christopher David: different output
[16:26] Christopher David: wow
[16:32] Christopher David: i'm able to look plug-in and i'm able to create xism plug-in i'm not in poor oh oh
[16:39] Christopher David: well what what because this what this is doing is um
[16:43] Christopher David: it's initializing it every time
[16:49] Christopher David: so what everything to do is pass that into maybe the constructor
[16:54] Christopher David: see look at me i'm like using my brain rather than
[17:02] Christopher David: sometimes i feel good to think i want to think by myself a little bit
[17:05] Christopher David: okay so when we create the function
[17:09] Christopher David: yeah the problem is that we are defining a function every time we call
[17:26] Christopher David: and we don't want that let me just try to like rethink through this myself
[17:30] Christopher David: so maybe instead of doing this every time we call let's just do this one so we construct the plug-in
[17:47] Christopher David: where i really want this to do is just be like this
[17:52] Christopher David: plug-in call
[17:53] Christopher David: and then when i put these things in the constructor
[18:10] Christopher David: make a constructor
[18:16] Christopher David: yeah
[18:23] Christopher David: when we construct it then we're going to want to pass in the wason URL
[18:30] Christopher David: the functions maybe yeah
[18:38] Christopher David: let's save even the manifest
[18:45] Christopher David: reminding what we might want that i don't know if we'll need functions saved
[18:54] Christopher David: and then we'll call it this plug-in
[19:02] Christopher David: so we don't want instead of every call and then we'll call this
[19:06] Christopher David: private wasm URL private manifest private plug-in
[19:12] Christopher David: come back down here now we got some problems
[19:17] Christopher David: wasm bytes this wasm URL
[19:23] Christopher David: was the problem see i don't have any way of error checking this because i don't
[19:28] Christopher David: forget what the command is or i don't know what the hotkeys
[19:34] Christopher David: maybe it says i don't know if that's a string
[19:37] Christopher David: how do i say that's a string we might type that
[19:45] Christopher David: come with that oh yeah it's like giving them types
[19:51] Christopher David: give me them types now it's going on here
[19:57] Christopher David: probably yeah i don't know what that is
[19:59] Christopher David: exports. Oh, we got all sorts of tight complaints now. Okay, so for call, we're not doing that. I just want the function name. Don't give me the functions. And then what we need to do is
[20:20] Christopher David: when we construct the plug-in, when we construct the plug-in, when we thought I could
[20:37] Christopher David: put with how it handles models.
[21:07] Christopher David: Well, I'm probably not going to be able to do a factory there.
[21:25] Christopher David: Hmm, this would be interesting.
[21:37] Christopher David: Okay, so new plug-in with the WASM URL.
[22:08] Christopher David: And the functions.
[22:25] Christopher David: Okay, then down here we don't grab that.
[22:37] Christopher David: Okay, so we're going to do a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit of a little bit
[23:07] Christopher David: that should be nine vowels, better be nine vowels. Oh yeah, so nice. Okay.
[23:24] Christopher David: I don't know if there's some problems with defining it like this if this bypasses like
[23:30] Christopher David: a model model handler create blah blah blocks or not creating it and defining it as new with the
[23:37] Christopher David: constructor that may not be a best practice but right now it works our test pass while our test doesn't pass
[23:41] Christopher David: I did a see. Expect the code to keep you have total expected to be greater than zero.
[23:51] Christopher David: I mean I'm expecting it to be nine.
[23:53] Christopher David: Now what is this console? I'm being pretty robust here.
[24:08] Christopher David: Oh that's defining our host function. Where's that come from? Oh yeah the host function.
[24:27] Christopher David: So you be quiet. Thank you and you be quiet. And then let's clear out of there.
[24:36] Christopher David: Okay. I'm expecting the code to total to be equal to nine.
[25:06] Christopher David: Oops oops oops oops oops oops oops.
[25:14] Christopher David: Two equal is that I forget if that's a thing.
[25:25] Christopher David: Uh yeah, not zero.
[25:28] Christopher David: Oh that's nice. That's really nice. Okay we officially have host functions working in
[25:43] Christopher David: Okay so we just got to fix this.
[25:58] Christopher David: Cassandra writes a property plug-in was we are of type strain.
[26:07] Christopher David: If then just return. Okay just don't complain if I don't pass anything.
[26:18] Christopher David: Oh the problem is it might already have a different problem. Thanks.
[26:31] Christopher David: All right let's fix this to do now.
[26:48] Christopher David: Okay.
[27:48] Christopher David: Fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine
[28:18] Christopher David: fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine
[28:48] Christopher David: fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine
[29:18] Christopher David: fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine
[29:48] Christopher David: fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine
[30:18] Christopher David: fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine
[30:48] Christopher David: fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine
[31:18] Christopher David: fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine
[31:48] Christopher David: fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine fine