 You need to think about, think like the architect of Asterisk Okamalu. And with that, it's easier to understand some things at the first time. You think, eh, why is it like that? For example, for ShandPgSIP, you have now a lot of new options and new objects not present in ShandSIP, but why? And when you understand more and more SIP, oh yes, it makes sense for you. For me, if you really want to understand the SIP protocol, the best thing, take your favorite language and try to implement a SIP stack as educational purpose. The other thing is to avoid the C traps compared to the dynamic languages. In fact, I don't know if you have some C knowledge, but for me, yes, C is very, very complicated to implement. And it's very complicated to find good C developers compared to to find Python or Ruby or PHP developers. It's very, very easy to crash a C-demon in general, where usually with dynamic languages, it's pretty hard to crash the virtual machine. Yes, and you have also more risk in terms of security. And finally, the end result, because customers don't care about that, but they care about the fact to, yes, you need more time to implement features with C compared to a demanding language. But the very good thing with C is, yeah, in terms of efficiency, you have a very good efficiency compared to usually dynamic language. It's why most real-time tools are in C. Moreover, the fact to use Python enables you to use a feature built-in in the Python languages. The first thing very important to me is the very big standard library. You have a lot of libraries where you can more or less easily import in your project, depends on the complexity. You have a main repository to find that easily with Python package index. And moreover, you have an access and easy access to extra design patterns like asynchronous or functional programming. And the extra thing you have in Python you don't have in all dynamic languages, it's Cyton, because for people who doesn't know Cyton, it's a tool. You write Python code, you add some special lines for Cyton. And behind the scene, your Python code will be... It will generate a C file and you can compile and you can gain a lot of efficiency thanks to Cyton. In fact, the idea behind, you write your code as a prototype, you benchmark a little bit, and when you find some areas you need to optimize, you can use Cyton easily to improve the efficiency. And finally, the most important point for us is to have a library instead of a finished product. What that is mean, in fact, we have our existing stack, we're using our production, the name is API hour, and the idea behind that is to have a demo, this demo can be in multi-worker mode, use several CPUs, with that we can bypass the GIL, most of the time dynamic languages you can't use at the same time several threads at the same time. We use an event loop for asynchronous events on each worker and we embed some servers inside. Technically, it means in a server, usually people do a demo with HTTP, but for us, we do HTTP, but also Web sockets, SSH, SMTP, SIP, Sysflug, fast GIL, we use a lot of fast GIL, it's a protocol to discuss with Asterisk, and we can share our code between each protocol we implement. It means for each protocol we have, if one moment we need to discuss with the database, it will be the same piece of code. But clearly to us, it will be easier to customize the behavior because we are Python developers. And we can reuse all the ecosystem of generic programming languages, and you can compare that with the fact that in Asterisk, GILPlan, or in Camalio, you have some primitives about if, the loop and all strings, and to us, we have all of that through Python. I'll show you some small examples. The first one here, yes, in IOSIP, you can be in server mode or in client mode. Here it's in server mode, it's a very simple example where we can start the IOSIP, we have router, where it means simply when I receive a subscribe, okay, please launch a coroutine with the name subscribe and pass parameters of the dialog. And with that, it seems very simple, but here it means between the declaration of my coroutine and send the reply, I can implement custom logic, I can rewrite the CIP request, for example, I can send back another thing, I can drop, as I want, same thing for register. Here it's a little bit more complex, it's only to show you, it can be very easy. Here it's to send a custom CIP notify to fonts and here in fact I have only one line, it's very easy to us, okay, I want to send a custom notify but I use a dialog and I send a notify. Here it's another example where it's more complicated but only to show you, okay, in fact I can customize everything in the CIP dialog if I want. And here I customize the contact and I put another contact inside the subscription. Okay, now one of our use cases, it's okay, we are at Alucard and IP, we have some, using some CIP CTI, for people who doesn't know CTI, it's usually the tool in the computer of one user and to enable the integration between the computer and the telephony. Mainly to launch a call, we need to type on the phone and show a pop-up when you receive a call and some CTI clients use CIP for that and behind the scene they use a subscribe to receive notifications for BLFs and use a refer to launch a call. But in fact, for now in Asterisk, we only have the support of subscribe and notify but inside the notify you don't have the correct caller ID. An issue is open in the project and another company open Bounty, it means if somebody fix that, he will have the money of this company but for now and we're discussing on my English it seems very complicated to fix at least from us we didn't arrive. Finally, what we did, we provisioned funds and then ford we have one CIP account, we put a second CIP account to enable funds to register to us, to enable us to send custom CIP messages and finally we listen to Asterisk through AMI and 5CGI and when we see the correct caller ID, we take that and we push that in notification and to do that we do that via a manual approach. It means, OK, IOSIP act as a proxy, we retrieve information and when you see the wrong notify from Asterisk, drop that and wait the right information through 5CGI. In IOSIP architecture we try to be very simple, we have in fact an application and inside the application we have CIP dialogues and we have message only to parse and we have a protocol simply to open a UDP UTCP socket. We have tried to do a micro benchmark with options but for now our result is, OK, with CIP, CIP seems to crash before to overload Asterisk, OK, it's obvious, but also IOSIP. It means we seem to have good efficiency but we don't know how many and if somebody has some knowledge on CIP, I'm very interested in. For me, the most important thing, architecture is more important than programming language and with multi-worker, multi-trade and asynchronous algorithm it's interesting and we use that since two years in production. We have some test, you support TCP and UDP and clients are approximately and we don't have yet documentation, the code is a documentation for now and we want to reach maybe one day the RFC compliance because certainly we don't respect RFC compliance. OK, thank you.