Home Blog Page 4

ios – Swift CSV import fails with ‘Didn’t load flashcards: ERR257.DFU’ — doable encoding or parsing difficulty?


I’m engaged on importing flashcards from a CSV file in my Swift app. I exploit the next methodology to generate and write the CSV file:

func generateCSVText(withManagedObjects arrManagedObject: [Flashcard]) {
    var CSVString = "reply, questionn"

    for flashcard in arrManagedObject {
        let entityContent = ""(flashcard.flashcardAnswer)", "(flashcard.flashcardQuestion)"n"
        CSVString.append(entityContent)
    }

    let tempDirectory = FileManager.default.temporaryDirectory
    let fileURL = tempDirectory.appendingPathComponent("(cardSet.cardSetName).csv")

    do {
        attempt CSVString.write(to: fileURL, atomically: true, encoding: .utf8)
        DispatchQueue.principal.async {
            self.csvFileURL = fileURL
        }
        self.isShowingExportView = true
    } catch {
        print("Error writing CSV: (error.localizedDescription)")
    }
}

Then I try and import it utilizing:

func importFlashcards(from fileURL: URL) {
    do {
        let content material = attempt String(contentsOf: fileURL, encoding: .utf8)
        let rows = content material.parts(separatedBy: "n").dropFirst() // Skip header

        for row in rows {
            let trimmed = row.trimmingCharacters(in: .whitespacesAndNewlines)
            guard !trimmed.isEmpty else { proceed }

            var parts = trimmed.parts(separatedBy: "", "")
            if parts.depend == 2 {
                // Take away surrounding quotes
                var reply = parts[0]
                var query = parts[1]

                if reply.hasPrefix(""") { reply.removeFirst() }
                if query.hasSuffix(""") { query.removeLast() }

                dataController.newFlashcard(reply: reply, query: query)
            }
        }
    } catch {
        print("Didn't load flashcards: (error.localizedDescription)")
    }
}

Nonetheless, after I choose the file for import, I get the next error:

Didn't load flashcards: ERR257.DFU

I additionally opened the CSV in a web based CSV editor and viewer, chosen “UTF-8” encoding there, and it displayed/edited simply positive.

Bagel AI Raises $5.5M to Bridge Product and GTM Groups with AI-Powered Intelligence Platform

0


In a major transfer towards redefining how corporations align product technique with enterprise affect, Bagel AI has introduced a $5.5 million Seed funding spherical led by at.inc/, with extra backing from Demo Capital, Loyal VC, CS Angel, and notable angel traders together with Zoom’s former CPO Oded Gal, CyberArk Founder Udi Mokady, and Atlassian’s former Head of Product Advertising Sean Regan.

Fixing the Multi-Trillion-Greenback Disconnect

On the coronary heart of Bagel AI’s mission is fixing a $3 trillion-dollar downside: the misalignment between product groups and go-to-market (GTM) features. Regardless of corporations drowning in suggestions, analytics, and buyer insights, a lot of this information stays underutilized—locked in silos and unfold throughout instruments like Salesforce, Jira, Zendesk, and Gong. The outcome? Groups make product selections in a vacuum, and GTM methods fall flat—some estimates present as much as 70% of GTM methods fail resulting from poor alignment.

Bagel AI is stepping in because the AI-powered connective tissue between these important features.

Not Simply Extra Knowledge—Smarter Knowledge

Bagel AI doesn’t merely accumulate information—it transforms it. Utilizing customer-tailored AI fashions, Bagel AI mechanically analyzes scattered, unstructured suggestions from a number of sources, extracting significant insights about product gaps, person ache factors, and rising market tendencies.

The platform goes additional by linking these insights on to enterprise metrics, guaranteeing that each product choice will be quantified by ROI. This transforms guesswork into technique, and transforms information from a passive useful resource into an lively development driver.

“As corporations start shifting away from a growth-at-all-cost mindset and as an alternative specializing in smarter, extra sustainable development, Bagel AI is presenting a path to realize this,” stated Ohad Biron, CEO & Co-founder of Bagel AI. “We allow groups to pinpoint—utilizing AI—the fitting resolution for the fitting downside, all whereas driving measurable outcomes.”

AI-Pushed Product Intelligence: A Nearer Look

