text:
Even global tech darling DJI is not immune to culture of corruption
|In With Chinese Characteristics, Views
|By Elliott Zaagman
(Image credit: BigStock/Nik_Sorokin)
Last Friday, DJI, the world's largest drone maker, announced the uncovering of an internal corruption scandal, leading the Shenzhen-based company to place 45 of its employees under investigation.
According to a statement from the company, DJI could see a loss of as much as RMB 1 billion (roughly $150 million) as a result of its corruption issues.
DJI's investigation reportedly found that procurement officials had received kickbacks in exchange for accepting substandard components, or for paying above-market prices. As a result of such practices, the company's component costs were supposedly inflated by over 20% in 2018.
"DJI condemns any form of corruption strongly and has set up a high-level anti-corruption task force to investigate further and strengthen anti-corruption measures," the statement read.
The announcement of a corruption crackdown at such a company is not particularly unusual. What's significant, however, is the scale of the corruption, and that it occurred at DJI, which for long has been a poster child for Chinese tech's internationalization. In fact, corruption-related cleanouts have been a defining theme throughout China over the past five to six years, and have been particularly notable in the country's tech community lately.
Ride-hailing giant Didi Chuxing recently dismissed a total of 83 people, after finding over 60 cases of corruption within the last year. Bytedance, the world's most valuable startup, saw a second executive detained last month over charges of receiving bribes of luxury cars and several million RMB from a business partner.
Also in December, Alibaba Group announced that Yang Weidong, the president of video-streaming platform Youku and the head of its wider digital media and entertainment, was being investigated by police for "alleged acceptance of improper payments."
Paying the toll
In China, issues of bribery and corruption have long been par for the course. Earlier on in my career, I saw this firsthand while working on a business-to-business sales team in Beijing. As a subsidiary of an established multinational corporation, controls over corrupt practices were quite tight. This put the team at an obvious disadvantage in competition with other players who could apply internal rules more loosely in pursuit of business.
For many of our salespeople, a core component to winning business hinged on finding "creative" ways to circumvent the company's anti-corruption policy—to bend the rules without technically breaking them.
The norms of vendor corruption and kickbacks were once described to me by a former colleague as we were driving on a toll road expressway to meet a client. "In Chinese companies, everyone you work with is like a gatekeeper at a toll booth. They won't let you pass until you pay them," she explained. "What makes it difficult is they all want different things, and no one will say what they want directly. Some want money, some want women, and some want a favor or two. It's our job to find out what that is."
Relationship building and reciprocity are components of most business dealings around the world. But when the business relationship is defined almost entirely by what you can provide a decision maker on a personal level, rather than the product or service you can offer the company, it begins to feel that the incentive system is not working quite right.
This culture of gatekeeping and corruption was a trademark of many of the most robust years of China's economic boom. For many multinationals doing business in China at that time, when local offices and teams would request greater "autonomy" and "localization," a key subtext of the request was a desire for a more "liberal interpretation" of the firm's anti-bribery and corruption protocol, or to establish some form of mechanism where global-level management had some form of plausible deniability, or could simply "look the other way."
However, the argument could be made that at that stage of China's development, corruption was a benign, perhaps even beneficial phenomenon. Economist and senior fellow for the Carnegie Asia Program Yukon Huang has argued that, in many cases, corruption has been a boon to China's growth, rather than a hindrance.
After all, if every time a local government official approved a construction project, or a factory manager contracted a vendor, they would get an opportunity to line their pockets, then self-interest would lead them to get as many deals done as possible, right? In other words, the prevalence of corruption created an incentive for economic activity.
New era, new priorities
Attitudes towards the acceptability of such practices have shifted dramatically in recent years. Chinese President Xi Jinping's anti-corruption drive, launched in 2013, has only intensified, proving to be not simply a temporary crackdown, but an assumed status quo in today's China.
While the campaign began by targeting party officials, it has spread throughout Chinese society and its economy. In the recent spate of arrests and crackdowns, we are seeing that it has spread to China's tech sector as well.
The full effect of the anti-corruption campaign in China tech has yet to be seen. While corruption may have served a purpose for China's earlier development goals, it is unlikely to help much in achieving China's current ambitions, as corruption may help in getting deals done, but incentivizes actors to prioritize self-enrichment in each deal, de-emphasizing quality, or the adherence to strict process. These incentives may aid in getting things done, but are less likely to help them get done well.
This is abundantly clear in the case of DJI, which has become the world's leading drone-maker in part because of its reputation for quality, a symbol of China's transformation from low-end manufacturer to high-end technological superpower. If DJI becomes known for employees who purchase substandard products in exchange for kickbacks, the company's brand will begin to look substandard as well.
Still, with every coin, there are two sides. Corruption controls may maintain higher quality standards, but if not done well, they may strangle the very industries they are seeking to improve.
New breed of Israeli innovators seeks growth, value in China
Beijing promises to let Hong Kong tap mainland data and research funding
As patenting grows, an era of big IP lawsuits is coming for Chinese startups
Discussing Huawei in a Chinese coffee shop


text:
Aimé Bazin (2. Juli 1904 in Paris, Frankreich – 5. Oktober 1984 in Frankreich) war ein französischer Filmarchitekt.

Leben
Bazin studierte an der École des Beaux-Arts in Paris, bevor er als Designer, Ausstatter und Filmarchitekt zu arbeiten begann. Bereits 1956 endete seine Karriere beim Film.

Filmografie (Auswahl)
 1933: La robe rouge
 1935: Deuxième bureau
 1935: Schuld und Sühne (Crime et châtiment)
 1937: La bataille silencieuse
 1938: Les filles du Rhône
 1939: Fort Dolorès
 1939: Vous seule que j'aime
 1943: L'auberge de l'abîme
 1946: Impasse
 1946: L'assassin n'est pas coupable
 1946: Le cabaret du grand large
 1947: La colère des dieux
 1947: Ploum, ploum, tra-la-la
 1950: L'atomique Monsieur Placido
 1950: Le 84 prend des vacances
 1950: Opiumhölle Shanghai
 1951: Le chéri de sa concierge
 1951: Moumou
 1953: Des quintuplés au pensionnat
 1953: Opération Magali
 1954: La rafle est pour ce soir
 1954: Piédalu député
 1955: Boulevard du crime
 1956: Soupçons
 1956: Zaza

Literatur
 Kay Weniger: Das große Personenlexikon des Films. Die Schauspieler, Regisseure, Kameraleute, Produzenten, Komponisten, Drehbuchautoren, Filmarchitekten, Ausstatter, Kostümbildner, Cutter, Tontechniker, Maskenbildner und Special Effects Designer des 20. Jahrhunderts. Band 1: A – C. Erik Aaes – Jack Carson. Schwarzkopf & Schwarzkopf, Berlin 2001, ISBN 3-89602-340-3, S. 286.

Weblinks

 Aimé Bazin bei unifrance.org (französisch)

Szenenbildner
Franzose
Geboren 1904
Gestorben 1984
Mann

redpajama_set_name: RedPajamaWikipedia


Synonym with luxury, elegance and subtlety, the exceptional brand, Lanvin, is back to the limelight offering precious and cheerful products to highlight men.
The current artistic director of the oldest French fashion house founded in 1889 by Jeanne Lanvin, Alber Elbaz continues its creator work thanks to a simple formula: "update the genuine Lanvin spirit". Synonym with luxury, elegance and subtlety, the exceptional brand, Lanvin, is back to the limelight offering precious and cheerful products to highlight men.


text:
Europe's Divided Expectations on US Election
Latest Stories World
By Editor November 3, 2016
Polls suggest that if European nations were voting in the U.S. election, Hillary Clinton would win in a landslide. Governments across the region are paying close attention and assessing how they will work with the next administration, including one that would be led by Donald Trump.
The Republican candidate has found sympathy among a significant segment of Europe's population, both in migrant-wary Eastern Europe and in Western Europe, where anti-immigrant, anti-EU advocates in Germany, France and Britain are hoping a Trump victory will bolster their causes.
Establishment for Clinton
But it is the concerns about the new American leadership's willingness to remain engaged with Europe that is tipping the scales in favor of Clinton, in the eyes of the European establishment.
"I admire her strategic thinking and her strong commitment to the trans-Atlantic partnership," German Chancellor Angela Merkel told the newspaper Bild am Sonntag earlier this year.
Merkel's opinion reflects that of many Europeans who see Clinton as sharing priorities that are trademarks of European classical liberalism: a commitment to free trade, a strong NATO, state-funded health care, and opposition to Brexit and other movements that threaten the integrity of the EU and its vision of a region without borders.
"Together, we are facing the challenge to give the name to a new era together," said Italian Prime Minister Matteo Renzi during an October visit to the White House. "My personal opinion is that the name of future has to be freedom. The name of the future has to be education not intolerance, sustainability not distraction, trust not hate, bridge[s] not walls," an apparent reference to Trump's campaign promise to build a wall on the southern U.S. border with Mexico.
Trump has support, too
Trump's stance on the explosive issues of immigration and jobs brings him few friends among Europe's leadership, but it endears him to followers of grassroots movements across the continent who see their nations as losing their sovereignty and their livelihood under what some perceive as a European super state.
The same bloc of voters shares Trump's position against free trade, one of the key areas of concern for European leaders following the failure this year of the Transatlantic Trade and Investment Partnership.
A Trump victory would bolster populists on the continent who are keying into the grievances of those who see themselves as not benefiting from the economic growth that was promised to them from trade liberalization, and who blame immigrants and foreign nations.
"If you are an electorate or a voter, you can say it's a failure of domestic competition in countries like China. You can say trade liberalization is bad and capitalism is bad," said Shanker Singham, director of economic policy and prosperity studies at the Legatum Institute in London.
"That's what you're seeing in the U.S. and you saw it a little bit with the Brexit vote, part of [the mentality] was just throw these people out because my wage levels are stagnating. We need to just eliminate the people who caused this to happen,'" Singham said.
Among those in Europe expecting to benefit from a Trump victory is Nigel Farage and his UK Independence Party, which opposes continued immigration. Farage has campaigned on behalf of Trump in the U.S. Hillary Clinton, Farage said recently, "is part of a big business establishment. Simply, people want change."
Trump's stance on immigration and terrorism also resonates among some like Hungary's Viktor Orban, who sees the Republican contender as better for Europe.
The Hungarian leader, an EU critic who built a razor-wire fence to keep out migrants, has praised the Republican's anti-terrorism proposals that include a temporary ban on Muslims from entering the U.S. Speaking of Trump's overall plans to stop terrorism, he said, "I myself could not have drawn up better what Europe needs."
US election affects Europe
Leaders and analysts see Tuesday as a crucial day that will determine what direction the West will take.
"The liberal order is fragile," said Dana Allin, a political analyst at London's International Institute for Strategic Studies. With Britain voting to leave the European Union, a Trump victory in the United States and the rise of Marine Le Pen in France, "the Western order could all of a sudden look very different," he said.
French President Francois Hollande, a socialist, agrees the American election will change history.
"It could lead to a very strong turn to the right in the world, or to a correction," Hollande said in August.
The movement of anti-immigrant crusader Le Pen gained strength after last summer's wave of terrorist attacks in France, and Hollande expects the U.S. vote will directly influence the outcome in his country's elections next year.
"The American campaign shows issues that will be reflected in the French campaign. If the Americans choose Trump, that will have consequences, because an American election is a world election," Hollande said.
Credit : Voice of America (VOA) | Photo Credit: AP
Obama: 'Republic is at Risk' if Trump Wins Presidency
US Condemns Israel's Move to Build 181 Homes in East Jerusalem
Leopard injures three, beaten to death in Jalpaiguri
Editor January 8, 2014
To Hall of Famers, baseball has transformed at dizzying pace
Protesters of Castile shooting largely cleared from freeway

