text:
Fallout from Carillion Collapse Hits KPMG
by Don Quijones • Jan 27, 2018 • 44 Comments
Next Arthur Andersen? No, the "Final Four" audit firms are "too big to replace."
By Don Quijones, Spain, UK, & Mexico, editor at WOLF STREET.
As the rubble from the financial collapse of British infrastructure giant Carillion gradually settles, two powerful parliamentary panels are piling pressure on the world's biggest audit firms to disclose the full extent of their involvement with the company. The big four auditors — Deloitte, Ernst & Young (EY), KPMG, and PricewaterhouseCoopers (PwC) — have received letters from the Business and Work and Pensions select committees demanding that they reveal all the work they carried out for Carillion since 2008.
The move comes amid growing concern around the world about the power of the so-called Big Four — down from the Big Five after Arthur Andersen imploded in the wake of the Enron scandal — and the potential conflicts of interest that can arise between their myriad roles.
A case in point: when Spanish authorities tried to roll seven failed or failing Spanish saving banks into Bankia in 2011, Deloitte was hired not just as Bankia's auditor but also the consultant responsible for formulating its accounts, in complete contravention of the basic concept of auditor independence. Deloitte (together with Spain's market regulators) then confirmed in Bankia's IPO prospectus that the newly born franken-bank was profitable and in sound financial health. It was a blatant lie. Bankia collapsed within less than a year of its IPO. Shareholders ended up losing billions and were later reimbursed by Spanish taxpayers.
In the case of Carillion, all four of the Big Four provided services of some kind or another to the now defunct company, but it was Dutch-seated KPMG that signed off on its accounts. This it did without fail, even in early 2017 when it was clear that Carillion had wafer-thin profit margins and was dangerously overloaded with debt, including £2.6 billion worth of pension liabilities. Between 2012 and 2016 Carillion ran up debts and sold assets just to continue paying out dividends to shareholders.
Yet in Carillion's last ever annual report, KPMG approved Carillion's viability statement, certifying it as strong enough to survive for "at least three more years." Within less than three months, Carillion's management was forced to admit it had significantly overestimated revenues, cash and assets, prompting a stunning stock market meltdown from which it would never recover.
A scathing letter to the Financial Times this week called for Carillion's directors and KPMG to be investigated for the company's collapse. Martin White, of the UK Shareholders Association, and Natasha Landell-Mills, of Sarasin & Partners, wrote:
"Although fingers are being pointed in all directions, most are missing the real culprit: faulty accounts appear to have allowed Carillion to overstate profits and capital, thereby permitting them to load up on debt while paying out cash dividends and bonuses."
All of it on KPMG's watch.
Carillion's collapse bears a striking resemblance to the dramatic demise of Spanish green energy giant, Abengoa, in 2016. For three years, the auditor, Deloitte again, failed to spot (or at least report) any of the glaring irregularities on Abengoa's financial statements. By contrast, Pepe Baltá, a 17-year old student in Barcelona who chose Abengoa as the subject of his high school economics project, noticed serious flaws in the company's accounting — a full year before Deloitte's auditors finally blew the whistle. "The big surprise was that negative profits were being converted into positives," Baltá told the Spanish daily El Mundo.
Yet each time a new corporate scandal or collapse exposes the failings, abuses or conflicts of interest of one of the big four accounting firms, a dainty slap on the wrist is the inevitable punishment. When Deloitte was found to have "seriously" infringed Spain's auditing laws by ignoring at least a dozen glaring errors and irregularities in Bankia's accounts prior to its IPO, the auditor was fined a paltry €12 million by Spanish authorities.
The problem is that the Big Four are simply too big. Having extended their tentacles into just about every facet of business administration, from accountancy to auditing, to legal and tax consultancy, while wiping out or gobbling up all their smaller rivals, the big four firms have grown horrendously large and conflicted, says British financial journalist Ian Fraser.
In the US, the Big Four audit 497 of the 500 S&P 500 companies. In the UK, the Big Four audit 99 of the FTSE 100 companies. In the vast majority of EU Member States, the combined market share of the Big Four audit firms for listed companies exceeds 90%. In Spain, all IBEX 35 companies are audited by the Big Four. Their global annual revenues have reached $134 billion in 2017.
This perfect oligopoly poses a major problem, not just for companies looking for alternatives but also for governments. "These giant firms are… virtually unassailable and are now called the 'Final Four'," says Fraser. "There's a fear in government that you can't allow one of these companies to fail because if there's only three left, there will be even less competition in the sector… and even more of an oligopoly. As such, government is almost being held to ransom around the world by these big four firms."
In other words, the Big Four, the self-anointed guardians of fiduciary responsibility and probity at the world's biggest companies and banks, are not just woefully compromised and conflicted; they have grown too big to replace. And doling out petty fines for bad behavior each time they're caught out is not going to change that. By Don Quijones.
At "the company that runs Britain," profits were privatized, costs will be socialized. Read… Collapse of Construction Giant with 43,000 Employees Globally Sparks Fear and Mayhem
Tags:Big Four audit firms Carillion KPMG
← End of the 9-Year Rental Housing Boom?
Bond Market's "Inflation Expectations" Highest since 2014 →
44 comments for "Fallout from Carillion Collapse Hits KPMG"
There's an alternative to the Arthur Anderson solution for this problem. Senior management has no skin in the game for these auditing failures. Change that with perhaps some jail time for the top dogs overseeing these egregious failures. Underlings might be a little more diligent with their work. As it is now underlings don't want to be responsible for loss of business so they roll over and play dead when they see a problem like those discussed.
economicminor says:
Great piece! Thank you!
The real risk underlying all the above is that these FOUR and their unaccountability puts the entire world's economy in jeopardy. What IF most large corporations are really in no better shape than Carillion?
How close are we to a total devastating collapse?
What's that high school kid doing now? Maybe we need him to lead a team to diagnose all the major corporations and tell the public what kind of condition we are really in..
First things First.. First you must know the true facts before a problem can be analyzed.. Then solutions can be discussed. Seems to me we don't even know the facts.
What else could one expect when the "democracy" you were taught to believe in as a child turns out to be nothing but a totalitarian oligarchy?
All the ratings agencies are nothing but "ladies of the night" for the War Party Of The Rich. One party in America, folks. That's the truth.
Nick Kelly says:
To think we lost budding financial genius M.Balta to medicine of all fields.
Think of the short seller he might have become!
Tom T says:
no evidence he was/is a financial genius just like the old tale … a child saying "look mommy, the emperor has no clothes."
So he moves on with his life and seeks M.Diety status instead of an economist … who could blame him?
What seems to me to be M.Balta's unique characteristic is his possession of integrity, at least until he is licensed to practice medicine
Auditors are payed to look the other way. 'twas always so.
Debit, expense or asset, expense or asset????
gorbachov says:
Holy Toledo ,this is unnerving.I had no idea of the scale of this.
Thanks very much for this article.
I think KPMG is also taking heat for the sudden $6B insurance write-off at GE.
The big problem is that companies can switch audit firms at will. They use this as leverage against the auditors. Plus, some companies put caps on audit fees, which unreasonably shrinks the audit procedures.
I don't feel sorry for them though. The partners of accounting firms are overly greedy and think short term. They always seek to do the bare minimum to fund their outrageous pay checks. I hear partner rates are now $1000 to $1500 per hour. Ridiculous. A trip to the bathroom will cost you $500. Small talk before a meeting will cost you $1,000 to $5,000.
But firm can't really switch too often. If they switch one firm out and then two years later changer auditors again, it will look bad for the firm, rather than the auditors. And even if they do switch, it will wind up with one of three other firms.
Ambrose Bierce says:
Is it true that most of the accounting practices at Enron are now commonplace in finance
BTilles says:
No, not even remotely.
Mr. Bierce;
When a dispatcher moves his lips he is telling you BS right? BTilles is a dispatcher.
Gershon says:
Fraud has become endemic in our neoliberal crony capitalist wonderlands, with accounting firms just as crooked as our captured regulators and enforcers. It makes you wonder at the magnitude of the fraud and fictitious valuations still waiting to come to light.
In this context, it might help to think of accounting firms like lawyers for the mob. Occasionally they get "way too close" and cross the line. Unfortunately for investors we have to figure that out long before the lawsuits and indictments begin.
So >>>>> Fraud, Smoke and Mirrors, Level 3 and a few Opioids thrown in with a whole lot of exuberance from the speculating elitists. Not only is there no valid price discovery, there is no way to value anything anymore.
Yeah, things will work out.
By contrast, Pepe Baltá, a 17-year old student in Barcelona who chose Abengoa as the subject of his high school economics project, noticed serious flaws in the company's accounting — a full year before Deloitte's auditors finally blew the whistle.
A modern-day take on "The Emperor's New Clothes." Maybe young Baltá, whose generation has no future under the Oligopoly, could be pressed into service as an auditor when post-collapse tribunals finally bring these fraudsters and their enablers to justice.
'Growing concern' about the big four..?
Private Eye magazine has been covering the accounting cartel and its complicity in corporate malfeasance since way before the 2008 crash.
Also there are 'non exec' directors who are PAID – handsomely – by the stockholders of the company to sit on the board and exercise oversight – once again it appears they have been about as effective as a chocolate teapot.
It seems the 'non exec' thing is just a cosy CFP (Club For Pals) – a way for friends of the directors to pick up a nice easy payday – and do nothing apart from be a 'yes (wo)man'.
Strangely, Carillion appears to have appointed two new ones just before Xmas.
This whole thing stinks like a rotting fish TBH.
Neoliberalism – cutting up your country and turning it over to 'club members' for 40 years.
What a bankrupt ideology.
george mcduffee says:
Some random observations:
#1	Governments are shirking their responsibilities to provide meaningful oversight/control of their largest corporations, and are outsourcing this to private organizations, the auditing companies, with no enforcement powers. Indeed, if any "bad news" is discovered and disclosed to the public, legal action for libal and slander may follow, and at the very least the client will be lost, costing the auditing company for doing their job.
#2	It is possible the long-term "frauds" which bankupted the client companies could have been so well concealed that these were not detected by the normal audit procedures. That is the numbers added up but were meaningless or misleading.
#3	Another possibility is that the bankrupt company was indeed a "going concern" at the time of the audit, but was "stripped" starting the day after the audit. A version of this is to "swap" good assets among companies so that a company appears solvent at the time of the audit, in effect counting the same good asset multiple times.
#4	While I am reluctant to suggest an expansion of government, it appears necessary to establish a "Bureau of Audit Verification" to select at random selected [mega] company operations which have just been audited, and conduct an in-depth forensic audit from the board room/ledger all the way down to physical verification of the asset by on site inspection. In effect statistical quality control of the audit process. Some version of MilSpec 105D will be needed to establish the level at which a full forensic audit, including the IRS and SEC, of the entire company would be triggered. When such a governmental "super" audit is triggered, long prison sentences and forfeiture of assets by the accountable people should be expected.
#5	The auditing "rules" appear to be in fact auditing "suggestions," and need to be overtly defined to allow comparison across companies. An examination of the corporate bankrptcy filings over the last 50 years or so should establish the maximum safe debt levels v free cash flow, and other critical metrics, which the auditors mst apply, and notify the public/government when these limits have been reached, even though the company is still technically still solvent. Indeed, it may be helpful to require the companies themselves to notify the "Bureau of Audit Verification" when the critical operating metric limits are exceeded.
Raymond Rogers says:
Solid observation.
How have you succeeded in remaining so idealistic? There does come a time when optimism impedes good judgement. But good ideas Sir.
bev kennedy says:
The canadian arm of Carrillion has also imploded. So why would the canadian government simply assume none of our bug pension funds are perhaps somewhat splashed by this? Aside from surely this is a systemic risk that needs to be vetted but has not been.
cdr says:
Blaming the CPA firm is a calculation. It provides a deflection from the joint and several liability from others while also providing a scapegoat for investors and lenders who should have known better.
CPA opinions are legally hedged. Complain all you want. Only a sympathetic court/jury and a bad defense lawyer can offset that and the appeal will even the odds. Unless there's a shredding machine or worse involved, CPA opinions are highly defendable. The best offense is skilled whining.
The annual audit is not a guarantee of any kind except that the review was performed according to appropriate standards, appropriate tests were made, management and controls said/did the right things except as noted, and things look reasonably OK. Publicly traded companies follow a much higher standard than not publicly traded companies, but overall there's not a lot of difference.
The going concern exception is the only out investors have here and that's their burden of proof, assuming the opinion stated no issues there and problems were more obvious than a 1 inch pimple on someone's nose and should have been discoverable if GAAP was correctly applied.
Rates says:
What do you expect from KPMG? It's short for Klepto and Plutocrats Management Group.
Petedivine says:
I thought it was well known that Carillion was in bad financial straits. Funny since Carillion was mainly a government contractor. What I find interesting is that the same government finds it untenable that they could have low bid Carillion into the grave and now they need to blame the book keeper. At the end of the day… as a society we just can't handle the truth.
Petedivine, You make an assumption not born out by facts.. You assume the cause was low bid. More likely that it was greed by those who could rather than the government making a contractor who held so much leverage over that government even bidding.. without back door funding.. Not likely in this world. Still my assumptions.. all we really know is that it went under and some are blaming the auditors because they should have known it far in advance.
" all we really know is that it went under and some are blaming the auditors because they should have known it far in advance."
What is it that you think auditors do? I suspect it bears no relationship to what they actually do. What specific fraud did they cover up? Were the footnotes to the financial statement wrong? Were the accounts misstated materially? What is the purpose of the financial statements and GAAP, or the euro version of it?
Also, management created the financial statements, not the auditors. Always. Every public company.
Agreed, management first.
It seems clear mgmt is at fault. I can't tell about the auditors though it doesn't look good . . . how do auditors evaluate "intangibles" for a company which does business with a gov't and doesn't have a consumer-facing brand?
You have a point, that the Private contract Auditors, only inspect what is presented to them.
A bit like the Eu Reviewing the greek application to join the Euro.
Some if not all of the EU officials must have known what was written on the paper before them. Bore very little relationship to what was under the rug in Athens.
However said papers had been signed off, by Auditors.
In a better world. Publicly listed companies would have to pass an audit, by the exchanges they list with. Which would make the exchanges, culpable for the audits. Which would immediately make the audits, much more INTRUSIVE.
This company borrowed money and sold assets in order to pay its dividend from 2012 to 2016.
This should have been illegal (U.K. law) except they booked profits they hadn't made which made it appear they were paying the dividends from reserves. This is accounting fraud like Enron. The finance people in the company must have known the game they were playing.
https://www.ft.com/content/f5bbf3a2-01e0-11e8-9650-9c0ad2d7c5b5
Steve clayton says:
Exactly I know one government contract Carillion pulled out of in October. The warning signs were there then and had been for at least a year.
It's no surprise that a 17 year old bested them. In 2006, I prediced the ban;krutcy of general motors. The hard part is timing. Within the next three years, UPS will belly up. None of the big four is predicting that.
"It's no surprise that a 17 year old bested them. In 2006, I prediced the ban;krutcy of general motors. The hard part is timing"
AS Meredith Whitney showed us over Munis.
Top-GUN says:
George McDuffie suggests maybe we should have a government organization overlook the auditors,,,
If that organization was created the first thing they should look at is government pension funds..
Calpers has one percent cash on hand.
Adrian Smith says:
If regulators targeted the individual auditors etc who were responsible for the failure, having no doubt accepted various forms of "hospitality" from their clients in the process, rather than the firms themselves. Giving big fines to the individuals and striking them off professional registers things would change very rapidly.
We must also remember that auditors, who are supposed to work for shareholders, are checking the work of directors. Sam Antar is very clear on how easy it is to fool an auditor. The directors need to be subject to the same individual sanctions as the auditors. Fining firms whether it is the firm being audited or the auditors just punishes the shareholders of those firms, if there are no effective individual sanctions.
Both the audit committee and the remuneration committee of all public firms should be chaired and run but appointed shareholders, who have no connection to the board. Directors should just be providing evidence and secretarial service to those committees.
Do these thing and things will change rapidly across the piece for the good of everyone.
Alessio says:
The real issue is that these companies are paid by the same firms that they audit.
We need to abolish the legal requirement to be externally audited a it's useless.
KPMG have also been implicated in possible collusion with Zuma and the Gupta family in South Africa. Taxpayers' money seems to have been systematically siphoned off over years and no-one seems to know where the Guptas have slithered off to.
Pink Flamingo says:
One of the problems is that these large corporations no longer have any moral compass or any basic ethical practices.
MASTER OF UNIVERSE says:
KPMG was wholeheartedly responsible for the entire 08 crash, and they used Iceland to do it. Without the overarching imprimatur of KPMGs auditors, accountants, and managers, Iceland would never have been set up as the patsy for the central banking implosions that manifested all over the entire world. KPMG knew exactly what they were doing when they coerced all the central bankers in Iceland to join their ruse.
See Inside Job
P.S. Let KPMG fall next to Arthur Anderson's Chapter 11 gravesite, and then tell everyone on ZH so they will urinate on it for posterity sake.
Kiers says:
Here's a nice article explaining how both financial markets and British Gov rules coincided to help keep stuff off balance. Worth a read (pinch and zoom please)
https://ibb.co/jd7dPR
Dale Holmgren says:
I guarantee you if I took one look at either company's balance sheet, it would not take an auditor to be alarmed at what thin ice the company is on. Stop blaming the auditor – when you see debt to capital ratios exceeding .3, and as an investor you don't run away, you are complicit in your own gambling. Stop buying leveraged companies – they are gambling with debt to juice returns to lure you in. Solid companies only use debt sparingly.


