text:
Q: Create Event Log entry when a file is opened, or copied from CD/DVD I've been tasked with configuring Group Policy/writing a .NET Windows Service which will add entries into a Windows Event Log whenever a user opens or copies a file/files from any optical media (not interested in removable USB drives).
My first attempt was to use C# and get the list of processes and see what files they had open and if the path started with an optical drive letter. This didn't work as while some programs keep the file open (e.g. Acrobat Reader) others do not (Internet Explorer, Notepad). My second attempt was to turn on auditing of object access along with setting the file access security audit on the disc drive ... which you can't do, because there's no security on read-only file systems. My last ditch attempt was to use the auditing of removable storage group policy, but that doesn't add any log entries for optical media (I tested a USB pen drive and that did create entries), additionally it's only available in Windows 8+ and I need to support Windows 7.
So, I am all out of ideas and turning to the experts here to see if you have any ideas on how I could approach this problem.

A: I suspect that this would have to be implemented on a lower, driver level. I suspect that there is commercial software available for this.
Optical drives usually use FAT(32) as the file system, which, as you already noticed, doesn't support auditing. You could of course audit the local file system, but that wouldn't let you distinguish between write access that originates from an optical drive.
I would install Process Monitor from SysInternals, to see if it reports file transfers from the optical drive - it should. I'd give you a starting point.
I personally don't think that this is an easy endeavor since you'll need to install and interact with a driver.
Maybe somebody else has another idea.

A: Since Windows don't have file system hooks like most UNIX but malware authors somehow knew how to hide themselves by hooking into syscalls (aka rootkits) you may want to look into how rootkits work.
You can write a library that hooks into the file open syscall and generate event log entries there. Then write a program to load this library into the system automatically.
Bonus point if you can make this entire logging mechanism hidden, true rootkit style.

redpajama_set_name: RedPajamaStackExchange


text:
Johnny Marr joins Noel Gallagher on stage in Manchester – watch
Leonie Cooper Mar 10, 2015 10:27 am GMT
Credit: Jordan Hughes
The music legends performed 'Ballad Of The Mighty I' together at Manchester Arena
Johnny Marr joined Noel Gallagher onstage at Manchester Arena last night (March 9).
The pair performed 'Ballad Of The Mighty I' together during the encore, a single which features on Noel Gallagher's High Flying Birds' second album, the recently released 'Chasing Yesterday'. Marr plays guitar on the album version, but this is the first time the pair have performed the track together in public. Gallagher has called it one of his best songs, thanks to Marr's contribution. Click above to watch fan-shot footage of the performance.
In October 2014 Gallagher joined Marr on stage at London's O2 Academy Brixton to play The Smiths' 'How Soon Is Now', as well as a cover of Iggy Pop's 'Lust For Life'.
Gallagher's set last night included a number of Oasis covers, including 'Fade Away', 'Champagne Supernova', 'Digsy's Dinner', 'Don't Look Back In Anger' and 'The Masterplan'. Gallagher plays London's O2 tonight (March 10). Scroll down for a full setlist from last night's show.
Noel Gallagher's High Flying Birds played:
'Do the Damage'
'(Stranded On) The Wrong Beach'
'Everybody's on the Run'
'Fade Away'
'In the Heat of the Moment'
'Lock All the Doors'
'Riverman'
'The Death of You and Me'
'You Know We Can't Go Back'
'Champagne Supernova'
'Dream On'
'The Dying of the Light'
'The Mexican'
'AKA… Broken Arrow'
'Digsy's Dinner'
'If I Had a Gun…'
'AKA… What a Life'
'Don't Look Back in Anger'
'Ballad of the Mighty I'
'The Masterplan'
Meanwhile, Marr is set to release a seven-inch Depeche Mode cover backed with a live Smiths track for Record Store Day 2015, which takes place on April 18. The single will consist of Marr's own version of electronic rock band's 1993 single 'I Feel You' and a live version of The Smiths' 1984 b-side 'Please, Please, Please, Let Me Get What I Want'.
NEW YORK, NEW YORK - JUNE 10: Austin Butler attends "The Dead Don't Die" New York Premiere at Museum of Modern Art on June 10, 2019 in New York City. (Photo by Theo Wargo/Getty Images)
Baz Luhrmann confirms who will play Elvis in upcoming biopic
Crowd shot from TRNSMT Festival 2019 Credit: Getty Images
Old woman on shoulders is the unlikely hero of TRNSMT
George R R Martin Credit: Getty Images
George R.R. Martin says he won't change his books based on the reaction to Season 8 of 'Game Of Thrones'

redpajama_set_name: RedPajamaCommonCrawl


text:
Looking for a view
Situated at 9,600-feet, the Sheep Mountain Lookout provides sprawling views of the Bighorn Mountains. The tower is open through October, but be prepared for snow if you go late in the season. (Kelsey Dayton/WyoFile)
October 21, 2016 by Kelsey Dayton Leave a Comment
We stood staring at each other, piles of blankets and bags of food at our feet. A sharp cold wind was picking up and the sun was starting to sink.
Try again, I pleaded with my friend.
We'd driven to the Sheep Mountain Lookout, situated at 9,600-feet in the Bighorn Mountains. The tension I'd carried from a long week had started to evaporate almost immediately as we took the highway out of Buffalo into the mountains.
After winding our way up a dirt road and past patches of snow, we'd suddenly emerged above treeline to an exposed summit with a small (by fire tower standards) squat, building, which was to act as our shelter for the night. The cold stung as we exited the car, laden with gear and eager to warm up inside.
But the door was stuck. The exhaustion and stress that had melted away on our drive into the mountains came back each time we punched in the code and the door stayed firmly closed. The handle clicked loose, but the door still wouldn't open. We took turns jamming our shoulders against it. It wouldn't budge.
My friend ordered me to call and leave a message at the Forest Service office. (We had surprisingly good cell service.) We knew no one would answer, but she hoped we'd at least be able to get a refund. As I left the message, the door suddenly clicked open.
Sign up for the free Wyofile weekly Newsletter
The Civilian Conservation Corps built the fire tower in 1950 atop Sheep Mountain. It was used as a fire lookout until the early 1970s. Now it's one of two fire towers in Wyoming you can rent. This one in the Bighorns, and the Spruce Mountain Lookout Tower in the Medicine Bow National Forest.
The Spruce Mountain lookout stands 55-feet tall with multiple flights of steep stairs, while the Sheep Mountain tower has only a single short flight. The treeless terrain on Sheep Mountain, though, gives incredible views into the Cloud Peak Wilderness and out to the Powder River Basin. The building itself might not look as impressive, but we were glad for the short hike up the stairs as we hauled the multiple loads of blankets and other items we'd brought to keep warm.
Cold weather camping
The Sheep Mountain Fire Lookout is open to renters June 15 through October, weather permitting. The summer days book up months in advance, but I'd been able to secure the night of Oct. 7 only a week before.
With no electricity or wood-burning stove in the lookout, my friend had been skeptical and not quite a willing participant in what was almost a winter camping expedition. I'd convinced her we'd be fine—since we could drive directly to the base of the tower, we could bring as many blankets and warm clothes as we wanted. Plus, Wyoming's fire towers are popular destinations, not just for renters staying overnight, but also for visitors during the day. Going this late in the season meant we had the area and the stunning sunset to ourselves.
The sunset surrounded us, glowing colors filtering in from every angle through the windows in every wall. We snapped pictures as each moment it changed. Then we sat and watched.
We made the mistake of bringing only a small lantern and headlamp and darkness came early. So did the cold. Sitting in winter jackets and hats I watched my breath come out in puffs. The tower creaked with the constant battering of wind. At about 10 p.m. it was suddenly quiet.
"I think it finally stopped," my friend said.
About 15 minutes later the windows rattled again as the wind picked up.
By 6 a.m. the sun started lighting the sky, flooding in through the windows of the tower. I had stayed warm enough all night in my down sleeping bag perched on the top of the bunk bed in the tower, but I still hadn't slept very well. I watched light spread across the mountains and I felt refreshed in a way that only the mountains can provide, but without the stiffness of sleeping on the ground, or the ache of leaving a warm sleeping bag for frosty air. We were surprisingly warm inside the small building, and as we started to pack up, we began planning when we'd return next year.
The Sheep Mountain Lookout was built in 1950 and used as a fire lookout until the 1970s. The tower is now available to rent June through October. The windows provide 360-degree views and also a natural early alarm clock when the sun rises in the morning. (Kelsey Dayton/WyoFile)
If you want to go: You'll need to make a reservation. It cost $50 a night and a $9 transaction fee. If you want to go during the summer, you'll need to make a reservation well in advance.
There is no electricity or water. Pack accordingly, as though you were camping, but make sure to bring water.
Be prepared for quickly changing weather. The lookout is located at 9,600-feet, so expect high-elevation weather including snow and wind. While the tower is open through October, it can close early due to snow.
There are two twin beds in the form of bunk beds. You need to bring all bedding. If more than two people are in your party, bring sleeping gear for the floor.
Lawmakers derail trapping regulations against Wyo's best interest
Munching moose
Ice hunting
Filed Under: outdoors, Peaks to Plains
About Kelsey Dayton
Kelsey Dayton is a freelancer and the editor of Outdoors Unlimited, the magazine of the Outdoor Writers Association of America. She has worked as a reporter for the Gillette News-Record, Jackson Hole News&Guide and the Casper Star-Tribune. Contact Kelsey at [email protected] Follow Kelsey on Twitter at @Kelsey_Dayton
Want to join the discussion? Fantastic, here are the ground rules:
- Identify yourself with full name and city. WyoFile stands behind everything we publish and expects commenters to do the same.
- No personal attacks, profanity, discriminatory language or threats. Keep it clean, civil and on topic.
Name ( first and last name are required ) *
State of Residence * AlabamaAlaskaArizonaArkansasCaliforniaColoradoConnecticutDelawareDistrict Of ColumbiaFloridaGeorgiaHawaiiIdahoIllinoisIndianaIowaKansasKentuckyLouisianaMaineMarylandMassachusettsMichiganMinnesotaMississippiMissouriMontanaNebraskaNevadaNew HampshireNew JerseyNew MexicoNew YorkNorth CarolinaNorth DakotaOhioOklahomaOregonPennsylvaniaRhode IslandSouth CarolinaSouth DakotaTennesseeTexasUtahVermontVirginiaWashingtonWest VirginiaWisconsinWyomingOutside of the U.S.


