All Episodes

July 14, 2026 20 mins
Explains that CoffeeScript is a compiled language designed to simplify JavaScript by removing verbose boilerplate like curly braces, semicolons, and explicit return statements. Through the perspective of characters named Agtron and Scruffy, the material demonstrates how the language uses significant whitespace and functional programming concepts to create more readable code. Key technical features covered include first-class functions, asynchronous callbacks, and array comprehensions, which allow developers to manipulate data without traditional loops. Additionally, the text provides practical examples for running programs in both web browsers and the Node.js environment. Ultimately, the source frames CoffeeScript as a tool for understanding the core elegance of JavaScript while mitigating its historical inconsistencies.

You can listen and download our episodes for free on more than 10 different platforms:
https://linktr.ee/cyber_security_summary

Get the Book now from Amazon:
https://www.amazon.com/CoffeeScript-Action-Patrick-Lee/dp/1617290629?&linkCode=ll2&tag=cvthunderx-20&linkId=f68bc1a0137c87a4442600f66f9dd4af&language=en_US&ref_=as_li_ss_tl

Discover our free courses in tech and cybersecurity, Start learning today:
https://linktr.ee/cybercode_academy
Listen
Watch
Mark as Played
Transcript

Episode Transcript

Available transcripts are automatically generated. Complete accuracy is not guaranteed.
Speaker 1 (00:00):
So you are staring at a screen, right, and it's
just a massive wall of text. We are talking about
over five hundred thousand lines of code.

Speaker 2 (00:07):
Oh yeah, an absolute monster.

Speaker 1 (00:09):
Of a program, right, It's the kind of code base
that just you know, haunts a developer's nightmares. Completely welcome
to today's deep dive. We are looking at Patrick Lee's
book Coffee Script in Action, and there is this brilliant
opening anecdote in.

Speaker 2 (00:26):
It, Yeah, the one with Agtron and Scruffy.

Speaker 1 (00:28):
Exactly. These two characters, Agtron and Scruffy are tasked with
figuring out a code base exactly that size, and it
is completely incomprehensible. Right, But it's not that the individual
commands are written in some alien language. It's that the
components are so deeply intertwined and just well buried under
so much boilerplate syntax you physically cannot follow the logic.

(00:50):
So today we are looking at the solution the book presents.
And you might assume this is just a hyper specific
look at a niche programming language that eventually just compiles
into JavaScript.

Speaker 2 (01:00):
Anyway, which it does.

Speaker 1 (01:01):
But right, but the real mission here is much bigger
for you as a listener, It is about discovering how
removing syntactic noise fundamentally changes how you think.

Speaker 2 (01:12):
Yeah, how you solve problems, and how you architect logic itself.

Speaker 1 (01:15):
Okay, let's unpack this. Why would someone bother learning a
language that just turns into another language anyway?

Speaker 2 (01:22):
Well, because that's the profound premise of the book, right, Yeah.
Simplifying the small things like I mean, the literal characters
you type to write a function, leads directly to simpler
big things.

Speaker 1 (01:32):
Like the overall architecture of a massive software project.

Speaker 2 (01:35):
Exactly. Coffee Script isn't about avoiding JavaScript, It's about tearing
it down to its studs so you can actually understand it.

Speaker 1 (01:42):
So, if JavaScript is the foundation of the modern web,
how did it get to a point where we need
an entirely separate language just to act as a translator
for it? I mean, why is it so noisy in
the first place.

Speaker 2 (01:53):
To understand that, you have to look at the incredibly
strange environment in which JavaScript was born, right the nineties, Yeah,
the nineteen nineties, during the early browser wars, and it
was created in about ten days.

Speaker 1 (02:04):
Wait ten days, ten days to build the language that
basically runs the Internet today.

Speaker 2 (02:09):
Ten days.

Speaker 1 (02:10):
Well, that explains a lot.

Speaker 2 (02:12):
It explains almost everything. Because of that insane, rushed timeline,
the creator had to make massive compromises. Right at the time.
Real programming in the eyes of computer science students, and
you know, game developers meant languages like C C plus plus.

Speaker 1 (02:29):
AH and Java heavy hitter.

Speaker 2 (02:31):
It's exactly if a language didn't have curly braces and semicolons,
it just wasn't taken seriously. So JavaScript was dressed up
in this rigid, classical C style syntax just to look professional.

