Cool, yeah I just want to say thanks everyone for attending my talk titled automating airflow backfills with Marquez. So we're gonna go through a few use cases on when to apply backfills when backfills makes sense and how you can use lineage metadata to know which downstream dependencies are affected by the data outage using Marquez. So quickly I just want to introduce myself. Hey I'm Willie. I'm a software engineer at Astronomer. I work on the data lineage and observability team so we focus on providing tools to understand where your workflows break, specifically around airflow. I'm the co-creator of Marquez which is an open source metadata service that is now part of the Linux Foundation. I'm also a committer to open lineage which is a standard for collecting lineage metadata for a job under execution. And if you don't mind follow me on Twitter if you want to continue talking about metadata or anything related to it. For this talk we're gonna do a few things. We're gonna talk about backfills and look at it in the naive way. We're also going to look into open lineage and do a quick introduction. We're gonna do an intro to Marquez as well and then we're gonna end with backfills. So it's sort of a take two on it. In this case when we say take two we're gonna be looking at using the lineage API that Marquez exposes to begin to traverse the lineage graph and know which downstream dependencies were affected by maybe your job failing. And then go into finally I go into some future work that we're working on at unopened lineage where we want to extend the model and also some of the APIs that are coming for Marquez as well. Now before we dive into that you know I just want to go into a pretty normal scenario. So before astronomer I was actually at WeWork. Well before astronomer I was actually a data kin which was a data lineage startup. So as a founding engineer there where we developed Marquez. So yeah WeWork we had a pretty standard approach to analyzing our room bookings. So I just want to go through a quick example on how we approach room bookings and some of our analysts and the queries that they executed and look into how that could be an example for our backfilling scenario. So let's get booking. When you want to book a room at WeWork you first look at the location and floor and here we're just looking at really far in the future. We want to book something at Salesforce. There is a time that you want to book it. So where are the open time slots. Also you want to book a duration and then once you kind of say okay this room at this time looks good for me. I want to come for my booking. And analysts have a really common question or in this case they want to know which which WeWork spaces are doing well. So the question that they ask is which locations has the most room bookings. And here since I'm in the barrier we have we focus specifically on locations in in in San Francisco. And really what the analysts really care about is you have a set of room bookings and they want to know the top location. And what they usually do is they write a query in this case is really simple but they usually write a query and they give it to the data engineer and say okay go ahead and productionize this. And here we just do a select on location. We get counts. We want to know who is booked by and we're reading from the room bookings table and we're grouping by bookings and we're just doing a limit of 10. So we feel pretty good. The analyst now has a dashboard that their stakeholders can use to kind of predict which locations are doing well and forecast that. And as a data engineer I feel really good. I productionized that sequel and was able to use air flow and define a workflow that allowed me to run this periodically and make sure that I could observe if the pipeline is failing or anything or anything specific to issues in the work workflow.  So what I mean by that is you know let's say we view we view the execution of a workflow every month and we have those data points but also we see a sudden drop. You could ask yourself well is that because the data quality might be an issue is it because we you know we just didn't see a lot of room bookings during that time. So there's a lot of questions that you begin to ask yourself. And one of the ones that come up or one of the key issues when you see dag failures is around data quality so data freshness. And what I mean by that is how often is your data updated is it updated every hour of every day. And if so is there a missing partition for that for that time period. So there's data gaps that could be a result of that. There's also with data quality you know there are data sets they they change and they change often and what I mean by that is the shape. So columns get added and columns get dropped data types change. So any any one of those scenarios could result in an issue and while your pipeline might be failing or in this case why our dashboards are not looking correct or at least we assume they don't. Also bad code I don't know about you but I don't write bad code anymore so I would be pretty surprised in terms of why the dad would be crashing because of bad code. So you know we iterate a lot and specifically we modify workflows and we push them out regularly sometimes we don't but most of the time there are things that our analysts want us to update in the sequel so we have to push that code out. And that might be that might be the result of why we see this issue but we're not sure yet. But bad code being able to understand what the reasoning behind the drop in bookings could be the result of just a recent code push. And the other one is just back a dag dependency so upstream failures. And what I mean by that is you know on your edges if you if you have workflows they're doing details of pulling it from s3 and loading it into your warehouse or maybe even some external source and loading it into your platform any of those could have failed which results into cascading effect downstream. So before I go further I just want to talk about backfilling and how you define that. So as your organization scales up and the amount of data and number of internal data sources also increase the amount or the type of data problems that you're equipped to deal with or want to deal with or have to deal with also scales as well. So you as your team as your organization grows different teams begin to form different sources begin to get introduced so you could have redshift you could have snowflake postgres there's a lot of different data sources and different formats. So and as data outages happen they become more disruptive. So if you have a small team if there's an attitude you're like okay you know you can communicate within that small team but imagine if you have an organization of a thousand people and you have critical reports that need to go out every week. If data outages happen that now that communication becomes a bit more difficult. You're either slacking people or you're emailing asking people what is going on why is there why do my passport don't look correct. So finally we define backfilling. So backfilling refers to the task of retroactively processing historical data and that just means filling in the gaps. So filling in the gaps is that you either you could do full incremental or full processing if your data or you just process a subset of it. So you can think of it you process weekly if you have weekly data and you're missing a day you just process you just backfill one day of that. So having a central place to analyze and understand DAG dependencies will make your organization more resilient to data outages and that's where Marquez comes in. So Marquez is a metadata store for lineage job and dataset metadata and we'll go into that in later slides. So for data outages what usually happens if we break down the time of recovery or when it gets identified 90% of the time is going to be downstream so downstream of the issue so that you know that could be a customer where you know they have a dashboard in their app and now they see things incorrect or they see a drop in or a discrepancy from what they saw last week to what they see currently. So 90% of the time that's where the issues come up which is not a good experience and 10% is around the code based detection. So if you're reviewing code you're able to detect oh wait that sequel looks wrong or that code you might want to add a test for and that's where manual testing comes as well so a very small fraction becomes detected before it makes it out to the end user. One example of this is you know you push code out to production then a week later your analyst comes to you and like and asks what is going on all my all my dashboards are incorrect so on the right that on the right you see the result is days or weeks past before incidents are detected and resolved so then you have to ask yourself when did that bug get introduced or when did we start seeing issues in our in our data or in this case the when did the data quality drop. So Airfield does provide a pretty simple way to do backfills it's there's a backfill commands so you have a start and end date and then you give a DAG ID so you could run backfills at any time just using the CLI. But there is an important that before I go into it a bit deeper the execution date is kind of critical here because I got confused early on about execution dates and you have to wait a period so if you have 24 hours before or there's a 24-hour window you want to you want to run your workflow every 24 hours 24 hours have to pass before it gets triggered. So I don't know I got confused when I was initially working with Airflow and when I was running backfills so I thought it would be important to point that out and what I'm going to do now is just kind of walk through different scenarios that happen so you have your job and your output data set and in this case we have a data quality issue with our input input data set and you can think of a workflow that is pretty critical so billing and payments so if you have a an input data set that is either missing data or might have duplicate rows so you're overbilling customers that's a pretty big issue. There are some toolings that you can use out there currently to create assertions for the input data set and that is great expectations. Does anyone use great expectations or have any okay but it's one one one integration that we do have with Open Lineage and just talk about the different ways to collect assertions from your data set. So one one way you could try to fix this is just retry it so if your data if your output data set or your job is right away where it's idempotent you can retry it so it's like oh maybe maybe the data is there now but that only works for so so much or you know that only solves the problem temporarily especially if maybe the data wasn't complete but now it is and now it is complete but just retrying that has its own issues and like I mentioned if your code is not idempotent you're going to have duplicate rows in your output data set so you start looking and debugging and you're like oh wait there's an upstream issue so you know the only thing that you see as a data engineer or developer is just to have input data set that's the interface that you work with that's the schema so you know the shape you know where it's stored but you don't necessarily know who owns that data set and if you had a lineage graph or be able to understand the dependencies you could look upstream and realize oh wait there's a job failing and I don't need to look into this anymore it's not my code it's actually something that's going on upstream the other case is one bad data point so one bad in this case partition so you know when you read data sets it's not just a full data set usually partition it based off an hour or by the day so a job could be failing because one partition is now missing or the you're reading in the data and that partition has grown significantly and your job just can't process that so your job starts failing and then the output data set is now either missing data or it's arriving in glade and you can imagine consumers downstream of your output data set are now also having issues so you have this cascading problem and for those of you who are still writing bad code you're pushing code out that now results in your job failing and even though the input data set we know that there's nothing wrong with it now your job is failing and it's the result of just some bad code that you pushed out recently and now your output data set is also delayed or there's gaps in your data and as I mentioned before now you have this cascading issue where anything downstream depending on your output data set is now having issues and that results in dashboards that are critical to your organization especially around growth or turn are no longer available to your CEO and that is not a fun meeting to have so backfilling is tough and what I mean by that is how quickly can we detect data of quality issues and then explore them and be able to identify them and then eventually resolve them so currently there's not a lot of tooling out there if you think about in terms of microservices or when you're deploying software there's a lot of tooling and metrics that you can take a look at and especially around downtime so when you have apis that you expose there's so much monitoring around that and for jobs the interface is really that data set so anytime your workflow produces a data set that becomes your interface that's how other workflows interact with the artifact that you output and in terms of what are learning rules should you have in place when you when you actually identify that there's an issue you know a lot of the time I know uber did this and a few other organization that I know of they just run SQL and do checks on their tables that run every hour and if they realize that there's more nulls than what they expect they'll then trigger pager duty or they'll pick a trigger a message in Slack so that way people get notified but that's a common way to do it but being able to notify when the issue begins to happen will help you trace and debug the issue the the data problem a lot a lot sooner and makes everyone's lives a lot a lot better in the future so what effects if any would upstream dags have on downstream dags so we talked about this you know if you delay consumption that could have cascading effects on dashboards but if you're doing stream processing you know if you have a lot of data coming in and you haven't scaled up your workers to process that streaming data and you're no longer archiving to s3 you know that that just has issues all around especially if there are workflows that are dependent on those objects in s3 being there to load into your warehouse all right so why are backfills this hard they shouldn't be and this is when when I was at data kin the one thing that we realized what they were there needed to be a standard so I mentioned open lineage earlier but they needed to be a standard on how to collect linear metadata from your workflows to understand when your job fails what were the run args so what were the parameters passed into your workflow to understand which workflows are maybe using a parameter and they're all failing because of that and being able to understand the inputs and outputs the schema of your data set and understand when changes happen and also version your code so it sounds like a lot but that that's what the standard is attempting to do and if we take sort of a step back and look at the current landscape and you look at data analyst tools scheduling warehouses SQL engines they if you want to pull metadata from those engines you have to write custom code and that's what we did from our Kes and Amundsen does the same and a few others as well and where OpenLager comes in it provides that layer that allows you to say let me get linear metadata from warehouse and the the spec itself allows you to look at the event and understand exactly what query was executed by but also by what job so that way we kind of crowdsource it and we don't we don't have to worry about a new release coming out for air flow and not that having a lot of work on our end to then resolve that for that particular version our integration broke we now have a standard that collectively we can all contribute to and just make our lives a lot easier when it comes to processing lineage and now I want to get into Marquez so Marquez was a project that came out of WeWork that I co-created and it was a meta it was part of our data platform and it collected metadata for all of our workflows especially air flow and we were working on streaming as well so it's also on LFEI and data project that's incubating and we didn't read this paper until after we started working on Marquez but it's there's a really good paper that came out of the ground came out of Berkeley called Ground a Data Context Service so it talks about an API also a model for storing metadata but more specifically versioning and that's what was a really interesting part so I recommend giving a read if you want more background on just metadata and versioning quickly here we have just a guide with Marquez so we have data lineage data governance and data discovery Marquez does expose a lineage API for data governance there's things like tagging and for data for data discovery we have a search API that you can search your data sets and jobs so Marquez is a metadata service so it stores objects for sources data sets and jobs and there's a core API that allows you to run to do data governance and what I mean by that is just understanding how your data flows through your platform and also if you're tagging data sets as having PII which jobs are reading from that data set and for the data model the the job there's there's three components or I mean there's you know if you look at the open lineage model there's jobs, datasets, and runs and I talked about the grounds paper where Marquez really comes in is around the versioning so versioning your data set if your schema changes but also your job version so if your code changes you'll be able to know which run was based off that that job version and which run produced a data set version but also what was the input data set version for for that run and we have different source types that are supported like MySQL, Postgres, Redshift and many others and with jobs it's not just batch they're streaming and we're looking into also supporting services as well because you have operational data stores that are pretty critical. The design benefits especially around backfilling is just what job versions produced and consumed what dataset version so you have this multi-dimensional model where you know what input datasets and the versions that they were what were the job versions and also what were the dataset versions as well so then you'd be able to run full and incremental processing when you want to run your backfills so imagine if you did push that code out and a week later you know you realize oh wait now we have issues in our dashboards then you'd be able to go back and query the API and know what version or what code went out for that for that particular date and you're able to debug and see what the diff between the two code versions were but also what downstream jobs were actually reading dataset versions that were now corrupt and need to be reprocessed and so Marquez is a push-based metadata collection model so you push through a REST API and there's open lineage events that we push to the Marquez back-end and then we process those events and and store it into our model. There's different integrations that we support there's airflow spark dbt we're working on flink and iceberg as well but there's many other integrations that we're focusing on and in a nutshell when your workflow runs especially in airflow you're pushing all that metadata to the Marquez back-end and Marquez begins to populate that model so here you have a workflow that has the open lineage library installed and connects the Marquez back-end and transports that metadata to the Marquez REST API and we're going to go over the open lineage and airflow integration just because it's really important in the context of when we do the backfilling so what we do is we collect metadata around the task lifecycle so like the run args the run parameters we automatically pull in the code the link to code as well as inputs and outputs so we do some SQL parsing which the lineage tracking is built in for DAGs and we actually have a new SQL parser that we recently released that is based off Rust so it's a lot more performant it's a little bit more reliable and it's actually performing pretty well in production and the things that are built in is just that link to code so being able to know at what point did your code change because when you push new DAGs airflow does pull them down and especially if you have them stored in Git you'll have that Git shell and you don't have to do this anymore but the library is open source as part of the open lineage repo and you just have to modify your import but as of the recent release of airflow which i think 2.3 you no longer have to modify your DAGs it's just if you do a pip install it will automatically begin to extract metadata from all your DAGs and there's an operator extractor model so i just want to show really quick here for you know airflow has a postgres operator and open lineage has this extractor model that you can pull metadata from so here you have on the top airflow and at the bottom you have open lineage and that's where extraction happens builds the open lineage event and then sends it to the markets backend and if we were going to parse this and walk through first you look at the source so you look at in this case we're processing a postgres operator you do sequel parsing and that becomes your dataset and then your job so this task ID is your job and there's just a naming convention we have with airflow there but those are the sequence of events that happen and what we're really working towards is if you have two workflows that don't know that they depend on each other there's an underlying implicit dependency so you new room bookings inserts into room bookings and you have this top room booking stack that processes those process that table and being able to stitch that together through a lineage graph is super important and especially if you have different work if you're running multiple airflow instances and you have different dags running on those instances how do you end up linking them together and being able to look at it in holistically through a lineage graph will help you understand the dependencies so what i wanted to do is kind of take a take two on querying the lineage metadata for for marquez so here we have in step one you connect to marquez and here we're just doing a local host 8080 and then we build a node ID and there's a certain convention that we have for the node ID in the lineage graph so we're able to do a job or dataset and then it's delimited by a colon and analytics is the namespace but it could be it could be a team your namespace is our way to contextualize your metadata so analytics could be a team you could have engineering but just a way to group your data and then at the end the last component is just the job name so here we have top room bookings so if you take that node ID and you use the client and you do get lineage graph and provide that node ID what you'll get back is all the dependencies so starting at that node all the dependencies upstream and downstream from it and on the bottom it's printed out but what i'm going to do is quickly go here and i'm going to query the marquez rest api that we were looking at in python but the rest api if you just hit api v1 lineage and provide a node id well you'll get back is a graph so here we have i want to show we have a job that's under food delivery example so it's just a different example that i seeded marquez with but the job is called example dot delivery seven days and if we look through the graph the graph returns back an array of nodes so you have a you have the id of the data set or the id of the node you have the type and then you have the data blob so which is so depending on if it's a job or a data set you get different metadata back and here we have a data set so you get back different fields and if i scroll down the important thing is the in and out edges so since marquez keeps the dependencies between your upstream and downstream you're able to then look at the in edges or the out edges and follow those downstream so if we go back and here i just printed out the lineage object but if we go back this is really all you need to do if you wanted to know what jobs or what airflow tags you wanted to rerun or run a backfill for so if we look we do the same thing we connect to the marquez client and then we have this backfill downstream function which is just recursive so let's say in this case top room bookings is was failing you're able to start at that node and then follow it all the way down so you hear we do use the client to get the node id and for each out edge so for each out edge we will then go ahead and see whether or not it's a job if it's a job that means we want to run a backfill so the start date and end date that could be parameterized here i don't have a specific value but if you say airflow backfill start date and date and then give the id of the out edge because we know it's a job then you know that you have to rerun it and once you kind of go through that then you just call the function again so at the bottom you'll see backfill downstream of node id and the out edge has a destination so you just keep following it until you hit the end of the graph itself and what i wanted to show really quick that api ends up feeding the marquez ui so here you have a complete lineage view of this example that i seeded the mark the local instance of marquez but you're able to traverse and look at the different metadata for data sets ui built so we talked about versioning look at the different versions that were created if the schema changed or if it run writes to a data set that's viewed as a different different run and then there's a link to the run that created that version and we could also look at so the the squares are data sets and if you look at the circle that's a job so here it's a job that just ran select star from and you could look at the different run history as well so there's a few run runs that happen but if any of these jobs fail you could be able to visually look at the lineage graph and say okay there's a job downstream that was depending on my output data set and rather than reaching out to me it's like oh wait my job is failing and the data set needs to be repopulated you could automatically do it for them so automating automating the backfill for jobs downstream really removes a lot of the frictions between teams if they're okay with that sometimes they want full control and i'll end with you know just kind of failing collaboratively so being able to have a global view and understanding that teams you don't want teams to remain isolated so as teams run into failures instead of failing by themselves they should be able to learn from each other's failures and and be able to depend on a lineage graph to communicate when things fail and understand the overall health of their ecosystem or their data ecosystem and you want to coordinate efforts so if someone is working on an issue and let's say there's a data outage and someone else could be working on the same thing and you want to combine efforts if someone's really good at the infrastructure side and they're trying to figure out this data quality issue not being able to have a global view of how things are dependent you might you might be duplicating effort there and just empowering teams so if they if they did identify the problem through a lineage graph and but they don't have the pool tool they don't have all the tools to solve that just kind of makes things yeah it's they can't resolve it and that kind of sucks so being empowering teams to solve these type of problems i think it's super important and one way to do that is being able to use the lineage graph to build on top of it and do a lot more automation i did write a blog on this um so if you wanted to kind of take a look at the script feel free it's uh it's on open lineage and it's just called backfilling with airflow decks using marquez at the time it didn't there wasn't a lot of automation i didn't think about that so but this goes a bit deeper and kind of covers my talk as well and finally with some future work there's column level lineage coming i think it's already supported for open lineage but marquez we need to do some work to support open column level lineage just job hierarchy and grouping so understanding how when you return lineage metadata back there's grouping so if there's an airflow dag that has a a bunch of tasks how do we group that so that way displaying on the ui is a lot easier there's flint integration that's coming and iceberg support as well so if you're using those tools or frameworks i'd love to talk to you after and just want to say thank you for attending my talk hopefully you got something out of it at least maybe some code to automate some of your workflows and i wanted to end with just you know check out open lineage follow us on twitter same thing with marquez and i'll just end with any questions okay that's good maybe thank you


