diff --git a/README.md b/README.md index 49b808c..8b2c90f 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,13 @@ -## ScaleDrone's cURL JavaScript Desktop Notifications +## Scaledrone's cURL JavaScript Desktop Notifications This is a very simple example of how to use the HTML5 Desktop Notifications API to send notifications from your server. Beware that HTML5 Notifications are not supported by all browsers yet, you can get the latest list of supported browsers from [here](http://caniuse.com/#feat=notifications). -Create a new free channel at [ScaleDrone.com](https://www.scaledrone.com/) or use the one from the example for testing. +To send your own notifications create a new free account at [scaledrone.com](https://www.scaledrone.com/). + +### Example + +[https://scaledrone.github.io/html5-javascript-push-notifications/](https://scaledrone.github.io/html5-javascript-push-notifications/) ### Running @@ -11,8 +15,8 @@ Clone this repository and run it using your favorite http server. You can push a notification from Terminal using `cURL`: ``` -curl --include \ - --request POST \ - --data-binary 'msg=Buy cheese and bread for breakfast.' \ - https://api2.scaledrone.com/dIVCxD01G4x1sDtC/notifications/publish +curl -H "Content-Type: application/json" \ + -X POST \ + -d '{"title":"Important!", "body":"Dogecoin is going to the moon!", "icon":"logo.png"}' \ + https://api2.scaledrone.com/KtJ2qzn3CF3svSFe/notifications/publish ``` diff --git a/bower_components/push.js/.bower.json b/bower_components/push.js/.bower.json new file mode 100644 index 0000000..b7b46e9 --- /dev/null +++ b/bower_components/push.js/.bower.json @@ -0,0 +1,32 @@ +{ + "name": "push.js", + "description": "A compact, cross-browser solution for the Javascript Notifications API", + "main": "bin/push.js", + "authors": [ + "Tyler Nickerson" + ], + "license": "MIT", + "homepage": "https://pushjs.org", + "ignore": [ + "**/.*", + "coverage", + "node_modules", + "bower_components", + "tests", + "src", + "build", + "*.lock", + "*.json" + ], + "version": "1.0.5", + "_release": "1.0.5", + "_resolution": { + "type": "version", + "tag": "v1.0.5", + "commit": "a139b5acb041a914127794823a66084ead0ad017" + }, + "_source": "https://github.com/Nickersoft/push.js.git", + "_target": "^1.0.5", + "_originalSource": "push.js", + "_direct": true +} \ No newline at end of file diff --git a/bower_components/push.js/CONTRIBUTING.md b/bower_components/push.js/CONTRIBUTING.md new file mode 100644 index 0000000..f7aa96b --- /dev/null +++ b/bower_components/push.js/CONTRIBUTING.md @@ -0,0 +1,26 @@ +# Contributing Guidelines +So you want to contribute to Push, huh? Well lucky for you, it's really easy to do so, because you're just dealing with like, a few hundred lines of JavaScript. It's not hard. + +Alright. Now calm down and take a few deep breaths. Here we go. All you have to remember is two commands... think you can do that? + +To BUILD Push, just run: + +``` +npm run build +``` + +To TEST Push, run: + +``` +npm run test +``` + +See? Not hard at all. Unfortunately the Notifications API doesn't always play nicely with local sites, so don't get discouraged if you try running Push in a local HTML file and it doesn't work. + +### Testing & Travis ### +Push uses the [Karma](https://karma-runner.github.io/1.0/index.html) JavaScript test runner, so read up on that if you want to make changes to any of the tests that are run. These tests are run post-push by [Travis CI](https://travis-ci.org), so look into that if you want to make any Travis configuration changes. Although, at this point I'd say Travis is all set. The tests might want to be expanded though. + +### REAL IMPORTANT STUFF ### +**THERE IS ONLY ONE RULE TO PUSH CLUB** (and no, it's not that you can't talk about it). **WHENEVER** you make changes to `Push.js`, **RECOMPILE** and commit `push.min.js` as well. Until this build process can be wrapped into a sexy git hook of some sort, this is how changes to the library need to occur. **YOUR PR WILL NOT BE APPROVED UNLESS THIS HAPPENS**. That said, I did let it slide once because I wasn't thinking, but that's why I wrote this file to make sure it will never happen again. + +Outside of that, contributing should not be at all scary and should be a fun and positive process. Now go out and write some killer JS! Wait... is there even such a thing? diff --git a/bower_components/push.js/LICENSE.md b/bower_components/push.js/LICENSE.md new file mode 100644 index 0000000..d4ec93f --- /dev/null +++ b/bower_components/push.js/LICENSE.md @@ -0,0 +1,21 @@ +# The MIT License (MIT) + +Copyright (c) 2016 Tyler Nickerson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/bower_components/push.js/README.md b/bower_components/push.js/README.md new file mode 100644 index 0000000..4fa87bb --- /dev/null +++ b/bower_components/push.js/README.md @@ -0,0 +1,47 @@ +# [](http://pushjs.org) + +[![Build Status](https://img.shields.io/travis/Nickersoft/push.js.svg)](https://travis-ci.org/Nickersoft/push.js) +[![npm version](https://img.shields.io/npm/v/push.js.svg)](https://npmjs.com/package/push.js) +[![npm](https://img.shields.io/npm/dm/push.js.svg)](https://npmjs.com/package/push.js) +[![Coverage Status](https://img.shields.io/coveralls/Nickersoft/push.js.svg)](https://coveralls.io/github/Nickersoft/push.js?branch=master) +[![Known Vulnerabilities](https://snyk.io/test/github/nickersoft/push.js/badge.svg)](https://snyk.io/test/github/nickersoft/push.js) +![David Dev Dependencies](https://img.shields.io/david/dev/nickersoft/push.js.svg) +[![Code Climate](https://img.shields.io/codeclimate/github/Nickersoft/push.js.svg)](https://codeclimate.com/github/Nickersoft/push.js) + +*Now a proud user of* + +[](https://browserstack.com) + +### What is Push? ### + +Push is the fastest way to get up and running with Javascript desktop notifications. A fairly new addition to the +official specification, the Notification API allows modern browsers such as Chrome, Safari, Firefox, and IE 9+ to push +notifications to a user's desktop. Push acts as a cross-browser solution to this API, falling back to use older +implementations if the user's browser does not support the new API. + +You can quickly install Push via [npm](http://npmjs.com): + +``` +npm install push.js --save +``` + +Or, if you want something a little more lightweight, you can give [Bower](http://bower.io) a try: + +``` +bower install push.js --save +``` + +### Full Documentation ### +Full documentation for Push can be found at the project's new homepage [https://pushjs.org](https://pushjs.org). +See you there! + +### Development ### + +If you feel like this library is your jam and you want to contribute (or you think I'm an idiot who missed something), +check out Push's neat [contributing guidelines](CONTRIBUTING.md) on how you can make your mark. + +### Credits ### +Push is based off work the following work: + +1. [HTML5-Desktop-Notifications](https://github.com/ttsvetko/HTML5-Desktop-Notifications) by [Tsvetan Tsvetkov](https://github.com/ttsvetko) +2. [notify.js](https://github.com/alexgibson/notify.js) by [Alex Gibson](https://github.com/alexgibson) diff --git a/bower_components/push.js/bin/push.js b/bower_components/push.js/bin/push.js new file mode 100644 index 0000000..4a62cc3 --- /dev/null +++ b/bower_components/push.js/bin/push.js @@ -0,0 +1,645 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Push = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0 ? this._requestWithCallback.apply(this, arguments) : this._requestAsPromise(); + } + }, { + key: "_requestWithCallback", + value: function _requestWithCallback(i, t) { + var _this = this; + + var s = this.get();var e = function e() { + var s = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this._win.Notification.permission; + void 0 === s && _this._win.webkitNotifications && (s = _this._win.webkitNotifications.checkPermission()), s === _this.GRANTED || 0 === s ? i && i() : t && t(); + };s !== this.DEFAULT ? e(s) : this._win.webkitNotifications && this._win.webkitNotifications.checkPermission ? this._win.webkitNotifications.requestPermission(e) : this._win.Notification && this._win.Notification.requestPermission ? this._win.Notification.requestPermission().then(e).catch(function () { + t && t(); + }) : i && i(); + } + }, { + key: "_requestAsPromise", + value: function _requestAsPromise() { + var _this2 = this; + + var i = this.get();var t = function t(i) { + return i === _this2.GRANTED || 0 === i; + };var s = i !== this.DEFAULT, + e = this._win.Notification && this._win.Notification.requestPermission, + n = this._win.webkitNotifications && this._win.webkitNotifications.checkPermission;return new Promise(function (o, h) { + var r = function r(i) { + return t(i) ? o() : h(); + };s ? r(i) : n ? _this2._win.webkitNotifications.requestPermission(function (i) { + r(i); + }) : e ? _this2._win.Notification.requestPermission().then(function (i) { + r(i); + }).catch(h) : o(); + }); + } + }, { + key: "has", + value: function has() { + return this.get() === this.GRANTED; + } + }, { + key: "get", + value: function get() { + var i = void 0;return i = this._win.Notification && this._win.Notification.permission ? this._win.Notification.permission : this._win.webkitNotifications && this._win.webkitNotifications.checkPermission ? this._permissions[this._win.webkitNotifications.checkPermission()] : navigator.mozNotification ? this.GRANTED : this._win.external && this._win.external.msIsSiteMode ? this._win.external.msIsSiteMode() ? this.GRANTED : this.DEFAULT : this.GRANTED; + } + }]); + + return Permission; +}(); + +exports.default = Permission; +; + +},{}],3:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _Messages = require("./Messages"); + +var _Messages2 = _interopRequireDefault(_Messages); + +var _Permission = require("./Permission"); + +var _Permission2 = _interopRequireDefault(_Permission); + +var _Util = require("./Util"); + +var _Util2 = _interopRequireDefault(_Util); + +var _DesktopAgent = require("./agents/DesktopAgent"); + +var _DesktopAgent2 = _interopRequireDefault(_DesktopAgent); + +var _MobileChromeAgent = require("./agents/MobileChromeAgent"); + +var _MobileChromeAgent2 = _interopRequireDefault(_MobileChromeAgent); + +var _MobileFirefoxAgent = require("./agents/MobileFirefoxAgent"); + +var _MobileFirefoxAgent2 = _interopRequireDefault(_MobileFirefoxAgent); + +var _MSAgent = require("./agents/MSAgent"); + +var _MSAgent2 = _interopRequireDefault(_MSAgent); + +var _WebKitAgent = require("./agents/WebKitAgent"); + +var _WebKitAgent2 = _interopRequireDefault(_WebKitAgent); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Push = function () { + function Push(t) { + _classCallCheck(this, Push); + + this._currentId = 0, this._notifications = {}, this._win = t, this.Permission = new _Permission2.default(t), this._agents = { desktop: new _DesktopAgent2.default(t), chrome: new _MobileChromeAgent2.default(t), firefox: new _MobileFirefoxAgent2.default(t), ms: new _MSAgent2.default(t), webkit: new _WebKitAgent2.default(t) }, this._configuration = { serviceWorker: "/serviceWorker.min.js", fallback: function fallback(t) {} }; + } + + _createClass(Push, [{ + key: "_closeNotification", + value: function _closeNotification(t) { + var i = !0;var e = this._notifications[t];if (void 0 !== e) { + if (i = this._removeNotification(t), this._agents.desktop.isSupported()) this._agents.desktop.close(e);else if (this._agents.webkit.isSupported()) this._agents.webkit.close(e);else { + if (!this._agents.ms.isSupported()) throw i = !1, new Error(_Messages2.default.errors.unknown_interface);this._agents.ms.close(); + }return i; + }return !1; + } + }, { + key: "_addNotification", + value: function _addNotification(t) { + var i = this._currentId;return this._notifications[i] = t, this._currentId++, i; + } + }, { + key: "_removeNotification", + value: function _removeNotification(t) { + var i = !1;return this._notifications.hasOwnProperty(t) && (delete this._notifications[t], i = !0), i; + } + }, { + key: "_prepareNotification", + value: function _prepareNotification(t, i) { + var _this = this; + + var e = void 0;return e = { get: function get() { + return _this._notifications[t]; + }, close: function close() { + _this._closeNotification(t); + } }, i.timeout && setTimeout(function () { + e.close(); + }, i.timeout), e; + } + }, { + key: "_serviceWorkerCallback", + value: function _serviceWorkerCallback(t, i, e) { + var _this2 = this; + + var s = this._addNotification(t[t.length - 1]);navigator.serviceWorker.addEventListener("message", function (t) { + var i = JSON.parse(t.data);"close" === i.action && Number.isInteger(i.id) && _this2._removeNotification(i.id); + }), e(this._prepareNotification(s, i)); + } + }, { + key: "_createCallback", + value: function _createCallback(t, i, e) { + var _this3 = this; + + var s = void 0, + o = null;if (i = i || {}, s = function s(t) { + _this3._removeNotification(t), _Util2.default.isFunction(i.onClose) && i.onClose.call(_this3, o); + }, this._agents.desktop.isSupported()) try { + o = this._agents.desktop.create(t, i); + } catch (s) { + var _o = this._currentId, + n = this.config().serviceWorker, + r = function r(t) { + return _this3._serviceWorkerCallback(t, i, e); + };this._agents.chrome.isSupported() && this._agents.chrome.create(_o, t, i, n, r); + } else this._agents.webkit.isSupported() ? o = this._agents.webkit.create(t, i) : this._agents.firefox.isSupported() ? this._agents.firefox.create(t, i) : this._agents.ms.isSupported() ? o = this._agents.ms.create(t, i) : (i.title = t, this.config().fallback(i));if (null !== o) { + var _t = this._addNotification(o), + _n = this._prepareNotification(_t, i);_Util2.default.isFunction(i.onShow) && o.addEventListener("show", i.onShow), _Util2.default.isFunction(i.onError) && o.addEventListener("error", i.onError), _Util2.default.isFunction(i.onClick) && o.addEventListener("click", i.onClick), o.addEventListener("close", function () { + s(_t); + }), o.addEventListener("cancel", function () { + s(_t); + }), e(_n); + }e(null); + } + }, { + key: "create", + value: function create(t, i) { + var _this4 = this; + + var e = void 0;if (!_Util2.default.isString(t)) throw new Error(_Messages2.default.errors.invalid_title);return e = this.Permission.has() ? function (e, s) { + try { + _this4._createCallback(t, i, e); + } catch (t) { + s(t); + } + } : function (e, s) { + _this4.Permission.request().then(function () { + _this4._createCallback(t, i, e); + }).catch(function () { + s(_Messages2.default.errors.permission_denied); + }); + }, new Promise(e); + } + }, { + key: "count", + value: function count() { + var t = void 0, + i = 0;for (t in this._notifications) { + this._notifications.hasOwnProperty(t) && i++; + }return i; + } + }, { + key: "close", + value: function close(t) { + var i = void 0, + e = void 0;for (i in this._notifications) { + if (this._notifications.hasOwnProperty(i) && (e = this._notifications[i]).tag === t) return this._closeNotification(i); + } + } + }, { + key: "clear", + value: function clear() { + var t = void 0, + i = !0;for (t in this._notifications) { + this._notifications.hasOwnProperty(t) && (i = i && this._closeNotification(t)); + }return i; + } + }, { + key: "supported", + value: function supported() { + var t = !1;for (var i in this._agents) { + this._agents.hasOwnProperty(i) && (t = t || this._agents[i].isSupported()); + }return t; + } + }, { + key: "config", + value: function config(t) { + return (void 0 !== t || null !== t && _Util2.default.isObject(t)) && _Util2.default.objectMerge(this._configuration, t), this._configuration; + } + }, { + key: "extend", + value: function extend(t) { + var i, + e = {}.hasOwnProperty;if (!e.call(t, "plugin")) throw new Error(_Messages2.default.errors.invalid_plugin);e.call(t, "config") && _Util2.default.isObject(t.config) && null !== t.config && this.config(t.config), i = new (0, t.plugin)(this.config());for (var s in i) { + e.call(i, s) && _Util2.default.isFunction(i[s]) && (this[s] = i[s]); + } + } + }]); + + return Push; +}(); + +exports.default = Push; +; + +},{"./Messages":1,"./Permission":2,"./Util":4,"./agents/DesktopAgent":6,"./agents/MSAgent":7,"./agents/MobileChromeAgent":8,"./agents/MobileFirefoxAgent":9,"./agents/WebKitAgent":10}],4:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Util = function () { + function Util() { + _classCallCheck(this, Util); + } + + _createClass(Util, null, [{ + key: "isUndefined", + value: function isUndefined(t) { + return void 0 === t; + } + }, { + key: "isString", + value: function isString(t) { + return "string" == typeof t; + } + }, { + key: "isFunction", + value: function isFunction(t) { + return t && "[object Function]" === {}.toString.call(t); + } + }, { + key: "isObject", + value: function isObject(t) { + return "object" == (typeof t === "undefined" ? "undefined" : _typeof(t)); + } + }, { + key: "objectMerge", + value: function objectMerge(t, i) { + for (var e in i) { + t.hasOwnProperty(e) && this.isObject(t[e]) && this.isObject(i[e]) ? this.objectMerge(t[e], i[e]) : t[e] = i[e]; + } + } + }]); + + return Util; +}(); + +exports.default = Util; +; + +},{}],5:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var AbstractAgent = function AbstractAgent(t) { + _classCallCheck(this, AbstractAgent); + + this._win = t; +}; + +exports.default = AbstractAgent; +; + +},{}],6:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _AbstractAgent2 = require("./AbstractAgent"); + +var _AbstractAgent3 = _interopRequireDefault(_AbstractAgent2); + +var _Util = require("../Util"); + +var _Util2 = _interopRequireDefault(_Util); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var DesktopAgent = function (_AbstractAgent) { + _inherits(DesktopAgent, _AbstractAgent); + + function DesktopAgent() { + _classCallCheck(this, DesktopAgent); + + return _possibleConstructorReturn(this, (DesktopAgent.__proto__ || Object.getPrototypeOf(DesktopAgent)).apply(this, arguments)); + } + + _createClass(DesktopAgent, [{ + key: "isSupported", + value: function isSupported() { + return void 0 !== this._win.Notification; + } + }, { + key: "create", + value: function create(t, i) { + return new this._win.Notification(t, { icon: _Util2.default.isString(i.icon) || _Util2.default.isUndefined(i.icon) ? i.icon : i.icon.x32, body: i.body, tag: i.tag, requireInteraction: i.requireInteraction }); + } + }, { + key: "close", + value: function close(t) { + t.close(); + } + }]); + + return DesktopAgent; +}(_AbstractAgent3.default); + +exports.default = DesktopAgent; +; + +},{"../Util":4,"./AbstractAgent":5}],7:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _AbstractAgent2 = require("./AbstractAgent"); + +var _AbstractAgent3 = _interopRequireDefault(_AbstractAgent2); + +var _Util = require("../Util"); + +var _Util2 = _interopRequireDefault(_Util); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var MSAgent = function (_AbstractAgent) { + _inherits(MSAgent, _AbstractAgent); + + function MSAgent() { + _classCallCheck(this, MSAgent); + + return _possibleConstructorReturn(this, (MSAgent.__proto__ || Object.getPrototypeOf(MSAgent)).apply(this, arguments)); + } + + _createClass(MSAgent, [{ + key: "isSupported", + value: function isSupported() { + return void 0 !== this._win.external && void 0 !== this._win.external.msIsSiteMode; + } + }, { + key: "create", + value: function create(e, t) { + return this._win.external.msSiteModeClearIconOverlay(), this._win.external.msSiteModeSetIconOverlay(_Util2.default.isString(t.icon) || _Util2.default.isUndefined(t.icon) ? t.icon : t.icon.x16, e), this._win.external.msSiteModeActivate(), null; + } + }, { + key: "close", + value: function close() { + this._win.external.msSiteModeClearIconOverlay(); + } + }]); + + return MSAgent; +}(_AbstractAgent3.default); + +exports.default = MSAgent; +; + +},{"../Util":4,"./AbstractAgent":5}],8:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _AbstractAgent2 = require("./AbstractAgent"); + +var _AbstractAgent3 = _interopRequireDefault(_AbstractAgent2); + +var _Util = require("../Util"); + +var _Util2 = _interopRequireDefault(_Util); + +var _Messages = require("../Messages"); + +var _Messages2 = _interopRequireDefault(_Messages); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var MobileChromeAgent = function (_AbstractAgent) { + _inherits(MobileChromeAgent, _AbstractAgent); + + function MobileChromeAgent() { + _classCallCheck(this, MobileChromeAgent); + + return _possibleConstructorReturn(this, (MobileChromeAgent.__proto__ || Object.getPrototypeOf(MobileChromeAgent)).apply(this, arguments)); + } + + _createClass(MobileChromeAgent, [{ + key: "isSupported", + value: function isSupported() { + return void 0 !== this._win.navigator && void 0 !== this._win.navigator.serviceWorker; + } + }, { + key: "getFunctionBody", + value: function getFunctionBody(t) { + return t.toString().match(/function[^{]+{([\s\S]*)}$/)[1]; + } + }, { + key: "create", + value: function create(t, e, i, o, r) { + var _this2 = this; + + this._win.navigator.serviceWorker.register(o), this._win.navigator.serviceWorker.ready.then(function (o) { + var n = { id: t, link: i.link, origin: document.location.href, onClick: _Util2.default.isFunction(i.onClick) ? _this2.getFunctionBody(i.onClick) : "", onClose: _Util2.default.isFunction(i.onClose) ? _this2.getFunctionBody(i.onClose) : "" };void 0 !== i.data && null !== i.data && (n = Object.assign(n, i.data)), o.showNotification(e, { icon: i.icon, body: i.body, vibrate: i.vibrate, tag: i.tag, data: n, requireInteraction: i.requireInteraction, silent: i.silent }).then(function () { + o.getNotifications().then(function (t) { + o.active.postMessage(""), r(t); + }); + }).catch(function (t) { + throw new Error(_Messages2.default.errors.sw_notification_error + t.message); + }); + }).catch(function (t) { + throw new Error(_Messages2.default.errors.sw_registration_error + t.message); + }); + } + }, { + key: "close", + value: function close() {} + }]); + + return MobileChromeAgent; +}(_AbstractAgent3.default); + +exports.default = MobileChromeAgent; +; + +},{"../Messages":1,"../Util":4,"./AbstractAgent":5}],9:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _AbstractAgent2 = require("./AbstractAgent"); + +var _AbstractAgent3 = _interopRequireDefault(_AbstractAgent2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var MobileFirefoxAgent = function (_AbstractAgent) { + _inherits(MobileFirefoxAgent, _AbstractAgent); + + function MobileFirefoxAgent() { + _classCallCheck(this, MobileFirefoxAgent); + + return _possibleConstructorReturn(this, (MobileFirefoxAgent.__proto__ || Object.getPrototypeOf(MobileFirefoxAgent)).apply(this, arguments)); + } + + _createClass(MobileFirefoxAgent, [{ + key: "isSupported", + value: function isSupported() { + return void 0 !== this._win.navigator.mozNotification; + } + }, { + key: "create", + value: function create(t, i) { + var o = this._win.navigator.mozNotification.createNotification(t, i.body, i.icon);return o.show(), o; + } + }]); + + return MobileFirefoxAgent; +}(_AbstractAgent3.default); + +exports.default = MobileFirefoxAgent; +; + +},{"./AbstractAgent":5}],10:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _AbstractAgent2 = require("./AbstractAgent"); + +var _AbstractAgent3 = _interopRequireDefault(_AbstractAgent2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var WebKitAgent = function (_AbstractAgent) { + _inherits(WebKitAgent, _AbstractAgent); + + function WebKitAgent() { + _classCallCheck(this, WebKitAgent); + + return _possibleConstructorReturn(this, (WebKitAgent.__proto__ || Object.getPrototypeOf(WebKitAgent)).apply(this, arguments)); + } + + _createClass(WebKitAgent, [{ + key: "isSupported", + value: function isSupported() { + return void 0 !== this._win.webkitNotifications; + } + }, { + key: "create", + value: function create(t, e) { + var i = this._win.webkitNotifications.createNotification(e.icon, t, e.body);return i.show(), i; + } + }, { + key: "close", + value: function close(t) { + t.cancel(); + } + }]); + + return WebKitAgent; +}(_AbstractAgent3.default); + +exports.default = WebKitAgent; +; + +},{"./AbstractAgent":5}],11:[function(require,module,exports){ +"use strict"; + +var _Push = require("./classes/Push"); + +var _Push2 = _interopRequireDefault(_Push); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +module.exports = new _Push2.default("undefined" != typeof window ? window : undefined); + +},{"./classes/Push":3}]},{},[11])(11) +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvY2xhc3Nlcy9NZXNzYWdlcy5qcyIsInNyYy9jbGFzc2VzL1Blcm1pc3Npb24uanMiLCJzcmMvY2xhc3Nlcy9QdXNoLmpzIiwic3JjL2NsYXNzZXMvVXRpbC5qcyIsInNyYy9jbGFzc2VzL2FnZW50cy9BYnN0cmFjdEFnZW50LmpzIiwic3JjL2NsYXNzZXMvYWdlbnRzL0Rlc2t0b3BBZ2VudC5qcyIsInNyYy9jbGFzc2VzL2FnZW50cy9NU0FnZW50LmpzIiwic3JjL2NsYXNzZXMvYWdlbnRzL01vYmlsZUNocm9tZUFnZW50LmpzIiwic3JjL2NsYXNzZXMvYWdlbnRzL01vYmlsZUZpcmVmb3hBZ2VudC5qcyIsInNyYy9jbGFzc2VzL2FnZW50cy9XZWJLaXRBZ2VudC5qcyIsInNyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0FDQUEsSUFBTSxjQUFjLGlDQUdsQixVQUNFLGtFQUNBLDBIQUNBLG9FQUNBLDZEQUNBLCtHQUNBLHdHQUNBOzs7Ozs7Ozs7Ozs7O0lDVmlCO0FBRW5CLHNCQUFZOzs7QUFDVixTQUFLLE9BQU8sR0FDWixLQUFLLFVBQVUsV0FDZixLQUFLLFVBQVUsV0FDZixLQUFLLFNBQVMsVUFDZCxLQUFLLGdCQUNILEtBQUssU0FDTCxLQUFLLFNBQ0wsS0FBSztBQVVUOzs7OzRCQUFRLEdBQVc7QUFDakIsYUFBUSxVQUFVLFNBQVMsSUFBSyxLQUFLLGlDQUF3QixhQUFhLEtBQUs7QUFVakY7Ozt5Q0FBcUIsR0FBVzs7O0FBQzlCLFVBQU0sSUFBVyxLQUFLLFVBRWpCLElBQVU7WUFBQyx3RUFBUyxNQUFLLEtBQUssYUFBYTthQUN6QixNQUFYLEtBQTBCLE1BQUssS0FBSyx3QkFDNUMsSUFBUyxNQUFLLEtBQUssb0JBQW9CLG9CQUNyQyxNQUFXLE1BQUssV0FBc0IsTUFBWCxJQUN6QixLQUFXLE1BQ04sS0FBVTtPQUx0QixDQVNHLE1B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TyxHQUFPO0FBQ1osVUFBSSxJQUFlLEtBQUssS0FBSyxvQkFBb0IsbUJBQy9DLEVBQVEsTUFDUixHQUNBLEVBQVEsTUFLVixPQUZBLEVBQWEsUUFFTjtBQU9UOzs7MEJBQU07QUFDSixRQUFhOzs7Ozs7Ozs7Ozs7O0FDdENWLEFBQVU7Ozs7OztBQUVqQixPQUFPLFVBQVUsQUFBSSxtQkFBdUIsc0JBQVgsU0FBeUIsQUFBUyIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJjb25zdCBlcnJvclByZWZpeCA9ICdQdXNoRXJyb3I6JztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlcnJvcnM6IHtcbiAgICBpbmNvbXBhdGlibGU6IGAke2Vycm9yUHJlZml4fSBQdXNoLmpzIGlzIGluY29tcGF0aWJsZSB3aXRoIGJyb3dzZXIuYCxcbiAgICBpbnZhbGlkX3BsdWdpbjogYCR7ZXJyb3JQcmVmaXh9IHBsdWdpbiBjbGFzcyBtaXNzaW5nIGZyb20gcGx1Z2luIG1hbmlmZXN0IChpbnZhbGlkIHBsdWdpbikuIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbi5gLFxuICAgIGludmFsaWRfdGl0bGU6IGAke2Vycm9yUHJlZml4fSB0aXRsZSBvZiBub3RpZmljYXRpb24gbXVzdCBiZSBhIHN0cmluZ2AsXG4gICAgcGVybWlzc2lvbl9kZW5pZWQ6IGAke2Vycm9yUHJlZml4fSBwZXJtaXNzaW9uIHJlcXVlc3QgZGVjbGluZWRgLFxuICAgIHN3X25vdGlmaWNhdGlvbl9lcnJvcjogYCR7ZXJyb3JQcmVmaXh9IGNvdWxkIG5vdCBzaG93IGEgU2VydmljZVdvcmtlciBub3RpZmljYXRpb24gZHVlIHRvIHRoZSBmb2xsb3dpbmcgcmVhc29uOiBgLFxuICAgIHN3X3JlZ2lzdHJhdGlvbl9lcnJvcjogYCR7ZXJyb3JQcmVmaXh9IGNvdWxkIG5vdCByZWdpc3RlciB0aGUgU2VydmljZVdvcmtlciBkdWUgdG8gdGhlIGZvbGxvd2luZyByZWFzb246IGAsXG4gICAgdW5rbm93bl9pbnRlcmZhY2U6IGAke2Vycm9yUHJlZml4fSB1bmFibGUgdG8gY3JlYXRlIG5vdGlmaWNhdGlvbjogdW5rbm93biBpbnRlcmZhY2VgLFxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBQZXJtaXNzaW9uIHtcblxuICBjb25zdHJ1Y3Rvcih3aW4pIHtcbiAgICB0aGlzLl93aW4gPSB3aW47XG4gICAgdGhpcy5HUkFOVEVEID0gJ2dyYW50ZWQnO1xuICAgIHRoaXMuREVGQVVMVCA9ICdkZWZhdWx0JztcbiAgICB0aGlzLkRFTklFRCA9ICdkZW5pZWQnO1xuICAgIHRoaXMuX3Blcm1pc3Npb25zID0gW1xuICAgICAgdGhpcy5HUkFOVEVELFxuICAgICAgdGhpcy5ERUZBVUxULFxuICAgICAgdGhpcy5ERU5JRURcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIHBlcm1pc3Npb24gZm9yIGRlc2t0b3Agbm90aWZpY2F0aW9uc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkdyYW50ZWQgLSBGdW5jdGlvbiB0byBleGVjdXRlIG9uY2UgcGVybWlzc2lvbiBpcyBncmFudGVkXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRGVuaWVkIC0gRnVuY3Rpb24gdG8gZXhlY3V0ZSBvbmNlIHBlcm1pc3Npb24gaXMgZGVuaWVkXG4gICAqIEByZXR1cm4ge3ZvaWQsIFByb21pc2V9XG4gICAqL1xuICByZXF1ZXN0KG9uR3JhbnRlZCwgb25EZW5pZWQpIHtcbiAgICByZXR1cm4gKGFyZ3VtZW50cy5sZW5ndGggPiAwKSA/IHRoaXMuX3JlcXVlc3RXaXRoQ2FsbGJhY2soLi4uYXJndW1lbnRzKSA6IHRoaXMuX3JlcXVlc3RBc1Byb21pc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbGQgcGVybWlzc2lvbnMgaW1wbGVtZW50YXRpb24gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBhIHByb21pc2UgYmFzZWQgb25lXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIFYxLjAuNFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkdyYW50ZWQgLSBGdW5jdGlvbiB0byBleGVjdXRlIG9uY2UgcGVybWlzc2lvbiBpcyBncmFudGVkXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRGVuaWVkIC0gRnVuY3Rpb24gdG8gZXhlY3V0ZSBvbmNlIHBlcm1pc3Npb24gaXMgZGVuaWVkXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBfcmVxdWVzdFdpdGhDYWxsYmFjayhvbkdyYW50ZWQsIG9uRGVuaWVkKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldCgpO1xuXG4gICAgIHZhciByZXNvbHZlID0gKHJlc3VsdCA9IHRoaXMuX3dpbi5Ob3RpZmljYXRpb24ucGVybWlzc2lvbikgPT4ge1xuICAgICAgaWYgKHR5cGVvZihyZXN1bHQpPT09J3VuZGVmaW5lZCcgJiYgdGhpcy5fd2luLndlYmtpdE5vdGlmaWNhdGlvbnMpXG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX3dpbi53ZWJraXROb3RpZmljYXRpb25zLmNoZWNrUGVybWlzc2lvbigpO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdGhpcy5HUkFOVEVEIHx8IHJlc3VsdCA9PT0gMCkge1xuICAgICAgICBpZiAob25HcmFudGVkKSBvbkdyYW50ZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAob25EZW5pZWQpIG9uRGVuaWVkKCk7XG4gICAgfVxuXG4gICAgLyogUGVybWlzc2lvbnMgYWxyZWFkeSBzZXQgKi9cbiAgICBpZiAoZXhpc3RpbmcgIT09IHRoaXMuREVGQVVMVCkge1xuICAgICAgcmVzb2x2ZShleGlzdGluZyk7XG4gICAgfVxuICAgIC8qIFNhZmFyaSA2KywgTGVnYWN5IHdlYmtpdCBicm93c2VycyAqL1xuICAgIGVsc2UgaWYgKHRoaXMuX3dpbi53ZWJraXROb3RpZmljYXRpb25zICYmIHRoaXMuX3dpbi53ZWJraXROb3RpZmljYXRpb25zLmNoZWNrUGVybWlzc2lvbikge1xuICAgICAgdGhpcy5fd2luLndlYmtpdE5vdGlmaWNhdGlvbnMucmVxdWVzdFBlcm1pc3Npb24ocmVzb2x2ZSk7XG4gICAgfVxuICAgIC8qIENocm9tZSAyMysgKi9cbiAgICBlbHNlIGlmICh0aGlzLl93aW4uTm90aWZpY2F0aW9uICYmIHRoaXMuX3dpbi5Ob3RpZmljYXRpb24ucmVxdWVzdFBlcm1pc3Npb24pIHtcbiAgICAgIHRoaXMuX3dpbi5Ob3RpZmljYXRpb24ucmVxdWVzdFBlcm1pc3Npb24oKS50aGVuKHJlc29sdmUpLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG9uRGVuaWVkKSBvbkRlbmllZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qIExldCB0aGUgdXNlciBjb250aW51ZSBieSBkZWZhdWx0ICovXG4gICAgZWxzZSBpZiAob25HcmFudGVkKSB7XG4gICAgICBvbkdyYW50ZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgcGVybWlzc2lvbiBmb3IgZGVza3RvcCBub3RpZmljYXRpb25zIGluIGEgcHJvbWlzZSBiYXNlZCB3YXlcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIF9yZXF1ZXN0QXNQcm9taXNlKCkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5nZXQoKTtcblxuICAgIGxldCBpc0dyYW50ZWQgPSByZXN1bHQgPT4gKHJlc3VsdCA9PT0gdGhpcy5HUkFOVEVEIHx8IHJlc3VsdCA9PT0gMCk7XG5cbiAgICAvKiBQZXJtaXNzaW9ucyBhbHJlYWR5IHNldCAqL1xuICAgIHZhciBoYXNQZXJtaXNzaW9ucyA9IChleGlzdGluZyAhPT0gdGhpcy5ERUZBVUxUKTtcblxuICAgIC8qIFNhZmFyaSA2KywgQ2hyb21lIDIzKyAqL1xuICAgIHZhciBpc01vZGVybkFQSSA9ICh0aGlzLl93aW4uTm90aWZpY2F0aW9uICYmIHRoaXMuX3dpbi5Ob3RpZmljYXRpb24ucmVxdWVzdFBlcm1pc3Npb24pO1xuXG4gICAgLyogTGVnYWN5IHdlYmtpdCBicm93c2VycyAqL1xuICAgIHZhciBpc1dlYmtpdEFQSSA9ICh0aGlzLl93aW4ud2Via2l0Tm90aWZpY2F0aW9ucyAmJiB0aGlzLl93aW4ud2Via2l0Tm90aWZpY2F0aW9ucy5jaGVja1Blcm1pc3Npb24pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlUHJvbWlzZSwgcmVqZWN0UHJvbWlzZSkgPT4ge1xuXG4gICAgICB2YXIgcmVzb2x2ZXIgPSByZXN1bHQgPT4gKGlzR3JhbnRlZChyZXN1bHQpKSA/IHJlc29sdmVQcm9taXNlKCkgOiByZWplY3RQcm9taXNlKCk7XG5cbiAgICAgIGlmIChoYXNQZXJtaXNzaW9ucykge1xuICAgICAgIHJlc29sdmVyKGV4aXN0aW5nKVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNXZWJraXRBUEkpIHtcbiAgICAgICAgdGhpcy5fd2luLndlYmtpdE5vdGlmaWNhdGlvbnMucmVxdWVzdFBlcm1pc3Npb24ocmVzdWx0ID0+IHsgcmVzb2x2ZXIocmVzdWx0KSB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzTW9kZXJuQVBJKSB7XG4gICAgICAgIHRoaXMuX3dpbi5Ob3RpZmljYXRpb24ucmVxdWVzdFBlcm1pc3Npb24oKS50aGVuKHJlc3VsdCA9PiB7IHJlc29sdmVyKHJlc3VsdCkgfSkuY2F0Y2gocmVqZWN0UHJvbWlzZSlcbiAgICAgIH1cbiAgICAgIGVsc2UgcmVzb2x2ZVByb21pc2UoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIFB1c2ggaGFzIGJlZW4gZ3JhbnRlZCBwZXJtaXNzaW9uIHRvIHJ1blxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaGFzKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgpID09PSB0aGlzLkdSQU5URUQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcGVybWlzc2lvbiBsZXZlbFxuICAgKiBAcmV0dXJuIHtQZXJtaXNzaW9ufSBUaGUgcGVybWlzc2lvbiBsZXZlbFxuICAgKi9cbiAgZ2V0KCkge1xuICAgIGxldCBwZXJtaXNzaW9uO1xuXG4gICAgLyogU2FmYXJpIDYrLCBDaHJvbWUgMjMrICovXG4gICAgaWYgKHRoaXMuX3dpbi5Ob3RpZmljYXRpb24gJiYgdGhpcy5fd2luLk5vdGlmaWNhdGlvbi5wZXJtaXNzaW9uKVxuICAgICAgcGVybWlzc2lvbiA9IHRoaXMuX3dpbi5Ob3RpZmljYXRpb24ucGVybWlzc2lvbjtcblxuICAgIC8qIExlZ2FjeSB3ZWJraXQgYnJvd3NlcnMgKi9cbiAgICBlbHNlIGlmICh0aGlzLl93aW4ud2Via2l0Tm90aWZpY2F0aW9ucyAmJiB0aGlzLl93aW4ud2Via2l0Tm90aWZpY2F0aW9ucy5jaGVja1Blcm1pc3Npb24pXG4gICAgICBwZXJtaXNzaW9uID0gdGhpcy5fcGVybWlzc2lvbnNbdGhpcy5fd2luLndlYmtpdE5vdGlmaWNhdGlvbnMuY2hlY2tQZXJtaXNzaW9uKCldO1xuXG4gICAgLyogRmlyZWZveCBNb2JpbGUgKi9cbiAgICBlbHNlIGlmIChuYXZpZ2F0b3IubW96Tm90aWZpY2F0aW9uKVxuICAgICAgcGVybWlzc2lvbiA9IHRoaXMuR1JBTlRFRDtcblxuICAgIC8qIElFOSsgKi9cbiAgICBlbHNlIGlmICh0aGlzLl93aW4uZXh0ZXJuYWwgJiYgdGhpcy5fd2luLmV4dGVybmFsLm1zSXNTaXRlTW9kZSlcbiAgICAgIHBlcm1pc3Npb24gPSB0aGlzLl93aW4uZXh0ZXJuYWwubXNJc1NpdGVNb2RlKCkgPyB0aGlzLkdSQU5URUQgOiB0aGlzLkRFRkFVTFQ7XG5cbiAgICBlbHNlXG4gICAgICBwZXJtaXNzaW9uID0gdGhpcy5HUkFOVEVEO1xuXG4gICAgcmV0dXJuIHBlcm1pc3Npb247XG4gIH1cbn1cbiIsImltcG9ydCBNZXNzYWdlcyBmcm9tIFwiLi9NZXNzYWdlc1wiO1xuaW1wb3J0IFBlcm1pc3Npb24gZnJvbSBcIi4vUGVybWlzc2lvblwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4vVXRpbFwiO1xuLyogSW1wb3J0IG5vdGlmaWNhdGlvbiBhZ2VudHMgKi9cbmltcG9ydCBEZXNrdG9wQWdlbnQgZnJvbSBcIi4vYWdlbnRzL0Rlc2t0b3BBZ2VudFwiO1xuaW1wb3J0IE1vYmlsZUNocm9tZUFnZW50IGZyb20gXCIuL2FnZW50cy9Nb2JpbGVDaHJvbWVBZ2VudFwiO1xuaW1wb3J0IE1vYmlsZUZpcmVmb3hBZ2VudCBmcm9tIFwiLi9hZ2VudHMvTW9iaWxlRmlyZWZveEFnZW50XCI7XG5pbXBvcnQgTVNBZ2VudCBmcm9tIFwiLi9hZ2VudHMvTVNBZ2VudFwiO1xuaW1wb3J0IFdlYktpdEFnZW50IGZyb20gXCIuL2FnZW50cy9XZWJLaXRBZ2VudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQdXNoIHtcblxuICBjb25zdHJ1Y3Rvcih3aW4pIHtcbiAgICAvKiBQcml2YXRlIHZhcmlhYmxlcyAqL1xuXG4gICAgLyogSUQgdG8gdXNlIGZvciBuZXcgbm90aWZpY2F0aW9ucyAqL1xuICAgIHRoaXMuX2N1cnJlbnRJZCA9IDA7XG5cbiAgICAvKiBNYXAgb2Ygb3BlbiBub3RpZmljYXRpb25zICovXG4gICAgdGhpcy5fbm90aWZpY2F0aW9ucyA9IHt9O1xuXG4gICAgLyogV2luZG93IG9iamVjdCAqL1xuICAgIHRoaXMuX3dpbiA9IHdpbjtcblxuICAgIC8qIFB1YmxpYyB2YXJpYWJsZXMgKi9cbiAgICB0aGlzLlBlcm1pc3Npb24gPSBuZXcgUGVybWlzc2lvbih3aW4pO1xuXG4gICAgLyogQWdlbnRzICovXG4gICAgdGhpcy5fYWdlbnRzID0ge1xuICAgICAgZGVza3RvcDogbmV3IERlc2t0b3BBZ2VudCh3aW4pLFxuICAgICAgY2hyb21lOiBuZXcgTW9iaWxlQ2hyb21lQWdlbnQod2luKSxcbiAgICAgIGZpcmVmb3g6IG5ldyBNb2JpbGVGaXJlZm94QWdlbnQod2luKSxcbiAgICAgIG1zOiBuZXcgTVNBZ2VudCh3aW4pLFxuICAgICAgd2Via2l0OiBuZXcgV2ViS2l0QWdlbnQod2luKVxuICAgIH07XG5cbiAgICB0aGlzLl9jb25maWd1cmF0aW9uID0ge1xuICAgICAgc2VydmljZVdvcmtlcjogJy9zZXJ2aWNlV29ya2VyLm1pbi5qcycsXG4gICAgICBmYWxsYmFjazogZnVuY3Rpb24ocGF5bG9hZCkge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGEgbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSB7Tm90aWZpY2F0aW9ufSBub3RpZmljYXRpb25cbiAgICogQHJldHVybiB7Qm9vbGVhbn0gYm9vbGVhbiBkZW5vdGluZyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jbG9zZU5vdGlmaWNhdGlvbihpZCkge1xuICAgIGxldCBzdWNjZXNzID0gdHJ1ZTtcbiAgICBjb25zdCBub3RpZmljYXRpb24gPSB0aGlzLl9ub3RpZmljYXRpb25zW2lkXTtcblxuICAgIGlmIChub3RpZmljYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3VjY2VzcyA9IHRoaXMuX3JlbW92ZU5vdGlmaWNhdGlvbihpZCk7XG5cbiAgICAgIC8qIFNhZmFyaSA2KywgRmlyZWZveCAyMissIENocm9tZSAyMissIE9wZXJhIDI1KyAqL1xuICAgICAgaWYgKHRoaXMuX2FnZW50cy5kZXNrdG9wLmlzU3VwcG9ydGVkKCkpXG4gICAgICAgIHRoaXMuX2FnZW50cy5kZXNrdG9wLmNsb3NlKG5vdGlmaWNhdGlvbik7XG5cbiAgICAgIC8qIExlZ2FjeSBXZWJLaXQgYnJvd3NlcnMgKi9cbiAgICAgIGVsc2UgaWYgKHRoaXMuX2FnZW50cy53ZWJraXQuaXNTdXBwb3J0ZWQoKSlcbiAgICAgICAgdGhpcy5fYWdlbnRzLndlYmtpdC5jbG9zZShub3RpZmljYXRpb24pO1xuXG4gICAgICAvKiBJRTkgKi9cbiAgICAgIGVsc2UgaWYgKHRoaXMuX2FnZW50cy5tcy5pc1N1cHBvcnRlZCgpKVxuICAgICAgICB0aGlzLl9hZ2VudHMubXMuY2xvc2UoKTtcblxuICAgICAgZWxzZSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKE1lc3NhZ2VzLmVycm9ycy51bmtub3duX2ludGVyZmFjZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbm90aWZpY2F0aW9uIHRvIHRoZSBnbG9iYWwgZGljdGlvbmFyeSBvZiBub3RpZmljYXRpb25zXG4gICAqIEBwYXJhbSB7Tm90aWZpY2F0aW9ufSBub3RpZmljYXRpb25cbiAgICogQHJldHVybiB7SW50ZWdlcn0gRGljdGlvbmFyeSBrZXkgb2YgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2FkZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuX2N1cnJlbnRJZDtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25zW2lkXSA9IG5vdGlmaWNhdGlvbjtcbiAgICB0aGlzLl9jdXJyZW50SWQrKztcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIG5vdGlmaWNhdGlvbiB3aXRoIHRoZSBnaXZlbiBJRFxuICAgKiBAcGFyYW0gIHtJbnRlZ2VyfSBpZCAtIERpY3Rpb25hcnkga2V5L0lEIG9mIHRoZSBub3RpZmljYXRpb24gdG8gcmVtb3ZlXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IGJvb2xlYW4gZGVub3Rpbmcgc3VjY2Vzc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlbW92ZU5vdGlmaWNhdGlvbihpZCkge1xuICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5fbm90aWZpY2F0aW9ucy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgIC8qIFdlJ3JlIHN1Y2Nlc3NmdWwgaWYgd2Ugb21pdCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgbmV3IGFycmF5ICovXG4gICAgICBkZWxldGUgdGhpcy5fbm90aWZpY2F0aW9uc1tpZF07XG4gICAgICBzdWNjZXNzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSB3cmFwcGVyIGZvciBhIGdpdmVuIG5vdGlmaWNhdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0ludGVnZXJ9IGlkIC0gRGljdGlvbmFyeSBrZXkvSUQgb2YgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0ge01hcH0gb3B0aW9ucyAtIE9wdGlvbnMgdXNlZCB0byBjcmVhdGUgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcmV0dXJucyB7TWFwfSB3cmFwcGVyIGhhc2htYXAgb2JqZWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcHJlcGFyZU5vdGlmaWNhdGlvbihpZCwgb3B0aW9ucykge1xuICAgIGxldCB3cmFwcGVyO1xuXG4gICAgLyogV3JhcHBlciB1c2VkIHRvIGdldC9jbG9zZSBub3RpZmljYXRpb24gbGF0ZXIgb24gKi9cbiAgICB3cmFwcGVyID0ge1xuICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmljYXRpb25zW2lkXTtcbiAgICAgIH0sXG5cbiAgICAgIGNsb3NlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Nsb3NlTm90aWZpY2F0aW9uKGlkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyogQXV0b2Nsb3NlIHRpbWVvdXQgKi9cbiAgICBpZiAob3B0aW9ucy50aW1lb3V0KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgd3JhcHBlci5jbG9zZSgpO1xuICAgICAgfSwgb3B0aW9ucy50aW1lb3V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcHBlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBtb3N0IHJlY2VudCBub3RpZmljYXRpb24gZnJvbSBhIFNlcnZpY2VXb3JrZXIgYW5kIGFkZCBpdCB0byB0aGUgZ2xvYmFsIGFycmF5XG4gICAqIEBwYXJhbSBub3RpZmljYXRpb25zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2VydmljZVdvcmtlckNhbGxiYWNrKG5vdGlmaWNhdGlvbnMsIG9wdGlvbnMsIHJlc29sdmUpIHtcbiAgICBsZXQgaWQgPSB0aGlzLl9hZGROb3RpZmljYXRpb24obm90aWZpY2F0aW9uc1tub3RpZmljYXRpb25zLmxlbmd0aCAtIDFdKTtcblxuICAgIC8qIExpc3RlbiBmb3IgY2xvc2UgcmVxdWVzdHMgZnJvbSB0aGUgU2VydmljZVdvcmtlciAqL1xuICAgIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTtcblxuICAgICAgaWYgKGRhdGEuYWN0aW9uID09PSAnY2xvc2UnICYmIE51bWJlci5pc0ludGVnZXIoZGF0YS5pZCkpXG4gICAgICAgIHRoaXMuX3JlbW92ZU5vdGlmaWNhdGlvbihkYXRhLmlkKTtcbiAgICB9KTtcblxuICAgIHJlc29sdmUodGhpcy5fcHJlcGFyZU5vdGlmaWNhdGlvbihpZCwgb3B0aW9ucykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgJ2NyZWF0ZScgbWV0aG9kXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY3JlYXRlQ2FsbGJhY2sodGl0bGUsIG9wdGlvbnMsIHJlc29sdmUpIHtcbiAgICBsZXQgbm90aWZpY2F0aW9uID0gbnVsbDtcbiAgICBsZXQgb25DbG9zZTtcblxuICAgIC8qIFNldCBlbXB0eSBzZXR0aW5ncyBpZiBub25lIGFyZSBzcGVjaWZpZWQgKi9cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIC8qIG9uQ2xvc2UgZXZlbnQgaGFuZGxlciAqL1xuICAgIG9uQ2xvc2UgPSAoaWQpID0+IHtcbiAgICAgIC8qIEEgYml0IHJlZHVuZGFudCwgYnV0IGNvdmVycyB0aGUgY2FzZXMgd2hlbiBjbG9zZSgpIGlzbid0IGV4cGxpY2l0bHkgY2FsbGVkICovXG4gICAgICB0aGlzLl9yZW1vdmVOb3RpZmljYXRpb24oaWQpO1xuICAgICAgaWYgKFV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQ2xvc2UpKSB7XG4gICAgICAgIG9wdGlvbnMub25DbG9zZS5jYWxsKHRoaXMsIG5vdGlmaWNhdGlvbik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qIFNhZmFyaSA2KywgRmlyZWZveCAyMissIENocm9tZSAyMissIE9wZXJhIDI1KyAqL1xuICAgIGlmICh0aGlzLl9hZ2VudHMuZGVza3RvcC5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvKiBDcmVhdGUgYSBub3RpZmljYXRpb24gdXNpbmcgdGhlIEFQSSBpZiBwb3NzaWJsZSAqL1xuICAgICAgICBub3RpZmljYXRpb24gPSB0aGlzLl9hZ2VudHMuZGVza3RvcC5jcmVhdGUodGl0bGUsIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuX2N1cnJlbnRJZDtcbiAgICAgICAgY29uc3Qgc3cgPSB0aGlzLmNvbmZpZygpLnNlcnZpY2VXb3JrZXI7XG4gICAgICAgIGNvbnN0IGNiID0gKG5vdGlmaWNhdGlvbnMpID0+IHRoaXMuX3NlcnZpY2VXb3JrZXJDYWxsYmFjayhub3RpZmljYXRpb25zLCBvcHRpb25zLCByZXNvbHZlKTtcbiAgICAgICAgLyogQ3JlYXRlIGEgQ2hyb21lIFNlcnZpY2VXb3JrZXIgbm90aWZpY2F0aW9uIGlmIGl0IGlzbid0IHN1cHBvcnRlZCAqL1xuICAgICAgICBpZiAodGhpcy5fYWdlbnRzLmNocm9tZS5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICAgICAgdGhpcy5fYWdlbnRzLmNocm9tZS5jcmVhdGUoaWQsIHRpdGxlLCBvcHRpb25zLCBzdywgY2IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBMZWdhY3kgV2ViS2l0IGJyb3dzZXJzICovXG4gICAgfSBlbHNlIGlmICh0aGlzLl9hZ2VudHMud2Via2l0LmlzU3VwcG9ydGVkKCkpXG4gICAgICBub3RpZmljYXRpb24gPSB0aGlzLl9hZ2VudHMud2Via2l0LmNyZWF0ZSh0aXRsZSwgb3B0aW9ucyk7XG5cbiAgICAvKiBGaXJlZm94IE1vYmlsZSAqL1xuICAgIGVsc2UgaWYgKHRoaXMuX2FnZW50cy5maXJlZm94LmlzU3VwcG9ydGVkKCkpXG4gICAgICB0aGlzLl9hZ2VudHMuZmlyZWZveC5jcmVhdGUodGl0bGUsIG9wdGlvbnMpO1xuXG4gICAgLyogSUU5ICovXG4gICAgZWxzZSBpZiAodGhpcy5fYWdlbnRzLm1zLmlzU3VwcG9ydGVkKCkpXG4gICAgICBub3RpZmljYXRpb24gPSB0aGlzLl9hZ2VudHMubXMuY3JlYXRlKHRpdGxlLCBvcHRpb25zKTtcblxuICAgIC8qIERlZmF1bHQgZmFsbGJhY2sgKi9cbiAgICBlbHNlIHtcbiAgICAgIG9wdGlvbnMudGl0bGUgPSB0aXRsZTtcbiAgICAgIHRoaXMuY29uZmlnKCkuZmFsbGJhY2sob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKG5vdGlmaWNhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgaWQgPSB0aGlzLl9hZGROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLl9wcmVwYXJlTm90aWZpY2F0aW9uKGlkLCBvcHRpb25zKTtcblxuICAgICAgLyogTm90aWZpY2F0aW9uIGNhbGxiYWNrcyAqL1xuICAgICAgaWYgKFV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uU2hvdykpXG4gICAgICAgIG5vdGlmaWNhdGlvbi5hZGRFdmVudExpc3RlbmVyKCdzaG93Jywgb3B0aW9ucy5vblNob3cpO1xuXG4gICAgICBpZiAoVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25FcnJvcikpXG4gICAgICAgIG5vdGlmaWNhdGlvbi5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9wdGlvbnMub25FcnJvcik7XG5cbiAgICAgIGlmIChVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkNsaWNrKSlcbiAgICAgICAgbm90aWZpY2F0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3B0aW9ucy5vbkNsaWNrKTtcblxuICAgICAgbm90aWZpY2F0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICBvbkNsb3NlKGlkKTtcbiAgICAgIH0pO1xuXG4gICAgICBub3RpZmljYXRpb24uYWRkRXZlbnRMaXN0ZW5lcignY2FuY2VsJywgKCkgPT4ge1xuICAgICAgICBvbkNsb3NlKGlkKTtcbiAgICAgIH0pO1xuXG4gICAgICAvKiBSZXR1cm4gdGhlIHdyYXBwZXIgc28gdGhlIHVzZXIgY2FuIGNhbGwgY2xvc2UoKSAqL1xuICAgICAgcmVzb2x2ZSh3cmFwcGVyKTtcbiAgICB9XG5cbiAgICAvKiBCeSBkZWZhdWx0LCBwYXNzIGFuIGVtcHR5IHdyYXBwZXIgKi9cbiAgICByZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGRpc3BsYXlzIGEgbmV3IG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0ge0FycmF5fSBvcHRpb25zXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuICBjcmVhdGUodGl0bGUsIG9wdGlvbnMpIHtcbiAgICBsZXQgcHJvbWlzZUNhbGxiYWNrO1xuXG4gICAgLyogRmFpbCBpZiBubyBvciBhbiBpbnZhbGlkIHRpdGxlIGlzIHByb3ZpZGVkICovXG4gICAgaWYgKCFVdGlsLmlzU3RyaW5nKHRpdGxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKE1lc3NhZ2VzLmVycm9ycy5pbnZhbGlkX3RpdGxlKTtcbiAgICB9XG5cbiAgICAvKiBSZXF1ZXN0IHBlcm1pc3Npb24gaWYgaXQgaXNuJ3QgZ3JhbnRlZCAqL1xuICAgIGlmICghdGhpcy5QZXJtaXNzaW9uLmhhcygpKSB7XG4gICAgICBwcm9taXNlQ2FsbGJhY2sgPSAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuUGVybWlzc2lvbi5yZXF1ZXN0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fY3JlYXRlQ2FsbGJhY2sodGl0bGUsIG9wdGlvbnMsIHJlc29sdmUpO1xuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KE1lc3NhZ2VzLmVycm9ycy5wZXJtaXNzaW9uX2RlbmllZCk7XG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlQ2FsbGJhY2sgPSAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fY3JlYXRlQ2FsbGJhY2sodGl0bGUsIG9wdGlvbnMsIHJlc29sdmUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShwcm9taXNlQ2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5vdGlmaWNhdGlvbiBjb3VudFxuICAgKiBAcmV0dXJuIHtJbnRlZ2VyfSBUaGUgbm90aWZpY2F0aW9uIGNvdW50XG4gICAqL1xuICBjb3VudCgpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGxldCBrZXk7XG5cbiAgICBmb3IgKGtleSBpbiB0aGlzLl9ub3RpZmljYXRpb25zKVxuICAgICAgaWYgKHRoaXMuX25vdGlmaWNhdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSkgY291bnQrKztcblxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgYSBub3RpZmljYXRpb24gd2l0aCB0aGUgZ2l2ZW4gdGFnXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0YWcgLSBUYWcgb2YgdGhlIG5vdGlmaWNhdGlvbiB0byBjbG9zZVxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBib29sZWFuIGRlbm90aW5nIHN1Y2Nlc3NcbiAgICovXG4gIGNsb3NlKHRhZykge1xuICAgIGxldCBrZXksIG5vdGlmaWNhdGlvbjtcblxuICAgIGZvciAoa2V5IGluIHRoaXMuX25vdGlmaWNhdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLl9ub3RpZmljYXRpb25zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgbm90aWZpY2F0aW9uID0gdGhpcy5fbm90aWZpY2F0aW9uc1trZXldO1xuXG4gICAgICAgIC8qIFJ1biBvbmx5IGlmIHRoZSB0YWdzIG1hdGNoICovXG4gICAgICAgIGlmIChub3RpZmljYXRpb24udGFnID09PSB0YWcpIHtcblxuICAgICAgICAgIC8qIENhbGwgdGhlIG5vdGlmaWNhdGlvbidzIGNsb3NlKCkgbWV0aG9kICovXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb3NlTm90aWZpY2F0aW9uKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFsbCBub3RpZmljYXRpb25zXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IGJvb2xlYW4gZGVub3Rpbmcgd2hldGhlciB0aGUgY2xlYXIgd2FzIHN1Y2Nlc3NmdWwgaW4gY2xvc2luZyBhbGwgbm90aWZpY2F0aW9uc1xuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgbGV0IGtleSwgc3VjY2VzcyA9IHRydWU7XG5cbiAgICBmb3IgKGtleSBpbiB0aGlzLl9ub3RpZmljYXRpb25zKVxuICAgICAgaWYgKHRoaXMuX25vdGlmaWNhdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgdGhpcy5fY2xvc2VOb3RpZmljYXRpb24oa2V5KTtcblxuICAgIHJldHVybiBzdWNjZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbm90ZXMgd2hldGhlciBQdXNoIGlzIHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBicm93c2VyXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3VwcG9ydGVkKCkge1xuICAgIGxldCBzdXBwb3J0ZWQgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGFnZW50IGluIHRoaXMuX2FnZW50cylcbiAgICAgIGlmICh0aGlzLl9hZ2VudHMuaGFzT3duUHJvcGVydHkoYWdlbnQpKVxuICAgICAgICBzdXBwb3J0ZWQgPSBzdXBwb3J0ZWQgfHwgdGhpcy5fYWdlbnRzW2FnZW50XS5pc1N1cHBvcnRlZCgpXG5cbiAgICByZXR1cm4gc3VwcG9ydGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIHNldHRpbmdzIG9yIHJldHVybnMgYWxsIHNldHRpbmdzIGlmIG5vIHBhcmFtZXRlciBwYXNzZWRcbiAgICogQHBhcmFtIHNldHRpbmdzXG4gICAqL1xuICBjb25maWcoc2V0dGluZ3MpIHtcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzICE9PSAndW5kZWZpbmVkJyB8fCBzZXR0aW5ncyAhPT0gbnVsbCAmJiBVdGlsLmlzT2JqZWN0KHNldHRpbmdzKSlcbiAgICAgIFV0aWwub2JqZWN0TWVyZ2UodGhpcy5fY29uZmlndXJhdGlvbiwgc2V0dGluZ3MpO1xuICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcGllcyB0aGUgZnVuY3Rpb25zIGZyb20gYSBwbHVnaW4gdG8gdGhlIG1haW4gbGlicmFyeVxuICAgKiBAcGFyYW0gcGx1Z2luXG4gICAqL1xuICBleHRlbmQobWFuaWZlc3QpIHtcbiAgICB2YXIgcGx1Z2luLCBQbHVnaW4sXG4gICAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgICBpZiAoIWhhc1Byb3AuY2FsbChtYW5pZmVzdCwgJ3BsdWdpbicpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoTWVzc2FnZXMuZXJyb3JzLmludmFsaWRfcGx1Z2luKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhc1Byb3AuY2FsbChtYW5pZmVzdCwgJ2NvbmZpZycpICYmIFV0aWwuaXNPYmplY3QobWFuaWZlc3QuY29uZmlnKSAmJiBtYW5pZmVzdC5jb25maWcgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5jb25maWcobWFuaWZlc3QuY29uZmlnKTtcbiAgICAgIH1cblxuICAgICAgUGx1Z2luID0gbWFuaWZlc3QucGx1Z2luO1xuICAgICAgcGx1Z2luID0gbmV3IFBsdWdpbih0aGlzLmNvbmZpZygpKVxuXG4gICAgICBmb3IgKHZhciBtZW1iZXIgaW4gcGx1Z2luKSB7XG4gICAgICAgIGlmIChoYXNQcm9wLmNhbGwocGx1Z2luLCBtZW1iZXIpICYmIFV0aWwuaXNGdW5jdGlvbihwbHVnaW5bbWVtYmVyXSkpXG4gICAgICAgICAgdGhpc1ttZW1iZXJdID0gcGx1Z2luW21lbWJlcl07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBVdGlsIHtcbiAgc3RhdGljIGlzVW5kZWZpbmVkKG9iaikge1xuICAgIHJldHVybiBvYmogPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHN0YXRpYyBpc1N0cmluZyhvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICBzdGF0aWMgaXNGdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIHt9LnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfVxuXG4gIHN0YXRpYyBpc09iamVjdChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCdcbiAgfVxuXG4gIHN0YXRpYyBvYmplY3RNZXJnZSh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkoa2V5KSAmJiB0aGlzLmlzT2JqZWN0KHRhcmdldFtrZXldKSAmJiB0aGlzLmlzT2JqZWN0KHNvdXJjZVtrZXldKSkge1xuICAgICAgICB0aGlzLm9iamVjdE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBBYnN0cmFjdEFnZW50IHtcbiAgY29uc3RydWN0b3Iod2luKSB7XG4gICAgdGhpcy5fd2luID0gd2luO1xuICB9XG59XG4iLCJpbXBvcnQgQWJzdHJhY3RBZ2VudCBmcm9tICcuL0Fic3RyYWN0QWdlbnQnO1xuaW1wb3J0IFV0aWwgZnJvbSAnLi4vVXRpbCc7XG5cbi8qKlxuICogTm90aWZpY2F0aW9uIGFnZW50IGZvciBtb2Rlcm4gZGVza3RvcCBicm93c2VyczpcbiAqIFNhZmFyaSA2KywgRmlyZWZveCAyMissIENocm9tZSAyMissIE9wZXJhIDI1K1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZXNrdG9wQWdlbnQgZXh0ZW5kcyBBYnN0cmFjdEFnZW50IHtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGJvb2xlYW4gZGVub3Rpbmcgc3VwcG9ydFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gYm9vbGVhbiBkZW5vdGluZyB3aGV0aGVyIHdlYmtpdCBub3RpZmljYXRpb25zIGFyZSBzdXBwb3J0ZWRcbiAgICovXG4gIGlzU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl93aW4uTm90aWZpY2F0aW9uICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBub3RpZmljYXRpb25cbiAgICogQHBhcmFtIHRpdGxlIC0gbm90aWZpY2F0aW9uIHRpdGxlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gbm90aWZpY2F0aW9uIG9wdGlvbnMgYXJyYXlcbiAgICogQHJldHVybnMge05vdGlmaWNhdGlvbn1cbiAgICovXG4gIGNyZWF0ZSh0aXRsZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgdGhpcy5fd2luLk5vdGlmaWNhdGlvbihcbiAgICAgIHRpdGxlLFxuICAgICAge1xuICAgICAgICBpY29uOiAoVXRpbC5pc1N0cmluZyhvcHRpb25zLmljb24pIHx8IFV0aWwuaXNVbmRlZmluZWQob3B0aW9ucy5pY29uKSkgPyBvcHRpb25zLmljb24gOiBvcHRpb25zLmljb24ueDMyLFxuICAgICAgICBib2R5OiBvcHRpb25zLmJvZHksXG4gICAgICAgIHRhZzogb3B0aW9ucy50YWcsXG4gICAgICAgIHJlcXVpcmVJbnRlcmFjdGlvbjogb3B0aW9ucy5yZXF1aXJlSW50ZXJhY3Rpb25cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGEgZ2l2ZW4gbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSBub3RpZmljYXRpb24gLSBub3RpZmljYXRpb24gdG8gY2xvc2VcbiAgICovXG4gIGNsb3NlKG5vdGlmaWNhdGlvbikge1xuICAgIG5vdGlmaWNhdGlvbi5jbG9zZSgpO1xuICB9XG59XG4iLCJpbXBvcnQgQWJzdHJhY3RBZ2VudCBmcm9tICcuL0Fic3RyYWN0QWdlbnQnO1xuaW1wb3J0IFV0aWwgZnJvbSAnLi4vVXRpbCc7XG5cbi8qKlxuICogTm90aWZpY2F0aW9uIGFnZW50IGZvciBJRTlcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTVNBZ2VudCBleHRlbmRzIEFic3RyYWN0QWdlbnQge1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBkZW5vdGluZyBzdXBwb3J0XG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBib29sZWFuIGRlbm90aW5nIHdoZXRoZXIgd2Via2l0IG5vdGlmaWNhdGlvbnMgYXJlIHN1cHBvcnRlZFxuICAgKi9cbiAgaXNTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICh0aGlzLl93aW4uZXh0ZXJuYWwgIT09IHVuZGVmaW5lZCkgJiYgKHRoaXMuX3dpbi5leHRlcm5hbC5tc0lzU2l0ZU1vZGUgIT09IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBub3RpZmljYXRpb25cbiAgICogQHBhcmFtIHRpdGxlIC0gbm90aWZpY2F0aW9uIHRpdGxlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gbm90aWZpY2F0aW9uIG9wdGlvbnMgYXJyYXlcbiAgICogQHJldHVybnMge05vdGlmaWNhdGlvbn1cbiAgICovXG4gIGNyZWF0ZSh0aXRsZSwgb3B0aW9ucykge1xuICAgIC8qIENsZWFyIGFueSBwcmV2aW91cyBub3RpZmljYXRpb25zICovXG4gICAgdGhpcy5fd2luLmV4dGVybmFsLm1zU2l0ZU1vZGVDbGVhckljb25PdmVybGF5KCk7XG5cbiAgICB0aGlzLl93aW4uZXh0ZXJuYWwubXNTaXRlTW9kZVNldEljb25PdmVybGF5KFxuICAgICAgKChVdGlsLmlzU3RyaW5nKG9wdGlvbnMuaWNvbikgfHwgVXRpbC5pc1VuZGVmaW5lZChvcHRpb25zLmljb24pKVxuICAgICAgICA/IG9wdGlvbnMuaWNvblxuICAgICAgICA6IG9wdGlvbnMuaWNvbi54MTYpLCB0aXRsZVxuICAgICk7XG5cbiAgICB0aGlzLl93aW4uZXh0ZXJuYWwubXNTaXRlTW9kZUFjdGl2YXRlKCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBhIGdpdmVuIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gbm90aWZpY2F0aW9uIC0gbm90aWZpY2F0aW9uIHRvIGNsb3NlXG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICB0aGlzLl93aW4uZXh0ZXJuYWwubXNTaXRlTW9kZUNsZWFySWNvbk92ZXJsYXkoKVxuICB9XG59XG4iLCJpbXBvcnQgQWJzdHJhY3RBZ2VudCBmcm9tICcuL0Fic3RyYWN0QWdlbnQnO1xuaW1wb3J0IFV0aWwgZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgTWVzc2FnZXMgZnJvbSAnLi4vTWVzc2FnZXMnO1xuXG4vKipcbiAqIE5vdGlmaWNhdGlvbiBhZ2VudCBmb3IgbW9kZXJuIGRlc2t0b3AgYnJvd3NlcnM6XG4gKiBTYWZhcmkgNissIEZpcmVmb3ggMjIrLCBDaHJvbWUgMjIrLCBPcGVyYSAyNStcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9iaWxlQ2hyb21lQWdlbnQgZXh0ZW5kcyBBYnN0cmFjdEFnZW50IHtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGJvb2xlYW4gZGVub3Rpbmcgc3VwcG9ydFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gYm9vbGVhbiBkZW5vdGluZyB3aGV0aGVyIHdlYmtpdCBub3RpZmljYXRpb25zIGFyZSBzdXBwb3J0ZWRcbiAgICovXG4gIGlzU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl93aW4ubmF2aWdhdG9yICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuX3dpbi5uYXZpZ2F0b3Iuc2VydmljZVdvcmtlciAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZ1bmN0aW9uIGJvZHkgYXMgYSBzdHJpbmdcbiAgICogQHBhcmFtIGZ1bmNcbiAgICovXG4gIGdldEZ1bmN0aW9uQm9keShmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmMudG9TdHJpbmcoKS5tYXRjaCgvZnVuY3Rpb25bXntdK3soW1xcc1xcU10qKX0kLylbMV07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBub3RpZmljYXRpb25cbiAgICogQHBhcmFtIHRpdGxlIC0gbm90aWZpY2F0aW9uIHRpdGxlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gbm90aWZpY2F0aW9uIG9wdGlvbnMgYXJyYXlcbiAgICogQHJldHVybnMge05vdGlmaWNhdGlvbn1cbiAgICovXG4gIGNyZWF0ZShpZCwgdGl0bGUsIG9wdGlvbnMsIHNlcnZpY2VXb3JrZXIsIGNhbGxiYWNrKSB7XG4gICAgLyogUmVnaXN0ZXIgU2VydmljZVdvcmtlciAqL1xuICAgIHRoaXMuX3dpbi5uYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWdpc3RlcihzZXJ2aWNlV29ya2VyKTtcblxuICAgIHRoaXMuX3dpbi5uYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWFkeS50aGVuKHJlZ2lzdHJhdGlvbiA9PiB7XG4gICAgICAvKiBMb2NhbCBkYXRhIHRoZSBzZXJ2aWNlIHdvcmtlciB3aWxsIHVzZSAqL1xuICAgICAgbGV0IGxvY2FsRGF0YSA9IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBsaW5rOiBvcHRpb25zLmxpbmssXG4gICAgICAgIG9yaWdpbjogZG9jdW1lbnQubG9jYXRpb24uaHJlZixcbiAgICAgICAgb25DbGljazogKFV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQ2xpY2spKSA/IHRoaXMuZ2V0RnVuY3Rpb25Cb2R5KG9wdGlvbnMub25DbGljaykgOiAnJyxcbiAgICAgICAgb25DbG9zZTogKFV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQ2xvc2UpKSA/IHRoaXMuZ2V0RnVuY3Rpb25Cb2R5KG9wdGlvbnMub25DbG9zZSkgOiAnJ1xuICAgICAgfTtcblxuICAgICAgLyogTWVyZ2UgdGhlIGxvY2FsIGRhdGEgd2l0aCB1c2VyLXByb3ZpZGVkIGRhdGEgKi9cbiAgICAgIGlmIChvcHRpb25zLmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmRhdGEgIT09IG51bGwpXG4gICAgICAgIGxvY2FsRGF0YSA9IE9iamVjdC5hc3NpZ24obG9jYWxEYXRhLCBvcHRpb25zLmRhdGEpO1xuXG4gICAgICAvKiBTaG93IHRoZSBub3RpZmljYXRpb24gKi9cbiAgICAgIHJlZ2lzdHJhdGlvbi5zaG93Tm90aWZpY2F0aW9uKFxuICAgICAgICB0aXRsZSxcbiAgICAgICAge1xuICAgICAgICAgIGljb246IG9wdGlvbnMuaWNvbixcbiAgICAgICAgICBib2R5OiBvcHRpb25zLmJvZHksXG4gICAgICAgICAgdmlicmF0ZTogb3B0aW9ucy52aWJyYXRlLFxuICAgICAgICAgIHRhZzogb3B0aW9ucy50YWcsXG4gICAgICAgICAgZGF0YTogbG9jYWxEYXRhLFxuICAgICAgICAgIHJlcXVpcmVJbnRlcmFjdGlvbjogb3B0aW9ucy5yZXF1aXJlSW50ZXJhY3Rpb24sXG4gICAgICAgICAgc2lsZW50OiBvcHRpb25zLnNpbGVudFxuICAgICAgICB9XG4gICAgICApLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgIHJlZ2lzdHJhdGlvbi5nZXROb3RpZmljYXRpb25zKCkudGhlbihub3RpZmljYXRpb25zID0+IHtcbiAgICAgICAgICAvKiBTZW5kIGFuIGVtcHR5IG1lc3NhZ2Ugc28gdGhlIFNlcnZpY2VXb3JrZXIga25vd3Mgd2hvIHRoZSBjbGllbnQgaXMgKi9cbiAgICAgICAgICByZWdpc3RyYXRpb24uYWN0aXZlLnBvc3RNZXNzYWdlKCcnKTtcblxuICAgICAgICAgIC8qIFRyaWdnZXIgY2FsbGJhY2sgKi9cbiAgICAgICAgICBjYWxsYmFjayhub3RpZmljYXRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoTWVzc2FnZXMuZXJyb3JzLnN3X25vdGlmaWNhdGlvbl9lcnJvciArIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihNZXNzYWdlcy5lcnJvcnMuc3dfcmVnaXN0cmF0aW9uX2Vycm9yICsgZXJyb3IubWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgYWxsIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgLy8gQ2FuJ3QgZG8gdGhpcyB3aXRoIHNlcnZpY2Ugd29ya2Vyc1xuICB9XG59XG4iLCJpbXBvcnQgQWJzdHJhY3RBZ2VudCBmcm9tICcuL0Fic3RyYWN0QWdlbnQnO1xuXG4vKipcbiAqIE5vdGlmaWNhdGlvbiBhZ2VudCBmb3IgbW9kZXJuIGRlc2t0b3AgYnJvd3NlcnM6XG4gKiBTYWZhcmkgNissIEZpcmVmb3ggMjIrLCBDaHJvbWUgMjIrLCBPcGVyYSAyNStcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9iaWxlRmlyZWZveEFnZW50IGV4dGVuZHMgQWJzdHJhY3RBZ2VudCB7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBib29sZWFuIGRlbm90aW5nIHN1cHBvcnRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGJvb2xlYW4gZGVub3Rpbmcgd2hldGhlciB3ZWJraXQgbm90aWZpY2F0aW9ucyBhcmUgc3VwcG9ydGVkXG4gICAqL1xuICBpc1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd2luLm5hdmlnYXRvci5tb3pOb3RpZmljYXRpb24gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gdGl0bGUgLSBub3RpZmljYXRpb24gdGl0bGVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBub3RpZmljYXRpb24gb3B0aW9ucyBhcnJheVxuICAgKiBAcmV0dXJucyB7Tm90aWZpY2F0aW9ufVxuICAgKi9cbiAgY3JlYXRlKHRpdGxlLCBvcHRpb25zKSB7XG4gICAgbGV0IG5vdGlmaWNhdGlvbiA9IHRoaXMuX3dpbi5uYXZpZ2F0b3IubW96Tm90aWZpY2F0aW9uLmNyZWF0ZU5vdGlmaWNhdGlvbihcbiAgICAgIHRpdGxlLFxuICAgICAgb3B0aW9ucy5ib2R5LFxuICAgICAgb3B0aW9ucy5pY29uXG4gICAgKTtcblxuICAgIG5vdGlmaWNhdGlvbi5zaG93KCk7XG5cbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgQWJzdHJhY3RBZ2VudCBmcm9tICcuL0Fic3RyYWN0QWdlbnQnO1xuXG4vKipcbiAqIE5vdGlmaWNhdGlvbiBhZ2VudCBmb3Igb2xkIENocm9tZSB2ZXJzaW9ucyAoYW5kIHNvbWUpIEZpcmVmb3hcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViS2l0QWdlbnQgZXh0ZW5kcyBBYnN0cmFjdEFnZW50IHtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGJvb2xlYW4gZGVub3Rpbmcgc3VwcG9ydFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gYm9vbGVhbiBkZW5vdGluZyB3aGV0aGVyIHdlYmtpdCBub3RpZmljYXRpb25zIGFyZSBzdXBwb3J0ZWRcbiAgICovXG4gIGlzU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl93aW4ud2Via2l0Tm90aWZpY2F0aW9ucyAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSB0aXRsZSAtIG5vdGlmaWNhdGlvbiB0aXRsZVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIG5vdGlmaWNhdGlvbiBvcHRpb25zIGFycmF5XG4gICAqIEByZXR1cm5zIHtOb3RpZmljYXRpb259XG4gICAqL1xuICBjcmVhdGUodGl0bGUsIG9wdGlvbnMpIHtcbiAgICBsZXQgbm90aWZpY2F0aW9uID0gdGhpcy5fd2luLndlYmtpdE5vdGlmaWNhdGlvbnMuY3JlYXRlTm90aWZpY2F0aW9uKFxuICAgICAgb3B0aW9ucy5pY29uLFxuICAgICAgdGl0bGUsXG4gICAgICBvcHRpb25zLmJvZHlcbiAgICApO1xuXG4gICAgbm90aWZpY2F0aW9uLnNob3coKTtcblxuICAgIHJldHVybiBub3RpZmljYXRpb247XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgYSBnaXZlbiBub3RpZmljYXRpb25cbiAgICogQHBhcmFtIG5vdGlmaWNhdGlvbiAtIG5vdGlmaWNhdGlvbiB0byBjbG9zZVxuICAgKi9cbiAgY2xvc2Uobm90aWZpY2F0aW9uKSB7XG4gICAgbm90aWZpY2F0aW9uLmNhbmNlbCgpO1xuICB9XG59XG4iLCJpbXBvcnQgUHVzaCBmcm9tICcuL2NsYXNzZXMvUHVzaCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFB1c2godHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0aGlzKTtcbiJdfQ== diff --git a/bower_components/push.js/bin/push.min.js.map b/bower_components/push.js/bin/push.min.js.map new file mode 100644 index 0000000..cb771aa --- /dev/null +++ b/bower_components/push.js/bin/push.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","src/classes/Messages.js","src/classes/Permission.js","src/classes/Push.js","src/classes/Util.js","src/classes/agents/AbstractAgent.js","src/classes/agents/DesktopAgent.js","src/classes/agents/MSAgent.js","src/classes/agents/MobileChromeAgent.js","src/classes/agents/MobileFirefoxAgent.js","src/classes/agents/WebKitAgent.js","src/index.js"],"names":["f","exports","module","define","amd","window","global","self","this","Push","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","default","errors","incompatible","invalid_plugin","invalid_title","permission_denied","sw_notification_error","sw_registration_error","unknown_interface","Permission","_win","GRANTED","DEFAULT","DENIED","_permissions","arguments","_requestWithCallback","apply","_requestAsPromise","get","undefined","_this","Notification","permission","webkitNotifications","checkPermission","requestPermission","then","catch","_this2","Promise","h","navigator","mozNotification","external","msIsSiteMode","_currentId","_notifications","_Permission2","_agents","desktop","_DesktopAgent2","chrome","_MobileChromeAgent2","firefox","_MobileFirefoxAgent2","ms","_MSAgent2","webkit","_WebKitAgent2","_configuration","serviceWorker","fallback","_removeNotification","isSupported","close","_Messages2","hasOwnProperty","_closeNotification","timeout","setTimeout","_addNotification","addEventListener","JSON","parse","data","action","Number","isInteger","id","_prepareNotification","_this3","_Util2","isFunction","onClose","create","_o","config","_serviceWorkerCallback","title","_t","_n","onShow","onError","onClick","isString","has","_this4","_createCallback","request","tag","isObject","objectMerge","plugin","Util","toString","_typeof","AbstractAgent","DesktopAgent","_AbstractAgent","icon","isUndefined","x32","body","requireInteraction","MSAgent","msSiteModeClearIconOverlay","msSiteModeSetIconOverlay","x16","msSiteModeActivate","MobileChromeAgent","match","register","ready","link","origin","document","location","href","getFunctionBody","Object","assign","showNotification","vibrate","silent","getNotifications","active","postMessage","message","MobileFirefoxAgent","createNotification","show","WebKitAgent","cancel","_Push2"],"mappings":"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","file":"push.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 0) ? this._requestWithCallback(...arguments) : this._requestAsPromise();\n }\n\n /**\n * Old permissions implementation deprecated in favor of a promise based one\n * @deprecated Since V1.0.4\n * @param {Function} onGranted - Function to execute once permission is granted\n * @param {Function} onDenied - Function to execute once permission is denied\n * @return {void}\n */\n _requestWithCallback(onGranted, onDenied) {\n const existing = this.get();\n\n var resolve = (result = this._win.Notification.permission) => {\n if (typeof(result)==='undefined' && this._win.webkitNotifications)\n result = this._win.webkitNotifications.checkPermission();\n if (result === this.GRANTED || result === 0) {\n if (onGranted) onGranted();\n } else if (onDenied) onDenied();\n }\n\n /* Permissions already set */\n if (existing !== this.DEFAULT) {\n resolve(existing);\n }\n /* Safari 6+, Legacy webkit browsers */\n else if (this._win.webkitNotifications && this._win.webkitNotifications.checkPermission) {\n this._win.webkitNotifications.requestPermission(resolve);\n }\n /* Chrome 23+ */\n else if (this._win.Notification && this._win.Notification.requestPermission) {\n this._win.Notification.requestPermission().then(resolve).catch(function () {\n if (onDenied) onDenied();\n });\n }\n /* Let the user continue by default */\n else if (onGranted) {\n onGranted();\n }\n }\n\n /**\n * Requests permission for desktop notifications in a promise based way\n * @return {Promise}\n */\n _requestAsPromise() {\n const existing = this.get();\n\n let isGranted = result => (result === this.GRANTED || result === 0);\n\n /* Permissions already set */\n var hasPermissions = (existing !== this.DEFAULT);\n\n /* Safari 6+, Chrome 23+ */\n var isModernAPI = (this._win.Notification && this._win.Notification.requestPermission);\n\n /* Legacy webkit browsers */\n var isWebkitAPI = (this._win.webkitNotifications && this._win.webkitNotifications.checkPermission);\n\n return new Promise((resolvePromise, rejectPromise) => {\n\n var resolver = result => (isGranted(result)) ? resolvePromise() : rejectPromise();\n\n if (hasPermissions) {\n resolver(existing)\n }\n else if (isWebkitAPI) {\n this._win.webkitNotifications.requestPermission(result => { resolver(result) });\n }\n else if (isModernAPI) {\n this._win.Notification.requestPermission().then(result => { resolver(result) }).catch(rejectPromise)\n }\n else resolvePromise()\n })\n }\n\n /**\n * Returns whether Push has been granted permission to run\n * @return {Boolean}\n */\n has() {\n return this.get() === this.GRANTED;\n }\n\n /**\n * Gets the permission level\n * @return {Permission} The permission level\n */\n get() {\n let permission;\n\n /* Safari 6+, Chrome 23+ */\n if (this._win.Notification && this._win.Notification.permission)\n permission = this._win.Notification.permission;\n\n /* Legacy webkit browsers */\n else if (this._win.webkitNotifications && this._win.webkitNotifications.checkPermission)\n permission = this._permissions[this._win.webkitNotifications.checkPermission()];\n\n /* Firefox Mobile */\n else if (navigator.mozNotification)\n permission = this.GRANTED;\n\n /* IE9+ */\n else if (this._win.external && this._win.external.msIsSiteMode)\n permission = this._win.external.msIsSiteMode() ? this.GRANTED : this.DEFAULT;\n\n else\n permission = this.GRANTED;\n\n return permission;\n }\n}\n","import Messages from \"./Messages\";\nimport Permission from \"./Permission\";\nimport Util from \"./Util\";\n/* Import notification agents */\nimport DesktopAgent from \"./agents/DesktopAgent\";\nimport MobileChromeAgent from \"./agents/MobileChromeAgent\";\nimport MobileFirefoxAgent from \"./agents/MobileFirefoxAgent\";\nimport MSAgent from \"./agents/MSAgent\";\nimport WebKitAgent from \"./agents/WebKitAgent\";\n\nexport default class Push {\n\n constructor(win) {\n /* Private variables */\n\n /* ID to use for new notifications */\n this._currentId = 0;\n\n /* Map of open notifications */\n this._notifications = {};\n\n /* Window object */\n this._win = win;\n\n /* Public variables */\n this.Permission = new Permission(win);\n\n /* Agents */\n this._agents = {\n desktop: new DesktopAgent(win),\n chrome: new MobileChromeAgent(win),\n firefox: new MobileFirefoxAgent(win),\n ms: new MSAgent(win),\n webkit: new WebKitAgent(win)\n };\n\n this._configuration = {\n serviceWorker: '/serviceWorker.min.js',\n fallback: function(payload) {}\n }\n }\n\n /**\n * Closes a notification\n * @param {Notification} notification\n * @return {Boolean} boolean denoting whether the operation was successful\n * @private\n */\n _closeNotification(id) {\n let success = true;\n const notification = this._notifications[id];\n\n if (notification !== undefined) {\n success = this._removeNotification(id);\n\n /* Safari 6+, Firefox 22+, Chrome 22+, Opera 25+ */\n if (this._agents.desktop.isSupported())\n this._agents.desktop.close(notification);\n\n /* Legacy WebKit browsers */\n else if (this._agents.webkit.isSupported())\n this._agents.webkit.close(notification);\n\n /* IE9 */\n else if (this._agents.ms.isSupported())\n this._agents.ms.close();\n\n else {\n success = false;\n throw new Error(Messages.errors.unknown_interface);\n }\n\n return success;\n }\n\n return false;\n }\n\n /**\n * Adds a notification to the global dictionary of notifications\n * @param {Notification} notification\n * @return {Integer} Dictionary key of the notification\n * @private\n */\n _addNotification(notification) {\n const id = this._currentId;\n this._notifications[id] = notification;\n this._currentId++;\n return id;\n }\n\n /**\n * Removes a notification with the given ID\n * @param {Integer} id - Dictionary key/ID of the notification to remove\n * @return {Boolean} boolean denoting success\n * @private\n */\n _removeNotification(id) {\n let success = false;\n\n if (this._notifications.hasOwnProperty(id)) {\n /* We're successful if we omit the given ID from the new array */\n delete this._notifications[id];\n success = true;\n }\n\n return success;\n }\n\n /**\n * Creates the wrapper for a given notification\n *\n * @param {Integer} id - Dictionary key/ID of the notification\n * @param {Map} options - Options used to create the notification\n * @returns {Map} wrapper hashmap object\n * @private\n */\n _prepareNotification(id, options) {\n let wrapper;\n\n /* Wrapper used to get/close notification later on */\n wrapper = {\n get: () => {\n return this._notifications[id];\n },\n\n close: () => {\n this._closeNotification(id);\n }\n };\n\n /* Autoclose timeout */\n if (options.timeout) {\n setTimeout(() => {\n wrapper.close();\n }, options.timeout);\n }\n\n return wrapper;\n }\n\n /**\n * Find the most recent notification from a ServiceWorker and add it to the global array\n * @param notifications\n * @private\n */\n _serviceWorkerCallback(notifications, options, resolve) {\n let id = this._addNotification(notifications[notifications.length - 1]);\n\n /* Listen for close requests from the ServiceWorker */\n navigator.serviceWorker.addEventListener('message', event => {\n const data = JSON.parse(event.data);\n\n if (data.action === 'close' && Number.isInteger(data.id))\n this._removeNotification(data.id);\n });\n\n resolve(this._prepareNotification(id, options));\n }\n\n /**\n * Callback function for the 'create' method\n * @return {void}\n * @private\n */\n _createCallback(title, options, resolve) {\n let notification = null;\n let onClose;\n\n /* Set empty settings if none are specified */\n options = options || {};\n\n /* onClose event handler */\n onClose = (id) => {\n /* A bit redundant, but covers the cases when close() isn't explicitly called */\n this._removeNotification(id);\n if (Util.isFunction(options.onClose)) {\n options.onClose.call(this, notification);\n }\n };\n\n /* Safari 6+, Firefox 22+, Chrome 22+, Opera 25+ */\n if (this._agents.desktop.isSupported()) {\n try {\n /* Create a notification using the API if possible */\n notification = this._agents.desktop.create(title, options);\n } catch (e) {\n const id = this._currentId;\n const sw = this.config().serviceWorker;\n const cb = (notifications) => this._serviceWorkerCallback(notifications, options, resolve);\n /* Create a Chrome ServiceWorker notification if it isn't supported */\n if (this._agents.chrome.isSupported()) {\n this._agents.chrome.create(id, title, options, sw, cb);\n }\n }\n /* Legacy WebKit browsers */\n } else if (this._agents.webkit.isSupported())\n notification = this._agents.webkit.create(title, options);\n\n /* Firefox Mobile */\n else if (this._agents.firefox.isSupported())\n this._agents.firefox.create(title, options);\n\n /* IE9 */\n else if (this._agents.ms.isSupported())\n notification = this._agents.ms.create(title, options);\n\n /* Default fallback */\n else {\n options.title = title;\n this.config().fallback(options);\n }\n\n if (notification !== null) {\n const id = this._addNotification(notification);\n const wrapper = this._prepareNotification(id, options);\n\n /* Notification callbacks */\n if (Util.isFunction(options.onShow))\n notification.addEventListener('show', options.onShow);\n\n if (Util.isFunction(options.onError))\n notification.addEventListener('error', options.onError);\n\n if (Util.isFunction(options.onClick))\n notification.addEventListener('click', options.onClick);\n\n notification.addEventListener('close', () => {\n onClose(id);\n });\n\n notification.addEventListener('cancel', () => {\n onClose(id);\n });\n\n /* Return the wrapper so the user can call close() */\n resolve(wrapper);\n }\n\n /* By default, pass an empty wrapper */\n resolve(null);\n }\n\n /**\n * Creates and displays a new notification\n * @param {Array} options\n * @return {Promise}\n */\n create(title, options) {\n let promiseCallback;\n\n /* Fail if no or an invalid title is provided */\n if (!Util.isString(title)) {\n throw new Error(Messages.errors.invalid_title);\n }\n\n /* Request permission if it isn't granted */\n if (!this.Permission.has()) {\n promiseCallback = (resolve, reject) => {\n this.Permission.request().then(() => {\n this._createCallback(title, options, resolve);\n }).catch(() => {\n reject(Messages.errors.permission_denied);\n })\n };\n } else {\n promiseCallback = (resolve, reject) => {\n try {\n this._createCallback(title, options, resolve);\n } catch (e) {\n reject(e);\n }\n };\n }\n\n return new Promise(promiseCallback);\n }\n\n /**\n * Returns the notification count\n * @return {Integer} The notification count\n */\n count() {\n let count = 0;\n let key;\n\n for (key in this._notifications)\n if (this._notifications.hasOwnProperty(key)) count++;\n\n return count;\n }\n\n /**\n * Closes a notification with the given tag\n * @param {String} tag - Tag of the notification to close\n * @return {Boolean} boolean denoting success\n */\n close(tag) {\n let key, notification;\n\n for (key in this._notifications) {\n if (this._notifications.hasOwnProperty(key)) {\n notification = this._notifications[key];\n\n /* Run only if the tags match */\n if (notification.tag === tag) {\n\n /* Call the notification's close() method */\n return this._closeNotification(key);\n }\n }\n }\n }\n\n /**\n * Clears all notifications\n * @return {Boolean} boolean denoting whether the clear was successful in closing all notifications\n */\n clear() {\n let key, success = true;\n\n for (key in this._notifications)\n if (this._notifications.hasOwnProperty(key))\n success = success && this._closeNotification(key);\n\n return success;\n }\n\n /**\n * Denotes whether Push is supported in the current browser\n * @returns {boolean}\n */\n supported() {\n let supported = false;\n\n for (var agent in this._agents)\n if (this._agents.hasOwnProperty(agent))\n supported = supported || this._agents[agent].isSupported()\n\n return supported;\n }\n\n /**\n * Modifies settings or returns all settings if no parameter passed\n * @param settings\n */\n config(settings) {\n if (typeof settings !== 'undefined' || settings !== null && Util.isObject(settings))\n Util.objectMerge(this._configuration, settings);\n return this._configuration;\n }\n\n /**\n * Copies the functions from a plugin to the main library\n * @param plugin\n */\n extend(manifest) {\n var plugin, Plugin,\n hasProp = {}.hasOwnProperty;\n\n if (!hasProp.call(manifest, 'plugin')) {\n throw new Error(Messages.errors.invalid_plugin);\n } else {\n if (hasProp.call(manifest, 'config') && Util.isObject(manifest.config) && manifest.config !== null) {\n this.config(manifest.config);\n }\n\n Plugin = manifest.plugin;\n plugin = new Plugin(this.config())\n\n for (var member in plugin) {\n if (hasProp.call(plugin, member) && Util.isFunction(plugin[member]))\n this[member] = plugin[member];\n }\n }\n }\n}\n","export default class Util {\n static isUndefined(obj) {\n return obj === undefined;\n }\n\n static isString(obj) {\n return typeof obj === 'string';\n }\n\n static isFunction(obj) {\n return obj && {}.toString.call(obj) === '[object Function]';\n }\n\n static isObject(obj) {\n return typeof obj === 'object'\n }\n\n static objectMerge(target, source) {\n for (var key in source) {\n if (target.hasOwnProperty(key) && this.isObject(target[key]) && this.isObject(source[key])) {\n this.objectMerge(target[key], source[key]);\n } else {\n target[key] = source[key]\n }\n }\n }\n}\n","export default class AbstractAgent {\n constructor(win) {\n this._win = win;\n }\n}\n","import AbstractAgent from './AbstractAgent';\nimport Util from '../Util';\n\n/**\n * Notification agent for modern desktop browsers:\n * Safari 6+, Firefox 22+, Chrome 22+, Opera 25+\n */\nexport default class DesktopAgent extends AbstractAgent {\n\n /**\n * Returns a boolean denoting support\n * @returns {Boolean} boolean denoting whether webkit notifications are supported\n */\n isSupported() {\n return this._win.Notification !== undefined;\n }\n\n /**\n * Creates a new notification\n * @param title - notification title\n * @param options - notification options array\n * @returns {Notification}\n */\n create(title, options) {\n return new this._win.Notification(\n title,\n {\n icon: (Util.isString(options.icon) || Util.isUndefined(options.icon)) ? options.icon : options.icon.x32,\n body: options.body,\n tag: options.tag,\n requireInteraction: options.requireInteraction\n }\n );\n }\n\n /**\n * Close a given notification\n * @param notification - notification to close\n */\n close(notification) {\n notification.close();\n }\n}\n","import AbstractAgent from './AbstractAgent';\nimport Util from '../Util';\n\n/**\n * Notification agent for IE9\n */\nexport default class MSAgent extends AbstractAgent {\n\n /**\n * Returns a boolean denoting support\n * @returns {Boolean} boolean denoting whether webkit notifications are supported\n */\n isSupported() {\n return (this._win.external !== undefined) && (this._win.external.msIsSiteMode !== undefined);\n }\n\n /**\n * Creates a new notification\n * @param title - notification title\n * @param options - notification options array\n * @returns {Notification}\n */\n create(title, options) {\n /* Clear any previous notifications */\n this._win.external.msSiteModeClearIconOverlay();\n\n this._win.external.msSiteModeSetIconOverlay(\n ((Util.isString(options.icon) || Util.isUndefined(options.icon))\n ? options.icon\n : options.icon.x16), title\n );\n\n this._win.external.msSiteModeActivate();\n\n return null;\n }\n\n /**\n * Close a given notification\n * @param notification - notification to close\n */\n close() {\n this._win.external.msSiteModeClearIconOverlay()\n }\n}\n","import AbstractAgent from './AbstractAgent';\nimport Util from '../Util';\nimport Messages from '../Messages';\n\n/**\n * Notification agent for modern desktop browsers:\n * Safari 6+, Firefox 22+, Chrome 22+, Opera 25+\n */\nexport default class MobileChromeAgent extends AbstractAgent {\n\n /**\n * Returns a boolean denoting support\n * @returns {Boolean} boolean denoting whether webkit notifications are supported\n */\n isSupported() {\n return this._win.navigator !== undefined &&\n this._win.navigator.serviceWorker !== undefined;\n }\n\n /**\n * Returns the function body as a string\n * @param func\n */\n getFunctionBody(func) {\n return func.toString().match(/function[^{]+{([\\s\\S]*)}$/)[1];\n }\n\n /**\n * Creates a new notification\n * @param title - notification title\n * @param options - notification options array\n * @returns {Notification}\n */\n create(id, title, options, serviceWorker, callback) {\n /* Register ServiceWorker */\n this._win.navigator.serviceWorker.register(serviceWorker);\n\n this._win.navigator.serviceWorker.ready.then(registration => {\n /* Local data the service worker will use */\n let localData = {\n id: id,\n link: options.link,\n origin: document.location.href,\n onClick: (Util.isFunction(options.onClick)) ? this.getFunctionBody(options.onClick) : '',\n onClose: (Util.isFunction(options.onClose)) ? this.getFunctionBody(options.onClose) : ''\n };\n\n /* Merge the local data with user-provided data */\n if (options.data !== undefined && options.data !== null)\n localData = Object.assign(localData, options.data);\n\n /* Show the notification */\n registration.showNotification(\n title,\n {\n icon: options.icon,\n body: options.body,\n vibrate: options.vibrate,\n tag: options.tag,\n data: localData,\n requireInteraction: options.requireInteraction,\n silent: options.silent\n }\n ).then(() => {\n\n registration.getNotifications().then(notifications => {\n /* Send an empty message so the ServiceWorker knows who the client is */\n registration.active.postMessage('');\n\n /* Trigger callback */\n callback(notifications);\n });\n }).catch(function(error) {\n throw new Error(Messages.errors.sw_notification_error + error.message);\n });\n }).catch(function(error) {\n throw new Error(Messages.errors.sw_registration_error + error.message);\n });\n }\n\n /**\n * Close all notification\n */\n close() {\n // Can't do this with service workers\n }\n}\n","import AbstractAgent from './AbstractAgent';\n\n/**\n * Notification agent for modern desktop browsers:\n * Safari 6+, Firefox 22+, Chrome 22+, Opera 25+\n */\nexport default class MobileFirefoxAgent extends AbstractAgent {\n\n /**\n * Returns a boolean denoting support\n * @returns {Boolean} boolean denoting whether webkit notifications are supported\n */\n isSupported() {\n return this._win.navigator.mozNotification !== undefined;\n }\n\n /**\n * Creates a new notification\n * @param title - notification title\n * @param options - notification options array\n * @returns {Notification}\n */\n create(title, options) {\n let notification = this._win.navigator.mozNotification.createNotification(\n title,\n options.body,\n options.icon\n );\n\n notification.show();\n\n return notification;\n }\n}\n","import AbstractAgent from './AbstractAgent';\n\n/**\n * Notification agent for old Chrome versions (and some) Firefox\n */\nexport default class WebKitAgent extends AbstractAgent {\n\n /**\n * Returns a boolean denoting support\n * @returns {Boolean} boolean denoting whether webkit notifications are supported\n */\n isSupported() {\n return this._win.webkitNotifications !== undefined;\n }\n\n /**\n * Creates a new notification\n * @param title - notification title\n * @param options - notification options array\n * @returns {Notification}\n */\n create(title, options) {\n let notification = this._win.webkitNotifications.createNotification(\n options.icon,\n title,\n options.body\n );\n\n notification.show();\n\n return notification;\n }\n\n /**\n * Close a given notification\n * @param notification - notification to close\n */\n close(notification) {\n notification.cancel();\n }\n}\n","import Push from './classes/Push';\n\nmodule.exports = new Push(typeof window !== 'undefined' ? window : this);\n"]} \ No newline at end of file diff --git a/bower_components/push.js/bin/serviceWorker.js b/bower_components/push.js/bin/serviceWorker.js new file mode 100644 index 0000000..1d6ee88 --- /dev/null +++ b/bower_components/push.js/bin/serviceWorker.js @@ -0,0 +1,75 @@ +/* eslint eqeqeq: "off", curly: "error" */ +'use strict'; + +function isFunction(obj) { + return obj && {}.toString.call(obj) === '[object Function]'; +} + +function runFunctionString(funcStr) { + if (funcStr.trim().length > 0) { + var func = new Function(funcStr); + if (isFunction(func)) { + func(); + } + } +} + +self.addEventListener('message', function (event) { + self.client = event.source; +}); + +self.onnotificationclose = function (event) { + runFunctionString(event.notification.data.onClose); + + /* Tell Push to execute close callback */ + self.client.postMessage(JSON.stringify({ + id: event.notification.data.id, + action: 'close' + })); +} + +self.onnotificationclick = function (event) { + var link, origin, href; + + if (typeof event.notification.data.link !== 'undefined' && event.notification.data.link !== null) { + origin = event.notification.data.origin; + link = event.notification.data.link; + href = origin.substring(0, origin.indexOf('/', 8)) + '/'; + + /* Removes prepending slash, as we don't need it */ + if (link[0] === '/') { + link = (link.length > 1) ? link.substring(1, link.length) : ''; + } + + event.notification.close(); + + /* This looks to see if the current is already open and focuses if it is */ + event.waitUntil(clients.matchAll({ + type: "window" + }).then(function (clientList) { + var client, full_url; + + for (var i = 0; i < clientList.length; i++) { + client = clientList[i]; + full_url = href + link; + + /* Covers case where full_url might be http://example.com/john and the client URL is http://example.com/john/ */ + if (full_url[full_url.length - 1] !== '/' && client.url[client.url.length - 1] === '/') { + full_url += '/'; + } + + if (client.url === full_url && 'focus' in client){ + return client.focus(); + } + } + + if (clients.openWindow) { + return clients.openWindow('/' + link); + } + }).catch(function (error) { + throw new Error("A ServiceWorker error occurred: " + error.message); + })); + } + + runFunctionString(event.notification.data.onClick); +} diff --git a/bower_components/push.js/bower.json b/bower_components/push.js/bower.json new file mode 100644 index 0000000..57d84f7 --- /dev/null +++ b/bower_components/push.js/bower.json @@ -0,0 +1,21 @@ +{ + "name": "push.js", + "description": "A compact, cross-browser solution for the Javascript Notifications API", + "main": "bin/push.js", + "authors": [ + "Tyler Nickerson" + ], + "license": "MIT", + "homepage": "https://pushjs.org", + "ignore": [ + "**/.*", + "coverage", + "node_modules", + "bower_components", + "tests", + "src", + "build", + "*.lock", + "*.json" + ] +} diff --git a/bower_components/push.js/browserstack.png b/bower_components/push.js/browserstack.png new file mode 100644 index 0000000..50c25f6 Binary files /dev/null and b/bower_components/push.js/browserstack.png differ diff --git a/bower_components/push.js/logo.png b/bower_components/push.js/logo.png new file mode 100644 index 0000000..fc7973b Binary files /dev/null and b/bower_components/push.js/logo.png differ diff --git a/index.html b/index.html index f68739a..4758bc8 100644 --- a/index.html +++ b/index.html @@ -2,12 +2,25 @@ - - ScaleDrone HTML5 JavaScript push notifications - + + + + Scaledrone HTML5 JavaScript push notifications + - + You can push a notification from Terminal using cURL: + +
+        
+curl -H "Content-Type: application/json" \
+     -X POST \
+     -d '{"title":"Important!", "body":"Dogecoin is going to the moon!", "icon":"logo.png"}' \
+     https://api2.scaledrone.com/KtJ2qzn3CF3svSFe/notifications/publish
+         
+    
+ + - \ No newline at end of file + diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..c7c75ee Binary files /dev/null and b/logo.png differ diff --git a/main.js b/main.js index 00cfc80..aacb4b5 100644 --- a/main.js +++ b/main.js @@ -1,50 +1,48 @@ -if (!Notification) { - alert('Your browser does not support notifications'); -} else { - getPermission(function () { - // Connect to ScaleDrone at channel dIVCxD01G4x1sDtC - var drone = new ScaleDrone('dIVCxD01G4x1sDtC'); +getPermission(function() { + var drone = new ScaleDrone('KtJ2qzn3CF3svSFe'); - drone.on('open', function (error) { - if (error) return console.error(error); - // Join a room called notifications - var room = drone.subscribe('notifications'); - room.on('open', function (error) { - if (error) console.error(error); - }); - room.on('data', function (data) { - // Create a new notification from incoming data - var notification = new Notification(data.msg); - // Hide it after 4 seconds - setTimeout(function () { - notification.close(); - }, 4000); - }); - }); + drone.on('open', function(error) { + if (error) return console.error(error); + // Join a room called notifications + var room = drone.subscribe('notifications'); + room.on('open', function(error) { + if (error) { + console.error(error); + } + }); + room.on('data', function(data) { + Push.create(data.title, { + body: data.body, + icon: data.icon, + timeout: 4000, + onClick: function() { + this.close(); + } + }); + }); + }); - drone.on('close', function (event) { - console.log('Connection was closed', event); - }); + drone.on('close', function(event) { + console.log('Connection was closed', event); + }); - drone.on('error', function (error) { - console.error(error); - }); - }); -} + drone.on('error', function(error) { + console.error(error); + }); +}); /** * Ask the user for desktop notification permissions (if needed) */ -function getPermission(callback) { - if (Notification.permission === 'granted') { - callback(); - } else { - Notification.requestPermission(function (permission) { - if (permission === 'granted') { - callback(); - } else { - alert('Unable to get permission'); - } - }); - } -} \ No newline at end of file +function getPermission(onGranted) { + if (!Notification) { + alert('Notifications are not supported'); + } + if (Push.Permission.has()) { + onGranted(); + } else { + Push.Permission.request(onGranted, function() { + alert('Permission denied'); + }); + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d5ff442 --- /dev/null +++ b/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "bower": "^1.8.2", + "global": "^4.3.2", + "http-server": "^0.10.0" + } +} diff --git a/push.min.js b/push.min.js new file mode 100644 index 0000000..ffc5f41 --- /dev/null +++ b/push.min.js @@ -0,0 +1,37 @@ +/** + * Push v1.0-beta + * ============== + * A compact, cross-browser solution for the JavaScript Notifications API + * + * Credits + * ------- + * Tsvetan Tsvetkov (ttsvetko) + * Alex Gibson (alexgibson) + * + * License + * ------- + * + * The MIT License (MIT) + * + * Copyright (c) 2015-2017 Tyler Nickerson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Push=t()}}(function(){return function t(e,n,i){function o(s,a){if(!n[s]){if(!e[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(r)return r(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var f=n[s]={exports:{}};e[s][0].call(f.exports,function(t){var n=e[s][1][t];return o(n||t)},f,f.exports,t,e,n,i)}return n[s].exports}for(var r="function"==typeof require&&require,s=0;s0?this._requestWithCallback.apply(this,arguments):this._requestAsPromise()}},{key:"_requestWithCallback",value:function(t,e){var n=this,i=this.get(),o=function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n._win.Notification.permission;void 0===i&&n._win.webkitNotifications&&(i=n._win.webkitNotifications.checkPermission()),i===n.GRANTED||0===i?t&&t():e&&e()};i!==this.DEFAULT?o(i):this._win.webkitNotifications&&this._win.webkitNotifications.checkPermission?this._win.webkitNotifications.requestPermission(o):this._win.Notification&&this._win.Notification.requestPermission?this._win.Notification.requestPermission().then(o).catch(function(){e&&e()}):t&&t()}},{key:"_requestAsPromise",value:function(){var t=this,e=this.get(),n=function(e){return e===t.GRANTED||0===e},i=e!==this.DEFAULT,o=this._win.Notification&&this._win.Notification.requestPermission,r=this._win.webkitNotifications&&this._win.webkitNotifications.checkPermission;return new Promise(function(s,a){var u=function(t){return n(t)?s():a()};i?u(e):r?t._win.webkitNotifications.requestPermission(function(t){u(t)}):o?t._win.Notification.requestPermission().then(function(t){u(t)}).catch(a):s()})}},{key:"has",value:function(){return this.get()===this.GRANTED}},{key:"get",value:function(){return this._win.Notification&&this._win.Notification.permission?this._win.Notification.permission:this._win.webkitNotifications&&this._win.webkitNotifications.checkPermission?this._permissions[this._win.webkitNotifications.checkPermission()]:navigator.mozNotification?this.GRANTED:this._win.external&&this._win.external.msIsSiteMode?this._win.external.msIsSiteMode()?this.GRANTED:this.DEFAULT:this.GRANTED}}]),t}();n.default=r},{}],3:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n0){var i=new Function(n);isFunction(i)&&i()}}self.addEventListener("message",function(n){self.client=n.source}),self.onnotificationclose=function(n){runFunctionString(n.notification.data.onClose),self.client.postMessage(JSON.stringify({id:n.notification.data.id,action:"close"}))},self.onnotificationclick=function(n){var i,t,o;void 0!==n.notification.data.link&&null!==n.notification.data.link&&(t=n.notification.data.origin,i=n.notification.data.link,o=t.substring(0,t.indexOf("/",8))+"/","/"===i[0]&&(i=i.length>1?i.substring(1,i.length):""),n.notification.close(),n.waitUntil(clients.matchAll({type:"window"}).then(function(n){for(var t,c,e=0;e