text:
The Fifth Horseman Is Fear
...And the Fifth Horseman is Fear (...a paty jezdec je Strach) Ratings & Reviews Explanation
The White Bus The Model Couple The Rise of Louis XIV Vive le tour I Don't Hear the Guitar Anymore
The Fifth Horseman Is Fear Photos
When Dr. Braun is forbidden to practice medicine during the Nazi occupation of Prague, he catalogs the confiscated property of his fellow Jews for the local party officials. When a gravely injured member of the resistance shows up in his apartment building, the elderly doctor abandons his pragmatism and decides to put his own life in danger by searching the city for morphine to assist with the man's pain.
Zbynek Brynych
Milan Nejedlý, , Zbynek Brynych, , Ester Krumbachová
Miroslav Machacek
Dr. Braun
Olga Scheinpflugova
Zdenka Prochazkova
Mrs. Vesely
Jiri Adamira
Mr. Vesely
Josef Vinklar
Ilja Prachar
Sidlak
Sidlak's Wife
Jiri Vrstala
Milan Nejedlý
Ester Krumbachová
Jirí Sternwald
Jan Kalis
Critic Reviews for ...And the Fifth Horseman is Fear (...a paty jezdec je Strach)
Director Brynych's stark, symbolic explorations of human despair lift The Fifth Horseman to a high level of creative cinema.
January 9, 2018 | Full Review…
The Fifth Horseman is Fear is such a nearly perfect film that it comes as a shock, in the last ten minutes, to discover how deeply involved you have become.
So beautifully and thoughtfully made - well written and acted, shot with perfect economy and care-that one is almost surprised at the end to be very much moved by the substance of it.
Dense atmosphere and rich characters more than make up for a hook or a twist
Disturbing and very different. Seek this one out.
Offers a harrowing depiction of life in Nazi occupied Prague.
June 30, 2008 | Rating: A | Full Review…
Eerie, beautiful and devastating.
September 22, 2006 | Full Review…
Brynych draws upon German Expressionist film techniques, blending both Hollywood noir and classic horror film styles.
culturevulture.net
Audience Reviews for ...And the Fifth Horseman is Fear (...a paty jezdec je Strach)
Once upon a time in Nazi-occupied Czechoslovakia, when Jews were removed from their professional activities, a Jewish doctor reluctantly accepts the petition of a fellow tenant to heal a political fugitive who has been shot. The moral dilemma that the doctor faces is quite obvious, but no less complicated: his previous profession of medicine had the purpose of saving lives and improving health; nevertheless, with the Nazi occupation, the potential consequences of giving medical assistance to a political fugitive are unmeasurable. Modern Holocaust films, especially made in the U.S., normally use sensationalist portrayals of physical, psychological and/or emotional abuse against the Jews to accentuate the inhumanity of a world turned upside down. Nevertheless, Europe had a different perspective towards the conflict, equally humane, but with no manipulation and placing in the center of the table even more complex themes to treat amidst chaotic circumstances. The most notorious examples specifically talking about the Czech New Wave were The Shop on Main Street (1965), which embodies the multifaceted perspective of a whole town while placing an unlikely human relationship as a protagonistic element, and Zbynek Brynych's film now being discussed, which was released also in 1965. As the film progresses, different faces of a torn nation impacted by conflicting forces are shown, which happens during the doctor's hellish search for morphine. Little hope seems to be around seedy joints where local women are forced to be prostitutes for German soldiers, bars, and insane asylums with high suicide rates. But at some point, you also begin to realize, given some clothing styles, furniture and available domestic and medical artifacts, that the film is more probable to take place in the 1960s, turning the whole show unexpectedly into an allegorical representation of the Communist dictatorship through the portrayal of the Nazi regime, becoming the thousandth Czech film that makes references to Communism. The whole show, therefore, is historically hypothetical, but socially politically valid. Despite its seeming subtlety, ...and the Fifth Horseman Is Fear, a title that randomly makes a Biblical speculative reference out of context, is a testament against inhuman circumstances about the exaltation of the human spirit above overwhelming ideals of power and nationalism. Morally, the film actually might be one of the most challenging to see, because it is easy to stand up from the couch feeling that certain scenarios are entirely devoid of hope. Either you support an invasive regime against the lives or well-being of others, or you must pay the terrible price of getting hold of your own definition of "ethics" and "moral". Shot spectacularly like only the 60s managed to do in beautiful Black & White, this is the Holocaust portrayed from a more mature and difficult perspective which reminds us that, as human beings, we make decisions everyday with, unfortunately, incalculable repercussions in any time term. 92/100 P.S. It is a pessimistic film, but concluding in a way that invites everybody to the contribution of a better world where we stop creating realities with dead ends.
Edgar C Super Reviewer
...And the Fifth Horseman is Fear (...a paty jezdec je Strach) Quotes


text:
Think Tanks Push ALEC to Go After Unions
At a closed-door ALEC meeting, Koch-funded policy shops unveil new restrictions on public-sector unions.
Paul Abowd
Anti-ALEC poster from a protest in Scottsdale, Arizona, in November 2011Soozarty1/Flickr
Much of the recent controversy surrounding the American Legislative Exchange Council has focused upon the way it brings together its key members, major corporations and state legislators, to craft legislation behind closed doors. Largely unnoticed has been the influence wielded by a third group of ALEC members: think tanks.
Two of those state-level think tanks took center stage at last weekend's ALEC Task Force Summit in Charlotte, North Carolina. The Arizona-based Goldwater Institute and the Michigan-based Mackinac Center for Public Policy successfully shepherded five model bills through ALEC's Commerce, Insurance, and Economic Development Task Force—all targeting public-sector unions.
Goldwater representative Byron Schlomach introduced two bills, one requiring that public employees annually approve their employer's automatic deduction of union dues from paychecks. Another would prohibit union officials from taking paid leave from public-sector jobs to perform union duties.
More ALEC Coverage From Mother Jones
How ALEC Ghostwrites the Law
ALEC Gets a Break From Lobbying Rules
Progressive Groups: Yank ALEC's Nonprofit Status!
How ALEC Helps Keep Fracking Chemicals Secret
GOP, ALEC Could Make It Harder for Millions to Cast Votes
The Mackinac Center sent labor policy analyst Paul Kersey to introduce three more bills targeting unions. One of those model bills is already Michigan law, requiring public-sector unions to make public audits of their financial activities. Another Mackinac proposal would require public-sector union members to vote on their union membership every three to five years, and a third would make it easier for public and private employees to decertify their unions.
Members of the ALEC's commerce task force confirmed that the five union bills were approved in Charlotte. Amid heightened scrutiny, ALEC restricted press access and shortened the summit to one day. ALEC did not return calls requesting information.
The think tanks' bills will become model legislation if the group's board of directors does not initiate a formal review of the bills within 30 days. ALEC will then likely encourage its member legislators to introduce the model bills back in their home states. Since its founding in 1973, ALEC has successfully pushed hundreds of laws at the state level. According to the its website, every year legislators introduce nearly 1,000 bills based on ALEC model legislation, and 20 percent of them become law.
Dozens of state-based think tanks, many of them part of a Heritage Foundation-affiliated umbrella group called the State Policy Network, have long held sway within ALEC. "A very large proportion of the bills are sponsored by these think tanks," says Nick Surgey, a legal associate at Common Cause, which claims ALEC is actually a lobbying group and is violating its nonprofit status. "But behind that next layer is another set of unknowns about who is pushing the think tanks' agenda."
Goldwater and Mackinac are both part of the State Policy Network, which is headquartered in Arlington, Virginia, and boasts 59 member organizations across all 50 states. The network was founded in 1992 "at the urging of Ronald Reagan." The group is a sponsor of ALEC events and made grants to 18 free-market organizations in 2010, including $25,000 to the Mackinac Center. In 2008, it gave $50,000 to Mackinac and $30,000 to Goldwater.
Some, though not all, of Goldwater and Mackinac's other financial supporters have been revealed. They have been supported with grants from the Charles Koch Charitable Foundation, the Walton Family Foundation, and the State Policy Network—groups that also fund ALEC. Together, Goldwater and Mackinac draw money from 12 of the same conservative foundations, according to analysis by Media Matters Action Network. In 2010, the last year for which information is available, the think tanks had budgets of approximately $3.5 million each.
Before the union bills were approved at ALEC's conference last weekend, some of them were sponsored in the Arizona and Michigan legislatures by ALEC members. "Arizona is a petri dish for extreme legislation," says John Loredo, a Democrat and former minority leader in the state House of Representatives.
"A very large proportion of the bills are sponsored by these think tanks. But behind that next layer is another set of unknowns about who is pushing the think tanks' agenda."
The Arizona Legislature has one of the largest contingents of ALEC legislators in the country. The last eight Arizona Senate presidents have been ALEC members, including former Sen. Russell Pearce, who sponsored the SB 1070 immigration bill, which later became ALEC model legislation and is currently under review by the US Supreme Court.
In the last legislative session, which ended May 3, the Phoenix-based Goldwater Institute advocated for a package of bills targeting public-sector unions that was sponsored by ALEC member Sen. Rick Murphy. The bills included the two introduced by Goldwater at ALEC's Charlotte conference to prohibit paid union leave and require employees to authorize the deduction of union dues.
None of the bills, though, became law in Arizona. Goldwater and union representatives squared off in testimony while the Legislature considered the bills. At a Senate committee hearing on SB 1485, which would have ended bargaining for public employees, Nick Dranias, the director of the think tank's Center for Constitutional Government, said "collective-bargaining laws threaten the very foundation of our republic." The committee recommended the bill for passage, but it did not come to a vote before the full Legislature.
"We believe these bills are just a balancing measure," says Goldwater president Darcy Olsen. "It doesn't take away the voice of public employees, it just puts them on a par with the rest of the taxpaying citizens of Arizona."
A separate bill to restructure hiring and firing practices for public sector workers became law in May. Gov. Jan Brewer had vowed to make it a legislative priority at a Scottsdale ALEC summit in 2011. Sponsored by an ALEC member, Rep. Justin Olson, the law allows state employers to fire public-sector employees "at-will," with no right to appeal.
Sheri Van Horsen, president of American Federation of State County and Municipal Employees Local 3111, said the state's unions are considering a legal challenge or ballot referendum to overturn the law. Because it exempts public-safety unions, Van Horsen argues that it is unconstitutional under the federal Equal Protection Clause.
Of the three model bills that Mackinac's Kersey introduced at the recent ALEC conference, only one has become law in Michigan—a provision requiring every union to post an audit of its financial activity online. The think tank's other two bills have not been introduced in the Michigan legislature.
"I know people look at us and say this must be coordinated effort…We're not a lobbying organization, we're not doing guerrilla warfare—we're a think tank."
Kersey says his model bill, the Election Accountability for Municipal Employees Act, would set up a schedule by which public-sector employees vote on unionization every three to five years, and would require a majority of all eligible union members—not just voting members—to maintain union representation. His other bill would alter the requirement that at least 30 percent of workers in a bargaining unit approve a petition to vote on ending union representation. Kersey's model bill would lower that requirement to 10 percent and would apply it to both public- and private-sector unions.
The Mackinac Center has played a key role in pushing Michigan's Republican-controlled Legislature to outlaw collective bargaining for public unions, supporting Gov. Rick Snyder's year-old "emergency manager" law, which has ended public-sector bargaining in a handful of cities where the state has appointed a fiscal manager. The emergency manager in Pontiac, a former Mackinac Center adviser, abrogated city contracts with police and firefighters unions last year.
Like ALEC, Mackinac and Goldwater centers have been accused of crossing the line between public-policy research and lobbying. Common Cause has filed a complaint with the IRS, calling upon ALEC, which files as a 501(c)(3) public charity, to register as a lobbyist. The state-based think tanks are also under scrutiny for frequent correspondence with legislators and testimony at state capitols, and for drafting model bills like the ones brought to ALEC last weekend.
In April, Michigan Democratic Rep. Sander Levin asked the IRS to review the Mackinac Center's advocacy role and evaluate whether indeed it should retain its tax-exempt, public-charity status. Levin referenced emails in which Mackinac advisers gave state lawmakers detailed advice on legislation that would cap the state's health care payments to public-sector employees. The emails concluded with a message from Mackinac's senior legislative analyst Jack McHugh, who wrote to Republican legislator and ALEC member Tom McMillin that "our goal is to outlaw government collective bargaining in Michigan." IRS officials told Levin's office they would take a closer look at Mackinac's tax status.
The think tank has denied any wrongdoing. "We are 100 percent confident that we have complied with all laws pertaining to our 501(c)(3) status," Mackinac's vice president for communications Michael Jahr told the Lansing-area Daily Press & Argus.
Last year, Arizona's secretary of state sent Goldwater letters asking the think tank to register as a lobbyist. "We believe you're lobbying, you should sign up," Assistant Secretary of State Jim Drake told the Arizona Republic. Following the letters from the state, however, Goldwater did register some of its representatives as lobbyists.
"I know people look at us and say this must be coordinated effort," says Goldwater's Olsen. "That is not how we operate. We're not a lobbying organization, we're not doing guerrilla warfare—we're a think tank."
ALEC Gets a Break From State Lobbying Laws
How ALEC Helps Companies Keep Fracking Ingredients Secret
— By Cora Currier, ProPublica
Progressives: Yank ALEC's Nonprofit Status!
Michigan's Hostile Takeover
—By Paul Abowd, Center for Public Integrity