SolidEssay.com is ready to deal with general aspects involved in the process of writing an argumentative essay. The essay consists of traditional academic introduction, a principal body, which provides a general vision, a structure that defines and helps develop the argument, and the conclusion in which all the elements are assembled. Yet, we understand that to write an argumentative essay, it takes more than to know that it consists of three parts.
To deal with writing argumentative essays solutions, as in other academic works, it is required to learn the use of a formal language by means of the use of the grammatical norm and punctuation. Writing and grammar cannot be separated. Writing is an essential element in the majority of the university courses and the work of the students it is to write. Writing is a way to explore. We understand that students need to learn to discover the real meaning of what is being studied.
We deliver papers that are a combination of the best thoughts. It is like a presentation of ideas in a logical sequence. Through consistency, we avoid the contradiction of related ideas of the same object, until exceptions have been established. Clarity will help the reader understand. While ordering from us, you are ensuring a good grade. Your teacher will be impressed. We will not enter the redundancy, plus everything is organized properly.
A "write argumentative essay" request is taken seriously. Every essay must be written and presented well and adapted for the subjects that are needed. Every description is developed on scientific questions and natural phenomena. Every aspect comes from a basis of any matter that may turn into artistic intention, the fantasy and the imagination uses. It is a way in which the character and author reveal, but we take care of your personal style and requests.
In short, the essay can go from the descriptive thing to the interpretation of the question and can express the sensibility. In the case of an argumentative paper, we will deal with every step to ensure 100% satisfaction.
At SolidEssay.com we understand this characteristic can change, depending on the purpose the author and the subject in question. You may know that there are short and brief argumentative essays and of average length. Despite your needs, we understand this is a reflection. Our writers deal with ideas that are intertwined in an organized manner to give a composition. We divide internal logic and deliver the best "write argumentative essay" solution. Get a precise and clear essay on the topic you need!


