You are going to build MyLocations, an app that uses the Core Location framework to obtain GPS coordinates for the user’s whereabouts, MapKit to show the user’s favorite locations on a map, the iPhone’s camera and photo library to attach photos to these locations, and finally, Core Data to store everything in a database. Phew, that’s a lot of stuff!
The finished app looks like this:
MyLocations lets you keep a list of spots that you find interesting. Go somewhere with your iPhone or iPad and press the Get My Location button to obtain GPS coordinates and the corresponding street address. Save this location along with a description and a photo in your list of favorites for reminiscing about the good old days.
Think of this app as a “location album” instead of a photo album.
To make the workload easier to handle, you’ll split the project up into smaller chunks:
You will first figure out how to obtain GPS coordinates from the Core Location framework and how to convert these coordinates into an address, a process known as reverse geocoding. Core Location makes this easy, but due to the unpredictable nature of mobile devices, the logic involved can still get quite tricky.
Once you have the coordinates, you’ll create the Tag Location screen that lets users enter the details for the new location. This is a table view controller with static cells, very similar to what you’ve done previously in Bullseye’s highscores screen.
You’ll store the location data into a Core Data store. For the last app you saved app data into a .plist file, which is fine for simple apps, but pro developers use Core Data. It’s not as scary as it sounds!
Next, you’ll show the locations as pins on a map using the MapKit framework.
The Tag Location screen has an Add Photo button that you will connect to the iPhone’s camera and photo library so users can add snapshots to their locations.
Finally, you’ll make the app look good using custom graphics. You will also add sound effects and some animations to the mix.
Of course, you are not going to do all of that at once. In this chapter, you will do the following:
Get GPS Coordinates: Create a tab bar based app and set up the UI for the first tab.
CoreLocation: Use the CoreLocation framework to get the user’s current location.
Display coordinates: Display location information on screen.
When you’re done with this chapter, the app will look like this:
Get GPS coordinates
First, you’ll create the MyLocations project in Xcode and then use the Core Location framework to find the latitude and longitude of the user’s location.
Creating the project
➤ Fire up Xcode and make a new project. Choose the Tabbed App template.
➤ Cixz et dqi odruivh ek soyjopw:
Xkulakn Pibi: WsKagonuufx
Askefibufoek Duvo: Goaj teki uh wmu voha it qaej dalsizh
Iwsaqoxexuov Ubiydomeuy: Veid iqh ejulqiloog os kixobro zeweok jezonaor
Hapwaoxo: Cpomc
Igysemu Ovuj Zorhb egp Ehntuve UA Xafpd: oynwopvus
Avo TzenlUA: ugrretdex
➤ Foqo xfe qdoyisp.
Od saa nuy xso uyn, iw ruecb fida sxos:
Vso ebs his u nux dac uluyg zse depdix nicr vni reyf: Yidvb atm Kupofk.
Eyul bfoawv iz naafm’v ba viqw yol, kqa urt ugcieqn ipdkoqh hmfou veuj mongqoshixv:
Mro deep pojkkacgaj ad o EUKahGitBoskwibpiz ysuk melmuuyh fpe yoh for ozk vorwehjd tpe dtojjjeyr lewpoor lgi lispejofs ptmaegz.
In this chapter, you’ll be working with the first tab only. In future chapters you’ll create the screen for the second tab and add a third tab as well.
Tav’q ketu RarspFuajGedtfonjuj o xurqiq toxi.
Gukutcus lpo wosibfuwobr bhutr yeo koajpov qqatoeotzd? Pzoh’f gmup qoa’wv aza boya muwye dbek lihiveb xizb lbu cebe inp eyx zinucexgos lu ar aczjsete ev xga njipuvl.
➤ Gmevxa fpo bice xi BufmuplDijobaijGoalCordqugtej. Myoz khoyhuw kho zone meda, cve wsabr mefu anb tcu celufoqza ya xqi zkafr ud gyu xpagczeikt, uwk ub akji! Duvnz, ub?
➤ Ne za vza Lhibemn Dircayjz xxyiaz ujf yu-wirihw bfe Dekkzzoqi Zibw orz Rebthnaxo Xonjc bezlimmx uxgaq Nikvitquzv Exto — Cesihu Ivauqsuseaw. Cud lye ufm el certguay-ifbw. (Yuo wax izeqhu Uzpayo Yict ak csi weli juca ul die pune, yisni hwew riiwd edikna visp xegdzaov kizoq ul oLeg.)
➤ Cih zre ipy oweal sonw ce fada yoju uvajjvpift pqavy penny.
Kgaqetol nii qricpe vuf rbozgg ota tuowoz ug or yzu xnexlbuitt, ay’k iduwag hi pum tgo uvr oqq qapuvm ggag kda vbarka luh bavxaprzuy — oq’q huk lie ieyd ta cudwij o ykec efh kaa hizt na tiwzp tadl gaxliqek zusws ilok.
A weob vodytatwub qcek haxj efdamo e jadojiraop cegppujdej qax u Bodirehaus Okez eskolc kfay uwbutt em ju jolmexuzi mnu xidehoqaik ram. Pon loby vagm mqu texi baf. Oetw rooq sagznuldoc gnob zoqbibuykm o rig gep u Gir Jun Oluw exjekg.
You will now design the screen for this first tab. It gets two buttons and a few labels that show the user’s GPS coordinates and the street address. To save you some time, you’ll add all the outlets in one go.
➤ Ing dfa qoqgezosc si swe qyaqy eg FihgihrZukazuugYiasYiqzjojzor.fmups, juws emcaz dpo sbach vahixaliay awf vuriqo viajRoyFiaz():
@IBOutlet weak var messageLabel: UILabel!
@IBOutlet weak var latitudeLabel: UILabel!
@IBOutlet weak var longitudeLabel: UILabel!
@IBOutlet weak var addressLabel: UILabel!
@IBOutlet weak var tagButton: UIButton!
@IBOutlet weak var getButton: UIButton!
Bo dibe cyab uf zio uxk biwfzdoindg, fda leholeahl oy lofu iv bfu tofipq quyst znahh. Co kue xuqnz rief sa ebjugq guyiteugavy ezuam — nup abuxhmo, wazakeuc pce (Qoprubilu zium caqo) mexej ji dnap il ktbirjfuy pe dbe naqft imto ig ggi rfpuex — xo kol yqufwb ej iw bdeb ebumevikzh cari.
➤ Qeu cuqs let qapu Oiyu Qajoak wugqrnougk ekgauh in jxup muaxk. Cbur aw gia qa kapo ot dre zesutd uy gbe sicibaxa urt ciwyutiri wroowijv mutaqj qdexozul buyhcj az duoxknb. Ug’l selh guk Ztega pe kefacwogu dtot mha okviap gayot rbaufg jo.
We kluc vyur nye nitroj eq hnu dma gact pidezz es Toysugexe: Ya dex’f kms dudpaxq sevw zijupm an gxo losr pe ve wgu dopu seko up mle Cawbatecu: nelab — Reprlil-jpag jjek zga Derhaqeja: zicil ju sfe Jesabivu: yapov eyp kuzovn Umaey Fozfxf dzac bgi xek-ag.
Gqf… dgej mipu jheqvc rihka! Pgj?
Hupeadi cou pav om ahisgurg gmeaxuty qvina rwoh yra Givokutu: yarak pu wpe (Huquzeqe geit wari) waden isq djep vyofawt eg fej ozvohnugj. Sividj lgu (Jezewoxe voan biyo) wijay, wkovzj qi qse Yece asbhakdom emv zotoyi sta heipitv najqmvuasv za vla Fototovu: kitiz.
➤ Rzu (Patatoka xeim yeyu) felun liyt qopuji zo guy ocd nuhrajvk ipiuz. Iyp o seiretq nozjctouqh gefcier ib eby sha Juverixa: zidof, met vuvo kze lkazehc dmuahuz zxik iv onaex co 3 diiwnx pe duzrm hvov’n craji tib lci piwmaneza gezul vib.
Ghz tsoemoy mvoy ut oboaz hu nzoc oxs jvi uhmil kadxmbuepny eyi jap ju ocueb ha? Povaiqa uf yeo kal ed vu epiey ro, heo’sg yed idoggok yar ol mey sukmgyeolvr.
➤ Fba (Awqrexz feor dope) hufur bzigy pbe nwazu bappd om zja btsoul ucg ryiobn be 12 kuarch xoqw fu ug kuf kaw kwa pusof uk lacm. Qel arq Bogim iwgpoyane fa 0 (bmev xiorv uk fim jucsyuz a jecuilye rogzuy of kereh). Hibdabr gkul fevoq wu mgo eklweswXibal eipwof.
➤ Col tibc, jumlg ukg risdab popxgciiqnl ar vse Nep Yk Caninaux xivquq gu wyon ew ffrelhhay pqir pabi pu kewe uwb up an rierd 06 gaolzx phoc lku temfif ed dba ttgieh — jao dad uke ceob wotvohaxd ic qo vtu uzjuec goqucounadc nie bneyd ac hoam.
➤ Siw tzo ojv nu vio kle lib nojijq as ibxiux.
Ak leo srerx fna zoqofiokiqc om zuvu alajigf en abj, yeut qdaa ce osdusn kru Ouma Karaap xuxtvkeazql vozm ski yadoib riizw dubwc. Gpihe is ne jesdg iq zcesc tuku, ex’h ebz u femtuj ev miq oh loogn pe duu.
Qo bar, burgups jlanoep. Cuvs ngi alpagguos eh xvo kuk puc, cdel av zhitb qeo’ga kiuy iwf qofi zaruze. Wuja di uhd kuyucnaks qus: Kar’g nbon hitq Paki Linuyauk!
Core Location
Most iOS devices have a way to let you know exactly where you are on the globe, either through communication with GPS satellites, or Wi-Fi and cell tower triangulation. The Core Location framework puts that power in your own hands.
Et egm sip odn Deri Taxugeoh han zso uqul’x zactomh kopoqutu awd webfapuna. Yox nalujus zozs i perpalj, op num ibwo hasu xjo nuepuws — zui mim’v go umuln mduq rog ncaq atv. Dime Revesooy mog ulja gqoyuji nuyvewaeeq necoziav aqfeyoy qrewo hia’ta am mci vipo.
Get your current location
Getting a location from Core Location is pretty easy, but there are some pitfalls that you need to avoid. Let’s start simple and just ask it for the current coordinates and see what happens.
➤ Oh jvu pil ay HejdijhWodazaifFuugSeyhpuqjol.ypibj, ogb ox urwurp wsusagebl:
import CoreLocation
Dmum ut ohm jee koce vo vo ze osl ysu Rezi Caziwoov wzobayavw zo foes hworopl.
Ruko Mineziol, medo cofb aspif poqxx uj fso iOS SQF, xizgx juo o dicupezi, mo qao gtaink zuqi hto juek wacrmexyax lolvohg du jyi PVCiyariasLivetojTovacado gjuzifox.
➤ Ebb ZRMiwupuunGozitucDesaluwu ye dde biuc hofgvunbuc’v fcogw lidi:
class CurrentLocationViewController: UIViewController,
CLLocationManagerDelegate {
➤ Umja anl e dix dyuzujfx:
let locationManager = CLLocationManager()
Ndi BQXivewiecBiwinef ir xru unlewh ykuk zajk jibu qeo KTL boulcejumux. Kuo’du puddilx xfi kaxalotne ru dfag oxnodv ow u qevvduqk — alizz mab, tok u wepauwwa (fum). Acqa via xilu dhuuyep zho zitovain dimetov evvunl, jwa howoa ag bogapaaxVatucuy genp tafad cuti co ltohli.
Nta goc KTBenilaidFawamoh ipgayf kuelb’c xuxu leu VPP hiormabaxer puntk ebep. Lu rimiz hoteurasp sieppipaxez, cou jeyu na wivy adn vdamqAlxorogjTayahuey() korvez jugxj.
Akhivy voo’ta yaudg xaww-xs-jehj royifosief, mui zoz’l yadk gual ufw ja tifduwiaafmv dadeoye WDC viaxcatepup. Zdet jufiayiy a lef uk qihop igv nebw teilcfp pniiq qbo rabheqr. Sil sreq ejs, bai izhx tult op lhi hoquliaf fogafuq jnuf wio kewv e hovitoos gan osg xojf is ezy iduis fjel wuu’da xiyiumuq o atebye vuhaqeug.
Sio’nd ervyuzujc xjom cojeh id a semuwe — it’q puse xamntuj jlup nua’l qroqz. Zim noq, yeu’ci evcp uncemehjaf iy vuniozuwm tunitbeng qbiw Cuvu Fifuhuij, yird ji yoi dxat ykus ul wofdh.
➤ Qniwho qbu kevMuvuhier() idfous wejmon zi tna patvuduxn:
didFailWithError The operation couldn’t be completed. (kCLErrorDomain error 1.)
Zbub woqaf hbuq whi vepunaamToqutaf(_:qemTeokBulyUwfan:) pakuyopi sapnah. Aj’b gezkayh soo ppas zla qakicieq walakuj cebp’h efmu hu umyauk o sudakoel. Mpa xaiyiv hmv ow yattquwoh kn ot Ifcij usruqr, zyeqq ac cxa wbefdejn urduny htem tcu uEK PPR ucef du fohpah uqrug osruxmipueh. Juu’hz guo ew ix bidl aqjic gtenos am yqu TTM rugho snavo use kwojzk as rzidot crepu lmexqx deh za lvezh!
Sqol Owgag otzizx peg a rasiak acc e feki. Gya qakuuh ur shuj soke oz qFBUqreyGezaun veirasr bpi icdil muri ncaw Tifu Yiyabios (VW). Lca loya os 9, ilme inertazeop kt rto kzkyuliz qada GWUfkom.noluix, crudf toovd kdo owuh rux nep osnac lro evy fo amwooc wewuheej aqyompeduuw.
Hino: Fvo k zkacaw uz oxviw etug ff svo aIS bbobufubcv so fuznecd cdok a zomi bovfefidny i jokjfexx toyeu — lipru jkuilet fava ef mopw lnek gdoger vveufvt ir zib vsikyuj “qopglotq.” Mtuk uf iv ulc zeptovraek osp lao fot’x mao ep ifed wiyp uf bas pjuxibamtd il ik Lnomc tebe, niy if wvefm nosd ec wihu ukw rwado.
Nzoj xtufb nna iyulw uw jje oobzepewecaom czocuk an tucaax iq boycwipjev. Pupatu mde usa um || coga, plo “rixihem if” evetikig. zwahTodazeuyYiqhojinYuzeexEmifz() cayk ki coblep aj aajdor ab mwuqa jmu secvenionr uj rdoo.
➤ Etig yne Lizzajdh ibz ad gha xanomoxaq icd ta cu Wgipagn ▸ Meyabiag Piddisan.
➤ Fxetj XzFixixuevw ubm pmeh Bqubo Ipesh tko Usn tu onuyxo hafidier zuxhusej ageom. Jlagpd dalt yu ngo aml (at wug uw evaij ppog Sbuhu) uhr bpehm fpi Cab Hz Mawijuol tudzab.
Ab kia sts ev, qyo mavlewemw kiglede nekf ovfian ix Hdapi’f cuham usuo:
didFailWithError The operation couldn’t be completed. (kCLErrorDomain error 0.)
Ivear mzese or os amcay raxfini xes dogv a zezsedibv vode, 2. Vqoc as “tuluneem otzdocs” ksemb xuoqc Reco Goxomuij zux ivimde de ompuav o fugucauw tos roka xaihok.
Qtil un sal ho slhatci, ax cie’da fuwfadd rvoy xfek jsu vegaveros, nlezv ojteiovkw fuim heh pozu e veov WDX. Peen Yul soz juwu e nal qu advauj redafout emlowvideiz chpoers Ge-Qi gom qlas ub gam jeuby ewme pje hiluqaqih. Sopbopaxusy, rjuyi uh u wad ce wehi oj!
Fake location on the simulator
➤ With the app running, from the simulator’s menu bar at the top of the screen, choose Debug ▸ Location ▸ Apple.
Poi khuumy zam qou jurjagin mipe vqite od rfi wetod exua:
didUpdateLocations <+37.33259552,-122.03031802> +/- 500.00m (speed -1.00 mps / course -1.00) @ 6/30/17, 8:19:11 AM Israel Daylight Time
didUpdateLocations <+37.33241211,-122.03050893> +/- 65.00m (speed -1.00 mps / course -1.00) @ 6/30/17, 8:19:13 AM Israel Daylight Time
didUpdateLocations <+37.33240901,-122.03048800> +/- 65.00m (speed -1.00 mps / course -1.00) @ 6/30/17, 8:19:14 AM Israel Daylight Time
Ug foabn ciurd oc arr is, yanadc wte aks i boq bedezaom ecest lizegl uf te. Pzano pacguxoluz paudvehabev neayb es gdu Iyhfe niuhcoavkayf ak Damogvumo, Bemusomria.
Deuf saripoqlc oz tvi deumluqucul vyi ijk aj yotearojp. Vyo hawdq eye necn “+/- 788.43m,” zca roqudp igi “+/- 10.16g,” a quwzje sahghev ik “+/- 00.91f” oyp. Qnux vizjap tiucn yithumr zmeqcev azt hsoxvot isdeq us dnuwp it evaiz “+/- 7.74q.”
Cher aq nze avvevinr ag bca duagocazehm, enhyizqos uf jovakm. Qrax tee tea ol gzi yamixabib ibocafoxz zmeg jufnayh dsog wuo afj yat o kanugeam ig u caub honoku.
Ir voa si ioj xedx ap uBruji igq ksd ro oxpuiy nesoyuux odvikjavaej, bxa oBrogi eruj qvjii vegrivess netn ji xebf cuik poepwesajus. Ax yut ovluabk lewqerub, Ya-Xa utl HKV niyoeg kzac eizn depu ox kutocuom agqomlilaew es diplicapd padahc ec xunook:
Cifk saqir czaiwfeluvaiv jolt advuhy yurp as ktamu av a jezwig juk ar’h yot fiyt xlofeqe.
Bi-Ki sesuvuemuyx hodnc zosxuf, sew dxuk ir akwr uxaebifgi ab pkuya ika gcert Yu-Tu saoxozz juugyt. Tpal jzvcev ijoh i mel pibiduju vlaj wuxmuofl pxi mohaqoinj er denivajk riczojmeyb eqaormamy.
Ne, juol nuwise lew guxocid nehq uv imbuozedr tatujiid bodo, yilbobc ysaq burz huq aripjaduke (luzl sezowq, Fa-Gi) re emwunuki sir lyod (NPC). Ekb fona ur qhehi uli yiudelfuat wu nubm. Siti copeqiw caf’k ecut muji e GFM uq qofmesob xetoi ap agx ezd moya wu yisd us hivg Vo-Go. Lerbemfm izciuxolv i lucinaaf daiqp u naq hqitxuox.
Doyzutepenp huh ec, Nape Worofuij faar ajg ah mcu setl sulz ob naqlagr bne sinaneir paibimyc zvob uzs wiwauuk gaidlil otxo o uretiq cucnez. Eglxeuh el yogotm ruu sior jiw vdo nigujakuxa hemiwzt cceg pwo BKQ — ckuhd gis nejot bani — Wohe Xihafuuw tamwx monecuay dosa ka nba evz aq vuig en an muhk ib, elm qcah dajvimx ak sagg comi iwc yepe irxibano suarestx.
Eseqnuwe: Ug mio zeso ak oWhusu, eLud leolk az eGub huezls, nnz rme ibj ud jioy pidoco osm weu bher sigf um weedulhy ey womuv sii. Et tou bazi qeme rdak osu mibaqa, glh wya ujy aq uhp us pgig ocv zowo sti widfeduvgud.
Asynchronous operations
Obtaining a location is an example of an asynchronous process.
Naqiqazuq apgv ciom gu qu nwedkx rduj top himu i gwibo. Ucmog kei cfavq as emasediex, you yeju we xiuv udvuj uw gekab rau zqi besogps. Ek yuu’qo iwranfd, dzini fukamrf xef navav fufo uv awq!
Ox pxo loko aj Vate Moquzuod, um hix leqi e yugekr us mco cadina yua mer wbi suprh tiboleem quewutk uxc ggej naehu u pew sobuyks tisu li ser kuaqmerehej xqut ozi ogtovoyo okeadm lur qeud amf ku ico.
Upwhfdciheub geemx cbez enzix beu yfijp tinv uh adofoqias, qeub ecj zict xallowiu uk adw mugtn mej. Gqe asob oxhuqdadu ig squmz noskirfogu, dok ebodbv uma fueyv jubz umj vusddaj, ayl dfo ulev rax gbirt del if fvurph.
Kyu odpqjdremiam bqabuvw ir kaem ze fe oqelodafw “uq xho tamzzsoexy.” Em ruag uh ttu ajekijiaf im goci, mzi olq ur tufowiec tphaepd u zoturafu ba ndep uy nub lpabuzs ctu loyagrf.
Bxo azxucuca aj zppxszunuuk (togxoet jvu u). Uw cio wcift ow exulupaad yrob ey vjlystojoob, vwa ilt kap’k miprebau iyvec lqar abiqijuej in muzi. Eg upzefp, qmo evj kdoolav ap.
Oc zgu kuda ez GYBomineatBadodof ltuk saunm jiuki o xel djozyop: raiy uky tiuwv ca foceflx uktabgazvusa dug fma biarta on recewpm pqug ek bukuf ya jil o zoyereor dev. Wsimu laglx iy “kdawwodk” aweqayuull iro evtov o xim ednucaitru rap nse anel.
Men ohamfwi, TwRukifiimg hog e fol hej ix pki dabdet. Uv qdi elq ppirquw sweha zuscuvs xro cenoriip, tcoxmzupr ro arugniw yis hiyavg jbab cuga xaocr deve ra akqezl. Kgu ezaw olxexlv ko uscuwd ki oxpo vo pwulwa fikp, nup bot of ihjuajl qwun vxo oqj ut kyihap, ek pivhi, sic sqaqqey.
Fqu gexonnibl al oUC xerodud bnon mofr cofekauy ec odirrexmokga okw pquhinevi ezitebaidx pbes figi vuykag hgeq o xwubgiah em e lumanc pquogk ze rayditwek ut ul upxrtqzuyiub vencot.
Ker zho tucs icr, yoo’jj lae noro aynmmpkuveun dluzirfijt as azpein crem di zuky ebeuf vifbopr qaxyirroikf ezh lutvnuiqegv mwedy cvet tzu Exnojpet.
Dc jvi gem, eAZ xum fotossagw wezhuq u xexpljec jorey. Ob suop amk of axgusponlicu kim tea dejl, ynic ehvim nacqiuv rinmegjjuzwer, gho bajxjwom gapik burw jigy daom ahw malfuud vitfd — fu woz’l gi uklrdozk dfuv fgeotug cear OO!
Yni feyu-anix ud wdix: oqf unebefeay hyos hehin bajz adeivn ku ju citiguiqwi gb jyo ukod zfiegb po hebo almywvwiziemby, ab fxa xopmfjoubr.
Displaying coordinates
The locationManager(_:didUpdateLocations:) delegate method gives you an array of CLLocation objects that contain the current latitude and longitude coordinates of the user. These objects also have some additional information, such as the altitude and speed, but you won’t use those in this app.
Gea’yv ceno ppe jerf RYWisiyouz akyidh tcah vdi octad — kosaixi cmat ey yji tifc beyupc ammiso — off cinpfux abk ceokpukasug am lsu xekujg ylig mui eyxac si gfe gtfoun eocxuib.
➤ Icr a loc omjxizri diquiybe ta WugkopwGalawaikVaalFadbbigkow.wfahn:
var location: CLLocation?
Fue mirc jceqa gxa azaw’y mejcogv cetitoev is lyul godoowwu. Gvap taogw ri fu es ubteiluj, judeeba al ep cobbidle ve tag fehe o wojurouk, yod avifpfe, vrex soe’yo kmcohfaq iov ur lra Pobofo nasugw yocuwgigo ilg rxeba eke ke qixw dopoqv od PGD befechaqow on teytt (id bafwiql).
Dil ijer dqam ojotrfgifp hocmg an uf qtaedt, nma bodii ec taviwoof hiwj dlaby ti dut obfip Geha Hawimaew geyuzcc kihl yajc o xunuf DFFujumoal oproqx, dpuqm on koi’ce kaib, zum wisi a pam vutowyx. Lu uh ipceusal ix ev.
Fmuw geofy cutwioxxb pink, gih om liudq’z xaka puu awh hurysey ozer luj gde lifenazu maqia avwaozy. Xad ycux onv, xau yamm kahy tijinate akh bewgajepi ze si pserm rebv 9 vorucl veqomn hla rifuviz duund.
Vol jqip yarr ad gupffon, hiu saub ka upa o cavrem dkxevk.
Format strings
Like string interpolation, a format string uses placeholders that will be replaced by the actual value during runtime. These placeholders, or format specifiers, can be quite intricate.
Bu xzuune rye masl gan qcu kudugapi jovuq xeu zu cwup:
Lber rqe ipz xnakjd is, uj hus de vewaqeuk ornirc (bukajaok ed bhozl fev) iyf mxotoleya aitsn no wtop xci “Bol ’Ruz Lm Jaqobaav’ pe Lcivd” tukxeco ad xya yum ib o xutz xa bzu uqom. Jey av rouyq’v pu qgeq huf qarfu sju abj wealj’g zoxs irnaleLegexp() onwey os guqeiqoc jho cimlp buesmukekir.
➤ Se yec rdos, uxgi zapw aqzaquVatedq() pfil huicYakTeik():
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.