redpajama_set_name: RedPajamaCommonCrawl


text:
Images & Voices of Hope | December 2, 2020
What we do & why we do it
ivoh's history & mission
Restorative Narratives: Defining a new strength-based genre
Exploring the impact of Restorative Narrative
Biology of Story Restorative Narrative Videos
Guiding questions for media practitioners wanting to pursue Restorative Narratives
"Dolores" continues the fight for racial and labor justice
Dolores Huerta leads the audience in chanting "Who's got the power? We've got the power!" at a screening of the new documentary about her life, Dolores, in Washington, D.C. on Sept. 15. Photo by Kara Newhouse.
By Kara Newhouse
Kara Newhouse is the creator and host of the Women in STEM podcast and a 2015 ivoh summit attendee. You can follow her on Twitter at @KaraNewhouse.
In tenth grade I dressed as 1950s Mouseketeer Annette Funicello for a history class social. It was an easy costume: I'd worn a plaid A-line skirt in the fall play, and I still owned Minnie Mouse ears my sister brought me from Disney World. Despite those wardrobe conveniences, though, when I look back I wonder why I didn't select a more inspiring figure from 20th century American history. Perhaps someone like women's suffrage crusader Alice Paul or desegregation activist Diane Nash or farmworker organizer Dolores Huerta.
Of course, to dress as any of those women, I would have needed to first encounter their names and historical importance. That didn't happen until college or later. For instance, I first heard of Huerta at a political poetry reading in Arizona five years ago. More recently, I learned much more of her story from the new documentary, "Dolores," directed by Peter Bratt. The film is currently screening in cities across the country. Huerta has appeared at Q&A sessions at several screenings, including the one I attended in Washington, D.C. this month.
Much of the media coverage of the film has framed it as a corrective narrative to the historical record that so often leaves women out of the picture. For instance, if you read this United Farm Workers history of the Delano grape strike and boycott, you would believe that Cesar Chavez led those struggles alone. In striking photos and video clips in "Dolores," however, you see that Huerta was there every step of the way in the 1960s and 70s, including co-founding the UFW.
For many viewers — especially white Americans like me — any history of the farmworkers' rights movement may be new. Just as I didn't know Huerta's name as a teenager, neither could I have identified Chavez. My friend who attended the "Dolores" screening with me in D.C. said she'd heard of the grape boycott from her mom but never in school.
Had we encountered the farm labor movement in our textbooks, it likely would have been described as a series of events (marches and pickets) and the results (union contracts for agricultural workers). By contrast, one of the film's strengths is its use of archival footage to shows what labor and political organizing looks like on a daily basis: the kitchen table conversations with farm laborers, the conflicts and camaraderie between movement leaders, and the personal sacrifices made by those who dedicate their lives to social change.
The impact of those sacrifices form the emotional backbone of "Dolores." Some of Huerta's 11 sons and daughters appear in the documentary, discussing the comforts they went without as children and the pain of her long absences amid organizing campaigns. Those wounds clearly still sting, as all of her kids verge on tears during their interviews. Yet they also acknowledge all that Huerta gave to them and the children of farmworkers through her work and her fighting spirit.
Civil rights leader Dolores Huerta answers an audience question while Judith Browne Dianis, executive director of the Advancement Project, listens after a screen of the new documentary, Dolores, in Washington, D.C. on Sept. 15. Photo by Kara Newhouse.
That spirit persists. The latter part of the movie chronicles Huerta's eventual departure from UFW leadership and the founding of her own foundation, which provides leadership training and other support to community organizers today. During a post-screening Q&A organized by public television station WETA, the 87-year-old civil rights icon discussed such issues as police brutality, environmental destruction and Trump's plans to remove Obama-era protections for young immigrants. She emphasized the importance of changing who sits in local and national political offices as a way to advance social justice.
"One of the reasons I'm traveling with the film right now is because I know we are in such a critical situation right now in our country, and I'm calling on everybody that we have to build a wall of resistance — in the Congress," she said to applause and cheers. "It's not just about voting. It's about everybody getting out there and campaigning to get good people elected to Congress."
Huerta ended the night by leading a round of the farm workers' famous chant, "Sí se puede" (Spanish for "Yes, we can"). A movie crowd is not a movement, though, as was obvious when we trickled out onto E Street. Cater-cornered from the theater, a large group of white men and women were gathered, presumably in town for the next day's pro-Trump rally. Their politics were apparent not from the red baseball caps worn by some but from their synchronized cries of "Trump! Trump! Trump! Trump!" and "Freedom! Freedom! Freedom! Freedom!" as they recorded themselves on smart phones. Several moviegoers gazed across the intersection, wondering out loud how to respond. But most simply diffused into the city, moving on to their next Friday night destinations.
"Dolores" is currently playing in select theaters across the U.S. According to a WETA representative, the film will air on PBS stations in early 2018.
Related: Turquoise Mountain illuminates Afghan arts and culture | How podcasters are reshaping the conversation on being Muslim in America | Pop-up Spanish-language bookstore tours the US in pursuit of a more inclusive country | ivoh fellow Anna Claire Vollers shares how immigration changed Sand Mountain
Farmworker Labor social justice
Share on Facebook Tweet This Share on Google Plus Pin This Email This
Back to class: Reporting in Indigenous Communities
Photojournalist Rachael Cerrotti covers changing immigration laws in Sweden
Sign up for ivoh's newsletter
Moving away from 'the danger of a single story'
WBUR's Kind World series shows power of small acts of kindness
How Ideal Impact is bridging the gap between journalism & social good
New Collaborations + Fellow Update
ivoh Fellow Anna Claire Vollers Brings Us Back to Sand Mountain
Join Us to Restore the World with Story
Images & Voices of Hope
3912 N. Broadway Ave


Knowing the relationship between the SI joint and the lumbar spine will help in understanding why low back pain can actually be a result of SI joint dysfunction.
The sacrum, a triangular shaped bone, is connected by a joint on both sides to two separate iliac bones (pelvis), known commonly as your hip bones.
The pelvis and SI joint are drivers for all of your movement and link your hips and legs to your upper body and core. Together, the pelvis and SI joint are the platforms that enable you to run, walk, sit, lunge or jump.


The Flame Trophy crystal is a uniquely shaped award suitable for 2D artwork incorporating text and/or logos.
A unique idea for an award, trophy, promotional or presentation piece.
Manufactured from the finest grade K9 optical crystal.
Internally laser engraved in Australia using the latest top-of-the-range laser systems.
Price includes internal laser engraving. Artwork charged separately. Indent prices and customised crystal shapes/sizes available upon enquiry.


text:
<?php

/**
 * @task recipients   Managing Recipients
 */
final class PhabricatorMetaMTAMail extends PhabricatorMetaMTADAO {

  const STATUS_QUEUE = 'queued';
  const STATUS_SENT  = 'sent';
  const STATUS_FAIL  = 'fail';
  const STATUS_VOID  = 'void';

  const RETRY_DELAY   = 5;

  protected $parameters;
  protected $status;
  protected $message;
  protected $relatedPHID;

  private $recipientExpansionMap;

  public function __construct() {

    $this->status     = self::STATUS_QUEUE;
    $this->parameters = array();

    parent::__construct();
  }

  protected function getConfiguration() {
    return array(
      self::CONFIG_SERIALIZATION => array(
        'parameters'  => self::SERIALIZATION_JSON,
      ),
      self::CONFIG_COLUMN_SCHEMA => array(
        'status' => 'text32',
        'relatedPHID' => 'phid?',

        // T6203/NULLABILITY
        // This should just be empty if there's no body.
        'message' => 'text?',
      ),
      self::CONFIG_KEY_SCHEMA => array(
        'status' => array(
          'columns' => array('status'),
        ),
        'relatedPHID' => array(
          'columns' => array('relatedPHID'),
        ),
        'key_created' => array(
          'columns' => array('dateCreated'),
        ),
      ),
    ) + parent::getConfiguration();
  }

  protected function setParam($param, $value) {
    $this->parameters[$param] = $value;
    return $this;
  }

  protected function getParam($param, $default = null) {
    return idx($this->parameters, $param, $default);
  }

  /**
   * These tags are used to allow users to opt out of receiving certain types
   * of mail, like updates when a task's projects change.
   *
   * @param list<const>
   * @return this
   */
  public function setMailTags(array $tags) {
    $this->setParam('mailtags', array_unique($tags));
    return $this;
  }