Speaker 1 (02:43):
What's fascinating here is that beneath that disguise, JavaScript secretly
stole its core, beating heart mechanics from two completely different,
much less popular languages.

Speaker 2 (02:54):
Yes, it took its functional programming concepts from a language
called scheme, okay, and it took its dynamic object oriented
concept from a language called Self.

Speaker 1 (03:02):
Right. So Scheme is all about passing functions around like data,
and Self is all about fluid prototype based objects, and neither.

Speaker 2 (03:08):
Of those behave like Java, not at all. So you
have this bizarre Frankenstein situation. JavaScript looks one way like
a rigid classical language, but it mechanically acts in a
fluid dynamic way.

Speaker 1 (03:22):
It's forcing brilliant, flexible concepts into a very rigid, inappropriate syntax.
The book has this fascinating analogy for that haphazard evolution.
It compares JavaScript to the English language.

Speaker 2 (03:34):
Oh, I love this part.

Speaker 1 (03:36):
Right. When you step back and look at English, it
is completely riddled with contradictory rules and bizarre exceptions.

Speaker 2 (03:42):
The historical parallel is incredibly accurate. The book traces the
history of English to show how layered and messy it became.
You start with West Germanic tribes bringing their base dialect. Okay,
Then the Vikings arrive. They need to trade, so they
start speaking a broken, highly simple version of that Germanic
language just to get by.

Speaker 1 (04:03):
Makes sense.

Speaker 2 (04:03):
Then the Norman French conquered the area and they introduce
entirely new aristocratic vocabulary.

Speaker 1 (04:09):
Oh is that why we have completely different words for
the exact same animal, depending on whether it's a live
or dead.

Speaker 2 (04:14):
Precisely, the animal on the farm is a cow or
a pig, which comes from the Germanic roots spoken by
the commoners working the fields, right, But the meat served
on the dining table is beef or pork, coming from
the French words used by the nobility who are actually
eating it. Wow, So you have two different linguistic systems colliding,

(04:34):
and then, just to lock that chaos into place, the
Latin printing press arrives in England.

Speaker 1 (04:40):
Oh boy, Yeah.

Speaker 2 (04:41):
The people operating the presses didn't have the metal type
blocks for certain English sounds. For example, Old English use
a specific character called a thorn to represent the thie sound.

Speaker 1 (04:52):
But the printing presses didn't have a thorn.

Speaker 2 (04:54):
Exactly, So they just jammed a T and an H together,
permanently altering the spelling convey men of the language.

Speaker 1 (05:01):
So JavaScript is essentially modern English. Yes, it's the unavoidable
language of the web, meaning it's used by millions of
people who force it to evolve, often in very clumsy,
patch together ways. It's not a pure, mathematically planned system.
It's a living, breathing mess.

Speaker 2 (05:17):
Yes, and Coffee Script steps in as a deliberate, heavy
handed intervention in that evolution.

Speaker 1 (05:24):
Like a massive spring cleaning exactly.

Speaker 2 (05:26):
It tries to strip away all the fake se style syntax,
so those beautiful underlying ideas from scheme and self can
actually function the way that they were meant to.

Speaker 1 (05:36):
Well, let's talk about that spring cleaning because some of
the things coffee Script throws in the trash are foundational
to how people write code.

Speaker 2 (05:43):
Oh it gets rid of a lot, right, It.

Speaker 1 (05:44):
Gets rid of the var keyword, which stops you from
accidentally creating global variables. It entirely removes semicolons, which is huge.
It throws out return statements, so functions just naturally output
whatever their last line evaluates too. But the biggest shock
to the system it completely removes curly braces. You don't
use braces to mark the beginning and end of a

(06:06):
block of code anymore. You just use spaces. You literally
just hit the space bar.

Speaker 2 (06:10):
Wait, doesn't that make a five hundred thousand line code
based terrifyingly fragile?

Speaker 1 (06:15):
I mean, it sounds incredibly risky if you are used
to the safety net of brackets.

Speaker 2 (06:19):
But coffee Script relies on what is called the off
side rule or significant white space. You have to be
perfectly consistent.

Speaker 1 (06:26):
So if you decide to indent your logic with two spaces.

Speaker 2 (06:29):
It must always be two spaces. Okay, but think about
the massive trade off here. When you force consistent indentation,
you eliminate an enormous amount of visual clutter.