Right here’s how Bagel AI works throughout a typical enterprise product group:

  • Computerized Knowledge Consolidation: Pulls in structured and unstructured suggestions from Slack, Chrome, Jira, Gong, Salesforce, Notion, and extra.

  • AI-Powered Evaluation: Learns an organization’s distinctive taxonomy to detect patterns, product pains, and untapped alternatives in real-time.

  • Segmentation & Prioritization: Ranks roadmap objects based mostly on buyer sentiment, income potential, and adoption chance.

  • Finish-to-Finish Alignment: From product managers to gross sales leaders and buyer success groups, Bagel AI retains everybody aligned with 360° visibility into characteristic affect and supply.

This isn’t a static dashboard. It’s an always-on, studying system that acts as an clever product co-pilot, proactively recommending actions and roadmap concepts that drive enterprise outcomes.

Constructed for Groups Who Want Outcomes, Not Studies

“Product groups are drowning in scattered information and clunky instruments. Bagel AI adjustments that,” stated Oded Gal, former CPO of Zoom and Bagel AI board member. “It connects information to selections—and in the end to income—by automating the messy evaluation work and aligning groups quick.”

This isn’t simply one other analytics platform. Bagel AI’s zero-silo integration mannequin embeds deeply into present workflows, changing outdated options like Productboard, UserVoice, and even “glorified spreadsheets.”

As a substitute of dumping extra dashboards on already-overwhelmed groups, Bagel AI delivers actionable, ranked insights natively throughout the instruments groups already use.

Momentum and the Highway Forward

Bagel AI is already trusted by high-growth corporations together with Tipalti, Zenicy, Hivebrite, and HoneyBook. The platform is delivering tangible outcomes:

  • 31% greater onboarding success price

  • 15% churn discount

  • 12x sooner response to product gaps

  • 85% much less duplicated information throughout instruments

And now, with this $5.5 million injection of capital, the corporate plans to speed up buyer acquisition and scale its platform to fulfill hovering demand for AI-driven product intelligence.

“Bagel AI is proving its affect the place it issues most—serving to product and GTM groups uncover hidden insights and switch them into enterprise outcomes,” stated Roni Bonjack, Enterprise Associate at at.inc/ and board member at Bagel AI. “The worth is rapid. That’s what makes this such an thrilling funding.”

Abstract

Based in 2022 by Ohad Biron (CEO), Itai Danino (CTO), and Yuval Nachman (CPO), Bagel AI is an alumnus of Google’s prestigious AI First accelerator. The founding group brings a uncommon mixture of product experience, technical management, and a mission-driven strategy to reworking how corporations make selections.

Their motto? “Make each characteristic depend.”

With this newest funding and rising buyer traction, Bagel AI is on a path to changing into the gold commonplace in product intelligence platforms—empowering corporations to behave smarter, scale sooner, and ship extra worth with each product choice.

SoundCloud makes use of Jetpack Look to construct Preferred Tracks widget in simply 2 weeks



SoundCloud makes use of Jetpack Look to construct Preferred Tracks widget in simply 2 weeks

Posted by Summers Pittman – Developer Relations Engineer

To make it even simpler for customers to hear on Android, builders at SoundCloud — an artist-first music platform — turned to Jetpack Look to create a Preferred Tracks widget for his or her highly-rated app, which boasts 4.6 stars and over 100 million downloads. With a catalog of over 400 million tracks from greater than 40 million creators, SoundCloud is devoted to connecting artists and followers by way of music, and this newest replace to its Android app affords listeners an much more handy method to get pleasure from their favourite tracks. Propelled by Look, the staff was capable of full the challenge in simply two weeks, saving treasured growth time and boosting engagement.

Maximize visibility with user-friendly touchpoints

By showcasing the art work of their not too long ago favored tracks, the brand new Preferred Tracks widget permits customers to to leap on to a particular music or entry their full monitor record proper from their dwelling display. This retains SoundCloud entrance and heart for listeners, performing as a shortcut to their private libraries and inspiring them to tune again in.

Preferred Tracks isn’t SoundCloud’s first widget. Over a decade in the past, SoundCloud builders used RemoteViews to create a Participant widget that allow customers simply management playback and like tracks. After not too long ago updating the Participant widget based mostly on design suggestions, builders made certain to prioritize a customized interface for Preferred Tracks. The brand new widget options each gentle and darkish modes, resizes freely to accommodate consumer preferences, and dynamically adapts its theme to enrich the consumer’s wallpaper. Backed by Look, these design selections ensured the widget isn’t simply seamless to make use of but additionally serves as an interesting and tailor-made gateway into the SoundCloud app.

