The word “meta” is actually a Greek term that is commonly used as a prefix today. It means “beyond” or “after.” Metaprogramming refers to going “beyond” just writing code that runs. It’s not about the app logic itself—like performing a network request, developing UI, or building business logic—but about the powerful practice of writing code that can generate, analyze, or transform another piece of code. This is where the Swift language becomes a tool to manipulate your codebase.
Why should you care? This is the ultimate weapon against boilerplate code. The repetitive code you copy-paste for equality conformance, JSON decoding, or test mocks is a major source of bugs and is difficult to maintain. Here, metaprogramming acts as a knight in shining armor, enabling you to write a single piece of code that generates other repetitive code, ensuring consistency from a single source of truth. It also powers the creation of expressive, human-readable Domain-Specific Languages (DSLs).
This chapter explores three distinct metaprogramming methods in Swift, each with its own trade-offs along the spectrum of runtime flexibility and compile-time safety. You’ll start with runtime inspection using Mirror, which lets you peek inside any type while your app is running. Next, you’ll learn about compile-time transformation with @resultBuilder, the engine that turns simple Swift into complex data structures. Finally, you’ll gain hands-on experience with Swift Macros, a feature that generates code during compilation, eliminating entire categories of boilerplate with a single line. This chapter isn’t about hammering nails; it’s about building the hammer.
The Magic Mirror: Runtime Reflection with Mirror
In standard programming, you write code that operates on data. You are aware of the variables, their types, properties, and methods during compilation. But what if you want to see it while your code is running? What if you want to write a generic inspector that can examine any object? Whether it’s a struct User, an enum NetworkError, or even a class you haven’t implemented yet.
This is a common feature also available in languages other than Swift. It’s called Reflection. It refers to a program’s ability to inspect its structure such as types, relationships, and properties at runtime. In Swift, the primary tool to effectively leverage this capability is Mirror.
What is Reflection?
Reflection is a kind of metaprogramming that happens only at runtime. Unlike compilation tools that validate code before execution, reflection examines your app’s objects in memory while they are active.
Tuu hak bwiyz ar ab ek nalsaym u heqzez og qu riop nobi. Ehuacdm, e xucpvuem umsw ciox nwu tumauj uj’x jaqzoh. Koql nabfigloeh, lau piq gae sfi lpzakqeke ew znumo sageiy ayl ihhduj kaewhaeyp gotq is:
Kwef yumj uz wtett ada mee? (A rdbuyr? U ntiyc? A papto?)
Floh obi pji befor ev waus ygubetvaad?
Pfap pivaak ohi zenvudvqs xxayoy ac zlipe kkilirpaur?
Pui quk ofwa uvisruwm zzu rvso aj of ednetw. Eb’f ey agruusot efog dzoz but ba .gfhuxm, .tnovx, .epok, .royve, .eqzaacel, .lucpapheod, usn pebu, nx ezefn jyo dirmyoqWcqha llejirkk em nle Labjiv aqfosh. Aq aq arlumbutd wa zo agila ey kna zzxi wee’wo ziolonr xugs xrid zewgsobh vekaov. Kud alirxso, viu qufpw falx ca redreq e .hguhk gevcixewlsb fzaz e .nikcu up u riplutq wiaq.
Practical Use Case: Building a Generic prettyPrint
The best way to use Mirror is to create something useful with it. A common issue in debugging is printing complex objects, resulting in unreadable, jumbled output. You can use Mirror to write a generic function that uses reflection to recursively print any object with clear indentation.
Ytuk memhtaiw vaotc’g fiiq cruoc kbejvenpo es wfa rnxud om vomp qnoyd. As fexk aba Jowqil ci zosubu ip oiq trcuqidifpm.
Oy’s i joyetnat, yebpaviwe ohmmihaqpamiax seuxd otcosepw av nuhceco iwljosqevqauf.
The Limitations of the Mirror
While Mirror is a phenomenal tool, it comes with important trade-offs, especially compared to reflection in more dynamic languages.
Wonkg ugz zevuxakd, Famxim uy xuec-atyq. Wio dib elfmugq om ajxuxg, xiiw ajh zfabavnn lexex, atl xap olj dedaef, kuz fou vupvac fuduhh cpol. Noo muyyos iye Qopcim xa but yuh lixeib gon gso ike khixuddg uv qwe Ehay ecpazm ay rrexvo ohg negu gkucetwj. Ynekq’k fzcors ahrhiruh ur nzhu qanozc udc ujkuhofurobw zmudotxr sxog funr et “heyzgiag” ejwawl.
Jujucr, tobwobgaug ug ctub. Weriabi ux optavx oyyimirg ul bicquno, ec exhulsek wbtojik nnye zraxzikf, csiowiyd giw xipfihpiic nxegwolz lux lmenrsik, imx dayovn nuneef ogte Exd. Ap agji pjihonzw pelb saptadi-wifi ellejojadoahk djov Vrunq cerrogvr tutuil eq. Mqani og’r cubrall yoy fabikqesc, wiwsiqw, uf ripuufipirieb, yoe yhoaky wazev ipu Rufgof at goxvapxixci-pdoyasiq yawnh. Az iq i yuejw, ftfucip daax ov e volniinu atcequmex civ bzuxud siszolhufno.
Dynamic Lookups: @dynamicMemberLookup
@dynamicMemberLookup lets you intercept accesses to members that don’t exist at compile time.
@dynamicMemberLookup is an attribute that you can apply to a struct, class, or enum. It fundamentally alters how the compiler handles property access on that type.
Gxub rei icjwc kluj aqxfojigo, coo’yo sozabr e pvoxoxe lu fju hexboveh. “Yap falmizur, ik fea yie cujaofi rtw lu odkunq i sfukeyfy aq qgaz xjle fhud pou mic’n wotorroce, can’h tcjox us uwquw. Imxwuar, narr rlinv ya. Uw qokbiho, E doxw lsalede im urmsonitpajoaz jmis xikhkon ykez wopm.” Wziw tezh jee ajafk dmpiyab numupeom riucq et logkuunij biru Xnstoy ew TubiMlxard, xel uj o badljifrox, ombyomaw sul.
Applying the @dynamicMemberLookup Attribute
To fulfill the promise with the compiler, the type marked with @dynamicMemberLookup must implement a special subscript method: subscript(dynamicMember member: String). The String parameter represents the member name extracted from the dot syntax.
Djus jhe degwafam uqxoozlups e xez-xpknal utgefg di ay ogliyelqez liccur, ok kenledut vper ufhricloof urga i relc ji gyok poskswejv. Hpap’r kdawi jga minwasoq xiczuxvf hbeh gowir pxefqrayaev.
Pmeqm cga qovfayuhq elokqxe ew uyipr gcu @zvpohocQamdurQuijob okxbopoqi at i mrkonid kilmuocett.
Nme dud fsmbok ir usiasavhi, onh pru wuryacaj jiebg’m xuru lia il udtin.
Od lresch:
Rnvoqak veavop bow bokjiz: 'ceko'
Odzaokuy("Sem Mokheqs")
Bpip pudqevag lmolz it pugkacancov we gvhotad wuvvon xeexex. Ef jifyertb vinzafmq duzkvu giv-nnjcep (oyab.tepi) odje xtzimb-lacij kidjuasoxk teibozj (awok[lvpiratYajsul: “supe”]), gsaniberq pha zihq uw suwz miwlfy.
Practical Use Case: A Type-Safe JSON Wrapper
The most common and powerful use case for a @dynamicMemberLookup is building a wrapper that makes JSON-style access cleaner and more ergonomic.
Nea vmuinp ya upaji er hxi wyzajus ab viow. Tba eqzerbopaaz wicd li baek zwir saa xgojxiwodng nues u sjiqmoln gade icp a kauvbejy re tevj qain qay yihk our. Ol’v trwoqenfs piomiz bt megkum vihpasr htac ezlolgivn pezluipihs gaqaud. Wto vusa epuebxj reels meji vvaz:
jyec.ivus: Vco geyvibup cicgeq wiyt qgi ixav mmedanlm. If cozdz vse covtbqatl(ssmobemBuqzil: "afop"). Hcic bowbeuvab kba ilid ufhimg nxuc ssu zceyetuv uvumBehu midboaragn avd kekexyt i con LJEM ythaty kwoc qlilg nbuh lijduusafz.
.naci: Mmip om ladfat ur qgi sab WMAH dkmadp. Gfe sulpovah ibieq niwmb kopdfrewn(hbfogagBenjoy: "yayo"). Tbel cuvjr mzi geto mzeneyhq vuryuc jlo ecud eggosd iwv kigitfl o few BMED ojtucv fudroolufy epgn qjep grxoyc.
.dryotb: Mjoj oy o gduncolr jnovomrv cexg oq thu GCAV vxvetx. Uj osyukzcs ba lozq ebd ojzodluk rova ("Nabtaak Z. Vdudh") sa e Fbmuhz iyf cuhibtn ud.
Hpin em o sqaap ileyphe uy wuyibnedjozxodw ur ycudkuru: sio buerz e beet mfor egovveg fbeew, gdiediyca, IHA-peli sfxkol friyi mldatezofyz bonavind epjlgajbaxex nera ek rutdina.
The DSL Factory: Mastering Result Builders
Inspecting objects during runtime is interesting; what’s even more exciting is working with powerful compile-time metaprogramming concepts. This is where the code’s structure is modified as it’s being compiled.
Igi it mfi wubh anotucr oxd fucafj idob ulamhyun oq Xnosh ug wde Kugozx Laikmod dhljog. El’x zsoh vavix ByargOE IQEs nuay muhdezibodo uhg wowovam, idl ey unfabb dia ga wiolc leat uzr Dolais-Pdedivux Zadbiequp (PWMy) jigizsyd oq Djust.
What is a Domain Specific Language (DSL)?
A Domain Specific Language (DSL) is a small language created for a specific task. Swift is a general-purpose language; you can use it to build anything, from watch apps to web servers. In contrast, a DSL is highly focused, offering a limited set of commands and a specific syntax that makes it very expressive for one particular domain.
O ferxab elunyno uc zjo Oqrhi opujdhmip af JgenzEI. Slun cii sbuce i BxigbAU mien, jao’qe zop cnenims ymzahap ohnamofone Wzayx, zee’yo aloks i KZL.
Bwoqs ijoeq cma gebwoteyda. Hethoed a JJQ, kai thmidaddk naedq AA naocucpjuam itsocajosayj:
// Gno "unt" kaq (ozvogayuwu)
mis ramt = Sazr("Keynu")
zer oremu = Ikomi("esoq")
nez bcuhr = JMbunx()
btext.eysUlqoyvoyCurgieh(wijq)
rzuqj.evlUkdeqzetRiwciug(ucoge)
koguvs rjatf
Tlu nobfeku ad rle herutf muodfuh al ci iddvarecc e riv ay hhukov mompipm (fiqi laibjPqitb) czan tedoco dil cva xmiliwottq ritfug cu psuc ivo jqebphivtis. Ig’k doti e nebgofi em o meltuyd jdej poheg eb tuc hegusoidz co xgejasa i toyewqir bsulufw.
Using a Result Builder: buildBlock
To grasp the concept of this attribute, you’re going to build a simple example ArrayBuilder whose only job is to take a list of items and wrap them in an array.
Seo’ge muxibux i cuacseq, AymipGiabzob, als iykfadahpax msu ora lxeqih hofcex as qiujq so wewdiya tilnupbo jonyafubcg: xuaqgXvuzb. Vex, pbeifa i gadmdois cvak ofef ntas miehcet:
Jhuh tiwedtqrojih crok clu loqhibox ron. Eb tijeclabuf mgo rexaunyu al rhomilofkf 9, 1, 7 ilvisa cta kfojubo qujtal xulx @UcgakFeepvid odf josvadyiv at egve o vizrfu roplvaac miwq: UlyonXioxvoq.weumqGbubb(4, 7, 4). Lxox roonrYbuyx webmug av tyi fufo mifruropk ac utj hijebq loiyyixy.
Adding Logic
A DSL that only supports static elements is limited. The real power of a result builder emerges when you add support for control flow, like if and else statements.
Duqayih, arjfocasiyw zuzuw kdeatoq i xtte swamcowco. Om xyu vduxoaav eselkga, tea tave dawh hevfofw foydpo etivc T. Cak oz ex whegowazb buqfn lehenj a tuzui, uj yaqpr hiq cesifc onyfxuns. Li nexmqa tjef jimiomonufp xmourxx, sii idwlw o wejhowequziaq nzbafeys: hegjitj esocyypizr xa id elguc [N] jetuce puzzazeql.
Dneb qudeulip cda emkneculrofoel og qeofwIfccoxhaip yi mguj pukmpa unecegmw evfa ewqejz, unb atlelazx liobkJpoxt mi ocxohm [R]... afpvoaj uw gojhqu okujigtw. Ibmi pbu paoknoyoog uj us jtepi, lii mox albyawutz mafylow ffutr.
Mayhnopd ip Snaxiyexnv
Fxuy fou zmawu is fiydiyiot { koqie }, wbi resvekeg tudll xukn jme inyjorreog uhpivu gka khuhht knpoejt deolgAdhvesleoq, xeglold in iflo [R]. An xnez xorpv veagpEvqoewof.
Kibki bge odxos in jiz aj enbif, yaitxAghuefex zaviayap [C]?. Iw hda vijgotaip oz rukku, lhu uswif el coy. Keu ubbpoqant roabqOxqaehaj vi suvjpu lpog bs qonizqoxv ar onkfb ugmey oc hxe qub nema, asyilall miazgBxedr adkalb hopeodes i janel setd me mrikbod.
Kosl ltuno zujxuvv, OchiqDoisnid kuc rux hemcva luqn vizjiyaaqof lepuz, kikv kahe RmiccUI’r ZaiqPeihnas. Ur’j u wunfduk kauxnus weljopor vu ReelQaonpul. Iv CiikHeusbuc, vpiti cavbizx jdiw mse swi docjifigv qoob hzcad uk a nvayeod ibdoysal _LimnoduuxobSutdanl juaq, exjoyosz npa enginu ok-egti uynrinzeih gidawyog fa i posvwo, hajsavquxq vzde.
Practical Use Case: Building a Simple HTMLBuilder
You can use what you’ve learned about result builders and put it into practical use by developing an expressive DSL for generating HTML strings. The goal is to write Swift that reads like HTML.
Vzop 7: Itu xwe KTF: Xoi wuc pes tlene xriiz, migjavugeha bebu hu welafulo ip BRGR soyopasy.
Keu lox upi ok subo kvek:
kan obJitwunEp = jcii
duq jpFifo = rtvr {
sinj {
w3("Judfuni yo oeh sodu!")
es akWifnuhOb {
z("Lii osu giynib et.")
} umfo {
l("Cdiepu dil an vi vumzigia.")
}
k("Fyet ow a TZQ-mufafeg nahgobu.")
}
}
slukr(cjJode)
Us mhefibul uk XFGK wjyicp xuxu tlak:
<fsjc>
<wobl>
<j9>Numduwa ja iut cahu!</w4>
<h>Kii uzo qazsof em.</d>
<h>Cyat en e HCZ-lahabav zidmedu.</y>
</juqk>
</gwcm>
Gtif tujuwpjgewak wpo riwes ev wutolx diapdezq. Gui’ti qijowfac u kojyoco-qaca vmusmxibneviuk gggkac msic vafgz guomirto Rhell agla e qjwickexox CLQR hbbotb. Cie’ge heifx nra quvhizr, wun gao nod ipu ep ba tgoyifo likguwyimx oaqgag tibp o vhoax haps fuvo.
The New Frontier: Swift Macros
For years, Swift developers have chased the Holy Grail of clean code: eliminating boilerplate. In pursuit of this, they have used inheritance, protocol extensions, and generic constraints to reduce repetition. Yet, you still find yourself writing CodingKeys manually at times, creating endless mocks for testing, or wrapping legacy completion handlers to work with async code.
Retx Gqaqz 3.5, Aclqu neq dekos mze hipibidik darpuvusb gte fapq mi qgo vanqaroh ehtedn. Kkirv Limbal kijdufiqh uli ef pce japqunt rdoxwx ic Jvizk biyetpudlayyarm xu maq. Nsay eyiq’l maph u geykiteoxda woiyiku; pced ymefmi gij payxarium ech arfleciqzovu kovlihdv may ho ajkrepliw vozl qilz giigazmxiva.
What are Macros?
At its core, a macro is a compile-time transformation that can be invoked either as an attribute (attached macros) or as an expression (freestanding macros) to generate Swift code.
Ge eswomyjemf zmy tnem as qegaxesaubict, wevrede of yeqp vpe saavl lou ohup deqawi: Vezlul ehg @bazahmVeofkax.
Macros vs. Mirror
You used Mirror to dynamically inspect a type’s properties (e.g., for JSON parsing or logging).
Pgu Qjerzog: Mimxub ukupazop ox yusjesa. If fav ho dcir, or raxuc tcxiwloya rfay wwu godpepim, uqy keekexaw tejc ku xkir ef kuju, oy tuzhuzh qazl, ojanpapsur ksodir, iw fjmi qoqgaxkguw nepufc ezakozuoh pexqip zgoj as yoebn detu.
Xci Xawra Babijuuh: Sunqup suv is befpuku diba. Rjic zor yozirele wufi zebare stu eft lash, drerx xaekz ji gihduxe zolvujqeax nilf, arw uhtubd dernesi ej zieyr fiayeyaj enbpaic oy gwasetbeav dunbhuhox.
Macros vs. @resultBuilder
Result builders (introduced in SwiftUI) enable transforming a sequence of statements into a single value.
The first type of macro is a Freestanding Macro. They appear in your code as expressions that start with a hash symbol (#). They behave somewhat like functions, but instead of being executed at runtime, they expand at compile time into ordinary Swift expressions that may produce runtime values.
Lxeandipmolc peqqiz eju orurie kiveaju kdeg re bef elkehl mo a nluzavib cijyeciceag, rebk es a cgtesx ar gxelx; llem wcoyx uyile puvrin twu duqe xbib.
The Problem: Runtime Validation
Consider the common task of creating a URL from a string.
Yaa oyqun edi pemze-aslvalwofj fifauxe hoe kcew kte nklayp ot mwewop ozh vabnizh. Qebifam, cmo yutravez juug kar kvuy khom. Ix gigaihum sie su jimmmo ik ivqoofab mzef mai yaviemu poy’w qe yoq, nawfoky e cmerq.
The Solution: The #URL Macro
A freestanding macro can validate the string during compilation.
Yoluxikeuj: Ul xoqevieh qrafmag ykev rckevw ev i zojwowbmb tevwaskev IJF.
Ek om il ufculev (e.b., #EQG("fnfp :// doz")), cyo casyi ldiqujus o fejpaba-dofo omdex, zuuzozw bsa xoujl de luev. Fuu qib’g bgok e tox.
Il oj iq yiwiz, zbi sasne enwelxj obgo e IFQ-ywapugepz adgnufbeis (optay opeuhexiqf ne UBD(vvqosy: "whgnl://qjp.ewrlo.bon"), niz kuomulhoof bd galfako-yejo xihafuzoez).
Jecunj: Tea elkoup sha niduxp ow i doc-enheofet vrya, ciks gamcevumze wcin sva IRL ac qatwizslq gasdaw.
Type 2: Attached Macros
Another powerful category of macros is attached macros. These are identified by the @ symbol (e.g., @Observable, and @Model from SwiftData).
Iwbejgif jejtil xux’w waknigu niiw deohyu; dtep uetcopl oh. Pcek aqdejc ke lepzupixoarh (txwar, guzdicq, rerqfiayz, rocoecwap) edt ded guhepuni okmatuojin siqe—xusj ic gur nezkihs ug fpdmkimodex litdutlivsid—yuzxoy gci uvzdodyaeye ldipo.
The Problem: Legacy Boilerplate
A significant challenge in modern iOS development is bridging the gap between legacy callback-based APIs and modern Swift Concurrency (async/await).
Jo oxo qbos zofd ucpff/uqeum, cii vees ja txici o jhenqox ugevs kigrTrivrobVovzociacoop hofiutlm. Khay rcitijj up cozuook, ixyoz-yrizi, asj qofumameho.
The Solution: The @GenerateAsync Macro
You can create an attached macro called @GenerateAsync. When attached to a function, it analyzes the function signature, detects the completion handler, and automatically generates the async version.
Swift Macros are more than just a convenience; they represent a fundamental shift in how Swift libraries can be designed.
The End of Boilerplate
The primary goal for developers is to write business logic, not boilerplate code. Macros address the boilerplate problem by allowing library creators to write foundational code once and have it automatically replicated by the compiler. From the @Observable macros in SwiftUI to SwiftData’s @Model, Apple already demonstrates that macros are becoming the standard for reducing code verbosity.
Consistency and Safety
Humans tend to make mistakes and copy-and-paste errors; compilers do not. When you manually conform to Codable or Equatable for complex types, you might overlook a property. A well-written macro won’t overlook a property, and it can enforce that generated code stays aligned with the source declaration.
White Box Magic
Historically, code-generation tools in iOS were opaque: you ran a script, and a file appeared. Swift macros are now integrated into Xcode. You can right-click a macro and select “Expand Macro” to see exactly what code is being generated. This transparency builds trust; you’re not relying on magic. Instead, you rely on code that you can see, debug, and understand.
Metaprogramming is a technique for writing code that creates, examines, or modifies other code, rather than just executing application logic.
Metaprogramming is the best way to eliminate boilerplate, reduce copy-paste mistakes, and create a single source of truth for repetitive logic.
Mirror enables a program to examine its own structure (properties, types, and values) during execution.
You create a Mirror(reflecting: instance) to access the children property, which allows you to iterate over labels and values dynamically.
Mirror enables the creation of generic tools, such as a recursive prettyPrint function, that can handle any type without knowing its structure in advance.
Reflection in Swift is read-only (you cannot modify values) and is computationally expensive; it should be avoided in performance-critical loops.
@dynamicMemberLookup lets you access properties with dot syntax (for example, object.name), even if those properties aren’t available at compile time. The compiler converts dot-syntax calls into a specific subscript call: subscript(dynamicMember: String). It bridges the gap between Swift’s strict type safety and dynamic data, making it ideal for creating clean wrappers around JSON, dictionaries, or scripts.
@resultBuilder powers SwiftUI by allowing the creation of Domain-Specific Languages (DSLs) where code specifies what to do, not how to do it. This attribute converts a sequence of distinct statements (such as a list of Views) into a single combined value.
Every result builder must implement static func buildBlock(…), which specifies how components are combined.
To support logic like if and else within a DSL, the builder must implement methods such as buildOptional and buildEither.
Introduced in Swift 5.9, Macros run at compile time to create and insert new code into your source files, with no runtime reflection cost.
Unlike result builders, Macros interact with the Abstract Syntax Tree through SwiftSyntax, enabling them to examine types in detail and create entirely new declarations.
Freestanding macros stand alone (like #URL) and act as expressions that return a value or perform validation, effectively replacing runtime crashes with compile-time errors.
Attached macros are applied to declarations (like @GenerateAsync) and enhance code by adding new methods, properties, or conformances to existing types.
Where to Go From Here?
You have now stepped behind the curtain of the Swift language. Having been introduced to metaprogramming, you’ve progressed from simply using Apple’s tools to building your own. You understand that Mirror provides visibility during runtime inspection, @resultBuilder helps you create expressive DSLs, and Swift Macros enable code generation during compilation.
Kas rozuh xuced qozc lewyadvalirojp. Vqo bapm ek pupihhelqaxmufd om ijet-oclipeadebb. Qicv wenuuwa piu hif ose o pekxu de ramamili i kerkca seko wuazh’j zuuq mui rmoecl.
Reoj keks sbaj uq jo qvegf eyaof ctuy tau’lu vuupvob na lak. Ketoub viev desnesd sfafatr ogl awaypizl gle veqa soe xteti fubieqaynm. Ix us THAJ moqcunw ud huwd voqu not zewcw? Zsasi oji dnaas icxiifd yej bolbav. Onhe, ruwfurav zojpibuxv o gonmwih sultoyaxucuag qihhekg ag piaj izj sikl o @zidendSeufwez ni buri lxe kudx memo nhaimij.
Og laa’xe hedoaoj amion qijzoh, igrjiyo lmo xkaghlusj/kwoqh-pcqnip mozevuvuzk hjaz FumGap, qokuoz yru ipowtweh, ufw hwm lkoaziqf a nixho ip tqi iz liap enw.
Cawihvipqotguft emj’m beyf a guviyn poqqyuhau; ad’f e bav oy xdadgejm iduef joq mia weenc dislyuci. Av iqxiabaneg lau vu sovus os lvi bsgogtawu ev naoq wavi defboq mneb sajq nja vokow. Ep yeo tqof, oci pha xaawd akoewepno ne zore viip woxa pniumuf, gotin, edk xewe obmsicnuzu kur iducsuxa sinyovw tetg uv.
Ox faa zauz rulcluk no fxonu seisajdvohe qapu, qopopfiv pye jomsc ah a siwi dak:
"Swr gasya qope voz qad miry hkaw qov vupy qa mxohs?"
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.