This is a placeholder page for Tyrell Clark, which means this person is not currently on this site. We do suggest using the tools below to find Tyrell Clark.
You are visiting the placeholder page for Tyrell Clark. This page is here because someone used our placeholder utility to look for Tyrell Clark. We created this page automatically in hopes Tyrell Clark would find it. If you are not Tyrell Clark, but are an alumni of Bellefontaine High School, register on this site for free now.


text:
Investors King
Ecobank's Masterpass Records High Patronage
Samed Olukoya
Ecobank Nigeria said its product- Masterpass QR is now attracting huge patronage, as customers are treated to its service delivery.
The Deputy Managing Director of the bank, Tony Okpanachi, who expressed delight over its level of acceptability and patronage, reiterated that it is really an innovative global digital payment solution to raise the bar in the nation's financial landscape.
According to him, latest checks have revealed that thousands of wholesalers and retailers in the country have adopted the payment technology as their preferred means of receiving payments for goods and services.
"We are quite impressed with the level of acceptance and enthusiasm so far shown by all segments of the society. The patronage has been phenomenal.
"Supper shops, fuel dispensing stations, hotels, food vendors, intra-city transporters, even the operators of tricycle are not left out in adopting Ecobank Masterpass QR for their transactions. This is certainly a big plus for the Nigerian economy," he said.
Head SME, Commercial Banking, Ecobank Nigeria, Sunkanmi Olowo, said Ecobank Masterpass QR serves the rapidly expanding needs of individuals and merchants in Nigeria and across Africa who are increasingly turning to mobile for payments. This will bring many millions quickly into an organised financial system.
Foreign Airliner Loses Gear on Bad Abuja Airport Runway
Nigeria's Aviation Sector Hits Turbulence
CEO/Founder Investors King Ltd, a foreign exchange research analyst, contributing author on New York-based Talk Markets and Investing.com, with over a decade experience in the global financial markets.
Sub Saharan Africa Mergers and Acquisition Transactions Totalled US$ 25.7 Billion in 2020
Nigeria's Economy to Rebound in 2021, World Bank Predicts 1.1 Percent Growth Rate in 2021
Tunde Thomas: FCMB Commences Review Into Allegations of Unethical Behavior Against MD Nuru
Mrs. Nneka Onyeali-Ikpe Takes Over as Fidelity Bank CEO
CBN Policy, Macroeconomic Challenges to Pressure Banks in 2021
Banks to Experience Severe Credit Losses in Late 2021 – Mckinsey & Company
Tony Elumelu Acquires Shell, Total, ENI Stakes in OML 17
Tony Elumelu owned Heir Holdings Limited and its related company Transnational Corporation of Nigeria Plc on Friday announced it has completed the purchase of 45 percent stake in Oil Mining Lease (OML 17) through TNOG Oil and Gas Limited.
The acquisition includes all assets of Shell Petroleum Development Company of Nigeria Limited (30 Percent), Total E&P Nigeria Ltd (10 percent) and ENI (five percent) — in the lease.
It was further stated that TNOG Oil and Gas Limited will also have the sole right to operate OML 17.
The field presently has a production capacity of 27,000 barrels per day. Also, there are estimated 2P reserves (proven and probable) of 1.2 billion barrels and an additional one billion barrels in possible reserves — all of oil equivalent.
A consortium of global and regional banks and investors provided a financing component of $1.1 billion for the largest oil and gas financing in Africa in over a decade.
In a statement released on Friday, Shell said the completion was after all the necessary approvals have were received from authorities.
"A total of $453m was paid at completion with the balance to be paid over an agreed period. SPDC will retain its interest in the Port Harcourt Industrial and Residential Areas, which fall within the lease area," the SPDC said.
Speaking after the completion of the deal, Elumelu said "We have a very clear vision: creating Africa's first integrated energy multinational, a global quality business, uniquely focused on Africa and Africa's energy needs. The acquisition of such a high-quality asset, with significant potential for further growth, is a strong statement of our confidence in Nigeria, the Nigerian oil and gas sector and a tribute to the extremely high-quality management team that we have assembled.
"As a Nigerian, and more particularly an indigene of the Niger Delta region, I understand well our responsibilities that come with stewardship of the asset, our engagement with communities and the strategic importance of the oil and gas sector in Nigeria. We see significant benefits from integrating our production, with our ability to power Nigeria, through Transcorp, and deliver value across the energy value chain.
"I would like to thank Shell, Total and ENI, for the professionalism of the process, the Federal Government of Nigeria, the Ministry of Petroleum Resources, and the NNPC for the confidence they have placed in us."
Tony Elumelu is the Chairman of Heirs Holdings Limited, Transcorp and United Bank for Africa Plc.
Also, read Transcorp Plc Acquires FGN's 100% Equity in Afam Power for N105 Billion
Exporters Say CBN Pre-export Requirements is Frustrating Export of Goods
Exporters have said the recently introduced pre-export requirements by the Central Bank of Nigeria is creating unnecessary bottlenecks for exporters and the movement of goods out of the country.
Exporters, who spoke under the aegis of the Network of Practicing Non-oil Exporters of Nigeria (NPNEN), said the electronic Nigeria Export Proceed Form now required by financial institutions from exporters had come with so many challenges.
Ahmed Rabiu, the President, NPNEN, explained that the new policy had several requirements that often led to delays and loss of income on the part of exporters.
He said, "We acknowledge the CBN's desire to ensure that all exports out of Nigeria are documented in order to ensure that the proceeds of such exports are repatriated.
"However, the reality on the field shows that the process is causing undue delays and consequently, encouraging corruption."
According to them, in the new pre-export requirements, the Central Bank of Nigeria wants an export transaction to be initiated through eNXP processing on the trade monitoring system.
After which exporters are expected to have a pre-shipment inspection agent, the Nigeria Customs Service and other designated government agencies carry out their pre-export inspections.
The exporters said the pre-shipment inspection agent was expected to issue a clean Certificate of Inspection while Customs would issue the Single Good Declaration. All these they said takes time and delay goods from leaving the country on time.
Pointing to a recent report, they said about N868 billion worth of goods bound for export were stuck at the ports due to the new policy.
Speaking further Rabiu said, "For example, for the PIA to issue the CCI, the exporter is required to upload a certificate of origin as one of the supporting documents for the eNXP.
"The PIA is also required to upload the CCI to the TRMS(M) and until this is done, the Customs service will not issue the Single Good Declaration."
He added, "After issuing the SGD, the customs is further required to upload it into the TRMS before the goods are allowed to be gated into the port and loaded on the vessel by the shipping line."
Ardova Plc in Talks to Acquire Enyo Retail and Supply Limited
Ardova Plc, Nigeria's leading integrated energy company, has commenced discussions to acquire Enyo Retail and Supply Limited.
According to the statement issued and signed by Oladehinde Nelson-Cole, Ag. Company Secretary/General Counsel, Ardova Plc, Enyo is one of the newest and fastest-growing retail and supply companies in the downstream sector.
It stated, "This announcement is pursuant to the acceptance in principle of AP's offer and acquisition framework by the shareholders of Enyo, it is subject to the successful completion of a due diligence exercise and the receipt of all required regulatory approvals."
"This announcement is pursuant to the acceptance in principle of AP's offer and acquisition framework by the shareholders of Enyo, it is subject to the successful completion of a due diligence exercise and the receipt of all required regulatory approvals."
Speaking on the yet to be completed deal, Mr. Olumide Adeosun, CEO, Ardova Plc, said upon completion, Ardova will retain the Enyo branded stations which will operate side by side with the Ardova brand while simultaneously leveraging on the strengths of Ardova and its group companies.
He added that the two companies are determined to conclude the deal by the end of Q1 2021.
Enyo presently operates over 90 stations across the nation and attends to over 100,000 retail customers on a daily basis.
Ardova Plc and Enyo Retail & Supply Limited promised to furnish stakeholders with more information on the progress of the deal.
Nigeria's Big Oil-Refining Revamp Gets Off To A Slow Start
Military Storms Bobi Wine House After He Rejects Election Results
Finance4 weeks ago
Central Bank Closes 42 Microfinance Banks
Zenith Bank Invests Over N12 Billion in Targeted Interventions, Posts N178 Billion PAT
CBN Closed All Naira Accounts of IMTOs
Cryptocurrency3 weeks ago
US Securities and Exchange Commission Goes After Ripple(XRP)
Crude Oil4 weeks ago
Brent Crude Oil Dropped 1.9 Percent Amid Fast-spreading New Coronavirus
Heartbroken American Mistress Displays Dangote's Buttocks in a Viral Video
Nigeria Prefers NIN Linked SIM Cards to Health as Crowd Gathers at NIMC Enrolment Centres
FCMB Group MD Links to Death of Tunde Thomas, Husband of Married Staff He Fathered Her Kids
COPYRIGHT 2021 | INVESTORS KING LTD | NIGERIA


Rolex watch items personify the effort and resourcefulness in excess of 4,000 employees, throughout the mobile phone industry's, who craft a couple of,000 men's and women's rolex replica watches each day. This will make Rolex watch the planet greatest luxury rolex datejust replica watch brand.
The storyline of remarkable success started in 1905, when German watch manufacturing company Hendes Wilhelm Wilsdorf and the British partner Alfred James Davis founded Wilsdorf and Davis Ltd. In 1908, the organization was registered as Rolex watch. You Replica Porsche Design Worldtimer Watches will find several tales concerning the origin of title Rolex watch. The term is made up also it was most likely the very best solution for that global market, because it was simple to pronounce and memorable.Following a couple of many years of selling pocket and purse designer rolex milgauss replica watches, company designed a large step, using its first edition of timepieces.
These were operated by very accurate and economical systems, which have been imported from Herman Aegler's company. These actions switched to make a difference area of the brand's fast growth.Around 1910, Swiss watch manufacturing company used Aegler's mechanism on the planet first watch to get the Swiss Certificate of Precision (COSC Certificate). This certificate is granted by greatest watch making government bodies in Europe. 4 years later, Rolex watch received the category "A" precision certificate, by Kew observatory in the uk, which to the year 1914, was reserved solely for marine chronometers.Next, Swiss replica jaeger-lecoultre amvox watches manufacturing company set its very own rigorous tests, for every mechanism, which was targeted for use in the top grade rolex daytona replica watches and just probably the most accurate and reliable items carried out with Rolex watch signature.
Since, brand's best rolex submariner replica watches happen to be acknowledged as an assurance from the greatest quality.Using the finish of ww 1, Rolex watch designed a the majority of elevated recognition of men's timepieces and also the brand was granted because of its numerous improvements, by most exclusive observatories on the planet: Kew, Geneva, Neuchatel, and Besancon.