Everybody for a syrup in 2023 Luminance football hobby six bucks number eight pick your team style Alvin W with the Colts Alvin S Falcons Andrew M Bangles Anthony G Rams Anthony G you with the Rams Anthony G over the Dolphins Caesar has the Cardinals Chris H Patriots David H Broncos Don G Lions Donald W Seahawks Edward P chiefs and Jets Jacob H Giants James F Vikings Jason B with the Eagles Jerry B has the Raiders Josh W Chargers Josh T Cowboys and Washington Josh S Titans Leone has the Packers Long J Saints Raid D Steelers Robert R Bears Shin with the Browns Skyler has the Panthers TJ Ravens Tom B Niners Zufan Jaguars Valerie Texans and Bucks will tee with the Bills I mean usually can just tell by Comparing what the release day price was to what the price is like three months later That's how you can really tell and people didn't like update. They just didn't there wasn't enough in it I'm not sure what late gaming stream is you can check over on late gaming comm though. Usually they go live like every day Yeah, I don't have anything on the schedule, but usually a stream every day Dell Hooker and flowers Got a nice price young to 100 lowest number Bryce young today for Carolina Rookie redemption here is Joey Porter, Jr. Rookie luminance auto vertical It's been the only redemption. I think we've seen today so far He might not be the only but he is the only that we've seen Downs Hainer Breesie Tyree Wilson Rookie to 200 for the Raiders Seahawks Zach Charbonnet Rookie Auto On card year one good hit there and Michael Parsons engaged Yes, it's still a joy porter. I love us. I'm not sure if I said or didn't say But it is Steelers the 200 is B. John Robinson for the Balkans And a Michael Wilson Cardinals Rookie Auto. It's out of 350 Connell Evans Roshan Johnson Jonathan Taylor jersey card for the Colts out of 50 Roshan Johnson Rookie bears the 150 That's to 50 Rookie Quentin Johnson chargers solid and a savage of Josh Allen Three to go on the next one three to go Yeah, teams on sale for NT as well. Everybody teams are very marked out on NT Tucker Parker Washington and a craft Tucker craft Jalen Carter Eagles Rookie out of 150 with a Lions Jameer Gibbs year one Rookie Auto on card fusion DK Metcalf Michael Wilson Cardinals Rookie numbered six of 50 They bills Dalton Kincaid red year one on card auto Bills, that's a nice one Will Leviss Hinden Hooker Brock Purdy 125 of 250 for San Fran Cedric Tillman Broncos Rookie red year one auto good box here to read your one autos Devon Oshane Quentin Johnston Marvin Mims We've got a Nick Chubb Jersey card for Cleveland beacons Jersey Christian McCaffrey number to 150 for San Francisco Anthony Richardson 140 of 200 Colts rookie nice card and Bengals Jamar Chase unforgettable number to 100 gonna keep checking spots coming in Orders coming in for tonight as well again pristine sold out on PYT's on channel 2 already It's been like over an hour now. There's pristine PYT's tonight There's some mixtures. I think all the random style baseball sold out tonight, too So it's luminance NT Star Wars 6 series and pristine PYT's for tonight guys That is what's left Kyle's lie with Persil's on channel 2 at 7 pristine is in stock luminance is in stock Bunch of other good stuff of course as always All max a listen today Is that Sunday? I think Saturday's already scheduled Yeah, I don't know Maybe rich already listed on the neck.  You should listen breaks All right, Jordan Addison Musgrave Van Ness Micah Parsons a 250 Dallas with a Zay flowers rookie auto Ravens 92 of 100 Ravens are the nice hit there fusion of Justin Fields Mayor Wilson Oshane, that is a La Porta rookie for the Lions at 200 Raiders Josh Jacobs auto 7 of 10 sweet vet hit for Vegas Wonder how much he'll play or if you'll play at all this year shall see rock party vestige tune ranch Jamar Chase out of 150 for sincey Miles Murphy bangles rookie auto year one Unforgettable and Van Jefferson last pack of box three To a Dolphins jumbo patch 17 and 25. That is a four-color patch There is Clayton Tune. You know Cardinals rookie to 35 BQB 200 Deandre Hopkins Cardinals as well and Unforgettable to 10 Raiders Devante Adams Okay, okay All right three on the next one to on The final daytime luminance, and then there's still 11 to go on NT all teams markdown Every single one, right? Let's keep it going here. All right. Anybody who have been a personal this or pristine any of the new stuff and join breaks It's your plan. What's the strat? Got my homes out of 250 for the Chiefs 250 points card And be Jean Robinson dynamic points are random to everybody at the end Richardson base rookie for the Colts Will send Bryce young rookie for the Panthers Jameer Gibbs Lyons to 200 Clayton Tune Cardinals now rookie auto to 350 in Debo Bejaun Robinson Gonzales Clayton Tune You got to 175 Cameron lot to rookie for the San Francisco 49ers Texans Xavier Hutchinson rookie auto to 350 mingo That is Hull and Hyatt Ravens dual jersey Roquan Smith Ray Lewis to 50 Cool one for the Ravens is Kyler Cardinals to 100 Lamar Jackson one of 10 Ravens on the pink Sweet Lamar and a Josh Allen vestige. Nice John. Thank you Appreciate that. Yeah And mark them down, you know one and one on each of the next two. That's it and then tend to go on NT now again those teams are Like yeah, the the teams that were that were available that are that are marked down would have sold You know a good bit ago without me having to mark them down on like a Friday or Saturday But hey Wednesday daytime, maybe you can snag a Sweet team on sale Yeah, they are yes, they are cheap Especially comparatively to other people's prices man. Yeah Gibbs. We got Jake Hainer to 150 rookie for the Saints 250 points random at the ends Keisha on bootay Spears CJ Stroud followed by Christian Kirk Jaguars 250 Seahawks Zach Charbonnet rookie year one auto on card and an unforgettable CD lamb flowers there Hutchinson Kendra Miller Lyange DeMere Gibbs recated 200 Michael Wilson Cardinals rookie autograph to 100 gauge Trayvon Walker Last pack box five Seedell Hooker Ritter patch card or Jersey card for the Falcons here bright future bright beginnings Yeah, for sure John. Yeah, he is the 150 mark Andrews Ravens Got Quentin Johnson rookie to 50 for the Chargers and Allen to 50 savage for the bills blue color match Cardinals just sold Last team next is the Buccaneers at 39 bucks. They're 10 bucks off. That's you know over 20% So bucks in both both luminous just the bucks Got B genre key for the Falcons Addison Lawrence the 250 Jaguars 250 points random at the end between everybody CD lamb gray mims concaid Dak to 50 for the Cowboys Colts Josh Downs rookie auto to 100 Infusion of hurts Spears shroud Gibbs to 150 is Tyree Hill Dolphins followed by a Darius Davis rookie auto to 350 for the Chargers Save your Hutchinson Kendra Miller K. Sean butte Josh Jacobs Jersey card for the Raiders Beacons there Sean Clifford Packers rookie to 75 To 175 rookie Jaden Reed Packers as well And savage to 50 Josh Allen again bills Three 250 points cards here top three spots in this room to everybody. We'll get Those it's a three top three teams here three times one two and three Vikings Saints and Dolphins Quick hit recap here. We had relics of Josh Jacobs Desmond Ritter broke one Smith Ray Lewis a Nick Chubb Jonathan Taylor jumbo patch to a Steelers Redemption Joey Porter, Jr. Raquille auto vertical Zach Charbonnet Jameer Gibbs Zach Charbonnet Miles Murphy Cedric Tillman Dalton Kincaid with the red ink as well Xavier Hutchinson Darius Davis Clayton tune Michael Wilson Michael Wilson Josh Downs Zay flowers and Josh Jacobs a 10 Thanks, everybody moving on to the last full case here


