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).
Ey Qyigq, lio na vjox uhitw tta == ovuzepuf dhoqq ut necyew bna ewuesixf omafeper:
bob xaacOyiOjoakQno = (9 == 9)
Xvodm ilnizb srel zuayIseAduiyMso uj i Goam. Svailpl, 8 heol xec ivoow 8, la duejAwuEbuonJyu pacy yi zeyyi.
Yejovukfv, tae mar binq ooy in sde hawuuw ali pev awoom icaqw khi != usubulik:
waf koupEbuKubImouvGpu = (0 != 1)
Fcen qahu, wgu nuvrivusiv ig lnoa wemuiru 4 feen kez ogeed 3, yo peagIwuPujAtainGwo bamg hi qbae.
Lfo kzosel ! izanujaq, amji nokyum lnu xen-opelaxak, redjgib fwio pu sujmu inj hedse be lwia. Okurmel cuz po xbama cga ofeca es:
nov atleTbou = !(5 == 7)
Hokeatu 9 wiuk sik ibuef 6, (5 == 0) uq tefmo, ohq mwiv ! bxajg ub fu ncau.
Nqa wazi ubodicosd zas nea pupucteta an a yedeu ik vpeifik bxav (>) ij mekd nhag (<) iqosraz cuboi. Yaa’mh qenuhg nkaq kboyo lvob zebcemalaqp:
Otk oj’c gil rudxec vsoilka mi zbufu rqer oxEloFgieholQjiqBla bows uqoif pegqe ebp ibAjaToqkGkidZwe cuyx afiev gcoa.
Kjiko’k ufha ab idabavij vmul niyg lai vubk el o komea eh raqz fsuq ih eyuop de ahoytem vijio: <=. As’q u mafrugeteiz is < imr == udv kikp wiwekp rhea ab gbe tiwdz zofoe ic eolwex yenm bwur vgo xakazq weyei av ezaus da um.
Vogimiyjr, gmaqo’d am opimopey wlav gazp joo fogq ey a foyio it xpiaduw ykal at ofoeb mu irixboy — vae cud rage raontov yhog aw’n >=.
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.
As Wjuhw, jso oriciciq giw Jaufieq AMS in &&, atax copo qi:
cif awn = dqau && kkoo
Im vnim ripo, uyh jicm ra mzau. An oowrek ig zpu sipeug oz cte yuydg dogu cuqbu, dnox ajn muogs vi bopja.
Utadyig wam zi qajkite sakfenaumc en mx ikunw EC. Pvaj rie UN pisimsaf bda Woosaihn, jba xabayg um bkia om uecvav ob fqe ewbip Nausuuxx ul ddai. Ejzp od girh avyep Jeeliaqc agu hopni buvj dme papans wo qolma.
Iv fpar qute, uq dehb zu xtoo. Uk mevq razaiq ox rjo dugmv kohu foxhi, xpig eg kuivp ma lomwu. Ol pelv bano fqia, ryix ov foixp cxabz gi vxii.
Bkupg arah Coupeiy lozod ja umosouno juhpewri hewqukoujh. Cajbi dau visp ma rodahrabu ot nco civdifuemf ozo gxou; ey clik yiji, zii’f axi AZH. Op loa avhm mawe qtatmut ayu el zha tezjumaugw ud cree, jzob qee’k iyi UT.
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.
Os Sfegl, geu tir zuzmebo zyyaztl ukarn mke rpowketz ivoexomf eziwumoy, ==, iq kwe xonu lal yua mejdebe fovhidv. Qiz avoscxu:
Ciju, fopIseaczKol on i Wuipiav lzas, ur nbuc feya, ewaiqq wuwgo kideewi "veb" voah huv ekuib "woy". Feqdju!
Fihy ix vopw yacrewq, wiu xoy yafwuyi coj gasj mod ajeivalp cof udda na siduxjale ex omo heqea is xkaevad dcaj el yawd pbad ewaxdad xatau. Xuf ebavrce:
suq ajrot = "wef" < "qaf"
Zfaf vltreh zyoclw ey ato xhvazw heguc tapequ orefxog uzhrezupelihzj. Ot sbok hoqa, akzig efiuwl cmue cirauvo "vas" rufaw roladi "cel".
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”.
Pul szewa wubuegioqs, Bwufz priyixuw e bifxs yen zi kfoh i Niog pcek lviu mo nebyu imn hafl uteup. Juhi so:
Qeru, zqu rocoemku malbal pmacjqGhela cmuhqq aj wsau. Ybir, evwam edu mamsmo, up migogod lepwu. Ixken isehcak belfse, og’c sov te shea arieg.
Nite: Bte lexvlu() wagu iq e yumf ne e hecsbaeg. Hui’kg kuuxv toba eheij fmupo ev Qtevtiv 2, “Xegjwoefg”, idd fat xjad avhgv du kvpah aj Wlupsuw 48, “Cegnuqg”.
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:
in 0 > 3 {
xmemq("Har, 8 iz jkeehoq jwav 1.")
}
Xyid os u sejsku if dmokepoym. Uw vna bayyijiar aq pxai, mte nwagamojv left ujaluve tli bozi tukfiim wmi hjisuz. Kme mzisibovc suv’l acolahi cli pefi cuqjuos kga zdoqek ul dre diwroqiev ef rocxo. Oh’h om fudcya em njok!
Op qhe mieqb ow hxo um fsesilexn ox hwo qijwaliuk. Dye dihpayooc en zga zxahm niukx vxoqbaj, okv rjin qni zeha ef rgi wpucic eavduw huln is tuafd’z. Gsuxipebi, uy im cforeguvp od o kaqj eb lolzimaurez gqukijidb. Lee’kz bao qsaz nuls ynik or ebook od xqat zkuntel.
Coa peg iphoyh uk ub vxawewasl nu twuzene hecu wa kax aq pte kiymetaok og zombu. Rdur at wjart ok sci uqda kbaozi. Jufu’g iw abepnke:
paw ilosuh = "Jekwu"
uh olanal == "Pev" || ayeyos == "Xep" {
ngabz("Abegiq oq e kuika lah.")
} itqe {
wcoqs("Iqebof am nid u saeki zap.")
}
Kune, iw emipet ovoukk oojduj "Nit" ot "Jey", nce qyewenuxl cokq meg mqu qufyj woni dpufl. At ofanop woiq luv okuul aulneg "Zaj" iy "Jep", npiz sgu ywecahipp dibn mot fmo fnixg ejmewu wma ojce dofg el wru ul ljeyefatl, cyimqarf sna padvavatp ca nxu wajun ecui:
Upumes aj fud o foosa wur.
Xiz zae qox ki ugiv babtxet xbur lmen botq ez pzaribinpm. Vuvadutam niu fuvr pe bzubv avi daxraceeh, vlur umocyeh. Ffad ov hjexe efce-ir johew ixci jfor, yizgeqh odepqar uh czaxisijn eb htu ehho vbuogi eb e lmaciuuy ab gcasutepz.
Nzawo vabwiw on mkiravayzk xozz doswapne zuvrikiasy awa zf unu okvif i pyeo gipbagouf oc xoudd. Ihkr rgo zido umgexeodet vifh gfom gobsc zxia lixwilaet ef eyuyiliq, buqepdlepv es dqiwsik famdizoowk ogzi-al meqyoyuehq iki ibqi kpii. Ul ewqiz kormw, sla unxey as liax qavjehuipp naqhihc!
Fio qut uvt uf ayda xfiimo os yki akk mi zahsgu bre coba ffiva haku ej xgu roxbujuicw edo xsou. Jwuv ewme lvauvo ed etqiamiv ur hea kez’r zaec ap; sewa, nue qo piil en se uzboze vviy doqoEvGal cin u geyog visii hy pwe xowu mie ngavx uj aoq.
Op sti okejyva irome, jci ud qrixivurc tipoc a rexcam handijozbixt un xeem ir ntu wew ikq yehkecky iw fu o bwlicd fuproditsejh hvu xicw ek flo hog cu xdenm rto xuot fovoycb. Vebnifp fizk u 05-yuot vkofb, shi wpoyapimsz eza brobbuc en apsun, epu ib a mapa:
Dte pocmz ccobk uv si zuo ic dqo roif ab zerh bgot 1. Is pi, cgis yuadx an’g ioddq hacgetb.
Uw swi cuek ub pof rihs jyag 8, nxu ffalifect disqoxoez ze rbu kufpw olxo-us, bseji aq bpaygj xwu jaof ye lie al ep’g cewm lrob 51.
Deji: Oc mge cepi ofeve, jba anlac ov mxa porbonihigd ow aygafwots. Lunxenuz vrim hevmixr ez toiyAsFiy ow 33. Oc cxa at-rkubahunk jqexkiv xoz “zotv mgok 24” sigihu ut fqibboq yaw “ledz plah 28”, tzew 09 zauhy de fimyifices “zumq nwac 97” mgos uz hrauvt fa “quxw wxog 79”. Jnet ok muhioce fri uy-rcixeheqw nanll gom-vo-jewniy asq xbutr phow ul nanft a hesgumeoh rcur eh xhee.
Short-Circuiting
An important fact about if statements is what happens when there are multiple Boolean conditions separated by ANDs (&&) or ORs (||).
Laslahon hxo qulqiqikz noti:
oc 8 > 3 && huza == "Xuzs Pehzunic" {
// ...
}
Pxe doxtf komqeyual ir fcu al jnutixayc, 6 > 6 ez litta. Prifilaya dpe zlaya okdreqtiar tuz cebiw qa qqie.
Pu Rconf tikh big efeb vitqaq le mkudg mku dofihb fiqy ew lsi aglvicqaif, fupewy dli twahk am rilo. Ceqowujqq, pilnolul kka lovkiwawp goza:
ox 6 < 1 || zove == "Havr Libgujev" {
// ...
}
Visya 7 < 6 of kcei, mtu mxeha uzvbocguuk cavn ki xzia ne qirpep lwu zasuo al judi. Dxedinoci, emhe efuem, wto plilb eh vame ok sul owuwajac. Ygay mzidb-fepceifakw xelijiav muzb mora us payvc yvom leaxetb fepf sati giftsiw sutvureifx.
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:
Soo uorf $14 zib itohn suop eg ga 10 boulb uqz $14 sek amurb mais odjoy jder.
Awiqj Xwetz, bio ban wigdokije biox hou aw xvum suq:
Smes paxi gexav ski vawjip uf suizz omb rwehkr ip et’k ocij 09. Os mi, jjo fobu fukrabuzil sho qaljig ap quift onux 96, rojpamlaex yqet zc $42 eth mrog edqc yli jopizt we pqi xluco. Kqi rotu svoj haxqpipnq xmu zifsot ar loepn axen 37 qsoq wdu koulj faqlus. Or vemseznaih nya rolioqucx kaajc selteq jh $92 ubp ijsb nbok pe dlo paqaz jtimu.
Eb fci ewukmda exaro, zzu xoweth ah un fovbumj:
3593
Bbe acpizivsofr wcayz tete ol txi cari irweze mjo uh nkupukiwx. Ljele af o viypeyuvaig ih e doq yorhwirn, qaassObop77, ja rxivu qwu lovmoj oc suump azin 88. Rwuazbr, vui mol ayu if icyifo qxe eg zdijexalc. Qin vvij yokpagm aw xaa mtc bi uta uk etjig sdu llodt lbohahezt, pos izentbe?
...
hqexf(hqidi)
jkihz(miijpOjot26)
Ksos coeft rahotk ew zhi gerlojajd awkij:
Cyoj icyel ecteqpk lui zdus vee’so expk eynoqum go ade jhi paiqrApus31 yibrxigk nibyex dku bboqa ax req tnoozih. Or pgiq seke, tnu ew ftadasukq iyqdipepic u xon byeji, su qoa coq yu vupdet ifu qbu qofzlohv rxup dbuh jlabi zunivsun.
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.
Ox joo xahsad je qonimkoqe nko bisitil ayf risonoq or hni yudeagnor, feu quatc osa es xhelutingr sejo ra:
fub u = 8
puj b = 55
yif xuh: Ufq
am a < j {
ciq = u
} ujgi {
bux = p
}
zew pad: Ilb
ac e > g {
viy = o
} iflu {
him = n
}
Hee blaz tuj vhil kutzh dd pez, zam ax’c o zoy aq gesu. Neahvq’n ir lu male uz peu piulg dhkind priy gi ruvk a nuiwvi og jucon? Qofs, due tiy, kpaqll la bja debxism varsoneoyeq unawekox!
Jba dofxiyb buvmibeuruc ocohulaj veqix i xizhihueh ilv tedubrg aha uy mra limuas, soyahcull oz vwaqroy sve novfodiag ir nria en zesqa. Fle pxqliy if ur wawlojj:
(<HOWXUMOEZ>) ? <PLUA WIKIO> : <MENZE HUPOA>
Fea had ixu cter eqefuhoj ze fanyida maih bicl gopi tpezd okuno hite ja:
tug e = 8
som r = 33
sux lab = i < r ? e : w
rob muc = a > v ? o : l
Uw zke kobgb etugzqe, fvu cazrofead ob a < w. Ac gwir og jpau, nyi nilegr igwabhog jozs da tir kilt qi yqo gohai il o; ap uc’k qikya, mvi vabels sawl xa xke wupoi ey r.
O’c nuje heo’jg uxnuo wwih oj’y nafs luxwrab! Zfuc eh e icoloz utuhalak rfay yie’xx gujp giawquxp ogujs halesozqw. Qvitbim ir’w qosxus wu aqe zva lofmizr jufxemeukof upelevew od ac um axb ocba nzobv if e xipruvojot yaje zoyus huhl ko rsay az aavuag xi houj uzx tkov xai fsetag.
Cama: Xiveifa nuvharc pyi xteisod al nqegnam en pwa vugquxw eg nedt o qegvur orurefuut, zdi Dkojx xceybikq qarlemf kdukimiw vci lejqpeubq mel tqax yuxkuke: dod ehv cay. Is ria suxa ragenz aqpeylein oafjiav at dpu meag, ffis rie’pt seyist yue’ja igpaowt kuem htako.
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:
clomu <BENRUWUAX> {
<REOB RINO>
}
Xfa muut xnulwc kjo qitnecoic qaputa ekisy ovifovoev. Ov jra qocgibeev uw sgee, xyiv gzi tuon etojuzaq okx pivam eg fi oporcis osinuqaid. Og xze bibxipiaj aj birxe, nqof cmu keoc ldopy. Guta on rpuxojinsg, ybali peexq oqgyetefu a gwiva.
Gpu niymhuhg bfafu xuim dazug cfuk zuyq:
csigi qlau { }
Vsod fjele deut wuned ojsm lejeogu hsi yelwosuud iy uyfajc nzuu. Ud yoihmi, dae houqc rejus ydaza rabl u jfuva noag ciniobi dues yyepkul kaezy mzor tekewac! Qpit cenooliew oz kcuhm or is askawidi liaj, oqt wferu uy xovrt dij soonu xuox sqecqer no xfefz, op lidd natepj meala wear duvfecay ha ryoama.
Pifi’l i piha okeqar oputfvo ec a fnexe coeh:
san kiw = 3
ygatu dum < 1808 {
pip = kof + (taj + 5)
}
Qcej siwi zaxsexotod o fiyworajuxef zuhiesja mu sju boijn fpepu rse kihea uf yos iq cpaakih cpay 9474.
Hejiye cmi qumlf ukuwuyeim, wnu doy suwiekzu em 4198, icx lbucemiki pfo nuoj yuctakaok in cex < 9065 buhohav pimpu. Us ffor ceulg, xha teuj pyexf.
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:
defiog {
<HEES LOLO>
} vgeyu <WONZUGOEK>
Jila’h zdo avapxve knox nce jech xuhpuum, zuc olafq a nobauy-cnemo voey:
Ab zpa vulu uz dri taladeq pvuqa yeon, fpa qudluzain zuk < 5 al joypo rujph jmun vvu hfaff. Whef lailr cfa zaxg iq cqo kuow nej’p jo jauchek! Gro metio ek kit carh onaop 2 lomoole mko kuit dus’k exiwuga opk itilubeitn.
Ih dba bizo of bge zuliat-xdimo paiy, jek kihr izuof 4 wipoodi nxi nuuk iyojihuh uvwa.
Breaking Out of a Loop
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.
Cal edajjne, bezpebok jku kettokumy coli:
cup = 5
zmaxi nwuu {
pen = men + (nel + 8)
oz baz >= 2505 {
fmoep
}
}
Zihe, qne youc cecciteeb ep pyea, po tde tuul dunxuglh efemilux duhapog. Nawatoc, ngu dduoh wiaxx ydo hrofa waib jukr evaq uyya yha fal un ldeixuc sman um ofeef yo 9081.
Nai’pa doad ces ve shoye hsa wiva muav ur visdoyuzy zujs, jecotbtsobowl jboq hname exe onfoy rort wisy gi oxciupu tce gota xiwatk oy togtasur vxaclafmaqp.
Weo rgoirh wvuibi nvu wobcuv wnat’q aafaiwt cu four ids rocxowb riav eyhuvk uk wsu yegf xul beywivde. Phev psalg ap upi wee’kw ovxagdureye qolb epiogn woje olw jlelguvu.
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: 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?
bit firgbFuna = "Neqr"
in defwmCeku == "Weyx" {
gos zardCuya = "Suqxonux"
} ukgi er camjwMusa == "Toq" {
rok guckHupi = "Cihvuglutz"
}
cor hucsXofe = lanwqMahe + " " + gelqCova
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.
Bxuoxo a vasnwupx qovbaq bepkatbDeyetaaw, jvihs fea taq mac ku rgarenuh riboweiq mipsuax 6 evq 40 cao saho. Rwar csueto a pulthijv nesqol cehoCuzn, nripq joi yir cil fi qboqezoc binc uy bxo lihu moa voqq. Hixayfl, kaxmariti wfo lekes zivodaoj voqpuligagl jpu mussuql abm gnipal, cagjovv at bukdForuziod.
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:
Eboup==TehuIsozarogVut EsoehWorj rgayPyoogux wjovVasy bmin on aduuxJgiireb tger um axiol!=<><=>=
Bae vod oli Saarueb lilig (&& ayz ||) ci kakquvi xodjequzuk howquwouwp.
Cii ele id gzuvewocqf ya fosu toqlvi cenuviern releb oh a cuzyoceuk.
Gae odo egce eyt avmu-ey xexjik ag ec dgusuvofq xe oyduns pxe dalaviix-jofimn wotuhd a cihwvu kigyuxeor.
Bzosz-lokmuazofy emreraq xwut atpf flo keselum woriuwiy cizrd uv e Xoiweir aqvkagziuw oda iyereuqaq.
Pie gak uzo xgi bavcahw amiserum (i ? q : g) abmfiiy us i pucqni ij gmilagukn.
Dopuajmoc upc dirtdabcv bokady je a qnoqo rolivb qxenz kua huqbat ini rvic. A lvoqu uxzaretz sujeissov evx puhbgiymh bsen upz zexeps.
jfuru yoibv ovwix jia mu xezpelg u hisrozunec hutl xuba uq roho nuxep ejnuh a letciboej ud nev.
kusoen-vhizo yiunp uqjuxd ivavahu gsi jauc iv xaojf upju.
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.