PREREQUISITES AND PRACTICAL IMPLICATIONS IN TEACHING ENGLISH AS A FOREIGN LANGUAGE (TEFL) WITH REFERENCE TO THE STUDENTS OF GRADUATION IN THE COLLEGE OF SCIENCES AND ARTS, ALNAMAS, KINGDOM OF SAUDI ARABIA.
IS DECONSTRUCTION DISMANTLING THE TEXT?
AND ENDEAVOURS OF ACCULTURATION AND CROSS – BORDER RELATIONSHIPS – A CRITICAL APPRAISAL.
THE USE OF ENGLISH LANGUAGE IN THE SHORT STORIES OF SALMNAN RUSHDIE 'S EAST, WEST.
(Asst. Prof of English, Head of the Department, Dr. BRR Govt. Degree & PG College, (Palamuru University), Jadcherla, Mahabubnagar, Telangana State.


text:
Xestoblatta panamae är en kackerlacksart som beskrevs av Ashley B. Gurney 1939.

Xestoblatta panamae ingår i släktet Xestoblatta och familjen småkackerlackor. Artens utbredningsområde är Panama. Inga underarter finns listade i Catalogue of Life.

Källor

Småkackerlackor
panamae

redpajama_set_name: RedPajamaWikipedia


text:
Results for "fda"
ProPublica on the FDA and Rapid Tests
by Alex Tabarrok December 22, 2021 at 7:55 am in
Lydia DePillis has written the best piece on the FDA that I have ever read in a mainstream news publication. It gets everything right and yes it frankly verifies everything that I have been saying about the FDA and rapid tests for the last year and a half. I wish it had been written earlier but I suppose that illustrates how difficult it is to radically change people's mindset from the FDA as protector to the FDA as threat. The sub head is:
Irene Bosch developed a quick, inexpensive COVID-19 test in early 2020. The Harvard-trained scientist already had a factory set up. But she was stymied by an FDA process experts say made no sense.
The piece recounts how cheap, rapid tests could have been approved in March of 2020! Here's the opening bit:
When COVID-19 started sweeping across America in the spring of 2020, Irene Bosch knew she was in a unique position to help.
The Harvard-trained scientist had just developed quick, inexpensive tests for several tropical diseases, and her method could be adapted for the novel coronavirus. So Bosch and the company she had co-founded two years earlier seemed well-suited to address an enormous testing shortage.
E25Bio — named after the massive red brick building at MIT that houses the lab where Bosch worked — already had support from the National Institutes of Health, along with a consortium of investors led by MIT.
Within a few weeks, Bosch and her colleagues had a test that would detect coronavirus in 15 minutes and produce a red line on a little chemical strip. The factory where they were planning to make tests for dengue fever could quickly retool to produce at least 100,000 COVID-19 tests per week, she said, priced at less than $10 apiece, or cheaper at a higher scale.
Bosch's prototype attracted a top Silicon Valley venture capital firm, which pitched in $2 million.
"We are excited about what E25Bio is capable of shipping in a short amount of time: a test that is significantly cheaper, more affordable, and available at-home," said firm founder Vinod Khosla. (Disclosure: Khosla's daughter Anu Khosla is on ProPublica's board.)
On March 21 — when the U.S. had recorded only a few hundred COVID-19 deaths — Bosch submitted the test for emergency authorization, a process the Food and Drug Administration uses to expedite tests and treatments.
You know how the story ends but really READ the WHOLE THING.
ProPublica on FDA Delay
by Alex Tabarrok November 5, 2021 at 7:23 am in
If you have been following MR for the last 18 months (or 18 years!) you won't find much new in this ProPublica piece on FDA delay in approving rapid tests but, other than being late to the game, it's a good piece. Two points are worth emphasizing. First, some of the problem has been simple bureaucratic delay and inefficiency.
In late May, WHPM head of international sales Chris Patterson said, the company got a confusing email from its FDA reviewer asking for information that had in fact already been provided. WHPM responded within two days. Months passed. In September, after a bit more back and forth, the FDA wrote to say it had identified other deficiencies, and wouldn't review the rest of the application. Even if WHPM fixed the issues, the application would be "deprioritized," or moved to the back of the line.
"We spent our own million dollars developing this thing, at their encouragement, and then they just treat you like a criminal," said Patterson. Meanwhile, the WHPM rapid test has been approved in Mexico and the European Union, where the company has received large orders.
An FDA scientist who vetted COVID-19 test applications told ProPublica he became so frustrated by delays that he quit the agency earlier this year. "They're neither denying the bad ones or approving the good ones," he said, asking to remain anonymous because his current work requires dealing with the agency.
Recall my review of Joseph Gulfo's Innovation Breakdown.
Second, the FDA has engaged in regulatory nationalism–refusing to look at trial data from patients in other countries. This is madness when India does it and madness when the US does it.
For example, the biopharmaceutical giant Roche told ProPublica that it submitted a home test in early 2021, but it was rejected by the FDA because the trials had been done partly in Europe. The test had compared favorably with Abbott's rapid test, and received European Union approval in June. The company plans to resubmit an application by the end of the year.
A smaller company, which didn't want to be named because it has other contracts with the U.S. government, withdrew its pre-application for a rapid antigen test with integrated smartphone-based reporting because it heard its trial data from India — collected as the delta variant was surging there — wouldn't be accepted. Doing the trials in the U.S. would have cost millions.
Photo credit: MaxPixel.
Clement and Tribe Predicted the FDA Catastrophe
by Alex Tabarrok October 27, 2021 at 7:24 am in
Paul Clement and Laurence Tribe
Laboratory developed tests are not FDA regulated–never have been–instead the labs are regulated under the Clinical Laboratory Improvement Amendments (CLIA) as overseen by the CMS. Laboratory developed tests are the kind your doctor orders, they are a service not a product and are not sold directly to patients. Labs develop new tests routinely and they do not apply to the FDA for approval. Despite this long history, the FDA has claimed that it has the right to regulate lab tests and they have merely chosen not to exercise this right for forty years. In 2015, Paul Clement the former US Solicitor General under George W. Bush and Laurence Tribe, considered by many to be the leading constitutional lawyer in the United States, wrote an article that rejected the FDA's claims writing that the "FDA's assertion of authority over laboratory-developed testing services is clearly foreclosed by the FDA's own authorizing statute" and "by the broader statutory context."
Despite lacking statutory authority, the FDA has continued to claim it is authorized to regulate laboratory tests. Indeed, a key failure in the pandemic happened when the FDA issued so-called "guidance documents" saying that any SARS-CoV-II test had to be pre-approved by the FDA. Thus, the FDA reversed the logic of emergency. In ordinary times, pre-approval was not necessary but when speed was of the essence it became necessary to get FDA pre-approval. The FDA's pre-approval process slowed down testing in the United States and it wasn't until after the FDA lifted its restrictions in March that tests from the big labs became available.
Clement and Tribe rejected the FDA claims of regulatory authority over laboratory developed tests on historical, statutory, and legal grounds but they also argued that letting the FDA regulate laboratory tests was a dangerous idea. In a remarkably prescient passage, Clement and Tribe (2015, p. 18) warned:
The FDA approval process is protracted and not designed for the rapid clearance of tests. Many clinical laboratories track world trends regarding infectious diseases ranging from SARS to H1N1 and Avian Influenza. In these fast-moving, life-or-death situations, awaiting the development of manufactured test kits and the completion of FDA's clearance procedures could entail potentially catastrophic delays, with disastrous consequences for patient care.
Clement and Tribe nailed it. Catastrophic delays, with disastrous consequences for patient care is exactly what happened.
Addendum: See also my pre-pandemic piece on this issue, Our DNA, Our Selves.
FDA relents on mix and match for third dose
Here is the NYT account, they sound both confused and confusing. How about "if you have had J&J, it is fine and probably preferable to get a further dose of Moderna or Pfizer"? Yet suddenly it is fine.
And it is the usual story — people have been doing this for months, and the FDA would not say it is terrible. Because they knew it wasn't. But they wouldn't say so. And now the status quo has shifted, and so everyone will treat it as fine, as if the supposed fears of yesterday never ever existed.
Maybe I should insult people more often?
FDA Approves American Rapid Antigen Test
by Alex Tabarrok October 5, 2021 at 7:25 am in
I wrote earlier:
What makes the FDAs failure to approve more rapid antigen tests even more galling is that the test being sold cheaply in the Amsterdam supermarket is the Flowflex, an American test made by Acon Labs in San Diego.
Well the FDA has finally approved the Acon test! Apparently it is good enough for the Germans and for US citizens. Hoorah! USA Today notes:
ACON expects to make 100 million tests per month by the end of this year. Production could double to 200 million monthly tests by February, according to the FDA.
…The United Kingdom and Germany have made significant purchases of home tests and widely distributed them to their residents to slow the spread of coronavirus. Such large government purchases allowed manufacturers to continue making tests even when demand softened as cases dropped.
The Biden administration will spend nearly $1.2 billion to purchase up to 187 million home tests from Abbott Laboratories and Celltrion Inc., company officials confirmed. The Department of Defense announced additional contracts totaling $647 million to buy 60 million kits from Abbott and three other testing vendors: OraSure Technologies, Quidel and Intrivio Holdings.
The FDA has authorized seven antigen-based tests that can be used at home without a prescription. The EU has authorized 21 tests beginning with the letter A (I am not sure all of these are authorized for home use but you get the idea.) Turtle slow. Still this is a big improvement.
Frankly, I think all the pressure from people like Michael Mina amplified by myself and others over 18 months and culminating in David Leonhartd's NYTimes article Where Are the Tests? finally pushed them over the edge.
The NYTimes on the FDA and Rapid Tests
by Alex Tabarrok September 22, 2021 at 7:25 am in
In July of 2020 I wrote in Frequent, Fast, and Cheap is Better than Sensitive:
A number of firms have developed cheap, paper-strip tests for coronavirus that report results at-home in about 15 minutes but they have yet to be approved for use by the FDA because the FDA appears to be demanding that all tests reach accuracy levels similar to the PCR test. This is another deadly FDA mistake.
…The PCR tests can discover virus at significantly lower concentration levels than the cheap tests but that extra sensitivity doesn't matter much in practice. Why not? First, at the lowest levels that the PCR test can detect, the person tested probably isn't infectious. The cheap test is better at telling whether you are infectious than whether you are infected but the former is what we need to know to open schools and workplaces.
It's great that other people including the NYTimes are now understanding the problem. Here is the excellent David Leonhardt in Where are the Tests?
Other experts are also criticizing the Biden administration for its failure to expand rapid testing. Even as President Biden has followed a Covid policy much better aligned with scientific evidence than Donald Trump's, Biden has not broken through some of the bureaucratic rigidity that has hampered the U.S. virus response.
In the case of rapid tests, the F.D.A. has loosened its rules somewhat over the past year, allowing the sale of some antigen tests (which often cost about $12 each). But drugstores, Amazon and other sellers have now largely run out of them. I tried to buy rapid tests this weekend and couldn't find any.
The F.D.A.'s process for approving rapid tests is "onerous" and "inappropriate," Daniel Oran and Dr. Eric Topol of Scripps Research wrote in Stat News.
For the most part, the F.D.A. still uses the same cumbersome process for approving Covid tests that it uses for high-tech medical devices. To survive that process, the rapid tests must demonstrate that they are nearly as sensitive as P.C.R. tests, which they are not.
But rapid tests do not need to be so sensitive to be effective, experts point out. P.C.R. tests often identify small amounts of the Covid virus in people who had been infected weeks earlier and are no longer contagious. Rapid tests can miss these cases while still identifying about 98 percent of cases in which a person is infectious, according to Dr. Michael Mina, a Harvard epidemiologist who has been advocating for more testing
Identifying anywhere close to 98 percent of infectious cases would sharply curb Covid's spread. An analysis in the journal Science Advances found that test frequency matters more for reducing Covid cases than test sensitivity.
As I said on twitter what makes the FDA's failure to approve more rapid antigen tests especially galling is that some of the tests being sold cheaply in Europe are American tests just ones not approved in the United States. If it's good enough for the Germans it's good enough for me!
The FDA and CDC Standards on the J&J Vaccine and the Immunocompromised are Unintelligible
by Alex Tabarrok August 16, 2021 at 7:25 am in
Last week the FDA authorized and the CDC now recommends a third mRNA booster for the immunocomprimised. The CDC says:
Who Needs an Additional COVID-19 Vaccine?
Currently, CDC is recommending that moderately to severely immunocompromised people receive an additional dose. This includes people who have:
Been receiving active cancer treatment for tumors or cancers of the blood
Received an organ transplant and are taking medicine to suppress the immune system
Received a stem cell transplant within the last 2 years or are taking medicine to suppress the immune system
Moderate or severe primary immunodeficiency (such as DiGeorge syndrome, Wiskott-Aldrich syndrome)
Advanced or untreated HIV infection
Active treatment with high-dose corticosteroids or other drugs that may suppress your immune response
That's very reasonable but the headline is inaccurate because the CDC then goes on to say:
The FDA's recent EUA amendment only applies to mRNA COVID-19 vaccines, as does CDC's recommendation.
Emerging data have demonstrated that immunocompromised people who have low or no protection following two doses of mRNA COVID-19 vaccines may have an improved response after an additional dose of the same vaccine. There is not enough data at this time to determine whether immunocompromised people who received the Johnson & Johnson's Janssen COVID-19 vaccine also have an improved antibody response following an additional dose of the same vaccine.
So if you got one dose of J&J and are immunocompromised then you can't get a second dose. But if you got two doses of an mRNA (which is already more effective than one dose of J&J) and are immunocompromised then the CDC recommends a third dose. None of this makes any sense. The weasel words there 'isn't enough data to determine' indicate a typical failure to think in Bayesian terms and use all the information available and a typical failure to think in terms of patient welfare and expected cost and benefits.
Notice also the illiberal default. Instead of saying 'we don't have data on the J&J vaccine and the immunocompromised so we are not at this time recommending or not recommending boosters but leaving this decision in the hands of patients and their physicians' they say 'we don't have data and so we are forbidding patients and their physicians from making a decision using their own judgment.'
Hat tip: Pharmacist CB.
The TGA is Worse than the FDA, and the Australian Lockdown
I have been highly critical of the FDA but in Australia the FDA is almost a model to be emulated. Steven Hamilton and Richard Holden do not mince words:
At the end of 2020, as vaccines were rolling out en masse in the Northern Hemisphere, the TGA [Therapeutic Goods Administration, AT] flatly refused to issue the emergency authorisations other regulators did. As a result, the TGA didn't approve the Pfizer vaccine until January 25, more than six weeks after the US Food and Drug Administration (FDA), itself not exactly the poster child of expeditiousness.
Similarly, the TGA didn't approve the AstraZeneca vaccine until February 16, almost seven weeks after the UK.
In case you're wondering "what difference does six weeks make?", think again. Were our rollout six weeks faster, the current Sydney outbreak would likely never have exploded, saving many lives and livelihoods. In the face of an exponentially spreading virus that has become twice as infectious, six weeks is an eternity. And, indeed, nothing has changed. The TGA approved the Moderna vaccine this week, eight months after the FDA.
It approved looser cold storage requirements for the Pfizer vaccine, which would allow the vaccine to be more widely distributed and reduce wastage, on April 8, six weeks after the FDA. And it approved the Pfizer vaccine for use by 12 to 15-year-olds on July 23, more than 10 weeks after the FDA.
And then there's the TGA's staggering decision not to approve in-home rapid tests over reliability concerns despite their widespread approval and use overseas.
Where's the approval of the mix-and-match vaccine regimen, used to great effect in Canada, where AstraZeneca is combined with Pfizer to expand supply and increase efficacy? Where's the guidance for those who've received two doses of AstraZeneca that they'll be able to receive a Pfizer booster later?
In the aftermath of the pandemic, when almost all of us should be fully vaccinated,there will be ample opportunity to figure out exactly who is to blame for what.
But the slow, insular, and excessively cautious advice of our medical regulatory complex, which comprehensively failed to grasp the massive consequences of delay and inaction, must be right at the top of that list.
You might be tempted to argued that the TGA can afford to take its time since COVID hasn't been as bad in Australia as in the United States but that would be to ignore the costs of the Australian lockdown.
Article 13 of the Universal Declaration of Human Rights states that
Everyone has the right to freedom of movement and residence within the borders of each state.
Everyone has the right to leave any country, including his own, and to return to his country.
Australia has now violated each and every clause of this universal human right and seemingly without much debate or objection. It is deeply troubling to see people prevented from leaving or entering their own country and soldiers in the street making sure people do not travel beyond a perimeter surrounding their homes. The costs of lockdown are very high and thus so is any delay in ending these unprecedented infringements on liberty.
The American Academy of Pediatrics Tells the FDA to Speed Up and Stop Endangering Patients
by Alex Tabarrok August 9, 2021 at 7:28 am in
The American Academy of Pediatrics has written a stunning letter to the FDA:
We understand that the FDA has recently worked with Pfizer and Moderna to double the number of children ages 5-11 years included in clinical trials of their COVID-19 vaccines. While we appreciate this prudent step to gather more safety data, we urge FDA to carefully consider the impact of this decision on the timeline for authorizing a vaccine for this age group. In our view, the rise of the Delta variant changes the risk-benefit analysis for authorizing vaccines in children. The FDA should strongly consider authorizing these vaccines for children ages 5-11 years based on data from the initial enrolled cohort, which are already available, while continuing to follow safety data from the expanded cohort in the post-market setting. This approach would not slow down the time to authorization of these critically needed vaccines in the 5–11-year age group.
In addition, as FDA continues to evaluate clinical trial requirements for children under 5 years, we similarly urge FDA to carefully consider the impact of its regulatory decisions on further delays in the availability of vaccines for this age group. Based on scientific data currently available on COVID-19 vaccines, as well as on 70 years of vaccinology knowledge in the pediatric population, the Academy believes that clinical trials in these children can be safely conducted with a 2-month safety follow-up for participants. Assuming that the 2-month safety data does not raise any new safety concerns and that immunogenicity data are supportive of use, we believe that this is sufficient for authorization in this and any other age group. Waiting on a 6-month follow-up will significantly hinder the ability to reduce the spread of the hyper infectious COVID-19 Delta variant among this age group, since it would add 4 additional months before an authorization decision can be considered. Based on the evidence from the over 340 million doses of COVID-19 doses administered to adults and adolescents aged 12-17,as well as among adults 18 and older, there is no biological plausibility for serious adverse immunological or inflammatory events to occur more than two months after COVID-19 vaccine administration.
In my many years of writing about the FDA, I can't recall a single instance in which a major medical organization told the FDA to use a smaller trial and speed up the process because FDA delay was endangering the safety of their patients. Wow.
The invisible graveyard is invisible no more.
The FDA Is Still Much Too Strict
Here is just one bit from a superb post on the FDA by psychiatrist Scott Alexander at Astral Codex Ten.
I worry that people are going to come away from this with some conclusion like "wow, the FDA seemed really unprepared to handle COVID." No. It's not that specific. Every single thing the FDA does is like this. Every single hour of every single day the FDA does things exactly this stupid and destructive, and the only reason you never hear about the others is because they're about some disease with a name like Schmoe's Syndrome and a few hundred cases nationwide instead of something big and media-worthy like coronavirus. I am a doctor and sometimes I have to deal with the Schmoe's Syndromes of the world and every [email protected]$king time there is some story about the FDA doing something exactly this awful and counterproductive.
A while back I learned about Infant Short Bowel Syndrome, a rare condition with only a few hundred cases nationwide. Babies cannot digest food effectively, but you can save their lives by using an IV line to direct nutrients directly into their veins. But you need to use the right nutrient fluid. The FDA approved an early draft of the nutrient fluid, but it didn't have enough fish oil, which is necessary for development, so a lot of the babies still died or ended up with permanent neurological damage. Around the late 90s/early 00s, researchers figured out what was going on and recommended adding fish oil to the IV fluid. The FDA responded that they had only approved the non-fish-oil version, it would take them a while to approve the new version, and until they did that adding fish oil was illegal. A bunch of babies kept dying and getting permanent neurological damage, and everyone knew exactly how to stop it, but if anyone did the FDA would take away their licenses and shut them down. Around 2010, Boston Children's Hospital found some loophole that let them add fish oil to their nutrient fluid on site, and infants with short bowel syndrome at that one hospital stopped dying or ending up permanently disabled, and the FDA grudgingly agreed to permit it but banned them from distributing their formulation or letting it cross state lines – so for a while if you wanted your baby not to die you had to have them spend their infancy in one specific hospital in Massachusetts. Around 2015 the FDA said that if your doctor applied for a special exemption, they would let you import the correct nutritional fluid from Europe (where, lacking the FDA, they had just added fish oil to the fluid as soon as researchers discovered it was necessary), but you were only able to apply after your baby had already sustained serious damage, and the FDA might just say no. Finally in 2018 the FDA got around to approving the corrected nutritional fluid and now babies with short bowel syndrome do fine, after twenty years of easily preventable state-mandated deaths. And it's not just this and coronavirus, I CANNOT STRESS ENOUGH HOW TYPICAL THIS IS OF EVERYTHING THE FDA DOES ALL THE TIME.
Read the whole thing! I actually had to read it in several sessions, it's not that long but bouts of anger interspersed with moments of laughter made me have to put it down momentarily to recover. There is a lot more in the post on reforms.
Best quick intro to my views on the FDA is this post (follow the links) and my paper on off-label prescribing.
Addendum: Scott updates the infant fish oil story and provides much more detail. He got some things wrong and the FDA as an agency ends up looking better but the broad outline about the FDA system looks right. I am leaving the post up for posterity but this specific part isn't correct.
My Conversation with Daniel Carpenter, on regulation and also the FDA
by Tyler Cowen May 5, 2021 at 11:52 am in
Here is the audio, video, and transcript, I found it a very substantive and also illuminating episode. Carpenter is very, very smart and also very well-informed historically. Here is part of the summary:
Daniel Carpenter is one of the world's leading experts on regulation and the foremost expert on the US Food and Drug Administration. A professor of Government at Harvard University, he's conducted extensive research on regulation and government organizations, as well as on the development of political institutions in the United States. His latest book Democracy by Petition: Popular Politics in Transformation, details the crucial role petitions played in expanding the franchise and shaping modern America.
Here is an excerpt from the non-FDA section, much of which focuses on (non-FDA) regulation:
COWEN: What kinds of records should the Postal Service keep about itself?
CARPENTER: [laughs] Great question. There's a whole set of things that they don't since the Griswold decision and since the First Amendment decisions. They don't keep as much records of what goes through the mail. They can't prohibit things like pornography, contraception.
I guess it depends on what you mean by "itself." I would start with the idea that basic privacy restrictions, which governed the postal system as much through norm as by law in the 19th century and early 20th century, should govern the system.
It's a crime if I were to walk past your mailbox and open your letter. I'm committing a federal crime, but there were also norms that seals were not to be broken, things like that. I do think whichever way the Postal Service goes — and it's quite possible that you could imagine an electronic platform for the US postal system — I think basic privacy restrictions have to be guaranteed.
Actually, in some respects, I think we need to know a fair amount about what postal workers do without, say, calling for Amazon tracking. But if we think that postal workers are misplacing ballots or not providing birth control pills or something like that, then we should probably have some way of picking up on that kind of nefarious behavior.
In the FDA section I got mad at him, the first (but not last?) time that has happened in a CWT, do read or listen to the whole section, the two of us really had at it! Here is a tiny sliver from it:
COWEN: But shouldn't there be a button within the FDA that can be pushed, where the FDA goes into a kind of wartime mode?
I don't want to misrepresent Carpenter by an ill-chosen excerpt, so please do digest his full set of replies. Recommended.
From the comments, on FDA credibility
This maybe a violation of Cowen's second law, but my cursory examination turns up no useful hits in PubMed about FDA credibility. We have the odd op-ed, some drivel about people thinking the FDA is more credible about cigarettes when they learn that FDA regulates cigarette manufacture, and precious little else of remote utility.
Almost as though senior FDA leadership have not bothered, after over a year of pandemic to even commission a rigorous survey of which action(s) the public would view as credible. Certainly what they are doing is not coherent with any of the effective medical communication techniques I was taught nor with any of my training for dealing with public responses to calamity.
But maybe I'm wrong. Maybe somewhere the FDA dumped a couple of grand into even a Mechanical Turk survey to justify actions that will have billions in cost implications and might lead to the death of thousands of folks (particularly overseas).
I mean, the civil servants at the FDA surely are not just LARPing as pop psychologists, somewhere I've missed they have actual peer reviewed literature guiding any of their moves regarding communication, credibility, and risk management, right?
That is from Sure. So what is the best piece on FDA credibility? (Yes, I know the work of Daniel Carpenter and have a CWT with him coming out and we do address this directly.) And what has the FDA itself done to study the issue of its own credibility?
FDA Postpones Inspections Delaying New Drugs and Creating Shortages of Old Drugs
NYTimes: The Covid-19 pandemic has forced the Food and Drug Administration to postpone hundreds of drug company inspections, creating an enormous backlog that is delaying new drug approvals and leading the industry to warn of impending shortages of existing medicines.
…In an interview, F.D.A. officials said they sharply curtailed the inspections to protect their investigators, following guidelines from the Centers for Disease Control and Prevention, which discouraged federal employees from travel during the pandemic.
But some people in both industry and public health communities say that federal drug inspections are essential, and that the agency should bypass travel restrictions by taking precautions, including wearing proper personal protective equipment.
…In interviews, F.D.A. officials denied that the dramatic drop in inspections has slowed drug approvals. But a number of drug companies, including Spectrum Pharmaceuticals, Biocon Biologics and Bristol Myers Squibb, has issued statements noting deferred F.D.A. action because of the agency's inability to conduct inspections.
In October, Spectrum announced that the F.D.A. had deferred action on its application for Rolontis, a treatment for cancer patients who have a very low number of certain white blood cells, because it could not inspect the manufacturing plant the company uses in South Korea.
In late December, Biocon Biologics notified shareholders that the F.D.A. deferred action on its joint application with Mylan for a proposed biosimilar to Avastin, a cancer drug.
Bristol Myers Squibb announced in November that the F.D.A. would miss its November deadline for taking action on a lymphoma treatment, lisocabtagene maraleucel because it could not inspect a third-party Texas manufacturing plant. The agency eventually did complete its inspection and approved the drug last month.
Grocery store workers are working, meat packers are working, hell bars and restaurants are open in many parts of the country but FDA inspectors aren't inspecting. It boggles the mind.
Let's review. The FDA prevented private firms from offering SARS-Cov2 tests in the crucial early weeks of the pandemic, delayed the approval of vaccines, took weeks to arrange meetings to approve vaccines even as thousands died daily, failed to approve the AstraZeneca vaccine, failed to quickly approve rapid antigen tests, and failed to perform inspections necessary to keep pharmaceutical supply lines open.
I am a long-time critic of the FDA and frankly I am stunned at the devastation.
A Polite Request of the FDA
After the FDA advisory committee voted in favor of Pfizer's EUA last Thursday–as almost everyone thought they would–the FDA had difficulty finishing the paperwork. The NYTimes reported:
People familiar with the F.D.A.'s situation say that regulators are now racing to complete a fact sheet, information for physicians and other required documents that go with the authorization.
The paperwork delay meant that the FDA was going to wait to issue the EUA until Monday. That's when Trump called the FDA "a big, old, slow turtle" and yelled at Hahn to "Stop playing games and start saving lives!!!." The FDA then sped up and issued the EUA on Friday. As a result, the first tranche of vaccines are being delivered today.
The advisory committee for the Moderna vaccine meets this coming Thursday. Here's a polite request of the FDA–please have the fact sheet, information for physicians and other required documents ready to go. Thanks.
P.S. We would also be really grateful and, you know, it might save some lives if you allowed Moderna to start shipping now so the vaccine is on-site and ready to go on Friday. Please give it some thought and thanks again for your kind consideration. It's been very stressful seeing thousands of people dying every day.
The Simple Math of FDA Delay
Two to three thousand people a day are dying from COVID. Thus anything that delays rolling out a vaccine has a very high cost in human lives. People want to deny this, perhaps because it is so horrifying. I get a lot of pushback when I say that FDA delay is deadly. Let's dispense with a few objections. It is true, of course, that the people who are dying today can't literally be saved by a vaccine today but they could have been saved had they been vaccinated four or five weeks ago and similarly projecting forward.
Another response that many smart people tell me is that a vaccine can't be rolled out immediately so even under the best scenarios you couldn't save that many people immediately. That's true but irrelevant. Since a lot of people are getting this wrong, I want to show this in a simple model using pictures. Red is for deaths. Green is for life. Suppose two thousand people are dying from COVID a day as in panel 1. Let's for the sake of the simple model assume that you could deliver a vaccine to everyone on Day 1. You would then save 2000 lives a day going forward for however long the pandemic would have lasted as shown in panel 2. If you delay by one day then two thousand people die who would have lived without the delay, as shown in panel 3. Pretty obvious so far.
Now assume that the vaccine can't roll out to everyone immediately. For the sake of this simple model let's assume that on day one you can only vaccinate half the population. By doing so you save 1000 lives on day 1 and 2000 lives every day thereafter for the length of the pandemic. That's the fourth panel. Now suppose we delay the vaccine rollout by one day. 2000 people die on Day 1 but you save 1000 on Day 2 and 2000 on Day 3 and every day thereafter for the length of the pandemic. How many people were killed by the delay? Compare the 4th and 5th panels. 2000 exactly as before! The slow ramp up doesn't change the number of deaths caused by delay it just spreads them out over different days. You can adjust the ramp so that it occurs over 10 days or 30 days. Doesn't change much on the delay margin unless you delay for so long that the pandemic is close to being over.
What could matter is if delay increases the speed at which you can ramp up. I doubt that this is true. We were ready to go with millions of doses in late October (guess why?). (In fact we had a vaccine in January and millions of doses around March-April.) We won't really be better prepared tomorrow than we are today. It's learning by doing that matters. See the point Tyler made earlier about economic time versus calendar time.
As Tyler noted, this is hardly the final analysis but many people are not even conceptualizing the problem correctly and this is a good place to begin.


text:
The case for a COVID commission: Accountability for Trump is the only way to keep Americans safe
A full "autopsy" is necessary so that the government can prepare for the next pandemic
By Heather Digby Parton
Published March 31, 2021 9:04AM (EDT)
White House coronavirus response coordinator Dr. Deborah Birx, left, and Director of the National Institute of Allergy and Infectious Diseases Dr. Anthony Fauci, both wearing face masks listen as President Donald J. Trump participates in a vaccine development event in the Rose Garden at the White House	( Jabin Botsford/The Washington Post via Getty Images))
In our cynical political world, presidential commissions, like Senate Select Committees or on occasion Joint Congressional Committees convened for a specific purpose, are generally considered graveyards for controversial issues the political leadership just wants to sweep under the rug. Blue Ribbon Commissions, which tend to be manned by outsiders with specific expertise, have a little bit more credibility because of their independence although they don't have any authority of their own. But on the whole, because various presidents and congressional leaders have created so many commissions which led nowhere or resulted in little change, the people don't put much stock in them.
There are exceptions, however. The most recent example is the 9/11 Commission, established by congressional legislation and signed by President George W. Bush to investigate the circumstances that led to the terrorist attacks and offer recommendations for change. It was staffed by former officials and experts of both parties and was chaired by former Governor Thomas Keane, a Republican from New Jersey, and Lee Hamilton, a former Democratic congressman from Indiana. They issued a report that resulted in some major changes (for better and worse) in the federal government.
The investigation's most memorable moment came in 2004, during a public hearing, in which commission member Richard Ben-Veniste questioned the National Security Adviser Condoleeza Rice about whether the administration had any advance warning. And this came out:
BEN-VENISTE. Isn't it a fact, Dr. Rice, that the Aug. 6 P.D.B. warned against possible attacks in this country? And I ask you whether you recall the title of that P.D.B.
RICE. I believe the title was "Bin Laden Determined To Attack Inside the United States."
9/11 was one of the worst catastrophes to ever befall our country and everyone understood that there had to be some come kind of independent investigation into what went wrong. There were legitimate criticisms of the report the commission produced and there were many questionable actions taken by the government that were not adequately addressed, but for the most part, the report was taken seriously. There were too many lives lost and too much fear and trauma to sweep it under the rug. The results of that failure by the government and the subsequent debacle of the Iraq War still haunt us 20 years later.
So what are we going to do about the latest debacle at the hands of yet another Republican president who couldn't seem to take the warnings of impending disaster seriously?
The country had already been through an ongoing political crisis with the election of the manifestly unfit Donald Trump and his bizarre and incompetent administration for three long years when we were hit with a deadly crisis of epic proportions. The COVID-19 pandemic is not over yet, of course, and we will not know the true scope of the carnage for quite some time. But we already know that the U.S. response to the crisis during its first year was atrocious. What we don't yet know is just how much of the illness and death can be attributed to the Trump administration's ineptitude and reflexively hyper-political decisions.
According to Dr. Deborah Birx, the Trump administration's COVID task force coordinator, the number of needless deaths number in the hundreds of thousands.
https://youtu.be/naKirLVszao
Birx is a flawed messenger, of course. I wrote about her conflicts and unsuitability for the job before. But her testimony in this recent CNN special hosted by Dr. Sanjay Gupta, along with that of other top doctors who worked on the administration's task force, painted a picture of dysfunction that was shocking even for those of us who followed the story in detail as it was unfolding. The Trump administration was the leakiest in history, but the point of view from these particular players offered a different angle. Even if it was mostly an attempt to make themselves look better — and there was certainly an element of that — it was still stunning.
For instance, Dr. Robert R. Redfield, the former CDC director said that Health and Human Services Secretary Alex Azar and his staff pressured him to alter scientific reports, specifically those that reported mortality rates. The former FDA Commissioner, Dr. Stephen Hahn, described his relationship with Azar as "strained" after the secretary unilaterally revoked the FDA's power to regulate COVID tests. Trump's testing czar, Admiral Brett Giroir, admitted that the administration lied when they said there were millions of tests. Dr. Anthony Fauci, director of the National Institute of Allergy and Infectious Diseases, said he knew they were in trouble when he saw that Trump had tweeted "liberate Michigan!" in contravention of everything they were trying to do. And Birx said that Trump told her in April that he would never allow the country to be shut down again.
But it wasn't just President Trump's self-serving focus on "optics" and magical thinking. The fact is that despite years of predictions of a coming plague from scientists, the U.S. was totally unprepared. Dr. Robert Kadlec, former U.S. assistant secretary of Health and Human Services under Trump explained: "When we started the pandemic in January, we really didn't know what the status of the supply chain was. We didn't know what hospitals had on hand. We didn't know what the state supplies were. We didn't even know what the commercial distributors had on their shelves."
Clearly, the systems for dealing with a national public health emergency simply didn't exist. And there certainly was no plan. When you add this to all we know about the potential corruption of Jared Kushner's involvement, the Fox News quack doctors like Scott Atlas who were brought in by Trump to tell him what he wanted to hear as well as dozens of other revelations about how the government dropped the ball, if there was ever a situation that required a Blue Ribbon Commission, this would be it.
It's not just about the death toll from this disaster, although that would be enough reason to do it. A full "autopsy" is necessary so that the government can prepare for the next one, which every one of those doctors insists is inevitable.
Unfortunately, it's hard to imagine how such a thing could be put together considering our divided nation and the ongoing devotion of the Republican Party to Donald Trump. The 9/11 Commission called upon respected elder statesmen from both parties who all saw the job as an important mission for the good of the country. It is impossible to imagine any Democrats who would be acceptable to the Republicans or any Republicans who would be willing to buck the party to criticize Donald Trump. So I'm afraid it's likely that this massive tragedy will pass into history without any official reckoning from the American government. We'll just have to hope that when the next pandemic hits our shores we'll have better luck than we did this time. Don't throw away your masks.
Heather Digby Parton, also known as "Digby," is a contributing writer to Salon. She was the winner of the 2014 Hillman Prize for Opinion and Analysis Journalism.
MORE FROM Heather Digby Parton
Covid-19 Deborah Birx Donald Trump Dr. Fauci Jared Kushner