Speaker 1 (06:41):
Oh I see.

Speaker 2 (06:42):
You no longer have to scan through lines of closing
brackets trying to figure out where a function ends. The
physical shape of the code on your screen perfectly matches
the logical flow of the program.

Speaker 1 (06:53):
It forces you to write cleanly, or the program simply
won't run exactly. Let's look at how that visual clarity
actually changes problem solving, because the book gives an example
that I think anyone who has ever written line of
code will feel in their bones.

Speaker 2 (07:06):
Oh, checking if a variable exists?

Speaker 1 (07:08):
Yes, say you want to check if a variable named
pegasus is real before.

Speaker 2 (07:12):
You try to use it in standard JavaScript. That is
a surprisingly exhausting question to ask the computer. Oh, definitely,
because you know, JavaScript distinguishes between a variable that has
never been defined at all and a variable that has
been defined but it's currently empty. Right. So to safely
check if pegasus is real, you have to write and
brace yourself type of pegasus undefined and pegasus null.

Speaker 1 (07:34):
You have to write an entire sentence just to ask
is this box empty? Right?

Speaker 2 (07:38):
It's an unnecessary cognitive tax every single time you want
to verify data.

Speaker 1 (07:43):
So how does coffee script handle it?

Speaker 2 (07:45):
Coffee script introduces the existential operator you just type the
word pegasus, followed immediately by a question mark just pegasus,
Just pegasus. That one symbol handles all the underlying null
and undefined checks for you. It removes the friction between
your intent and the code.

Speaker 1 (08:02):
That intent is even clearer when you look at how
coffee Script handles repetitive tasks.

Speaker 2 (08:07):
Oh the loops.

Speaker 1 (08:08):
Yeah. In standard JavaScript, if you want to apply a
change to a list of items, you write a for loop.
You create a temporary counter variable, You check the lengths
of the list. You tell the counter to increment by
one every cycle.

Speaker 2 (08:19):
Right, you are micromanaging the computer's memory step by step.

Speaker 1 (08:22):
You are telling the computer how to do the job,
rather than telling it what you want exactly.

Speaker 2 (08:27):
The book uses a great example of a chocolate cake recipe.
Imagine you have an array of ingredients and you want
to double the recipe. Instead of building a mechanical loop,
coffee Script uses an array comprehension. You write it in
a single declarative line two x ingredient for ingredient and ingredients.

Speaker 1 (08:46):
Wow, it reads perfectly. It's just English.

Speaker 2 (08:49):
Because you aren't managing the iteration mechanics. You're simply declaring
the mathematical transformation you want, right, And this brings up
a crucial shift in how coffee script operates underneath. By
stripping away the mechanical steps, coffee script treats almost everything
as an expression.

Speaker 1 (09:05):
Here's where it gets really interesting. I want to focus
on that because the difference between an expression and a
statement seems to be the key to this whole language.

Speaker 2 (09:13):
It really is.

Speaker 1 (09:14):
In JavaScript, and if statement is a command, it says,
if this is true, execute this block of code. But
it doesn't actually turn into a value itself.

Speaker 2 (09:24):
Correct. A statement just executes an action. An expression, on
the other hand, evaluates to a concrete value.

Speaker 1 (09:30):
Okay.

Speaker 2 (09:31):
In coffee script, and if statement is an expression, a
loop is an expression.

Speaker 1 (09:36):
Wait really yeah?

Speaker 2 (09:37):
That means you can write an entire Eiffels block and
assign it directly to a variable. The logic flows cleanly
into a result, rather than just triggering disconnected actions in
the background.

Speaker 1 (09:47):
And that flow works because coffee script leans heavily into
those concepts stolen from scheme right now. Yeah, it elevates
functions to be first class citizens.

Speaker 2 (09:57):
Yes, a first class function means the language treats a
function no differently than a simple number or a string
of text.

Speaker 1 (10:04):
So you can save a function into a variable exactly.

Speaker 2 (10:06):
You can pass a function as an argument into another function.
A function can do some math and then return a
completely new, custom built function as its final answer.

Speaker 1 (10:14):
And because you are creating and passing functions around constantly,
writing out the ed letter word function every single time
becomes incredibly.

Speaker 2 (10:22):
Tedious, super tedious.