Hello, everybody. Andrew Mayesca here with Dental L. Let's talk about the toothpaste that has pretty much gone viral. Everybody's talking about it. I was asked to review it a couple months ago now, and I did. So I'm going to talk to you guys about my honest thoughts. Some are good, some are bad. And kind of the company as a whole because as dental professionals, hygienists are talking about it because we're all hearing about it. Patients are asking us about it, but also there's kind of some weird things happening within the company. So let me kind of explain that a little bit. So I shouldn't say the company's sorry, the people in the company. So I'll talk about that first, okay? So there have been reps of the company, randomly just messaging people, okay? Just randomly messaging people. And these days and nobody likes spam, nobody wants to see people that we don't know trying to become our friend on Facebook because we tend to wonder like what are they doing? You know, these days social media is huge, which I think is a good thing, but it can also be a bad thing too. And even me just last week, I probably got three messages a day from random people. They were all dental hygienists, unfortunately, because it kind of gives us a bad name, honestly. And they all copied and pasted the same message to me. And that was, I would love to connect with you on Facebook, yay, you know, but they all said the exact same thing word for word.  And I do understand that because I have been with companies before where you make a commission from what you sell. Honestly, that's how it works. There's nothing wrong with that, but we all kind of get this bad taste in our mouth, you know, think of when somebody comes to your door at six o'clock at night, you know, that's the last person you want to see is somebody trying to sell you something. That happened to me the other day. Somebody came to the door actually in the afternoon. I was though in the middle of making lunch, the dogs were outside. They started barking when they heard the doorbell, you know, so it was just annoying. I assumed that it was mail. We constantly get packages to our house. So I just assumed that it was mail. I didn't think anything of it. But then as soon as I could tell, it was somebody selling something. I'm like, I don't have time for this. My dogs are outside barking. I have food on the stove. I literally don't care what you have to say. Honestly. And that's what's happening on social media is this toothpaste. Those who are reps of that company are just trying to sell, sell, sell, sell, sell, sell by randomly messaging people. And a little insider's tip, which I probably shouldn't even be saying this, but why not? It's it's true. If I don't say it, somebody else will. You know, those companies, that team, those teams, one of the tips on how to sell is to cold message people. You know, we used to go door to door to door, and that does work sometimes, believe it or not, on social media. It does work as well sometimes. But if you keep seeing that over and over and over again, you just get annoyed, right? As do I. Now, so that's what's happening is if you've been getting those messages, it's because they're not trying to be rude or spammy. They just want to sell you some toothpaste that they truly know or think works, but they're just going about it the wrong way. Now, full disclosure is I am a rep for that company too, but not the sell, sell, sell, sell, sell kind.  No. I'm a rep simply because I love the product and I'm being honest. In fact, I will show you guys right now. I love this toothpaste. It works for me. It works for my patients. Honestly, I'm not saying this because I sell it. I sell it because I love it. And I think you all should know me now that I would not sell you guys anything that I didn't truly believe in myself. But that's the thing is I don't just automatically talk about it to everybody. If I have a patient and this just happened the other day where a patient says to me, you know, I really want white or teeth, but I've tried white strips. They really like hurt me. I don't want to do that again. Do you know something or, you know, a toothpaste that I could try that would help. Okay. When I hear that, I pull this out and say, try this stuff. I use it myself and I swear by it, it works. I use this myself. Okay. I'm the one where I would get my teeth cleaned every four months, not because of plaque and tartar, but because of stain. Stain just likes to attach to my teeth like nothing else. I have thin enamel. So that's probably why. But like coffee, tea, it just like attaches to my enamel like crazy. And I'm a dental hygienist. I have my own business. I don't want, you know, stains on my teeth. This stuff works. My last dental appointment was probably six or seven months ago. I probably have to book that. But that just tells me that this stuff works because I haven't even thought about booking my next dental appointment because I, you know, I look even for you dental professionals, my lower interior linguables, always get stain, always get plaque, always get tartar, which is normal. But I have none of that now and it's been six months. I'm not saying it's the toothpaste for sure. That's the only thing that I've changed. So I love this toothpaste, honestly. So yes, I'm a rep for the company, you know, technically, but I don't sell, sell, sell like my team, you know, pretty much tells you to because yes, as with any company that you make a commission, the more you sell, obviously, the more commission you make, which makes sense. Plus, if you have people on your team who sell also, so meaning if I told my sister to sign up for this company to sell toothpaste also with every sale that she sells, she gets a commission, but so do I because she's on my team. So when I say my team, that's what I mean. So the team that I'm on my higher ups, they make a commission from everything I sell. So they want me to be sell, sell, sell, sell, sell, but I'm not. There's probably team meetings once a week, which is awesome. We have like information type meetings. We have a Facebook group where there's like a post in there, you know, like every day, like you should do this today to sell blah, blah, blah, which is awesome. When you are first starting, it's awesome because it's nice to get those tips, right? But now I don't need them because I don't sell, sell, sell, sell, sell, sell. I just, I just have it for myself. And if patients ask me about a toothpaste that they can use to help to wane, a toothpaste that will not cause them sensitivity, a toothpaste that is not abrasive. That's the big thing is that if a toothpaste whitens, make sure it's not abrasive. They all are. This one is not. I cannot remember the number on the abrasiveness scale. I did post it in the group a little while ago. So I'll check that again, but it's much less abrasive than any other whitening toothpaste out there, because that's my thing too, is I don't want to give a patient a toothpaste that's going to be abrasive, nor do I want one that's abrasive because I have been enamel. So this is why, sorry guys, I'm just checking for my husband because he should be home soon. And I locked the door and he forgot his keys. So just kind of checking. But yeah, so this, yes, I love the toothpaste. If you're thinking about a charcoal toothpaste versus this one, get this one because the charcoal is too abrasive, way, way, way too, too abrasive. And it makes a mess of your bathroom sink. It gets everywhere, this black stuff everywhere. Yes, it is easy to clean up, but who wants to clean up after they brush their teeth? Not me. So that's something that nobody tells you, right? This toothpaste is so much better. If you want to try it, let me know. I would be more than happy to send it to you. If you're looking to make some extra money, let me know.   If you have any questions, let me know because honestly, I love this stuff. You can probably tell that I use it myself. No, you can't really tell. I just thought you might be able to tell, but I need some new stuff soon actually. I got this in October, I think. So yeah, in about, I think it lasts about six or seven months, I'm told, but I love, love, love this stuff. Okay. And my patients love it too. Even I just posted the other day where I did a whitening treatment on a patient and then she took the paced home and after three days, three or four days, I forget now, but her teeth were, were even lighter. I went to her house. I had a shade guide, which I don't have with me, but her, her teeth were almost a full shade lighter than after I had used the whitening treatment because the nice thing to you guys is that it takes the stain away, plus it does apply a thin coating over top to prevent further stain. No other whitening toothpaste does that. So yes, the other, you know, stuff takes the stain away, but it kind of leaves your enamel more susceptible for more stain. This does not because it does apply a thin coating over top. But anyways, I'm not trying to sell you guys the toothpaste, but I'm just telling you guys the honest facts. One quick thing though. A lot of the reps of the company are posting saying that, yes, it does remove stain from crowns, bridges, veneers. It does not. Okay. It doesn't. It does not remove stain from crowns, bridges. Think anything lab like that's been made in a lab. It will not take away that stain. It's not magic. Okay. So I'm just trying to tell people that too, because unfortunately I just think I, I don't think that the people who are saying that it does are trying to give out false information. I just think they're confused and they don't really know. That's what I'm thinking. But anyways, you guys, if you have any questions, let me know, please. Thank you so much for watching and I'll see you guys in the next one.


