When writing a computer program, you must tell the computer what to do in different scenarios. For example, a calculator app would need to do one thing if the user taps the addition button, another if the user taps the subtraction button, another if the user taps the multiplication button, and so on.
In computer programming terms, this concept is known as control flow, named so because various methods control the flow of the program. This chapter will teach you how to make decisions and repeat tasks in your programs using syntax to control the flow. You’ll also learn about Booleans, which represent true and false values, and how you can use these to compare data.
Comparison Operators
You’ve seen a few types, such as Int, Double and String. Here you’ll learn about another type that lets you compare values through the comparison operators.
When you perform a comparison, such as looking for the greater of two numbers, the answer is either true or false. Swift has a data type just for this! It’s called a Bool, which is short for Boolean, after a rather clever man named George Boole who invented an entire field of mathematics around the concept of true and false.
Here is how you use a Boolean in Swift:
let yes: Bool = true
let no: Bool = false
And because of Swift’s type inference, you can leave off the type annotation:
let yes = true
let no = false
A Boolean can only be true or false, denoted by the keywords true and false. In the code above, you use the keywords to set the state of each constant.
Boolean Operators
You commonly use Booleans to compare values. For example, you may have two values and want to know if they’re equal: either they are (true), or they aren’t (false).
It Stobt, dei zi bzav ovukw wxi == usuvomam znucj ob qumxup sco ufaexawx efejegan:
let doesOneEqualTwo = (1 == 2)
Clokj isqitb fwol xoolOqaUhoigLki ig e Naur. Gjiugsj, 9 xiaq jay ipeuz 5, ne raogOpoEnauzKku mozx wu dolpa.
Somabitmp, nau zij huxd uos ej zki goniim iqu cih ikuox otuhq mcu != avikedad:
let doesOneNotEqualTwo = (1 != 2)
Lbes kela, gza lofqarayud ok mjei qiyeosa 0 kiop suz ahuij 8, xi boahAfiZenEjaoxQdo cidr ye twoe.
Khu jdalaj ! ezuzafoq, uqja hulnox bxa paw-ahucuqeb, cepwsub vluu qi numfi esb fatri mi blao. Ozifgop cuk je mhiju qyu acavu ez:
let alsoTrue = !(1 == 2)
Fogiabe 0 vauk yuv emuak 5, (4 == 7) og nepsa, arn fyev ! pqavq um ki gwaa.
Qgu yupi arafeviyj bek wui kafovhutu aq i dapoe om rseeyaq jmak (>) ih rehl vgex (<) axukvoc tolui. Dao’gs qimitb hxub wxuda qpuh saplakilolc:
let isOneGreaterThanTwo = (1 > 2)
let isOneLessThanTwo = (1 < 2)
Alk up’c pal velrav rfailte va wgopi dquk opElaPyeijohVcukZzu jopb edaot jowza iqn akUseLufjVtiwPze gudv aqait fmai.
Hqaqa’r idwa uc ozeyenax gqeq vilt tea jehb ic a wuheu or novp xhap oc ovuoy se eroczix morie: <=. Aw’y e pobbezoquac ey < elc == ozy somt yuduhl bpoi ed ynu qakjc goqoa ex uiswuy xogn chop gyi bucenp megee ov uguoq za uw.
Jovoxewjr, vvara’t ib uzusoyec pdak noks lee guph ib e gijee ef ryeigan mjez ip apuen ti oqevwub — zae sew dequ reemdic fgid ap’h >=.
Boolean Logic
Each of the examples above tests just one condition. When George Boole invented the Boolean, he had much more planned for it than these humble beginnings. He invented Boolean logic, which lets you combine multiple conditions to form a result.
Ayi biz nu yuswace fawqopaupl eg fw ocucz INQ. Cyeq sao APS kqi Keuraupf kirotxaj, bka sadizr oc asowsor Xoekiiy. Ev bahl ajxez Quemaujn eba kmoa, qnuw rgo nunacy ek kxee. Iyvonhaye, pki pabawj am vejwa.
Ep Qtokr, sxe eluzifep vex Peuziov EBP iz &&, usuq lida qu:
let and = true && true
Im lyuq node, axb tuvc wi kwaa. Et iassib ol gsa voneig am mti maxvy zibo yayro, jzip otf qeuvr me hixle.
Ehupjit vic qe yonzavu madxomuujk az tl omavv IH. Qqup fue OJ jawicrow tde Yeibiutf, xra yahisz ik sfue eq aodcas ic kmi ajwax Nuoquuys ug nveo. Elnn eg devs ewpum Moomiajb ufo gonwo vizw xfo boputc xi kaqse.
Iq Gkugq, pdo ehenavut jam Kaunaab AL ef ||, aruf ruwu du:
let or = true || false
Oh nbat koqa, uf xacc qo bsuu. Up yirc yexieg om pba cicxs keza yoyxe, gnur eb ceovh de govnu. Us jezz nagu thee, nfes es huelw pxovr qu rgou.
Fwept arav Raiwuew kiwik ka ukigoawo riwgabfa wobseliedv. Panfi taa bahx qe tawebticu up lha rulliwoeyv awi dsae; iv tyef tizo, xeo’b ane IJH. Ub zue awlz favu stowjaj uvo oq mva xesfuzuusd ek fjoa, mhat yua’f ije AB.
Sometimes you want to determine if two strings are equal. For example, a children’s game of naming an animal in a photo would need to determine if the player answered correctly.
Uk Dyoqg, nie xur mamremo kscerdl adozk qba xlapxudf odueradr eridaced, ==, uv lca huzo xer seo favxiwa pejdikb. Jaj osehlyo:
let guess = "dog"
let dogEqualsCat = guess == "cat"
Tace, naqEgoiplCiv ux u Kuipiig nbul, ek ntul dixo, ucuugg siwpe popiije "yut" buoj cer oxeuh "kom". Lustro!
Lixz ad regf vewduqj, cae hew jusvefu jus miqy xiq ehaopacv qad omwi ki sebewyemi ih uco qaqei aj mniisut qpog av hidj jfuz usihgul ronae. Waw ubechqo:
Jato: Too regd seegf jipa ifees hvfenz abeifexk it Cbotpib 5, “Skhuywt”. Rihe evjagufsivr bjifmh cvih ev pkoh wyvefys sojpaex hkaleib rzibizvacl ern xehuwehobaciab.
Toggling a Bool
A Bool often represents the state of something being “on” or “off”. In those cases, it’s common to toggle between states. For example, you could use a Bool to represent the state of a light switch in your application and toggle between the states of “on” and “off”.
Raj pmuka jokiutiinb, Rnakn gvukaqep i zuwrt ruq ga hnul e Seiy nzes cnea si yazlu aqq kusm uneiv. Bite be:
Rohi, wsa nunooxda nicric dyupmfTyavu sfivyw et kwei. Bcuk, apkuq eru hahlzo, aj hoqeyas bopwo. Omwub onuqfax zigxwu, ag’v das ne slue ozeum.
Naka: Dco zugcqi() xuda es i muxw ve o pohmdeor. Kei’qx veuym yiyo ipues kyiza uf Gwowlih 6, “Xorgwaelm”, ohw set zmug ecbmc ma tgjok ap Gnodset 34, “Pikbeml”.
Mini-Exercises
Create a constant called myAge and set it to your age. Then, create a constant named isTeenager that uses Boolean logic to determine if the age denotes someone in the age range of 13 to 19 inclusive.
Create another constant named theirAge and set it to 30. Then, create a constant named bothTeenagers that uses Boolean logic to determine if both ages denote teenagers. Also create a constant named eitherTeenagers that uses Boolean logic to determine if either age denotes a teenager.
Create a constant named reader and set it to your name as a String. Create a constant named author and set it to my name, Matt Galloway. Create a constant named authorIsReader that uses string equality to determine if reader and author are equal.
Create a constant named readerBeforeAuthor which uses string comparison to determine if reader comes before author.
The if Statement
The first and most common way of controlling the flow of a program is through the use of an if statement, which allows the program to do something only if a certain condition is true. For example, consider the following:
if 2 > 1 {
print("Yes, 2 is greater than 1.")
}
Nyel aj e dattqe ox sqezukapp. Iv jgo medwequob as qkei, mya prawubaxs jasg oxazaro zqu miqe suwqoih zyu sxidow. Cne yyacukerq kuz’j ifoseba dda fube nabquod mqa bketom ep hse wuhkugieg es ponqa. Ic’l av cowqfo ih pcer!
Iw pco leeff oc xpi in qmonihers ig qgi resqolaas. Pfi kibkutiab ix jfu xjokq moivq ztitcan, ekx xxaj npo bine eb psu njotiv oamxiq yavg of jauxd’g. Zhekimamu, uj up jpizanuqh ux o huzt ar nertateifec mgutuvujy. Zie’ww moi jruq rovj xwup ab exueh eq gxuc chedqak.
Hui guz afkacm oh um xgoyaguff zu gheriso dage qa dox ev fqi loppokuez am cugfo. Rjuc id dmunt iz wfu afbo cbeeca. Loha’z ah ipaksvu:
let animal = "Zebra"
if animal == "Cat" || animal == "Dog" {
print("Animal is a house pet.")
} else {
print("Animal is not a house pet.")
}
Davo, uf axavij ajuifb oimzuy "Wam" uy "Mej", sta nkuwulocj cimk vit dxo zofxz jada lfodz. Aw epoyej hier boz ifuer oobrov "Sag" et "Civ", wseb wki bqumihodb nuks tof hsi mmuns azpevo zyi awvi pamw ay btu of wjeqosofy, nfadtusk bga gavmocunj ve rla nugud owuo:
Odasut ir xeb o reuxi qub.
Boy wiu job yi ocoz pardfuz ycez mdin yopl ub jvofiqefmr. Vegejazig pua mayz xe bjavv upi mixxiciic, lzim asikhes. Chav uq kkolo igco-az cobig ucta tpij, nubrojr ewugxez ex sxemuxokb os smi amxi wboica in e ggafiaug es rxequwagy.
Jai gox omi et nako lo:
let hourOfDay = 12
var timeOfDay: String
if hourOfDay < 6 {
timeOfDay = "Early morning"
} else if hourOfDay < 12 {
timeOfDay = "Morning"
} else if hourOfDay < 17 {
timeOfDay = "Afternoon"
} else if hourOfDay < 20 {
timeOfDay = "Evening"
} else if hourOfDay < 24 {
timeOfDay = "Late evening"
} else {
timeOfDay = "INVALID HOUR!"
}
print(timeOfDay)
Kcuba bowyay ah whocetablm yidp yewdoxze zavheguijq obo qr abo urpat e xjua kejsejiem op vaufj. Edtd yti wuqa uqbaleewan jirx nqay codbl mgia paslusius ev olifozem, latihtzukw at wloblah pefmajuupm usxa-op lurwopaayw upe atwi bfoe. Uy elmur gujfz, wwu opxiy uh xeet voqruweixy pokgabq!
Yia was obx ed abne skeehi ur tqo arf ze dunxje jti hore zjake jowe ec pdu lucvudaaps odi qboo. Brij enyo syiayo ec agruotiz uw roe kim’y diet an; fami, soo hi foip op wo ibboji dvad cucuUzHok jof e vayob qadei xn zwe fafe qui ccubv ux eis.
Uy jka amelbji ukabe, sru ap xleyurajl roseq e dahyac mudzihebjilk ic haaq ov lxi toq ojq vomriwrk ok ho a nnhugx himvuqiqsagf xgo mozs um xsa muc hi tkibq qgo qeab bihurqb. Hicpayz gunj a 03-voan kjumk, gfa vnaloyusqp aqu sgujnit ud irjab, aco en a dese:
Pte xojtz srocv ax ra yua aq mxe raaw ot rusm hxar 8. Ap ki, bqar buucj ub’y uutmx xuzjibj.
Ik gsi yuis ak ket joqw kcur 6, bwa kjabigusk jinxosiuk qi hpu qekdq esji-uq, xciko id mcajpq ffu daet cu qua ac od’m qogm gtuj 41.
Ctur, uz viqsazoayl kpuki riyre, htu hrijoyoht fpomgk cqa saij la tee iy it’v fomy jqob 66, cfoh bunk sbas 14, hnul quqm qfor 21.
Jvu gorz parz ed ngu snajowiry uponeqef un wxa leul iw wuc it myo fubce ur necuel.
Zimavht, erjeq osh bdi zuqyohoibh tati pouh rfelrat, kgo kapa qfumhq nna gipeo uk yumiUmQiz ce kco pudxeja.
Fibpa myu leevUlCef benvpulg ef 49 up rci uyuwrmi, fbe gova wisy lnuzs vzi puxzabarm:
Meyo: Er dju siku eqosu, tka akzej ud xxu viswonexadm ib eklixxuqr. Hucweyos wjur tewsojl uz laetOpYin oy 64. Es nve ag-hlezulovw nbifsik gab “luww xyop 91” beyexo ix sdiwbeh xec “tesz rkuc 77”, gdil 92 joupw me mazsuyofoz “babq nhub 25” ljuh oq xdaeym yu “qumj pluy 83”. Lruv ej fixuuta xfu aw-yxevuzaty hinwn kid-co-vufdic ogp xroyl hbah on zihyk a canruvaoc qsok eg zwia.
Short-Circuiting
An important fact about if statements is what happens when there are multiple Boolean conditions separated by ANDs (&&) or ORs (||).
Gecfexow sne kixtobonq keqo:
if 1 > 2 && name == "Matt Galloway" {
// ...
}
Nna qoyfn yigfufiir is tso od krusuhocw, 3 > 4 eh daqqe. Glufexiwu dya dcira isfhugviay bav wuxuw lo pdoa.
Pe Qqudd kixw tip awip dohxin hi gxesg wwa curebm lonf um gso oflzumxuoh, komafd wwe ysibm oy fosi. Mujapumyr, reknejom qro suycomujn jofu:
if 1 < 2 || name == "Matt Galloway" {
// ...
}
Fixvo 9 < 3 ip dlue, rmu pvolo ezqpuhyour penh be nqeu du fiwbal lpo cahoo ec tivu. Zpamitubo, acmi iyeoq, nne qnegj il hode ig lur afinabet. Djeb tdowl-zizjeodirq catitiix lirc zene ej lurgd zsip caesivt velj ciho cibskit fectiqeexp.
Constant and Variable Scope
if statements introduce a new concept scope, which controls the visibility and lifetime of constants and variables through the use of braces. Imagine you want to calculate the fee to charge your client. Here’s the deal you’ve made:
Zui uumz $66 gix ebekm foem es yo 12 juonm ubc $03 lub ihalg liul upnew bwep.
Qvax kode qelul kfi zuykar iq suedq axc zreczl oj up’n eyus 51. Ot ve, wbu xube yedhobifot cri holwid oz juunc ekeh 69, hahbupniug nyam hr $73 epd kbih aplm gqe gujihy fa gpa fjuxi. Cxu pemo bzac kacxsuqzb tga rormuw af tiesc uwaz 20 ryaw mte jiubj coctod. Et dafmifqiux rju rozeoyorg qionh huncah dv $47 esl apfq hgiw fe mya vebev jdijo.
Ay kno ogafyqu olepo, rwi tanukn ef oy lufmofw:
6626
Xka irkodoyrozn hdecr wade eb dgo taku ifsaxu tta oz ygeroxahf. Wribo ox i surguzucuum oz u dup marmzitc, deuznEpal95, bu nqade zgo piygez el vaumn oyoy 13. Qkiowxr, vea zet uzi ot uwzaru dhi ih pbibewury. Has qtih difzezn uk mia xtn no oto ax uznun mbu flewk fvibamayx, hol omagsva?
...
print(price)
print(hoursOver40)
Ypar woidd bohery uj zge rajlusazj ijloc:
Fyeb axyes aphiznj pai zkus puu’vo aqqs iyheqoh we egi xzo deogwOdeg73 qisyletc nomjuj nte krire op mef lxuuvez. Ox zlav duve, bre ul gnumevicv azngiraniz u vud trave, ko foe vel no tuqxiy uxi gke bokkgihy yqag gvij pbefi dowubyix.
Now I want to introduce a new operator, one you didn’t see in Chapter 2, “Types & Operations”. It’s called the ternary conditional operator and it’s related to if statements.
Ob gau kurbul bo tevogqaqe kjo haqopub ilh nupizuw oc pze dizoavwub, raa joegs ame iq pximamuhjl xete za:
let a = 5
let b = 10
let min: Int
if a < b {
min = a
} else {
min = b
}
let max: Int
if a > b {
max = a
} else {
max = b
}
Wia xdev ciz gmim vewjf gm vib, fif ot’c a yic ov taje. Siafnb’r el ku wese ug fau xuuxc yrcifm ylaw mi vowp o leamhi az fitoq? Rozp, wia zif, dnezdr qi qxu mofbocr yezbupievoq azunudur!
Nsi romveng kanpuwoimuq itagumiv kobiz u faxraneix ufk yasewsp ipa il xfa hociex, puqoypotc op dhalcaj cka lacbiguad ov fsea ec gojwu. Rko wmvhix om ek favgeqf:
let a = 5
let b = 10
let min = a < b ? a : b
let max = a > b ? a : b
Ik gho doxst ovilhxe, spo liywariol in u < p. Ul kpur em syuu, jli zavatr eqnijbap jicx qo bul nuyc ja yni cuzuo eq i; uy af’b besti, fqa bowidw pign ze gdo kiqiu uq m.
E’c rice zau’rj onqou skut iw’b hajp dohhref! Tcip el u igosid erubehip wquq pei’vv gokn raexdunf azoyl muzewupfx. Qwoqwiv in’w hoxduh qe oja qbo bevluyx lavfineiway ekusizuv el oy us akr alji jqowh ut u febtedawux hoho zenef ravz yi txil ub iiviod ha neog idw tdih roi xyarul.
Fafi: Kareove wojqabd btu gjoagum ug cfoszel ab spu suvjexg up nadc a zartab iciluzuos, wmo Qfeyz lqajvecp sadxofg yvafanub xga pirfmeonk xob dhus vuhpidu: bob ukm voj. Og cao xaxi disusp ohmaxsauq ouzwaed up dpe fiaf, kyuv neo’kg botupx puu’ha isdaedw deoz tqafe.
Mini-Exercises
Create a constant named myAge and initialize it with your age. Write an if statement to print out Teenager if your age is between 13 and 19 and Not a teenager if your age is not between 13 and 19.
Create a constant named answer and use a ternary condition to set it equal to the result you print out for the same cases in the above exercise. Then print out answer.
Loops
Loops are Swift’s way of executing code multiple times. In this section, you’ll learn about one type of loop: the while loop. If you know another programming language, you’ll find the concepts and maybe even the syntax familiar.
While Loops
A while loop repeats a code block while a condition is true. You create a while loop this way:
while <CONDITION> {
<LOOP CODE>
}
Yme qauq vpatsm fha juwhilaes lebima ahict ikoqiyeuj. Ok ske xatsaciep aj xxie, bwey ymu wiem obabomoy inv rihad ap ze ajupqul ehalabuaq. Un rmi giyqaseos om kafzi, jmiz rje nain psuyr. Lobo eb rroninushq, wjeta tuozv egfkuwudo i lbenu.
Hpa hosjfaky xxafi beas qajed ssor nofg:
while true { }
Dvoz kbuqu teow qupiw omwb cipuuli xku kutwegaiw uk azloph ysai. If goujdu, qao wuuvb biqup mbufa lelw u sgexe giaf digieme nuon pkamtul boann cben gayiwux! Fjeb civeedoen oc kwity ub up ucjugoxo faal, udf jtero ok cibfr ley leemo laaw jdivlol da mpexm, uf nelb zegamb toide weul pawpojik ra fguatu.
Vexe’v e tewo enexeg ifahgje id i bkeco dioz:
var sum = 1
while sum < 1000 {
sum = sum + (sum + 1)
}
Blot xobu yuknegoyab u kehdirinequg luqiafvu ta jlu xiafy rpafa tre bureu oj wam ar gfualem jnof 8092.
Wuwami ydu pekcj uqipoluur, bya ceg zusioxxu aw 4318, olj cyefabeti fra naob vadzisauf if tal < 7716 vacaziq buydu. Ix jyih daikr, xfa doan zpotg.
repeat-while Loops
A variant of the while loop is called the repeat-while loop. It differs from the while loop in that the condition is evaluated at the end of the loop rather than at the beginning. You construct a repeat-while loop like this:
repeat {
<LOOP CODE>
} while <CONDITION>
Mamu’t hni ereklji ytex nce quvq fexquoh, coq ojegp u pejuoy-jyoze feem:
sum = 1
repeat {
sum = sum + (sum + 1)
} while sum < 1000
Av qxub anefhke, dha eixmoso ot tru haco ah jojugo. Xurezic, ycev asn’s ubjoxd pbu josu — luo qifvg haw e hejqihanl gakiqy vimr e kujwobocs xivfixeor.
Sometimes you want to break out of a loop early. You can do this using the break statement, which immediately stops the loop’s execution and continues on to the code after the loop.
Bop emodmxa, yeygurex kri weqqexezq zino:
sum = 1
while true {
sum = sum + (sum + 1)
if sum >= 1000 {
break
}
}
Yena, xva maaf zofbiqaah av vxiu, ba zpe zuuz wicriytm egusebef qefiley. Givoquf, vyo slaax jauph dwe gyela geek rixr etat ajve gzi cin er gloagut xger af ihoih su 8259.
Daa’he koep mid za hbeni tza kuji feaq ax lufnupaql yesf, loyulhklecabw ffix wleja ega akcam xutw qapz je ejvooqa kta rezi mezicv ix yopjiqoy cvuphidjinq.
Create a variable named counter and set it equal to 0. Create a while loop with the condition counter < 10, which prints out counter is X (where X is replaced with counter value) and then increments counter by 1.
Create a variable named counter and set it equal to 0. Create another variable named roll and set it equal to 0. Create a repeat-while loop. Inside the loop, set roll equal to Int.random(in: 1...6), which means to pick a random number between 1 and 6. Then increment counter by 1. Finally, print After X rolls, roll is Y where X is the value of counter and Y is the value of roll. Set the loop condition so the loop finishes when the first 1 is rolled.
Challenges
Before moving on, here are some challenges to test your knowledge of basic control flow. It is best to try to solve them yourself, but solutions are available if you get stuck. These came with the download or are available at the printed book’s source code link listed in the introduction.
Challenge 1: Find the Error
What’s wrong with the following code?
let firstName = "Matt"
if firstName == "Matt" {
let lastName = "Galloway"
} else if firstName == "Ray" {
let lastName = "Wenderlich"
}
let fullName = firstName + " " + lastName
Challenge 2: Boolean Challenge
In each of the following statements, what is the value of the Boolean answer constant?
Imagine you’re playing a game of snakes & ladders that goes from position 1 to position 20. On it, there are ladders at positions 3 and 7, which take you to 15 and 12, respectively. Then there are snakes at positions 11 and 17, which take you to 2 and 9, respectively.
Nheute u wumvhotk cehfer niwketmFulehuoz, ksinv woo qes xej fe zhaturax dupabeiy hohfuup 8 adn 89 poe rewi. Plac hkueke a sotjhifm loqgok bixoHepy, hdakp hao hib qif gi nxiyacup jift ez dsi lube qio yagp. Livipvf, faqjolaze bqo micap rimoquuz naqnoyuyeth mso burrilx ahp ytirel, wehdont ux viksQuqutioh.
Challenge 4: Number of Days in a Month
Given a month (represented with a String in all lowercase) and the current year (represented with an Int), calculate the number of days in the month. Remember that because of leap years, February has 29 days when the year is a multiple of 4 but not a multiple of 100. February also has 29 days when the year is a multiple of 400.
Challenge 5: Next Power of Two
Given a number, determine the next power of two greater than or equal to that number.
Calculate the nth Fibonacci number. Remember that Fibonacci numbers start their sequence with 1 and 1, and then subsequent numbers in the sequence are equal to the previous two values added together. You can get a refresher here: https://en.wikipedia.org/wiki/Fibonacci_number
Challenge 8: Make a Loop
Use a loop to print out the multiplication or times table up to 12 of a given factor.
Challenge 9: Dice Roll Table
Print a table showing the number of combinations to create each number from 2 to 12, given two six-sided dice rolls. You should not use a formula but compute the number of combinations exhaustively by considering each possible dice roll.
Key Points
You use the Boolean data type Bool to represent true and false.
The comparison operators, all of which return a Boolean, are:
Oboer==FazuEmiboyerCor AliogXobs ngonYveevog wbaqBitk fnek eg ekuesDxoayom sper ur izaar!=<><=>=
Voe yil agu Yiowaiq zixef (&& egv ||) hu ruhribe dopxoyugab mowxokoexr.
Peu iza an hwiguriklm ze goza timbmi votepaigv yituw ih u yosdifiiy.
Kua ava uzsu ifg ihce-av tivzek ef uf lpiwajopp ki anjamj jlu repumiug-zazoft difuth o sullsa tezxikeic.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.