Speaker 1 (10:23):
So coffee script places the word with a simple symbol,
a dash in a greater than sign an arrow.

Speaker 2 (10:28):
You just point to the logic you want to execute.
And the reason this first class treatment is so vital
goes back to how the modern web operates. Browsers and
servers rely on event driven io and asynchronous callbacks.

Speaker 1 (10:42):
The book explains this using a pizza delivery analogy, which
honestly perfectly clarifies the mechanics of a synchronous code.

Speaker 2 (10:50):
It's a great analogy, right.

Speaker 1 (10:52):
If you use a blocking style of programming, it is
like walking into a pizza rhea, ordering a pizza and
standing perfectly still at the counter, staring at the oven
until it cooks. You are physically blocked from doing anything else.

Speaker 2 (11:05):
Your entire program pauses and waits for the server to respond.

Speaker 1 (11:09):
But using functions as callbacks changes that. It's like getting
the pizza delivered. Yeah, you call the pizzeria, place the order,
and give them your address, which in programming terms is
passing a callback function. Day. Then you hang up and
go about your day.

Speaker 2 (11:22):
You can clean the house, watch TV, run other code.

Speaker 1 (11:25):
Exactly when the pizza is finally ready, the delivery driver
rings your doorbell, the callback function is invoked. You never
wasted a single second waiting.

Speaker 2 (11:33):
That asynchronous model makes the web incredibly fast, but it
introduces a massive problem with state management.

Speaker 1 (11:41):
Oh, the closures.

Speaker 2 (11:42):
Right. If you are firing off functions into the future
to be executed whenever the pizza arrives, how do those
functions remember the data they are supposed to work with.
That is where closures come in.

Speaker 1 (11:53):
I hear the term closure thrown around constantly, but usually
buried in heavy computer science jargon. How does a closure
actually work? In plain English?

Speaker 2 (12:03):
To understand a closure, you just need to understand lexical scope.
Think of lexical scope simply as the exact physical place
where you typed the code on your screen.

Speaker 1 (12:13):
Okay, the physical location exactly.

Speaker 2 (12:15):
A closure happens when a function closes over or memorizes
the variables that were physically sitting next to it when it.

Speaker 1 (12:21):
Was written, so it traps its surrounding environment in a
little bubble.

Speaker 2 (12:25):
Yes, exactly. Let's say you write a callback function to
add up a total and write above that function you
declare a variable called total. Even if you pass that
callback function across your entire program to wait for a
database to load, it carries that specific total variable with
it inside a protective bubble.

Speaker 1 (12:42):
Oh wow.

Speaker 2 (12:42):
Now remember how cocky script removes the var keyword, yeah.

Speaker 1 (12:46):
The spring cleaning.

Speaker 2 (12:47):
Right, it automatically creates these safely isolated closures for you. Right.
It prevents one of the worst issues in JavaScript, global
scope collision.

Speaker 1 (12:56):
Oh, where a coworker writes a completely separate piece of
code accidentally memes their variable total as well, and suddenly
your math is completely ruined because you are both overriding
the same global number. Right.

Speaker 2 (13:08):
Coffee Script's implicit scoping locks your data safely inside the
function's bubble. So functions handle our actions, and closures protect
our simple data.

Speaker 1 (13:17):
But when you're building complex software, you eventually need to
organize that data into highly structured.

Speaker 2 (13:23):
Objects, which brings us to how coffee script handles object
oriented programming.

Speaker 1 (13:28):
On a purely visual level. It adopts YAML style syntax,
So if you wanted to find an object representing a
television show, you don't need a mess of brackets and
quotation marks.

Speaker 2 (13:38):
No, you just indent the properties.

Speaker 1 (13:40):
The book shows an array of Futurama characters fry Leela Bender,
and it is literally just a list of indented names.
Is incredibly easy to read.

Speaker 2 (13:51):
It is, but reading objects is the easy part. The
hard part is the most notorious headache in all of JavaScript.

Speaker 1 (13:58):
Oh boy, this key the dynamic receiver. It is responsible
for more crashed programs than almost anything else totally.

Speaker 2 (14:06):
To understand why this is so broken in JavaScript, you
have to look at how JavaScript decides what this refers to. Okay,
it does not care where the function was physically written.
JavaScript evaluates this at the exact moment the function runs,
based entirely on who pushed the start buck.