Generated space very well there. This could cause problems from Jefferson Lermont. He's got better and better as the season's going on, Jefferson Lermont. What a strike that is right behind it. Only one shot in his head, touch out of his feet, and he fizzes it right in off the crossbar. Guaida, absolutely no chance. Phenomenal strike. And Lvojevic cushions it for Zaha. Ball was taken, says Roger East. Smith to Fraser. And back again, looking for King. It'll roll for Ibe. It took his time. Don't count Bournemouth out of this one just yet. They can take something on this final day. With the corner kick, it's meppin' into an area. Joshua King just gambles off the back. As good attacking players should. Daha will look for Tanze...


Hello and welcome to this presentation of the STM32F7 USB full-speed and high-speed interfaces. It covers all the features of these interfaces, which are widely used to connect either a PC or a USB device to the microcontroller. This figure shows the connections between an STM32F7 microcontroller and a USB connector. The STM32F7 features a USB full-speed communication interface, allowing the microcontroller to communicate typically with a PC or a USB storage device. The simplest implementation is a USB peripheral device, but the STM32F7 also supports the USB on-the-go functionality. Let's look at some of the key features of this USB full-speed interface, which is a USB specification 2.0 compliant interface that operates at a 12 megabit per second rate. In the simplest form, a USB FS device can be implemented. Built-in support for link power management adds enhanced power modes on top of the USB 2.0 specification. In addition, the on-the-go or OTG functionality enables implementation of an OTG product or an embedded host, both of which have the capacity to behave as a targeted host. The battery charger detection function allows for increased current to be drawn from BC 1.2 compliant chargers up to 1.5 amps. USB 2.0 high speed is also available via the ULPI interface. The same modes of operation are possible when coupling with an external ULPI transceiver. In this block diagram, the USB OTG full-speed controller core is shown in the center with its data FIFOs below. The physical layer or FIFO on its right side handles the analog signal levels, including many specific level detections relating to on-the-go and battery charger detection functions. The USB interrupt goes to the Cortex processor to signal various USB events. The AHB peripheral bus enables read and write access of the controller registers and the power and clock control block. Depending on the use case, whether device only or OTG device, a low or high-speed crystal oscillator is necessary to provide an accurate timing reference for the USB block. In this block diagram, the USB OTG high-speed controller core is shown in the center with its data FIFOs below. The FIFO on its right side handles the analog signal levels, including many specific level detections relating to on-the-go and battery charger detection functions. The USB interrupt goes to the Cortex processor to signal various USB events. The AHB slave interface enables read and write access of the controller registers and the power and clock control block. Transfers to and from memory are handled by a DMA engine inside the controller via the AHB master interface. At any given time, one of the two operating modes will be functional. Peripheral mode, which will be used for a regular device or an OTG device when operating in peripheral mode. Or targeted host mode, which will be used for an embedded host or an OTG device when operating in host mode. Interrupts from this USB block can be triggered by a large number of events or state changes. This slide and the following three slides show all the events that can trigger an interrupt. As can be seen, these interrupt sources are diverse. They range from events related to low power management and OTG to events related to normal host behavior and regular USB reset and disconnect events. In this second slide showing interrupts, another diverse set of sources is described. In this third slide describing interrupt sources, many suspend OTG functions and FIFO status events are listed, as well as a general register access error. Now let's take a brief look at the various low power modes of the PHY and the controller. For the PHY, power down mode can be used, for example, when there is no VBUS present and the session is identified to be not OTG. It is also possible to disable the VBUS sensing related to OTG, A and B sessions, if the OTG function is not used. During suspend mode, there is no dynamic signaling occurring over the USB interface. So three different controls are offered to lower the power consumption as desired by the application. Low power modes for the high speed core are similar to the full speed, but the modes concerning the PHY are not listed, as in this case the PHY or transceiver is an external component. The USB peripheral is active in run and sleep modes. In stop mode, the USB is not available, but the contents of its registers are kept. In standby mode, the USB peripheral is powered down and must be re-initialized when returning to a higher power state. Within the USB module, certain dedicated bits are implemented to allow debug functionality in a USB application. They relate to FIFO status and contents and the scheduling of periodic cues in host mode. Additional details of these debug bits are listed in this table. Here is an application example of a low power device. Power is drawn directly from the USB VBUS signal. A single crystal oscillator starting from 4 MHz is needed outside. For complete USB specification documents, please refer to usb.org. The USB 2.0 document home page has a zip file containing the USB 2.0 and OTG 2.0 specifications and an ECN for LPM. The USB device class documents page has the battery charger specification.