A foldable smartphone is open, displaying various apps and widgets, including music controls and 'Liked tracks'

SoundCloud’s Preferred Tracks widget in motion.

Speed up growth cycles with Look

Look additionally performed an important function in streamlining the event of Preferred Tracks. For builders already proficient in Compose, Look’s intuitive design felt acquainted, minimizing the training curve and accelerating the staff’s onboarding. The platform’s assortment of code samples supplied a helpful place to begin, too, serving to builders rapidly grasp its capabilities and finest practices. “Utilizing pattern app repositories is an effective way to be taught. I can try a whole repository and examine how the code operates,” mentioned Sigute Kateivaite, lead SoundCloud engineer on the Android staff. “It sped up our widget growth by so much.”

Quote card reads: “Using sample app repositories is a great way to learn. It sped up our widget development.” — Sigute Kateivaite, Android Engineer at SoundCloud

The declarative nature of Look’s UI was particularly helpful to builders. As a result of they didn’t have to make use of extra XML information when constructing, builders might create cleaner, extra readable code with much less boilerplate. Look additionally allowed them to work with modules individually, that means elements may very well be written and built-in one after the other and reused for later iterations. By isolating elements, builders might rapidly take a look at modules, establish and resolve points, and construct for various states with out duplication, resulting in extra environment friendly workflows.

Look’s design additionally improved the general code high quality. The power to make modifications utilizing Android Studio’s help for Look’s real-time preview enabled builders to construct elements in isolation without having to combine the UI part into the widget or deploy the complete widget on the cellphone. They may symbolize numerous states, view all related instances, and evaluation modifications to elements with out having to compile the complete app. Put merely, Look made builders extra productive as a result of it allowed them to iterate quicker, refining the widget for a extra polished closing product.

Elevate app widgets with the facility of Look

With efficient new workflows and no main growth points, the SoundCloud staff applauds Look for streamlining a profitable manufacturing. “With the brand new Preferred Tracks widget, rollout has been actually steady,” Sigute mentioned. “Growth and the testing course of went actually easily.” Early knowledge additionally reveals promising outcomes — lively customers now work together with the widget to entry the app a number of occasions a day on common.

Stat card reads:'2X average daily active user interaction with widget feature.'

2X common every day lively consumer interplay with widget characteristic.

Trying forward, the SoundCloud staff is raring to make use of extra of Look to enhance present widgets, like adopting canonical layouts, and even develop new ones. Whereas the present Preferred Tracks widget focuses totally on picture show, the staff is inquisitive about together with different forms of content material to additional enrich consumer expertise. Builders additionally hope emigrate the Participant widget over to Look to entry the framework’s strong theming choices, simplify resizing processes, and handle some long-standing bugs.

Past the Preferred Tracks and Participant options, the staff is happy in regards to the potential of utilizing Look to construct a wider vary of widgets. The modular, component-based structure of the Preferred Tracks widget, with reusable parts like UserAvatar and Brand, affords a strong basis for future growth, promising to simplify processes from the beginning.

Get began constructing customized app widgets with Jetpack Look

Quickly develop and deploy widgets that preserve your app seen and interesting with Look.


This weblog submit is a part of our collection: Highlight Week on Widgets, the place we offer sources—weblog posts, movies, pattern code, and extra—all designed that can assist you design and create widgets. You may learn extra within the overview of Highlight Week: Widgets, which can be up to date all through the week.

ios – Why SwiftUI redraws the physique of my customized View since nothing associated to him modifications?


Right here is an instance:

struct DemoApp: View {
    @State var viewModel = DemoAppViewModel()
    var physique: some View {
        VStack {
            DemoMonthView(date: viewModel.monthDate)
            DemoDayView(date: viewModel.dayDate) // FIRST
                .onTapGesture {
                    viewModel.dayDate = viewModel.dayDate.addingTimeInterval(86000)
                }
            DemoDayView(date: viewModel.monthDate) // SECOND
                .onTapGesture {
                    viewModel.monthDate = viewModel.monthDate.addingTimeInterval(1400000)
                }
        }
    }
}