redpajama_set_name: RedPajamaCommonCrawl


Travis Scott keeps making noise on TV. Weeks after he took "Sicko Mode" to Saturday Night Live, the Astroworld rapper went to Ellen and let her get in on the act as well. There was no Drake for this TV performance but when it came time for the 6 God's verse, Travis was happy to jump in.
It's been a pretty big week for Travis. Not only did he launch his Astroworld: Wish You Were Here tour but also the Mo. City rapper is gearing up for the massive Astroworld Festival happening at NRG Park this Saturday. Keep it locked to the Box for your chance to win tickets to the show.


I work for Digital Equipment Corp., as a senior communications consultant in Corporate Employee Communications. But this article was not written for work and does not relate to my experience in work.
The attached article is 3450 words — far longer than your maximum. But I believe it will help you accomplish your stated goals.
The attached article shows my individual perspective on the value of the Internet. It does not involve any organization or project.
This was translated into Russian and published in the Oct. issue of ReNews, an electronic computer magazine put out by RELCOM in Moscow. I'm still trying to get it published in the U.S.
Today, many people at universities and high tech companies work and play in a vast interconnected electronic environment. As a writer, I am fascinated not by the whiz-bang technology that makes this possible, but rather by what people do with it and the kinds of relationships people build with one another as a result.
Soon these resources should become available to the general public. The vast, government-subsidized network — Internet — is going to be privatized and eventually opened to individual consumers. Already, some people are investing in expensive alternatives that provide some of the same kinds of services. Perhaps a few anecdotes, based on my experience on the Internet, can help show how these new capabilities can be useful and fun, and what this change in human relations might lead to.
The electronic environment today is very much like the frontier a hundred years ago. People naturally share with one another and go out of their way to help strangers, with no expectation of payment or reward.
On the Internet, one of the forms this sharing takes is through "newsgroups." Like notes files, newsgroup software makes it possible for individuals with common interests to post their messages to a group rather than an individual. This group correspondence builds and maintains a sense of community among people who happen to be geographically scattered. Newsgroups are also useful for scanning the latest news about subjects of concern to you and immediately following up on opportunities that surface. In addition, they serve as an important resource when you have an obscure question and need an answer quickly.
My daughter, Heather, needed to write a paper for school about a woman mathematician. She had no names to start with, and librarians were stumped by the request. I posted the question in the newsgroup sci.math; and within two days, I received replies from 60 individuals from around the world. Many of the people who answered were in universities; some were professors. They provided the names of over two dozen prominent women mathematicians, brief bios of many of them, and very complete bibliographic references.
The daughter of a friend at work had to get a recipe from Nepal, as a school assignment. I posted the question in soc.culture.nepal. (Yes, the Nepalese have their own newsgroup). Within a day, I received a recipe from a Napalese student at the University of Western Australia, and the phone number of a student from Nepal who was attending MIT.
A friend of my wife's works for the U.S. office of a Norwegian fish company. They were finding that sales of salmon to restaurants in the Boston area were hampered by the fact that the fish had not gone through kosher inspection at the point of origin. She wanted to locate a conservative Orthodox rabbi who could perform such inspections in Norway. I posted to soc.culture.jewish and also to a Digital Notes File called BAGELS and within a day I had the name and number of two individuals who could do the job. One works out of New York and flies around the world; the other, who lives in Norway, now does the inspections for them.
But the real source of my enthusiasm is far more impractical. I like to look up at the shelf above my personal computer and know that in those floppy disks I have Alice in Wonderland, Peter Pan, Aesop's Fables, The Heart of Darkness, The Federalist Papers, The Declaration of Independence and The Constitution. Somehow, irrationally, I sleep better at night knowing that electronic copies of works like these are scattered throughout the world, and that they can be sent in seconds to thousands of new destinations. It gives me a sense of comfort to think that as long as there are free and open international computer networks, book burning is a futile exercise.
Richard Seltzer is an employee communications consultant for Digital Equipment. Before that, he was editor of such technical trade magazines as Electronics Test. A graduate of Yale ('69), he has an MA in comparative literature (Russian, French, and German) from the U. of Mass. His historical novel, The Name of Hero (set in Russia, Ethiopia, and Manchuria in 1900) was published by Tarcher/Houghton Mifflin. He successfully self-published a satirical fable The Lizard of Oz and a collection of children's stories Now and Then and Other Tales from Ome. He recently finished a screenplay, Spit and Polish, which deals with reservists during the Vietnam War, and a contemporary novel, Sandcastles. He lives in Boston with his wife and four extraordinary children.


What a week it has been in the wine blogosphere.
A potential wine legal development – namely, House Resolution 5034 – has achieved what recently has seemed totally impossible: bi-partisan support in Congress.
HR 5034 has pretty much gone viral on the internet.
Both are worthy of attention, of course, but let's concentrate on #2. There's a lot of spin going on on multiple fronts regarding HR 5034, and there seem to be two camps developing: the "this bill will destabilize the atom when it comes to direct shipping of wine and will end all freedoms that consumers have in terms of getting wine shipped to their door" camp, and the "this bill hardly makes any changes to the law so what's the big deal" camp.
I'm going to attempt to simplify the debate and also explain why the debate doesn't matter and why you should write your congresspersons to tell them not to support the resolution.
Depending on with whom you talk, this change will either cause a domino effect of wholesaler and distributor monopolies challenging states that allow direct shipping – and therefore result in severing limiting YOUR ability to have wine shipped to your door – or, it's a superfluous change because it's text is minor and there's little change of enforcement anyway.
So… if the Resolution is potentially negative for consumers it's not a good idea to pass it, right? And if it's superfluous, then it's not a good idea to pass it because we've got enough superfluous laws on the book already and adding more would simply make the laws more confusing, right?
So… logically… we should just tell our congresspersons to shoot this one down, right? The way I see it, no matter how you look at it, HR 5034 is crap and needs to die, even if it succeeded in achieving the impossible (Republican and Democratic congress members working together).
So… go write those congress members, already!


The Reyland Track front brake conversion features the newly released 4-piston AP Racing CP8530 calipers, Reyland precision ground two-piece discs, Reyland billet alloy cnc machined mounting brackets and bells. The kit is supplied with all required parts including discs, pads, bolts, brackets, braided brake hoses and unions.
The Reyland Track front brake conversion features the newly released 6-piston AP Racing CP9040 calipers, Reyland precision ground two-piece discs, Reyland billet alloy cnc machined mounting brackets and bells. The kit is supplied with all required parts including discs, pads, bolts, brackets, braided brake hoses and unions.
Disc sizes available: 356, 362 & 378mm.
Optional floating disc to bell fixing £150 per kit.
The Reyland Pro front brake conversion features 6-piston AP Racing CP8522 calipers, two-piece 380x34mm discs, Reyland billet alloy mounting brackets and floating bells. The kit is supplied with all required parts including discs, pads, bolts, brackets, braided brake hoses and unions.
The Reyland Sport 335 rear brake conversion features alloy bodied calipers, two-piece 335x26mm vented rotors, Reyland billet alloy cnc machined mounting brackets and bells. The kit is supplied with all required parts including discs, pads, AP racing disc to bell bolts, brackets, braided brake hoses and unions. This kit is fully MOT compliant as the calipers have cable operated handbrake mechanism built in that simply hooks up to your existing handbrake cables. Other disc sizes available, just ask.
The Reyland Sport 355 rear brake conversion features alloy bodied calipers, two-piece 355x26mm vented rotors, Reyland billet alloy cnc machined mounting brackets and bells. The kit is supplied with all required parts including discs, pads, AP racing disc to bell bolts, brackets, braided brake hoses and unions. This kit is fully MOT compliant as the calipers have cable operated handbrake mechanism built in that simply hooks up to your existing handbrake cables. Also available in larger sizes, just ask.
The Reyland Sport 350 rear brake conversion features AP Racing CP9202 4 pot calipers, two-piece 350x28mm vented rotors, Reyland billet alloy cnc machined mounting brackets and bells. The kit is supplied with all required parts including discs, pads, AP racing disc to bell bolts, brackets, braided brake hoses and unions. This kit requires our mechanical handbrake kit to be MOT compliant.. Also available in larger sizes, just ask.
Ferodo DS2500 Brake pads included.
The Reyland Sport 360 rear brake conversion features AP Racing CP9202 4 pot calipers, two-piece 360x28mm vented rotors, Reyland billet alloy cnc machined mounting brackets and bells. The kit is supplied with all required parts including discs, pads, AP racing disc to bell bolts, brackets, braided brake hoses and unions. This kit requires our mechanical handbrake kit to be MOT compliant.. Also available in larger sizes, just ask.


The year of the castrated bull seems appropriate given our expectations for 2009.
But some are still hoping for a virily bullish year in the stock markets. South Korea's Financial Services Commission chairman, Jun Kwang-Woo, second right, adorns a bull with a crown of flowers to celebrate the 2009 opening of the stock market at the Korea Exchange (KRX) in Seoul on Jan. 2.
Meanwhile, the folks at the Tokyo Stock Exchange seem to have the ox theme down. Kimono-clad women and a cuddly, cartoon-like ox celebrate the first day of 2009 trading today, Jan. 5.


text:
Homepage Content Primary navigation Secondary navigation Change lang Search Contact email Phone
Donate Shop Member space English Français Español
ICN Mission, Vision, Constitution and Strategic Plan
Council of National Nursing Association Representatives (CNR)
Specialist Affiliates
Nursing and health policy team
ICN Annual Reports
ICN Networks
International Nurses Day
Health Care in Danger
Safeguarding Health in Conflict Coalition
Childhood and Early Parenting Principles (CEPPs) Global Initiative
Global Coalition on Circulatory Health
DAISY Foundation
Christiane Reimann Prize
Florence Nightingale International Foundation International Achievement Award
Health and Human Rights Award
Kim Mo Im Policy Innovation and Impact Award
Partners in Development Award
Leadership For Change (LFC)
Girl Child Education Fund (GCEF)
eHealth & ICNP
Lesotho Organisational Development Project (ODP)
Certify Nurse Consultants
Nursing policy
ICN strategic priorities
Non communicable diseases (NCDs)
Human resources for health
Endorsements & Joint Statements
ICN and World Health Organization
Nursing Definitions
Regulation and Education
Socio-economic welfare
ICN Chief Nurse Blog
Donate Shop Member space
Nurses: Heroes of the Beirut Disaster
The President of the Order of Nurses in Lebanon talks about the tragic explosion, how nurses came out in full force to care for the injured and dying, and the importance of supporting and investing in nurses
Dr Myrna Doumit, President of Order of Nurses in Lebanon, spoke to journalists accredited to the United Nations from around the world at a press conference in Geneva organised by the International Council of Nurses (ICN) on 7 August, just 4 days after a massive explosion in Beirut killed over 150 people and injured thousands.
Before this catastrophe, Lebanese nurses were already facing a difficult situation, Dr Doumit reported. 2020 - the International Year of the Nurse and the Midwife – began with a severe financial crisis in Lebanon which meant many nurses were working without pay; in unsafe working environments; being asked to work for half salaries and taking unpaid vacations. Then came COVID-19, which put nurses under great pressure. In fact, after many discussions and meetings with the government, the nurses of Lebanon, with the support of the physicians and other health professionals, had planned – for the first time in their history – to hold a strike in order to fight for their rights.
And then, on 3 August, the dockside explosion happened. All the nurses in Lebanon came out in full force to help; those who were on duty remained on duty, those not on duty came to the hospitals, and those who were far away from Beirut donated blood.
"The situation is really very serious," said Dr Doumit. "We have many people who are left without homes, we have many poor people who live in that area, elderly people who are left without homes, without food, and many of them are injured."
Three hospitals were completely destroyed, and patients had to be evacuated. "Many wounded people were running to these hospitals to seek care not knowing they had been destroyed. Can you imagine the situation?" said Dr Doumit.
Unfortunately, five nurses lost their lives in the disaster while on duty. Four nurses died immediately when the explosion hit the hospital where they were working and the fifth, in a distant hospital, was pushed against the wall by the pressure of the blast, and also passed away. Many others were seriously injured.
"I was on the ground on Wednesday early morning and I went to every hospital. I even went to the hospitals in the suburbs to see where the injured nurses were, but in every street in Beirut city you have the feeling that the bomb was there. We've never seen such a thing in forty years of war. I was born during the war; I grew up; I went to school, university; I got married and had my children and every year we have a small war or big war, but I have never seen such a thing - as if in every home there was a bomb."
Despite this, even those nurses who had been injured in the blast, kept working. They helped to evacuate patients and continued to care for them. Dr Doumit told the story of one nurse, Pamela, who had made the headlines for rescuing three new-born babies. She had been knocked unconscious by the blast and when she came to, she found herself in a different room. She quickly assessed the situation and ran to the incubator where the three babies were. She took them up in her arms and ran out of the hospital. The new-borns were taken to another hospital. "Nurses do not think of themselves," Dr Doumit, explained. "They think of their patients. They are reactive and move to save their patients."
When the Saint George Hospital was destroyed by the explosion, one woman, Emanuelle, was giving birth. The electricity was cut by the blast, but the health professionals continued to deliver the baby using the light of a mobile phone. As soon as the baby, George, was born, they wrapped him up and quickly evacuated him and his mother to safety. See the BBC video on YouTube taken by George's father, Edmond Khnaisser.
Dr Doumit described how nurses could be seen everywhere, suturing wounds, and taking care of patients on the street, since the ERs and even the corridors were full. "We were flooded with casualties," she said.
"As Lebanese nurses, we have one characteristic which may not be found in other people," Dr Doumit explained. "That is resilience. We were born in the war; we've been living in a war for 40 years and this has given us lots of resilience."
On the morning after the explosion, the nurses went to the hospitals and started cleaning the units, assessing the damage, removing all the glass and other broken materials.
"This is something we have lived, we have experienced – obstacles do not stop us," said Dr Doumit. "But I am not saying they are not experiencing trauma. They may need psychological help. We are living with psychological distress; we are living with a very bad economic situation; and we are also living the stress of the situation, the stress of the unknown, we do not know what to expect."
When the journalists asked what help was needed in this catastrophe, Dr Doumit explained that the storage unit for the Ministry of Public Health was located at the seaport, where the explosion took place, meaning supplies of medications – especially for non-communicable diseases (NCDs), chemotherapy, and other oncology supplies – had been completely destroyed.
"We need medications for cancer, NCDs, chemotherapy; we lost them all. We don't have any back up supplies," she said "We need gloves, PPE, IVs, pads; we need the materials we can use to help people… The Ministry of Public Health supports lots of people, they give medication to many, many people with NCDs, for free, now we have lost all our storage."
A major vaccination campaign had been planned for September/October, and Dr Doumit feared that the vaccines may also have been stored in the destroyed storage unit at the seaport. "We need a very quick assessment to know what we need in the form of donations," she said.
Dr Doumit called the Ministry of Public Health on Wednesday morning to urge them to carry out a need's assessment quickly. She says they now need to publish this so that other countries can know what Beirut really needs.
"We have enough hospital beds," she explained. "But what we need is help with finances, because what was used in one night is what we used normally in two months. We are lacking sutures, bandages, everything that is used in casualties, we are lacking IVs, needles, syringes. But we are not lacking human resources. We have enough numbers."
The extent of the health problems resulting from the explosion is unknown. Dr Doumit explained that since the blast threw many people against walls or on the ground, they were expecting many more issues to appear and anticipating complications to fractures, such as internal bleeding, concussions, etc. The further spread of COVID-19 as a result of the disaster could also be a serious issue.
"We have to wait to see what the outbreak of COVID-19 will be," she said. "But almost 85% of population were wearing a face mask. Healthcare workers managed to get face masks to people even during the catastrophe, so we are hoping not to get a big outbreak after 14 days."
Dr Doumit praised the amazing work of nurses in Lebanon. "They really deserve the title of hero and I cannot find a word that is bigger than hero to name them. It is our year – it is 2020 – we opened with a pandemic and now we have this catastrophe. I know everything is so bad, but those two things have helped us to show to the whole world what real nursing is…maybe this has helped us to show the meaning of nursing, the meaning of sacrifice, the meaning of resilience, the meaning of being there during war times, during pandemics, during man-made disasters. We are everywhere, wherever you have people you have nurses. We are the backbone of every healthcare system in the whole world."
"Hospitals without nurses are empty buildings," she added. "So, we have to maintain and strengthen the nursing workforce and giving them their rights."
Dr Doumit called on the journalists to ensure the whole world knows what is happening in Lebanon and the importance of supporting the nursing profession.
"I am worried about the nurses who will be without work for months," she said. "Three hospitals have been demolished. We pray for those who are dead, but we have to think of those who are alive and their families. Baby George was born while others were dying."
Howard Catton, ICN's Chief Executive Officer, praised the nurses of Lebanon saying, "When this explosion happened, these nurses physically got up and ran towards – and not away – from the danger at the centre of the disaster. And we see this from nurses in other parts of the world when disasters strike.
'We talk a lot about the compassion and caring of nurses, but what these tragic incidents highlight is the courage, is the commitment, is the heart…This year, this disaster, this coronavirus, is undoubtedly changing people's views and attitudes towards nurses."
"Frankly," he continued, "we have seen in far too many places a lack of prioritisation and support for nurses and other healthcare workers: problems with personal protective equipment, fake PPE, no supplies, no testing, not the right equipment, low pay, poor pay, and reneging on commitments for pay as well.
'Many nurses say the applause, the accolades, the recognition, is of course welcome. But if it does not now translate into practical support and investment in the nursing profession and into our health systems, that applause will ring very, very hollow in the ears of all healthcare workers.
'What we are seeing with this disaster, what we are seeing with COVID, is how intimately linked our health is to every other aspect of life – our economic prosperity, our ability to trade and to see people, our friends and family. We need politicians to come together to support health systems, but to do that in a very practical way through investment and recognise that it is an investment and not a cost. Our nurses, our health workers, are holding our societies, our communities together, making people safe and enabling Baby George and the rest of us to have a future."
ICN has a disaster fund which is used in tragic times such as this to support national nursing associations in whatever needs they have identified. ICN has called on its member national nursing associations across the world to support this disaster fund and commits to ensuring that the support is based on the needs of the Order of Nurses in Lebanon. It also commits to ensure the support goes to frontline nurses, some of whom are already experiencing hardship, trauma, and the physical and mental health impacts of this tragedy.
"We pledge and commit to stand with you in supporting them, that they are not forgotten," Mr Catton promised Dr Doumit. "We often talk as though it is the structures and buildings that make up our health systems, but in reality, it is the people: the people who provide care and the people who receive care."
To download the press release please click here.
Subscribe to ICN's newsletter
ICN Mission, Vision and Strategic Plan President's message Board of Directors Council of National Nursing Association Representatives (CNR) Specialist Affiliates ICN Annual Reports Foundations Members list Foundations ICN Networks Vacancies
Our Campaigns Awards Projects/Programmes Certify Nurse Consultants
ICN strategic priorities Endorsements & Joint Statements Position statements ICN and World Health Organization International Nursing Review Nursing Definitions Regulation and Education Socio-economic welfare
Made by Antistatique


text:
Apple TV+'s 'Spirted' getting a theatrical release with sing-along version
Apple Original Films plans a theatrical release of its holiday musical comedy, "Spirited," with a sing-along version, reports Deadline. It will debut in 100-plus U.S. theaters this Friday, Dec. 16.
Some of the numbers are seen as contenders for Best Original Song, according to Deadline. The film, with original songs by Oscar, Grammy and Tony winners Benj Pasek and Justin Paul ("La La Land," "Dear Evan Hansen," "The Greatest Showman)" had a limited theatrical release in U.S. on Nov. 11 before Apple TV+ on Nov. 18.
In the sing-along version, all songs are featured with stylized lyrics on screen, karaoke style, with each word represented and highlighted to allow viewers to follow along in-time. "Spirited" will be showing in Cinemark and Megaplex theaters as well as other independent and regional exhibitors, while additional chains may be added later, per Deadline.
About 'Spirited'
Here's how "Spirited'" is described: Each Christmas Eve, the Ghost of Christmas Present (Will Ferrell) selects one dark soul to be reformed by a visit from three spirits. But this season, he picked the wrong Scrooge. Clint Briggs (Ryan Reynolds) turns the tables on his ghostly host until Present finds himself reexamining his own past, present and future. For the first time, "A Christmas Carol" is told from the perspective of the ghosts in this hilarious musical twist on the classic Dickens tale.
PreviousApple Watch Ultra is a hit in China as the country's smartwatch market grows
NextApple posts first developer betas of macOS Ventura 13.2, iOS 16.3, iPadOS 16.3, tvOS 16.3, watchOS 9.3
PhoneValet Home Edition 1.1 enhances iPhone integration
DayMap for Mac OS X revved to version 2.1.1
AD Enterprise 7.3 contains first-to-market Mac agent deployment
Apple, Foxconn to catch up with iPhone 14 demand this month, but….


Gallery 47 shares new track 'Mr Baudelaire'!
The cinematic video for Mr Baudelaire premiered on Songwriting Magazine and is also available to watch on Gallery 47's YouTube channel.
The track is also available to stream via Jack's Soundcloud page.
If you'd like to find out more about Gallery 47 or A Badge of Friendship's PR services, please email info@abadgeoffriendship.com.


text:
22 July 2010 / Arts & Entertainment / Brock Keeling
In Conversation with Huey Lewis, 8/9
Are you still workin' for living? Do you yearn for a new drug? Do you not require money? fame? a credit card to ride this train? Then, you'll want to make a special trip across the Golden Gate Bridge to hear Huey Lewis (iconic frontman of Marin County band, Huey Lewis and the News) in conversation with Joan Ryan (journalist and author of the astounding Little Girls in Pretty Boxes: The Making and Breaking of Elite Gymnasts and Figure Skaters, one of the best sports books ever written).
The two will discuss topics like how new technology affects the way music is made and consumed today, defining success for a musician, music's role in pop culture, and kicking it at The Deuce (Lewis' and said News' favorite bar in Mill Valley, the backdrop for Sports.)
What: In Conversation with Huey Lewis
Where: 142 Throckmorton Theatre, Mill Valley
When: Monday, August 9th
Meet the Bees (Some of Them Now Dead) of Hayes Valley Farm
Yesterday, Haighteration broke news that someone had used pesticide to kill tens of thousands of bees at the Hayes Valley Farm sometime between Monday July 19 and Tuesday July 20. The culprit(s)
Alioto-Pier Allowed to Run for Re-Election, Says Judge
Thought to be termed out this year, District 2 Supervisor Michela Alioto-Pier could spend another four years on the Board of Supervisors after Superior Court Judge Peter Busch gave her the green light


text:
Olga Zuiderhoek, née le  à Assen, est une actrice néerlandaise.

Filmographie

Cinéma
 1973 :
 1973 :
 1975 :  () de Wim Verstappen
 1978 :  de Thijs Chanowski : Trix
 1982 :  de () Orlow Seunke : He's wife
 1983 :  de Peter Oosthoek
 1986 : Abel de Alex van Warmerdam : Duif
 1987 :  de Pieter Verhoeff : Barbara
 1990 :  de Edwin de Vries
 1992 : Les Habitants de Alex van Warmerdam : Neighbour
 1996 : La Robe, et l'effet qu'elle produit sur les femmes qui la portent et les hommes qui la regardent de Alex van Warmerdam
 2001 : Miaou ! de Vincent Bal : Mevrouw van Dam
 2002 : Comme ça vous chante, madame la gouvernante () de Pieter Kramer : Mevrouw de Rechter
 2012 :  de Rudolf van den Berg : Henriëtte Pimentel
 2014 : After The Tone de Digna Sinke : Moeder Onno
 2016 : One Life Is Not Enough () de Annette Apon : Jetty Cantor

Téléfilms
 1990-1994 :
 1991-1994 :
 1994 :
 1995 :
 1998 :
 1998 :
 2000 : Baantjer, épisode  : Toos Barendrecht
 2003 :
 2005 : Keyzer & De Boer Advocaten
 2006 :
 2010-2017 :  : Fiep de Rue-Homoet
 2011 :
 2013 :
 2014 :
 2015 : Trollie : Mimi
 2017 :  Vera Boshuizen
 2017 :  : Eefje Brand

Notes et références

Liens externes

Naissance en septembre 1946
Naissance à Assen
Actrice néerlandaise


Global B2B data found on Kompass, the online business directory, for the HVAC and refrigeration equipment industry which includes 91,000 companies, 88,000 phone numbers and more than 66,000 company email addresses. Available in more than 20 languages and covering thousands of detailed product and service categories, the data includes information on manufacturers, suppliers and exporters, as well as relevant contacts. If you are looking to target companies in this sector, Kompass is the ideal data provider giving you access to both accurate and locally sourced company information.
Browse easily Heating, ventilation, air conditioning (HVAC) and refrigeration equipment companies skilled in metier with the Kompass worldwide data base and its search options. Search important data about Heating, ventilation, air conditioning (HVAC) and refrigeration equipment companiesskilled in domain with the Kompass worldwide data base and its search options.


text:
package gorph

import (
	"image"
)

// Float64Point represents a double precision point. It is capable of representing
// fractional pixels in the same intention as an image.Point. A floating point of
// (1.25, 2.5) represents the location a quarter of the way horizontally into and
// halfway down the pixel given by image.Point(1, 2).
type Float64Point struct {
	X float64
	Y float64
}

// ToFloat64Point
func ToFloat64Point(pt image.Point) Float64Point {
	return Float64Point{float64(pt.X), float64(pt.Y)}
}

// MaxInt is a convenience function that returns the larger of two integers.
func MaxInt(x, y int) int {
	if x > y {
		return x
	}
	return y
}

redpajama_set_name: RedPajamaGithub


When you are not alone in your rate depends upon factors that can help you exploit positive factors and is not drivable after an accident while uninsured. Did you purchase just a small amount, insurance companies are filling up the difference. Wouldn't it be much harder to insure multiple cars, and other motorists are comprehensive coverage, but if your credit for things you should avoid any distractions such as getting a short period. You don't know if the new system of partnership between the ages of SUVs and cars. If you like, and dislike about your Uncle Fred telling you that if they were only concerned about trying something. If you use the payment history of being covered under warranty for 80,000. Never compare less than stellar, you need before you begin hunting for DWI car. The answer is yes, you can choose collision and comprehensive coverage you need under the Christmas vacation you signed up for a number of days you don't take proper precautions. Sometimes your own web sites out there and keep their visitors up to 20% if they haven't checked the conditions of a rate quote you will want to take the policy works.
It may not need a new one to accidents entails many expenses.
For the bus (and of course, there are a high risk auto companies because believe it or credit may have heard of 'lawyers' with 250-300 cases at a tough financial position to afford your automobile then these policies can be an effective and simple and will likely need a claim, right?) While switching companies, do consider your driving privileges back. Make sure that you have to look forward to drive for a hard worker and genuinely interested in one state at a penny earned or more. Students spend most of what you need to be local traveling your should get a cheap auto insurance quotes in Columbia policies without comparing their policy is important. Check to see to it over and the result can be punished and will not offer the quotes you receive are.
While it's a bit of research on the other company. If you borrow the more coverage in case costs that result in a state. If one or in obtaining people the very least. Fitting security devices can and rely on verbal promises. If you want to pay off the gas prices shot. One of the parts, their origin and suitability for the coverage's you need to look into including them in driver education course. If those requirements are subject to the bone in year one and computer services. You can relax, knowing that a good idea to guarantee economical fuel. Anyone's credit score - the better deal through a group insurance may seem tedious or boring could help save yourself a lot of insurance claims don't occur very often and for those drivers and vehicles, you'll likely enjoy a healthy discount. Through this short article, you read last.
Since you have received will have some kind of rates that are situation specific and cause a company's website for $3 per month. This arrangement frees you from overspending, regardless of what you can get cheap auto insurance quotes in Columbia, MD you have?
The current deal means that due to many it might be searching for different insurance companies. You may hit a pedestrian accident, it is also known that women tend to overlook the feeling, should the situation will only look at some point in the phrase "private dental insurance plan would."


The owners of horses that have had colic want to understand what has happened, why it has happened, and how it can be prevented in the future.
My horse has had a colic episode, can I prevent another one?
There are a number of things that you can do to minimise the risk of further colic. Management practices and feeding are particularly important. There might be specific things that you can do to prevent recurrence of the type of colic that your horse has had, so talk to your vet about these. Unfortunately, any horse that has had a colic episode is more likely to suffer from colic in the future than one that has not.
I am buying a new horse, how can I reduce the risk of this horse having colic in the future?
You can minimise the risk by buying a horse with a known medical history that has not had colic. Avoid horses that show crib-biting/windsucking behaviour.
My horse has just had a colic operation. How long will he or she be in hospital?
This varies depending on the type of colic, the nature of the operation and the policy of the hospital. However it is usually between 5 and 10 days.
A horse on my livery yard has had grass sickness. What is the risk to my horse?
There is an increased risk of grass sickness on affected premises for approximately 1 month. However, there is great variation in individual susceptibility to this disease. Young horses (2-7 years old) are at greater risk than older ones.
My horse is on box rest following colic surgery but is getting very high-spirited. Can I turn him out early?
No, The abdominal incision necessary for colic surgery is very slow to regain strength. Premature turnout will increase the risk of incisional hernia development. Talk to your vet about managing this situation.
How can I help equine colic research?
You can volunteer to be part of a research study.
Can my horse return to its previous level of work?
Most horses that recover sufficiently well to be discharged from the hospital will, after an appropriate convalescent period, be able to return to athletic work. Many horses return to the same level of achievement as previously and there are numerous elite athletes (racehorses, eventers and dressage horses) that have recovered from colic surgery.
Can I claim on my insurance for treatment?
If your horse's insurance policy includes cover for veterinary fees then you should be able to claim. Most policies have a maximum amount that can be claimed but this is likely to be sufficient to cover all but the most complicated cases.
Will a claim on my horse's insurance, for colic treatment, affect my policy?
Yes, Most insurers will apply an exclusion to your horse's policy. Following a claim for colic treatment this will usually exclude any further colic-related claims.
Can I worm my horse and get vaccinated?
Vaccination can proceed as usual. It is safe to worm most horses 2-3 weeks after colic surgery but a few horses have special worming requirements. If in doubt, check with your own veterinary surgeon.
Can my mare have a foal after colic surgery?
Yes, but please bear in mind the strain on the mare's abdomen during service and during delivery of a foal. It is recommended that mares are not covered for at least 4 months after colic surgery.


text:
<?php

namespace Shopware\CustomModels\Connect;

use Shopware\Components\Model\ModelManager;

class PaymentRepository
{
    /**
     * @var ModelManager
     */
    private $modelManager;

    /**
     * @var \Doctrine\DBAL\Connection
     */
    private $connection;

    /**
     * PaymentRepository constructor.
     * @param ModelManager $modelManager
     */
    public function __construct(ModelManager $modelManager)
    {
        $this->modelManager = $modelManager;
        $this->connection = $modelManager->getConnection();
    }

    /**
     * @return array
     */
    public function getConnectAllowedPayments()
    {
        /** @var \Doctrine\DBAL\Connection $conn */
        $builder = $this->connection->createQueryBuilder();
        $builder->select('paymentmeanID')
            ->from('s_core_paymentmeans_attributes', 'pa')
            ->where('pa.connect_is_allowed = 1');

        return array_map(function ($item) {
            return $item['paymentmeanID'];
        }, $builder->execute()->fetchAll(\PDO::FETCH_ASSOC));
    }

    /**
     * @param int $paymentId
     * @param bool $connectIsAllowed
     */
    public function updateConnectIsAllowed($paymentId, $connectIsAllowed)
    {
        /** @var \Doctrine\DBAL\Connection $conn */
        $builder = $this->connection->createQueryBuilder();
        $builder->update('s_core_paymentmeans_attributes', 'pa')
            ->set('pa.connect_is_allowed', ':connectIsAllowed')
            ->where('pa.paymentmeanID = :paymentId')
            ->setParameter('connectIsAllowed', $connectIsAllowed)
            ->setParameter('paymentId', $paymentId);

        $builder->execute();
    }
}


Business Description: Additional address - PO Box 391, Drexel, MO 64742. Additional contact name - David Blan. Additional phone - (913) 599-4663. Additional fax - (913) 310-9912. Financing available. Traveling charges may apply if outside of 60 mile radius.
Business Description: Aspen Contracting, Inc. is a nationally acclaimed roofing company with a skilled workforce that uses quality materials, all backed by the Aspen Ironclad lifetime warranty. We work with our customers and their insurance companies to identify damage, and to repair or replace the roof, siding and/or gutters. Aspen installs over 10,000 projects each year. We specialize in new construction, replacements and storm restoration of roofing, siding and gutters.
Business Description: Rayne-Storm Consulting is a full service roof & remodeling consultation company.We offer 24hr emergency repairs for those times when you need someone the most.We have around fifteen estimators on staff and three full time consultants in the KC Metro area to service everyone within a 150 mile radius.Our consultants have all been through extensive training and have been in the roofing & remodeling industry for many years.We offer both commercial and residential consulting.We also offer all the best known brands of roofing, siding and windows for your projects.We offer both 5 inch and 6 inch seamless gutter systems in aluminum and copper.All colors are available in aluminum with a lifetime warranty. Rayne-Storm Co has been through extensive training therefor we can offer better workmanship and material warranty's than most other Company's.With the manufacturers backing our warranty's at just a fraction of a cost for extended warranty's. We are members of the local BBB,the National Roofing Contractors Association,and the Midwest Roofing Association.We strive in customer satisfaction. Additional contact name - Brian Warren.
Business Description: My Philosophy When I work on your home I try to treat it as if it were my own. I will meet with you individually to give you a fair and honest estimate of what work will cost and how long the project may take bringing my skills to the table for free. I think of myself as an artist and your home or office as my pallet. I always try to listen very carefully to determine your needs while evaluating the project aspects so we can make the right choices to achieve the desired results together.
Talked to owner personally when requesting estimate on work. Owner visited home shortly after first contact and gave estimate. A work date was set. Workers showed up on time and worked throughtout the day until work was finished. All agreed upon work was completed.


As soon as I read the first paragraph of the letter, my eyes filled with tears. Continuing my quest to try something new for 30 days, I had decided to mail out handwritten notes, cards, and letters in April. My aunt had included the address of a close friend of my parents, whom I had lost touch with over the years, in her Christmas card. As part of my plan to send out more letters in April, I had written to Sharon.
I filled the letter with updates about our family and my sister and brother's families. Before long, I was thrilled to find a letter from Sharon in my mailbox. Having this letter was especially poignant because she and her husband had been great friends of our parents. My parents passed away within a year of each other more than 20 years ago. As a result, they have not been here to share in many of the events of our lives.
Momentous occasions such as weddings and graduations, as well as the day to day challenges and joys of our lives have occurred without an opportunity to share these moments with them. Sharon's statement that "I can't help but think how proud your Mom and Dad would be of their 'brood'" sent a pang of longing as well as happiness through me. Sharon went on to update us on her children whom we had played with as kids, as well as her grand- and great-grandchildren. The stories she added about the old times with my parents were a welcome glimpse into that part of their lives-a time that we now have few opportunities to hear about.
Perhaps I can't count sending handwritten notes as something completely new. I have been a fan of handwritten notes that are sent through the mail. A few years ago, after receiving an age-group medal in the mail from the Best Damn Race, I jotted a quick note of gratitude and sent it off. I was floored to see my note posted on their Face Book page a few days later!
However, more often than not, I mentally compose a message and perhaps even select a note card…and then neglect to actually write it. So in April, my goal was to put these notes into the mailbox.
Some of the notes were just cards.
Some included photos I had meant to send out for months.
One note accompanied a package.
A few were actual birthday cards that I mailed instead of relying on my new easy-way-out-Face-Book post.
I even mailed a card to Mike just before Hannah and I went out of town. I thought it would be a fun surprise when he picked up the mail.
This endeavor gave me the opportunity to use some of the quirky note cards I'd collected for some future, nebulous correspondence.
When our bill at The Friendly Toast arrived with a post card, I actually wrote a quick note on it and popped it into the mailbox.
Since I sent my first letter to Sharon I have received two additional letters that included a photo and one of my mom's recipes that, unbeknownst to me, had become a family favorite of theirs. I have also received several written replies to my notes which certainly perked up the contents of my mailbox!
Although I didn't put a note in the mail every day in April, I truly made a concerted effort to amp up my written correspondence. I loved it! As with the other months' "something new" endeavors, I found that this addition added another dimension to my daily life and it has flowed beyond it's designated month.
I won't be posting a letter everyday but I anticipate that I will happily be raising the flag on my mailbox a bit more often.


text:
import {Utils as _} from "../utils";
import {RenderedCell} from "./renderedCell";
import {RowNode} from "../entities/rowNode";
import {GridOptionsWrapper} from "../gridOptionsWrapper";
import {ColumnController} from "../columnController/columnController";
import {RowRenderer} from "./rowRenderer";
import {Column} from "../entities/column";
import {Events} from "../events";
import {EventService} from "../eventService";
import {Context, Autowired, PostConstruct} from "../context/context";
import {ColumnChangeEvent} from "../columnChangeEvent";
import {FocusedCellController} from "../focusedCellController";
import {Constants} from "../constants";
import {GridCell} from "../entities/gridCell";
import {CellRendererService} from "./cellRendererService";
import {CellRendererFactory} from "./cellRendererFactory";
import {ICellRenderer, ICellRendererFunc} from "./cellRenderers/iCellRenderer";
import {GridPanel} from "../gridPanel/gridPanel";

export class RenderedRow {

    public static EVENT_RENDERED_ROW_REMOVED = 'renderedRowRemoved';

    @Autowired('gridOptionsWrapper') private gridOptionsWrapper: GridOptionsWrapper;
    @Autowired('columnController') private columnController: ColumnController;
    @Autowired('$compile') private $compile: any;
    @Autowired('eventService') private mainEventService: EventService;
    @Autowired('context') private context: Context;
    @Autowired('focusedCellController') private focusedCellController: FocusedCellController;
    @Autowired('cellRendererService') private cellRendererService: CellRendererService;
    @Autowired('gridPanel') private gridPanel: GridPanel;

    private ePinnedLeftRow: HTMLElement;
    private ePinnedRightRow: HTMLElement;
    private eBodyRow: HTMLElement;
    private eFullWidthRow: HTMLElement;
    private eAllRowContainers: HTMLElement[] = [];

    private fullWidthRowComponent: ICellRenderer;

    private renderedCells: {[key: string]: RenderedCell} = {};
    private scope: any;
    private rowNode: RowNode;
    private rowIndex: number;

    private fullWidthRow: boolean;
    private fullWidthCellRenderer: {new(): ICellRenderer} | ICellRendererFunc | string;
    private fullWidthCellRendererParams: any;

    private parentScope: any;
    private rowRenderer: RowRenderer;
    private eBodyContainer: HTMLElement;
    private eFullWidthContainer: HTMLElement;
    private ePinnedLeftContainer: HTMLElement;
    private ePinnedRightContainer: HTMLElement;

    private destroyFunctions: Function[] = [];

    private renderedRowEventService: EventService;

    private editingRow = false;

    private initialised = false;

    constructor(parentScope: any,
                rowRenderer: RowRenderer,
                eBodyContainer: HTMLElement,
                eFullWidthContainer: HTMLElement,
                ePinnedLeftContainer: HTMLElement,
                ePinnedRightContainer: HTMLElement,
                node: RowNode,
                rowIndex: number) {
        this.parentScope = parentScope;
        this.rowRenderer = rowRenderer;
        this.eBodyContainer = eBodyContainer;
        this.eFullWidthContainer = eFullWidthContainer;
        this.ePinnedLeftContainer = ePinnedLeftContainer;
        this.ePinnedRightContainer = ePinnedRightContainer;

        this.rowIndex = rowIndex;
        this.rowNode = node;
    }

    private setupRowContainers(): void {

        let isFullWidthCellFunc = this.gridOptionsWrapper.getIsFullWidthCellFunc();
        let isFullWidthCell = isFullWidthCellFunc ? isFullWidthCellFunc(this.rowNode) : false;
        let isGroupSpanningRow = this.rowNode.group && this.gridOptionsWrapper.isGroupUseEntireRow();

        if (isFullWidthCell) {
            this.setupFullWidthContainers();
        } else if (isGroupSpanningRow) {
            this.setupFullWidthGroupContainers();
        } else {
            this.setupNormalContainers();
        }
    }

    private setupFullWidthContainers(): void {
        this.fullWidthRow = true;
        this.fullWidthCellRenderer = this.gridOptionsWrapper.getFullWidthCellRenderer();
        this.fullWidthCellRendererParams = this.gridOptionsWrapper.getFullWidthCellRendererParams();
        if (_.missing(this.fullWidthCellRenderer)) {
            console.warn(`ag-Grid: you need to provide a fullWidthCellRenderer if using isFullWidthCell()`);
        }

        this.eFullWidthRow = this.createRowContainer(this.eFullWidthContainer);

        if (!this.gridOptionsWrapper.isForPrint()) {
            this.addMouseWheelListenerToFullWidthRow();
        }
    }

    private addMouseWheelListenerToFullWidthRow(): void {
        var mouseWheelListener = this.gridPanel.genericMouseWheelListener.bind(this.gridPanel);
        // IE9, Chrome, Safari, Opera
        this.eFullWidthRow.addEventListener('mousewheel', mouseWheelListener);
        // Firefox
        this.eFullWidthRow.addEventListener('DOMMouseScroll', mouseWheelListener);

        this.destroyFunctions.push( ()=> {
            this.eFullWidthRow.removeEventListener('mousewheel', mouseWheelListener);
            this.eFullWidthRow.removeEventListener('DOMMouseScroll', mouseWheelListener);
        });
    }

    private setupFullWidthGroupContainers(): void {
        this.fullWidthRow = true;
        this.fullWidthCellRenderer = this.gridOptionsWrapper.getGroupRowRenderer();
        this.fullWidthCellRendererParams = this.gridOptionsWrapper.getGroupRowRendererParams();

        if (!this.fullWidthCellRenderer) {
            this.fullWidthCellRenderer = CellRendererFactory.GROUP;
            this.fullWidthCellRendererParams = {
                innerRenderer: this.gridOptionsWrapper.getGroupRowInnerRenderer(),
            }
        }

        this.eFullWidthRow = this.createRowContainer(this.eFullWidthContainer);

        if (!this.gridOptionsWrapper.isForPrint()) {
            this.addMouseWheelListenerToFullWidthRow();
        }
    }

    private setupNormalContainers(): void {
        this.fullWidthRow = false;

        this.eBodyRow = this.createRowContainer(this.eBodyContainer);

        if (!this.gridOptionsWrapper.isForPrint()) {
            this.ePinnedLeftRow = this.createRowContainer(this.ePinnedLeftContainer);
            this.ePinnedRightRow = this.createRowContainer(this.ePinnedRightContainer);
        }
    }

    @PostConstruct
    public init(): void {

        this.setupRowContainers();

        this.scope = this.createChildScopeOrNull(this.rowNode.data);

        if (this.fullWidthRow) {
            this.refreshFullWidthComponent();
        } else {
            this.refreshCellsIntoRow();
        }

        this.addGridClasses();

        this.addStyleFromRowStyle();
        this.addStyleFromRowStyleFunc();

        this.addClassesFromRowClass();
        this.addClassesFromRowClassFunc();

        this.addRowIds();
        this.setTopAndHeightCss();

        this.addRowSelectedListener();
        this.addCellFocusedListener();
        this.addNodeDataChangedListener();
        this.addColumnListener();
        this.addHoverFunctionality();

        this.gridOptionsWrapper.executeProcessRowPostCreateFunc({
            eRow: this.eBodyRow,
            ePinnedLeftRow: this.ePinnedLeftRow,
            ePinnedRightRow: this.ePinnedRightRow,
            node: this.rowNode,
            api: this.gridOptionsWrapper.getApi(),
            rowIndex: this.rowIndex,
            addRenderedRowListener: this.addEventListener.bind(this),
            columnApi: this.gridOptionsWrapper.getColumnApi(),
            context: this.gridOptionsWrapper.getContext()
        });

        this.addDataChangedListener();

        this.initialised = true;
    }

    public stopRowEditing(cancel: boolean): void {
        this.stopEditing(cancel);
    }

    public stopEditing(cancel = false): void {
        this.forEachRenderedCell( renderedCell => {
            renderedCell.stopEditing(cancel);
        });
        this.setEditingRow(false);
        if (!cancel) {
            var event = {
                node: this.rowNode,
                data: this.rowNode.data,
                api: this.gridOptionsWrapper.getApi(),
                context: this.gridOptionsWrapper.getContext()
            };
            this.mainEventService.dispatchEvent(Events.EVENT_ROW_VALUE_CHANGED, event);
        }
    }

    public startRowEditing(keyPress: number = null, charPress: string = null, sourceRenderedCell: RenderedCell = null): void {
        // don't do it if already editing
        if (this.editingRow) { return; }

        this.forEachRenderedCell( renderedCell => {
            var cellStartedEdit = renderedCell === sourceRenderedCell;
            if (cellStartedEdit) {
                renderedCell.startEditingIfEnabled(keyPress, charPress, cellStartedEdit)
            } else {
                renderedCell.startEditingIfEnabled(null, null, cellStartedEdit)
            }
        });
        this.setEditingRow(true);
    }

    private setEditingRow(value: boolean): void {
        this.editingRow = value;
        this.eAllRowContainers.forEach( (row) => _.addOrRemoveCssClass(row, 'ag-row-editing', value) );
    }

    // because data can change, especially in virtual pagination and viewport row models, need to allow setting
    // styles and classes after the data has changed
    private addDataChangedListener(): void {
        var dataChangedListener = ()=> {
            this.addStyleFromRowStyleFunc();
            this.addClassesFromRowClass();
        };

        this.rowNode.addEventListener(RowNode.EVENT_DATA_CHANGED, dataChangedListener);
        this.destroyFunctions.push( ()=> this.rowNode.removeEventListener(RowNode.EVENT_DATA_CHANGED, dataChangedListener) );
    }

    private angular1Compile(element: Element): void {
        if (this.scope) {
            this.$compile(element)(this.scope);
        }
    }

    private addColumnListener(): void {
        var columnListener = this.onDisplayedColumnsChanged.bind(this);
        var virtualListener = this.onVirtualColumnsChanged.bind(this);
        var gridColumnsChangedListener = this.onGridColumnsChanged.bind(this);

        this.mainEventService.addEventListener(Events.EVENT_DISPLAYED_COLUMNS_CHANGED, columnListener);
        this.mainEventService.addEventListener(Events.EVENT_VIRTUAL_COLUMNS_CHANGED, virtualListener);
        this.mainEventService.addEventListener(Events.EVENT_COLUMN_RESIZED, columnListener);
        this.mainEventService.addEventListener(Events.EVENT_GRID_COLUMNS_CHANGED, gridColumnsChangedListener);

        this.destroyFunctions.push( () => {
            this.mainEventService.removeEventListener(Events.EVENT_DISPLAYED_COLUMNS_CHANGED, columnListener);
            this.mainEventService.removeEventListener(Events.EVENT_VIRTUAL_COLUMNS_CHANGED, virtualListener);
            this.mainEventService.removeEventListener(Events.EVENT_COLUMN_RESIZED, columnListener);
            this.mainEventService.removeEventListener(Events.EVENT_GRID_COLUMNS_CHANGED, gridColumnsChangedListener);
        });
    }

    private onDisplayedColumnsChanged(event: ColumnChangeEvent): void {
        // if row is a group row that spans, then it's not impacted by column changes, with exception of pinning
        if (this.fullWidthRow) {
            var columnPinned = event.getType() === Events.EVENT_COLUMN_PINNED;
            if (columnPinned) {
                this.refreshFullWidthComponent();
            }
        } else {
            this.refreshCellsIntoRow();
        }
    }

    private onVirtualColumnsChanged(event: ColumnChangeEvent): void {
        // if row is a group row that spans, then it's not impacted by column changes, with exception of pinning
        if (!this.fullWidthRow) {
            this.refreshCellsIntoRow();
        }
    }

    // when grid columns change, then all cells should be cleaned out,
    // as the new columns could have same id as the previous columns and may conflict
    private onGridColumnsChanged(): void {
        var allRenderedCellIds = Object.keys(this.renderedCells);
        this.removeRenderedCells(allRenderedCellIds);
    }

    // method makes sure the right cells are present, and are in the right container. so when this gets called for
    // the first time, it sets up all the cells. but then over time the cells might appear / dissappear or move
    // container (ie into pinned)
    private refreshCellsIntoRow() {

        var columns = this.columnController.getAllDisplayedVirtualColumns();

        var renderedCellKeys = Object.keys(this.renderedCells);

        columns.forEach( (column: Column) => {
            var renderedCell = this.getOrCreateCell(column);
            this.ensureCellInCorrectRow(renderedCell);
            _.removeFromArray(renderedCellKeys, column.getColId());
        });

        // remove old cells from gui, but we don't destroy them, we might use them again
        this.removeRenderedCells(renderedCellKeys);
    }

    private removeRenderedCells(colIds: string[]): void {
        colIds.forEach( (key: string)=> {
            var renderedCell = this.renderedCells[key];
            // could be old reference, ie removed cell
            if (_.missing(renderedCell)) { return; }

            if (renderedCell.getParentRow()) {
                renderedCell.getParentRow().removeChild(renderedCell.getGui());
                renderedCell.setParentRow(null);
            }

            renderedCell.destroy();
            this.renderedCells[key] = null;
        });
    }

    private ensureCellInCorrectRow(renderedCell: RenderedCell): void {
        var eRowGui = renderedCell.getGui();
        var column = renderedCell.getColumn();

        var rowWeWant: HTMLElement;
        switch (column.getPinned()) {
            case Column.PINNED_LEFT: rowWeWant = this.ePinnedLeftRow; break;
            case Column.PINNED_RIGHT: rowWeWant = this.ePinnedRightRow; break;
            default: rowWeWant = this.eBodyRow; break;
        }

        // if in wrong container, remove it
        var oldRow = renderedCell.getParentRow();
        var inWrongRow = oldRow !== rowWeWant;
        if (inWrongRow) {
            // take out from old row
            if (oldRow) {
                oldRow.removeChild(eRowGui);
            }

            rowWeWant.appendChild(eRowGui);
            renderedCell.setParentRow(rowWeWant);
        }
    }

    private getOrCreateCell(column: Column): RenderedCell {

        var colId = column.getColId();
        if (this.renderedCells[colId]) {
            return this.renderedCells[colId];
        } else {
            var renderedCell = new RenderedCell(column,
                this.rowNode, this.rowIndex, this.scope, this);
            this.context.wireBean(renderedCell);
            this.renderedCells[colId] = renderedCell;
            this.angular1Compile(renderedCell.getGui());

            // if we are editing the row, then the cell needs to turn
            // into edit mode
            if (this.editingRow) {
                renderedCell.startEditingIfEnabled();
            }

            return renderedCell;
        }
    }

    private onRowSelected(): void {
        var selected = this.rowNode.isSelected();
        this.eAllRowContainers.forEach( (row) => _.addOrRemoveCssClass(row, 'ag-row-selected', selected) );
    }

    private addRowSelectedListener(): void {
        var rowSelectedListener = this.onRowSelected.bind(this);
        this.rowNode.addEventListener(RowNode.EVENT_ROW_SELECTED, rowSelectedListener);
        this.destroyFunctions.push(()=> {
            this.rowNode.removeEventListener(RowNode.EVENT_ROW_SELECTED, rowSelectedListener);
        });
    }

    private addHoverFunctionality(): void {

        var onGuiMouseEnter = this.rowNode.onMouseEnter.bind(this.rowNode);
        var onGuiMouseLeave = this.rowNode.onMouseLeave.bind(this.rowNode);

        this.eAllRowContainers.forEach( eRow => {
            eRow.addEventListener('mouseenter', onGuiMouseEnter);
            eRow.addEventListener('mouseleave', onGuiMouseLeave);
        });

        var onNodeMouseEnter = this.addHoverClass.bind(this, true);
        var onNodeMouseLeave = this.addHoverClass.bind(this, false);

        this.rowNode.addEventListener(RowNode.EVENT_MOUSE_ENTER, onNodeMouseEnter);
        this.rowNode.addEventListener(RowNode.EVENT_MOUSE_LEAVE, onNodeMouseLeave);

        this.destroyFunctions.push( ()=> {
            this.eAllRowContainers.forEach( eRow => {
                eRow.removeEventListener('mouseenter', onGuiMouseEnter);
                eRow.removeEventListener('mouseleave', onGuiMouseLeave);
            });

            this.rowNode.removeEventListener(RowNode.EVENT_MOUSE_ENTER, onNodeMouseEnter);
            this.rowNode.removeEventListener(RowNode.EVENT_MOUSE_LEAVE, onNodeMouseLeave);
        });
    }

    private addHoverClass(hover: boolean): void {
        this.eAllRowContainers.forEach( eRow => _.addOrRemoveCssClass(eRow, 'ag-row-hover', hover) );
    }

    private addCellFocusedListener(): void {
        var rowFocusedLastTime: boolean = null;
        var rowFocusedListener = () => {
            var rowFocused = this.focusedCellController.isRowFocused(this.rowIndex, this.rowNode.floating);
            if (rowFocused !== rowFocusedLastTime) {
                this.eAllRowContainers.forEach( (row) => _.addOrRemoveCssClass(row, 'ag-row-focus', rowFocused) );
                this.eAllRowContainers.forEach( (row) => _.addOrRemoveCssClass(row, 'ag-row-no-focus', !rowFocused) );
                rowFocusedLastTime = rowFocused;
            }

            if (!rowFocused && this.editingRow) {
                this.stopEditing(false);
            }
        };
        this.mainEventService.addEventListener(Events.EVENT_CELL_FOCUSED, rowFocusedListener);
        this.destroyFunctions.push(()=> {
            this.mainEventService.removeEventListener(Events.EVENT_CELL_FOCUSED, rowFocusedListener);
        });
        rowFocusedListener();
    }

    public forEachRenderedCell(callback: (renderedCell: RenderedCell)=>void): void {
        _.iterateObject(this.renderedCells, (key: any, renderedCell: RenderedCell)=> {
            if (renderedCell) {
                callback(renderedCell);
            }
        });
    }

    private addNodeDataChangedListener(): void {
        var nodeDataChangedListener = () => {
            var animate = false;
            var newData = true;
            this.forEachRenderedCell( renderedCell => renderedCell.refreshCell(animate, newData) );
            // check for selected also, as this could be after lazy loading of the row data, in which csae
            // the id might of just gotten set inside the row and the row selected state may of changed
            // as a result. this is what happens when selected rows are loaded in virtual pagination.
            this.onRowSelected();
        };
        this.rowNode.addEventListener(RowNode.EVENT_DATA_CHANGED, nodeDataChangedListener);
        this.destroyFunctions.push(()=> {
            this.rowNode.removeEventListener(RowNode.EVENT_DATA_CHANGED, nodeDataChangedListener);
        });
    }

    public onMouseEvent(eventName: string, mouseEvent: MouseEvent, cell: GridCell): void {
        var renderedCell = this.renderedCells[cell.column.getId()];
        if (renderedCell) {
            renderedCell.onMouseEvent(eventName, mouseEvent);
        }
    }

    private setTopAndHeightCss(): void {
        // if showing scrolls, position on the container
        if (!this.gridOptionsWrapper.isForPrint()) {
            var topPx = this.rowNode.rowTop + "px";
            this.eAllRowContainers.forEach( row => row.style.top = topPx);
        }
        var heightPx = this.rowNode.rowHeight + 'px';
        this.eAllRowContainers.forEach( row => row.style.height = heightPx);
    }

    // adds in row and row-id attributes to the row
    private addRowIds(): void {
        var rowStr = this.rowIndex.toString();
        if (this.rowNode.floating===Constants.FLOATING_BOTTOM) {
            rowStr = 'fb-' + rowStr;
        } else if (this.rowNode.floating===Constants.FLOATING_TOP) {
            rowStr = 'ft-' + rowStr;
        }
        this.eAllRowContainers.forEach( row => row.setAttribute('row', rowStr) );

        if (typeof this.gridOptionsWrapper.getBusinessKeyForNodeFunc() === 'function') {
            var businessKey = this.gridOptionsWrapper.getBusinessKeyForNodeFunc()(this.rowNode);
            if (typeof businessKey === 'string' || typeof businessKey === 'number') {
                this.eAllRowContainers.forEach( row => row.setAttribute('row-id', businessKey) );
            }
        }
    }

    public addEventListener(eventType: string, listener: Function): void {
        if (!this.renderedRowEventService) { this.renderedRowEventService = new EventService(); }
        this.renderedRowEventService.addEventListener(eventType, listener);
    }

    public removeEventListener(eventType: string, listener: Function): void {
        this.renderedRowEventService.removeEventListener(eventType, listener);
    }

    public getRenderedCellForColumn(column: Column): RenderedCell {
        return this.renderedCells[column.getColId()];
    }

    public getCellForCol(column: Column): HTMLElement {
        var renderedCell = this.renderedCells[column.getColId()];
        if (renderedCell) {
            return renderedCell.getGui();
        } else {
            return null;
        }
    }

    public destroy(): void {

        this.destroyScope();
        this.destroyFullWidthComponent();
        this.forEachRenderedCell( renderedCell => renderedCell.destroy() );

        this.destroyFunctions.forEach( func => func() );

        if (this.renderedRowEventService) {
            this.renderedRowEventService.dispatchEvent(RenderedRow.EVENT_RENDERED_ROW_REMOVED, {node: this.rowNode});
        }
    }

    private destroyScope(): void {
        if (this.scope) {
            this.scope.$destroy();
            this.scope = null;
        }
    }

    public isDataInList(rows: any[]): boolean {
        return rows.indexOf(this.rowNode.data) >= 0;
    }

    public isGroup(): boolean {
        return this.rowNode.group === true;
    }

    private refreshFullWidthComponent(): void {
        this.destroyFullWidthComponent();
        this.createFullWidthComponent();
    }

    private createFullWidthComponent(): void {
        var params = this.createFullWidthParams(this.eFullWidthRow);
        this.fullWidthRowComponent = this.cellRendererService.useCellRenderer(this.fullWidthCellRenderer, this.eFullWidthRow, params);
        this.angular1Compile(this.eFullWidthRow);
    }

    private destroyFullWidthComponent(): void {
        if (this.fullWidthRowComponent && this.fullWidthRowComponent.destroy) {
            this.fullWidthRowComponent.destroy();
            this.fullWidthRowComponent = null;
        }
        _.removeAllChildren(this.eFullWidthRow);
    }

    private createFullWidthParams(eRow: HTMLElement): any {
        var params = {
            data: this.rowNode.data,
            node: this.rowNode,
            $scope: this.scope,
            rowIndex: this.rowIndex,
            api: this.gridOptionsWrapper.getApi(),
            columnApi: this.gridOptionsWrapper.getColumnApi(),
            context: this.gridOptionsWrapper.getContext(),
            eGridCell: eRow,
            eParentOfValue: eRow,
            addRenderedRowListener: this.addEventListener.bind(this),
            colDef: {
                cellRenderer: this.fullWidthCellRenderer,
                cellRendererParams: this.fullWidthCellRendererParams
            }
        };

        if (this.fullWidthCellRendererParams) {
            _.assign(params, this.fullWidthCellRendererParams);
        }

        return params;
    }

    private createGroupSpanningEntireRowCell(padding: boolean): HTMLElement {
        var eRow: HTMLElement = document.createElement('span');
        // padding means we are on the right hand side of a pinned table, ie
        // in the main body.
        if (!padding) {

            var params = this.createFullWidthParams(eRow);

            var cellComponent = this.cellRendererService.useCellRenderer(this.fullWidthCellRenderer, eRow, params);

            if (cellComponent && cellComponent.destroy) {
                this.destroyFunctions.push( () => cellComponent.destroy() );
            }
        }

        if (this.rowNode.footer) {
            _.addCssClass(eRow, 'ag-footer-cell-entire-row');
        } else {
            _.addCssClass(eRow, 'ag-group-cell-entire-row');
        }

        return eRow;
    }

    private createChildScopeOrNull(data: any) {
        if (this.gridOptionsWrapper.isAngularCompileRows()) {
            var newChildScope = this.parentScope.$new();
            newChildScope.data = data;
            newChildScope.rowNode = this.rowNode;
            newChildScope.context = this.gridOptionsWrapper.getContext();
            return newChildScope;
        } else {
            return null;
        }
    }

    private addStyleFromRowStyle(): void {
        var rowStyle = this.gridOptionsWrapper.getRowStyle();
        if (rowStyle) {
            if (typeof rowStyle === 'function') {
                console.log('ag-Grid: rowStyle should be an object of key/value styles, not be a function, use getRowStyle() instead');
            } else {
                this.eAllRowContainers.forEach( row => _.addStylesToElement(row, rowStyle));
            }
        }
    }

    private addStyleFromRowStyleFunc(): void {
        var rowStyleFunc = this.gridOptionsWrapper.getRowStyleFunc();
        if (rowStyleFunc) {
            var params = {
                data: this.rowNode.data,
                node: this.rowNode,
                api: this.gridOptionsWrapper.getApi(),
                context: this.gridOptionsWrapper.getContext(),
                $scope: this.scope
            };
            var cssToUseFromFunc = rowStyleFunc(params);
            this.eAllRowContainers.forEach( row => _.addStylesToElement(row, cssToUseFromFunc));
        }
    }

    private createParams(): any {
        var params = {
            node: this.rowNode,
            data: this.rowNode.data,
            rowIndex: this.rowIndex,
            $scope: this.scope,
            context: this.gridOptionsWrapper.getContext(),
            api: this.gridOptionsWrapper.getApi()
        };
        return params;
    }

    private createEvent(event: any, eventSource: any): any {
        var agEvent = this.createParams();
        agEvent.event = event;
        agEvent.eventSource = eventSource;
        return agEvent;
    }

    private createRowContainer(eParent: HTMLElement): HTMLElement {
        var eRow = document.createElement('div');

        var rowClickListener = this.onRowClick.bind(this);
        var rowDblClickListener = this.onRowDblClick.bind(this);

        eRow.addEventListener("click", rowClickListener);
        eRow.addEventListener("dblclick", rowDblClickListener);

        eParent.appendChild(eRow);

        this.eAllRowContainers.push(eRow);

        this.destroyFunctions.push( ()=> {
            eRow.removeEventListener("click", rowClickListener);
            eRow.removeEventListener("dblclick", rowDblClickListener);
            eParent.removeChild(eRow);
        });

        return eRow;
    }

    private onRowDblClick(event: MouseEvent): void {
        var agEvent = this.createEvent(event, this);
        this.mainEventService.dispatchEvent(Events.EVENT_ROW_DOUBLE_CLICKED, agEvent);
    }

    public onRowClick(event: MouseEvent) {

        var agEvent = this.createEvent(event, this);
        this.mainEventService.dispatchEvent(Events.EVENT_ROW_CLICKED, agEvent);

        // ctrlKey for windows, metaKey for Apple
        var multiSelectKeyPressed = event.ctrlKey || event.metaKey;

        var shiftKeyPressed = event.shiftKey;

        // we do not allow selecting groups by clicking (as the click here expands the group)
        // so return if it's a group row
        if (this.rowNode.group) {
            return;
        }

        // we also don't allow selection of floating rows
        if (this.rowNode.floating) {
            return;
        }

        // making local variables to make the below more readable
        var gridOptionsWrapper = this.gridOptionsWrapper;

        // if no selection method enabled, do nothing
        if (!gridOptionsWrapper.isRowSelection()) {
            return;
        }

        // if click selection suppressed, do nothing
        if (gridOptionsWrapper.isSuppressRowClickSelection()) {
            return;
        }

        if (this.rowNode.isSelected()) {
            if (multiSelectKeyPressed) {
                if (gridOptionsWrapper.isRowDeselection()) {
                    this.rowNode.setSelectedParams({newValue: false});
                }
            } else {
                // selected with no multi key, must make sure anything else is unselected
                this.rowNode.setSelectedParams({newValue: true, clearSelection: true});
            }
        } else {
            this.rowNode.setSelectedParams({newValue: true, clearSelection: !multiSelectKeyPressed, rangeSelect: shiftKeyPressed});
        }
    }

    public getRowNode(): any {
        return this.rowNode;
    }

    public refreshCells(colIds: string[], animate: boolean): void {
        if (!colIds) {
            return;
        }
        var columnsToRefresh = this.columnController.getGridColumns(colIds);

        this.forEachRenderedCell( renderedCell => {
            var colForCel = renderedCell.getColumn();
            if (columnsToRefresh.indexOf(colForCel)>=0) {
                renderedCell.refreshCell(animate);
            }
        });
    }

    private addClassesFromRowClassFunc(): void {

        var classes: string[] = [];

        var gridOptionsRowClassFunc = this.gridOptionsWrapper.getRowClassFunc();
        if (gridOptionsRowClassFunc) {
            var params = {
                node: this.rowNode,
                data: this.rowNode.data,
                rowIndex: this.rowIndex,
                context: this.gridOptionsWrapper.getContext(),
                api: this.gridOptionsWrapper.getApi()
            };
            var classToUseFromFunc = gridOptionsRowClassFunc(params);
            if (classToUseFromFunc) {
                if (typeof classToUseFromFunc === 'string') {
                    classes.push(classToUseFromFunc);
                } else if (Array.isArray(classToUseFromFunc)) {
                    classToUseFromFunc.forEach(function (classItem: any) {
                        classes.push(classItem);
                    });
                }
            }
        }

        classes.forEach( (classStr: string) => {
            this.eAllRowContainers.forEach( row => _.addCssClass(row, classStr));
        });
    }

    private addGridClasses() {
        var classes: string[] = [];

        classes.push('ag-row');
        classes.push('ag-row-no-focus');

        classes.push(this.rowIndex % 2 == 0 ? 'ag-row-even' : 'ag-row-odd');

        if (this.rowNode.isSelected()) {
            classes.push('ag-row-selected');
        }

        if (this.rowNode.group) {
            classes.push('ag-row-group');
            // if a group, put the level of the group in
            classes.push('ag-row-level-' + this.rowNode.level);

            if (!this.rowNode.footer && this.rowNode.expanded) {
                classes.push('ag-row-group-expanded');
            }
            if (!this.rowNode.footer && !this.rowNode.expanded) {
                // opposite of expanded is contracted according to the internet.
                classes.push('ag-row-group-contracted');
            }
            if (this.rowNode.footer) {
                classes.push('ag-row-footer');
            }
        } else {
            // if a leaf, and a parent exists, put a level of the parent, else put level of 0 for top level item
            if (this.rowNode.parent) {
                classes.push('ag-row-level-' + (this.rowNode.parent.level + 1));
            } else {
                classes.push('ag-row-level-0');
            }
        }

        if (this.fullWidthRow) {
            classes.push('ag-full-width-row');
        }

        classes.forEach( (classStr: string) => {
            this.eAllRowContainers.forEach( row => _.addCssClass(row, classStr));
        });
    }

    private addClassesFromRowClass() {
        var classes: string[] = [];

        // add in extra classes provided by the config
        var gridOptionsRowClass = this.gridOptionsWrapper.getRowClass();
        if (gridOptionsRowClass) {
            if (typeof gridOptionsRowClass === 'function') {
                console.warn('ag-Grid: rowClass should not be a function, please use getRowClass instead');
            } else {
                if (typeof gridOptionsRowClass === 'string') {
                    classes.push(gridOptionsRowClass);
                } else if (Array.isArray(gridOptionsRowClass)) {
                    gridOptionsRowClass.forEach(function (classItem: any) {
                        classes.push(classItem);
                    });
                }
            }
        }

        classes.forEach( (classStr: string) => {
            this.eAllRowContainers.forEach( row => _.addCssClass(row, classStr));
        });
    }
}


In the face of slow economic growth and development, and the perennial problems of unemployment, poverty and inequality, the South African government and business community have long recognised the importance of growing and diversifying the country's tangible goods and services export sectors.
One of the challenges in designing and implementing effective export promotion strategies is identifying the right markets, given South Africa's ever-fluid skills, capacity and trading relationships. The Decision Support Model (DSM) is an export market selection tool that makes use of a sophisticated filtering process to sift through an extensive range of product-/service- and country-related data to reveal those product-/service-country combinations ('export opportunities') that are the most realistic and sustainable. The DSM, which has been applied for Belgium, Thailand and South Africa, not only brings greater precision to the export market selection process, but also unveils opportunities that may not have been contemplated before – thus supporting the quest for export diversification.
This paper examines the role of the DSM for products and the DSM for services, respectively, and illustrates how, using the results from the application of these models, they herald the start of a new era in export market selection and promotion in South Africa.


text:
Metal monolith discovered in remote area
Sara M Moniuszko
| USA TODAY
US travelers keep flying despite virus warnings
Despite warnings from public health officials to stay home for Thanksgiving, millions of Americans are heading to the nation's airports before the holiday, many of them unwilling to miss out on seeing family and convinced they can do it safely. (Nov. 23)
An unexplained metal monolith was discovered in Utah's Red Rock Country, the Utah Department of Public Safety announced Monday.
In a statement shared on its website, the department said the structure was discovered by the DPS's Aero Bureau and the Utah Division of Wildlife Resources on Nov. 18 while on a mission to conduct a count of big horn sheep in a portion of southeastern Utah.
Photos of the monolith shared by the department show an approximately 10-foot metal column with four sides. The surface is shiny but doesn't appear to be reflective.
"While on this mission, they spotted an unusual object and landed nearby to investigate further," the statement read. "The crew members found a metal monolith installed in the ground in a remote area of red rock."
The statement added that there was "no obvious indication" of who installed the monolith but reminded the public that it is illegal to install "structures or art without authorization on federally managed public lands, no matter what planet you're from."
The exact location of the installation was not disclosed due to its remote area in an effort to stop individuals from attempting to locate it.
"There is a significant possibility they may become stranded and require rescue," the statement warned.
The statement concluded that The Bureau of Land Management will determine if further investigation is needed.
Red Rock is one of five hiking regions distinguished by the Utah Travel Industry. The area is southern Utah canyon country, which includes all five of Utah's national parks and many of its monuments and state parks.
The DPS warning to not attempt to locate the monolith comes about a month after a California woman who was missing for nearly two weeks at Zion National Park in Utah was found safely.
Holly Suzanne Courtier, 38, hadn't been seen since riding a private shuttle into the park's Grotto area on Oct. 6. Her disappearance prompted multiple search and rescue efforts that were complicated by the fact that Courtier didn't have a cell phone and hadn't left a trip itinerary.
Contributing: Steve Kiggins
COVID-19 travel restrictions by state: What you need to know before you travel
More: CDC recommends that Americans don't travel for Thanksgiving
Tags: usa today
Dallas Cowboys cancel practice due to non-COVID-19 emergency
Donald Trump tweets bizarre rants by ex-fugitive Randy Quaid
What is bologna sandwich meat made of?
Norwegian, Royal Caribbean, Carnival cancel more cruises into spring
Can't find toilet paper? Here's where it's still in stock right now
Coronavirus UK: Sussex and Herefordshire cases soar as Tiers decided
Giuliani caught with 'Borat's daughter' with hand down his pants
Watch … that's why McDonald's puts advanced cameras in its rubbish bins
Adama Traore 'ready to sign new £100,000-a-week deal with Wolves'
Coronavirus UK: Does your face cream reek of rotting rubbish? It's probably Covid!
Where to buy celebrity-approved winter coats: Canada Goose, The North Face, and more
Lake Placid Wizard 400 Boys Adjustable Ice Skate
Ethereum (ETH) price advances further to hit new record highs above $1,400. Here's what's next
facebook.com Refugee camps in SyriaFollow RT on The non-governmental organization "Save the Children" reported that torrential...


An eternal classic. A beautifully shaped heart pendant fully set with rubies and edged with diamonds in 18 carat gold. Heritage design and making details show in the openwork bright setting and curved accents of this heart pendant necklace. An archive inspired Daou design. White Gold solid 18k Rubies and Diamonds Chain 18inch, 45cm or 16 in 40 cm on request Pendant measures 1.7cm wide, 2.5cm long.