Hi everyone, I'm Joe for jasmizcasebrakes.com coming at you with a Donner's Fat Pack 2020 Panini Donner's Football Fat Pack break number 53 with 8 impeccable spots being given away folks. We just have to do one more of these, sell us some spots straight up and then we can do another full case, our second full case of impeccable football tonight. Big thanks to these folks here for getting into it, all 32 teams are in so we're going to do the break first and then we'll re-randomize your name with different dice roll at the end and see who wins those spots. But for the break, 10 times for names and teams, one, two, three, four, five. Michael Keaton's in talks to be Batman again, they've barely released the Robert Pattinson Batman, they're already looking ahead. He's got to have like a multi-picture deal, unless they're saying that they're going to have Michael Keaton as old Batman, I guess. There's 10 times chiefs down to Lions, I'm not sure how they would boot that up unless they're going to suggest that Michael Keaton is an older generation of Batman. Robert Pattinson, well then who gets to who's Bruce Wayne then at that point? I don't know if, here's the first half of the list right there, I don't know how they would work that in. Oh, some sort of crossover thing, but not just a Batman movie, I see. Yeah, if it's a different timeline then I can see them kind of making that work. There's a second half, that'd be interesting. Would it kind of be like, what's that action movie? We're all with like Sylvester Stallone and Helen Miriam and they get all these old people in there but they're running around being, they're like former secret agents. They made like three of them I think, they're really popular. What if we just saw like old Justice League, I guess with the Superman, Superman wouldn't age though. Expendables, that's what it was Randy. Yeah, I've not seen one of those but I heard they're kind of fun. What if they do that for like Justice League, but who ages in Justice League? Superman I don't think ages, does he age? Superman doesn't age. Is that, will that be a problem at some point if Superman doesn't age? Or maybe he just ages slower, slower, slower than, I don't know how that works actually. Someone looked that up. The Superman age. These are the weird things we get into, folks. We're at Jasper's case breaks. Alright, we've got Christian McCaffrey, blue, Baker Mayfield blue, press-proof blue, Juju Smith Schuster and Justin Jefferson, that's pretty nice. Troy Palamalu, Josh Uchi, Trayvon Diggs, Isaiah Coulter, a few others right there. Justin Jefferson's a nice one. That goes to the Minnesota Vikings, Jay Goins. We were just talking about Prince a second ago. Minnesota, Prince, Justin Jefferson. Alright, now that's not too shabby but the whole point of this is really the impeccable spots. So from Victor down to Patrick and everybody in between, let's get everybody's names, put them in here, let's roll it and randomize that list four and a five, nine times. So it's going to be top eight after nine gets into impeccable. One, two, three, four, five and ninth and final time. After nine times, it's going to be the top eight. So from nine on down, my apologies. Stupidrandom.org. We'll get them next time though. In fact, there is another pack up already. We have to do one more or if you don't want to bother with this, you can still buy some spots straight up if you'd like. Alright, congrats to the top eight. Ramon, Mike, Alan, Patrick, Mike, Luke, Josh and Eddie. Congrats to the top eight. You're in the impeccable random team break. We'll put Don 53 next year. As you know from this Donner's pack break number 53. I'm Joe. I'll see you next time for the next one. Bye-bye.


