 ...a samozřejmé a jediné. To je spět, které všechny jí jít, to si být. No právě. No to jasný, já jsem to jen. To bude to spět, které jí jít. Já jsem to jen. Jsem si měl, že jsem dělal, že Poleský chvilotest můj. Já si to musím jichla nám čím? Čislam, čislam, peči je. Já to budeš přečet, já to jen. No to táma záležený. Já to tady dělal před workshopem. M jerk. Někto to mělo. Já to títil. Ilá mě. Já se tisné. Je to pěkný? Ten dět exhausting... Tak je za to... Uektivávaj... Sorry, guys. OK, what time is it? One minute. My session chair went to get some breakfast. I have no idea how to switch the display to this computer. Any ideas? Jsem tohle kaltarit. OK, so hello everybody. My name is Biro Hrančok. I work at Red Hat remotely from Prague for the Bruno office. Thank you. And this is a workshop that's called Sight and Stop Writing Native Biting Extensions in C. I realized, so I prepared a slides later, that native extension is not a thing, but still you are here. So you probably knew what I meant, or at least you think something. What I meant is extension modules, but yeah. First of all, we do a little exercise, because yesterday there was a party, and it's early in the morning. So you think of your Python skills, and then you raise your hand with one, two, three or four fingers. Is there anybody here who is not able to do that because of some... Ne, OK, thank you. So then you raise something like this, and then you pair yourself with a buddy. So if you are a beginner, you should have a very experienced buddy, and you will work on stuff I'll tell you to work on together. Preferably the more experienced guys should stand up and seek some beginners, because for beginners it might be awkward to seek some expert guys. I know this is an awkward thing on a workshop, you are probably sitting next to your friend or something like that, but this also makes sure that you do not talk about your other projects while you are having this workshop. Is this fine with you, or nobody is moving or raising any hands, I mean it. You are not going to start without it. At the same time, you don't need to do that. While you are not doing it, apparently, you can go to GitHub and grab this repository. If there is a problem with connection, I have one USB stick with the data and more empty USB sticks without the data, so I can hand it to somebody and then we can distribute it. Thank you very much. So let's just sit here for a couple of minutes before you start doing this and see them probably. I mean it, I see no hands and I really mean it. Raise your hands. I think myself number four and establish what guru is. If you have multiple Python projects on GitHub and stuff, then it's fine, you are a guru. Let's think about it like that. Now everybody looks at me and not everybody can pair with me. So just look at each other and pair, keep their hands there. Yeah, yeah. Martin is number ten. Do we have number minus ten so we can pair up somebody? OK, now look at each other and please pair. Do we have some ones over here? Cool, do we have some fours? Fours. Four one, you're sitting next to each other, you're done. That's how you're all. OK, can some four seek this guy over here, please? It would really help me if you follow my instructions, but if you're not interested we can go home. I mean it's Sunday morning. Guys, do you at least have the repository cloned or something or is that a problem as well? You got? OK. There are several files in the repo. I will have some code examples in the slides and you will find them in this file, all of them. So if you want to copy paste something, you don't need to letter by letter copy it from the screen. You can use this file and seek the code example in it. Also, do you have Cyton and iPyton and stuff like that on your computer or anybody need a live Fedora or whatever with this? Cyton, packages Python 3-cyton in probably capital C as well. I'm not sure, Python, yeah, that's it. If there are troubles with the connection about the packages, we can boot some life systems that should probably already have those packages. Meanwhile, about Cyton, what it is, you can find more information on Cynton.org. It's a programming language, which is similar to Python, and you can type statically using types from C or C++ or maybe even Fortran, but I have no knowledge of Fortran, so just forget it. And it's also a compiler from this Cyton language to C or C++ depending on what typing are you using. And it compiles the stuff to Python extension module or even to standalone apps, but those standalone apps will still require Python runtime and libraries, so it's not so standalone. When you write Cyton, it feels like Python, but it works like C. So you have the Python experience as a programmer, but then you get the profit of boost and stuff like that from C. You mean like SecFaults? Yeah, SecFaults, yeah, you can get SecFaults. I don't know. If you miss SecFaults from Python, this is a way to do it easily. All you need is to, I don't know, access an index in an array that's out of the bound and you get a SecFault. Wow, OK. I have read this very good book, and if you are really interested into Cyton after this workshop, I really recommend to getting it, and it's a very good book, and you can get all the information you need. This workshop will be only a little taste of Cyton. How many of you have ever written an extension module for Python in CRC++ or something like that? Few, not many? I haven't seen the source. Yeah, how many have you seen some sources at least? Half. OK, so for those who haven't seen any sources, you are lucky. Yeah, do you agree? Yeah, it's ugly. You cannot write it, you cannot read it. You will try to poke your eyes out and everything. So, never mind. If you want an extant Python with CRC++, you can use this thing. And usually you do it because of performance or because you need to interact with CRC++ libraries or a code. You write a C code, you include Python H, and then you do a lot of crazy dancing to create objects and classes in language that doesn't support them and stuff like that. It hurts to write, it hurts to read, it hurts to maintain, and if you want to keep it compatible with legacy Python and Python, it's almost possible, but it's harder than with normal Python code. Siten makes all of this easy, it's easy to write, it's easy to read, it's easy to maintain, and it's easy to keep it both compatible with legacy Python and Python. This is an example of Python code. Is here anybody who is not capable of comprehensifying this kind of code? Great. So, it's a Fibonacci sequence stuff, it doesn't generate the sequence, it will just get you the nth number of the sequence by generating the sequence internally. Higher the number, longer it takes. And the code is pretty easy, you just start with 0 and 1 and then you just count it. If you get this code, you can copy it from the Siten PRX file and you paste it into IPython. Let me see, is this very first thing. If you copy something and you run IPython or something like that, you can just use this magic, because if you paste it, it will not work. Now we have this function in here, and I can just do stuff like 2, 3, 4, etc. And if I run 90, it is a very large number, and I can use time it, which is also an IPython thing. So I can, for example, run 190 and I can use time it. And I don't know why, but if you time it, it takes like 10 times more time, but it times it anyway. There are some numbers about how long does it take, it says per loop and it says some number. I don't know what this number really means, but if you compare two results of time it actually gives you some idea what's faster or slower. Now a good thing about Siten is that this is a valid Siten code. Everything that is a valid Python code is a valid Siten code, I think everything, almost everything normal. So we can take it and we can maybe compile it with Siten and run it. To make it like perfor even better, we should add static typing. You can see now on the top is the Python thing, and on the bottom is the Siten thing. And there are a few more things. The argument to the function is no longer just a letter, it's an integer. And then we have a new keyword, not known in Python, and it's Cdef. Basically it's me, I am defining this C variable, or declaring, and it's going to be an integer and it's going to be this letter or word. Also you can do multiple at once on the second line, these are going to be long integers, and it's going to be a and b, and they're going to have some values. And that's it. Otherwise the code stays the same. And if you want to just try it quickly in the Python, you can load an extension called Siten magic. I don't know where it comes from, but I guess on Fedora when you install Siten and Python both, it's just there. And then you can use two person marks and Siten, and then this thing is going to be compiled like when you define it. So if I just go and grab this whole thing and go here and go paste, there is a syntax error. Maybe you have to do this before you paste, and now just copy it without it yet. Now I have this function, you can see I can run it and it gives some results. If I give it 90 and I scroll back to 90, it ends with 0 and starts with 3, looks like the same number. And you can of course time it. I will time again the original one, and now I'm going to time the new one. And you can see we are talking about tens of microseconds in here and about hundreds of nanoseconds in here. In case you don't know nanoseconds are smaller than microseconds. One thousand of them to create one. So this is like, I don't know, two magnitudes or whatever boost. All we did is we took the code and we added some keywords and make it static. Of course some weird things might happen if you use sidefib and you just give it a string. I have no idea what's going to happen, I didn't try it before. It's an exception and not an exact fault, which is cool. What happens if I just go here and use the original one? It's another exception, but the same type error. So that's it. But maybe if the code would be different you could get weird stuff. OK, normally you don't use sitem magic because it's magic and you don't use magic in your code usually if you don't study at Hogwarts. So if you have a module and you install it with setup by and setup tools, you can use this dancing around to make it work. You just type setup by install and everything compiles. There is an easy way, it's called sitonize, but it doesn't work with setup tools, it only works with distutils. Mostly now when you call distutils, setup tools is going to be called instead. So this is a better thing to call. The new things are the second line. From siton distutils you import build extension and then you set up that build extension is build extension. Build extension is a little bit more verbose than it is supposed to be probably normally. And then you just give it an extension, the name and the name of the file. You usually use pyyx extension for siton code. And a good thing is to add a classifier, but it's not something that is really important for this to run. A saying is written in a siton. If you have this in setup by then when you run setup by install, setup by, buildxt or whatever, it works. The only problem I found is if you have install requires in your setup file and you say siton inside and then somebody goes and doesn't have siton and goes pip install whatever, it produces an import error on the second line because when the file is parsed you don't have siton yet and stuff like that. So if you want to work around it you have to do some little dancing like trying to import it first and stuff like that. So now about typing. This is a python code. It's also a siton code, nothing is typed by you by saying it but things have typed, right? B is the list for example. But if you want to type things statically in siton you have to use cdef, you already seen it. Most of the types have normal names you would expect. Usually sometimes it's like python and c so if you need to have a float in python and you want to have a double precision you put here double because that's the c type and stuff like that. It's also possible to declare them on the same line multiple things but it's also possible to give them some values. You've seen that in the Fibonacci example. There is nothing really weird about this. The thing is here you can see long int and before there was just a long, it's basically the same thing. Do you mean like the number in the name of the type? I'm not sure about this, probably not. I don't know the answer to this question, sorry. Probably a good idea is to go to documentation of siton which is on docsiton.org and try to look at them. I never really needed such press like to have the exact idea how long these types are. Thank you. So pointer is arrays and bind. So if you need a pointer you just put asterix before the variable name which is probably the same way you do it in C if you need a pointer to a pointer which feels very C-ish to have pointers to pointers to pointers you just multiplize the stars. Even if you like pointers to functions you can do it. And if you need a static array you can here you can use size t so maybe you can also use int whatever number also automatically I don't know. You just say it's an array of three elements you can only use constants and numbers in here you cannot make it based on variable because siton translates to C89 and it doesn't work there. Here you can see if you want to get the pointer to think u is ampersand and before which is probably also the same way you do it in C but you cannot dereference the value or get the value out of the pointer by stars because then it has a different meaning in Python probably so you can always use zero element of an array and that gives you the value that works in C2. There is also an operator for that but you have to import from siton.operator import dereference and then the codes get very ugly so this is probably better. One special type is BIND which is like Boolean integer in your siton code it's true or false but in the generated C code it's going to be zero or one. It works as expected so true is anything but zero and false is zero. You can also have structs and unions and you can use C-Dev or C-Type-Dev the only difference is with C-Type-Dev it's going to be a Type-Dev struct in C and etc. but from your siton code it works exactly the same you C-Dev your name of the struct and name of the variable is the very last line. If you want to initialize a struct you can use something like a constructor that's automatically generated you can give it the positional arguments or name arguments or you can just get a new struct and then access each of those things inside and set them separately. I have no idea what the initial value would be if it's going to be zero or some random thing if you don't initialize your memory you never know what you're going to get so probably better to always initialize the values and also you can just give a dictionary like to assign the dictionary to that struct and it works which is probably a good way if you have dictionaries in Python and you want to convert them to structs you just do this and it works. Ok, functions there are three types or three kinds of functions Dev, C-Dev and CP-Dev and dev function is something you're going to use from Python later like you write it in a siton you compile your module then you import it from Python and it works it has a Python interface if you use C-Dev for functions they will not be visible from Python you can only use this for your internal functions they differ, they have a return type as you can see C-Dev it returns long but the dev doesn't return any type because it returns Python whatever object and this is faster inside but you cannot access it from Python and if you need both if you want to access the function from Python and also export it for others to use it from Python you can use CP-Dev which basically is the same thing as if you would like copy paste the code and have it with the return type and without it so it's a shortcut so you don't have to use this repeat yourself if you want to have classes normally in Python in extension modules you don't have classes but you have extension types for example if you have an object which is an instance of class and you can just give it new variables inside like self.whatever in the middle of the code this doesn't work here so everything that's a variable of the instance you have to define it at the beginning of the class so if we gonna use self.nr we need to declare it in the beginning all these things are normally private by default you can make them public which means even from Python then you can reset them and read them by adding cdef public double whatever or you can use read only which is read only for public no writable if it's fine with you you can use normal init but if you gonna do some C magic you should always use synnet C init and the only problem is if you like something like if there is an init self does not exist yet in python and blah blah and now you are trying to access a memory and this could end up in some ugly sec faults if you like so you can use it to have sec faults but if you don't want to have sec faults then you have to use C init this is like called every time before init and stuff like that and here we have a cool thing we have a pointer to double which is essentially a buffer of doubles or array of doubles but we have to initialize it so we smalock which is probably something you would use in C but to have it in siten you have to C import it and that's on the very top some libc is basically a wrapper in siten about libc so from libc you see import maloch and free to use it and you can use size of for free and this double with asterix in those parenthesis that's casting it has a little bit different syntax than from C for whatever reasons so if you want to cast something you want to use html brackets or whatever they are called so when you maloch some memory then you should see if it went well it usually goes well today but sometimes you may be out of memory or whatever so you should raise memory or for that and it's a good thing to free your memory if you don't want to get leaks to have something to leak on your seqfold so whatever then you should free this thing so that's the method that's called dealloc these two methods have to be def not c def not cp def I don't know why exactly is that but all the other methods can be whatever functions could be now this is not a talk, it's a workshop so let's start do something we're going to use a knapsack problem which is a problem from combination or combinatorial optimization it's a very common thing basically you have a pool of things and you have a knapsack with a given capacity and each of those things has a weight and cost and you just try to put more expensive combination into your backpack there are hundreds of algorithms to do is the easiest way is brute force so you just get every possible combination of those items you calculate the weight and the cost if it fits into your knapsack then you try to locate maximum cost of those and if it doesn't fit you just use a different combination this is of course exponential time to do and if you have this repo clone from the beginning there is a little code in the knapsack folder and there are some files like data loader and initpy you don't have to look at those if you don't want to and then there is solver pi and csolver pi ix and the same code the only thing that changes is the name of the class just to make it clear this is a solver class that solves this problem by brute force it has an init that takes a sack which is something that looks like this the same thing as if you ask how many items are in there it has a capacity and it has a list of other dicks that contains weight and cost now if you initialize your solver and then you call solve it returns the maximum possible combination as a list of booleans and max cost which is the maximum cost you can fit in the knapsack sometimes multiple combinations can have the maximum cost of course but the maximum cost is deterministic for each sack I will just hide this make it a little larger and the main routine is here solve it just saves the number of items so it's easier accessible and it says the maximum cost is something negative because cost will be always positive and for each number in range from zero to to the power of number of items you generate a combination from that end which is basically a little code that will take an integer and turn it into a list of bits and you calculate the weight and cost which is done like if this is true in the combination then you add the weight and cost and you get the final number and if it fits into the backpack and it's better than what we have set before we will save to the new cost and a new combo it's a very easy code but it takes ages sometimes there is a readme and it has some code snippets for bash but this for example Python 3 set up by buildex in place makes sure that you can run the code from this very folder this builds the C solver which is here and it builds it and now you have this shared object file and you can import it then if I'm gonna call this thing now I'm solving the problem for some random data for the number in here means how many items are there possible to put like you have the pool of the items so if there's four you only have to choose from four items for boot for us it means two to the power of four which is not a very large number so it was fast 10 and 15 was fast as well and number 20 is taking some time and it's gonna get worse so you can just control see it and now you have some data for all the first except 20 and more and now you can run it on siton which is this and it works again it's also probably slow we don't know nothing about how much and now I'm gonna just end it as well okay and now I have some the time inside and if you go to read me and you can get the this one the last one you need the mat pod lib if you don't have mat pod lib you have to get it from the repo and now you have times pdf and you can see based on the problem size the time how much it took is a logarithmic scale so don't be surprised it will be very exponential and you can see the blue thing is python the green thing is or yellow or whatever is that number siton and we didn't change the code and we get a little boost up for free just by compiling it and now if you want to get better performance you need to add static typing you will never get by the thing that is exponential even if you use siton like magic and you cut your wrist in the middle of grass road in the middle of the night it will still be exponential so only thing we are changing is the multiplication constant for the time but it could be like thousand faster or something like that so what you are supposed to do now in your very formed pairs on the beginning is to look at a C server thing trying to optimize the algorithm keep it naiv as it is it's a very naiv brute force algorithm and you can get much faster and not even exponential things if you try guessing and stuff like that but just keep it as it is of course you can rewrite these things but the solve procedure should be the same thing for each number from zero to two to the power of number of items minus one you just try to get the combination calculate faith and cost see if it fits and if it fits yeah you know and then if you do some changes you can important thing when you do some changes to the code you have to run build x in place again you probably are not used to it if you are programming in python mostly but now we are compiling the code so don't be scared that you have made changes to the files and the times are always the same every time you want to run it again you want to run this again I didn't do any changes so it says it's up to date but if I would like go in here and do some very useful change maybe even a new line that will compile this again if you have a syntax error in cyton it should tell you and the lines are pretty self-explanatory you should probably be able to tell what's going on and what's the problem is if you are not just ask me or your fella or whatever and let's try to put a very large distance between the two dots on every column and each time the distance between the dots is the same distance as between those number on the left you just made it faster ten times and as you can remember probably from the Fibonacci thing we made it like 100 faster so it should be able to do at least two of those steps I don't know for sure maybe this problem will not be able to get this much performance boost but since I guess it's a very it runs very often even more often than the Fibonacci thing you should be probably even able to make the distance even larger if you have a stronger hardware you can let the calculation go further and further up to something like 40 but on my hardware the 40 thing on python I went to get an app to get it done and it took a long time in the meantime there are plenty other things you can do with Cyton like using C libraries, interact with NumPy and stuff like that I didn't cover this on the workshop because I think we just focus on one thing they have excellent documentation so just go to docscyton.org or get the book in the slides you have the slides in the repo in the form of tech file there is a link to a github repo that has examples from the book you can find it useful or if you want to contact me it's miroyatredhead.com later if you want to contact me here don't write me emails just raise your hand or shout at me it's going to be faster I have some scarves here so if you get some very good results at the end they are for you Defcon think that looks like Cometa Bernou I have a question when I worked with Cyton a few years back I used there is magic import in the library which if you import it and install it then if you import any module which is Cyton it automatically compiles like every time like editing but it doesn't seem to work anymore let's just look to the clever book I know what you mean Pix import it works for me on windows but here it's compiling on the fly with Pix import maybe they have changed something in time you have to import Pix import and you have to Pix import install before importing yes so if you import your module and it goes to automatically you know it doesn't work anymore it works for me on FedR21 which is out of date it seems like it's not ready go on what about threads so you can't create threads like normal C threads but then you can get some cool sick falls I never did they run in parallel you can have your sick falls in parallel you can have that in Python basically you can also probably use async.io and use c-code from all these things inside there is a last chapter in here I have not been able to finish yet it's called parallel programming in Cyton so if you're really interested in parallel programming in Cyton it's like four pages so you'll probably be able to read it here and present it to all working is it working too I'm working on the process I've never used it for parallel programming it's probably so fast that you don't need to do that yeah what can I do if you reach the parallelized loop you can use Cyton to bypass the chill bank from GLI or global interpreter from Python so if you don't like this then you use Cyton to use normal blocks what can I do I have it in the slides but I forgot to tell it so if you have your Cyton code or the beginning it's basically the same code as Python you can use annotate it's not in the slides, it's on the readme and so you can use Cyton, annotate and the file you want to annotate and this will probably use html file that you can open in the browser and it's yellowish and more yellowish it gets it does black magic to know what type goes in so it basically means if you type it statically it's going to be less yellow and if you click on the line somewhere this is the C code that's generated just by this magic in it that can take anything but if you use it essentially you want to get anything the thing about the Cyton and the C code that generates is very long and very ugly but it's because it tries to optimize it so if you are not a very like if you some might say if I write my extensions in C directly it will always be better than Cyton probably not I'm not sure so more yellowish it gets it's worse it imports iter tools which are never used I guess so you can just get rid of that and not so yellow it just returns two things but yeah you can see here if you haven't seen any any C Python API this is how it looks like it's very nice and readable and stuff thank you for your comment I can give you a scarf for that just even if you don't want to type anything unless you already have one but you are not fed up with it over now and you will be afraid from your own time or any other so so what have you learned that it hasn't known you think you will do because basically I don't think it has function used it doesn't know you and it will you have to you don't know that much and then threats and you can have parallel loops and what happens if I want to use the compiled library from C it doesn't generate something it doesn't generate the interface for you unfortunately you have to create the pdx of pxd file pxd file which is a copy of the H file H file from C or C from A but you remove some unnecessary syntax spring B from C but you can change stuff in there and then you can C import this file and use the functions what I did when I want to get like when the H file was very large I wrote a pipeline code that took the H file and generated this they essentially say in documentation something like Cypel will not automatically generate all this for you because this and this and this and I can show you how it looks like so this is a pxd file for AdMesh STLH if I try to get also the header file so STLH is here there are some type the structs in here so you have them here as well and then you have some function definitions or declarations in here you remove stuff like X extern and you remove semicolons and you just basically copy paste it the thing is you only need those you are going to use and here is a different you have to use C type def if it's a type def struct in the header file or you have to use C def if it's just a struct and you can have even enums I get C type def enum and sometimes if you know that you will never access the internal parts of the structure still you are going to take the structure from one function and pass it to another all you need to do is to have it but inside you can just use pass it says like I don't care whatever and I have a very ugly code that basically takes this and converts it to this it might be done with regular expressions maybe but I will just read each line and for each line I do some magic high performance matrix multiplications and vector operations if you want to program the operations yourself I would recommend siten but there are probably also libraries that are written in siten already like numpy and scipy that probably already have these basic operations like matrix multiplication and vector operations so if you just want to use regular matrix multiplication you can use numpy if you want to do some weird multiplication as you define it for yourself and you need to code it for yourself that siten is a good choice for that P1 p2 p3 p4 p5 p6 p6 p6 p7 p8 p9 p9 Tak už je na hardwareu? A to běží to... ...ně běží to pala, běží, běží, běží, běží, koko to máš jadě. Mě se teda teraz běží pala, ale v jednom poštěm pajce na večnou sajtu, ne? Vždyš, když jen z něm robí, to tam je 4, a tam je ty... ...2,3. A tu tam máš než to, ale jí bá, jí bá... ...pren důvodat rejku, tak můžu dělat sela, můžu důvodat rejku, ale jesem... Co je teba sajtnou? Však je to... ...pousojším a základě přímovovalo? Je to působděv... ...pousojším, stejnou, stejnou, stejnou, stejnou, stejnou, stejnou... ...pousojším, stejnou, stejnou, stejnou, stejnou, stejnou... ...to to bude vám i děendaný. Bude být jistý, kdy máš to kloétechst... ...pána colad jdiežesčité, kde jich jen... ...alvor deštný, potem vlastně se napůjřil? Tak tím toho, kterou mám vůště ne? Vůště mám vůště ne? Na koni s tímho... Na koni s tímho... Na koni s tímho... Ne? No? A kde jde ten prvěstané opšinat v opšinat? Pořeště mám otej? No musíš... mám by si tu listo tej káci, by si mám požit síle v káci. Nebožíš tí, že opšinat. A potom musíš prostě... Všetký je pravěle prostě všetký stadyjský výkuvat. A pokávci, že mám něčeho list, tak si musíš dámu výkuvat výkuvat list of bins, na příklad. A vlastně tě vůtralujíš je funkcije, které jsou výkyvon. Ty můžeš mám nějaký síle, a mám vůvště ne? A mám vůvště netem type, mám výkuvat ten solve. Tady v tom sejnitě musíš zbrat ten... čo to je těchtyklikšnery. Uložit si vodostruktu od jednopivých pevných a do varied of structs. To si musí mít kvůli struct, kvůli savojí do té věci. Jeste z návša. Takže někdy je v tom file vlastně kvůli tady definujíš cdef struct item a tady budí mát double cost a double rate. A tak dalé. A ten graph, co to je? Debrý dmíčku je ten... tak je tam, ten port times, a teraz ten times to refer nebset. A teraz si běžáví, musíš ještě tady mít port times. To jistě tady tady mám, jestli sájtů napisíš tady, takže tak, dětat kvůli cí na mojí zpříjemu a kvůli výkrat do dvejů. Můžeš to běžat, můžeš to běžet zároveň na 5 půvna sejdu a keď zjistíš díklí bůh dělávka, tak si na hodinu otevělám pýklodovatky times. To je výdavat, za takhle kvůli půvna zpříjemu a kvůli cí na moj zpříjemu. Zdávat výklad výklad výkladu times. Můžš to běžet tady, kdyby si cí na mojí zpříjemu dělávka, tak si na hodinu výklad výklad výklad výklad výklad výklad na půvna zpříjemu. Takže, když se výklad výklad výklad tady, když se zpříjemu, když se zpříjemu, když se zpříjemu ale když se zpříjemu dělávka výklad výklad výklad tady. A když se zpříjemu, když se zpříjemu dělávka tady. Bylte s tvřem, když se zpříjemu dělávka, když se zpříjemu ...cela výjelým. A to je... ...chci se to nevěděnit, když se výjelým výjelým... ...a všetkým... ...a výjelým výjelým závodem... ...a to výjelým, když se to nevěděnit. A to výjelým výjelým výjelým. Je to přístupového south-sec kapacitejn a south-mastoc, kterou si řukává se do těžký prv skompovět. Tu bez netušín. Co je možné v tom south-sec. To už jdí těchtových pačkýmenkových. To je těchtových ostavisk na typu, ale nevěděl, že to je třeba o internástruců typu vyten. Takže to bude poště běhat. Bylo to přístupové na ten slech běh, jak je banáta. Ale těch vlastními, že máš nejvědělat typu, takže to můžete dozebřít. A vy možete vědělat jeden pravdí. Nákej od češtého typu s sebem, protože si tam projde, pro někdo děláš, pro věděláš typu kint, pro věděláš typu kout, pro věděláš typu kapacitejn, pro věděláš typu kout, pro věděláš typu kapacitejn, pro věděláš typu kout, pro věděláš typu kout, pro věděláš typu kout, pro věděláš typu kapacitejn, pro věděláš typu kapacitejn, pro věděláš typu kapacitejn, pro věděláš typu kapacitejn, pro věděláš typu kapacitejn, pro věděláš typu kapacitejn, pro věděláš typu kapacitejn, pro věděláš typu kapacitejn, pro věděláš typu kapacitejn, pro věděláš typu kapacitejn, pro věděláš typu kapacitejn, pro věděláš typu kapacitejn, Tak, vždyť. A to bylo... Vždyť. Je to nejlepší listy. Je to nejlepší... CRS. Vysvědějte. A když jste zvukovat, když jste zvukovat, když jste zvukovat, když jste zvukovat, když jste zvukovat, když jste zvukovat, když jste zvukovat, když jste zvukovat, když jste zvukovat, když jste zvukovat, když jste zvukovat. Q&A verr spatula 나가, v Records a publiclyכ kopa poz Russia,inese plus Tak si na álku říkám, když je skupověnou, když si jde všinout. Tamto, tady jsou vzlady nás, jak mám zájty údy. Výdolné je menské, do vědětřů, kdycháš také dojevty. A tam si budí čekáv, že jako jim třeba hladný, to vám cítí, kdo nabl. A tom třeba jim tu čeká se, když ještě hladný, kdo předpíro, kdež jich svéj sám tu. A když můžeme čekat, že jsme z hladný, můžeme čekal, když jste ště do dnes testu, který já to v pachni přesměl, a když to nemáš, tak to potřebujete a o tom potřebujete, že můžeme volnit. Náš všetě náš, tak v tom slubu, můžeme čekat, kdež jsou suprý, kdo je prostě poněradný, a pak na nějaké listy na těma bulí na dva, to je také obětné efektivnice, dobré možná si nechá odložení volnit nejvíče, který přestavuje volnit sánek, je to, že to budou vám. A na tom cíliš to třeba vrátit. Potom, co má vrátit list bulimu, tak možný to s tím, když jim mám na to, když jim mám volnit, můžeme čekat, když jim mám volnit, můžeme čekat, můžeme čekat, tdyž jestli ten, že na tom časuuro platforms mě teda cans, když je v rožinu sejt a kousev sejt, ale můžete byt to kousev podkasev, tak hlavně to byla všem nevášaním všechno důvod. A si bys dotanouval na čo dříštru, když je to se nám hlavně obrát, takhle to byl konečnou, kde byl hlavně obrát. A na konci jenky potřebrají takhle vstět for i in range, takhle konečnou, kde byl konečnou. Můžete byt dotanouval na čo dříštru, kde byl konečnou, kde byl konečnou, kde byl konečnou. Můžete byt dotanouval na čo dříštru, kde byl konečnou, kde byl konečnou. Můžete byt dotanouval na čo dříštru, kde byl konečnou. Můžete byt dotanouval na čo dříštru, kde byl konečnou, kde byl konečnou. Můžete byt dotanouval na čo dříštru, kde byl konečnou. Můžete byt dotanouval na čo dříštru.