Speaker 1 (14:21):
So if I have a user object and inside it,
I write a method called update profile, I naturally expect
this to refer.

Speaker 2 (14:27):
To my user naturally, But if you take that update
profile method and pass it as a delayed callback to
a timer, you're run into trouble.

Speaker 1 (14:34):
Because of the timer.

Speaker 2 (14:35):
Right when the timer finally hits zero, the timer pushes
the start button on your function. Because the timer is
the caller, JavaScript decides that this now refers to the
timer's environment, which is usually the global window.

Speaker 1 (14:48):
Oh no, so your function tries to update a profile
on the global window. The window has no idea what
a profile is, and the program instantly crashes.

Speaker 2 (14:56):
Exactly.

Speaker 1 (14:56):
It's as if you gave the pizza delivery driver your
home address, but the exact moment he arrives, the address
in the receipt magically overwrites itself with the address of
the pizzeria.

Speaker 2 (15:06):
It is incredibly frustrating.

Speaker 1 (15:08):
So how does coffee script fix it.

Speaker 2 (15:10):
Coffee script solves it with a single elegant symbol, the
fat arrow. Instead of using the standard dash arrow to
create a function, you use an equal sign and a
greater than sign, the fat arrow. Right when you define
a function with the fat arrow, coffee script permanently locks
the value of this to its lexical scope, the physical
place where you typed it.

Speaker 1 (15:29):
So it binds it forever.

Speaker 2 (15:30):
Yes, no matter who calls that function or how far
into the future it gets executed, this will always mean
exactly what you intended it to mean.

Speaker 1 (15:38):
That permanent binding is a life saver. But if we
pull back and look at how these objects interact with
each other, we hit the concept of inheritance. If I
am building an online store, I might have a general
product object and I want a specific camera object to
inherit all the baseline traits of a product. How does
coffee script manage that relationship?

Speaker 2 (16:00):
If we connect this to the bigger picture, this brings
us right back to javascripts hidden DNA. JavaScript does not
have traditional.

Speaker 1 (16:07):
Classes, right the self language DNA exactly.

Speaker 2 (16:10):
It uses prototypes. The difference between a class and a
prototype is profound, and the book uses an analogy involving
nineteen eighties cassette tapes to explain the mechanics.

Speaker 1 (16:19):
Okay, imagine your friend Corey makes an amazing mixtape you want,
so you put his tape into a dual deck boombox
and make a physical copy onto your own blank tape.

Speaker 2 (16:28):
So you now possess the music, right, But.

Speaker 1 (16:31):
If Corey goes home the next day and adds a
new Depeche Mode track to his tape, your copy does
not magically update. You only have the original blueprint you copied.

Speaker 2 (16:39):
And that is how classical class based inheritance works. You
instantiate a rigid copy of.

Speaker 1 (16:44):
A blueprint, but prototypes are different.

Speaker 2 (16:46):
Prototypes operate entirely differently. Imagine if instead of making a
static copy, you used Corey's tape as a prototype using
a command like object dot create Okay. In the prototype model,
you do not duplicate the data. Instead, your blank tape
forms a permanent, dynamic link back to Corey's original tape.

Speaker 1 (17:08):
Oh wow.

Speaker 2 (17:08):
If someone asks your tape to play a song it
doesn't have, it silently follows the link to Corey's tape
and plays it from there.

Speaker 1 (17:15):
Meaning if Corey adds that new Depeche Mode track on Tuesday,
my tape instantly has access to it on Wednesday because
the link is live.

Speaker 2 (17:22):
Exactly. Prototypal inheritance is dynamic and incredibly memory efficient because
you aren't copying data over and over, You're just delegating
requests up a chain of links.

Speaker 1 (17:32):
But wait, if the underlying engine is entirely based on
these dynamic prototype links, why does coffee script include the
class and extends keywords aw? The book explicitly shows Agtron
building his shop using a camera class that extends a
product class. If there are new real classes. Isn't adding
those keywords just putting lipstick on a pig. Why put
the rigid C style disguise back on.

Speaker 2 (17:53):
It's a vital question because it reveals coffee Script's ultimate priority,
the human developer. Yes, so the creators of coffee script
refer to those keywords as syntactic sugar. Mechanically, when you
type class and coffee script, it is still wiring up
those live prototype links under the hood. It doesn't change
the engine, but it makes the interface for the developer