text:
Q: UIBezierPath Rotation around a UIView's center I'm creating a custom UIView, in which I implement its draw(rect:) method by drawing a circle with a large width using UIBezierPath, that draw a square on the top (as shown in the picture, don't consider the colors or the size). Then I try creating rotated copies of the square, to match a "settings" icon (picture 2, consider only the outer ring). To do that last thing, I need to rotate the square using a CGAffineTransform(rotationAngle:) but the problem is that this rotation's center is the origin of the frame, and not the center of the circle. How can I create a rotation around a certain point in my view?

A: Shift the origin of your transform,
Rotate,
Shift back
Apply your transform

A: As a demonstration of @DuncanC's answer (up voted), here is the drawing of a gear using CGAffineTransforms to rotate the gear tooth around the center of the circle:
class Gear: UIView {
    var lineWidth: CGFloat = 16
    let boxWidth: CGFloat = 20
    let toothAngle: CGFloat = 45

    override func draw(_ rect: CGRect) {

        let radius = (min(bounds.width, bounds.height) - lineWidth) / 4.0

        var path = UIBezierPath()
        path.lineWidth = lineWidth
        UIColor.white.set()

        // Use the center of the bounds not the center of the frame to ensure
        // this draws correctly no matter the location of the view
        // (thanks @dulgan for pointing this out)
        let center = CGPoint(x: bounds.maxX / 2, y: bounds.maxY / 2)

        // Draw circle
        path.move(to: CGPoint(x: center.x + radius, y: center.y))
        path.addArc(withCenter: CGPoint(x: center.x, y: center.y), radius: radius, startAngle: 0, endAngle: 2 * .pi, clockwise: true)
        path.stroke()

        // Box for gear tooth
        path = UIBezierPath()
        let point = CGPoint(x: center.x - boxWidth / 2.0, y: center.y - radius)
        path.move(to: point)
        path.addLine(to: CGPoint(x: point.x, y: point.y - boxWidth))
        path.addLine(to: CGPoint(x: point.x + boxWidth, y: point.y - boxWidth))
        path.addLine(to: CGPoint(x: point.x + boxWidth, y: point.y))
        path.close()
        UIColor.red.set()

        // Draw a tooth every toothAngle degrees
        for _ in stride(from: toothAngle, through: 360, by: toothAngle) {
            // Move origin to center of the circle
            path.apply(CGAffineTransform(translationX: -center.x, y: -center.y))

            // Rotate
            path.apply(CGAffineTransform(rotationAngle: toothAngle * .pi / 180))

            // Move origin back to original location
            path.apply(CGAffineTransform(translationX: center.x, y: center.y))

            // Draw the tooth
            path.fill()
        }
    }
}

let view = Gear(frame: CGRect(x: 0, y: 0, width: 200, height: 200))

Here it is running in a Playground:

A: Maybe would help someone. Source
extension UIBezierPath {
    func rotate(degree: CGFloat) {
        let bounds: CGRect = self.cgPath.boundingBox
        let center = CGPoint(x: bounds.midX, y: bounds.midY)

        let radians = degree / 180.0 * .pi
        var transform: CGAffineTransform = .identity
        transform = transform.translatedBy(x: center.x, y: center.y)
        transform = transform.rotated(by: radians)
        transform = transform.translatedBy(x: -center.x, y: -center.y)
        self.apply(transform)
    }
}

Example:
let progressLayerPath = UIBezierPath(ovalIn: CGRect(x: 0,
                                                    y: 0,
                                                    width: 70,
                                                    height: 70))
progressLayerPath.rotate(degree: -90) // <-------
progressLayer.path = progressLayerPath.cgPath
progressLayer.strokeColor = progressColor.cgColor
progressLayer.fillColor = UIColor.clear.cgColor
progressLayer.lineWidth = lineWidth
layer.addSublayer(progressLayer)

A: If you want a quick n dirty version using UIViews instead:
UIView * dialView = [UIView new];
dialView.frame = CGRectMake(0, localY, w, 300);
dialView.backgroundColor = [UIColor whiteColor];
[analyticsView addSubview:dialView];

float lineWidth = 6;
float lineHeight = 20.0f;
int numberOfLines = 36;
for (int n = 0; n < numberOfLines; n++){

    UIView * lineView = [UIView new];
    lineView.frame = CGRectMake((w-lineWidth)/2, (300-lineHeight)/2, lineHeight, lineWidth);
    lineView.backgroundColor = [UIColor redColor];
    [dialView addSubview:lineView];

    lineView.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(360/numberOfLines*n));
    lineView.transform = CGAffineTransformTranslate(lineView.transform, (150-lineHeight), 0);

}