@Observable
class DemoAppViewModel {
    var dayDate: Date = Date()
    var monthDate: Date = Date()
}

struct DemoMonthView: View {
    var date: Date
    @FetchRequest personal var days: FetchedResults //it's essential change Day right here with any Entity that can permit to breed the problem
    init(date: Date) {
        self.date = date
        _days = FetchRequest(
            sortDescriptors: [SortDescriptor(.date, order: .reverse)],
            predicate: NSPredicate(worth: true)
        )
        print("DemoMonthView init known as") //needs to be known as, however with out physique redraws

        // heavy calculations for given month
    }
    
    var physique: some View {
        if #obtainable(iOS 17.1, *) {
            print("DemoMonthView physique known as") //shouldn't be known as❓
        }
        return VStack {
            Textual content(date.formatted(date: .lengthy, time: .omitted)).font(.title.daring())
        }
    }
}

struct DemoDayView: View {
    var date: Date
    
    var physique: some View {
        Textual content(date.formatted(date: .lengthy, time: .omitted))
    }
}

#Preview {
    DemoApp()
}

Merely, while you faucet FIRST button it shouldn’t redraw DemoMonthView, nevertheless it does. Why? I really want to keep away from that by tapping each time FIRST button. SECOND button redraws DemoMonthView view accurately, what I perceive. However why the FIRST?

Once I remark it out days and _days affiliation in init, then every part is okay, it DOES NOT redraws…

However that state of affairs is only a shortened drawback of my actual, extra difficult app. There’s a fetchRequest with heavy calculations which shouldn’t be known as so ceaselessly like faucet on the button, like right here in instance, when tapping that button doesn’t change something associated to DemoMonthView.

If it’s the cause because of the lack of my data, what ought to I do know to keep away from that?

Why it issues right here? As a result of I have to replace that DemoMonthView ONLY when monthDate modifications, not every time when dayDate modifications.

Self-Authenticating Photos By means of Easy JPEG Compression

0


Issues concerning the dangers posed by tampered photographs have been exhibiting up commonly within the analysis over the previous couple of years, significantly in mild of a brand new surge of AI-based image-editing frameworks able to amending current photographs, slightly than creating them outright.

Many of the proposed detection techniques addressing this type of content material fall into one in every of two camps: the primary is watermarking – a fallback method constructed into the picture veracity framework now being promoted by the Coalition for Content material Provenance and Authenticity (C2PA).

The C2PA watermarking procedure is a fallback, should the image content become separated from its original and ongoing manifest. Source: https://www.imatag.com/blog/enhancing-content-integrity-c2pa-invisible-watermarking

The C2PA watermarking process is a fallback, ought to the picture content material change into separated from its authentic and ongoing provenance ‘manifest’. Supply: https://www.imatag.com/weblog/enhancing-content-integrity-c2pa-invisible-watermarking

These ‘secret indicators’ should subsequently be strong to the automated re-encoding/optimization procedures that usually happen as a picture transits by means of social networks and throughout portals and platforms – however they’re usually not resilient to the form of lossy re-encoding utilized by means of JPEG compression (and regardless of competitors from pretenders similar to webp, the JPEG format continues to be used for an estimated 74.5% of all web site photographs).

The second method is to make photographs tamper-evident, as initially proposed within the 2013 paper Picture Integrity Authentication Scheme Based mostly On Mounted Level Idea. As a substitute of counting on watermarks or digital signatures, this methodology used a mathematical transformation known as Gaussian Convolution and Deconvolution (GCD) to push photographs towards a steady state that may break if altered.

Tampering localization results using a fixed point image with a PSNR of 59.7802 dB. White rectangles indicate the regions subjected to attacks. Panel A (left) displays the applied modifications, including localized noise, filtering, and copy-based attacks. Panel B (right) shows the corresponding detection output, highlighting the tampered areas identified by the authentication process. Source: https://arxiv.org/pdf/1308.0679

From the paper ‘Picture Integrity Authentication Scheme Based mostly On Mounted Level Idea’: tampering localization outcomes utilizing a hard and fast level picture with a Peak Sign-to-Noise (PSNR) of 59.7802 dB. White rectangles point out the areas subjected to assaults. Panel A (left) shows the utilized modifications, together with localized noise, filtering, and copy-based assaults. Panel B (proper) exhibits the corresponding detection output, highlighting the tampered areas recognized by the authentication course of. Supply: https://arxiv.org/pdf/1308.0679

