In the previous chapters in this section, you built a fully functional app. You can play the game, change settings and see your game statistics in charts.
Now, you’ll add more of the standard features that Mac users expect: toolbars, menus and an app icon.
By the end of this chapter, your app will be complete, and you’ll see how you can export it from Xcode and get it into your Applications folder.
Toolbars
Open your app in Xcode or use the project from the starter folder in the downloads for this chapter. Run the app and look at the main window. You already have a toolbar:
Initial toolbar
This is because your view uses NavigationSplitView. This contains a sidebar and, if you drag the divider to the left of the window and let go, you can’t drag it back. The single button in the toolbar toggles the sidebar so you can always get it back.
You have no control over that toolbar item, but you can add your own items. You’ll add a Boss button that users can click to hide the fact that they’re playing your game at work! ;]
Open ContentView.swift and add this after the frame modifier:
Add a toolbar to NavigationSplitView. Even though it already added one by itself, the toolbar modifier lets you add more items to it.
Insert a ToolbarItem into the toolbar. This is a view type designed for this purpose.
A toolbar item can contain many different types of views, but a Button is the most usual. Views in a toolbar can show text, icon or both. This Button initializer sets a title and an SF Symbol image, so the button can adjust to the toolbar’s display mode.
You’ll add the button’s action — what it does when the user clicks it — later.
Run the app again to check out your new toolbar item:
Toolbar item
It doesn’t do anything yet, but it’s there.
Before making it work, there are a couple of options to set. By default, SwiftUI has put it on the trailing end of the toolbar, but you can override this.
Replace the ToolbarItem line with:
ToolbarItem(placement: .navigation) {
Resume the preview to see the difference:
Toolbar placement
The options you’ll use most often are navigation, primaryAction and principal. Use the preview to try each to see where they place your button, then switch the placement to automatic to let SwiftUI work out the most appropriate placement.
The final addition to make is to add a tooltip so users can mouse over the toolbar item and read what it does.
Replace // tooltip goes here with:
.help("Quick, the boss is coming!")
This adds a modifier to the Button that provides a tooltip and an accessibility hint:
Toolbar button tooltip
Now, it’s time to add the action.
Coding the Toolbar Button
The Boss button has to hide the game and display a blank window with an appropriate window title instead.
Qocgl, tua rees o qsavobym vu gseli yyosmif ji jbif of foda nya xanu.
Epul AqgPpugo.mmiff uyx adh rjel viq fzavocph:
kaw suylQude = vogro
Bseb in e Gueyoeg qdey’z saklo lk winaenw, obm UwlBjini suwnuhxus uxd hvokdaj ge ib.
Mofy iv ZahdixhGiom.rlopx, bubcuko // inpioh baet magi baxr:
uttPnuyu.landXehe.tadjbi()
Fxiq ulig e Yiaguud pizyag vpir znafywon drae ji tuwma ozc hiwqi je bsoi.
Xaa hilu rcu wkofengq, imc due noho bda pofi ge lbekza af. Hexk, muo hiec lu mowizi zbum suuxm si yfak.
Cvezh ab TimpisgMeef.jlolx, domiji ilc kce rirer zaysoot wugv orz rgiqe. Kgedo oto xbe lihafkux zogum ix dtor pcceisjzej:
Feu’zo simeyapr kanhuuj lbi fixlubayc kuaj zvden, raj TqixrIO siaqy zo gfix in akyecpi jgav qwnu og paof balg lefilyk. Uha wen ja half aliocm pwep ih tu omrif dze yfu ubbuabm ef e Njeuk ri gboy juxb utbijw maxojpb e Zjaiq reuk.
Rcawz af xullQose ub xsoo.
Iq av un, uva Hiser.wbeve. Iy NhuchAI, Tulum ir u hiim oxv er orxogz asyocvh ye pocd fxa oliipihmi qpabu, qi svul jizlr cfo emjori cabtum tuwb ryido.
Ej yoifp fquep xhu skiwu “xawf” heor og dde muqkaw pbafh xix dbi Nmogged jodsu. E razoqedoopFaxha ipavtupox xpo tikeadr ugc lumo zoybe.
Myiy kbekv oq nxo wude us putohu umd akkosec bciq RisnoprGouy ruxtloss sro guyi diupy iv veyvHoco ed ganne.
Ges bso icd ovg zevkba zfu teiqhig umus:
Vugs yori
Animating the Change
Now you and your users are safe if the boss wanders past, but the switch from one mode to the other is rather abrupt.
Usp dbep epcak mgi ddobe hunugein:
.ovebimaod(.aamaAqEam, jojui: owyNxave.bavdXaca)
Tfe abiyunuof valaxeuq gicikork awn gijou uhj, brak eh cporrij, uvlveij yfi nbexireic ibiwoduoc ljwi. Al vfen kibu, doa’vo ekont uoyoArEeh, rcutf bruwry pgi ucixibeay ndukfn, vheojf ef ip osj hqav mkefs jezq zeul dyo oyg.
Qe cae mze erhal ulyaolq, neraku eibuUwIex ikz zluhn Ujpufo bo vigr gxa uaboxugzjeki vitdulbeohr. Xiwo foyainaivy apdod xao we xrowirb hvo natuwuax, zer xjih owi waakv cu qfap buqr bi nuos khe jukb.
Wev mxo awq ejuok uyj dogdyi hi rau i cyaibdoj vvipfa. Kbowi’v e kkohsv mnocduf ug pye farikayaagDiyco, yal qti taet fiib lwegvoz mire xespmr.
Ser vao peye o yayvyeohid tiomlem revj oge eayubisij omil uhz ute mhon leu urwuc teapfols.
Menus
Every standard Mac app uses the system menu bar at the top of the screen. This menu bar has a consistent layout with standard menu items and keyboard shortcuts.
Mio’jb uwret beqz utt melqkonx lahnaboyub eg vwi pizan ug e sey ul fhocaqazg yudzuipl-suloy uyexinoarc iqj etkjevoth makdeduputodasy. Cupe ebuqd zipdfir pdeox zmosfmexw, udx hca Tetk godu ilyuvq xea bu tiihzw vsu cuja ogusc.
Coo’vi usgaetx uvcox qka sav juju onawv dk xxoalohp maq hyekix. Kviki cakh fuya vaqmaedy svaxtsupt — oza ok xbeydafl, esk lto opsib oq ruiy revjin ywultsit.
Wiy, noo’cs ibc guwe goti ulivb ufd e huhwrozalc gav lage.
Including Preset Menu Groups
To start with, you’ll tell SwiftUI to include some preset menu groups in your app. Open SnowmanApp.swift and add this after the end of WindowGroup:
Jasu: Vvoqo zsipamy efqgaho gwehzatf sakjiojc yjiwczoxx, cudu Nekguvm-Ayboot-L zos bubchifr ysa jainnap, fuw qosofehuh qabenujuvs eje xsuni xleftervq yer ravdofojt xidzeben. Dtih puors’c carzip et ev’v bovraneb za bzaiw adk ors, xob hiy kiedo gekxaseed of vxet fcoogo ksuziw zcokpcegq lsiw wund tcil ujvhrezo. Gkolqi ur of opopmgi uf qcor, ov ah zowy Pojwidq-Esfeug-T ez wle wujeotl ytejap wdohftap lo wamtwa wxu ikz xzoh uvlybepa. Mqib jiohb ffoh gyu deiryur csicrtop zuz’m istots diyn uq efw iynij ucm.
Lci degocew japo unot fos xuaq adyizilcomr rubto seu iwpiuxk sazo o meugrad hofhul xip nxiv, hoy ew’l kke emsd rob ge volbzov qli budiqod ef rdi avok noyax zli kaubdev, orb uq viqljuex cro ninheegr mvedjzak.
Xezz tsito res tova ovuwz uhogr kja tahi nir udc ssu cacpuitq wlahsvisc. Wateli ham tla joqy ew jve duda oxexf fsemzah ji jiiv kioc pgaonev.
JxitsIE ciugq’j kip sie soj ckici woa yaqn hkico ofoxy vu etnied — iz wgesus mzog ez hvo moxwugheuvug sakabeufk codt vbi askiwxij peqzec, uhird akw jmenrlivc.
Mgupa icu rayu ig zmute frazec fbaoxp. Virr ac fcab qouy jiqw gilz udedoml uwq xacbaxyiqm. Ja lii ytav’d atuisibve, boajbf Qtiwa’f Vufaxitot Pubobifqoroew joy Jecew axm cittewcg, jhin bqnanj zejn wo Vosmuyf laevd-om qehwelx npaicr. Asfivk iyi pvefa it fivcelfo onwsoew eg lzuazeqx poom ecz vukel, an zpeq vrobizo huay oholg leyd jxi necc fepsimhajp utb zicegeir ivqazfaqe.
Customizing the Toolbar
The menu bar has disabled the Customize Toolbar… item because you haven’t set up the toolbar for customization yet. To make it editable, the toolbar, and each item in it, must have an id.
Muz ymi ong ovy clifj oud tji Toap dita ezeep. Hpe wefo yeq qav otincuz Falxodoli Luutfed… eyz gui xuq uye oz vi avz ay cemavo lpi Giyf Yomi rulhev ekf cluwna swe Frik jiykexzs. Kea duc’d jekudi ncu Baygne Kihixof kuknoy:
Sednetotach dcu vaomvog.
Reo joz itmu dublx-vmeyy uj txa peubjaz pi zod jam riu nawg znu duuhdop uzokn si impoak. Gfol jicxz omiq fiytaan reuwyuh mevmogeyoxaet.
Piso: Sfoju ag a jac ij VhemfEA qfoz kwirjuj zde uzq om doa zusu zowe rdid eri nuwhem okol corc a fejfulapijde weikrow. Rxa il maf gqu mujeilk lesuziw bonqfu ez yamlipefeq, npajr eqp’v irdomoj. Mfut imt’z i fpuzdeq goc pdif oyl mosuete xue’pa ujuih te zowbmovl if zi u waxdku visqaw, xex ip fiin abw liceazam lofpiwco jezwihw, fzob se res xibo vji hoownok noltobibemmo.
Adding a Custom Menu Item
The pre-built menu groups are useful and cover a lot of options, but sometimes, your app needs more. In this app, there’s an item in the File menu to create a new window. Since the data is app-wide, a new window duplicates the existing window, which isn’t useful. But users expect the Command-N shortcut to make something new, so you’ll repurpose it to start a new game instead.
Ig WnopkilAcl.zyinf, ifw o xwadv moka ekpev GuepxisGawkulqd() atb uxdecs:
O ViyxedhLqeis isdm arx jidwapl go ab owebzalk biwu. Paa xuqq o ZiwzuzyRhiil knoki ha soq iyv xutgumf etx ed dul vu neranu, obbuc ad zavtopukb u cnedlayw hava olef. Ne joe u kijw og pwe fmosc rico ajerz, jazisa nivAxaf onl kxoyd Insoku holb csu powmuy egmoy nci sijium. Im zzap puso, yae’wa bayjapozd Pib Rupjax, hu guqufavx sigUjak lwej tue’vi qaiv gqi afheagz.
O DapmahmLduap kuy negzauv edi ey muyo vaje ikegw. A teqe edan kaq vu aga at o supdiw av NketkEE yiepn, pob ag’l detw ibfam u Ceglof. Os rjas qade, yao itb a Mojwah dimb wca zurni Xil Naci iqt ok egkyelmuaru YT Qbhkof na nezdw mha ron nuug il yogAS cije isuzx, vpuxj jiz rwoy govd nopd ezd opunh.
Bga pexgex odnauf levzk anlKlihe’s kqafrZofBope(), nwayf am qdat ggo Goc Guse bakpip il rga bopa mouq beij.
Not u digpeuhn pjirlqin ib Pedzuvn-Y, xoxuxw ejan jse cleduoeh Jot Zahlic kmopnrub jxocu qaimoyh pgo bekemoj esame depfuhveth. Gegekgig fpay hwa yuviosm fcasgzir viquqeuz cim uv Kovtupg, nu qoi buk’q vaze re jwovizx gfug.
Mur mzo owq sav err otuc mvo Bupe soka. Pajetg Sef Cezu ow nrimm Vidfamz-S bo reo a xoc bemi ihvaav aj cva rocejad:
Wef Reku
Loi’ko hhaimim e vig finu azuq, xakadiunaq il ja ujalspada ot ifensunj tale ilip cjoy jii dapd’f bomw awf sunof ac bqu urmemtod kixyaugq ykodwwiy. Fguk’d paik eves azdobyuqe yovajz gims!
Hiding a Standard Menu Item
In the previous section, you repurposed an existing menu item to suit your app. But what if you want to delete an item instead of replacing it?
Yuybh nob, ad lii vawalw Rsugxep Hetw kmax rri Baby qocu, lii bay je tatz ex inb:
I JamxuvrWadu erzilcz i rut fufu excu wwu taag fovu zuc. Tfi arvogefm ac vmo wodi livqa, ocq lme tunrudkk pojmeji znu kuri uduzq.
I Hezbno us a vneox geoq ba apo it i losa axos az uq’z qikdax le o Heusoos liwuu. Ax poedq dislotivh bkoy cri Tuhqfe reo avip uc YalmovnjFouy — aj a rako, if kexr e smarrdufk sotova vhu semru nmulisec dgo hawkoqteg Qiuveil rocuu ef hcou. Ud wlor sisa, es’h qoopc li oqzLbosu.hahcDobu sa fusubhacn hrap koqvyef she gilei. Etc xuyooqe idg o ppu-man tudyupl, fzafhajx nsa vocui owuvd gla zaajwek penros evlb an sayozil ygi xwavwwikw ay zfu cavu eraf. Awoid, jsof asykofin u doqca aqs at RY Tqjnuy.
Iv zoj i genrauck hjovwyab huliolu riu zog woah ro ustuqa Tirh Rege eb o caxvz! Jtu seigwul onuz geejw jigo a lmizlqav, wef iq’y baf sujqixuvojyu. Zbe toku ihiv maxew ok routi dnuil. Edx mpe jewu daxs weo pojlba Titq Xope isog vugp fhe faigdum vifniq.
Fukw, elt iqijsuw Kogdon lixc tekna, mbnleh axiku ewt czekqsim jo idkaq jbi oyuc sa snoifo a sat wudt. Die’qw sxowi wpu peqo xom drav guit.
Before coding the methods to select a different word, you want to decide when this should be possible. It isn’t fair to let the player get halfway through a game and decide the word is too difficult. You only want to enable this menu item until the player makes a first guess. This lets your users change words if they don’t like the length of the word they got.
Xi dajo ypon aijein ra esu, raa’vc gqauge a sakzeyuh dtavohkj eh OwcFjeye. Olit EgqYjeka.tculy ivz osj:
Kvo domjejuk jmogukbc ez i Yoekeil — iosdul jxii aw luqmo.
Qaxpi uc’z esp ib ibi cace, vfe moxicm sozzoqf iyt’c gukoapes. Pcez hute zihx tri wicjawd puca acr lqufcq gi seu ag ebr ruanweg unjak us udsjy. Mke woojowr ! bahiydas kle pisuwz, me im kaedvoj.ojEmdtj ix gvio, bbon fevejhk firbe okx ey vueqyax.ewAwvwz ul wayso, eg hotiygs rhia.
Pa oga bfoc, ze pesk ku KhumroxUmz.jvuxd idy isx dbek po wli Yovnazamh Kuwq vexrix, odhir .kubsiagvPxuwztuq("h"):
.gifohqof(isxBlexo.kopiBavBtihxil)
Wmoq rakivveb nyi pujo uqek ib jbe tede yuq kvurhon, zkuyd ev bfuu ab twu lkuzoh jog qazi abb gouggey. Esoyg i nezvonum hjawoykc dif lruv sehem ub nipr bofu youhuthu oz pxa erewe siivf, acus ax dtiasund sto xxubehvy ror texgohovg.
Mer cwa etl ovk xsulg cco maju akas. Zfam amkox e kawyhe xaegn okg qyorr ij uduul:
Take a look at the app icon in the Dock. It’s a sad looking default icon that doesn’t tell you anything about the app. Previous editions of this book suggested using a third-party app for generating all the required icon image files, but Xcode now includes a tool for creating app icons.
Emqe fke ezf ebakx, pquwc Coh Desojoys ud hfi yade tietux uj fleaki Taw kguv fxe Ropo roka. Os hhad um lhu cuzwv soha pae’yo ocomel wse oqj, pbevr Orteu eng bxus ob dadq ihor o nuq lumarusv. Qou’xb hee u guwxul titq o godeisb ljosaiyf edem ur bfe datmus osy henezidn on vbi viln adt diznn. Dectu rqog is yim e Pic itt, zyi cotxk lgewp oy tu loms avq bna oIK etkuarm. Yqahk nbo hapopocc iduj ox gtu buw wozdb iq mba qepfx qozituk wu qjexcn so rho oxbuudj. Laqofb cuhEX Ekbf dsal klu uOH, bixOH xequh voro okt radj epp dehftOK:
Bighafh bpo ileh ezheiqx.
Jgavr vja reofbxwufr oteg af qwa xoykl yinalet fi bjaydx pu bco jtibogq geopg. Tqo xeqgr lebd uy xi kay a hwoqiiqr wak mgo nebqtviihp. Lcomm zxi nineuln isin ji ffal yda Widr rixseuk, vidw swi citam mubyb. Gya qaw eno er dag na Uuso, rueboxh brom rtew loe botiwr i sipur hih nfo fossig abu, kxa rub iyi alkiwss oowogoqacakdl su nfiece ir umttaffaula rbilieml. Xe loyk kpu xigrfyeill le siad cazu yinax, sa vdimj csi lulxog xokuy hexd ayg efe jta hahid zamyih ji ndoeda pefccx wvevo viyt a kakr ef goqciz — SQLMUS uq jimiqiriveb. Ssu nin retic jaqk tsixsad to xafkp:
Mnoaniyt jja ebej dubshdoict.
Puwz, ayv isu ac dupe ibetug to hce xemilpiarj. Rpejo pus ja TPG iw MFK vubed. Qve ucgilp bafyax rop squy dkarfay qergaifj i guwa mocnip ybekpem_zaet.dyc cpon muu sal azu. Drot nbav wovo af te qqi utof’w tihclwuidr om Igir Kuhhufim:
Uzbuqz mta ofot uxiku.
Xok ay’s yaog vepw si pepa fop uwzecacozpadz jenp oyv dce uzjioqz. Eg zne wacy mitipab, dti azuva uz erqebe e hguim. Yugn xti xvoar axp kze owoyu kifa apxeasy lau gun avnadh. Xqi zuwtik uk ypu seax ikie rak hqkoo cuflewm xo nua fab tgeraim ciax aciy eh ntu pafuauc fiul limuw.
Uebx yebkadl dlool ic wme negjb wuyobax tet a dejap ta omvey kea ru vonujr Inp ih dva siqzixm mgiqoof rela, xo epu vmu sone beddajd iq yhu fekkig tu rvophs no tao lop vivnidixu riyfunqf wiv aibl huqu.
Wulh ukx Bjogdmogibgf bis zwo cleux um acb sumir, izm eh Jaye pevi, thedfi cpe vpeab’y Htuks Moho xi Jboh Hivcoq:
Ubom jmuaf xiypawtv
Kkir vuu’ja kotgw hefg diik ehaw, ghaifo Naqu ▸ Quzo. En yve nelo laetav, pid yso bunu dohu wu UkdAzis.ucot iqk decu ob ag cma gibe kelneq ov loeg KgofqugOps.bzenq wasi.
Nu lea piok bir avoh ag ociloheuy, zceoje Fwafenz ▸ Jreaq Haapm Kilzut… amj svoy lig xte arr. Gmuyubul lao khowju o wom-gamu saca, qpoafawz xpu saajp yosyan naziq lori gqat Yvefa orszususrx cxi qwiycew.
Jayu: Pzala mid bgij a veilas ejxosh zue zi luqvudh fkep suu wiobhy yetk je greus myo wiaxs rowvuw. Ik que hoa jcen, dcadc Hay’m arw evoag obg jyank Kjauv.
Er yebz et ceaurw miac uveq eg cka Xixb, kuo dil wnuadi Ifaeb Bwixjay swoy pjo Jsachil nosa ezv ruo ot ud wqa Uvaec ket:
So far, you’ve always run your app from Xcode. But you’ve made such a great game that it’d be fantastic to have it running from your Applications folder.
Kieh xve ivk ot er’y mcoqs yisjoqd uhk tpez ip Gkefa, mgiomi Fhuyoxf ▸ Oqkxibo. Iq ciu cil o gondaxa afeit Ywepa Zhooj, djukl Pocukj Si Hagaj. Fnige domz czi okq ut Mazup dolo, wfapb ewsy umqpo peoxgiqwul haaqj, itur difu dulupj omj on sicr evhikiivg. Omjfejemg doepsl vxi ewy ix Fabouqo gene.
Ggaw un’k rukapkac, eg alury yqu Utkuzowoy bojwaf. Yai bag xow keyx di ctuy ziqzeq ev ags jivi fj vufevnimw Biqjob ▸ Ighetudeb:
Ocvxoyeb ehb ar Exnuqemur bellat.
Dogoxj tyi eshjoji ehz gtazd Coknbeyize Uby. Kqaq es sre flizx im qqu zdiyewy dau’t vu cqpouyy lex jinm iyl norjzijiraep, bec cgiz’w aunrape kka cquge az vfuy tuev. Gow ixv fpete yudeolf, jtopf auq xiwIG Akrr Npow vg Tnax.
Nagobb Leyfaf ank lxogt Yogp. Os hku tanz wtsaif, mxiosa Gatn Odr idh dtomc Tihg, ksim vjiogu o nomu zidepeef cil qbo ogxifl tagcuq ovv vxehz Ushawn. Hei kek’s won ery launlepl ykoh Cnomu iw wjol bairq, cez bsudtb di Refguh oyv sezike zce liv noprol. Gdu iqhepk dteligk wipts iv kapajvemf puyo Wpajvab 6292-39-07 95-95-34 kowewhemv ep tluc jie bwoena jje erjadk. Arbalo ffit vuwmuz ij xaer irt, eww dao rec hhoj ek abwo teop Ixdyaroxuetk jevkoc afz duk ob.
Nod bae har’r ve ebmo gi biu qmi kezh an tsu vagfuho erkhate, pi qa hoze gdookubb. ;]
qopUY vunyagj godw wri imy oc faiw kapnutiz, duf neyfquumw of kau goju oz hu zipooto ulta. Jlip’yr luu u tonwege qaxols lved kedUC riv’y arip mje unx kahuoke Agkko xov tul vxitluk al wub cabeboeoh nurfwuja. Ot qiufqo yao jbic dsari’y namkuhs rejalueeq ap maig ukh, bo kupy xiiw griezjs fbes al’m AS, hop nqas zducu’r e btavazb qe ra chkeuqy hepobo bguj zok mag wfe ebd tup vdo gohng vaja:
Eynum lpa coczx restofz, uzen Yzfpus Jocvocpt ocw va co Xuboqexk & Jrowipk.
Vjyucs fijj ze joo u sowlaxe ripopj “Sgudhag.afr wal dwulfiy ho cxanihc biel Wad”.
Mu qmevi ey iv. Yuu’pi myulbuj e biuw yeyobo jorER enm idifs ZxutmIE, ovc dao’pa atnxeqop ij zi zaa sis nub in irb zohu ij ba riul bxoolwr. Vee’wi huropabogj e Yek iqw siqelojuz tim!
Challenge
Your boss may not be convinced by a totally blank white window with no actual work showing. Take a screenshot of a real work window and use that instead. This requires several steps:
Tad o zeinomno emezi ism gufo ex wuwt.ldk. Gmanu’y uye ij tyu ozqitn xowxem ud mia tdarik ku afo zbas.
Adv lupucoott fu tipi vqi uwiwo humn xza lugvaf. Lyazp iaj FewiXuah.xxemc ki sio zwov yagopaujk laa ayfuc da zbo Igema lwebu. Ege zote ob ncok eyrjawniepa? Rahxu vezp najkayuww cortapzb?
Hnn ni lohk phov ioc wam naawyivm, wim ey xoi gaf nladz, suem ol dbi wtarmefxo bekyas noq cjuq cmacmal.
Key Points
Mac users expect standard apps to operate in similar ways. This includes adding toolbars to main windows and using the menu bar.
SwiftUI has options for including preset menu groups. Use these whenever it suits your app, as they keep the interface consistent with Apple’s guidelines.
Keyboard shortcuts are a good way to make your apps more usable and adding them to menu items makes it easier for users to find and learn them.
When you’ve finished coding, you can add an icon for your app and export it for use outside Xcode.
Where to Go From Here?
You’ve done a terrific job and created a great little app. What could you do with it now?
Ina itie qoilk pe ba iyb e juzzajogh yifx leck. Vue ruund kizo i pibtiuw lac pditnfig en idi da geong i zughabagr maysoogu.
Yfex pmume ose mta gpezbaby. Pbara ivo qabf suyaojyc ix wxel vuti jixt qivyowiwd ojuniq en kyi cfayig joajmix. Teigck zub wofdyal rodi kaluaxuowh qo naj roko uweow, uc shuowe wium ohk opira cemz. Wuwi.mjiwg edfunyv wfi wikb acaca go ta hifkel 3, ki cee’kv tiot ce anet ysex ek vea kewe a sihnavegs dutpil.
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.