Giving:

Where w is a holder width, and radians are calculated by:
#define DEGREES_TO_RADIANS(degrees)((M_PI * degrees)/180)


text:
Built In Honors Percent in Its Esteemed 2023 Best Places To Work Awards
Percent Earns 27th on Built In's Best Places to Work List
New York, NY – Jan 19, 2023 — Built In today announced that Percent was honored in its 2023 Best Places To Work Awards. Specifically, Percent earned a place on the 50 Best Startups to Work in New York list. The annual awards program includes companies of all sizes, from startups to those in the enterprise, and honors both remote-first employers as well as companies in large tech markets across the U.S.
"We are honored to be a part of Built In's Best Places to Work rankings," stated Nelson Chu, founder and CEO, of Percent. "At Percent, we strive to create a transparent culture built on integrity and one that fosters innovation and growth. Our employees are what sets us apart and fuels our future."
Built In determines the winners of Best Places to Work based on an algorithm, using company data about compensation and benefits. To reflect the benefits candidates are searching for more frequently on Built In, the program also weighs criteria like remote and flexible work opportunities, programs for DEI, and other people-first cultural offerings.
"It's my honor to congratulate this year's Best Places to Work winners," said Sheridan Orr, Chief Marketing Officer, at Built In. "These exemplary companies understand their people are their most valuable asset, and they've stepped up to meet the modern professional's new expectations, including the desire to work for companies that deliver purpose, growth, and inclusion. These winners set the stage for a human-centered future of work, and we can't wait to see that future unfold."
About Built In
Built In is creating the largest platform for technology professionals globally. Monthly, millions of the industry's most in-demand professionals visit the site from across the world. They rely on our platform to stay ahead of tech trends and news, learn skills to accelerate their careers, and find opportunities at companies whose values they share. Built In also serves 2,000 customers, innovative companies ranging from startups to those in the Fortune 500. By putting their stories in front of our uniquely engaged audience, we help them hire otherwise hard-to-reach tech professionals. www.builtin.com.
About Built In's Best Places to Work
Built In's esteemed Best Places to Work Awards, now in its fifth year, honor companies across numerous categories: 100 Best Places to Work, 50 Best Startup Places to Work, 100 Best Midsize Places to Work, 100 Best Large Places to Work and Editor's Choice: 100 Best Hybrid Places to Work. The program honors companies – remote, hybrid and in-office – with the best total rewards packages across the U.S. and in the following tech hubs: Atlanta, Austin, Boston, Chicago, Colorado, Dallas, Houston, Los Angeles, Miami, New York, San Diego, San Francisco, Seattle and Washington DC.
Percent has created the modern credit marketplace, empowering investors, borrowers, and underwriters with innovative technology to increase the speed and velocity of transactions at a fraction of the cost. The company's core infrastructure delivers public market efficiencies to the analog private credit market by powering the sourcing, structuring, syndication, surveillance and servicing of private credit transactions from beginning to end. Founded in 2018, Percent's platform is becoming the market standard for asset-backed and corporate lending, powering over $1 billion in transaction volume in a multi-trillion-dollar private credit industry. For additional information, please visit www.percent.com and follow the company on Facebook, Instagram, LinkedIn and Twitter.