text:
describe('timepicker directive', function () {
  var $rootScope, $compile, element;

  beforeEach(module('ui.bootstrap.timepicker'));
  beforeEach(module('template/timepicker/timepicker.html'));
  beforeEach(inject(function(_$compile_, _$rootScope_) {
    $compile = _$compile_;
    $rootScope = _$rootScope_;
    $rootScope.time = newTime(14, 40);

    element = $compile('<timepicker ng-model="time"></timepicker>')($rootScope);
    $rootScope.$digest();
  }));

  function newTime(hours, minutes) {
    var time = new Date();
    time.setHours(hours);
    time.setMinutes(minutes);
    return time;
  }

  function getTimeState(withoutMeridian) {
    var inputs = element.find('input');

    var state = [];
    for (var i = 0; i < 2; i ++) {
      state.push(inputs.eq(i).val());
    }
    if ( withoutMeridian !== true ) {
      state.push( getMeridianButton().text() );
    }
    return state;
  }

  function getModelState() {
    return [ $rootScope.time.getHours(), $rootScope.time.getMinutes() ];
  }

  function getArrow(isUp, tdIndex) {
    return element.find('tr').eq( (isUp) ? 0 : 2 ).find('td').eq( tdIndex ).find('a').eq(0);
  }

  function getHoursButton(isUp) {
    return getArrow(isUp, 0);
  }

  function getMinutesButton(isUp) {
    return getArrow(isUp, 2);
  }

  function getMeridianButton() {
    return element.find('button').eq(0);
  }

  function doClick(button, n) {
    for (var i = 0, max = n || 1; i < max; i++) {
      button.click();
      $rootScope.$digest();
    }
  }

  function wheelThatMouse(delta) {
    var e = $.Event('mousewheel');
    e.wheelDelta = delta;
    return e;
  }

  function wheelThatOtherMouse(delta) {
    var e = $.Event('wheel');
    e.deltaY = delta;
    return e;
  }

  function keydown(key) {
    var e = $.Event('keydown');
    switch(key) {
      case 'left':
        e.which = 37;
        break;
      case 'up':
        e.which = 38;
        break;
      case 'right':
        e.which = 39;
        break;
      case 'down':
        e.which = 40;
        break;
    }
    return e;
  }

  it('contains three row & three input elements', function() {
    expect(element.find('tr').length).toBe(3);
    expect(element.find('input').length).toBe(2);
    expect(element.find('button').length).toBe(1);
  });

  it('has initially the correct time & meridian', function() {
    expect(getTimeState()).toEqual(['02', '40', 'PM']);
    expect(getModelState()).toEqual([14, 40]);
  });

  it('has `selected` current time when model is initially cleared', function() {
    $rootScope.time = null;
    element = $compile('<timepicker ng-model="time"></timepicker>')($rootScope);
    $rootScope.$digest();

    expect($rootScope.time).toBe(null);
    expect(getTimeState()).not.toEqual(['', '', '']);
  });

  it('changes inputs when model changes value', function() {
    $rootScope.time = newTime(11, 50);
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['11', '50', 'AM']);
    expect(getModelState()).toEqual([11, 50]);

    $rootScope.time = newTime(16, 40);
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '40', 'PM']);
    expect(getModelState()).toEqual([16, 40]);
  });

  it('increases / decreases hours when arrows are clicked', function() {
    var up = getHoursButton(true);
    var down = getHoursButton(false);

    doClick(up);
    expect(getTimeState()).toEqual(['03', '40', 'PM']);
    expect(getModelState()).toEqual([15, 40]);

    doClick(down);
    expect(getTimeState()).toEqual(['02', '40', 'PM']);
    expect(getModelState()).toEqual([14, 40]);

    doClick(down);
    expect(getTimeState()).toEqual(['01', '40', 'PM']);
    expect(getModelState()).toEqual([13, 40]);
  });

  it('increase / decreases minutes by default step when arrows are clicked', function() {
    var up = getMinutesButton(true);
    var down = getMinutesButton(false);

    doClick(up);
    expect(getTimeState()).toEqual(['02', '41', 'PM']);
    expect(getModelState()).toEqual([14, 41]);

    doClick(down);
    expect(getTimeState()).toEqual(['02', '40', 'PM']);
    expect(getModelState()).toEqual([14, 40]);

    doClick(down);
    expect(getTimeState()).toEqual(['02', '39', 'PM']);
    expect(getModelState()).toEqual([14, 39]);
  });

  it('meridian button has correct type', function() {
    var button = getMeridianButton();
    expect(button.attr('type')).toBe('button');
  });

  it('toggles meridian when button is clicked', function() {
    var button = getMeridianButton();

    doClick(button);
    expect(getTimeState()).toEqual(['02', '40', 'AM']);
    expect(getModelState()).toEqual([2, 40]);

    doClick(button);
    expect(getTimeState()).toEqual(['02', '40', 'PM']);
    expect(getModelState()).toEqual([14, 40]);

    doClick(button);
    expect(getTimeState()).toEqual(['02', '40', 'AM']);
    expect(getModelState()).toEqual([2, 40]);
  });

  it('has minutes "connected" to hours', function() {
    var up = getMinutesButton(true);
    var down = getMinutesButton(false);

    doClick(up, 10);
    expect(getTimeState()).toEqual(['02', '50', 'PM']);
    expect(getModelState()).toEqual([14, 50]);

    doClick(up, 10);
    expect(getTimeState()).toEqual(['03', '00', 'PM']);
    expect(getModelState()).toEqual([15, 0]);

    doClick(up, 10);
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['03', '10', 'PM']);
    expect(getModelState()).toEqual([15, 10]);

    doClick(down, 10);
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['03', '00', 'PM']);
    expect(getModelState()).toEqual([15, 0]);

    doClick(down, 10);
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['02', '50', 'PM']);
    expect(getModelState()).toEqual([14, 50]);
  });

  it('has hours "connected" to meridian', function() {
    var up = getHoursButton(true);
    var down = getHoursButton(false);

    // AM -> PM
    $rootScope.time = newTime(11, 0);
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['11', '00', 'AM']);
    expect(getModelState()).toEqual([11, 0]);

    doClick(up);
    expect(getTimeState()).toEqual(['12', '00', 'PM']);
    expect(getModelState()).toEqual([12, 0]);

    doClick(up);
    expect(getTimeState()).toEqual(['01', '00', 'PM']);
    expect(getModelState()).toEqual([13, 0]);

    doClick(down);
    expect(getTimeState()).toEqual(['12', '00', 'PM']);
    expect(getModelState()).toEqual([12, 0]);

    doClick(down);
    expect(getTimeState()).toEqual(['11', '00', 'AM']);
    expect(getModelState()).toEqual([11, 0]);

    // PM -> AM
    $rootScope.time = newTime(23, 0);
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['11', '00', 'PM']);
    expect(getModelState()).toEqual([23, 0]);

    doClick(up);
    expect(getTimeState()).toEqual(['12', '00', 'AM']);
    expect(getModelState()).toEqual([0, 0]);

    doClick(up);
    expect(getTimeState()).toEqual(['01', '00', 'AM']);
    expect(getModelState()).toEqual([01, 0]);

    doClick(down);
    expect(getTimeState()).toEqual(['12', '00', 'AM']);
    expect(getModelState()).toEqual([0, 0]);

    doClick(down);
    expect(getTimeState()).toEqual(['11', '00', 'PM']);
    expect(getModelState()).toEqual([23, 0]);
  });

  it('changes only the time part when hours change', function() {
    $rootScope.time = newTime(23, 50);
    $rootScope.$digest();

    var date =  $rootScope.time.getDate();
    var up = getHoursButton(true);
    doClick(up);

    expect(getTimeState()).toEqual(['12', '50', 'AM']);
    expect(getModelState()).toEqual([0, 50]);
    expect(date).toEqual($rootScope.time.getDate());
  });

  it('changes only the time part when minutes change', function() {
    element = $compile('<timepicker ng-model="time" minute-step="15"></timepicker>')($rootScope);
    $rootScope.time = newTime(0, 0);
    $rootScope.$digest();

    var date =  $rootScope.time.getDate();
    var up = getMinutesButton(true);
    doClick(up, 2);
    expect(getTimeState()).toEqual(['12', '30', 'AM']);
    expect(getModelState()).toEqual([0, 30]);
    expect(date).toEqual($rootScope.time.getDate());

    var down = getMinutesButton(false);
    doClick(down, 2);
    expect(getTimeState()).toEqual(['12', '00', 'AM']);
    expect(getModelState()).toEqual([0, 0]);
    expect(date).toEqual($rootScope.time.getDate());

    doClick(down, 2);
    expect(getTimeState()).toEqual(['11', '30', 'PM']);
    expect(getModelState()).toEqual([23, 30]);
    expect(date).toEqual($rootScope.time.getDate());
  });

  it('responds properly on "mousewheel" events', function() {
    var inputs = element.find('input');
    var hoursEl = inputs.eq(0), minutesEl = inputs.eq(1);
    var upMouseWheelEvent = wheelThatMouse(1);
    var downMouseWheelEvent = wheelThatMouse(-1);

    expect(getTimeState()).toEqual(['02', '40', 'PM']);
    expect(getModelState()).toEqual([14, 40]);

    // UP
    hoursEl.trigger( upMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['03', '40', 'PM']);
    expect(getModelState()).toEqual([15, 40]);

    hoursEl.trigger( upMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '40', 'PM']);
    expect(getModelState()).toEqual([16, 40]);

    minutesEl.trigger( upMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '41', 'PM']);
    expect(getModelState()).toEqual([16, 41]);

    minutesEl.trigger( upMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '42', 'PM']);
    expect(getModelState()).toEqual([16, 42]);

    // DOWN
    minutesEl.trigger( downMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '41', 'PM']);
    expect(getModelState()).toEqual([16, 41]);

    minutesEl.trigger( downMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '40', 'PM']);
    expect(getModelState()).toEqual([16, 40]);

    hoursEl.trigger( downMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['03', '40', 'PM']);
    expect(getModelState()).toEqual([15, 40]);

    hoursEl.trigger( downMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['02', '40', 'PM']);
    expect(getModelState()).toEqual([14, 40]);
  });

  it('responds properly on "wheel" events', function() {
    var inputs = element.find('input');
    var hoursEl = inputs.eq(0), minutesEl = inputs.eq(1);
    var upMouseWheelEvent = wheelThatOtherMouse(-1);
    var downMouseWheelEvent = wheelThatOtherMouse(1);

    expect(getTimeState()).toEqual(['02', '40', 'PM']);
    expect(getModelState()).toEqual([14, 40]);

    // UP
    hoursEl.trigger( upMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['03', '40', 'PM']);
    expect(getModelState()).toEqual([15, 40]);

    hoursEl.trigger( upMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '40', 'PM']);
    expect(getModelState()).toEqual([16, 40]);

    minutesEl.trigger( upMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '41', 'PM']);
    expect(getModelState()).toEqual([16, 41]);

    minutesEl.trigger( upMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '42', 'PM']);
    expect(getModelState()).toEqual([16, 42]);

    // DOWN
    minutesEl.trigger( downMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '41', 'PM']);
    expect(getModelState()).toEqual([16, 41]);

    minutesEl.trigger( downMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '40', 'PM']);
    expect(getModelState()).toEqual([16, 40]);

    hoursEl.trigger( downMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['03', '40', 'PM']);
    expect(getModelState()).toEqual([15, 40]);

    hoursEl.trigger( downMouseWheelEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['02', '40', 'PM']);
    expect(getModelState()).toEqual([14, 40]);
  });

  it('responds properly on "keydown" events', function() {
    var inputs = element.find('input');
    var hoursEl = inputs.eq(0), minutesEl = inputs.eq(1);
    var upKeydownEvent = keydown('up');
    var downKeydownEvent = keydown('down');
    var leftKeydownEvent = keydown('left');

    expect(getTimeState()).toEqual(['02', '40', 'PM']);
    expect(getModelState()).toEqual([14, 40]);

    // UP
    hoursEl.trigger( upKeydownEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['03', '40', 'PM']);
    expect(getModelState()).toEqual([15, 40]);

    hoursEl.trigger( upKeydownEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '40', 'PM']);
    expect(getModelState()).toEqual([16, 40]);

    minutesEl.trigger( upKeydownEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '41', 'PM']);
    expect(getModelState()).toEqual([16, 41]);

    minutesEl.trigger( upKeydownEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '42', 'PM']);
    expect(getModelState()).toEqual([16, 42]);

    // DOWN
    minutesEl.trigger( downKeydownEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '41', 'PM']);
    expect(getModelState()).toEqual([16, 41]);

    minutesEl.trigger( downKeydownEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['04', '40', 'PM']);
    expect(getModelState()).toEqual([16, 40]);

    hoursEl.trigger( downKeydownEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['03', '40', 'PM']);
    expect(getModelState()).toEqual([15, 40]);

    hoursEl.trigger( downKeydownEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['02', '40', 'PM']);
    expect(getModelState()).toEqual([14, 40]);

    // Other keydown
    hoursEl.trigger( leftKeydownEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['02', '40', 'PM']);
    expect(getModelState()).toEqual([14, 40]);

    minutesEl.trigger( leftKeydownEvent );
    $rootScope.$digest();
    expect(getTimeState()).toEqual(['02', '40', 'PM']);
    expect(getModelState()).toEqual([14, 40]);
  });

  describe('attributes', function () {
    beforeEach(function() {
      $rootScope.hstep = 2;
      $rootScope.mstep = 30;
      $rootScope.time = newTime(14, 0);
      element = $compile('<timepicker ng-model="time" hour-step="hstep" minute-step="mstep"></timepicker>')($rootScope);
      $rootScope.$digest();
    });

    it('increases / decreases hours by configurable step', function() {
      var up = getHoursButton(true);
      var down = getHoursButton(false);

      expect(getTimeState()).toEqual(['02', '00', 'PM']);
      expect(getModelState()).toEqual([14, 0]);

      doClick(up);
      expect(getTimeState()).toEqual(['04', '00', 'PM']);
      expect(getModelState()).toEqual([16, 0]);

      doClick(down);
      expect(getTimeState()).toEqual(['02', '00', 'PM']);
      expect(getModelState()).toEqual([14, 0]);

      doClick(down);
      expect(getTimeState()).toEqual(['12', '00', 'PM']);
      expect(getModelState()).toEqual([12, 0]);

      // Change step
      $rootScope.hstep = 3;
      $rootScope.$digest();

      doClick(up);
      expect(getTimeState()).toEqual(['03', '00', 'PM']);
      expect(getModelState()).toEqual([15, 0]);

      doClick(down);
      expect(getTimeState()).toEqual(['12', '00', 'PM']);
      expect(getModelState()).toEqual([12, 0]);
    });

    it('increases / decreases minutes by configurable step', function() {
      var up = getMinutesButton(true);
      var down = getMinutesButton(false);

      doClick(up);
      expect(getTimeState()).toEqual(['02', '30', 'PM']);
      expect(getModelState()).toEqual([14, 30]);

      doClick(up);
      expect(getTimeState()).toEqual(['03', '00', 'PM']);
      expect(getModelState()).toEqual([15, 0]);

      doClick(down);
      expect(getTimeState()).toEqual(['02', '30', 'PM']);
      expect(getModelState()).toEqual([14, 30]);

      doClick(down);
      expect(getTimeState()).toEqual(['02', '00', 'PM']);
      expect(getModelState()).toEqual([14, 0]);

      // Change step
      $rootScope.mstep = 15;
      $rootScope.$digest();

      doClick(up);
      expect(getTimeState()).toEqual(['02', '15', 'PM']);
      expect(getModelState()).toEqual([14, 15]);

      doClick(down);
      expect(getTimeState()).toEqual(['02', '00', 'PM']);
      expect(getModelState()).toEqual([14, 0]);

      doClick(down);
      expect(getTimeState()).toEqual(['01', '45', 'PM']);
      expect(getModelState()).toEqual([13, 45]);
    });

    it('responds properly on "mousewheel" events with configurable steps', function() {
      var inputs = element.find('input');
      var hoursEl = inputs.eq(0), minutesEl = inputs.eq(1);
      var upMouseWheelEvent = wheelThatMouse(1);
      var downMouseWheelEvent = wheelThatMouse(-1);

      expect(getTimeState()).toEqual(['02', '00', 'PM']);
      expect(getModelState()).toEqual([14, 0]);

      // UP
      hoursEl.trigger( upMouseWheelEvent );
      $rootScope.$digest();
      expect(getTimeState()).toEqual(['04', '00', 'PM']);
      expect(getModelState()).toEqual([16, 0]);

      minutesEl.trigger( upMouseWheelEvent );
      $rootScope.$digest();
      expect(getTimeState()).toEqual(['04', '30', 'PM']);
      expect(getModelState()).toEqual([16, 30]);

      // DOWN
      minutesEl.trigger( downMouseWheelEvent );
      $rootScope.$digest();
      expect(getTimeState()).toEqual(['04', '00', 'PM']);
      expect(getModelState()).toEqual([16, 0]);

      hoursEl.trigger( downMouseWheelEvent );
      $rootScope.$digest();
      expect(getTimeState()).toEqual(['02', '00', 'PM']);
      expect(getModelState()).toEqual([14, 0]);
    });

    it('responds properly on "wheel" events with configurable steps', function() {
      var inputs = element.find('input');
      var hoursEl = inputs.eq(0), minutesEl = inputs.eq(1);
      var upMouseWheelEvent = wheelThatOtherMouse(-1);
      var downMouseWheelEvent = wheelThatOtherMouse(1);

      expect(getTimeState()).toEqual(['02', '00', 'PM']);
      expect(getModelState()).toEqual([14, 0]);

      // UP
      hoursEl.trigger( upMouseWheelEvent );
      $rootScope.$digest();
      expect(getTimeState()).toEqual(['04', '00', 'PM']);
      expect(getModelState()).toEqual([16, 0]);

      minutesEl.trigger( upMouseWheelEvent );
      $rootScope.$digest();
      expect(getTimeState()).toEqual(['04', '30', 'PM']);
      expect(getModelState()).toEqual([16, 30]);

      // DOWN
      minutesEl.trigger( downMouseWheelEvent );
      $rootScope.$digest();
      expect(getTimeState()).toEqual(['04', '00', 'PM']);
      expect(getModelState()).toEqual([16, 0]);

      hoursEl.trigger( downMouseWheelEvent );
      $rootScope.$digest();
      expect(getTimeState()).toEqual(['02', '00', 'PM']);
      expect(getModelState()).toEqual([14, 0]);
    });

    it('can handle strings as steps', function() {
      var upHours = getHoursButton(true);
      var upMinutes = getMinutesButton(true);

      expect(getTimeState()).toEqual(['02', '00', 'PM']);
      expect(getModelState()).toEqual([14, 0]);

      $rootScope.hstep = '4';
      $rootScope.mstep = '20';
      $rootScope.$digest();

      doClick(upHours);
      expect(getTimeState()).toEqual(['06', '00', 'PM']);
      expect(getModelState()).toEqual([18, 0]);

      doClick(upMinutes);
      expect(getTimeState()).toEqual(['06', '20', 'PM']);
      expect(getModelState()).toEqual([18, 20]);
    });

  });

  describe('12 / 24 hour mode', function () {
    beforeEach(function() {
      $rootScope.meridian = false;
      $rootScope.time = newTime(14, 10);
      element = $compile('<timepicker ng-model="time" show-meridian="meridian"></timepicker>')($rootScope);
      $rootScope.$digest();
    });

    function getMeridianTd() {
      return element.find('tr').eq(1).find('td').eq(3);
    }

    it('initially displays correct time when `show-meridian` is false', function() {
      expect(getTimeState(true)).toEqual(['14', '10']);
      expect(getModelState()).toEqual([14, 10]);
      expect(getMeridianTd()).toBeHidden();
    });

    it('toggles correctly between different modes', function() {
      expect(getTimeState(true)).toEqual(['14', '10']);

      $rootScope.meridian = true;
      $rootScope.$digest();
      expect(getTimeState()).toEqual(['02', '10', 'PM']);
      expect(getModelState()).toEqual([14, 10]);
      expect(getMeridianTd()).not.toBeHidden();

      $rootScope.meridian = false;
      $rootScope.$digest();
      expect(getTimeState(true)).toEqual(['14', '10']);
      expect(getModelState()).toEqual([14, 10]);
      expect(getMeridianTd()).toBeHidden();
    });

    it('handles correctly initially empty model on parent element', function() {
      $rootScope.time = null;
      element = $compile('<span ng-model="time"><timepicker show-meridian="meridian"></timepicker></span>')($rootScope);
      $rootScope.$digest();

      expect($rootScope.time).toBe(null);
    });
  });

  describe('`meridians` attribute', function() {
    beforeEach(inject(function() {
      $rootScope.meridiansArray = ['am', 'pm'];
      element = $compile('<timepicker ng-model="time" meridians="meridiansArray"></timepicker>')($rootScope);
      $rootScope.$digest();
    }));

    it('displays correctly', function () {
      expect(getTimeState()[2]).toBe('pm');
    });

    it('toggles correctly', function () {
      $rootScope.time = newTime(2, 40);
      $rootScope.$digest();
      expect(getTimeState()[2]).toBe('am');
    });
  });

  describe('`readonly-input` attribute', function() {
    beforeEach(inject(function() {
      $rootScope.meridiansArray = ['am', 'pm'];
      element = $compile('<timepicker ng-model="time" readonly-input="true"></timepicker>')($rootScope);
      $rootScope.$digest();
    }));

    it('should make inputs readonly', function () {
      var inputs = element.find('input');
      expect(inputs.eq(0).attr('readonly')).toBe('readonly');
      expect(inputs.eq(1).attr('readonly')).toBe('readonly');
    });
  });

  describe('setting timepickerConfig steps', function() {
    var originalConfig = {};
    beforeEach(inject(function(_$compile_, _$rootScope_, timepickerConfig) {
      angular.extend(originalConfig, timepickerConfig);
      timepickerConfig.hourStep = 2;
      timepickerConfig.minuteStep = 10;
      timepickerConfig.showMeridian = false;
      element = $compile('<timepicker ng-model="time"></timepicker>')($rootScope);
      $rootScope.$digest();
    }));
    afterEach(inject(function(timepickerConfig) {
      // return it to the original state
      angular.extend(timepickerConfig, originalConfig);
    }));

    it('does not affect the initial value', function () {
      expect(getTimeState(true)).toEqual(['14', '40']);
      expect(getModelState()).toEqual([14, 40]);
    });

    it('increases / decreases hours with configured step', function() {
      var up = getHoursButton(true);
      var down = getHoursButton(false);

      doClick(up, 2);
      expect(getTimeState(true)).toEqual(['18', '40']);
      expect(getModelState()).toEqual([18, 40]);

      doClick(down, 3);
      expect(getTimeState(true)).toEqual(['12', '40']);
      expect(getModelState()).toEqual([12, 40]);
    });

    it('increases / decreases minutes with configured step', function() {
      var up = getMinutesButton(true);
      var down = getMinutesButton(false);

      doClick(up);
      expect(getTimeState(true)).toEqual(['14', '50']);
      expect(getModelState()).toEqual([14, 50]);

      doClick(down, 3);
      expect(getTimeState(true)).toEqual(['14', '20']);
      expect(getModelState()).toEqual([14, 20]);
    });
  });

  describe('setting timepickerConfig meridian labels', function() {
    var originalConfig = {};
    beforeEach(inject(function(_$compile_, _$rootScope_, timepickerConfig) {
      angular.extend(originalConfig, timepickerConfig);
      timepickerConfig.meridians = ['π.μ.', 'μ.μ.'];
      timepickerConfig.showMeridian = true;
      element = $compile('<timepicker ng-model="time"></timepicker>')($rootScope);
      $rootScope.$digest();
    }));
    afterEach(inject(function(timepickerConfig) {
      // return it to the original state
      angular.extend(timepickerConfig, originalConfig);
    }));

    it('displays correctly', function () {
      expect(getTimeState()).toEqual(['02', '40', 'μ.μ.']);
      expect(getModelState()).toEqual([14, 40]);
    });

    it('toggles correctly', function () {
      $rootScope.time = newTime(2, 40);
      $rootScope.$digest();

      expect(getTimeState()).toEqual(['02', '40', 'π.μ.']);
      expect(getModelState()).toEqual([2, 40]);
    });
  });

  describe('user input validation', function () {
    var changeInputValueTo;

    beforeEach(inject(function($sniffer) {
      changeInputValueTo = function (inputEl, value) {
        inputEl.val(value);
        inputEl.trigger($sniffer.hasEvent('input') ? 'input' : 'change');
        $rootScope.$digest();
      };
    }));

    function getHoursInputEl() {
      return element.find('input').eq(0);
    }

    function getMinutesInputEl() {
      return element.find('input').eq(1);
    }

    it('has initially the correct time & meridian', function() {
      expect(getTimeState()).toEqual(['02', '40', 'PM']);
      expect(getModelState()).toEqual([14, 40]);
    });

    it('updates hours & pads on input change & pads on blur', function() {
      var el = getHoursInputEl();

      changeInputValueTo(el, 5);
      expect(getTimeState()).toEqual(['5', '40', 'PM']);
      expect(getModelState()).toEqual([17, 40]);

      el.blur();
      expect(getTimeState()).toEqual(['05', '40', 'PM']);
      expect(getModelState()).toEqual([17, 40]);
    });

    it('updates minutes & pads on input change & pads on blur', function() {
      var el = getMinutesInputEl();

      changeInputValueTo(el, 9);
      expect(getTimeState()).toEqual(['02', '9', 'PM']);
      expect(getModelState()).toEqual([14, 9]);

      el.blur();
      expect(getTimeState()).toEqual(['02', '09', 'PM']);
      expect(getModelState()).toEqual([14, 9]);
    });

    it('clears model when input hours is invalid & alerts the UI', function() {
      var el = getHoursInputEl();

      changeInputValueTo(el, 'pizza');
      expect($rootScope.time).toBe(null);
      expect(el.parent().hasClass('has-error')).toBe(true);
      expect(element.hasClass('ng-invalid-time')).toBe(true);

      changeInputValueTo(el, 8);
      el.blur();
      $rootScope.$digest();
      expect(getTimeState()).toEqual(['08', '40', 'PM']);
      expect(getModelState()).toEqual([20, 40]);
      expect(el.parent().hasClass('has-error')).toBe(false);
      expect(element.hasClass('ng-invalid-time')).toBe(false);
    });

    it('clears model when input minutes is invalid & alerts the UI', function() {
      var el = getMinutesInputEl();

      changeInputValueTo(el, 'pizza');
      expect($rootScope.time).toBe(null);
      expect(el.parent().hasClass('has-error')).toBe(true);
      expect(element.hasClass('ng-invalid-time')).toBe(true);

      changeInputValueTo(el, 22);
      expect(getTimeState()).toEqual(['02', '22', 'PM']);
      expect(getModelState()).toEqual([14, 22]);
      expect(el.parent().hasClass('has-error')).toBe(false);
      expect(element.hasClass('ng-invalid-time')).toBe(false);
    });

    it('handles 12/24H mode change', function() {
      $rootScope.meridian = true;
      element = $compile('<timepicker ng-model="time" show-meridian="meridian"></timepicker>')($rootScope);
      $rootScope.$digest();

      var el = getHoursInputEl();

      changeInputValueTo(el, '16');
      expect($rootScope.time).toBe(null);
      expect(el.parent().hasClass('has-error')).toBe(true);
      expect(element.hasClass('ng-invalid-time')).toBe(true);

      $rootScope.meridian = false;
      $rootScope.$digest();
      expect(getTimeState(true)).toEqual(['16', '40']);
      expect(getModelState()).toEqual([16, 40]);
      expect(element.hasClass('ng-invalid-time')).toBe(false);
    });
  });

  describe('when model is not a Date', function() {
    beforeEach(inject(function() {
      element = $compile('<timepicker ng-model="time"></timepicker>')($rootScope);
    }));

    it('should not be invalid when the model is null', function() {
      $rootScope.time = null;
      $rootScope.$digest();
      expect(element.hasClass('ng-invalid-time')).toBe(false);
    });

    it('should not be invalid when the model is undefined', function() {
      $rootScope.time = undefined;
      $rootScope.$digest();
      expect(element.hasClass('ng-invalid-time')).toBe(false);
    });

    it('should not be invalid when the model is a valid string date representation', function() {
      $rootScope.time = 'September 30, 2010 15:30:00';
      $rootScope.$digest();
      expect(element.hasClass('ng-invalid-time')).toBe(false);
      expect(getTimeState()).toEqual(['03', '30', 'PM']);
    });

    it('should be invalid when the model is not a valid string date representation', function() {
      $rootScope.time = 'pizza';
      $rootScope.$digest();
      expect(element.hasClass('ng-invalid-time')).toBe(true);
    });

    it('should return valid when the model becomes valid', function() {
      $rootScope.time = 'pizza';
      $rootScope.$digest();
      expect(element.hasClass('ng-invalid-time')).toBe(true);

      $rootScope.time = new Date();
      $rootScope.$digest();
      expect(element.hasClass('ng-invalid-time')).toBe(false);
    });

    it('should return valid when the model is cleared', function() {
      $rootScope.time = 'pizza';
      $rootScope.$digest();
      expect(element.hasClass('ng-invalid-time')).toBe(true);

      $rootScope.time = null;
      $rootScope.$digest();
      expect(element.hasClass('ng-invalid-time')).toBe(false);
    });
  });

  describe('use with `ng-required` directive', function() {
    beforeEach(inject(function() {
      $rootScope.time = null;
      element = $compile('<timepicker ng-model="time" ng-required="true"></timepicker>')($rootScope);
      $rootScope.$digest();
    }));

    it('should be invalid initially', function() {
      expect(element.hasClass('ng-invalid')).toBe(true);
    });

    it('should be valid if model has been specified', function() {
      $rootScope.time = new Date();
      $rootScope.$digest();
      expect(element.hasClass('ng-invalid')).toBe(false);
    });
  });

  describe('use with `ng-change` directive', function() {
    beforeEach(inject(function() {
      $rootScope.changeHandler = jasmine.createSpy('changeHandler');
      $rootScope.time = new Date();
      element = $compile('<timepicker ng-model="time" ng-change="changeHandler()"></timepicker>')($rootScope);
      $rootScope.$digest();
    }));

    it('should not be called initially', function() {
      expect($rootScope.changeHandler).not.toHaveBeenCalled();
    });

    it('should be called when hours / minutes buttons clicked', function() {
      var btn1 = getHoursButton(true);
      var btn2 = getMinutesButton(false);

      doClick(btn1, 2);
      doClick(btn2, 3);
      $rootScope.$digest();
      expect($rootScope.changeHandler.callCount).toBe(5);
    });

    it('should not be called when model changes programatically', function() {
      $rootScope.time = new Date();
      $rootScope.$digest();
      expect($rootScope.changeHandler).not.toHaveBeenCalled();
    });
  });

});

