{"version":3,"sources":["vendor/ember-cli/app-prefix.js","sharedrop/app.js","sharedrop/component-managers/glimmer.js","sharedrop/components/circular-progress.js","sharedrop/components/file-field.js","sharedrop/components/modal-dialog.js","sharedrop/components/peer-avatar.js","sharedrop/components/peer-widget.js","sharedrop/components/popover-confirm.js","sharedrop/components/qr-code.js","sharedrop/components/room-url.js","sharedrop/components/user-widget.js","sharedrop/controllers/application.js","sharedrop/controllers/index.js","sharedrop/helpers/app-version.js","sharedrop/helpers/is-equal.js","sharedrop/initializers/app-version.js","sharedrop/initializers/container-debug-adapter.js","sharedrop/initializers/export-application-global.js","sharedrop/initializers/prerequisites.js","sharedrop/models/peer.js","sharedrop/models/user.js","sharedrop/router.js","sharedrop/routes/application.js","sharedrop/routes/error.js","sharedrop/routes/index.js","sharedrop/routes/room.js","sharedrop/services/analytics.js","sharedrop/services/avatar.js","sharedrop/services/file.js","sharedrop/services/room.js","sharedrop/services/web-rtc.js","sharedrop/templates/about-app.js","sharedrop/templates/about-room.js","sharedrop/templates/about-you.js","sharedrop/templates/application.js","sharedrop/templates/components/modal-dialog.js","sharedrop/templates/components/peer-widget.js","sharedrop/templates/components/popover-confirm.js","sharedrop/templates/components/user-widget.js","sharedrop/templates/errors/browser-unsupported.js","sharedrop/templates/errors/filesystem-unavailable.js","sharedrop/templates/errors/popovers/connection-failed.js","sharedrop/templates/errors/popovers/multiple-files.js","sharedrop/templates/index.js","vendor/ember-cli/app-suffix.js","vendor/ember-cli/app-config.js","vendor/ember-cli/app-boot.js"],"sourcesContent":["'use strict';\n\n\n","define(\"sharedrop/app\", [\"exports\", \"ember-resolver\", \"ember-load-initializers\", \"sharedrop/config/environment\", \"@sentry/browser\", \"@sentry/integrations\"], function (_exports, _emberResolver, _emberLoadInitializers, _environment, Sentry, _integrations) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n  Sentry.init({\n    dsn: 'https://ba1292a9c759401dbbda4272f183408d@o432021.ingest.sentry.io/5384091',\n    integrations: [new _integrations.Ember()]\n  });\n\n  class App extends Ember.Application {\n    constructor(...args) {\n      super(...args);\n\n      _defineProperty(this, \"modulePrefix\", _environment.default.modulePrefix);\n\n      _defineProperty(this, \"podModulePrefix\", _environment.default.podModulePrefix);\n\n      _defineProperty(this, \"Resolver\", _emberResolver.default);\n    }\n\n  }\n\n  _exports.default = App;\n  (0, _emberLoadInitializers.default)(App, _environment.default.modulePrefix);\n});","define(\"sharedrop/component-managers/glimmer\", [\"exports\", \"@glimmer/component/-private/ember-component-manager\"], function (_exports, _emberComponentManager) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _emberComponentManager.default;\n    }\n  });\n});","define(\"sharedrop/components/circular-progress\", [\"exports\", \"@glimmer/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  const __COLOCATED_TEMPLATE__ = Ember.HTMLBars.template(\n  /*\n    <svg width=\"76\" height=\"76\" viewport=\"0 0 76 76\" style={{this.style}}>\n    <path class=\"break\" transform=\"translate(38, 38)\" d={{this.path}} />\n  </svg>\n  */\n  {\"id\":\"PyuhpFmm\",\"block\":\"{\\\"symbols\\\":[],\\\"statements\\\":[[10,\\\"svg\\\"],[14,\\\"width\\\",\\\"76\\\"],[14,\\\"height\\\",\\\"76\\\"],[14,\\\"viewport\\\",\\\"0 0 76 76\\\"],[15,5,[32,0,[\\\"style\\\"]]],[12],[2,\\\"\\\\n  \\\"],[10,\\\"path\\\"],[14,0,\\\"break\\\"],[14,\\\"transform\\\",\\\"translate(38, 38)\\\"],[15,\\\"d\\\",[32,0,[\\\"path\\\"]]],[12],[13],[2,\\\"\\\\n\\\"],[13]],\\\"hasEval\\\":false,\\\"upvars\\\":[]}\",\"meta\":{\"moduleName\":\"sharedrop/components/circular-progress.hbs\"}});\n\n  const COLORS = {\n    blue: '0, 136, 204',\n    orange: '197, 197, 51'\n  };\n\n  class CircularProgress extends _component.default {\n    constructor(owner, args) {\n      super(owner, args);\n      const rgb = COLORS[args.color];\n      this.style = Ember.String.htmlSafe(`fill: rgba(${rgb}, .5)`);\n    }\n\n    get path() {\n      const π = Math.PI;\n      const α = this.args.value * 360;\n      const r = α * π / 180;\n      const mid = α > 180 ? 1 : 0;\n      const x = Math.sin(r) * 38;\n      const y = Math.cos(r) * -38;\n      return `M 0 0 v -38 A 38 38 1 ${mid} 1 ${x} ${y} z`;\n    }\n\n  }\n\n  _exports.default = CircularProgress;\n\n  Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, CircularProgress);\n});","define(\"sharedrop/components/file-field\", [\"exports\", \"jquery\"], function (_exports, _jquery) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.TextField.extend({\n    type: 'file',\n    classNames: ['invisible'],\n\n    click(event) {\n      event.stopPropagation();\n    },\n\n    change(event) {\n      const input = event.target;\n      const {\n        files\n      } = input;\n      this.onChange({\n        files\n      });\n      this.reset();\n    },\n\n    // Hackish way to reset file input when sender cancels file transfer,\n    // so if sender wants later to send the same file again,\n    // the 'change' event is triggered correctly.\n    reset() {\n      const field = (0, _jquery.default)(this.element);\n      field.wrap('<form>').closest('form').get(0).reset();\n      field.unwrap();\n    }\n\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/components/modal-dialog\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.Component.extend({\n    actions: {\n      close() {\n        // This sends an action to application route.\n        // eslint-disable-next-line ember/closure-actions\n        return this.onClose();\n      }\n\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/components/peer-avatar\", [\"exports\", \"jquery\"], function (_exports, _jquery) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.Component.extend({\n    tagName: 'img',\n    classNames: ['gravatar'],\n    attributeBindings: ['src', 'alt', 'title', 'data-sending-progress', 'data-receiving-progress'],\n    src: Ember.computed.alias('peer.avatarUrl'),\n    alt: Ember.computed.alias('peer.label'),\n    title: Ember.computed.alias('peer.uuid'),\n    'data-sending-progress': Ember.computed.alias('peer.transfer.sendingProgress'),\n    'data-receiving-progress': Ember.computed.alias('peer.transfer.receivingProgress'),\n\n    toggleTransferCompletedClass() {\n      const className = 'transfer-completed';\n      Ember.run.later(this, function toggleClass() {\n        (0, _jquery.default)(this.element).parent('.avatar').addClass(className).delay(2000).queue(function removeClass() {\n          (0, _jquery.default)(this).removeClass(className).dequeue();\n        });\n      }, 250);\n    },\n\n    init(...args) {\n      this._super(args);\n\n      this.toggleTransferCompletedClass = this.toggleTransferCompletedClass.bind(this);\n    },\n\n    didInsertElement(...args) {\n      this._super(args);\n\n      const {\n        peer\n      } = this;\n      peer.on('didReceiveFile', this.toggleTransferCompletedClass);\n      peer.on('didSendFile', this.toggleTransferCompletedClass);\n    },\n\n    willDestroyElement(...args) {\n      this._super(args);\n\n      const {\n        peer\n      } = this;\n      peer.off('didReceiveFile', this.toggleTransferCompletedClass);\n      peer.off('didSendFile', this.toggleTransferCompletedClass);\n    },\n\n    // Delegate click to hidden file field in peer template\n    click() {\n      if (this.canSendFile()) {\n        (0, _jquery.default)(this.element).closest('.peer').find('input[type=file]').click();\n      }\n    },\n\n    // Handle drop events\n    dragEnter(event) {\n      this.cancelEvent(event);\n      (0, _jquery.default)(this.element).parent('.avatar').addClass('hover');\n    },\n\n    dragOver(event) {\n      this.cancelEvent(event);\n    },\n\n    dragLeave() {\n      (0, _jquery.default)(this.element).parent('.avatar').removeClass('hover');\n    },\n\n    drop(event) {\n      this.cancelEvent(event);\n      (0, _jquery.default)(this.element).parent('.avatar').removeClass('hover');\n      const {\n        peer\n      } = this;\n      const dt = event.originalEvent.dataTransfer;\n      const {\n        files\n      } = dt;\n\n      if (this.canSendFile()) {\n        if (!this.isTransferableBundle(files)) {\n          peer.setProperties({\n            state: 'error',\n            errorCode: 'multiple-files'\n          });\n        } else {\n          this.onFileDrop({\n            files\n          });\n        }\n      }\n    },\n\n    cancelEvent(event) {\n      event.stopPropagation();\n      event.preventDefault();\n    },\n\n    canSendFile() {\n      const {\n        peer\n      } = this; // Can't send files if another file transfer is already in progress\n\n      return !(peer.get('state') === 'is_preparing_file_transfer' || peer.get('transfer.file') || peer.get('transfer.info'));\n    },\n\n    isTransferableBundle(files) {\n      if (files.length === 1 && files[0] instanceof window.File) return true;\n      const fileSizeLimit = 50 * 1024 * 1024;\n      const bundleSizeLimit = 200 * 1024 * 1024;\n      let aggregatedSize = 0; // eslint-disable-next-line no-restricted-syntax\n\n      for (const file of files) {\n        if (!(file instanceof window.File)) {\n          return false;\n        }\n\n        if (file.size > fileSizeLimit) {\n          return false;\n        }\n\n        aggregatedSize += file.size;\n\n        if (aggregatedSize > bundleSizeLimit) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/components/peer-widget\", [\"exports\", \"jszip\"], function (_exports, _jszip) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.Component.extend({\n    classNames: ['peer'],\n    classNameBindings: ['peer.peer.state'],\n    peer: null,\n    hasCustomRoomName: false,\n    webrtc: null,\n    // TODO inject webrtc as a service\n    label: Ember.computed.alias('peer.label'),\n    isIdle: Ember.computed.equal('peer.state', 'idle'),\n    isPreparingFileTransfer: Ember.computed.equal('peer.state', 'is_preparing_file_transfer'),\n    hasSelectedFile: Ember.computed.equal('peer.state', 'has_selected_file'),\n    isSendingFileInfo: Ember.computed.equal('peer.state', 'sending_file_info'),\n    isAwaitingFileInfo: Ember.computed.equal('peer.state', 'awaiting_file_info'),\n    isAwaitingResponse: Ember.computed.equal('peer.state', 'awaiting_response'),\n    hasReceivedFileInfo: Ember.computed.equal('peer.state', 'received_file_info'),\n    hasDeclinedFileTransfer: Ember.computed.equal('peer.state', 'declined_file_transfer'),\n    hasError: Ember.computed.equal('peer.state', 'error'),\n    isReceivingFile: Ember.computed.gt('peer.transfer.receivingProgress', 0),\n    isSendingFile: Ember.computed.gt('peer.transfer.sendingProgress', 0),\n    filename: Ember.computed('peer.transfer.{file,info}', function () {\n      const file = this.get('peer.transfer.file');\n      const info = this.get('peer.transfer.info');\n\n      if (file) {\n        return file.name;\n      }\n\n      if (info) {\n        return info.name;\n      }\n\n      return null;\n    }),\n    errorTemplateName: Ember.computed('peer.errorCode', function () {\n      const errorCode = this.get('peer.errorCode');\n      return errorCode ? `errors/popovers/${errorCode}` : null;\n    }),\n    actions: {\n      // TODO: rename to something more meaningful (e.g. askIfWantToSendFile)\n      uploadFile(data) {\n        const {\n          peer\n        } = this;\n        const {\n          files\n        } = data;\n        peer.set('state', 'is_preparing_file_transfer');\n        peer.set('bundlingProgress', 0); // Cache the file, so that it's available\n        // when the response from the recipient comes in\n\n        this._reduceFiles(files).then(file => {\n          peer.set('transfer.file', file);\n          peer.set('state', 'has_selected_file');\n        });\n      },\n\n      sendFileTransferInquiry() {\n        const {\n          webrtc\n        } = this;\n        const {\n          peer\n        } = this;\n        webrtc.connect(peer.get('peer.id'));\n        peer.set('state', 'establishing_connection');\n      },\n\n      cancelFileTransfer() {\n        this._cancelFileTransfer();\n      },\n\n      abortFileTransfer() {\n        this._cancelFileTransfer();\n\n        const {\n          webrtc\n        } = this;\n        const connection = this.get('peer.peer.connection');\n        webrtc.sendCancelRequest(connection);\n      },\n\n      acceptFileTransfer() {\n        const {\n          peer\n        } = this;\n\n        this._sendFileTransferResponse(true);\n\n        peer.get('peer.connection').on('receiving_progress', progress => {\n          peer.set('transfer.receivingProgress', progress);\n        });\n        peer.set('state', 'sending_file_data');\n      },\n\n      rejectFileTransfer() {\n        const {\n          peer\n        } = this;\n\n        this._sendFileTransferResponse(false);\n\n        peer.set('transfer.info', null);\n        peer.set('state', 'idle');\n      }\n\n    },\n\n    _cancelFileTransfer() {\n      const {\n        peer\n      } = this;\n      peer.setProperties({\n        'transfer.file': null,\n        state: 'idle'\n      });\n    },\n\n    _sendFileTransferResponse(response) {\n      const {\n        webrtc\n      } = this;\n      const {\n        peer\n      } = this;\n      const connection = peer.get('peer.connection');\n      webrtc.sendFileResponse(connection, response);\n    },\n\n    async _reduceFiles(files) {\n      const {\n        peer\n      } = this;\n\n      if (files.length === 1) {\n        return Promise.resolve(files[0]);\n      }\n\n      const zip = new _jszip.default();\n      Array.prototype.forEach.call(files, file => {\n        zip.file(file.name, file);\n      });\n      const blob = await zip.generateAsync({\n        type: 'blob',\n        streamFiles: true\n      }, metadata => {\n        peer.set('bundlingProgress', metadata.percent / 100);\n      });\n      return new File([blob], `sharedrop-${new Date().toISOString().substring(0, 19).replace('T', '-')}.zip`, {\n        type: 'application/zip'\n      });\n    }\n\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/components/popover-confirm\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.Component.extend({\n    classNames: ['popover-confirm'],\n    iconClass: Ember.computed('filename', function () {\n      const {\n        filename\n      } = this;\n\n      if (filename) {\n        const regex = /\\.([0-9a-z]+)$/i;\n        const match = filename.match(regex);\n        const extension = match && match[1];\n\n        if (extension) {\n          return `glyphicon-${extension.toLowerCase()}`;\n        }\n      }\n\n      return undefined;\n    }),\n    actions: {\n      confirm() {\n        this.onConfirm();\n      },\n\n      cancel() {\n        this.onCancel();\n      }\n\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/components/qr-code\", [\"exports\", \"ember-qrcode-shim/components/qr-code\"], function (_exports, _qrCode) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function () {\n      return _qrCode.default;\n    }\n  });\n});","define(\"sharedrop/components/room-url\", [\"exports\", \"jquery\"], function (_exports, _jquery) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.TextField.extend({\n    classNames: ['room-url'],\n\n    didInsertElement() {\n      (0, _jquery.default)(this.element).focus().select();\n    },\n\n    copyValueToClipboard() {\n      if (window.ClipboardEvent) {\n        const pasteEvent = new window.ClipboardEvent('paste', {\n          dataType: 'text/plain',\n          data: this.element.value\n        });\n        document.dispatchEvent(pasteEvent);\n      }\n    }\n\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/components/user-widget\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.Component.extend({\n    classNames: ['peer'],\n    classNameBindings: ['peer.peer.state']\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/controllers/application\", [\"exports\", \"uuid\", \"sharedrop/models/user\"], function (_exports, _uuid, _user) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.Controller.extend({\n    avatarService: Ember.inject.service('avatar'),\n\n    init(...args) {\n      this._super(args);\n\n      const id = window.Sharedrop.userId;\n      const ip = window.Sharedrop.publicIp;\n      const avatar = this.avatarService.get();\n\n      const you = _user.default.create({\n        uuid: id,\n        public_ip: ip,\n        avatarUrl: avatar.url,\n        label: avatar.label\n      });\n\n      you.set('peer.id', id);\n      this.set('you', you);\n    },\n\n    actions: {\n      redirect() {\n        const uuid = (0, _uuid.v4)();\n        const key = `show-instructions-for-room-${uuid}`;\n        sessionStorage.setItem(key, 'yup');\n        this.transitionToRoute('room', uuid);\n      }\n\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/controllers/index\", [\"exports\", \"jquery\", \"sharedrop/services/web-rtc\", \"sharedrop/models/peer\"], function (_exports, _jquery, _webRtc, _peer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.Controller.extend({\n    application: Ember.inject.controller('application'),\n    you: Ember.computed.alias('application.you'),\n    room: null,\n    webrtc: null,\n\n    _onRoomConnected(event, data) {\n      const {\n        you\n      } = this;\n      const {\n        room\n      } = this;\n      you.get('peer').setProperties(data.peer); // eslint-disable-next-line no-param-reassign\n\n      delete data.peer;\n      you.setProperties(data); // Initialize WebRTC\n\n      this.set('webrtc', new _webRtc.default(you.get('uuid'), {\n        room: room.name,\n        firebaseRef: window.Sharedrop.ref\n      }));\n    },\n\n    _onRoomDisconnected() {\n      this.model.clear();\n      this.set('webrtc', null);\n    },\n\n    _onRoomUserAdded(event, data) {\n      const {\n        you\n      } = this;\n\n      if (you.get('uuid') !== data.uuid) {\n        this._addPeer(data);\n      }\n    },\n\n    _addPeer(attrs) {\n      const peerAttrs = attrs.peer; // eslint-disable-next-line no-param-reassign\n\n      delete attrs.peer;\n\n      const peer = _peer.default.create(attrs);\n\n      peer.get('peer').setProperties(peerAttrs);\n      this.model.pushObject(peer);\n    },\n\n    _onRoomUserChanged(event, data) {\n      const peers = this.model;\n      const peer = peers.findBy('uuid', data.uuid);\n      const peerAttrs = data.peer;\n      const defaults = {\n        uuid: null,\n        public_ip: null\n      };\n\n      if (peer) {\n        // eslint-disable-next-line no-param-reassign\n        delete data.peer; // Firebase doesn't return keys with null values,\n        // so we have to add them back.\n\n        peer.setProperties(_jquery.default.extend({}, defaults, data));\n        peer.get('peer').setProperties(peerAttrs);\n      }\n    },\n\n    _onRoomUserRemoved(event, data) {\n      const peers = this.model;\n      const peer = peers.findBy('uuid', data.uuid);\n      peers.removeObject(peer);\n    },\n\n    _onPeerP2PIncomingConnection(event, data) {\n      const {\n        connection\n      } = data;\n      const peers = this.model;\n      const peer = peers.findBy('peer.id', connection.peer); // Don't switch to 'connecting' state on incoming connection,\n      // as p2p connection may still fail.\n\n      peer.set('peer.connection', connection);\n    },\n\n    _onPeerDCIncomingConnection(event, data) {\n      const {\n        connection\n      } = data;\n      const peers = this.model;\n      const peer = peers.findBy('peer.id', connection.peer);\n      peer.set('peer.state', 'connected');\n    },\n\n    _onPeerDCIncomingConnectionError(event, data) {\n      const {\n        connection,\n        error\n      } = data;\n      const peers = this.model;\n      const peer = peers.findBy('peer.id', connection.peer);\n\n      switch (error.type) {\n        case 'failed':\n          peer.setProperties({\n            'peer.connection': null,\n            'peer.state': 'disconnected',\n            state: 'error',\n            errorCode: 'connection-failed'\n          });\n          break;\n\n        case 'disconnected':\n          // TODO: notify both sides\n          break;\n\n        default:\n          break;\n      }\n    },\n\n    _onPeerP2POutgoingConnection(event, data) {\n      const {\n        connection\n      } = data;\n      const peers = this.model;\n      const peer = peers.findBy('peer.id', connection.peer);\n      peer.setProperties({\n        'peer.connection': connection,\n        'peer.state': 'connecting'\n      });\n    },\n\n    _onPeerDCOutgoingConnection(event, data) {\n      const {\n        connection\n      } = data;\n      const peers = this.model;\n      const peer = peers.findBy('peer.id', connection.peer);\n      const file = peer.get('transfer.file');\n      const {\n        webrtc\n      } = this;\n      const info = webrtc.getFileInfo(file);\n      peer.set('peer.state', 'connected');\n      peer.set('state', 'awaiting_response');\n      webrtc.sendFileInfo(connection, info);\n      console.log('Sending a file info...', info);\n    },\n\n    _onPeerDCOutgoingConnectionError(event, data) {\n      const {\n        connection,\n        error\n      } = data;\n      const peers = this.model;\n      const peer = peers.findBy('peer.id', connection.peer);\n\n      switch (error.type) {\n        case 'failed':\n          peer.setProperties({\n            'peer.connection': null,\n            'peer.state': 'disconnected',\n            state: 'error',\n            errorCode: 'connection-failed'\n          });\n          break;\n\n        default:\n          break;\n      }\n    },\n\n    _onPeerP2PDisconnected(event, data) {\n      const {\n        connection\n      } = data;\n      const peers = this.model;\n      const peer = peers.findBy('peer.id', connection.peer);\n\n      if (peer) {\n        peer.set('peer.connection', null);\n        peer.set('peer.state', 'disconnected');\n      }\n    },\n\n    _onPeerP2PFileInfo(event, data) {\n      console.log('Peer:\\t Received file info', data);\n      const {\n        connection,\n        info\n      } = data;\n      const peers = this.model;\n      const peer = peers.findBy('peer.id', connection.peer);\n      peer.set('transfer.info', info);\n      peer.set('state', 'received_file_info');\n    },\n\n    _onPeerP2PFileResponse(event, data) {\n      console.log('Peer:\\t Received file response', data);\n      const {\n        connection,\n        response\n      } = data;\n      const peers = this.model;\n      const peer = peers.findBy('peer.id', connection.peer);\n      const {\n        webrtc\n      } = this;\n\n      if (response) {\n        const file = peer.get('transfer.file');\n        connection.on('sending_progress', progress => {\n          peer.set('transfer.sendingProgress', progress);\n        });\n        webrtc.sendFile(connection, file);\n        peer.set('state', 'receiving_file_data');\n      } else {\n        peer.set('state', 'declined_file_transfer');\n      }\n    },\n\n    _onPeerP2PFileCanceled(event, data) {\n      const {\n        connection\n      } = data;\n      const peers = this.model;\n      const peer = peers.findBy('peer.id', connection.peer);\n      connection.close();\n      peer.set('transfer.receivingProgress', 0);\n      peer.set('transfer.info', null);\n      peer.set('state', 'idle');\n    },\n\n    _onPeerP2PFileReceived(event, data) {\n      console.log('Peer:\\t Received file', data);\n      const {\n        connection\n      } = data;\n      const peers = this.model;\n      const peer = peers.findBy('peer.id', connection.peer);\n      connection.close();\n      peer.set('transfer.receivingProgress', 0);\n      peer.set('transfer.info', null);\n      peer.set('state', 'idle');\n      peer.trigger('didReceiveFile');\n    },\n\n    _onPeerP2PFileSent(event, data) {\n      console.log('Peer:\\t Sent file', data);\n      const {\n        connection\n      } = data;\n      const peers = this.model;\n      const peer = peers.findBy('peer.id', connection.peer);\n      peer.set('transfer.sendingProgress', 0);\n      peer.set('transfer.file', null);\n      peer.set('state', 'idle');\n      peer.trigger('didSendFile');\n    }\n\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/helpers/app-version\", [\"exports\", \"sharedrop/config/environment\", \"ember-cli-app-version/utils/regexp\"], function (_exports, _environment, _regexp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.appVersion = appVersion;\n  _exports.default = void 0;\n\n  function appVersion(_, hash = {}) {\n    const version = _environment.default.APP.version; // e.g. 1.0.0-alpha.1+4jds75hf\n    // Allow use of 'hideSha' and 'hideVersion' For backwards compatibility\n\n    let versionOnly = hash.versionOnly || hash.hideSha;\n    let shaOnly = hash.shaOnly || hash.hideVersion;\n    let match = null;\n\n    if (versionOnly) {\n      if (hash.showExtended) {\n        match = version.match(_regexp.versionExtendedRegExp); // 1.0.0-alpha.1\n      } // Fallback to just version\n\n\n      if (!match) {\n        match = version.match(_regexp.versionRegExp); // 1.0.0\n      }\n    }\n\n    if (shaOnly) {\n      match = version.match(_regexp.shaRegExp); // 4jds75hf\n    }\n\n    return match ? match[0] : version;\n  }\n\n  var _default = Ember.Helper.helper(appVersion);\n\n  _exports.default = _default;\n});","define(\"sharedrop/helpers/is-equal\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.Helper.helper(([leftSide, rightSide]) => leftSide === rightSide);\n\n  _exports.default = _default;\n});","define(\"sharedrop/initializers/app-version\", [\"exports\", \"ember-cli-app-version/initializer-factory\", \"sharedrop/config/environment\"], function (_exports, _initializerFactory, _environment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  let name, version;\n\n  if (_environment.default.APP) {\n    name = _environment.default.APP.name;\n    version = _environment.default.APP.version;\n  }\n\n  var _default = {\n    name: 'App Version',\n    initialize: (0, _initializerFactory.default)(name, version)\n  };\n  _exports.default = _default;\n});","define(\"sharedrop/initializers/container-debug-adapter\", [\"exports\", \"ember-resolver/resolvers/classic/container-debug-adapter\"], function (_exports, _containerDebugAdapter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = {\n    name: 'container-debug-adapter',\n\n    initialize() {\n      let app = arguments[1] || arguments[0];\n      app.register('container-debug-adapter:main', _containerDebugAdapter.default);\n      app.inject('container-debug-adapter:main', 'namespace', 'application:main');\n    }\n\n  };\n  _exports.default = _default;\n});","define(\"sharedrop/initializers/export-application-global\", [\"exports\", \"sharedrop/config/environment\"], function (_exports, _environment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.initialize = initialize;\n  _exports.default = void 0;\n\n  function initialize() {\n    var application = arguments[1] || arguments[0];\n\n    if (_environment.default.exportApplicationGlobal !== false) {\n      var theGlobal;\n\n      if (typeof window !== 'undefined') {\n        theGlobal = window;\n      } else if (typeof global !== 'undefined') {\n        theGlobal = global;\n      } else if (typeof self !== 'undefined') {\n        theGlobal = self;\n      } else {\n        // no reasonable global, just bail\n        return;\n      }\n\n      var value = _environment.default.exportApplicationGlobal;\n      var globalName;\n\n      if (typeof value === 'string') {\n        globalName = value;\n      } else {\n        globalName = Ember.String.classify(_environment.default.modulePrefix);\n      }\n\n      if (!theGlobal[globalName]) {\n        theGlobal[globalName] = application;\n        application.reopen({\n          willDestroy: function () {\n            this._super.apply(this, arguments);\n\n            delete theGlobal[globalName];\n          }\n        });\n      }\n    }\n  }\n\n  var _default = {\n    name: 'export-application-global',\n    initialize: initialize\n  };\n  _exports.default = _default;\n});","define(\"sharedrop/initializers/prerequisites\", [\"exports\", \"jquery\", \"sharedrop/config/environment\", \"sharedrop/services/file\", \"sharedrop/services/analytics\"], function (_exports, _jquery, _environment, _file, _analytics) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.initialize = initialize;\n  _exports.default = void 0;\n\n  /* jshint -W030 */\n  function initialize(application) {\n    function checkWebRTCSupport() {\n      return new Ember.RSVP.Promise((resolve, reject) => {\n        // window.util is a part of PeerJS library\n        if (window.util.supports.sctp) {\n          resolve();\n        } else {\n          // eslint-disable-next-line prefer-promise-reject-errors\n          reject('browser-unsupported');\n        }\n      });\n    }\n\n    function clearFileSystem() {\n      return new Ember.RSVP.Promise((resolve, reject) => {\n        // TODO: change File into a service and require it here\n        _file.default.removeAll().then(() => {\n          resolve();\n        }).catch(() => {\n          // eslint-disable-next-line prefer-promise-reject-errors\n          reject('filesystem-unavailable');\n        });\n      });\n    }\n\n    function authenticateToFirebase() {\n      return new Ember.RSVP.Promise((resolve, reject) => {\n        const xhr = _jquery.default.getJSON('/auth');\n\n        xhr.then(data => {\n          const ref = new window.Firebase(_environment.default.FIREBASE_URL); // eslint-disable-next-line no-param-reassign\n\n          application.ref = ref; // eslint-disable-next-line no-param-reassign\n\n          application.userId = data.id; // eslint-disable-next-line no-param-reassign\n\n          application.publicIp = data.public_ip;\n          ref.authWithCustomToken(data.token, error => {\n            if (error) {\n              reject(error);\n            } else {\n              resolve();\n            }\n          });\n        });\n      });\n    } // TODO: move it to a separate initializer\n\n\n    function trackSizeOfReceivedFiles() {\n      _jquery.default.subscribe('file_received.p2p', (event, data) => {\n        _analytics.default.trackEvent('received', {\n          event_category: 'file',\n          event_label: 'size',\n          value: Math.round(data.info.size / 1000)\n        });\n      });\n    }\n\n    application.deferReadiness();\n    checkWebRTCSupport().then(clearFileSystem).catch(error => {\n      // eslint-disable-next-line no-param-reassign\n      application.error = error;\n    }).then(authenticateToFirebase).then(trackSizeOfReceivedFiles).then(() => {\n      application.advanceReadiness();\n    });\n  }\n\n  var _default = {\n    name: 'prerequisites',\n    initialize\n  };\n  _exports.default = _default;\n});","define(\"sharedrop/models/peer\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.Object.extend(Ember.Evented, {\n    uuid: null,\n    label: null,\n    avatarUrl: null,\n    public_ip: null,\n    peer: null,\n    transfer: null,\n\n    init(...args) {\n      this._super(args);\n\n      const initialPeerState = Ember.Object.create({\n        id: null,\n        connection: null,\n        // State of data channel connection. Possible states:\n        // - disconnected\n        // - connecting\n        // - connected\n        state: 'disconnected'\n      });\n      const initialTransferState = Ember.Object.create({\n        file: null,\n        info: null,\n        sendingProgress: 0,\n        receivingProgress: 0\n      });\n      this.set('peer', initialPeerState);\n      this.set('transfer', initialTransferState);\n    },\n\n    // Used to display popovers. Possible states:\n    // - idle\n    // - has_selected_file\n    // - establishing_connection\n    // - awaiting_response\n    // - received_file_info\n    // - declined_file_transfer\n    // - receiving_file_data\n    // - sending_file_data\n    // - error\n    state: 'idle',\n    // Used to display error messages in popovers. Possible codes:\n    // - multiple_files\n    errorCode: null,\n    stateChanged: Ember.on('init', Ember.observer('state', function () {\n      console.log('Peer:\\t State has changed: ', this.state); // Automatically clear error code if transitioning to a non-error state\n\n      if (this.state !== 'error') {\n        this.set('errorCode', null);\n      }\n    }))\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/models/user\", [\"exports\", \"sharedrop/models/peer\"], function (_exports, _peer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  const User = _peer.default.extend({\n    serialize() {\n      const data = {\n        uuid: this.uuid,\n        public_ip: this.public_ip,\n        label: this.label,\n        avatarUrl: this.avatarUrl,\n        peer: {\n          id: this.get('peer.id')\n        }\n      };\n      return data;\n    }\n\n  });\n\n  var _default = User;\n  _exports.default = _default;\n});","define(\"sharedrop/router\", [\"exports\", \"sharedrop/config/environment\"], function (_exports, _environment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n  class Router extends Ember.Router {\n    constructor(...args) {\n      super(...args);\n\n      _defineProperty(this, \"location\", _environment.default.locationType);\n\n      _defineProperty(this, \"rootURL\", _environment.default.rootURL);\n    }\n\n  } // eslint-disable-next-line array-callback-return\n\n\n  _exports.default = Router;\n  Router.map(function () {\n    this.route('room', {\n      path: '/rooms/:room_id'\n    });\n  });\n});","define(\"sharedrop/routes/application\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.Route.extend({\n    setupController(controller) {\n      controller.set('currentRoute', this);\n    },\n\n    actions: {\n      openModal(modalName) {\n        return this.render(modalName, {\n          outlet: 'modal',\n          into: 'application'\n        });\n      },\n\n      closeModal() {\n        return this.disconnectOutlet({\n          outlet: 'modal',\n          parentView: 'application'\n        });\n      }\n\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/routes/error\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.Route.extend({\n    renderTemplate(controller, error) {\n      const errors = ['browser-unsupported', 'filesystem-unavailable'];\n      const name = `errors/${error.message}`;\n\n      if (errors.indexOf(error.message) !== -1) {\n        this.render(name);\n      }\n    }\n\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/routes/index\", [\"exports\", \"jquery\", \"sharedrop/services/room\"], function (_exports, _jquery, _room) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.Route.extend({\n    beforeModel() {\n      const {\n        error\n      } = window.Sharedrop;\n\n      if (error) {\n        throw new Error(error);\n      }\n    },\n\n    model() {\n      // Get room name from the server\n      return _jquery.default.getJSON('/room').then(data => data.name);\n    },\n\n    setupController(ctrl, model) {\n      ctrl.set('model', []);\n      ctrl.set('hasCustomRoomName', false); // Handle room events\n\n      _jquery.default.subscribe('connected.room', ctrl._onRoomConnected.bind(ctrl));\n\n      _jquery.default.subscribe('disconnected.room', ctrl._onRoomDisconnected.bind(ctrl));\n\n      _jquery.default.subscribe('user_added.room', ctrl._onRoomUserAdded.bind(ctrl));\n\n      _jquery.default.subscribe('user_changed.room', ctrl._onRoomUserChanged.bind(ctrl));\n\n      _jquery.default.subscribe('user_removed.room', ctrl._onRoomUserRemoved.bind(ctrl)); // Handle peer events\n\n\n      _jquery.default.subscribe('incoming_peer_connection.p2p', ctrl._onPeerP2PIncomingConnection.bind(ctrl));\n\n      _jquery.default.subscribe('incoming_dc_connection.p2p', ctrl._onPeerDCIncomingConnection.bind(ctrl));\n\n      _jquery.default.subscribe('incoming_dc_connection_error.p2p', ctrl._onPeerDCIncomingConnectionError.bind(ctrl));\n\n      _jquery.default.subscribe('outgoing_peer_connection.p2p', ctrl._onPeerP2POutgoingConnection.bind(ctrl));\n\n      _jquery.default.subscribe('outgoing_dc_connection.p2p', ctrl._onPeerDCOutgoingConnection.bind(ctrl));\n\n      _jquery.default.subscribe('outgoing_dc_connection_error.p2p', ctrl._onPeerDCOutgoingConnectionError.bind(ctrl));\n\n      _jquery.default.subscribe('disconnected.p2p', ctrl._onPeerP2PDisconnected.bind(ctrl));\n\n      _jquery.default.subscribe('info.p2p', ctrl._onPeerP2PFileInfo.bind(ctrl));\n\n      _jquery.default.subscribe('response.p2p', ctrl._onPeerP2PFileResponse.bind(ctrl));\n\n      _jquery.default.subscribe('file_canceled.p2p', ctrl._onPeerP2PFileCanceled.bind(ctrl));\n\n      _jquery.default.subscribe('file_received.p2p', ctrl._onPeerP2PFileReceived.bind(ctrl));\n\n      _jquery.default.subscribe('file_sent.p2p', ctrl._onPeerP2PFileSent.bind(ctrl)); // Join the room\n\n\n      const room = new _room.default(model, window.Sharedrop.ref);\n      room.join(ctrl.get('you').serialize());\n      ctrl.set('room', room);\n    },\n\n    renderTemplate() {\n      this.render();\n      this.render('about_you', {\n        into: 'application',\n        outlet: 'about_you'\n      });\n      const key = 'show-instructions-for-app';\n\n      if (!localStorage.getItem(key)) {\n        this.send('openModal', 'about_app');\n        localStorage.setItem(key, 'yup');\n      }\n    },\n\n    actions: {\n      willTransition() {\n        _jquery.default.unsubscribe('.room');\n\n        _jquery.default.unsubscribe('.p2p'); // eslint-disable-next-line ember/no-controller-access-in-routes\n\n\n        const controller = this.controllerFor('index');\n        controller.get('room').leave();\n        return true;\n      }\n\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/routes/room\", [\"exports\", \"sharedrop/routes/index\"], function (_exports, _index) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = _index.default.extend({\n    controllerName: 'index',\n\n    model(params) {\n      // Get room name from params\n      return params.room_id;\n    },\n\n    afterModel(model, transition) {\n      transition.then(route => {\n        route.controllerFor('application').set('currentUrl', window.location.href);\n      });\n    },\n\n    setupController(ctrl, model) {\n      // Call this method on \"index\" controller\n      this._super(ctrl, model);\n\n      ctrl.set('hasCustomRoomName', true);\n    },\n\n    renderTemplate(ctrl) {\n      this.render('index');\n      this.render('about_you', {\n        into: 'application',\n        outlet: 'about_you'\n      });\n      const room = ctrl.get('room').name;\n      const key = `show-instructions-for-room-${room}`;\n\n      if (sessionStorage.getItem(key)) {\n        this.send('openModal', 'about_room');\n        sessionStorage.removeItem(key);\n      }\n    }\n\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/services/analytics\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = {\n    trackEvent(name, parameters) {\n      if (window.gtag && typeof window.gtag === 'function') {\n        window.gtag('event', name, parameters);\n      }\n    }\n\n  };\n  _exports.default = _default;\n});","define(\"sharedrop/services/avatar\", [\"exports\", \"lodash/sample\", \"lodash/startCase\"], function (_exports, _sample, _startCase) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const AVATARS = [{\n    name: 'Piglet',\n    id: '23'\n  }, {\n    name: 'Cat',\n    id: '36'\n  }, {\n    name: 'Fish',\n    id: '37'\n  }, {\n    name: 'Fox',\n    id: '38'\n  }, {\n    name: 'Chicken',\n    id: '46'\n  }, {\n    name: 'Goat',\n    id: '50'\n  }, {\n    name: 'Ram',\n    id: '51'\n  }, {\n    name: 'Sheep',\n    id: '52'\n  }, {\n    name: 'Bison',\n    id: '59'\n  }, {\n    name: 'Dog',\n    id: '61'\n  }, {\n    name: 'Walrus',\n    id: '62'\n  }, {\n    name: 'Dog',\n    id: '63'\n  }, {\n    name: 'Monkey',\n    id: '64'\n  }, {\n    name: 'Bear',\n    id: '65'\n  }, {\n    name: 'Lion',\n    id: '66'\n  }, {\n    name: 'Zebra',\n    id: '67'\n  }, {\n    name: 'Giraffe',\n    id: '68'\n  }, {\n    name: 'Bear',\n    id: '71'\n  }, {\n    name: 'Wolf',\n    id: '74'\n  }, {\n    name: 'Rhino',\n    id: '86'\n  }, {\n    name: 'Bat',\n    id: '87'\n  }, {\n    name: 'Cat',\n    id: '95'\n  }, {\n    name: 'Penguin',\n    id: '102'\n  }, {\n    name: 'Rhino',\n    id: '109'\n  }, {\n    name: 'Koala',\n    id: '112'\n  }];\n  const PREFIXES = ['adventurous', 'affable', 'ambitious', 'amiable ', 'amusing', 'brave', 'bright', 'charming', 'compassionate', 'convivial', 'courageous', 'creative', 'diligent', 'easygoing', 'emotional', 'energetic', 'enthusiastic', 'exuberant', 'fearless', 'friendly', 'funny', 'generous', 'gentle', 'good', 'helpful', 'honest', 'humorous', 'imaginative', 'independent', 'intelligent', 'intuitive', 'inventive', 'kind', 'loving', 'loyal', 'modest', 'neat', 'nice', 'optimistic', 'passionate', 'patient', 'persistent', 'polite', 'practical', 'rational', 'reliable', 'reserved', 'resourceful', 'romantic', 'sensible', 'sensitive', 'sincere', 'sympathetic', 'thoughtful', 'tough', 'understanding', 'versatile', 'warmhearted'];\n  const Avatar = Ember.Service.extend({\n    get() {\n      const avatar = (0, _sample.default)(AVATARS);\n      const prefix = (0, _sample.default)(PREFIXES);\n      return {\n        url: `/assets/images/avatars/${avatar.id}.svg`,\n        label: (0, _startCase.default)(`${prefix} ${avatar.name}`)\n      };\n    }\n\n  });\n  var _default = Avatar;\n  _exports.default = _default;\n});","define(\"sharedrop/services/file\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  const File = function (options) {\n    const self = this;\n    this.name = options.name;\n    this.localName = `${new Date().getTime()}-${this.name}`;\n    this.size = options.size;\n    this.type = options.type;\n\n    this._reset();\n\n    return new Ember.RSVP.Promise((resolve, reject) => {\n      const requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;\n      requestFileSystem(window.TEMPORARY, options.size, filesystem => {\n        self.filesystem = filesystem;\n        resolve(self);\n      }, error => {\n        self.errorHandler(error);\n        reject(error);\n      });\n    });\n  };\n\n  File.removeAll = function () {\n    return new Ember.RSVP.Promise((resolve, reject) => {\n      const filer = new window.Filer();\n      filer.init({\n        persistent: false\n      }, () => {\n        filer.ls('/', entries => {\n          function rm(entry) {\n            if (entry) {\n              filer.rm(entry, () => {\n                rm(entries.pop());\n              });\n            } else {\n              resolve();\n            }\n          }\n\n          rm(entries.pop());\n        });\n      }, error => {\n        console.log(error);\n        reject(error);\n      });\n    });\n  };\n\n  File.prototype.append = function (data) {\n    const self = this;\n    const options = {\n      create: this.create\n    };\n    return new Ember.RSVP.Promise((resolve, reject) => {\n      self.filesystem.root.getFile(self.localName, options, fileEntry => {\n        if (self.create) {\n          self.create = false;\n        }\n\n        self.fileEntry = fileEntry;\n        fileEntry.createWriter(writer => {\n          const blob = new Blob(data, {\n            type: self.type\n          }); // console.log('File: Appending ' + blob.size + ' bytes at ' + self.seek);\n          // eslint-disable-next-line no-param-reassign\n\n          writer.onwriteend = function () {\n            self.seek += blob.size;\n            resolve(fileEntry);\n          }; // eslint-disable-next-line no-param-reassign\n\n\n          writer.onerror = function (error) {\n            self.errorHandler(error);\n            reject(error);\n          };\n\n          writer.seek(self.seek);\n          writer.write(blob);\n        }, error => {\n          self.errorHandler(error);\n          reject(error);\n        });\n      }, error => {\n        self.errorHandler(error);\n        reject(error);\n      });\n    });\n  };\n\n  File.prototype.save = function () {\n    const self = this;\n    console.log('File: Saving file: ', this.fileEntry);\n    const a = document.createElement('a');\n    a.download = this.name;\n\n    function finish(link) {\n      document.body.appendChild(a);\n      link.addEventListener('click', () => {\n        // Remove file entry from filesystem.\n        setTimeout(() => {\n          self.remove().then(self._reset.bind(self));\n        }, 100); // Hack, but otherwise browser doesn't save the file at all.\n\n        link.parentNode.removeChild(a);\n      });\n      link.click();\n    }\n\n    if (this._isWebKit()) {\n      a.href = this.fileEntry.toURL();\n      finish(a);\n    } else {\n      this.fileEntry.file(file => {\n        const URL = window.URL || window.webkitURL;\n        a.href = URL.createObjectURL(file);\n        finish(a);\n      });\n    }\n  };\n\n  File.prototype.errorHandler = function (error) {\n    console.error('File error: ', error);\n  };\n\n  File.prototype.remove = function () {\n    const self = this;\n    return new Ember.RSVP.Promise((resolve, reject) => {\n      self.filesystem.root.getFile(self.localName, {\n        create: false\n      }, fileEntry => {\n        fileEntry.remove(() => {\n          console.debug(`File: Removed file: ${self.localName}`);\n          resolve(fileEntry);\n        }, error => {\n          self.errorHandler(error);\n          reject(error);\n        });\n      }, error => {\n        self.errorHandler(error);\n        reject(error);\n      });\n    });\n  };\n\n  File.prototype._reset = function () {\n    this.create = true;\n    this.filesystem = null;\n    this.fileEntry = null;\n    this.seek = 0;\n  };\n\n  File.prototype._isWebKit = function () {\n    return !!window.webkitRequestFileSystem;\n  };\n\n  var _default = File;\n  _exports.default = _default;\n});","define(\"sharedrop/services/room\", [\"exports\", \"jquery\"], function (_exports, _jquery) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  // TODO: use Ember.Object.extend()\n  const Room = function (name, firebaseRef) {\n    this._ref = firebaseRef;\n    this.name = name;\n  };\n\n  Room.prototype.join = function (user) {\n    const self = this; // Setup Firebase refs\n\n    self._connectionRef = self._ref.child('.info/connected');\n    self._roomRef = self._ref.child(`rooms/${this.name}`);\n    self._usersRef = self._roomRef.child('users');\n    self._userRef = self._usersRef.child(user.uuid);\n    console.log('Room:\\t Connecting to: ', this.name);\n\n    self._connectionRef.on('value', connectionSnapshot => {\n      // Once connected (or reconnected) to Firebase\n      if (connectionSnapshot.val() === true) {\n        console.log('Firebase: (Re)Connected'); // Remove yourself from the room when disconnected\n\n        self._userRef.onDisconnect().remove(); // Join the room\n\n\n        self._userRef.set(user, error => {\n          if (error) {\n            console.warn('Firebase: Adding user to the room failed: ', error);\n          } else {\n            console.log('Firebase: User added to the room'); // Create a copy of user data,\n            // so that deleting properties won't affect the original variable\n\n            _jquery.default.publish('connected.room', _jquery.default.extend(true, {}, user));\n          }\n        });\n\n        self._usersRef.on('child_added', userAddedSnapshot => {\n          const addedUser = userAddedSnapshot.val();\n          console.log('Room:\\t user_added: ', addedUser);\n\n          _jquery.default.publish('user_added.room', addedUser);\n        });\n\n        self._usersRef.on('child_removed', userRemovedSnapshot => {\n          const removedUser = userRemovedSnapshot.val();\n          console.log('Room:\\t user_removed: ', removedUser);\n\n          _jquery.default.publish('user_removed.room', removedUser);\n        }, () => {\n          // Handle case when the whole room is removed from Firebase\n          _jquery.default.publish('disconnected.room');\n        });\n\n        self._usersRef.on('child_changed', userChangedSnapshot => {\n          const changedUser = userChangedSnapshot.val();\n          console.log('Room:\\t user_changed: ', changedUser);\n\n          _jquery.default.publish('user_changed.room', changedUser);\n        });\n      } else {\n        console.log('Firebase: Disconnected');\n\n        _jquery.default.publish('disconnected.room');\n\n        self._usersRef.off();\n      }\n    });\n\n    return this;\n  };\n\n  Room.prototype.update = function (attrs) {\n    this._userRef.update(attrs);\n  };\n\n  Room.prototype.leave = function () {\n    this._userRef.remove();\n\n    this._usersRef.off();\n  };\n\n  var _default = Room;\n  _exports.default = _default;\n});","define(\"sharedrop/services/web-rtc\", [\"exports\", \"jquery\", \"sharedrop/services/file\"], function (_exports, _jquery, _file) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  // TODO:\n  // - provide TURN server config once it's possible to create rooms with custom names\n  // - use Ember.Object.extend()\n  const WebRTC = function (id, options) {\n    const defaults = {\n      config: {\n        iceServers: [{\n          urls: 'stun:stun.l.google.com:19302'\n        }]\n      },\n      debug: 3\n    };\n    this.conn = new window.Peer(id, _jquery.default.extend(defaults, options));\n    this.files = {\n      outgoing: {},\n      incoming: {}\n    }; // Listen for incoming connections\n\n    this.conn.on('connection', connection => {\n      _jquery.default.publish('incoming_peer_connection.p2p', {\n        connection\n      });\n\n      connection.on('open', () => {\n        console.log('Peer:\\t Data channel connection opened: ', connection);\n\n        _jquery.default.publish('incoming_dc_connection.p2p', {\n          connection\n        });\n      });\n      connection.on('error', error => {\n        console.log('Peer:\\t Data channel connection error', error);\n\n        _jquery.default.publish('incoming_dc_connection_error.p2p', {\n          connection,\n          error\n        });\n      });\n\n      this._onConnection(connection);\n    });\n    this.conn.on('close', () => {\n      console.log('Peer:\\t Connection to server closed.');\n    });\n    this.conn.on('error', error => {\n      console.log('Peer:\\t Error while connecting to server: ', error);\n    });\n  };\n\n  WebRTC.CHUNK_MTU = 16000;\n  WebRTC.CHUNKS_PER_ACK = 64;\n\n  WebRTC.prototype.connect = function (id) {\n    const connection = this.conn.connect(id, {\n      label: 'file',\n      reliable: true,\n      serialization: 'none' // we handle serialization ourselves\n\n    });\n    connection.on('open', () => {\n      console.log('Peer:\\t Data channel connection opened: ', connection);\n\n      _jquery.default.publish('outgoing_dc_connection.p2p', {\n        connection\n      });\n    });\n    connection.on('error', error => {\n      console.log('Peer:\\t Data channel connection error', error);\n\n      _jquery.default.publish('outgoing_dc_connection_error.p2p', {\n        connection,\n        error\n      });\n    });\n\n    _jquery.default.publish('outgoing_peer_connection.p2p', {\n      connection\n    });\n\n    this._onConnection(connection);\n  };\n\n  WebRTC.prototype._onConnection = function (connection) {\n    const self = this;\n    console.log('Peer:\\t Opening data channel connection...', connection);\n    connection.on('data', data => {\n      // Lame type check\n      if (data.byteLength !== undefined) {\n        // ArrayBuffer\n        self._onBinaryData(data, connection);\n      } else {\n        // JSON string\n        self._onJSONData(JSON.parse(data), connection);\n      }\n    });\n    connection.on('close', () => {\n      _jquery.default.publish('disconnected.p2p', {\n        connection\n      });\n\n      console.log('Peer:\\t P2P connection closed: ', connection);\n    });\n  };\n\n  WebRTC.prototype._onBinaryData = function (data, connection) {\n    const self = this;\n    const incoming = this.files.incoming[connection.peer];\n    const {\n      info,\n      file,\n      block,\n      receivedChunkNum\n    } = incoming;\n    const chunksPerAck = WebRTC.CHUNKS_PER_ACK; // TODO move it after requesting a new block to speed things up\n\n    connection.emit('receiving_progress', (receivedChunkNum + 1) / info.chunksTotal); // console.log('Got chunk no ' + (receivedChunkNum + 1) + ' out of ' + info.chunksTotal);\n\n    block.push(data);\n    incoming.receivedChunkNum = receivedChunkNum + 1;\n    const nextChunkNum = incoming.receivedChunkNum;\n    const lastChunkInFile = receivedChunkNum === info.chunksTotal - 1;\n    const lastChunkInBlock = receivedChunkNum > 0 && (receivedChunkNum + 1) % chunksPerAck === 0;\n\n    if (lastChunkInFile || lastChunkInBlock) {\n      file.append(block).then(() => {\n        if (lastChunkInFile) {\n          file.save();\n\n          _jquery.default.publish('file_received.p2p', {\n            blob: file,\n            info,\n            connection\n          });\n        } else {\n          // console.log('Requesting block starting at: ' + (nextChunkNum));\n          incoming.block = [];\n\n          self._requestFileBlock(connection, nextChunkNum);\n        }\n      });\n    }\n  };\n\n  WebRTC.prototype._onJSONData = function (data, connection) {\n    switch (data.type) {\n      case 'info':\n        {\n          const info = data.payload;\n\n          _jquery.default.publish('info.p2p', {\n            connection,\n            info\n          }); // Store incoming file info for later\n\n\n          this.files.incoming[connection.peer] = {\n            info,\n            file: null,\n            block: [],\n            receivedChunkNum: 0\n          };\n          console.log('Peer:\\t File info: ', data);\n          break;\n        }\n\n      case 'cancel':\n        {\n          _jquery.default.publish('file_canceled.p2p', {\n            connection\n          });\n\n          console.log('Peer:\\t Sender canceled file transfer');\n          break;\n        }\n\n      case 'response':\n        {\n          const response = data.payload; // If recipient rejected the file, delete stored file\n\n          if (!response) {\n            delete this.files.outgoing[connection.peer];\n          }\n\n          _jquery.default.publish('response.p2p', {\n            connection,\n            response\n          });\n\n          console.log('Peer:\\t File response: ', data);\n          break;\n        }\n\n      case 'block_request':\n        {\n          const {\n            file\n          } = this.files.outgoing[connection.peer]; // console.log('Peer:\\t Block request: ', data.payload);\n\n          this._sendBlock(connection, file, data.payload);\n\n          break;\n        }\n\n      default:\n        console.log('Peer:\\t Unknown message: ', data);\n    }\n  };\n\n  WebRTC.prototype.getFileInfo = function (file) {\n    return {\n      lastModifiedDate: file.lastModifiedDate,\n      name: file.name,\n      size: file.size,\n      type: file.type,\n      chunksTotal: Math.ceil(file.size / WebRTC.CHUNK_MTU)\n    };\n  };\n\n  WebRTC.prototype.sendFileInfo = function (connection, info) {\n    const message = {\n      type: 'info',\n      payload: info\n    };\n    connection.send(JSON.stringify(message));\n  };\n\n  WebRTC.prototype.sendCancelRequest = function (connection) {\n    const message = {\n      type: 'cancel'\n    };\n    connection.send(JSON.stringify(message));\n  };\n\n  WebRTC.prototype.sendFileResponse = function (connection, response) {\n    const message = {\n      type: 'response',\n      payload: response\n    };\n\n    if (response) {\n      // If recipient accepted the file, request required space to store the file on HTML5 filesystem\n      const incoming = this.files.incoming[connection.peer];\n      const {\n        info\n      } = incoming;\n      new _file.default({\n        name: info.name,\n        size: info.size,\n        type: info.type\n      }).then(file => {\n        incoming.file = file;\n        connection.send(JSON.stringify(message));\n      });\n    } else {\n      // Otherwise, delete stored file info\n      delete this.files.incoming[connection.peer];\n      connection.send(JSON.stringify(message));\n    }\n  };\n\n  WebRTC.prototype.sendFile = function (connection, file) {\n    // Save the file for later\n    this.files.outgoing[connection.peer] = {\n      file,\n      info: this.getFileInfo(file)\n    }; // Send the first block. Next ones will be requested by recipient.\n\n    this._sendBlock(connection, file, 0);\n  };\n\n  WebRTC.prototype._requestFileBlock = function (connection, chunkNum) {\n    const message = {\n      type: 'block_request',\n      payload: chunkNum\n    };\n    connection.send(JSON.stringify(message));\n  };\n\n  WebRTC.prototype._sendBlock = function (connection, file, beginChunkNum) {\n    const {\n      info\n    } = this.files.outgoing[connection.peer];\n    const chunkSize = WebRTC.CHUNK_MTU;\n    const chunksPerAck = WebRTC.CHUNKS_PER_ACK;\n    const remainingChunks = info.chunksTotal - beginChunkNum;\n    const chunksToSend = Math.min(remainingChunks, chunksPerAck);\n    const endChunkNum = beginChunkNum + chunksToSend - 1;\n    const blockBegin = beginChunkNum * chunkSize;\n    const blockEnd = endChunkNum * chunkSize + chunkSize;\n    const reader = new FileReader();\n    let chunkNum; // Read the whole block from file\n\n    const blockBlob = file.slice(blockBegin, blockEnd); // console.log('Sending block: start chunk: ' + beginChunkNum + ' end chunk: ' + endChunkNum);\n    // console.log('Sending block: start byte : ' + begin + ' end byte : ' + end);\n\n    reader.onload = function (event) {\n      if (reader.readyState === FileReader.DONE) {\n        const blockBuffer = event.target.result;\n\n        for (chunkNum = beginChunkNum; chunkNum < endChunkNum + 1; chunkNum += 1) {\n          // Send each chunk (begin index is inclusive, end index is exclusive)\n          const bufferBegin = chunkNum % chunksPerAck * chunkSize;\n          const bufferEnd = Math.min(bufferBegin + chunkSize, blockBuffer.byteLength);\n          const chunkBuffer = blockBuffer.slice(bufferBegin, bufferEnd);\n          connection.send(chunkBuffer); // console.log('Sent chunk: start byte: ' + begin + ' end byte: ' + end + ' length: ' + chunkBuffer.byteLength);\n          // console.log('Sent chunk no ' + (chunkNum + 1) + ' out of ' + info.chunksTotal);\n\n          connection.emit('sending_progress', (chunkNum + 1) / info.chunksTotal);\n        }\n\n        if (endChunkNum === info.chunksTotal - 1) {\n          _jquery.default.publish('file_sent.p2p', {\n            connection\n          });\n        }\n      }\n    };\n\n    reader.readAsArrayBuffer(blockBlob);\n  };\n\n  var _default = WebRTC;\n  _exports.default = _default;\n});","define(\"sharedrop/templates/about-app\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.HTMLBars.template({\n    \"id\": \"KyTfFgIj\",\n    \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[6,[37,2],null,[[\\\"onClose\\\"],[[30,[36,0],[[32,0],\\\"closeModal\\\"],[[\\\"target\\\"],[[35,1]]]]]],[[\\\"default\\\"],[{\\\"statements\\\":[[2,\\\"  \\\"],[10,\\\"h2\\\"],[14,0,\\\"logo\\\"],[12],[10,\\\"span\\\"],[12],[2,\\\"ShareDrop\\\"],[13],[13],[2,\\\"\\\\n  \\\"],[10,\\\"h3\\\"],[12],[2,\\\"What is it?\\\"],[13],[2,\\\"\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"\\\\n    ShareDrop is a free, \\\"],[10,\\\"a\\\"],[14,6,\\\"https://github.com/szimek/sharedrop\\\"],[12],[2,\\\"open-source\\\"],[13],[2,\\\" web app that allows you to easily and securely share files directly between devices without uploading them to any server first.\\\\n  \\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"h3\\\"],[12],[2,\\\"How to use it?\\\"],[13],[2,\\\"\\\\n  \\\"],[10,\\\"h4\\\"],[12],[2,\\\"Sharing files between devices in a local network\\\"],[10,\\\"sup\\\"],[12],[2,\\\"*\\\"],[13],[13],[2,\\\"\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"\\\\n    To send a file to another device in the same local network, open this page (i.e. \\\"],[10,\\\"a\\\"],[14,6,\\\"https://www.sharedrop.io\\\"],[12],[2,\\\"www.sharedrop.io\\\"],[13],[2,\\\") on both devices. Drag and drop a file directly on another person's avatar or click the avatar and select the file you want to send. The file transfer will start once the recipient accepts the file.\\\\n  \\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"h4\\\"],[12],[2,\\\"Sharing files between devices in different networks\\\"],[13],[2,\\\"\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"\\\\n    To send a file to another device in a different network, click \\\"],[10,\\\"span\\\"],[14,0,\\\"plus-icon\\\"],[12],[2,\\\"+\\\"],[13],[2,\\\" button in the upper right corner of the page and follow further instructions.\\\\n  \\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"h4\\\"],[12],[2,\\\"VPNs\\\"],[13],[2,\\\"\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"\\\\n    Sharedrop does not work with VPNs, please deactivate any VPN a device might be using.\\\\n  \\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"h3\\\"],[12],[2,\\\"Donate\\\"],[13],[2,\\\"\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"ShareDrop is free, however, it still costs money to run. If you use it and like it, please consider making a small donation via \\\"],[10,\\\"a\\\"],[14,6,\\\"https://www.paypal.com/donate/?business=99MJKQUTTQVYY&no_recurring=0&item_name=Help+cover+the+server+costs+for+sharedrop.io&currency_code=EUR\\\"],[12],[2,\\\"PayPal\\\"],[13],[2,\\\" to help me keep it free for everyone.\\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"h3\\\"],[12],[2,\\\"Security\\\"],[13],[2,\\\"\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"ShareDrop uses a secure and encrypted peer-to-peer connection to transfer information about the file (its name and size) and file data itself. This means that this data is never transfered through any intermediate server but directly between the sender and recipient devices. To achieve this, ShareDrop uses a technology called WebRTC (Web Real-Time Communication), which is provided natively by browsers. You can read more about WebRTC security \\\"],[10,\\\"a\\\"],[14,6,\\\"https://bloggeek.me/is-webrtc-safe/\\\"],[12],[2,\\\"here\\\"],[13],[2,\\\".\\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"h3\\\"],[12],[2,\\\"Feedback\\\"],[13],[2,\\\"\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"Got a problem with using ShareDrop, suggestion how to improve it or just want to say hi? Send an email to \\\"],[10,\\\"a\\\"],[14,6,\\\"mailto:support@sharedrop.io\\\"],[12],[2,\\\"support@sharedrop.io\\\"],[13],[2,\\\" or report an issue on \\\"],[10,\\\"a\\\"],[14,6,\\\"https://github.com/szimek/sharedrop/issues\\\"],[12],[2,\\\"GitHub\\\"],[13],[2,\\\".\\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"div\\\"],[14,0,\\\"actions\\\"],[12],[2,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[24,4,\\\"button\\\"],[4,[38,0],[[32,0],\\\"closeModal\\\"],null],[12],[2,\\\"Got it!\\\"],[13],[2,\\\"\\\\n    \\\"],[10,\\\"p\\\"],[14,0,\\\"note\\\"],[12],[10,\\\"sup\\\"],[12],[2,\\\"*\\\"],[13],[2,\\\"Devices need to have the same \\\"],[10,\\\"a\\\"],[14,6,\\\"https://www.google.com/search?q=what+is+my+ip\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[2,\\\"public IP\\\"],[13],[2,\\\" to see each other.\\\"],[13],[2,\\\"\\\\n  \\\"],[13],[2,\\\"\\\\n\\\"]],\\\"parameters\\\":[]}]]]],\\\"hasEval\\\":false,\\\"upvars\\\":[\\\"action\\\",\\\"currentRoute\\\",\\\"modal-dialog\\\"]}\",\n    \"meta\": {\n      \"moduleName\": \"sharedrop/templates/about-app.hbs\"\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/templates/about-room\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.HTMLBars.template({\n    \"id\": \"djFMSDWt\",\n    \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[6,[37,5],null,[[\\\"onClose\\\"],[[30,[36,3],[[32,0],\\\"closeModal\\\"],[[\\\"target\\\"],[[35,4]]]]]],[[\\\"default\\\"],[{\\\"statements\\\":[[2,\\\"  \\\"],[10,\\\"h2\\\"],[14,0,\\\"logo\\\"],[12],[10,\\\"span\\\"],[12],[2,\\\"ShareDrop\\\"],[13],[13],[2,\\\"\\\\n  \\\"],[10,\\\"h3\\\"],[12],[2,\\\"Share files between devices in different networks\\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"\\\\n    Copy provided address and send it to the other person...\\\\n  \\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"\\\\n    \\\"],[1,[30,[36,1],null,[[\\\"value\\\",\\\"readonly\\\",\\\"style\\\"],[[35,0],\\\"readonly\\\",\\\"display: block; margin: auto;\\\"]]]],[2,\\\"\\\\n  \\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"\\\\n    Or you can scan it on the other device.\\\\n  \\\"],[13],[2,\\\"\\\\n\\\\n\\\\n  \\\"],[10,\\\"p\\\"],[14,0,\\\"qr-code\\\"],[12],[2,\\\"\\\\n    \\\"],[1,[30,[36,2],null,[[\\\"text\\\"],[[35,0]]]]],[2,\\\"\\\\n  \\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"\\\\n    Once the other person open this page in a browser, you'll see each other's avatars.\\\\n  \\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"\\\\n    Drag and drop a file directly on other person's avatar or click the avatar and select the file you want to send. The file transfer will start once the recipient accepts the file.\\\\n  \\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"div\\\"],[14,0,\\\"actions\\\"],[12],[2,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[24,4,\\\"button\\\"],[4,[38,3],[[32,0],\\\"closeModal\\\"],null],[12],[2,\\\"Got it!\\\"],[13],[2,\\\"\\\\n  \\\"],[13],[2,\\\"\\\\n\\\"]],\\\"parameters\\\":[]}]]]],\\\"hasEval\\\":false,\\\"upvars\\\":[\\\"currentUrl\\\",\\\"room-url\\\",\\\"qr-code\\\",\\\"action\\\",\\\"currentRoute\\\",\\\"modal-dialog\\\"]}\",\n    \"meta\": {\n      \"moduleName\": \"sharedrop/templates/about-room.hbs\"\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/templates/about-you\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.HTMLBars.template({\n    \"id\": \"r59cfOCB\",\n    \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[2,\\\"ShareDrop lets you share files with others.\\\\nOther people will see you as \\\"],[10,\\\"b\\\"],[12],[1,[35,0,[\\\"label\\\"]]],[13],[2,\\\".\\\"]],\\\"hasEval\\\":false,\\\"upvars\\\":[\\\"you\\\"]}\",\n    \"meta\": {\n      \"moduleName\": \"sharedrop/templates/about-you.hbs\"\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/templates/application\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.HTMLBars.template({\n    \"id\": \"2+B02Abc\",\n    \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[10,\\\"header\\\"],[14,0,\\\"l-header\\\"],[12],[2,\\\"\\\\n  \\\"],[10,\\\"nav\\\"],[14,0,\\\"navbar\\\"],[12],[2,\\\"\\\\n    \\\"],[10,\\\"h1\\\"],[14,0,\\\"logo\\\"],[12],[2,\\\"\\\\n      \\\"],[10,\\\"span\\\"],[14,0,\\\"logo-title\\\"],[12],[2,\\\"ShareDrop\\\"],[13],[2,\\\"\\\\n      \\\"],[10,\\\"span\\\"],[14,0,\\\"logo-subtitle\\\"],[12],[2,\\\"P2P file transfer\\\"],[13],[2,\\\"\\\\n    \\\"],[13],[2,\\\"\\\\n\\\\n    \\\"],[10,\\\"ul\\\"],[14,0,\\\"nav\\\"],[12],[2,\\\"\\\\n      \\\"],[10,\\\"li\\\"],[12],[2,\\\"\\\\n        \\\"],[11,\\\"a\\\"],[24,6,\\\"javascript:void(0)\\\"],[24,0,\\\"icon-create-room\\\"],[24,\\\"title\\\",\\\"Create a room. You'll leave the room you're currently in.\\\"],[4,[38,0],[[32,0],\\\"redirect\\\"],null],[12],[2,\\\"+\\\"],[13],[2,\\\"\\\\n      \\\"],[13],[2,\\\"\\\\n      \\\"],[10,\\\"li\\\"],[12],[2,\\\"\\\\n        \\\"],[11,\\\"a\\\"],[24,6,\\\"javascript:void(0)\\\"],[24,0,\\\"icon-help\\\"],[24,\\\"title\\\",\\\"About\\\"],[4,[38,0],[[32,0],\\\"openModal\\\",\\\"about_app\\\"],null],[12],[2,\\\"?\\\"],[13],[2,\\\"\\\\n      \\\"],[13],[2,\\\"\\\\n    \\\"],[13],[2,\\\"\\\\n  \\\"],[13],[2,\\\"\\\\n\\\"],[13],[2,\\\"\\\\n\\\\n\\\"],[1,[30,[36,2],[[30,[36,1],null,null]],null]],[2,\\\"\\\\n\\\"],[1,[30,[36,2],[[30,[36,1],[\\\"modal\\\"],null]],null]],[2,\\\"\\\\n\\\\n\\\"],[10,\\\"footer\\\"],[14,0,\\\"l-footer\\\"],[12],[2,\\\"\\\\n  \\\"],[10,\\\"p\\\"],[14,0,\\\"about\\\"],[12],[1,[30,[36,2],[[30,[36,1],[\\\"about_you\\\"],null]],null]],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"div\\\"],[14,0,\\\"logos\\\"],[12],[2,\\\"\\\\n    \\\"],[10,\\\"div\\\"],[14,0,\\\"left\\\"],[12],[13],[2,\\\"\\\\n    \\\"],[10,\\\"div\\\"],[14,0,\\\"right\\\"],[12],[2,\\\"\\\\n      \\\"],[10,\\\"a\\\"],[14,0,\\\"donate\\\"],[14,6,\\\"https://www.paypal.com/donate/?business=99MJKQUTTQVYY&no_recurring=0&item_name=Help+cover+the+server+costs+for+sharedrop.io&currency_code=EUR\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[10,\\\"img\\\"],[14,\\\"alt\\\",\\\"Donate\\\"],[14,\\\"src\\\",\\\"https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif\\\"],[12],[13],[13],[2,\\\"\\\\n      \\\"],[10,\\\"iframe\\\"],[14,\\\"title\\\",\\\"twitter\\\"],[14,\\\"loading\\\",\\\"lazy\\\"],[14,0,\\\"twitter\\\"],[14,\\\"src\\\",\\\"https://platform.twitter.com/widgets/tweet_button.html?url=https%3A%2F%2Fwww.sharedrop.io&text=ShareDrop%20%E2%80%93%20easily%20and%20securely%20share%20files%20of%20any%20size%20directly%20between%20devices%20using%20your%20browser&count=none\\\"],[14,\\\"scrolling\\\",\\\"no\\\"],[14,\\\"frameborder\\\",\\\"0\\\"],[14,\\\"allowtransparency\\\",\\\"true\\\"],[12],[13],[2,\\\"\\\\n      \\\"],[10,\\\"a\\\"],[14,6,\\\"https://github.com/szimek/sharedrop\\\"],[14,0,\\\"github\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[10,\\\"span\\\"],[12],[2,\\\"Github\\\"],[13],[13],[2,\\\"\\\\n    \\\"],[13],[2,\\\"\\\\n  \\\"],[13],[2,\\\"\\\\n\\\"],[13],[2,\\\"\\\\n\\\\n\\\"],[10,\\\"a\\\"],[14,6,\\\"https://war.ukraine.ua/\\\"],[14,0,\\\"ribbon\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[12],[10,\\\"span\\\"],[14,0,\\\"visually-hidden\\\"],[12],[2,\\\"We stand with Ukraine!\\\"],[13],[13],[2,\\\"\\\\n\\\"]],\\\"hasEval\\\":false,\\\"upvars\\\":[\\\"action\\\",\\\"-outlet\\\",\\\"component\\\"]}\",\n    \"meta\": {\n      \"moduleName\": \"sharedrop/templates/application.hbs\"\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/templates/components/modal-dialog\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.HTMLBars.template({\n    \"id\": \"rkjkC5ah\",\n    \"block\": \"{\\\"symbols\\\":[\\\"&default\\\"],\\\"statements\\\":[[11,\\\"div\\\"],[24,0,\\\"modal-overlay\\\"],[4,[38,0],[[32,0],\\\"close\\\"],null],[12],[13],[2,\\\"\\\\n\\\"],[10,\\\"div\\\"],[14,0,\\\"modal-body\\\"],[12],[2,\\\"\\\\n  \\\"],[18,1,null],[2,\\\"\\\\n\\\"],[13],[2,\\\"\\\\n\\\"]],\\\"hasEval\\\":false,\\\"upvars\\\":[\\\"action\\\"]}\",\n    \"meta\": {\n      \"moduleName\": \"sharedrop/templates/components/modal-dialog.hbs\"\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/templates/components/peer-widget\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.HTMLBars.template({\n    \"id\": \"GCruPtYQ\",\n    \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[6,[37,1],[[35,9]],null,[[\\\"default\\\"],[{\\\"statements\\\":[[6,[37,7],null,[[\\\"onConfirm\\\",\\\"onCancel\\\",\\\"confirmButtonLabel\\\",\\\"cancelButtonLabel\\\",\\\"filename\\\"],[[30,[36,6],[[32,0],\\\"sendFileTransferInquiry\\\"],null],[30,[36,6],[[32,0],\\\"cancelFileTransfer\\\"],null],\\\"Send\\\",\\\"Cancel\\\",[35,5]]],[[\\\"default\\\"],[{\\\"statements\\\":[[2,\\\"    Do you want to send \\\"],[10,\\\"strong\\\"],[12],[2,\\\"\\\\\\\"\\\"],[1,[34,5]],[2,\\\"\\\\\\\"\\\"],[13],[2,\\\" to \\\"],[10,\\\"strong\\\"],[12],[2,\\\"\\\\\\\"\\\"],[1,[34,4]],[2,\\\"\\\\\\\"\\\"],[13],[2,\\\"?\\\\n\\\"]],\\\"parameters\\\":[]}]]]],\\\"parameters\\\":[]}]]],[2,\\\"\\\\n\\\"],[6,[37,1],[[35,10]],null,[[\\\"default\\\"],[{\\\"statements\\\":[[6,[37,7],null,[[\\\"onCancel\\\",\\\"cancelButtonLabel\\\",\\\"filename\\\"],[[30,[36,6],[[32,0],\\\"abortFileTransfer\\\"],null],\\\"Cancel\\\",[35,5]]],[[\\\"default\\\"],[{\\\"statements\\\":[[2,\\\"    Waiting for \\\"],[10,\\\"strong\\\"],[12],[2,\\\"\\\\\\\"\\\"],[1,[34,4]],[2,\\\"\\\\\\\"\\\"],[13],[2,\\\" to accept…\\\\n\\\"]],\\\"parameters\\\":[]}]]]],\\\"parameters\\\":[]}]]],[2,\\\"\\\\n\\\"],[6,[37,1],[[35,11]],null,[[\\\"default\\\"],[{\\\"statements\\\":[[6,[37,7],null,[[\\\"onConfirm\\\",\\\"confirmButtonLabel\\\",\\\"filename\\\"],[[30,[36,6],[[32,0],\\\"cancelFileTransfer\\\"],null],\\\"Ok\\\",[35,5]]],[[\\\"default\\\"],[{\\\"statements\\\":[[2,\\\"    \\\"],[10,\\\"strong\\\"],[12],[2,\\\"\\\\\\\"\\\"],[1,[34,4]],[2,\\\"\\\\\\\"\\\"],[13],[2,\\\" has declined your request.\\\\n\\\"]],\\\"parameters\\\":[]}]]]],\\\"parameters\\\":[]}]]],[2,\\\"\\\\n\\\"],[6,[37,1],[[35,12]],null,[[\\\"default\\\"],[{\\\"statements\\\":[[6,[37,7],null,[[\\\"onConfirm\\\",\\\"confirmButtonLabel\\\",\\\"filename\\\"],[[30,[36,6],[[32,0],\\\"cancelFileTransfer\\\"],null],\\\"Ok\\\",[35,5]]],[[\\\"default\\\"],[{\\\"statements\\\":[[2,\\\"    \\\"],[19,[35,8],[]],[2,\\\"\\\\n\\\"]],\\\"parameters\\\":[]}]]]],\\\"parameters\\\":[]}]]],[2,\\\"\\\\n\\\"],[6,[37,1],[[35,13]],null,[[\\\"default\\\"],[{\\\"statements\\\":[[6,[37,7],null,[[\\\"onConfirm\\\",\\\"onCancel\\\",\\\"confirmButtonLabel\\\",\\\"cancelButtonLabel\\\",\\\"filename\\\"],[[30,[36,6],[[32,0],\\\"acceptFileTransfer\\\"],null],[30,[36,6],[[32,0],\\\"rejectFileTransfer\\\"],null],\\\"Save\\\",\\\"Decline\\\",[35,5]]],[[\\\"default\\\"],[{\\\"statements\\\":[[2,\\\"    \\\"],[10,\\\"strong\\\"],[12],[2,\\\"\\\\\\\"\\\"],[1,[34,4]],[2,\\\"\\\\\\\"\\\"],[13],[2,\\\" wants to send you \\\"],[10,\\\"strong\\\"],[12],[2,\\\"\\\\\\\"\\\"],[1,[34,5]],[2,\\\"\\\\\\\"\\\"],[13],[2,\\\".\\\\n\\\"]],\\\"parameters\\\":[]}]]]],\\\"parameters\\\":[]}]]],[2,\\\"\\\\n\\\"],[10,\\\"div\\\"],[14,0,\\\"avatar\\\"],[12],[2,\\\"\\\\n\\\"],[6,[37,1],[[35,14]],null,[[\\\"default\\\",\\\"else\\\"],[{\\\"statements\\\":[[2,\\\"    \\\"],[8,\\\"circular-progress\\\",[],[[\\\"@value\\\",\\\"@color\\\"],[[34,3,[\\\"bundlingProgress\\\"]],\\\"orange\\\"]],null],[2,\\\"\\\\n\\\"]],\\\"parameters\\\":[]},{\\\"statements\\\":[[6,[37,1],[[35,3,[\\\"transfer\\\"]]],null,[[\\\"default\\\"],[{\\\"statements\\\":[[6,[37,1],[[35,3,[\\\"transfer\\\",\\\"receivingProgress\\\"]]],null,[[\\\"default\\\",\\\"else\\\"],[{\\\"statements\\\":[[2,\\\"      \\\"],[8,\\\"circular-progress\\\",[],[[\\\"@value\\\",\\\"@color\\\"],[[34,3,[\\\"transfer\\\",\\\"receivingProgress\\\"]],\\\"blue\\\"]],null],[2,\\\"\\\\n\\\"]],\\\"parameters\\\":[]},{\\\"statements\\\":[[6,[37,1],[[35,3,[\\\"transfer\\\",\\\"sendingProgress\\\"]]],null,[[\\\"default\\\"],[{\\\"statements\\\":[[2,\\\"      \\\"],[8,\\\"circular-progress\\\",[],[[\\\"@value\\\",\\\"@color\\\"],[[34,3,[\\\"transfer\\\",\\\"sendingProgress\\\"]],\\\"blue\\\"]],null],[2,\\\"\\\\n    \\\"]],\\\"parameters\\\":[]}]]]],\\\"parameters\\\":[]}]]],[2,\\\"  \\\"]],\\\"parameters\\\":[]}]]]],\\\"parameters\\\":[]}]]],[2,\\\"\\\\n  \\\"],[1,[30,[36,15],null,[[\\\"peer\\\",\\\"onFileDrop\\\"],[[35,3],[30,[36,6],[[32,0],\\\"uploadFile\\\"],null]]]]],[2,\\\"\\\\n\\\"],[13],[2,\\\"\\\\n\\\\n\\\"],[10,\\\"div\\\"],[14,0,\\\"user-info\\\"],[12],[2,\\\"\\\\n  \\\"],[10,\\\"div\\\"],[14,0,\\\"user-ip\\\"],[12],[2,\\\"\\\\n    \\\"],[10,\\\"div\\\"],[15,0,[31,[\\\"user-connection-status \\\",[34,3,[\\\"peer\\\",\\\"state\\\"]]]]],[12],[13],[2,\\\"\\\\n    \\\"],[10,\\\"span\\\"],[12],[1,[35,3,[\\\"label\\\"]]],[13],[2,\\\"\\\\n\\\\n\\\"],[6,[37,1],[[35,14]],null,[[\\\"default\\\",\\\"else\\\"],[{\\\"statements\\\":[[2,\\\"      \\\"],[10,\\\"div\\\"],[12],[2,\\\"\\\\n        Bundling files...\\\\n        \\\"],[10,\\\"br\\\"],[12],[13],[10,\\\"br\\\"],[12],[13],[2,\\\"\\\\n        TIP: You can archive files on your device beforehand to speed up the operation\\\\n      \\\"],[13],[2,\\\"\\\\n\\\"]],\\\"parameters\\\":[]},{\\\"statements\\\":[[6,[37,1],[[35,2]],null,[[\\\"default\\\",\\\"else\\\"],[{\\\"statements\\\":[[2,\\\"      \\\"],[10,\\\"div\\\"],[12],[2,\\\"Receiving file...\\\"],[13],[2,\\\"\\\\n\\\"]],\\\"parameters\\\":[]},{\\\"statements\\\":[[6,[37,1],[[35,0]],null,[[\\\"default\\\"],[{\\\"statements\\\":[[2,\\\"      \\\"],[10,\\\"div\\\"],[12],[2,\\\"Sending file...\\\"],[13],[2,\\\"\\\\n    \\\"]],\\\"parameters\\\":[]}]]]],\\\"parameters\\\":[]}]]]],\\\"parameters\\\":[]}]]],[2,\\\"  \\\"],[13],[2,\\\"\\\\n\\\"],[13],[2,\\\"\\\\n\\\\n\\\"],[1,[30,[36,16],null,[[\\\"multiple\\\",\\\"onChange\\\"],[true,[30,[36,6],[[32,0],\\\"uploadFile\\\"],null]]]]]],\\\"hasEval\\\":true,\\\"upvars\\\":[\\\"isSendingFile\\\",\\\"if\\\",\\\"isReceivingFile\\\",\\\"peer\\\",\\\"label\\\",\\\"filename\\\",\\\"action\\\",\\\"popover-confirm\\\",\\\"errorTemplateName\\\",\\\"hasSelectedFile\\\",\\\"isAwaitingResponse\\\",\\\"hasDeclinedFileTransfer\\\",\\\"hasError\\\",\\\"hasReceivedFileInfo\\\",\\\"isPreparingFileTransfer\\\",\\\"peer-avatar\\\",\\\"file-field\\\"]}\",\n    \"meta\": {\n      \"moduleName\": \"sharedrop/templates/components/peer-widget.hbs\"\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/templates/components/popover-confirm\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.HTMLBars.template({\n    \"id\": \"+sbXHwlo\",\n    \"block\": \"{\\\"symbols\\\":[\\\"&default\\\"],\\\"statements\\\":[[10,\\\"div\\\"],[14,0,\\\"popover\\\"],[12],[2,\\\"\\\\n  \\\"],[10,\\\"div\\\"],[14,0,\\\"popover-body\\\"],[12],[2,\\\"\\\\n    \\\"],[10,\\\"div\\\"],[14,0,\\\"popover-icon\\\"],[12],[2,\\\"\\\\n      \\\"],[10,\\\"i\\\"],[15,0,[34,3]],[12],[13],[2,\\\"\\\\n    \\\"],[13],[2,\\\"\\\\n\\\\n    \\\"],[10,\\\"p\\\"],[12],[18,1,null],[13],[2,\\\"\\\\n  \\\"],[13],[2,\\\"\\\\n\\\\n  \\\"],[10,\\\"div\\\"],[14,0,\\\"popover-buttons\\\"],[12],[2,\\\"\\\\n\\\"],[6,[37,4],[[35,2]],null,[[\\\"default\\\"],[{\\\"statements\\\":[[2,\\\"      \\\"],[11,\\\"button\\\"],[24,4,\\\"button\\\"],[4,[38,0],[[32,0],\\\"cancel\\\"],null],[12],[1,[34,2]],[13],[2,\\\"\\\\n\\\"]],\\\"parameters\\\":[]}]]],[2,\\\"\\\\n\\\"],[6,[37,4],[[35,1]],null,[[\\\"default\\\"],[{\\\"statements\\\":[[2,\\\"      \\\"],[11,\\\"button\\\"],[24,4,\\\"button\\\"],[4,[38,0],[[32,0],\\\"confirm\\\"],null],[12],[1,[34,1]],[13],[2,\\\"\\\\n\\\"]],\\\"parameters\\\":[]}]]],[2,\\\"  \\\"],[13],[2,\\\"\\\\n\\\"],[13],[2,\\\"\\\\n\\\\n\\\"]],\\\"hasEval\\\":false,\\\"upvars\\\":[\\\"action\\\",\\\"confirmButtonLabel\\\",\\\"cancelButtonLabel\\\",\\\"iconClass\\\",\\\"if\\\"]}\",\n    \"meta\": {\n      \"moduleName\": \"sharedrop/templates/components/popover-confirm.hbs\"\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/templates/components/user-widget\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.HTMLBars.template({\n    \"id\": \"7/SMpfeH\",\n    \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[10,\\\"div\\\"],[14,0,\\\"avatar\\\"],[12],[2,\\\"\\\\n  \\\"],[10,\\\"img\\\"],[14,0,\\\"gravatar\\\"],[15,\\\"src\\\",[34,0,[\\\"avatarUrl\\\"]]],[15,\\\"alt\\\",[34,1,[\\\"label\\\"]]],[15,\\\"title\\\",[31,[\\\"peer id: \\\",[34,0,[\\\"uuid\\\"]]]]],[12],[13],[2,\\\"\\\\n\\\"],[13],[2,\\\"\\\\n\\\"],[10,\\\"div\\\"],[14,0,\\\"user-info\\\"],[12],[2,\\\"\\\\n  \\\"],[10,\\\"div\\\"],[14,0,\\\"user-label\\\"],[12],[2,\\\"You\\\"],[13],[2,\\\"\\\\n  \\\"],[10,\\\"div\\\"],[14,0,\\\"user-ip\\\"],[12],[2,\\\"\\\\n    \\\"],[10,\\\"span\\\"],[12],[1,[35,0,[\\\"label\\\"]]],[13],[2,\\\"\\\\n  \\\"],[13],[2,\\\"\\\\n\\\"],[13],[2,\\\"\\\\n\\\"]],\\\"hasEval\\\":false,\\\"upvars\\\":[\\\"user\\\",\\\"users\\\"]}\",\n    \"meta\": {\n      \"moduleName\": \"sharedrop/templates/components/user-widget.hbs\"\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/templates/errors/browser-unsupported\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.HTMLBars.template({\n    \"id\": \"Za00Hs1z\",\n    \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[10,\\\"div\\\"],[14,0,\\\"error\\\"],[12],[2,\\\"\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"We're really sorry, but your browser is not supported.\\\"],[10,\\\"br\\\"],[12],[13],[2,\\\"Please use the latest desktop or Android version of\\\"],[10,\\\"br\\\"],[12],[13],[10,\\\"b\\\"],[12],[2,\\\"Chrome\\\"],[13],[2,\\\", \\\"],[10,\\\"b\\\"],[12],[2,\\\"Opera\\\"],[13],[2,\\\" or \\\"],[10,\\\"b\\\"],[12],[2,\\\"Firefox\\\"],[13],[2,\\\".\\\"],[13],[2,\\\"\\\\n\\\"],[13],[2,\\\"\\\\n\\\"]],\\\"hasEval\\\":false,\\\"upvars\\\":[]}\",\n    \"meta\": {\n      \"moduleName\": \"sharedrop/templates/errors/browser-unsupported.hbs\"\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/templates/errors/filesystem-unavailable\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.HTMLBars.template({\n    \"id\": \"t01tsazA\",\n    \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[10,\\\"div\\\"],[14,0,\\\"error\\\"],[12],[2,\\\"\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"Uh oh. Looks like there's some issue and we won't be able\\\"],[10,\\\"br\\\"],[12],[13],[2,\\\"to save your files.\\\"],[13],[2,\\\"\\\\n  \\\"],[10,\\\"p\\\"],[12],[2,\\\"If you've opened this app in incognito/private window,\\\"],[10,\\\"br\\\"],[12],[13],[2,\\\"try again in a normal one.\\\"],[13],[2,\\\"\\\\n\\\"],[13],[2,\\\"\\\\n\\\"]],\\\"hasEval\\\":false,\\\"upvars\\\":[]}\",\n    \"meta\": {\n      \"moduleName\": \"sharedrop/templates/errors/filesystem-unavailable.hbs\"\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/templates/errors/popovers/connection-failed\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.HTMLBars.template({\n    \"id\": \"G3G10YD7\",\n    \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[2,\\\"It was not possible to establish direct connection with the other peer.\\\\n\\\"]],\\\"hasEval\\\":false,\\\"upvars\\\":[]}\",\n    \"meta\": {\n      \"moduleName\": \"sharedrop/templates/errors/popovers/connection-failed.hbs\"\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/templates/errors/popovers/multiple-files\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.HTMLBars.template({\n    \"id\": \"ycMD5lMo\",\n    \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[2,\\\"The files you have selected exceed the maximum allowed size of 200MB\\\\n\\\"],[10,\\\"br\\\"],[12],[13],[10,\\\"br\\\"],[12],[13],[2,\\\"\\\\nTIP: You can send single files without size restriction\\\\n\\\"]],\\\"hasEval\\\":false,\\\"upvars\\\":[]}\",\n    \"meta\": {\n      \"moduleName\": \"sharedrop/templates/errors/popovers/multiple-files.hbs\"\n    }\n  });\n\n  _exports.default = _default;\n});","define(\"sharedrop/templates/index\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n\n  var _default = Ember.HTMLBars.template({\n    \"id\": \"NIu73Iwu\",\n    \"block\": \"{\\\"symbols\\\":[\\\"peer\\\"],\\\"statements\\\":[[10,\\\"main\\\"],[14,0,\\\"l-content\\\"],[12],[2,\\\"\\\\n  \\\"],[10,\\\"div\\\"],[14,0,\\\"user others\\\"],[12],[2,\\\"\\\\n\\\"],[6,[37,7],[[30,[36,6],[[30,[36,6],[[35,5]],null]],null]],null,[[\\\"default\\\"],[{\\\"statements\\\":[[2,\\\"      \\\"],[1,[30,[36,4],null,[[\\\"peer\\\",\\\"hasCustomRoomName\\\",\\\"webrtc\\\"],[[32,1],[35,3],[35,2]]]]],[2,\\\"\\\\n\\\"]],\\\"parameters\\\":[1]}]]],[2,\\\"  \\\"],[13],[2,\\\"\\\\n\\\\n\\\"],[6,[37,8],[[35,0,[\\\"uuid\\\"]]],null,[[\\\"default\\\"],[{\\\"statements\\\":[[2,\\\"    \\\"],[10,\\\"div\\\"],[14,0,\\\"user you\\\"],[12],[2,\\\"\\\\n      \\\"],[1,[30,[36,1],null,[[\\\"user\\\"],[[35,0]]]]],[2,\\\"\\\\n    \\\"],[13],[2,\\\"\\\\n\\\"]],\\\"parameters\\\":[]}]]],[2,\\\"\\\\n  \\\"],[10,\\\"svg\\\"],[14,0,\\\"circles\\\"],[14,\\\"viewBox\\\",\\\"-0.5 -0.5 1140 700\\\"],[12],[2,\\\"\\\\n    \\\"],[10,\\\"circle\\\"],[14,0,\\\"circle\\\"],[14,\\\"cx\\\",\\\"570\\\"],[14,\\\"cy\\\",\\\"570\\\"],[14,\\\"r\\\",\\\"30\\\"],[14,\\\"stroke\\\",\\\"rgba(160,160,160, 1)\\\"],[12],[13],[2,\\\"\\\\n    \\\"],[10,\\\"circle\\\"],[14,0,\\\"circle\\\"],[14,\\\"cx\\\",\\\"570\\\"],[14,\\\"cy\\\",\\\"570\\\"],[14,\\\"r\\\",\\\"100\\\"],[14,\\\"stroke\\\",\\\"rgba(160,160,160,.9)\\\"],[12],[13],[2,\\\"\\\\n    \\\"],[10,\\\"circle\\\"],[14,0,\\\"circle\\\"],[14,\\\"cx\\\",\\\"570\\\"],[14,\\\"cy\\\",\\\"570\\\"],[14,\\\"r\\\",\\\"200\\\"],[14,\\\"stroke\\\",\\\"rgba(160,160,160,.8)\\\"],[12],[13],[2,\\\"\\\\n    \\\"],[10,\\\"circle\\\"],[14,0,\\\"circle\\\"],[14,\\\"cx\\\",\\\"570\\\"],[14,\\\"cy\\\",\\\"570\\\"],[14,\\\"r\\\",\\\"300\\\"],[14,\\\"stroke\\\",\\\"rgba(160,160,160,.7)\\\"],[12],[13],[2,\\\"\\\\n    \\\"],[10,\\\"circle\\\"],[14,0,\\\"circle\\\"],[14,\\\"cx\\\",\\\"570\\\"],[14,\\\"cy\\\",\\\"570\\\"],[14,\\\"r\\\",\\\"400\\\"],[14,\\\"stroke\\\",\\\"rgba(160,160,160,.6)\\\"],[12],[13],[2,\\\"\\\\n    \\\"],[10,\\\"circle\\\"],[14,0,\\\"circle\\\"],[14,\\\"cx\\\",\\\"570\\\"],[14,\\\"cy\\\",\\\"570\\\"],[14,\\\"r\\\",\\\"500\\\"],[14,\\\"stroke\\\",\\\"rgba(160,160,160,.5)\\\"],[12],[13],[2,\\\"\\\\n  \\\"],[13],[2,\\\"\\\\n\\\"],[13],[2,\\\"\\\\n\\\"]],\\\"hasEval\\\":false,\\\"upvars\\\":[\\\"you\\\",\\\"user-widget\\\",\\\"webrtc\\\",\\\"hasCustomRoomName\\\",\\\"peer-widget\\\",\\\"model\\\",\\\"-track-array\\\",\\\"each\\\",\\\"if\\\"]}\",\n    \"meta\": {\n      \"moduleName\": \"sharedrop/templates/index.hbs\"\n    }\n  });\n\n  _exports.default = _default;\n});","\n","define('sharedrop/config/environment', [], function() {\n  var prefix = 'sharedrop';\ntry {\n  var metaName = prefix + '/config/environment';\n  var rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n  var config = JSON.parse(decodeURIComponent(rawConfig));\n\n  var exports = { 'default': config };\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n  return exports;\n}\ncatch(err) {\n  throw new Error('Could not read config from meta tag with name \"' + metaName + '\".');\n}\n\n});\n","\n          if (!runningTests) {\n            require(\"sharedrop/app\")[\"default\"].create({\"name\":\"sharedrop\",\"version\":\"1.0.0+0418b789\"});\n          }\n        \n"],"names":[],"mappings":"AAAA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;","file":"sharedrop.js"}