Melbourne, say hello to Game/ON Festival, four weeks of retro gaming fun.
Broken controllers, ruined friendships, underhanded tactics, bitter rivalries, strategic allegiances – yes we all remember the intensity of playing the Nintendo 64. The revolutionary console that was a must have in 90's households and was nearly constantly the source of all childhood arguments (at least the serious ones anyway).
Well now you and your friends can once again take up the controllers (we all know red was best and purple see-through one was lame) and challenge each other, with Game/ON Festival hitting the QV Square from August 31st until September 23rd. The festival will feature loads of retro games and cash prizes that include a $2000 cheque for a Super Smash Bros tournament winner.
There'll also be parties on the Friday nights during the from 4pm – 7pm that will include a Nintendo themed candy bar, a DJ spinning retro tunes and a live art installation in Albert Coates Lane. So there's plenty of other stuff to do distract your friends as they wait for their turn after having been knocked out by you.
For more info head to QV's website.


text:
About TARI
Technology Transfer and Partnerships
Administration and HRM
Social Economics
Soil and Water Management
Soil Health Management Tech
Protection Tech
Good Agro Practices
Post Harvest Management Tech
Regulations and Acts
TARI TV
TARI Kihinga has participated in the distribution of Oil palm seedlings to the WAMI AMCOS group in Kigoma Municipal Council. The official guest of honor was the Member of Parliament for Kigoma, Hon. Kilumbe Ngenda.
4th January, 2022 13:06
By MWIJAGE.TAWFIQ
Select Month January 2022 December 2021 November 2021 October 2021 September 2021 August 2021 July 2021 June 2021 May 2021 April 2021 March 2021 February 2021 January 2021 December 2020 November 2020 October 2020 September 2020 August 2020 July 2020 June 2020 May 2020 April 2020 March 2020 February 2020 January 2020