This is a global strategic exercise to show our strength and it's a it's to help us signal to our allies that you know We're still out there in the world doing global work, and it's a deterrence to our enemies I think just the more that we do these exercises more practice and the repetitions that our entire team gets to put in It just goes without showing our our folks from the 92nd ARW they go out there. They Play in this exercise they do their best and I think it shows all the time to strike calm that we are the best at this It is a lot of moving parts There's a there's an extreme timeline that we have to work with and it's a lot of times as we're getting closer and closer to The event things change a lot which forces us to change and move very adaptively with our planning process It is a very incredible thing to be a part of to understand the effect of this exercise and just the global reach that we actually Have and that we execute not just during this exercise, but on a daily basis I think for the airmen that are involved it gives them a little bit of purpose You know each day that they're out there doing their day-to-day jobs and to understand that this is ultimately what we are Going to support It's that tangible piece. I think for everybody at the end of the day to be able to say This is why I do this job


This is a great thrill to be here, especially when I'll be presenting some news stories which I haven't really talked about before. So let's begin here. This picture was taken one hour after Obama first announced he's running for president. I remember I think it was February because it was close to Valentine's Day and I said to him, Mr Obama I have a Valentine's message for you from my mother. She thinks you are a fantastic guy and she hopes you make it to the White House. So he leaned forward and he said, tell your mama. I said hi. But that's not the real Obama is it. This next picture is the real Obama. He's much more cautious than we expected. He likes to weigh up all the options before he makes a decision. And I remember on his desk he was reading a self-help book at the time. And it was a big book. It was called Be Quiet, Be Heard. How to raise delicate issues with an opponent and still find some common ground. Essentially how to compromise. Very interesting. So let's get back to Valentine's Day, shall we? After I did this picture a few years later around Valentine's Day there was this guy and he lived in San Diego. He was married. They had two children, twins, a boy and a girl. They were very poor. So it was Valentine's Day and he wanted to get his wife some flowers. He realised that if he bought a $5 bunch of flowers probably his two kids would have to go without food for a day. So what did he do? He went to a local deli and he stole a bouquet of $5 flowers. They caught him, called the police. Police arrived, looked at his papers and discovered that he's undocumented. So they make immediate proceedings to take him to the border to deport him. Now he didn't have a chance to call his wife, he didn't have a cell phone. So he panicked. There's the emotional trauma of being separated from your family without them knowing what's going on. But there's also, if he's the breadwinner, his wife and two children are going to be put into an emergency mode. So there was a struggle at the border and he panicked as they handcuffed him. And they tazered him.  And then he died two days later. So I teamed up with Human Rights Watch and my own foundation, the People's Portfolio, and we went back to tell some of these stories and I found the wife in San Diego and I asked her if she would take me to the spot where her husband was tazered by the border. We arrived there, she was a very brave lady and we brought her two kids along because she didn't have a babysitter and the two kids were playing with a ball in the background. And I thought, wouldn't it be powerful if I could have the two children in the picture too to photograph the wife at this powerful spot? And this is the picture. As soon as the two children got close to the spot where their father died, the dynamic changed and they needed reassurance from their mother. Now their mother could no longer pose for a picture showing pain or even defiance. She was distracted by her role as mother to nurture and protect her children. So she looks down, she's no longer looking at me and she's protecting her kids who feel very vulnerable. And there's only one person in this picture who's looking at us and that's the father who's passed away. This is a bus called the Freedom Bus and there's an organisation called Puente who drive this bus around America and they ask undocumented people and workers to come out from the shadows and tell their stories and they collect this sort of bank of storytelling. I saw this lady at a demonstration in Phoenix, Arizona and her husband had recently been deported. Now this is when she was pregnant. Now we think of mother and child as a universal image of positivity and tenderness but what happens when the mother has all her platform of support taken away from her and when the baby was born the father was not there, he's still away. This is a shrine. This is in Tijuana and we crossed the border and I found this shrine in a shelter and what happens is before someone makes a very dangerous crossing illegally into America they leave little gifts as a prayer to the Virgin Mary for good luck. What else have we got? Aha. So these ladies were in Nogales in a women's shelter. Now they've just been deported and they have no friends, no connections here, no money and they have three days to stay in the shelter before they're asked to leave because there's so many other people that need the space and you see the sense of being lost on their faces. This man is in Nogales and he's contemplating crossing over illegally into America so you feel that he's planning a very dangerous journey and then there's this lady who is a nun and she prays for his salvation. She prays that he's going to make it okay. I'm not very good with statistics I'm not really qualified to tell you all the ins and outs of the science of the situation. I'm a human person and I discover my stories from the street but I'll tell you what little I know from meeting all these incredible people that around 2001 the American government changed their policy and they decided to militarise most of the safe places along the border hoping that the places that are left where there's no military presence are the most dangerous places on the planet to cross because it's arid, really hot, rocky desert and they thought that that would be a great deterrent and surely no one is going to cross through those areas but what they didn't understand is that for a lot of people who cross the border illegally they're not doing it out of choice. In many cases it's a question of survival for them or their family members. A lot of people are escaping persecution a lot of people are running from gang violence or drug related violence. In some cases it's abject poverty if there's a mother and she can't feed her children in Mexico what does she do? Does she break a law to feed her children? Would you? I probably would break a law if my children were starving and I had to do something to keep them alive. So what they do is in many cases they'll give their children to a family member to look after and they will cross the border and try and get a job as a cleaner or a fruit picker or something so what happens if they cross the desert and they don't make it? They end up here. This is a morg in Phoenix. Now I was told that the desert gets 115 degrees at its worst. When they go across the border it's normally in a group of maybe 15, 20 people with a smuggler and the smuggler tells them to bring just two gallons of water. Now within a few hours in that kind of heat so many people are completely unprepared and that's why on average there are about 450 deaths each year going through these difficult areas in the desert.  Within two or three hours your body is unrecognisable. So it shows you the difficult terrain that people are in. And of course when you do die in the desert you're essentially a missing person because unless they find and identify the body your family members don't know what happened to you. So you're left with this terrible question of what happened to our loved one. So there's a lady she's an amazing lady, her name's Robin Robin Reineke. This is her. She runs a thing called the Missing Migrants Project and her job is to go through all the bodies that come in and to take all the personal belongings that people had on their possession at the time when they died and try and create a file of information and then she matches that file of information with a missing persons file and sees if she can match it and then she somehow helps the families by bringing a sense of closure to their tragedy of someone who's gone missing. Now she's holding a lot of these plastic bags filled with personal belongings that people give. Often it's very simple things. Now you have to remember that these things were found on decomposed bodies and I'll never forget the stench of death. It was horrible. I've not been exposed to this kind of thing before and I remember holding some of these bags and I remember the smell got into my fingers and it stayed there for about a month, freaked me out. This is all that was found on this man's body. A phone, three coins and a chain for good luck in your travels. Then add a few more. There's a comb on this person's body. This one there's a few pictures of his family, two identity cards, a phone, a watch and a brush. And then it goes on and on. Each one of these is somebody's life. I call this kind of like a washing line of the dead. Now let's look at one in particular because it's the details that can be quite haunting. And I remember as I was focusing on this through my lens I noticed the watch was still ticking. So let's talk about this lady. Her name is Femina. So she was very poor. She had a son, Carlos. He was 13 years old and they were starving. So she decided to do the most courageous thing. Leave her role as direct mother, but to be a provider. So she left her son with her family members. I think it was her sister. And she crossed the very dangerous borders. Went into America and got a job as a cleaner. And the idea was to send money back to her son for support. Now her son missed his mum so much. And he would write letters to her saying I'm going to come and see you. I'm going to come to America. I'm starting to run. I'm building up my strength so I'll be ready for the desert. And she kept saying don't come. I want you to stay there because it's so unsafe. One day he found out in his neighbourhood that there was another lady that was prepared to go across the border illegally and she was prepared to take him with her. So they found a smuggler. There was a team of again about 15 people who were crossing the border. And as they went through this dangerous part of the desert the lady that he was with who is essentially his surrogate mother now she started showing signs of dehydration. Now when you're a third of the way into the journey and you start showing those signs the smuggler recognises this and he knew that she's going to slow down the rest of the group and it's very unlikely that she's going to survive this big journey ahead. What they did was as she got weaker and weaker they sat her under a tree and they told the little boy to leave her so they'd keep on going. But the little boy had already lost one mother and he was never going to lose this mother again so he decided to stay to keep her company and the group left him in the desert and he died. Robin, the lady I just showed you who runs a missing persons organisation she had just identified the little boy's body and when I did this picture it was about a week later so Fominia was still in a terrible state of shock that she'd just found out her son died and I remember if you look here this is a little toy guitar she'd bought her son and it was just there in the room and she always thought it would be so nice to give him that guitar when he makes it to America one day and we're united. So she breaks down in tears as she holds the only picture she has of him in a frame and I remember taking one frame and then I put the camera down and I gave her a hug and the tears that she cried were not Hollywood tears it's not like what you see on TV this was visceral this was like an animal mortally wounded it was a groan and I'll never forget the vibrations of that groan going through my body it still haunts me to today this is Mike Wilson what he does, he's a Native American it's one of the most deadliest places on the planet so what he does is he leaves water out for all the migrants crossing so there's just a chance that it might keep them alive till they make it across the border and I asked him tell me about what water means to you and he said water is salvation water is survival and then I asked him something and I'd like to read it to you because it was quite amazing what he said I said how do you know the difference between right and wrong if you're doing this you're kind of helping people who are committing a crime and a lot of people in America would find that a problem so he said you may ask why are you abetting and aiding criminals it's a universal human rights question I have to choose between two sets of laws federal immigration laws and a higher immigration law and a higher moral universal law I would love to honour and obey the federal immigration law but people are dying in my desert and I humbly believe in the tradition of hospitality ok so let's talk about these ladies this lady here her name is Alina one of the most beautiful incredible women I've ever met in my life she used to be undocumented she's now a US citizen she's an activist now and what she does is she campaigns so intensely for these ladies rights because they're all fruit pickers in upstate New York and all these ladies are undocumented in fact I heard a statistic I don't know if it's true that almost half the fruit pickers are undocumented so of course if you're undocumented you're living in the shadows of the law and you're not protected there are many rules and regulations so you're very vulnerable to abuse and a lot of these ladies suffer terrible abuses sexual abuse, violence and they can't complain to anybody because then they'll be deported and on top of that I remember my friends at Human Rights Watch when I produced this picture they were a little nervous about these two ladies being shown because there was a sort of connotation that because they're wearing these bandanas over their faces they look slightly aggressive and menacing perhaps they might even be bandits or even terrorists or something and they didn't want that association made with these very courageous ladies but the truth couldn't be far more different I mean they're wearing these handkerchiefs because they're supposed to be given gloves proper protection with their clothes and proper masks to protect them from these pesticides these poisons on the fruit they're not given anything so this is the only protection they have and if you think they're slightly threatening or menacing think again these ladies are so vulnerable and notice this lady she was wearing a t-shirt said some girls have all the fun so let's talk about Alina I asked her a question I said tell me about courage she said courage is the ability is not the ability to jump from a plane with a parachute it's being able to stand this life this hard life day after day still having hopes and dreams not giving up and thinking that someday you're going to have the power to express what you think without feeling fear sounds a bit like what happened in Paris and then I said Alina what do you hope for and she said I hope to die in my bed and she starts to cry I hope to die in my bed seeing finally justice for these women I hope to die surrounded by all my women telling me we have rights now we have drinking water in our fields we have a bathroom they pay us fair they don't rape us they don't poison us with pesticides we can speak out without fear we can walk and nobody is going to arrest us because we are a different colour that is what I hope for and I'm going to end by reading you a little letter that Robin wrote me, the lady who's holding all the possessions Dear Platon this is when she saw my picture I have never had an experience quite like seeing your photo of me it's hard to put into words but when I see that photo it inspires me to be gentle with myself and to provide some of the tenderness to myself that I give freely to others it also reminds me of the young optimistic naive girl I was when I began the work and how the work has transformed me both into someone I'm proud of and also into someone who is hurt and exhausted the deep tragedy of our border is matched with equal beauty in addition to knowing that the work is on the right side of history I get to meet and help some incredible beautiful people there is such human tenderness in the world's darkest places and without going there you never find the truest of hearts thank you for listening