  public function getMailTags() {
    return $this->getParam('mailtags', array());
  }

  /**
   * In Gmail, conversations will be broken if you reply to a thread and the
   * server sends back a response without referencing your Message-ID, even if
   * it references a Message-ID earlier in the thread. To avoid this, use the
   * parent email's message ID explicitly if it's available. This overwrites the
   * "In-Reply-To" and "References" headers we would otherwise generate. This
   * needs to be set whenever an action is triggered by an email message. See
   * T251 for more details.
   *
   * @param   string The "Message-ID" of the email which precedes this one.
   * @return  this
   */
  public function setParentMessageID($id) {
    $this->setParam('parent-message-id', $id);
    return $this;
  }

  public function getParentMessageID() {
    return $this->getParam('parent-message-id');
  }

  public function getSubject() {
    return $this->getParam('subject');
  }

  public function addTos(array $phids) {
    $phids = array_unique($phids);
    $this->setParam('to', $phids);
    return $this;
  }

  public function addRawTos(array $raw_email) {

    // Strip addresses down to bare emails, since the MailAdapter API currently
    // requires we pass it just the address (like `alincoln@logcabin.org`), not
    // a full string like `"Abraham Lincoln" <alincoln@logcabin.org>`.
    foreach ($raw_email as $key => $email) {
      $object = new PhutilEmailAddress($email);
      $raw_email[$key] = $object->getAddress();
    }

    $this->setParam('raw-to', $raw_email);
    return $this;
  }

  public function addCCs(array $phids) {
    $phids = array_unique($phids);
    $this->setParam('cc', $phids);
    return $this;
  }

  public function setExcludeMailRecipientPHIDs(array $exclude) {
    $this->setParam('exclude', $exclude);
    return $this;
  }

  private function getExcludeMailRecipientPHIDs() {
    return $this->getParam('exclude', array());
  }

  public function setForceHeraldMailRecipientPHIDs(array $force) {
    $this->setParam('herald-force-recipients', $force);
    return $this;
  }

  private function getForceHeraldMailRecipientPHIDs() {
    return $this->getParam('herald-force-recipients', array());
  }

  public function getTranslation(array $objects) {
    $default_translation = PhabricatorEnv::getEnvConfig('translation.provider');
    $return = null;
    $recipients = array_merge(
      idx($this->parameters, 'to', array()),
      idx($this->parameters, 'cc', array()));
    foreach (array_select_keys($objects, $recipients) as $object) {
      $translation = null;
      if ($object instanceof PhabricatorUser) {
        $translation = $object->getTranslation();
      }
      if (!$translation) {
        $translation = $default_translation;
      }
      if ($return && $translation != $return) {
        return $default_translation;
      }
      $return = $translation;
    }

    if (!$return) {
      $return = $default_translation;
    }

    return $return;
  }

  public function addPHIDHeaders($name, array $phids) {
    $phids = array_unique($phids);
    foreach ($phids as $phid) {
      $this->addHeader($name, '<'.$phid.'>');
    }
    return $this;
  }

  public function addHeader($name, $value) {
    $this->parameters['headers'][] = array($name, $value);
    return $this;
  }

  public function addAttachment(PhabricatorMetaMTAAttachment $attachment) {
    $this->parameters['attachments'][] = $attachment->toDictionary();
    return $this;
  }

  public function getAttachments() {
    $dicts = $this->getParam('attachments');

    $result = array();
    foreach ($dicts as $dict) {
      $result[] = PhabricatorMetaMTAAttachment::newFromDictionary($dict);
    }
    return $result;
  }

  public function setAttachments(array $attachments) {
    assert_instances_of($attachments, 'PhabricatorMetaMTAAttachment');
    $this->setParam('attachments', mpull($attachments, 'toDictionary'));
    return $this;
  }

  public function setFrom($from) {
    $this->setParam('from', $from);
    return $this;
  }

  public function setRawFrom($raw_email, $raw_name) {
    $this->setParam('raw-from', array($raw_email, $raw_name));
    return $this;
  }

  public function setReplyTo($reply_to) {
    $this->setParam('reply-to', $reply_to);
    return $this;
  }

  public function setSubject($subject) {
    $this->setParam('subject', $subject);
    return $this;
  }

  public function setSubjectPrefix($prefix) {
    $this->setParam('subject-prefix', $prefix);
    return $this;
  }

  public function setVarySubjectPrefix($prefix) {
    $this->setParam('vary-subject-prefix', $prefix);
    return $this;
  }

  public function setBody($body) {
    $this->setParam('body', $body);
    return $this;
  }

  public function setHTMLBody($html) {
    $this->setParam('html-body', $html);
    return $this;
  }

  public function getBody() {
    return $this->getParam('body');
  }

  public function getHTMLBody() {
    return $this->getParam('html-body');
  }

  public function setIsErrorEmail($is_error) {
    $this->setParam('is-error', $is_error);
    return $this;
  }

  public function getIsErrorEmail() {
    return $this->getParam('is-error', false);
  }

  public function getToPHIDs() {
    return $this->getParam('to', array());
  }

  public function getRawToAddresses() {
    return $this->getParam('raw-to', array());
  }

  public function getCcPHIDs() {
    return $this->getParam('cc', array());
  }

  /**
   * Force delivery of a message, even if recipients have preferences which
   * would otherwise drop the message.
   *
   * This is primarily intended to let users who don't want any email still
   * receive things like password resets.
   *
   * @param bool  True to force delivery despite user preferences.
   * @return this
   */
  public function setForceDelivery($force) {
    $this->setParam('force', $force);
    return $this;
  }

  public function getForceDelivery() {
    return $this->getParam('force', false);
  }

  /**
   * Flag that this is an auto-generated bulk message and should have bulk
   * headers added to it if appropriate. Broadly, this means some flavor of
   * "Precedence: bulk" or similar, but is implementation and configuration
   * dependent.
   *
   * @param bool  True if the mail is automated bulk mail.
   * @return this
   */
  public function setIsBulk($is_bulk) {
    $this->setParam('is-bulk', $is_bulk);
    return $this;
  }

  /**
   * Use this method to set an ID used for message threading. MetaMTA will
   * set appropriate headers (Message-ID, In-Reply-To, References and
   * Thread-Index) based on the capabilities of the underlying mailer.
   *
   * @param string  Unique identifier, appropriate for use in a Message-ID,
   *                In-Reply-To or References headers.
   * @param bool    If true, indicates this is the first message in the thread.
   * @return this
   */
  public function setThreadID($thread_id, $is_first_message = false) {
    $this->setParam('thread-id', $thread_id);
    $this->setParam('is-first-message', $is_first_message);
    return $this;
  }

  /**
   * Save a newly created mail to the database. The mail will eventually be
   * delivered by the MetaMTA daemon.
   *
   * @return this
   */
  public function saveAndSend() {
    return $this->save();
  }

  public function save() {
    if ($this->getID()) {
      return parent::save();
    }

    // NOTE: When mail is sent from CLI scripts that run tasks in-process, we
    // may re-enter this method from within scheduleTask(). The implementation
    // is intended to avoid anything awkward if we end up reentering this
    // method.

    $this->openTransaction();
      // Save to generate a task ID.
      $result = parent::save();

      // Queue a task to send this mail.
      $mailer_task = PhabricatorWorker::scheduleTask(
        'PhabricatorMetaMTAWorker',
        $this->getID(),
        array(
          'priority' => PhabricatorWorker::PRIORITY_ALERTS,
        ));

    $this->saveTransaction();

    return $result;
  }

  public function buildDefaultMailer() {
    return PhabricatorEnv::newObjectFromConfig('metamta.mail-adapter');
  }