redpajama_set_name: RedPajamaGithub


Which type of light therapy is right for you? BlueWave? Britewave? 10,000 lux Full Spectrum? What does it all mean and how do you decide? We will attempt to shed a little "light" on the subject.
10,000 Lux light therapy has been the most widely studied therapy and therefore, is currently the mostly widely prescribed therapy by physicians. Bluewave technology, however, is quickly becoming the new gold standard. This is due to the safety, convenience, reduced intensity, and overall effectiveness of Bluewave light. If you want the quicker treatment time of Bluewave but still prefer the bright sunlight of 10,000 lux, then Britewave technology may be the perfect fit for you. You could think of finding the right light box as helping you save money because, whether you use Aviva or Prudential Financial or any other life insurance company, you may find that mental health related claims are excluded from critical illness cover and income protection in many life insurance packages. Luckily light therapy has progressed a good deal recently, with many options for you to choose from.
In the early 90's Drs. Timo Partonen, Andreas Mangeson and colleagues in Finland reported on several studies comparing broad spectrum, non-UV, and full-spectrum non-UV light. Theirs and subsequent conclusions found equal efficacy between full-spectrum and broad-spectrum white light. However, because patients preferred the color that full-spectrum light produced, most light therapy products incorporated full spectrum technology.
In the following years, Dr. Michael Terman's Group at Columbia Presbyterian Medical College in New York began experimenting with different intensities of light. While most researchers were using light at lower levels for 2 -3 hours, Dr. Terman found that 10,000-lux broad-spectrum light yielded higher responses with only 30 minutes exposure. Since then, most published reports on light therapy recommend 10,000-lux light therapy.
Patent-pending Bluewave technology is the result of ten years of research with medical universities and the National Institutes of Health (NIH). Bluewave is significant because it provides a higher effective response than most full-spectrum light at 1/10th the intensity of traditional 10,000-lux light. That means you can get effective treatment in about half the time of traditional 10,000 lux light therapy.
The Bluewave technology has been safety-tested by optical safety experts. With Bluewave, light therapy is not only convenient but easier on the eyes with fewer side effects.
Although other light therapy products, including 10,000 lux boxes, contain blue light, the majority of their spectral energy is counterproductive. Eliminating these unnecessary wavelengths increases effectiveness and significantly reduces overall intensity.
Low-intensity blue light (470 nm) is twice as effective at shifting circadian rhythms and suppressing melatonin compared to 10,000 lux fluorescent and white LED-based products.
BLUEWAVE technology represents a technological leap in the evolution of light therapy. For the first time, we are able to isolate the specific bandwidths of light responsible for eliciting a therapeutic response. BLUEWAVE allows us to increase the effective bandwidths while significantly reducing the overall intensity of light. As a result, patients can enjoy a more comfortable and efficient therapy.
At the annual Society for Light Treatment and Biological Rhythms convention in May 2004, TMJU researchers reported their latest study using our BLUEWAVE technology. Not only were response and remission rates equivalent to standard 10,000-lux studies, but no side effects were reported from using BLUEWAVE .These findings were remarkable, especially considering that previous 10,000-lux light therapy studies had participants who experienced initial side effects ranging from nausea to headaches.
In addition, participants remarked that their therapy was more comfortable than 10,000-lux light therapy, and when given a choice, preferred using BLUEWAVE. Some patients who used 10,000-lux light therapy remarked that BLUEWAVE was 'easier' on their eyes. Under normal circumstances, light therapy studies expect some participant drop out, but the dropout rate with the BLUEWAVE study was far lower than normal. Researchers also noted that the participation rate unusual and encouraging.
When your body clock doesn't get the right type of light, it can make you feel tired and moody. But the right light at the right time will reset your sleep, mood, and energy cycles, so you can sleep better and feel great during waking hours. BRITEWAVE Technology safely and quickly provides the light your body needs.
Stimulates the production of the active hormone, serotonin.
What can you expect from BRITEWAVE technology?
Respond in a few days instead of weeks.
Reduced treatment time to 15 minutes/day.
Higher response rate with improved quality of response.
Feel more active during the day.
Greater freedom because of larger treatment fields with more portable units.
Why is BRITEWAVE superior to full-spectrum light?
Research has allowed us to go beyond standard full-spectrum technology. For example, we've learned that specific wavelengths are responsible for suppressing the withdrawal hormone melatonin, while other factors are responsible for resetting your body clock and producing the active hormone serotonin. As we've incorporated this technology, we've been able to greatly reduce treatment time while improving the quality of your response. Years ago, it took 2-3 hours to produce the response that takes only 15 minutes per day.
BLUEWAVE is different because it provides only the effective bandwidth of light. It is more effective than 10,000 lux full-spectrum light, and because of reduced intensity, it is easier on the eyes and causes fewer side effects. BLUEWAVE technology is also the most convenient to use.
BRITEWAVE combines 10,000-lux light with BLUEWAVE and is ideal for those who prefer bright sunlight, but also want the benefits of BLUEWAVE®. Both technologies are more effective than conventional full-spectrum light therapy, but because BRITEWAVE products produce larger treatment fields, they may also be considered for children or those with more severe symptoms.