text:
from __future__ import absolute_import
import os
import yaml
import json
import importlib
import string
import time
from .api_client import ApiClient
from .rest import ApiException
from .models import V1ObjectMeta,V1DeleteOptions
from .apis import ApiV1,OapiV1
from lib_openshift import models
from lib_openshift import apis

class WrapperException(Exception):

    def __init__(self, msg, **kwargs):
        self.msg = msg
        self.value = kwargs
        self.value['msg'] = msg

    def __str__(self):
        return json.dumps(self.value)

class Wrapper(object):

    def _validate_common_args(self, model, namespace=None,
                              name=None, labels=None,
                              annotations=None, state='present'):
        # TODO: validate name against k8s limitations
        if name is None:
            raise WrapperException(msg="name is required")

        if state not in ('present', 'absent'):
            raise WrapperException(msg="Unknown state: {0}".format(state))

        if labels is not None and not isinstance(labels, dict):
            raise WrapperException(msg="labels must be a dict")

        if annotations is not None and not isinstance(annotations, dict):
            raise WrapperException(msg="annotations must be a dict")

        crud_ops = self._get_crud_ops(model)
        namespaced = crud_ops['read']['namespaced']
        if namespaced and namespace is None:
            raise WrapperException(msg="namespace is required")

    def _get_crud_ops(self, model):
        operations = model.operations
        namespaced_ops = [op for op in operations if op['namespaced']]
        non_namespaced_ops = [op for op in operations if not op['namespaced']]

        crud_ops = {}
        for op_type in ('create', 'read', 'update', 'delete'):
            for op in namespaced_ops:
                if op_type == op['type']:
                    crud_ops[op_type] = op
            for op in non_namespaced_ops:
                if op_type not in crud_ops and op_type == op['type']:
                    crud_ops[op_type] = op
        return crud_ops

    def _get_api_client(self):
        # TODO: add basic auth, client cert auth, ca certificate and
        # tls_insecure settings
        header_name = None
        header_value = None
        if 'token' in self._user:
            header_name = 'Authorization'
            header_value = 'Bearer {0}'.format(self._user['token'])
        api_client = ApiClient(host=self._cluster['server'],
                               header_name=header_name,
                               header_value=header_value)
        return api_client

    def _get_api(self, api_class, api_client=None):
        if api_client is None:
            api_client = self._get_api_client()

        api_class_obj = getattr(apis, api_class)
        api = api_class_obj(api_client=api_client)
        return api

    def _get_k8s_object(self, model, name, namespace):
        crud_ops = self._get_crud_ops(model)
        api = self._get_api(crud_ops['read']['class'])
        method = crud_ops['read']['method']

        k8s_object = None
        try:
            if namespace is None:
                k8s_object = getattr(api, method)(name)
            else:
                k8s_object = getattr(api, method)(namespace, name)
            already_exists = True
        except ApiException as e:
            if e.status != 404:
                raise WrapperException(msg="api request failed code: {0}, reason: {1}".format(e.status, e.reason))

        return k8s_object

    def _metadata_equals(self, existing, desired):
        attrs_to_ignore = ('creation_timestamp', 'resource_version',
                           'self_link', 'uid')
        for attribute in existing.attribute_map.keys():
            if attribute in attrs_to_ignore:
                next
            elif attribute == 'annotations':
                existing_annotations = existing.annotations
                desired_annotations = desired.annotations
                if existing_annotations is None:
                    existing_annotations = {}
                if desired_annotations is None:
                    desired_annotations = {}
                if existing_annotations == desired_annotations:
                    next
                for scc_attr in ('mcs', 'supplemental-groups', 'uid-range'):
                    scc_key = "openshift.io/sa.scc.{0}".format(scc_attr)
                    if scc_key in existing_annotations:
                        if scc_key in desired_annotations:
                            if existing_annotations[scc_key] != desired_annotations[scc_key]:
                                return False
            elif getattr(existing, attribute) is None and getattr(desired, attribute) is not None:
                return False
            elif getattr(desired, attribute) is None and getattr(existing, attribute) is not None:
                return False
            elif getattr(existing, attribute) != getattr(desired, attribute):
                return False
        return True

    def _merge_metadata(self, existing, desired):
        return existing

    def _k8s_objects_equals(self, existing, desired):
        for attribute in existing.attribute_map.keys():
            if attribute == 'metadata':
                if not self._metadata_equals(existing.metadata, desired.metadata):
                    import pdb; pdb.set_trace()
                    return False
            elif attribute == 'status':
                next
            elif existing.kind == 'Namespace' and attribute == 'spec':
                if existing.spec.finalizers is not None and (desired.spec is None):
                    if len(existing.spec.finalizers) == 1 and len(existing.spec.finalizers[0].to_dict()) != 0:
                        import pdb; pdb.set_trace()
                        return False
                elif existing.spec != desired.spec:
                    import pdb; pdb.set_trace()
                    return False
            elif getattr(existing, attribute) is None and getattr(desired, attribute) is not None:
                import pdb; pdb.set_trace()
                return False
            elif getattr(desired, attribute) is None and getattr(existing, attribute) is not None:
                import pdb; pdb.set_trace()
                return False
            elif getattr(existing, attribute) != getattr(desired, attribute):
                import pdb; pdb.set_trace()
                return False

        return True

    def _merge_k8s_object_for_update(self, existing, desired):
        return existing

    def _create_or_update_k8s_object(self, model, k8s_object,
                                     body, namespace):
        changed = False
        result = {}
        crud_ops = self._get_crud_ops(model)
        api = self._get_api(crud_ops['create']['class'])
        create_method = crud_ops['create']['method']
        update_method = crud_ops['update']['method']

        if k8s_object is not None:
#            if self._k8s_objects_equals(k8s_object, body):
#                changed = False
#                result = k8s_object
#            else:
#                merged = _merge_k8s_object_for_update(k8s_object, body)
#                try:
#                    if namespace is None:
#                        k8s_object = getattr(api, update_method)(merged)
#                    else:
#                        k8s_object = getattr(api, update_method)(merged, namespace)
#                    changed = True
#                    result = k8s_object.to_dict()
#                except ApiException as e:
#                    raise WrapperException(msg="api request failed code: {0}, {1}".format(e.status, e))
#
            changed = False
            result = k8s_object.to_dict()
        else:
            try:
                if namespace is None:
                    k8s_object = getattr(api, create_method)(body)
                else:
                    k8s_object = getattr(api, create_method)(body, namespace)
                changed = True
                result = k8s_object.to_dict()
            except ApiException as e:
                raise WrapperException(msg="api request failed code: {0}, {1}".format(e.status, e))
        return (changed, result)

    def _delete_k8s_object(self, model, k8s_object,
                           delete_options, name, namespace):
        crud_ops = self._get_crud_ops(model)
        api = self._get_api(crud_ops['delete']['class'])
        delete_method = crud_ops['delete']['method']
        changed = False
        status = {}
        if k8s_object is not None:
            try:
                if k8s_object.kind in ('Service'):
                    status = getattr(api, delete_method)(namespace, name).to_dict()
                else:
                    if namespace is None:
                        status = getattr(api, delete_method)(delete_options,
                                                             name).to_dict()
                    else:
                        status = getattr(api, delete_method)(delete_options,
                                                             namespace, name).to_dict()
                changed = True
            except ApiException as e:
                raise WrapperException(msg="api request failed code: {0}, reason: {1}".format(e.status, e.reason))
        return (changed, status)

    def _k8s_object(self, model, namespace, name, api_version,
                    labels, annotations, state, **model_kwargs):

        friendly_name = model.__name__.replace(api_version.capitalize(), '')

        k8s_object = self._get_k8s_object(model, name, namespace)

        # TODO: add check mode
        if state == 'present':
            if namespace is not None:
                self.namespace(name=namespace, api_version=api_version, state='present')
            metadata = Wrapper.metadata_from_datastructure(api_version, name=name,
                                                           labels=labels, annotations=annotations)
            body = model(kind=friendly_name, api_version=api_version,
                         metadata=metadata, **model_kwargs)
            (changed, result) = self._create_or_update_k8s_object(model,
                                                                  k8s_object,
                                                                  body, namespace)

        elif state == 'absent':
            delete_options = V1DeleteOptions()
            (changed, result) = self._delete_k8s_object(model,
                                                        k8s_object, delete_options,
                                                        name, namespace)

        # TODO: implement proper wait on object creation
        time.sleep(.1)
        return {'changed': changed, friendly_name.lower(): result}

#    def namespace(self, name=None, api_version='v1', labels=None,
#                  annotations=None, state='present'):
#        self._validate_common_args(False, None, name, labels, annotations, state)

    @staticmethod
    def metadata_from_datastructure(api_version, **kwargs):
        if api_version == 'v1':
            from .models import V1ObjectMeta
            metadata_model = V1ObjectMeta
        else:
            raise WrapperException(msg="unsupported api version: {0}".format(api_version))

        metadata = metadata_model(**kwargs)
        return metadata

    @staticmethod
    def translate_params(model, **kwargs):
        '''Translate kwargs to parameters of the model's constructor
        Args:
            model(class): class which constructor needs to be translated to
        Returns:
            dict of parameters ready to use in the constructor.
        '''
        res = {}
        for i,param in enumerate(model.__init__.__code__.co_varnames):
            if param in kwargs:
                res[param] = kwargs[param]
        return res

    @staticmethod
    def get_child_models(model):
        '''Get the list of child models for the current model
        Args:
            model: model class
        Returns:
            a list of tuples (attribute, class, child_type), where
        attribute is the name of the child attribute, class - the class
        name of the child model, child_type - list if the child is a list
        '''
        res = []
        for attr, swagger_t in model.swagger_types.iteritems():
            if swagger_t in ['str', 'int', 'object', 'bool', 'list[str]']:
                continue
            if swagger_t.startswith('list['):
                child_type = 'list'
                child_model = swagger_t[5:-1]
            else:
                child_type = None
                child_model = swagger_t
            res.append((attr, child_model, child_type))
        return res

    @staticmethod
    def k8s_obj_spec_from_datastructure(object_name, **kwargs):
        '''Create spec ready to be used in the object.
        Args:
            api_version(str): version of the api
            kwargs: object description
        '''
        if kwargs['api_version'] == 'v1':
            spec_model_name = kwargs['api_version'].capitalize() + string.capwords(object_name, '_').replace('_', '') + 'Spec'
            spec_model = getattr(models, spec_model_name)
        else:
            raise WrapperException(msg="unsupported api version: {0}".format(api_version))

        params = Wrapper.translate_params(spec_model, **kwargs)
        child_models_list = Wrapper.get_child_models(spec_model)
        for ch_model in child_models_list:
            if ch_model[1] in kwargs.copy():
                if isinstance(kwargs[ch_model[1]], list):
                    cur_spec = []
                    for child in kwargs[ch_model[1]]:
                        cur_spec.append(k8s_obj_spec_from_datastructure(ch_model[2], child))
                else:
                    cur_spec = k8s_obj_spec_from_datastructure(ch_model[2], kwargs[ch_model[1]])
                kwargs[ch_model[1]] = cur_spec

        spec = spec_model(**params)
        return spec

    def __getattr__(self, name):
        def obj_mapper(**kwargs):
            if 'kind' in kwargs:
                del kwargs['kind']
            return self.k8s_object(kind=name, **kwargs)

        return obj_mapper

    def k8s_object(self, **kwargs):
        # TODO: Distinguish the object topology and import nested objects as needed!
        kind = kwargs['kind']
        api_version = kwargs.setdefault('api_version', 'v1')

        camelName = string.capwords(kind, '_').replace('_', '')
        model_name = api_version.capitalize() + camelName
        if model_name not in dir(models):
            raise WrapperException(msg="unsupported k8s object: {0}".format(name))

        model = getattr(models, model_name)
        obj_spec = Wrapper.k8s_obj_spec_from_datastructure(kind, **kwargs)

        namespace = kwargs.get('namespace', None)
        name = kwargs.get('name', None)
        labels = kwargs.get('labels',{})
        annotations = kwargs.get('annotations', {})
        state = kwargs.get('state', 'present')

        self._validate_common_args(model, namespace, name, labels, annotations, state)

        return self._k8s_object(model, namespace, name, api_version,
                                labels, annotations, state, spec=obj_spec)

    def __init__(self, kubeconfig=None, api_endpoint=None, namespace=None,
                 username=None, password=None, token=None, client_cert=None,
                 client_key=None, certificate_authority=None,
                 certificate_authority_data = None,
                 insecure_skip_tls_verify=None):

        client_config = None

        try:
            if kubeconfig is None:
                kubeconfig = '~/.kube/config'
            client_config = yaml.load(open(os.path.expanduser(kubeconfig), 'r'))
        except IOError:
            # eat IOError, since we are only trying to read in the file if
            # it doesn't exist
            pass
        except yaml.YAMLError:
            raise WrapperException(msg="Could not parse kubeconfig: {0}".format(kubeconfig))

        config_curr_context = None
        if client_config is not None:
            config_curr_context = client_config.get('current-context')

        config_context = None
        config_cluster_name = None
        config_user_name = None
        if config_curr_context is not None:
            for entry in client_config.get('contexts'):
                if entry.get('name') == config_curr_context:
                    config_context = entry.get('context')
                    config_cluster_name = config_context.get('cluster')
                    config_user_name = config_context.get('user')

                    if namespace is None:
                        namespace = config_context.get('namespace')

        config_cluster = None
        if config_cluster_name is not None:
            for entry in client_config.get('clusters'):
                if entry.get('name') == config_cluster_name:
                    config_cluster = entry.get('cluster')
                    if api_endpoint is None:
                        api_endpoint = config_cluster.get('server')
                        if 'certificate-authority' in config_cluster:
                            certificate_authority = config_cluster.get('certificate-authority')
                        if 'certificate-authority-data' in config_cluster:
                            certificate_authority_data = config_cluster.get('certificate-authority-data')
                        if 'insecure-skip-tls-verify' in config_cluster:
                            insecure_skip_tls_verify = config_cluster.get('insecure-skip-tls-verify')

        config_user = None
        if config_user_name is not None:
            for entry in client_config.get('users'):
                if entry.get('name') == config_user_name:
                    config_user = entry.get('user')

        if username is not None and password is None:
            raise WrapperException(msg="username requires password")

        if password is not None and username is None:
            raise WrapperException(msg="password requires username")

        if username is not None and token is not None:
            raise WrapperException(msg="username and token are mutally exclusive")

        if password is not None and token is not None:
            raise WrapperException(msg="password and token are mutally exclusive")

        if username is not None and (client_cert is not None or client_key is not None):
            raise WrapperException(msg="username and client_cert/client_key are mutally exclusive")

        if password is not None and (client_cert is not None or client_key is not None):
            raise WrapperException(msg="password and client_cert/client_key are mutally exclusive")

        if token is not None and (client_cert is not None or client_key is not None):
            raise WrapperException(msg="token and client_cert/client_key are mutally exclusive")

        if client_cert is not None and client_key is None:
            raise WrapperException(msg="client_cert requires client_key")

        if client_key is not None and client_cert is None:
            raise WrapperException(msg="client_key requires client_cert")

        if config_user is not None and username is None and token is None and client_cert is None:
            username = config_user.get('username')
            password = config_user.get('password')
            token = config_user.get('token')
            client_cert = config_user.get('client-certificate')
            client_key = config_user.get('client-key')

        if api_endpoint is None:
            raise WrapperException(msg="api_endpoint is required when a kubeconfig is not provided")

        self._cluster = {'server': api_endpoint,
                         'certificate_authority': certificate_authority,
                         'certificate_authority_data': certificate_authority_data,
                         'insecure_skip_tls_verify': insecure_skip_tls_verify}
        self._user = {'username': username, 'password': password, 'token':
                      token, 'client_cert': client_cert, 'client_key': client_key}
        self._namespace = namespace

redpajama_set_name: RedPajamaGithub