  /**
   * Attempt to deliver an email immediately, in this process.
   *
   * @param bool  Try to deliver this email even if it has already been
   *              delivered or is in backoff after a failed delivery attempt.
   * @param PhabricatorMailImplementationAdapter Use a specific mail adapter,
   *              instead of the default.
   *
   * @return void
   */
  public function sendNow(
    $force_send = false,
    PhabricatorMailImplementationAdapter $mailer = null) {

    if ($mailer === null) {
      $mailer = $this->buildDefaultMailer();
    }

    if (!$force_send) {
      if ($this->getStatus() != self::STATUS_QUEUE) {
        throw new Exception(pht('Trying to send an already-sent mail!'));
      }
    }

    try {
      $params = $this->parameters;

      $actors = $this->loadAllActors();
      $deliverable_actors = $this->filterDeliverableActors($actors);

      $default_from = PhabricatorEnv::getEnvConfig('metamta.default-address');
      if (empty($params['from'])) {
        $mailer->setFrom($default_from);
      }

      $is_first = idx($params, 'is-first-message');
      unset($params['is-first-message']);

      $is_threaded = (bool)idx($params, 'thread-id');

      $reply_to_name = idx($params, 'reply-to-name', '');
      unset($params['reply-to-name']);

      $add_cc = array();
      $add_to = array();

      // Only try to use preferences if everything is multiplexed, so we
      // get consistent behavior.
      $use_prefs = self::shouldMultiplexAllMail();

      $prefs = null;
      if ($use_prefs) {

        // If multiplexing is enabled, some recipients will be in "Cc"
        // rather than "To". We'll move them to "To" later (or supply a
        // dummy "To") but need to look for the recipient in either the
        // "To" or "Cc" fields here.
        $target_phid = head(idx($params, 'to', array()));
        if (!$target_phid) {
          $target_phid = head(idx($params, 'cc', array()));
        }

        if ($target_phid) {
          $user = id(new PhabricatorUser())->loadOneWhere(
            'phid = %s',
            $target_phid);
          if ($user) {
            $prefs = $user->loadPreferences();
          }
        }
      }

      foreach ($params as $key => $value) {
        switch ($key) {
          case 'raw-from':
            list($from_email, $from_name) = $value;
            $mailer->setFrom($from_email, $from_name);
            break;
          case 'from':
            $from = $value;
            $actor_email = null;
            $actor_name = null;
            $actor = idx($actors, $from);
            if ($actor) {
              $actor_email = $actor->getEmailAddress();
              $actor_name = $actor->getName();
            }
            $can_send_as_user = $actor_email &&
              PhabricatorEnv::getEnvConfig('metamta.can-send-as-user');

            if ($can_send_as_user) {
              $mailer->setFrom($actor_email, $actor_name);
            } else {
              $from_email = coalesce($actor_email, $default_from);
              $from_name = coalesce($actor_name, pht('Phabricator'));

              if (empty($params['reply-to'])) {
                $params['reply-to'] = $from_email;
                $params['reply-to-name'] = $from_name;
              }

              $mailer->setFrom($default_from, $from_name);
            }
            break;
          case 'reply-to':
            $mailer->addReplyTo($value, $reply_to_name);
            break;
          case 'to':
            $to_phids = $this->expandRecipients($value);
            $to_actors = array_select_keys($deliverable_actors, $to_phids);
            $add_to = array_merge(
              $add_to,
              mpull($to_actors, 'getEmailAddress'));
            break;
          case 'raw-to':
            $add_to = array_merge($add_to, $value);
            break;
          case 'cc':
            $cc_phids = $this->expandRecipients($value);
            $cc_actors = array_select_keys($deliverable_actors, $cc_phids);
            $add_cc = array_merge(
              $add_cc,
              mpull($cc_actors, 'getEmailAddress'));
            break;
          case 'headers':
            foreach ($value as $pair) {
              list($header_key, $header_value) = $pair;

              // NOTE: If we have \n in a header, SES rejects the email.
              $header_value = str_replace("\n", ' ', $header_value);

              $mailer->addHeader($header_key, $header_value);
            }
            break;
          case 'attachments':
            $value = $this->getAttachments();
            foreach ($value as $attachment) {
              $mailer->addAttachment(
                $attachment->getData(),
                $attachment->getFilename(),
                $attachment->getMimeType());
            }
            break;
          case 'subject':
            $subject = array();

            if ($is_threaded) {
              $add_re = PhabricatorEnv::getEnvConfig('metamta.re-prefix');

              if ($prefs) {
                $add_re = $prefs->getPreference(
                  PhabricatorUserPreferences::PREFERENCE_RE_PREFIX,
                  $add_re);
              }

              if ($add_re) {
                $subject[] = 'Re:';
              }
            }

            $subject[] = trim(idx($params, 'subject-prefix'));

            $vary_prefix = idx($params, 'vary-subject-prefix');
            if ($vary_prefix != '') {
              $use_subject = PhabricatorEnv::getEnvConfig(
                'metamta.vary-subjects');

              if ($prefs) {
                $use_subject = $prefs->getPreference(
                  PhabricatorUserPreferences::PREFERENCE_VARY_SUBJECT,
                  $use_subject);
              }

              if ($use_subject) {
                $subject[] = $vary_prefix;
              }
            }

            $subject[] = $value;

            $mailer->setSubject(implode(' ', array_filter($subject)));
            break;
          case 'is-bulk':
            if ($value) {
              $mailer->addHeader('Precedence', 'bulk');
            }
            break;
          case 'thread-id':

            // NOTE: Gmail freaks out about In-Reply-To and References which
            // aren't in the form "<string@domain.tld>"; this is also required
            // by RFC 2822, although some clients are more liberal in what they
            // accept.
            $domain = PhabricatorEnv::getEnvConfig('metamta.domain');
            $value = '<'.$value.'@'.$domain.'>';

            if ($is_first && $mailer->supportsMessageIDHeader()) {
              $mailer->addHeader('Message-ID',  $value);
            } else {
              $in_reply_to = $value;
              $references = array($value);
              $parent_id = $this->getParentMessageID();
              if ($parent_id) {
                $in_reply_to = $parent_id;
                // By RFC 2822, the most immediate parent should appear last
                // in the "References" header, so this order is intentional.
                $references[] = $parent_id;
              }
              $references = implode(' ', $references);
              $mailer->addHeader('In-Reply-To', $in_reply_to);
              $mailer->addHeader('References',  $references);
            }
            $thread_index = $this->generateThreadIndex($value, $is_first);
            $mailer->addHeader('Thread-Index', $thread_index);
            break;
          case 'mailtags':
            // Handled below.
            break;
          case 'subject-prefix':
          case 'vary-subject-prefix':
            // Handled above.
            break;
          default:
            // Just discard.
        }
      }

      $body = idx($params, 'body', '');
      $max = PhabricatorEnv::getEnvConfig('metamta.email-body-limit');
      if (strlen($body) > $max) {
        $body = id(new PhutilUTF8StringTruncator())
          ->setMaximumBytes($max)
          ->truncateString($body);
        $body .= "\n";
        $body .= pht('(This email was truncated at %d bytes.)', $max);
      }
      $mailer->setBody($body);

      $html_emails = false;
      if ($use_prefs && $prefs) {
        $html_emails = $prefs->getPreference(
          PhabricatorUserPreferences::PREFERENCE_HTML_EMAILS,
          $html_emails);
      }

      if ($html_emails && isset($params['html-body'])) {
        $mailer->setHTMLBody($params['html-body']);
      }

      if (!$add_to && !$add_cc) {
        $this->setStatus(self::STATUS_VOID);
        $this->setMessage(
          pht(
            'Message has no valid recipients: all To/Cc are disabled, '.
            'invalid, or configured not to receive this mail.'));
        return $this->save();
      }

      if ($this->getIsErrorEmail()) {
        $all_recipients = array_merge($add_to, $add_cc);
        if ($this->shouldRateLimitMail($all_recipients)) {
          $this->setStatus(self::STATUS_VOID);
          $this->setMessage(
            pht(
              'This is an error email, but one or more recipients have '.
              'exceeded the error email rate limit. Declining to deliver '.
              'message.'));
          return $this->save();
        }
      }

      if (PhabricatorEnv::getEnvConfig('phabricator.silent')) {
        $this->setStatus(self::STATUS_VOID);
        $this->setMessage(
          pht(
            'Phabricator is running in silent mode. See `%s` '.
            'in the configuration to change this setting.',
            'phabricator.silent'));
        return $this->save();
      }

      $mailer->addHeader('X-Phabricator-Sent-This-Message', 'Yes');
      $mailer->addHeader('X-Mail-Transport-Agent', 'MetaMTA');

      // Some clients respect this to suppress OOF and other auto-responses.
      $mailer->addHeader('X-Auto-Response-Suppress', 'All');

      // If the message has mailtags, filter out any recipients who don't want
      // to receive this type of mail.
      $mailtags = $this->getParam('mailtags');
      if ($mailtags) {
        $tag_header = array();
        foreach ($mailtags as $mailtag) {
          $tag_header[] = '<'.$mailtag.'>';
        }
        $tag_header = implode(', ', $tag_header);
        $mailer->addHeader('X-Phabricator-Mail-Tags', $tag_header);
      }

      // Some mailers require a valid "To:" in order to deliver mail. If we
      // don't have any "To:", try to fill it in with a placeholder "To:".
      // If that also fails, move the "Cc:" line to "To:".
      if (!$add_to) {
        $placeholder_key = 'metamta.placeholder-to-recipient';
        $placeholder = PhabricatorEnv::getEnvConfig($placeholder_key);
        if ($placeholder !== null) {
          $add_to = array($placeholder);
        } else {
          $add_to = $add_cc;
          $add_cc = array();
        }
      }

      $add_to = array_unique($add_to);
      $add_cc = array_diff(array_unique($add_cc), $add_to);

      $mailer->addTos($add_to);
      if ($add_cc) {
        $mailer->addCCs($add_cc);
      }
    } catch (Exception $ex) {
      $this
        ->setStatus(self::STATUS_FAIL)
        ->setMessage($ex->getMessage())
        ->save();

      throw $ex;
    }

    try {
      $ok = $mailer->send();
      if (!$ok) {
        // TODO: At some point, we should clean this up and make all mailers
        // throw.
        throw new Exception(
          pht('Mail adapter encountered an unexpected, unspecified failure.'));
      }

      $this->setStatus(self::STATUS_SENT);
      $this->save();

      return $this;
    } catch (PhabricatorMetaMTAPermanentFailureException $ex) {
      $this
        ->setStatus(self::STATUS_FAIL)
        ->setMessage($ex->getMessage())
        ->save();

      throw $ex;
    } catch (Exception $ex) {
      $this
        ->setMessage($ex->getMessage()."\n".$ex->getTraceAsString())
        ->save();

      throw $ex;
    }
  }

  public static function getReadableStatus($status_code) {
    $readable = array(
      self::STATUS_QUEUE => pht('Queued for Delivery'),
      self::STATUS_FAIL  => pht('Delivery Failed'),
      self::STATUS_SENT  => pht('Sent'),
      self::STATUS_VOID  => pht('Void'),
    );
    $status_code = coalesce($status_code, '?');
    return idx($readable, $status_code, $status_code);
  }

  private function generateThreadIndex($seed, $is_first_mail) {
    // When threading, Outlook ignores the 'References' and 'In-Reply-To'
    // headers that most clients use. Instead, it uses a custom 'Thread-Index'
    // header. The format of this header is something like this (from
    // camel-exchange-folder.c in Evolution Exchange):

    /* A new post to a folder gets a 27-byte-long thread index. (The value
     * is apparently unique but meaningless.) Each reply to a post gets a
     * 32-byte-long thread index whose first 27 bytes are the same as the
     * parent's thread index. Each reply to any of those gets a
     * 37-byte-long thread index, etc. The Thread-Index header contains a
     * base64 representation of this value.
     */

    // The specific implementation uses a 27-byte header for the first email
    // a recipient receives, and a random 5-byte suffix (32 bytes total)
    // thereafter. This means that all the replies are (incorrectly) siblings,
    // but it would be very difficult to keep track of the entire tree and this
    // gets us reasonable client behavior.

    $base = substr(md5($seed), 0, 27);
    if (!$is_first_mail) {
      // Not totally sure, but it seems like outlook orders replies by
      // thread-index rather than timestamp, so to get these to show up in the
      // right order we use the time as the last 4 bytes.
      $base .= ' '.pack('N', time());
    }

    return base64_encode($base);
  }

  public static function shouldMultiplexAllMail() {
    return PhabricatorEnv::getEnvConfig('metamta.one-mail-per-recipient');
  }

/* -(  Managing Recipients  )------------------------------------------------ */

  /**
   * Get all of the recipients for this mail, after preference filters are
   * applied. This list has all objects to whom delivery will be attempted.
   *
   * Note that this expands recipients into their members, because delivery
   * is never directly attempted to aggregate actors like projects.
   *
   * @return  list<phid>  A list of all recipients to whom delivery will be
   *                      attempted.
   * @task recipients
   */
  public function buildRecipientList() {
    $actors = $this->loadAllActors();
    $actors = $this->filterDeliverableActors($actors);
    return mpull($actors, 'getPHID');
  }

  public function loadAllActors() {
    $actor_phids = $this->getAllActorPHIDs();
    $actor_phids = $this->expandRecipients($actor_phids);
    return $this->loadActors($actor_phids);
  }

  private function getAllActorPHIDs() {
    return array_merge(
      array($this->getParam('from')),
      $this->getToPHIDs(),
      $this->getCcPHIDs());
  }

  /**
   * Expand a list of recipient PHIDs (possibly including aggregate recipients
   * like projects) into a deaggregated list of individual recipient PHIDs.
   * For example, this will expand project PHIDs into a list of the project's
   * members.
   *
   * @param list<phid>  List of recipient PHIDs, possibly including aggregate
   *                    recipients.
   * @return list<phid> Deaggregated list of mailable recipients.
   */
  private function expandRecipients(array $phids) {
    if ($this->recipientExpansionMap === null) {
      $all_phids = $this->getAllActorPHIDs();
      $this->recipientExpansionMap = id(new PhabricatorMetaMTAMemberQuery())
        ->setViewer(PhabricatorUser::getOmnipotentUser())
        ->withPHIDs($all_phids)
        ->execute();
    }

    $results = array();
    foreach ($phids as $phid) {
      foreach ($this->recipientExpansionMap[$phid] as $recipient_phid) {
        $results[$recipient_phid] = $recipient_phid;
      }
    }

    return array_keys($results);
  }

