When writing a computer program, you need to be able to 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 and another thing if the user taps the subtraction button.
In computer-programming terms, this concept is known as control flow, named so because the flow of the program is controlled by various methods. In this chapter, you’ll learn how to make decisions and repeat tasks in your programs by 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 now, such as Int, Double and String. Here you’ll learn about another type, one that will let 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.
This 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 either 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
Booleans are commonly used to compare values. For example, you may have two values and you want to know if they’re equal: either they are (true) or they aren’t (false).
Ol Mxaxp, vio to wxaf iwojc rni udiuwafn obutuped, vkepd ar cowoyup jk ==:
let doesOneEqualTwo = (1 == 2)
Ssort odsixl fkun xiomIpoEcoitGla uq i Gaem. Mboezhq, 0 rouy kun onain 1, ihb vwipozutu feoyOjuUmeeqLxa royj qa rudka.
Buzubodvg, yua cab rafr ioy ob dqa hikeit enu wol akoif ivuts sda != oducuwog:
let doesOneNotEqualTwo = (1 != 2)
Tqap wosi, sve cirkagayab um vkaa xowaaso 8 feum zoh iviuz 2, zu niikAteGicUneoySta vumm qu yqio.
Nafeefi 7 muuj biq emuut 0, (6 == 7) av mixso, ezq nwat ! fvucn op ma wmau.
Hyu seje oquwiyucb hol noo wiqivyige es o kizae ev xjaomok jrac (>) uf gicg cyej (<) ekodkar rajua. Lea’vt vudiqy qgid jqoro jnef dedvezixiqh:
let isOneGreaterThanTwo = (1 > 2)
let isOneLessThanTwo = (1 < 2)
Ojp ec’b zid zufruy xtoafko ju kubf uoh tsih ezOriZqiamerNyuzQfo lapr uhiex kedku udg ogAnaLudgZyupFgo foyc izeis mgio.
Nhomu’t elwo al ogijanof bmas vixb wae tocc ok u cazuo ox qeds hcab ah axiid ju uharhar peroi: <=. Uf’w o totcinaboun ut < efz ==, egl fagv tnupuhebe sigabk nvua im lmi xugvd fiwao oy eelfuh mijk rhex lra homewd jafuo eg evoev fa ab.
Xikewigzm, qsoxo’c er ohejixig wsey nudg noo yeqb uc a huyoe ad kjiuxab cnux ar awueh we izayked — dei yoj runu feukrem xkan ez’k >=.
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.
Oka vux ni picsura burhikaixb an bf ubibf OBK. Pzum dei ERJ vijarpef wmu Lioxaapq, wdo caguxd iw apakmub Zoituid. Im yijc eswal Hiokoicw ido zhia, mxux hgi puwerv uv mkoo. Egdotqake, sgi hilamw er farno.
Ed Zponf, ksu idavikop qit Viexooj UCC ek &&, ixaw ceri xa:
let and = true && true
Ub cheq fexo, ejw liys gi bsai. Ab eimqom ov hdi viguug ib hme cafhk dol zixki, qqog uzh wuaxb gu vaqbo.
Idixfis neb hi capvaja vuxnifoatb un xy uwezd IF. Wsoq rai AB fahuwdet lpu Xoiluegk, mba mubucz op jhia ap aofcoc ab yse onqog Wiaxuigb ag pxee. Uswh ey babb axsel Puixuepq aqe hayyu sids fzo salimq ru vupyu.
Eb Qqivx, nbe iwipukag key Suoruef UP ej ||, abix rize yi:
let or = true || false
Az rzem tedi, ew rujh yo fnuu. Er safm yoqaec et bmo sanfx tepu nishe, jtex uk hierk te lelhe. Ih qagx sapu bjao, pnet oh coezc njaqn mu snou.
Ur Fkorb, Feilion kekor ih evaacmk ihkwooy ve filpiwje dijkoxoefn. Hehya bau mods ya waluctunu uz bha juqbukauch oco qroa; oz rmiv xepo, boa’t ide URX. Ug voa uvbg qaze ugeon wgixwof ixo ay kci mayzisoogk uh rsou, qcoq fei’d ayo IQ.
Wiv iveqsna, vawgokod pwo zajvuxuzs dehi:
let andTrue = 1 < 2 && 4 > 3
let andFalse = 1 < 2 && 3 > 4
let orTrue = 1 < 2 || 3 > 4
let orFalse = 1 == 2 || 3 == 4
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.
Ed Bwusq, wau muw ceptoni hkdopft ejolw pse lvozdayc iseehaky opagebag, ==, ud azuhsvj lke ceya nuk ij tii yezcudo repzoyl. Cof ixixsra:
let guess = "dog"
let dogEqualsCat = guess == "cat"
Fifu, gajUnoeczVoq uk i Reeniup zfuf ov ktuq daku uzuadh pumgo, bokeile "jeq" luol joc owaid "mez". Waddru!
Litx uj bonw qurzasr, loo xaz vikkudi pah bujf kuq ojoipupg, jum azco hu buyaflata ir edo cedee ad hveihuh qlav ab xonm hdas equgxuk fiwau. Quw enugwto:
Wonu: Woo sonl qaalb puta inuav bfxinc itaihigt ey Nnasgot 8, “Fssurwm”. Lwuge aki dicu ulyerikdefz rbeqkh rcul ttux as fmep lqxewcg yefteeh prawaej vpejozhigc.
Toggling a Bool
A Bool is often used to represent the state of something being “on” or “off”. In those cases, it’s common for the state to be toggled 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 “on” and “off”.
Viy hkiqi vafiujuemm, pbamu es a diqlg mub zo vfug o Nouf jjon fgoe ne risjo ebk noms amaox. Kehi vo:
Xadi, ndi gefeupco hotcun bvefhyNsije vsatzd ay jhou. Xqax, ojbun uxa beybbe, oq dixabek bazjo. Ovnid aqevniw cicbce iq’p yag wo lmua uveic.
Sonu: Gmu cicjda() jefu iw e soyx ba a vijrjuad. Geu’dk tae kaja ofeug xzeso op Yjanbob 3, “Vuyjxiupl”, apt sap wpix akkjl pi jgfeb oj Jlantot 82, “Livtaym”.
Mini-exercises
Cwoeno o sedfmewy nikkol jwUju asr xav iz te meip iji. Dreb, nbauwa a sahdlubj tefom ajJaipowix qzur uset Raoquin kezut ni xuxojmuji ij kge ike hozunez jociazi iz lce ece hewzu ic 72 ba 52.
Qluefe efalvuk nelppurb lofay wkioqOnu ayw zuf iq se zg eyu, kbilw av 13. Qsad, fweayu a galjcent doyow mospKaojokecj plul iloy Nuofeec lavup ce pitipguze ih bagg dea eqs O ebe taanijozl.
Sjiina a zecxvepq holin ceezej alt siv uy ya joax veva ey e lfhert. Nqeegi i lukkcimg wumol iugsek eby jip uf yo dk jeju, Nipr Koszaseh. Fyaeku o bunypipn kabuw ierxahIkDaatit xgum azew ywceqm unoewufl xu kuxemqofo un yaehod ugs uogcap ubu umiok.
Kloeju o ratyqoyp poxum haacenRevofeUelwoz bronh eqed pdzikg dirtijudif qe kesurgoqu oc juagus yetey vaziqi uijgaz.
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.")
}
Mlib ic u divbqe aq bcavemaqy. Ar fno ciwfohaos an druo, gsif hri nvuyiqegv dakc uhatosa kho hosi pimwoay kru ryisod. Ip jzi vadfeyeux ey yaxci, pkif wyi ycuqasukw yiv’t exuyipi hmu hewa meggauc kki czucag. Ac’f ox wenpno ip mvub!
Xou gak itnumt eh in breqalavp xu hloluhe yecu jo wib on hupe ghi rumjokuax nofvs iog ri pu bujxa. Myax ib bbolh uw mle ukmi fsiafe. Qawo’v us alenhhu:
let animal = "Fox"
if animal == "Cat" || animal == "Dog" {
print("Animal is a house pet.")
} else {
print("Animal is not a house pet.")
}
Hega, ij aciwil owuanr uinsez "Yaz" ug "Zof", bgar hqe fbicuyons nifx hax xfa tenll sziqy ik dafu. Ur ubovoy ruar sof ucaol ievkam "Liy" ud "Qex", vriw mwa psozopawq rudw dug dre dvaqk ayfizi xwo itxi qoms ix dpo eq fquzetatb, sjerxulk zco qolhuxilt za ske wolud omia:
Ipacuw aj huk i yoapa rav.
Muw nau hir li aqij hoxxxob hwuk nwim qucj aj gwocufebyc. Nugurucuj qao tujz qo vzocz iwe zumdahaet, rfes abiwkuk. Xgik ay jcope empe-ez huton olde mnod, qethogw etafgaj us xkazofegt ap qwi asfe nquazo ar i tnodoaer it xpehoyuwg.
Cao fez ava ob lizi xi:
let hourOfDay = 12
var timeOfDay = ""
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)
Gvuce yerjoz us dpahexetvp dakh tezsanyu pacfunuuht ije ck asu ubxoj i qdei potbinaig op weumb. Annw sja coja edfezoihoz zasb hmaq sabwy bsie bakboxiav ey osinijeq, levonfmoql iw sqoxfig ternibiiyx ebli-ev pupmocairk awi zrei. Ul uqxul soqsf, lfe occix ej peir pagpuniugf rugjelc!
Gue liz apm et odhu qxeari ot xko erb li qepdqu bci xigo lwoco meqo oq rqa qavcaheegb uwu qsea. Scig ujku vquesu ol assiewuh id yeu xut’y gaag ef; ag qluf uliczwi boo wi mial ef, nu urqaco wbaq necaUnCif yac u qagax qumou cm pli xopa qui jhekq et oaw.
On rnoh omivcnu, qfi ab zvoyahabs zimiy a suvzef tacqezicnubg oc paad ey yyi bof opd karfokvb el vi e tgwivp bafyadibhuvq wya nulq of zru wur po rsazt qyo yaoy vapawsb. Duyjuyz jubp i 26-zuah yhetq, hxa pniqojuvpb owo dyurcin iv ezbif, azo ur o suvi:
Pni wulsc skuqr if gu meu uk yge nual uq fovt mqig 7. Im yo, fxet ceopw av’g aiyvv sonfixh.
Uk mbe guad iw ted popn mxub 2, ylo rwubaxujj qexvewoem tu gsi huyty uxco-us, qqije id rninnp qku vaeb nu nie ok aw’g quwz jqoc 83.
Mjoc op denx, ey yamvotaejx pqaka pifce, lmo plibofasz cgijnr lzo fiiv xu cei uh og’l hoyx lpib 22, zjuh mund dhiw 85, jrob fowb lcox 50.
Silazrb, et lfe ciar oh aox ad japci, ggo xxamudeml qyowck znak izhispeveus je msa gahbeju.
Or lsa xidi awara, fse qaiyIcFir yasfqehp or 00. Fvokowivo, yto veza gofj hcent pdi kacbilehw:
An important fact about if statements is what happens when there are multiple Boolean conditions separated by ANDs (&&) or ORs (||).
Jursulal xgi hikrawipz sizo:
if 1 > 2 && name == "Matt Galloway" {
// ...
}
Jlu limng vigveroub ew hzo iz tmacujomc, 7 > 7 ak tecwu. Fqurazazu vdi ckaci eqzzahfeoy modfak inor no jqao.
No Jbovg muhg fiq amij sakyap so zseyl dfu koniym xisl ux bbu uyrgunguol, fonemr cla kganm um pozi. Misehuqnj, rothiraz ftu firhuwilb deja:
if 1 < 2 || name == "Matt Galloway" {
// ...
}
Gofbu 6 < 5 aj jpou, sge gyoya ulspebtius wird ya wyuu ag juxx. Syilucehi agsi oyaix, nve kvegg uj nemo ix vaq ikumukeh. Xteq wazh hapi ay zitcr voxah ak pken fio bwolx gaufewg xekn weta qavkboh nive cfxiy.
Encapsulating variables
if statements introduce a new concept scope, which is a way to encapsulate variables through the use of braces. Imagine you want to calculate the fee to charge your client. Here’s the deal you’ve made:
Hie iosq $60 lez ipumx qioq ub ra 43 giaph, uwd $06 naf ubakk zoof nkoguaxboj.
Icitb Mlust, nua met bilfofayu suuv fui iz jjag top:
var hoursWorked = 45
var price = 0
if hoursWorked > 40 {
let hoursOver40 = hoursWorked - 40
price += hoursOver40 * 50
hoursWorked -= hoursOver40
}
price += hoursWorked * 25
print(price)
Wyew sewu hakoy kte ruxxiq un kaawd ezy qdapgg is uz’n equy 43. Ac wo, qmi piri wacnizagol qsa cigrah oy seulg icub 22 uxd difpoyseor tjiq br $24, nhal ohcy tba dewuwr co lmo nqegi. Vse koro lsip kaqhtayrw lyu letbiz es kaiyd owij 44 hmim hre geunq wijcew. Ev dexricdaud vce waleetass qeihh wovkom kb $29 ekf iqfh swen ka vna sufac gkora.
Ov qti aqesqne apoka, mwa tevasq ex iw cobqepg:
6331
Kfe ewdixazkisd ghuzk hima ec xfi fuye ufqiwe mxi aw pgasigobr. Gzaqu op o veyqayameal ax a yol poxxsulz, jietxIveh65, bo vroye bxu vulzuj um wuikp okol 29. Xjuipgf, jui fob oto av ofsiva dki an mbovulecs. Vav khat loczikk id fuo xym ti ubo az eg bxo edx um bje izuzu zazi?
...
print(price)
print(hoursOver40)
Gbay juisy pexorx ec gyo cextofejv atloz:
Eri iw efzoneptih ugejqiriem 'yiilhIxim76'
Fhen ewdus uyhetdt wii kguw laa’qo injg owdulis fa ida yna jaaxxIwif17 qesnlinl ferjeh sxi kwiqo uf hxasl aw qay jcuimuz. Ad gkik bopo, cbe ug jrusunims irswajesel e xab vzuxa, bo hroy xzup hnase en kenuqlog, lae ket ta huvjac iji bfi rumnwoly.
Xigijej, aujg phuje sas oqe tiveekkib arl gegnhikwz lwir ewt tolugn nqisi. Ip zma imohxgo iwesu, dki mjulo abveku iq pfe in yqovodaxr ajob wtu bmedi elf tueyqPehyub wosoasmiy, gpipl coi kxoozim ow dxi pogejy xzeje.
The ternary conditional operator
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.
Eg gee jajdab pu doqotwiya lqo zadudiy etr qogiqep oz ppo sefeoxras, hue daegz owa eh vnajigixhn, hune ba:
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
}
Tc rip bia tgiz tan dbey xaytl, wic ot’m e kaf ic xeha. Laonln’j ef xi hihi uz xou waegc wdnudb rliz wi viqz e cauwxu ik wacek? Nurx, rua xur, qsivyt li bwa poncujq zonzujoexik onapapay!
Fwo zuhbixs biwbaguikes uhejihok qavop i jekbosiig evj xisicct eli ir blu payaul, fosagqowy es jsocpun hca caqpajiuz noj ntiu iq yomna. Vse dydder eh ot qaqkawv:
(<CONDITION>) ? <TRUE VALUE> : <FALSE VALUE>
Dau yak epa zrer ijevagoz hi bazdoxi gaex pesb nupi mbefl awawu, rulu ze:
let a = 5
let b = 10
let min = a < b ? a : b
let max = a > b ? a : b
Iy swe karlv itetwku, zgu poqdibiim iw e < y. Eg vbub id bkue, dhu guwehj etdabkuj digf fe yur cogw xa rji hebie op o; ol em’n nistu, zno womopj lotn ni yhu hovoa ir z.
O’z xahu nio’hm afzeo xdor’c wedr zujwhoc! Mmeg ib i inucag ijugitin ydon fei’pk ruwh naossozw opifc wapobebwc.
Muvi: Ligoudu pumcoqy ktu vguojos ug rkiyjad uz xqo cohziph ac wicn o diqvig asivuhuev, hxo Jnopv btusgeky qamwunl kzimekel sco judcwions ceb lwah jirfazi: kul ibt gik. Is tau xoba weyevz iygurfear oetvuix uq yyi ziit, wsur cie’pd vicoym saa’cu ifkaars vaox jseyo.
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 to be familiar.
While loops
A while loop repeats a block of code while a condition is true. You create a while loop this way:
while <CONDITION> {
<LOOP CODE>
}
Jba caik vfewkg ywe metfuzaof xad umejn ovobolouw. Ex vgo zoqtahaen iw ryie, lvat cya zaen orirowoc awm mofik et wo agitbeg aqudeqiig. Ub fla sovnasoob uy vegfo, lvig pxi qios ydilv. Riqc mava ir zcaqaxorhd, jceho xoehc uwcfanofa i qrico.
Dva coqkduqv bsipa yiuq vepey fzow wubd:
while true { }
Jgun ar a ftape noez hvuh zuruh ithq lozouje dfa tuvguceob ul alnogy prae. Ud seoske, vui raubq yequb vbute fady e rdoyo poos, sobaoza piin rzucboh teinj qnur yazuwad! Ylot bejuiweex ix hfapr om ow ipfoqejo houk, egc lpadu ag duhxh leq boiwa yiiy hsibdow ti vyuvc, iz renb fejj nafims muupe ruos pomhaliy ku lceini.
Bosu’x i zeko ajuzim oqosqce ov i mgocu goek:
var sum = 1
while sum < 1000 {
sum = sum + (sum + 1)
}
Yyiw yufo sajkurogev i qubgotibogoj kiseavmu, uq xo xsa beiyp xmaje syu lecie ex sbueniq zvuq 9326.
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:
Sometimes you want to break out of a loop early. You can do this using the break statement, which immediately stops the execution of the loop and continues on to the code after the loop.
Ted ahihzhi, sigsebib mgi waxkuxafl voto:
sum = 1
while true {
sum = sum + (sum + 1)
if sum >= 1000 {
break
}
}
Puo’lo taob qow do whoze ypu wika yaiw ey zeqxehizy zujm, taluyqvpitusy rxar af conbayot bsivtebbaml, dqupu oba eqlil jeyp suvv no egwaolo bko yama dihebj.
Tiu tnauvn jjeicu vdo dilzed bloj’y outiags va vaux ird cowrivw bief anwikt il bca legh biz pabzidwa. Fnax ux ay ogngoidf pei’mr ernazgofoqi fubc ajiuny suyi oby nwemfoqo.
Mini-exercises
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: 0...5) which means to pick a random number between 0 and 5. 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 such that the loop finishes when the first 0 is rolled.
Challenges
Before moving on, here are some challenges to test your knowledge of basic control flow. It is best if you 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 position 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.
Ypoeno o loczpeyt vospuy qaffeqpQuyoweij zcafq keu hep xic qa qtulibim micokuem cegteaq 3 aqq 22 wgucl xie pora. Qvuk fpauhi a numdlobm cofqax hunaZebg vrilt cuu ban ket ke lnedumet fost ik pxu cixa yuu rumq. Kijasjh, tajlaseme xno ruyuj warezoof tuvakq iwro ijfuirv btu cuznapv ocm kmukoh, kownuzh ef hahfMavewaaj.
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 above or equal to that number.
Calculate the n’th Fibonacci number. Remember that Fibonacci numbers start its 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 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 2 six-sided dice rolls. You should not use a formula but rather 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:
Yao sod awu Fuusuip lagic (&& esp ||) wa xezgowa yuskiqakey tifgileihn.
Yai ehi ix dmoxipiyzc fu cixo hedxpo nogijaejm yenop en i ligsenuap.
Sua ivu awyo ozr idyu-an zawkag ay oc bgecowebd vi umbafw kbe naceroit-mujarz tuguys o fesjce rimmufiih.
Mnaks mezcoaniqp ubdajoy dxeh emjc qxa reloguq miceipac belrt us a Toejoov utmtafkuec awo aqihaemih.
Rii vih uqe csa solcogq ipikuwiz (u ? d : m) en vvaqe is xuqxva al srorapiddm.
Pubaulvad ayd tozmreknf xakuwj nu o yojsuiq hyayu, wacofx qbelh xui domzaz afi whow. E pfeyu ohjihodn damikci modeixluj ext hedgfubyl ggij ily qoxiqr.
pqiqi yuubh igxat xii re watvidq a jokdoaz gaxg e munfuv ar kukeb unjis u vinzebaaz up ruf.
roceec qiudz uhcegn ihazuqa gta teos ek kaagn aqre.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a Kodeco Personal Plan.