Our Intention Bracelets feature the same vibrant Element-inspired designs and semi-precious stones as our 108 Bead Malas and Pocket Malas, but in a smaller, adjustable bracelet without a tassel. These bracelets are perfect for wearing to benefit from the metaphysical properties of the stones, or as a simple reminder to prioritize mindfulness in daily life. Our bracelets showcase a beautiful Triratna pattern emphasizing groupings of 3, with marker beads between each set. While our bracelets do not contain the sacred 27 beads for counting mantras, the number three is sacred in Buddhism as well. In Buddhism, the number 3 can be seen to represent the Three Jewels (the Triratna) that make up Buddhism. These are: The Buddha, The Dharma (The body of teachings that describe Buddhist doctrine and belief), and The Sangha (The group of people who follow the Buddha and his teachings). Our bracelets are available in three different lengths, with either 6mm or 8mm beads. Since these bracelets are adjustable, measurements reflect the shortest (fully closed) length of each size. Sizes are as follows: Small - 6.25" (only available in 6mm), Medium - 7.5" (6mm or 8mm), Large - 8.75" (6mm) or 9" (8mm). Custom sizes available upon request.
Ask us about our custom designs! Let us know what you're looking to build and we can help make it a reality.


If you are a veteran ISO or Agent in the merchant services industry and tired of losing to First Data, then why not just join the First Data team? You know the saying, "if you can't beat 'em, join 'em"? Well when it comes to bankcard sales, it couldn't be more true.
If you are interested in the First Data ISO or Agent program, it can be difficult to get connected to the right place to even inquire; it's a huge corporation and there isn't even any contact information on the partnership page. We understand and that's why we wrote this post – to help you get the First Data deal you are looking for.
Be able to set up accounts and bridge to all front end platforms North(Cardnet), South(Nabanco), Nashville(Envoy), Omaha and BuyPass(Concord/Atlanta).
Are you an ISO or an Agent?
If you are not ready to make a big minimum application volume commitment and invest $30K to "register" then you would be considered an "Independent Sales Agent".
For ISOs, there are options for both Retail and Wholesale programs depending on which party takes on the risk and underwriting responsibilities.
It's good to be on the winning team!
First Data ISOs and Agents can benefit from the global economies of scale associated with being the largest merchant acquirer in the world supporting 6 million merchant locations in 34 countries. First Data is like the Walmart of the credit card processing industry.
Only available to experienced bankcard agents.