  private function filterDeliverableActors(array $actors) {
    assert_instances_of($actors, 'PhabricatorMetaMTAActor');
    $deliverable_actors = array();
    foreach ($actors as $phid => $actor) {
      if ($actor->isDeliverable()) {
        $deliverable_actors[$phid] = $actor;
      }
    }
    return $deliverable_actors;
  }

  private function loadActors(array $actor_phids) {
    $actor_phids = array_filter($actor_phids);
    $viewer = PhabricatorUser::getOmnipotentUser();

    $actors = id(new PhabricatorMetaMTAActorQuery())
      ->setViewer($viewer)
      ->withPHIDs($actor_phids)
      ->execute();

    if (!$actors) {
      return array();
    }

    if ($this->getForceDelivery()) {
      // If we're forcing delivery, skip all the opt-out checks. We don't
      // bother annotating reasoning on the mail in this case because it should
      // always be obvious why the mail hit this rule (e.g., it is a password
      // reset mail).
      foreach ($actors as $actor) {
        $actor->setDeliverable(PhabricatorMetaMTAActor::REASON_FORCE);
      }
      return $actors;
    }

    // Exclude explicit recipients.
    foreach ($this->getExcludeMailRecipientPHIDs() as $phid) {
      $actor = idx($actors, $phid);
      if (!$actor) {
        continue;
      }
      $actor->setUndeliverable(PhabricatorMetaMTAActor::REASON_RESPONSE);
    }

    // Before running more rules, save a list of the actors who were
    // deliverable before we started running preference-based rules. This stops
    // us from trying to send mail to disabled users just because a Herald rule
    // added them, for example.
    $deliverable = array();
    foreach ($actors as $phid => $actor) {
      if ($actor->isDeliverable()) {
        $deliverable[] = $phid;
      }
    }

    // For the rest of the rules, order matters. We're going to run all the
    // possible rules in order from weakest to strongest, and let the strongest
    // matching rule win. The weaker rules leave annotations behind which help
    // users understand why the mail was routed the way it was.

    // Exclude the actor if their preferences are set.
    $from_phid = $this->getParam('from');
    $from_actor = idx($actors, $from_phid);
    if ($from_actor) {
      $from_user = id(new PhabricatorPeopleQuery())
        ->setViewer($viewer)
        ->withPHIDs(array($from_phid))
        ->execute();
      $from_user = head($from_user);
      if ($from_user) {
        $pref_key = PhabricatorUserPreferences::PREFERENCE_NO_SELF_MAIL;
        $exclude_self = $from_user
          ->loadPreferences()
          ->getPreference($pref_key);
        if ($exclude_self) {
          $from_actor->setUndeliverable(PhabricatorMetaMTAActor::REASON_SELF);
        }
      }
    }

    $all_prefs = id(new PhabricatorUserPreferences())->loadAllWhere(
      'userPHID in (%Ls)',
      $actor_phids);
    $all_prefs = mpull($all_prefs, null, 'getUserPHID');

    $value_email = PhabricatorUserPreferences::MAILTAG_PREFERENCE_EMAIL;

    // Exclude all recipients who have set preferences to not receive this type
    // of email (for example, a user who says they don't want emails about task
    // CC changes).
    $tags = $this->getParam('mailtags');
    if ($tags) {
      foreach ($all_prefs as $phid => $prefs) {
        $user_mailtags = $prefs->getPreference(
          PhabricatorUserPreferences::PREFERENCE_MAILTAGS,
          array());

        // The user must have elected to receive mail for at least one
        // of the mailtags.
        $send = false;
        foreach ($tags as $tag) {
          if (((int)idx($user_mailtags, $tag, $value_email)) == $value_email) {
            $send = true;
            break;
          }
        }

        if (!$send) {
          $actors[$phid]->setUndeliverable(
            PhabricatorMetaMTAActor::REASON_MAILTAGS);
        }
      }
    }

    // If recipients were initially deliverable and were added by "Send me an
    // email" Herald rules, annotate them as such and make them deliverable
    // again, overriding any changes made by the  "self mail" and "mail tags"
    // settings.
    $force_recipients = $this->getForceHeraldMailRecipientPHIDs();
    $force_recipients = array_fuse($force_recipients);
    if ($force_recipients) {
      foreach ($deliverable as $phid) {
        if (isset($force_recipients[$phid])) {
          $actors[$phid]->setDeliverable(
            PhabricatorMetaMTAActor::REASON_FORCE_HERALD);
        }
      }
    }

    // Exclude recipients who don't want any mail. This rule is very strong
    // and runs last.
    foreach ($all_prefs as $phid => $prefs) {
      $exclude = $prefs->getPreference(
        PhabricatorUserPreferences::PREFERENCE_NO_MAIL,
        false);
      if ($exclude) {
        $actors[$phid]->setUndeliverable(
          PhabricatorMetaMTAActor::REASON_MAIL_DISABLED);
      }
    }

    return $actors;
  }

  private function shouldRateLimitMail(array $all_recipients) {
    try {
      PhabricatorSystemActionEngine::willTakeAction(
        $all_recipients,
        new PhabricatorMetaMTAErrorMailAction(),
        1);
      return false;
    } catch (PhabricatorSystemActionRateLimitException $ex) {
      return true;
    }
  }

}

redpajama_set_name: RedPajamaGithub


Mary Moody Emerson, Ralph Waldo Emerson's aunt and tutor, had been writing to him for several years about nature's superiority to traditional religion. In one letter, she wrote, "Nature is my pulpit." When Waldo's young wife died, the loss shook him to the core and haunted him with questions about his vocation as a minister. Aunt Mary invited him to her sanctuary in the White Mountains of Maine, where they together confronted Nature, God, and each other. This experience changed both of them, and New England history. Haverington's sermon will tell Mary's story and raise the questions they wrestled with. Nancy Haverington, a playwright, screenwriter, former minister and Emerson scholar, will tell Mary's story and explore the questions they wrestled with.
The music today will be our Singing Group led by Helen Brandt with Judy Putnam at the piano.


text:
From Animagi to Zonko's: The Harry Potter Glossary
Brush up on all the terminology you need to survive in the Potterverse.
Animagi: Wizards who can morph into animals at will. The skill can be taught, and a wizard usually take the form of his Patronus.
Apparate: A wizard's ability to teleport himself from one location to another. Apparition requires a license from the Department of Magical Transportation that cannot be obtained until a wizard is 17 years old.
Azkaban: Considered the worst of all wizarding prisons. Under the watch of Dementors, most prisoners eventually go insane and die a slow death.
Basilisk: A giant serpent bred by wizards who dabble in the Dark Arts.
Bernie Bott's Every Flavour Beans: Much like Muggles' Jelly Belly jelly beans, these candies come in many unusual flavors. Unlike the Muggle candies, however, some of the flavors are disgusting. Flavors range from chocolate and peppermint to liver and vomit.
Butterbeer: A popular beverage served in Hogsmeade and said to taste a bit like butterscotch. Despite the name, the alcohol content is very low.
Centaur: A magical creature with the head and torso of a man, but the body and legs of a horse. Centaurs reside in the Forbidden Forest.
Daily Prophet, The: The most respected newspaper in the wizarding world.
Death Eaters: Supporters of Voldemort who believe in a society of pure-blooded wizards only and who employ Dark Arts to achieve that aim.
Defense Against the Dark Arts: A course at Hogwarts school that teaches students to defend themselves against evil creatures and Dark Arts.
Dementors: Guards at Azkaban prison who are also employed to protect Hogwarts in states of emergency. Dementors drain wizards of happiness and hope and thrive in despair. The dreaded Dementor's Kiss will suck out a human's soul, leaving an empty shell.
Forbidden Forest, The: The dark woods that border Hogwarts. Home to centaurs, unicorns and hippogriffs. Off-limits to students without supervision.
Gryffindor House: One of the four houses in Hogwarts. Students in Gryffindor are characterized by bravery, daring, nerve and chivalry.
Hippogriff: A magical creature that is half eagle (head, front legs and arms) and half horse (body, hind legs and tail).
Hogsmeade: A magical, all-wizarding village filled with restaurants and shops. Hogwarts students who are in their third year and above and have received a guardian's permission are allowed to visit.
Hogwarts School of Witchcraft and Wizardry: A seven-year school for young witches and wizards hidden from the Muggle world by the most powerful spells in existence.
Horcrux: An object in which a wizard can hide a piece of his soul in hopes of achieving immortality. Making a Horcrux is the darkest art, as it requires acts of violence and evil in order to succeed. Splitting one's soul in order to create a Horcrux is against wizarding law.
House-elf: A magical creature with bat-like ears and bulging eyes the size of tennis balls. House-elves work as dedicated servants to one master or to wizarding houses at Hogwarts. A house-elf can only be set free when its master gives it a piece of clothing.
Hufflepuff: One of the four houses in Hogwarts. Students in Hufflepuff are characterized by patience, loyalty and fair play.
Harry Potter Character Guide
Books to Read After Harry Potter
Our 9 Favorite Romantic Movie Scenes
3 Little-Known Social Media Hacks You Never Knew Existed
How to Spot an Internet Catfish (and 6 Other Cybersecurity Questions)
5 Twitter Accounts That Make Us Laugh
6 TV Shows to Binge Watch Based on Your Mood