The idea is probably most simply understood within the context of repairing a fragile lace material: regardless of how high-quality the craft employed in patching the filigree, the repaired part will inevitably be discernible.

This sort of transformation, when utilized repeatedly to a grayscale picture, steadily pushes it towards a state the place making use of the transformation once more produces no additional change.

This steady model of the picture is named a mounted level. Mounted factors are uncommon and extremely delicate to modifications – any small modification to a hard and fast level picture will nearly actually break its mounted standing, making it straightforward to detect tampering.

As normal with such approaches, the artefacts from JPEG compression can threaten the integrity of the scheme:

On the left, we see a watermark applied to the face of the iconic 'Lenna' (Lena) image, which is clear under normal compression. On the right, with 90% JPEG compression, we can see that the distinction between the perceived watermark and the growth of JPEG noise is lowering. After multiple resaves, or at the highest compression settings, the majority of watermarking schemes face issues with JPEG compression artefacts. Source: https://arxiv.org/pdf/2106.14150

On the left, we see a watermark utilized to the face of the enduring ‘Lenna’ (Lena) picture, which is obvious beneath regular compression. On the correct, with 90% JPEG compression, we are able to see that the excellence between the perceived watermark and the expansion of JPEG noise is reducing. After a number of resaves, or on the highest compression settings, nearly all of watermarking schemes face points with JPEG compression artefacts. Supply: https://arxiv.org/pdf/2106.14150

What if, as an alternative, JPEG compression artefacts might really be used because the central technique of acquiring a hard and fast level? In such a case, there can be no want for additional bolt-on techniques, for the reason that similar mechanism that normally causes bother for watermarking and tamper detection would as an alternative kind the idea of tamper detection framework itself.

JPEG Compression as a Safety Baseline

Such a system is put ahead in a new paper from two researchers on the College of Buffalo on the State College of New York. Titled Tamper-Evident Picture Utilizing JPEG Mounted Factors, the brand new providing builds on the 2013 work, and associated works, by formally formulating its central ideas, for the primary time, in addition to by ingeniously leveraging JPEG compression itself as a way to doubtlessly produce a ‘self-authenticating’ picture.

The authors develop:

‘The research reveals that a picture turns into unchanged after present process a number of rounds of the identical JPEG compression and decompression course of.

‘In different phrases, if a single cycle of JPEG compression and decompression is taken into account a metamorphosis of the picture, known as a JPEG rework, then this rework reveals the property of getting mounted factors, i.e., photographs that stay unaltered when the JPEG rework is utilized.’

From the new paper, an illustration of JPEG fixed point convergence. In the top row we see an example image undergoing repeated JPEG compression, with each iteration showing the number and location of changing pixels; in the bottom row, the pixel-wise L2 distance between consecutive iterations is plotted across different compression quality settings. Ironically, no better resolution of this image is available. Source: https://arxiv.org/pdf/2504.17594

From the brand new paper, an illustration of JPEG mounted level convergence. Within the prime row we see an instance picture present process repeated JPEG compression, with every iteration exhibiting the quantity and placement of adjusting pixels; within the backside row, the pixel-wise L2 distance between consecutive iterations is plotted throughout completely different compression high quality settings. Sarcastically, no higher decision of this picture is accessible. Supply: https://arxiv.org/pdf/2504.17594

Quite than introducing exterior transformations or watermarks, the brand new paper defines the JPEG course of itself as a dynamic system. On this mannequin, every compression and decompression cycle strikes the picture towards a hard and fast level. The authors show that, after a finite variety of iterations, any picture both reaches or approximates a state the place additional compression will produce no change.

The researchers state*:

‘Any alterations to the picture will trigger deviations from the JPEG mounted factors, which could be detected as modifications within the JPEG blocks after a single spherical of JPEG compression and decompression…

‘The proposed tamper-evident photographs based mostly on JPEG mounted factors have two benefits. Firstly, tamper-evident photographs get rid of the necessity for exterior storage of verifiable options, as required by picture fingerprinting [schemes], or the embedding of hidden traces, as in picture watermarking strategies. The picture itself serves as its proof of authenticity, making the scheme inherently self-evident.