In an election year with a unique opportunity for Democrats to successfully end twenty years of uninterrupted Republican rule of the state, the party has given us an underwhelming set of candidates. The perceived front-runner Gwen Graham does have a lot going for her. She's the daughter of a former Governor and Senator, the beloved Bob Graham and has coalesced much of the institutional support. She's run a campaign focusing on GOP rule in Tallahassee and environmental issues. On the basis of her campaign alone,. Graham might be a solid choice for progressives and our writers.
However, her record as a one-term member of Congress including votes for the Keystone XL pipeline (which she's rationalized very poorly publicly) and to pause the resettlement of Syrian refugees in the US is troubling. The legislation Graham voted for in 2015 essentially froze what was already a slow, laborious and difficult process for refugees to come to this country many of these potential refugees quite possibly would have been Christians fleeing IS/Daesh persecution. Graham's vote was a defiance of President Obama (who spoke out strongly against the legislation) and an embrace of the racially tinged reactionary politics the GOP was popularizing in 2015 and 2016.
It is understood that Graham represented a conservative district in Congress. It is also true she didn't run for reelection in that conservative district. Perhaps she intended to run for reelection before the district was redrawn but that's still not an excuse for some terrible votes. More likely, she and her advisors felt such a voting record would give her a better opportunity to win statewide. We reject that sort of thinking which has clouded the minds of Florida Democrats for years.
Graham's closest challenger is likely to be former Miami Beach Mayor Philip Levine. Having been outraised heavily by Graham thanks partly to institutional biases against candidates from south Florida, Levine is trying to buy his way through the primary using his own money. He's a decent candidate, probably better than Graham but still falls short of the ideal standard we'd like to see.
That brings us to progressive favorite Andrew Gillum who has been endorsed by Senator Bernie Sanders. Gillum's consistent flirtation with ethical trouble and questions about his decision-makingas a public official mean that however much we like his platform and his advocacy on the most important issues to progressives, he cannot be supported. Several other lingering questions exist about Gillum's decisions and possible ethical lapses that we don't need to get into today. All of this is unfortunate because Gillum could be the perfect candidate, the type we've long been waiting for – but we cannot support him.
Chris King has articulated himself well in this race and perhaps has a future in the party, but he's not ready to lead the state or carry the party's banner in November just yet. King should stay involved and active because he adds an interesting voice and different perspective to the conversation than we normally hear from politicos or candidates being handled by professional consultants.
Obviously Democrats and progressives should support one of the four candidates listed above, but we are not comfortable recommending any of them at this time.
As for Jeff Greene, no thank you. progressives should NOT be fooled by slick ads to cast a ballot for him. We'll leave it at that for now.
In many ways, the Attorney General's position is as important as the Governor. Under Bill McCollum and Pam Bondi, the office has been little more than a rubber stamp for an out of control legislature and has not provided effective protections for the people of the state. When then-Republican Charlie Crist was Attorney General, he followed the example of the man he succeeded, Democrat Bob Butterworth to govern in the interest of the citizens and holding power people, be they politicians or corporations to account. But in the last 12 years the GOP has pushed an agenda that was rejected by Crist but embraced by McCollum and Bondi to turn the AG's office into what amounts to a partisan law firm. We have seen rare exceptions here and there but by and large the office has become a partisan one that does not serve the interests of Floridians at all.
Democrats have an exceptional candidate in State Representative Sean Shaw for this office. Shaw is one of the best potential candidates Democrats have fielded statewide in years – the son of the late Florida Supreme Court Justice Leander Shaw Jr., Shaw has been a forceful and articulate advocate for progressive ideals, consumers and social justice even when it meant he lost elections, as he did twice for the State House before being elected. Shaw also was an effective member of Alex Sink's team when she was Chief Financial Officer, where he served as the insurance consumer advocate. From our perspective, given the thin Democratic bench, Shaw is pretty close to a dream candidate for this important office.
The Democrats have fielded consistently ineffective or ethically challenged nominees for this office over the course of the last two decades. In Nikki Fried, the party has a chance to at least have someone forcefully talking about important issues not only to agriculture but consumers in the state on the November ballot. Fried has gotten a lot of attention for her aggressive stands on marijuana which we support but less discussed is her willingness to talk about the aftermath of Hurricane Irma's impact on farming and the general balance between ag and consumers. Fried, if nominated would be a prohibitive underdog to a well-funded Republican in the General Election. But we feel she's the right person to shape the debate and conversation in this state moving forward and if the blue wave is strong enough, she might end up winning the office in her own right. Either way her voice is an important one, and we endorse her candidacy.


In theory, Julys are slow but it's picked up around here. I hope that's a sign of the economy recovering. I think people have decided it's gotten as bad as it will so it's time to start moving forward after having recalibrated. I remain behind. Typical. It's time to turn it up a notch.
Maybe you saw the article in which I was quoted for the NYT, I posted about it. Bloggers do that. We want to make sure you know how smart you are to invest your time reading our stuff. I spoke to the reporter at length. Hers is not a job I want; it's an incredible amount of work and then after it's published, a lot of people says hateful things about you (not that she said that, I googled her). She didn't write 1/20th of what she had to have learned from writing that story, that I knew about anyway from talking to her. Writing is easy, sit down and open a vein (via).
It rained nicely here last week. This week, all the grass decided to reseed itself -a good idea in my opinion. I cut Ms. Humming's Nest out of the tree. I have it in my office. I have bare studs on one wall with some horizontal bracing, making for shallow, irregularly shaped cubbies. I put her nest in one of those.
…and if you want to catch up with some of this week's resources from the archives, here's your chance. Have a great weekend.
Why do hems roll up?


text:
Infection: Bacterial & STI
Symptoms, Transmission and Treatment of Syphilis
Syphilis is a treatable but highly contagious sexually transmitted disease or STD. The bacteria Treponema pallidum causes this disease, which occurs in several phases. The stages of syphilis include primary, secondary, latent, and tertiary.
During the earliest phase of syphilis, the infection begins with the development of sores in ten to ninety days after exposure. Syphilis sores generally begin as small, round spots that are firm and painless but can also turn wet and open. They look like tiny ulcers and can occur anywhere on the genitals or mouth.
Second Stage of Syphilis
During the secondary stage, a red rash typically develops on the soles of the feet or palms of the hands. Other rashes can occur elsewhere on the body. They usually look different than the rashes occurring on the hands or feet. The secondary stage occurs between six to thirty-six weeks after exposure and can last one to three months.
Other symptoms that may develop include:
White patches in the mouth
Warts in the groin area
Related Testing
► STD Lab Testing
► Syphilis Home Test
Final Stages of Syphilis
Latent syphilis is the term used to describe the disease when it remains nonsymptomatic. The duration varies from one patient to another. In the tertiary or final stages, syphilis causes serious medical issues. These problems include:
Heart damage
Syphilis is primarily spread through unprotected sexual activity, including vaginal, anal, or oral sex. Infection can occur during prolonged body contact and/or kissing if sores are present. Syphilis does not occur during casual contact.
LifeExtension.com - Premium grade supplements and vitamins at low prices!
It is not transmitted by contact with door knobs, toilet seats, clothing, utensils, bath tubs, hot tubs, or swimming pools. Congenital syphilis occurs when an infected mother passes the disease on to her newborn. When this occurs, the baby often develops abnormalities and sometimes the infant dies.
Transmission Rates
The CDC has some startling details regarding the transmission rates of syphilis. New cases fell dramatically by the year 2000 after a steady decline. Unfortunately, the incidence of new cases doubled from 2005 and 2013, reaching new highs in 2017 when the total number of reported cases rose to 30,644 for of primary and secondary syphilis and 101,567 for all stages.
In 2017, men having sex with men made up the largest group of primary and secondary syphilis at 52% of all cases. Women accounted for only 15% of all cases within the same category.
Untreated syphilis can lead to serious, life-threatening complications. When treated properly, syphilis is entirely curable in the early stages. While this STD can be treated, it is important to note that all of the damage caused by the infection is unaffected. The antibiotic penicillin successfully treats this STD and has done so since the late 1940's.
Even though syphilis sores clear up on their own after six weeks, the disease remains present in the body. If left untreated, new symptoms usually appear. Typically, symptoms occurring during the secondary stage also clear up on their own. Nonetheless, the infection remains present, and treatment is necessary to prevent the tertiary stage from taking place.
Related Education
9 Common STDs and their Symptoms
Caring for your Condom
Top 10 Reasons to have STD Testing
Top 10 Sexually Transmitted Disease Treatments
Bacterial STD Infections
All STI Infections
Buy Test
Visit Lab
Get Treated
You can visit a lab Near You and get tested for one or all common STDs. This service is Fast, Private & Confidential.
• Condoms
• Bladder Health
• Immune Boosters
• Kidney Health
• Urinary Health

redpajama_set_name: RedPajamaCommonCrawl


text:
Q: Prove that $R\subseteq X\times X$ is an equivalence relation and construct its equivalence class Prove that relation $R\subseteq X\times X$, where $X= \mathbb{R}\times\mathbb{R}$, is an equivalence relation and construct its equivalence class. $R$ is defined as:
$$\langle x_1, y_1\rangle R \langle x_2, y_2\rangle \Longleftrightarrow x_1^2+y_1^2 = x_2^2+y_2^2$$
The way I did prove that it is an equivalence relation was based on equality relationship between two or more quantities. To make it easier to read, we can also substitute $a = x_1^2+y_1^2$, $b = x_2^2+y_2^2$, $c = x_3^2+y_3^2$, at least I think we can.
The first property is reflexivity:
$\langle x_1, y_1\rangle R \langle x_1, y_1\rangle \Longleftrightarrow x_1^2+y_1^2 = x_1^2+y_1^2$, which is always true, as $a=a$.
Then we check for symmetry:
$\langle x_1, y_1\rangle R \langle x_2, y_2\rangle \Longrightarrow \langle x_2, y_2\rangle R \langle x_1, y_1\rangle$, so if $x_1^2+y_1^2 = x_2^2+y_2^2$, then $x_2^2+y_2^2 = x_1^2+y_1^2$. Using the substitution we can say that $(a=b) \Rightarrow (b=a)$, which is also true.
The last one is transitivity:
$\langle x_1, y_1\rangle R \langle x_2, y_2\rangle \wedge \langle x_2, y_2\rangle R \langle x_3, y_3\rangle \Longrightarrow \langle x_1, y_1\rangle R \langle x_3, y_3\rangle$, which means  $x_1^2+y_1^2 = x_2^2+y_2^2 \wedge x_2^2+y_2^2 = x_3^2+y_3^2 \Longrightarrow x_1^2+y_1^2 = x_3^2+y_3^2$, using substitutions it is $(a=b \wedge b=c) \Longrightarrow (a=c)$.
Up to this moment I think that my line of thinking is quite correct, but I am not sure whether that proof is good enough and it is what I would like to know.
When it comes to equivalence class of $R$, I would say that the relation tells us about points on the common circle, but I have to write it up with the definition, which is:

Equivalence class of element $a\in A$ in regard to equivalence
  relation $R\subseteq A\times A$ is a set $[a]_R = \{b\in A\: |\: a R b\}$.

Sadly I can not get it completely, but I thought about
$$[\langle a,b \rangle]_R = \{\langle a, b\rangle \in \mathbb{R} \times \mathbb{R}\:|\: a^2+b^2=x^2+y^2\}$$
I would like you to tell me whether my proof (also usage of substitutions) and construction of equivalence class is right, also how could I get grasp of it, as lectures I attend are not good enough.

A: Your idea is quite good and can be better formalized.
Consider a set $X$ and a map $f\colon X\to Z$, $Z$ any set. Then you can define a relation $\sim_f$ on $X$ by decreeing that
$$
x\sim_f y\quad\text{if and only if}\quad f(x)=f(y)
$$
Then $\sim_f$ is clearly an equivalence relation: the proof is easily based on the properties of equality, which is essentially what you did just with more complicated symbols.
For $a\in X$, its equivalence class is $[a]_{\sim_f}=\{x\in X:f(x)=f(a)\}$.
In your case, $X=\mathbb{R}\times\mathbb{R}$, $Z=\mathbb{R}$ and $f(x,y)=x^2+y^2$ (square of the distance of $(x,y)$ from the origin).
Thus the equivalence class of $(a,b)\in X$ is the set of all points in $X=\mathbb{R}\times\mathbb{R}$ that share the same distance from the origin as $(a,b)$.

A: I like your proof, but I'd write the equivalence classes as follows:
$$
[(a,b)]_R=\{(x,y)\in \mathbb{R}^2|a^2+b^2=x^2+y^2\}
$$
which translates to: "The equivalence class of $(a,b)$ is the set of all points $(x,y)$ having the same distance from 0 as $(a,b)$.

redpajama_set_name: RedPajamaStackExchange


Whilst the sound of Bright Sparks might be familiar (they've been featured on tracks with Sam Feldt and MÖWE), 'Wildfire' is their first ever solo release.
Already working with high flyers (the track has also been produced by Years & Years producer Andy Smith (aka Lxury)), 'Wildfire' offers that flying electro pop that we love at Indietronica.
Bright Sparks will release their EP in early 2017.


text:
Q: Unable to access Data Transfer object in WCF Service I have created a web application in .Net which will be used to consume multiple wcf service. The end points will be specified at runtime using below code:
ServiceWCFTest3.Service1Client client1 = new Service1Client();
            client1.Endpoint.Address = new EndpointAddress("http://localhost:55473/Service1.svc");

Also please refer below one of the web methods exposed by the service:
EmployeeDetails empDtl= new EmployeeDetails("John");
ResultObject result = channel.ADMSAccess_Entry("Test",empDtl );

These classes are marked as DataContract in the specific wcf service.
Now, when the application is executed to access multiple wcf services by changing end point at runtime, it points to correct service and correct web methods. But the value of object EmployeeDetails and ResultObject is passed and received as null. I need to use these class objects to communicate. Can anybody please suggest how can I pass the values using these objects?


Nice game, Xemi started with the flag, but we were all messy, so i took the flag, and we all respected our side to take a secured advantage. GG but we could have done better!
gg, first time that I see Xemi with a negative ratio in CM.
The only time you get a "negative" ratio is when you TK.
For me in AC, less of 1.0 ratio is negative.


The United States leads the world in natural gas production due to a potent combination of available resources, geological know-how, and a robust extraction and transportation infrastructure. Second only to China, the U.S. contains 3 percent of the world's total reserves of which half is produced right here in Texas and Louisiana, according to a recent news story by NPR. In fact, Texas leads the nation in natural gas produced from the Eagle Ford and Barnett shale plays.
Beyond its important role in the US energy mix, natural gas is also the primary feedstock for a robust U.S. petrochemical industry, an industry that is a driving force behind the nation's economic recovery. Much of this industry is located right here in East Harris county.
Neils is not alone in making this claim, it has become a statement echoed in the hallways of the almost 200 companies located with the Houston Port Region. But why? What is it that is driving this development and how can Neils and others make this claim with such confidence? The answer lies with the earth at shale plays concentrated in Texas, North Dakota, and Pennsylvania (see map).
These shale plays have dramatically increased domestic production of natural gas and conversely lowered its price. Natural gas is currently $3.46/MBTU in the U.S. as compared to $11.60 in Europe and above $15.00 in Asia. Consequently, the chemical industry is expanding production capacity along the Gulf Coast to take advantage of a long-term market play.
Products created from the methane off of natural gas are intermediate in nature like PVC, styrene, polystyrene, vinyl chloride, polyethylene; all of which are used to make finished products that supply markets in clothing, medical, automotive, food, and housing. The average consumer does not realize the ubiquitous nature of these products.
Consider ethylene alone in this example. A working mother wakes up and gets ready for a day at the office. She reaches over to the nightstand to put on her glasses, the lenses contain ethylene. She starts her day with a diaper change. The diaper contains ethylene. She next begins to ready herself for a day at the office. She runs the faucet in the bathroom to clean her face; the water runs through pipes that contain ethylene. The wash cloth she uses was washed in detergent that lists ethylene among its ingredients. The hosiery, shoes, and the suit she puts on contain ethylene. She walks across her carpeted hallway, the backing of which is in part comprised of ethylene, to the kitchen to take out the trash in a bag containing ethylene. She gets into her car, drives on tires containing ethylene, through a Duncan Donuts in the morning to get a cup of coffee served in a cup that contains ethylene. You get the picture. There is hardly an aspect of everyday life that is not touched by the petrochemical products produced right here in the Houston port region, and this example was just about one — ethylene.
The potential on the upside is great. This resurgence could lead to nothing less than a shift in the balance of trade with the U.S. becoming a net-exporter of petroleum-based petrochemical products and natural gas. So what does this mean for our region? In order to meet future production needs the most immediate challenge is workforce.


Hi hi! I have a 20+ tank home setup, breeding Endlers (Leopard, Panda, Ginga Rubra and Blonde,) a large turtle tank, trying our hand at breeding Spotted Blue Eyes at the moment. Love lots of different things. Enjoy heading out and collecting native fish when I can - love all different rainbowfish and Gourami. Anyone got any good trapping spots around Everton Park?


text:
American City Guide: New York City
Jordana Weiss | June 25, 2019
You can live in New York City for your entire life and still not see everything the city has to offer.
New York City is the most populous city in the United States and has a reputation as the most vibrant and thrilling vacation destination on the continent. It's the home of New York Fashion Week, the United Nations, Broadway, Wall Street, and the Statue of Liberty.
New York City	Restaurants in New York City	History of New York City	New York City Hotels
Its fast pace inspired the phrase "New York minute" and even if you only have $5 per day to spend, you can still enjoy every aspect of this incredible metropolis.
New York City was originally populated by the Lenape people, Algonquin hunter-gatherers who made their home in the area between the Hudson and Delaware rivers.
In 1624, Dutch colonists arrived and dubbed the area "New Amsterdam." The island of Manhattan was originally purchased from the Lenape people in exchange for trade goods like cloth and farming equipment. Since the 1760s, it has been one of the largest cities in the Western hemisphere.
There's so much history in New York that it's hard to summarize exactly when each new group arrived. The five boroughs of New York are home to people who hail from hundreds of different ethnic groups and speak as many as 800 separate languages. The 2000 census found that the students of the New York Public School system alone speak more than 176 languages.
The city's diversity has had a huge effect on its population and is one of the reasons why it remains so popular with visitors. There are individual areas — such as Chinatown, Little Italy, and Little India — that have almost become cities unto themselves. In addition to these huge areas, there are neighborhoods which have become enclaves for dozens of different ethnicities, including Little Guyana in Queens, Little Odessa in Brighton Beach, and Little Australia in Nolita.
New York City's diversity has had a huge effect on its culinary landscape. Many international restauranteurs and chefs consider New York City to be an essential first step in their global expansion efforts. For instance, Daniel Boulud arrived from France in the 1980s. He quickly became a megastar of the NYC dining scene, opening seven restaurants in Manhattan alone. Also, Masaharu Morimoto, who many people know from Iron Chef, opened his eponymous restaurant Morimoto in the early 2000s.
If you're interested in fine dining, there are endless lists of restaurants in NYC that will deliver an unforgettable experience. Le Bernardin, Daniel, Eleven Madison Park, and Gramercy Tavern are all renowned for their incredible artistry, but dinner will start at $150 per person and only go upwards from there.
One of the greatest joys of New York City is the 99¢ pizza that can be found throughout Midtown. The name of the shop doesn't matter — just look for the bright sign advertising 99¢ slices. If you're willing to pay $3.49 more, you can get a slice that's a thousand times better from Prince Street Pizza in Nolita.
Another iconic New York experience is the hot dog duo from Papaya King, which come topped with sauerkraut, relish, or red onion sauce. Papaya King, which has been an NYC institution since 1923, offers cheap hot dogs that are better than anything found in a Sabrett wagon, as well as delicious tropical juices.
Whether you head to Chinatown for hand-pulled noodles, grab a jaw-crackingly-huge pastrami sandwich from Katz's, or a gobble down a hot cheese arepa at the food truck turned brick-and-mortar Arepa Lady, it's almost impossible to make a bad food choice in NYC. Unless you go to any of the restaurants in Times Square. Don't do that.
The New York bar scene is almost as diverse as their culinary scene. There are over 10,000 licensed bars in the city, so whether your taste tends towards upscale cocktails in a swanky atmosphere or beers in a dive bar, there are plenty of interesting options.
If you're interested in history, some of the oldest bars in the country are located in New York City, including the 1762 Fraunces Tavern, whose past clientele includes George Washington. It changed its name to the Porterhouse Brewing Company after it was bought out, but the building is the same. McSorley's Old Ale House is the oldest continuously operating bar in the city, having been in the same East Village spot since 1854. Past patrons include Abraham Lincoln and John Lennon.
If cocktails are more your scene, some of the city's best cocktail bars include Death & Co in East Village and the Financial District's The Dead Rabbit, a "21st-century Irish pub" which has been voted the best bar in the world two years running.
New York State has been a hub for craft breweries. As such, there are plenty of places in NYC to sample some of the best brews the state (and country) has to offer. Harlem Hops, in Harlem, has 16 rotating taps that focus on local beers made specifically by brewers of color. Covenhoven, in Crown Heights, also has 16 draft lines, as well as a gigantic fridge filled with more than 100 bottles of beer and cider.
If a unique atmosphere is what you're looking for, NYC is a haven for speakeasies and other watering holes that are secretive havens for those who enjoy a challenge. PDT, which stands for Please Don't Tell, can only be entered through a phone booth located in an East Village hot dog restaurant. Some people also consider the Staten Island Ferry to be a not-so-secret speakeasy. The concession stand on the ferry sells beer, so you can relax and enjoy a free ride while looking out over the incredible views of the harbor and the Statue of Liberty.
New York City has so many hotels, to the extent that the real estate market has become the fourth most expensive in the United States.
If you're dead set on staying on the island of Manhattan, areas like Harlem or even Washington Heights offer much cheaper rates. Areas in Brooklyn are becoming just as expensive as Manhattan, but many people prefer it because it's less congested.
Sites like Hotwire, where you can book hotel rooms without committing to a specific location, and Airbnb make booking accommodations a little easier.
There are so many tourist attractions in New York City that it's difficult to decide where to go first.
Times Square is iconic, but you'll get the idea after a few minutes in the crowd. Seeing a Broadway show is an incredible experience, but unless you're really set on a specific show, don't buy your tickets in advance. There are discount ticket booths called TKTS that operate all over the city and offer discounted tickets to many popular Broadway shows.
New York City has a ton of different sports teams, so seeing a game at Yankee Stadium, Madison Square Garden, or Citi Field is a really fun outing. Scalpers usually sell tickets outside the venue or you can look online for discounted seats the day of a game.
Central Park is often called the lung of the city. It spans 3.5 square miles between 59th and 110th Streets. There's a zoo, a theater, 26 sculptures, and a lake inside the park.
For many people, a visit to NYC isn't complete without visiting some of the city's most famous buildings. The Empire State Building, Trinity Church, Rockefeller Center, One World Trade Center, and the Chrysler Building are just some of the city's most impressive tourist attractions. There's an entire museum district and more galleries than you could ever visit in a lifetime.
Yukinori Hasumi / Getty Images
11 Great Hostels to Stay In
For budget-minded travelers in search of a cheap place to stay, hostels can be the perfect option. Generally, hostels offer much better value than hotels and short-term apartment rentals. Because less money is spent on accommodations, it allows globetrotters to designate a larger portion of their budget to good food and sightseeing activities instead.
11 Great Hostels in Europe to Stay In
If you're a budget-minded backpacker interested in meeting fellow travelers along the way, hostels are an exceptional alternative. Intimate, community-minded, and affordable, hostels have exploded in popularity and really come a long way. From shared open-concept spaces to private ensuites, it's easy to find a mix of both communal and secluded accommodations.
The 10 Most Historic Prisons
While jail time isn't a walk in the park for any convicted felon, many tourists flock to historical prisons around the world when traveling. This is due to their mystic, history, and eerie ambiance. While it may seem a little crazy, visiting a local prison can provide a ton of insight on a region's roots and culture.
9 Weird (But Awesome) Specialty Vacations You Can Take
The Most Luxurious Hotels in the World
The Friendliest Destinations in the World
The Coolest Bowling Alleys in America
The 10 Most Popular Travel Attractions in 2019
Get Out: The Unfriendliest Cities in the World
Best Countries for Vegetarians
Night Out at the Theater: Iconic American Theater Marquees


The dental hygienist explained to 1st class the importance of brushing our teeth at least twice a day! All pupils were shown how best to use their tooth brushes. This was a very important visit.
The theme for this years World Book Day was based on Irish fairy-tale stories and myths along with Irish authors.
Making pancakes with first class.
The Six Nations Rugby Begins!
The cake sale was a great success again this year. Well done to all children, parents and grandparents who made a great effort baking cakes and treats. Everyone had a big smile after buying some treats.
1st Class love getting the paint brushes out!!!! Paint on the tables, paint on the chairs, paint on the floors, paint on clothes………………….Always a great way to spend a Friday afternoon.
A picture paints a thousand words!!!!!
How's Progress With The Violins?
We are making steady progress with the violins.
It still might be a bit too early to go booking the Olympia just yet!!
Making St Brigid's Day crosses is a lot harder than it looks. If Good Shepherd N.S. was located in the west of Ireland making the crosses would have been a breeze as there are endless amounts of rushes available, BUT we hadn't that luxury!!! Still, all the boys and girls made some great crosses.