Chuck Baker's Firefox Extension Forum • View topic - Cannot restore extensions with Fx v42?
For the time being, themes can still be restored with FEBE > Restore > Restore Themes., but this may break also.
Re: Cannot restore extensions with Fx v42?
Don't know if this is related but I am also having trouble getting FEBE to work with Tor Browser and the Tails CD. I am using FEBE 8.8.1.
I got in touch with them (the Tails people) and they said to ask you about it. I seems that recent changes made to Tor Browser could be the problem but they would not elaborate.
For windows (XP Pro Sp3) I am using Tor Browser version 5.0.6 (based on Mozilla Firefox 38.5.0). It just hangs forever when trying to do a backup and I cancel the operation.
For Tails I am about to download the new version 1.8.1 and will burn it to a DVD and see if has made any difference, if not I will let you know.
What specific problems are you encountering? Are you getting any FEBE related messages in the error console (CTRL-SHIFT-J, type febe in the 'Filter output' field in the upper right of the console window, copy/paste in your response)?
I don't have a Tail CD, nor the Tor Browser installed, so I cannot test it myself.
What type of backup are you trying to perform (Full profile, selective, both)? It appears that FEBE is failing while trying to "phone home" to Mozilla when getting your installed add-ons information. Try running FEBE Options > Advanced > Attempt to load and save extension data to see if it can complete without errors.
There is also a reference to 'getFirstPartyURI' failing. This is a Tor specific error. You say your Tor browser is based on Fx 38.5.0. Try installing FEBE v8.6 or v8.7 and see if it makes a difference.
It also seems FEBE is balking at attempting to backup your permissions data. Try unselecting FEBE Options > What to backup > Backup permissions.
I am trying Febe with the Tails 1.8.1 DVD, Tor Browser 5.0.6 (based on Mozilla Firefox 38.5.0). Will try your suggestions on XP later and let you know.
cbaker_admin wrote: What type of backup are you trying to perform (Full profile, selective, both)?
cbaker_admin wrote: It appears that FEBE is failing while trying to "phone home" to Mozilla when getting your installed add-ons information. Try running FEBE Options > Advanced > Attempt to load and save extension data to see if it can complete without errors.
Done as you suggested - > FEBE v8.6, Attempt to load and save extension data - "extention data loaded and save successfully".
Any idea on a Debian Linux system where that data would be saved to see if it has worked?
cbaker_admin wrote: It also seems FEBE is balking at attempting to backup your permissions data. Try unselecting FEBE Options > What to backup > Backup permissions.
Same message comes up when I click Perform backup now.
1 problem(s) found ... click "Attempt to set permissions" to fix.
It looks like they have locked FEBE out and prevented it from operating successfully.
plox wrote: Thanks for your prompt reply.
Found it - with Tails you cannot save to any another location than Home > Tor Browser.
So that does not work either.
Interesting. If files can only be written to Home > Tor Browser perhaps you can create a new Fx profile in that location.
Start Fx from the command line with [path_to_Firefox_executable]/firefox.exe -p. This will open the profile manager dialog. Follow the prompts and create a new profile in some sub-directory of Tor Browser.
Install FEBE into the new profile and set the backup destination directory in some other sub-directory of Tor Browser.
If the FEBE Options > Advanced > Attempt to load and save extension data is successfull, the data should be in a file named 'febeExtensionData.json' in your new profile folder.


우리는 중국에서 알칼로이드 5 아카시아 나무 껍질 추출물 제조 업체 및 공급 업체 / 공장 전문화되어 있습니다. 알칼로이드 5 아카시아 나무 껍질 추출물 중 하나 인 Excellent Health Products Co.,Ltd. 중국 유명 브랜드 중 하나 인 저렴한 가격 / 저렴한 가격으로 고품질의 알칼로이드 5 아카시아 나무 껍질 추출물 도매업.
Wholesale 알칼로이드 5 아카시아 나무 껍질 추출물 from China, Need to find cheap 알칼로이드 5 아카시아 나무 껍질 추출물 as low price but leading manufacturers. Just find high-quality brands on 알칼로이드 5 아카시아 나무 껍질 추출물 produce factory, You can also feedback about what you want, start saving and explore our 알칼로이드 5 아카시아 나무 껍질 추출물, We'll reply you in fastest.


UPDATE: I have added a small block of morning sessions on Saturday, May 21. Please use the form below to schedule your session for this date!
The weather is getting warmer, and that means it's almost time for spring minis! These 20-minute sessions will cost $125 for 5 images.
Additional images can be purchased for $15 per image, or a digital copy is included with the purchase of a print of that image via your web gallery). These sessions are for up to five people, with a charge of $25 per person beyond the first five.
I will be holding both a morning block and an evening block of sessions on Saturday, March 19, April 16 and April 30*. If we need to reschedule due to rain, they will be held the next day on a Sunday, or possibly the following weekend.
* Dates are subject to change and may be canceled due to low booking or unforeseen illness or weather.
I am also booking full family, maternity, lifestyle and newborn lifestyle sessions, head shots and seniors, and I have added a milestones package to capture photos of your little one during those quickly passing days in the first two years.
I'm looking forward to this opportunity to see some new and old faces (well, only slightly older than the last time we met 😉 ) and to capture some beautiful photos of your family!
Fill out the form below to book your mini session!


text:
One of The Biggest Upsets of All Time!!!!!
Connor moran
On January 4, 2020 the New England Patriots versed the Titans, which was the final game of Tom Brady era. The Patriots lost 20-13 in the AFC wild-card-round to the Titans. Now here is the run down, neither team scored after halftime...
2019 Ohio State Buckeye vs. Michigan Wolverine Football Game Summary
Arianna Perfetto
On Saturday November 30th, 2019 The Ohio State Buckeyes and Michigan Wolverines met at The Big House in Ann Arbor Michigan for their annual rivalry football game. The game started with Michigan winning the coin toss and choosing...
Is it time for Harbaugh to move on from Michigan?
Michigan Dominates MSU in 44-10 Win
Dakota's Victory Against Chip!!
According DHS studentsss, the Dakota Varsity Football Team won the first playoff game against Chippewa Valley on Friday, November 1, 2019. The score was 34-13, which pretty much shocked everyoneee! They are our rivals and it's...
Dakota Stuns Chip in 34-13 Upset
Random Football Game Photos
MCBA State Championship – 11/2/19 (Photos)
The End of The Football Season :(
Hi everyone, my name is Niayah Taylor and on October 24, 2019, the JV football team veered L'anse Creuse North at Dakota at 7:00 p.m. The score was 20-7. It was freezing outside so the players, cheerleaders, dancers, and the...
Dakota's Cross Country Team: MAC Red Championship
On Thursday October 17th, Dakota's boys and girls cross country teams competed in the MAC Red Championship Meet. The runners did a great job with JV placing in 2nd place and Varsity placing in 4th in their meet. I had the chance t...
Michigan Falls to Penn State 28-21
NCAA College Football Rankings
Alabama (7-0) LSU (7-0) Ohio State (7-0) Clemson (7-0) Oklahoma (7-0) Penn State (7-0) Florida (7-1) Notre Dame (5-1) Auburn (6-1) Georgia (6-1) Oregon (6-1) Utah (6-1) Wisconsin (6-1) Bayl...


McGladrey Wealth Management LLC was recently ranked by Accounting Today as No. 3 on the publication's eighth annual list of Top Billion Dollar Club Firms by Assets Under Management (AUM). Last year, McGladrey Wealth Management was ranked fourth.
While newer issues like staffing, technology and most recently, planning for college debt rise in prominence, older more permanent issues don't go away. Two perennial challenges were particularly relevant this year – the complex tax scene, and the eternal pursuit of non-correlated assets.
Accounting Today received submissions for the 2014 AUM rankings from more than 200 CPA firms with financial planning practices or subsidiaries. The Billion Dollar Club, to which McGladrey Wealth Management belongs, includes 23 members, compared to last year's 18.


text:
package org.apache.clerezza.jaxrs.sparql.providers;

import org.apache.clerezza.BlankNode;
import org.apache.clerezza.IRI;
import org.apache.clerezza.Literal;
import org.apache.clerezza.RDFTerm;
import org.apache.clerezza.sparql.ResultSet;
import org.apache.clerezza.sparql.SolutionMapping;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.List;

/**
 * MessageBodyWriter for ResultSet. Resulting output is tsv and
 * conforms to:
 * http://www.w3.org/TR/2013/REC-sparql11-results-csv-tsv-20130321/#tsv
 *
 * Also see: http://www.iana.org/assignments/media-types/text/tab-separated-values
 *
 * @author misl
 */
@Component(service = Object.class, property = {"javax.ws.rs=true"})
@Produces({"text/tab-separated-values"})
@Provider
public class ResultSetTsvMessageBodyWriter implements MessageBodyWriter<ResultSet> {

    private static final Logger logger = LoggerFactory
            .getLogger(ResultSetTsvMessageBodyWriter.class);

    private String textEncoding = "UTF-8";
    private byte[] separator;

    public ResultSetTsvMessageBodyWriter() {
        try {
            buildSeparatorConformEncoding(textEncoding);
        } catch (UnsupportedEncodingException e) {
            logger.error("Developer error", e);
        }
    }

    // --------------------------------------------------------------------------
    // Implementing MessageBodyWriter
    // --------------------------------------------------------------------------

    @Override
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations,
                               MediaType mediaType) {
        return ResultSet.class.isAssignableFrom(type);
    }

    @Override
    public long getSize(ResultSet t, Class<?> type, Type genericType, Annotation[] annotations,
                        MediaType mediaType) {
        return -1;
    }

    @Override
    public void writeTo(ResultSet resultSet, Class<?> type, Type genericType,
                        Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders,
                        OutputStream entityStream) throws IOException, WebApplicationException {

        // According to spec header is mandatory.
        writeTsvHeader(entityStream, resultSet.getResultVars());
        while (resultSet.hasNext()) {
            writeTsvLine(entityStream, resultSet.getResultVars(), resultSet.next());
        }
    }

    // --------------------------------------------------------------------------
    // Public interface
    // --------------------------------------------------------------------------

    /**
     * Sets the text encoding for the resource. This setting must only used
     * if the resource response represents text.
     *
     * @param textEncoding character encoding of text body
     * @throws UnsupportedEncodingException when the given encoding is not supported.
     */
    public void setTextEncoding(String textEncoding) throws UnsupportedEncodingException {
        buildSeparatorConformEncoding(textEncoding);
        this.textEncoding = textEncoding;
    }

    /**
     * @return text encoding for resource
     */
    protected String getTextEncoding() {
        return textEncoding;
    }

    // --------------------------------------------------------------------------
    // Private methods
    // --------------------------------------------------------------------------

    /**
     * Builds the column separator according to the given text encoding.
     *
     * @param encoding the text encoding to be used.
     * @throws UnsupportedEncodingException when the given encoding is not supported.
     */
    private void buildSeparatorConformEncoding(String encoding) throws UnsupportedEncodingException {
        separator = ",".getBytes(encoding);
    }

    /**
     * Write result set header to the given output stream.
     *
     * @param outputStream stream to write to.
     * @param headers      the headers to write.
     * @throws IOException
     */
    private void writeTsvHeader(OutputStream outputStream, List<String> headers) throws IOException {
        boolean first = true;
        for (String header : headers) {
            if (!first) {
                outputStream.write(separator);
            }
            writeEscaped(outputStream, header);
            first = false;
        }
        outputStream.write("\n".getBytes(textEncoding));
    }

    /**
     * Write a single tsv line using the given line data.
     *
     * @param outputStream stream to write to.
     * @param headers      the headers to write line data for.
     * @param lineData     the line data to write.
     * @throws IOException
     */
    private void writeTsvLine(OutputStream outputStream, List<String> headers,
                              SolutionMapping lineData) throws IOException {
        boolean first = true;
        for (String header : headers) {
            if (!first) {
                outputStream.write(separator);
            }
            RDFTerm resource = lineData.get(header);
            if (resource != null) {
                writeEscaped(outputStream, getResourceValue(resource));
            }
            first = false;
        }
        outputStream.write("\n".getBytes(textEncoding));
    }

    /**
     * Helper to get the proper string representation for the given RDFTerm.
     */
    private String getResourceValue(RDFTerm resource) {
        StringBuilder value = new StringBuilder();
        if (resource instanceof IRI) {
            value.append(resource.toString());
        } else if (resource instanceof Literal) {
            value.append("\"");
            value.append(escapedDQuotes(((Literal) resource).getLexicalForm()));
            value.append("\"");
        } else if (resource instanceof BlankNode) {
            value.append("/");
        } else {
            value.append(resource.toString());
        }
        return value.toString();
    }

    /**
     * Write the given string to the output stream and escape the output where
     * necessary.
     *
     * @param outputStream stream to write to.
     * @param text         the text to write.
     * @throws IOException
     */
    private void writeEscaped(OutputStream outputStream, String text) throws IOException {
        String line = text;
        if (text.contains("\r")) {
            line = text.replaceAll("\r", "\\r");
        }
        if (text.contains("\n")) {
            line = text.replaceAll("\n", "\\n");
        }
        if (text.contains("\t")) {
            line = text.replaceAll("\t", "\\t");
        }
        outputStream.write(line.getBytes(textEncoding));
    }

    private String escapedDQuotes(String text) {
        String line = text;
        if (text.contains("\"")) {
            line = text.replaceAll("\"", "\"\"");
        }
        return line;
    }
}