(18:15):
significantly sweeter. The reality is the vast majority of programmers
working today were train on classical inheritance in Java or
C plus plus. A sure, prototypal delegation is powerful, but
thinking in terms of classes and categories is how the
human brain naturally prefers to organize complex taxonomies.

Speaker 1 (18:33):
So it's giving you the performance and flexibility of prototypes,
but allowing you to manage it using a mental model
that doesn't make your head spin.

Speaker 2 (18:39):
Precisely, coffee script is bridging the gap. It removes the
syntax that gets in the way of your logic, like
brackets and semicolons, but it happily adds syntactic sugar. When
it helps you conceptualize the architecture.

Speaker 1 (18:52):
Which really brings us full circle on this deep dive.
We started by looking at a five hundred thousand line
monster of a codebase and wondering why anny one would
introduce a middleman language to solve it, right, But what
we've discovered is that coffee script is essentially an intense
master class in software design.

Speaker 2 (19:09):
It really is.

Speaker 1 (19:10):
By removing boilerplate punctuation, by letting functions flow as first
class values, and by providing a sane mental model for
complex object inheritance. It proves that syntactic noise isn't just
an aesthetic problem.

Speaker 2 (19:22):
No not at all.

Speaker 1 (19:23):
Noise dictates how you think. When you strip the noise away,
the underlying logic doesn't just look cleaner, it becomes fundamentally
safer and easier to compose.

Speaker 2 (19:32):
And that philosophy extends far beyond compiling code for a
web browser. Yeah, whether you are architecting software, designing a database,
or simply structuring your team's daily workflows, the core lesson
remains the same. Eliminate the noise exactly when you eliminate
the mechanical friction, the redundant steps, the rigid communication structures
the administrative noise, you aren't just saving time, you are

(19:55):
allowing the actual intent of your ideas to become visible, Which.

Speaker 1 (19:58):
Leaves you with a final thought to consider. We've explored
how JavaScript evolved haphazardly, much like a spoken language, accumulating
rules and exceptions until it became incredibly difficult to speak clearly. Yeah,
and we saw how a deliberate system like coffee script
was designed to impose clarity, allowing the truest expression of
an idea to shine through. So if this specific language

(20:21):
in syntax we use dictates our ability to solve problems,
what other forms of syntactic noise in your own daily
routines or the way you communicate with your team are
quietly preventing you from finding your most elegant solutions.
Advertise With Us

Popular Podcasts

Dateline NBC

Dateline NBC

Current and classic episodes, featuring compelling true-crime mysteries, powerful documentaries and in-depth investigations. Follow now to get the latest episodes of Dateline NBC completely free, or subscribe to Dateline Premium for ad-free listening and exclusive bonus content: DatelinePremium.com

Hey Jonas!

Hey Jonas!

Hey Jonas! The official Jonas Brothers podcast. Hosted by Kevin, Joe, and Nick Jonas. It’s the Jonas Brothers you know... musicians, actors, and well, yes, brothers. Now, they’re sharing another side of themselves in the playful, intimate, and irreverent way only they can. Spend time with the Jonas Brothers here and stay a little bit longer for deep conversations like never before.

Betrayal Weekly

Betrayal Weekly

Betrayal Weekly is back for a new season. Every Thursday, Betrayal Weekly shares first-hand accounts of broken trust, shocking deceptions, and the trail of destruction they leave behind. Hosted by Andrea Gunning, this weekly ongoing series digs into real-life stories of betrayal and the aftermath. From stories of double lives to dark discoveries, these are cautionary tales and accounts of resilience against all odds. From the producers of the critically acclaimed Betrayal series, Betrayal Weekly drops new episodes every Thursday. If you would like to share your story, you can reach out to the Betrayal Team by emailing them at betrayalpod@gmail.com and follow us on Instagram at @betrayalpod and @glasspodcasts. Please join our Substack for additional exclusive content, curated book recommendations, and community discussions. Sign up FREE by clicking this link Beyond Betrayal Substack. Join our community dedicated to truth, resilience, and healing. Your voice matters! Be a part of our Betrayal journey on Substack.

Music, radio and podcasts, all free. Listen online or download the iHeart App.

Connect

© 2026 iHeartMedia, Inc.

  • Help
  • Privacy Policy
  • Terms of Use
  • AdChoicesAd Choices