‘Secondly, since JPEG is a widely-used format and infrequently the ultimate step within the picture processing pipeline, the proposed methodology is resilient to JPEG operations. This contrasts with the unique [approach] that will lose integrity traces on account of JPEG.’

The paper’s key perception is that JPEG convergence is not only a byproduct of its design however a mathematically inevitable consequence of its operations. The discrete cosine rework, quantization, rounding, and truncation collectively kind a metamorphosis that (beneath the correct circumstances) results in a predictable set of mounted factors.

Schema for the JPEG compression/decompression process formulated for the new work.

Schema for the JPEG compression/decompression course of formulated for the brand new work.

Not like watermarking, this methodology requires no embedded sign. The one reference is the picture’s personal consistency beneath additional compression. If recompression produces no change, the picture is presumed genuine. If it does, tampering is indicated by the deviation.

Assessments

The authors validated this conduct utilizing a million randomly generated eight-by-eight patches of eight-bit grayscale picture information. By making use of repeated JPEG compression and decompression to those artificial patches, they noticed that convergence to a hard and fast level happens inside a finite variety of steps. This course of was monitored by measuring the pixel-wise L2 distance between consecutive iterations, with the variations diminishing till the patches stabilized.

L2 difference between consecutive iterations for one million 8×8 patches, measured under varying JPEG compression qualities. Each process begins with a single JPEG-compressed patch and tracks the reduction in difference across repeated compressions.

L2 distinction between consecutive iterations for a million 8×8 patches, measured beneath various JPEG compression qualities. Every course of begins with a single JPEG-compressed patch and tracks the discount in distinction throughout repeated compressions.

To judge tampering detection, the authors constructed tamper-evident JPEG photographs and utilized 4 sorts of assaults: salt and pepper noise; copy-move operations; splicing from exterior sources; and double JPEG compression utilizing a unique quantization desk.

Example of fixed point RGB images with detection and localization of tampering, including the four disruption methods used by the authors. In the bottom row, we can see that each perturbation style betrays itself, relative to the generated fixed-point image.

Instance of mounted level RGB photographs with detection and localization of tampering, together with the 4 disruption strategies utilized by the authors. Within the backside row, we are able to see that every perturbation type betrays itself, relative to the generated fixed-point picture.

After tampering, the pictures had been re-compressed utilizing the unique quantization matrix. Deviations from the mounted level had been detected by figuring out picture blocks that exhibited non-zero variations after recompression, enabling each detection and localization of tampered areas.

Because the methodology is predicated solely on commonplace JPEG operations, mounted level photographs work simply high-quality with common JPEG viewers and editors; however the authors observe that if the picture is recompressed at a unique high quality degree, it could lose its mounted level standing, which might break the authentication, and must be dealt with fastidiously in real-world use.

Whereas this isn’t only a software for analyzing JPEG output, it additionally doesn’t add a lot complexity. In precept, it could possibly be slotted into current workflows with minimal price or disruption.

The paper acknowledges {that a} subtle adversary would possibly try to craft adversarial modifications that protect mounted level standing; however the researchers contend that such efforts would doubtless introduce seen artifacts, undermining the assault.

Whereas the authors don’t declare that mounted level JPEGs might change broader provenance techniques similar to C2PA, they counsel that mounted level strategies might complement exterior metadata frameworks by providing a further layer of tamper proof that persists even when metadata is stripped or misplaced.

Conclusion

The JPEG mounted level method provides a easy and self-contained different to traditional authentication techniques, requiring no embedded metadata, watermarks, or exterior reference recordsdata, and as an alternative deriving authenticity instantly from the predictable conduct of the compression course of.

On this manner, the strategy reclaims JPEG compression – a frequent supply of knowledge degradation – as a mechanism for integrity verification. On this regard, the brand new paper is likely one of the most modern and creative approaches to the issue that I’ve come throughout over the previous a number of years.

The brand new work factors to a shift away from layered add-ons for safety, and towards approaches that draw on the built-in traits of the media itself. As tampering strategies develop extra subtle, methods that check the picture’s personal inner construction could begin to matter extra.

Additional, many various techniques proposed to deal with this drawback introduce important friction by requiring modifications to long-established image-processing workflows – a few of which have been working reliably for years, and even many years, and which might demand a far stronger justification for retooling.

 

* My conversion of the authors’ inline citations to hyperlinks.

First printed Friday, April 25, 2025