text:
In a State Divided by More Than the Cascades, Can Oregon's Flagship Public Radio Station Bridge the Gap?
After nearly doubling its newsroom's size in the past five years, Oregon Public Broadcasting is ready to rumble.
By Julia Silverman 3/21/2021 at 12:30am Published in the March 2021 issue of Portland Monthly
On the afternoon of July 16, 2020, just after co-filing a story for Oregon Public Broadcasting about federal law enforcement snatching black-clad protesters off the streets of Portland in the middle of the night and shoving them into unmarked vehicles, reporter Jonathan Levinson—the comparatively rare army vet who sports a nose ring—put away his phone and went to get a haircut.
Emerging freshly shorn, he fished out his phone, only to find it overheating with new messages and notifications. Very much on purpose, Levinson's story had gone live just as then-President Trump's Acting Secretary of Homeland Security, Chad Wolf, arrived for a now-infamous press conference at downtown's federal courthouse, at which he would refer to Portland as a "city under siege." CNN had called. PBS's NewsHour wanted an interview. Ice Cube was tweeting about the story, along with Maggie Haberman, the New York Times' in-house Trump whisperer. And that night, a galvanized Portland took to the streets in numbers not seen since the initial days of the racial justice protests that swept the city in early June, after the murder of George Floyd.
If you live in Portland and follow the news, you probably know what came next: Naked Athena and the yellow-clad Wall of Moms, the deaths of Patriot Prayer member Aaron Danielson and antifa activist Michael Reinoehl, Portland's starring role in GOP campaign footage aimed at alarming white suburbanites, culminating in—this isn't a stretch—the attempted overthrow at the US Capitol on January 6, 2021, by the far right.
OPB reporters Sergio Olmos and Jonathan Levinson on the job, summer 2020.
Image: Courtesy Zane Sparling
But there was another, less-remarked-upon subplot: As racial justice protests and wildfires piled atop the pandemic last year, it was often OPB's reporters, digital producers, and editors sorting out what in the world was happening in Portland, Oregon, for locals and the rest of the world alike.
"[On this story] we were driving the national conversation as it pertained to Portland, and often beating the biggest outlets in the country," says Conrad Wilson, OPB's criminal justice and legal affairs beat reporter, who cowrote the July 16 story with Levinson. "The local knowledge was to our advantage. We had sources that were closer to what was happening and understood what the next story had to be."
This was no accident. OPB had been quietly, strategically, and aggressively filling a vacuum left open by our state's ever-shrinking newspapers. And after a hiring binge that nearly doubled the size of its newsroom over the past five years, a two-years-in-the-making website overhaul that debuted in August 2020, and a $7.2 million HQ renovation, the station is hitting its stride.
"They are now the statewide voice for news," says Brent Walth, who won a Pulitzer with the Oregonian and was an editor at Willamette Week, and who now teaches journalism at the University of Oregon. "They've made strategic decisions and put certain people in places that have worked out."
So, how did they pull it off—and, in an ever-fracturing media landscape, can they keep it up?
Studio space in the station's renovated building.
Image: Courtesy OPB
Pre-Great Recession, the state's flagship National Public Radio affiliate's newsroom was sleepier, less likely to break news and more likely to place it into thoughtful, dulcet-toned context on the radio the next day. Lower-metabolism television programming, like Oregon Art Beat and the outdoorsy Oregon Field Guide, was front and center. The news staff had four or five Portland-based, talented-but-overstretched reporters, whose focus by virtue of necessity had to be on daily radio spots. The web was an afterthought.
The station was beloved but not feared. Faithful listeners could be spotted filling their OPB pledge drive–issued tote bags up with vegetables at local farmers markets, and drive-time commuters tuned in for the National Public Radio–provided programming.
Meanwhile, in the mid-2000s, social media, which steers so much traffic for news organizations today, was still in its infancy, and streaming/on-demand radio was more cumbersome to access than it is now. Newspapers were battered by shrinking circulations as more people turned to digital news, as well as a loss of revenue from classified advertising that migrated to Craigslist and elsewhere online.
Oregon's media landscape shifted accordingly, as locally owned newspapers were sold to private equity firms and giant media chains. At its height, the state's largest newspaper, the Oregonian, employed about 400 journalists, including multiple reporters assigned to suburban bureaus and correspondencies around the state, as far-flung as La Grande, Grants Pass, and at the Oregon Coast. Today, after a series of painful layoffs, there are about 65 reporters and editors, though the paper features notable investigative work and has led the pack locally in watchdog coronavirus coverage.
They will tell you during their drives that some small percentage of listeners donate. Well, you bring that up by a point or two, and the money starts to flow.
—Brent Walth
For Morgan Holm, OPB's chief content officer, all the change and media market contraction opened a door for experimentation.
"We started to shift the direction away from being a pipeline for NPR and PBS, a distribution platform for other people's programming, and to being a local journalism organization," he says. The station scrapped its daily half-hour Oregon Considered show, which had walled off local reporting and required reporters to file incremental daily stories to fill the airtime, and began embedding its local reporting inside juggernauts Morning Edition and All Things Considered instead, simultaneously relieving some pressure on its reporters and giving their work greater prominence.
That opened some space, along with well-timed grant funding, for the 2008 launch of Think Out Loud, the noontime interview show that serves as an Oregon-centric version of Fresh Air, with longtime host Dave Miller standing in for Terry Gross. Next, the news staff tried its hand at some in-depth reporting, including 2010's Peabody-winning "Hard Times," which chronicled the recession through the eyes of Oregonians.
But one-off special projects don't make a newsroom. In 2015, Anna Griffin, now the station's news director, was nearing the end of an 11-year tenure as a reporter and columnist for the Oregonian. OPB's hiring committee wanted someone to "help build a newsroom—how many opportunities in your career do you get to build something, especially when that career is journalism?" Griffin says. She took the job a handful of months before a group of far-right vigilantes, armed to the teeth, took over a national wildlife refuge in remote Harney County to make a last stand over grazing rights.
This was a major turning point. The station threw everything it had at the story, offering wall-to-wall coverage and eventually teaming up with Longreads and freelance writer Leah Sottile to produce Bundyville, a wildly popular podcast that told the tale of the terrifyingly charismatic family at the center of the Malheur uprisings.
Also in 2015, the station launched a $15 million capital campaign that winds down this month, with the goal of raising a targeted $3 million for an impact journalism fund to seed new reporters—a number of whom, like Levinson, arrive in grant-funded positions, prove their mettle to their bosses and to donors, and wind up as permanent employees. OPB CEO Steve Bass says he expects "significantly more than $3 million" in the journalism fund as the campaign concludes.
The station also raised money for a renovation of its headquarters on S Macadam Avenue. Out went the underused "huge barn" of a TV studio, says Bass, and in came seven sleek new audio studios, more space for video editing, and an expanded news area.
Armed with a bigger reporting staff, Holm and Griffin have ferreted out undercovered topics that resonate with a statewide audience, investing in state government coverage and building out an already-admired science and environmental team.
Crystal Ligori
Most recently the station has expanded its education coverage, and now has Oregon's only full-time reporter dedicated to education policy, Liz Miller, and the state's only full-time higher education/workforce development correspondent, Meerah Powell.
OPB has also hunted for reporting talent beyond the radio, nowhere more evident than on its state government team. Bringing on Jeff Mapes—the longtime dean of the state's political press corps, formerly of the Oregonian—in early 2016 was a power move. In 2017, Lauren Dake, formerly of the Columbian in Vancouver, was hired and has been leading coverage of the state's flawed foster care system and sexual harassment at the Capitol; Dirk VanderHart moved over from the Portland Mercury a few months later.
From his perch at the University of Oregon's journalism school, Walth says it was obvious a few years ago the station was routinely adding reporters, because his students frequently told him they planned to apply for posted jobs.
Coverage gaps remain: Bass says the station needs more investigative reporters, coverage of the fast-growing suburbs around Portland is spotty, and no one is currently bird-dogging the pivotal housing/houselessness beat. More hiring is ahead, including a soon-to-be-announced arts editor and a rural affairs reporter who will be based outside of Portland, joining correspondents in Bend and Medford, as well as Vancouver, Washington.
Altogether, staffing now stands at 37 journalists across the news, arts, digital and science desks, a gain of 18 staffers since 2015.
All this change doesn't come cheap, even with a loyal base of donors. In fall 2020, the station unveiled a newly designed website showcasing statewide news—a clear business opportunity, given that the competition is OregonLive.com, a site even the paper's most ardent fans struggle to love. For years, Holm says, opb.org had been powered by an internally built and maintained system, but it was clunky, prone to lagging as clicks increased, and couldn't fully support the video, graphics, and photojournalism the station wanted to showcase.
Meanwhile, though the station didn't furlough any journalists or cut their salaries during the pandemic, listenership fell off when drive-time commuters started working from home. But according to Nielsen ratings the station continues to vie with adult contemporary mainstay KKCW-FM for the top spot in the market, surging ahead during news-heavy months like November 2020, before falling into second place over the holidays. Still, since last March, underwriting, particularly from arts organizations, has dried up considerably, Bass says. And on-air pledge drives, long a mainstay, are anachronistic in the streaming age.
Instead, more and more, the station counts on its most hard-core sustaining members and their "set it and forget it" monthly donations, but there's increasing competition out there for that audience-supported model, with both Willamette Week and the Portland Mercury ramping up direct donor programs in 2020. (One quietly rising financial bulwark for the station, Holm says, has been PBS's decision to make its full back catalog available to donors only; never underestimate the number of people who will pay for complete seasons of Masterpiece.) Because this is public broadcasting, there will never be a paywall for digital news coverage, a potentially potent source of revenue that's firmly off the table.
Dave Miller (right) with Mitchell S. Jackson
Like virtually all US newsrooms, OPB's efforts to diversify its staff are a work in progress (though, truth be told, it is doing better than other metro-area print newsrooms, including Portland Monthly's). Upper management is almost entirely white: Lynne Clendenin, the longtime vice president of programming at the station, who is Black and has mentored many young journalists, will retire this month, leaving chief development officer Cheryl Ikemiya as the sole person of color in leadership.
Monica Samayoa, who arrived from San Francisco in 2019 to join the science and environmental desk, says as the only Latina on her team, she has tasked herself with reporting on traditionally undercovered voices, and persuading those communities to trust her intentions (and the station's)—a careful, painstaking process. Her work spans everything from how inhospitable hiking trails can feel to Black Oregonians to the frantic efforts to translate early warnings about COVID-19 into Spanish to reach thousands of at-risk migrant farmworkers around the state.
"OPB hasn't always done a great job before in covering these communities and building relationships and trust," Samayoa says. "That's something that [we are] working on changing. I also don't want these communities to feel that we are ignoring them. This pressure should not just be on BIPOC staff, but sometimes it falls on us to keep pushing for it."
Education policy reporter Miller says another issue is keeping those journalists on staff once they have arrived.
"OPB has been great at bringing people in," Miller says. "But that retention has been super frustrating to watch. I have watched several colleagues, specifically women of color, leave OPB since I got here."
Those ranks include Erica Morrison, who left for a job at Politico, and Molly Solomon and Erika Cruz Guevarra, who were both poached by KQED in San Francisco. Morrison, whose beat was race, equity, and demographics—subjects that inarguably touch every reporter's coverage area—has not been replaced.
Instead, Griffin says, there are ongoing conversations about "whether this beat represents the right approach." This summer, journalists of color on the staff banded together to write a letter to OPB managers on the disparate treatment of temporary employees, lack of advancement opportunities for staffers of color, and the need for more transparency in salaries and hiring.
White colleagues were asked to sign on, in solidarity, and many did so, says Miller, who was among the organizers of the effort.
"There is a really great group of POC employees at OPB—it's a 'safety-in-numbers' thing," she says. "It feels like we are bonding together and working to create change, in a way that I have not seen and been a part of in a workplace, despite all of the work and the mess that still has to be taken care of. OPB is great at bringing in people. I am really happy to be here. But at the same time, you have to create a place where people want to stay, feel supported, have a place to move."
Griffin says these complaints have inspired concrete changes, including an in-the-works hiring of a new editor to provide more support, particularly to reporters of color; a new, one-year fellowship for an emerging journalist of color, including mentoring check-ins with reporters at other public media outlets; quarterly town hall meetings for the news department for the public airing of concerns; and the hiring of an outside consultant to do a comprehensive salary survey. Additionally, all supervisors are enrolled in a mandatory six-month training program on equity and inclusion.
This self-reckoning, especially paired with the station's increasing reach, spills into its news coverage, too. Public media is often popularly cast as a house organ of progressivism, regarded with suspicion by conservatives. (Consider former president Donald Trump's repeated attempts to defund NPR and PBS.) Local reporters say they double down on neutrality as a result, particularly in today's political climate—state government reporter VanderHart says "we are obviously not here to be the friends of Democrats or Republicans or whoever."
OPB hasn't always done a great job before in covering these communities and building relationships and trust.
—Monica Samayoa, science reporter
When Levinson, along with temporary employee Sergio Olmos (whose dogged, matter-of-fact protest coverage has earned him the largest Twitter following of any employee, by tens of thousands) teamed up in late November for a story about the fault line emerging between racial justice and antiestablishment protest leaders in Portland, particularly as the latter group's tactics increasingly included property destruction, their work drew pushback from activists who accused the reporters of failing to understand the fury of a generation that feels there's not much left in society that's worth preserving. (For his part, Levinson says, "a lot of the Black activists that we continue to keep in touch with agree that the nightly vandalism is not helping.")
That push-pull surfaced again with the duo's coverage of the Red House on Mississippi, a home owned by an Afro-Indigenous family who faced eviction after failing to pay their mortgage; activists set up an encampment around the home to protest the eviction, eventually raising over $300,000 for the family. Digging deeper, Levinson and Olmos reported that the family owned a second home not far away. After feedback from listeners, Levinson made an appearance on Think Out Loud to flesh out the context and, ultimately, the station published an after-the-fact editor's note, which read, in part, "The story itself should have included more detail about the long history of racist policies in Portland and its real estate industry."
This was a forthright and unusual correction—OPB was correcting their framing, not their facts. Samayoa says it was written after the newsrooms' diversity, equity, and inclusion committee reviewed all the feedback from readers and listeners, agreed with the concerns, and brought that perspective to managers, who listened.
"What separates good journalism from great journalism today is usually framing and context," Griffin says. "We're trying, as part of our work to become a news organization that truly serves all of Oregon and Southwest Washington, to make sure we remind the audience of the racist history of this region whenever it is relevant to a story."
Ultimately, the Red House editors' note—like the unmarked vans story—is emblematic of a newsroom flexing new muscles but also still finding its way.
"OPB was always a solid news organization, but 20 years ago, it had a feeling of, like, there are four or five of them there, and they are doing their best to get wherever they can get. That has changed," Walth says. "There is now an expectation that if something important is happening, OPB is going to be there ... with some greater degree of depth than they would have had 20 years ago. The question for all the news organizations, is there enough depth, enough time to go beyond the events of the day, to really begin to understand the story behind the story?"
News, Media, Features
Oregon's Home-Grown Comfort Food Is Tater Tots. Change Our Minds. (You Can't.)
These Salmon-Sesame Dumplings Prove that Dumplings = Love
Mama Dút Foods Plans a Second Location in the Alberta Neighborhood
Top Takeout
Stuck in a Takeout Rut? We've Got Some Suggestions
03/22/2021 By Katherine Chew Hamilton and Karen Brooks
Level Up Your Picnic or Campground Cookout with an Asian Hot Pot Meal
03/19/2021 By Katrina Yentch
Life's Better with Cake. Here's One for Every Day of the Week.
The New Guard in Portland Music
12:30am By Conner Reed
03/22/2021 By Eden Dawn Illustrations by Sarah Donofrio
3 New Portland Books that Just Look Good
Pomo Picks
Pop Culture Worth Your Time: RoboCop, Nomadland, and More
03/18/2021 By Portland Monthly Staff
A Timeline of Vaporwave's Vektroid-Fueled Intersection with Portland
03/18/2021 By Suzette Smith
11 Shows with Portland Connections You Can Stream Right Now
03/17/2021 By Conner Reed
Eternal Optimist Jesce Horton Talks Cannabis in the New Decade
03/22/2021 By Jenni Moore
03/21/2021 By Julia Silverman
Big Changes Could Be Coming for Cannabis in Oregon
03/21/2021 By Sam Pape
LISTEN: The Portland Rose Festival and the Future of Large-Crowd Events in Oregon
NogginFest Looks Different this Year, but the 'Spirit of the Event' Hasn't Changed
In Oregon, Spring Break Is ... On?
03/20/2021 By Margaret Seiler
The Gorge's Polar Opposite Offers Ancient Old-Growth Forest and Blessed Solitude
Need a Quiet Office? You Can Rent a Daytime-Only Hotel Room
Pandemic Travel: An Essential Worker in Alaska
03/15/2021 By MacKensie Cornelius
What's Blooming? Springtime Plants Are Popping Up in Portland
5 Black-Owned Cannabis Businesses to Support
12:30am By Jenni Moore
8 Cannabis Products We Love from Local Black-Owned Businesses
From Digital Design, to Handmade Hairpins, to Modeling, Margaret Alba Can Do It All
03/18/2021 Edited by Lola Oyibo
Fashion Event
Here's Your Chance to See 22-Foot Tall Drag Queens
Orox Leather's Storefront Smashed and $26,000 of Product Stolen
So You've Been Fully Vaccinated in Oregon! Now What?
7 Amazing To-Go Cocktails from Portland Bars
02/19/2021 By Katherine Chew Hamilton, Gabriel Granillo, Aurora Biggers, Conner Reed, and Fiona McCann
Hot Cocoa Recipe Ideas from the Rambler, Xico, and Our Own Cupboard
11/27/2020 By Ainslee Dicken
You Can Buy a Beloved Portland Bar
Drag in the Pandemic Era
A New Drag Brunch Is Coming to the Historic Darcelle XV
Sing King
Why Did Mobile Karaoke King Baby Ketten Put Down Roots?
How the Lombard House Became an Instant St. Johns Institution
Try Planting These Spring Pretties to Give Your Garden a Boost
03/20/2021 By Marisa Kula Mercer
A Traditional West Hills Ranch Shows Its Wild Side
In a Year that Decimated Small Businesses, This Family-Owned Portland Nursery Hit a Sales High
03/10/2021 By Elizabeth Dye
Where to Live Now
Neighborhood Guide: Ashcreek, Crestwood, and Maplewood
Neighborhood Guide: Multnomah Village, Hillsdale, and Burlingame


