clipboard-polyfill
Version:
A polyfill for the asynchronous clipboard API
87 lines (84 loc) • 137 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["clipboard"] = factory();
else
root["clipboard"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n//\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar es6_promise_1 = __webpack_require__(1);\nvar DataTypes_1 = __webpack_require__(6);\nvar DT_1 = __webpack_require__(5);\nvar ClipboardPolyfill = /** @class */ (function () {\n function ClipboardPolyfill() {\n }\n // TODO: Compile debug logging code out of release builds?\n ClipboardPolyfill.enableDebugLogging = function () {\n this.DEBUG = true;\n };\n ClipboardPolyfill.suppressMissingPlainTextWarning = function () {\n this.misingPlainTextWarning = false;\n };\n ClipboardPolyfill.copyListener = function (tracker, data, e) {\n var _this = this;\n if (this.DEBUG)\n (console.info || console.log).call(console, \"listener called\");\n tracker.listenerCalled = true;\n data.forEach(function (value, key) {\n e.clipboardData.setData(key, value);\n if (key === DataTypes_1.DataTypes.TEXT_PLAIN && e.clipboardData.getData(key) != value) {\n if (_this.DEBUG)\n (console.info || console.log).call(console, \"Setting text/plain failed.\");\n tracker.listenerSetPlainTextFailed = true;\n }\n });\n e.preventDefault();\n };\n ClipboardPolyfill.execCopy = function (data) {\n var tracker = new FallbackTracker();\n var listener = this.copyListener.bind(this, tracker, data);\n document.addEventListener(\"copy\", listener);\n try {\n tracker.execCommandReturnedTrue = document.execCommand(\"copy\");\n }\n finally {\n document.removeEventListener(\"copy\", listener);\n }\n return tracker;\n };\n // Create a temporary DOM element to select, so that `execCommand()` is not\n // rejected.\n ClipboardPolyfill.copyUsingTempSelection = function (e, data) {\n Selection.select(e);\n var tracker = this.execCopy(data);\n Selection.clear();\n return tracker;\n };\n // Create a temporary DOM element to select, so that `execCommand()` is not\n // rejected.\n ClipboardPolyfill.copyUsingTempElem = function (data) {\n var tempElem = document.createElement(\"div\");\n // Place some text in the elem so that Safari has something to select.\n tempElem.textContent = \"temporary element\";\n document.body.appendChild(tempElem);\n var tracker = this.copyUsingTempSelection(tempElem, data);\n document.body.removeChild(tempElem);\n return tracker;\n };\n // Uses shadow DOM.\n ClipboardPolyfill.copyTextUsingDOM = function (str) {\n if (this.DEBUG)\n (console.info || console.log).call(console, \"attempting to copy text using DOM\");\n var tempElem = document.createElement(\"div\");\n var shadowRoot = tempElem.attachShadow({ mode: \"open\" });\n document.body.appendChild(tempElem);\n var span = document.createElement(\"span\");\n span.textContent = str;\n span.style.whiteSpace = \"pre-wrap\"; // TODO: Use `innerText` above instead?\n shadowRoot.appendChild(span);\n Selection.select(span);\n var result = document.execCommand(\"copy\");\n // Selection.clear();\n document.body.removeChild(tempElem);\n return result;\n };\n ClipboardPolyfill.writeIE = function (data) {\n // IE supports text or URL, but not HTML: https://msdn.microsoft.com/en-us/library/ms536744(v=vs.85).aspx\n // TODO: Write URLs to `text/uri-list`? https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Recommended_drag_types\n var text = data.getData(\"text/plain\");\n if (text !== undefined) {\n return window.clipboardData.setData(\"Text\", text);\n }\n throw (\"No `text/plain` value was specified.\");\n };\n ClipboardPolyfill.write = function (data) {\n var _this = this;\n if (this.misingPlainTextWarning && !data.getData(DataTypes_1.DataTypes.TEXT_PLAIN)) {\n (console.warn || console.log).call(console, \"[clipboard.js] clipboard.write() was called without a \" +\n \"`text/plain` data type. On some platforms, this may result in an \" +\n \"empty clipboard. Call clipboard.suppressMissingPlainTextWarning() \" +\n \"to suppress this warning.\");\n }\n // TODO: Allow fallback graph other than a single line.\n return new es6_promise_1.Promise(function (resolve, reject) {\n // Internet Explorer\n if (typeof ClipboardEvent === \"undefined\" &&\n typeof window.clipboardData !== \"undefined\" &&\n typeof window.clipboardData.setData !== \"undefined\") {\n if (_this.writeIE(data)) {\n resolve();\n }\n else {\n reject(new Error(\"Copying failed, possibly because the user rejected it.\"));\n }\n return;\n }\n var tracker = _this.execCopy(data);\n if (tracker.listenerCalled && !tracker.listenerSetPlainTextFailed) {\n if (_this.DEBUG)\n (console.info || console.log).call(console, \"Regular copy command succeeded.\");\n resolve();\n return;\n }\n // Success detection on Edge is not possible, due to bugs in all 4\n // detection mechanisms we could try to use. Assume success.\n if (tracker.listenerCalled && navigator.userAgent.indexOf(\"Edge\") > -1) {\n if (_this.DEBUG)\n (console.info || console.log).call(console, \"User agent contains \\\"Edge\\\". Blindly assuming success.\");\n resolve();\n return;\n }\n // Fallback 1 for desktop Safari.\n tracker = _this.copyUsingTempSelection(document.body, data);\n if (tracker.listenerCalled && !tracker.listenerSetPlainTextFailed) {\n if (_this.DEBUG)\n (console.info || console.log).call(console, \"Copied using temporary document.body selection.\");\n resolve();\n return;\n }\n // Fallback 2 for desktop Safari. \n tracker = _this.copyUsingTempElem(data);\n if (tracker.listenerCalled && !tracker.listenerSetPlainTextFailed) {\n if (_this.DEBUG)\n (console.info || console.log).call(console, \"Copied using selection of temporary element added to DOM.\");\n resolve();\n return;\n }\n // Fallback for iOS Safari.\n var text = data.getData(DataTypes_1.DataTypes.TEXT_PLAIN);\n if (text !== undefined) {\n if (_this.DEBUG)\n (console.info || console.log).call(console, \"Copied text using DOM.\");\n resolve();\n return;\n }\n reject(new Error(\"Copy command failed.\"));\n });\n };\n ClipboardPolyfill.writeText = function (s) {\n var dt = new DT_1.default();\n dt.setData(DataTypes_1.DataTypes.TEXT_PLAIN, s);\n return this.write(dt);\n };\n ClipboardPolyfill.read = function () {\n return new es6_promise_1.Promise(function (resolve, reject) { return reject(\"Cannot read in any modern browsers. IE11 pasting is not implemented yet.\"); });\n };\n ClipboardPolyfill.readText = function () {\n return new es6_promise_1.Promise(function (resolve, reject) { return reject(\"Cannot read in any modern browsers. IE11 pasting is not implemented yet.\"); });\n };\n // Legacy v1 API.\n ClipboardPolyfill.copy = function (obj) {\n var _this = this;\n (console.warn || console.log).call(console, \"[clipboard.js] The clipboard.copy() API is deprecated and may be removed in a future version. Please switch to clipboard.write() or clipboard.writeText().\");\n return new es6_promise_1.Promise(function (resolve, reject) {\n var data;\n if (typeof obj === \"string\") {\n data = DT_1.default.fromText(obj);\n }\n else if (obj instanceof HTMLElement) {\n data = DT_1.default.fromElement(obj);\n }\n else if (obj instanceof Object) {\n data = DT_1.default.fromObject(obj);\n }\n else {\n reject(\"Invalid data type. Must be string, DOM node, or an object mapping MIME types to strings.\");\n return;\n }\n _this.write(data);\n });\n };\n // Legacy v1 API.\n ClipboardPolyfill.paste = function () {\n (console.warn || console.log).call(console, \"[clipboard.js] The clipboard.paste() API is deprecated and may be removed in a future version. Please switch to clipboard.read() or clipboard.readText().\");\n return new es6_promise_1.Promise(function (resolve, reject) { return reject(\"Cannot read in any modern browsers. IE11 pasting is not implemented yet.\"); });\n };\n ClipboardPolyfill.DEBUG = false;\n ClipboardPolyfill.misingPlainTextWarning = true;\n ClipboardPolyfill.DT = DT_1.default;\n return ClipboardPolyfill;\n}());\nexports.default = ClipboardPolyfill;\nvar Selection = /** @class */ (function () {\n function Selection() {\n }\n Selection.select = function (elem) {\n var sel = document.getSelection();\n var range = document.createRange();\n range.selectNodeContents(elem);\n sel.removeAllRanges();\n sel.addRange(range);\n };\n Selection.clear = function () {\n var sel = document.getSelection();\n sel.removeAllRanges();\n };\n return Selection;\n}());\nvar FallbackTracker = /** @class */ (function () {\n function FallbackTracker() {\n this.execCommandReturnedTrue = false;\n this.listenerCalled = false;\n this.listenerSetPlainTextFailed = false;\n }\n return FallbackTracker;\n}());\nmodule.exports = ClipboardPolyfill;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGlwYm9hcmQudHM/NmI1YSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsZUFBZTs7QUFFZiwyQ0FBb0M7QUFDcEMseUNBQXFDO0FBQ3JDLGtDQUFzQjtBQVd0QjtJQUFBO0lBME1BLENBQUM7SUFyTUMsMERBQTBEO0lBQzVDLG9DQUFrQixHQUFoQztRQUNFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFYyxpREFBK0IsR0FBOUM7UUFDRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFFZ0IsOEJBQVksR0FBN0IsVUFBOEIsT0FBd0IsRUFBRSxJQUFRLEVBQUUsQ0FBaUI7UUFBbkYsaUJBV0M7UUFWQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDL0UsT0FBTyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFDLEtBQWEsRUFBRSxHQUFXO1lBQ3RDLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUsscUJBQVMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDMUUsRUFBRSxDQUFDLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQztvQkFBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztnQkFDMUYsT0FBTyxD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R0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRU0sZUFBSyxHQUFaO1FBQ0UsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBQ0gsZ0JBQUM7QUFBRCxDQUFDO0FBRUQ7SUFBQTtRQUNTLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQUN6QyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQywrQkFBMEIsR0FBWSxLQUFLLENBQUM7SUFDckQsQ0FBQztJQUFELHNCQUFDO0FBQUQsQ0FBQztBQUtELE1BQU0sQ0FBQyxPQUFPLEdBQUcsaUJBQWlCLENBQUMiLCJmaWxlIjoiMC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7UHJvbWlzZX0gZnJvbSBcImVzNi1wcm9taXNlXCI7XG5pbXBvcnQge0RhdGFUeXBlc30gZnJvbSBcIi4vRGF0YVR5cGVzXCJcbmltcG9ydCBEVCBmcm9tIFwiLi9EVFwiO1xuXG5pbnRlcmZhY2UgSUVXaW5kb3dDbGlwYmFyZERhdGEge1xuICBzZXREYXRhOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIGdldERhdGE6IChrZXk6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgSUVXaW5kb3cgZXh0ZW5kcyBXaW5kb3cge1xuICBjbGlwYm9hcmREYXRhOiBJRVdpbmRvd0NsaXBiYXJkRGF0YVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGlwYm9hcmRQb2x5ZmlsbCB7XG4gIHByaXZhdGUgc3RhdGljIERFQlVHOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgc3RhdGljIG1pc2luZ1BsYWluVGV4dFdhcm5pbmcgPSB0cnVlO1xuICBwdWJsaWMgc3RhdGljIERUID0gRFQ7XG5cbiAgLy8gVE9ETzogQ29tcGlsZSBkZWJ1ZyBsb2dnaW5nIGNvZGUgb3V0IG9mIHJlbGVhc2UgYnVpbGRzP1xuICBwdWJsaWMgc3RhdGljIGVuYWJsZURlYnVnTG9nZ2luZygpIHtcbiAgICB0aGlzLkRFQlVHID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN1cHByZXNzTWlzc2luZ1BsYWluVGV4dFdhcm5pbmcoKSB7XG4gICAgdGhpcy5taXNpbmdQbGFpblRleHRXYXJuaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGNvcHlMaXN0ZW5lcih0cmFja2VyOiBGYWxsYmFja1RyYWNrZXIsIGRhdGE6IERULCBlOiBDbGlwYm9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLkRFQlVHKSAoY29uc29sZS5pbmZvIHx8IGNvbnNvbGUubG9nKS5jYWxsKGNvbnNvbGUsIFwibGlzdGVuZXIgY2FsbGVkXCIpO1xuICAgIHRyYWNrZXIubGlzdGVuZXJDYWxsZWQgPSB0cnVlO1xuICAgIGRhdGEuZm9yRWFjaCgodmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGUuY2xpcGJvYXJkRGF0YS5zZXREYXRhKGtleSwgdmFsdWUpO1xuICAgICAgaWYgKGtleSA9PT0gRGF0YVR5cGVzLlRFWFRfUExBSU4gJiYgZS5jbGlwYm9hcmREYXRhLmdldERhdGEoa2V5KSAhPSB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5ERUJVRykgKGNvbnNvbGUuaW5mbyB8fCBjb25zb2xlLmxvZykuY2FsbChjb25zb2xlLCBcIlNldHRpbmcgdGV4dC9wbGFpbiBmYWlsZWQuXCIpO1xuICAgICAgICB0cmFja2VyLmxpc3RlbmVyU2V0UGxhaW5UZXh0RmFpbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGV4ZWNDb3B5KGRhdGE6IERUKTogRmFsbGJhY2tUcmFja2VyIHtcbiAgICB2YXIgdHJhY2tlciA9IG5ldyBGYWxsYmFja1RyYWNrZXIoKTtcbiAgICB2YXIgbGlzdGVuZXIgPSB0aGlzLmNvcHlMaXN0ZW5lci5iaW5kKHRoaXMsIHRyYWNrZXIsIGRhdGEpO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvcHlcIiwgbGlzdGVuZXIpO1xuICAgIHRyeSB7XG4gICAgICB0cmFja2VyLmV4ZWNDb21tYW5kUmV0dXJuZWRUcnVlID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjb3B5XCIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29weVwiLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIHJldHVybiB0cmFja2VyO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IERPTSBlbGVtZW50IHRvIHNlbGVjdCwgc28gdGhhdCBgZXhlY0NvbW1hbmQoKWAgaXMgbm90XG4gIC8vIHJlamVjdGVkLlxuICBwcml2YXRlIHN0YXRpYyBjb3B5VXNpbmdUZW1wU2VsZWN0aW9uKGU6IEhUTUxFbGVtZW50LCBkYXRhOiBEVCk6IEZhbGxiYWNrVHJhY2tlciB7XG4gICAgU2VsZWN0aW9uLnNlbGVjdChlKTtcbiAgICB2YXIgdHJhY2tlciA9IHRoaXMuZXhlY0NvcHkoZGF0YSk7XG4gICAgU2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgcmV0dXJuIHRyYWNrZXI7XG4gIH1cblxuICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgRE9NIGVsZW1lbnQgdG8gc2VsZWN0LCBzbyB0aGF0IGBleGVjQ29tbWFuZCgpYCBpcyBub3RcbiAgLy8gcmVqZWN0ZWQuXG4gIHByaXZhdGUgc3RhdGljIGNvcHlVc2luZ1RlbXBFbGVtKGRhdGE6IERUKTogRmFsbGJhY2tUcmFja2VyIHtcbiAgICB2YXIgdGVtcEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIC8vIFBsYWNlIHNvbWUgdGV4dCBpbiB0aGUgZWxlbSBzbyB0aGF0IFNhZmFyaSBoYXMgc29tZXRoaW5nIHRvIHNlbGVjdC5cbiAgICB0ZW1wRWxlbS50ZXh0Q29udGVudCA9IFwidGVtcG9yYXJ5IGVsZW1lbnRcIjtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXBFbGVtKTtcblxuICAgIHZhciB0cmFja2VyID0gdGhpcy5jb3B5VXNpbmdUZW1wU2VsZWN0aW9uKHRlbXBFbGVtLCBkYXRhKTtcblxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVtcEVsZW0pO1xuICAgIHJldHVybiB0cmFja2VyO1xuICB9XG5cbiAgLy8gVXNlcyBzaGFkb3cgRE9NLlxuICBwcml2YXRlIHN0YXRpYyBjb3B5VGV4dFVzaW5nRE9NKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuREVCVUcpIChjb25zb2xlLmluZm8gfHwgY29uc29sZS5sb2cpLmNhbGwoY29uc29sZSwgXCJhdHRlbXB0aW5nIHRvIGNvcHkgdGV4dCB1c2luZyBET01cIik7XG5cbiAgICB2YXIgdGVtcEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHZhciBzaGFkb3dSb290ID0gdGVtcEVsZW0uYXR0YWNoU2hhZG93KHttb2RlOiBcIm9wZW5cIn0pO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcEVsZW0pO1xuXG4gICAgdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBzcGFuLnRleHRDb250ZW50ID0gc3RyO1xuICAgIHNwYW4uc3R5bGUud2hpdGVTcGFjZSA9IFwicHJlLXdyYXBcIjsgLy8gVE9ETzogVXNlIGBpbm5lclRleHRgIGFib3ZlIGluc3RlYWQ/XG4gICAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICBTZWxlY3Rpb24uc2VsZWN0KHNwYW4pO1xuXG4gICAgdmFyIHJlc3VsdCA9IGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY29weVwiKTtcblxuICAgIC8vIFNlbGVjdGlvbi5jbGVhcigpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVtcEVsZW0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgd3JpdGVJRShkYXRhOiBEVCk6IGJvb2xlYW4ge1xuICAgIC8vIElFIHN1cHBvcnRzIHRleHQgb3IgVVJMLCBidXQgbm90IEhUTUw6IGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY3NDQodj12cy44NSkuYXNweFxuICAgIC8vIFRPRE86IFdyaXRlIFVSTHMgdG8gYHRleHQvdXJpLWxpc3RgPyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTF9EcmFnX2FuZF9Ecm9wX0FQSS9SZWNvbW1lbmRlZF9kcmFnX3R5cGVzXG4gICAgdmFyIHRleHQgPSBkYXRhLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpO1xuICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAod2luZG93IGFzIElFV2luZG93KS5jbGlwYm9hcmREYXRhLnNldERhdGEoXCJUZXh0XCIsIHRleHQpO1xuICAgIH1cblxuICAgIHRocm93IChcIk5vIGB0ZXh0L3BsYWluYCB2YWx1ZSB3YXMgc3BlY2lmaWVkLlwiKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgd3JpdGUoZGF0YTogRFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5taXNpbmdQbGFpblRleHRXYXJuaW5nICYmICFkYXRhLmdldERhdGEoRGF0YVR5cGVzLlRFWFRfUExBSU4pKSB7XG4gICAgICAoY29uc29sZS53YXJuIHx8IGNvbnNvbGUubG9nKS5jYWxsKGNvbnNvbGUsXG4gICAgICAgIFwiW2NsaXBib2FyZC5qc10gY2xpcGJvYXJkLndyaXRlKCkgd2FzIGNhbGxlZCB3aXRob3V0IGEgXCIrXG4gICAgICAgIFwiYHRleHQvcGxhaW5gIGRhdGEgdHlwZS4gT24gc29tZSBwbGF0Zm9ybXMsIHRoaXMgbWF5IHJlc3VsdCBpbiBhbiBcIitcbiAgICAgICAgXCJlbXB0eSBjbGlwYm9hcmQuIENhbGwgY2xpcGJvYXJkLnN1cHByZXNzTWlzc2luZ1BsYWluVGV4dFdhcm5pbmcoKSBcIitcbiAgICAgICAgXCJ0byBzdXBwcmVzcyB0aGlzIHdhcm5pbmcuXCIpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEFsbG93IGZhbGxiYWNrIGdyYXBoIG90aGVyIHRoYW4gYSBzaW5nbGUgbGluZS5cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBJbnRlcm5ldCBFeHBsb3JlclxuICAgICAgaWYgKHR5cGVvZiBDbGlwYm9hcmRFdmVudCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgIHR5cGVvZiAod2luZG93IGFzIElFV2luZG93KS5jbGlwYm9hcmREYXRhICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgdHlwZW9mICh3aW5kb3cgYXMgSUVXaW5kb3cpLmNsaXBib2FyZERhdGEuc2V0RGF0YSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodGhpcy53cml0ZUlFKGRhdGEpKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkNvcHlpbmcgZmFpbGVkLCBwb3NzaWJseSBiZWNhdXNlIHRoZSB1c2VyIHJlamVjdGVkIGl0LlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHJhY2tlciA9IHRoaXMuZXhlY0NvcHkoZGF0YSk7XG4gICAgICBpZiAodHJhY2tlci5saXN0ZW5lckNhbGxlZCAmJiAhdHJhY2tlci5saXN0ZW5lclNldFBsYWluVGV4dEZhaWxlZCkge1xuICAgICAgICBpZiAodGhpcy5ERUJVRykgKGNvbnNvbGUuaW5mbyB8fCBjb25zb2xlLmxvZykuY2FsbChjb25zb2xlLCBcIlJlZ3VsYXIgY29weSBjb21tYW5kIHN1Y2NlZWRlZC5cIik7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTdWNjZXNzIGRldGVjdGlvbiBvbiBFZGdlIGlzIG5vdCBwb3NzaWJsZSwgZHVlIHRvIGJ1Z3MgaW4gYWxsIDRcbiAgICAgIC8vIGRldGVjdGlvbiBtZWNoYW5pc21zIHdlIGNvdWxkIHRyeSB0byB1c2UuIEFzc3VtZSBzdWNjZXNzLlxuICAgICAgaWYgKHRyYWNrZXIubGlzdGVuZXJDYWxsZWQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiRWRnZVwiKSA+IC0xKSB7XG4gICAgICAgIGlmICh0aGlzLkRFQlVHKSAoY29uc29sZS5pbmZvIHx8IGNvbnNvbGUubG9nKS5jYWxsKGNvbnNvbGUsIFwiVXNlciBhZ2VudCBjb250YWlucyBcXFwiRWRnZVxcXCIuIEJsaW5kbHkgYXNzdW1pbmcgc3VjY2Vzcy5cIik7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjayAxIGZvciBkZXNrdG9wIFNhZmFyaS5cbiAgICAgIHRyYWNrZXIgPSB0aGlzLmNvcHlVc2luZ1RlbXBTZWxlY3Rpb24oZG9jdW1lbnQuYm9keSwgZGF0YSk7XG4gICAgICBpZiAodHJhY2tlci5saXN0ZW5lckNhbGxlZCAmJiAhdHJhY2tlci5saXN0ZW5lclNldFBsYWluVGV4dEZhaWxlZCkge1xuICAgICAgICBpZiAodGhpcy5ERUJVRykgKGNvbnNvbGUuaW5mbyB8fCBjb25zb2xlLmxvZykuY2FsbChjb25zb2xlLCBcIkNvcGllZCB1c2luZyB0ZW1wb3JhcnkgZG9jdW1lbnQuYm9keSBzZWxlY3Rpb24uXCIpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRmFsbGJhY2sgMiBmb3IgZGVza3RvcCBTYWZhcmkuIFxuICAgICAgdHJhY2tlciA9IHRoaXMuY29weVVzaW5nVGVtcEVsZW0oZGF0YSk7XG4gICAgICBpZiAodHJhY2tlci5saXN0ZW5lckNhbGxlZCAmJiAhdHJhY2tlci5saXN0ZW5lclNldFBsYWluVGV4dEZhaWxlZCkge1xuICAgICAgICBpZiAodGhpcy5ERUJVRykgKGNvbnNvbGUuaW5mbyB8fCBjb25zb2xlLmxvZykuY2FsbChjb25zb2xlLCBcIkNvcGllZCB1c2luZyBzZWxlY3Rpb24gb2YgdGVtcG9yYXJ5IGVsZW1lbnQgYWRkZWQgdG8gRE9NLlwiKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEZhbGxiYWNrIGZvciBpT1MgU2FmYXJpLlxuICAgICAgdmFyIHRleHQgPSBkYXRhLmdldERhdGEoRGF0YVR5cGVzLlRFWFRfUExBSU4pO1xuICAgICAgaWYgKHRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodGhpcy5ERUJVRykgKGNvbnNvbGUuaW5mbyB8fCBjb25zb2xlLmxvZykuY2FsbChjb25zb2xlLCBcIkNvcGllZCB0ZXh0IHVzaW5nIERPTS5cIik7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZWplY3QobmV3IEVycm9yKFwiQ29weSBjb21tYW5kIGZhaWxlZC5cIikpO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHdyaXRlVGV4dChzOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB2YXIgZHQgPSBuZXcgRFQoKTtcbiAgICBkdC5zZXREYXRhKERhdGFUeXBlcy5URVhUX1BMQUlOLCBzKTtcbiAgICByZXR1cm4gdGhpcy53cml0ZShkdCk7XG4gIH1cblxuICBzdGF0aWMgcmVhZCgpOiBQcm9taXNlPERUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHJlamVjdChcIkNhbm5vdCByZWFkIGluIGFueSBtb2Rlcm4gYnJvd3NlcnMuIElFMTEgcGFzdGluZyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LlwiKSk7XG4gIH1cblxuICBzdGF0aWMgcmVhZFRleHQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gcmVqZWN0KFwiQ2Fubm90IHJlYWQgaW4gYW55IG1vZGVybiBicm93c2Vycy4gSUUxMSBwYXN0aW5nIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuXCIpKTtcbiAgfVxuXG4gIC8vIExlZ2FjeSB2MSBBUEkuXG4gIHN0YXRpYyBjb3B5KG9iajogc3RyaW5nfHtba2V5OnN0cmluZ106c3RyaW5nfXxIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIChjb25zb2xlLndhcm4gfHwgY29uc29sZS5sb2cpLmNhbGwoY29uc29sZSwgXCJbY2xpcGJvYXJkLmpzXSBUaGUgY2xpcGJvYXJkLmNvcHkoKSBBUEkgaXMgZGVwcmVjYXRlZCBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gUGxlYXNlIHN3aXRjaCB0byBjbGlwYm9hcmQud3JpdGUoKSBvciBjbGlwYm9hcmQud3JpdGVUZXh0KCkuXCIpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHZhciBkYXRhOiBEVDtcbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGRhdGEgPSBEVC5mcm9tVGV4dChvYmopO1xuICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICBkYXRhID0gRFQuZnJvbUVsZW1lbnQob2JqKTtcbiAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgIGRhdGEgPSBEVC5mcm9tT2JqZWN0KG9iaik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoXCJJbnZhbGlkIGRhdGEgdHlwZS4gTXVzdCBiZSBzdHJpbmcsIERPTSBub2RlLCBvciBhbiBvYmplY3QgbWFwcGluZyBNSU1FIHR5cGVzIHRvIHN0cmluZ3MuXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLndyaXRlKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gTGVnYWN5IHYxIEFQSS5cbiAgc3RhdGljIHBhc3RlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgKGNvbnNvbGUud2FybiB8fCBjb25zb2xlLmxvZykuY2FsbChjb25zb2xlLCBcIltjbGlwYm9hcmQuanNdIFRoZSBjbGlwYm9hcmQucGFzdGUoKSBBUEkgaXMgZGVwcmVjYXRlZCBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gUGxlYXNlIHN3aXRjaCB0byBjbGlwYm9hcmQucmVhZCgpIG9yIGNsaXBib2FyZC5yZWFkVGV4dCgpLlwiKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gcmVqZWN0KFwiQ2Fubm90IHJlYWQgaW4gYW55IG1vZGVybiBicm93c2Vycy4gSUUxMSBwYXN0aW5nIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuXCIpKTtcbiAgfVxufVxuXG5jbGFzcyBTZWxlY3Rpb24ge1xuICBzdGF0aWMgc2VsZWN0KGVsZW06IEVsZW1lbnQpOiB2b2lkIHtcbiAgICB2YXIgc2VsID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbSk7XG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gIH1cblxuICBzdGF0aWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdmFyIHNlbCA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgfVxufVxuXG5jbGFzcyBGYWxsYmFja1RyYWNrZXIge1xuICBwdWJsaWMgZXhlY0NvbW1hbmRSZXR1cm5lZFRydWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGxpc3RlbmVyQ2FsbGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBsaXN0ZW5lclNldFBsYWluVGV4dEZhaWxlZDogYm9vbGVhbiA9IGZhbHNlO1xufVxuXG4vLyBUT0RPOiBGaWd1cmUgb3V0IGhvdyB0byBleHBvc2UgQ2xpcGJvYXJkUG9seWZpbGwgYXMgc2VsZi5jbGlwYm9hcmQgdXNpbmdcbi8vIFdlYlBhY2s/XG5kZWNsYXJlIHZhciBtb2R1bGU6IGFueTtcbm1vZHVsZS5leHBvcnRzID0gQ2xpcGJvYXJkUG9seWZpbGw7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGlwYm9hcmQudHMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n");
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
eval("/* WEBPACK VAR INJECTION */(function(process, global) {var require;/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version 4.1.1\n */\n\n(function (global, factory) {\n\t true ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\nvar _isArray = undefined;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = undefined;\nvar customSchedulerFn = undefined;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var r = require;\n var vertx = __webpack_require__(4);\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = undefined;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && \"function\" === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var _arguments = arguments;\n\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n if (_state) {\n (function () {\n var callback = _arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n })();\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n GET_THEN_ERROR.error = null;\n } else if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = undefined,\n callback = undefined,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = undefined,\n error = undefined,\n succeeded = undefined,\n failed = undefined;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value.error = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction Enumerator$1(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nEnumerator$1.prototype._enumerate = function (input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n};\n\nEnumerator$1.prototype._eachEntry = function (entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n if (resolve$$1 === resolve$1) {\n var _then = getThen(entry);\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$2) {\n var promise = new c(noop);\n handleMaybeThenable(promise, entry, _then);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n};\n\nEnumerator$1.prototype._settledAt = function (state, i, value) {\n var promise = this.promise;\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n};\n\nEnumerator$1.prototype._willSettleAt = function (promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n};\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of th