diff --git a/assets/js/amber.min.js b/assets/js/amber.min.js index ca077a45f..9ef3b2809 100644 --- a/assets/js/amber.min.js +++ b/assets/js/amber.min.js @@ -1 +1 @@ -const EVENTS={join:'join',leave:'leave',message:'message'},STALE_CONNECTION_THRESHOLD_SECONDS=100,SOCKET_POLLING_RATE=1e4;let now=()=>{return new Date().getTime()},secondsSince=a=>{return(now()-a)/1e3};export class Channel{constructor(a,b){this.topic=a,this.socket=b,this.onMessageHandlers=[]}join(){this.socket.ws.send(JSON.stringify({event:EVENTS.join,topic:this.topic}))}leave(){this.socket.ws.send(JSON.stringify({event:EVENTS.leave,topic:this.topic}))}handleMessage(a){this.onMessageHandlers.forEach(b=>{b.subject===a.subject&&b.callback(a.payload)})}on(a,b){this.onMessageHandlers.push({subject:a,callback:b})}push(a,b){this.socket.ws.send(JSON.stringify({event:EVENTS.message,topic:this.topic,subject:a,payload:b}))}}export class Socket{constructor(a){this.endpoint=a,this.ws=null,this.channels=[],this.lastPing=now(),this.reconnectTries=0,this.attemptReconnect=!0}_connectionIsStale(){return secondsSince(this.lastPing)>STALE_CONNECTION_THRESHOLD_SECONDS}_reconnect(){clearTimeout(this.reconnectTimeout),this.reconnectTimeout=setTimeout(()=>{this.reconnectTries++,this.connect(this.params),this._reconnect()},this._reconnectInterval())}_reconnectInterval(){return[1000,2000,5000,10000][this.reconnectTries]||1e4}_poll(){this.pollingTimeout=setTimeout(()=>{this._connectionIsStale()?this._reconnect():this._poll()},SOCKET_POLLING_RATE)}_startPolling(){clearTimeout(this.pollingTimeout),this._poll()}_handlePing(){this.lastPing=now()}_reset(){clearTimeout(this.reconnectTimeout),this.reconnectTries=0,this.attemptReconnect=!0,this._startPolling()}connect(a){this.params=a;let b={location:window.location.hostname,port:window.location.port,protocol:'https:'===window.location.protocol?'wss:':'ws:'};return a&&Object.assign(b,a),b.port&&(b.location+=`:${b.port}`),new Promise(c=>{this.ws=new WebSocket(`${b.protocol}//${b.location}${this.endpoint}`),this.ws.onmessage=f=>{this.handleMessage(f)},this.ws.onclose=()=>{this.attemptReconnect&&this._reconnect()},this.ws.onopen=()=>{this._reset(),c()}})}disconnect(){this.attemptReconnect=!1,clearTimeout(this.pollingTimeout),clearTimeout(this.reconnectTimeout),this.ws.close()}channel(a){let b=new Channel(a,this);return this.channels.push(b),b}handleMessage(a){if('ping'===a.data)return this._handlePing();let b=JSON.parse(a.data);this.channels.forEach(c=>{c.topic===b.topic&&c.handleMessage(b)})}}module.exports={Socket:Socket},document.addEventListener('DOMContentLoaded',function(){document.querySelectorAll('a[data-method=\'delete\']').forEach(function(a){a.addEventListener('click',function(b){b.preventDefault();var c=a.getAttribute('data-confirm')||'Are you sure?';if(confirm(c)){var d=document.createElement('form'),f=document.createElement('input');d.setAttribute('action',a.getAttribute('href')),d.setAttribute('method','POST'),f.setAttribute('type','hidden'),f.setAttribute('name','_method'),f.setAttribute('value','DELETE'),d.appendChild(f),document.body.appendChild(d),d.submit()}return!1})})}); +var Amber=function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n100}},{key:"_reconnect",value:function(){var e=this;clearTimeout(this.reconnectTimeout),this.reconnectTimeout=setTimeout(function(){e.reconnectTries++,e.connect(e.params),e._reconnect()},this._reconnectInterval())}},{key:"_reconnectInterval",value:function(){return[1e3,2e3,5e3,1e4][this.reconnectTries]||1e4}},{key:"_poll",value:function(){var e=this;this.pollingTimeout=setTimeout(function(){e._connectionIsStale()?e._reconnect():e._poll()},1e4)}},{key:"_startPolling",value:function(){clearTimeout(this.pollingTimeout),this._poll()}},{key:"_handlePing",value:function(){this.lastPing=s()}},{key:"_reset",value:function(){clearTimeout(this.reconnectTimeout),this.reconnectTries=0,this.attemptReconnect=!0,this._startPolling()}},{key:"connect",value:function(e){var t=this;this.params=e;var n={location:window.location.hostname,port:window.location.port,protocol:"https:"===window.location.protocol?"wss:":"ws:"};return e&&Object.assign(n,e),n.port&&(n.location+=":"+n.port),new Promise(function(e,o){t.ws=new WebSocket(n.protocol+"//"+n.location+t.endpoint),t.ws.onmessage=function(e){t.handleMessage(e)},t.ws.onclose=function(){t.attemptReconnect&&t._reconnect()},t.ws.onopen=function(){t._reset(),e()}})}},{key:"disconnect",value:function(){this.attemptReconnect=!1,clearTimeout(this.pollingTimeout),clearTimeout(this.reconnectTimeout),this.ws.close()}},{key:"channel",value:function(e){var t=new a(e,this);return this.channels.push(t),t}},{key:"handleMessage",value:function(e){if("ping"===e.data)return this._handlePing();var t=JSON.parse(e.data);this.channels.forEach(function(e){e.topic===t.topic&&e.handleMessage(t)})}}]),e}();e.exports={Socket:u},document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll("a[data-method='delete']").forEach(function(e){e.addEventListener("click",function(t){t.preventDefault();var n=e.getAttribute("data-confirm")||"Are you sure?";if(confirm(n)){var o=document.createElement("form"),i=document.createElement("input");o.setAttribute("action",e.getAttribute("href")),o.setAttribute("method","POST"),i.setAttribute("type","hidden"),i.setAttribute("name","_method"),i.setAttribute("value","DELETE"),o.appendChild(i),document.body.appendChild(o),o.submit()}return!1})})})}]); \ No newline at end of file diff --git a/package.json b/package.json index d7429c637..94feeafa5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amber", - "version": "0.3.0", + "version": "0.8.0", "description": "Front-end configuration for Amber Framework", "private": true, "author": "Amber", @@ -9,9 +9,9 @@ "build": "cd assets/js && webpack --config webpack.config.js" }, "devDependencies": { - "babel-core": "^6.26.0", - "babel-loader": "^7.1.2", - "babel-preset-env": "^1.6.1", - "webpack": "^3.8.1" + "babel-core": "^6.26.3", + "babel-loader": "^7.1.4", + "babel-preset-env": "^1.7.0", + "webpack": "^3.12.0" } } diff --git a/src/amber/cli/templates/app/package.json.ecr b/src/amber/cli/templates/app/package.json.ecr index a2ac008e3..ab85cde51 100644 --- a/src/amber/cli/templates/app/package.json.ecr +++ b/src/amber/cli/templates/app/package.json.ecr @@ -12,16 +12,16 @@ "test": "echo \"No test specified\" && exit 1" }, "devDependencies": { - "babel-core": "^6.26.0", - "babel-loader": "^7.1.2", + "babel-core": "^6.26.3", + "babel-loader": "^7.1.4", "babel-preset-env": "^1.6.1", - "css-loader": "^0.28.7", - "file-loader": "^1.1.5", - "node-sass": "^4.6.0", - "sass-loader": "^6.0.6", - "style-loader": "^0.19.0", - "webpack": "^3.8.1", - "webpack-merge": "^4.1.1", + "css-loader": "^0.28.11", + "file-loader": "^1.1.11", + "node-sass": "^4.9.0", + "sass-loader": "^7.0.1", + "style-loader": "^0.21.0", + "webpack": "^3.12.0", + "webpack-merge": "^4.1.2", "extract-text-webpack-plugin": "^3.0.2" } } diff --git a/src/amber/cli/templates/app/public/dist/main.bundle.css b/src/amber/cli/templates/app/public/dist/main.bundle.css index 1a2590c3f..1d7441a6f 100644 --- a/src/amber/cli/templates/app/public/dist/main.bundle.css +++ b/src/amber/cli/templates/app/public/dist/main.bundle.css @@ -1,79 +1 @@ -/* - * Globals - */ -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - color: #555; } - -h1, .h1, -h2, .h2, -h3, .h3, -h4, .h4, -h5, .h5, -h6, .h6 { - margin-top: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: normal; - color: #333; } - -/* - * Override Bootstrap's default container. - */ -@media (min-width: 1200px) { - .container { - width: 970px; } } - -/* - * Masthead for nav - */ -.masthead { - background-color: #f4994b; - -webkit-box-shadow: inset 0 -2px 5px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 -2px 5px rgba(0, 0, 0, 0.1); } - -/* Nav links */ -.nav-item { - position: relative; - display: inline-block; - padding: 10px; - font-weight: 500; - color: #ffe4cd; } - -.nav-item:hover, -.nav-item:focus { - color: #fff; - text-decoration: none; } - -/* Active state gets a caret at the bottom */ -.nav .active { - color: #fff; } - -.nav .active:after { - position: absolute; - bottom: 0; - left: 50%; - width: 0; - height: 0; - margin-left: -5px; - vertical-align: middle; - content: " "; - border-right: 5px solid transparent; - border-bottom: 5px solid; - border-left: 5px solid transparent; } - -.main { - padding-top: 20px; } - -#logo { - background-color: #f4994b; - background-image: url(/dist/images/logo.png); - background-size: contain; - width: 200px; - height: 278px; } - -/* Hide logo in small screens */ -@media (max-width: 767px) { - #logo { - display: none; } } - -/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJtYWluLmJ1bmRsZS5jc3MiLCJzb3VyY2VSb290IjoiIn0=*/ +body{color:#555}.h1,.h2,.h3,.h4,.h5,.h6,body,h1,h2,h3,h4,h5,h6{font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;font-weight:400;color:#333}@media (min-width:1200px){.container{width:970px}}.masthead{background-color:#f4994b;-webkit-box-shadow:inset 0 -2px 5px rgba(0,0,0,.1);box-shadow:inset 0 -2px 5px rgba(0,0,0,.1)}.nav-item{position:relative;display:inline-block;padding:10px;font-weight:500;color:#ffe4cd}.nav-item:focus,.nav-item:hover{color:#fff;text-decoration:none}.nav .active{color:#fff}.nav .active:after{position:absolute;bottom:0;left:50%;width:0;height:0;margin-left:-5px;vertical-align:middle;content:" ";border-right:5px solid transparent;border-bottom:5px solid;border-left:5px solid transparent}.main{padding-top:20px}#logo{background-color:#f4994b;background-image:url(/dist/images/logo.png);background-size:contain;width:200px;height:278px}@media (max-width:767px){#logo{display:none}}.table td,.table th{vertical-align:middle}.alert{margin-top:1em}.alert p{margin-top:0;margin-bottom:0}.nav-item-auth.nav-item-auth-signout,.nav-item-auth.nav-item-auth-signup{order:9999}.nav-item-auth.nav-item-auth-profile,.nav-item-auth.nav-item-auth-signin{order:9990;margin-left:auto} \ No newline at end of file diff --git a/src/amber/cli/templates/app/public/dist/main.bundle.js b/src/amber/cli/templates/app/public/dist/main.bundle.js index 917f2014f..82a787f7c 100644 --- a/src/amber/cli/templates/app/public/dist/main.bundle.js +++ b/src/amber/cli/templates/app/public/dist/main.bundle.js @@ -1,436 +1 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "/dist"; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _amber = __webpack_require__(1); - -var _amber2 = _interopRequireDefault(_amber); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -if (!Date.prototype.toGranite) { - (function () { - - function pad(number) { - if (number < 10) { - return '0' + number; - } - return number; - } - - Date.prototype.toGranite = function () { - return this.getUTCFullYear() + '-' + pad(this.getUTCMonth() + 1) + '-' + pad(this.getUTCDate()) + ' ' + pad(this.getUTCHours()) + ':' + pad(this.getUTCMinutes()) + ':' + pad(this.getUTCSeconds()); - }; - })(); -} - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - -"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; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var EVENTS = { - join: 'join', - leave: 'leave', - message: 'message' -}; -var STALE_CONNECTION_THRESHOLD_SECONDS = 100; -var SOCKET_POLLING_RATE = 10000; - -/** - * Returns a numeric value for the current time - */ -var now = function now() { - return new Date().getTime(); -}; - -/** - * Returns the difference between the current time and passed `time` in seconds - * @param {Number|Date} time - A numeric time or date object - */ -var secondsSince = function secondsSince(time) { - return (now() - time) / 1000; -}; - -/** - * Class for channel related functions (joining, leaving, subscribing and sending messages) - */ - -var Channel = exports.Channel = function () { - /** - * @param {String} topic - topic to subscribe to - * @param {Socket} socket - A Socket instance - */ - function Channel(topic, socket) { - _classCallCheck(this, Channel); - - this.topic = topic; - this.socket = socket; - this.onMessageHandlers = []; - } - - /** - * Join a channel, subscribe to all channels messages - */ - - - _createClass(Channel, [{ - key: 'join', - value: function join() { - this.socket.ws.send(JSON.stringify({ event: EVENTS.join, topic: this.topic })); - } - - /** - * Leave a channel, stop subscribing to channel messages - */ - - }, { - key: 'leave', - value: function leave() { - this.socket.ws.send(JSON.stringify({ event: EVENTS.leave, topic: this.topic })); - } - - /** - * Calls all message handlers with a matching subject - */ - - }, { - key: 'handleMessage', - value: function handleMessage(msg) { - this.onMessageHandlers.forEach(function (handler) { - if (handler.subject === msg.subject) handler.callback(msg.payload); - }); - } - - /** - * Subscribe to a channel subject - * @param {String} subject - subject to listen for: `msg:new` - * @param {function} callback - callback function when a new message arrives - */ - - }, { - key: 'on', - value: function on(subject, callback) { - this.onMessageHandlers.push({ subject: subject, callback: callback }); - } - - /** - * Send a new message to the channel - * @param {String} subject - subject to send message to: `msg:new` - * @param {Object} payload - payload object: `{message: 'hello'}` - */ - - }, { - key: 'push', - value: function push(subject, payload) { - this.socket.ws.send(JSON.stringify({ event: EVENTS.message, topic: this.topic, subject: subject, payload: payload })); - } - }]); - - return Channel; -}(); - -/** - * Class for maintaining connection with server and maintaining channels list - */ - - -var Socket = exports.Socket = function () { - /** - * @param {String} endpoint - Websocket endpont used in routes.cr file - */ - function Socket(endpoint) { - _classCallCheck(this, Socket); - - this.endpoint = endpoint; - this.ws = null; - this.channels = []; - this.lastPing = now(); - this.reconnectTries = 0; - this.attemptReconnect = true; - } - - /** - * Returns whether or not the last received ping has been past the threshold - */ - - - _createClass(Socket, [{ - key: '_connectionIsStale', - value: function _connectionIsStale() { - return secondsSince(this.lastPing) > STALE_CONNECTION_THRESHOLD_SECONDS; - } - - /** - * Tries to reconnect to the websocket server using a recursive timeout - */ - - }, { - key: '_reconnect', - value: function _reconnect() { - var _this = this; - - clearTimeout(this.reconnectTimeout); - this.reconnectTimeout = setTimeout(function () { - _this.reconnectTries++; - _this.connect(_this.params); - _this._reconnect(); - }, this._reconnectInterval()); - } - - /** - * Returns an incrementing timeout interval based around the number of reconnection retries - */ - - }, { - key: '_reconnectInterval', - value: function _reconnectInterval() { - return [1000, 2000, 5000, 10000][this.reconnectTries] || 10000; - } - - /** - * Sets a recursive timeout to check if the connection is stale - */ - - }, { - key: '_poll', - value: function _poll() { - var _this2 = this; - - this.pollingTimeout = setTimeout(function () { - if (_this2._connectionIsStale()) { - _this2._reconnect(); - } else { - _this2._poll(); - } - }, SOCKET_POLLING_RATE); - } - - /** - * Clear polling timeout and start polling - */ - - }, { - key: '_startPolling', - value: function _startPolling() { - clearTimeout(this.pollingTimeout); - this._poll(); - } - - /** - * Sets `lastPing` to the curent time - */ - - }, { - key: '_handlePing', - value: function _handlePing() { - this.lastPing = now(); - } - - /** - * Clears reconnect timeout, resets variables an starts polling - */ - - }, { - key: '_reset', - value: function _reset() { - clearTimeout(this.reconnectTimeout); - this.reconnectTries = 0; - this.attemptReconnect = true; - this._startPolling(); - } - - /** - * Connect the socket to the server, and binds to native ws functions - * @param {Object} params - Optional parameters - * @param {String} params.location - Hostname to connect to, defaults to `window.location.hostname` - * @param {String} parmas.port - Port to connect to, defaults to `window.location.port` - * @param {String} params.protocol - Protocol to use, either 'wss' or 'ws' - */ - - }, { - key: 'connect', - value: function connect(params) { - var _this3 = this; - - this.params = params; - - var opts = { - location: window.location.hostname, - port: window.location.port, - protocol: window.location.protocol === 'https:' ? 'wss:' : 'ws:' - }; - - if (params) Object.assign(opts, params); - if (opts.port) opts.location += ':' + opts.port; - - return new Promise(function (resolve, reject) { - _this3.ws = new WebSocket(opts.protocol + '//' + opts.location + _this3.endpoint); - _this3.ws.onmessage = function (msg) { - _this3.handleMessage(msg); - }; - _this3.ws.onclose = function () { - if (_this3.attemptReconnect) _this3._reconnect(); - }; - _this3.ws.onopen = function () { - _this3._reset(); - resolve(); - }; - }); - } - - /** - * Closes the socket connection permanently - */ - - }, { - key: 'disconnect', - value: function disconnect() { - this.attemptReconnect = false; - clearTimeout(this.pollingTimeout); - clearTimeout(this.reconnectTimeout); - this.ws.close(); - } - - /** - * Adds a new channel to the socket channels list - * @param {String} topic - Topic for the channel: `chat_room:123` - */ - - }, { - key: 'channel', - value: function channel(topic) { - var channel = new Channel(topic, this); - this.channels.push(channel); - return channel; - } - - /** - * Message handler for messages received - * @param {MessageEvent} msg - Message received from ws - */ - - }, { - key: 'handleMessage', - value: function handleMessage(msg) { - if (msg.data === "ping") return this._handlePing(); - - var parsed_msg = JSON.parse(msg.data); - this.channels.forEach(function (channel) { - if (channel.topic === parsed_msg.topic) channel.handleMessage(parsed_msg); - }); - } - }]); - - return Socket; -}(); - -module.exports = { - Socket: Socket - - /** - * Allows delete links to post for security and ease of use similar to Rails jquery_ujs - */ -};document.addEventListener("DOMContentLoaded", function () { - document.querySelectorAll("a[data-method='delete']").forEach(function (element) { - element.addEventListener("click", function (e) { - e.preventDefault(); - var message = element.getAttribute("data-confirm") || "Are you sure?"; - if (confirm(message)) { - var form = document.createElement("form"); - var input = document.createElement("input"); - form.setAttribute("action", element.getAttribute("href")); - form.setAttribute("method", "POST"); - input.setAttribute("type", "hidden"); - input.setAttribute("name", "_method"); - input.setAttribute("value", "DELETE"); - form.appendChild(input); - document.body.appendChild(form); - form.submit(); - } - return false; - }); - }); -}); - -/***/ }) -/******/ ]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgM2RiZmY4ZmQzYmRiMWZkYTQ0MDAiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9qYXZhc2NyaXB0cy9tYWluLmpzIiwid2VicGFjazovLy8uL2xpYi9hbWJlci9hc3NldHMvanMvYW1iZXIuanMiXSwibmFtZXMiOlsiRGF0ZSIsInByb3RvdHlwZSIsInRvR3Jhbml0ZSIsInBhZCIsIm51bWJlciIsImdldFVUQ0Z1bGxZZWFyIiwiZ2V0VVRDTW9udGgiLCJnZXRVVENEYXRlIiwiZ2V0VVRDSG91cnMiLCJnZXRVVENNaW51dGVzIiwiZ2V0VVRDU2Vjb25kcyIsIkVWRU5UUyIsImpvaW4iLCJsZWF2ZSIsIm1lc3NhZ2UiLCJTVEFMRV9DT05ORUNUSU9OX1RIUkVTSE9MRF9TRUNPTkRTIiwiU09DS0VUX1BPTExJTkdfUkFURSIsIm5vdyIsImdldFRpbWUiLCJzZWNvbmRzU2luY2UiLCJ0aW1lIiwiQ2hhbm5lbCIsInRvcGljIiwic29ja2V0Iiwib25NZXNzYWdlSGFuZGxlcnMiLCJ3cyIsInNlbmQiLCJKU09OIiwic3RyaW5naWZ5IiwiZXZlbnQiLCJtc2ciLCJmb3JFYWNoIiwiaGFuZGxlciIsInN1YmplY3QiLCJjYWxsYmFjayIsInBheWxvYWQiLCJwdXNoIiwiU29ja2V0IiwiZW5kcG9pbnQiLCJjaGFubmVscyIsImxhc3RQaW5nIiwicmVjb25uZWN0VHJpZXMiLCJhdHRlbXB0UmVjb25uZWN0IiwiY2xlYXJUaW1lb3V0IiwicmVjb25uZWN0VGltZW91dCIsInNldFRpbWVvdXQiLCJjb25uZWN0IiwicGFyYW1zIiwiX3JlY29ubmVjdCIsIl9yZWNvbm5lY3RJbnRlcnZhbCIsInBvbGxpbmdUaW1lb3V0IiwiX2Nvbm5lY3Rpb25Jc1N0YWxlIiwiX3BvbGwiLCJfc3RhcnRQb2xsaW5nIiwib3B0cyIsImxvY2F0aW9uIiwid2luZG93IiwiaG9zdG5hbWUiLCJwb3J0IiwicHJvdG9jb2wiLCJPYmplY3QiLCJhc3NpZ24iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIldlYlNvY2tldCIsIm9ubWVzc2FnZSIsImhhbmRsZU1lc3NhZ2UiLCJvbmNsb3NlIiwib25vcGVuIiwiX3Jlc2V0IiwiY2xvc2UiLCJjaGFubmVsIiwiZGF0YSIsIl9oYW5kbGVQaW5nIiwicGFyc2VkX21zZyIsInBhcnNlIiwibW9kdWxlIiwiZXhwb3J0cyIsImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJlbGVtZW50IiwiZSIsInByZXZlbnREZWZhdWx0IiwiZ2V0QXR0cmlidXRlIiwiY29uZmlybSIsImZvcm0iLCJjcmVhdGVFbGVtZW50IiwiaW5wdXQiLCJzZXRBdHRyaWJ1dGUiLCJhcHBlbmRDaGlsZCIsImJvZHkiLCJzdWJtaXQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7OztBQzdEQTs7Ozs7O0FBRUEsSUFBSSxDQUFDQSxLQUFLQyxTQUFMLENBQWVDLFNBQXBCLEVBQStCO0FBQzVCLGVBQVc7O0FBRVYsYUFBU0MsR0FBVCxDQUFhQyxNQUFiLEVBQXFCO0FBQ25CLFVBQUlBLFNBQVMsRUFBYixFQUFpQjtBQUNmLGVBQU8sTUFBTUEsTUFBYjtBQUNEO0FBQ0QsYUFBT0EsTUFBUDtBQUNEOztBQUVESixTQUFLQyxTQUFMLENBQWVDLFNB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QTNCO0FBQ0FELGNBQU1DLFlBQU4sQ0FBbUIsTUFBbkIsRUFBMkIsU0FBM0I7QUFDQUQsY0FBTUMsWUFBTixDQUFtQixPQUFuQixFQUE0QixRQUE1QjtBQUNBSCxhQUFLSSxXQUFMLENBQWlCRixLQUFqQjtBQUNBVixpQkFBU2EsSUFBVCxDQUFjRCxXQUFkLENBQTBCSixJQUExQjtBQUNBQSxhQUFLTSxNQUFMO0FBQ0g7QUFDRCxhQUFPLEtBQVA7QUFDSCxLQWhCRDtBQWlCSCxHQWxCRDtBQW1CSCxDQXBCRCxFIiwiZmlsZSI6Im1haW4uYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2Rpc3RcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAzZGJmZjhmZDNiZGIxZmRhNDQwMCIsImltcG9ydCBBbWJlciBmcm9tICdhbWJlcidcblxuaWYgKCFEYXRlLnByb3RvdHlwZS50b0dyYW5pdGUpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgZnVuY3Rpb24gcGFkKG51bWJlcikge1xuICAgICAgaWYgKG51bWJlciA8IDEwKSB7XG4gICAgICAgIHJldHVybiAnMCcgKyBudW1iZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH1cblxuICAgIERhdGUucHJvdG90eXBlLnRvR3Jhbml0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VVRDRnVsbFllYXIoKSArXG4gICAgICAgICctJyArIHBhZCh0aGlzLmdldFVUQ01vbnRoKCkgKyAxKSArXG4gICAgICAgICctJyArIHBhZCh0aGlzLmdldFVUQ0RhdGUoKSkgK1xuICAgICAgICAnICcgKyBwYWQodGhpcy5nZXRVVENIb3VycygpKSArXG4gICAgICAgICc6JyArIHBhZCh0aGlzLmdldFVUQ01pbnV0ZXMoKSkgK1xuICAgICAgICAnOicgKyBwYWQodGhpcy5nZXRVVENTZWNvbmRzKCkpICA7XG4gICAgfTtcblxuICB9KCkpO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Fzc2V0cy9qYXZhc2NyaXB0cy9tYWluLmpzIiwiY29uc3QgRVZFTlRTID0ge1xuICBqb2luOiAnam9pbicsXG4gIGxlYXZlOiAnbGVhdmUnLFxuICBtZXNzYWdlOiAnbWVzc2FnZSdcbn1cbmNvbnN0IFNUQUxFX0NPTk5FQ1RJT05fVEhSRVNIT0xEX1NFQ09ORFMgPSAxMDBcbmNvbnN0IFNPQ0tFVF9QT0xMSU5HX1JBVEUgPSAxMDAwMFxuXG4vKipcbiAqIFJldHVybnMgYSBudW1lcmljIHZhbHVlIGZvciB0aGUgY3VycmVudCB0aW1lXG4gKi9cbmxldCBub3cgPSAoKSA9PiB7XG4gIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCB0aW1lIGFuZCBwYXNzZWQgYHRpbWVgIGluIHNlY29uZHNcbiAqIEBwYXJhbSB7TnVtYmVyfERhdGV9IHRpbWUgLSBBIG51bWVyaWMgdGltZSBvciBkYXRlIG9iamVjdFxuICovXG5sZXQgc2Vjb25kc1NpbmNlID0gKHRpbWUpID0+IHtcbiAgcmV0dXJuIChub3coKSAtIHRpbWUpIC8gMTAwMFxufVxuXG4vKipcbiAqIENsYXNzIGZvciBjaGFubmVsIHJlbGF0ZWQgZnVuY3Rpb25zIChqb2luaW5nLCBsZWF2aW5nLCBzdWJzY3JpYmluZyBhbmQgc2VuZGluZyBtZXNzYWdlcylcbiAqL1xuZXhwb3J0IGNsYXNzIENoYW5uZWwge1xuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IHRvcGljIC0gdG9waWMgdG8gc3Vic2NyaWJlIHRvXG4gICAqIEBwYXJhbSB7U29ja2V0fSBzb2NrZXQgLSBBIFNvY2tldCBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IodG9waWMsIHNvY2tldCkge1xuICAgIHRoaXMudG9waWMgPSB0b3BpY1xuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy5vbk1lc3NhZ2VIYW5kbGVycyA9IFtdXG4gIH1cblxuICAvKipcbiAgICogSm9pbiBhIGNoYW5uZWwsIHN1YnNjcmliZSB0byBhbGwgY2hhbm5lbHMgbWVzc2FnZXNcbiAgICovXG4gIGpvaW4oKSB7XG4gICAgdGhpcy5zb2NrZXQud3Muc2VuZChKU09OLnN0cmluZ2lmeSh7IGV2ZW50OiBFVkVOVFMuam9pbiwgdG9waWM6IHRoaXMudG9waWMgfSkpXG4gIH1cblxuICAvKipcbiAgICogTGVhdmUgYSBjaGFubmVsLCBzdG9wIHN1YnNjcmliaW5nIHRvIGNoYW5uZWwgbWVzc2FnZXNcbiAgICovXG4gIGxlYXZlKCkge1xuICAgIHRoaXMuc29ja2V0LndzLnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBldmVudDogRVZFTlRTLmxlYXZlLCB0b3BpYzogdGhpcy50b3BpYyB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBhbGwgbWVzc2FnZSBoYW5kbGVycyB3aXRoIGEgbWF0Y2hpbmcgc3ViamVjdFxuICAgKi9cbiAgaGFuZGxlTWVzc2FnZShtc2cpIHtcbiAgICB0aGlzLm9uTWVzc2FnZUhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgIGlmIChoYW5kbGVyLnN1YmplY3QgPT09IG1zZy5zdWJqZWN0KSBoYW5kbGVyLmNhbGxiYWNrKG1zZy5wYXlsb2FkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGEgY2hhbm5lbCBzdWJqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0IC0gc3ViamVjdCB0byBsaXN0ZW4gZm9yOiBgbXNnOm5ld2BcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIGEgbmV3IG1lc3NhZ2UgYXJyaXZlc1xuICAgKi9cbiAgb24oc3ViamVjdCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLm9uTWVzc2FnZUhhbmRsZXJzLnB1c2goeyBzdWJqZWN0OiBzdWJqZWN0LCBjYWxsYmFjazogY2FsbGJhY2sgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgbmV3IG1lc3NhZ2UgdG8gdGhlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN1YmplY3QgLSBzdWJqZWN0IHRvIHNlbmQgbWVzc2FnZSB0bzogYG1zZzpuZXdgXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkIC0gcGF5bG9hZCBvYmplY3Q6IGB7bWVzc2FnZTogJ2hlbGxvJ31gXG4gICAqL1xuICBwdXNoKHN1YmplY3QsIHBheWxvYWQpIHtcbiAgICB0aGlzLnNvY2tldC53cy5zZW5kKEpTT04uc3RyaW5naWZ5KHsgZXZlbnQ6IEVWRU5UUy5tZXNzYWdlLCB0b3BpYzogdGhpcy50b3BpYywgc3ViamVjdDogc3ViamVjdCwgcGF5bG9hZDogcGF5bG9hZCB9KSlcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBtYWludGFpbmluZyBjb25uZWN0aW9uIHdpdGggc2VydmVyIGFuZCBtYWludGFpbmluZyBjaGFubmVscyBsaXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBTb2NrZXQge1xuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IGVuZHBvaW50IC0gV2Vic29ja2V0IGVuZHBvbnQgdXNlZCBpbiByb3V0ZXMuY3IgZmlsZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZW5kcG9pbnQpIHtcbiAgICB0aGlzLmVuZHBvaW50ID0gZW5kcG9pbnRcbiAgICB0aGlzLndzID0gbnVsbFxuICAgIHRoaXMuY2hhbm5lbHMgPSBbXVxuICAgIHRoaXMubGFzdFBpbmcgPSBub3coKVxuICAgIHRoaXMucmVjb25uZWN0VHJpZXMgPSAwXG4gICAgdGhpcy5hdHRlbXB0UmVjb25uZWN0ID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGxhc3QgcmVjZWl2ZWQgcGluZyBoYXMgYmVlbiBwYXN0IHRoZSB0aHJlc2hvbGRcbiAgICovXG4gIF9jb25uZWN0aW9uSXNTdGFsZSgpIHtcbiAgICByZXR1cm4gc2Vjb25kc1NpbmNlKHRoaXMubGFzdFBpbmcpID4gU1RBTEVfQ09OTkVDVElPTl9USFJFU0hPTERfU0VDT05EU1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIHJlY29ubmVjdCB0byB0aGUgd2Vic29ja2V0IHNlcnZlciB1c2luZyBhIHJlY3Vyc2l2ZSB0aW1lb3V0XG4gICAqL1xuICBfcmVjb25uZWN0KCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdFRpbWVvdXQpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29ubmVjdFRyaWVzKytcbiAgICAgIHRoaXMuY29ubmVjdCh0aGlzLnBhcmFtcylcbiAgICAgIHRoaXMuX3JlY29ubmVjdCgpXG4gICAgfSwgdGhpcy5fcmVjb25uZWN0SW50ZXJ2YWwoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGluY3JlbWVudGluZyB0aW1lb3V0IGludGVydmFsIGJhc2VkIGFyb3VuZCB0aGUgbnVtYmVyIG9mIHJlY29ubmVjdGlvbiByZXRyaWVzXG4gICAqL1xuICBfcmVjb25uZWN0SW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIFsxMDAwLCAyMDAwLCA1MDAwLCAxMDAwMF1bdGhpcy5yZWNvbm5lY3RUcmllc10gfHwgMTAwMDBcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgcmVjdXJzaXZlIHRpbWVvdXQgdG8gY2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RhbGVcbiAgICovXG4gIF9wb2xsKCkge1xuICAgIHRoaXMucG9sbGluZ1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25uZWN0aW9uSXNTdGFsZSgpKSB7XG4gICAgICAgIHRoaXMuX3JlY29ubmVjdCgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9wb2xsKClcbiAgICAgIH1cbiAgICB9LCBTT0NLRVRfUE9MTElOR19SQVRFKVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHBvbGxpbmcgdGltZW91dCBhbmQgc3RhcnQgcG9sbGluZ1xuICAgKi9cbiAgX3N0YXJ0UG9sbGluZygpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5wb2xsaW5nVGltZW91dClcbiAgICB0aGlzLl9wb2xsKClcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGBsYXN0UGluZ2AgdG8gdGhlIGN1cmVudCB0aW1lXG4gICAqL1xuICBfaGFuZGxlUGluZygpIHtcbiAgICB0aGlzLmxhc3RQaW5nID0gbm93KClcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgcmVjb25uZWN0IHRpbWVvdXQsIHJlc2V0cyB2YXJpYWJsZXMgYW4gc3RhcnRzIHBvbGxpbmdcbiAgICovXG4gIF9yZXNldCgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWNvbm5lY3RUaW1lb3V0KVxuICAgIHRoaXMucmVjb25uZWN0VHJpZXMgPSAwXG4gICAgdGhpcy5hdHRlbXB0UmVjb25uZWN0ID0gdHJ1ZVxuICAgIHRoaXMuX3N0YXJ0UG9sbGluZygpXG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCB0aGUgc29ja2V0IHRvIHRoZSBzZXJ2ZXIsIGFuZCBiaW5kcyB0byBuYXRpdmUgd3MgZnVuY3Rpb25zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBPcHRpb25hbCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubG9jYXRpb24gLSBIb3N0bmFtZSB0byBjb25uZWN0IHRvLCBkZWZhdWx0cyB0byBgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lYFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFybWFzLnBvcnQgLSBQb3J0IHRvIGNvbm5lY3QgdG8sIGRlZmF1bHRzIHRvIGB3aW5kb3cubG9jYXRpb24ucG9ydGBcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5wcm90b2NvbCAtIFByb3RvY29sIHRvIHVzZSwgZWl0aGVyICd3c3MnIG9yICd3cydcbiAgICovXG4gIGNvbm5lY3QocGFyYW1zKSB7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXNcblxuICAgIGxldCBvcHRzID0ge1xuICAgICAgbG9jYXRpb246IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6IHdpbmRvdy5sb2NhdGlvbi5wb3J0LFxuICAgICAgcHJvdG9jb2w6IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzOicgOiAnd3M6JyxcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zKSBPYmplY3QuYXNzaWduKG9wdHMsIHBhcmFtcylcbiAgICBpZiAob3B0cy5wb3J0KSBvcHRzLmxvY2F0aW9uICs9IGA6JHtvcHRzLnBvcnR9YFxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMud3MgPSBuZXcgV2ViU29ja2V0KGAke29wdHMucHJvdG9jb2x9Ly8ke29wdHMubG9jYXRpb259JHt0aGlzLmVuZHBvaW50fWApXG4gICAgICB0aGlzLndzLm9ubWVzc2FnZSA9IChtc2cpID0+IHsgdGhpcy5oYW5kbGVNZXNzYWdlKG1zZykgfVxuICAgICAgdGhpcy53cy5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5hdHRlbXB0UmVjb25uZWN0KSB0aGlzLl9yZWNvbm5lY3QoKVxuICAgICAgfVxuICAgICAgdGhpcy53cy5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX3Jlc2V0KClcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIHNvY2tldCBjb25uZWN0aW9uIHBlcm1hbmVudGx5XG4gICAqL1xuICBkaXNjb25uZWN0KCkge1xuICAgIHRoaXMuYXR0ZW1wdFJlY29ubmVjdCA9IGZhbHNlXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMucG9sbGluZ1RpbWVvdXQpXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZW91dClcbiAgICB0aGlzLndzLmNsb3NlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGNoYW5uZWwgdG8gdGhlIHNvY2tldCBjaGFubmVscyBsaXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0b3BpYyAtIFRvcGljIGZvciB0aGUgY2hhbm5lbDogYGNoYXRfcm9vbToxMjNgXG4gICAqL1xuICBjaGFubmVsKHRvcGljKSB7XG4gICAgbGV0IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbCh0b3BpYywgdGhpcylcbiAgICB0aGlzLmNoYW5uZWxzLnB1c2goY2hhbm5lbClcbiAgICByZXR1cm4gY2hhbm5lbFxuICB9XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgaGFuZGxlciBmb3IgbWVzc2FnZXMgcmVjZWl2ZWRcbiAgICogQHBhcmFtIHtNZXNzYWdlRXZlbnR9IG1zZyAtIE1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB3c1xuICAgKi9cbiAgaGFuZGxlTWVzc2FnZShtc2cpIHtcbiAgICBpZiAobXNnLmRhdGEgPT09IFwicGluZ1wiKSByZXR1cm4gdGhpcy5faGFuZGxlUGluZygpXG5cbiAgICBsZXQgcGFyc2VkX21zZyA9IEpTT04ucGFyc2UobXNnLmRhdGEpXG4gICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKChjaGFubmVsKSA9PiB7XG4gICAgICBpZiAoY2hhbm5lbC50b3BpYyA9PT0gcGFyc2VkX21zZy50b3BpYykgY2hhbm5lbC5oYW5kbGVNZXNzYWdlKHBhcnNlZF9tc2cpXG4gICAgfSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgU29ja2V0OiBTb2NrZXRcbn1cblxuXG4vKipcbiAqIEFsbG93cyBkZWxldGUgbGlua3MgdG8gcG9zdCBmb3Igc2VjdXJpdHkgYW5kIGVhc2Ugb2YgdXNlIHNpbWlsYXIgdG8gUmFpbHMganF1ZXJ5X3Vqc1xuICovXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImFbZGF0YS1tZXRob2Q9J2RlbGV0ZSddXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbmZpcm1cIikgfHwgXCJBcmUgeW91IHN1cmU/XCI7XG4gICAgICAgICAgICBpZiAoY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgIHZhciBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIik7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgICAgIGZvcm0uc2V0QXR0cmlidXRlKFwiYWN0aW9uXCIsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSk7XG4gICAgICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoXCJtZXRob2RcIiwgXCJQT1NUXCIpO1xuICAgICAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJoaWRkZW5cIik7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwibmFtZVwiLCBcIl9tZXRob2RcIik7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgXCJERUxFVEVcIik7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTtcbiAgICAgICAgICAgICAgICBmb3JtLnN1Ym1pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KVxuICAgIH0pXG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2xpYi9hbWJlci9hc3NldHMvanMvYW1iZXIuanMiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +!function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/dist",t(t.s=0)}([function(e,t,n){"use strict";var o=n(1);!function(e){e&&e.__esModule}(o),Date.prototype.toGranite||function(){function e(e){return e<10?"0"+e:e}Date.prototype.toGranite=function(){return this.getUTCFullYear()+"-"+e(this.getUTCMonth()+1)+"-"+e(this.getUTCDate())+" "+e(this.getUTCHours())+":"+e(this.getUTCMinutes())+":"+e(this.getUTCSeconds())}}()},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n100}},{key:"_reconnect",value:function(){var e=this;clearTimeout(this.reconnectTimeout),this.reconnectTimeout=setTimeout(function(){e.reconnectTries++,e.connect(e.params),e._reconnect()},this._reconnectInterval())}},{key:"_reconnectInterval",value:function(){return[1e3,2e3,5e3,1e4][this.reconnectTries]||1e4}},{key:"_poll",value:function(){var e=this;this.pollingTimeout=setTimeout(function(){e._connectionIsStale()?e._reconnect():e._poll()},1e4)}},{key:"_startPolling",value:function(){clearTimeout(this.pollingTimeout),this._poll()}},{key:"_handlePing",value:function(){this.lastPing=s()}},{key:"_reset",value:function(){clearTimeout(this.reconnectTimeout),this.reconnectTries=0,this.attemptReconnect=!0,this._startPolling()}},{key:"connect",value:function(e){var t=this;this.params=e;var n={location:window.location.hostname,port:window.location.port,protocol:"https:"===window.location.protocol?"wss:":"ws:"};return e&&Object.assign(n,e),n.port&&(n.location+=":"+n.port),new Promise(function(e,o){t.ws=new WebSocket(n.protocol+"//"+n.location+t.endpoint),t.ws.onmessage=function(e){t.handleMessage(e)},t.ws.onclose=function(){t.attemptReconnect&&t._reconnect()},t.ws.onopen=function(){t._reset(),e()}})}},{key:"disconnect",value:function(){this.attemptReconnect=!1,clearTimeout(this.pollingTimeout),clearTimeout(this.reconnectTimeout),this.ws.close()}},{key:"channel",value:function(e){var t=new a(e,this);return this.channels.push(t),t}},{key:"handleMessage",value:function(e){if("ping"===e.data)return this._handlePing();var t=JSON.parse(e.data);this.channels.forEach(function(e){e.topic===t.topic&&e.handleMessage(t)})}}]),e}();e.exports={Socket:u},document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll("a[data-method='delete']").forEach(function(e){e.addEventListener("click",function(t){t.preventDefault();var n=e.getAttribute("data-confirm")||"Are you sure?";if(confirm(n)){var o=document.createElement("form"),i=document.createElement("input");o.setAttribute("action",e.getAttribute("href")),o.setAttribute("method","POST"),i.setAttribute("type","hidden"),i.setAttribute("name","_method"),i.setAttribute("value","DELETE"),o.appendChild(i),document.body.appendChild(o),o.submit()}return!1})})})}]); \ No newline at end of file