Nuhertz Technologies' Worldwide University Software Program is designed to give qualified universities easily affordable access to exceptional software technology products. Nuhertz invites you to join the existing university licensees, using our products for classroom education projects around the world. (Up to 32 floating licenses may be used by qualified institutions).
The Nuhertz University Program is available, for academic use only, to any degree-granting, accredited college or university within the scope of US export law. If you are interested in becoming part of the Nuhertz University Software Program please contact Nuhertz through the standard contact form.


Plumber Walthamstow relies on its skilled plumbers to get the job done at the high standards our customers expect. Thiago Sampaio is part of the team that makes the magic happen and skilled plumbing engineer with a keen eye for detail. He can diagnose any problem and recommend the right solution. He works on installations and servicing jobs. Therefore can respond in the right way to any situation or problem.
We welcomed Thiago to the Plumber Walthamstow family several years ago. Consequently, his expert abilities influenced in growing the business to where it is today. He is qualified in general plumbing work and specialised engineering. As a result he began work with a series of leading plumbing chains and picked up a host of workplace skills. However, he recognised there was a growing gap in the market for local plumbers in East London. Due to that reason he joined the Plumber Walthamstow team.
Together we provide one of the most affordable and reliable plumbing services in London. Thiago has a fantastic reputation with our clients. He is always helpful and friendly in offering services. We are proud of the high quality service we deliver. Having the right people on the team is a big part of that! When Jose turns up to fix your problem, you know you are in safe hands. Thiago is also covered by our comprehensive liability insurance with his many plumbing qualifications. He completed every job to the highest standards.
Are you looking for a reliable local plumber in Walthamstow? Do you need a professional who can offer a better quote and a faster service? When you choose Plumber Walthamstow, you get the full package. We never compromise on quality or on price. For an extensive range of plumbing services across the Walthamstow area, call Plumber Walthamstow today and arrange your appointment.