{
  "version": 3,
  "sources": ["../../../node_modules/@rails/actioncable/src/adapters.js", "../../../node_modules/@rails/actioncable/src/logger.js", "../../../node_modules/@rails/actioncable/src/connection_monitor.js", "../../../node_modules/@rails/actioncable/src/internal.js", "../../../node_modules/@rails/actioncable/src/connection.js", "../../../node_modules/@rails/actioncable/src/subscription.js", "../../../node_modules/@rails/actioncable/src/subscriptions.js", "../../../node_modules/@rails/actioncable/src/consumer.js", "../../../node_modules/@rails/actioncable/src/index.js", "../../../node_modules/luxon/src/errors.js", "../../../node_modules/luxon/src/impl/formats.js", "../../../node_modules/luxon/src/impl/util.js", "../../../node_modules/luxon/src/impl/english.js", "../../../node_modules/luxon/src/impl/formatter.js", "../../../node_modules/luxon/src/impl/invalid.js", "../../../node_modules/luxon/src/zone.js", "../../../node_modules/luxon/src/zones/systemZone.js", "../../../node_modules/luxon/src/zones/IANAZone.js", "../../../node_modules/luxon/src/zones/fixedOffsetZone.js", "../../../node_modules/luxon/src/zones/invalidZone.js", "../../../node_modules/luxon/src/impl/zoneUtil.js", "../../../node_modules/luxon/src/settings.js", "../../../node_modules/luxon/src/impl/locale.js", "../../../node_modules/luxon/src/impl/regexParser.js", "../../../node_modules/luxon/src/duration.js", "../../../node_modules/luxon/src/interval.js", "../../../node_modules/luxon/src/info.js", "../../../node_modules/luxon/src/impl/diff.js", "../../../node_modules/luxon/src/impl/digits.js", "../../../node_modules/luxon/src/impl/tokenParser.js", "../../../node_modules/luxon/src/impl/conversions.js", "../../../node_modules/luxon/src/datetime.js", "../../../node_modules/luxon/src/luxon.js", "../../../node_modules/cropperjs/dist/cropper.js", "../../../node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js", "../../../node_modules/@popperjs/core/lib/index.js", "../../../node_modules/@popperjs/core/lib/enums.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js", "../../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js", "../../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js", "../../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js", "../../../node_modules/@popperjs/core/lib/utils/math.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js", "../../../node_modules/@popperjs/core/lib/dom-utils/contains.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js", "../../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js", "../../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js", "../../../node_modules/@popperjs/core/lib/utils/within.js", "../../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js", "../../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js", "../../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js", "../../../node_modules/@popperjs/core/lib/modifiers/arrow.js", "../../../node_modules/@popperjs/core/lib/utils/getVariation.js", "../../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js", "../../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js", "../../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js", "../../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js", "../../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js", "../../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js", "../../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js", "../../../node_modules/@popperjs/core/lib/utils/computeOffsets.js", "../../../node_modules/@popperjs/core/lib/utils/detectOverflow.js", "../../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js", "../../../node_modules/@popperjs/core/lib/modifiers/flip.js", "../../../node_modules/@popperjs/core/lib/modifiers/hide.js", "../../../node_modules/@popperjs/core/lib/modifiers/offset.js", "../../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js", "../../../node_modules/@popperjs/core/lib/utils/getAltAxis.js", "../../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js", "../../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js", "../../../node_modules/@popperjs/core/lib/utils/orderModifiers.js", "../../../node_modules/@popperjs/core/lib/utils/debounce.js", "../../../node_modules/@popperjs/core/lib/utils/format.js", "../../../node_modules/@popperjs/core/lib/utils/validateModifiers.js", "../../../node_modules/@popperjs/core/lib/utils/uniqueBy.js", "../../../node_modules/@popperjs/core/lib/utils/mergeByName.js", "../../../node_modules/@popperjs/core/lib/createPopper.js", "../../../node_modules/@popperjs/core/lib/popper-lite.js", "../../../node_modules/@popperjs/core/lib/popper.js", "../../../node_modules/bootstrap/js/src/util/index.js", "../../../node_modules/bootstrap/js/src/dom/event-handler.js", "../../../node_modules/bootstrap/js/src/dom/data.js", "../../../node_modules/bootstrap/js/src/base-component.js", "../../../node_modules/bootstrap/js/src/util/component-functions.js", "../../../node_modules/bootstrap/js/src/alert.js", "../../../node_modules/bootstrap/js/src/button.js", "../../../node_modules/bootstrap/js/src/dom/manipulator.js", "../../../node_modules/bootstrap/js/src/dom/selector-engine.js", "../../../node_modules/bootstrap/js/src/carousel.js", "../../../node_modules/bootstrap/js/src/collapse.js", "../../../node_modules/bootstrap/js/src/dropdown.js", "../../../node_modules/bootstrap/js/src/util/scrollbar.js", "../../../node_modules/bootstrap/js/src/util/backdrop.js", "../../../node_modules/bootstrap/js/src/util/focustrap.js", "../../../node_modules/bootstrap/js/src/modal.js", "../../../node_modules/bootstrap/js/src/offcanvas.js", "../../../node_modules/bootstrap/js/src/util/sanitizer.js", "../../../node_modules/bootstrap/js/src/tooltip.js", "../../../node_modules/bootstrap/js/src/popover.js", "../../../node_modules/bootstrap/js/src/scrollspy.js", "../../../node_modules/bootstrap/js/src/tab.js", "../../../node_modules/bootstrap/js/src/toast.js", "../../../node_modules/@hotwired/stimulus/dist/stimulus.js", "../../javascript/controllers/application.js", "../../javascript/controllers/date_time_input_controller.js", "../../javascript/controllers/filtered_table_controller.js", "../../../node_modules/createjs/builds/1.0.0/createjs.js", "../../javascript/controllers/header_controller.js", "../../javascript/controllers/header_race_controller.js", "../../javascript/controllers/image_crop_controller.js", "../../javascript/controllers/maps_embed_input_controller.js", "../../javascript/controllers/optional_fields_controller.js", "../../javascript/controllers/select_autocomplete_controller.js", "../../javascript/controllers/tooltip_controller.js", "../../javascript/controllers/index.js"],
  "sourcesContent": ["export default {\n  logger: self.console,\n  WebSocket: self.WebSocket\n}\n", "import adapters from \"./adapters\"\n\n// The logger is disabled by default. You can enable it with:\n//\n//   ActionCable.logger.enabled = true\n//\n//   Example:\n//\n//   import * as ActionCable from '@rails/actioncable'\n//\n//   ActionCable.logger.enabled = true\n//   ActionCable.logger.log('Connection Established.')\n//\n\nexport default {\n  log(...messages) {\n    if (this.enabled) {\n      messages.push(Date.now())\n      adapters.logger.log(\"[ActionCable]\", ...messages)\n    }\n  },\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring the cable connection is in good health by validating the heartbeat pings sent from the server, and attempting\n// revival reconnections if things go astray. Internal class, not intended for direct user manipulation.\n\nconst now = () => new Date().getTime()\n\nconst secondsSince = time => (now() - time) / 1000\n\nconst clamp = (number, min, max) => Math.max(min, Math.min(max, number))\n\nclass ConnectionMonitor {\n  constructor(connection) {\n    this.visibilityDidChange = this.visibilityDidChange.bind(this)\n    this.connection = connection\n    this.reconnectAttempts = 0\n  }\n\n  start() {\n    if (!this.isRunning()) {\n      this.startedAt = now()\n      delete this.stoppedAt\n      this.startPolling()\n      addEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(`ConnectionMonitor started. pollInterval = ${this.getPollInterval()} ms`)\n    }\n  }\n\n  stop() {\n    if (this.isRunning()) {\n      this.stoppedAt = now()\n      this.stopPolling()\n      removeEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(\"ConnectionMonitor stopped\")\n    }\n  }\n\n  isRunning() {\n    return this.startedAt && !this.stoppedAt\n  }\n\n  recordPing() {\n    this.pingedAt = now()\n  }\n\n  recordConnect() {\n    this.reconnectAttempts = 0\n    this.recordPing()\n    delete this.disconnectedAt\n    logger.log(\"ConnectionMonitor recorded connect\")\n  }\n\n  recordDisconnect() {\n    this.disconnectedAt = now()\n    logger.log(\"ConnectionMonitor recorded disconnect\")\n  }\n\n  // Private\n\n  startPolling() {\n    this.stopPolling()\n    this.poll()\n  }\n\n  stopPolling() {\n    clearTimeout(this.pollTimeout)\n  }\n\n  poll() {\n    this.pollTimeout = setTimeout(() => {\n      this.reconnectIfStale()\n      this.poll()\n    }\n    , this.getPollInterval())\n  }\n\n  getPollInterval() {\n    const {min, max, multiplier} = this.constructor.pollInterval\n    const interval = multiplier * Math.log(this.reconnectAttempts + 1)\n    return Math.round(clamp(interval, min, max) * 1000)\n  }\n\n  reconnectIfStale() {\n    if (this.connectionIsStale()) {\n      logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, pollInterval = ${this.getPollInterval()} ms, time disconnected = ${secondsSince(this.disconnectedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`)\n      this.reconnectAttempts++\n      if (this.disconnectedRecently()) {\n        logger.log(\"ConnectionMonitor skipping reopening recent disconnect\")\n      } else {\n        logger.log(\"ConnectionMonitor reopening\")\n        this.connection.reopen()\n      }\n    }\n  }\n\n  connectionIsStale() {\n    return secondsSince(this.pingedAt ? this.pingedAt : this.startedAt) > this.constructor.staleThreshold\n  }\n\n  disconnectedRecently() {\n    return this.disconnectedAt && (secondsSince(this.disconnectedAt) < this.constructor.staleThreshold)\n  }\n\n  visibilityDidChange() {\n    if (document.visibilityState === \"visible\") {\n      setTimeout(() => {\n        if (this.connectionIsStale() || !this.connection.isOpen()) {\n          logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`)\n          this.connection.reopen()\n        }\n      }\n      , 200)\n    }\n  }\n\n}\n\nConnectionMonitor.pollInterval = {\n  min: 3,\n  max: 30,\n  multiplier: 5\n}\n\nConnectionMonitor.staleThreshold = 6 // Server::Connections::BEAT_INTERVAL * 2 (missed two pings)\n\nexport default ConnectionMonitor\n", "export default {\n  \"message_types\": {\n    \"welcome\": \"welcome\",\n    \"disconnect\": \"disconnect\",\n    \"ping\": \"ping\",\n    \"confirmation\": \"confirm_subscription\",\n    \"rejection\": \"reject_subscription\"\n  },\n  \"disconnect_reasons\": {\n    \"unauthorized\": \"unauthorized\",\n    \"invalid_request\": \"invalid_request\",\n    \"server_restart\": \"server_restart\"\n  },\n  \"default_mount_path\": \"/cable\",\n  \"protocols\": [\n    \"actioncable-v1-json\",\n    \"actioncable-unsupported\"\n  ]\n}\n", "import adapters from \"./adapters\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport INTERNAL from \"./internal\"\nimport logger from \"./logger\"\n\n// Encapsulate the cable connection held by the consumer. This is an internal class not intended for direct user manipulation.\n\nconst {message_types, protocols} = INTERNAL\nconst supportedProtocols = protocols.slice(0, protocols.length - 1)\n\nconst indexOf = [].indexOf\n\nclass Connection {\n  constructor(consumer) {\n    this.open = this.open.bind(this)\n    this.consumer = consumer\n    this.subscriptions = this.consumer.subscriptions\n    this.monitor = new ConnectionMonitor(this)\n    this.disconnected = true\n  }\n\n  send(data) {\n    if (this.isOpen()) {\n      this.webSocket.send(JSON.stringify(data))\n      return true\n    } else {\n      return false\n    }\n  }\n\n  open() {\n    if (this.isActive()) {\n      logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`)\n      return false\n    } else {\n      logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${protocols}`)\n      if (this.webSocket) { this.uninstallEventHandlers() }\n      this.webSocket = new adapters.WebSocket(this.consumer.url, protocols)\n      this.installEventHandlers()\n      this.monitor.start()\n      return true\n    }\n  }\n\n  close({allowReconnect} = {allowReconnect: true}) {\n    if (!allowReconnect) { this.monitor.stop() }\n    if (this.isActive()) {\n      return this.webSocket.close()\n    }\n  }\n\n  reopen() {\n    logger.log(`Reopening WebSocket, current state is ${this.getState()}`)\n    if (this.isActive()) {\n      try {\n        return this.close()\n      } catch (error) {\n        logger.log(\"Failed to reopen WebSocket\", error)\n      }\n      finally {\n        logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`)\n        setTimeout(this.open, this.constructor.reopenDelay)\n      }\n    } else {\n      return this.open()\n    }\n  }\n\n  getProtocol() {\n    if (this.webSocket) {\n      return this.webSocket.protocol\n    }\n  }\n\n  isOpen() {\n    return this.isState(\"open\")\n  }\n\n  isActive() {\n    return this.isState(\"open\", \"connecting\")\n  }\n\n  // Private\n\n  isProtocolSupported() {\n    return indexOf.call(supportedProtocols, this.getProtocol()) >= 0\n  }\n\n  isState(...states) {\n    return indexOf.call(states, this.getState()) >= 0\n  }\n\n  getState() {\n    if (this.webSocket) {\n      for (let state in adapters.WebSocket) {\n        if (adapters.WebSocket[state] === this.webSocket.readyState) {\n          return state.toLowerCase()\n        }\n      }\n    }\n    return null\n  }\n\n  installEventHandlers() {\n    for (let eventName in this.events) {\n      const handler = this.events[eventName].bind(this)\n      this.webSocket[`on${eventName}`] = handler\n    }\n  }\n\n  uninstallEventHandlers() {\n    for (let eventName in this.events) {\n      this.webSocket[`on${eventName}`] = function() {}\n    }\n  }\n\n}\n\nConnection.reopenDelay = 500\n\nConnection.prototype.events = {\n  message(event) {\n    if (!this.isProtocolSupported()) { return }\n    const {identifier, message, reason, reconnect, type} = JSON.parse(event.data)\n    switch (type) {\n      case message_types.welcome:\n        this.monitor.recordConnect()\n        return this.subscriptions.reload()\n      case message_types.disconnect:\n        logger.log(`Disconnecting. Reason: ${reason}`)\n        return this.close({allowReconnect: reconnect})\n      case message_types.ping:\n        return this.monitor.recordPing()\n      case message_types.confirmation:\n        return this.subscriptions.notify(identifier, \"connected\")\n      case message_types.rejection:\n        return this.subscriptions.reject(identifier)\n      default:\n        return this.subscriptions.notify(identifier, \"received\", message)\n    }\n  },\n\n  open() {\n    logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`)\n    this.disconnected = false\n    if (!this.isProtocolSupported()) {\n      logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\")\n      return this.close({allowReconnect: false})\n    }\n  },\n\n  close(event) {\n    logger.log(\"WebSocket onclose event\")\n    if (this.disconnected) { return }\n    this.disconnected = true\n    this.monitor.recordDisconnect()\n    return this.subscriptions.notifyAll(\"disconnected\", {willAttemptReconnect: this.monitor.isRunning()})\n  },\n\n  error() {\n    logger.log(\"WebSocket onerror event\")\n  }\n}\n\nexport default Connection\n", "// A new subscription is created through the ActionCable.Subscriptions instance available on the consumer.\n// It provides a number of callbacks and a method for calling remote procedure calls on the corresponding\n// Channel instance on the server side.\n//\n// An example demonstrates the basic functionality:\n//\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\", {\n//     connected() {\n//       // Called once the subscription has been successfully completed\n//     },\n//\n//     disconnected({ willAttemptReconnect: boolean }) {\n//       // Called when the client has disconnected with the server.\n//       // The object will have an `willAttemptReconnect` property which\n//       // says whether the client has the intention of attempting\n//       // to reconnect.\n//     },\n//\n//     appear() {\n//       this.perform('appear', {appearing_on: this.appearingOn()})\n//     },\n//\n//     away() {\n//       this.perform('away')\n//     },\n//\n//     appearingOn() {\n//       $('main').data('appearing-on')\n//     }\n//   })\n//\n// The methods #appear and #away forward their intent to the remote AppearanceChannel instance on the server\n// by calling the `perform` method with the first parameter being the action (which maps to AppearanceChannel#appear/away).\n// The second parameter is a hash that'll get JSON encoded and made available on the server in the data parameter.\n//\n// This is how the server component would look:\n//\n//   class AppearanceChannel < ApplicationActionCable::Channel\n//     def subscribed\n//       current_user.appear\n//     end\n//\n//     def unsubscribed\n//       current_user.disappear\n//     end\n//\n//     def appear(data)\n//       current_user.appear on: data['appearing_on']\n//     end\n//\n//     def away\n//       current_user.away\n//     end\n//   end\n//\n// The \"AppearanceChannel\" name is automatically mapped between the client-side subscription creation and the server-side Ruby class name.\n// The AppearanceChannel#appear/away public methods are exposed automatically to client-side invocation through the perform method.\n\nconst extend = function(object, properties) {\n  if (properties != null) {\n    for (let key in properties) {\n      const value = properties[key]\n      object[key] = value\n    }\n  }\n  return object\n}\n\nexport default class Subscription {\n  constructor(consumer, params = {}, mixin) {\n    this.consumer = consumer\n    this.identifier = JSON.stringify(params)\n    extend(this, mixin)\n  }\n\n  // Perform a channel action with the optional data passed as an attribute\n  perform(action, data = {}) {\n    data.action = action\n    return this.send(data)\n  }\n\n  send(data) {\n    return this.consumer.send({command: \"message\", identifier: this.identifier, data: JSON.stringify(data)})\n  }\n\n  unsubscribe() {\n    return this.consumer.subscriptions.remove(this)\n  }\n}\n", "import Subscription from \"./subscription\"\n\n// Collection class for creating (and internally managing) channel subscriptions.\n// The only method intended to be triggered by the user is ActionCable.Subscriptions#create,\n// and it should be called through the consumer like so:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n\nexport default class Subscriptions {\n  constructor(consumer) {\n    this.consumer = consumer\n    this.subscriptions = []\n  }\n\n  create(channelName, mixin) {\n    const channel = channelName\n    const params = typeof channel === \"object\" ? channel : {channel}\n    const subscription = new Subscription(this.consumer, params, mixin)\n    return this.add(subscription)\n  }\n\n  // Private\n\n  add(subscription) {\n    this.subscriptions.push(subscription)\n    this.consumer.ensureActiveConnection()\n    this.notify(subscription, \"initialized\")\n    this.sendCommand(subscription, \"subscribe\")\n    return subscription\n  }\n\n  remove(subscription) {\n    this.forget(subscription)\n    if (!this.findAll(subscription.identifier).length) {\n      this.sendCommand(subscription, \"unsubscribe\")\n    }\n    return subscription\n  }\n\n  reject(identifier) {\n    return this.findAll(identifier).map((subscription) => {\n      this.forget(subscription)\n      this.notify(subscription, \"rejected\")\n      return subscription\n    })\n  }\n\n  forget(subscription) {\n    this.subscriptions = (this.subscriptions.filter((s) => s !== subscription))\n    return subscription\n  }\n\n  findAll(identifier) {\n    return this.subscriptions.filter((s) => s.identifier === identifier)\n  }\n\n  reload() {\n    return this.subscriptions.map((subscription) =>\n      this.sendCommand(subscription, \"subscribe\"))\n  }\n\n  notifyAll(callbackName, ...args) {\n    return this.subscriptions.map((subscription) =>\n      this.notify(subscription, callbackName, ...args))\n  }\n\n  notify(subscription, callbackName, ...args) {\n    let subscriptions\n    if (typeof subscription === \"string\") {\n      subscriptions = this.findAll(subscription)\n    } else {\n      subscriptions = [subscription]\n    }\n\n    return subscriptions.map((subscription) =>\n      (typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined))\n  }\n\n  sendCommand(subscription, command) {\n    const {identifier} = subscription\n    return this.consumer.send({command, identifier})\n  }\n}\n", "import Connection from \"./connection\"\nimport Subscriptions from \"./subscriptions\"\n\n// The ActionCable.Consumer establishes the connection to a server-side Ruby Connection object. Once established,\n// the ActionCable.ConnectionMonitor will ensure that its properly maintained through heartbeats and checking for stale updates.\n// The Consumer instance is also the gateway to establishing subscriptions to desired channels through the #createSubscription\n// method.\n//\n// The following example shows how this can be set up:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n//\n// When a consumer is created, it automatically connects with the server.\n//\n// To disconnect from the server, call\n//\n//   App.cable.disconnect()\n//\n// and to restart the connection:\n//\n//   App.cable.connect()\n//\n// Any channel subscriptions which existed prior to disconnecting will\n// automatically resubscribe.\n\nexport default class Consumer {\n  constructor(url) {\n    this._url = url\n    this.subscriptions = new Subscriptions(this)\n    this.connection = new Connection(this)\n  }\n\n  get url() {\n    return createWebSocketURL(this._url)\n  }\n\n  send(data) {\n    return this.connection.send(data)\n  }\n\n  connect() {\n    return this.connection.open()\n  }\n\n  disconnect() {\n    return this.connection.close({allowReconnect: false})\n  }\n\n  ensureActiveConnection() {\n    if (!this.connection.isActive()) {\n      return this.connection.open()\n    }\n  }\n}\n\nexport function createWebSocketURL(url) {\n  if (typeof url === \"function\") {\n    url = url()\n  }\n\n  if (url && !/^wss?:/i.test(url)) {\n    const a = document.createElement(\"a\")\n    a.href = url\n    // Fix populating Location properties in IE. Otherwise, protocol will be blank.\n    a.href = a.href\n    a.protocol = a.protocol.replace(\"http\", \"ws\")\n    return a.href\n  } else {\n    return url\n  }\n}\n", "import Connection from \"./connection\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport Consumer, { createWebSocketURL } from \"./consumer\"\nimport INTERNAL from \"./internal\"\nimport Subscription from \"./subscription\"\nimport Subscriptions from \"./subscriptions\"\nimport adapters from \"./adapters\"\nimport logger from \"./logger\"\n\nexport {\n  Connection,\n  ConnectionMonitor,\n  Consumer,\n  INTERNAL,\n  Subscription,\n  Subscriptions,\n  adapters,\n  createWebSocketURL,\n  logger,\n}\n\nexport function createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n  return new Consumer(url)\n}\n\nexport function getConfig(name) {\n  const element = document.head.querySelector(`meta[name='action-cable-${name}']`)\n  if (element) {\n    return element.getAttribute(\"content\")\n  }\n}\n", "// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n  constructor(reason) {\n    super(`Invalid DateTime: ${reason.toMessage()}`);\n  }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n  constructor(reason) {\n    super(`Invalid Interval: ${reason.toMessage()}`);\n  }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n  constructor(reason) {\n    super(`Invalid Duration: ${reason.toMessage()}`);\n  }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n  constructor(unit) {\n    super(`Invalid unit ${unit}`);\n  }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n  constructor() {\n    super(\"Zone is an abstract class\");\n  }\n}\n", "/**\n * @private\n */\n\nconst n = \"numeric\",\n  s = \"short\",\n  l = \"long\";\n\nexport const DATE_SHORT = {\n  year: n,\n  month: n,\n  day: n,\n};\n\nexport const DATE_MED = {\n  year: n,\n  month: s,\n  day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n  year: n,\n  month: s,\n  day: n,\n  weekday: s,\n};\n\nexport const DATE_FULL = {\n  year: n,\n  month: l,\n  day: n,\n};\n\nexport const DATE_HUGE = {\n  year: n,\n  month: l,\n  day: n,\n  weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n  hour: n,\n  minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n  hour: n,\n  minute: n,\n  second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n  hour: n,\n  minute: n,\n  hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n  hour: n,\n  minute: n,\n  second: n,\n  hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  hourCycle: \"h23\",\n  timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  hourCycle: \"h23\",\n  timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n  year: n,\n  month: n,\n  day: n,\n  hour: n,\n  minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n  year: n,\n  month: n,\n  day: n,\n  hour: n,\n  minute: n,\n  second: n,\n};\n\nexport const DATETIME_MED = {\n  year: n,\n  month: s,\n  day: n,\n  hour: n,\n  minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n  year: n,\n  month: s,\n  day: n,\n  hour: n,\n  minute: n,\n  second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n  year: n,\n  month: s,\n  day: n,\n  weekday: s,\n  hour: n,\n  minute: n,\n};\n\nexport const DATETIME_FULL = {\n  year: n,\n  month: l,\n  day: n,\n  hour: n,\n  minute: n,\n  timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n  year: n,\n  month: l,\n  day: n,\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n  year: n,\n  month: l,\n  day: n,\n  weekday: l,\n  hour: n,\n  minute: n,\n  timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n  year: n,\n  month: l,\n  day: n,\n  weekday: l,\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: l,\n};\n", "/*\n  This is just a junk drawer, containing anything used across multiple classes.\n  Because Luxon is small(ish), this should stay small and we won't worry about splitting\n  it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n  return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n  return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n  return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n  return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n  return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n  try {\n    return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n  } catch (e) {\n    return false;\n  }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n  return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n  if (arr.length === 0) {\n    return undefined;\n  }\n  return arr.reduce((best, next) => {\n    const pair = [by(next), next];\n    if (!best) {\n      return pair;\n    } else if (compare(best[0], pair[0]) === best[0]) {\n      return best;\n    } else {\n      return pair;\n    }\n  }, null)[1];\n}\n\nexport function pick(obj, keys) {\n  return keys.reduce((a, k) => {\n    a[k] = obj[k];\n    return a;\n  }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n  return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n  return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n  const isNeg = input < 0;\n  let padded;\n  if (isNeg) {\n    padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n  } else {\n    padded = (\"\" + input).padStart(n, \"0\");\n  }\n  return padded;\n}\n\nexport function parseInteger(string) {\n  if (isUndefined(string) || string === null || string === \"\") {\n    return undefined;\n  } else {\n    return parseInt(string, 10);\n  }\n}\n\nexport function parseFloating(string) {\n  if (isUndefined(string) || string === null || string === \"\") {\n    return undefined;\n  } else {\n    return parseFloat(string);\n  }\n}\n\nexport function parseMillis(fraction) {\n  // Return undefined (instead of 0) in these cases, where fraction is not set\n  if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n    return undefined;\n  } else {\n    const f = parseFloat(\"0.\" + fraction) * 1000;\n    return Math.floor(f);\n  }\n}\n\nexport function roundTo(number, digits, towardZero = false) {\n  const factor = 10 ** digits,\n    rounder = towardZero ? Math.trunc : Math.round;\n  return rounder(number * factor) / factor;\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n  return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n  return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n  const modMonth = floorMod(month - 1, 12) + 1,\n    modYear = year + (month - modMonth) / 12;\n\n  if (modMonth === 2) {\n    return isLeapYear(modYear) ? 29 : 28;\n  } else {\n    return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n  }\n}\n\n// covert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n  let d = Date.UTC(\n    obj.year,\n    obj.month - 1,\n    obj.day,\n    obj.hour,\n    obj.minute,\n    obj.second,\n    obj.millisecond\n  );\n\n  // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n  if (obj.year < 100 && obj.year >= 0) {\n    d = new Date(d);\n    d.setUTCFullYear(d.getUTCFullYear() - 1900);\n  }\n  return +d;\n}\n\nexport function weeksInWeekYear(weekYear) {\n  const p1 =\n      (weekYear +\n        Math.floor(weekYear / 4) -\n        Math.floor(weekYear / 100) +\n        Math.floor(weekYear / 400)) %\n      7,\n    last = weekYear - 1,\n    p2 = (last + Math.floor(last / 4) - Math.floor(last / 100) + Math.floor(last / 400)) % 7;\n  return p1 === 4 || p2 === 3 ? 53 : 52;\n}\n\nexport function untruncateYear(year) {\n  if (year > 99) {\n    return year;\n  } else return year > 60 ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n  const date = new Date(ts),\n    intlOpts = {\n      hourCycle: \"h23\",\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\",\n      hour: \"2-digit\",\n      minute: \"2-digit\",\n    };\n\n  if (timeZone) {\n    intlOpts.timeZone = timeZone;\n  }\n\n  const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n  const parsed = new Intl.DateTimeFormat(locale, modified)\n    .formatToParts(date)\n    .find((m) => m.type.toLowerCase() === \"timezonename\");\n  return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n  let offHour = parseInt(offHourStr, 10);\n\n  // don't || this because we want to preserve -0\n  if (Number.isNaN(offHour)) {\n    offHour = 0;\n  }\n\n  const offMin = parseInt(offMinuteStr, 10) || 0,\n    offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n  return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n  const numericValue = Number(value);\n  if (typeof value === \"boolean\" || value === \"\" || Number.isNaN(numericValue))\n    throw new InvalidArgumentError(`Invalid unit value ${value}`);\n  return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n  const normalized = {};\n  for (const u in obj) {\n    if (hasOwnProperty(obj, u)) {\n      const v = obj[u];\n      if (v === undefined || v === null) continue;\n      normalized[normalizer(u)] = asNumber(v);\n    }\n  }\n  return normalized;\n}\n\nexport function formatOffset(offset, format) {\n  const hours = Math.trunc(Math.abs(offset / 60)),\n    minutes = Math.trunc(Math.abs(offset % 60)),\n    sign = offset >= 0 ? \"+\" : \"-\";\n\n  switch (format) {\n    case \"short\":\n      return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n    case \"narrow\":\n      return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n    case \"techie\":\n      return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n    default:\n      throw new RangeError(`Value format ${format} is out of range for property format`);\n  }\n}\n\nexport function timeObject(obj) {\n  return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n\nexport const ianaRegex = /[A-Za-z_+-]{1,256}(:?\\/[A-Za-z0-9_+-]{1,256}(\\/[A-Za-z0-9_+-]{1,256})?)?/;\n", "import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n  return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n  \"January\",\n  \"February\",\n  \"March\",\n  \"April\",\n  \"May\",\n  \"June\",\n  \"July\",\n  \"August\",\n  \"September\",\n  \"October\",\n  \"November\",\n  \"December\",\n];\n\nexport const monthsShort = [\n  \"Jan\",\n  \"Feb\",\n  \"Mar\",\n  \"Apr\",\n  \"May\",\n  \"Jun\",\n  \"Jul\",\n  \"Aug\",\n  \"Sep\",\n  \"Oct\",\n  \"Nov\",\n  \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n  switch (length) {\n    case \"narrow\":\n      return [...monthsNarrow];\n    case \"short\":\n      return [...monthsShort];\n    case \"long\":\n      return [...monthsLong];\n    case \"numeric\":\n      return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n    case \"2-digit\":\n      return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n    default:\n      return null;\n  }\n}\n\nexport const weekdaysLong = [\n  \"Monday\",\n  \"Tuesday\",\n  \"Wednesday\",\n  \"Thursday\",\n  \"Friday\",\n  \"Saturday\",\n  \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n  switch (length) {\n    case \"narrow\":\n      return [...weekdaysNarrow];\n    case \"short\":\n      return [...weekdaysShort];\n    case \"long\":\n      return [...weekdaysLong];\n    case \"numeric\":\n      return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n    default:\n      return null;\n  }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n  switch (length) {\n    case \"narrow\":\n      return [...erasNarrow];\n    case \"short\":\n      return [...erasShort];\n    case \"long\":\n      return [...erasLong];\n    default:\n      return null;\n  }\n}\n\nexport function meridiemForDateTime(dt) {\n  return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n  return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n  return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n  return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n  const units = {\n    years: [\"year\", \"yr.\"],\n    quarters: [\"quarter\", \"qtr.\"],\n    months: [\"month\", \"mo.\"],\n    weeks: [\"week\", \"wk.\"],\n    days: [\"day\", \"day\", \"days\"],\n    hours: [\"hour\", \"hr.\"],\n    minutes: [\"minute\", \"min.\"],\n    seconds: [\"second\", \"sec.\"],\n  };\n\n  const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n  if (numeric === \"auto\" && lastable) {\n    const isDay = unit === \"days\";\n    switch (count) {\n      case 1:\n        return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n      case -1:\n        return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n      case 0:\n        return isDay ? \"today\" : `this ${units[unit][0]}`;\n      default: // fall through\n    }\n  }\n\n  const isInPast = Object.is(count, -0) || count < 0,\n    fmtValue = Math.abs(count),\n    singular = fmtValue === 1,\n    lilUnits = units[unit],\n    fmtUnit = narrow\n      ? singular\n        ? lilUnits[1]\n        : lilUnits[2] || lilUnits[1]\n      : singular\n      ? units[unit][0]\n      : unit;\n  return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n  // these all have the offsets removed because we don't have access to them\n  // without all the intl stuff this is backfilling\n  const filtered = pick(knownFormat, [\n      \"weekday\",\n      \"era\",\n      \"year\",\n      \"month\",\n      \"day\",\n      \"hour\",\n      \"minute\",\n      \"second\",\n      \"timeZoneName\",\n      \"hourCycle\",\n    ]),\n    key = stringify(filtered),\n    dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n  switch (key) {\n    case stringify(Formats.DATE_SHORT):\n      return \"M/d/yyyy\";\n    case stringify(Formats.DATE_MED):\n      return \"LLL d, yyyy\";\n    case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n      return \"EEE, LLL d, yyyy\";\n    case stringify(Formats.DATE_FULL):\n      return \"LLLL d, yyyy\";\n    case stringify(Formats.DATE_HUGE):\n      return \"EEEE, LLLL d, yyyy\";\n    case stringify(Formats.TIME_SIMPLE):\n      return \"h:mm a\";\n    case stringify(Formats.TIME_WITH_SECONDS):\n      return \"h:mm:ss a\";\n    case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n      return \"h:mm a\";\n    case stringify(Formats.TIME_WITH_LONG_OFFSET):\n      return \"h:mm a\";\n    case stringify(Formats.TIME_24_SIMPLE):\n      return \"HH:mm\";\n    case stringify(Formats.TIME_24_WITH_SECONDS):\n      return \"HH:mm:ss\";\n    case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n      return \"HH:mm\";\n    case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n      return \"HH:mm\";\n    case stringify(Formats.DATETIME_SHORT):\n      return \"M/d/yyyy, h:mm a\";\n    case stringify(Formats.DATETIME_MED):\n      return \"LLL d, yyyy, h:mm a\";\n    case stringify(Formats.DATETIME_FULL):\n      return \"LLLL d, yyyy, h:mm a\";\n    case stringify(Formats.DATETIME_HUGE):\n      return dateTimeHuge;\n    case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n      return \"M/d/yyyy, h:mm:ss a\";\n    case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n      return \"LLL d, yyyy, h:mm:ss a\";\n    case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n      return \"EEE, d LLL yyyy, h:mm a\";\n    case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n      return \"LLLL d, yyyy, h:mm:ss a\";\n    case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n      return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n    default:\n      return dateTimeHuge;\n  }\n}\n", "import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n  let s = \"\";\n  for (const token of splits) {\n    if (token.literal) {\n      s += token.val;\n    } else {\n      s += tokenToString(token.val);\n    }\n  }\n  return s;\n}\n\nconst macroTokenToFormatOpts = {\n  D: Formats.DATE_SHORT,\n  DD: Formats.DATE_MED,\n  DDD: Formats.DATE_FULL,\n  DDDD: Formats.DATE_HUGE,\n  t: Formats.TIME_SIMPLE,\n  tt: Formats.TIME_WITH_SECONDS,\n  ttt: Formats.TIME_WITH_SHORT_OFFSET,\n  tttt: Formats.TIME_WITH_LONG_OFFSET,\n  T: Formats.TIME_24_SIMPLE,\n  TT: Formats.TIME_24_WITH_SECONDS,\n  TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n  TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n  f: Formats.DATETIME_SHORT,\n  ff: Formats.DATETIME_MED,\n  fff: Formats.DATETIME_FULL,\n  ffff: Formats.DATETIME_HUGE,\n  F: Formats.DATETIME_SHORT_WITH_SECONDS,\n  FF: Formats.DATETIME_MED_WITH_SECONDS,\n  FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n  FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n  static create(locale, opts = {}) {\n    return new Formatter(locale, opts);\n  }\n\n  static parseFormat(fmt) {\n    let current = null,\n      currentFull = \"\",\n      bracketed = false;\n    const splits = [];\n    for (let i = 0; i < fmt.length; i++) {\n      const c = fmt.charAt(i);\n      if (c === \"'\") {\n        if (currentFull.length > 0) {\n          splits.push({ literal: bracketed, val: currentFull });\n        }\n        current = null;\n        currentFull = \"\";\n        bracketed = !bracketed;\n      } else if (bracketed) {\n        currentFull += c;\n      } else if (c === current) {\n        currentFull += c;\n      } else {\n        if (currentFull.length > 0) {\n          splits.push({ literal: false, val: currentFull });\n        }\n        currentFull = c;\n        current = c;\n      }\n    }\n\n    if (currentFull.length > 0) {\n      splits.push({ literal: bracketed, val: currentFull });\n    }\n\n    return splits;\n  }\n\n  static macroTokenToFormatOpts(token) {\n    return macroTokenToFormatOpts[token];\n  }\n\n  constructor(locale, formatOpts) {\n    this.opts = formatOpts;\n    this.loc = locale;\n    this.systemLoc = null;\n  }\n\n  formatWithSystemDefault(dt, opts) {\n    if (this.systemLoc === null) {\n      this.systemLoc = this.loc.redefaultToSystem();\n    }\n    const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n    return df.format();\n  }\n\n  formatDateTime(dt, opts = {}) {\n    const df = this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n    return df.format();\n  }\n\n  formatDateTimeParts(dt, opts = {}) {\n    const df = this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n    return df.formatToParts();\n  }\n\n  resolvedOptions(dt, opts = {}) {\n    const df = this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n    return df.resolvedOptions();\n  }\n\n  num(n, p = 0) {\n    // we get some perf out of doing this here, annoyingly\n    if (this.opts.forceSimple) {\n      return padStart(n, p);\n    }\n\n    const opts = { ...this.opts };\n\n    if (p > 0) {\n      opts.padTo = p;\n    }\n\n    return this.loc.numberFormatter(opts).format(n);\n  }\n\n  formatDateTimeFromString(dt, fmt) {\n    const knownEnglish = this.loc.listingMode() === \"en\",\n      useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n      string = (opts, extract) => this.loc.extract(dt, opts, extract),\n      formatOffset = (opts) => {\n        if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n          return \"Z\";\n        }\n\n        return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n      },\n      meridiem = () =>\n        knownEnglish\n          ? English.meridiemForDateTime(dt)\n          : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n      month = (length, standalone) =>\n        knownEnglish\n          ? English.monthForDateTime(dt, length)\n          : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n      weekday = (length, standalone) =>\n        knownEnglish\n          ? English.weekdayForDateTime(dt, length)\n          : string(\n              standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n              \"weekday\"\n            ),\n      maybeMacro = (token) => {\n        const formatOpts = Formatter.macroTokenToFormatOpts(token);\n        if (formatOpts) {\n          return this.formatWithSystemDefault(dt, formatOpts);\n        } else {\n          return token;\n        }\n      },\n      era = (length) =>\n        knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n      tokenToString = (token) => {\n        // Where possible: http://cldr.unicode.org/translation/date-time-1/date-time#TOC-Standalone-vs.-Format-Styles\n        switch (token) {\n          // ms\n          case \"S\":\n            return this.num(dt.millisecond);\n          case \"u\":\n          // falls through\n          case \"SSS\":\n            return this.num(dt.millisecond, 3);\n          // seconds\n          case \"s\":\n            return this.num(dt.second);\n          case \"ss\":\n            return this.num(dt.second, 2);\n          // fractional seconds\n          case \"uu\":\n            return this.num(Math.floor(dt.millisecond / 10), 2);\n          case \"uuu\":\n            return this.num(Math.floor(dt.millisecond / 100));\n          // minutes\n          case \"m\":\n            return this.num(dt.minute);\n          case \"mm\":\n            return this.num(dt.minute, 2);\n          // hours\n          case \"h\":\n            return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n          case \"hh\":\n            return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n          case \"H\":\n            return this.num(dt.hour);\n          case \"HH\":\n            return this.num(dt.hour, 2);\n          // offset\n          case \"Z\":\n            // like +6\n            return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n          case \"ZZ\":\n            // like +06:00\n            return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n          case \"ZZZ\":\n            // like +0600\n            return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n          case \"ZZZZ\":\n            // like EST\n            return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n          case \"ZZZZZ\":\n            // like Eastern Standard Time\n            return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n          // zone\n          case \"z\":\n            // like America/New_York\n            return dt.zoneName;\n          // meridiems\n          case \"a\":\n            return meridiem();\n          // dates\n          case \"d\":\n            return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n          case \"dd\":\n            return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n          // weekdays - standalone\n          case \"c\":\n            // like 1\n            return this.num(dt.weekday);\n          case \"ccc\":\n            // like 'Tues'\n            return weekday(\"short\", true);\n          case \"cccc\":\n            // like 'Tuesday'\n            return weekday(\"long\", true);\n          case \"ccccc\":\n            // like 'T'\n            return weekday(\"narrow\", true);\n          // weekdays - format\n          case \"E\":\n            // like 1\n            return this.num(dt.weekday);\n          case \"EEE\":\n            // like 'Tues'\n            return weekday(\"short\", false);\n          case \"EEEE\":\n            // like 'Tuesday'\n            return weekday(\"long\", false);\n          case \"EEEEE\":\n            // like 'T'\n            return weekday(\"narrow\", false);\n          // months - standalone\n          case \"L\":\n            // like 1\n            return useDateTimeFormatter\n              ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n              : this.num(dt.month);\n          case \"LL\":\n            // like 01, doesn't seem to work\n            return useDateTimeFormatter\n              ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n              : this.num(dt.month, 2);\n          case \"LLL\":\n            // like Jan\n            return month(\"short\", true);\n          case \"LLLL\":\n            // like January\n            return month(\"long\", true);\n          case \"LLLLL\":\n            // like J\n            return month(\"narrow\", true);\n          // months - format\n          case \"M\":\n            // like 1\n            return useDateTimeFormatter\n              ? string({ month: \"numeric\" }, \"month\")\n              : this.num(dt.month);\n          case \"MM\":\n            // like 01\n            return useDateTimeFormatter\n              ? string({ month: \"2-digit\" }, \"month\")\n              : this.num(dt.month, 2);\n          case \"MMM\":\n            // like Jan\n            return month(\"short\", false);\n          case \"MMMM\":\n            // like January\n            return month(\"long\", false);\n          case \"MMMMM\":\n            // like J\n            return month(\"narrow\", false);\n          // years\n          case \"y\":\n            // like 2014\n            return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n          case \"yy\":\n            // like 14\n            return useDateTimeFormatter\n              ? string({ year: \"2-digit\" }, \"year\")\n              : this.num(dt.year.toString().slice(-2), 2);\n          case \"yyyy\":\n            // like 0012\n            return useDateTimeFormatter\n              ? string({ year: \"numeric\" }, \"year\")\n              : this.num(dt.year, 4);\n          case \"yyyyyy\":\n            // like 000012\n            return useDateTimeFormatter\n              ? string({ year: \"numeric\" }, \"year\")\n              : this.num(dt.year, 6);\n          // eras\n          case \"G\":\n            // like AD\n            return era(\"short\");\n          case \"GG\":\n            // like Anno Domini\n            return era(\"long\");\n          case \"GGGGG\":\n            return era(\"narrow\");\n          case \"kk\":\n            return this.num(dt.weekYear.toString().slice(-2), 2);\n          case \"kkkk\":\n            return this.num(dt.weekYear, 4);\n          case \"W\":\n            return this.num(dt.weekNumber);\n          case \"WW\":\n            return this.num(dt.weekNumber, 2);\n          case \"o\":\n            return this.num(dt.ordinal);\n          case \"ooo\":\n            return this.num(dt.ordinal, 3);\n          case \"q\":\n            // like 1\n            return this.num(dt.quarter);\n          case \"qq\":\n            // like 01\n            return this.num(dt.quarter, 2);\n          case \"X\":\n            return this.num(Math.floor(dt.ts / 1000));\n          case \"x\":\n            return this.num(dt.ts);\n          default:\n            return maybeMacro(token);\n        }\n      };\n\n    return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n  }\n\n  formatDurationFromString(dur, fmt) {\n    const tokenToField = (token) => {\n        switch (token[0]) {\n          case \"S\":\n            return \"millisecond\";\n          case \"s\":\n            return \"second\";\n          case \"m\":\n            return \"minute\";\n          case \"h\":\n            return \"hour\";\n          case \"d\":\n            return \"day\";\n          case \"M\":\n            return \"month\";\n          case \"y\":\n            return \"year\";\n          default:\n            return null;\n        }\n      },\n      tokenToString = (lildur) => (token) => {\n        const mapped = tokenToField(token);\n        if (mapped) {\n          return this.num(lildur.get(mapped), token.length);\n        } else {\n          return token;\n        }\n      },\n      tokens = Formatter.parseFormat(fmt),\n      realTokens = tokens.reduce(\n        (found, { literal, val }) => (literal ? found : found.concat(val)),\n        []\n      ),\n      collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t));\n    return stringifyTokens(tokens, tokenToString(collapsed));\n  }\n}\n", "export default class Invalid {\n  constructor(reason, explanation) {\n    this.reason = reason;\n    this.explanation = explanation;\n  }\n\n  toMessage() {\n    if (this.explanation) {\n      return `${this.reason}: ${this.explanation}`;\n    } else {\n      return this.reason;\n    }\n  }\n}\n", "import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n  /**\n   * The type of zone\n   * @abstract\n   * @type {string}\n   */\n  get type() {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * The name of this zone.\n   * @abstract\n   * @type {string}\n   */\n  get name() {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Returns whether the offset is known to be fixed for the whole year.\n   * @abstract\n   * @type {boolean}\n   */\n  get isUniversal() {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Returns the offset's common name (such as EST) at the specified timestamp\n   * @abstract\n   * @param {number} ts - Epoch milliseconds for which to get the name\n   * @param {Object} opts - Options to affect the format\n   * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n   * @param {string} opts.locale - What locale to return the offset name in.\n   * @return {string}\n   */\n  offsetName(ts, opts) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Returns the offset's value as a string\n   * @abstract\n   * @param {number} ts - Epoch milliseconds for which to get the offset\n   * @param {string} format - What style of offset to return.\n   *                          Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n   * @return {string}\n   */\n  formatOffset(ts, format) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Return the offset in minutes for this zone at the specified timestamp.\n   * @abstract\n   * @param {number} ts - Epoch milliseconds for which to compute the offset\n   * @return {number}\n   */\n  offset(ts) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Return whether this Zone is equal to another zone\n   * @abstract\n   * @param {Zone} otherZone - the zone to compare\n   * @return {boolean}\n   */\n  equals(otherZone) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Return whether this Zone is valid.\n   * @abstract\n   * @type {boolean}\n   */\n  get isValid() {\n    throw new ZoneIsAbstractError();\n  }\n}\n", "import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n  /**\n   * Get a singleton instance of the local zone\n   * @return {SystemZone}\n   */\n  static get instance() {\n    if (singleton === null) {\n      singleton = new SystemZone();\n    }\n    return singleton;\n  }\n\n  /** @override **/\n  get type() {\n    return \"system\";\n  }\n\n  /** @override **/\n  get name() {\n    return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n  }\n\n  /** @override **/\n  get isUniversal() {\n    return false;\n  }\n\n  /** @override **/\n  offsetName(ts, { format, locale }) {\n    return parseZoneInfo(ts, format, locale);\n  }\n\n  /** @override **/\n  formatOffset(ts, format) {\n    return formatOffset(this.offset(ts), format);\n  }\n\n  /** @override **/\n  offset(ts) {\n    return -new Date(ts).getTimezoneOffset();\n  }\n\n  /** @override **/\n  equals(otherZone) {\n    return otherZone.type === \"system\";\n  }\n\n  /** @override **/\n  get isValid() {\n    return true;\n  }\n}\n", "import { formatOffset, parseZoneInfo, isUndefined, ianaRegex, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nconst matchingRegex = RegExp(`^${ianaRegex.source}$`);\n\nlet dtfCache = {};\nfunction makeDTF(zone) {\n  if (!dtfCache[zone]) {\n    dtfCache[zone] = new Intl.DateTimeFormat(\"en-US\", {\n      hour12: false,\n      timeZone: zone,\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\",\n      hour: \"2-digit\",\n      minute: \"2-digit\",\n      second: \"2-digit\",\n    });\n  }\n  return dtfCache[zone];\n}\n\nconst typeToPos = {\n  year: 0,\n  month: 1,\n  day: 2,\n  hour: 3,\n  minute: 4,\n  second: 5,\n};\n\nfunction hackyOffset(dtf, date) {\n  const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n    parsed = /(\\d+)\\/(\\d+)\\/(\\d+),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n    [, fMonth, fDay, fYear, fHour, fMinute, fSecond] = parsed;\n  return [fYear, fMonth, fDay, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n  const formatted = dtf.formatToParts(date),\n    filled = [];\n  for (let i = 0; i < formatted.length; i++) {\n    const { type, value } = formatted[i],\n      pos = typeToPos[type];\n\n    if (!isUndefined(pos)) {\n      filled[pos] = parseInt(value, 10);\n    }\n  }\n  return filled;\n}\n\nlet ianaZoneCache = {};\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n  /**\n   * @param {string} name - Zone name\n   * @return {IANAZone}\n   */\n  static create(name) {\n    if (!ianaZoneCache[name]) {\n      ianaZoneCache[name] = new IANAZone(name);\n    }\n    return ianaZoneCache[name];\n  }\n\n  /**\n   * Reset local caches. Should only be necessary in testing scenarios.\n   * @return {void}\n   */\n  static resetCache() {\n    ianaZoneCache = {};\n    dtfCache = {};\n  }\n\n  /**\n   * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n   * @param {string} s - The string to check validity on\n   * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n   * @example IANAZone.isValidSpecifier(\"Fantasia/Castle\") //=> true\n   * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n   * @return {boolean}\n   */\n  static isValidSpecifier(s) {\n    return !!(s && s.match(matchingRegex));\n  }\n\n  /**\n   * Returns whether the provided string identifies a real zone\n   * @param {string} zone - The string to check\n   * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n   * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n   * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n   * @return {boolean}\n   */\n  static isValidZone(zone) {\n    if (!zone) {\n      return false;\n    }\n    try {\n      new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  constructor(name) {\n    super();\n    /** @private **/\n    this.zoneName = name;\n    /** @private **/\n    this.valid = IANAZone.isValidZone(name);\n  }\n\n  /** @override **/\n  get type() {\n    return \"iana\";\n  }\n\n  /** @override **/\n  get name() {\n    return this.zoneName;\n  }\n\n  /** @override **/\n  get isUniversal() {\n    return false;\n  }\n\n  /** @override **/\n  offsetName(ts, { format, locale }) {\n    return parseZoneInfo(ts, format, locale, this.name);\n  }\n\n  /** @override **/\n  formatOffset(ts, format) {\n    return formatOffset(this.offset(ts), format);\n  }\n\n  /** @override **/\n  offset(ts) {\n    const date = new Date(ts);\n\n    if (isNaN(date)) return NaN;\n\n    const dtf = makeDTF(this.name),\n      [year, month, day, hour, minute, second] = dtf.formatToParts\n        ? partsOffset(dtf, date)\n        : hackyOffset(dtf, date);\n\n    // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n    const adjustedHour = hour === 24 ? 0 : hour;\n\n    const asUTC = objToLocalTS({\n      year,\n      month,\n      day,\n      hour: adjustedHour,\n      minute,\n      second,\n      millisecond: 0,\n    });\n\n    let asTS = +date;\n    const over = asTS % 1000;\n    asTS -= over >= 0 ? over : 1000 + over;\n    return (asUTC - asTS) / (60 * 1000);\n  }\n\n  /** @override **/\n  equals(otherZone) {\n    return otherZone.type === \"iana\" && otherZone.name === this.name;\n  }\n\n  /** @override **/\n  get isValid() {\n    return this.valid;\n  }\n}\n", "import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n  /**\n   * Get a singleton instance of UTC\n   * @return {FixedOffsetZone}\n   */\n  static get utcInstance() {\n    if (singleton === null) {\n      singleton = new FixedOffsetZone(0);\n    }\n    return singleton;\n  }\n\n  /**\n   * Get an instance with a specified offset\n   * @param {number} offset - The offset in minutes\n   * @return {FixedOffsetZone}\n   */\n  static instance(offset) {\n    return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n  }\n\n  /**\n   * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n   * @param {string} s - The offset string to parse\n   * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n   * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n   * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n   * @return {FixedOffsetZone}\n   */\n  static parseSpecifier(s) {\n    if (s) {\n      const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n      if (r) {\n        return new FixedOffsetZone(signedOffset(r[1], r[2]));\n      }\n    }\n    return null;\n  }\n\n  constructor(offset) {\n    super();\n    /** @private **/\n    this.fixed = offset;\n  }\n\n  /** @override **/\n  get type() {\n    return \"fixed\";\n  }\n\n  /** @override **/\n  get name() {\n    return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n  }\n\n  /** @override **/\n  offsetName() {\n    return this.name;\n  }\n\n  /** @override **/\n  formatOffset(ts, format) {\n    return formatOffset(this.fixed, format);\n  }\n\n  /** @override **/\n  get isUniversal() {\n    return true;\n  }\n\n  /** @override **/\n  offset() {\n    return this.fixed;\n  }\n\n  /** @override **/\n  equals(otherZone) {\n    return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n  }\n\n  /** @override **/\n  get isValid() {\n    return true;\n  }\n}\n", "import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n  constructor(zoneName) {\n    super();\n    /**  @private */\n    this.zoneName = zoneName;\n  }\n\n  /** @override **/\n  get type() {\n    return \"invalid\";\n  }\n\n  /** @override **/\n  get name() {\n    return this.zoneName;\n  }\n\n  /** @override **/\n  get isUniversal() {\n    return false;\n  }\n\n  /** @override **/\n  offsetName() {\n    return null;\n  }\n\n  /** @override **/\n  formatOffset() {\n    return \"\";\n  }\n\n  /** @override **/\n  offset() {\n    return NaN;\n  }\n\n  /** @override **/\n  equals() {\n    return false;\n  }\n\n  /** @override **/\n  get isValid() {\n    return false;\n  }\n}\n", "/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\n\nexport function normalizeZone(input, defaultZone) {\n  let offset;\n  if (isUndefined(input) || input === null) {\n    return defaultZone;\n  } else if (input instanceof Zone) {\n    return input;\n  } else if (isString(input)) {\n    const lowered = input.toLowerCase();\n    if (lowered === \"local\" || lowered === \"system\") return defaultZone;\n    else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n    else if (IANAZone.isValidSpecifier(lowered)) return IANAZone.create(input);\n    else return FixedOffsetZone.parseSpecifier(lowered) || new InvalidZone(input);\n  } else if (isNumber(input)) {\n    return FixedOffsetZone.instance(input);\n  } else if (typeof input === \"object\" && input.offset && typeof input.offset === \"number\") {\n    // This is dumb, but the instanceof check above doesn't seem to really work\n    // so we're duck checking it\n    return input;\n  } else {\n    return new InvalidZone(input);\n  }\n}\n", "import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nlet now = () => Date.now(),\n  defaultZone = \"system\",\n  defaultLocale = null,\n  defaultNumberingSystem = null,\n  defaultOutputCalendar = null,\n  throwOnInvalid;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n  /**\n   * Get the callback for returning the current timestamp.\n   * @type {function}\n   */\n  static get now() {\n    return now;\n  }\n\n  /**\n   * Set the callback for returning the current timestamp.\n   * The function should return a number, which will be interpreted as an Epoch millisecond count\n   * @type {function}\n   * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n   * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n   */\n  static set now(n) {\n    now = n;\n  }\n\n  /**\n   * Set the default time zone to create DateTimes in. Does not affect existing instances.\n   * Use the value \"system\" to reset this value to the system's time zone.\n   * @type {string}\n   */\n  static set defaultZone(zone) {\n    defaultZone = zone;\n  }\n\n  /**\n   * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n   * The default value is the system's time zone (the one set on the machine that runs this code).\n   * @type {Zone}\n   */\n  static get defaultZone() {\n    return normalizeZone(defaultZone, SystemZone.instance);\n  }\n\n  /**\n   * Get the default locale to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static get defaultLocale() {\n    return defaultLocale;\n  }\n\n  /**\n   * Set the default locale to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static set defaultLocale(locale) {\n    defaultLocale = locale;\n  }\n\n  /**\n   * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static get defaultNumberingSystem() {\n    return defaultNumberingSystem;\n  }\n\n  /**\n   * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static set defaultNumberingSystem(numberingSystem) {\n    defaultNumberingSystem = numberingSystem;\n  }\n\n  /**\n   * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static get defaultOutputCalendar() {\n    return defaultOutputCalendar;\n  }\n\n  /**\n   * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static set defaultOutputCalendar(outputCalendar) {\n    defaultOutputCalendar = outputCalendar;\n  }\n\n  /**\n   * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n   * @type {boolean}\n   */\n  static get throwOnInvalid() {\n    return throwOnInvalid;\n  }\n\n  /**\n   * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n   * @type {boolean}\n   */\n  static set throwOnInvalid(t) {\n    throwOnInvalid = t;\n  }\n\n  /**\n   * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n   * @return {void}\n   */\n  static resetCaches() {\n    Locale.resetCache();\n    IANAZone.resetCache();\n  }\n}\n", "import { padStart, roundTo, hasRelative } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n  const key = JSON.stringify([locString, opts]);\n  let dtf = intlLFCache[key];\n  if (!dtf) {\n    dtf = new Intl.ListFormat(locString, opts);\n    intlLFCache[key] = dtf;\n  }\n  return dtf;\n}\n\nlet intlDTCache = {};\nfunction getCachedDTF(locString, opts = {}) {\n  const key = JSON.stringify([locString, opts]);\n  let dtf = intlDTCache[key];\n  if (!dtf) {\n    dtf = new Intl.DateTimeFormat(locString, opts);\n    intlDTCache[key] = dtf;\n  }\n  return dtf;\n}\n\nlet intlNumCache = {};\nfunction getCachedINF(locString, opts = {}) {\n  const key = JSON.stringify([locString, opts]);\n  let inf = intlNumCache[key];\n  if (!inf) {\n    inf = new Intl.NumberFormat(locString, opts);\n    intlNumCache[key] = inf;\n  }\n  return inf;\n}\n\nlet intlRelCache = {};\nfunction getCachedRTF(locString, opts = {}) {\n  const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n  const key = JSON.stringify([locString, cacheKeyOpts]);\n  let inf = intlRelCache[key];\n  if (!inf) {\n    inf = new Intl.RelativeTimeFormat(locString, opts);\n    intlRelCache[key] = inf;\n  }\n  return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n  if (sysLocaleCache) {\n    return sysLocaleCache;\n  } else {\n    sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n    return sysLocaleCache;\n  }\n}\n\nfunction parseLocaleString(localeStr) {\n  // I really want to avoid writing a BCP 47 parser\n  // see, e.g. https://github.com/wooorm/bcp-47\n  // Instead, we'll do this:\n\n  // a) if the string has no -u extensions, just leave it alone\n  // b) if it does, use Intl to resolve everything\n  // c) if Intl fails, try again without the -u\n\n  const uIndex = localeStr.indexOf(\"-u-\");\n  if (uIndex === -1) {\n    return [localeStr];\n  } else {\n    let options;\n    const smaller = localeStr.substring(0, uIndex);\n    try {\n      options = getCachedDTF(localeStr).resolvedOptions();\n    } catch (e) {\n      options = getCachedDTF(smaller).resolvedOptions();\n    }\n\n    const { numberingSystem, calendar } = options;\n    // return the smaller one so that we can append the calendar and numbering overrides to it\n    return [smaller, numberingSystem, calendar];\n  }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n  if (outputCalendar || numberingSystem) {\n    localeStr += \"-u\";\n\n    if (outputCalendar) {\n      localeStr += `-ca-${outputCalendar}`;\n    }\n\n    if (numberingSystem) {\n      localeStr += `-nu-${numberingSystem}`;\n    }\n    return localeStr;\n  } else {\n    return localeStr;\n  }\n}\n\nfunction mapMonths(f) {\n  const ms = [];\n  for (let i = 1; i <= 12; i++) {\n    const dt = DateTime.utc(2016, i, 1);\n    ms.push(f(dt));\n  }\n  return ms;\n}\n\nfunction mapWeekdays(f) {\n  const ms = [];\n  for (let i = 1; i <= 7; i++) {\n    const dt = DateTime.utc(2016, 11, 13 + i);\n    ms.push(f(dt));\n  }\n  return ms;\n}\n\nfunction listStuff(loc, length, defaultOK, englishFn, intlFn) {\n  const mode = loc.listingMode(defaultOK);\n\n  if (mode === \"error\") {\n    return null;\n  } else if (mode === \"en\") {\n    return englishFn(length);\n  } else {\n    return intlFn(length);\n  }\n}\n\nfunction supportsFastNumbers(loc) {\n  if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n    return false;\n  } else {\n    return (\n      loc.numberingSystem === \"latn\" ||\n      !loc.locale ||\n      loc.locale.startsWith(\"en\") ||\n      new Intl.DateTimeFormat(loc.intl).resolvedOptions().numberingSystem === \"latn\"\n    );\n  }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n  constructor(intl, forceSimple, opts) {\n    this.padTo = opts.padTo || 0;\n    this.floor = opts.floor || false;\n\n    const { padTo, floor, ...otherOpts } = opts;\n\n    if (!forceSimple || Object.keys(otherOpts).length > 0) {\n      const intlOpts = { useGrouping: false, ...opts };\n      if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n      this.inf = getCachedINF(intl, intlOpts);\n    }\n  }\n\n  format(i) {\n    if (this.inf) {\n      const fixed = this.floor ? Math.floor(i) : i;\n      return this.inf.format(fixed);\n    } else {\n      // to match the browser's numberformatter defaults\n      const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n      return padStart(fixed, this.padTo);\n    }\n  }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n  constructor(dt, intl, opts) {\n    this.opts = opts;\n\n    let z;\n    if (dt.zone.isUniversal) {\n      // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n      // That is why fixed-offset TZ is set to that unless it is:\n      // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n      // 2. Unsupported by the browser:\n      //    - some do not support Etc/\n      //    - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n      const gmtOffset = -1 * (dt.offset / 60);\n      const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n      if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n        z = offsetZ;\n        this.dt = dt;\n      } else {\n        // Not all fixed-offset zones like Etc/+4:30 are present in tzdata.\n        // So we have to make do. Two cases:\n        // 1. The format options tell us to show the zone. We can't do that, so the best\n        // we can do is format the date in UTC.\n        // 2. The format options don't tell us to show the zone. Then we can adjust them\n        // the time and tell the formatter to show it to us in UTC, so that the time is right\n        // and the bad zone doesn't show up.\n        z = \"UTC\";\n        if (opts.timeZoneName) {\n          this.dt = dt;\n        } else {\n          this.dt = dt.offset === 0 ? dt : DateTime.fromMillis(dt.ts + dt.offset * 60 * 1000);\n        }\n      }\n    } else if (dt.zone.type === \"system\") {\n      this.dt = dt;\n    } else {\n      this.dt = dt;\n      z = dt.zone.name;\n    }\n\n    const intlOpts = { ...this.opts };\n    if (z) {\n      intlOpts.timeZone = z;\n    }\n    this.dtf = getCachedDTF(intl, intlOpts);\n  }\n\n  format() {\n    return this.dtf.format(this.dt.toJSDate());\n  }\n\n  formatToParts() {\n    return this.dtf.formatToParts(this.dt.toJSDate());\n  }\n\n  resolvedOptions() {\n    return this.dtf.resolvedOptions();\n  }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n  constructor(intl, isEnglish, opts) {\n    this.opts = { style: \"long\", ...opts };\n    if (!isEnglish && hasRelative()) {\n      this.rtf = getCachedRTF(intl, opts);\n    }\n  }\n\n  format(count, unit) {\n    if (this.rtf) {\n      return this.rtf.format(count, unit);\n    } else {\n      return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n    }\n  }\n\n  formatToParts(count, unit) {\n    if (this.rtf) {\n      return this.rtf.formatToParts(count, unit);\n    } else {\n      return [];\n    }\n  }\n}\n\n/**\n * @private\n */\n\nexport default class Locale {\n  static fromOpts(opts) {\n    return Locale.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.defaultToEN);\n  }\n\n  static create(locale, numberingSystem, outputCalendar, defaultToEN = false) {\n    const specifiedLocale = locale || Settings.defaultLocale;\n    // the system locale is useful for human readable strings but annoying for parsing/formatting known formats\n    const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n    const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n    const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n    return new Locale(localeR, numberingSystemR, outputCalendarR, specifiedLocale);\n  }\n\n  static resetCache() {\n    sysLocaleCache = null;\n    intlDTCache = {};\n    intlNumCache = {};\n    intlRelCache = {};\n  }\n\n  static fromObject({ locale, numberingSystem, outputCalendar } = {}) {\n    return Locale.create(locale, numberingSystem, outputCalendar);\n  }\n\n  constructor(locale, numbering, outputCalendar, specifiedLocale) {\n    const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n    this.locale = parsedLocale;\n    this.numberingSystem = numbering || parsedNumberingSystem || null;\n    this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n    this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n    this.weekdaysCache = { format: {}, standalone: {} };\n    this.monthsCache = { format: {}, standalone: {} };\n    this.meridiemCache = null;\n    this.eraCache = {};\n\n    this.specifiedLocale = specifiedLocale;\n    this.fastNumbersCached = null;\n  }\n\n  get fastNumbers() {\n    if (this.fastNumbersCached == null) {\n      this.fastNumbersCached = supportsFastNumbers(this);\n    }\n\n    return this.fastNumbersCached;\n  }\n\n  listingMode() {\n    const isActuallyEn = this.isEnglish();\n    const hasNoWeirdness =\n      (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n      (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n    return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n  }\n\n  clone(alts) {\n    if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n      return this;\n    } else {\n      return Locale.create(\n        alts.locale || this.specifiedLocale,\n        alts.numberingSystem || this.numberingSystem,\n        alts.outputCalendar || this.outputCalendar,\n        alts.defaultToEN || false\n      );\n    }\n  }\n\n  redefaultToEN(alts = {}) {\n    return this.clone({ ...alts, defaultToEN: true });\n  }\n\n  redefaultToSystem(alts = {}) {\n    return this.clone({ ...alts, defaultToEN: false });\n  }\n\n  months(length, format = false, defaultOK = true) {\n    return listStuff(this, length, defaultOK, English.months, () => {\n      const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n        formatStr = format ? \"format\" : \"standalone\";\n      if (!this.monthsCache[formatStr][length]) {\n        this.monthsCache[formatStr][length] = mapMonths((dt) => this.extract(dt, intl, \"month\"));\n      }\n      return this.monthsCache[formatStr][length];\n    });\n  }\n\n  weekdays(length, format = false, defaultOK = true) {\n    return listStuff(this, length, defaultOK, English.weekdays, () => {\n      const intl = format\n          ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n          : { weekday: length },\n        formatStr = format ? \"format\" : \"standalone\";\n      if (!this.weekdaysCache[formatStr][length]) {\n        this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n          this.extract(dt, intl, \"weekday\")\n        );\n      }\n      return this.weekdaysCache[formatStr][length];\n    });\n  }\n\n  meridiems(defaultOK = true) {\n    return listStuff(\n      this,\n      undefined,\n      defaultOK,\n      () => English.meridiems,\n      () => {\n        // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n        // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n        if (!this.meridiemCache) {\n          const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n          this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n            (dt) => this.extract(dt, intl, \"dayperiod\")\n          );\n        }\n\n        return this.meridiemCache;\n      }\n    );\n  }\n\n  eras(length, defaultOK = true) {\n    return listStuff(this, length, defaultOK, English.eras, () => {\n      const intl = { era: length };\n\n      // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n      // to definitely enumerate them.\n      if (!this.eraCache[length]) {\n        this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n          this.extract(dt, intl, \"era\")\n        );\n      }\n\n      return this.eraCache[length];\n    });\n  }\n\n  extract(dt, intlOpts, field) {\n    const df = this.dtFormatter(dt, intlOpts),\n      results = df.formatToParts(),\n      matching = results.find((m) => m.type.toLowerCase() === field);\n    return matching ? matching.value : null;\n  }\n\n  numberFormatter(opts = {}) {\n    // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n    // (in contrast, the rest of the condition is used heavily)\n    return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n  }\n\n  dtFormatter(dt, intlOpts = {}) {\n    return new PolyDateFormatter(dt, this.intl, intlOpts);\n  }\n\n  relFormatter(opts = {}) {\n    return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n  }\n\n  listFormatter(opts = {}) {\n    return getCachedLF(this.intl, opts);\n  }\n\n  isEnglish() {\n    return (\n      this.locale === \"en\" ||\n      this.locale.toLowerCase() === \"en-us\" ||\n      new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith(\"en-us\")\n    );\n  }\n\n  equals(other) {\n    return (\n      this.locale === other.locale &&\n      this.numberingSystem === other.numberingSystem &&\n      this.outputCalendar === other.outputCalendar\n    );\n  }\n}\n", "import {\n  untruncateYear,\n  signedOffset,\n  parseInteger,\n  parseMillis,\n  ianaRegex,\n  isUndefined,\n  parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nfunction combineRegexes(...regexes) {\n  const full = regexes.reduce((f, r) => f + r.source, \"\");\n  return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n  return (m) =>\n    extractors\n      .reduce(\n        ([mergedVals, mergedZone, cursor], ex) => {\n          const [val, zone, next] = ex(m, cursor);\n          return [{ ...mergedVals, ...val }, mergedZone || zone, next];\n        },\n        [{}, null, 1]\n      )\n      .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n  if (s == null) {\n    return [null, null];\n  }\n\n  for (const [regex, extractor] of patterns) {\n    const m = regex.exec(s);\n    if (m) {\n      return extractor(m);\n    }\n  }\n  return [null, null];\n}\n\nfunction simpleParse(...keys) {\n  return (match, cursor) => {\n    const ret = {};\n    let i;\n\n    for (i = 0; i < keys.length; i++) {\n      ret[keys[i]] = parseInteger(match[cursor + i]);\n    }\n    return [ret, null, cursor + i];\n  };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:(Z)|([+-]\\d\\d)(?::?(\\d\\d))?)/,\n  isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/,\n  isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${offsetRegex.source}?`),\n  isoTimeExtensionRegex = RegExp(`(?:T${isoTimeRegex.source})?`),\n  isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/,\n  isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/,\n  isoOrdinalRegex = /(\\d{4})-?(\\d{3})/,\n  extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\"),\n  extractISOOrdinalData = simpleParse(\"year\", \"ordinal\"),\n  sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/, // dumbed-down version of the ISO one\n  sqlTimeRegex = RegExp(\n    `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n  ),\n  sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n  const m = match[pos];\n  return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n  const item = {\n    year: int(match, cursor),\n    month: int(match, cursor + 1, 1),\n    day: int(match, cursor + 2, 1),\n  };\n\n  return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n  const item = {\n    hours: int(match, cursor, 0),\n    minutes: int(match, cursor + 1, 0),\n    seconds: int(match, cursor + 2, 0),\n    milliseconds: parseMillis(match[cursor + 3]),\n  };\n\n  return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n  const local = !match[cursor] && !match[cursor + 1],\n    fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n    zone = local ? null : FixedOffsetZone.instance(fullOffset);\n  return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n  const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n  return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n  /^-?P(?:(?:(-?\\d{1,9}(?:\\.\\d{1,9})?)Y)?(?:(-?\\d{1,9}(?:\\.\\d{1,9})?)M)?(?:(-?\\d{1,9}(?:\\.\\d{1,9})?)W)?(?:(-?\\d{1,9}(?:\\.\\d{1,9})?)D)?(?:T(?:(-?\\d{1,9}(?:\\.\\d{1,9})?)H)?(?:(-?\\d{1,9}(?:\\.\\d{1,9})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,9}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n  const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n    match;\n\n  const hasNegativePrefix = s[0] === \"-\";\n  const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n  const maybeNegate = (num, force = false) =>\n    num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n  return [\n    {\n      years: maybeNegate(parseFloating(yearStr)),\n      months: maybeNegate(parseFloating(monthStr)),\n      weeks: maybeNegate(parseFloating(weekStr)),\n      days: maybeNegate(parseFloating(dayStr)),\n      hours: maybeNegate(parseFloating(hourStr)),\n      minutes: maybeNegate(parseFloating(minuteStr)),\n      seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n      milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n    },\n  ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n  GMT: 0,\n  EDT: -4 * 60,\n  EST: -5 * 60,\n  CDT: -5 * 60,\n  CST: -6 * 60,\n  MDT: -6 * 60,\n  MST: -7 * 60,\n  PDT: -7 * 60,\n  PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n  const result = {\n    year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n    month: English.monthsShort.indexOf(monthStr) + 1,\n    day: parseInteger(dayStr),\n    hour: parseInteger(hourStr),\n    minute: parseInteger(minuteStr),\n  };\n\n  if (secondStr) result.second = parseInteger(secondStr);\n  if (weekdayStr) {\n    result.weekday =\n      weekdayStr.length > 3\n        ? English.weekdaysLong.indexOf(weekdayStr) + 1\n        : English.weekdaysShort.indexOf(weekdayStr) + 1;\n  }\n\n  return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n  /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n  const [\n      ,\n      weekdayStr,\n      dayStr,\n      monthStr,\n      yearStr,\n      hourStr,\n      minuteStr,\n      secondStr,\n      obsOffset,\n      milOffset,\n      offHourStr,\n      offMinuteStr,\n    ] = match,\n    result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n  let offset;\n  if (obsOffset) {\n    offset = obsOffsets[obsOffset];\n  } else if (milOffset) {\n    offset = 0;\n  } else {\n    offset = signedOffset(offHourStr, offMinuteStr);\n  }\n\n  return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n  // Remove comments and folding whitespace and replace multiple-spaces with a single space\n  return s\n    .replace(/\\([^)]*\\)|[\\n\\t]/g, \" \")\n    .replace(/(\\s\\s+)/g, \" \")\n    .trim();\n}\n\n// http date\n\nconst rfc1123 =\n    /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n  rfc850 =\n    /^(Monday|Tuesday|Wedsday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n  ascii =\n    /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n  const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n    result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n  return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n  const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n    result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n  return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n  extractISOYmd,\n  extractISOTime,\n  extractISOOffset\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n  extractISOWeekData,\n  extractISOTime,\n  extractISOOffset\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n  extractISOOrdinalData,\n  extractISOTime,\n  extractISOOffset\n);\nconst extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset);\n\n/**\n * @private\n */\n\nexport function parseISODate(s) {\n  return parse(\n    s,\n    [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n    [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n    [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n    [isoTimeCombinedRegex, extractISOTimeAndOffset]\n  );\n}\n\nexport function parseRFC2822Date(s) {\n  return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n  return parse(\n    s,\n    [rfc1123, extractRFC1123Or850],\n    [rfc850, extractRFC1123Or850],\n    [ascii, extractASCII]\n  );\n}\n\nexport function parseISODuration(s) {\n  return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n  return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOYmdTimeOffsetAndIANAZone = combineExtractors(\n  extractISOYmd,\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\n\nexport function parseSQL(s) {\n  return parse(\n    s,\n    [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeOffsetAndIANAZone],\n    [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n  );\n}\n", "import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n  asNumber,\n  hasOwnProperty,\n  isInteger,\n  isNumber,\n  isUndefined,\n  normalizeObject,\n  roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n    weeks: {\n      days: 7,\n      hours: 7 * 24,\n      minutes: 7 * 24 * 60,\n      seconds: 7 * 24 * 60 * 60,\n      milliseconds: 7 * 24 * 60 * 60 * 1000,\n    },\n    days: {\n      hours: 24,\n      minutes: 24 * 60,\n      seconds: 24 * 60 * 60,\n      milliseconds: 24 * 60 * 60 * 1000,\n    },\n    hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n    minutes: { seconds: 60, milliseconds: 60 * 1000 },\n    seconds: { milliseconds: 1000 },\n  },\n  casualMatrix = {\n    years: {\n      quarters: 4,\n      months: 12,\n      weeks: 52,\n      days: 365,\n      hours: 365 * 24,\n      minutes: 365 * 24 * 60,\n      seconds: 365 * 24 * 60 * 60,\n      milliseconds: 365 * 24 * 60 * 60 * 1000,\n    },\n    quarters: {\n      months: 3,\n      weeks: 13,\n      days: 91,\n      hours: 91 * 24,\n      minutes: 91 * 24 * 60,\n      seconds: 91 * 24 * 60 * 60,\n      milliseconds: 91 * 24 * 60 * 60 * 1000,\n    },\n    months: {\n      weeks: 4,\n      days: 30,\n      hours: 30 * 24,\n      minutes: 30 * 24 * 60,\n      seconds: 30 * 24 * 60 * 60,\n      milliseconds: 30 * 24 * 60 * 60 * 1000,\n    },\n\n    ...lowOrderMatrix,\n  },\n  daysInYearAccurate = 146097.0 / 400,\n  daysInMonthAccurate = 146097.0 / 4800,\n  accurateMatrix = {\n    years: {\n      quarters: 4,\n      months: 12,\n      weeks: daysInYearAccurate / 7,\n      days: daysInYearAccurate,\n      hours: daysInYearAccurate * 24,\n      minutes: daysInYearAccurate * 24 * 60,\n      seconds: daysInYearAccurate * 24 * 60 * 60,\n      milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n    },\n    quarters: {\n      months: 3,\n      weeks: daysInYearAccurate / 28,\n      days: daysInYearAccurate / 4,\n      hours: (daysInYearAccurate * 24) / 4,\n      minutes: (daysInYearAccurate * 24 * 60) / 4,\n      seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n      milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n    },\n    months: {\n      weeks: daysInMonthAccurate / 7,\n      days: daysInMonthAccurate,\n      hours: daysInMonthAccurate * 24,\n      minutes: daysInMonthAccurate * 24 * 60,\n      seconds: daysInMonthAccurate * 24 * 60 * 60,\n      milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n    },\n    ...lowOrderMatrix,\n  };\n\n// units ordered by size\nconst orderedUnits = [\n  \"years\",\n  \"quarters\",\n  \"months\",\n  \"weeks\",\n  \"days\",\n  \"hours\",\n  \"minutes\",\n  \"seconds\",\n  \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n  // deep merge for vals\n  const conf = {\n    values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n    loc: dur.loc.clone(alts.loc),\n    conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n  };\n  return new Duration(conf);\n}\n\nfunction antiTrunc(n) {\n  return n < 0 ? Math.floor(n) : Math.ceil(n);\n}\n\n// NB: mutates parameters\nfunction convert(matrix, fromMap, fromUnit, toMap, toUnit) {\n  const conv = matrix[toUnit][fromUnit],\n    raw = fromMap[fromUnit] / conv,\n    sameSign = Math.sign(raw) === Math.sign(toMap[toUnit]),\n    // ok, so this is wild, but see the matrix in the tests\n    added =\n      !sameSign && toMap[toUnit] !== 0 && Math.abs(raw) <= 1 ? antiTrunc(raw) : Math.trunc(raw);\n  toMap[toUnit] += added;\n  fromMap[fromUnit] -= added * conv;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n  reverseUnits.reduce((previous, current) => {\n    if (!isUndefined(vals[current])) {\n      if (previous) {\n        convert(matrix, vals, previous, vals, current);\n      }\n      return current;\n    } else {\n      return previous;\n    }\n  }, null);\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration#fromMillis}, {@link Duration#fromObject}, or {@link Duration#fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration.months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See  {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n  /**\n   * @private\n   */\n  constructor(config) {\n    const accurate = config.conversionAccuracy === \"longterm\" || false;\n    /**\n     * @access private\n     */\n    this.values = config.values;\n    /**\n     * @access private\n     */\n    this.loc = config.loc || Locale.create();\n    /**\n     * @access private\n     */\n    this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n    /**\n     * @access private\n     */\n    this.invalid = config.invalid || null;\n    /**\n     * @access private\n     */\n    this.matrix = accurate ? accurateMatrix : casualMatrix;\n    /**\n     * @access private\n     */\n    this.isLuxonDuration = true;\n  }\n\n  /**\n   * Create Duration from a number of milliseconds.\n   * @param {number} count of milliseconds\n   * @param {Object} opts - options for parsing\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @return {Duration}\n   */\n  static fromMillis(count, opts) {\n    return Duration.fromObject({ milliseconds: count }, opts);\n  }\n\n  /**\n   * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n   * If this object is empty then a zero milliseconds duration is returned.\n   * @param {Object} obj - the object to create the DateTime from\n   * @param {number} obj.years\n   * @param {number} obj.quarters\n   * @param {number} obj.months\n   * @param {number} obj.weeks\n   * @param {number} obj.days\n   * @param {number} obj.hours\n   * @param {number} obj.minutes\n   * @param {number} obj.seconds\n   * @param {number} obj.milliseconds\n   * @param {Object} [opts=[]] - options for creating this Duration\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @return {Duration}\n   */\n  static fromObject(obj, opts = {}) {\n    if (obj == null || typeof obj !== \"object\") {\n      throw new InvalidArgumentError(\n        `Duration.fromObject: argument expected to be an object, got ${\n          obj === null ? \"null\" : typeof obj\n        }`\n      );\n    }\n\n    return new Duration({\n      values: normalizeObject(obj, Duration.normalizeUnit),\n      loc: Locale.fromObject(opts),\n      conversionAccuracy: opts.conversionAccuracy,\n    });\n  }\n\n  /**\n   * Create a Duration from DurationLike.\n   *\n   * @param {Object | number | Duration} durationLike\n   * One of:\n   * - object with keys like 'years' and 'hours'.\n   * - number representing milliseconds\n   * - Duration instance\n   * @return {Duration}\n   */\n  static fromDurationLike(durationLike) {\n    if (isNumber(durationLike)) {\n      return Duration.fromMillis(durationLike);\n    } else if (Duration.isDuration(durationLike)) {\n      return durationLike;\n    } else if (typeof durationLike === \"object\") {\n      return Duration.fromObject(durationLike);\n    } else {\n      throw new InvalidArgumentError(\n        `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n      );\n    }\n  }\n\n  /**\n   * Create a Duration from an ISO 8601 duration string.\n   * @param {string} text - text to parse\n   * @param {Object} opts - options for parsing\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n   * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n   * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n   * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n   * @return {Duration}\n   */\n  static fromISO(text, opts) {\n    const [parsed] = parseISODuration(text);\n    if (parsed) {\n      return Duration.fromObject(parsed, opts);\n    } else {\n      return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n    }\n  }\n\n  /**\n   * Create a Duration from an ISO 8601 time string.\n   * @param {string} text - text to parse\n   * @param {Object} opts - options for parsing\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n   * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n   * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @return {Duration}\n   */\n  static fromISOTime(text, opts) {\n    const [parsed] = parseISOTimeOnly(text);\n    if (parsed) {\n      return Duration.fromObject(parsed, opts);\n    } else {\n      return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n    }\n  }\n\n  /**\n   * Create an invalid Duration.\n   * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n   * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n   * @return {Duration}\n   */\n  static invalid(reason, explanation = null) {\n    if (!reason) {\n      throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n    }\n\n    const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n    if (Settings.throwOnInvalid) {\n      throw new InvalidDurationError(invalid);\n    } else {\n      return new Duration({ invalid });\n    }\n  }\n\n  /**\n   * @private\n   */\n  static normalizeUnit(unit) {\n    const normalized = {\n      year: \"years\",\n      years: \"years\",\n      quarter: \"quarters\",\n      quarters: \"quarters\",\n      month: \"months\",\n      months: \"months\",\n      week: \"weeks\",\n      weeks: \"weeks\",\n      day: \"days\",\n      days: \"days\",\n      hour: \"hours\",\n      hours: \"hours\",\n      minute: \"minutes\",\n      minutes: \"minutes\",\n      second: \"seconds\",\n      seconds: \"seconds\",\n      millisecond: \"milliseconds\",\n      milliseconds: \"milliseconds\",\n    }[unit ? unit.toLowerCase() : unit];\n\n    if (!normalized) throw new InvalidUnitError(unit);\n\n    return normalized;\n  }\n\n  /**\n   * Check if an object is a Duration. Works across context boundaries\n   * @param {object} o\n   * @return {boolean}\n   */\n  static isDuration(o) {\n    return (o && o.isLuxonDuration) || false;\n  }\n\n  /**\n   * Get  the locale of a Duration, such 'en-GB'\n   * @type {string}\n   */\n  get locale() {\n    return this.isValid ? this.loc.locale : null;\n  }\n\n  /**\n   * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n   *\n   * @type {string}\n   */\n  get numberingSystem() {\n    return this.isValid ? this.loc.numberingSystem : null;\n  }\n\n  /**\n   * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n   * * `S` for milliseconds\n   * * `s` for seconds\n   * * `m` for minutes\n   * * `h` for hours\n   * * `d` for days\n   * * `M` for months\n   * * `y` for years\n   * Notes:\n   * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n   * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n   * @param {string} fmt - the format string\n   * @param {Object} opts - options\n   * @param {boolean} [opts.floor=true] - floor numerical values\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n   * @return {string}\n   */\n  toFormat(fmt, opts = {}) {\n    // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n    const fmtOpts = {\n      ...opts,\n      floor: opts.round !== false && opts.floor !== false,\n    };\n    return this.isValid\n      ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n      : INVALID;\n  }\n\n  /**\n   * Returns a string representation of a Duration with all units included\n   * To modify its behavior use the `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant. See {@link Intl.NumberFormat}.\n   * @param opts - On option object to override the formatting. Accepts the same keys as the options parameter of the native `Int.NumberFormat` constructor, as well as `listStyle`.\n   * @example\n   * ```js\n   * var dur = Duration.fromObject({ days: 1, hours: 5, minutes: 6 })\n   * dur.toHuman() //=> '1 day, 5 hours, 6 minutes'\n   * dur.toHuman({ listStyle: \"long\" }) //=> '1 day, 5 hours, and 6 minutes'\n   * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 day, 5 hr, 6 min'\n   * ```\n   */\n  toHuman(opts = {}) {\n    const l = orderedUnits\n      .map((unit) => {\n        const val = this.values[unit];\n        if (isUndefined(val)) {\n          return null;\n        }\n        return this.loc\n          .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n          .format(val);\n      })\n      .filter((n) => n);\n\n    return this.loc\n      .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n      .format(l);\n  }\n\n  /**\n   * Returns a JavaScript object with this Duration's values.\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n   * @return {Object}\n   */\n  toObject() {\n    if (!this.isValid) return {};\n    return { ...this.values };\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this Duration.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n   * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n   * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n   * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n   * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n   * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n   * @return {string}\n   */\n  toISO() {\n    // we could use the formatter, but this is an easier way to get the minimum string\n    if (!this.isValid) return null;\n\n    let s = \"P\";\n    if (this.years !== 0) s += this.years + \"Y\";\n    if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n    if (this.weeks !== 0) s += this.weeks + \"W\";\n    if (this.days !== 0) s += this.days + \"D\";\n    if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n      s += \"T\";\n    if (this.hours !== 0) s += this.hours + \"H\";\n    if (this.minutes !== 0) s += this.minutes + \"M\";\n    if (this.seconds !== 0 || this.milliseconds !== 0)\n      // this will handle \"floating point madness\" by removing extra decimal places\n      // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n      s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n    if (s === \"P\") s += \"T0S\";\n    return s;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n   * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n   * @param {Object} opts - options\n   * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n   * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n   * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n   * @return {string}\n   */\n  toISOTime(opts = {}) {\n    if (!this.isValid) return null;\n\n    const millis = this.toMillis();\n    if (millis < 0 || millis >= 86400000) return null;\n\n    opts = {\n      suppressMilliseconds: false,\n      suppressSeconds: false,\n      includePrefix: false,\n      format: \"extended\",\n      ...opts,\n    };\n\n    const value = this.shiftTo(\"hours\", \"minutes\", \"seconds\", \"milliseconds\");\n\n    let fmt = opts.format === \"basic\" ? \"hhmm\" : \"hh:mm\";\n\n    if (!opts.suppressSeconds || value.seconds !== 0 || value.milliseconds !== 0) {\n      fmt += opts.format === \"basic\" ? \"ss\" : \":ss\";\n      if (!opts.suppressMilliseconds || value.milliseconds !== 0) {\n        fmt += \".SSS\";\n      }\n    }\n\n    let str = value.toFormat(fmt);\n\n    if (opts.includePrefix) {\n      str = \"T\" + str;\n    }\n\n    return str;\n  }\n\n  /**\n   * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n   * @return {string}\n   */\n  toJSON() {\n    return this.toISO();\n  }\n\n  /**\n   * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n   * @return {string}\n   */\n  toString() {\n    return this.toISO();\n  }\n\n  /**\n   * Returns an milliseconds value of this Duration.\n   * @return {number}\n   */\n  toMillis() {\n    return this.as(\"milliseconds\");\n  }\n\n  /**\n   * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n   * @return {number}\n   */\n  valueOf() {\n    return this.toMillis();\n  }\n\n  /**\n   * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n   * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   * @return {Duration}\n   */\n  plus(duration) {\n    if (!this.isValid) return this;\n\n    const dur = Duration.fromDurationLike(duration),\n      result = {};\n\n    for (const k of orderedUnits) {\n      if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n        result[k] = dur.get(k) + this.get(k);\n      }\n    }\n\n    return clone(this, { values: result }, true);\n  }\n\n  /**\n   * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n   * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   * @return {Duration}\n   */\n  minus(duration) {\n    if (!this.isValid) return this;\n\n    const dur = Duration.fromDurationLike(duration);\n    return this.plus(dur.negate());\n  }\n\n  /**\n   * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n   * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n   * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n   * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hour\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n   * @return {Duration}\n   */\n  mapUnits(fn) {\n    if (!this.isValid) return this;\n    const result = {};\n    for (const k of Object.keys(this.values)) {\n      result[k] = asNumber(fn(this.values[k], k));\n    }\n    return clone(this, { values: result }, true);\n  }\n\n  /**\n   * Get the value of unit.\n   * @param {string} unit - a unit such as 'minute' or 'day'\n   * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n   * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n   * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n   * @return {number}\n   */\n  get(unit) {\n    return this[Duration.normalizeUnit(unit)];\n  }\n\n  /**\n   * \"Set\" the values of specified units. Return a newly-constructed Duration.\n   * @param {Object} values - a mapping of units to numbers\n   * @example dur.set({ years: 2017 })\n   * @example dur.set({ hours: 8, minutes: 30 })\n   * @return {Duration}\n   */\n  set(values) {\n    if (!this.isValid) return this;\n\n    const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n    return clone(this, { values: mixed });\n  }\n\n  /**\n   * \"Set\" the locale and/or numberingSystem.  Returns a newly-constructed Duration.\n   * @example dur.reconfigure({ locale: 'en-GB' })\n   * @return {Duration}\n   */\n  reconfigure({ locale, numberingSystem, conversionAccuracy } = {}) {\n    const loc = this.loc.clone({ locale, numberingSystem }),\n      opts = { loc };\n\n    if (conversionAccuracy) {\n      opts.conversionAccuracy = conversionAccuracy;\n    }\n\n    return clone(this, opts);\n  }\n\n  /**\n   * Return the length of the duration in the specified unit.\n   * @param {string} unit - a unit such as 'minutes' or 'days'\n   * @example Duration.fromObject({years: 1}).as('days') //=> 365\n   * @example Duration.fromObject({years: 1}).as('months') //=> 12\n   * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n   * @return {number}\n   */\n  as(unit) {\n    return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n  }\n\n  /**\n   * Reduce this Duration to its canonical representation in its current units.\n   * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n   * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n   * @return {Duration}\n   */\n  normalize() {\n    if (!this.isValid) return this;\n    const vals = this.toObject();\n    normalizeValues(this.matrix, vals);\n    return clone(this, { values: vals }, true);\n  }\n\n  /**\n   * Convert this Duration into its representation in a different set of units.\n   * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n   * @return {Duration}\n   */\n  shiftTo(...units) {\n    if (!this.isValid) return this;\n\n    if (units.length === 0) {\n      return this;\n    }\n\n    units = units.map((u) => Duration.normalizeUnit(u));\n\n    const built = {},\n      accumulated = {},\n      vals = this.toObject();\n    let lastUnit;\n\n    for (const k of orderedUnits) {\n      if (units.indexOf(k) >= 0) {\n        lastUnit = k;\n\n        let own = 0;\n\n        // anything we haven't boiled down yet should get boiled to this unit\n        for (const ak in accumulated) {\n          own += this.matrix[ak][k] * accumulated[ak];\n          accumulated[ak] = 0;\n        }\n\n        // plus anything that's already in this unit\n        if (isNumber(vals[k])) {\n          own += vals[k];\n        }\n\n        const i = Math.trunc(own);\n        built[k] = i;\n        accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n        // plus anything further down the chain that should be rolled up in to this\n        for (const down in vals) {\n          if (orderedUnits.indexOf(down) > orderedUnits.indexOf(k)) {\n            convert(this.matrix, vals, down, built, k);\n          }\n        }\n        // otherwise, keep it in the wings to boil it later\n      } else if (isNumber(vals[k])) {\n        accumulated[k] = vals[k];\n      }\n    }\n\n    // anything leftover becomes the decimal for the last unit\n    // lastUnit must be defined since units is not empty\n    for (const key in accumulated) {\n      if (accumulated[key] !== 0) {\n        built[lastUnit] +=\n          key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n      }\n    }\n\n    return clone(this, { values: built }, true).normalize();\n  }\n\n  /**\n   * Return the negative of this Duration.\n   * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n   * @return {Duration}\n   */\n  negate() {\n    if (!this.isValid) return this;\n    const negated = {};\n    for (const k of Object.keys(this.values)) {\n      negated[k] = -this.values[k];\n    }\n    return clone(this, { values: negated }, true);\n  }\n\n  /**\n   * Get the years.\n   * @type {number}\n   */\n  get years() {\n    return this.isValid ? this.values.years || 0 : NaN;\n  }\n\n  /**\n   * Get the quarters.\n   * @type {number}\n   */\n  get quarters() {\n    return this.isValid ? this.values.quarters || 0 : NaN;\n  }\n\n  /**\n   * Get the months.\n   * @type {number}\n   */\n  get months() {\n    return this.isValid ? this.values.months || 0 : NaN;\n  }\n\n  /**\n   * Get the weeks\n   * @type {number}\n   */\n  get weeks() {\n    return this.isValid ? this.values.weeks || 0 : NaN;\n  }\n\n  /**\n   * Get the days.\n   * @type {number}\n   */\n  get days() {\n    return this.isValid ? this.values.days || 0 : NaN;\n  }\n\n  /**\n   * Get the hours.\n   * @type {number}\n   */\n  get hours() {\n    return this.isValid ? this.values.hours || 0 : NaN;\n  }\n\n  /**\n   * Get the minutes.\n   * @type {number}\n   */\n  get minutes() {\n    return this.isValid ? this.values.minutes || 0 : NaN;\n  }\n\n  /**\n   * Get the seconds.\n   * @return {number}\n   */\n  get seconds() {\n    return this.isValid ? this.values.seconds || 0 : NaN;\n  }\n\n  /**\n   * Get the milliseconds.\n   * @return {number}\n   */\n  get milliseconds() {\n    return this.isValid ? this.values.milliseconds || 0 : NaN;\n  }\n\n  /**\n   * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n   * on invalid DateTimes or Intervals.\n   * @return {boolean}\n   */\n  get isValid() {\n    return this.invalid === null;\n  }\n\n  /**\n   * Returns an error code if this Duration became invalid, or null if the Duration is valid\n   * @return {string}\n   */\n  get invalidReason() {\n    return this.invalid ? this.invalid.reason : null;\n  }\n\n  /**\n   * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n   * @type {string}\n   */\n  get invalidExplanation() {\n    return this.invalid ? this.invalid.explanation : null;\n  }\n\n  /**\n   * Equality check\n   * Two Durations are equal iff they have the same units and the same values for each unit.\n   * @param {Duration} other\n   * @return {boolean}\n   */\n  equals(other) {\n    if (!this.isValid || !other.isValid) {\n      return false;\n    }\n\n    if (!this.loc.equals(other.loc)) {\n      return false;\n    }\n\n    function eq(v1, v2) {\n      // Consider 0 and undefined as equal\n      if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n      return v1 === v2;\n    }\n\n    for (const u of orderedUnits) {\n      if (!eq(this.values[u], other.values[u])) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n", "import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n  if (!start || !start.isValid) {\n    return Interval.invalid(\"missing or invalid start\");\n  } else if (!end || !end.isValid) {\n    return Interval.invalid(\"missing or invalid end\");\n  } else if (end < start) {\n    return Interval.invalid(\n      \"end before start\",\n      `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n    );\n  } else {\n    return null;\n  }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval#fromDateTimes}, {@link Interval#after}, {@link Interval#before}, or {@link Interval#fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval#merge}, {@link Interval#xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n  /**\n   * @private\n   */\n  constructor(config) {\n    /**\n     * @access private\n     */\n    this.s = config.start;\n    /**\n     * @access private\n     */\n    this.e = config.end;\n    /**\n     * @access private\n     */\n    this.invalid = config.invalid || null;\n    /**\n     * @access private\n     */\n    this.isLuxonInterval = true;\n  }\n\n  /**\n   * Create an invalid Interval.\n   * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n   * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n   * @return {Interval}\n   */\n  static invalid(reason, explanation = null) {\n    if (!reason) {\n      throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n    }\n\n    const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n    if (Settings.throwOnInvalid) {\n      throw new InvalidIntervalError(invalid);\n    } else {\n      return new Interval({ invalid });\n    }\n  }\n\n  /**\n   * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n   * @param {DateTime|Date|Object} start\n   * @param {DateTime|Date|Object} end\n   * @return {Interval}\n   */\n  static fromDateTimes(start, end) {\n    const builtStart = friendlyDateTime(start),\n      builtEnd = friendlyDateTime(end);\n\n    const validateError = validateStartEnd(builtStart, builtEnd);\n\n    if (validateError == null) {\n      return new Interval({\n        start: builtStart,\n        end: builtEnd,\n      });\n    } else {\n      return validateError;\n    }\n  }\n\n  /**\n   * Create an Interval from a start DateTime and a Duration to extend to.\n   * @param {DateTime|Date|Object} start\n   * @param {Duration|Object|number} duration - the length of the Interval.\n   * @return {Interval}\n   */\n  static after(start, duration) {\n    const dur = Duration.fromDurationLike(duration),\n      dt = friendlyDateTime(start);\n    return Interval.fromDateTimes(dt, dt.plus(dur));\n  }\n\n  /**\n   * Create an Interval from an end DateTime and a Duration to extend backwards to.\n   * @param {DateTime|Date|Object} end\n   * @param {Duration|Object|number} duration - the length of the Interval.\n   * @return {Interval}\n   */\n  static before(end, duration) {\n    const dur = Duration.fromDurationLike(duration),\n      dt = friendlyDateTime(end);\n    return Interval.fromDateTimes(dt.minus(dur), dt);\n  }\n\n  /**\n   * Create an Interval from an ISO 8601 string.\n   * Accepts `<start>/<end>`, `<start>/<duration>`, and `<duration>/<end>` formats.\n   * @param {string} text - the ISO string to parse\n   * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @return {Interval}\n   */\n  static fromISO(text, opts) {\n    const [s, e] = (text || \"\").split(\"/\", 2);\n    if (s && e) {\n      let start, startIsValid;\n      try {\n        start = DateTime.fromISO(s, opts);\n        startIsValid = start.isValid;\n      } catch (e) {\n        startIsValid = false;\n      }\n\n      let end, endIsValid;\n      try {\n        end = DateTime.fromISO(e, opts);\n        endIsValid = end.isValid;\n      } catch (e) {\n        endIsValid = false;\n      }\n\n      if (startIsValid && endIsValid) {\n        return Interval.fromDateTimes(start, end);\n      }\n\n      if (startIsValid) {\n        const dur = Duration.fromISO(e, opts);\n        if (dur.isValid) {\n          return Interval.after(start, dur);\n        }\n      } else if (endIsValid) {\n        const dur = Duration.fromISO(s, opts);\n        if (dur.isValid) {\n          return Interval.before(end, dur);\n        }\n      }\n    }\n    return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n  }\n\n  /**\n   * Check if an object is an Interval. Works across context boundaries\n   * @param {object} o\n   * @return {boolean}\n   */\n  static isInterval(o) {\n    return (o && o.isLuxonInterval) || false;\n  }\n\n  /**\n   * Returns the start of the Interval\n   * @type {DateTime}\n   */\n  get start() {\n    return this.isValid ? this.s : null;\n  }\n\n  /**\n   * Returns the end of the Interval\n   * @type {DateTime}\n   */\n  get end() {\n    return this.isValid ? this.e : null;\n  }\n\n  /**\n   * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n   * @type {boolean}\n   */\n  get isValid() {\n    return this.invalidReason === null;\n  }\n\n  /**\n   * Returns an error code if this Interval is invalid, or null if the Interval is valid\n   * @type {string}\n   */\n  get invalidReason() {\n    return this.invalid ? this.invalid.reason : null;\n  }\n\n  /**\n   * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n   * @type {string}\n   */\n  get invalidExplanation() {\n    return this.invalid ? this.invalid.explanation : null;\n  }\n\n  /**\n   * Returns the length of the Interval in the specified unit.\n   * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n   * @return {number}\n   */\n  length(unit = \"milliseconds\") {\n    return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n  }\n\n  /**\n   * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n   * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n   * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n   * @param {string} [unit='milliseconds'] - the unit of time to count.\n   * @return {number}\n   */\n  count(unit = \"milliseconds\") {\n    if (!this.isValid) return NaN;\n    const start = this.start.startOf(unit),\n      end = this.end.startOf(unit);\n    return Math.floor(end.diff(start, unit).get(unit)) + 1;\n  }\n\n  /**\n   * Returns whether this Interval's start and end are both in the same unit of time\n   * @param {string} unit - the unit of time to check sameness on\n   * @return {boolean}\n   */\n  hasSame(unit) {\n    return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n  }\n\n  /**\n   * Return whether this Interval has the same start and end DateTimes.\n   * @return {boolean}\n   */\n  isEmpty() {\n    return this.s.valueOf() === this.e.valueOf();\n  }\n\n  /**\n   * Return whether this Interval's start is after the specified DateTime.\n   * @param {DateTime} dateTime\n   * @return {boolean}\n   */\n  isAfter(dateTime) {\n    if (!this.isValid) return false;\n    return this.s > dateTime;\n  }\n\n  /**\n   * Return whether this Interval's end is before the specified DateTime.\n   * @param {DateTime} dateTime\n   * @return {boolean}\n   */\n  isBefore(dateTime) {\n    if (!this.isValid) return false;\n    return this.e <= dateTime;\n  }\n\n  /**\n   * Return whether this Interval contains the specified DateTime.\n   * @param {DateTime} dateTime\n   * @return {boolean}\n   */\n  contains(dateTime) {\n    if (!this.isValid) return false;\n    return this.s <= dateTime && this.e > dateTime;\n  }\n\n  /**\n   * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n   * @param {Object} values - the values to set\n   * @param {DateTime} values.start - the starting DateTime\n   * @param {DateTime} values.end - the ending DateTime\n   * @return {Interval}\n   */\n  set({ start, end } = {}) {\n    if (!this.isValid) return this;\n    return Interval.fromDateTimes(start || this.s, end || this.e);\n  }\n\n  /**\n   * Split this Interval at each of the specified DateTimes\n   * @param {...DateTime} dateTimes - the unit of time to count.\n   * @return {Array}\n   */\n  splitAt(...dateTimes) {\n    if (!this.isValid) return [];\n    const sorted = dateTimes\n        .map(friendlyDateTime)\n        .filter((d) => this.contains(d))\n        .sort(),\n      results = [];\n    let { s } = this,\n      i = 0;\n\n    while (s < this.e) {\n      const added = sorted[i] || this.e,\n        next = +added > +this.e ? this.e : added;\n      results.push(Interval.fromDateTimes(s, next));\n      s = next;\n      i += 1;\n    }\n\n    return results;\n  }\n\n  /**\n   * Split this Interval into smaller Intervals, each of the specified length.\n   * Left over time is grouped into a smaller interval\n   * @param {Duration|Object|number} duration - The length of each resulting interval.\n   * @return {Array}\n   */\n  splitBy(duration) {\n    const dur = Duration.fromDurationLike(duration);\n\n    if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n      return [];\n    }\n\n    let { s } = this,\n      idx = 1,\n      next;\n\n    const results = [];\n    while (s < this.e) {\n      const added = this.start.plus(dur.mapUnits((x) => x * idx));\n      next = +added > +this.e ? this.e : added;\n      results.push(Interval.fromDateTimes(s, next));\n      s = next;\n      idx += 1;\n    }\n\n    return results;\n  }\n\n  /**\n   * Split this Interval into the specified number of smaller intervals.\n   * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n   * @return {Array}\n   */\n  divideEqually(numberOfParts) {\n    if (!this.isValid) return [];\n    return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n  }\n\n  /**\n   * Return whether this Interval overlaps with the specified Interval\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  overlaps(other) {\n    return this.e > other.s && this.s < other.e;\n  }\n\n  /**\n   * Return whether this Interval's end is adjacent to the specified Interval's start.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  abutsStart(other) {\n    if (!this.isValid) return false;\n    return +this.e === +other.s;\n  }\n\n  /**\n   * Return whether this Interval's start is adjacent to the specified Interval's end.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  abutsEnd(other) {\n    if (!this.isValid) return false;\n    return +other.e === +this.s;\n  }\n\n  /**\n   * Return whether this Interval engulfs the start and end of the specified Interval.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  engulfs(other) {\n    if (!this.isValid) return false;\n    return this.s <= other.s && this.e >= other.e;\n  }\n\n  /**\n   * Return whether this Interval has the same start and end as the specified Interval.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  equals(other) {\n    if (!this.isValid || !other.isValid) {\n      return false;\n    }\n\n    return this.s.equals(other.s) && this.e.equals(other.e);\n  }\n\n  /**\n   * Return an Interval representing the intersection of this Interval and the specified Interval.\n   * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n   * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n   * @param {Interval} other\n   * @return {Interval}\n   */\n  intersection(other) {\n    if (!this.isValid) return this;\n    const s = this.s > other.s ? this.s : other.s,\n      e = this.e < other.e ? this.e : other.e;\n\n    if (s >= e) {\n      return null;\n    } else {\n      return Interval.fromDateTimes(s, e);\n    }\n  }\n\n  /**\n   * Return an Interval representing the union of this Interval and the specified Interval.\n   * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n   * @param {Interval} other\n   * @return {Interval}\n   */\n  union(other) {\n    if (!this.isValid) return this;\n    const s = this.s < other.s ? this.s : other.s,\n      e = this.e > other.e ? this.e : other.e;\n    return Interval.fromDateTimes(s, e);\n  }\n\n  /**\n   * Merge an array of Intervals into a equivalent minimal set of Intervals.\n   * Combines overlapping and adjacent Intervals.\n   * @param {Array} intervals\n   * @return {Array}\n   */\n  static merge(intervals) {\n    const [found, final] = intervals\n      .sort((a, b) => a.s - b.s)\n      .reduce(\n        ([sofar, current], item) => {\n          if (!current) {\n            return [sofar, item];\n          } else if (current.overlaps(item) || current.abutsStart(item)) {\n            return [sofar, current.union(item)];\n          } else {\n            return [sofar.concat([current]), item];\n          }\n        },\n        [[], null]\n      );\n    if (final) {\n      found.push(final);\n    }\n    return found;\n  }\n\n  /**\n   * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n   * @param {Array} intervals\n   * @return {Array}\n   */\n  static xor(intervals) {\n    let start = null,\n      currentCount = 0;\n    const results = [],\n      ends = intervals.map((i) => [\n        { time: i.s, type: \"s\" },\n        { time: i.e, type: \"e\" },\n      ]),\n      flattened = Array.prototype.concat(...ends),\n      arr = flattened.sort((a, b) => a.time - b.time);\n\n    for (const i of arr) {\n      currentCount += i.type === \"s\" ? 1 : -1;\n\n      if (currentCount === 1) {\n        start = i.time;\n      } else {\n        if (start && +start !== +i.time) {\n          results.push(Interval.fromDateTimes(start, i.time));\n        }\n\n        start = null;\n      }\n    }\n\n    return Interval.merge(results);\n  }\n\n  /**\n   * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n   * @param {...Interval} intervals\n   * @return {Array}\n   */\n  difference(...intervals) {\n    return Interval.xor([this].concat(intervals))\n      .map((i) => this.intersection(i))\n      .filter((i) => i && !i.isEmpty());\n  }\n\n  /**\n   * Returns a string representation of this Interval appropriate for debugging.\n   * @return {string}\n   */\n  toString() {\n    if (!this.isValid) return INVALID;\n    return `[${this.s.toISO()} \u2013 ${this.e.toISO()})`;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this Interval.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @param {Object} opts - The same options as {@link DateTime#toISO}\n   * @return {string}\n   */\n  toISO(opts) {\n    if (!this.isValid) return INVALID;\n    return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of date of this Interval.\n   * The time components are ignored.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @return {string}\n   */\n  toISODate() {\n    if (!this.isValid) return INVALID;\n    return `${this.s.toISODate()}/${this.e.toISODate()}`;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of time of this Interval.\n   * The date components are ignored.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @param {Object} opts - The same options as {@link DateTime#toISO}\n   * @return {string}\n   */\n  toISOTime(opts) {\n    if (!this.isValid) return INVALID;\n    return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n  }\n\n  /**\n   * Returns a string representation of this Interval formatted according to the specified format string.\n   * @param {string} dateFormat - the format string. This string formats the start and end time. See {@link DateTime#toFormat} for details.\n   * @param {Object} opts - options\n   * @param {string} [opts.separator =  ' \u2013 '] - a separator to place between the start and end representations\n   * @return {string}\n   */\n  toFormat(dateFormat, { separator = \" \u2013 \" } = {}) {\n    if (!this.isValid) return INVALID;\n    return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n  }\n\n  /**\n   * Return a Duration representing the time spanned by this interval.\n   * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n   * @param {Object} opts - options that affect the creation of the Duration\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n   * @return {Duration}\n   */\n  toDuration(unit, opts) {\n    if (!this.isValid) {\n      return Duration.invalid(this.invalidReason);\n    }\n    return this.e.diff(this.s, unit, opts);\n  }\n\n  /**\n   * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n   * @param {function} mapFn\n   * @return {Interval}\n   * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n   * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n   */\n  mapEndpoints(mapFn) {\n    return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n  }\n}\n", "import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n  /**\n   * Return whether the specified zone contains a DST.\n   * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n   * @return {boolean}\n   */\n  static hasDST(zone = Settings.defaultZone) {\n    const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n    return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n  }\n\n  /**\n   * Return whether the specified zone is a valid IANA specifier.\n   * @param {string} zone - Zone to check\n   * @return {boolean}\n   */\n  static isValidIANAZone(zone) {\n    return IANAZone.isValidSpecifier(zone) && IANAZone.isValidZone(zone);\n  }\n\n  /**\n   * Converts the input into a {@link Zone} instance.\n   *\n   * * If `input` is already a Zone instance, it is returned unchanged.\n   * * If `input` is a string containing a valid time zone name, a Zone instance\n   *   with that name is returned.\n   * * If `input` is a string that doesn't refer to a known time zone, a Zone\n   *   instance with {@link Zone#isValid} == false is returned.\n   * * If `input is a number, a Zone instance with the specified fixed offset\n   *   in minutes is returned.\n   * * If `input` is `null` or `undefined`, the default zone is returned.\n   * @param {string|Zone|number} [input] - the value to be converted\n   * @return {Zone}\n   */\n  static normalizeZone(input) {\n    return normalizeZone(input, Settings.defaultZone);\n  }\n\n  /**\n   * Return an array of standalone month names.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @param {string} [opts.outputCalendar='gregory'] - the calendar\n   * @example Info.months()[0] //=> 'January'\n   * @example Info.months('short')[0] //=> 'Jan'\n   * @example Info.months('numeric')[0] //=> '1'\n   * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n   * @example Info.months('numeric', { locale: 'ar' })[0] //=> '\u0661'\n   * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabi\u02BB I'\n   * @return {Array}\n   */\n  static months(\n    length = \"long\",\n    { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n  ) {\n    return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n  }\n\n  /**\n   * Return an array of format month names.\n   * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n   * changes the string.\n   * See {@link Info#months}\n   * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @param {string} [opts.outputCalendar='gregory'] - the calendar\n   * @return {Array}\n   */\n  static monthsFormat(\n    length = \"long\",\n    { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n  ) {\n    return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n  }\n\n  /**\n   * Return an array of standalone week names.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @example Info.weekdays()[0] //=> 'Monday'\n   * @example Info.weekdays('short')[0] //=> 'Mon'\n   * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n   * @example Info.weekdays('short', { locale: 'ar' })[0] //=> '\u0627\u0644\u0627\u062B\u0646\u064A\u0646'\n   * @return {Array}\n   */\n  static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n    return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n  }\n\n  /**\n   * Return an array of format week names.\n   * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n   * changes the string.\n   * See {@link Info#weekdays}\n   * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n   * @param {Object} opts - options\n   * @param {string} [opts.locale=null] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @return {Array}\n   */\n  static weekdaysFormat(\n    length = \"long\",\n    { locale = null, numberingSystem = null, locObj = null } = {}\n  ) {\n    return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n  }\n\n  /**\n   * Return an array of meridiems.\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n   * @example Info.meridiems({ locale: 'my' }) //=> [ '\u1014\u1036\u1014\u1000\u103A', '\u100A\u1014\u1031' ]\n   * @return {Array}\n   */\n  static meridiems({ locale = null } = {}) {\n    return Locale.create(locale).meridiems();\n  }\n\n  /**\n   * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n   * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @example Info.eras() //=> [ 'BC', 'AD' ]\n   * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n   * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant J\u00E9sus-Christ', 'apr\u00E8s J\u00E9sus-Christ' ]\n   * @return {Array}\n   */\n  static eras(length = \"short\", { locale = null } = {}) {\n    return Locale.create(locale, null, \"gregory\").eras(length);\n  }\n\n  /**\n   * Return the set of available features in this environment.\n   * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n   * Keys:\n   * * `relative`: whether this environment supports relative time formatting\n   * @example Info.features() //=> { relative: false }\n   * @return {Object}\n   */\n  static features() {\n    return { relative: hasRelative() };\n  }\n}\n", "import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n  const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n    ms = utcDayStart(later) - utcDayStart(earlier);\n  return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n  const differs = [\n    [\"years\", (a, b) => b.year - a.year],\n    [\"quarters\", (a, b) => b.quarter - a.quarter],\n    [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n    [\n      \"weeks\",\n      (a, b) => {\n        const days = dayDiff(a, b);\n        return (days - (days % 7)) / 7;\n      },\n    ],\n    [\"days\", dayDiff],\n  ];\n\n  const results = {};\n  let lowestOrder, highWater;\n\n  for (const [unit, differ] of differs) {\n    if (units.indexOf(unit) >= 0) {\n      lowestOrder = unit;\n\n      let delta = differ(cursor, later);\n      highWater = cursor.plus({ [unit]: delta });\n\n      if (highWater > later) {\n        cursor = cursor.plus({ [unit]: delta - 1 });\n        delta -= 1;\n      } else {\n        cursor = highWater;\n      }\n\n      results[unit] = delta;\n    }\n  }\n\n  return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n  let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n  const remainingMillis = later - cursor;\n\n  const lowerOrderUnits = units.filter(\n    (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n  );\n\n  if (lowerOrderUnits.length === 0) {\n    if (highWater < later) {\n      highWater = cursor.plus({ [lowestOrder]: 1 });\n    }\n\n    if (highWater !== cursor) {\n      results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n    }\n  }\n\n  const duration = Duration.fromObject(results, opts);\n\n  if (lowerOrderUnits.length > 0) {\n    return Duration.fromMillis(remainingMillis, opts)\n      .shiftTo(...lowerOrderUnits)\n      .plus(duration);\n  } else {\n    return duration;\n  }\n}\n", "const numberingSystems = {\n  arab: \"[\\u0660-\\u0669]\",\n  arabext: \"[\\u06F0-\\u06F9]\",\n  bali: \"[\\u1B50-\\u1B59]\",\n  beng: \"[\\u09E6-\\u09EF]\",\n  deva: \"[\\u0966-\\u096F]\",\n  fullwide: \"[\\uFF10-\\uFF19]\",\n  gujr: \"[\\u0AE6-\\u0AEF]\",\n  hanidec: \"[\u3007|\u4E00|\u4E8C|\u4E09|\u56DB|\u4E94|\u516D|\u4E03|\u516B|\u4E5D]\",\n  khmr: \"[\\u17E0-\\u17E9]\",\n  knda: \"[\\u0CE6-\\u0CEF]\",\n  laoo: \"[\\u0ED0-\\u0ED9]\",\n  limb: \"[\\u1946-\\u194F]\",\n  mlym: \"[\\u0D66-\\u0D6F]\",\n  mong: \"[\\u1810-\\u1819]\",\n  mymr: \"[\\u1040-\\u1049]\",\n  orya: \"[\\u0B66-\\u0B6F]\",\n  tamldec: \"[\\u0BE6-\\u0BEF]\",\n  telu: \"[\\u0C66-\\u0C6F]\",\n  thai: \"[\\u0E50-\\u0E59]\",\n  tibt: \"[\\u0F20-\\u0F29]\",\n  latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n  arab: [1632, 1641],\n  arabext: [1776, 1785],\n  bali: [6992, 7001],\n  beng: [2534, 2543],\n  deva: [2406, 2415],\n  fullwide: [65296, 65303],\n  gujr: [2790, 2799],\n  khmr: [6112, 6121],\n  knda: [3302, 3311],\n  laoo: [3792, 3801],\n  limb: [6470, 6479],\n  mlym: [3430, 3439],\n  mong: [6160, 6169],\n  mymr: [4160, 4169],\n  orya: [2918, 2927],\n  tamldec: [3046, 3055],\n  telu: [3174, 3183],\n  thai: [3664, 3673],\n  tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n  let value = parseInt(str, 10);\n  if (isNaN(value)) {\n    value = \"\";\n    for (let i = 0; i < str.length; i++) {\n      const code = str.charCodeAt(i);\n\n      if (str[i].search(numberingSystems.hanidec) !== -1) {\n        value += hanidecChars.indexOf(str[i]);\n      } else {\n        for (const key in numberingSystemsUTF16) {\n          const [min, max] = numberingSystemsUTF16[key];\n          if (code >= min && code <= max) {\n            value += code - min;\n          }\n        }\n      }\n    }\n    return parseInt(value, 10);\n  } else {\n    return value;\n  }\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n  return new RegExp(`${numberingSystems[numberingSystem || \"latn\"]}${append}`);\n}\n", "import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n  return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `( |${NBSP})`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n  // make dots optional and also make them literal\n  // make space and non breakable space characters interchangeable\n  return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n  return s\n    .replace(/\\./g, \"\") // ignore dots that were made optional\n    .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n    .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n  if (strings === null) {\n    return null;\n  } else {\n    return {\n      regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n      deser: ([s]) =>\n        strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n    };\n  }\n}\n\nfunction offset(regex, groups) {\n  return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n  return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n  return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\nfunction unitForToken(token, loc) {\n  const one = digitRegex(loc),\n    two = digitRegex(loc, \"{2}\"),\n    three = digitRegex(loc, \"{3}\"),\n    four = digitRegex(loc, \"{4}\"),\n    six = digitRegex(loc, \"{6}\"),\n    oneOrTwo = digitRegex(loc, \"{1,2}\"),\n    oneToThree = digitRegex(loc, \"{1,3}\"),\n    oneToSix = digitRegex(loc, \"{1,6}\"),\n    oneToNine = digitRegex(loc, \"{1,9}\"),\n    twoToFour = digitRegex(loc, \"{2,4}\"),\n    fourToSix = digitRegex(loc, \"{4,6}\"),\n    literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n    unitate = (t) => {\n      if (token.literal) {\n        return literal(t);\n      }\n      switch (t.val) {\n        // era\n        case \"G\":\n          return oneOf(loc.eras(\"short\", false), 0);\n        case \"GG\":\n          return oneOf(loc.eras(\"long\", false), 0);\n        // years\n        case \"y\":\n          return intUnit(oneToSix);\n        case \"yy\":\n          return intUnit(twoToFour, untruncateYear);\n        case \"yyyy\":\n          return intUnit(four);\n        case \"yyyyy\":\n          return intUnit(fourToSix);\n        case \"yyyyyy\":\n          return intUnit(six);\n        // months\n        case \"M\":\n          return intUnit(oneOrTwo);\n        case \"MM\":\n          return intUnit(two);\n        case \"MMM\":\n          return oneOf(loc.months(\"short\", true, false), 1);\n        case \"MMMM\":\n          return oneOf(loc.months(\"long\", true, false), 1);\n        case \"L\":\n          return intUnit(oneOrTwo);\n        case \"LL\":\n          return intUnit(two);\n        case \"LLL\":\n          return oneOf(loc.months(\"short\", false, false), 1);\n        case \"LLLL\":\n          return oneOf(loc.months(\"long\", false, false), 1);\n        // dates\n        case \"d\":\n          return intUnit(oneOrTwo);\n        case \"dd\":\n          return intUnit(two);\n        // ordinals\n        case \"o\":\n          return intUnit(oneToThree);\n        case \"ooo\":\n          return intUnit(three);\n        // time\n        case \"HH\":\n          return intUnit(two);\n        case \"H\":\n          return intUnit(oneOrTwo);\n        case \"hh\":\n          return intUnit(two);\n        case \"h\":\n          return intUnit(oneOrTwo);\n        case \"mm\":\n          return intUnit(two);\n        case \"m\":\n          return intUnit(oneOrTwo);\n        case \"q\":\n          return intUnit(oneOrTwo);\n        case \"qq\":\n          return intUnit(two);\n        case \"s\":\n          return intUnit(oneOrTwo);\n        case \"ss\":\n          return intUnit(two);\n        case \"S\":\n          return intUnit(oneToThree);\n        case \"SSS\":\n          return intUnit(three);\n        case \"u\":\n          return simple(oneToNine);\n        case \"uu\":\n          return simple(oneOrTwo);\n        case \"uuu\":\n          return intUnit(one);\n        // meridiem\n        case \"a\":\n          return oneOf(loc.meridiems(), 0);\n        // weekYear (k)\n        case \"kkkk\":\n          return intUnit(four);\n        case \"kk\":\n          return intUnit(twoToFour, untruncateYear);\n        // weekNumber (W)\n        case \"W\":\n          return intUnit(oneOrTwo);\n        case \"WW\":\n          return intUnit(two);\n        // weekdays\n        case \"E\":\n        case \"c\":\n          return intUnit(one);\n        case \"EEE\":\n          return oneOf(loc.weekdays(\"short\", false, false), 1);\n        case \"EEEE\":\n          return oneOf(loc.weekdays(\"long\", false, false), 1);\n        case \"ccc\":\n          return oneOf(loc.weekdays(\"short\", true, false), 1);\n        case \"cccc\":\n          return oneOf(loc.weekdays(\"long\", true, false), 1);\n        // offset/zone\n        case \"Z\":\n        case \"ZZ\":\n          return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n        case \"ZZZ\":\n          return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n        // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n        // because we don't have any way to figure out what they are\n        case \"z\":\n          return simple(/[a-z_+-/]{1,256}?/i);\n        default:\n          return literal(t);\n      }\n    };\n\n  const unit = unitate(token) || {\n    invalidReason: MISSING_FTP,\n  };\n\n  unit.token = token;\n\n  return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n  year: {\n    \"2-digit\": \"yy\",\n    numeric: \"yyyyy\",\n  },\n  month: {\n    numeric: \"M\",\n    \"2-digit\": \"MM\",\n    short: \"MMM\",\n    long: \"MMMM\",\n  },\n  day: {\n    numeric: \"d\",\n    \"2-digit\": \"dd\",\n  },\n  weekday: {\n    short: \"EEE\",\n    long: \"EEEE\",\n  },\n  dayperiod: \"a\",\n  dayPeriod: \"a\",\n  hour: {\n    numeric: \"h\",\n    \"2-digit\": \"hh\",\n  },\n  minute: {\n    numeric: \"m\",\n    \"2-digit\": \"mm\",\n  },\n  second: {\n    numeric: \"s\",\n    \"2-digit\": \"ss\",\n  },\n};\n\nfunction tokenForPart(part, locale, formatOpts) {\n  const { type, value } = part;\n\n  if (type === \"literal\") {\n    return {\n      literal: true,\n      val: value,\n    };\n  }\n\n  const style = formatOpts[type];\n\n  let val = partTypeStyleToTokenVal[type];\n  if (typeof val === \"object\") {\n    val = val[style];\n  }\n\n  if (val) {\n    return {\n      literal: false,\n      val,\n    };\n  }\n\n  return undefined;\n}\n\nfunction buildRegex(units) {\n  const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n  return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n  const matches = input.match(regex);\n\n  if (matches) {\n    const all = {};\n    let matchIndex = 1;\n    for (const i in handlers) {\n      if (hasOwnProperty(handlers, i)) {\n        const h = handlers[i],\n          groups = h.groups ? h.groups + 1 : 1;\n        if (!h.literal && h.token) {\n          all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n        }\n        matchIndex += groups;\n      }\n    }\n    return [matches, all];\n  } else {\n    return [matches, {}];\n  }\n}\n\nfunction dateTimeFromMatches(matches) {\n  const toField = (token) => {\n    switch (token) {\n      case \"S\":\n        return \"millisecond\";\n      case \"s\":\n        return \"second\";\n      case \"m\":\n        return \"minute\";\n      case \"h\":\n      case \"H\":\n        return \"hour\";\n      case \"d\":\n        return \"day\";\n      case \"o\":\n        return \"ordinal\";\n      case \"L\":\n      case \"M\":\n        return \"month\";\n      case \"y\":\n        return \"year\";\n      case \"E\":\n      case \"c\":\n        return \"weekday\";\n      case \"W\":\n        return \"weekNumber\";\n      case \"k\":\n        return \"weekYear\";\n      case \"q\":\n        return \"quarter\";\n      default:\n        return null;\n    }\n  };\n\n  let zone = null;\n  let specificOffset;\n  if (!isUndefined(matches.z)) {\n    zone = IANAZone.create(matches.z);\n  }\n\n  if (!isUndefined(matches.Z)) {\n    if (!zone) {\n      zone = new FixedOffsetZone(matches.Z);\n    }\n    specificOffset = matches.Z;\n  }\n\n  if (!isUndefined(matches.q)) {\n    matches.M = (matches.q - 1) * 3 + 1;\n  }\n\n  if (!isUndefined(matches.h)) {\n    if (matches.h < 12 && matches.a === 1) {\n      matches.h += 12;\n    } else if (matches.h === 12 && matches.a === 0) {\n      matches.h = 0;\n    }\n  }\n\n  if (matches.G === 0 && matches.y) {\n    matches.y = -matches.y;\n  }\n\n  if (!isUndefined(matches.u)) {\n    matches.S = parseMillis(matches.u);\n  }\n\n  const vals = Object.keys(matches).reduce((r, k) => {\n    const f = toField(k);\n    if (f) {\n      r[f] = matches[k];\n    }\n\n    return r;\n  }, {});\n\n  return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n  if (!dummyDateTimeCache) {\n    dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n  }\n\n  return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n  if (token.literal) {\n    return token;\n  }\n\n  const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n\n  if (!formatOpts) {\n    return token;\n  }\n\n  const formatter = Formatter.create(locale, formatOpts);\n  const parts = formatter.formatDateTimeParts(getDummyDateTime());\n\n  const tokens = parts.map((p) => tokenForPart(p, locale, formatOpts));\n\n  if (tokens.includes(undefined)) {\n    return token;\n  }\n\n  return tokens;\n}\n\nfunction expandMacroTokens(tokens, locale) {\n  return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport function explainFromTokens(locale, input, format) {\n  const tokens = expandMacroTokens(Formatter.parseFormat(format), locale),\n    units = tokens.map((t) => unitForToken(t, locale)),\n    disqualifyingUnit = units.find((t) => t.invalidReason);\n\n  if (disqualifyingUnit) {\n    return { input, tokens, invalidReason: disqualifyingUnit.invalidReason };\n  } else {\n    const [regexString, handlers] = buildRegex(units),\n      regex = RegExp(regexString, \"i\"),\n      [rawMatches, matches] = match(input, regex, handlers),\n      [result, zone, specificOffset] = matches\n        ? dateTimeFromMatches(matches)\n        : [null, null, undefined];\n    if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n      throw new ConflictingSpecificationError(\n        \"Can't include meridiem when specifying 24-hour format\"\n      );\n    }\n    return { input, tokens, regex, rawMatches, matches, result, zone, specificOffset };\n  }\n}\n\nexport function parseFromTokens(locale, input, format) {\n  const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n  return [result, zone, specificOffset, invalidReason];\n}\n", "import {\n  integerBetween,\n  isLeapYear,\n  timeObject,\n  daysInYear,\n  daysInMonth,\n  weeksInWeekYear,\n  isInteger,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n  leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n  return new Invalid(\n    \"unit out of range\",\n    `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n  );\n}\n\nfunction dayOfWeek(year, month, day) {\n  const js = new Date(Date.UTC(year, month - 1, day)).getUTCDay();\n  return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n  return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n  const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n    month0 = table.findIndex((i) => i < ordinal),\n    day = ordinal - table[month0];\n  return { month: month0 + 1, day };\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj) {\n  const { year, month, day } = gregObj,\n    ordinal = computeOrdinal(year, month, day),\n    weekday = dayOfWeek(year, month, day);\n\n  let weekNumber = Math.floor((ordinal - weekday + 10) / 7),\n    weekYear;\n\n  if (weekNumber < 1) {\n    weekYear = year - 1;\n    weekNumber = weeksInWeekYear(weekYear);\n  } else if (weekNumber > weeksInWeekYear(year)) {\n    weekYear = year + 1;\n    weekNumber = 1;\n  } else {\n    weekYear = year;\n  }\n\n  return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData) {\n  const { weekYear, weekNumber, weekday } = weekData,\n    weekdayOfJan4 = dayOfWeek(weekYear, 1, 4),\n    yearInDays = daysInYear(weekYear);\n\n  let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 3,\n    year;\n\n  if (ordinal < 1) {\n    year = weekYear - 1;\n    ordinal += daysInYear(year);\n  } else if (ordinal > yearInDays) {\n    year = weekYear + 1;\n    ordinal -= daysInYear(weekYear);\n  } else {\n    year = weekYear;\n  }\n\n  const { month, day } = uncomputeOrdinal(year, ordinal);\n  return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n  const { year, month, day } = gregData;\n  const ordinal = computeOrdinal(year, month, day);\n  return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n  const { year, ordinal } = ordinalData;\n  const { month, day } = uncomputeOrdinal(year, ordinal);\n  return { year, month, day, ...timeObject(ordinalData) };\n}\n\nexport function hasInvalidWeekData(obj) {\n  const validYear = isInteger(obj.weekYear),\n    validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear)),\n    validWeekday = integerBetween(obj.weekday, 1, 7);\n\n  if (!validYear) {\n    return unitOutOfRange(\"weekYear\", obj.weekYear);\n  } else if (!validWeek) {\n    return unitOutOfRange(\"week\", obj.week);\n  } else if (!validWeekday) {\n    return unitOutOfRange(\"weekday\", obj.weekday);\n  } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n  const validYear = isInteger(obj.year),\n    validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n  if (!validYear) {\n    return unitOutOfRange(\"year\", obj.year);\n  } else if (!validOrdinal) {\n    return unitOutOfRange(\"ordinal\", obj.ordinal);\n  } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n  const validYear = isInteger(obj.year),\n    validMonth = integerBetween(obj.month, 1, 12),\n    validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n  if (!validYear) {\n    return unitOutOfRange(\"year\", obj.year);\n  } else if (!validMonth) {\n    return unitOutOfRange(\"month\", obj.month);\n  } else if (!validDay) {\n    return unitOutOfRange(\"day\", obj.day);\n  } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n  const { hour, minute, second, millisecond } = obj;\n  const validHour =\n      integerBetween(hour, 0, 23) ||\n      (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n    validMinute = integerBetween(minute, 0, 59),\n    validSecond = integerBetween(second, 0, 59),\n    validMillisecond = integerBetween(millisecond, 0, 999);\n\n  if (!validHour) {\n    return unitOutOfRange(\"hour\", hour);\n  } else if (!validMinute) {\n    return unitOutOfRange(\"minute\", minute);\n  } else if (!validSecond) {\n    return unitOutOfRange(\"second\", second);\n  } else if (!validMillisecond) {\n    return unitOutOfRange(\"millisecond\", millisecond);\n  } else return false;\n}\n", "import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n  isUndefined,\n  maybeArray,\n  isDate,\n  isNumber,\n  bestBy,\n  daysInMonth,\n  daysInYear,\n  isLeapYear,\n  weeksInWeekYear,\n  normalizeObject,\n  roundTo,\n  objToLocalTS,\n  padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport { parseFromTokens, explainFromTokens } from \"./impl/tokenParser.js\";\nimport {\n  gregorianToWeek,\n  weekToGregorian,\n  gregorianToOrdinal,\n  ordinalToGregorian,\n  hasInvalidGregorianData,\n  hasInvalidWeekData,\n  hasInvalidOrdinalData,\n  hasInvalidTimeData,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n  InvalidArgumentError,\n  ConflictingSpecificationError,\n  InvalidUnitError,\n  InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n  return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\nfunction possiblyCachedWeekData(dt) {\n  if (dt.weekData === null) {\n    dt.weekData = gregorianToWeek(dt.c);\n  }\n  return dt.weekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n  const current = {\n    ts: inst.ts,\n    zone: inst.zone,\n    c: inst.c,\n    o: inst.o,\n    loc: inst.loc,\n    invalid: inst.invalid,\n  };\n  return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n  // Our UTC time is just a guess because our offset is just a guess\n  let utcGuess = localTS - o * 60 * 1000;\n\n  // Test whether the zone matches the offset for this ts\n  const o2 = tz.offset(utcGuess);\n\n  // If so, offset didn't change and we're done\n  if (o === o2) {\n    return [utcGuess, o];\n  }\n\n  // If not, change the ts by the difference in the offset\n  utcGuess -= (o2 - o) * 60 * 1000;\n\n  // If that gives us the local time we want, we're done\n  const o3 = tz.offset(utcGuess);\n  if (o2 === o3) {\n    return [utcGuess, o2];\n  }\n\n  // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n  return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n  ts += offset * 60 * 1000;\n\n  const d = new Date(ts);\n\n  return {\n    year: d.getUTCFullYear(),\n    month: d.getUTCMonth() + 1,\n    day: d.getUTCDate(),\n    hour: d.getUTCHours(),\n    minute: d.getUTCMinutes(),\n    second: d.getUTCSeconds(),\n    millisecond: d.getUTCMilliseconds(),\n  };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n  return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n  const oPre = inst.o,\n    year = inst.c.year + Math.trunc(dur.years),\n    month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n    c = {\n      ...inst.c,\n      year,\n      month,\n      day:\n        Math.min(inst.c.day, daysInMonth(year, month)) +\n        Math.trunc(dur.days) +\n        Math.trunc(dur.weeks) * 7,\n    },\n    millisToAdd = Duration.fromObject({\n      years: dur.years - Math.trunc(dur.years),\n      quarters: dur.quarters - Math.trunc(dur.quarters),\n      months: dur.months - Math.trunc(dur.months),\n      weeks: dur.weeks - Math.trunc(dur.weeks),\n      days: dur.days - Math.trunc(dur.days),\n      hours: dur.hours,\n      minutes: dur.minutes,\n      seconds: dur.seconds,\n      milliseconds: dur.milliseconds,\n    }).as(\"milliseconds\"),\n    localTS = objToLocalTS(c);\n\n  let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n  if (millisToAdd !== 0) {\n    ts += millisToAdd;\n    // that could have changed the offset by going over a DST, but we want to keep the ts the same\n    o = inst.zone.offset(ts);\n  }\n\n  return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n  const { setZone, zone } = opts;\n  if (parsed && Object.keys(parsed).length !== 0) {\n    const interpretationZone = parsedZone || zone,\n      inst = DateTime.fromObject(parsed, {\n        ...opts,\n        zone: interpretationZone,\n        specificOffset,\n      });\n    return setZone ? inst : inst.setZone(zone);\n  } else {\n    return DateTime.invalid(\n      new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n    );\n  }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n  return dt.isValid\n    ? Formatter.create(Locale.create(\"en-US\"), {\n        allowZ,\n        forceSimple: true,\n      }).formatDateTimeFromString(dt, format)\n    : null;\n}\n\nfunction toISODate(o, extended) {\n  const longFormat = o.c.year > 9999 || o.c.year < 0;\n  let c = \"\";\n  if (longFormat && o.c.year >= 0) c += \"+\";\n  c += padStart(o.c.year, longFormat ? 6 : 4);\n\n  if (extended) {\n    c += \"-\";\n    c += padStart(o.c.month);\n    c += \"-\";\n    c += padStart(o.c.day);\n  } else {\n    c += padStart(o.c.month);\n    c += padStart(o.c.day);\n  }\n  return c;\n}\n\nfunction toISOTime(o, extended, suppressSeconds, suppressMilliseconds, includeOffset) {\n  let c = padStart(o.c.hour);\n  if (extended) {\n    c += \":\";\n    c += padStart(o.c.minute);\n    if (o.c.second !== 0 || !suppressSeconds) {\n      c += \":\";\n    }\n  } else {\n    c += padStart(o.c.minute);\n  }\n\n  if (o.c.second !== 0 || !suppressSeconds) {\n    c += padStart(o.c.second);\n\n    if (o.c.millisecond !== 0 || !suppressMilliseconds) {\n      c += \".\";\n      c += padStart(o.c.millisecond, 3);\n    }\n  }\n\n  if (includeOffset) {\n    if (o.isOffsetFixed && o.offset === 0) {\n      c += \"Z\";\n    } else if (o.o < 0) {\n      c += \"-\";\n      c += padStart(Math.trunc(-o.o / 60));\n      c += \":\";\n      c += padStart(Math.trunc(-o.o % 60));\n    } else {\n      c += \"+\";\n      c += padStart(Math.trunc(o.o / 60));\n      c += \":\";\n      c += padStart(Math.trunc(o.o % 60));\n    }\n  }\n  return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n    month: 1,\n    day: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisecond: 0,\n  },\n  defaultWeekUnitValues = {\n    weekNumber: 1,\n    weekday: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisecond: 0,\n  },\n  defaultOrdinalUnitValues = {\n    ordinal: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisecond: 0,\n  };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n  orderedWeekUnits = [\n    \"weekYear\",\n    \"weekNumber\",\n    \"weekday\",\n    \"hour\",\n    \"minute\",\n    \"second\",\n    \"millisecond\",\n  ],\n  orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n  const normalized = {\n    year: \"year\",\n    years: \"year\",\n    month: \"month\",\n    months: \"month\",\n    day: \"day\",\n    days: \"day\",\n    hour: \"hour\",\n    hours: \"hour\",\n    minute: \"minute\",\n    minutes: \"minute\",\n    quarter: \"quarter\",\n    quarters: \"quarter\",\n    second: \"second\",\n    seconds: \"second\",\n    millisecond: \"millisecond\",\n    milliseconds: \"millisecond\",\n    weekday: \"weekday\",\n    weekdays: \"weekday\",\n    weeknumber: \"weekNumber\",\n    weeksnumber: \"weekNumber\",\n    weeknumbers: \"weekNumber\",\n    weekyear: \"weekYear\",\n    weekyears: \"weekYear\",\n    ordinal: \"ordinal\",\n  }[unit.toLowerCase()];\n\n  if (!normalized) throw new InvalidUnitError(unit);\n\n  return normalized;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n  const zone = normalizeZone(opts.zone, Settings.defaultZone),\n    loc = Locale.fromObject(opts),\n    tsNow = Settings.now();\n\n  let ts, o;\n\n  // assume we have the higher-order units\n  if (!isUndefined(obj.year)) {\n    for (const u of orderedUnits) {\n      if (isUndefined(obj[u])) {\n        obj[u] = defaultUnitValues[u];\n      }\n    }\n\n    const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n    if (invalid) {\n      return DateTime.invalid(invalid);\n    }\n\n    const offsetProvis = zone.offset(tsNow);\n    [ts, o] = objToTS(obj, offsetProvis, zone);\n  } else {\n    ts = tsNow;\n  }\n\n  return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n  const round = isUndefined(opts.round) ? true : opts.round,\n    format = (c, unit) => {\n      c = roundTo(c, round || opts.calendary ? 0 : 2, true);\n      const formatter = end.loc.clone(opts).relFormatter(opts);\n      return formatter.format(c, unit);\n    },\n    differ = (unit) => {\n      if (opts.calendary) {\n        if (!end.hasSame(start, unit)) {\n          return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n        } else return 0;\n      } else {\n        return end.diff(start, unit).get(unit);\n      }\n    };\n\n  if (opts.unit) {\n    return format(differ(opts.unit), opts.unit);\n  }\n\n  for (const unit of opts.units) {\n    const count = differ(unit);\n    if (Math.abs(count) >= 1) {\n      return format(count, unit);\n    }\n  }\n  return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n  let opts = {},\n    args;\n  if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n    opts = argList[argList.length - 1];\n    args = Array.from(argList).slice(0, argList.length - 1);\n  } else {\n    args = Array.from(argList);\n  }\n  return [opts, args];\n}\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime#local}, {@link DateTime#utc}, and (most flexibly) {@link DateTime#fromObject}. To create one from a standard string format, use {@link DateTime#fromISO}, {@link DateTime#fromHTTP}, and {@link DateTime#fromRFC2822}. To create one from a custom string format, use {@link DateTime#fromFormat}. To create one from a native JS date, use {@link DateTime#fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n  /**\n   * @access private\n   */\n  constructor(config) {\n    const zone = config.zone || Settings.defaultZone;\n\n    let invalid =\n      config.invalid ||\n      (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n      (!zone.isValid ? unsupportedZone(zone) : null);\n    /**\n     * @access private\n     */\n    this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n    let c = null,\n      o = null;\n    if (!invalid) {\n      const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n      if (unchanged) {\n        [c, o] = [config.old.c, config.old.o];\n      } else {\n        const ot = zone.offset(this.ts);\n        c = tsToObj(this.ts, ot);\n        invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n        c = invalid ? null : c;\n        o = invalid ? null : ot;\n      }\n    }\n\n    /**\n     * @access private\n     */\n    this._zone = zone;\n    /**\n     * @access private\n     */\n    this.loc = config.loc || Locale.create();\n    /**\n     * @access private\n     */\n    this.invalid = invalid;\n    /**\n     * @access private\n     */\n    this.weekData = null;\n    /**\n     * @access private\n     */\n    this.c = c;\n    /**\n     * @access private\n     */\n    this.o = o;\n    /**\n     * @access private\n     */\n    this.isLuxonDateTime = true;\n  }\n\n  // CONSTRUCT\n\n  /**\n   * Create a DateTime for the current instant, in the system's time zone.\n   *\n   * Use Settings to override these default values if needed.\n   * @example DateTime.now().toISO() //~> now in the ISO format\n   * @return {DateTime}\n   */\n  static now() {\n    return new DateTime({});\n  }\n\n  /**\n   * Create a local DateTime\n   * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n   * @param {number} [month=1] - The month, 1-indexed\n   * @param {number} [day=1] - The day of the month, 1-indexed\n   * @param {number} [hour=0] - The hour of the day, in 24-hour time\n   * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n   * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n   * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n   * @example DateTime.local()                                  //~> now\n   * @example DateTime.local({ zone: \"America/New_York\" })      //~> now, in US east coast time\n   * @example DateTime.local(2017)                              //~> 2017-01-01T00:00:00\n   * @example DateTime.local(2017, 3)                           //~> 2017-03-01T00:00:00\n   * @example DateTime.local(2017, 3, 12, { locale: \"fr\" })     //~> 2017-03-12T00:00:00, with a French locale\n   * @example DateTime.local(2017, 3, 12, 5)                    //~> 2017-03-12T05:00:00\n   * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" })   //~> 2017-03-12T05:00:00, in UTC\n   * @example DateTime.local(2017, 3, 12, 5, 45)                //~> 2017-03-12T05:45:00\n   * @example DateTime.local(2017, 3, 12, 5, 45, 10)            //~> 2017-03-12T05:45:10\n   * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765)       //~> 2017-03-12T05:45:10.765\n   * @return {DateTime}\n   */\n  static local() {\n    const [opts, args] = lastOpts(arguments),\n      [year, month, day, hour, minute, second, millisecond] = args;\n    return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n  }\n\n  /**\n   * Create a DateTime in UTC\n   * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n   * @param {number} [month=1] - The month, 1-indexed\n   * @param {number} [day=1] - The day of the month\n   * @param {number} [hour=0] - The hour of the day, in 24-hour time\n   * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n   * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n   * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n   * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n   * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n   * @example DateTime.utc()                                              //~> now\n   * @example DateTime.utc(2017)                                          //~> 2017-01-01T00:00:00Z\n   * @example DateTime.utc(2017, 3)                                       //~> 2017-03-01T00:00:00Z\n   * @example DateTime.utc(2017, 3, 12)                                   //~> 2017-03-12T00:00:00Z\n   * @example DateTime.utc(2017, 3, 12, 5)                                //~> 2017-03-12T05:00:00Z\n   * @example DateTime.utc(2017, 3, 12, 5, 45)                            //~> 2017-03-12T05:45:00Z\n   * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" })          //~> 2017-03-12T05:45:00Z with a French locale\n   * @example DateTime.utc(2017, 3, 12, 5, 45, 10)                        //~> 2017-03-12T05:45:10Z\n   * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n   * @return {DateTime}\n   */\n  static utc() {\n    const [opts, args] = lastOpts(arguments),\n      [year, month, day, hour, minute, second, millisecond] = args;\n\n    opts.zone = FixedOffsetZone.utcInstance;\n    return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n  }\n\n  /**\n   * Create a DateTime from a JavaScript Date object. Uses the default zone.\n   * @param {Date} date - a JavaScript Date object\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n   * @return {DateTime}\n   */\n  static fromJSDate(date, options = {}) {\n    const ts = isDate(date) ? date.valueOf() : NaN;\n    if (Number.isNaN(ts)) {\n      return DateTime.invalid(\"invalid input\");\n    }\n\n    const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n    if (!zoneToUse.isValid) {\n      return DateTime.invalid(unsupportedZone(zoneToUse));\n    }\n\n    return new DateTime({\n      ts: ts,\n      zone: zoneToUse,\n      loc: Locale.fromObject(options),\n    });\n  }\n\n  /**\n   * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n   * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n   * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n   * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @return {DateTime}\n   */\n  static fromMillis(milliseconds, options = {}) {\n    if (!isNumber(milliseconds)) {\n      throw new InvalidArgumentError(\n        `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n      );\n    } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n      // this isn't perfect because because we can still end up out of range because of additional shifting, but it's a start\n      return DateTime.invalid(\"Timestamp out of range\");\n    } else {\n      return new DateTime({\n        ts: milliseconds,\n        zone: normalizeZone(options.zone, Settings.defaultZone),\n        loc: Locale.fromObject(options),\n      });\n    }\n  }\n\n  /**\n   * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n   * @param {number} seconds - a number of seconds since 1970 UTC\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n   * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n   * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @return {DateTime}\n   */\n  static fromSeconds(seconds, options = {}) {\n    if (!isNumber(seconds)) {\n      throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n    } else {\n      return new DateTime({\n        ts: seconds * 1000,\n        zone: normalizeZone(options.zone, Settings.defaultZone),\n        loc: Locale.fromObject(options),\n      });\n    }\n  }\n\n  /**\n   * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n   * @param {Object} obj - the object to create the DateTime from\n   * @param {number} obj.year - a year, such as 1987\n   * @param {number} obj.month - a month, 1-12\n   * @param {number} obj.day - a day of the month, 1-31, depending on the month\n   * @param {number} obj.ordinal - day of the year, 1-365 or 366\n   * @param {number} obj.weekYear - an ISO week year\n   * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n   * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n   * @param {number} obj.hour - hour of the day, 0-23\n   * @param {number} obj.minute - minute of the hour, 0-59\n   * @param {number} obj.second - second of the minute, 0-59\n   * @param {number} obj.millisecond - millisecond of the second, 0-999\n   * @param {Object} opts - options for creating this DateTime\n   * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n   * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n   * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n   * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n   * @return {DateTime}\n   */\n  static fromObject(obj, opts = {}) {\n    obj = obj || {};\n    const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n    if (!zoneToUse.isValid) {\n      return DateTime.invalid(unsupportedZone(zoneToUse));\n    }\n\n    const tsNow = Settings.now(),\n      offsetProvis = !isUndefined(opts.specificOffset)\n        ? opts.specificOffset\n        : zoneToUse.offset(tsNow),\n      normalized = normalizeObject(obj, normalizeUnit),\n      containsOrdinal = !isUndefined(normalized.ordinal),\n      containsGregorYear = !isUndefined(normalized.year),\n      containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n      containsGregor = containsGregorYear || containsGregorMD,\n      definiteWeekDef = normalized.weekYear || normalized.weekNumber,\n      loc = Locale.fromObject(opts);\n\n    // cases:\n    // just a weekday -> this week's instance of that weekday, no worries\n    // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n    // (gregorian month or day) + ordinal -> error\n    // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n    if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n      throw new ConflictingSpecificationError(\n        \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n      );\n    }\n\n    if (containsGregorMD && containsOrdinal) {\n      throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n    }\n\n    const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n    // configure ourselves to deal with gregorian dates or week stuff\n    let units,\n      defaultValues,\n      objNow = tsToObj(tsNow, offsetProvis);\n    if (useWeekData) {\n      units = orderedWeekUnits;\n      defaultValues = defaultWeekUnitValues;\n      objNow = gregorianToWeek(objNow);\n    } else if (containsOrdinal) {\n      units = orderedOrdinalUnits;\n      defaultValues = defaultOrdinalUnitValues;\n      objNow = gregorianToOrdinal(objNow);\n    } else {\n      units = orderedUnits;\n      defaultValues = defaultUnitValues;\n    }\n\n    // set default values for missing stuff\n    let foundFirst = false;\n    for (const u of units) {\n      const v = normalized[u];\n      if (!isUndefined(v)) {\n        foundFirst = true;\n      } else if (foundFirst) {\n        normalized[u] = defaultValues[u];\n      } else {\n        normalized[u] = objNow[u];\n      }\n    }\n\n    // make sure the values we have are in range\n    const higherOrderInvalid = useWeekData\n        ? hasInvalidWeekData(normalized)\n        : containsOrdinal\n        ? hasInvalidOrdinalData(normalized)\n        : hasInvalidGregorianData(normalized),\n      invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n    if (invalid) {\n      return DateTime.invalid(invalid);\n    }\n\n    // compute the actual time\n    const gregorian = useWeekData\n        ? weekToGregorian(normalized)\n        : containsOrdinal\n        ? ordinalToGregorian(normalized)\n        : normalized,\n      [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n      inst = new DateTime({\n        ts: tsFinal,\n        zone: zoneToUse,\n        o: offsetFinal,\n        loc,\n      });\n\n    // gregorian data + weekday serves only to validate\n    if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n      return DateTime.invalid(\n        \"mismatched weekday\",\n        `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n      );\n    }\n\n    return inst;\n  }\n\n  /**\n   * Create a DateTime from an ISO 8601 string\n   * @param {string} text - the ISO string\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n   * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n   * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n   * @example DateTime.fromISO('2016-W05-4')\n   * @return {DateTime}\n   */\n  static fromISO(text, opts = {}) {\n    const [vals, parsedZone] = parseISODate(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n  }\n\n  /**\n   * Create a DateTime from an RFC 2822 string\n   * @param {string} text - the RFC 2822 string\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n   * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n   * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n   * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n   * @return {DateTime}\n   */\n  static fromRFC2822(text, opts = {}) {\n    const [vals, parsedZone] = parseRFC2822Date(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n  }\n\n  /**\n   * Create a DateTime from an HTTP header date\n   * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n   * @param {string} text - the HTTP header date\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n   * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n   * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n   * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n   * @example DateTime.fromHTTP('Sun Nov  6 08:49:37 1994')\n   * @return {DateTime}\n   */\n  static fromHTTP(text, opts = {}) {\n    const [vals, parsedZone] = parseHTTPDate(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n  }\n\n  /**\n   * Create a DateTime from an input string and format string.\n   * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n   * @param {string} text - the string to parse\n   * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n   * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n   * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @return {DateTime}\n   */\n  static fromFormat(text, fmt, opts = {}) {\n    if (isUndefined(text) || isUndefined(fmt)) {\n      throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n    }\n\n    const { locale = null, numberingSystem = null } = opts,\n      localeToUse = Locale.fromOpts({\n        locale,\n        numberingSystem,\n        defaultToEN: true,\n      }),\n      [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n    if (invalid) {\n      return DateTime.invalid(invalid);\n    } else {\n      return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n    }\n  }\n\n  /**\n   * @deprecated use fromFormat instead\n   */\n  static fromString(text, fmt, opts = {}) {\n    return DateTime.fromFormat(text, fmt, opts);\n  }\n\n  /**\n   * Create a DateTime from a SQL date, time, or datetime\n   * Defaults to en-US if no locale has been specified, regardless of the system's locale\n   * @param {string} text - the string to parse\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n   * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n   * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @example DateTime.fromSQL('2017-05-15')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n   * @example DateTime.fromSQL('09:12:34.342')\n   * @return {DateTime}\n   */\n  static fromSQL(text, opts = {}) {\n    const [vals, parsedZone] = parseSQL(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n  }\n\n  /**\n   * Create an invalid DateTime.\n   * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent\n   * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n   * @return {DateTime}\n   */\n  static invalid(reason, explanation = null) {\n    if (!reason) {\n      throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n    }\n\n    const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n    if (Settings.throwOnInvalid) {\n      throw new InvalidDateTimeError(invalid);\n    } else {\n      return new DateTime({ invalid });\n    }\n  }\n\n  /**\n   * Check if an object is a DateTime. Works across context boundaries\n   * @param {object} o\n   * @return {boolean}\n   */\n  static isDateTime(o) {\n    return (o && o.isLuxonDateTime) || false;\n  }\n\n  // INFO\n\n  /**\n   * Get the value of unit.\n   * @param {string} unit - a unit such as 'minute' or 'day'\n   * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n   * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n   * @return {number}\n   */\n  get(unit) {\n    return this[unit];\n  }\n\n  /**\n   * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n   * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n   * * The DateTime was created by an operation on another invalid date\n   * @type {boolean}\n   */\n  get isValid() {\n    return this.invalid === null;\n  }\n\n  /**\n   * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n   * @type {string}\n   */\n  get invalidReason() {\n    return this.invalid ? this.invalid.reason : null;\n  }\n\n  /**\n   * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n   * @type {string}\n   */\n  get invalidExplanation() {\n    return this.invalid ? this.invalid.explanation : null;\n  }\n\n  /**\n   * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n   *\n   * @type {string}\n   */\n  get locale() {\n    return this.isValid ? this.loc.locale : null;\n  }\n\n  /**\n   * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n   *\n   * @type {string}\n   */\n  get numberingSystem() {\n    return this.isValid ? this.loc.numberingSystem : null;\n  }\n\n  /**\n   * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n   *\n   * @type {string}\n   */\n  get outputCalendar() {\n    return this.isValid ? this.loc.outputCalendar : null;\n  }\n\n  /**\n   * Get the time zone associated with this DateTime.\n   * @type {Zone}\n   */\n  get zone() {\n    return this._zone;\n  }\n\n  /**\n   * Get the name of the time zone.\n   * @type {string}\n   */\n  get zoneName() {\n    return this.isValid ? this.zone.name : null;\n  }\n\n  /**\n   * Get the year\n   * @example DateTime.local(2017, 5, 25).year //=> 2017\n   * @type {number}\n   */\n  get year() {\n    return this.isValid ? this.c.year : NaN;\n  }\n\n  /**\n   * Get the quarter\n   * @example DateTime.local(2017, 5, 25).quarter //=> 2\n   * @type {number}\n   */\n  get quarter() {\n    return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n  }\n\n  /**\n   * Get the month (1-12).\n   * @example DateTime.local(2017, 5, 25).month //=> 5\n   * @type {number}\n   */\n  get month() {\n    return this.isValid ? this.c.month : NaN;\n  }\n\n  /**\n   * Get the day of the month (1-30ish).\n   * @example DateTime.local(2017, 5, 25).day //=> 25\n   * @type {number}\n   */\n  get day() {\n    return this.isValid ? this.c.day : NaN;\n  }\n\n  /**\n   * Get the hour of the day (0-23).\n   * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n   * @type {number}\n   */\n  get hour() {\n    return this.isValid ? this.c.hour : NaN;\n  }\n\n  /**\n   * Get the minute of the hour (0-59).\n   * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n   * @type {number}\n   */\n  get minute() {\n    return this.isValid ? this.c.minute : NaN;\n  }\n\n  /**\n   * Get the second of the minute (0-59).\n   * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n   * @type {number}\n   */\n  get second() {\n    return this.isValid ? this.c.second : NaN;\n  }\n\n  /**\n   * Get the millisecond of the second (0-999).\n   * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n   * @type {number}\n   */\n  get millisecond() {\n    return this.isValid ? this.c.millisecond : NaN;\n  }\n\n  /**\n   * Get the week year\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n   * @type {number}\n   */\n  get weekYear() {\n    return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n  }\n\n  /**\n   * Get the week number of the week year (1-52ish).\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n   * @type {number}\n   */\n  get weekNumber() {\n    return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n  }\n\n  /**\n   * Get the day of the week.\n   * 1 is Monday and 7 is Sunday\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2014, 11, 31).weekday //=> 4\n   * @type {number}\n   */\n  get weekday() {\n    return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n  }\n\n  /**\n   * Get the ordinal (meaning the day of the year)\n   * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n   * @type {number|DateTime}\n   */\n  get ordinal() {\n    return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n  }\n\n  /**\n   * Get the human readable short month name, such as 'Oct'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n   * @type {string}\n   */\n  get monthShort() {\n    return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n  }\n\n  /**\n   * Get the human readable long month name, such as 'October'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).monthLong //=> October\n   * @type {string}\n   */\n  get monthLong() {\n    return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n  }\n\n  /**\n   * Get the human readable short weekday, such as 'Mon'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n   * @type {string}\n   */\n  get weekdayShort() {\n    return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n  }\n\n  /**\n   * Get the human readable long weekday, such as 'Monday'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n   * @type {string}\n   */\n  get weekdayLong() {\n    return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n  }\n\n  /**\n   * Get the UTC offset of this DateTime in minutes\n   * @example DateTime.now().offset //=> -240\n   * @example DateTime.utc().offset //=> 0\n   * @type {number}\n   */\n  get offset() {\n    return this.isValid ? +this.o : NaN;\n  }\n\n  /**\n   * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n   * Defaults to the system's locale if no locale has been specified\n   * @type {string}\n   */\n  get offsetNameShort() {\n    if (this.isValid) {\n      return this.zone.offsetName(this.ts, {\n        format: \"short\",\n        locale: this.locale,\n      });\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n   * Defaults to the system's locale if no locale has been specified\n   * @type {string}\n   */\n  get offsetNameLong() {\n    if (this.isValid) {\n      return this.zone.offsetName(this.ts, {\n        format: \"long\",\n        locale: this.locale,\n      });\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * Get whether this zone's offset ever changes, as in a DST.\n   * @type {boolean}\n   */\n  get isOffsetFixed() {\n    return this.isValid ? this.zone.isUniversal : null;\n  }\n\n  /**\n   * Get whether the DateTime is in a DST.\n   * @type {boolean}\n   */\n  get isInDST() {\n    if (this.isOffsetFixed) {\n      return false;\n    } else {\n      return (\n        this.offset > this.set({ month: 1 }).offset || this.offset > this.set({ month: 5 }).offset\n      );\n    }\n  }\n\n  /**\n   * Returns true if this DateTime is in a leap year, false otherwise\n   * @example DateTime.local(2016).isInLeapYear //=> true\n   * @example DateTime.local(2013).isInLeapYear //=> false\n   * @type {boolean}\n   */\n  get isInLeapYear() {\n    return isLeapYear(this.year);\n  }\n\n  /**\n   * Returns the number of days in this DateTime's month\n   * @example DateTime.local(2016, 2).daysInMonth //=> 29\n   * @example DateTime.local(2016, 3).daysInMonth //=> 31\n   * @type {number}\n   */\n  get daysInMonth() {\n    return daysInMonth(this.year, this.month);\n  }\n\n  /**\n   * Returns the number of days in this DateTime's year\n   * @example DateTime.local(2016).daysInYear //=> 366\n   * @example DateTime.local(2013).daysInYear //=> 365\n   * @type {number}\n   */\n  get daysInYear() {\n    return this.isValid ? daysInYear(this.year) : NaN;\n  }\n\n  /**\n   * Returns the number of weeks in this DateTime's year\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2004).weeksInWeekYear //=> 53\n   * @example DateTime.local(2013).weeksInWeekYear //=> 52\n   * @type {number}\n   */\n  get weeksInWeekYear() {\n    return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n  }\n\n  /**\n   * Returns the resolved Intl options for this DateTime.\n   * This is useful in understanding the behavior of formatting methods\n   * @param {Object} opts - the same options as toLocaleString\n   * @return {Object}\n   */\n  resolvedLocaleOptions(opts = {}) {\n    const { locale, numberingSystem, calendar } = Formatter.create(\n      this.loc.clone(opts),\n      opts\n    ).resolvedOptions(this);\n    return { locale, numberingSystem, outputCalendar: calendar };\n  }\n\n  // TRANSFORM\n\n  /**\n   * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n   *\n   * Equivalent to {@link DateTime#setZone}('utc')\n   * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n   * @param {Object} [opts={}] - options to pass to `setZone()`\n   * @return {DateTime}\n   */\n  toUTC(offset = 0, opts = {}) {\n    return this.setZone(FixedOffsetZone.instance(offset), opts);\n  }\n\n  /**\n   * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n   *\n   * Equivalent to `setZone('local')`\n   * @return {DateTime}\n   */\n  toLocal() {\n    return this.setZone(Settings.defaultZone);\n  }\n\n  /**\n   * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n   *\n   * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n   * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n   * @param {Object} opts - options\n   * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n   * @return {DateTime}\n   */\n  setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n    zone = normalizeZone(zone, Settings.defaultZone);\n    if (zone.equals(this.zone)) {\n      return this;\n    } else if (!zone.isValid) {\n      return DateTime.invalid(unsupportedZone(zone));\n    } else {\n      let newTS = this.ts;\n      if (keepLocalTime || keepCalendarTime) {\n        const offsetGuess = zone.offset(this.ts);\n        const asObj = this.toObject();\n        [newTS] = objToTS(asObj, offsetGuess, zone);\n      }\n      return clone(this, { ts: newTS, zone });\n    }\n  }\n\n  /**\n   * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n   * @param {Object} properties - the properties to set\n   * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n   * @return {DateTime}\n   */\n  reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n    const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n    return clone(this, { loc });\n  }\n\n  /**\n   * \"Set\" the locale. Returns a newly-constructed DateTime.\n   * Just a convenient alias for reconfigure({ locale })\n   * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n   * @return {DateTime}\n   */\n  setLocale(locale) {\n    return this.reconfigure({ locale });\n  }\n\n  /**\n   * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n   * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n   * @param {Object} values - a mapping of units to numbers\n   * @example dt.set({ year: 2017 })\n   * @example dt.set({ hour: 8, minute: 30 })\n   * @example dt.set({ weekday: 5 })\n   * @example dt.set({ year: 2005, ordinal: 234 })\n   * @return {DateTime}\n   */\n  set(values) {\n    if (!this.isValid) return this;\n\n    const normalized = normalizeObject(values, normalizeUnit),\n      settingWeekStuff =\n        !isUndefined(normalized.weekYear) ||\n        !isUndefined(normalized.weekNumber) ||\n        !isUndefined(normalized.weekday),\n      containsOrdinal = !isUndefined(normalized.ordinal),\n      containsGregorYear = !isUndefined(normalized.year),\n      containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n      containsGregor = containsGregorYear || containsGregorMD,\n      definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n    if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n      throw new ConflictingSpecificationError(\n        \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n      );\n    }\n\n    if (containsGregorMD && containsOrdinal) {\n      throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n    }\n\n    let mixed;\n    if (settingWeekStuff) {\n      mixed = weekToGregorian({ ...gregorianToWeek(this.c), ...normalized });\n    } else if (!isUndefined(normalized.ordinal)) {\n      mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n    } else {\n      mixed = { ...this.toObject(), ...normalized };\n\n      // if we didn't set the day but we ended up on an overflow date,\n      // use the last day of the right month\n      if (isUndefined(normalized.day)) {\n        mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n      }\n    }\n\n    const [ts, o] = objToTS(mixed, this.o, this.zone);\n    return clone(this, { ts, o });\n  }\n\n  /**\n   * Add a period of time to this DateTime and return the resulting DateTime\n   *\n   * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n   * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   * @example DateTime.now().plus(123) //~> in 123 milliseconds\n   * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n   * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n   * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n   * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n   * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n   * @return {DateTime}\n   */\n  plus(duration) {\n    if (!this.isValid) return this;\n    const dur = Duration.fromDurationLike(duration);\n    return clone(this, adjustTime(this, dur));\n  }\n\n  /**\n   * Subtract a period of time to this DateTime and return the resulting DateTime\n   * See {@link DateTime#plus}\n   * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   @return {DateTime}\n   */\n  minus(duration) {\n    if (!this.isValid) return this;\n    const dur = Duration.fromDurationLike(duration).negate();\n    return clone(this, adjustTime(this, dur));\n  }\n\n  /**\n   * \"Set\" this DateTime to the beginning of a unit of time.\n   * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n   * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n   * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n   * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n   * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n   * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n   * @return {DateTime}\n   */\n  startOf(unit) {\n    if (!this.isValid) return this;\n    const o = {},\n      normalizedUnit = Duration.normalizeUnit(unit);\n    switch (normalizedUnit) {\n      case \"years\":\n        o.month = 1;\n      // falls through\n      case \"quarters\":\n      case \"months\":\n        o.day = 1;\n      // falls through\n      case \"weeks\":\n      case \"days\":\n        o.hour = 0;\n      // falls through\n      case \"hours\":\n        o.minute = 0;\n      // falls through\n      case \"minutes\":\n        o.second = 0;\n      // falls through\n      case \"seconds\":\n        o.millisecond = 0;\n        break;\n      case \"milliseconds\":\n        break;\n      // no default, invalid units throw in normalizeUnit()\n    }\n\n    if (normalizedUnit === \"weeks\") {\n      o.weekday = 1;\n    }\n\n    if (normalizedUnit === \"quarters\") {\n      const q = Math.ceil(this.month / 3);\n      o.month = (q - 1) * 3 + 1;\n    }\n\n    return this.set(o);\n  }\n\n  /**\n   * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n   * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n   * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n   * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n   * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n   * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n   * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n   * @return {DateTime}\n   */\n  endOf(unit) {\n    return this.isValid\n      ? this.plus({ [unit]: 1 })\n          .startOf(unit)\n          .minus(1)\n      : this;\n  }\n\n  // OUTPUT\n\n  /**\n   * Returns a string representation of this DateTime formatted according to the specified format string.\n   * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n   * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n   * @param {string} fmt - the format string\n   * @param {Object} opts - opts to override the configuration options on this DateTime\n   * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n   * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n   * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n   * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n   * @return {string}\n   */\n  toFormat(fmt, opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n      : INVALID;\n  }\n\n  /**\n   * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n   * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n   * of the DateTime in the assigned locale.\n   * Defaults to the system's locale if no locale has been specified\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n   * @param {Object} opts - opts to override the configuration options on this DateTime\n   * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n   * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n   * @example DateTime.now().toLocaleString({ locale: 'en-gb' }); //=> '20/04/2017'\n   * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n   * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n   * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n   * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n   * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n   * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n   * @return {string}\n   */\n  toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n      : INVALID;\n  }\n\n  /**\n   * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n   * Defaults to the system's locale if no locale has been specified\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n   * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n   * @example DateTime.now().toLocaleParts(); //=> [\n   *                                   //=>   { type: 'day', value: '25' },\n   *                                   //=>   { type: 'literal', value: '/' },\n   *                                   //=>   { type: 'month', value: '05' },\n   *                                   //=>   { type: 'literal', value: '/' },\n   *                                   //=>   { type: 'year', value: '1982' }\n   *                                   //=> ]\n   */\n  toLocaleParts(opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n      : [];\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime\n   * @param {Object} opts - options\n   * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n   * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n   * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n   * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n   * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n   * @return {string}\n   */\n  toISO({\n    format = \"extended\",\n    suppressSeconds = false,\n    suppressMilliseconds = false,\n    includeOffset = true,\n  } = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    const ext = format === \"extended\";\n\n    let c = toISODate(this, ext);\n    c += \"T\";\n    c += toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset);\n    return c;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime's date component\n   * @param {Object} opts - options\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n   * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n   * @return {string}\n   */\n  toISODate({ format = \"extended\" } = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    return toISODate(this, format === \"extended\");\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime's week date\n   * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n   * @return {string}\n   */\n  toISOWeekDate() {\n    return toTechFormat(this, \"kkkk-'W'WW-c\");\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime's time component\n   * @param {Object} opts - options\n   * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n   * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n   * @return {string}\n   */\n  toISOTime({\n    suppressMilliseconds = false,\n    suppressSeconds = false,\n    includeOffset = true,\n    includePrefix = false,\n    format = \"extended\",\n  } = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    let c = includePrefix ? \"T\" : \"\";\n    return (\n      c +\n      toISOTime(this, format === \"extended\", suppressSeconds, suppressMilliseconds, includeOffset)\n    );\n  }\n\n  /**\n   * Returns an RFC 2822-compatible string representation of this DateTime\n   * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n   * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n   * @return {string}\n   */\n  toRFC2822() {\n    return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n   * Specifically, the string conforms to RFC 1123.\n   * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n   * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n   * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n   * @return {string}\n   */\n  toHTTP() {\n    return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in SQL Date\n   * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n   * @return {string}\n   */\n  toSQLDate() {\n    if (!this.isValid) {\n      return null;\n    }\n    return toISODate(this, true);\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in SQL Time\n   * @param {Object} opts - options\n   * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n   * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n   * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n   * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n   * @return {string}\n   */\n  toSQLTime({ includeOffset = true, includeZone = false } = {}) {\n    let fmt = \"HH:mm:ss.SSS\";\n\n    if (includeZone || includeOffset) {\n      fmt += \" \";\n      if (includeZone) {\n        fmt += \"z\";\n      } else if (includeOffset) {\n        fmt += \"ZZ\";\n      }\n    }\n\n    return toTechFormat(this, fmt, true);\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n   * @param {Object} opts - options\n   * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n   * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n   * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n   * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n   * @return {string}\n   */\n  toSQL(opts = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for debugging\n   * @return {string}\n   */\n  toString() {\n    return this.isValid ? this.toISO() : INVALID;\n  }\n\n  /**\n   * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n   * @return {number}\n   */\n  valueOf() {\n    return this.toMillis();\n  }\n\n  /**\n   * Returns the epoch milliseconds of this DateTime.\n   * @return {number}\n   */\n  toMillis() {\n    return this.isValid ? this.ts : NaN;\n  }\n\n  /**\n   * Returns the epoch seconds of this DateTime.\n   * @return {number}\n   */\n  toSeconds() {\n    return this.isValid ? this.ts / 1000 : NaN;\n  }\n\n  /**\n   * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n   * @return {string}\n   */\n  toJSON() {\n    return this.toISO();\n  }\n\n  /**\n   * Returns a BSON serializable equivalent to this DateTime.\n   * @return {Date}\n   */\n  toBSON() {\n    return this.toJSDate();\n  }\n\n  /**\n   * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n   * @param opts - options for generating the object\n   * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n   * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n   * @return {Object}\n   */\n  toObject(opts = {}) {\n    if (!this.isValid) return {};\n\n    const base = { ...this.c };\n\n    if (opts.includeConfig) {\n      base.outputCalendar = this.outputCalendar;\n      base.numberingSystem = this.loc.numberingSystem;\n      base.locale = this.loc.locale;\n    }\n    return base;\n  }\n\n  /**\n   * Returns a JavaScript Date equivalent to this DateTime.\n   * @return {Date}\n   */\n  toJSDate() {\n    return new Date(this.isValid ? this.ts : NaN);\n  }\n\n  // COMPARE\n\n  /**\n   * Return the difference between two DateTimes as a Duration.\n   * @param {DateTime} otherDateTime - the DateTime to compare this one to\n   * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n   * @param {Object} opts - options that affect the creation of the Duration\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @example\n   * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n   *     i2 = DateTime.fromISO('1983-10-14T10:30');\n   * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n   * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n   * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n   * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n   * @return {Duration}\n   */\n  diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n    if (!this.isValid || !otherDateTime.isValid) {\n      return Duration.invalid(\"created by diffing an invalid DateTime\");\n    }\n\n    const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n    const units = maybeArray(unit).map(Duration.normalizeUnit),\n      otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n      earlier = otherIsLater ? this : otherDateTime,\n      later = otherIsLater ? otherDateTime : this,\n      diffed = diff(earlier, later, units, durOpts);\n\n    return otherIsLater ? diffed.negate() : diffed;\n  }\n\n  /**\n   * Return the difference between this DateTime and right now.\n   * See {@link DateTime#diff}\n   * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n   * @param {Object} opts - options that affect the creation of the Duration\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @return {Duration}\n   */\n  diffNow(unit = \"milliseconds\", opts = {}) {\n    return this.diff(DateTime.now(), unit, opts);\n  }\n\n  /**\n   * Return an Interval spanning between this DateTime and another DateTime\n   * @param {DateTime} otherDateTime - the other end point of the Interval\n   * @return {Interval}\n   */\n  until(otherDateTime) {\n    return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n  }\n\n  /**\n   * Return whether this DateTime is in the same unit of time as another DateTime.\n   * Higher-order units must also be identical for this function to return `true`.\n   * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n   * @param {DateTime} otherDateTime - the other DateTime\n   * @param {string} unit - the unit of time to check sameness on\n   * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n   * @return {boolean}\n   */\n  hasSame(otherDateTime, unit) {\n    if (!this.isValid) return false;\n\n    const inputMs = otherDateTime.valueOf();\n    const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n    return adjustedToZone.startOf(unit) <= inputMs && inputMs <= adjustedToZone.endOf(unit);\n  }\n\n  /**\n   * Equality check\n   * Two DateTimes are equal iff they represent the same millisecond, have the same zone and location, and are both valid.\n   * To compare just the millisecond values, use `+dt1 === +dt2`.\n   * @param {DateTime} other - the other DateTime\n   * @return {boolean}\n   */\n  equals(other) {\n    return (\n      this.isValid &&\n      other.isValid &&\n      this.valueOf() === other.valueOf() &&\n      this.zone.equals(other.zone) &&\n      this.loc.equals(other.loc)\n    );\n  }\n\n  /**\n   * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n   * platform supports Intl.RelativeTimeFormat. Rounds down by default.\n   * @param {Object} options - options that affect the output\n   * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n   * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n   * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n   * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n   * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n   * @param {string} options.locale - override the locale of this DateTime\n   * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n   * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n   * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 d\u00EDa\"\n   * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n   * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n   * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n   * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n   */\n  toRelative(options = {}) {\n    if (!this.isValid) return null;\n    const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n      padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n    let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n    let unit = options.unit;\n    if (Array.isArray(options.unit)) {\n      units = options.unit;\n      unit = undefined;\n    }\n    return diffRelative(base, this.plus(padding), {\n      ...options,\n      numeric: \"always\",\n      units,\n      unit,\n    });\n  }\n\n  /**\n   * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n   * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n   * @param {Object} options - options that affect the output\n   * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n   * @param {string} options.locale - override the locale of this DateTime\n   * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n   * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n   * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n   * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"ma\u00F1ana\"\n   * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n   * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n   */\n  toRelativeCalendar(options = {}) {\n    if (!this.isValid) return null;\n\n    return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n      ...options,\n      numeric: \"auto\",\n      units: [\"years\", \"months\", \"days\"],\n      calendary: true,\n    });\n  }\n\n  /**\n   * Return the min of several date times\n   * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n   * @return {DateTime} the min DateTime, or undefined if called with no argument\n   */\n  static min(...dateTimes) {\n    if (!dateTimes.every(DateTime.isDateTime)) {\n      throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n    }\n    return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n  }\n\n  /**\n   * Return the max of several date times\n   * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n   * @return {DateTime} the max DateTime, or undefined if called with no argument\n   */\n  static max(...dateTimes) {\n    if (!dateTimes.every(DateTime.isDateTime)) {\n      throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n    }\n    return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n  }\n\n  // MISC\n\n  /**\n   * Explain how a string would be parsed by fromFormat()\n   * @param {string} text - the string to parse\n   * @param {string} fmt - the format the string is expected to be in (see description)\n   * @param {Object} options - options taken by fromFormat()\n   * @return {Object}\n   */\n  static fromFormatExplain(text, fmt, options = {}) {\n    const { locale = null, numberingSystem = null } = options,\n      localeToUse = Locale.fromOpts({\n        locale,\n        numberingSystem,\n        defaultToEN: true,\n      });\n    return explainFromTokens(localeToUse, text, fmt);\n  }\n\n  /**\n   * @deprecated use fromFormatExplain instead\n   */\n  static fromStringExplain(text, fmt, options = {}) {\n    return DateTime.fromFormatExplain(text, fmt, options);\n  }\n\n  // FORMAT PRESETS\n\n  /**\n   * {@link DateTime#toLocaleString} format like 10/14/1983\n   * @type {Object}\n   */\n  static get DATE_SHORT() {\n    return Formats.DATE_SHORT;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_MED() {\n    return Formats.DATE_MED;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_MED_WITH_WEEKDAY() {\n    return Formats.DATE_MED_WITH_WEEKDAY;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_FULL() {\n    return Formats.DATE_FULL;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_HUGE() {\n    return Formats.DATE_HUGE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_SIMPLE() {\n    return Formats.TIME_SIMPLE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_WITH_SECONDS() {\n    return Formats.TIME_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_WITH_SHORT_OFFSET() {\n    return Formats.TIME_WITH_SHORT_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_WITH_LONG_OFFSET() {\n    return Formats.TIME_WITH_LONG_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_SIMPLE() {\n    return Formats.TIME_24_SIMPLE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_WITH_SECONDS() {\n    return Formats.TIME_24_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_WITH_SHORT_OFFSET() {\n    return Formats.TIME_24_WITH_SHORT_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_WITH_LONG_OFFSET() {\n    return Formats.TIME_24_WITH_LONG_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_SHORT() {\n    return Formats.DATETIME_SHORT;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_SHORT_WITH_SECONDS() {\n    return Formats.DATETIME_SHORT_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_MED() {\n    return Formats.DATETIME_MED;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_MED_WITH_SECONDS() {\n    return Formats.DATETIME_MED_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_MED_WITH_WEEKDAY() {\n    return Formats.DATETIME_MED_WITH_WEEKDAY;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_FULL() {\n    return Formats.DATETIME_FULL;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_FULL_WITH_SECONDS() {\n    return Formats.DATETIME_FULL_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_HUGE() {\n    return Formats.DATETIME_HUGE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_HUGE_WITH_SECONDS() {\n    return Formats.DATETIME_HUGE_WITH_SECONDS;\n  }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n  if (DateTime.isDateTime(dateTimeish)) {\n    return dateTimeish;\n  } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n    return DateTime.fromJSDate(dateTimeish);\n  } else if (dateTimeish && typeof dateTimeish === \"object\") {\n    return DateTime.fromObject(dateTimeish);\n  } else {\n    throw new InvalidArgumentError(\n      `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n    );\n  }\n}\n", "import DateTime from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Info from \"./info.js\";\nimport Zone from \"./zone.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport InvalidZone from \"./zones/invalidZone.js\";\nimport SystemZone from \"./zones/systemZone.js\";\nimport Settings from \"./settings.js\";\n\nconst VERSION = \"2.3.0\";\n\nexport {\n  VERSION,\n  DateTime,\n  Duration,\n  Interval,\n  Info,\n  Zone,\n  FixedOffsetZone,\n  IANAZone,\n  InvalidZone,\n  SystemZone,\n  Settings,\n};\n", "/*!\n * Cropper.js v1.5.12\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2021-06-12T08:00:17.411Z\n */\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Cropper = factory());\n}(this, (function () { 'use strict';\n\n  function ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n\n    if (Object.getOwnPropertySymbols) {\n      var symbols = Object.getOwnPropertySymbols(object);\n\n      if (enumerableOnly) {\n        symbols = symbols.filter(function (sym) {\n          return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n      }\n\n      keys.push.apply(keys, symbols);\n    }\n\n    return keys;\n  }\n\n  function _objectSpread2(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i] != null ? arguments[i] : {};\n\n      if (i % 2) {\n        ownKeys(Object(source), true).forEach(function (key) {\n          _defineProperty(target, key, source[key]);\n        });\n      } else if (Object.getOwnPropertyDescriptors) {\n        Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n      } else {\n        ownKeys(Object(source)).forEach(function (key) {\n          Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n      }\n    }\n\n    return target;\n  }\n\n  function _typeof(obj) {\n    \"@babel/helpers - typeof\";\n\n    if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n      _typeof = function (obj) {\n        return typeof obj;\n      };\n    } else {\n      _typeof = function (obj) {\n        return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n      };\n    }\n\n    return _typeof(obj);\n  }\n\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  function _toConsumableArray(arr) {\n    return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n  }\n\n  function _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n  }\n\n  function _iterableToArray(iter) {\n    if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n  }\n\n  function _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n  }\n\n  function _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n\n    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n    return arr2;\n  }\n\n  function _nonIterableSpread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n\n  var IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n  var WINDOW = IS_BROWSER ? window : {};\n  var IS_TOUCH_DEVICE = IS_BROWSER && WINDOW.document.documentElement ? 'ontouchstart' in WINDOW.document.documentElement : false;\n  var HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false;\n  var NAMESPACE = 'cropper'; // Actions\n\n  var ACTION_ALL = 'all';\n  var ACTION_CROP = 'crop';\n  var ACTION_MOVE = 'move';\n  var ACTION_ZOOM = 'zoom';\n  var ACTION_EAST = 'e';\n  var ACTION_WEST = 'w';\n  var ACTION_SOUTH = 's';\n  var ACTION_NORTH = 'n';\n  var ACTION_NORTH_EAST = 'ne';\n  var ACTION_NORTH_WEST = 'nw';\n  var ACTION_SOUTH_EAST = 'se';\n  var ACTION_SOUTH_WEST = 'sw'; // Classes\n\n  var CLASS_CROP = \"\".concat(NAMESPACE, \"-crop\");\n  var CLASS_DISABLED = \"\".concat(NAMESPACE, \"-disabled\");\n  var CLASS_HIDDEN = \"\".concat(NAMESPACE, \"-hidden\");\n  var CLASS_HIDE = \"\".concat(NAMESPACE, \"-hide\");\n  var CLASS_INVISIBLE = \"\".concat(NAMESPACE, \"-invisible\");\n  var CLASS_MODAL = \"\".concat(NAMESPACE, \"-modal\");\n  var CLASS_MOVE = \"\".concat(NAMESPACE, \"-move\"); // Data keys\n\n  var DATA_ACTION = \"\".concat(NAMESPACE, \"Action\");\n  var DATA_PREVIEW = \"\".concat(NAMESPACE, \"Preview\"); // Drag modes\n\n  var DRAG_MODE_CROP = 'crop';\n  var DRAG_MODE_MOVE = 'move';\n  var DRAG_MODE_NONE = 'none'; // Events\n\n  var EVENT_CROP = 'crop';\n  var EVENT_CROP_END = 'cropend';\n  var EVENT_CROP_MOVE = 'cropmove';\n  var EVENT_CROP_START = 'cropstart';\n  var EVENT_DBLCLICK = 'dblclick';\n  var EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown';\n  var EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove';\n  var EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup';\n  var EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START;\n  var EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE;\n  var EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END;\n  var EVENT_READY = 'ready';\n  var EVENT_RESIZE = 'resize';\n  var EVENT_WHEEL = 'wheel';\n  var EVENT_ZOOM = 'zoom'; // Mime types\n\n  var MIME_TYPE_JPEG = 'image/jpeg'; // RegExps\n\n  var REGEXP_ACTIONS = /^e|w|s|n|se|sw|ne|nw|all|crop|move|zoom$/;\n  var REGEXP_DATA_URL = /^data:/;\n  var REGEXP_DATA_URL_JPEG = /^data:image\\/jpeg;base64,/;\n  var REGEXP_TAG_NAME = /^img|canvas$/i; // Misc\n  // Inspired by the default width and height of a canvas element.\n\n  var MIN_CONTAINER_WIDTH = 200;\n  var MIN_CONTAINER_HEIGHT = 100;\n\n  var DEFAULTS = {\n    // Define the view mode of the cropper\n    viewMode: 0,\n    // 0, 1, 2, 3\n    // Define the dragging mode of the cropper\n    dragMode: DRAG_MODE_CROP,\n    // 'crop', 'move' or 'none'\n    // Define the initial aspect ratio of the crop box\n    initialAspectRatio: NaN,\n    // Define the aspect ratio of the crop box\n    aspectRatio: NaN,\n    // An object with the previous cropping result data\n    data: null,\n    // A selector for adding extra containers to preview\n    preview: '',\n    // Re-render the cropper when resize the window\n    responsive: true,\n    // Restore the cropped area after resize the window\n    restore: true,\n    // Check if the current image is a cross-origin image\n    checkCrossOrigin: true,\n    // Check the current image's Exif Orientation information\n    checkOrientation: true,\n    // Show the black modal\n    modal: true,\n    // Show the dashed lines for guiding\n    guides: true,\n    // Show the center indicator for guiding\n    center: true,\n    // Show the white modal to highlight the crop box\n    highlight: true,\n    // Show the grid background\n    background: true,\n    // Enable to crop the image automatically when initialize\n    autoCrop: true,\n    // Define the percentage of automatic cropping area when initializes\n    autoCropArea: 0.8,\n    // Enable to move the image\n    movable: true,\n    // Enable to rotate the image\n    rotatable: true,\n    // Enable to scale the image\n    scalable: true,\n    // Enable to zoom the image\n    zoomable: true,\n    // Enable to zoom the image by dragging touch\n    zoomOnTouch: true,\n    // Enable to zoom the image by wheeling mouse\n    zoomOnWheel: true,\n    // Define zoom ratio when zoom the image by wheeling mouse\n    wheelZoomRatio: 0.1,\n    // Enable to move the crop box\n    cropBoxMovable: true,\n    // Enable to resize the crop box\n    cropBoxResizable: true,\n    // Toggle drag mode between \"crop\" and \"move\" when click twice on the cropper\n    toggleDragModeOnDblclick: true,\n    // Size limitation\n    minCanvasWidth: 0,\n    minCanvasHeight: 0,\n    minCropBoxWidth: 0,\n    minCropBoxHeight: 0,\n    minContainerWidth: MIN_CONTAINER_WIDTH,\n    minContainerHeight: MIN_CONTAINER_HEIGHT,\n    // Shortcuts of events\n    ready: null,\n    cropstart: null,\n    cropmove: null,\n    cropend: null,\n    crop: null,\n    zoom: null\n  };\n\n  var TEMPLATE = '<div class=\"cropper-container\" touch-action=\"none\">' + '<div class=\"cropper-wrap-box\">' + '<div class=\"cropper-canvas\"></div>' + '</div>' + '<div class=\"cropper-drag-box\"></div>' + '<div class=\"cropper-crop-box\">' + '<span class=\"cropper-view-box\"></span>' + '<span class=\"cropper-dashed dashed-h\"></span>' + '<span class=\"cropper-dashed dashed-v\"></span>' + '<span class=\"cropper-center\"></span>' + '<span class=\"cropper-face\"></span>' + '<span class=\"cropper-line line-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-line line-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-line line-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-line line-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-point point-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-point point-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-point point-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-ne\" data-cropper-action=\"ne\"></span>' + '<span class=\"cropper-point point-nw\" data-cropper-action=\"nw\"></span>' + '<span class=\"cropper-point point-sw\" data-cropper-action=\"sw\"></span>' + '<span class=\"cropper-point point-se\" data-cropper-action=\"se\"></span>' + '</div>' + '</div>';\n\n  /**\n   * Check if the given value is not a number.\n   */\n\n  var isNaN = Number.isNaN || WINDOW.isNaN;\n  /**\n   * Check if the given value is a number.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a number, else `false`.\n   */\n\n  function isNumber(value) {\n    return typeof value === 'number' && !isNaN(value);\n  }\n  /**\n   * Check if the given value is a positive number.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a positive number, else `false`.\n   */\n\n  var isPositiveNumber = function isPositiveNumber(value) {\n    return value > 0 && value < Infinity;\n  };\n  /**\n   * Check if the given value is undefined.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is undefined, else `false`.\n   */\n\n  function isUndefined(value) {\n    return typeof value === 'undefined';\n  }\n  /**\n   * Check if the given value is an object.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is an object, else `false`.\n   */\n\n  function isObject(value) {\n    return _typeof(value) === 'object' && value !== null;\n  }\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n  /**\n   * Check if the given value is a plain object.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a plain object, else `false`.\n   */\n\n  function isPlainObject(value) {\n    if (!isObject(value)) {\n      return false;\n    }\n\n    try {\n      var _constructor = value.constructor;\n      var prototype = _constructor.prototype;\n      return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf');\n    } catch (error) {\n      return false;\n    }\n  }\n  /**\n   * Check if the given value is a function.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a function, else `false`.\n   */\n\n  function isFunction(value) {\n    return typeof value === 'function';\n  }\n  var slice = Array.prototype.slice;\n  /**\n   * Convert array-like or iterable object to an array.\n   * @param {*} value - The value to convert.\n   * @returns {Array} Returns a new array.\n   */\n\n  function toArray(value) {\n    return Array.from ? Array.from(value) : slice.call(value);\n  }\n  /**\n   * Iterate the given data.\n   * @param {*} data - The data to iterate.\n   * @param {Function} callback - The process function for each element.\n   * @returns {*} The original data.\n   */\n\n  function forEach(data, callback) {\n    if (data && isFunction(callback)) {\n      if (Array.isArray(data) || isNumber(data.length)\n      /* array-like */\n      ) {\n          toArray(data).forEach(function (value, key) {\n            callback.call(data, value, key, data);\n          });\n        } else if (isObject(data)) {\n        Object.keys(data).forEach(function (key) {\n          callback.call(data, data[key], key, data);\n        });\n      }\n    }\n\n    return data;\n  }\n  /**\n   * Extend the given object.\n   * @param {*} target - The target object to extend.\n   * @param {*} args - The rest objects for merging to the target object.\n   * @returns {Object} The extended object.\n   */\n\n  var assign = Object.assign || function assign(target) {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    if (isObject(target) && args.length > 0) {\n      args.forEach(function (arg) {\n        if (isObject(arg)) {\n          Object.keys(arg).forEach(function (key) {\n            target[key] = arg[key];\n          });\n        }\n      });\n    }\n\n    return target;\n  };\n  var REGEXP_DECIMALS = /\\.\\d*(?:0|9){12}\\d*$/;\n  /**\n   * Normalize decimal number.\n   * Check out {@link https://0.30000000000000004.com/}\n   * @param {number} value - The value to normalize.\n   * @param {number} [times=100000000000] - The times for normalizing.\n   * @returns {number} Returns the normalized number.\n   */\n\n  function normalizeDecimalNumber(value) {\n    var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000;\n    return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value;\n  }\n  var REGEXP_SUFFIX = /^width|height|left|top|marginLeft|marginTop$/;\n  /**\n   * Apply styles to the given element.\n   * @param {Element} element - The target element.\n   * @param {Object} styles - The styles for applying.\n   */\n\n  function setStyle(element, styles) {\n    var style = element.style;\n    forEach(styles, function (value, property) {\n      if (REGEXP_SUFFIX.test(property) && isNumber(value)) {\n        value = \"\".concat(value, \"px\");\n      }\n\n      style[property] = value;\n    });\n  }\n  /**\n   * Check if the given element has a special class.\n   * @param {Element} element - The element to check.\n   * @param {string} value - The class to search.\n   * @returns {boolean} Returns `true` if the special class was found.\n   */\n\n  function hasClass(element, value) {\n    return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1;\n  }\n  /**\n   * Add classes to the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be added.\n   */\n\n  function addClass(element, value) {\n    if (!value) {\n      return;\n    }\n\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        addClass(elem, value);\n      });\n      return;\n    }\n\n    if (element.classList) {\n      element.classList.add(value);\n      return;\n    }\n\n    var className = element.className.trim();\n\n    if (!className) {\n      element.className = value;\n    } else if (className.indexOf(value) < 0) {\n      element.className = \"\".concat(className, \" \").concat(value);\n    }\n  }\n  /**\n   * Remove classes from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be removed.\n   */\n\n  function removeClass(element, value) {\n    if (!value) {\n      return;\n    }\n\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        removeClass(elem, value);\n      });\n      return;\n    }\n\n    if (element.classList) {\n      element.classList.remove(value);\n      return;\n    }\n\n    if (element.className.indexOf(value) >= 0) {\n      element.className = element.className.replace(value, '');\n    }\n  }\n  /**\n   * Add or remove classes from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be toggled.\n   * @param {boolean} added - Add only.\n   */\n\n  function toggleClass(element, value, added) {\n    if (!value) {\n      return;\n    }\n\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        toggleClass(elem, value, added);\n      });\n      return;\n    } // IE10-11 doesn't support the second parameter of `classList.toggle`\n\n\n    if (added) {\n      addClass(element, value);\n    } else {\n      removeClass(element, value);\n    }\n  }\n  var REGEXP_CAMEL_CASE = /([a-z\\d])([A-Z])/g;\n  /**\n   * Transform the given string from camelCase to kebab-case\n   * @param {string} value - The value to transform.\n   * @returns {string} The transformed value.\n   */\n\n  function toParamCase(value) {\n    return value.replace(REGEXP_CAMEL_CASE, '$1-$2').toLowerCase();\n  }\n  /**\n   * Get data from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to get.\n   * @returns {string} The data value.\n   */\n\n  function getData(element, name) {\n    if (isObject(element[name])) {\n      return element[name];\n    }\n\n    if (element.dataset) {\n      return element.dataset[name];\n    }\n\n    return element.getAttribute(\"data-\".concat(toParamCase(name)));\n  }\n  /**\n   * Set data to the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to set.\n   * @param {string} data - The data value.\n   */\n\n  function setData(element, name, data) {\n    if (isObject(data)) {\n      element[name] = data;\n    } else if (element.dataset) {\n      element.dataset[name] = data;\n    } else {\n      element.setAttribute(\"data-\".concat(toParamCase(name)), data);\n    }\n  }\n  /**\n   * Remove data from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to remove.\n   */\n\n  function removeData(element, name) {\n    if (isObject(element[name])) {\n      try {\n        delete element[name];\n      } catch (error) {\n        element[name] = undefined;\n      }\n    } else if (element.dataset) {\n      // #128 Safari not allows to delete dataset property\n      try {\n        delete element.dataset[name];\n      } catch (error) {\n        element.dataset[name] = undefined;\n      }\n    } else {\n      element.removeAttribute(\"data-\".concat(toParamCase(name)));\n    }\n  }\n  var REGEXP_SPACES = /\\s\\s*/;\n\n  var onceSupported = function () {\n    var supported = false;\n\n    if (IS_BROWSER) {\n      var once = false;\n\n      var listener = function listener() {};\n\n      var options = Object.defineProperty({}, 'once', {\n        get: function get() {\n          supported = true;\n          return once;\n        },\n\n        /**\n         * This setter can fix a `TypeError` in strict mode\n         * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only}\n         * @param {boolean} value - The value to set\n         */\n        set: function set(value) {\n          once = value;\n        }\n      });\n      WINDOW.addEventListener('test', listener, options);\n      WINDOW.removeEventListener('test', listener, options);\n    }\n\n    return supported;\n  }();\n  /**\n   * Remove event listener from the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Function} listener - The event listener.\n   * @param {Object} options - The event options.\n   */\n\n\n  function removeListener(element, type, listener) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var handler = listener;\n    type.trim().split(REGEXP_SPACES).forEach(function (event) {\n      if (!onceSupported) {\n        var listeners = element.listeners;\n\n        if (listeners && listeners[event] && listeners[event][listener]) {\n          handler = listeners[event][listener];\n          delete listeners[event][listener];\n\n          if (Object.keys(listeners[event]).length === 0) {\n            delete listeners[event];\n          }\n\n          if (Object.keys(listeners).length === 0) {\n            delete element.listeners;\n          }\n        }\n      }\n\n      element.removeEventListener(event, handler, options);\n    });\n  }\n  /**\n   * Add event listener to the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Function} listener - The event listener.\n   * @param {Object} options - The event options.\n   */\n\n  function addListener(element, type, listener) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var _handler = listener;\n    type.trim().split(REGEXP_SPACES).forEach(function (event) {\n      if (options.once && !onceSupported) {\n        var _element$listeners = element.listeners,\n            listeners = _element$listeners === void 0 ? {} : _element$listeners;\n\n        _handler = function handler() {\n          delete listeners[event][listener];\n          element.removeEventListener(event, _handler, options);\n\n          for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n            args[_key2] = arguments[_key2];\n          }\n\n          listener.apply(element, args);\n        };\n\n        if (!listeners[event]) {\n          listeners[event] = {};\n        }\n\n        if (listeners[event][listener]) {\n          element.removeEventListener(event, listeners[event][listener], options);\n        }\n\n        listeners[event][listener] = _handler;\n        element.listeners = listeners;\n      }\n\n      element.addEventListener(event, _handler, options);\n    });\n  }\n  /**\n   * Dispatch event on the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Object} data - The additional event data.\n   * @returns {boolean} Indicate if the event is default prevented or not.\n   */\n\n  function dispatchEvent(element, type, data) {\n    var event; // Event and CustomEvent on IE9-11 are global objects, not constructors\n\n    if (isFunction(Event) && isFunction(CustomEvent)) {\n      event = new CustomEvent(type, {\n        detail: data,\n        bubbles: true,\n        cancelable: true\n      });\n    } else {\n      event = document.createEvent('CustomEvent');\n      event.initCustomEvent(type, true, true, data);\n    }\n\n    return element.dispatchEvent(event);\n  }\n  /**\n   * Get the offset base on the document.\n   * @param {Element} element - The target element.\n   * @returns {Object} The offset data.\n   */\n\n  function getOffset(element) {\n    var box = element.getBoundingClientRect();\n    return {\n      left: box.left + (window.pageXOffset - document.documentElement.clientLeft),\n      top: box.top + (window.pageYOffset - document.documentElement.clientTop)\n    };\n  }\n  var location = WINDOW.location;\n  var REGEXP_ORIGINS = /^(\\w+:)\\/\\/([^:/?#]*):?(\\d*)/i;\n  /**\n   * Check if the given URL is a cross origin URL.\n   * @param {string} url - The target URL.\n   * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`.\n   */\n\n  function isCrossOriginURL(url) {\n    var parts = url.match(REGEXP_ORIGINS);\n    return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port);\n  }\n  /**\n   * Add timestamp to the given URL.\n   * @param {string} url - The target URL.\n   * @returns {string} The result URL.\n   */\n\n  function addTimestamp(url) {\n    var timestamp = \"timestamp=\".concat(new Date().getTime());\n    return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp;\n  }\n  /**\n   * Get transforms base on the given object.\n   * @param {Object} obj - The target object.\n   * @returns {string} A string contains transform values.\n   */\n\n  function getTransforms(_ref) {\n    var rotate = _ref.rotate,\n        scaleX = _ref.scaleX,\n        scaleY = _ref.scaleY,\n        translateX = _ref.translateX,\n        translateY = _ref.translateY;\n    var values = [];\n\n    if (isNumber(translateX) && translateX !== 0) {\n      values.push(\"translateX(\".concat(translateX, \"px)\"));\n    }\n\n    if (isNumber(translateY) && translateY !== 0) {\n      values.push(\"translateY(\".concat(translateY, \"px)\"));\n    } // Rotate should come first before scale to match orientation transform\n\n\n    if (isNumber(rotate) && rotate !== 0) {\n      values.push(\"rotate(\".concat(rotate, \"deg)\"));\n    }\n\n    if (isNumber(scaleX) && scaleX !== 1) {\n      values.push(\"scaleX(\".concat(scaleX, \")\"));\n    }\n\n    if (isNumber(scaleY) && scaleY !== 1) {\n      values.push(\"scaleY(\".concat(scaleY, \")\"));\n    }\n\n    var transform = values.length ? values.join(' ') : 'none';\n    return {\n      WebkitTransform: transform,\n      msTransform: transform,\n      transform: transform\n    };\n  }\n  /**\n   * Get the max ratio of a group of pointers.\n   * @param {string} pointers - The target pointers.\n   * @returns {number} The result ratio.\n   */\n\n  function getMaxZoomRatio(pointers) {\n    var pointers2 = _objectSpread2({}, pointers);\n\n    var maxRatio = 0;\n    forEach(pointers, function (pointer, pointerId) {\n      delete pointers2[pointerId];\n      forEach(pointers2, function (pointer2) {\n        var x1 = Math.abs(pointer.startX - pointer2.startX);\n        var y1 = Math.abs(pointer.startY - pointer2.startY);\n        var x2 = Math.abs(pointer.endX - pointer2.endX);\n        var y2 = Math.abs(pointer.endY - pointer2.endY);\n        var z1 = Math.sqrt(x1 * x1 + y1 * y1);\n        var z2 = Math.sqrt(x2 * x2 + y2 * y2);\n        var ratio = (z2 - z1) / z1;\n\n        if (Math.abs(ratio) > Math.abs(maxRatio)) {\n          maxRatio = ratio;\n        }\n      });\n    });\n    return maxRatio;\n  }\n  /**\n   * Get a pointer from an event object.\n   * @param {Object} event - The target event object.\n   * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not.\n   * @returns {Object} The result pointer contains start and/or end point coordinates.\n   */\n\n  function getPointer(_ref2, endOnly) {\n    var pageX = _ref2.pageX,\n        pageY = _ref2.pageY;\n    var end = {\n      endX: pageX,\n      endY: pageY\n    };\n    return endOnly ? end : _objectSpread2({\n      startX: pageX,\n      startY: pageY\n    }, end);\n  }\n  /**\n   * Get the center point coordinate of a group of pointers.\n   * @param {Object} pointers - The target pointers.\n   * @returns {Object} The center point coordinate.\n   */\n\n  function getPointersCenter(pointers) {\n    var pageX = 0;\n    var pageY = 0;\n    var count = 0;\n    forEach(pointers, function (_ref3) {\n      var startX = _ref3.startX,\n          startY = _ref3.startY;\n      pageX += startX;\n      pageY += startY;\n      count += 1;\n    });\n    pageX /= count;\n    pageY /= count;\n    return {\n      pageX: pageX,\n      pageY: pageY\n    };\n  }\n  /**\n   * Get the max sizes in a rectangle under the given aspect ratio.\n   * @param {Object} data - The original sizes.\n   * @param {string} [type='contain'] - The adjust type.\n   * @returns {Object} The result sizes.\n   */\n\n  function getAdjustedSizes(_ref4) // or 'cover'\n  {\n    var aspectRatio = _ref4.aspectRatio,\n        height = _ref4.height,\n        width = _ref4.width;\n    var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain';\n    var isValidWidth = isPositiveNumber(width);\n    var isValidHeight = isPositiveNumber(height);\n\n    if (isValidWidth && isValidHeight) {\n      var adjustedWidth = height * aspectRatio;\n\n      if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) {\n        height = width / aspectRatio;\n      } else {\n        width = height * aspectRatio;\n      }\n    } else if (isValidWidth) {\n      height = width / aspectRatio;\n    } else if (isValidHeight) {\n      width = height * aspectRatio;\n    }\n\n    return {\n      width: width,\n      height: height\n    };\n  }\n  /**\n   * Get the new sizes of a rectangle after rotated.\n   * @param {Object} data - The original sizes.\n   * @returns {Object} The result sizes.\n   */\n\n  function getRotatedSizes(_ref5) {\n    var width = _ref5.width,\n        height = _ref5.height,\n        degree = _ref5.degree;\n    degree = Math.abs(degree) % 180;\n\n    if (degree === 90) {\n      return {\n        width: height,\n        height: width\n      };\n    }\n\n    var arc = degree % 90 * Math.PI / 180;\n    var sinArc = Math.sin(arc);\n    var cosArc = Math.cos(arc);\n    var newWidth = width * cosArc + height * sinArc;\n    var newHeight = width * sinArc + height * cosArc;\n    return degree > 90 ? {\n      width: newHeight,\n      height: newWidth\n    } : {\n      width: newWidth,\n      height: newHeight\n    };\n  }\n  /**\n   * Get a canvas which drew the given image.\n   * @param {HTMLImageElement} image - The image for drawing.\n   * @param {Object} imageData - The image data.\n   * @param {Object} canvasData - The canvas data.\n   * @param {Object} options - The options.\n   * @returns {HTMLCanvasElement} The result canvas.\n   */\n\n  function getSourceCanvas(image, _ref6, _ref7, _ref8) {\n    var imageAspectRatio = _ref6.aspectRatio,\n        imageNaturalWidth = _ref6.naturalWidth,\n        imageNaturalHeight = _ref6.naturalHeight,\n        _ref6$rotate = _ref6.rotate,\n        rotate = _ref6$rotate === void 0 ? 0 : _ref6$rotate,\n        _ref6$scaleX = _ref6.scaleX,\n        scaleX = _ref6$scaleX === void 0 ? 1 : _ref6$scaleX,\n        _ref6$scaleY = _ref6.scaleY,\n        scaleY = _ref6$scaleY === void 0 ? 1 : _ref6$scaleY;\n    var aspectRatio = _ref7.aspectRatio,\n        naturalWidth = _ref7.naturalWidth,\n        naturalHeight = _ref7.naturalHeight;\n    var _ref8$fillColor = _ref8.fillColor,\n        fillColor = _ref8$fillColor === void 0 ? 'transparent' : _ref8$fillColor,\n        _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled,\n        imageSmoothingEnabled = _ref8$imageSmoothingE === void 0 ? true : _ref8$imageSmoothingE,\n        _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality,\n        imageSmoothingQuality = _ref8$imageSmoothingQ === void 0 ? 'low' : _ref8$imageSmoothingQ,\n        _ref8$maxWidth = _ref8.maxWidth,\n        maxWidth = _ref8$maxWidth === void 0 ? Infinity : _ref8$maxWidth,\n        _ref8$maxHeight = _ref8.maxHeight,\n        maxHeight = _ref8$maxHeight === void 0 ? Infinity : _ref8$maxHeight,\n        _ref8$minWidth = _ref8.minWidth,\n        minWidth = _ref8$minWidth === void 0 ? 0 : _ref8$minWidth,\n        _ref8$minHeight = _ref8.minHeight,\n        minHeight = _ref8$minHeight === void 0 ? 0 : _ref8$minHeight;\n    var canvas = document.createElement('canvas');\n    var context = canvas.getContext('2d');\n    var maxSizes = getAdjustedSizes({\n      aspectRatio: aspectRatio,\n      width: maxWidth,\n      height: maxHeight\n    });\n    var minSizes = getAdjustedSizes({\n      aspectRatio: aspectRatio,\n      width: minWidth,\n      height: minHeight\n    }, 'cover');\n    var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth));\n    var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight)); // Note: should always use image's natural sizes for drawing as\n    // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90\n\n    var destMaxSizes = getAdjustedSizes({\n      aspectRatio: imageAspectRatio,\n      width: maxWidth,\n      height: maxHeight\n    });\n    var destMinSizes = getAdjustedSizes({\n      aspectRatio: imageAspectRatio,\n      width: minWidth,\n      height: minHeight\n    }, 'cover');\n    var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth));\n    var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight));\n    var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight];\n    canvas.width = normalizeDecimalNumber(width);\n    canvas.height = normalizeDecimalNumber(height);\n    context.fillStyle = fillColor;\n    context.fillRect(0, 0, width, height);\n    context.save();\n    context.translate(width / 2, height / 2);\n    context.rotate(rotate * Math.PI / 180);\n    context.scale(scaleX, scaleY);\n    context.imageSmoothingEnabled = imageSmoothingEnabled;\n    context.imageSmoothingQuality = imageSmoothingQuality;\n    context.drawImage.apply(context, [image].concat(_toConsumableArray(params.map(function (param) {\n      return Math.floor(normalizeDecimalNumber(param));\n    }))));\n    context.restore();\n    return canvas;\n  }\n  var fromCharCode = String.fromCharCode;\n  /**\n   * Get string from char code in data view.\n   * @param {DataView} dataView - The data view for read.\n   * @param {number} start - The start index.\n   * @param {number} length - The read length.\n   * @returns {string} The read result.\n   */\n\n  function getStringFromCharCode(dataView, start, length) {\n    var str = '';\n    length += start;\n\n    for (var i = start; i < length; i += 1) {\n      str += fromCharCode(dataView.getUint8(i));\n    }\n\n    return str;\n  }\n  var REGEXP_DATA_URL_HEAD = /^data:.*,/;\n  /**\n   * Transform Data URL to array buffer.\n   * @param {string} dataURL - The Data URL to transform.\n   * @returns {ArrayBuffer} The result array buffer.\n   */\n\n  function dataURLToArrayBuffer(dataURL) {\n    var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, '');\n    var binary = atob(base64);\n    var arrayBuffer = new ArrayBuffer(binary.length);\n    var uint8 = new Uint8Array(arrayBuffer);\n    forEach(uint8, function (value, i) {\n      uint8[i] = binary.charCodeAt(i);\n    });\n    return arrayBuffer;\n  }\n  /**\n   * Transform array buffer to Data URL.\n   * @param {ArrayBuffer} arrayBuffer - The array buffer to transform.\n   * @param {string} mimeType - The mime type of the Data URL.\n   * @returns {string} The result Data URL.\n   */\n\n  function arrayBufferToDataURL(arrayBuffer, mimeType) {\n    var chunks = []; // Chunk Typed Array for better performance (#435)\n\n    var chunkSize = 8192;\n    var uint8 = new Uint8Array(arrayBuffer);\n\n    while (uint8.length > 0) {\n      // XXX: Babel's `toConsumableArray` helper will throw error in IE or Safari 9\n      // eslint-disable-next-line prefer-spread\n      chunks.push(fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize))));\n      uint8 = uint8.subarray(chunkSize);\n    }\n\n    return \"data:\".concat(mimeType, \";base64,\").concat(btoa(chunks.join('')));\n  }\n  /**\n   * Get orientation value from given array buffer.\n   * @param {ArrayBuffer} arrayBuffer - The array buffer to read.\n   * @returns {number} The read orientation value.\n   */\n\n  function resetAndGetOrientation(arrayBuffer) {\n    var dataView = new DataView(arrayBuffer);\n    var orientation; // Ignores range error when the image does not have correct Exif information\n\n    try {\n      var littleEndian;\n      var app1Start;\n      var ifdStart; // Only handle JPEG image (start by 0xFFD8)\n\n      if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) {\n        var length = dataView.byteLength;\n        var offset = 2;\n\n        while (offset + 1 < length) {\n          if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) {\n            app1Start = offset;\n            break;\n          }\n\n          offset += 1;\n        }\n      }\n\n      if (app1Start) {\n        var exifIDCode = app1Start + 4;\n        var tiffOffset = app1Start + 10;\n\n        if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {\n          var endianness = dataView.getUint16(tiffOffset);\n          littleEndian = endianness === 0x4949;\n\n          if (littleEndian || endianness === 0x4D4D\n          /* bigEndian */\n          ) {\n              if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) {\n                var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\n\n                if (firstIFDOffset >= 0x00000008) {\n                  ifdStart = tiffOffset + firstIFDOffset;\n                }\n              }\n            }\n        }\n      }\n\n      if (ifdStart) {\n        var _length = dataView.getUint16(ifdStart, littleEndian);\n\n        var _offset;\n\n        var i;\n\n        for (i = 0; i < _length; i += 1) {\n          _offset = ifdStart + i * 12 + 2;\n\n          if (dataView.getUint16(_offset, littleEndian) === 0x0112\n          /* Orientation */\n          ) {\n              // 8 is the offset of the current tag's value\n              _offset += 8; // Get the original orientation value\n\n              orientation = dataView.getUint16(_offset, littleEndian); // Override the orientation with its default value\n\n              dataView.setUint16(_offset, 1, littleEndian);\n              break;\n            }\n        }\n      }\n    } catch (error) {\n      orientation = 1;\n    }\n\n    return orientation;\n  }\n  /**\n   * Parse Exif Orientation value.\n   * @param {number} orientation - The orientation to parse.\n   * @returns {Object} The parsed result.\n   */\n\n  function parseOrientation(orientation) {\n    var rotate = 0;\n    var scaleX = 1;\n    var scaleY = 1;\n\n    switch (orientation) {\n      // Flip horizontal\n      case 2:\n        scaleX = -1;\n        break;\n      // Rotate left 180\u00B0\n\n      case 3:\n        rotate = -180;\n        break;\n      // Flip vertical\n\n      case 4:\n        scaleY = -1;\n        break;\n      // Flip vertical and rotate right 90\u00B0\n\n      case 5:\n        rotate = 90;\n        scaleY = -1;\n        break;\n      // Rotate right 90\u00B0\n\n      case 6:\n        rotate = 90;\n        break;\n      // Flip horizontal and rotate right 90\u00B0\n\n      case 7:\n        rotate = 90;\n        scaleX = -1;\n        break;\n      // Rotate left 90\u00B0\n\n      case 8:\n        rotate = -90;\n        break;\n    }\n\n    return {\n      rotate: rotate,\n      scaleX: scaleX,\n      scaleY: scaleY\n    };\n  }\n\n  var render = {\n    render: function render() {\n      this.initContainer();\n      this.initCanvas();\n      this.initCropBox();\n      this.renderCanvas();\n\n      if (this.cropped) {\n        this.renderCropBox();\n      }\n    },\n    initContainer: function initContainer() {\n      var element = this.element,\n          options = this.options,\n          container = this.container,\n          cropper = this.cropper;\n      var minWidth = Number(options.minContainerWidth);\n      var minHeight = Number(options.minContainerHeight);\n      addClass(cropper, CLASS_HIDDEN);\n      removeClass(element, CLASS_HIDDEN);\n      var containerData = {\n        width: Math.max(container.offsetWidth, minWidth >= 0 ? minWidth : MIN_CONTAINER_WIDTH),\n        height: Math.max(container.offsetHeight, minHeight >= 0 ? minHeight : MIN_CONTAINER_HEIGHT)\n      };\n      this.containerData = containerData;\n      setStyle(cropper, {\n        width: containerData.width,\n        height: containerData.height\n      });\n      addClass(element, CLASS_HIDDEN);\n      removeClass(cropper, CLASS_HIDDEN);\n    },\n    // Canvas (image wrapper)\n    initCanvas: function initCanvas() {\n      var containerData = this.containerData,\n          imageData = this.imageData;\n      var viewMode = this.options.viewMode;\n      var rotated = Math.abs(imageData.rotate) % 180 === 90;\n      var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth;\n      var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight;\n      var aspectRatio = naturalWidth / naturalHeight;\n      var canvasWidth = containerData.width;\n      var canvasHeight = containerData.height;\n\n      if (containerData.height * aspectRatio > containerData.width) {\n        if (viewMode === 3) {\n          canvasWidth = containerData.height * aspectRatio;\n        } else {\n          canvasHeight = containerData.width / aspectRatio;\n        }\n      } else if (viewMode === 3) {\n        canvasHeight = containerData.width / aspectRatio;\n      } else {\n        canvasWidth = containerData.height * aspectRatio;\n      }\n\n      var canvasData = {\n        aspectRatio: aspectRatio,\n        naturalWidth: naturalWidth,\n        naturalHeight: naturalHeight,\n        width: canvasWidth,\n        height: canvasHeight\n      };\n      this.canvasData = canvasData;\n      this.limited = viewMode === 1 || viewMode === 2;\n      this.limitCanvas(true, true);\n      canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n      canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n      canvasData.left = (containerData.width - canvasData.width) / 2;\n      canvasData.top = (containerData.height - canvasData.height) / 2;\n      canvasData.oldLeft = canvasData.left;\n      canvasData.oldTop = canvasData.top;\n      this.initialCanvasData = assign({}, canvasData);\n    },\n    limitCanvas: function limitCanvas(sizeLimited, positionLimited) {\n      var options = this.options,\n          containerData = this.containerData,\n          canvasData = this.canvasData,\n          cropBoxData = this.cropBoxData;\n      var viewMode = options.viewMode;\n      var aspectRatio = canvasData.aspectRatio;\n      var cropped = this.cropped && cropBoxData;\n\n      if (sizeLimited) {\n        var minCanvasWidth = Number(options.minCanvasWidth) || 0;\n        var minCanvasHeight = Number(options.minCanvasHeight) || 0;\n\n        if (viewMode > 1) {\n          minCanvasWidth = Math.max(minCanvasWidth, containerData.width);\n          minCanvasHeight = Math.max(minCanvasHeight, containerData.height);\n\n          if (viewMode === 3) {\n            if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n              minCanvasWidth = minCanvasHeight * aspectRatio;\n            } else {\n              minCanvasHeight = minCanvasWidth / aspectRatio;\n            }\n          }\n        } else if (viewMode > 0) {\n          if (minCanvasWidth) {\n            minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0);\n          } else if (minCanvasHeight) {\n            minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0);\n          } else if (cropped) {\n            minCanvasWidth = cropBoxData.width;\n            minCanvasHeight = cropBoxData.height;\n\n            if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n              minCanvasWidth = minCanvasHeight * aspectRatio;\n            } else {\n              minCanvasHeight = minCanvasWidth / aspectRatio;\n            }\n          }\n        }\n\n        var _getAdjustedSizes = getAdjustedSizes({\n          aspectRatio: aspectRatio,\n          width: minCanvasWidth,\n          height: minCanvasHeight\n        });\n\n        minCanvasWidth = _getAdjustedSizes.width;\n        minCanvasHeight = _getAdjustedSizes.height;\n        canvasData.minWidth = minCanvasWidth;\n        canvasData.minHeight = minCanvasHeight;\n        canvasData.maxWidth = Infinity;\n        canvasData.maxHeight = Infinity;\n      }\n\n      if (positionLimited) {\n        if (viewMode > (cropped ? 0 : 1)) {\n          var newCanvasLeft = containerData.width - canvasData.width;\n          var newCanvasTop = containerData.height - canvasData.height;\n          canvasData.minLeft = Math.min(0, newCanvasLeft);\n          canvasData.minTop = Math.min(0, newCanvasTop);\n          canvasData.maxLeft = Math.max(0, newCanvasLeft);\n          canvasData.maxTop = Math.max(0, newCanvasTop);\n\n          if (cropped && this.limited) {\n            canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width));\n            canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height));\n            canvasData.maxLeft = cropBoxData.left;\n            canvasData.maxTop = cropBoxData.top;\n\n            if (viewMode === 2) {\n              if (canvasData.width >= containerData.width) {\n                canvasData.minLeft = Math.min(0, newCanvasLeft);\n                canvasData.maxLeft = Math.max(0, newCanvasLeft);\n              }\n\n              if (canvasData.height >= containerData.height) {\n                canvasData.minTop = Math.min(0, newCanvasTop);\n                canvasData.maxTop = Math.max(0, newCanvasTop);\n              }\n            }\n          }\n        } else {\n          canvasData.minLeft = -canvasData.width;\n          canvasData.minTop = -canvasData.height;\n          canvasData.maxLeft = containerData.width;\n          canvasData.maxTop = containerData.height;\n        }\n      }\n    },\n    renderCanvas: function renderCanvas(changed, transformed) {\n      var canvasData = this.canvasData,\n          imageData = this.imageData;\n\n      if (transformed) {\n        var _getRotatedSizes = getRotatedSizes({\n          width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1),\n          height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1),\n          degree: imageData.rotate || 0\n        }),\n            naturalWidth = _getRotatedSizes.width,\n            naturalHeight = _getRotatedSizes.height;\n\n        var width = canvasData.width * (naturalWidth / canvasData.naturalWidth);\n        var height = canvasData.height * (naturalHeight / canvasData.naturalHeight);\n        canvasData.left -= (width - canvasData.width) / 2;\n        canvasData.top -= (height - canvasData.height) / 2;\n        canvasData.width = width;\n        canvasData.height = height;\n        canvasData.aspectRatio = naturalWidth / naturalHeight;\n        canvasData.naturalWidth = naturalWidth;\n        canvasData.naturalHeight = naturalHeight;\n        this.limitCanvas(true, false);\n      }\n\n      if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) {\n        canvasData.left = canvasData.oldLeft;\n      }\n\n      if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) {\n        canvasData.top = canvasData.oldTop;\n      }\n\n      canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n      canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n      this.limitCanvas(false, true);\n      canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft);\n      canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop);\n      canvasData.oldLeft = canvasData.left;\n      canvasData.oldTop = canvasData.top;\n      setStyle(this.canvas, assign({\n        width: canvasData.width,\n        height: canvasData.height\n      }, getTransforms({\n        translateX: canvasData.left,\n        translateY: canvasData.top\n      })));\n      this.renderImage(changed);\n\n      if (this.cropped && this.limited) {\n        this.limitCropBox(true, true);\n      }\n    },\n    renderImage: function renderImage(changed) {\n      var canvasData = this.canvasData,\n          imageData = this.imageData;\n      var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth);\n      var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight);\n      assign(imageData, {\n        width: width,\n        height: height,\n        left: (canvasData.width - width) / 2,\n        top: (canvasData.height - height) / 2\n      });\n      setStyle(this.image, assign({\n        width: imageData.width,\n        height: imageData.height\n      }, getTransforms(assign({\n        translateX: imageData.left,\n        translateY: imageData.top\n      }, imageData))));\n\n      if (changed) {\n        this.output();\n      }\n    },\n    initCropBox: function initCropBox() {\n      var options = this.options,\n          canvasData = this.canvasData;\n      var aspectRatio = options.aspectRatio || options.initialAspectRatio;\n      var autoCropArea = Number(options.autoCropArea) || 0.8;\n      var cropBoxData = {\n        width: canvasData.width,\n        height: canvasData.height\n      };\n\n      if (aspectRatio) {\n        if (canvasData.height * aspectRatio > canvasData.width) {\n          cropBoxData.height = cropBoxData.width / aspectRatio;\n        } else {\n          cropBoxData.width = cropBoxData.height * aspectRatio;\n        }\n      }\n\n      this.cropBoxData = cropBoxData;\n      this.limitCropBox(true, true); // Initialize auto crop area\n\n      cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n      cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight); // The width/height of auto crop area must large than \"minWidth/Height\"\n\n      cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea);\n      cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea);\n      cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2;\n      cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2;\n      cropBoxData.oldLeft = cropBoxData.left;\n      cropBoxData.oldTop = cropBoxData.top;\n      this.initialCropBoxData = assign({}, cropBoxData);\n    },\n    limitCropBox: function limitCropBox(sizeLimited, positionLimited) {\n      var options = this.options,\n          containerData = this.containerData,\n          canvasData = this.canvasData,\n          cropBoxData = this.cropBoxData,\n          limited = this.limited;\n      var aspectRatio = options.aspectRatio;\n\n      if (sizeLimited) {\n        var minCropBoxWidth = Number(options.minCropBoxWidth) || 0;\n        var minCropBoxHeight = Number(options.minCropBoxHeight) || 0;\n        var maxCropBoxWidth = limited ? Math.min(containerData.width, canvasData.width, canvasData.width + canvasData.left, containerData.width - canvasData.left) : containerData.width;\n        var maxCropBoxHeight = limited ? Math.min(containerData.height, canvasData.height, canvasData.height + canvasData.top, containerData.height - canvasData.top) : containerData.height; // The min/maxCropBoxWidth/Height must be less than container's width/height\n\n        minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width);\n        minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height);\n\n        if (aspectRatio) {\n          if (minCropBoxWidth && minCropBoxHeight) {\n            if (minCropBoxHeight * aspectRatio > minCropBoxWidth) {\n              minCropBoxHeight = minCropBoxWidth / aspectRatio;\n            } else {\n              minCropBoxWidth = minCropBoxHeight * aspectRatio;\n            }\n          } else if (minCropBoxWidth) {\n            minCropBoxHeight = minCropBoxWidth / aspectRatio;\n          } else if (minCropBoxHeight) {\n            minCropBoxWidth = minCropBoxHeight * aspectRatio;\n          }\n\n          if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) {\n            maxCropBoxHeight = maxCropBoxWidth / aspectRatio;\n          } else {\n            maxCropBoxWidth = maxCropBoxHeight * aspectRatio;\n          }\n        } // The minWidth/Height must be less than maxWidth/Height\n\n\n        cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth);\n        cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight);\n        cropBoxData.maxWidth = maxCropBoxWidth;\n        cropBoxData.maxHeight = maxCropBoxHeight;\n      }\n\n      if (positionLimited) {\n        if (limited) {\n          cropBoxData.minLeft = Math.max(0, canvasData.left);\n          cropBoxData.minTop = Math.max(0, canvasData.top);\n          cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width;\n          cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height;\n        } else {\n          cropBoxData.minLeft = 0;\n          cropBoxData.minTop = 0;\n          cropBoxData.maxLeft = containerData.width - cropBoxData.width;\n          cropBoxData.maxTop = containerData.height - cropBoxData.height;\n        }\n      }\n    },\n    renderCropBox: function renderCropBox() {\n      var options = this.options,\n          containerData = this.containerData,\n          cropBoxData = this.cropBoxData;\n\n      if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) {\n        cropBoxData.left = cropBoxData.oldLeft;\n      }\n\n      if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) {\n        cropBoxData.top = cropBoxData.oldTop;\n      }\n\n      cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n      cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n      this.limitCropBox(false, true);\n      cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft);\n      cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop);\n      cropBoxData.oldLeft = cropBoxData.left;\n      cropBoxData.oldTop = cropBoxData.top;\n\n      if (options.movable && options.cropBoxMovable) {\n        // Turn to move the canvas when the crop box is equal to the container\n        setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL);\n      }\n\n      setStyle(this.cropBox, assign({\n        width: cropBoxData.width,\n        height: cropBoxData.height\n      }, getTransforms({\n        translateX: cropBoxData.left,\n        translateY: cropBoxData.top\n      })));\n\n      if (this.cropped && this.limited) {\n        this.limitCanvas(true, true);\n      }\n\n      if (!this.disabled) {\n        this.output();\n      }\n    },\n    output: function output() {\n      this.preview();\n      dispatchEvent(this.element, EVENT_CROP, this.getData());\n    }\n  };\n\n  var preview = {\n    initPreview: function initPreview() {\n      var element = this.element,\n          crossOrigin = this.crossOrigin;\n      var preview = this.options.preview;\n      var url = crossOrigin ? this.crossOriginUrl : this.url;\n      var alt = element.alt || 'The image to preview';\n      var image = document.createElement('img');\n\n      if (crossOrigin) {\n        image.crossOrigin = crossOrigin;\n      }\n\n      image.src = url;\n      image.alt = alt;\n      this.viewBox.appendChild(image);\n      this.viewBoxImage = image;\n\n      if (!preview) {\n        return;\n      }\n\n      var previews = preview;\n\n      if (typeof preview === 'string') {\n        previews = element.ownerDocument.querySelectorAll(preview);\n      } else if (preview.querySelector) {\n        previews = [preview];\n      }\n\n      this.previews = previews;\n      forEach(previews, function (el) {\n        var img = document.createElement('img'); // Save the original size for recover\n\n        setData(el, DATA_PREVIEW, {\n          width: el.offsetWidth,\n          height: el.offsetHeight,\n          html: el.innerHTML\n        });\n\n        if (crossOrigin) {\n          img.crossOrigin = crossOrigin;\n        }\n\n        img.src = url;\n        img.alt = alt;\n        /**\n         * Override img element styles\n         * Add `display:block` to avoid margin top issue\n         * Add `height:auto` to override `height` attribute on IE8\n         * (Occur only when margin-top <= -height)\n         */\n\n        img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;\"';\n        el.innerHTML = '';\n        el.appendChild(img);\n      });\n    },\n    resetPreview: function resetPreview() {\n      forEach(this.previews, function (element) {\n        var data = getData(element, DATA_PREVIEW);\n        setStyle(element, {\n          width: data.width,\n          height: data.height\n        });\n        element.innerHTML = data.html;\n        removeData(element, DATA_PREVIEW);\n      });\n    },\n    preview: function preview() {\n      var imageData = this.imageData,\n          canvasData = this.canvasData,\n          cropBoxData = this.cropBoxData;\n      var cropBoxWidth = cropBoxData.width,\n          cropBoxHeight = cropBoxData.height;\n      var width = imageData.width,\n          height = imageData.height;\n      var left = cropBoxData.left - canvasData.left - imageData.left;\n      var top = cropBoxData.top - canvasData.top - imageData.top;\n\n      if (!this.cropped || this.disabled) {\n        return;\n      }\n\n      setStyle(this.viewBoxImage, assign({\n        width: width,\n        height: height\n      }, getTransforms(assign({\n        translateX: -left,\n        translateY: -top\n      }, imageData))));\n      forEach(this.previews, function (element) {\n        var data = getData(element, DATA_PREVIEW);\n        var originalWidth = data.width;\n        var originalHeight = data.height;\n        var newWidth = originalWidth;\n        var newHeight = originalHeight;\n        var ratio = 1;\n\n        if (cropBoxWidth) {\n          ratio = originalWidth / cropBoxWidth;\n          newHeight = cropBoxHeight * ratio;\n        }\n\n        if (cropBoxHeight && newHeight > originalHeight) {\n          ratio = originalHeight / cropBoxHeight;\n          newWidth = cropBoxWidth * ratio;\n          newHeight = originalHeight;\n        }\n\n        setStyle(element, {\n          width: newWidth,\n          height: newHeight\n        });\n        setStyle(element.getElementsByTagName('img')[0], assign({\n          width: width * ratio,\n          height: height * ratio\n        }, getTransforms(assign({\n          translateX: -left * ratio,\n          translateY: -top * ratio\n        }, imageData))));\n      });\n    }\n  };\n\n  var events = {\n    bind: function bind() {\n      var element = this.element,\n          options = this.options,\n          cropper = this.cropper;\n\n      if (isFunction(options.cropstart)) {\n        addListener(element, EVENT_CROP_START, options.cropstart);\n      }\n\n      if (isFunction(options.cropmove)) {\n        addListener(element, EVENT_CROP_MOVE, options.cropmove);\n      }\n\n      if (isFunction(options.cropend)) {\n        addListener(element, EVENT_CROP_END, options.cropend);\n      }\n\n      if (isFunction(options.crop)) {\n        addListener(element, EVENT_CROP, options.crop);\n      }\n\n      if (isFunction(options.zoom)) {\n        addListener(element, EVENT_ZOOM, options.zoom);\n      }\n\n      addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this));\n\n      if (options.zoomable && options.zoomOnWheel) {\n        addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this), {\n          passive: false,\n          capture: true\n        });\n      }\n\n      if (options.toggleDragModeOnDblclick) {\n        addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this));\n      }\n\n      addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this));\n      addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this));\n\n      if (options.responsive) {\n        addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this));\n      }\n    },\n    unbind: function unbind() {\n      var element = this.element,\n          options = this.options,\n          cropper = this.cropper;\n\n      if (isFunction(options.cropstart)) {\n        removeListener(element, EVENT_CROP_START, options.cropstart);\n      }\n\n      if (isFunction(options.cropmove)) {\n        removeListener(element, EVENT_CROP_MOVE, options.cropmove);\n      }\n\n      if (isFunction(options.cropend)) {\n        removeListener(element, EVENT_CROP_END, options.cropend);\n      }\n\n      if (isFunction(options.crop)) {\n        removeListener(element, EVENT_CROP, options.crop);\n      }\n\n      if (isFunction(options.zoom)) {\n        removeListener(element, EVENT_ZOOM, options.zoom);\n      }\n\n      removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart);\n\n      if (options.zoomable && options.zoomOnWheel) {\n        removeListener(cropper, EVENT_WHEEL, this.onWheel, {\n          passive: false,\n          capture: true\n        });\n      }\n\n      if (options.toggleDragModeOnDblclick) {\n        removeListener(cropper, EVENT_DBLCLICK, this.onDblclick);\n      }\n\n      removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove);\n      removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd);\n\n      if (options.responsive) {\n        removeListener(window, EVENT_RESIZE, this.onResize);\n      }\n    }\n  };\n\n  var handlers = {\n    resize: function resize() {\n      if (this.disabled) {\n        return;\n      }\n\n      var options = this.options,\n          container = this.container,\n          containerData = this.containerData;\n      var ratioX = container.offsetWidth / containerData.width;\n      var ratioY = container.offsetHeight / containerData.height;\n      var ratio = Math.abs(ratioX - 1) > Math.abs(ratioY - 1) ? ratioX : ratioY; // Resize when width changed or height changed\n\n      if (ratio !== 1) {\n        var canvasData;\n        var cropBoxData;\n\n        if (options.restore) {\n          canvasData = this.getCanvasData();\n          cropBoxData = this.getCropBoxData();\n        }\n\n        this.render();\n\n        if (options.restore) {\n          this.setCanvasData(forEach(canvasData, function (n, i) {\n            canvasData[i] = n * ratio;\n          }));\n          this.setCropBoxData(forEach(cropBoxData, function (n, i) {\n            cropBoxData[i] = n * ratio;\n          }));\n        }\n      }\n    },\n    dblclick: function dblclick() {\n      if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) {\n        return;\n      }\n\n      this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP);\n    },\n    wheel: function wheel(event) {\n      var _this = this;\n\n      var ratio = Number(this.options.wheelZoomRatio) || 0.1;\n      var delta = 1;\n\n      if (this.disabled) {\n        return;\n      }\n\n      event.preventDefault(); // Limit wheel speed to prevent zoom too fast (#21)\n\n      if (this.wheeling) {\n        return;\n      }\n\n      this.wheeling = true;\n      setTimeout(function () {\n        _this.wheeling = false;\n      }, 50);\n\n      if (event.deltaY) {\n        delta = event.deltaY > 0 ? 1 : -1;\n      } else if (event.wheelDelta) {\n        delta = -event.wheelDelta / 120;\n      } else if (event.detail) {\n        delta = event.detail > 0 ? 1 : -1;\n      }\n\n      this.zoom(-delta * ratio, event);\n    },\n    cropStart: function cropStart(event) {\n      var buttons = event.buttons,\n          button = event.button;\n\n      if (this.disabled // Handle mouse event and pointer event and ignore touch event\n      || (event.type === 'mousedown' || event.type === 'pointerdown' && event.pointerType === 'mouse') && ( // No primary button (Usually the left button)\n      isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0 // Open context menu\n      || event.ctrlKey)) {\n        return;\n      }\n\n      var options = this.options,\n          pointers = this.pointers;\n      var action;\n\n      if (event.changedTouches) {\n        // Handle touch event\n        forEach(event.changedTouches, function (touch) {\n          pointers[touch.identifier] = getPointer(touch);\n        });\n      } else {\n        // Handle mouse event and pointer event\n        pointers[event.pointerId || 0] = getPointer(event);\n      }\n\n      if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) {\n        action = ACTION_ZOOM;\n      } else {\n        action = getData(event.target, DATA_ACTION);\n      }\n\n      if (!REGEXP_ACTIONS.test(action)) {\n        return;\n      }\n\n      if (dispatchEvent(this.element, EVENT_CROP_START, {\n        originalEvent: event,\n        action: action\n      }) === false) {\n        return;\n      } // This line is required for preventing page zooming in iOS browsers\n\n\n      event.preventDefault();\n      this.action = action;\n      this.cropping = false;\n\n      if (action === ACTION_CROP) {\n        this.cropping = true;\n        addClass(this.dragBox, CLASS_MODAL);\n      }\n    },\n    cropMove: function cropMove(event) {\n      var action = this.action;\n\n      if (this.disabled || !action) {\n        return;\n      }\n\n      var pointers = this.pointers;\n      event.preventDefault();\n\n      if (dispatchEvent(this.element, EVENT_CROP_MOVE, {\n        originalEvent: event,\n        action: action\n      }) === false) {\n        return;\n      }\n\n      if (event.changedTouches) {\n        forEach(event.changedTouches, function (touch) {\n          // The first parameter should not be undefined (#432)\n          assign(pointers[touch.identifier] || {}, getPointer(touch, true));\n        });\n      } else {\n        assign(pointers[event.pointerId || 0] || {}, getPointer(event, true));\n      }\n\n      this.change(event);\n    },\n    cropEnd: function cropEnd(event) {\n      if (this.disabled) {\n        return;\n      }\n\n      var action = this.action,\n          pointers = this.pointers;\n\n      if (event.changedTouches) {\n        forEach(event.changedTouches, function (touch) {\n          delete pointers[touch.identifier];\n        });\n      } else {\n        delete pointers[event.pointerId || 0];\n      }\n\n      if (!action) {\n        return;\n      }\n\n      event.preventDefault();\n\n      if (!Object.keys(pointers).length) {\n        this.action = '';\n      }\n\n      if (this.cropping) {\n        this.cropping = false;\n        toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal);\n      }\n\n      dispatchEvent(this.element, EVENT_CROP_END, {\n        originalEvent: event,\n        action: action\n      });\n    }\n  };\n\n  var change = {\n    change: function change(event) {\n      var options = this.options,\n          canvasData = this.canvasData,\n          containerData = this.containerData,\n          cropBoxData = this.cropBoxData,\n          pointers = this.pointers;\n      var action = this.action;\n      var aspectRatio = options.aspectRatio;\n      var left = cropBoxData.left,\n          top = cropBoxData.top,\n          width = cropBoxData.width,\n          height = cropBoxData.height;\n      var right = left + width;\n      var bottom = top + height;\n      var minLeft = 0;\n      var minTop = 0;\n      var maxWidth = containerData.width;\n      var maxHeight = containerData.height;\n      var renderable = true;\n      var offset; // Locking aspect ratio in \"free mode\" by holding shift key\n\n      if (!aspectRatio && event.shiftKey) {\n        aspectRatio = width && height ? width / height : 1;\n      }\n\n      if (this.limited) {\n        minLeft = cropBoxData.minLeft;\n        minTop = cropBoxData.minTop;\n        maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width);\n        maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height);\n      }\n\n      var pointer = pointers[Object.keys(pointers)[0]];\n      var range = {\n        x: pointer.endX - pointer.startX,\n        y: pointer.endY - pointer.startY\n      };\n\n      var check = function check(side) {\n        switch (side) {\n          case ACTION_EAST:\n            if (right + range.x > maxWidth) {\n              range.x = maxWidth - right;\n            }\n\n            break;\n\n          case ACTION_WEST:\n            if (left + range.x < minLeft) {\n              range.x = minLeft - left;\n            }\n\n            break;\n\n          case ACTION_NORTH:\n            if (top + range.y < minTop) {\n              range.y = minTop - top;\n            }\n\n            break;\n\n          case ACTION_SOUTH:\n            if (bottom + range.y > maxHeight) {\n              range.y = maxHeight - bottom;\n            }\n\n            break;\n        }\n      };\n\n      switch (action) {\n        // Move crop box\n        case ACTION_ALL:\n          left += range.x;\n          top += range.y;\n          break;\n        // Resize crop box\n\n        case ACTION_EAST:\n          if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n            renderable = false;\n            break;\n          }\n\n          check(ACTION_EAST);\n          width += range.x;\n\n          if (width < 0) {\n            action = ACTION_WEST;\n            width = -width;\n            left -= width;\n          }\n\n          if (aspectRatio) {\n            height = width / aspectRatio;\n            top += (cropBoxData.height - height) / 2;\n          }\n\n          break;\n\n        case ACTION_NORTH:\n          if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n            renderable = false;\n            break;\n          }\n\n          check(ACTION_NORTH);\n          height -= range.y;\n          top += range.y;\n\n          if (height < 0) {\n            action = ACTION_SOUTH;\n            height = -height;\n            top -= height;\n          }\n\n          if (aspectRatio) {\n            width = height * aspectRatio;\n            left += (cropBoxData.width - width) / 2;\n          }\n\n          break;\n\n        case ACTION_WEST:\n          if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n            renderable = false;\n            break;\n          }\n\n          check(ACTION_WEST);\n          width -= range.x;\n          left += range.x;\n\n          if (width < 0) {\n            action = ACTION_EAST;\n            width = -width;\n            left -= width;\n          }\n\n          if (aspectRatio) {\n            height = width / aspectRatio;\n            top += (cropBoxData.height - height) / 2;\n          }\n\n          break;\n\n        case ACTION_SOUTH:\n          if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n            renderable = false;\n            break;\n          }\n\n          check(ACTION_SOUTH);\n          height += range.y;\n\n          if (height < 0) {\n            action = ACTION_NORTH;\n            height = -height;\n            top -= height;\n          }\n\n          if (aspectRatio) {\n            width = height * aspectRatio;\n            left += (cropBoxData.width - width) / 2;\n          }\n\n          break;\n\n        case ACTION_NORTH_EAST:\n          if (aspectRatio) {\n            if (range.y <= 0 && (top <= minTop || right >= maxWidth)) {\n              renderable = false;\n              break;\n            }\n\n            check(ACTION_NORTH);\n            height -= range.y;\n            top += range.y;\n            width = height * aspectRatio;\n          } else {\n            check(ACTION_NORTH);\n            check(ACTION_EAST);\n\n            if (range.x >= 0) {\n              if (right < maxWidth) {\n                width += range.x;\n              } else if (range.y <= 0 && top <= minTop) {\n                renderable = false;\n              }\n            } else {\n              width += range.x;\n            }\n\n            if (range.y <= 0) {\n              if (top > minTop) {\n                height -= range.y;\n                top += range.y;\n              }\n            } else {\n              height -= range.y;\n              top += range.y;\n            }\n          }\n\n          if (width < 0 && height < 0) {\n            action = ACTION_SOUTH_WEST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_NORTH_WEST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_SOUTH_EAST;\n            height = -height;\n            top -= height;\n          }\n\n          break;\n\n        case ACTION_NORTH_WEST:\n          if (aspectRatio) {\n            if (range.y <= 0 && (top <= minTop || left <= minLeft)) {\n              renderable = false;\n              break;\n            }\n\n            check(ACTION_NORTH);\n            height -= range.y;\n            top += range.y;\n            width = height * aspectRatio;\n            left += cropBoxData.width - width;\n          } else {\n            check(ACTION_NORTH);\n            check(ACTION_WEST);\n\n            if (range.x <= 0) {\n              if (left > minLeft) {\n                width -= range.x;\n                left += range.x;\n              } else if (range.y <= 0 && top <= minTop) {\n                renderable = false;\n              }\n            } else {\n              width -= range.x;\n              left += range.x;\n            }\n\n            if (range.y <= 0) {\n              if (top > minTop) {\n                height -= range.y;\n                top += range.y;\n              }\n            } else {\n              height -= range.y;\n              top += range.y;\n            }\n          }\n\n          if (width < 0 && height < 0) {\n            action = ACTION_SOUTH_EAST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_NORTH_EAST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_SOUTH_WEST;\n            height = -height;\n            top -= height;\n          }\n\n          break;\n\n        case ACTION_SOUTH_WEST:\n          if (aspectRatio) {\n            if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) {\n              renderable = false;\n              break;\n            }\n\n            check(ACTION_WEST);\n            width -= range.x;\n            left += range.x;\n            height = width / aspectRatio;\n          } else {\n            check(ACTION_SOUTH);\n            check(ACTION_WEST);\n\n            if (range.x <= 0) {\n              if (left > minLeft) {\n                width -= range.x;\n                left += range.x;\n              } else if (range.y >= 0 && bottom >= maxHeight) {\n                renderable = false;\n              }\n            } else {\n              width -= range.x;\n              left += range.x;\n            }\n\n            if (range.y >= 0) {\n              if (bottom < maxHeight) {\n                height += range.y;\n              }\n            } else {\n              height += range.y;\n            }\n          }\n\n          if (width < 0 && height < 0) {\n            action = ACTION_NORTH_EAST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_SOUTH_EAST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_NORTH_WEST;\n            height = -height;\n            top -= height;\n          }\n\n          break;\n\n        case ACTION_SOUTH_EAST:\n          if (aspectRatio) {\n            if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) {\n              renderable = false;\n              break;\n            }\n\n            check(ACTION_EAST);\n            width += range.x;\n            height = width / aspectRatio;\n          } else {\n            check(ACTION_SOUTH);\n            check(ACTION_EAST);\n\n            if (range.x >= 0) {\n              if (right < maxWidth) {\n                width += range.x;\n              } else if (range.y >= 0 && bottom >= maxHeight) {\n                renderable = false;\n              }\n            } else {\n              width += range.x;\n            }\n\n            if (range.y >= 0) {\n              if (bottom < maxHeight) {\n                height += range.y;\n              }\n            } else {\n              height += range.y;\n            }\n          }\n\n          if (width < 0 && height < 0) {\n            action = ACTION_NORTH_WEST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_SOUTH_WEST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_NORTH_EAST;\n            height = -height;\n            top -= height;\n          }\n\n          break;\n        // Move canvas\n\n        case ACTION_MOVE:\n          this.move(range.x, range.y);\n          renderable = false;\n          break;\n        // Zoom canvas\n\n        case ACTION_ZOOM:\n          this.zoom(getMaxZoomRatio(pointers), event);\n          renderable = false;\n          break;\n        // Create crop box\n\n        case ACTION_CROP:\n          if (!range.x || !range.y) {\n            renderable = false;\n            break;\n          }\n\n          offset = getOffset(this.cropper);\n          left = pointer.startX - offset.left;\n          top = pointer.startY - offset.top;\n          width = cropBoxData.minWidth;\n          height = cropBoxData.minHeight;\n\n          if (range.x > 0) {\n            action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST;\n          } else if (range.x < 0) {\n            left -= width;\n            action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST;\n          }\n\n          if (range.y < 0) {\n            top -= height;\n          } // Show the crop box if is hidden\n\n\n          if (!this.cropped) {\n            removeClass(this.cropBox, CLASS_HIDDEN);\n            this.cropped = true;\n\n            if (this.limited) {\n              this.limitCropBox(true, true);\n            }\n          }\n\n          break;\n      }\n\n      if (renderable) {\n        cropBoxData.width = width;\n        cropBoxData.height = height;\n        cropBoxData.left = left;\n        cropBoxData.top = top;\n        this.action = action;\n        this.renderCropBox();\n      } // Override\n\n\n      forEach(pointers, function (p) {\n        p.startX = p.endX;\n        p.startY = p.endY;\n      });\n    }\n  };\n\n  var methods = {\n    // Show the crop box manually\n    crop: function crop() {\n      if (this.ready && !this.cropped && !this.disabled) {\n        this.cropped = true;\n        this.limitCropBox(true, true);\n\n        if (this.options.modal) {\n          addClass(this.dragBox, CLASS_MODAL);\n        }\n\n        removeClass(this.cropBox, CLASS_HIDDEN);\n        this.setCropBoxData(this.initialCropBoxData);\n      }\n\n      return this;\n    },\n    // Reset the image and crop box to their initial states\n    reset: function reset() {\n      if (this.ready && !this.disabled) {\n        this.imageData = assign({}, this.initialImageData);\n        this.canvasData = assign({}, this.initialCanvasData);\n        this.cropBoxData = assign({}, this.initialCropBoxData);\n        this.renderCanvas();\n\n        if (this.cropped) {\n          this.renderCropBox();\n        }\n      }\n\n      return this;\n    },\n    // Clear the crop box\n    clear: function clear() {\n      if (this.cropped && !this.disabled) {\n        assign(this.cropBoxData, {\n          left: 0,\n          top: 0,\n          width: 0,\n          height: 0\n        });\n        this.cropped = false;\n        this.renderCropBox();\n        this.limitCanvas(true, true); // Render canvas after crop box rendered\n\n        this.renderCanvas();\n        removeClass(this.dragBox, CLASS_MODAL);\n        addClass(this.cropBox, CLASS_HIDDEN);\n      }\n\n      return this;\n    },\n\n    /**\n     * Replace the image's src and rebuild the cropper\n     * @param {string} url - The new URL.\n     * @param {boolean} [hasSameSize] - Indicate if the new image has the same size as the old one.\n     * @returns {Cropper} this\n     */\n    replace: function replace(url) {\n      var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (!this.disabled && url) {\n        if (this.isImg) {\n          this.element.src = url;\n        }\n\n        if (hasSameSize) {\n          this.url = url;\n          this.image.src = url;\n\n          if (this.ready) {\n            this.viewBoxImage.src = url;\n            forEach(this.previews, function (element) {\n              element.getElementsByTagName('img')[0].src = url;\n            });\n          }\n        } else {\n          if (this.isImg) {\n            this.replaced = true;\n          }\n\n          this.options.data = null;\n          this.uncreate();\n          this.load(url);\n        }\n      }\n\n      return this;\n    },\n    // Enable (unfreeze) the cropper\n    enable: function enable() {\n      if (this.ready && this.disabled) {\n        this.disabled = false;\n        removeClass(this.cropper, CLASS_DISABLED);\n      }\n\n      return this;\n    },\n    // Disable (freeze) the cropper\n    disable: function disable() {\n      if (this.ready && !this.disabled) {\n        this.disabled = true;\n        addClass(this.cropper, CLASS_DISABLED);\n      }\n\n      return this;\n    },\n\n    /**\n     * Destroy the cropper and remove the instance from the image\n     * @returns {Cropper} this\n     */\n    destroy: function destroy() {\n      var element = this.element;\n\n      if (!element[NAMESPACE]) {\n        return this;\n      }\n\n      element[NAMESPACE] = undefined;\n\n      if (this.isImg && this.replaced) {\n        element.src = this.originalUrl;\n      }\n\n      this.uncreate();\n      return this;\n    },\n\n    /**\n     * Move the canvas with relative offsets\n     * @param {number} offsetX - The relative offset distance on the x-axis.\n     * @param {number} [offsetY=offsetX] - The relative offset distance on the y-axis.\n     * @returns {Cropper} this\n     */\n    move: function move(offsetX) {\n      var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX;\n      var _this$canvasData = this.canvasData,\n          left = _this$canvasData.left,\n          top = _this$canvasData.top;\n      return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY));\n    },\n\n    /**\n     * Move the canvas to an absolute point\n     * @param {number} x - The x-axis coordinate.\n     * @param {number} [y=x] - The y-axis coordinate.\n     * @returns {Cropper} this\n     */\n    moveTo: function moveTo(x) {\n      var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;\n      var canvasData = this.canvasData;\n      var changed = false;\n      x = Number(x);\n      y = Number(y);\n\n      if (this.ready && !this.disabled && this.options.movable) {\n        if (isNumber(x)) {\n          canvasData.left = x;\n          changed = true;\n        }\n\n        if (isNumber(y)) {\n          canvasData.top = y;\n          changed = true;\n        }\n\n        if (changed) {\n          this.renderCanvas(true);\n        }\n      }\n\n      return this;\n    },\n\n    /**\n     * Zoom the canvas with a relative ratio\n     * @param {number} ratio - The target ratio.\n     * @param {Event} _originalEvent - The original event if any.\n     * @returns {Cropper} this\n     */\n    zoom: function zoom(ratio, _originalEvent) {\n      var canvasData = this.canvasData;\n      ratio = Number(ratio);\n\n      if (ratio < 0) {\n        ratio = 1 / (1 - ratio);\n      } else {\n        ratio = 1 + ratio;\n      }\n\n      return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent);\n    },\n\n    /**\n     * Zoom the canvas to an absolute ratio\n     * @param {number} ratio - The target ratio.\n     * @param {Object} pivot - The zoom pivot point coordinate.\n     * @param {Event} _originalEvent - The original event if any.\n     * @returns {Cropper} this\n     */\n    zoomTo: function zoomTo(ratio, pivot, _originalEvent) {\n      var options = this.options,\n          canvasData = this.canvasData;\n      var width = canvasData.width,\n          height = canvasData.height,\n          naturalWidth = canvasData.naturalWidth,\n          naturalHeight = canvasData.naturalHeight;\n      ratio = Number(ratio);\n\n      if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) {\n        var newWidth = naturalWidth * ratio;\n        var newHeight = naturalHeight * ratio;\n\n        if (dispatchEvent(this.element, EVENT_ZOOM, {\n          ratio: ratio,\n          oldRatio: width / naturalWidth,\n          originalEvent: _originalEvent\n        }) === false) {\n          return this;\n        }\n\n        if (_originalEvent) {\n          var pointers = this.pointers;\n          var offset = getOffset(this.cropper);\n          var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : {\n            pageX: _originalEvent.pageX,\n            pageY: _originalEvent.pageY\n          }; // Zoom from the triggering point of the event\n\n          canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width);\n          canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height);\n        } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) {\n          canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width);\n          canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height);\n        } else {\n          // Zoom from the center of the canvas\n          canvasData.left -= (newWidth - width) / 2;\n          canvasData.top -= (newHeight - height) / 2;\n        }\n\n        canvasData.width = newWidth;\n        canvasData.height = newHeight;\n        this.renderCanvas(true);\n      }\n\n      return this;\n    },\n\n    /**\n     * Rotate the canvas with a relative degree\n     * @param {number} degree - The rotate degree.\n     * @returns {Cropper} this\n     */\n    rotate: function rotate(degree) {\n      return this.rotateTo((this.imageData.rotate || 0) + Number(degree));\n    },\n\n    /**\n     * Rotate the canvas to an absolute degree\n     * @param {number} degree - The rotate degree.\n     * @returns {Cropper} this\n     */\n    rotateTo: function rotateTo(degree) {\n      degree = Number(degree);\n\n      if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) {\n        this.imageData.rotate = degree % 360;\n        this.renderCanvas(true, true);\n      }\n\n      return this;\n    },\n\n    /**\n     * Scale the image on the x-axis.\n     * @param {number} scaleX - The scale ratio on the x-axis.\n     * @returns {Cropper} this\n     */\n    scaleX: function scaleX(_scaleX) {\n      var scaleY = this.imageData.scaleY;\n      return this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1);\n    },\n\n    /**\n     * Scale the image on the y-axis.\n     * @param {number} scaleY - The scale ratio on the y-axis.\n     * @returns {Cropper} this\n     */\n    scaleY: function scaleY(_scaleY) {\n      var scaleX = this.imageData.scaleX;\n      return this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY);\n    },\n\n    /**\n     * Scale the image\n     * @param {number} scaleX - The scale ratio on the x-axis.\n     * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis.\n     * @returns {Cropper} this\n     */\n    scale: function scale(scaleX) {\n      var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX;\n      var imageData = this.imageData;\n      var transformed = false;\n      scaleX = Number(scaleX);\n      scaleY = Number(scaleY);\n\n      if (this.ready && !this.disabled && this.options.scalable) {\n        if (isNumber(scaleX)) {\n          imageData.scaleX = scaleX;\n          transformed = true;\n        }\n\n        if (isNumber(scaleY)) {\n          imageData.scaleY = scaleY;\n          transformed = true;\n        }\n\n        if (transformed) {\n          this.renderCanvas(true, true);\n        }\n      }\n\n      return this;\n    },\n\n    /**\n     * Get the cropped area position and size data (base on the original image)\n     * @param {boolean} [rounded=false] - Indicate if round the data values or not.\n     * @returns {Object} The result cropped data.\n     */\n    getData: function getData() {\n      var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var options = this.options,\n          imageData = this.imageData,\n          canvasData = this.canvasData,\n          cropBoxData = this.cropBoxData;\n      var data;\n\n      if (this.ready && this.cropped) {\n        data = {\n          x: cropBoxData.left - canvasData.left,\n          y: cropBoxData.top - canvasData.top,\n          width: cropBoxData.width,\n          height: cropBoxData.height\n        };\n        var ratio = imageData.width / imageData.naturalWidth;\n        forEach(data, function (n, i) {\n          data[i] = n / ratio;\n        });\n\n        if (rounded) {\n          // In case rounding off leads to extra 1px in right or bottom border\n          // we should round the top-left corner and the dimension (#343).\n          var bottom = Math.round(data.y + data.height);\n          var right = Math.round(data.x + data.width);\n          data.x = Math.round(data.x);\n          data.y = Math.round(data.y);\n          data.width = right - data.x;\n          data.height = bottom - data.y;\n        }\n      } else {\n        data = {\n          x: 0,\n          y: 0,\n          width: 0,\n          height: 0\n        };\n      }\n\n      if (options.rotatable) {\n        data.rotate = imageData.rotate || 0;\n      }\n\n      if (options.scalable) {\n        data.scaleX = imageData.scaleX || 1;\n        data.scaleY = imageData.scaleY || 1;\n      }\n\n      return data;\n    },\n\n    /**\n     * Set the cropped area position and size with new data\n     * @param {Object} data - The new data.\n     * @returns {Cropper} this\n     */\n    setData: function setData(data) {\n      var options = this.options,\n          imageData = this.imageData,\n          canvasData = this.canvasData;\n      var cropBoxData = {};\n\n      if (this.ready && !this.disabled && isPlainObject(data)) {\n        var transformed = false;\n\n        if (options.rotatable) {\n          if (isNumber(data.rotate) && data.rotate !== imageData.rotate) {\n            imageData.rotate = data.rotate;\n            transformed = true;\n          }\n        }\n\n        if (options.scalable) {\n          if (isNumber(data.scaleX) && data.scaleX !== imageData.scaleX) {\n            imageData.scaleX = data.scaleX;\n            transformed = true;\n          }\n\n          if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) {\n            imageData.scaleY = data.scaleY;\n            transformed = true;\n          }\n        }\n\n        if (transformed) {\n          this.renderCanvas(true, true);\n        }\n\n        var ratio = imageData.width / imageData.naturalWidth;\n\n        if (isNumber(data.x)) {\n          cropBoxData.left = data.x * ratio + canvasData.left;\n        }\n\n        if (isNumber(data.y)) {\n          cropBoxData.top = data.y * ratio + canvasData.top;\n        }\n\n        if (isNumber(data.width)) {\n          cropBoxData.width = data.width * ratio;\n        }\n\n        if (isNumber(data.height)) {\n          cropBoxData.height = data.height * ratio;\n        }\n\n        this.setCropBoxData(cropBoxData);\n      }\n\n      return this;\n    },\n\n    /**\n     * Get the container size data.\n     * @returns {Object} The result container data.\n     */\n    getContainerData: function getContainerData() {\n      return this.ready ? assign({}, this.containerData) : {};\n    },\n\n    /**\n     * Get the image position and size data.\n     * @returns {Object} The result image data.\n     */\n    getImageData: function getImageData() {\n      return this.sized ? assign({}, this.imageData) : {};\n    },\n\n    /**\n     * Get the canvas position and size data.\n     * @returns {Object} The result canvas data.\n     */\n    getCanvasData: function getCanvasData() {\n      var canvasData = this.canvasData;\n      var data = {};\n\n      if (this.ready) {\n        forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) {\n          data[n] = canvasData[n];\n        });\n      }\n\n      return data;\n    },\n\n    /**\n     * Set the canvas position and size with new data.\n     * @param {Object} data - The new canvas data.\n     * @returns {Cropper} this\n     */\n    setCanvasData: function setCanvasData(data) {\n      var canvasData = this.canvasData;\n      var aspectRatio = canvasData.aspectRatio;\n\n      if (this.ready && !this.disabled && isPlainObject(data)) {\n        if (isNumber(data.left)) {\n          canvasData.left = data.left;\n        }\n\n        if (isNumber(data.top)) {\n          canvasData.top = data.top;\n        }\n\n        if (isNumber(data.width)) {\n          canvasData.width = data.width;\n          canvasData.height = data.width / aspectRatio;\n        } else if (isNumber(data.height)) {\n          canvasData.height = data.height;\n          canvasData.width = data.height * aspectRatio;\n        }\n\n        this.renderCanvas(true);\n      }\n\n      return this;\n    },\n\n    /**\n     * Get the crop box position and size data.\n     * @returns {Object} The result crop box data.\n     */\n    getCropBoxData: function getCropBoxData() {\n      var cropBoxData = this.cropBoxData;\n      var data;\n\n      if (this.ready && this.cropped) {\n        data = {\n          left: cropBoxData.left,\n          top: cropBoxData.top,\n          width: cropBoxData.width,\n          height: cropBoxData.height\n        };\n      }\n\n      return data || {};\n    },\n\n    /**\n     * Set the crop box position and size with new data.\n     * @param {Object} data - The new crop box data.\n     * @returns {Cropper} this\n     */\n    setCropBoxData: function setCropBoxData(data) {\n      var cropBoxData = this.cropBoxData;\n      var aspectRatio = this.options.aspectRatio;\n      var widthChanged;\n      var heightChanged;\n\n      if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) {\n        if (isNumber(data.left)) {\n          cropBoxData.left = data.left;\n        }\n\n        if (isNumber(data.top)) {\n          cropBoxData.top = data.top;\n        }\n\n        if (isNumber(data.width) && data.width !== cropBoxData.width) {\n          widthChanged = true;\n          cropBoxData.width = data.width;\n        }\n\n        if (isNumber(data.height) && data.height !== cropBoxData.height) {\n          heightChanged = true;\n          cropBoxData.height = data.height;\n        }\n\n        if (aspectRatio) {\n          if (widthChanged) {\n            cropBoxData.height = cropBoxData.width / aspectRatio;\n          } else if (heightChanged) {\n            cropBoxData.width = cropBoxData.height * aspectRatio;\n          }\n        }\n\n        this.renderCropBox();\n      }\n\n      return this;\n    },\n\n    /**\n     * Get a canvas drawn the cropped image.\n     * @param {Object} [options={}] - The config options.\n     * @returns {HTMLCanvasElement} - The result canvas.\n     */\n    getCroppedCanvas: function getCroppedCanvas() {\n      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      if (!this.ready || !window.HTMLCanvasElement) {\n        return null;\n      }\n\n      var canvasData = this.canvasData;\n      var source = getSourceCanvas(this.image, this.imageData, canvasData, options); // Returns the source canvas if it is not cropped.\n\n      if (!this.cropped) {\n        return source;\n      }\n\n      var _this$getData = this.getData(),\n          initialX = _this$getData.x,\n          initialY = _this$getData.y,\n          initialWidth = _this$getData.width,\n          initialHeight = _this$getData.height;\n\n      var ratio = source.width / Math.floor(canvasData.naturalWidth);\n\n      if (ratio !== 1) {\n        initialX *= ratio;\n        initialY *= ratio;\n        initialWidth *= ratio;\n        initialHeight *= ratio;\n      }\n\n      var aspectRatio = initialWidth / initialHeight;\n      var maxSizes = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: options.maxWidth || Infinity,\n        height: options.maxHeight || Infinity\n      });\n      var minSizes = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: options.minWidth || 0,\n        height: options.minHeight || 0\n      }, 'cover');\n\n      var _getAdjustedSizes = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: options.width || (ratio !== 1 ? source.width : initialWidth),\n        height: options.height || (ratio !== 1 ? source.height : initialHeight)\n      }),\n          width = _getAdjustedSizes.width,\n          height = _getAdjustedSizes.height;\n\n      width = Math.min(maxSizes.width, Math.max(minSizes.width, width));\n      height = Math.min(maxSizes.height, Math.max(minSizes.height, height));\n      var canvas = document.createElement('canvas');\n      var context = canvas.getContext('2d');\n      canvas.width = normalizeDecimalNumber(width);\n      canvas.height = normalizeDecimalNumber(height);\n      context.fillStyle = options.fillColor || 'transparent';\n      context.fillRect(0, 0, width, height);\n      var _options$imageSmoothi = options.imageSmoothingEnabled,\n          imageSmoothingEnabled = _options$imageSmoothi === void 0 ? true : _options$imageSmoothi,\n          imageSmoothingQuality = options.imageSmoothingQuality;\n      context.imageSmoothingEnabled = imageSmoothingEnabled;\n\n      if (imageSmoothingQuality) {\n        context.imageSmoothingQuality = imageSmoothingQuality;\n      } // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage\n\n\n      var sourceWidth = source.width;\n      var sourceHeight = source.height; // Source canvas parameters\n\n      var srcX = initialX;\n      var srcY = initialY;\n      var srcWidth;\n      var srcHeight; // Destination canvas parameters\n\n      var dstX;\n      var dstY;\n      var dstWidth;\n      var dstHeight;\n\n      if (srcX <= -initialWidth || srcX > sourceWidth) {\n        srcX = 0;\n        srcWidth = 0;\n        dstX = 0;\n        dstWidth = 0;\n      } else if (srcX <= 0) {\n        dstX = -srcX;\n        srcX = 0;\n        srcWidth = Math.min(sourceWidth, initialWidth + srcX);\n        dstWidth = srcWidth;\n      } else if (srcX <= sourceWidth) {\n        dstX = 0;\n        srcWidth = Math.min(initialWidth, sourceWidth - srcX);\n        dstWidth = srcWidth;\n      }\n\n      if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) {\n        srcY = 0;\n        srcHeight = 0;\n        dstY = 0;\n        dstHeight = 0;\n      } else if (srcY <= 0) {\n        dstY = -srcY;\n        srcY = 0;\n        srcHeight = Math.min(sourceHeight, initialHeight + srcY);\n        dstHeight = srcHeight;\n      } else if (srcY <= sourceHeight) {\n        dstY = 0;\n        srcHeight = Math.min(initialHeight, sourceHeight - srcY);\n        dstHeight = srcHeight;\n      }\n\n      var params = [srcX, srcY, srcWidth, srcHeight]; // Avoid \"IndexSizeError\"\n\n      if (dstWidth > 0 && dstHeight > 0) {\n        var scale = width / initialWidth;\n        params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale);\n      } // All the numerical parameters should be integer for `drawImage`\n      // https://github.com/fengyuanchen/cropper/issues/476\n\n\n      context.drawImage.apply(context, [source].concat(_toConsumableArray(params.map(function (param) {\n        return Math.floor(normalizeDecimalNumber(param));\n      }))));\n      return canvas;\n    },\n\n    /**\n     * Change the aspect ratio of the crop box.\n     * @param {number} aspectRatio - The new aspect ratio.\n     * @returns {Cropper} this\n     */\n    setAspectRatio: function setAspectRatio(aspectRatio) {\n      var options = this.options;\n\n      if (!this.disabled && !isUndefined(aspectRatio)) {\n        // 0 -> NaN\n        options.aspectRatio = Math.max(0, aspectRatio) || NaN;\n\n        if (this.ready) {\n          this.initCropBox();\n\n          if (this.cropped) {\n            this.renderCropBox();\n          }\n        }\n      }\n\n      return this;\n    },\n\n    /**\n     * Change the drag mode.\n     * @param {string} mode - The new drag mode.\n     * @returns {Cropper} this\n     */\n    setDragMode: function setDragMode(mode) {\n      var options = this.options,\n          dragBox = this.dragBox,\n          face = this.face;\n\n      if (this.ready && !this.disabled) {\n        var croppable = mode === DRAG_MODE_CROP;\n        var movable = options.movable && mode === DRAG_MODE_MOVE;\n        mode = croppable || movable ? mode : DRAG_MODE_NONE;\n        options.dragMode = mode;\n        setData(dragBox, DATA_ACTION, mode);\n        toggleClass(dragBox, CLASS_CROP, croppable);\n        toggleClass(dragBox, CLASS_MOVE, movable);\n\n        if (!options.cropBoxMovable) {\n          // Sync drag mode to crop box when it is not movable\n          setData(face, DATA_ACTION, mode);\n          toggleClass(face, CLASS_CROP, croppable);\n          toggleClass(face, CLASS_MOVE, movable);\n        }\n      }\n\n      return this;\n    }\n  };\n\n  var AnotherCropper = WINDOW.Cropper;\n\n  var Cropper = /*#__PURE__*/function () {\n    /**\n     * Create a new Cropper.\n     * @param {Element} element - The target element for cropping.\n     * @param {Object} [options={}] - The configuration options.\n     */\n    function Cropper(element) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      _classCallCheck(this, Cropper);\n\n      if (!element || !REGEXP_TAG_NAME.test(element.tagName)) {\n        throw new Error('The first argument is required and must be an <img> or <canvas> element.');\n      }\n\n      this.element = element;\n      this.options = assign({}, DEFAULTS, isPlainObject(options) && options);\n      this.cropped = false;\n      this.disabled = false;\n      this.pointers = {};\n      this.ready = false;\n      this.reloading = false;\n      this.replaced = false;\n      this.sized = false;\n      this.sizing = false;\n      this.init();\n    }\n\n    _createClass(Cropper, [{\n      key: \"init\",\n      value: function init() {\n        var element = this.element;\n        var tagName = element.tagName.toLowerCase();\n        var url;\n\n        if (element[NAMESPACE]) {\n          return;\n        }\n\n        element[NAMESPACE] = this;\n\n        if (tagName === 'img') {\n          this.isImg = true; // e.g.: \"img/picture.jpg\"\n\n          url = element.getAttribute('src') || '';\n          this.originalUrl = url; // Stop when it's a blank image\n\n          if (!url) {\n            return;\n          } // e.g.: \"https://example.com/img/picture.jpg\"\n\n\n          url = element.src;\n        } else if (tagName === 'canvas' && window.HTMLCanvasElement) {\n          url = element.toDataURL();\n        }\n\n        this.load(url);\n      }\n    }, {\n      key: \"load\",\n      value: function load(url) {\n        var _this = this;\n\n        if (!url) {\n          return;\n        }\n\n        this.url = url;\n        this.imageData = {};\n        var element = this.element,\n            options = this.options;\n\n        if (!options.rotatable && !options.scalable) {\n          options.checkOrientation = false;\n        } // Only IE10+ supports Typed Arrays\n\n\n        if (!options.checkOrientation || !window.ArrayBuffer) {\n          this.clone();\n          return;\n        } // Detect the mime type of the image directly if it is a Data URL\n\n\n        if (REGEXP_DATA_URL.test(url)) {\n          // Read ArrayBuffer from Data URL of JPEG images directly for better performance\n          if (REGEXP_DATA_URL_JPEG.test(url)) {\n            this.read(dataURLToArrayBuffer(url));\n          } else {\n            // Only a JPEG image may contains Exif Orientation information,\n            // the rest types of Data URLs are not necessary to check orientation at all.\n            this.clone();\n          }\n\n          return;\n        } // 1. Detect the mime type of the image by a XMLHttpRequest.\n        // 2. Load the image as ArrayBuffer for reading orientation if its a JPEG image.\n\n\n        var xhr = new XMLHttpRequest();\n        var clone = this.clone.bind(this);\n        this.reloading = true;\n        this.xhr = xhr; // 1. Cross origin requests are only supported for protocol schemes:\n        // http, https, data, chrome, chrome-extension.\n        // 2. Access to XMLHttpRequest from a Data URL will be blocked by CORS policy\n        // in some browsers as IE11 and Safari.\n\n        xhr.onabort = clone;\n        xhr.onerror = clone;\n        xhr.ontimeout = clone;\n\n        xhr.onprogress = function () {\n          // Abort the request directly if it not a JPEG image for better performance\n          if (xhr.getResponseHeader('content-type') !== MIME_TYPE_JPEG) {\n            xhr.abort();\n          }\n        };\n\n        xhr.onload = function () {\n          _this.read(xhr.response);\n        };\n\n        xhr.onloadend = function () {\n          _this.reloading = false;\n          _this.xhr = null;\n        }; // Bust cache when there is a \"crossOrigin\" property to avoid browser cache error\n\n\n        if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) {\n          url = addTimestamp(url);\n        } // The third parameter is required for avoiding side-effect (#682)\n\n\n        xhr.open('GET', url, true);\n        xhr.responseType = 'arraybuffer';\n        xhr.withCredentials = element.crossOrigin === 'use-credentials';\n        xhr.send();\n      }\n    }, {\n      key: \"read\",\n      value: function read(arrayBuffer) {\n        var options = this.options,\n            imageData = this.imageData; // Reset the orientation value to its default value 1\n        // as some iOS browsers will render image with its orientation\n\n        var orientation = resetAndGetOrientation(arrayBuffer);\n        var rotate = 0;\n        var scaleX = 1;\n        var scaleY = 1;\n\n        if (orientation > 1) {\n          // Generate a new URL which has the default orientation value\n          this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG);\n\n          var _parseOrientation = parseOrientation(orientation);\n\n          rotate = _parseOrientation.rotate;\n          scaleX = _parseOrientation.scaleX;\n          scaleY = _parseOrientation.scaleY;\n        }\n\n        if (options.rotatable) {\n          imageData.rotate = rotate;\n        }\n\n        if (options.scalable) {\n          imageData.scaleX = scaleX;\n          imageData.scaleY = scaleY;\n        }\n\n        this.clone();\n      }\n    }, {\n      key: \"clone\",\n      value: function clone() {\n        var element = this.element,\n            url = this.url;\n        var crossOrigin = element.crossOrigin;\n        var crossOriginUrl = url;\n\n        if (this.options.checkCrossOrigin && isCrossOriginURL(url)) {\n          if (!crossOrigin) {\n            crossOrigin = 'anonymous';\n          } // Bust cache when there is not a \"crossOrigin\" property (#519)\n\n\n          crossOriginUrl = addTimestamp(url);\n        }\n\n        this.crossOrigin = crossOrigin;\n        this.crossOriginUrl = crossOriginUrl;\n        var image = document.createElement('img');\n\n        if (crossOrigin) {\n          image.crossOrigin = crossOrigin;\n        }\n\n        image.src = crossOriginUrl || url;\n        image.alt = element.alt || 'The image to crop';\n        this.image = image;\n        image.onload = this.start.bind(this);\n        image.onerror = this.stop.bind(this);\n        addClass(image, CLASS_HIDE);\n        element.parentNode.insertBefore(image, element.nextSibling);\n      }\n    }, {\n      key: \"start\",\n      value: function start() {\n        var _this2 = this;\n\n        var image = this.image;\n        image.onload = null;\n        image.onerror = null;\n        this.sizing = true; // Match all browsers that use WebKit as the layout engine in iOS devices,\n        // such as Safari for iOS, Chrome for iOS, and in-app browsers.\n\n        var isIOSWebKit = WINDOW.navigator && /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(WINDOW.navigator.userAgent);\n\n        var done = function done(naturalWidth, naturalHeight) {\n          assign(_this2.imageData, {\n            naturalWidth: naturalWidth,\n            naturalHeight: naturalHeight,\n            aspectRatio: naturalWidth / naturalHeight\n          });\n          _this2.initialImageData = assign({}, _this2.imageData);\n          _this2.sizing = false;\n          _this2.sized = true;\n\n          _this2.build();\n        }; // Most modern browsers (excepts iOS WebKit)\n\n\n        if (image.naturalWidth && !isIOSWebKit) {\n          done(image.naturalWidth, image.naturalHeight);\n          return;\n        }\n\n        var sizingImage = document.createElement('img');\n        var body = document.body || document.documentElement;\n        this.sizingImage = sizingImage;\n\n        sizingImage.onload = function () {\n          done(sizingImage.width, sizingImage.height);\n\n          if (!isIOSWebKit) {\n            body.removeChild(sizingImage);\n          }\n        };\n\n        sizingImage.src = image.src; // iOS WebKit will convert the image automatically\n        // with its orientation once append it into DOM (#279)\n\n        if (!isIOSWebKit) {\n          sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;';\n          body.appendChild(sizingImage);\n        }\n      }\n    }, {\n      key: \"stop\",\n      value: function stop() {\n        var image = this.image;\n        image.onload = null;\n        image.onerror = null;\n        image.parentNode.removeChild(image);\n        this.image = null;\n      }\n    }, {\n      key: \"build\",\n      value: function build() {\n        if (!this.sized || this.ready) {\n          return;\n        }\n\n        var element = this.element,\n            options = this.options,\n            image = this.image; // Create cropper elements\n\n        var container = element.parentNode;\n        var template = document.createElement('div');\n        template.innerHTML = TEMPLATE;\n        var cropper = template.querySelector(\".\".concat(NAMESPACE, \"-container\"));\n        var canvas = cropper.querySelector(\".\".concat(NAMESPACE, \"-canvas\"));\n        var dragBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-drag-box\"));\n        var cropBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-crop-box\"));\n        var face = cropBox.querySelector(\".\".concat(NAMESPACE, \"-face\"));\n        this.container = container;\n        this.cropper = cropper;\n        this.canvas = canvas;\n        this.dragBox = dragBox;\n        this.cropBox = cropBox;\n        this.viewBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-view-box\"));\n        this.face = face;\n        canvas.appendChild(image); // Hide the original image\n\n        addClass(element, CLASS_HIDDEN); // Inserts the cropper after to the current image\n\n        container.insertBefore(cropper, element.nextSibling); // Show the image if is hidden\n\n        if (!this.isImg) {\n          removeClass(image, CLASS_HIDE);\n        }\n\n        this.initPreview();\n        this.bind();\n        options.initialAspectRatio = Math.max(0, options.initialAspectRatio) || NaN;\n        options.aspectRatio = Math.max(0, options.aspectRatio) || NaN;\n        options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0;\n        addClass(cropBox, CLASS_HIDDEN);\n\n        if (!options.guides) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-dashed\")), CLASS_HIDDEN);\n        }\n\n        if (!options.center) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-center\")), CLASS_HIDDEN);\n        }\n\n        if (options.background) {\n          addClass(cropper, \"\".concat(NAMESPACE, \"-bg\"));\n        }\n\n        if (!options.highlight) {\n          addClass(face, CLASS_INVISIBLE);\n        }\n\n        if (options.cropBoxMovable) {\n          addClass(face, CLASS_MOVE);\n          setData(face, DATA_ACTION, ACTION_ALL);\n        }\n\n        if (!options.cropBoxResizable) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-line\")), CLASS_HIDDEN);\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-point\")), CLASS_HIDDEN);\n        }\n\n        this.render();\n        this.ready = true;\n        this.setDragMode(options.dragMode);\n\n        if (options.autoCrop) {\n          this.crop();\n        }\n\n        this.setData(options.data);\n\n        if (isFunction(options.ready)) {\n          addListener(element, EVENT_READY, options.ready, {\n            once: true\n          });\n        }\n\n        dispatchEvent(element, EVENT_READY);\n      }\n    }, {\n      key: \"unbuild\",\n      value: function unbuild() {\n        if (!this.ready) {\n          return;\n        }\n\n        this.ready = false;\n        this.unbind();\n        this.resetPreview();\n        this.cropper.parentNode.removeChild(this.cropper);\n        removeClass(this.element, CLASS_HIDDEN);\n      }\n    }, {\n      key: \"uncreate\",\n      value: function uncreate() {\n        if (this.ready) {\n          this.unbuild();\n          this.ready = false;\n          this.cropped = false;\n        } else if (this.sizing) {\n          this.sizingImage.onload = null;\n          this.sizing = false;\n          this.sized = false;\n        } else if (this.reloading) {\n          this.xhr.onabort = null;\n          this.xhr.abort();\n        } else if (this.image) {\n          this.stop();\n        }\n      }\n      /**\n       * Get the no conflict cropper class.\n       * @returns {Cropper} The cropper class.\n       */\n\n    }], [{\n      key: \"noConflict\",\n      value: function noConflict() {\n        window.Cropper = AnotherCropper;\n        return Cropper;\n      }\n      /**\n       * Change the default options.\n       * @param {Object} options - The new default options.\n       */\n\n    }, {\n      key: \"setDefaults\",\n      value: function setDefaults(options) {\n        assign(DEFAULTS, isPlainObject(options) && options);\n      }\n    }]);\n\n    return Cropper;\n  }();\n\n  assign(Cropper.prototype, render, preview, events, handlers, change, methods);\n\n  return Cropper;\n\n})));\n", "/*\nTurbo 7.1.0\nCopyright \u00A9 2021 Basecamp, LLC\n */\n(function () {\n    if (window.Reflect === undefined || window.customElements === undefined ||\n        window.customElements.polyfillWrapFlushCallback) {\n        return;\n    }\n    const BuiltInHTMLElement = HTMLElement;\n    const wrapperForTheName = {\n        'HTMLElement': function HTMLElement() {\n            return Reflect.construct(BuiltInHTMLElement, [], this.constructor);\n        }\n    };\n    window.HTMLElement =\n        wrapperForTheName['HTMLElement'];\n    HTMLElement.prototype = BuiltInHTMLElement.prototype;\n    HTMLElement.prototype.constructor = HTMLElement;\n    Object.setPrototypeOf(HTMLElement, BuiltInHTMLElement);\n})();\n\n/**\n * The MIT License (MIT)\n * \n * Copyright (c) 2019 Javan Makhmali\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n(function(prototype) {\n  if (typeof prototype.requestSubmit == \"function\") return\n\n  prototype.requestSubmit = function(submitter) {\n    if (submitter) {\n      validateSubmitter(submitter, this);\n      submitter.click();\n    } else {\n      submitter = document.createElement(\"input\");\n      submitter.type = \"submit\";\n      submitter.hidden = true;\n      this.appendChild(submitter);\n      submitter.click();\n      this.removeChild(submitter);\n    }\n  };\n\n  function validateSubmitter(submitter, form) {\n    submitter instanceof HTMLElement || raise(TypeError, \"parameter 1 is not of type 'HTMLElement'\");\n    submitter.type == \"submit\" || raise(TypeError, \"The specified element is not a submit button\");\n    submitter.form == form || raise(DOMException, \"The specified element is not owned by this form element\", \"NotFoundError\");\n  }\n\n  function raise(errorConstructor, message, name) {\n    throw new errorConstructor(\"Failed to execute 'requestSubmit' on 'HTMLFormElement': \" + message + \".\", name)\n  }\n})(HTMLFormElement.prototype);\n\nconst submittersByForm = new WeakMap;\nfunction findSubmitterFromClickTarget(target) {\n    const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n    const candidate = element ? element.closest(\"input, button\") : null;\n    return (candidate === null || candidate === void 0 ? void 0 : candidate.type) == \"submit\" ? candidate : null;\n}\nfunction clickCaptured(event) {\n    const submitter = findSubmitterFromClickTarget(event.target);\n    if (submitter && submitter.form) {\n        submittersByForm.set(submitter.form, submitter);\n    }\n}\n(function () {\n    if (\"submitter\" in Event.prototype)\n        return;\n    let prototype;\n    if (\"SubmitEvent\" in window && /Apple Computer/.test(navigator.vendor)) {\n        prototype = window.SubmitEvent.prototype;\n    }\n    else if (\"SubmitEvent\" in window) {\n        return;\n    }\n    else {\n        prototype = window.Event.prototype;\n    }\n    addEventListener(\"click\", clickCaptured, true);\n    Object.defineProperty(prototype, \"submitter\", {\n        get() {\n            if (this.type == \"submit\" && this.target instanceof HTMLFormElement) {\n                return submittersByForm.get(this.target);\n            }\n        }\n    });\n})();\n\nvar FrameLoadingStyle;\n(function (FrameLoadingStyle) {\n    FrameLoadingStyle[\"eager\"] = \"eager\";\n    FrameLoadingStyle[\"lazy\"] = \"lazy\";\n})(FrameLoadingStyle || (FrameLoadingStyle = {}));\nclass FrameElement extends HTMLElement {\n    constructor() {\n        super();\n        this.loaded = Promise.resolve();\n        this.delegate = new FrameElement.delegateConstructor(this);\n    }\n    static get observedAttributes() {\n        return [\"disabled\", \"loading\", \"src\"];\n    }\n    connectedCallback() {\n        this.delegate.connect();\n    }\n    disconnectedCallback() {\n        this.delegate.disconnect();\n    }\n    reload() {\n        const { src } = this;\n        this.src = null;\n        this.src = src;\n    }\n    attributeChangedCallback(name) {\n        if (name == \"loading\") {\n            this.delegate.loadingStyleChanged();\n        }\n        else if (name == \"src\") {\n            this.delegate.sourceURLChanged();\n        }\n        else {\n            this.delegate.disabledChanged();\n        }\n    }\n    get src() {\n        return this.getAttribute(\"src\");\n    }\n    set src(value) {\n        if (value) {\n            this.setAttribute(\"src\", value);\n        }\n        else {\n            this.removeAttribute(\"src\");\n        }\n    }\n    get loading() {\n        return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\");\n    }\n    set loading(value) {\n        if (value) {\n            this.setAttribute(\"loading\", value);\n        }\n        else {\n            this.removeAttribute(\"loading\");\n        }\n    }\n    get disabled() {\n        return this.hasAttribute(\"disabled\");\n    }\n    set disabled(value) {\n        if (value) {\n            this.setAttribute(\"disabled\", \"\");\n        }\n        else {\n            this.removeAttribute(\"disabled\");\n        }\n    }\n    get autoscroll() {\n        return this.hasAttribute(\"autoscroll\");\n    }\n    set autoscroll(value) {\n        if (value) {\n            this.setAttribute(\"autoscroll\", \"\");\n        }\n        else {\n            this.removeAttribute(\"autoscroll\");\n        }\n    }\n    get complete() {\n        return !this.delegate.isLoading;\n    }\n    get isActive() {\n        return this.ownerDocument === document && !this.isPreview;\n    }\n    get isPreview() {\n        var _a, _b;\n        return (_b = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.documentElement) === null || _b === void 0 ? void 0 : _b.hasAttribute(\"data-turbo-preview\");\n    }\n}\nfunction frameLoadingStyleFromString(style) {\n    switch (style.toLowerCase()) {\n        case \"lazy\": return FrameLoadingStyle.lazy;\n        default: return FrameLoadingStyle.eager;\n    }\n}\n\nfunction expandURL(locatable) {\n    return new URL(locatable.toString(), document.baseURI);\n}\nfunction getAnchor(url) {\n    let anchorMatch;\n    if (url.hash) {\n        return url.hash.slice(1);\n    }\n    else if (anchorMatch = url.href.match(/#(.*)$/)) {\n        return anchorMatch[1];\n    }\n}\nfunction getAction(form, submitter) {\n    const action = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formaction\")) || form.getAttribute(\"action\") || form.action;\n    return expandURL(action);\n}\nfunction getExtension(url) {\n    return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\";\n}\nfunction isHTML(url) {\n    return !!getExtension(url).match(/^(?:|\\.(?:htm|html|xhtml))$/);\n}\nfunction isPrefixedBy(baseURL, url) {\n    const prefix = getPrefix(url);\n    return baseURL.href === expandURL(prefix).href || baseURL.href.startsWith(prefix);\n}\nfunction locationIsVisitable(location, rootLocation) {\n    return isPrefixedBy(location, rootLocation) && isHTML(location);\n}\nfunction getRequestURL(url) {\n    const anchor = getAnchor(url);\n    return anchor != null\n        ? url.href.slice(0, -(anchor.length + 1))\n        : url.href;\n}\nfunction toCacheKey(url) {\n    return getRequestURL(url);\n}\nfunction urlsAreEqual(left, right) {\n    return expandURL(left).href == expandURL(right).href;\n}\nfunction getPathComponents(url) {\n    return url.pathname.split(\"/\").slice(1);\n}\nfunction getLastPathComponent(url) {\n    return getPathComponents(url).slice(-1)[0];\n}\nfunction getPrefix(url) {\n    return addTrailingSlash(url.origin + url.pathname);\n}\nfunction addTrailingSlash(value) {\n    return value.endsWith(\"/\") ? value : value + \"/\";\n}\n\nclass FetchResponse {\n    constructor(response) {\n        this.response = response;\n    }\n    get succeeded() {\n        return this.response.ok;\n    }\n    get failed() {\n        return !this.succeeded;\n    }\n    get clientError() {\n        return this.statusCode >= 400 && this.statusCode <= 499;\n    }\n    get serverError() {\n        return this.statusCode >= 500 && this.statusCode <= 599;\n    }\n    get redirected() {\n        return this.response.redirected;\n    }\n    get location() {\n        return expandURL(this.response.url);\n    }\n    get isHTML() {\n        return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/);\n    }\n    get statusCode() {\n        return this.response.status;\n    }\n    get contentType() {\n        return this.header(\"Content-Type\");\n    }\n    get responseText() {\n        return this.response.clone().text();\n    }\n    get responseHTML() {\n        if (this.isHTML) {\n            return this.response.clone().text();\n        }\n        else {\n            return Promise.resolve(undefined);\n        }\n    }\n    header(name) {\n        return this.response.headers.get(name);\n    }\n}\n\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n    const event = new CustomEvent(eventName, { cancelable, bubbles: true, detail });\n    if (target && target.isConnected) {\n        target.dispatchEvent(event);\n    }\n    else {\n        document.documentElement.dispatchEvent(event);\n    }\n    return event;\n}\nfunction nextAnimationFrame() {\n    return new Promise(resolve => requestAnimationFrame(() => resolve()));\n}\nfunction nextEventLoopTick() {\n    return new Promise(resolve => setTimeout(() => resolve(), 0));\n}\nfunction nextMicrotask() {\n    return Promise.resolve();\n}\nfunction parseHTMLDocument(html = \"\") {\n    return new DOMParser().parseFromString(html, \"text/html\");\n}\nfunction unindent(strings, ...values) {\n    const lines = interpolate(strings, values).replace(/^\\n/, \"\").split(\"\\n\");\n    const match = lines[0].match(/^\\s+/);\n    const indent = match ? match[0].length : 0;\n    return lines.map(line => line.slice(indent)).join(\"\\n\");\n}\nfunction interpolate(strings, values) {\n    return strings.reduce((result, string, i) => {\n        const value = values[i] == undefined ? \"\" : values[i];\n        return result + string + value;\n    }, \"\");\n}\nfunction uuid() {\n    return Array.apply(null, { length: 36 }).map((_, i) => {\n        if (i == 8 || i == 13 || i == 18 || i == 23) {\n            return \"-\";\n        }\n        else if (i == 14) {\n            return \"4\";\n        }\n        else if (i == 19) {\n            return (Math.floor(Math.random() * 4) + 8).toString(16);\n        }\n        else {\n            return Math.floor(Math.random() * 15).toString(16);\n        }\n    }).join(\"\");\n}\nfunction getAttribute(attributeName, ...elements) {\n    for (const value of elements.map(element => element === null || element === void 0 ? void 0 : element.getAttribute(attributeName))) {\n        if (typeof value == \"string\")\n            return value;\n    }\n    return null;\n}\nfunction markAsBusy(...elements) {\n    for (const element of elements) {\n        if (element.localName == \"turbo-frame\") {\n            element.setAttribute(\"busy\", \"\");\n        }\n        element.setAttribute(\"aria-busy\", \"true\");\n    }\n}\nfunction clearBusyState(...elements) {\n    for (const element of elements) {\n        if (element.localName == \"turbo-frame\") {\n            element.removeAttribute(\"busy\");\n        }\n        element.removeAttribute(\"aria-busy\");\n    }\n}\n\nvar FetchMethod;\n(function (FetchMethod) {\n    FetchMethod[FetchMethod[\"get\"] = 0] = \"get\";\n    FetchMethod[FetchMethod[\"post\"] = 1] = \"post\";\n    FetchMethod[FetchMethod[\"put\"] = 2] = \"put\";\n    FetchMethod[FetchMethod[\"patch\"] = 3] = \"patch\";\n    FetchMethod[FetchMethod[\"delete\"] = 4] = \"delete\";\n})(FetchMethod || (FetchMethod = {}));\nfunction fetchMethodFromString(method) {\n    switch (method.toLowerCase()) {\n        case \"get\": return FetchMethod.get;\n        case \"post\": return FetchMethod.post;\n        case \"put\": return FetchMethod.put;\n        case \"patch\": return FetchMethod.patch;\n        case \"delete\": return FetchMethod.delete;\n    }\n}\nclass FetchRequest {\n    constructor(delegate, method, location, body = new URLSearchParams, target = null) {\n        this.abortController = new AbortController;\n        this.resolveRequestPromise = (value) => { };\n        this.delegate = delegate;\n        this.method = method;\n        this.headers = this.defaultHeaders;\n        this.body = body;\n        this.url = location;\n        this.target = target;\n    }\n    get location() {\n        return this.url;\n    }\n    get params() {\n        return this.url.searchParams;\n    }\n    get entries() {\n        return this.body ? Array.from(this.body.entries()) : [];\n    }\n    cancel() {\n        this.abortController.abort();\n    }\n    async perform() {\n        var _a, _b;\n        const { fetchOptions } = this;\n        (_b = (_a = this.delegate).prepareHeadersForRequest) === null || _b === void 0 ? void 0 : _b.call(_a, this.headers, this);\n        await this.allowRequestToBeIntercepted(fetchOptions);\n        try {\n            this.delegate.requestStarted(this);\n            const response = await fetch(this.url.href, fetchOptions);\n            return await this.receive(response);\n        }\n        catch (error) {\n            if (error.name !== 'AbortError') {\n                this.delegate.requestErrored(this, error);\n                throw error;\n            }\n        }\n        finally {\n            this.delegate.requestFinished(this);\n        }\n    }\n    async receive(response) {\n        const fetchResponse = new FetchResponse(response);\n        const event = dispatch(\"turbo:before-fetch-response\", { cancelable: true, detail: { fetchResponse }, target: this.target });\n        if (event.defaultPrevented) {\n            this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n        }\n        else if (fetchResponse.succeeded) {\n            this.delegate.requestSucceededWithResponse(this, fetchResponse);\n        }\n        else {\n            this.delegate.requestFailedWithResponse(this, fetchResponse);\n        }\n        return fetchResponse;\n    }\n    get fetchOptions() {\n        var _a;\n        return {\n            method: FetchMethod[this.method].toUpperCase(),\n            credentials: \"same-origin\",\n            headers: this.headers,\n            redirect: \"follow\",\n            body: this.isIdempotent ? null : this.body,\n            signal: this.abortSignal,\n            referrer: (_a = this.delegate.referrer) === null || _a === void 0 ? void 0 : _a.href\n        };\n    }\n    get defaultHeaders() {\n        return {\n            \"Accept\": \"text/html, application/xhtml+xml\"\n        };\n    }\n    get isIdempotent() {\n        return this.method == FetchMethod.get;\n    }\n    get abortSignal() {\n        return this.abortController.signal;\n    }\n    async allowRequestToBeIntercepted(fetchOptions) {\n        const requestInterception = new Promise(resolve => this.resolveRequestPromise = resolve);\n        const event = dispatch(\"turbo:before-fetch-request\", {\n            cancelable: true,\n            detail: {\n                fetchOptions,\n                url: this.url,\n                resume: this.resolveRequestPromise\n            },\n            target: this.target\n        });\n        if (event.defaultPrevented)\n            await requestInterception;\n    }\n}\n\nclass AppearanceObserver {\n    constructor(delegate, element) {\n        this.started = false;\n        this.intersect = entries => {\n            const lastEntry = entries.slice(-1)[0];\n            if (lastEntry === null || lastEntry === void 0 ? void 0 : lastEntry.isIntersecting) {\n                this.delegate.elementAppearedInViewport(this.element);\n            }\n        };\n        this.delegate = delegate;\n        this.element = element;\n        this.intersectionObserver = new IntersectionObserver(this.intersect);\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.intersectionObserver.observe(this.element);\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.intersectionObserver.unobserve(this.element);\n        }\n    }\n}\n\nclass StreamMessage {\n    constructor(html) {\n        this.templateElement = document.createElement(\"template\");\n        this.templateElement.innerHTML = html;\n    }\n    static wrap(message) {\n        if (typeof message == \"string\") {\n            return new this(message);\n        }\n        else {\n            return message;\n        }\n    }\n    get fragment() {\n        const fragment = document.createDocumentFragment();\n        for (const element of this.foreignElements) {\n            fragment.appendChild(document.importNode(element, true));\n        }\n        return fragment;\n    }\n    get foreignElements() {\n        return this.templateChildren.reduce((streamElements, child) => {\n            if (child.tagName.toLowerCase() == \"turbo-stream\") {\n                return [...streamElements, child];\n            }\n            else {\n                return streamElements;\n            }\n        }, []);\n    }\n    get templateChildren() {\n        return Array.from(this.templateElement.content.children);\n    }\n}\nStreamMessage.contentType = \"text/vnd.turbo-stream.html\";\n\nvar FormSubmissionState;\n(function (FormSubmissionState) {\n    FormSubmissionState[FormSubmissionState[\"initialized\"] = 0] = \"initialized\";\n    FormSubmissionState[FormSubmissionState[\"requesting\"] = 1] = \"requesting\";\n    FormSubmissionState[FormSubmissionState[\"waiting\"] = 2] = \"waiting\";\n    FormSubmissionState[FormSubmissionState[\"receiving\"] = 3] = \"receiving\";\n    FormSubmissionState[FormSubmissionState[\"stopping\"] = 4] = \"stopping\";\n    FormSubmissionState[FormSubmissionState[\"stopped\"] = 5] = \"stopped\";\n})(FormSubmissionState || (FormSubmissionState = {}));\nvar FormEnctype;\n(function (FormEnctype) {\n    FormEnctype[\"urlEncoded\"] = \"application/x-www-form-urlencoded\";\n    FormEnctype[\"multipart\"] = \"multipart/form-data\";\n    FormEnctype[\"plain\"] = \"text/plain\";\n})(FormEnctype || (FormEnctype = {}));\nfunction formEnctypeFromString(encoding) {\n    switch (encoding.toLowerCase()) {\n        case FormEnctype.multipart: return FormEnctype.multipart;\n        case FormEnctype.plain: return FormEnctype.plain;\n        default: return FormEnctype.urlEncoded;\n    }\n}\nclass FormSubmission {\n    constructor(delegate, formElement, submitter, mustRedirect = false) {\n        this.state = FormSubmissionState.initialized;\n        this.delegate = delegate;\n        this.formElement = formElement;\n        this.submitter = submitter;\n        this.formData = buildFormData(formElement, submitter);\n        this.location = expandURL(this.action);\n        if (this.method == FetchMethod.get) {\n            mergeFormDataEntries(this.location, [...this.body.entries()]);\n        }\n        this.fetchRequest = new FetchRequest(this, this.method, this.location, this.body, this.formElement);\n        this.mustRedirect = mustRedirect;\n    }\n    static confirmMethod(message, element) {\n        return confirm(message);\n    }\n    get method() {\n        var _a;\n        const method = ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formmethod\")) || this.formElement.getAttribute(\"method\") || \"\";\n        return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get;\n    }\n    get action() {\n        var _a;\n        const formElementAction = typeof this.formElement.action === 'string' ? this.formElement.action : null;\n        return ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formaction\")) || this.formElement.getAttribute(\"action\") || formElementAction || \"\";\n    }\n    get body() {\n        if (this.enctype == FormEnctype.urlEncoded || this.method == FetchMethod.get) {\n            return new URLSearchParams(this.stringFormData);\n        }\n        else {\n            return this.formData;\n        }\n    }\n    get enctype() {\n        var _a;\n        return formEnctypeFromString(((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formenctype\")) || this.formElement.enctype);\n    }\n    get isIdempotent() {\n        return this.fetchRequest.isIdempotent;\n    }\n    get stringFormData() {\n        return [...this.formData].reduce((entries, [name, value]) => {\n            return entries.concat(typeof value == \"string\" ? [[name, value]] : []);\n        }, []);\n    }\n    get confirmationMessage() {\n        return this.formElement.getAttribute(\"data-turbo-confirm\");\n    }\n    get needsConfirmation() {\n        return this.confirmationMessage !== null;\n    }\n    async start() {\n        const { initialized, requesting } = FormSubmissionState;\n        if (this.needsConfirmation) {\n            const answer = FormSubmission.confirmMethod(this.confirmationMessage, this.formElement);\n            if (!answer) {\n                return;\n            }\n        }\n        if (this.state == initialized) {\n            this.state = requesting;\n            return this.fetchRequest.perform();\n        }\n    }\n    stop() {\n        const { stopping, stopped } = FormSubmissionState;\n        if (this.state != stopping && this.state != stopped) {\n            this.state = stopping;\n            this.fetchRequest.cancel();\n            return true;\n        }\n    }\n    prepareHeadersForRequest(headers, request) {\n        if (!request.isIdempotent) {\n            const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n            if (token) {\n                headers[\"X-CSRF-Token\"] = token;\n            }\n            headers[\"Accept\"] = [StreamMessage.contentType, headers[\"Accept\"]].join(\", \");\n        }\n    }\n    requestStarted(request) {\n        var _a;\n        this.state = FormSubmissionState.waiting;\n        (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.setAttribute(\"disabled\", \"\");\n        dispatch(\"turbo:submit-start\", { target: this.formElement, detail: { formSubmission: this } });\n        this.delegate.formSubmissionStarted(this);\n    }\n    requestPreventedHandlingResponse(request, response) {\n        this.result = { success: response.succeeded, fetchResponse: response };\n    }\n    requestSucceededWithResponse(request, response) {\n        if (response.clientError || response.serverError) {\n            this.delegate.formSubmissionFailedWithResponse(this, response);\n        }\n        else if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) {\n            const error = new Error(\"Form responses must redirect to another location\");\n            this.delegate.formSubmissionErrored(this, error);\n        }\n        else {\n            this.state = FormSubmissionState.receiving;\n            this.result = { success: true, fetchResponse: response };\n            this.delegate.formSubmissionSucceededWithResponse(this, response);\n        }\n    }\n    requestFailedWithResponse(request, response) {\n        this.result = { success: false, fetchResponse: response };\n        this.delegate.formSubmissionFailedWithResponse(this, response);\n    }\n    requestErrored(request, error) {\n        this.result = { success: false, error };\n        this.delegate.formSubmissionErrored(this, error);\n    }\n    requestFinished(request) {\n        var _a;\n        this.state = FormSubmissionState.stopped;\n        (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.removeAttribute(\"disabled\");\n        dispatch(\"turbo:submit-end\", { target: this.formElement, detail: Object.assign({ formSubmission: this }, this.result) });\n        this.delegate.formSubmissionFinished(this);\n    }\n    requestMustRedirect(request) {\n        return !request.isIdempotent && this.mustRedirect;\n    }\n}\nfunction buildFormData(formElement, submitter) {\n    const formData = new FormData(formElement);\n    const name = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"name\");\n    const value = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"value\");\n    if (name && value != null && formData.get(name) != value) {\n        formData.append(name, value);\n    }\n    return formData;\n}\nfunction getCookieValue(cookieName) {\n    if (cookieName != null) {\n        const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n        const cookie = cookies.find((cookie) => cookie.startsWith(cookieName));\n        if (cookie) {\n            const value = cookie.split(\"=\").slice(1).join(\"=\");\n            return value ? decodeURIComponent(value) : undefined;\n        }\n    }\n}\nfunction getMetaContent(name) {\n    const element = document.querySelector(`meta[name=\"${name}\"]`);\n    return element && element.content;\n}\nfunction responseSucceededWithoutRedirect(response) {\n    return response.statusCode == 200 && !response.redirected;\n}\nfunction mergeFormDataEntries(url, entries) {\n    const searchParams = new URLSearchParams;\n    for (const [name, value] of entries) {\n        if (value instanceof File)\n            continue;\n        searchParams.append(name, value);\n    }\n    url.search = searchParams.toString();\n    return url;\n}\n\nclass Snapshot {\n    constructor(element) {\n        this.element = element;\n    }\n    get children() {\n        return [...this.element.children];\n    }\n    hasAnchor(anchor) {\n        return this.getElementForAnchor(anchor) != null;\n    }\n    getElementForAnchor(anchor) {\n        return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null;\n    }\n    get isConnected() {\n        return this.element.isConnected;\n    }\n    get firstAutofocusableElement() {\n        return this.element.querySelector(\"[autofocus]\");\n    }\n    get permanentElements() {\n        return [...this.element.querySelectorAll(\"[id][data-turbo-permanent]\")];\n    }\n    getPermanentElementById(id) {\n        return this.element.querySelector(`#${id}[data-turbo-permanent]`);\n    }\n    getPermanentElementMapForSnapshot(snapshot) {\n        const permanentElementMap = {};\n        for (const currentPermanentElement of this.permanentElements) {\n            const { id } = currentPermanentElement;\n            const newPermanentElement = snapshot.getPermanentElementById(id);\n            if (newPermanentElement) {\n                permanentElementMap[id] = [currentPermanentElement, newPermanentElement];\n            }\n        }\n        return permanentElementMap;\n    }\n}\n\nclass FormInterceptor {\n    constructor(delegate, element) {\n        this.submitBubbled = ((event) => {\n            const form = event.target;\n            if (!event.defaultPrevented && form instanceof HTMLFormElement && form.closest(\"turbo-frame, html\") == this.element) {\n                const submitter = event.submitter || undefined;\n                const method = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formmethod\")) || form.method;\n                if (method != \"dialog\" && this.delegate.shouldInterceptFormSubmission(form, submitter)) {\n                    event.preventDefault();\n                    event.stopImmediatePropagation();\n                    this.delegate.formSubmissionIntercepted(form, submitter);\n                }\n            }\n        });\n        this.delegate = delegate;\n        this.element = element;\n    }\n    start() {\n        this.element.addEventListener(\"submit\", this.submitBubbled);\n    }\n    stop() {\n        this.element.removeEventListener(\"submit\", this.submitBubbled);\n    }\n}\n\nclass View {\n    constructor(delegate, element) {\n        this.resolveRenderPromise = (value) => { };\n        this.resolveInterceptionPromise = (value) => { };\n        this.delegate = delegate;\n        this.element = element;\n    }\n    scrollToAnchor(anchor) {\n        const element = this.snapshot.getElementForAnchor(anchor);\n        if (element) {\n            this.scrollToElement(element);\n            this.focusElement(element);\n        }\n        else {\n            this.scrollToPosition({ x: 0, y: 0 });\n        }\n    }\n    scrollToAnchorFromLocation(location) {\n        this.scrollToAnchor(getAnchor(location));\n    }\n    scrollToElement(element) {\n        element.scrollIntoView();\n    }\n    focusElement(element) {\n        if (element instanceof HTMLElement) {\n            if (element.hasAttribute(\"tabindex\")) {\n                element.focus();\n            }\n            else {\n                element.setAttribute(\"tabindex\", \"-1\");\n                element.focus();\n                element.removeAttribute(\"tabindex\");\n            }\n        }\n    }\n    scrollToPosition({ x, y }) {\n        this.scrollRoot.scrollTo(x, y);\n    }\n    scrollToTop() {\n        this.scrollToPosition({ x: 0, y: 0 });\n    }\n    get scrollRoot() {\n        return window;\n    }\n    async render(renderer) {\n        const { isPreview, shouldRender, newSnapshot: snapshot } = renderer;\n        if (shouldRender) {\n            try {\n                this.renderPromise = new Promise(resolve => this.resolveRenderPromise = resolve);\n                this.renderer = renderer;\n                this.prepareToRenderSnapshot(renderer);\n                const renderInterception = new Promise(resolve => this.resolveInterceptionPromise = resolve);\n                const immediateRender = this.delegate.allowsImmediateRender(snapshot, this.resolveInterceptionPromise);\n                if (!immediateRender)\n                    await renderInterception;\n                await this.renderSnapshot(renderer);\n                this.delegate.viewRenderedSnapshot(snapshot, isPreview);\n                this.finishRenderingSnapshot(renderer);\n            }\n            finally {\n                delete this.renderer;\n                this.resolveRenderPromise(undefined);\n                delete this.renderPromise;\n            }\n        }\n        else {\n            this.invalidate();\n        }\n    }\n    invalidate() {\n        this.delegate.viewInvalidated();\n    }\n    prepareToRenderSnapshot(renderer) {\n        this.markAsPreview(renderer.isPreview);\n        renderer.prepareToRender();\n    }\n    markAsPreview(isPreview) {\n        if (isPreview) {\n            this.element.setAttribute(\"data-turbo-preview\", \"\");\n        }\n        else {\n            this.element.removeAttribute(\"data-turbo-preview\");\n        }\n    }\n    async renderSnapshot(renderer) {\n        await renderer.render();\n    }\n    finishRenderingSnapshot(renderer) {\n        renderer.finishRendering();\n    }\n}\n\nclass FrameView extends View {\n    invalidate() {\n        this.element.innerHTML = \"\";\n    }\n    get snapshot() {\n        return new Snapshot(this.element);\n    }\n}\n\nclass LinkInterceptor {\n    constructor(delegate, element) {\n        this.clickBubbled = (event) => {\n            if (this.respondsToEventTarget(event.target)) {\n                this.clickEvent = event;\n            }\n            else {\n                delete this.clickEvent;\n            }\n        };\n        this.linkClicked = ((event) => {\n            if (this.clickEvent && this.respondsToEventTarget(event.target) && event.target instanceof Element) {\n                if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url)) {\n                    this.clickEvent.preventDefault();\n                    event.preventDefault();\n                    this.delegate.linkClickIntercepted(event.target, event.detail.url);\n                }\n            }\n            delete this.clickEvent;\n        });\n        this.willVisit = () => {\n            delete this.clickEvent;\n        };\n        this.delegate = delegate;\n        this.element = element;\n    }\n    start() {\n        this.element.addEventListener(\"click\", this.clickBubbled);\n        document.addEventListener(\"turbo:click\", this.linkClicked);\n        document.addEventListener(\"turbo:before-visit\", this.willVisit);\n    }\n    stop() {\n        this.element.removeEventListener(\"click\", this.clickBubbled);\n        document.removeEventListener(\"turbo:click\", this.linkClicked);\n        document.removeEventListener(\"turbo:before-visit\", this.willVisit);\n    }\n    respondsToEventTarget(target) {\n        const element = target instanceof Element\n            ? target\n            : target instanceof Node\n                ? target.parentElement\n                : null;\n        return element && element.closest(\"turbo-frame, html\") == this.element;\n    }\n}\n\nclass Bardo {\n    constructor(permanentElementMap) {\n        this.permanentElementMap = permanentElementMap;\n    }\n    static preservingPermanentElements(permanentElementMap, callback) {\n        const bardo = new this(permanentElementMap);\n        bardo.enter();\n        callback();\n        bardo.leave();\n    }\n    enter() {\n        for (const id in this.permanentElementMap) {\n            const [, newPermanentElement] = this.permanentElementMap[id];\n            this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\n        }\n    }\n    leave() {\n        for (const id in this.permanentElementMap) {\n            const [currentPermanentElement] = this.permanentElementMap[id];\n            this.replaceCurrentPermanentElementWithClone(currentPermanentElement);\n            this.replacePlaceholderWithPermanentElement(currentPermanentElement);\n        }\n    }\n    replaceNewPermanentElementWithPlaceholder(permanentElement) {\n        const placeholder = createPlaceholderForPermanentElement(permanentElement);\n        permanentElement.replaceWith(placeholder);\n    }\n    replaceCurrentPermanentElementWithClone(permanentElement) {\n        const clone = permanentElement.cloneNode(true);\n        permanentElement.replaceWith(clone);\n    }\n    replacePlaceholderWithPermanentElement(permanentElement) {\n        const placeholder = this.getPlaceholderById(permanentElement.id);\n        placeholder === null || placeholder === void 0 ? void 0 : placeholder.replaceWith(permanentElement);\n    }\n    getPlaceholderById(id) {\n        return this.placeholders.find(element => element.content == id);\n    }\n    get placeholders() {\n        return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")];\n    }\n}\nfunction createPlaceholderForPermanentElement(permanentElement) {\n    const element = document.createElement(\"meta\");\n    element.setAttribute(\"name\", \"turbo-permanent-placeholder\");\n    element.setAttribute(\"content\", permanentElement.id);\n    return element;\n}\n\nclass Renderer {\n    constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) {\n        this.currentSnapshot = currentSnapshot;\n        this.newSnapshot = newSnapshot;\n        this.isPreview = isPreview;\n        this.willRender = willRender;\n        this.promise = new Promise((resolve, reject) => this.resolvingFunctions = { resolve, reject });\n    }\n    get shouldRender() {\n        return true;\n    }\n    prepareToRender() {\n        return;\n    }\n    finishRendering() {\n        if (this.resolvingFunctions) {\n            this.resolvingFunctions.resolve();\n            delete this.resolvingFunctions;\n        }\n    }\n    createScriptElement(element) {\n        if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n            return element;\n        }\n        else {\n            const createdScriptElement = document.createElement(\"script\");\n            if (this.cspNonce) {\n                createdScriptElement.nonce = this.cspNonce;\n            }\n            createdScriptElement.textContent = element.textContent;\n            createdScriptElement.async = false;\n            copyElementAttributes(createdScriptElement, element);\n            return createdScriptElement;\n        }\n    }\n    preservingPermanentElements(callback) {\n        Bardo.preservingPermanentElements(this.permanentElementMap, callback);\n    }\n    focusFirstAutofocusableElement() {\n        const element = this.connectedSnapshot.firstAutofocusableElement;\n        if (elementIsFocusable(element)) {\n            element.focus();\n        }\n    }\n    get connectedSnapshot() {\n        return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot;\n    }\n    get currentElement() {\n        return this.currentSnapshot.element;\n    }\n    get newElement() {\n        return this.newSnapshot.element;\n    }\n    get permanentElementMap() {\n        return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot);\n    }\n    get cspNonce() {\n        var _a;\n        return (_a = document.head.querySelector('meta[name=\"csp-nonce\"]')) === null || _a === void 0 ? void 0 : _a.getAttribute(\"content\");\n    }\n}\nfunction copyElementAttributes(destinationElement, sourceElement) {\n    for (const { name, value } of [...sourceElement.attributes]) {\n        destinationElement.setAttribute(name, value);\n    }\n}\nfunction elementIsFocusable(element) {\n    return element && typeof element.focus == \"function\";\n}\n\nclass FrameRenderer extends Renderer {\n    get shouldRender() {\n        return true;\n    }\n    async render() {\n        await nextAnimationFrame();\n        this.preservingPermanentElements(() => {\n            this.loadFrameElement();\n        });\n        this.scrollFrameIntoView();\n        await nextAnimationFrame();\n        this.focusFirstAutofocusableElement();\n        await nextAnimationFrame();\n        this.activateScriptElements();\n    }\n    loadFrameElement() {\n        var _a;\n        const destinationRange = document.createRange();\n        destinationRange.selectNodeContents(this.currentElement);\n        destinationRange.deleteContents();\n        const frameElement = this.newElement;\n        const sourceRange = (_a = frameElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.createRange();\n        if (sourceRange) {\n            sourceRange.selectNodeContents(frameElement);\n            this.currentElement.appendChild(sourceRange.extractContents());\n        }\n    }\n    scrollFrameIntoView() {\n        if (this.currentElement.autoscroll || this.newElement.autoscroll) {\n            const element = this.currentElement.firstElementChild;\n            const block = readScrollLogicalPosition(this.currentElement.getAttribute(\"data-autoscroll-block\"), \"end\");\n            if (element) {\n                element.scrollIntoView({ block });\n                return true;\n            }\n        }\n        return false;\n    }\n    activateScriptElements() {\n        for (const inertScriptElement of this.newScriptElements) {\n            const activatedScriptElement = this.createScriptElement(inertScriptElement);\n            inertScriptElement.replaceWith(activatedScriptElement);\n        }\n    }\n    get newScriptElements() {\n        return this.currentElement.querySelectorAll(\"script\");\n    }\n}\nfunction readScrollLogicalPosition(value, defaultValue) {\n    if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n        return value;\n    }\n    else {\n        return defaultValue;\n    }\n}\n\nclass ProgressBar {\n    constructor() {\n        this.hiding = false;\n        this.value = 0;\n        this.visible = false;\n        this.trickle = () => {\n            this.setValue(this.value + Math.random() / 100);\n        };\n        this.stylesheetElement = this.createStylesheetElement();\n        this.progressElement = this.createProgressElement();\n        this.installStylesheetElement();\n        this.setValue(0);\n    }\n    static get defaultCSS() {\n        return unindent `\n      .turbo-progress-bar {\n        position: fixed;\n        display: block;\n        top: 0;\n        left: 0;\n        height: 3px;\n        background: #0076ff;\n        z-index: 9999;\n        transition:\n          width ${ProgressBar.animationDuration}ms ease-out,\n          opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in;\n        transform: translate3d(0, 0, 0);\n      }\n    `;\n    }\n    show() {\n        if (!this.visible) {\n            this.visible = true;\n            this.installProgressElement();\n            this.startTrickling();\n        }\n    }\n    hide() {\n        if (this.visible && !this.hiding) {\n            this.hiding = true;\n            this.fadeProgressElement(() => {\n                this.uninstallProgressElement();\n                this.stopTrickling();\n                this.visible = false;\n                this.hiding = false;\n            });\n        }\n    }\n    setValue(value) {\n        this.value = value;\n        this.refresh();\n    }\n    installStylesheetElement() {\n        document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\n    }\n    installProgressElement() {\n        this.progressElement.style.width = \"0\";\n        this.progressElement.style.opacity = \"1\";\n        document.documentElement.insertBefore(this.progressElement, document.body);\n        this.refresh();\n    }\n    fadeProgressElement(callback) {\n        this.progressElement.style.opacity = \"0\";\n        setTimeout(callback, ProgressBar.animationDuration * 1.5);\n    }\n    uninstallProgressElement() {\n        if (this.progressElement.parentNode) {\n            document.documentElement.removeChild(this.progressElement);\n        }\n    }\n    startTrickling() {\n        if (!this.trickleInterval) {\n            this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n        }\n    }\n    stopTrickling() {\n        window.clearInterval(this.trickleInterval);\n        delete this.trickleInterval;\n    }\n    refresh() {\n        requestAnimationFrame(() => {\n            this.progressElement.style.width = `${10 + (this.value * 90)}%`;\n        });\n    }\n    createStylesheetElement() {\n        const element = document.createElement(\"style\");\n        element.type = \"text/css\";\n        element.textContent = ProgressBar.defaultCSS;\n        return element;\n    }\n    createProgressElement() {\n        const element = document.createElement(\"div\");\n        element.className = \"turbo-progress-bar\";\n        return element;\n    }\n}\nProgressBar.animationDuration = 300;\n\nclass HeadSnapshot extends Snapshot {\n    constructor() {\n        super(...arguments);\n        this.detailsByOuterHTML = this.children\n            .filter((element) => !elementIsNoscript(element))\n            .map((element) => elementWithoutNonce(element))\n            .reduce((result, element) => {\n            const { outerHTML } = element;\n            const details = outerHTML in result\n                ? result[outerHTML]\n                : {\n                    type: elementType(element),\n                    tracked: elementIsTracked(element),\n                    elements: []\n                };\n            return Object.assign(Object.assign({}, result), { [outerHTML]: Object.assign(Object.assign({}, details), { elements: [...details.elements, element] }) });\n        }, {});\n    }\n    get trackedElementSignature() {\n        return Object.keys(this.detailsByOuterHTML)\n            .filter(outerHTML => this.detailsByOuterHTML[outerHTML].tracked)\n            .join(\"\");\n    }\n    getScriptElementsNotInSnapshot(snapshot) {\n        return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot);\n    }\n    getStylesheetElementsNotInSnapshot(snapshot) {\n        return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot);\n    }\n    getElementsMatchingTypeNotInSnapshot(matchedType, snapshot) {\n        return Object.keys(this.detailsByOuterHTML)\n            .filter(outerHTML => !(outerHTML in snapshot.detailsByOuterHTML))\n            .map(outerHTML => this.detailsByOuterHTML[outerHTML])\n            .filter(({ type }) => type == matchedType)\n            .map(({ elements: [element] }) => element);\n    }\n    get provisionalElements() {\n        return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n            const { type, tracked, elements } = this.detailsByOuterHTML[outerHTML];\n            if (type == null && !tracked) {\n                return [...result, ...elements];\n            }\n            else if (elements.length > 1) {\n                return [...result, ...elements.slice(1)];\n            }\n            else {\n                return result;\n            }\n        }, []);\n    }\n    getMetaValue(name) {\n        const element = this.findMetaElementByName(name);\n        return element\n            ? element.getAttribute(\"content\")\n            : null;\n    }\n    findMetaElementByName(name) {\n        return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n            const { elements: [element] } = this.detailsByOuterHTML[outerHTML];\n            return elementIsMetaElementWithName(element, name) ? element : result;\n        }, undefined);\n    }\n}\nfunction elementType(element) {\n    if (elementIsScript(element)) {\n        return \"script\";\n    }\n    else if (elementIsStylesheet(element)) {\n        return \"stylesheet\";\n    }\n}\nfunction elementIsTracked(element) {\n    return element.getAttribute(\"data-turbo-track\") == \"reload\";\n}\nfunction elementIsScript(element) {\n    const tagName = element.tagName.toLowerCase();\n    return tagName == \"script\";\n}\nfunction elementIsNoscript(element) {\n    const tagName = element.tagName.toLowerCase();\n    return tagName == \"noscript\";\n}\nfunction elementIsStylesheet(element) {\n    const tagName = element.tagName.toLowerCase();\n    return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\");\n}\nfunction elementIsMetaElementWithName(element, name) {\n    const tagName = element.tagName.toLowerCase();\n    return tagName == \"meta\" && element.getAttribute(\"name\") == name;\n}\nfunction elementWithoutNonce(element) {\n    if (element.hasAttribute(\"nonce\")) {\n        element.setAttribute(\"nonce\", \"\");\n    }\n    return element;\n}\n\nclass PageSnapshot extends Snapshot {\n    constructor(element, headSnapshot) {\n        super(element);\n        this.headSnapshot = headSnapshot;\n    }\n    static fromHTMLString(html = \"\") {\n        return this.fromDocument(parseHTMLDocument(html));\n    }\n    static fromElement(element) {\n        return this.fromDocument(element.ownerDocument);\n    }\n    static fromDocument({ head, body }) {\n        return new this(body, new HeadSnapshot(head));\n    }\n    clone() {\n        return new PageSnapshot(this.element.cloneNode(true), this.headSnapshot);\n    }\n    get headElement() {\n        return this.headSnapshot.element;\n    }\n    get rootLocation() {\n        var _a;\n        const root = (_a = this.getSetting(\"root\")) !== null && _a !== void 0 ? _a : \"/\";\n        return expandURL(root);\n    }\n    get cacheControlValue() {\n        return this.getSetting(\"cache-control\");\n    }\n    get isPreviewable() {\n        return this.cacheControlValue != \"no-preview\";\n    }\n    get isCacheable() {\n        return this.cacheControlValue != \"no-cache\";\n    }\n    get isVisitable() {\n        return this.getSetting(\"visit-control\") != \"reload\";\n    }\n    getSetting(name) {\n        return this.headSnapshot.getMetaValue(`turbo-${name}`);\n    }\n}\n\nvar TimingMetric;\n(function (TimingMetric) {\n    TimingMetric[\"visitStart\"] = \"visitStart\";\n    TimingMetric[\"requestStart\"] = \"requestStart\";\n    TimingMetric[\"requestEnd\"] = \"requestEnd\";\n    TimingMetric[\"visitEnd\"] = \"visitEnd\";\n})(TimingMetric || (TimingMetric = {}));\nvar VisitState;\n(function (VisitState) {\n    VisitState[\"initialized\"] = \"initialized\";\n    VisitState[\"started\"] = \"started\";\n    VisitState[\"canceled\"] = \"canceled\";\n    VisitState[\"failed\"] = \"failed\";\n    VisitState[\"completed\"] = \"completed\";\n})(VisitState || (VisitState = {}));\nconst defaultOptions = {\n    action: \"advance\",\n    historyChanged: false,\n    visitCachedSnapshot: () => { },\n    willRender: true,\n};\nvar SystemStatusCode;\n(function (SystemStatusCode) {\n    SystemStatusCode[SystemStatusCode[\"networkFailure\"] = 0] = \"networkFailure\";\n    SystemStatusCode[SystemStatusCode[\"timeoutFailure\"] = -1] = \"timeoutFailure\";\n    SystemStatusCode[SystemStatusCode[\"contentTypeMismatch\"] = -2] = \"contentTypeMismatch\";\n})(SystemStatusCode || (SystemStatusCode = {}));\nclass Visit {\n    constructor(delegate, location, restorationIdentifier, options = {}) {\n        this.identifier = uuid();\n        this.timingMetrics = {};\n        this.followedRedirect = false;\n        this.historyChanged = false;\n        this.scrolled = false;\n        this.snapshotCached = false;\n        this.state = VisitState.initialized;\n        this.delegate = delegate;\n        this.location = location;\n        this.restorationIdentifier = restorationIdentifier || uuid();\n        const { action, historyChanged, referrer, snapshotHTML, response, visitCachedSnapshot, willRender } = Object.assign(Object.assign({}, defaultOptions), options);\n        this.action = action;\n        this.historyChanged = historyChanged;\n        this.referrer = referrer;\n        this.snapshotHTML = snapshotHTML;\n        this.response = response;\n        this.isSamePage = this.delegate.locationWithActionIsSamePage(this.location, this.action);\n        this.visitCachedSnapshot = visitCachedSnapshot;\n        this.willRender = willRender;\n        this.scrolled = !willRender;\n    }\n    get adapter() {\n        return this.delegate.adapter;\n    }\n    get view() {\n        return this.delegate.view;\n    }\n    get history() {\n        return this.delegate.history;\n    }\n    get restorationData() {\n        return this.history.getRestorationDataForIdentifier(this.restorationIdentifier);\n    }\n    get silent() {\n        return this.isSamePage;\n    }\n    start() {\n        if (this.state == VisitState.initialized) {\n            this.recordTimingMetric(TimingMetric.visitStart);\n            this.state = VisitState.started;\n            this.adapter.visitStarted(this);\n            this.delegate.visitStarted(this);\n        }\n    }\n    cancel() {\n        if (this.state == VisitState.started) {\n            if (this.request) {\n                this.request.cancel();\n            }\n            this.cancelRender();\n            this.state = VisitState.canceled;\n        }\n    }\n    complete() {\n        if (this.state == VisitState.started) {\n            this.recordTimingMetric(TimingMetric.visitEnd);\n            this.state = VisitState.completed;\n            this.adapter.visitCompleted(this);\n            this.delegate.visitCompleted(this);\n            this.followRedirect();\n        }\n    }\n    fail() {\n        if (this.state == VisitState.started) {\n            this.state = VisitState.failed;\n            this.adapter.visitFailed(this);\n        }\n    }\n    changeHistory() {\n        var _a;\n        if (!this.historyChanged) {\n            const actionForHistory = this.location.href === ((_a = this.referrer) === null || _a === void 0 ? void 0 : _a.href) ? \"replace\" : this.action;\n            const method = this.getHistoryMethodForAction(actionForHistory);\n            this.history.update(method, this.location, this.restorationIdentifier);\n            this.historyChanged = true;\n        }\n    }\n    issueRequest() {\n        if (this.hasPreloadedResponse()) {\n            this.simulateRequest();\n        }\n        else if (this.shouldIssueRequest() && !this.request) {\n            this.request = new FetchRequest(this, FetchMethod.get, this.location);\n            this.request.perform();\n        }\n    }\n    simulateRequest() {\n        if (this.response) {\n            this.startRequest();\n            this.recordResponse();\n            this.finishRequest();\n        }\n    }\n    startRequest() {\n        this.recordTimingMetric(TimingMetric.requestStart);\n        this.adapter.visitRequestStarted(this);\n    }\n    recordResponse(response = this.response) {\n        this.response = response;\n        if (response) {\n            const { statusCode } = response;\n            if (isSuccessful(statusCode)) {\n                this.adapter.visitRequestCompleted(this);\n            }\n            else {\n                this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n            }\n        }\n    }\n    finishRequest() {\n        this.recordTimingMetric(TimingMetric.requestEnd);\n        this.adapter.visitRequestFinished(this);\n    }\n    loadResponse() {\n        if (this.response) {\n            const { statusCode, responseHTML } = this.response;\n            this.render(async () => {\n                this.cacheSnapshot();\n                if (this.view.renderPromise)\n                    await this.view.renderPromise;\n                if (isSuccessful(statusCode) && responseHTML != null) {\n                    await this.view.renderPage(PageSnapshot.fromHTMLString(responseHTML), false, this.willRender);\n                    this.adapter.visitRendered(this);\n                    this.complete();\n                }\n                else {\n                    await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML));\n                    this.adapter.visitRendered(this);\n                    this.fail();\n                }\n            });\n        }\n    }\n    getCachedSnapshot() {\n        const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\n        if (snapshot && (!getAnchor(this.location) || snapshot.hasAnchor(getAnchor(this.location)))) {\n            if (this.action == \"restore\" || snapshot.isPreviewable) {\n                return snapshot;\n            }\n        }\n    }\n    getPreloadedSnapshot() {\n        if (this.snapshotHTML) {\n            return PageSnapshot.fromHTMLString(this.snapshotHTML);\n        }\n    }\n    hasCachedSnapshot() {\n        return this.getCachedSnapshot() != null;\n    }\n    loadCachedSnapshot() {\n        const snapshot = this.getCachedSnapshot();\n        if (snapshot) {\n            const isPreview = this.shouldIssueRequest();\n            this.render(async () => {\n                this.cacheSnapshot();\n                if (this.isSamePage) {\n                    this.adapter.visitRendered(this);\n                }\n                else {\n                    if (this.view.renderPromise)\n                        await this.view.renderPromise;\n                    await this.view.renderPage(snapshot, isPreview, this.willRender);\n                    this.adapter.visitRendered(this);\n                    if (!isPreview) {\n                        this.complete();\n                    }\n                }\n            });\n        }\n    }\n    followRedirect() {\n        var _a;\n        if (this.redirectedToLocation && !this.followedRedirect && ((_a = this.response) === null || _a === void 0 ? void 0 : _a.redirected)) {\n            this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n                action: 'replace',\n                response: this.response\n            });\n            this.followedRedirect = true;\n        }\n    }\n    goToSamePageAnchor() {\n        if (this.isSamePage) {\n            this.render(async () => {\n                this.cacheSnapshot();\n                this.adapter.visitRendered(this);\n            });\n        }\n    }\n    requestStarted() {\n        this.startRequest();\n    }\n    requestPreventedHandlingResponse(request, response) {\n    }\n    async requestSucceededWithResponse(request, response) {\n        const responseHTML = await response.responseHTML;\n        const { redirected, statusCode } = response;\n        if (responseHTML == undefined) {\n            this.recordResponse({ statusCode: SystemStatusCode.contentTypeMismatch, redirected });\n        }\n        else {\n            this.redirectedToLocation = response.redirected ? response.location : undefined;\n            this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n        }\n    }\n    async requestFailedWithResponse(request, response) {\n        const responseHTML = await response.responseHTML;\n        const { redirected, statusCode } = response;\n        if (responseHTML == undefined) {\n            this.recordResponse({ statusCode: SystemStatusCode.contentTypeMismatch, redirected });\n        }\n        else {\n            this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n        }\n    }\n    requestErrored(request, error) {\n        this.recordResponse({ statusCode: SystemStatusCode.networkFailure, redirected: false });\n    }\n    requestFinished() {\n        this.finishRequest();\n    }\n    performScroll() {\n        if (!this.scrolled) {\n            if (this.action == \"restore\") {\n                this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n            }\n            else {\n                this.scrollToAnchor() || this.view.scrollToTop();\n            }\n            if (this.isSamePage) {\n                this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation, this.location);\n            }\n            this.scrolled = true;\n        }\n    }\n    scrollToRestoredPosition() {\n        const { scrollPosition } = this.restorationData;\n        if (scrollPosition) {\n            this.view.scrollToPosition(scrollPosition);\n            return true;\n        }\n    }\n    scrollToAnchor() {\n        const anchor = getAnchor(this.location);\n        if (anchor != null) {\n            this.view.scrollToAnchor(anchor);\n            return true;\n        }\n    }\n    recordTimingMetric(metric) {\n        this.timingMetrics[metric] = new Date().getTime();\n    }\n    getTimingMetrics() {\n        return Object.assign({}, this.timingMetrics);\n    }\n    getHistoryMethodForAction(action) {\n        switch (action) {\n            case \"replace\": return history.replaceState;\n            case \"advance\":\n            case \"restore\": return history.pushState;\n        }\n    }\n    hasPreloadedResponse() {\n        return typeof this.response == \"object\";\n    }\n    shouldIssueRequest() {\n        if (this.isSamePage) {\n            return false;\n        }\n        else if (this.action == \"restore\") {\n            return !this.hasCachedSnapshot();\n        }\n        else {\n            return this.willRender;\n        }\n    }\n    cacheSnapshot() {\n        if (!this.snapshotCached) {\n            this.view.cacheSnapshot().then(snapshot => snapshot && this.visitCachedSnapshot(snapshot));\n            this.snapshotCached = true;\n        }\n    }\n    async render(callback) {\n        this.cancelRender();\n        await new Promise(resolve => {\n            this.frame = requestAnimationFrame(() => resolve());\n        });\n        await callback();\n        delete this.frame;\n        this.performScroll();\n    }\n    cancelRender() {\n        if (this.frame) {\n            cancelAnimationFrame(this.frame);\n            delete this.frame;\n        }\n    }\n}\nfunction isSuccessful(statusCode) {\n    return statusCode >= 200 && statusCode < 300;\n}\n\nclass BrowserAdapter {\n    constructor(session) {\n        this.progressBar = new ProgressBar;\n        this.showProgressBar = () => {\n            this.progressBar.show();\n        };\n        this.session = session;\n    }\n    visitProposedToLocation(location, options) {\n        this.navigator.startVisit(location, uuid(), options);\n    }\n    visitStarted(visit) {\n        visit.loadCachedSnapshot();\n        visit.issueRequest();\n        visit.changeHistory();\n        visit.goToSamePageAnchor();\n    }\n    visitRequestStarted(visit) {\n        this.progressBar.setValue(0);\n        if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n            this.showVisitProgressBarAfterDelay();\n        }\n        else {\n            this.showProgressBar();\n        }\n    }\n    visitRequestCompleted(visit) {\n        visit.loadResponse();\n    }\n    visitRequestFailedWithStatusCode(visit, statusCode) {\n        switch (statusCode) {\n            case SystemStatusCode.networkFailure:\n            case SystemStatusCode.timeoutFailure:\n            case SystemStatusCode.contentTypeMismatch:\n                return this.reload();\n            default:\n                return visit.loadResponse();\n        }\n    }\n    visitRequestFinished(visit) {\n        this.progressBar.setValue(1);\n        this.hideVisitProgressBar();\n    }\n    visitCompleted(visit) {\n    }\n    pageInvalidated() {\n        this.reload();\n    }\n    visitFailed(visit) {\n    }\n    visitRendered(visit) {\n    }\n    formSubmissionStarted(formSubmission) {\n        this.progressBar.setValue(0);\n        this.showFormProgressBarAfterDelay();\n    }\n    formSubmissionFinished(formSubmission) {\n        this.progressBar.setValue(1);\n        this.hideFormProgressBar();\n    }\n    showVisitProgressBarAfterDelay() {\n        this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n    }\n    hideVisitProgressBar() {\n        this.progressBar.hide();\n        if (this.visitProgressBarTimeout != null) {\n            window.clearTimeout(this.visitProgressBarTimeout);\n            delete this.visitProgressBarTimeout;\n        }\n    }\n    showFormProgressBarAfterDelay() {\n        if (this.formProgressBarTimeout == null) {\n            this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n        }\n    }\n    hideFormProgressBar() {\n        this.progressBar.hide();\n        if (this.formProgressBarTimeout != null) {\n            window.clearTimeout(this.formProgressBarTimeout);\n            delete this.formProgressBarTimeout;\n        }\n    }\n    reload() {\n        window.location.reload();\n    }\n    get navigator() {\n        return this.session.navigator;\n    }\n}\n\nclass CacheObserver {\n    constructor() {\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            addEventListener(\"turbo:before-cache\", this.removeStaleElements, false);\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            removeEventListener(\"turbo:before-cache\", this.removeStaleElements, false);\n        }\n    }\n    removeStaleElements() {\n        const staleElements = [...document.querySelectorAll('[data-turbo-cache=\"false\"]')];\n        for (const element of staleElements) {\n            element.remove();\n        }\n    }\n}\n\nclass FormSubmitObserver {\n    constructor(delegate) {\n        this.started = false;\n        this.submitCaptured = () => {\n            removeEventListener(\"submit\", this.submitBubbled, false);\n            addEventListener(\"submit\", this.submitBubbled, false);\n        };\n        this.submitBubbled = ((event) => {\n            if (!event.defaultPrevented) {\n                const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n                const submitter = event.submitter || undefined;\n                if (form) {\n                    const method = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formmethod\")) || form.getAttribute(\"method\");\n                    if (method != \"dialog\" && this.delegate.willSubmitForm(form, submitter)) {\n                        event.preventDefault();\n                        this.delegate.formSubmitted(form, submitter);\n                    }\n                }\n            }\n        });\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"submit\", this.submitCaptured, true);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"submit\", this.submitCaptured, true);\n            this.started = false;\n        }\n    }\n}\n\nclass FrameRedirector {\n    constructor(element) {\n        this.element = element;\n        this.linkInterceptor = new LinkInterceptor(this, element);\n        this.formInterceptor = new FormInterceptor(this, element);\n    }\n    start() {\n        this.linkInterceptor.start();\n        this.formInterceptor.start();\n    }\n    stop() {\n        this.linkInterceptor.stop();\n        this.formInterceptor.stop();\n    }\n    shouldInterceptLinkClick(element, url) {\n        return this.shouldRedirect(element);\n    }\n    linkClickIntercepted(element, url) {\n        const frame = this.findFrameElement(element);\n        if (frame) {\n            frame.delegate.linkClickIntercepted(element, url);\n        }\n    }\n    shouldInterceptFormSubmission(element, submitter) {\n        return this.shouldSubmit(element, submitter);\n    }\n    formSubmissionIntercepted(element, submitter) {\n        const frame = this.findFrameElement(element, submitter);\n        if (frame) {\n            frame.removeAttribute(\"reloadable\");\n            frame.delegate.formSubmissionIntercepted(element, submitter);\n        }\n    }\n    shouldSubmit(form, submitter) {\n        var _a;\n        const action = getAction(form, submitter);\n        const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n        const rootLocation = expandURL((_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : \"/\");\n        return this.shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation);\n    }\n    shouldRedirect(element, submitter) {\n        const frame = this.findFrameElement(element, submitter);\n        return frame ? frame != element.closest(\"turbo-frame\") : false;\n    }\n    findFrameElement(element, submitter) {\n        const id = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"data-turbo-frame\")) || element.getAttribute(\"data-turbo-frame\");\n        if (id && id != \"_top\") {\n            const frame = this.element.querySelector(`#${id}:not([disabled])`);\n            if (frame instanceof FrameElement) {\n                return frame;\n            }\n        }\n    }\n}\n\nclass History {\n    constructor(delegate) {\n        this.restorationIdentifier = uuid();\n        this.restorationData = {};\n        this.started = false;\n        this.pageLoaded = false;\n        this.onPopState = (event) => {\n            if (this.shouldHandlePopState()) {\n                const { turbo } = event.state || {};\n                if (turbo) {\n                    this.location = new URL(window.location.href);\n                    const { restorationIdentifier } = turbo;\n                    this.restorationIdentifier = restorationIdentifier;\n                    this.delegate.historyPoppedToLocationWithRestorationIdentifier(this.location, restorationIdentifier);\n                }\n            }\n        };\n        this.onPageLoad = async (event) => {\n            await nextMicrotask();\n            this.pageLoaded = true;\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"popstate\", this.onPopState, false);\n            addEventListener(\"load\", this.onPageLoad, false);\n            this.started = true;\n            this.replace(new URL(window.location.href));\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"popstate\", this.onPopState, false);\n            removeEventListener(\"load\", this.onPageLoad, false);\n            this.started = false;\n        }\n    }\n    push(location, restorationIdentifier) {\n        this.update(history.pushState, location, restorationIdentifier);\n    }\n    replace(location, restorationIdentifier) {\n        this.update(history.replaceState, location, restorationIdentifier);\n    }\n    update(method, location, restorationIdentifier = uuid()) {\n        const state = { turbo: { restorationIdentifier } };\n        method.call(history, state, \"\", location.href);\n        this.location = location;\n        this.restorationIdentifier = restorationIdentifier;\n    }\n    getRestorationDataForIdentifier(restorationIdentifier) {\n        return this.restorationData[restorationIdentifier] || {};\n    }\n    updateRestorationData(additionalData) {\n        const { restorationIdentifier } = this;\n        const restorationData = this.restorationData[restorationIdentifier];\n        this.restorationData[restorationIdentifier] = Object.assign(Object.assign({}, restorationData), additionalData);\n    }\n    assumeControlOfScrollRestoration() {\n        var _a;\n        if (!this.previousScrollRestoration) {\n            this.previousScrollRestoration = (_a = history.scrollRestoration) !== null && _a !== void 0 ? _a : \"auto\";\n            history.scrollRestoration = \"manual\";\n        }\n    }\n    relinquishControlOfScrollRestoration() {\n        if (this.previousScrollRestoration) {\n            history.scrollRestoration = this.previousScrollRestoration;\n            delete this.previousScrollRestoration;\n        }\n    }\n    shouldHandlePopState() {\n        return this.pageIsLoaded();\n    }\n    pageIsLoaded() {\n        return this.pageLoaded || document.readyState == \"complete\";\n    }\n}\n\nclass LinkClickObserver {\n    constructor(delegate) {\n        this.started = false;\n        this.clickCaptured = () => {\n            removeEventListener(\"click\", this.clickBubbled, false);\n            addEventListener(\"click\", this.clickBubbled, false);\n        };\n        this.clickBubbled = (event) => {\n            if (this.clickEventIsSignificant(event)) {\n                const target = (event.composedPath && event.composedPath()[0]) || event.target;\n                const link = this.findLinkFromClickTarget(target);\n                if (link) {\n                    const location = this.getLocationForLink(link);\n                    if (this.delegate.willFollowLinkToLocation(link, location)) {\n                        event.preventDefault();\n                        this.delegate.followedLinkToLocation(link, location);\n                    }\n                }\n            }\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"click\", this.clickCaptured, true);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"click\", this.clickCaptured, true);\n            this.started = false;\n        }\n    }\n    clickEventIsSignificant(event) {\n        return !((event.target && event.target.isContentEditable)\n            || event.defaultPrevented\n            || event.which > 1\n            || event.altKey\n            || event.ctrlKey\n            || event.metaKey\n            || event.shiftKey);\n    }\n    findLinkFromClickTarget(target) {\n        if (target instanceof Element) {\n            return target.closest(\"a[href]:not([target^=_]):not([download])\");\n        }\n    }\n    getLocationForLink(link) {\n        return expandURL(link.getAttribute(\"href\") || \"\");\n    }\n}\n\nfunction isAction(action) {\n    return action == \"advance\" || action == \"replace\" || action == \"restore\";\n}\n\nclass Navigator {\n    constructor(delegate) {\n        this.delegate = delegate;\n    }\n    proposeVisit(location, options = {}) {\n        if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n            if (locationIsVisitable(location, this.view.snapshot.rootLocation)) {\n                this.delegate.visitProposedToLocation(location, options);\n            }\n            else {\n                window.location.href = location.toString();\n            }\n        }\n    }\n    startVisit(locatable, restorationIdentifier, options = {}) {\n        this.stop();\n        this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, Object.assign({ referrer: this.location }, options));\n        this.currentVisit.start();\n    }\n    submitForm(form, submitter) {\n        this.stop();\n        this.formSubmission = new FormSubmission(this, form, submitter, true);\n        this.formSubmission.start();\n    }\n    stop() {\n        if (this.formSubmission) {\n            this.formSubmission.stop();\n            delete this.formSubmission;\n        }\n        if (this.currentVisit) {\n            this.currentVisit.cancel();\n            delete this.currentVisit;\n        }\n    }\n    get adapter() {\n        return this.delegate.adapter;\n    }\n    get view() {\n        return this.delegate.view;\n    }\n    get history() {\n        return this.delegate.history;\n    }\n    formSubmissionStarted(formSubmission) {\n        if (typeof this.adapter.formSubmissionStarted === 'function') {\n            this.adapter.formSubmissionStarted(formSubmission);\n        }\n    }\n    async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n        if (formSubmission == this.formSubmission) {\n            const responseHTML = await fetchResponse.responseHTML;\n            if (responseHTML) {\n                if (formSubmission.method != FetchMethod.get) {\n                    this.view.clearSnapshotCache();\n                }\n                const { statusCode, redirected } = fetchResponse;\n                const action = this.getActionForFormSubmission(formSubmission);\n                const visitOptions = { action, response: { statusCode, responseHTML, redirected } };\n                this.proposeVisit(fetchResponse.location, visitOptions);\n            }\n        }\n    }\n    async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n        const responseHTML = await fetchResponse.responseHTML;\n        if (responseHTML) {\n            const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n            if (fetchResponse.serverError) {\n                await this.view.renderError(snapshot);\n            }\n            else {\n                await this.view.renderPage(snapshot);\n            }\n            this.view.scrollToTop();\n            this.view.clearSnapshotCache();\n        }\n    }\n    formSubmissionErrored(formSubmission, error) {\n        console.error(error);\n    }\n    formSubmissionFinished(formSubmission) {\n        if (typeof this.adapter.formSubmissionFinished === 'function') {\n            this.adapter.formSubmissionFinished(formSubmission);\n        }\n    }\n    visitStarted(visit) {\n        this.delegate.visitStarted(visit);\n    }\n    visitCompleted(visit) {\n        this.delegate.visitCompleted(visit);\n    }\n    locationWithActionIsSamePage(location, action) {\n        const anchor = getAnchor(location);\n        const currentAnchor = getAnchor(this.view.lastRenderedLocation);\n        const isRestorationToTop = action === 'restore' && typeof anchor === 'undefined';\n        return action !== \"replace\" &&\n            getRequestURL(location) === getRequestURL(this.view.lastRenderedLocation) &&\n            (isRestorationToTop || (anchor != null && anchor !== currentAnchor));\n    }\n    visitScrolledToSamePageLocation(oldURL, newURL) {\n        this.delegate.visitScrolledToSamePageLocation(oldURL, newURL);\n    }\n    get location() {\n        return this.history.location;\n    }\n    get restorationIdentifier() {\n        return this.history.restorationIdentifier;\n    }\n    getActionForFormSubmission(formSubmission) {\n        const { formElement, submitter } = formSubmission;\n        const action = getAttribute(\"data-turbo-action\", submitter, formElement);\n        return isAction(action) ? action : \"advance\";\n    }\n}\n\nvar PageStage;\n(function (PageStage) {\n    PageStage[PageStage[\"initial\"] = 0] = \"initial\";\n    PageStage[PageStage[\"loading\"] = 1] = \"loading\";\n    PageStage[PageStage[\"interactive\"] = 2] = \"interactive\";\n    PageStage[PageStage[\"complete\"] = 3] = \"complete\";\n})(PageStage || (PageStage = {}));\nclass PageObserver {\n    constructor(delegate) {\n        this.stage = PageStage.initial;\n        this.started = false;\n        this.interpretReadyState = () => {\n            const { readyState } = this;\n            if (readyState == \"interactive\") {\n                this.pageIsInteractive();\n            }\n            else if (readyState == \"complete\") {\n                this.pageIsComplete();\n            }\n        };\n        this.pageWillUnload = () => {\n            this.delegate.pageWillUnload();\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            if (this.stage == PageStage.initial) {\n                this.stage = PageStage.loading;\n            }\n            document.addEventListener(\"readystatechange\", this.interpretReadyState, false);\n            addEventListener(\"pagehide\", this.pageWillUnload, false);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            document.removeEventListener(\"readystatechange\", this.interpretReadyState, false);\n            removeEventListener(\"pagehide\", this.pageWillUnload, false);\n            this.started = false;\n        }\n    }\n    pageIsInteractive() {\n        if (this.stage == PageStage.loading) {\n            this.stage = PageStage.interactive;\n            this.delegate.pageBecameInteractive();\n        }\n    }\n    pageIsComplete() {\n        this.pageIsInteractive();\n        if (this.stage == PageStage.interactive) {\n            this.stage = PageStage.complete;\n            this.delegate.pageLoaded();\n        }\n    }\n    get readyState() {\n        return document.readyState;\n    }\n}\n\nclass ScrollObserver {\n    constructor(delegate) {\n        this.started = false;\n        this.onScroll = () => {\n            this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"scroll\", this.onScroll, false);\n            this.onScroll();\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"scroll\", this.onScroll, false);\n            this.started = false;\n        }\n    }\n    updatePosition(position) {\n        this.delegate.scrollPositionChanged(position);\n    }\n}\n\nclass StreamObserver {\n    constructor(delegate) {\n        this.sources = new Set;\n        this.started = false;\n        this.inspectFetchResponse = ((event) => {\n            const response = fetchResponseFromEvent(event);\n            if (response && fetchResponseIsStream(response)) {\n                event.preventDefault();\n                this.receiveMessageResponse(response);\n            }\n        });\n        this.receiveMessageEvent = (event) => {\n            if (this.started && typeof event.data == \"string\") {\n                this.receiveMessageHTML(event.data);\n            }\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n        }\n    }\n    connectStreamSource(source) {\n        if (!this.streamSourceIsConnected(source)) {\n            this.sources.add(source);\n            source.addEventListener(\"message\", this.receiveMessageEvent, false);\n        }\n    }\n    disconnectStreamSource(source) {\n        if (this.streamSourceIsConnected(source)) {\n            this.sources.delete(source);\n            source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n        }\n    }\n    streamSourceIsConnected(source) {\n        return this.sources.has(source);\n    }\n    async receiveMessageResponse(response) {\n        const html = await response.responseHTML;\n        if (html) {\n            this.receiveMessageHTML(html);\n        }\n    }\n    receiveMessageHTML(html) {\n        this.delegate.receivedMessageFromStream(new StreamMessage(html));\n    }\n}\nfunction fetchResponseFromEvent(event) {\n    var _a;\n    const fetchResponse = (_a = event.detail) === null || _a === void 0 ? void 0 : _a.fetchResponse;\n    if (fetchResponse instanceof FetchResponse) {\n        return fetchResponse;\n    }\n}\nfunction fetchResponseIsStream(response) {\n    var _a;\n    const contentType = (_a = response.contentType) !== null && _a !== void 0 ? _a : \"\";\n    return contentType.startsWith(StreamMessage.contentType);\n}\n\nclass ErrorRenderer extends Renderer {\n    async render() {\n        this.replaceHeadAndBody();\n        this.activateScriptElements();\n    }\n    replaceHeadAndBody() {\n        const { documentElement, head, body } = document;\n        documentElement.replaceChild(this.newHead, head);\n        documentElement.replaceChild(this.newElement, body);\n    }\n    activateScriptElements() {\n        for (const replaceableElement of this.scriptElements) {\n            const parentNode = replaceableElement.parentNode;\n            if (parentNode) {\n                const element = this.createScriptElement(replaceableElement);\n                parentNode.replaceChild(element, replaceableElement);\n            }\n        }\n    }\n    get newHead() {\n        return this.newSnapshot.headSnapshot.element;\n    }\n    get scriptElements() {\n        return [...document.documentElement.querySelectorAll(\"script\")];\n    }\n}\n\nclass PageRenderer extends Renderer {\n    get shouldRender() {\n        return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical;\n    }\n    prepareToRender() {\n        this.mergeHead();\n    }\n    async render() {\n        if (this.willRender) {\n            this.replaceBody();\n        }\n    }\n    finishRendering() {\n        super.finishRendering();\n        if (!this.isPreview) {\n            this.focusFirstAutofocusableElement();\n        }\n    }\n    get currentHeadSnapshot() {\n        return this.currentSnapshot.headSnapshot;\n    }\n    get newHeadSnapshot() {\n        return this.newSnapshot.headSnapshot;\n    }\n    get newElement() {\n        return this.newSnapshot.element;\n    }\n    mergeHead() {\n        this.copyNewHeadStylesheetElements();\n        this.copyNewHeadScriptElements();\n        this.removeCurrentHeadProvisionalElements();\n        this.copyNewHeadProvisionalElements();\n    }\n    replaceBody() {\n        this.preservingPermanentElements(() => {\n            this.activateNewBody();\n            this.assignNewBody();\n        });\n    }\n    get trackedElementsAreIdentical() {\n        return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature;\n    }\n    copyNewHeadStylesheetElements() {\n        for (const element of this.newHeadStylesheetElements) {\n            document.head.appendChild(element);\n        }\n    }\n    copyNewHeadScriptElements() {\n        for (const element of this.newHeadScriptElements) {\n            document.head.appendChild(this.createScriptElement(element));\n        }\n    }\n    removeCurrentHeadProvisionalElements() {\n        for (const element of this.currentHeadProvisionalElements) {\n            document.head.removeChild(element);\n        }\n    }\n    copyNewHeadProvisionalElements() {\n        for (const element of this.newHeadProvisionalElements) {\n            document.head.appendChild(element);\n        }\n    }\n    activateNewBody() {\n        document.adoptNode(this.newElement);\n        this.activateNewBodyScriptElements();\n    }\n    activateNewBodyScriptElements() {\n        for (const inertScriptElement of this.newBodyScriptElements) {\n            const activatedScriptElement = this.createScriptElement(inertScriptElement);\n            inertScriptElement.replaceWith(activatedScriptElement);\n        }\n    }\n    assignNewBody() {\n        if (document.body && this.newElement instanceof HTMLBodyElement) {\n            document.body.replaceWith(this.newElement);\n        }\n        else {\n            document.documentElement.appendChild(this.newElement);\n        }\n    }\n    get newHeadStylesheetElements() {\n        return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot);\n    }\n    get newHeadScriptElements() {\n        return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot);\n    }\n    get currentHeadProvisionalElements() {\n        return this.currentHeadSnapshot.provisionalElements;\n    }\n    get newHeadProvisionalElements() {\n        return this.newHeadSnapshot.provisionalElements;\n    }\n    get newBodyScriptElements() {\n        return this.newElement.querySelectorAll(\"script\");\n    }\n}\n\nclass SnapshotCache {\n    constructor(size) {\n        this.keys = [];\n        this.snapshots = {};\n        this.size = size;\n    }\n    has(location) {\n        return toCacheKey(location) in this.snapshots;\n    }\n    get(location) {\n        if (this.has(location)) {\n            const snapshot = this.read(location);\n            this.touch(location);\n            return snapshot;\n        }\n    }\n    put(location, snapshot) {\n        this.write(location, snapshot);\n        this.touch(location);\n        return snapshot;\n    }\n    clear() {\n        this.snapshots = {};\n    }\n    read(location) {\n        return this.snapshots[toCacheKey(location)];\n    }\n    write(location, snapshot) {\n        this.snapshots[toCacheKey(location)] = snapshot;\n    }\n    touch(location) {\n        const key = toCacheKey(location);\n        const index = this.keys.indexOf(key);\n        if (index > -1)\n            this.keys.splice(index, 1);\n        this.keys.unshift(key);\n        this.trim();\n    }\n    trim() {\n        for (const key of this.keys.splice(this.size)) {\n            delete this.snapshots[key];\n        }\n    }\n}\n\nclass PageView extends View {\n    constructor() {\n        super(...arguments);\n        this.snapshotCache = new SnapshotCache(10);\n        this.lastRenderedLocation = new URL(location.href);\n    }\n    renderPage(snapshot, isPreview = false, willRender = true) {\n        const renderer = new PageRenderer(this.snapshot, snapshot, isPreview, willRender);\n        return this.render(renderer);\n    }\n    renderError(snapshot) {\n        const renderer = new ErrorRenderer(this.snapshot, snapshot, false);\n        return this.render(renderer);\n    }\n    clearSnapshotCache() {\n        this.snapshotCache.clear();\n    }\n    async cacheSnapshot() {\n        if (this.shouldCacheSnapshot) {\n            this.delegate.viewWillCacheSnapshot();\n            const { snapshot, lastRenderedLocation: location } = this;\n            await nextEventLoopTick();\n            const cachedSnapshot = snapshot.clone();\n            this.snapshotCache.put(location, cachedSnapshot);\n            return cachedSnapshot;\n        }\n    }\n    getCachedSnapshotForLocation(location) {\n        return this.snapshotCache.get(location);\n    }\n    get snapshot() {\n        return PageSnapshot.fromElement(this.element);\n    }\n    get shouldCacheSnapshot() {\n        return this.snapshot.isCacheable;\n    }\n}\n\nclass Session {\n    constructor() {\n        this.navigator = new Navigator(this);\n        this.history = new History(this);\n        this.view = new PageView(this, document.documentElement);\n        this.adapter = new BrowserAdapter(this);\n        this.pageObserver = new PageObserver(this);\n        this.cacheObserver = new CacheObserver();\n        this.linkClickObserver = new LinkClickObserver(this);\n        this.formSubmitObserver = new FormSubmitObserver(this);\n        this.scrollObserver = new ScrollObserver(this);\n        this.streamObserver = new StreamObserver(this);\n        this.frameRedirector = new FrameRedirector(document.documentElement);\n        this.drive = true;\n        this.enabled = true;\n        this.progressBarDelay = 500;\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.pageObserver.start();\n            this.cacheObserver.start();\n            this.linkClickObserver.start();\n            this.formSubmitObserver.start();\n            this.scrollObserver.start();\n            this.streamObserver.start();\n            this.frameRedirector.start();\n            this.history.start();\n            this.started = true;\n            this.enabled = true;\n        }\n    }\n    disable() {\n        this.enabled = false;\n    }\n    stop() {\n        if (this.started) {\n            this.pageObserver.stop();\n            this.cacheObserver.stop();\n            this.linkClickObserver.stop();\n            this.formSubmitObserver.stop();\n            this.scrollObserver.stop();\n            this.streamObserver.stop();\n            this.frameRedirector.stop();\n            this.history.stop();\n            this.started = false;\n        }\n    }\n    registerAdapter(adapter) {\n        this.adapter = adapter;\n    }\n    visit(location, options = {}) {\n        this.navigator.proposeVisit(expandURL(location), options);\n    }\n    connectStreamSource(source) {\n        this.streamObserver.connectStreamSource(source);\n    }\n    disconnectStreamSource(source) {\n        this.streamObserver.disconnectStreamSource(source);\n    }\n    renderStreamMessage(message) {\n        document.documentElement.appendChild(StreamMessage.wrap(message).fragment);\n    }\n    clearCache() {\n        this.view.clearSnapshotCache();\n    }\n    setProgressBarDelay(delay) {\n        this.progressBarDelay = delay;\n    }\n    get location() {\n        return this.history.location;\n    }\n    get restorationIdentifier() {\n        return this.history.restorationIdentifier;\n    }\n    historyPoppedToLocationWithRestorationIdentifier(location, restorationIdentifier) {\n        if (this.enabled) {\n            this.navigator.startVisit(location, restorationIdentifier, { action: \"restore\", historyChanged: true });\n        }\n        else {\n            this.adapter.pageInvalidated();\n        }\n    }\n    scrollPositionChanged(position) {\n        this.history.updateRestorationData({ scrollPosition: position });\n    }\n    willFollowLinkToLocation(link, location) {\n        return this.elementDriveEnabled(link)\n            && locationIsVisitable(location, this.snapshot.rootLocation)\n            && this.applicationAllowsFollowingLinkToLocation(link, location);\n    }\n    followedLinkToLocation(link, location) {\n        const action = this.getActionForLink(link);\n        this.convertLinkWithMethodClickToFormSubmission(link) || this.visit(location.href, { action });\n    }\n    convertLinkWithMethodClickToFormSubmission(link) {\n        const linkMethod = link.getAttribute(\"data-turbo-method\");\n        if (linkMethod) {\n            const form = document.createElement(\"form\");\n            form.method = linkMethod;\n            form.action = link.getAttribute(\"href\") || \"undefined\";\n            form.hidden = true;\n            if (link.hasAttribute(\"data-turbo-confirm\")) {\n                form.setAttribute(\"data-turbo-confirm\", link.getAttribute(\"data-turbo-confirm\"));\n            }\n            const frame = this.getTargetFrameForLink(link);\n            if (frame) {\n                form.setAttribute(\"data-turbo-frame\", frame);\n                form.addEventListener(\"turbo:submit-start\", () => form.remove());\n            }\n            else {\n                form.addEventListener(\"submit\", () => form.remove());\n            }\n            document.body.appendChild(form);\n            return dispatch(\"submit\", { cancelable: true, target: form });\n        }\n        else {\n            return false;\n        }\n    }\n    allowsVisitingLocationWithAction(location, action) {\n        return this.locationWithActionIsSamePage(location, action) || this.applicationAllowsVisitingLocation(location);\n    }\n    visitProposedToLocation(location, options) {\n        extendURLWithDeprecatedProperties(location);\n        this.adapter.visitProposedToLocation(location, options);\n    }\n    visitStarted(visit) {\n        extendURLWithDeprecatedProperties(visit.location);\n        if (!visit.silent) {\n            this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n        }\n    }\n    visitCompleted(visit) {\n        this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n    }\n    locationWithActionIsSamePage(location, action) {\n        return this.navigator.locationWithActionIsSamePage(location, action);\n    }\n    visitScrolledToSamePageLocation(oldURL, newURL) {\n        this.notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL);\n    }\n    willSubmitForm(form, submitter) {\n        const action = getAction(form, submitter);\n        return this.elementDriveEnabled(form)\n            && (!submitter || this.elementDriveEnabled(submitter))\n            && locationIsVisitable(expandURL(action), this.snapshot.rootLocation);\n    }\n    formSubmitted(form, submitter) {\n        this.navigator.submitForm(form, submitter);\n    }\n    pageBecameInteractive() {\n        this.view.lastRenderedLocation = this.location;\n        this.notifyApplicationAfterPageLoad();\n    }\n    pageLoaded() {\n        this.history.assumeControlOfScrollRestoration();\n    }\n    pageWillUnload() {\n        this.history.relinquishControlOfScrollRestoration();\n    }\n    receivedMessageFromStream(message) {\n        this.renderStreamMessage(message);\n    }\n    viewWillCacheSnapshot() {\n        var _a;\n        if (!((_a = this.navigator.currentVisit) === null || _a === void 0 ? void 0 : _a.silent)) {\n            this.notifyApplicationBeforeCachingSnapshot();\n        }\n    }\n    allowsImmediateRender({ element }, resume) {\n        const event = this.notifyApplicationBeforeRender(element, resume);\n        return !event.defaultPrevented;\n    }\n    viewRenderedSnapshot(snapshot, isPreview) {\n        this.view.lastRenderedLocation = this.history.location;\n        this.notifyApplicationAfterRender();\n    }\n    viewInvalidated() {\n        this.adapter.pageInvalidated();\n    }\n    frameLoaded(frame) {\n        this.notifyApplicationAfterFrameLoad(frame);\n    }\n    frameRendered(fetchResponse, frame) {\n        this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n    }\n    applicationAllowsFollowingLinkToLocation(link, location) {\n        const event = this.notifyApplicationAfterClickingLinkToLocation(link, location);\n        return !event.defaultPrevented;\n    }\n    applicationAllowsVisitingLocation(location) {\n        const event = this.notifyApplicationBeforeVisitingLocation(location);\n        return !event.defaultPrevented;\n    }\n    notifyApplicationAfterClickingLinkToLocation(link, location) {\n        return dispatch(\"turbo:click\", { target: link, detail: { url: location.href }, cancelable: true });\n    }\n    notifyApplicationBeforeVisitingLocation(location) {\n        return dispatch(\"turbo:before-visit\", { detail: { url: location.href }, cancelable: true });\n    }\n    notifyApplicationAfterVisitingLocation(location, action) {\n        markAsBusy(document.documentElement);\n        return dispatch(\"turbo:visit\", { detail: { url: location.href, action } });\n    }\n    notifyApplicationBeforeCachingSnapshot() {\n        return dispatch(\"turbo:before-cache\");\n    }\n    notifyApplicationBeforeRender(newBody, resume) {\n        return dispatch(\"turbo:before-render\", { detail: { newBody, resume }, cancelable: true });\n    }\n    notifyApplicationAfterRender() {\n        return dispatch(\"turbo:render\");\n    }\n    notifyApplicationAfterPageLoad(timing = {}) {\n        clearBusyState(document.documentElement);\n        return dispatch(\"turbo:load\", { detail: { url: this.location.href, timing } });\n    }\n    notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL) {\n        dispatchEvent(new HashChangeEvent(\"hashchange\", { oldURL: oldURL.toString(), newURL: newURL.toString() }));\n    }\n    notifyApplicationAfterFrameLoad(frame) {\n        return dispatch(\"turbo:frame-load\", { target: frame });\n    }\n    notifyApplicationAfterFrameRender(fetchResponse, frame) {\n        return dispatch(\"turbo:frame-render\", { detail: { fetchResponse }, target: frame, cancelable: true });\n    }\n    elementDriveEnabled(element) {\n        const container = element === null || element === void 0 ? void 0 : element.closest(\"[data-turbo]\");\n        if (this.drive) {\n            if (container) {\n                return container.getAttribute(\"data-turbo\") != \"false\";\n            }\n            else {\n                return true;\n            }\n        }\n        else {\n            if (container) {\n                return container.getAttribute(\"data-turbo\") == \"true\";\n            }\n            else {\n                return false;\n            }\n        }\n    }\n    getActionForLink(link) {\n        const action = link.getAttribute(\"data-turbo-action\");\n        return isAction(action) ? action : \"advance\";\n    }\n    getTargetFrameForLink(link) {\n        const frame = link.getAttribute(\"data-turbo-frame\");\n        if (frame) {\n            return frame;\n        }\n        else {\n            const container = link.closest(\"turbo-frame\");\n            if (container) {\n                return container.id;\n            }\n        }\n    }\n    get snapshot() {\n        return this.view.snapshot;\n    }\n}\nfunction extendURLWithDeprecatedProperties(url) {\n    Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\nconst deprecatedLocationPropertyDescriptors = {\n    absoluteURL: {\n        get() {\n            return this.toString();\n        }\n    }\n};\n\nconst session = new Session;\nconst { navigator: navigator$1 } = session;\nfunction start() {\n    session.start();\n}\nfunction registerAdapter(adapter) {\n    session.registerAdapter(adapter);\n}\nfunction visit(location, options) {\n    session.visit(location, options);\n}\nfunction connectStreamSource(source) {\n    session.connectStreamSource(source);\n}\nfunction disconnectStreamSource(source) {\n    session.disconnectStreamSource(source);\n}\nfunction renderStreamMessage(message) {\n    session.renderStreamMessage(message);\n}\nfunction clearCache() {\n    session.clearCache();\n}\nfunction setProgressBarDelay(delay) {\n    session.setProgressBarDelay(delay);\n}\nfunction setConfirmMethod(confirmMethod) {\n    FormSubmission.confirmMethod = confirmMethod;\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    navigator: navigator$1,\n    session: session,\n    PageRenderer: PageRenderer,\n    PageSnapshot: PageSnapshot,\n    start: start,\n    registerAdapter: registerAdapter,\n    visit: visit,\n    connectStreamSource: connectStreamSource,\n    disconnectStreamSource: disconnectStreamSource,\n    renderStreamMessage: renderStreamMessage,\n    clearCache: clearCache,\n    setProgressBarDelay: setProgressBarDelay,\n    setConfirmMethod: setConfirmMethod\n});\n\nclass FrameController {\n    constructor(element) {\n        this.fetchResponseLoaded = (fetchResponse) => { };\n        this.currentFetchRequest = null;\n        this.resolveVisitPromise = () => { };\n        this.connected = false;\n        this.hasBeenLoaded = false;\n        this.settingSourceURL = false;\n        this.element = element;\n        this.view = new FrameView(this, this.element);\n        this.appearanceObserver = new AppearanceObserver(this, this.element);\n        this.linkInterceptor = new LinkInterceptor(this, this.element);\n        this.formInterceptor = new FormInterceptor(this, this.element);\n    }\n    connect() {\n        if (!this.connected) {\n            this.connected = true;\n            this.reloadable = false;\n            if (this.loadingStyle == FrameLoadingStyle.lazy) {\n                this.appearanceObserver.start();\n            }\n            this.linkInterceptor.start();\n            this.formInterceptor.start();\n            this.sourceURLChanged();\n        }\n    }\n    disconnect() {\n        if (this.connected) {\n            this.connected = false;\n            this.appearanceObserver.stop();\n            this.linkInterceptor.stop();\n            this.formInterceptor.stop();\n        }\n    }\n    disabledChanged() {\n        if (this.loadingStyle == FrameLoadingStyle.eager) {\n            this.loadSourceURL();\n        }\n    }\n    sourceURLChanged() {\n        if (this.loadingStyle == FrameLoadingStyle.eager || this.hasBeenLoaded) {\n            this.loadSourceURL();\n        }\n    }\n    loadingStyleChanged() {\n        if (this.loadingStyle == FrameLoadingStyle.lazy) {\n            this.appearanceObserver.start();\n        }\n        else {\n            this.appearanceObserver.stop();\n            this.loadSourceURL();\n        }\n    }\n    async loadSourceURL() {\n        if (!this.settingSourceURL && this.enabled && this.isActive && (this.reloadable || this.sourceURL != this.currentURL)) {\n            const previousURL = this.currentURL;\n            this.currentURL = this.sourceURL;\n            if (this.sourceURL) {\n                try {\n                    this.element.loaded = this.visit(expandURL(this.sourceURL));\n                    this.appearanceObserver.stop();\n                    await this.element.loaded;\n                    this.hasBeenLoaded = true;\n                }\n                catch (error) {\n                    this.currentURL = previousURL;\n                    throw error;\n                }\n            }\n        }\n    }\n    async loadResponse(fetchResponse) {\n        if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n            this.sourceURL = fetchResponse.response.url;\n        }\n        try {\n            const html = await fetchResponse.responseHTML;\n            if (html) {\n                const { body } = parseHTMLDocument(html);\n                const snapshot = new Snapshot(await this.extractForeignFrameElement(body));\n                const renderer = new FrameRenderer(this.view.snapshot, snapshot, false, false);\n                if (this.view.renderPromise)\n                    await this.view.renderPromise;\n                await this.view.render(renderer);\n                session.frameRendered(fetchResponse, this.element);\n                session.frameLoaded(this.element);\n                this.fetchResponseLoaded(fetchResponse);\n            }\n        }\n        catch (error) {\n            console.error(error);\n            this.view.invalidate();\n        }\n        finally {\n            this.fetchResponseLoaded = () => { };\n        }\n    }\n    elementAppearedInViewport(element) {\n        this.loadSourceURL();\n    }\n    shouldInterceptLinkClick(element, url) {\n        if (element.hasAttribute(\"data-turbo-method\")) {\n            return false;\n        }\n        else {\n            return this.shouldInterceptNavigation(element);\n        }\n    }\n    linkClickIntercepted(element, url) {\n        this.reloadable = true;\n        this.navigateFrame(element, url);\n    }\n    shouldInterceptFormSubmission(element, submitter) {\n        return this.shouldInterceptNavigation(element, submitter);\n    }\n    formSubmissionIntercepted(element, submitter) {\n        if (this.formSubmission) {\n            this.formSubmission.stop();\n        }\n        this.reloadable = false;\n        this.formSubmission = new FormSubmission(this, element, submitter);\n        const { fetchRequest } = this.formSubmission;\n        this.prepareHeadersForRequest(fetchRequest.headers, fetchRequest);\n        this.formSubmission.start();\n    }\n    prepareHeadersForRequest(headers, request) {\n        headers[\"Turbo-Frame\"] = this.id;\n    }\n    requestStarted(request) {\n        markAsBusy(this.element);\n    }\n    requestPreventedHandlingResponse(request, response) {\n        this.resolveVisitPromise();\n    }\n    async requestSucceededWithResponse(request, response) {\n        await this.loadResponse(response);\n        this.resolveVisitPromise();\n    }\n    requestFailedWithResponse(request, response) {\n        console.error(response);\n        this.resolveVisitPromise();\n    }\n    requestErrored(request, error) {\n        console.error(error);\n        this.resolveVisitPromise();\n    }\n    requestFinished(request) {\n        clearBusyState(this.element);\n    }\n    formSubmissionStarted({ formElement }) {\n        markAsBusy(formElement, this.findFrameElement(formElement));\n    }\n    formSubmissionSucceededWithResponse(formSubmission, response) {\n        const frame = this.findFrameElement(formSubmission.formElement, formSubmission.submitter);\n        this.proposeVisitIfNavigatedWithAction(frame, formSubmission.formElement, formSubmission.submitter);\n        frame.delegate.loadResponse(response);\n    }\n    formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n        this.element.delegate.loadResponse(fetchResponse);\n    }\n    formSubmissionErrored(formSubmission, error) {\n        console.error(error);\n    }\n    formSubmissionFinished({ formElement }) {\n        clearBusyState(formElement, this.findFrameElement(formElement));\n    }\n    allowsImmediateRender(snapshot, resume) {\n        return true;\n    }\n    viewRenderedSnapshot(snapshot, isPreview) {\n    }\n    viewInvalidated() {\n    }\n    async visit(url) {\n        var _a;\n        const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams, this.element);\n        (_a = this.currentFetchRequest) === null || _a === void 0 ? void 0 : _a.cancel();\n        this.currentFetchRequest = request;\n        return new Promise(resolve => {\n            this.resolveVisitPromise = () => {\n                this.resolveVisitPromise = () => { };\n                this.currentFetchRequest = null;\n                resolve();\n            };\n            request.perform();\n        });\n    }\n    navigateFrame(element, url, submitter) {\n        const frame = this.findFrameElement(element, submitter);\n        this.proposeVisitIfNavigatedWithAction(frame, element, submitter);\n        frame.setAttribute(\"reloadable\", \"\");\n        frame.src = url;\n    }\n    proposeVisitIfNavigatedWithAction(frame, element, submitter) {\n        const action = getAttribute(\"data-turbo-action\", submitter, element, frame);\n        if (isAction(action)) {\n            const { visitCachedSnapshot } = new SnapshotSubstitution(frame);\n            frame.delegate.fetchResponseLoaded = (fetchResponse) => {\n                if (frame.src) {\n                    const { statusCode, redirected } = fetchResponse;\n                    const responseHTML = frame.ownerDocument.documentElement.outerHTML;\n                    const response = { statusCode, redirected, responseHTML };\n                    session.visit(frame.src, { action, response, visitCachedSnapshot, willRender: false });\n                }\n            };\n        }\n    }\n    findFrameElement(element, submitter) {\n        var _a;\n        const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n        return (_a = getFrameElementById(id)) !== null && _a !== void 0 ? _a : this.element;\n    }\n    async extractForeignFrameElement(container) {\n        let element;\n        const id = CSS.escape(this.id);\n        try {\n            if (element = activateElement(container.querySelector(`turbo-frame#${id}`), this.currentURL)) {\n                return element;\n            }\n            if (element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.currentURL)) {\n                await element.loaded;\n                return await this.extractForeignFrameElement(element);\n            }\n            console.error(`Response has no matching <turbo-frame id=\"${id}\"> element`);\n        }\n        catch (error) {\n            console.error(error);\n        }\n        return new FrameElement();\n    }\n    formActionIsVisitable(form, submitter) {\n        const action = getAction(form, submitter);\n        return locationIsVisitable(expandURL(action), this.rootLocation);\n    }\n    shouldInterceptNavigation(element, submitter) {\n        const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n        if (element instanceof HTMLFormElement && !this.formActionIsVisitable(element, submitter)) {\n            return false;\n        }\n        if (!this.enabled || id == \"_top\") {\n            return false;\n        }\n        if (id) {\n            const frameElement = getFrameElementById(id);\n            if (frameElement) {\n                return !frameElement.disabled;\n            }\n        }\n        if (!session.elementDriveEnabled(element)) {\n            return false;\n        }\n        if (submitter && !session.elementDriveEnabled(submitter)) {\n            return false;\n        }\n        return true;\n    }\n    get id() {\n        return this.element.id;\n    }\n    get enabled() {\n        return !this.element.disabled;\n    }\n    get sourceURL() {\n        if (this.element.src) {\n            return this.element.src;\n        }\n    }\n    get reloadable() {\n        const frame = this.findFrameElement(this.element);\n        return frame.hasAttribute(\"reloadable\");\n    }\n    set reloadable(value) {\n        const frame = this.findFrameElement(this.element);\n        if (value) {\n            frame.setAttribute(\"reloadable\", \"\");\n        }\n        else {\n            frame.removeAttribute(\"reloadable\");\n        }\n    }\n    set sourceURL(sourceURL) {\n        this.settingSourceURL = true;\n        this.element.src = sourceURL !== null && sourceURL !== void 0 ? sourceURL : null;\n        this.currentURL = this.element.src;\n        this.settingSourceURL = false;\n    }\n    get loadingStyle() {\n        return this.element.loading;\n    }\n    get isLoading() {\n        return this.formSubmission !== undefined || this.resolveVisitPromise() !== undefined;\n    }\n    get isActive() {\n        return this.element.isActive && this.connected;\n    }\n    get rootLocation() {\n        var _a;\n        const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n        const root = (_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : \"/\";\n        return expandURL(root);\n    }\n}\nclass SnapshotSubstitution {\n    constructor(element) {\n        this.visitCachedSnapshot = ({ element }) => {\n            var _a;\n            const { id, clone } = this;\n            (_a = element.querySelector(\"#\" + id)) === null || _a === void 0 ? void 0 : _a.replaceWith(clone);\n        };\n        this.clone = element.cloneNode(true);\n        this.id = element.id;\n    }\n}\nfunction getFrameElementById(id) {\n    if (id != null) {\n        const element = document.getElementById(id);\n        if (element instanceof FrameElement) {\n            return element;\n        }\n    }\n}\nfunction activateElement(element, currentURL) {\n    if (element) {\n        const src = element.getAttribute(\"src\");\n        if (src != null && currentURL != null && urlsAreEqual(src, currentURL)) {\n            throw new Error(`Matching <turbo-frame id=\"${element.id}\"> element has a source URL which references itself`);\n        }\n        if (element.ownerDocument !== document) {\n            element = document.importNode(element, true);\n        }\n        if (element instanceof FrameElement) {\n            element.connectedCallback();\n            element.disconnectedCallback();\n            return element;\n        }\n    }\n}\n\nconst StreamActions = {\n    after() {\n        this.targetElements.forEach(e => { var _a; return (_a = e.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e.nextSibling); });\n    },\n    append() {\n        this.removeDuplicateTargetChildren();\n        this.targetElements.forEach(e => e.append(this.templateContent));\n    },\n    before() {\n        this.targetElements.forEach(e => { var _a; return (_a = e.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e); });\n    },\n    prepend() {\n        this.removeDuplicateTargetChildren();\n        this.targetElements.forEach(e => e.prepend(this.templateContent));\n    },\n    remove() {\n        this.targetElements.forEach(e => e.remove());\n    },\n    replace() {\n        this.targetElements.forEach(e => e.replaceWith(this.templateContent));\n    },\n    update() {\n        this.targetElements.forEach(e => {\n            e.innerHTML = \"\";\n            e.append(this.templateContent);\n        });\n    }\n};\n\nclass StreamElement extends HTMLElement {\n    async connectedCallback() {\n        try {\n            await this.render();\n        }\n        catch (error) {\n            console.error(error);\n        }\n        finally {\n            this.disconnect();\n        }\n    }\n    async render() {\n        var _a;\n        return (_a = this.renderPromise) !== null && _a !== void 0 ? _a : (this.renderPromise = (async () => {\n            if (this.dispatchEvent(this.beforeRenderEvent)) {\n                await nextAnimationFrame();\n                this.performAction();\n            }\n        })());\n    }\n    disconnect() {\n        try {\n            this.remove();\n        }\n        catch (_a) { }\n    }\n    removeDuplicateTargetChildren() {\n        this.duplicateChildren.forEach(c => c.remove());\n    }\n    get duplicateChildren() {\n        var _a;\n        const existingChildren = this.targetElements.flatMap(e => [...e.children]).filter(c => !!c.id);\n        const newChildrenIds = [...(_a = this.templateContent) === null || _a === void 0 ? void 0 : _a.children].filter(c => !!c.id).map(c => c.id);\n        return existingChildren.filter(c => newChildrenIds.includes(c.id));\n    }\n    get performAction() {\n        if (this.action) {\n            const actionFunction = StreamActions[this.action];\n            if (actionFunction) {\n                return actionFunction;\n            }\n            this.raise(\"unknown action\");\n        }\n        this.raise(\"action attribute is missing\");\n    }\n    get targetElements() {\n        if (this.target) {\n            return this.targetElementsById;\n        }\n        else if (this.targets) {\n            return this.targetElementsByQuery;\n        }\n        else {\n            this.raise(\"target or targets attribute is missing\");\n        }\n    }\n    get templateContent() {\n        return this.templateElement.content.cloneNode(true);\n    }\n    get templateElement() {\n        if (this.firstElementChild instanceof HTMLTemplateElement) {\n            return this.firstElementChild;\n        }\n        this.raise(\"first child element must be a <template> element\");\n    }\n    get action() {\n        return this.getAttribute(\"action\");\n    }\n    get target() {\n        return this.getAttribute(\"target\");\n    }\n    get targets() {\n        return this.getAttribute(\"targets\");\n    }\n    raise(message) {\n        throw new Error(`${this.description}: ${message}`);\n    }\n    get description() {\n        var _a, _b;\n        return (_b = ((_a = this.outerHTML.match(/<[^>]+>/)) !== null && _a !== void 0 ? _a : [])[0]) !== null && _b !== void 0 ? _b : \"<turbo-stream>\";\n    }\n    get beforeRenderEvent() {\n        return new CustomEvent(\"turbo:before-stream-render\", { bubbles: true, cancelable: true });\n    }\n    get targetElementsById() {\n        var _a;\n        const element = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.getElementById(this.target);\n        if (element !== null) {\n            return [element];\n        }\n        else {\n            return [];\n        }\n    }\n    get targetElementsByQuery() {\n        var _a;\n        const elements = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.targets);\n        if (elements.length !== 0) {\n            return Array.prototype.slice.call(elements);\n        }\n        else {\n            return [];\n        }\n    }\n}\n\nFrameElement.delegateConstructor = FrameController;\ncustomElements.define(\"turbo-frame\", FrameElement);\ncustomElements.define(\"turbo-stream\", StreamElement);\n\n(() => {\n    let element = document.currentScript;\n    if (!element)\n        return;\n    if (element.hasAttribute(\"data-turbo-suppress-warning\"))\n        return;\n    while (element = element.parentElement) {\n        if (element == document.body) {\n            return console.warn(unindent `\n        You are loading Turbo from a <script> element inside the <body> element. This is probably not what you meant to do!\n\n        Load your application\u2019s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.\n\n        For more information, see: https://turbo.hotwired.dev/handbook/building#working-with-script-elements\n\n        \u2014\u2014\n        Suppress this warning by adding a \"data-turbo-suppress-warning\" attribute to: %s\n      `, element.outerHTML);\n        }\n    }\n})();\n\nwindow.Turbo = Turbo;\nstart();\n\nexport { PageRenderer, PageSnapshot, clearCache, connectStreamSource, disconnectStreamSource, navigator$1 as navigator, registerAdapter, renderStreamMessage, session, setConfirmMethod, setProgressBarDelay, start, visit };\n", "let consumer\n\nexport async function getConsumer() {\n  return consumer || setConsumer(createConsumer().then(setConsumer))\n}\n\nexport function setConsumer(newConsumer) {\n  return consumer = newConsumer\n}\n\nexport async function createConsumer() {\n  const { createConsumer } = await import(/* webpackChunkName: \"actioncable\" */ \"@rails/actioncable/src\")\n  return createConsumer()\n}\n\nexport async function subscribeTo(channel, mixin) {\n  const { subscriptions } = await getConsumer()\n  return subscriptions.create(channel, mixin)\n}\n", "import { connectStreamSource, disconnectStreamSource } from \"@hotwired/turbo\"\nimport { subscribeTo } from \"./cable\"\n\nclass TurboCableStreamSourceElement extends HTMLElement {\n  async connectedCallback() {\n    connectStreamSource(this)\n    this.subscription = await subscribeTo(this.channel, { received: this.dispatchMessageEvent.bind(this) })\n  }\n\n  disconnectedCallback() {\n    disconnectStreamSource(this)\n    if (this.subscription) this.subscription.unsubscribe()\n  }\n\n  dispatchMessageEvent(data) {\n    const event = new MessageEvent(\"message\", { data })\n    return this.dispatchEvent(event)\n  }\n\n  get channel() {\n    const channel = this.getAttribute(\"channel\")\n    const signed_stream_name = this.getAttribute(\"signed-stream-name\")\n    return { channel, signed_stream_name }\n  }\n}\n\ncustomElements.define(\"turbo-cable-stream-source\", TurboCableStreamSourceElement)\n", "export * from \"./enums.js\";\nexport * from \"./modifiers/index.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport { popperGenerator, detectOverflow, createPopper as createPopperBase } from \"./createPopper.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper } from \"./popper.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\";", "export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n  return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n  return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];", "export default function getNodeName(element) {\n  return element ? (element.nodeName || '').toLowerCase() : null;\n}", "export default function getWindow(node) {\n  if (node == null) {\n    return window;\n  }\n\n  if (node.toString() !== '[object Window]') {\n    var ownerDocument = node.ownerDocument;\n    return ownerDocument ? ownerDocument.defaultView || window : window;\n  }\n\n  return node;\n}", "import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n  var OwnElement = getWindow(node).Element;\n  return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n  var OwnElement = getWindow(node).HTMLElement;\n  return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n  // IE 11 has no ShadowRoot\n  if (typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n\n  var OwnElement = getWindow(node).ShadowRoot;\n  return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };", "import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n  var state = _ref.state;\n  Object.keys(state.elements).forEach(function (name) {\n    var style = state.styles[name] || {};\n    var attributes = state.attributes[name] || {};\n    var element = state.elements[name]; // arrow is optional + virtual elements\n\n    if (!isHTMLElement(element) || !getNodeName(element)) {\n      return;\n    } // Flow doesn't support to extend this property, but it's the most\n    // effective way to apply styles to an HTMLElement\n    // $FlowFixMe[cannot-write]\n\n\n    Object.assign(element.style, style);\n    Object.keys(attributes).forEach(function (name) {\n      var value = attributes[name];\n\n      if (value === false) {\n        element.removeAttribute(name);\n      } else {\n        element.setAttribute(name, value === true ? '' : value);\n      }\n    });\n  });\n}\n\nfunction effect(_ref2) {\n  var state = _ref2.state;\n  var initialStyles = {\n    popper: {\n      position: state.options.strategy,\n      left: '0',\n      top: '0',\n      margin: '0'\n    },\n    arrow: {\n      position: 'absolute'\n    },\n    reference: {}\n  };\n  Object.assign(state.elements.popper.style, initialStyles.popper);\n  state.styles = initialStyles;\n\n  if (state.elements.arrow) {\n    Object.assign(state.elements.arrow.style, initialStyles.arrow);\n  }\n\n  return function () {\n    Object.keys(state.elements).forEach(function (name) {\n      var element = state.elements[name];\n      var attributes = state.attributes[name] || {};\n      var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n      var style = styleProperties.reduce(function (style, property) {\n        style[property] = '';\n        return style;\n      }, {}); // arrow is optional + virtual elements\n\n      if (!isHTMLElement(element) || !getNodeName(element)) {\n        return;\n      }\n\n      Object.assign(element.style, style);\n      Object.keys(attributes).forEach(function (attribute) {\n        element.removeAttribute(attribute);\n      });\n    });\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'applyStyles',\n  enabled: true,\n  phase: 'write',\n  fn: applyStyles,\n  effect: effect,\n  requires: ['computeStyles']\n};", "import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n  return placement.split('-')[0];\n}", "export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;", "import { isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nexport default function getBoundingClientRect(element, includeScale) {\n  if (includeScale === void 0) {\n    includeScale = false;\n  }\n\n  var rect = element.getBoundingClientRect();\n  var scaleX = 1;\n  var scaleY = 1;\n\n  if (isHTMLElement(element) && includeScale) {\n    var offsetHeight = element.offsetHeight;\n    var offsetWidth = element.offsetWidth; // Do not attempt to divide by 0, otherwise we get `Infinity` as scale\n    // Fallback to 1 in case both values are `0`\n\n    if (offsetWidth > 0) {\n      scaleX = round(rect.width) / offsetWidth || 1;\n    }\n\n    if (offsetHeight > 0) {\n      scaleY = round(rect.height) / offsetHeight || 1;\n    }\n  }\n\n  return {\n    width: rect.width / scaleX,\n    height: rect.height / scaleY,\n    top: rect.top / scaleY,\n    right: rect.right / scaleX,\n    bottom: rect.bottom / scaleY,\n    left: rect.left / scaleX,\n    x: rect.left / scaleX,\n    y: rect.top / scaleY\n  };\n}", "import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n  var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n  // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n  var width = element.offsetWidth;\n  var height = element.offsetHeight;\n\n  if (Math.abs(clientRect.width - width) <= 1) {\n    width = clientRect.width;\n  }\n\n  if (Math.abs(clientRect.height - height) <= 1) {\n    height = clientRect.height;\n  }\n\n  return {\n    x: element.offsetLeft,\n    y: element.offsetTop,\n    width: width,\n    height: height\n  };\n}", "import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n  var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n  if (parent.contains(child)) {\n    return true;\n  } // then fallback to custom implementation with Shadow DOM support\n  else if (rootNode && isShadowRoot(rootNode)) {\n      var next = child;\n\n      do {\n        if (next && parent.isSameNode(next)) {\n          return true;\n        } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n        next = next.parentNode || next.host;\n      } while (next);\n    } // Give up, the result is false\n\n\n  return false;\n}", "import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}", "import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n  return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}", "import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n  // $FlowFixMe[incompatible-return]: assume body is always available\n  return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n  element.document) || window.document).documentElement;\n}", "import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n  if (getNodeName(element) === 'html') {\n    return element;\n  }\n\n  return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n    // $FlowFixMe[incompatible-return]\n    // $FlowFixMe[prop-missing]\n    element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n    element.parentNode || ( // DOM Element detected\n    isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n    // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n    getDocumentElement(element) // fallback\n\n  );\n}", "import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\n\nfunction getTrueOffsetParent(element) {\n  if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n  getComputedStyle(element).position === 'fixed') {\n    return null;\n  }\n\n  return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n  var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n  var isIE = navigator.userAgent.indexOf('Trident') !== -1;\n\n  if (isIE && isHTMLElement(element)) {\n    // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n    var elementCss = getComputedStyle(element);\n\n    if (elementCss.position === 'fixed') {\n      return null;\n    }\n  }\n\n  var currentNode = getParentNode(element);\n\n  while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n    var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n    // create a containing block.\n    // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n    if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n      return currentNode;\n    } else {\n      currentNode = currentNode.parentNode;\n    }\n  }\n\n  return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n  var window = getWindow(element);\n  var offsetParent = getTrueOffsetParent(element);\n\n  while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n    offsetParent = getTrueOffsetParent(offsetParent);\n  }\n\n  if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n    return window;\n  }\n\n  return offsetParent || getContainingBlock(element) || window;\n}", "export default function getMainAxisFromPlacement(placement) {\n  return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}", "import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n  return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n  var v = within(min, value, max);\n  return v > max ? max : v;\n}", "export default function getFreshSideObject() {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0\n  };\n}", "import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n  return Object.assign({}, getFreshSideObject(), paddingObject);\n}", "export default function expandToHashMap(value, keys) {\n  return keys.reduce(function (hashMap, key) {\n    hashMap[key] = value;\n    return hashMap;\n  }, {});\n}", "import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n  padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : padding;\n  return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n  var _state$modifiersData$;\n\n  var state = _ref.state,\n      name = _ref.name,\n      options = _ref.options;\n  var arrowElement = state.elements.arrow;\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var basePlacement = getBasePlacement(state.placement);\n  var axis = getMainAxisFromPlacement(basePlacement);\n  var isVertical = [left, right].indexOf(basePlacement) >= 0;\n  var len = isVertical ? 'height' : 'width';\n\n  if (!arrowElement || !popperOffsets) {\n    return;\n  }\n\n  var paddingObject = toPaddingObject(options.padding, state);\n  var arrowRect = getLayoutRect(arrowElement);\n  var minProp = axis === 'y' ? top : left;\n  var maxProp = axis === 'y' ? bottom : right;\n  var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n  var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n  var arrowOffsetParent = getOffsetParent(arrowElement);\n  var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n  var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n  // outside of the popper bounds\n\n  var min = paddingObject[minProp];\n  var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n  var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n  var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n  var axisProp = axis;\n  state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options;\n  var _options$element = options.element,\n      arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n  if (arrowElement == null) {\n    return;\n  } // CSS selector\n\n\n  if (typeof arrowElement === 'string') {\n    arrowElement = state.elements.popper.querySelector(arrowElement);\n\n    if (!arrowElement) {\n      return;\n    }\n  }\n\n  if (process.env.NODE_ENV !== \"production\") {\n    if (!isHTMLElement(arrowElement)) {\n      console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n    }\n  }\n\n  if (!contains(state.elements.popper, arrowElement)) {\n    if (process.env.NODE_ENV !== \"production\") {\n      console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n    }\n\n    return;\n  }\n\n  state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'arrow',\n  enabled: true,\n  phase: 'main',\n  fn: arrow,\n  effect: effect,\n  requires: ['popperOffsets'],\n  requiresIfExists: ['preventOverflow']\n};", "export default function getVariation(placement) {\n  return placement.split('-')[1];\n}", "import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n  top: 'auto',\n  right: 'auto',\n  bottom: 'auto',\n  left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref) {\n  var x = _ref.x,\n      y = _ref.y;\n  var win = window;\n  var dpr = win.devicePixelRatio || 1;\n  return {\n    x: round(x * dpr) / dpr || 0,\n    y: round(y * dpr) / dpr || 0\n  };\n}\n\nexport function mapToStyles(_ref2) {\n  var _Object$assign2;\n\n  var popper = _ref2.popper,\n      popperRect = _ref2.popperRect,\n      placement = _ref2.placement,\n      variation = _ref2.variation,\n      offsets = _ref2.offsets,\n      position = _ref2.position,\n      gpuAcceleration = _ref2.gpuAcceleration,\n      adaptive = _ref2.adaptive,\n      roundOffsets = _ref2.roundOffsets,\n      isFixed = _ref2.isFixed;\n\n  var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets,\n      _ref3$x = _ref3.x,\n      x = _ref3$x === void 0 ? 0 : _ref3$x,\n      _ref3$y = _ref3.y,\n      y = _ref3$y === void 0 ? 0 : _ref3$y;\n\n  var hasX = offsets.hasOwnProperty('x');\n  var hasY = offsets.hasOwnProperty('y');\n  var sideX = left;\n  var sideY = top;\n  var win = window;\n\n  if (adaptive) {\n    var offsetParent = getOffsetParent(popper);\n    var heightProp = 'clientHeight';\n    var widthProp = 'clientWidth';\n\n    if (offsetParent === getWindow(popper)) {\n      offsetParent = getDocumentElement(popper);\n\n      if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n        heightProp = 'scrollHeight';\n        widthProp = 'scrollWidth';\n      }\n    } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n    offsetParent = offsetParent;\n\n    if (placement === top || (placement === left || placement === right) && variation === end) {\n      sideY = bottom;\n      var offsetY = isFixed && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n      offsetParent[heightProp];\n      y -= offsetY - popperRect.height;\n      y *= gpuAcceleration ? 1 : -1;\n    }\n\n    if (placement === left || (placement === top || placement === bottom) && variation === end) {\n      sideX = right;\n      var offsetX = isFixed && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n      offsetParent[widthProp];\n      x -= offsetX - popperRect.width;\n      x *= gpuAcceleration ? 1 : -1;\n    }\n  }\n\n  var commonStyles = Object.assign({\n    position: position\n  }, adaptive && unsetSides);\n\n  if (gpuAcceleration) {\n    var _Object$assign;\n\n    return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n  }\n\n  return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref4) {\n  var state = _ref4.state,\n      options = _ref4.options;\n  var _options$gpuAccelerat = options.gpuAcceleration,\n      gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n      _options$adaptive = options.adaptive,\n      adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n      _options$roundOffsets = options.roundOffsets,\n      roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n  if (process.env.NODE_ENV !== \"production\") {\n    var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n    if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n      return transitionProperty.indexOf(property) >= 0;\n    })) {\n      console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n    }\n  }\n\n  var commonStyles = {\n    placement: getBasePlacement(state.placement),\n    variation: getVariation(state.placement),\n    popper: state.elements.popper,\n    popperRect: state.rects.popper,\n    gpuAcceleration: gpuAcceleration,\n    isFixed: state.options.strategy === 'fixed'\n  };\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.popperOffsets,\n      position: state.options.strategy,\n      adaptive: adaptive,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  if (state.modifiersData.arrow != null) {\n    state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.arrow,\n      position: 'absolute',\n      adaptive: false,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  state.attributes.popper = Object.assign({}, state.attributes.popper, {\n    'data-popper-placement': state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'computeStyles',\n  enabled: true,\n  phase: 'beforeWrite',\n  fn: computeStyles,\n  data: {}\n};", "import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n  passive: true\n};\n\nfunction effect(_ref) {\n  var state = _ref.state,\n      instance = _ref.instance,\n      options = _ref.options;\n  var _options$scroll = options.scroll,\n      scroll = _options$scroll === void 0 ? true : _options$scroll,\n      _options$resize = options.resize,\n      resize = _options$resize === void 0 ? true : _options$resize;\n  var window = getWindow(state.elements.popper);\n  var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n  if (scroll) {\n    scrollParents.forEach(function (scrollParent) {\n      scrollParent.addEventListener('scroll', instance.update, passive);\n    });\n  }\n\n  if (resize) {\n    window.addEventListener('resize', instance.update, passive);\n  }\n\n  return function () {\n    if (scroll) {\n      scrollParents.forEach(function (scrollParent) {\n        scrollParent.removeEventListener('scroll', instance.update, passive);\n      });\n    }\n\n    if (resize) {\n      window.removeEventListener('resize', instance.update, passive);\n    }\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'eventListeners',\n  enabled: true,\n  phase: 'write',\n  fn: function fn() {},\n  effect: effect,\n  data: {}\n};", "var hash = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n  return placement.replace(/left|right|bottom|top/g, function (matched) {\n    return hash[matched];\n  });\n}", "var hash = {\n  start: 'end',\n  end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n  return placement.replace(/start|end/g, function (matched) {\n    return hash[matched];\n  });\n}", "import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n  var win = getWindow(node);\n  var scrollLeft = win.pageXOffset;\n  var scrollTop = win.pageYOffset;\n  return {\n    scrollLeft: scrollLeft,\n    scrollTop: scrollTop\n  };\n}", "import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n  // If <html> has a CSS width greater than the viewport, then this will be\n  // incorrect for RTL.\n  // Popper 1 is broken in this case and never had a bug report so let's assume\n  // it's not an issue. I don't think anyone ever specifies width on <html>\n  // anyway.\n  // Browsers where the left scrollbar doesn't cause an issue report `0` for\n  // this (e.g. Edge 2019, IE11, Safari)\n  return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}", "import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nexport default function getViewportRect(element) {\n  var win = getWindow(element);\n  var html = getDocumentElement(element);\n  var visualViewport = win.visualViewport;\n  var width = html.clientWidth;\n  var height = html.clientHeight;\n  var x = 0;\n  var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n  // can be obscured underneath it.\n  // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n  // if it isn't open, so if this isn't available, the popper will be detected\n  // to overflow the bottom of the screen too early.\n\n  if (visualViewport) {\n    width = visualViewport.width;\n    height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n    // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n    // errors due to floating point numbers, so we need to check precision.\n    // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n    // Feature detection fails in mobile emulation mode in Chrome.\n    // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n    // 0.001\n    // Fallback here: \"Not Safari\" userAgent\n\n    if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n      x = visualViewport.offsetLeft;\n      y = visualViewport.offsetTop;\n    }\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x + getWindowScrollBarX(element),\n    y: y\n  };\n}", "import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n  var _element$ownerDocumen;\n\n  var html = getDocumentElement(element);\n  var winScroll = getWindowScroll(element);\n  var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n  var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n  var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n  var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n  var y = -winScroll.scrollTop;\n\n  if (getComputedStyle(body || html).direction === 'rtl') {\n    x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x,\n    y: y\n  };\n}", "import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n  // Firefox wants us to check `-x` and `-y` variations as well\n  var _getComputedStyle = getComputedStyle(element),\n      overflow = _getComputedStyle.overflow,\n      overflowX = _getComputedStyle.overflowX,\n      overflowY = _getComputedStyle.overflowY;\n\n  return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}", "import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n  if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n    // $FlowFixMe[incompatible-return]: assume body is always available\n    return node.ownerDocument.body;\n  }\n\n  if (isHTMLElement(node) && isScrollParent(node)) {\n    return node;\n  }\n\n  return getScrollParent(getParentNode(node));\n}", "import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n  var _element$ownerDocumen;\n\n  if (list === void 0) {\n    list = [];\n  }\n\n  var scrollParent = getScrollParent(element);\n  var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n  var win = getWindow(scrollParent);\n  var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n  var updatedList = list.concat(target);\n  return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n  updatedList.concat(listScrollParents(getParentNode(target)));\n}", "export default function rectToClientRect(rect) {\n  return Object.assign({}, rect, {\n    left: rect.x,\n    top: rect.y,\n    right: rect.x + rect.width,\n    bottom: rect.y + rect.height\n  });\n}", "import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element) {\n  var rect = getBoundingClientRect(element);\n  rect.top = rect.top + element.clientTop;\n  rect.left = rect.left + element.clientLeft;\n  rect.bottom = rect.top + element.clientHeight;\n  rect.right = rect.left + element.clientWidth;\n  rect.width = element.clientWidth;\n  rect.height = element.clientHeight;\n  rect.x = rect.left;\n  rect.y = rect.top;\n  return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent) {\n  return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n  var clippingParents = listScrollParents(getParentNode(element));\n  var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n  var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n  if (!isElement(clipperElement)) {\n    return [];\n  } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n  return clippingParents.filter(function (clippingParent) {\n    return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body' && (canEscapeClipping ? getComputedStyle(clippingParent).position !== 'static' : true);\n  });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary) {\n  var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n  var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n  var firstClippingParent = clippingParents[0];\n  var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n    var rect = getClientRectFromMixedType(element, clippingParent);\n    accRect.top = max(rect.top, accRect.top);\n    accRect.right = min(rect.right, accRect.right);\n    accRect.bottom = min(rect.bottom, accRect.bottom);\n    accRect.left = max(rect.left, accRect.left);\n    return accRect;\n  }, getClientRectFromMixedType(element, firstClippingParent));\n  clippingRect.width = clippingRect.right - clippingRect.left;\n  clippingRect.height = clippingRect.bottom - clippingRect.top;\n  clippingRect.x = clippingRect.left;\n  clippingRect.y = clippingRect.top;\n  return clippingRect;\n}", "import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n  var reference = _ref.reference,\n      element = _ref.element,\n      placement = _ref.placement;\n  var basePlacement = placement ? getBasePlacement(placement) : null;\n  var variation = placement ? getVariation(placement) : null;\n  var commonX = reference.x + reference.width / 2 - element.width / 2;\n  var commonY = reference.y + reference.height / 2 - element.height / 2;\n  var offsets;\n\n  switch (basePlacement) {\n    case top:\n      offsets = {\n        x: commonX,\n        y: reference.y - element.height\n      };\n      break;\n\n    case bottom:\n      offsets = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n\n    case right:\n      offsets = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n\n    case left:\n      offsets = {\n        x: reference.x - element.width,\n        y: commonY\n      };\n      break;\n\n    default:\n      offsets = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n\n  var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n  if (mainAxis != null) {\n    var len = mainAxis === 'y' ? 'height' : 'width';\n\n    switch (variation) {\n      case start:\n        offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n        break;\n\n      case end:\n        offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n        break;\n\n      default:\n    }\n  }\n\n  return offsets;\n}", "import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      _options$placement = _options.placement,\n      placement = _options$placement === void 0 ? state.placement : _options$placement,\n      _options$boundary = _options.boundary,\n      boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n      _options$rootBoundary = _options.rootBoundary,\n      rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n      _options$elementConte = _options.elementContext,\n      elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n      _options$altBoundary = _options.altBoundary,\n      altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n      _options$padding = _options.padding,\n      padding = _options$padding === void 0 ? 0 : _options$padding;\n  var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n  var altContext = elementContext === popper ? reference : popper;\n  var popperRect = state.rects.popper;\n  var element = state.elements[altBoundary ? altContext : elementContext];\n  var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n  var referenceClientRect = getBoundingClientRect(state.elements.reference);\n  var popperOffsets = computeOffsets({\n    reference: referenceClientRect,\n    element: popperRect,\n    strategy: 'absolute',\n    placement: placement\n  });\n  var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n  var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n  // 0 or negative = within the clipping rect\n\n  var overflowOffsets = {\n    top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n    bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n    left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n    right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n  };\n  var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n  if (elementContext === popper && offsetData) {\n    var offset = offsetData[placement];\n    Object.keys(overflowOffsets).forEach(function (key) {\n      var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n      var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n      overflowOffsets[key] += offset[axis] * multiply;\n    });\n  }\n\n  return overflowOffsets;\n}", "import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      placement = _options.placement,\n      boundary = _options.boundary,\n      rootBoundary = _options.rootBoundary,\n      padding = _options.padding,\n      flipVariations = _options.flipVariations,\n      _options$allowedAutoP = _options.allowedAutoPlacements,\n      allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n  var variation = getVariation(placement);\n  var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n    return getVariation(placement) === variation;\n  }) : basePlacements;\n  var allowedPlacements = placements.filter(function (placement) {\n    return allowedAutoPlacements.indexOf(placement) >= 0;\n  });\n\n  if (allowedPlacements.length === 0) {\n    allowedPlacements = placements;\n\n    if (process.env.NODE_ENV !== \"production\") {\n      console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n    }\n  } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n  var overflows = allowedPlacements.reduce(function (acc, placement) {\n    acc[placement] = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding\n    })[getBasePlacement(placement)];\n    return acc;\n  }, {});\n  return Object.keys(overflows).sort(function (a, b) {\n    return overflows[a] - overflows[b];\n  });\n}", "import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n  if (getBasePlacement(placement) === auto) {\n    return [];\n  }\n\n  var oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n\n  if (state.modifiersData[name]._skip) {\n    return;\n  }\n\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n      specifiedFallbackPlacements = options.fallbackPlacements,\n      padding = options.padding,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      _options$flipVariatio = options.flipVariations,\n      flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n      allowedAutoPlacements = options.allowedAutoPlacements;\n  var preferredPlacement = state.options.placement;\n  var basePlacement = getBasePlacement(preferredPlacement);\n  var isBasePlacement = basePlacement === preferredPlacement;\n  var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n  var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n    return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding,\n      flipVariations: flipVariations,\n      allowedAutoPlacements: allowedAutoPlacements\n    }) : placement);\n  }, []);\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var checksMap = new Map();\n  var makeFallbackChecks = true;\n  var firstFittingPlacement = placements[0];\n\n  for (var i = 0; i < placements.length; i++) {\n    var placement = placements[i];\n\n    var _basePlacement = getBasePlacement(placement);\n\n    var isStartVariation = getVariation(placement) === start;\n    var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n    var len = isVertical ? 'width' : 'height';\n    var overflow = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      altBoundary: altBoundary,\n      padding: padding\n    });\n    var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n    if (referenceRect[len] > popperRect[len]) {\n      mainVariationSide = getOppositePlacement(mainVariationSide);\n    }\n\n    var altVariationSide = getOppositePlacement(mainVariationSide);\n    var checks = [];\n\n    if (checkMainAxis) {\n      checks.push(overflow[_basePlacement] <= 0);\n    }\n\n    if (checkAltAxis) {\n      checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n    }\n\n    if (checks.every(function (check) {\n      return check;\n    })) {\n      firstFittingPlacement = placement;\n      makeFallbackChecks = false;\n      break;\n    }\n\n    checksMap.set(placement, checks);\n  }\n\n  if (makeFallbackChecks) {\n    // `2` may be desired in some cases \u2013 research later\n    var numberOfChecks = flipVariations ? 3 : 1;\n\n    var _loop = function _loop(_i) {\n      var fittingPlacement = placements.find(function (placement) {\n        var checks = checksMap.get(placement);\n\n        if (checks) {\n          return checks.slice(0, _i).every(function (check) {\n            return check;\n          });\n        }\n      });\n\n      if (fittingPlacement) {\n        firstFittingPlacement = fittingPlacement;\n        return \"break\";\n      }\n    };\n\n    for (var _i = numberOfChecks; _i > 0; _i--) {\n      var _ret = _loop(_i);\n\n      if (_ret === \"break\") break;\n    }\n  }\n\n  if (state.placement !== firstFittingPlacement) {\n    state.modifiersData[name]._skip = true;\n    state.placement = firstFittingPlacement;\n    state.reset = true;\n  }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'flip',\n  enabled: true,\n  phase: 'main',\n  fn: flip,\n  requiresIfExists: ['offset'],\n  data: {\n    _skip: false\n  }\n};", "import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n  if (preventedOffsets === void 0) {\n    preventedOffsets = {\n      x: 0,\n      y: 0\n    };\n  }\n\n  return {\n    top: overflow.top - rect.height - preventedOffsets.y,\n    right: overflow.right - rect.width + preventedOffsets.x,\n    bottom: overflow.bottom - rect.height + preventedOffsets.y,\n    left: overflow.left - rect.width - preventedOffsets.x\n  };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n  return [top, right, bottom, left].some(function (side) {\n    return overflow[side] >= 0;\n  });\n}\n\nfunction hide(_ref) {\n  var state = _ref.state,\n      name = _ref.name;\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var preventedOffsets = state.modifiersData.preventOverflow;\n  var referenceOverflow = detectOverflow(state, {\n    elementContext: 'reference'\n  });\n  var popperAltOverflow = detectOverflow(state, {\n    altBoundary: true\n  });\n  var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n  var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n  var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n  var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n  state.modifiersData[name] = {\n    referenceClippingOffsets: referenceClippingOffsets,\n    popperEscapeOffsets: popperEscapeOffsets,\n    isReferenceHidden: isReferenceHidden,\n    hasPopperEscaped: hasPopperEscaped\n  };\n  state.attributes.popper = Object.assign({}, state.attributes.popper, {\n    'data-popper-reference-hidden': isReferenceHidden,\n    'data-popper-escaped': hasPopperEscaped\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'hide',\n  enabled: true,\n  phase: 'main',\n  requiresIfExists: ['preventOverflow'],\n  fn: hide\n};", "import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n  var basePlacement = getBasePlacement(placement);\n  var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n  var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n    placement: placement\n  })) : offset,\n      skidding = _ref[0],\n      distance = _ref[1];\n\n  skidding = skidding || 0;\n  distance = (distance || 0) * invertDistance;\n  return [left, right].indexOf(basePlacement) >= 0 ? {\n    x: distance,\n    y: skidding\n  } : {\n    x: skidding,\n    y: distance\n  };\n}\n\nfunction offset(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options,\n      name = _ref2.name;\n  var _options$offset = options.offset,\n      offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n  var data = placements.reduce(function (acc, placement) {\n    acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n    return acc;\n  }, {});\n  var _data$state$placement = data[state.placement],\n      x = _data$state$placement.x,\n      y = _data$state$placement.y;\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.modifiersData.popperOffsets.x += x;\n    state.modifiersData.popperOffsets.y += y;\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'offset',\n  enabled: true,\n  phase: 'main',\n  requires: ['popperOffsets'],\n  fn: offset\n};", "import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n  var state = _ref.state,\n      name = _ref.name;\n  // Offsets are the actual position the popper needs to have to be\n  // properly positioned near its reference element\n  // This is the most basic placement, and will be adjusted by\n  // the modifiers in the next step\n  state.modifiersData[name] = computeOffsets({\n    reference: state.rects.reference,\n    element: state.rects.popper,\n    strategy: 'absolute',\n    placement: state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'popperOffsets',\n  enabled: true,\n  phase: 'read',\n  fn: popperOffsets,\n  data: {}\n};", "export default function getAltAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}", "import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      padding = options.padding,\n      _options$tether = options.tether,\n      tether = _options$tether === void 0 ? true : _options$tether,\n      _options$tetherOffset = options.tetherOffset,\n      tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n  var overflow = detectOverflow(state, {\n    boundary: boundary,\n    rootBoundary: rootBoundary,\n    padding: padding,\n    altBoundary: altBoundary\n  });\n  var basePlacement = getBasePlacement(state.placement);\n  var variation = getVariation(state.placement);\n  var isBasePlacement = !variation;\n  var mainAxis = getMainAxisFromPlacement(basePlacement);\n  var altAxis = getAltAxis(mainAxis);\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : tetherOffset;\n  var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n    mainAxis: tetherOffsetValue,\n    altAxis: tetherOffsetValue\n  } : Object.assign({\n    mainAxis: 0,\n    altAxis: 0\n  }, tetherOffsetValue);\n  var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n  var data = {\n    x: 0,\n    y: 0\n  };\n\n  if (!popperOffsets) {\n    return;\n  }\n\n  if (checkMainAxis) {\n    var _offsetModifierState$;\n\n    var mainSide = mainAxis === 'y' ? top : left;\n    var altSide = mainAxis === 'y' ? bottom : right;\n    var len = mainAxis === 'y' ? 'height' : 'width';\n    var offset = popperOffsets[mainAxis];\n    var min = offset + overflow[mainSide];\n    var max = offset - overflow[altSide];\n    var additive = tether ? -popperRect[len] / 2 : 0;\n    var minLen = variation === start ? referenceRect[len] : popperRect[len];\n    var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n    // outside the reference bounds\n\n    var arrowElement = state.elements.arrow;\n    var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n      width: 0,\n      height: 0\n    };\n    var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n    var arrowPaddingMin = arrowPaddingObject[mainSide];\n    var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n    // to include its full size in the calculation. If the reference is small\n    // and near the edge of a boundary, the popper can overflow even if the\n    // reference is not overflowing as well (e.g. virtual elements with no\n    // width or height)\n\n    var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n    var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n    var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n    var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n    var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n    var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n    var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n    var tetherMax = offset + maxOffset - offsetModifierValue;\n    var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n    popperOffsets[mainAxis] = preventedOffset;\n    data[mainAxis] = preventedOffset - offset;\n  }\n\n  if (checkAltAxis) {\n    var _offsetModifierState$2;\n\n    var _mainSide = mainAxis === 'x' ? top : left;\n\n    var _altSide = mainAxis === 'x' ? bottom : right;\n\n    var _offset = popperOffsets[altAxis];\n\n    var _len = altAxis === 'y' ? 'height' : 'width';\n\n    var _min = _offset + overflow[_mainSide];\n\n    var _max = _offset - overflow[_altSide];\n\n    var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n    var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n    var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n    var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n    var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n    popperOffsets[altAxis] = _preventedOffset;\n    data[altAxis] = _preventedOffset - _offset;\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'preventOverflow',\n  enabled: true,\n  phase: 'main',\n  fn: preventOverflow,\n  requiresIfExists: ['offset']\n};", "export default function getHTMLElementScroll(element) {\n  return {\n    scrollLeft: element.scrollLeft,\n    scrollTop: element.scrollTop\n  };\n}", "import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n  if (node === getWindow(node) || !isHTMLElement(node)) {\n    return getWindowScroll(node);\n  } else {\n    return getHTMLElementScroll(node);\n  }\n}", "import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n  var rect = element.getBoundingClientRect();\n  var scaleX = round(rect.width) / element.offsetWidth || 1;\n  var scaleY = round(rect.height) / element.offsetHeight || 1;\n  return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n\n  var isOffsetParentAnElement = isHTMLElement(offsetParent);\n  var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n  var documentElement = getDocumentElement(offsetParent);\n  var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);\n  var scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  var offsets = {\n    x: 0,\n    y: 0\n  };\n\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n    isScrollParent(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n\n    if (isHTMLElement(offsetParent)) {\n      offsets = getBoundingClientRect(offsetParent, true);\n      offsets.x += offsetParent.clientLeft;\n      offsets.y += offsetParent.clientTop;\n    } else if (documentElement) {\n      offsets.x = getWindowScrollBarX(documentElement);\n    }\n  }\n\n  return {\n    x: rect.left + scroll.scrollLeft - offsets.x,\n    y: rect.top + scroll.scrollTop - offsets.y,\n    width: rect.width,\n    height: rect.height\n  };\n}", "import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n  var map = new Map();\n  var visited = new Set();\n  var result = [];\n  modifiers.forEach(function (modifier) {\n    map.set(modifier.name, modifier);\n  }); // On visiting object, check for its dependencies and visit them recursively\n\n  function sort(modifier) {\n    visited.add(modifier.name);\n    var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n    requires.forEach(function (dep) {\n      if (!visited.has(dep)) {\n        var depModifier = map.get(dep);\n\n        if (depModifier) {\n          sort(depModifier);\n        }\n      }\n    });\n    result.push(modifier);\n  }\n\n  modifiers.forEach(function (modifier) {\n    if (!visited.has(modifier.name)) {\n      // check for visited object\n      sort(modifier);\n    }\n  });\n  return result;\n}\n\nexport default function orderModifiers(modifiers) {\n  // order based on dependencies\n  var orderedModifiers = order(modifiers); // order based on phase\n\n  return modifierPhases.reduce(function (acc, phase) {\n    return acc.concat(orderedModifiers.filter(function (modifier) {\n      return modifier.phase === phase;\n    }));\n  }, []);\n}", "export default function debounce(fn) {\n  var pending;\n  return function () {\n    if (!pending) {\n      pending = new Promise(function (resolve) {\n        Promise.resolve().then(function () {\n          pending = undefined;\n          resolve(fn());\n        });\n      });\n    }\n\n    return pending;\n  };\n}", "export default function format(str) {\n  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    args[_key - 1] = arguments[_key];\n  }\n\n  return [].concat(args).reduce(function (p, c) {\n    return p.replace(/%s/, c);\n  }, str);\n}", "import format from \"./format.js\";\nimport { modifierPhases } from \"../enums.js\";\nvar INVALID_MODIFIER_ERROR = 'Popper: modifier \"%s\" provided an invalid %s property, expected %s but got %s';\nvar MISSING_DEPENDENCY_ERROR = 'Popper: modifier \"%s\" requires \"%s\", but \"%s\" modifier is not available';\nvar VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options'];\nexport default function validateModifiers(modifiers) {\n  modifiers.forEach(function (modifier) {\n    [].concat(Object.keys(modifier), VALID_PROPERTIES) // IE11-compatible replacement for `new Set(iterable)`\n    .filter(function (value, index, self) {\n      return self.indexOf(value) === index;\n    }).forEach(function (key) {\n      switch (key) {\n        case 'name':\n          if (typeof modifier.name !== 'string') {\n            console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '\"name\"', '\"string\"', \"\\\"\" + String(modifier.name) + \"\\\"\"));\n          }\n\n          break;\n\n        case 'enabled':\n          if (typeof modifier.enabled !== 'boolean') {\n            console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"enabled\"', '\"boolean\"', \"\\\"\" + String(modifier.enabled) + \"\\\"\"));\n          }\n\n          break;\n\n        case 'phase':\n          if (modifierPhases.indexOf(modifier.phase) < 0) {\n            console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"phase\"', \"either \" + modifierPhases.join(', '), \"\\\"\" + String(modifier.phase) + \"\\\"\"));\n          }\n\n          break;\n\n        case 'fn':\n          if (typeof modifier.fn !== 'function') {\n            console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"fn\"', '\"function\"', \"\\\"\" + String(modifier.fn) + \"\\\"\"));\n          }\n\n          break;\n\n        case 'effect':\n          if (modifier.effect != null && typeof modifier.effect !== 'function') {\n            console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"effect\"', '\"function\"', \"\\\"\" + String(modifier.fn) + \"\\\"\"));\n          }\n\n          break;\n\n        case 'requires':\n          if (modifier.requires != null && !Array.isArray(modifier.requires)) {\n            console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"requires\"', '\"array\"', \"\\\"\" + String(modifier.requires) + \"\\\"\"));\n          }\n\n          break;\n\n        case 'requiresIfExists':\n          if (!Array.isArray(modifier.requiresIfExists)) {\n            console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"requiresIfExists\"', '\"array\"', \"\\\"\" + String(modifier.requiresIfExists) + \"\\\"\"));\n          }\n\n          break;\n\n        case 'options':\n        case 'data':\n          break;\n\n        default:\n          console.error(\"PopperJS: an invalid property has been provided to the \\\"\" + modifier.name + \"\\\" modifier, valid properties are \" + VALID_PROPERTIES.map(function (s) {\n            return \"\\\"\" + s + \"\\\"\";\n          }).join(', ') + \"; but \\\"\" + key + \"\\\" was provided.\");\n      }\n\n      modifier.requires && modifier.requires.forEach(function (requirement) {\n        if (modifiers.find(function (mod) {\n          return mod.name === requirement;\n        }) == null) {\n          console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement));\n        }\n      });\n    });\n  });\n}", "export default function uniqueBy(arr, fn) {\n  var identifiers = new Set();\n  return arr.filter(function (item) {\n    var identifier = fn(item);\n\n    if (!identifiers.has(identifier)) {\n      identifiers.add(identifier);\n      return true;\n    }\n  });\n}", "export default function mergeByName(modifiers) {\n  var merged = modifiers.reduce(function (merged, current) {\n    var existing = merged[current.name];\n    merged[current.name] = existing ? Object.assign({}, existing, current, {\n      options: Object.assign({}, existing.options, current.options),\n      data: Object.assign({}, existing.data, current.data)\n    }) : current;\n    return merged;\n  }, {}); // IE11 does not support Object.values\n\n  return Object.keys(merged).map(function (key) {\n    return merged[key];\n  });\n}", "import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport getComputedStyle from \"./dom-utils/getComputedStyle.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport validateModifiers from \"./utils/validateModifiers.js\";\nimport uniqueBy from \"./utils/uniqueBy.js\";\nimport getBasePlacement from \"./utils/getBasePlacement.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nimport { auto } from \"./enums.js\";\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n  placement: 'bottom',\n  modifiers: [],\n  strategy: 'absolute'\n};\n\nfunction areValidElements() {\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  return !args.some(function (element) {\n    return !(element && typeof element.getBoundingClientRect === 'function');\n  });\n}\n\nexport function popperGenerator(generatorOptions) {\n  if (generatorOptions === void 0) {\n    generatorOptions = {};\n  }\n\n  var _generatorOptions = generatorOptions,\n      _generatorOptions$def = _generatorOptions.defaultModifiers,\n      defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n      _generatorOptions$def2 = _generatorOptions.defaultOptions,\n      defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n  return function createPopper(reference, popper, options) {\n    if (options === void 0) {\n      options = defaultOptions;\n    }\n\n    var state = {\n      placement: 'bottom',\n      orderedModifiers: [],\n      options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n      modifiersData: {},\n      elements: {\n        reference: reference,\n        popper: popper\n      },\n      attributes: {},\n      styles: {}\n    };\n    var effectCleanupFns = [];\n    var isDestroyed = false;\n    var instance = {\n      state: state,\n      setOptions: function setOptions(setOptionsAction) {\n        var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n        cleanupModifierEffects();\n        state.options = Object.assign({}, defaultOptions, state.options, options);\n        state.scrollParents = {\n          reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n          popper: listScrollParents(popper)\n        }; // Orders the modifiers based on their dependencies and `phase`\n        // properties\n\n        var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n        state.orderedModifiers = orderedModifiers.filter(function (m) {\n          return m.enabled;\n        }); // Validate the provided modifiers so that the consumer will get warned\n        // if one of the modifiers is invalid for any reason\n\n        if (process.env.NODE_ENV !== \"production\") {\n          var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n            var name = _ref.name;\n            return name;\n          });\n          validateModifiers(modifiers);\n\n          if (getBasePlacement(state.options.placement) === auto) {\n            var flipModifier = state.orderedModifiers.find(function (_ref2) {\n              var name = _ref2.name;\n              return name === 'flip';\n            });\n\n            if (!flipModifier) {\n              console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n            }\n          }\n\n          var _getComputedStyle = getComputedStyle(popper),\n              marginTop = _getComputedStyle.marginTop,\n              marginRight = _getComputedStyle.marginRight,\n              marginBottom = _getComputedStyle.marginBottom,\n              marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n          // cause bugs with positioning, so we'll warn the consumer\n\n\n          if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n            return parseFloat(margin);\n          })) {\n            console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n          }\n        }\n\n        runModifierEffects();\n        return instance.update();\n      },\n      // Sync update \u2013 it will always be executed, even if not necessary. This\n      // is useful for low frequency updates where sync behavior simplifies the\n      // logic.\n      // For high frequency updates (e.g. `resize` and `scroll` events), always\n      // prefer the async Popper#update method\n      forceUpdate: function forceUpdate() {\n        if (isDestroyed) {\n          return;\n        }\n\n        var _state$elements = state.elements,\n            reference = _state$elements.reference,\n            popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n        // anymore\n\n        if (!areValidElements(reference, popper)) {\n          if (process.env.NODE_ENV !== \"production\") {\n            console.error(INVALID_ELEMENT_ERROR);\n          }\n\n          return;\n        } // Store the reference and popper rects to be read by modifiers\n\n\n        state.rects = {\n          reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n          popper: getLayoutRect(popper)\n        }; // Modifiers have the ability to reset the current update cycle. The\n        // most common use case for this is the `flip` modifier changing the\n        // placement, which then needs to re-run all the modifiers, because the\n        // logic was previously ran for the previous placement and is therefore\n        // stale/incorrect\n\n        state.reset = false;\n        state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n        // is filled with the initial data specified by the modifier. This means\n        // it doesn't persist and is fresh on each update.\n        // To ensure persistent data, use `${name}#persistent`\n\n        state.orderedModifiers.forEach(function (modifier) {\n          return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n        });\n        var __debug_loops__ = 0;\n\n        for (var index = 0; index < state.orderedModifiers.length; index++) {\n          if (process.env.NODE_ENV !== \"production\") {\n            __debug_loops__ += 1;\n\n            if (__debug_loops__ > 100) {\n              console.error(INFINITE_LOOP_ERROR);\n              break;\n            }\n          }\n\n          if (state.reset === true) {\n            state.reset = false;\n            index = -1;\n            continue;\n          }\n\n          var _state$orderedModifie = state.orderedModifiers[index],\n              fn = _state$orderedModifie.fn,\n              _state$orderedModifie2 = _state$orderedModifie.options,\n              _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n              name = _state$orderedModifie.name;\n\n          if (typeof fn === 'function') {\n            state = fn({\n              state: state,\n              options: _options,\n              name: name,\n              instance: instance\n            }) || state;\n          }\n        }\n      },\n      // Async and optimistically optimized update \u2013 it will not be executed if\n      // not necessary (debounced to run at most once-per-tick)\n      update: debounce(function () {\n        return new Promise(function (resolve) {\n          instance.forceUpdate();\n          resolve(state);\n        });\n      }),\n      destroy: function destroy() {\n        cleanupModifierEffects();\n        isDestroyed = true;\n      }\n    };\n\n    if (!areValidElements(reference, popper)) {\n      if (process.env.NODE_ENV !== \"production\") {\n        console.error(INVALID_ELEMENT_ERROR);\n      }\n\n      return instance;\n    }\n\n    instance.setOptions(options).then(function (state) {\n      if (!isDestroyed && options.onFirstUpdate) {\n        options.onFirstUpdate(state);\n      }\n    }); // Modifiers have the ability to execute arbitrary code before the first\n    // update cycle runs. They will be executed in the same order as the update\n    // cycle. This is useful when a modifier adds some persistent data that\n    // other modifiers need to use, but the modifier is run after the dependent\n    // one.\n\n    function runModifierEffects() {\n      state.orderedModifiers.forEach(function (_ref3) {\n        var name = _ref3.name,\n            _ref3$options = _ref3.options,\n            options = _ref3$options === void 0 ? {} : _ref3$options,\n            effect = _ref3.effect;\n\n        if (typeof effect === 'function') {\n          var cleanupFn = effect({\n            state: state,\n            name: name,\n            instance: instance,\n            options: options\n          });\n\n          var noopFn = function noopFn() {};\n\n          effectCleanupFns.push(cleanupFn || noopFn);\n        }\n      });\n    }\n\n    function cleanupModifierEffects() {\n      effectCleanupFns.forEach(function (fn) {\n        return fn();\n      });\n      effectCleanupFns = [];\n    }\n\n    return instance;\n  };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };", "import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n  defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };", "import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n  defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nconst toType = obj => {\n  if (obj === null || obj === undefined) {\n    return `${obj}`\n  }\n\n  return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst getUID = prefix => {\n  do {\n    prefix += Math.floor(Math.random() * MAX_UID)\n  } while (document.getElementById(prefix))\n\n  return prefix\n}\n\nconst getSelector = element => {\n  let selector = element.getAttribute('data-bs-target')\n\n  if (!selector || selector === '#') {\n    let hrefAttr = element.getAttribute('href')\n\n    // The only valid content that could double as a selector are IDs or classes,\n    // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n    // `document.querySelector` will rightfully complain it is invalid.\n    // See https://github.com/twbs/bootstrap/issues/32273\n    if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {\n      return null\n    }\n\n    // Just in case some CMS puts out a full URL with the anchor appended\n    if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n      hrefAttr = `#${hrefAttr.split('#')[1]}`\n    }\n\n    selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null\n  }\n\n  return selector\n}\n\nconst getSelectorFromElement = element => {\n  const selector = getSelector(element)\n\n  if (selector) {\n    return document.querySelector(selector) ? selector : null\n  }\n\n  return null\n}\n\nconst getElementFromSelector = element => {\n  const selector = getSelector(element)\n\n  return selector ? document.querySelector(selector) : null\n}\n\nconst getTransitionDurationFromElement = element => {\n  if (!element) {\n    return 0\n  }\n\n  // Get transition-duration of the element\n  let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n  const floatTransitionDuration = Number.parseFloat(transitionDuration)\n  const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n  // Return 0 if element or transition duration is not found\n  if (!floatTransitionDuration && !floatTransitionDelay) {\n    return 0\n  }\n\n  // If multiple durations are defined, take the first\n  transitionDuration = transitionDuration.split(',')[0]\n  transitionDelay = transitionDelay.split(',')[0]\n\n  return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n  element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = obj => {\n  if (!obj || typeof obj !== 'object') {\n    return false\n  }\n\n  if (typeof obj.jquery !== 'undefined') {\n    obj = obj[0]\n  }\n\n  return typeof obj.nodeType !== 'undefined'\n}\n\nconst getElement = obj => {\n  if (isElement(obj)) { // it's a jQuery object or a node element\n    return obj.jquery ? obj[0] : obj\n  }\n\n  if (typeof obj === 'string' && obj.length > 0) {\n    return document.querySelector(obj)\n  }\n\n  return null\n}\n\nconst typeCheckConfig = (componentName, config, configTypes) => {\n  Object.keys(configTypes).forEach(property => {\n    const expectedTypes = configTypes[property]\n    const value = config[property]\n    const valueType = value && isElement(value) ? 'element' : toType(value)\n\n    if (!new RegExp(expectedTypes).test(valueType)) {\n      throw new TypeError(\n        `${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n      )\n    }\n  })\n}\n\nconst isVisible = element => {\n  if (!isElement(element) || element.getClientRects().length === 0) {\n    return false\n  }\n\n  return getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n}\n\nconst isDisabled = element => {\n  if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n    return true\n  }\n\n  if (element.classList.contains('disabled')) {\n    return true\n  }\n\n  if (typeof element.disabled !== 'undefined') {\n    return element.disabled\n  }\n\n  return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n  if (!document.documentElement.attachShadow) {\n    return null\n  }\n\n  // Can find the shadow root otherwise it'll return the document\n  if (typeof element.getRootNode === 'function') {\n    const root = element.getRootNode()\n    return root instanceof ShadowRoot ? root : null\n  }\n\n  if (element instanceof ShadowRoot) {\n    return element\n  }\n\n  // when we don't find a shadow root\n  if (!element.parentNode) {\n    return null\n  }\n\n  return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n  // eslint-disable-next-line no-unused-expressions\n  element.offsetHeight\n}\n\nconst getjQuery = () => {\n  const { jQuery } = window\n\n  if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n    return jQuery\n  }\n\n  return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n  if (document.readyState === 'loading') {\n    // add listener on the first call when the document is in loading state\n    if (!DOMContentLoadedCallbacks.length) {\n      document.addEventListener('DOMContentLoaded', () => {\n        DOMContentLoadedCallbacks.forEach(callback => callback())\n      })\n    }\n\n    DOMContentLoadedCallbacks.push(callback)\n  } else {\n    callback()\n  }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n  onDOMContentLoaded(() => {\n    const $ = getjQuery()\n    /* istanbul ignore if */\n    if ($) {\n      const name = plugin.NAME\n      const JQUERY_NO_CONFLICT = $.fn[name]\n      $.fn[name] = plugin.jQueryInterface\n      $.fn[name].Constructor = plugin\n      $.fn[name].noConflict = () => {\n        $.fn[name] = JQUERY_NO_CONFLICT\n        return plugin.jQueryInterface\n      }\n    }\n  })\n}\n\nconst execute = callback => {\n  if (typeof callback === 'function') {\n    callback()\n  }\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n  if (!waitForTransition) {\n    execute(callback)\n    return\n  }\n\n  const durationPadding = 5\n  const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n  let called = false\n\n  const handler = ({ target }) => {\n    if (target !== transitionElement) {\n      return\n    }\n\n    called = true\n    transitionElement.removeEventListener(TRANSITION_END, handler)\n    execute(callback)\n  }\n\n  transitionElement.addEventListener(TRANSITION_END, handler)\n  setTimeout(() => {\n    if (!called) {\n      triggerTransitionEnd(transitionElement)\n    }\n  }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list    The list of elements\n * @param activeElement   The active element\n * @param shouldGetNext   Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n  let index = list.indexOf(activeElement)\n\n  // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n  if (index === -1) {\n    return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]\n  }\n\n  const listLength = list.length\n\n  index += shouldGetNext ? 1 : -1\n\n  if (isCycleAllowed) {\n    index = (index + listLength) % listLength\n  }\n\n  return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n  getElement,\n  getUID,\n  getSelectorFromElement,\n  getElementFromSelector,\n  getTransitionDurationFromElement,\n  triggerTransitionEnd,\n  isElement,\n  typeCheckConfig,\n  isVisible,\n  isDisabled,\n  findShadowRoot,\n  noop,\n  getNextActiveElement,\n  reflow,\n  getjQuery,\n  onDOMContentLoaded,\n  isRTL,\n  defineJQueryPlugin,\n  execute,\n  executeAfterTransition\n}\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n  mouseenter: 'mouseover',\n  mouseleave: 'mouseout'\n}\nconst customEventsRegex = /^(mouseenter|mouseleave)/i\nconst nativeEvents = new Set([\n  'click',\n  'dblclick',\n  'mouseup',\n  'mousedown',\n  'contextmenu',\n  'mousewheel',\n  'DOMMouseScroll',\n  'mouseover',\n  'mouseout',\n  'mousemove',\n  'selectstart',\n  'selectend',\n  'keydown',\n  'keypress',\n  'keyup',\n  'orientationchange',\n  'touchstart',\n  'touchmove',\n  'touchend',\n  'touchcancel',\n  'pointerdown',\n  'pointermove',\n  'pointerup',\n  'pointerleave',\n  'pointercancel',\n  'gesturestart',\n  'gesturechange',\n  'gestureend',\n  'focus',\n  'blur',\n  'change',\n  'reset',\n  'select',\n  'submit',\n  'focusin',\n  'focusout',\n  'load',\n  'unload',\n  'beforeunload',\n  'resize',\n  'move',\n  'DOMContentLoaded',\n  'readystatechange',\n  'error',\n  'abort',\n  'scroll'\n])\n\n/**\n * ------------------------------------------------------------------------\n * Private methods\n * ------------------------------------------------------------------------\n */\n\nfunction getUidEvent(element, uid) {\n  return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getEvent(element) {\n  const uid = getUidEvent(element)\n\n  element.uidEvent = uid\n  eventRegistry[uid] = eventRegistry[uid] || {}\n\n  return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n  return function handler(event) {\n    event.delegateTarget = element\n\n    if (handler.oneOff) {\n      EventHandler.off(element, event.type, fn)\n    }\n\n    return fn.apply(element, [event])\n  }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n  return function handler(event) {\n    const domElements = element.querySelectorAll(selector)\n\n    for (let { target } = event; target && target !== this; target = target.parentNode) {\n      for (let i = domElements.length; i--;) {\n        if (domElements[i] === target) {\n          event.delegateTarget = target\n\n          if (handler.oneOff) {\n            EventHandler.off(element, event.type, selector, fn)\n          }\n\n          return fn.apply(target, [event])\n        }\n      }\n    }\n\n    // To please ESLint\n    return null\n  }\n}\n\nfunction findHandler(events, handler, delegationSelector = null) {\n  const uidEventList = Object.keys(events)\n\n  for (let i = 0, len = uidEventList.length; i < len; i++) {\n    const event = events[uidEventList[i]]\n\n    if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n      return event\n    }\n  }\n\n  return null\n}\n\nfunction normalizeParams(originalTypeEvent, handler, delegationFn) {\n  const delegation = typeof handler === 'string'\n  const originalHandler = delegation ? delegationFn : handler\n\n  let typeEvent = getTypeEvent(originalTypeEvent)\n  const isNative = nativeEvents.has(typeEvent)\n\n  if (!isNative) {\n    typeEvent = originalTypeEvent\n  }\n\n  return [delegation, originalHandler, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n  if (typeof originalTypeEvent !== 'string' || !element) {\n    return\n  }\n\n  if (!handler) {\n    handler = delegationFn\n    delegationFn = null\n  }\n\n  // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n  // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n  if (customEventsRegex.test(originalTypeEvent)) {\n    const wrapFn = fn => {\n      return function (event) {\n        if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n          return fn.call(this, event)\n        }\n      }\n    }\n\n    if (delegationFn) {\n      delegationFn = wrapFn(delegationFn)\n    } else {\n      handler = wrapFn(handler)\n    }\n  }\n\n  const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n  const events = getEvent(element)\n  const handlers = events[typeEvent] || (events[typeEvent] = {})\n  const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)\n\n  if (previousFn) {\n    previousFn.oneOff = previousFn.oneOff && oneOff\n\n    return\n  }\n\n  const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))\n  const fn = delegation ?\n    bootstrapDelegationHandler(element, handler, delegationFn) :\n    bootstrapHandler(element, handler)\n\n  fn.delegationSelector = delegation ? handler : null\n  fn.originalHandler = originalHandler\n  fn.oneOff = oneOff\n  fn.uidEvent = uid\n  handlers[uid] = fn\n\n  element.addEventListener(typeEvent, fn, delegation)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n  const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n  if (!fn) {\n    return\n  }\n\n  element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n  delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n  const storeElementEvent = events[typeEvent] || {}\n\n  Object.keys(storeElementEvent).forEach(handlerKey => {\n    if (handlerKey.includes(namespace)) {\n      const event = storeElementEvent[handlerKey]\n\n      removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n    }\n  })\n}\n\nfunction getTypeEvent(event) {\n  // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n  event = event.replace(stripNameRegex, '')\n  return customEvents[event] || event\n}\n\nconst EventHandler = {\n  on(element, event, handler, delegationFn) {\n    addHandler(element, event, handler, delegationFn, false)\n  },\n\n  one(element, event, handler, delegationFn) {\n    addHandler(element, event, handler, delegationFn, true)\n  },\n\n  off(element, originalTypeEvent, handler, delegationFn) {\n    if (typeof originalTypeEvent !== 'string' || !element) {\n      return\n    }\n\n    const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n    const inNamespace = typeEvent !== originalTypeEvent\n    const events = getEvent(element)\n    const isNamespace = originalTypeEvent.startsWith('.')\n\n    if (typeof originalHandler !== 'undefined') {\n      // Simplest case: handler is passed, remove that listener ONLY.\n      if (!events || !events[typeEvent]) {\n        return\n      }\n\n      removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)\n      return\n    }\n\n    if (isNamespace) {\n      Object.keys(events).forEach(elementEvent => {\n        removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n      })\n    }\n\n    const storeElementEvent = events[typeEvent] || {}\n    Object.keys(storeElementEvent).forEach(keyHandlers => {\n      const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n      if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n        const event = storeElementEvent[keyHandlers]\n\n        removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n      }\n    })\n  },\n\n  trigger(element, event, args) {\n    if (typeof event !== 'string' || !element) {\n      return null\n    }\n\n    const $ = getjQuery()\n    const typeEvent = getTypeEvent(event)\n    const inNamespace = event !== typeEvent\n    const isNative = nativeEvents.has(typeEvent)\n\n    let jQueryEvent\n    let bubbles = true\n    let nativeDispatch = true\n    let defaultPrevented = false\n    let evt = null\n\n    if (inNamespace && $) {\n      jQueryEvent = $.Event(event, args)\n\n      $(element).trigger(jQueryEvent)\n      bubbles = !jQueryEvent.isPropagationStopped()\n      nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n      defaultPrevented = jQueryEvent.isDefaultPrevented()\n    }\n\n    if (isNative) {\n      evt = document.createEvent('HTMLEvents')\n      evt.initEvent(typeEvent, bubbles, true)\n    } else {\n      evt = new CustomEvent(event, {\n        bubbles,\n        cancelable: true\n      })\n    }\n\n    // merge custom information in our event\n    if (typeof args !== 'undefined') {\n      Object.keys(args).forEach(key => {\n        Object.defineProperty(evt, key, {\n          get() {\n            return args[key]\n          }\n        })\n      })\n    }\n\n    if (defaultPrevented) {\n      evt.preventDefault()\n    }\n\n    if (nativeDispatch) {\n      element.dispatchEvent(evt)\n    }\n\n    if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n      jQueryEvent.preventDefault()\n    }\n\n    return evt\n  }\n}\n\nexport default EventHandler\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst elementMap = new Map()\n\nexport default {\n  set(element, key, instance) {\n    if (!elementMap.has(element)) {\n      elementMap.set(element, new Map())\n    }\n\n    const instanceMap = elementMap.get(element)\n\n    // make it clear we only want one instance per element\n    // can be removed later when multiple key/instances are fine to be used\n    if (!instanceMap.has(key) && instanceMap.size !== 0) {\n      // eslint-disable-next-line no-console\n      console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n      return\n    }\n\n    instanceMap.set(key, instance)\n  },\n\n  get(element, key) {\n    if (elementMap.has(element)) {\n      return elementMap.get(element).get(key) || null\n    }\n\n    return null\n  },\n\n  remove(element, key) {\n    if (!elementMap.has(element)) {\n      return\n    }\n\n    const instanceMap = elementMap.get(element)\n\n    instanceMap.delete(key)\n\n    // free up element references if there are no instances left for an element\n    if (instanceMap.size === 0) {\n      elementMap.delete(element)\n    }\n  }\n}\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\nimport {\n  executeAfterTransition,\n  getElement\n} from './util/index'\nimport EventHandler from './dom/event-handler'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.1.3'\n\nclass BaseComponent {\n  constructor(element) {\n    element = getElement(element)\n\n    if (!element) {\n      return\n    }\n\n    this._element = element\n    Data.set(this._element, this.constructor.DATA_KEY, this)\n  }\n\n  dispose() {\n    Data.remove(this._element, this.constructor.DATA_KEY)\n    EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n    Object.getOwnPropertyNames(this).forEach(propertyName => {\n      this[propertyName] = null\n    })\n  }\n\n  _queueCallback(callback, element, isAnimated = true) {\n    executeAfterTransition(callback, element, isAnimated)\n  }\n\n  /** Static */\n\n  static getInstance(element) {\n    return Data.get(getElement(element), this.DATA_KEY)\n  }\n\n  static getOrCreateInstance(element, config = {}) {\n    return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n  }\n\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get NAME() {\n    throw new Error('You have to implement the static method \"NAME\", for each component!')\n  }\n\n  static get DATA_KEY() {\n    return `bs.${this.NAME}`\n  }\n\n  static get EVENT_KEY() {\n    return `.${this.DATA_KEY}`\n  }\n}\n\nexport default BaseComponent\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { getElementFromSelector, isDisabled } from './index'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n  const clickEvent = `click.dismiss${component.EVENT_KEY}`\n  const name = component.NAME\n\n  EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault()\n    }\n\n    if (isDisabled(this)) {\n      return\n    }\n\n    const target = getElementFromSelector(this) || this.closest(`.${name}`)\n    const instance = component.getOrCreateInstance(target)\n\n    // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n    instance[method]()\n  })\n}\n\nexport {\n  enableDismissTrigger\n}\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert extends BaseComponent {\n  // Getters\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n\n  close() {\n    const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n    if (closeEvent.defaultPrevented) {\n      return\n    }\n\n    this._element.classList.remove(CLASS_NAME_SHOW)\n\n    const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n    this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n  }\n\n  // Private\n  _destroyElement() {\n    this._element.remove()\n    EventHandler.trigger(this._element, EVENT_CLOSED)\n    this.dispose()\n  }\n\n  // Static\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Alert.getOrCreateInstance(this)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config](this)\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Alert to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button extends BaseComponent {\n  // Getters\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n\n  toggle() {\n    // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n    this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n  }\n\n  // Static\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Button.getOrCreateInstance(this)\n\n      if (config === 'toggle') {\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n  event.preventDefault()\n\n  const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n  const data = Button.getOrCreateInstance(button)\n\n  data.toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Button to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(val) {\n  if (val === 'true') {\n    return true\n  }\n\n  if (val === 'false') {\n    return false\n  }\n\n  if (val === Number(val).toString()) {\n    return Number(val)\n  }\n\n  if (val === '' || val === 'null') {\n    return null\n  }\n\n  return val\n}\n\nfunction normalizeDataKey(key) {\n  return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n  setDataAttribute(element, key, value) {\n    element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n  },\n\n  removeDataAttribute(element, key) {\n    element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n  },\n\n  getDataAttributes(element) {\n    if (!element) {\n      return {}\n    }\n\n    const attributes = {}\n\n    Object.keys(element.dataset)\n      .filter(key => key.startsWith('bs'))\n      .forEach(key => {\n        let pureKey = key.replace(/^bs/, '')\n        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n        attributes[pureKey] = normalizeData(element.dataset[key])\n      })\n\n    return attributes\n  },\n\n  getDataAttribute(element, key) {\n    return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n  },\n\n  offset(element) {\n    const rect = element.getBoundingClientRect()\n\n    return {\n      top: rect.top + window.pageYOffset,\n      left: rect.left + window.pageXOffset\n    }\n  },\n\n  position(element) {\n    return {\n      top: element.offsetTop,\n      left: element.offsetLeft\n    }\n  }\n}\n\nexport default Manipulator\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible } from '../util/index'\n\nconst NODE_TEXT = 3\n\nconst SelectorEngine = {\n  find(selector, element = document.documentElement) {\n    return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n  },\n\n  findOne(selector, element = document.documentElement) {\n    return Element.prototype.querySelector.call(element, selector)\n  },\n\n  children(element, selector) {\n    return [].concat(...element.children)\n      .filter(child => child.matches(selector))\n  },\n\n  parents(element, selector) {\n    const parents = []\n\n    let ancestor = element.parentNode\n\n    while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n      if (ancestor.matches(selector)) {\n        parents.push(ancestor)\n      }\n\n      ancestor = ancestor.parentNode\n    }\n\n    return parents\n  },\n\n  prev(element, selector) {\n    let previous = element.previousElementSibling\n\n    while (previous) {\n      if (previous.matches(selector)) {\n        return [previous]\n      }\n\n      previous = previous.previousElementSibling\n    }\n\n    return []\n  },\n\n  next(element, selector) {\n    let next = element.nextElementSibling\n\n    while (next) {\n      if (next.matches(selector)) {\n        return [next]\n      }\n\n      next = next.nextElementSibling\n    }\n\n    return []\n  },\n\n  focusableChildren(element) {\n    const focusables = [\n      'a',\n      'button',\n      'input',\n      'textarea',\n      'select',\n      'details',\n      '[tabindex]',\n      '[contenteditable=\"true\"]'\n    ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(', ')\n\n    return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n  }\n}\n\nexport default SelectorEngine\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n  defineJQueryPlugin,\n  getElementFromSelector,\n  isRTL,\n  isVisible,\n  getNextActiveElement,\n  reflow,\n  triggerTransitionEnd,\n  typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n  interval: 5000,\n  keyboard: true,\n  slide: false,\n  pause: 'hover',\n  wrap: true,\n  touch: true\n}\n\nconst DefaultType = {\n  interval: '(number|boolean)',\n  keyboard: 'boolean',\n  slide: '(boolean|string)',\n  pause: '(string|boolean)',\n  wrap: 'boolean',\n  touch: 'boolean'\n}\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst KEY_TO_DIRECTION = {\n  [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n  [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_INDICATOR = '[data-bs-target]'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel extends BaseComponent {\n  constructor(element, config) {\n    super(element)\n\n    this._items = null\n    this._interval = null\n    this._activeElement = null\n    this._isPaused = false\n    this._isSliding = false\n    this.touchTimeout = null\n    this.touchStartX = 0\n    this.touchDeltaX = 0\n\n    this._config = this._getConfig(config)\n    this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n    this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n    this._pointerEvent = Boolean(window.PointerEvent)\n\n    this._addEventListeners()\n  }\n\n  // Getters\n\n  static get Default() {\n    return Default\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n\n  next() {\n    this._slide(ORDER_NEXT)\n  }\n\n  nextWhenVisible() {\n    // Don't call next when the page isn't visible\n    // or the carousel or its parent isn't visible\n    if (!document.hidden && isVisible(this._element)) {\n      this.next()\n    }\n  }\n\n  prev() {\n    this._slide(ORDER_PREV)\n  }\n\n  pause(event) {\n    if (!event) {\n      this._isPaused = true\n    }\n\n    if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n      triggerTransitionEnd(this._element)\n      this.cycle(true)\n    }\n\n    clearInterval(this._interval)\n    this._interval = null\n  }\n\n  cycle(event) {\n    if (!event) {\n      this._isPaused = false\n    }\n\n    if (this._interval) {\n      clearInterval(this._interval)\n      this._interval = null\n    }\n\n    if (this._config && this._config.interval && !this._isPaused) {\n      this._updateInterval()\n\n      this._interval = setInterval(\n        (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n        this._config.interval\n      )\n    }\n  }\n\n  to(index) {\n    this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n    const activeIndex = this._getItemIndex(this._activeElement)\n\n    if (index > this._items.length - 1 || index < 0) {\n      return\n    }\n\n    if (this._isSliding) {\n      EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n      return\n    }\n\n    if (activeIndex === index) {\n      this.pause()\n      this.cycle()\n      return\n    }\n\n    const order = index > activeIndex ?\n      ORDER_NEXT :\n      ORDER_PREV\n\n    this._slide(order, this._items[index])\n  }\n\n  // Private\n\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...Manipulator.getDataAttributes(this._element),\n      ...(typeof config === 'object' ? config : {})\n    }\n    typeCheckConfig(NAME, config, DefaultType)\n    return config\n  }\n\n  _handleSwipe() {\n    const absDeltax = Math.abs(this.touchDeltaX)\n\n    if (absDeltax <= SWIPE_THRESHOLD) {\n      return\n    }\n\n    const direction = absDeltax / this.touchDeltaX\n\n    this.touchDeltaX = 0\n\n    if (!direction) {\n      return\n    }\n\n    this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT)\n  }\n\n  _addEventListeners() {\n    if (this._config.keyboard) {\n      EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n    }\n\n    if (this._config.pause === 'hover') {\n      EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event))\n      EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event))\n    }\n\n    if (this._config.touch && this._touchSupported) {\n      this._addTouchEventListeners()\n    }\n  }\n\n  _addTouchEventListeners() {\n    const hasPointerPenTouch = event => {\n      return this._pointerEvent &&\n        (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n    }\n\n    const start = event => {\n      if (hasPointerPenTouch(event)) {\n        this.touchStartX = event.clientX\n      } else if (!this._pointerEvent) {\n        this.touchStartX = event.touches[0].clientX\n      }\n    }\n\n    const move = event => {\n      // ensure swiping with one touch and not pinching\n      this.touchDeltaX = event.touches && event.touches.length > 1 ?\n        0 :\n        event.touches[0].clientX - this.touchStartX\n    }\n\n    const end = event => {\n      if (hasPointerPenTouch(event)) {\n        this.touchDeltaX = event.clientX - this.touchStartX\n      }\n\n      this._handleSwipe()\n      if (this._config.pause === 'hover') {\n        // If it's a touch-enabled device, mouseenter/leave are fired as\n        // part of the mouse compatibility events on first tap - the carousel\n        // would stop cycling until user tapped out of it;\n        // here, we listen for touchend, explicitly pause the carousel\n        // (as if it's the second time we tap on it, mouseenter compat event\n        // is NOT fired) and after a timeout (to allow for mouse compatibility\n        // events to fire) we explicitly restart cycling\n\n        this.pause()\n        if (this.touchTimeout) {\n          clearTimeout(this.touchTimeout)\n        }\n\n        this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n      }\n    }\n\n    SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n      EventHandler.on(itemImg, EVENT_DRAG_START, event => event.preventDefault())\n    })\n\n    if (this._pointerEvent) {\n      EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event))\n      EventHandler.on(this._element, EVENT_POINTERUP, event => end(event))\n\n      this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n    } else {\n      EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event))\n      EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event))\n      EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event))\n    }\n  }\n\n  _keydown(event) {\n    if (/input|textarea/i.test(event.target.tagName)) {\n      return\n    }\n\n    const direction = KEY_TO_DIRECTION[event.key]\n    if (direction) {\n      event.preventDefault()\n      this._slide(direction)\n    }\n  }\n\n  _getItemIndex(element) {\n    this._items = element && element.parentNode ?\n      SelectorEngine.find(SELECTOR_ITEM, element.parentNode) :\n      []\n\n    return this._items.indexOf(element)\n  }\n\n  _getItemByOrder(order, activeElement) {\n    const isNext = order === ORDER_NEXT\n    return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap)\n  }\n\n  _triggerSlideEvent(relatedTarget, eventDirectionName) {\n    const targetIndex = this._getItemIndex(relatedTarget)\n    const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element))\n\n    return EventHandler.trigger(this._element, EVENT_SLIDE, {\n      relatedTarget,\n      direction: eventDirectionName,\n      from: fromIndex,\n      to: targetIndex\n    })\n  }\n\n  _setActiveIndicatorElement(element) {\n    if (this._indicatorsElement) {\n      const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n      activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n      activeIndicator.removeAttribute('aria-current')\n\n      const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement)\n\n      for (let i = 0; i < indicators.length; i++) {\n        if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n          indicators[i].classList.add(CLASS_NAME_ACTIVE)\n          indicators[i].setAttribute('aria-current', 'true')\n          break\n        }\n      }\n    }\n  }\n\n  _updateInterval() {\n    const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n\n    if (!element) {\n      return\n    }\n\n    const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n    if (elementInterval) {\n      this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n      this._config.interval = elementInterval\n    } else {\n      this._config.interval = this._config.defaultInterval || this._config.interval\n    }\n  }\n\n  _slide(directionOrOrder, element) {\n    const order = this._directionToOrder(directionOrOrder)\n    const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n    const activeElementIndex = this._getItemIndex(activeElement)\n    const nextElement = element || this._getItemByOrder(order, activeElement)\n\n    const nextElementIndex = this._getItemIndex(nextElement)\n    const isCycling = Boolean(this._interval)\n\n    const isNext = order === ORDER_NEXT\n    const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n    const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n    const eventDirectionName = this._orderToDirection(order)\n\n    if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {\n      this._isSliding = false\n      return\n    }\n\n    if (this._isSliding) {\n      return\n    }\n\n    const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n    if (slideEvent.defaultPrevented) {\n      return\n    }\n\n    if (!activeElement || !nextElement) {\n      // Some weirdness is happening, so we bail\n      return\n    }\n\n    this._isSliding = true\n\n    if (isCycling) {\n      this.pause()\n    }\n\n    this._setActiveIndicatorElement(nextElement)\n    this._activeElement = nextElement\n\n    const triggerSlidEvent = () => {\n      EventHandler.trigger(this._element, EVENT_SLID, {\n        relatedTarget: nextElement,\n        direction: eventDirectionName,\n        from: activeElementIndex,\n        to: nextElementIndex\n      })\n    }\n\n    if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n      nextElement.classList.add(orderClassName)\n\n      reflow(nextElement)\n\n      activeElement.classList.add(directionalClassName)\n      nextElement.classList.add(directionalClassName)\n\n      const completeCallBack = () => {\n        nextElement.classList.remove(directionalClassName, orderClassName)\n        nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n        activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n        this._isSliding = false\n\n        setTimeout(triggerSlidEvent, 0)\n      }\n\n      this._queueCallback(completeCallBack, activeElement, true)\n    } else {\n      activeElement.classList.remove(CLASS_NAME_ACTIVE)\n      nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n      this._isSliding = false\n      triggerSlidEvent()\n    }\n\n    if (isCycling) {\n      this.cycle()\n    }\n  }\n\n  _directionToOrder(direction) {\n    if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n      return direction\n    }\n\n    if (isRTL()) {\n      return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n    }\n\n    return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n  }\n\n  _orderToDirection(order) {\n    if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n      return order\n    }\n\n    if (isRTL()) {\n      return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n    }\n\n    return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n  }\n\n  // Static\n\n  static carouselInterface(element, config) {\n    const data = Carousel.getOrCreateInstance(element, config)\n\n    let { _config } = data\n    if (typeof config === 'object') {\n      _config = {\n        ..._config,\n        ...config\n      }\n    }\n\n    const action = typeof config === 'string' ? config : _config.slide\n\n    if (typeof config === 'number') {\n      data.to(config)\n    } else if (typeof action === 'string') {\n      if (typeof data[action] === 'undefined') {\n        throw new TypeError(`No method named \"${action}\"`)\n      }\n\n      data[action]()\n    } else if (_config.interval && _config.ride) {\n      data.pause()\n      data.cycle()\n    }\n  }\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      Carousel.carouselInterface(this, config)\n    })\n  }\n\n  static dataApiClickHandler(event) {\n    const target = getElementFromSelector(this)\n\n    if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n      return\n    }\n\n    const config = {\n      ...Manipulator.getDataAttributes(target),\n      ...Manipulator.getDataAttributes(this)\n    }\n    const slideIndex = this.getAttribute('data-bs-slide-to')\n\n    if (slideIndex) {\n      config.interval = false\n    }\n\n    Carousel.carouselInterface(target, config)\n\n    if (slideIndex) {\n      Carousel.getInstance(target).to(slideIndex)\n    }\n\n    event.preventDefault()\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler)\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n  const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n  for (let i = 0, len = carousels.length; i < len; i++) {\n    Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]))\n  }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Carousel to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n  defineJQueryPlugin,\n  getElement,\n  getSelectorFromElement,\n  getElementFromSelector,\n  reflow,\n  typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n  toggle: true,\n  parent: null\n}\n\nconst DefaultType = {\n  toggle: 'boolean',\n  parent: '(null|element)'\n}\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse extends BaseComponent {\n  constructor(element, config) {\n    super(element)\n\n    this._isTransitioning = false\n    this._config = this._getConfig(config)\n    this._triggerArray = []\n\n    const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n    for (let i = 0, len = toggleList.length; i < len; i++) {\n      const elem = toggleList[i]\n      const selector = getSelectorFromElement(elem)\n      const filterElement = SelectorEngine.find(selector)\n        .filter(foundElem => foundElem === this._element)\n\n      if (selector !== null && filterElement.length) {\n        this._selector = selector\n        this._triggerArray.push(elem)\n      }\n    }\n\n    this._initializeChildren()\n\n    if (!this._config.parent) {\n      this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n    }\n\n    if (this._config.toggle) {\n      this.toggle()\n    }\n  }\n\n  // Getters\n\n  static get Default() {\n    return Default\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n\n  toggle() {\n    if (this._isShown()) {\n      this.hide()\n    } else {\n      this.show()\n    }\n  }\n\n  show() {\n    if (this._isTransitioning || this._isShown()) {\n      return\n    }\n\n    let actives = []\n    let activesData\n\n    if (this._config.parent) {\n      const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n      actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)) // remove children if greater depth\n    }\n\n    const container = SelectorEngine.findOne(this._selector)\n    if (actives.length) {\n      const tempActiveData = actives.find(elem => container !== elem)\n      activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null\n\n      if (activesData && activesData._isTransitioning) {\n        return\n      }\n    }\n\n    const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n    if (startEvent.defaultPrevented) {\n      return\n    }\n\n    actives.forEach(elemActive => {\n      if (container !== elemActive) {\n        Collapse.getOrCreateInstance(elemActive, { toggle: false }).hide()\n      }\n\n      if (!activesData) {\n        Data.set(elemActive, DATA_KEY, null)\n      }\n    })\n\n    const dimension = this._getDimension()\n\n    this._element.classList.remove(CLASS_NAME_COLLAPSE)\n    this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n    this._element.style[dimension] = 0\n\n    this._addAriaAndCollapsedClass(this._triggerArray, true)\n    this._isTransitioning = true\n\n    const complete = () => {\n      this._isTransitioning = false\n\n      this._element.classList.remove(CLASS_NAME_COLLAPSING)\n      this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n      this._element.style[dimension] = ''\n\n      EventHandler.trigger(this._element, EVENT_SHOWN)\n    }\n\n    const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n    const scrollSize = `scroll${capitalizedDimension}`\n\n    this._queueCallback(complete, this._element, true)\n    this._element.style[dimension] = `${this._element[scrollSize]}px`\n  }\n\n  hide() {\n    if (this._isTransitioning || !this._isShown()) {\n      return\n    }\n\n    const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n    if (startEvent.defaultPrevented) {\n      return\n    }\n\n    const dimension = this._getDimension()\n\n    this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n    reflow(this._element)\n\n    this._element.classList.add(CLASS_NAME_COLLAPSING)\n    this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n    const triggerArrayLength = this._triggerArray.length\n    for (let i = 0; i < triggerArrayLength; i++) {\n      const trigger = this._triggerArray[i]\n      const elem = getElementFromSelector(trigger)\n\n      if (elem && !this._isShown(elem)) {\n        this._addAriaAndCollapsedClass([trigger], false)\n      }\n    }\n\n    this._isTransitioning = true\n\n    const complete = () => {\n      this._isTransitioning = false\n      this._element.classList.remove(CLASS_NAME_COLLAPSING)\n      this._element.classList.add(CLASS_NAME_COLLAPSE)\n      EventHandler.trigger(this._element, EVENT_HIDDEN)\n    }\n\n    this._element.style[dimension] = ''\n\n    this._queueCallback(complete, this._element, true)\n  }\n\n  _isShown(element = this._element) {\n    return element.classList.contains(CLASS_NAME_SHOW)\n  }\n\n  // Private\n\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...Manipulator.getDataAttributes(this._element),\n      ...config\n    }\n    config.toggle = Boolean(config.toggle) // Coerce string values\n    config.parent = getElement(config.parent)\n    typeCheckConfig(NAME, config, DefaultType)\n    return config\n  }\n\n  _getDimension() {\n    return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n  }\n\n  _initializeChildren() {\n    if (!this._config.parent) {\n      return\n    }\n\n    const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n    SelectorEngine.find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem))\n      .forEach(element => {\n        const selected = getElementFromSelector(element)\n\n        if (selected) {\n          this._addAriaAndCollapsedClass([element], this._isShown(selected))\n        }\n      })\n  }\n\n  _addAriaAndCollapsedClass(triggerArray, isOpen) {\n    if (!triggerArray.length) {\n      return\n    }\n\n    triggerArray.forEach(elem => {\n      if (isOpen) {\n        elem.classList.remove(CLASS_NAME_COLLAPSED)\n      } else {\n        elem.classList.add(CLASS_NAME_COLLAPSED)\n      }\n\n      elem.setAttribute('aria-expanded', isOpen)\n    })\n  }\n\n  // Static\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const _config = {}\n      if (typeof config === 'string' && /show|hide/.test(config)) {\n        _config.toggle = false\n      }\n\n      const data = Collapse.getOrCreateInstance(this, _config)\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n  if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n    event.preventDefault()\n  }\n\n  const selector = getSelectorFromElement(this)\n  const selectorElements = SelectorEngine.find(selector)\n\n  selectorElements.forEach(element => {\n    Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n  })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Collapse to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n  defineJQueryPlugin,\n  getElement,\n  getElementFromSelector,\n  getNextActiveElement,\n  isDisabled,\n  isElement,\n  isRTL,\n  isVisible,\n  noop,\n  typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst SPACE_KEY = 'Space'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`)\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_NAVBAR = 'navbar'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\n\nconst Default = {\n  offset: [0, 2],\n  boundary: 'clippingParents',\n  reference: 'toggle',\n  display: 'dynamic',\n  popperConfig: null,\n  autoClose: true\n}\n\nconst DefaultType = {\n  offset: '(array|string|function)',\n  boundary: '(string|element)',\n  reference: '(string|element|object)',\n  display: 'string',\n  popperConfig: '(null|object|function)',\n  autoClose: '(boolean|string)'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown extends BaseComponent {\n  constructor(element, config) {\n    super(element)\n\n    this._popper = null\n    this._config = this._getConfig(config)\n    this._menu = this._getMenuElement()\n    this._inNavbar = this._detectNavbar()\n  }\n\n  // Getters\n\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n\n  toggle() {\n    return this._isShown() ? this.hide() : this.show()\n  }\n\n  show() {\n    if (isDisabled(this._element) || this._isShown(this._menu)) {\n      return\n    }\n\n    const relatedTarget = {\n      relatedTarget: this._element\n    }\n\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n    if (showEvent.defaultPrevented) {\n      return\n    }\n\n    const parent = Dropdown.getParentFromElement(this._element)\n    // Totally disable Popper for Dropdowns in Navbar\n    if (this._inNavbar) {\n      Manipulator.setDataAttribute(this._menu, 'popper', 'none')\n    } else {\n      this._createPopper(parent)\n    }\n\n    // If this is a touch-enabled device we add extra\n    // empty mouseover listeners to the body's immediate children;\n    // only needed because of broken event delegation on iOS\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n    if ('ontouchstart' in document.documentElement &&\n      !parent.closest(SELECTOR_NAVBAR_NAV)) {\n      [].concat(...document.body.children)\n        .forEach(elem => EventHandler.on(elem, 'mouseover', noop))\n    }\n\n    this._element.focus()\n    this._element.setAttribute('aria-expanded', true)\n\n    this._menu.classList.add(CLASS_NAME_SHOW)\n    this._element.classList.add(CLASS_NAME_SHOW)\n    EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n  }\n\n  hide() {\n    if (isDisabled(this._element) || !this._isShown(this._menu)) {\n      return\n    }\n\n    const relatedTarget = {\n      relatedTarget: this._element\n    }\n\n    this._completeHide(relatedTarget)\n  }\n\n  dispose() {\n    if (this._popper) {\n      this._popper.destroy()\n    }\n\n    super.dispose()\n  }\n\n  update() {\n    this._inNavbar = this._detectNavbar()\n    if (this._popper) {\n      this._popper.update()\n    }\n  }\n\n  // Private\n\n  _completeHide(relatedTarget) {\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n    if (hideEvent.defaultPrevented) {\n      return\n    }\n\n    // If this is a touch-enabled device we remove the extra\n    // empty mouseover listeners we added for iOS support\n    if ('ontouchstart' in document.documentElement) {\n      [].concat(...document.body.children)\n        .forEach(elem => EventHandler.off(elem, 'mouseover', noop))\n    }\n\n    if (this._popper) {\n      this._popper.destroy()\n    }\n\n    this._menu.classList.remove(CLASS_NAME_SHOW)\n    this._element.classList.remove(CLASS_NAME_SHOW)\n    this._element.setAttribute('aria-expanded', 'false')\n    Manipulator.removeDataAttribute(this._menu, 'popper')\n    EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n  }\n\n  _getConfig(config) {\n    config = {\n      ...this.constructor.Default,\n      ...Manipulator.getDataAttributes(this._element),\n      ...config\n    }\n\n    typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n    if (typeof config.reference === 'object' && !isElement(config.reference) &&\n      typeof config.reference.getBoundingClientRect !== 'function'\n    ) {\n      // Popper virtual elements require a getBoundingClientRect method\n      throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n    }\n\n    return config\n  }\n\n  _createPopper(parent) {\n    if (typeof Popper === 'undefined') {\n      throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n    }\n\n    let referenceElement = this._element\n\n    if (this._config.reference === 'parent') {\n      referenceElement = parent\n    } else if (isElement(this._config.reference)) {\n      referenceElement = getElement(this._config.reference)\n    } else if (typeof this._config.reference === 'object') {\n      referenceElement = this._config.reference\n    }\n\n    const popperConfig = this._getPopperConfig()\n    const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false)\n\n    this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n\n    if (isDisplayStatic) {\n      Manipulator.setDataAttribute(this._menu, 'popper', 'static')\n    }\n  }\n\n  _isShown(element = this._element) {\n    return element.classList.contains(CLASS_NAME_SHOW)\n  }\n\n  _getMenuElement() {\n    return SelectorEngine.next(this._element, SELECTOR_MENU)[0]\n  }\n\n  _getPlacement() {\n    const parentDropdown = this._element.parentNode\n\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n      return PLACEMENT_RIGHT\n    }\n\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n      return PLACEMENT_LEFT\n    }\n\n    // We need to trim the value because custom properties can also include spaces\n    const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n      return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n    }\n\n    return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n  }\n\n  _detectNavbar() {\n    return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null\n  }\n\n  _getOffset() {\n    const { offset } = this._config\n\n    if (typeof offset === 'string') {\n      return offset.split(',').map(val => Number.parseInt(val, 10))\n    }\n\n    if (typeof offset === 'function') {\n      return popperData => offset(popperData, this._element)\n    }\n\n    return offset\n  }\n\n  _getPopperConfig() {\n    const defaultBsPopperConfig = {\n      placement: this._getPlacement(),\n      modifiers: [{\n        name: 'preventOverflow',\n        options: {\n          boundary: this._config.boundary\n        }\n      },\n      {\n        name: 'offset',\n        options: {\n          offset: this._getOffset()\n        }\n      }]\n    }\n\n    // Disable Popper if we have a static display\n    if (this._config.display === 'static') {\n      defaultBsPopperConfig.modifiers = [{\n        name: 'applyStyles',\n        enabled: false\n      }]\n    }\n\n    return {\n      ...defaultBsPopperConfig,\n      ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n    }\n  }\n\n  _selectMenuItem({ key, target }) {\n    const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible)\n\n    if (!items.length) {\n      return\n    }\n\n    // if target isn't included in items (e.g. when expanding the dropdown)\n    // allow cycling to get the last item in case key equals ARROW_UP_KEY\n    getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n  }\n\n  // Static\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Dropdown.getOrCreateInstance(this, config)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config]()\n    })\n  }\n\n  static clearMenus(event) {\n    if (event && (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY))) {\n      return\n    }\n\n    const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n    for (let i = 0, len = toggles.length; i < len; i++) {\n      const context = Dropdown.getInstance(toggles[i])\n      if (!context || context._config.autoClose === false) {\n        continue\n      }\n\n      if (!context._isShown()) {\n        continue\n      }\n\n      const relatedTarget = {\n        relatedTarget: context._element\n      }\n\n      if (event) {\n        const composedPath = event.composedPath()\n        const isMenuTarget = composedPath.includes(context._menu)\n        if (\n          composedPath.includes(context._element) ||\n          (context._config.autoClose === 'inside' && !isMenuTarget) ||\n          (context._config.autoClose === 'outside' && isMenuTarget)\n        ) {\n          continue\n        }\n\n        // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n        if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n          continue\n        }\n\n        if (event.type === 'click') {\n          relatedTarget.clickEvent = event\n        }\n      }\n\n      context._completeHide(relatedTarget)\n    }\n  }\n\n  static getParentFromElement(element) {\n    return getElementFromSelector(element) || element.parentNode\n  }\n\n  static dataApiKeydownHandler(event) {\n    // If not input/textarea:\n    //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n    // If input/textarea:\n    //  - If space key => not a dropdown command\n    //  - If key is other than escape\n    //    - If key is not up or down => not a dropdown command\n    //    - If trigger inside the menu => not a dropdown command\n    if (/input|textarea/i.test(event.target.tagName) ?\n      event.key === SPACE_KEY || (event.key !== ESCAPE_KEY &&\n      ((event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY) ||\n        event.target.closest(SELECTOR_MENU))) :\n      !REGEXP_KEYDOWN.test(event.key)) {\n      return\n    }\n\n    const isActive = this.classList.contains(CLASS_NAME_SHOW)\n\n    if (!isActive && event.key === ESCAPE_KEY) {\n      return\n    }\n\n    event.preventDefault()\n    event.stopPropagation()\n\n    if (isDisabled(this)) {\n      return\n    }\n\n    const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]\n    const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n    if (event.key === ESCAPE_KEY) {\n      instance.hide()\n      return\n    }\n\n    if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n      if (!isActive) {\n        instance.show()\n      }\n\n      instance._selectMenuItem(event)\n      return\n    }\n\n    if (!isActive || event.key === SPACE_KEY) {\n      Dropdown.clearMenus()\n    }\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  event.preventDefault()\n  Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Dropdown to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine'\nimport Manipulator from '../dom/manipulator'\nimport { isElement } from './index'\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\nclass ScrollBarHelper {\n  constructor() {\n    this._element = document.body\n  }\n\n  getWidth() {\n    // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n    const documentWidth = document.documentElement.clientWidth\n    return Math.abs(window.innerWidth - documentWidth)\n  }\n\n  hide() {\n    const width = this.getWidth()\n    this._disableOverFlow()\n    // give padding to element to balance the hidden scrollbar width\n    this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width)\n    // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n    this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width)\n    this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width)\n  }\n\n  _disableOverFlow() {\n    this._saveInitialAttribute(this._element, 'overflow')\n    this._element.style.overflow = 'hidden'\n  }\n\n  _setElementAttributes(selector, styleProp, callback) {\n    const scrollbarWidth = this.getWidth()\n    const manipulationCallBack = element => {\n      if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n        return\n      }\n\n      this._saveInitialAttribute(element, styleProp)\n      const calculatedValue = window.getComputedStyle(element)[styleProp]\n      element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`\n    }\n\n    this._applyManipulationCallback(selector, manipulationCallBack)\n  }\n\n  reset() {\n    this._resetElementAttributes(this._element, 'overflow')\n    this._resetElementAttributes(this._element, 'paddingRight')\n    this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight')\n    this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight')\n  }\n\n  _saveInitialAttribute(element, styleProp) {\n    const actualValue = element.style[styleProp]\n    if (actualValue) {\n      Manipulator.setDataAttribute(element, styleProp, actualValue)\n    }\n  }\n\n  _resetElementAttributes(selector, styleProp) {\n    const manipulationCallBack = element => {\n      const value = Manipulator.getDataAttribute(element, styleProp)\n      if (typeof value === 'undefined') {\n        element.style.removeProperty(styleProp)\n      } else {\n        Manipulator.removeDataAttribute(element, styleProp)\n        element.style[styleProp] = value\n      }\n    }\n\n    this._applyManipulationCallback(selector, manipulationCallBack)\n  }\n\n  _applyManipulationCallback(selector, callBack) {\n    if (isElement(selector)) {\n      callBack(selector)\n    } else {\n      SelectorEngine.find(selector, this._element).forEach(callBack)\n    }\n  }\n\n  isOverflowing() {\n    return this.getWidth() > 0\n  }\n}\n\nexport default ScrollBarHelper\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { execute, executeAfterTransition, getElement, reflow, typeCheckConfig } from './index'\n\nconst Default = {\n  className: 'modal-backdrop',\n  isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n  isAnimated: false,\n  rootElement: 'body', // give the choice to place backdrop under different elements\n  clickCallback: null\n}\n\nconst DefaultType = {\n  className: 'string',\n  isVisible: 'boolean',\n  isAnimated: 'boolean',\n  rootElement: '(element|string)',\n  clickCallback: '(function|null)'\n}\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nclass Backdrop {\n  constructor(config) {\n    this._config = this._getConfig(config)\n    this._isAppended = false\n    this._element = null\n  }\n\n  show(callback) {\n    if (!this._config.isVisible) {\n      execute(callback)\n      return\n    }\n\n    this._append()\n\n    if (this._config.isAnimated) {\n      reflow(this._getElement())\n    }\n\n    this._getElement().classList.add(CLASS_NAME_SHOW)\n\n    this._emulateAnimation(() => {\n      execute(callback)\n    })\n  }\n\n  hide(callback) {\n    if (!this._config.isVisible) {\n      execute(callback)\n      return\n    }\n\n    this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n    this._emulateAnimation(() => {\n      this.dispose()\n      execute(callback)\n    })\n  }\n\n  // Private\n\n  _getElement() {\n    if (!this._element) {\n      const backdrop = document.createElement('div')\n      backdrop.className = this._config.className\n      if (this._config.isAnimated) {\n        backdrop.classList.add(CLASS_NAME_FADE)\n      }\n\n      this._element = backdrop\n    }\n\n    return this._element\n  }\n\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...(typeof config === 'object' ? config : {})\n    }\n\n    // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n    config.rootElement = getElement(config.rootElement)\n    typeCheckConfig(NAME, config, DefaultType)\n    return config\n  }\n\n  _append() {\n    if (this._isAppended) {\n      return\n    }\n\n    this._config.rootElement.append(this._getElement())\n\n    EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n      execute(this._config.clickCallback)\n    })\n\n    this._isAppended = true\n  }\n\n  dispose() {\n    if (!this._isAppended) {\n      return\n    }\n\n    EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n    this._element.remove()\n    this._isAppended = false\n  }\n\n  _emulateAnimation(callback) {\n    executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n  }\n}\n\nexport default Backdrop\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport SelectorEngine from '../dom/selector-engine'\nimport { typeCheckConfig } from './index'\n\nconst Default = {\n  trapElement: null, // The element to trap focus inside of\n  autofocus: true\n}\n\nconst DefaultType = {\n  trapElement: 'element',\n  autofocus: 'boolean'\n}\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nclass FocusTrap {\n  constructor(config) {\n    this._config = this._getConfig(config)\n    this._isActive = false\n    this._lastTabNavDirection = null\n  }\n\n  activate() {\n    const { trapElement, autofocus } = this._config\n\n    if (this._isActive) {\n      return\n    }\n\n    if (autofocus) {\n      trapElement.focus()\n    }\n\n    EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n    EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n    EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n    this._isActive = true\n  }\n\n  deactivate() {\n    if (!this._isActive) {\n      return\n    }\n\n    this._isActive = false\n    EventHandler.off(document, EVENT_KEY)\n  }\n\n  // Private\n\n  _handleFocusin(event) {\n    const { target } = event\n    const { trapElement } = this._config\n\n    if (target === document || target === trapElement || trapElement.contains(target)) {\n      return\n    }\n\n    const elements = SelectorEngine.focusableChildren(trapElement)\n\n    if (elements.length === 0) {\n      trapElement.focus()\n    } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n      elements[elements.length - 1].focus()\n    } else {\n      elements[0].focus()\n    }\n  }\n\n  _handleKeydown(event) {\n    if (event.key !== TAB_KEY) {\n      return\n    }\n\n    this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n  }\n\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...(typeof config === 'object' ? config : {})\n    }\n    typeCheckConfig(NAME, config, DefaultType)\n    return config\n  }\n}\n\nexport default FocusTrap\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n  defineJQueryPlugin,\n  getElementFromSelector,\n  isRTL,\n  isVisible,\n  reflow,\n  typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport ScrollBarHelper from './util/scrollbar'\nimport BaseComponent from './base-component'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n  backdrop: true,\n  keyboard: true,\n  focus: true\n}\n\nconst DefaultType = {\n  backdrop: '(boolean|string)',\n  keyboard: 'boolean',\n  focus: 'boolean'\n}\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal extends BaseComponent {\n  constructor(element, config) {\n    super(element)\n\n    this._config = this._getConfig(config)\n    this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n    this._backdrop = this._initializeBackDrop()\n    this._focustrap = this._initializeFocusTrap()\n    this._isShown = false\n    this._ignoreBackdropClick = false\n    this._isTransitioning = false\n    this._scrollBar = new ScrollBarHelper()\n  }\n\n  // Getters\n\n  static get Default() {\n    return Default\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n\n  toggle(relatedTarget) {\n    return this._isShown ? this.hide() : this.show(relatedTarget)\n  }\n\n  show(relatedTarget) {\n    if (this._isShown || this._isTransitioning) {\n      return\n    }\n\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n      relatedTarget\n    })\n\n    if (showEvent.defaultPrevented) {\n      return\n    }\n\n    this._isShown = true\n\n    if (this._isAnimated()) {\n      this._isTransitioning = true\n    }\n\n    this._scrollBar.hide()\n\n    document.body.classList.add(CLASS_NAME_OPEN)\n\n    this._adjustDialog()\n\n    this._setEscapeEvent()\n    this._setResizeEvent()\n\n    EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n      EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n        if (event.target === this._element) {\n          this._ignoreBackdropClick = true\n        }\n      })\n    })\n\n    this._showBackdrop(() => this._showElement(relatedTarget))\n  }\n\n  hide() {\n    if (!this._isShown || this._isTransitioning) {\n      return\n    }\n\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n    if (hideEvent.defaultPrevented) {\n      return\n    }\n\n    this._isShown = false\n    const isAnimated = this._isAnimated()\n\n    if (isAnimated) {\n      this._isTransitioning = true\n    }\n\n    this._setEscapeEvent()\n    this._setResizeEvent()\n\n    this._focustrap.deactivate()\n\n    this._element.classList.remove(CLASS_NAME_SHOW)\n\n    EventHandler.off(this._element, EVENT_CLICK_DISMISS)\n    EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS)\n\n    this._queueCallback(() => this._hideModal(), this._element, isAnimated)\n  }\n\n  dispose() {\n    [window, this._dialog]\n      .forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY))\n\n    this._backdrop.dispose()\n    this._focustrap.deactivate()\n    super.dispose()\n  }\n\n  handleUpdate() {\n    this._adjustDialog()\n  }\n\n  // Private\n\n  _initializeBackDrop() {\n    return new Backdrop({\n      isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value\n      isAnimated: this._isAnimated()\n    })\n  }\n\n  _initializeFocusTrap() {\n    return new FocusTrap({\n      trapElement: this._element\n    })\n  }\n\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...Manipulator.getDataAttributes(this._element),\n      ...(typeof config === 'object' ? config : {})\n    }\n    typeCheckConfig(NAME, config, DefaultType)\n    return config\n  }\n\n  _showElement(relatedTarget) {\n    const isAnimated = this._isAnimated()\n    const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n\n    if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n      // Don't move modal's DOM position\n      document.body.append(this._element)\n    }\n\n    this._element.style.display = 'block'\n    this._element.removeAttribute('aria-hidden')\n    this._element.setAttribute('aria-modal', true)\n    this._element.setAttribute('role', 'dialog')\n    this._element.scrollTop = 0\n\n    if (modalBody) {\n      modalBody.scrollTop = 0\n    }\n\n    if (isAnimated) {\n      reflow(this._element)\n    }\n\n    this._element.classList.add(CLASS_NAME_SHOW)\n\n    const transitionComplete = () => {\n      if (this._config.focus) {\n        this._focustrap.activate()\n      }\n\n      this._isTransitioning = false\n      EventHandler.trigger(this._element, EVENT_SHOWN, {\n        relatedTarget\n      })\n    }\n\n    this._queueCallback(transitionComplete, this._dialog, isAnimated)\n  }\n\n  _setEscapeEvent() {\n    if (this._isShown) {\n      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n        if (this._config.keyboard && event.key === ESCAPE_KEY) {\n          event.preventDefault()\n          this.hide()\n        } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {\n          this._triggerBackdropTransition()\n        }\n      })\n    } else {\n      EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS)\n    }\n  }\n\n  _setResizeEvent() {\n    if (this._isShown) {\n      EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog())\n    } else {\n      EventHandler.off(window, EVENT_RESIZE)\n    }\n  }\n\n  _hideModal() {\n    this._element.style.display = 'none'\n    this._element.setAttribute('aria-hidden', true)\n    this._element.removeAttribute('aria-modal')\n    this._element.removeAttribute('role')\n    this._isTransitioning = false\n    this._backdrop.hide(() => {\n      document.body.classList.remove(CLASS_NAME_OPEN)\n      this._resetAdjustments()\n      this._scrollBar.reset()\n      EventHandler.trigger(this._element, EVENT_HIDDEN)\n    })\n  }\n\n  _showBackdrop(callback) {\n    EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n      if (this._ignoreBackdropClick) {\n        this._ignoreBackdropClick = false\n        return\n      }\n\n      if (event.target !== event.currentTarget) {\n        return\n      }\n\n      if (this._config.backdrop === true) {\n        this.hide()\n      } else if (this._config.backdrop === 'static') {\n        this._triggerBackdropTransition()\n      }\n    })\n\n    this._backdrop.show(callback)\n  }\n\n  _isAnimated() {\n    return this._element.classList.contains(CLASS_NAME_FADE)\n  }\n\n  _triggerBackdropTransition() {\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n    if (hideEvent.defaultPrevented) {\n      return\n    }\n\n    const { classList, scrollHeight, style } = this._element\n    const isModalOverflowing = scrollHeight > document.documentElement.clientHeight\n\n    // return if the following background transition hasn't yet completed\n    if ((!isModalOverflowing && style.overflowY === 'hidden') || classList.contains(CLASS_NAME_STATIC)) {\n      return\n    }\n\n    if (!isModalOverflowing) {\n      style.overflowY = 'hidden'\n    }\n\n    classList.add(CLASS_NAME_STATIC)\n    this._queueCallback(() => {\n      classList.remove(CLASS_NAME_STATIC)\n      if (!isModalOverflowing) {\n        this._queueCallback(() => {\n          style.overflowY = ''\n        }, this._dialog)\n      }\n    }, this._dialog)\n\n    this._element.focus()\n  }\n\n  // ----------------------------------------------------------------------\n  // the following methods are used to handle overflowing modals\n  // ----------------------------------------------------------------------\n\n  _adjustDialog() {\n    const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n    const scrollbarWidth = this._scrollBar.getWidth()\n    const isBodyOverflowing = scrollbarWidth > 0\n\n    if ((!isBodyOverflowing && isModalOverflowing && !isRTL()) || (isBodyOverflowing && !isModalOverflowing && isRTL())) {\n      this._element.style.paddingLeft = `${scrollbarWidth}px`\n    }\n\n    if ((isBodyOverflowing && !isModalOverflowing && !isRTL()) || (!isBodyOverflowing && isModalOverflowing && isRTL())) {\n      this._element.style.paddingRight = `${scrollbarWidth}px`\n    }\n  }\n\n  _resetAdjustments() {\n    this._element.style.paddingLeft = ''\n    this._element.style.paddingRight = ''\n  }\n\n  // Static\n\n  static jQueryInterface(config, relatedTarget) {\n    return this.each(function () {\n      const data = Modal.getOrCreateInstance(this, config)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config](relatedTarget)\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  const target = getElementFromSelector(this)\n\n  if (['A', 'AREA'].includes(this.tagName)) {\n    event.preventDefault()\n  }\n\n  EventHandler.one(target, EVENT_SHOW, showEvent => {\n    if (showEvent.defaultPrevented) {\n      // only register focus restorer if modal will actually get shown\n      return\n    }\n\n    EventHandler.one(target, EVENT_HIDDEN, () => {\n      if (isVisible(this)) {\n        this.focus()\n      }\n    })\n  })\n\n  // avoid conflict when clicking moddal toggler while another one is open\n  const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n  if (allReadyOpen) {\n    Modal.getInstance(allReadyOpen).hide()\n  }\n\n  const data = Modal.getOrCreateInstance(target)\n\n  data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Modal to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n  defineJQueryPlugin,\n  getElementFromSelector,\n  isDisabled,\n  isVisible,\n  typeCheckConfig\n} from './util/index'\nimport ScrollBarHelper from './util/scrollbar'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport SelectorEngine from './dom/selector-engine'\nimport Manipulator from './dom/manipulator'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n  backdrop: true,\n  keyboard: true,\n  scroll: false\n}\n\nconst DefaultType = {\n  backdrop: 'boolean',\n  keyboard: 'boolean',\n  scroll: 'boolean'\n}\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Offcanvas extends BaseComponent {\n  constructor(element, config) {\n    super(element)\n\n    this._config = this._getConfig(config)\n    this._isShown = false\n    this._backdrop = this._initializeBackDrop()\n    this._focustrap = this._initializeFocusTrap()\n    this._addEventListeners()\n  }\n\n  // Getters\n\n  static get NAME() {\n    return NAME\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  // Public\n\n  toggle(relatedTarget) {\n    return this._isShown ? this.hide() : this.show(relatedTarget)\n  }\n\n  show(relatedTarget) {\n    if (this._isShown) {\n      return\n    }\n\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n    if (showEvent.defaultPrevented) {\n      return\n    }\n\n    this._isShown = true\n    this._element.style.visibility = 'visible'\n\n    this._backdrop.show()\n\n    if (!this._config.scroll) {\n      new ScrollBarHelper().hide()\n    }\n\n    this._element.removeAttribute('aria-hidden')\n    this._element.setAttribute('aria-modal', true)\n    this._element.setAttribute('role', 'dialog')\n    this._element.classList.add(CLASS_NAME_SHOW)\n\n    const completeCallBack = () => {\n      if (!this._config.scroll) {\n        this._focustrap.activate()\n      }\n\n      EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n    }\n\n    this._queueCallback(completeCallBack, this._element, true)\n  }\n\n  hide() {\n    if (!this._isShown) {\n      return\n    }\n\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n    if (hideEvent.defaultPrevented) {\n      return\n    }\n\n    this._focustrap.deactivate()\n    this._element.blur()\n    this._isShown = false\n    this._element.classList.remove(CLASS_NAME_SHOW)\n    this._backdrop.hide()\n\n    const completeCallback = () => {\n      this._element.setAttribute('aria-hidden', true)\n      this._element.removeAttribute('aria-modal')\n      this._element.removeAttribute('role')\n      this._element.style.visibility = 'hidden'\n\n      if (!this._config.scroll) {\n        new ScrollBarHelper().reset()\n      }\n\n      EventHandler.trigger(this._element, EVENT_HIDDEN)\n    }\n\n    this._queueCallback(completeCallback, this._element, true)\n  }\n\n  dispose() {\n    this._backdrop.dispose()\n    this._focustrap.deactivate()\n    super.dispose()\n  }\n\n  // Private\n\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...Manipulator.getDataAttributes(this._element),\n      ...(typeof config === 'object' ? config : {})\n    }\n    typeCheckConfig(NAME, config, DefaultType)\n    return config\n  }\n\n  _initializeBackDrop() {\n    return new Backdrop({\n      className: CLASS_NAME_BACKDROP,\n      isVisible: this._config.backdrop,\n      isAnimated: true,\n      rootElement: this._element.parentNode,\n      clickCallback: () => this.hide()\n    })\n  }\n\n  _initializeFocusTrap() {\n    return new FocusTrap({\n      trapElement: this._element\n    })\n  }\n\n  _addEventListeners() {\n    EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n      if (this._config.keyboard && event.key === ESCAPE_KEY) {\n        this.hide()\n      }\n    })\n  }\n\n  // Static\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Offcanvas.getOrCreateInstance(this, config)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config](this)\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  const target = getElementFromSelector(this)\n\n  if (['A', 'AREA'].includes(this.tagName)) {\n    event.preventDefault()\n  }\n\n  if (isDisabled(this)) {\n    return\n  }\n\n  EventHandler.one(target, EVENT_HIDDEN, () => {\n    // focus on trigger when it is closed\n    if (isVisible(this)) {\n      this.focus()\n    }\n  })\n\n  // avoid conflict when clicking a toggler of an offcanvas, while another is open\n  const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n  if (allReadyOpen && allReadyOpen !== target) {\n    Offcanvas.getInstance(allReadyOpen).hide()\n  }\n\n  const data = Offcanvas.getOrCreateInstance(target)\n  data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () =>\n  SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())\n)\n\nenableDismissTrigger(Offcanvas)\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttributes = new Set([\n  'background',\n  'cite',\n  'href',\n  'itemtype',\n  'longdesc',\n  'poster',\n  'src',\n  'xlink:href'\n])\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n  const attributeName = attribute.nodeName.toLowerCase()\n\n  if (allowedAttributeList.includes(attributeName)) {\n    if (uriAttributes.has(attributeName)) {\n      return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue))\n    }\n\n    return true\n  }\n\n  const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n\n  // Check if a regular expression validates the attribute.\n  for (let i = 0, len = regExp.length; i < len; i++) {\n    if (regExp[i].test(attributeName)) {\n      return true\n    }\n  }\n\n  return false\n}\n\nexport const DefaultAllowlist = {\n  // Global attributes allowed on any supplied element below.\n  '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n  a: ['target', 'href', 'title', 'rel'],\n  area: [],\n  b: [],\n  br: [],\n  col: [],\n  code: [],\n  div: [],\n  em: [],\n  hr: [],\n  h1: [],\n  h2: [],\n  h3: [],\n  h4: [],\n  h5: [],\n  h6: [],\n  i: [],\n  img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n  li: [],\n  ol: [],\n  p: [],\n  pre: [],\n  s: [],\n  small: [],\n  span: [],\n  sub: [],\n  sup: [],\n  strong: [],\n  u: [],\n  ul: []\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n  if (!unsafeHtml.length) {\n    return unsafeHtml\n  }\n\n  if (sanitizeFn && typeof sanitizeFn === 'function') {\n    return sanitizeFn(unsafeHtml)\n  }\n\n  const domParser = new window.DOMParser()\n  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n  const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n  for (let i = 0, len = elements.length; i < len; i++) {\n    const element = elements[i]\n    const elementName = element.nodeName.toLowerCase()\n\n    if (!Object.keys(allowList).includes(elementName)) {\n      element.remove()\n\n      continue\n    }\n\n    const attributeList = [].concat(...element.attributes)\n    const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n    attributeList.forEach(attribute => {\n      if (!allowedAttribute(attribute, allowedAttributes)) {\n        element.removeAttribute(attribute.nodeName)\n      }\n    })\n  }\n\n  return createdDocument.body.innerHTML\n}\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n  defineJQueryPlugin,\n  findShadowRoot,\n  getElement,\n  getUID,\n  isElement,\n  isRTL,\n  noop,\n  typeCheckConfig\n} from './util/index'\nimport { DefaultAllowlist, sanitizeHtml } from './util/sanitizer'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst DefaultType = {\n  animation: 'boolean',\n  template: 'string',\n  title: '(string|element|function)',\n  trigger: 'string',\n  delay: '(number|object)',\n  html: 'boolean',\n  selector: '(string|boolean)',\n  placement: '(string|function)',\n  offset: '(array|string|function)',\n  container: '(string|element|boolean)',\n  fallbackPlacements: 'array',\n  boundary: '(string|element)',\n  customClass: '(string|function)',\n  sanitize: 'boolean',\n  sanitizeFn: '(null|function)',\n  allowList: 'object',\n  popperConfig: '(null|object|function)'\n}\n\nconst AttachmentMap = {\n  AUTO: 'auto',\n  TOP: 'top',\n  RIGHT: isRTL() ? 'left' : 'right',\n  BOTTOM: 'bottom',\n  LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n  animation: true,\n  template: '<div class=\"tooltip\" role=\"tooltip\">' +\n              '<div class=\"tooltip-arrow\"></div>' +\n              '<div class=\"tooltip-inner\"></div>' +\n            '</div>',\n  trigger: 'hover focus',\n  title: '',\n  delay: 0,\n  html: false,\n  selector: false,\n  placement: 'top',\n  offset: [0, 0],\n  container: false,\n  fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n  boundary: 'clippingParents',\n  customClass: '',\n  sanitize: true,\n  sanitizeFn: null,\n  allowList: DefaultAllowlist,\n  popperConfig: null\n}\n\nconst Event = {\n  HIDE: `hide${EVENT_KEY}`,\n  HIDDEN: `hidden${EVENT_KEY}`,\n  SHOW: `show${EVENT_KEY}`,\n  SHOWN: `shown${EVENT_KEY}`,\n  INSERTED: `inserted${EVENT_KEY}`,\n  CLICK: `click${EVENT_KEY}`,\n  FOCUSIN: `focusin${EVENT_KEY}`,\n  FOCUSOUT: `focusout${EVENT_KEY}`,\n  MOUSEENTER: `mouseenter${EVENT_KEY}`,\n  MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip extends BaseComponent {\n  constructor(element, config) {\n    if (typeof Popper === 'undefined') {\n      throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n    }\n\n    super(element)\n\n    // private\n    this._isEnabled = true\n    this._timeout = 0\n    this._hoverState = ''\n    this._activeTrigger = {}\n    this._popper = null\n\n    // Protected\n    this._config = this._getConfig(config)\n    this.tip = null\n\n    this._setListeners()\n  }\n\n  // Getters\n\n  static get Default() {\n    return Default\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  static get Event() {\n    return Event\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  // Public\n\n  enable() {\n    this._isEnabled = true\n  }\n\n  disable() {\n    this._isEnabled = false\n  }\n\n  toggleEnabled() {\n    this._isEnabled = !this._isEnabled\n  }\n\n  toggle(event) {\n    if (!this._isEnabled) {\n      return\n    }\n\n    if (event) {\n      const context = this._initializeOnDelegatedTarget(event)\n\n      context._activeTrigger.click = !context._activeTrigger.click\n\n      if (context._isWithActiveTrigger()) {\n        context._enter(null, context)\n      } else {\n        context._leave(null, context)\n      }\n    } else {\n      if (this.getTipElement().classList.contains(CLASS_NAME_SHOW)) {\n        this._leave(null, this)\n        return\n      }\n\n      this._enter(null, this)\n    }\n  }\n\n  dispose() {\n    clearTimeout(this._timeout)\n\n    EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n    if (this.tip) {\n      this.tip.remove()\n    }\n\n    this._disposePopper()\n    super.dispose()\n  }\n\n  show() {\n    if (this._element.style.display === 'none') {\n      throw new Error('Please use show on visible elements')\n    }\n\n    if (!(this.isWithContent() && this._isEnabled)) {\n      return\n    }\n\n    const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW)\n    const shadowRoot = findShadowRoot(this._element)\n    const isInTheDom = shadowRoot === null ?\n      this._element.ownerDocument.documentElement.contains(this._element) :\n      shadowRoot.contains(this._element)\n\n    if (showEvent.defaultPrevented || !isInTheDom) {\n      return\n    }\n\n    // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`\n    // This will be removed later in favor of a `setContent` method\n    if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {\n      this._disposePopper()\n      this.tip.remove()\n      this.tip = null\n    }\n\n    const tip = this.getTipElement()\n    const tipId = getUID(this.constructor.NAME)\n\n    tip.setAttribute('id', tipId)\n    this._element.setAttribute('aria-describedby', tipId)\n\n    if (this._config.animation) {\n      tip.classList.add(CLASS_NAME_FADE)\n    }\n\n    const placement = typeof this._config.placement === 'function' ?\n      this._config.placement.call(this, tip, this._element) :\n      this._config.placement\n\n    const attachment = this._getAttachment(placement)\n    this._addAttachmentClass(attachment)\n\n    const { container } = this._config\n    Data.set(tip, this.constructor.DATA_KEY, this)\n\n    if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n      container.append(tip)\n      EventHandler.trigger(this._element, this.constructor.Event.INSERTED)\n    }\n\n    if (this._popper) {\n      this._popper.update()\n    } else {\n      this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n    }\n\n    tip.classList.add(CLASS_NAME_SHOW)\n\n    const customClass = this._resolvePossibleFunction(this._config.customClass)\n    if (customClass) {\n      tip.classList.add(...customClass.split(' '))\n    }\n\n    // If this is a touch-enabled device we add extra\n    // empty mouseover listeners to the body's immediate children;\n    // only needed because of broken event delegation on iOS\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n    if ('ontouchstart' in document.documentElement) {\n      [].concat(...document.body.children).forEach(element => {\n        EventHandler.on(element, 'mouseover', noop)\n      })\n    }\n\n    const complete = () => {\n      const prevHoverState = this._hoverState\n\n      this._hoverState = null\n      EventHandler.trigger(this._element, this.constructor.Event.SHOWN)\n\n      if (prevHoverState === HOVER_STATE_OUT) {\n        this._leave(null, this)\n      }\n    }\n\n    const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n    this._queueCallback(complete, this.tip, isAnimated)\n  }\n\n  hide() {\n    if (!this._popper) {\n      return\n    }\n\n    const tip = this.getTipElement()\n    const complete = () => {\n      if (this._isWithActiveTrigger()) {\n        return\n      }\n\n      if (this._hoverState !== HOVER_STATE_SHOW) {\n        tip.remove()\n      }\n\n      this._cleanTipClass()\n      this._element.removeAttribute('aria-describedby')\n      EventHandler.trigger(this._element, this.constructor.Event.HIDDEN)\n\n      this._disposePopper()\n    }\n\n    const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE)\n    if (hideEvent.defaultPrevented) {\n      return\n    }\n\n    tip.classList.remove(CLASS_NAME_SHOW)\n\n    // If this is a touch-enabled device we remove the extra\n    // empty mouseover listeners we added for iOS support\n    if ('ontouchstart' in document.documentElement) {\n      [].concat(...document.body.children)\n        .forEach(element => EventHandler.off(element, 'mouseover', noop))\n    }\n\n    this._activeTrigger[TRIGGER_CLICK] = false\n    this._activeTrigger[TRIGGER_FOCUS] = false\n    this._activeTrigger[TRIGGER_HOVER] = false\n\n    const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n    this._queueCallback(complete, this.tip, isAnimated)\n    this._hoverState = ''\n  }\n\n  update() {\n    if (this._popper !== null) {\n      this._popper.update()\n    }\n  }\n\n  // Protected\n\n  isWithContent() {\n    return Boolean(this.getTitle())\n  }\n\n  getTipElement() {\n    if (this.tip) {\n      return this.tip\n    }\n\n    const element = document.createElement('div')\n    element.innerHTML = this._config.template\n\n    const tip = element.children[0]\n    this.setContent(tip)\n    tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n\n    this.tip = tip\n    return this.tip\n  }\n\n  setContent(tip) {\n    this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER)\n  }\n\n  _sanitizeAndSetContent(template, content, selector) {\n    const templateElement = SelectorEngine.findOne(selector, template)\n\n    if (!content && templateElement) {\n      templateElement.remove()\n      return\n    }\n\n    // we use append for html objects to maintain js events\n    this.setElementContent(templateElement, content)\n  }\n\n  setElementContent(element, content) {\n    if (element === null) {\n      return\n    }\n\n    if (isElement(content)) {\n      content = getElement(content)\n\n      // content is a DOM node or a jQuery\n      if (this._config.html) {\n        if (content.parentNode !== element) {\n          element.innerHTML = ''\n          element.append(content)\n        }\n      } else {\n        element.textContent = content.textContent\n      }\n\n      return\n    }\n\n    if (this._config.html) {\n      if (this._config.sanitize) {\n        content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn)\n      }\n\n      element.innerHTML = content\n    } else {\n      element.textContent = content\n    }\n  }\n\n  getTitle() {\n    const title = this._element.getAttribute('data-bs-original-title') || this._config.title\n\n    return this._resolvePossibleFunction(title)\n  }\n\n  updateAttachment(attachment) {\n    if (attachment === 'right') {\n      return 'end'\n    }\n\n    if (attachment === 'left') {\n      return 'start'\n    }\n\n    return attachment\n  }\n\n  // Private\n\n  _initializeOnDelegatedTarget(event, context) {\n    return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n  }\n\n  _getOffset() {\n    const { offset } = this._config\n\n    if (typeof offset === 'string') {\n      return offset.split(',').map(val => Number.parseInt(val, 10))\n    }\n\n    if (typeof offset === 'function') {\n      return popperData => offset(popperData, this._element)\n    }\n\n    return offset\n  }\n\n  _resolvePossibleFunction(content) {\n    return typeof content === 'function' ? content.call(this._element) : content\n  }\n\n  _getPopperConfig(attachment) {\n    const defaultBsPopperConfig = {\n      placement: attachment,\n      modifiers: [\n        {\n          name: 'flip',\n          options: {\n            fallbackPlacements: this._config.fallbackPlacements\n          }\n        },\n        {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        },\n        {\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        },\n        {\n          name: 'arrow',\n          options: {\n            element: `.${this.constructor.NAME}-arrow`\n          }\n        },\n        {\n          name: 'onChange',\n          enabled: true,\n          phase: 'afterWrite',\n          fn: data => this._handlePopperPlacementChange(data)\n        }\n      ],\n      onFirstUpdate: data => {\n        if (data.options.placement !== data.placement) {\n          this._handlePopperPlacementChange(data)\n        }\n      }\n    }\n\n    return {\n      ...defaultBsPopperConfig,\n      ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n    }\n  }\n\n  _addAttachmentClass(attachment) {\n    this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`)\n  }\n\n  _getAttachment(placement) {\n    return AttachmentMap[placement.toUpperCase()]\n  }\n\n  _setListeners() {\n    const triggers = this._config.trigger.split(' ')\n\n    triggers.forEach(trigger => {\n      if (trigger === 'click') {\n        EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event))\n      } else if (trigger !== TRIGGER_MANUAL) {\n        const eventIn = trigger === TRIGGER_HOVER ?\n          this.constructor.Event.MOUSEENTER :\n          this.constructor.Event.FOCUSIN\n        const eventOut = trigger === TRIGGER_HOVER ?\n          this.constructor.Event.MOUSELEAVE :\n          this.constructor.Event.FOCUSOUT\n\n        EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event))\n        EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event))\n      }\n    })\n\n    this._hideModalHandler = () => {\n      if (this._element) {\n        this.hide()\n      }\n    }\n\n    EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n    if (this._config.selector) {\n      this._config = {\n        ...this._config,\n        trigger: 'manual',\n        selector: ''\n      }\n    } else {\n      this._fixTitle()\n    }\n  }\n\n  _fixTitle() {\n    const title = this._element.getAttribute('title')\n    const originalTitleType = typeof this._element.getAttribute('data-bs-original-title')\n\n    if (title || originalTitleType !== 'string') {\n      this._element.setAttribute('data-bs-original-title', title || '')\n      if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n        this._element.setAttribute('aria-label', title)\n      }\n\n      this._element.setAttribute('title', '')\n    }\n  }\n\n  _enter(event, context) {\n    context = this._initializeOnDelegatedTarget(event, context)\n\n    if (event) {\n      context._activeTrigger[\n        event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER\n      ] = true\n    }\n\n    if (context.getTipElement().classList.contains(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {\n      context._hoverState = HOVER_STATE_SHOW\n      return\n    }\n\n    clearTimeout(context._timeout)\n\n    context._hoverState = HOVER_STATE_SHOW\n\n    if (!context._config.delay || !context._config.delay.show) {\n      context.show()\n      return\n    }\n\n    context._timeout = setTimeout(() => {\n      if (context._hoverState === HOVER_STATE_SHOW) {\n        context.show()\n      }\n    }, context._config.delay.show)\n  }\n\n  _leave(event, context) {\n    context = this._initializeOnDelegatedTarget(event, context)\n\n    if (event) {\n      context._activeTrigger[\n        event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER\n      ] = context._element.contains(event.relatedTarget)\n    }\n\n    if (context._isWithActiveTrigger()) {\n      return\n    }\n\n    clearTimeout(context._timeout)\n\n    context._hoverState = HOVER_STATE_OUT\n\n    if (!context._config.delay || !context._config.delay.hide) {\n      context.hide()\n      return\n    }\n\n    context._timeout = setTimeout(() => {\n      if (context._hoverState === HOVER_STATE_OUT) {\n        context.hide()\n      }\n    }, context._config.delay.hide)\n  }\n\n  _isWithActiveTrigger() {\n    for (const trigger in this._activeTrigger) {\n      if (this._activeTrigger[trigger]) {\n        return true\n      }\n    }\n\n    return false\n  }\n\n  _getConfig(config) {\n    const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n    Object.keys(dataAttributes).forEach(dataAttr => {\n      if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n        delete dataAttributes[dataAttr]\n      }\n    })\n\n    config = {\n      ...this.constructor.Default,\n      ...dataAttributes,\n      ...(typeof config === 'object' && config ? config : {})\n    }\n\n    config.container = config.container === false ? document.body : getElement(config.container)\n\n    if (typeof config.delay === 'number') {\n      config.delay = {\n        show: config.delay,\n        hide: config.delay\n      }\n    }\n\n    if (typeof config.title === 'number') {\n      config.title = config.title.toString()\n    }\n\n    if (typeof config.content === 'number') {\n      config.content = config.content.toString()\n    }\n\n    typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n    if (config.sanitize) {\n      config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn)\n    }\n\n    return config\n  }\n\n  _getDelegateConfig() {\n    const config = {}\n\n    for (const key in this._config) {\n      if (this.constructor.Default[key] !== this._config[key]) {\n        config[key] = this._config[key]\n      }\n    }\n\n    // In the future can be replaced with:\n    // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n    // `Object.fromEntries(keysWithDifferentValues)`\n    return config\n  }\n\n  _cleanTipClass() {\n    const tip = this.getTipElement()\n    const basicClassPrefixRegex = new RegExp(`(^|\\\\s)${this._getBasicClassPrefix()}\\\\S+`, 'g')\n    const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex)\n    if (tabClass !== null && tabClass.length > 0) {\n      tabClass.map(token => token.trim())\n        .forEach(tClass => tip.classList.remove(tClass))\n    }\n  }\n\n  _getBasicClassPrefix() {\n    return CLASS_PREFIX\n  }\n\n  _handlePopperPlacementChange(popperData) {\n    const { state } = popperData\n\n    if (!state) {\n      return\n    }\n\n    this.tip = state.elements.popper\n    this._cleanTipClass()\n    this._addAttachmentClass(this._getAttachment(state.placement))\n  }\n\n  _disposePopper() {\n    if (this._popper) {\n      this._popper.destroy()\n      this._popper = null\n    }\n  }\n\n  // Static\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Tooltip.getOrCreateInstance(this, config)\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tooltip to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-popover'\n\nconst Default = {\n  ...Tooltip.Default,\n  placement: 'right',\n  offset: [0, 8],\n  trigger: 'click',\n  content: '',\n  template: '<div class=\"popover\" role=\"tooltip\">' +\n              '<div class=\"popover-arrow\"></div>' +\n              '<h3 class=\"popover-header\"></h3>' +\n              '<div class=\"popover-body\"></div>' +\n            '</div>'\n}\n\nconst DefaultType = {\n  ...Tooltip.DefaultType,\n  content: '(string|element|function)'\n}\n\nconst Event = {\n  HIDE: `hide${EVENT_KEY}`,\n  HIDDEN: `hidden${EVENT_KEY}`,\n  SHOW: `show${EVENT_KEY}`,\n  SHOWN: `shown${EVENT_KEY}`,\n  INSERTED: `inserted${EVENT_KEY}`,\n  CLICK: `click${EVENT_KEY}`,\n  FOCUSIN: `focusin${EVENT_KEY}`,\n  FOCUSOUT: `focusout${EVENT_KEY}`,\n  MOUSEENTER: `mouseenter${EVENT_KEY}`,\n  MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n  // Getters\n\n  static get Default() {\n    return Default\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  static get Event() {\n    return Event\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  // Overrides\n\n  isWithContent() {\n    return this.getTitle() || this._getContent()\n  }\n\n  setContent(tip) {\n    this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE)\n    this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT)\n  }\n\n  // Private\n\n  _getContent() {\n    return this._resolvePossibleFunction(this._config.content)\n  }\n\n  _getBasicClassPrefix() {\n    return CLASS_PREFIX\n  }\n\n  // Static\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Popover.getOrCreateInstance(this, config)\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Popover to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n  defineJQueryPlugin,\n  getElement,\n  getSelectorFromElement,\n  typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n  offset: 10,\n  method: 'auto',\n  target: ''\n}\n\nconst DefaultType = {\n  offset: 'number',\n  method: 'string',\n  target: '(string|element)'\n}\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy extends BaseComponent {\n  constructor(element, config) {\n    super(element)\n    this._scrollElement = this._element.tagName === 'BODY' ? window : this._element\n    this._config = this._getConfig(config)\n    this._offsets = []\n    this._targets = []\n    this._activeTarget = null\n    this._scrollHeight = 0\n\n    EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())\n\n    this.refresh()\n    this._process()\n  }\n\n  // Getters\n\n  static get Default() {\n    return Default\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n\n  refresh() {\n    const autoMethod = this._scrollElement === this._scrollElement.window ?\n      METHOD_OFFSET :\n      METHOD_POSITION\n\n    const offsetMethod = this._config.method === 'auto' ?\n      autoMethod :\n      this._config.method\n\n    const offsetBase = offsetMethod === METHOD_POSITION ?\n      this._getScrollTop() :\n      0\n\n    this._offsets = []\n    this._targets = []\n    this._scrollHeight = this._getScrollHeight()\n\n    const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n\n    targets.map(element => {\n      const targetSelector = getSelectorFromElement(element)\n      const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null\n\n      if (target) {\n        const targetBCR = target.getBoundingClientRect()\n        if (targetBCR.width || targetBCR.height) {\n          return [\n            Manipulator[offsetMethod](target).top + offsetBase,\n            targetSelector\n          ]\n        }\n      }\n\n      return null\n    })\n      .filter(item => item)\n      .sort((a, b) => a[0] - b[0])\n      .forEach(item => {\n        this._offsets.push(item[0])\n        this._targets.push(item[1])\n      })\n  }\n\n  dispose() {\n    EventHandler.off(this._scrollElement, EVENT_KEY)\n    super.dispose()\n  }\n\n  // Private\n\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...Manipulator.getDataAttributes(this._element),\n      ...(typeof config === 'object' && config ? config : {})\n    }\n\n    config.target = getElement(config.target) || document.documentElement\n\n    typeCheckConfig(NAME, config, DefaultType)\n\n    return config\n  }\n\n  _getScrollTop() {\n    return this._scrollElement === window ?\n      this._scrollElement.pageYOffset :\n      this._scrollElement.scrollTop\n  }\n\n  _getScrollHeight() {\n    return this._scrollElement.scrollHeight || Math.max(\n      document.body.scrollHeight,\n      document.documentElement.scrollHeight\n    )\n  }\n\n  _getOffsetHeight() {\n    return this._scrollElement === window ?\n      window.innerHeight :\n      this._scrollElement.getBoundingClientRect().height\n  }\n\n  _process() {\n    const scrollTop = this._getScrollTop() + this._config.offset\n    const scrollHeight = this._getScrollHeight()\n    const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n    if (this._scrollHeight !== scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      const target = this._targets[this._targets.length - 1]\n\n      if (this._activeTarget !== target) {\n        this._activate(target)\n      }\n\n      return\n    }\n\n    if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n      this._activeTarget = null\n      this._clear()\n      return\n    }\n\n    for (let i = this._offsets.length; i--;) {\n      const isActiveTarget = this._activeTarget !== this._targets[i] &&\n          scrollTop >= this._offsets[i] &&\n          (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1])\n\n      if (isActiveTarget) {\n        this._activate(this._targets[i])\n      }\n    }\n  }\n\n  _activate(target) {\n    this._activeTarget = target\n\n    this._clear()\n\n    const queries = SELECTOR_LINK_ITEMS.split(',')\n      .map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n    const link = SelectorEngine.findOne(queries.join(','), this._config.target)\n\n    link.classList.add(CLASS_NAME_ACTIVE)\n    if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n      SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN))\n        .classList.add(CLASS_NAME_ACTIVE)\n    } else {\n      SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP)\n        .forEach(listGroup => {\n          // Set triggered links parents as active\n          // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n          SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`)\n            .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n\n          // Handle special case when .nav-link is inside .nav-item\n          SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS)\n            .forEach(navItem => {\n              SelectorEngine.children(navItem, SELECTOR_NAV_LINKS)\n                .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n            })\n        })\n    }\n\n    EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {\n      relatedTarget: target\n    })\n  }\n\n  _clear() {\n    SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n      .filter(node => node.classList.contains(CLASS_NAME_ACTIVE))\n      .forEach(node => node.classList.remove(CLASS_NAME_ACTIVE))\n  }\n\n  // Static\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = ScrollSpy.getOrCreateInstance(this, config)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config]()\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n  SelectorEngine.find(SELECTOR_DATA_SPY)\n    .forEach(spy => new ScrollSpy(spy))\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .ScrollSpy to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n  defineJQueryPlugin,\n  getElementFromSelector,\n  isDisabled,\n  reflow\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_UL = ':scope > li > .active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tab extends BaseComponent {\n  // Getters\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n\n  show() {\n    if ((this._element.parentNode &&\n      this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\n      this._element.classList.contains(CLASS_NAME_ACTIVE))) {\n      return\n    }\n\n    let previous\n    const target = getElementFromSelector(this._element)\n    const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP)\n\n    if (listElement) {\n      const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE\n      previous = SelectorEngine.find(itemSelector, listElement)\n      previous = previous[previous.length - 1]\n    }\n\n    const hideEvent = previous ?\n      EventHandler.trigger(previous, EVENT_HIDE, {\n        relatedTarget: this._element\n      }) :\n      null\n\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n      relatedTarget: previous\n    })\n\n    if (showEvent.defaultPrevented || (hideEvent !== null && hideEvent.defaultPrevented)) {\n      return\n    }\n\n    this._activate(this._element, listElement)\n\n    const complete = () => {\n      EventHandler.trigger(previous, EVENT_HIDDEN, {\n        relatedTarget: this._element\n      })\n      EventHandler.trigger(this._element, EVENT_SHOWN, {\n        relatedTarget: previous\n      })\n    }\n\n    if (target) {\n      this._activate(target, target.parentNode, complete)\n    } else {\n      complete()\n    }\n  }\n\n  // Private\n\n  _activate(element, container, callback) {\n    const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ?\n      SelectorEngine.find(SELECTOR_ACTIVE_UL, container) :\n      SelectorEngine.children(container, SELECTOR_ACTIVE)\n\n    const active = activeElements[0]\n    const isTransitioning = callback && (active && active.classList.contains(CLASS_NAME_FADE))\n\n    const complete = () => this._transitionComplete(element, active, callback)\n\n    if (active && isTransitioning) {\n      active.classList.remove(CLASS_NAME_SHOW)\n      this._queueCallback(complete, element, true)\n    } else {\n      complete()\n    }\n  }\n\n  _transitionComplete(element, active, callback) {\n    if (active) {\n      active.classList.remove(CLASS_NAME_ACTIVE)\n\n      const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode)\n\n      if (dropdownChild) {\n        dropdownChild.classList.remove(CLASS_NAME_ACTIVE)\n      }\n\n      if (active.getAttribute('role') === 'tab') {\n        active.setAttribute('aria-selected', false)\n      }\n    }\n\n    element.classList.add(CLASS_NAME_ACTIVE)\n    if (element.getAttribute('role') === 'tab') {\n      element.setAttribute('aria-selected', true)\n    }\n\n    reflow(element)\n\n    if (element.classList.contains(CLASS_NAME_FADE)) {\n      element.classList.add(CLASS_NAME_SHOW)\n    }\n\n    let parent = element.parentNode\n    if (parent && parent.nodeName === 'LI') {\n      parent = parent.parentNode\n    }\n\n    if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {\n      const dropdownElement = element.closest(SELECTOR_DROPDOWN)\n\n      if (dropdownElement) {\n        SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement)\n          .forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE))\n      }\n\n      element.setAttribute('aria-expanded', true)\n    }\n\n    if (callback) {\n      callback()\n    }\n  }\n\n  // Static\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Tab.getOrCreateInstance(this)\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  if (['A', 'AREA'].includes(this.tagName)) {\n    event.preventDefault()\n  }\n\n  if (isDisabled(this)) {\n    return\n  }\n\n  const data = Tab.getOrCreateInstance(this)\n  data.show()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tab to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n  defineJQueryPlugin,\n  reflow,\n  typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n  animation: 'boolean',\n  autohide: 'boolean',\n  delay: 'number'\n}\n\nconst Default = {\n  animation: true,\n  autohide: true,\n  delay: 5000\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Toast extends BaseComponent {\n  constructor(element, config) {\n    super(element)\n\n    this._config = this._getConfig(config)\n    this._timeout = null\n    this._hasMouseInteraction = false\n    this._hasKeyboardInteraction = false\n    this._setListeners()\n  }\n\n  // Getters\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n\n  show() {\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n    if (showEvent.defaultPrevented) {\n      return\n    }\n\n    this._clearTimeout()\n\n    if (this._config.animation) {\n      this._element.classList.add(CLASS_NAME_FADE)\n    }\n\n    const complete = () => {\n      this._element.classList.remove(CLASS_NAME_SHOWING)\n      EventHandler.trigger(this._element, EVENT_SHOWN)\n\n      this._maybeScheduleHide()\n    }\n\n    this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n    reflow(this._element)\n    this._element.classList.add(CLASS_NAME_SHOW)\n    this._element.classList.add(CLASS_NAME_SHOWING)\n\n    this._queueCallback(complete, this._element, this._config.animation)\n  }\n\n  hide() {\n    if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n      return\n    }\n\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n    if (hideEvent.defaultPrevented) {\n      return\n    }\n\n    const complete = () => {\n      this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n      this._element.classList.remove(CLASS_NAME_SHOWING)\n      this._element.classList.remove(CLASS_NAME_SHOW)\n      EventHandler.trigger(this._element, EVENT_HIDDEN)\n    }\n\n    this._element.classList.add(CLASS_NAME_SHOWING)\n    this._queueCallback(complete, this._element, this._config.animation)\n  }\n\n  dispose() {\n    this._clearTimeout()\n\n    if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n      this._element.classList.remove(CLASS_NAME_SHOW)\n    }\n\n    super.dispose()\n  }\n\n  // Private\n\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...Manipulator.getDataAttributes(this._element),\n      ...(typeof config === 'object' && config ? config : {})\n    }\n\n    typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n    return config\n  }\n\n  _maybeScheduleHide() {\n    if (!this._config.autohide) {\n      return\n    }\n\n    if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n      return\n    }\n\n    this._timeout = setTimeout(() => {\n      this.hide()\n    }, this._config.delay)\n  }\n\n  _onInteraction(event, isInteracting) {\n    switch (event.type) {\n      case 'mouseover':\n      case 'mouseout':\n        this._hasMouseInteraction = isInteracting\n        break\n      case 'focusin':\n      case 'focusout':\n        this._hasKeyboardInteraction = isInteracting\n        break\n      default:\n        break\n    }\n\n    if (isInteracting) {\n      this._clearTimeout()\n      return\n    }\n\n    const nextElement = event.relatedTarget\n    if (this._element === nextElement || this._element.contains(nextElement)) {\n      return\n    }\n\n    this._maybeScheduleHide()\n  }\n\n  _setListeners() {\n    EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n    EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n    EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n    EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n  }\n\n  _clearTimeout() {\n    clearTimeout(this._timeout)\n    this._timeout = null\n  }\n\n  // Static\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Toast.getOrCreateInstance(this, config)\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config](this)\n      }\n    })\n  }\n}\n\nenableDismissTrigger(Toast)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Toast to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n", "/*\nStimulus 3.0.1\nCopyright \u00A9 2021 Basecamp, LLC\n */\nclass EventListener {\n    constructor(eventTarget, eventName, eventOptions) {\n        this.eventTarget = eventTarget;\n        this.eventName = eventName;\n        this.eventOptions = eventOptions;\n        this.unorderedBindings = new Set();\n    }\n    connect() {\n        this.eventTarget.addEventListener(this.eventName, this, this.eventOptions);\n    }\n    disconnect() {\n        this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions);\n    }\n    bindingConnected(binding) {\n        this.unorderedBindings.add(binding);\n    }\n    bindingDisconnected(binding) {\n        this.unorderedBindings.delete(binding);\n    }\n    handleEvent(event) {\n        const extendedEvent = extendEvent(event);\n        for (const binding of this.bindings) {\n            if (extendedEvent.immediatePropagationStopped) {\n                break;\n            }\n            else {\n                binding.handleEvent(extendedEvent);\n            }\n        }\n    }\n    get bindings() {\n        return Array.from(this.unorderedBindings).sort((left, right) => {\n            const leftIndex = left.index, rightIndex = right.index;\n            return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;\n        });\n    }\n}\nfunction extendEvent(event) {\n    if (\"immediatePropagationStopped\" in event) {\n        return event;\n    }\n    else {\n        const { stopImmediatePropagation } = event;\n        return Object.assign(event, {\n            immediatePropagationStopped: false,\n            stopImmediatePropagation() {\n                this.immediatePropagationStopped = true;\n                stopImmediatePropagation.call(this);\n            }\n        });\n    }\n}\n\nclass Dispatcher {\n    constructor(application) {\n        this.application = application;\n        this.eventListenerMaps = new Map;\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.eventListeners.forEach(eventListener => eventListener.connect());\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.eventListeners.forEach(eventListener => eventListener.disconnect());\n        }\n    }\n    get eventListeners() {\n        return Array.from(this.eventListenerMaps.values())\n            .reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n    }\n    bindingConnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n    }\n    bindingDisconnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n    }\n    handleError(error, message, detail = {}) {\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    fetchEventListenerForBinding(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        return this.fetchEventListener(eventTarget, eventName, eventOptions);\n    }\n    fetchEventListener(eventTarget, eventName, eventOptions) {\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        let eventListener = eventListenerMap.get(cacheKey);\n        if (!eventListener) {\n            eventListener = this.createEventListener(eventTarget, eventName, eventOptions);\n            eventListenerMap.set(cacheKey, eventListener);\n        }\n        return eventListener;\n    }\n    createEventListener(eventTarget, eventName, eventOptions) {\n        const eventListener = new EventListener(eventTarget, eventName, eventOptions);\n        if (this.started) {\n            eventListener.connect();\n        }\n        return eventListener;\n    }\n    fetchEventListenerMapForEventTarget(eventTarget) {\n        let eventListenerMap = this.eventListenerMaps.get(eventTarget);\n        if (!eventListenerMap) {\n            eventListenerMap = new Map;\n            this.eventListenerMaps.set(eventTarget, eventListenerMap);\n        }\n        return eventListenerMap;\n    }\n    cacheKey(eventName, eventOptions) {\n        const parts = [eventName];\n        Object.keys(eventOptions).sort().forEach(key => {\n            parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n        });\n        return parts.join(\":\");\n    }\n}\n\nconst descriptorPattern = /^((.+?)(@(window|document))?->)?(.+?)(#([^:]+?))(:(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n    const source = descriptorString.trim();\n    const matches = source.match(descriptorPattern) || [];\n    return {\n        eventTarget: parseEventTarget(matches[4]),\n        eventName: matches[2],\n        eventOptions: matches[9] ? parseEventOptions(matches[9]) : {},\n        identifier: matches[5],\n        methodName: matches[7]\n    };\n}\nfunction parseEventTarget(eventTargetName) {\n    if (eventTargetName == \"window\") {\n        return window;\n    }\n    else if (eventTargetName == \"document\") {\n        return document;\n    }\n}\nfunction parseEventOptions(eventOptions) {\n    return eventOptions.split(\":\").reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {});\n}\nfunction stringifyEventTarget(eventTarget) {\n    if (eventTarget == window) {\n        return \"window\";\n    }\n    else if (eventTarget == document) {\n        return \"document\";\n    }\n}\n\nfunction camelize(value) {\n    return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\n}\nfunction capitalize(value) {\n    return value.charAt(0).toUpperCase() + value.slice(1);\n}\nfunction dasherize(value) {\n    return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`);\n}\nfunction tokenize(value) {\n    return value.match(/[^\\s]+/g) || [];\n}\n\nclass Action {\n    constructor(element, index, descriptor) {\n        this.element = element;\n        this.index = index;\n        this.eventTarget = descriptor.eventTarget || element;\n        this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\");\n        this.eventOptions = descriptor.eventOptions || {};\n        this.identifier = descriptor.identifier || error(\"missing identifier\");\n        this.methodName = descriptor.methodName || error(\"missing method name\");\n    }\n    static forToken(token) {\n        return new this(token.element, token.index, parseActionDescriptorString(token.content));\n    }\n    toString() {\n        const eventNameSuffix = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n        return `${this.eventName}${eventNameSuffix}->${this.identifier}#${this.methodName}`;\n    }\n    get params() {\n        if (this.eventTarget instanceof Element) {\n            return this.getParamsFromEventTargetAttributes(this.eventTarget);\n        }\n        else {\n            return {};\n        }\n    }\n    getParamsFromEventTargetAttributes(eventTarget) {\n        const params = {};\n        const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`);\n        const attributes = Array.from(eventTarget.attributes);\n        attributes.forEach(({ name, value }) => {\n            const match = name.match(pattern);\n            const key = match && match[1];\n            if (key) {\n                Object.assign(params, { [camelize(key)]: typecast(value) });\n            }\n        });\n        return params;\n    }\n    get eventTargetName() {\n        return stringifyEventTarget(this.eventTarget);\n    }\n}\nconst defaultEventNames = {\n    \"a\": e => \"click\",\n    \"button\": e => \"click\",\n    \"form\": e => \"submit\",\n    \"details\": e => \"toggle\",\n    \"input\": e => e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\",\n    \"select\": e => \"change\",\n    \"textarea\": e => \"input\"\n};\nfunction getDefaultEventNameForElement(element) {\n    const tagName = element.tagName.toLowerCase();\n    if (tagName in defaultEventNames) {\n        return defaultEventNames[tagName](element);\n    }\n}\nfunction error(message) {\n    throw new Error(message);\n}\nfunction typecast(value) {\n    try {\n        return JSON.parse(value);\n    }\n    catch (o_O) {\n        return value;\n    }\n}\n\nclass Binding {\n    constructor(context, action) {\n        this.context = context;\n        this.action = action;\n    }\n    get index() {\n        return this.action.index;\n    }\n    get eventTarget() {\n        return this.action.eventTarget;\n    }\n    get eventOptions() {\n        return this.action.eventOptions;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    handleEvent(event) {\n        if (this.willBeInvokedByEvent(event)) {\n            this.invokeWithEvent(event);\n        }\n    }\n    get eventName() {\n        return this.action.eventName;\n    }\n    get method() {\n        const method = this.controller[this.methodName];\n        if (typeof method == \"function\") {\n            return method;\n        }\n        throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`);\n    }\n    invokeWithEvent(event) {\n        const { target, currentTarget } = event;\n        try {\n            const { params } = this.action;\n            const actionEvent = Object.assign(event, { params });\n            this.method.call(this.controller, actionEvent);\n            this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName });\n        }\n        catch (error) {\n            const { identifier, controller, element, index } = this;\n            const detail = { identifier, controller, element, index, event };\n            this.context.handleError(error, `invoking action \"${this.action}\"`, detail);\n        }\n    }\n    willBeInvokedByEvent(event) {\n        const eventTarget = event.target;\n        if (this.element === eventTarget) {\n            return true;\n        }\n        else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n            return this.scope.containsElement(eventTarget);\n        }\n        else {\n            return this.scope.containsElement(this.action.element);\n        }\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    get methodName() {\n        return this.action.methodName;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nclass ElementObserver {\n    constructor(element, delegate) {\n        this.mutationObserverInit = { attributes: true, childList: true, subtree: true };\n        this.element = element;\n        this.started = false;\n        this.delegate = delegate;\n        this.elements = new Set;\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.refresh();\n        }\n    }\n    pause(callback) {\n        if (this.started) {\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n        callback();\n        if (!this.started) {\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            const matches = new Set(this.matchElementsInTree());\n            for (const element of Array.from(this.elements)) {\n                if (!matches.has(element)) {\n                    this.removeElement(element);\n                }\n            }\n            for (const element of Array.from(matches)) {\n                this.addElement(element);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        if (mutation.type == \"attributes\") {\n            this.processAttributeChange(mutation.target, mutation.attributeName);\n        }\n        else if (mutation.type == \"childList\") {\n            this.processRemovedNodes(mutation.removedNodes);\n            this.processAddedNodes(mutation.addedNodes);\n        }\n    }\n    processAttributeChange(node, attributeName) {\n        const element = node;\n        if (this.elements.has(element)) {\n            if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n                this.delegate.elementAttributeChanged(element, attributeName);\n            }\n            else {\n                this.removeElement(element);\n            }\n        }\n        else if (this.matchElement(element)) {\n            this.addElement(element);\n        }\n    }\n    processRemovedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element) {\n                this.processTree(element, this.removeElement);\n            }\n        }\n    }\n    processAddedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element && this.elementIsActive(element)) {\n                this.processTree(element, this.addElement);\n            }\n        }\n    }\n    matchElement(element) {\n        return this.delegate.matchElement(element);\n    }\n    matchElementsInTree(tree = this.element) {\n        return this.delegate.matchElementsInTree(tree);\n    }\n    processTree(tree, processor) {\n        for (const element of this.matchElementsInTree(tree)) {\n            processor.call(this, element);\n        }\n    }\n    elementFromNode(node) {\n        if (node.nodeType == Node.ELEMENT_NODE) {\n            return node;\n        }\n    }\n    elementIsActive(element) {\n        if (element.isConnected != this.element.isConnected) {\n            return false;\n        }\n        else {\n            return this.element.contains(element);\n        }\n    }\n    addElement(element) {\n        if (!this.elements.has(element)) {\n            if (this.elementIsActive(element)) {\n                this.elements.add(element);\n                if (this.delegate.elementMatched) {\n                    this.delegate.elementMatched(element);\n                }\n            }\n        }\n    }\n    removeElement(element) {\n        if (this.elements.has(element)) {\n            this.elements.delete(element);\n            if (this.delegate.elementUnmatched) {\n                this.delegate.elementUnmatched(element);\n            }\n        }\n    }\n}\n\nclass AttributeObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeName = attributeName;\n        this.delegate = delegate;\n        this.elementObserver = new ElementObserver(element, this);\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    get selector() {\n        return `[${this.attributeName}]`;\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    matchElement(element) {\n        return element.hasAttribute(this.attributeName);\n    }\n    matchElementsInTree(tree) {\n        const match = this.matchElement(tree) ? [tree] : [];\n        const matches = Array.from(tree.querySelectorAll(this.selector));\n        return match.concat(matches);\n    }\n    elementMatched(element) {\n        if (this.delegate.elementMatchedAttribute) {\n            this.delegate.elementMatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementUnmatched(element) {\n        if (this.delegate.elementUnmatchedAttribute) {\n            this.delegate.elementUnmatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementAttributeChanged(element, attributeName) {\n        if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n            this.delegate.elementAttributeValueChanged(element, attributeName);\n        }\n    }\n}\n\nclass StringMapObserver {\n    constructor(element, delegate) {\n        this.element = element;\n        this.delegate = delegate;\n        this.started = false;\n        this.stringMap = new Map;\n        this.mutationObserver = new MutationObserver(mutations => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true });\n            this.refresh();\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            for (const attributeName of this.knownAttributeNames) {\n                this.refreshAttribute(attributeName, null);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        const attributeName = mutation.attributeName;\n        if (attributeName) {\n            this.refreshAttribute(attributeName, mutation.oldValue);\n        }\n    }\n    refreshAttribute(attributeName, oldValue) {\n        const key = this.delegate.getStringMapKeyForAttribute(attributeName);\n        if (key != null) {\n            if (!this.stringMap.has(attributeName)) {\n                this.stringMapKeyAdded(key, attributeName);\n            }\n            const value = this.element.getAttribute(attributeName);\n            if (this.stringMap.get(attributeName) != value) {\n                this.stringMapValueChanged(value, key, oldValue);\n            }\n            if (value == null) {\n                const oldValue = this.stringMap.get(attributeName);\n                this.stringMap.delete(attributeName);\n                if (oldValue)\n                    this.stringMapKeyRemoved(key, attributeName, oldValue);\n            }\n            else {\n                this.stringMap.set(attributeName, value);\n            }\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        if (this.delegate.stringMapKeyAdded) {\n            this.delegate.stringMapKeyAdded(key, attributeName);\n        }\n    }\n    stringMapValueChanged(value, key, oldValue) {\n        if (this.delegate.stringMapValueChanged) {\n            this.delegate.stringMapValueChanged(value, key, oldValue);\n        }\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        if (this.delegate.stringMapKeyRemoved) {\n            this.delegate.stringMapKeyRemoved(key, attributeName, oldValue);\n        }\n    }\n    get knownAttributeNames() {\n        return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)));\n    }\n    get currentAttributeNames() {\n        return Array.from(this.element.attributes).map(attribute => attribute.name);\n    }\n    get recordedAttributeNames() {\n        return Array.from(this.stringMap.keys());\n    }\n}\n\nfunction add(map, key, value) {\n    fetch(map, key).add(value);\n}\nfunction del(map, key, value) {\n    fetch(map, key).delete(value);\n    prune(map, key);\n}\nfunction fetch(map, key) {\n    let values = map.get(key);\n    if (!values) {\n        values = new Set();\n        map.set(key, values);\n    }\n    return values;\n}\nfunction prune(map, key) {\n    const values = map.get(key);\n    if (values != null && values.size == 0) {\n        map.delete(key);\n    }\n}\n\nclass Multimap {\n    constructor() {\n        this.valuesByKey = new Map();\n    }\n    get keys() {\n        return Array.from(this.valuesByKey.keys());\n    }\n    get values() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((values, set) => values.concat(Array.from(set)), []);\n    }\n    get size() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((size, set) => size + set.size, 0);\n    }\n    add(key, value) {\n        add(this.valuesByKey, key, value);\n    }\n    delete(key, value) {\n        del(this.valuesByKey, key, value);\n    }\n    has(key, value) {\n        const values = this.valuesByKey.get(key);\n        return values != null && values.has(value);\n    }\n    hasKey(key) {\n        return this.valuesByKey.has(key);\n    }\n    hasValue(value) {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.some(set => set.has(value));\n    }\n    getValuesForKey(key) {\n        const values = this.valuesByKey.get(key);\n        return values ? Array.from(values) : [];\n    }\n    getKeysForValue(value) {\n        return Array.from(this.valuesByKey)\n            .filter(([key, values]) => values.has(value))\n            .map(([key, values]) => key);\n    }\n}\n\nclass IndexedMultimap extends Multimap {\n    constructor() {\n        super();\n        this.keysByValue = new Map;\n    }\n    get values() {\n        return Array.from(this.keysByValue.keys());\n    }\n    add(key, value) {\n        super.add(key, value);\n        add(this.keysByValue, value, key);\n    }\n    delete(key, value) {\n        super.delete(key, value);\n        del(this.keysByValue, value, key);\n    }\n    hasValue(value) {\n        return this.keysByValue.has(value);\n    }\n    getKeysForValue(value) {\n        const set = this.keysByValue.get(value);\n        return set ? Array.from(set) : [];\n    }\n}\n\nclass TokenListObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeObserver = new AttributeObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.tokensByElement = new Multimap;\n    }\n    get started() {\n        return this.attributeObserver.started;\n    }\n    start() {\n        this.attributeObserver.start();\n    }\n    pause(callback) {\n        this.attributeObserver.pause(callback);\n    }\n    stop() {\n        this.attributeObserver.stop();\n    }\n    refresh() {\n        this.attributeObserver.refresh();\n    }\n    get element() {\n        return this.attributeObserver.element;\n    }\n    get attributeName() {\n        return this.attributeObserver.attributeName;\n    }\n    elementMatchedAttribute(element) {\n        this.tokensMatched(this.readTokensForElement(element));\n    }\n    elementAttributeValueChanged(element) {\n        const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element);\n        this.tokensUnmatched(unmatchedTokens);\n        this.tokensMatched(matchedTokens);\n    }\n    elementUnmatchedAttribute(element) {\n        this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));\n    }\n    tokensMatched(tokens) {\n        tokens.forEach(token => this.tokenMatched(token));\n    }\n    tokensUnmatched(tokens) {\n        tokens.forEach(token => this.tokenUnmatched(token));\n    }\n    tokenMatched(token) {\n        this.delegate.tokenMatched(token);\n        this.tokensByElement.add(token.element, token);\n    }\n    tokenUnmatched(token) {\n        this.delegate.tokenUnmatched(token);\n        this.tokensByElement.delete(token.element, token);\n    }\n    refreshTokensForElement(element) {\n        const previousTokens = this.tokensByElement.getValuesForKey(element);\n        const currentTokens = this.readTokensForElement(element);\n        const firstDifferingIndex = zip(previousTokens, currentTokens)\n            .findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken));\n        if (firstDifferingIndex == -1) {\n            return [[], []];\n        }\n        else {\n            return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)];\n        }\n    }\n    readTokensForElement(element) {\n        const attributeName = this.attributeName;\n        const tokenString = element.getAttribute(attributeName) || \"\";\n        return parseTokenString(tokenString, element, attributeName);\n    }\n}\nfunction parseTokenString(tokenString, element, attributeName) {\n    return tokenString.trim().split(/\\s+/).filter(content => content.length)\n        .map((content, index) => ({ element, attributeName, content, index }));\n}\nfunction zip(left, right) {\n    const length = Math.max(left.length, right.length);\n    return Array.from({ length }, (_, index) => [left[index], right[index]]);\n}\nfunction tokensAreEqual(left, right) {\n    return left && right && left.index == right.index && left.content == right.content;\n}\n\nclass ValueListObserver {\n    constructor(element, attributeName, delegate) {\n        this.tokenListObserver = new TokenListObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.parseResultsByToken = new WeakMap;\n        this.valuesByTokenByElement = new WeakMap;\n    }\n    get started() {\n        return this.tokenListObserver.started;\n    }\n    start() {\n        this.tokenListObserver.start();\n    }\n    stop() {\n        this.tokenListObserver.stop();\n    }\n    refresh() {\n        this.tokenListObserver.refresh();\n    }\n    get element() {\n        return this.tokenListObserver.element;\n    }\n    get attributeName() {\n        return this.tokenListObserver.attributeName;\n    }\n    tokenMatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).set(token, value);\n            this.delegate.elementMatchedValue(element, value);\n        }\n    }\n    tokenUnmatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).delete(token);\n            this.delegate.elementUnmatchedValue(element, value);\n        }\n    }\n    fetchParseResultForToken(token) {\n        let parseResult = this.parseResultsByToken.get(token);\n        if (!parseResult) {\n            parseResult = this.parseToken(token);\n            this.parseResultsByToken.set(token, parseResult);\n        }\n        return parseResult;\n    }\n    fetchValuesByTokenForElement(element) {\n        let valuesByToken = this.valuesByTokenByElement.get(element);\n        if (!valuesByToken) {\n            valuesByToken = new Map;\n            this.valuesByTokenByElement.set(element, valuesByToken);\n        }\n        return valuesByToken;\n    }\n    parseToken(token) {\n        try {\n            const value = this.delegate.parseValueForToken(token);\n            return { value };\n        }\n        catch (error) {\n            return { error };\n        }\n    }\n}\n\nclass BindingObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.bindingsByAction = new Map;\n    }\n    start() {\n        if (!this.valueListObserver) {\n            this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);\n            this.valueListObserver.start();\n        }\n    }\n    stop() {\n        if (this.valueListObserver) {\n            this.valueListObserver.stop();\n            delete this.valueListObserver;\n            this.disconnectAllActions();\n        }\n    }\n    get element() {\n        return this.context.element;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get actionAttribute() {\n        return this.schema.actionAttribute;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get bindings() {\n        return Array.from(this.bindingsByAction.values());\n    }\n    connectAction(action) {\n        const binding = new Binding(this.context, action);\n        this.bindingsByAction.set(action, binding);\n        this.delegate.bindingConnected(binding);\n    }\n    disconnectAction(action) {\n        const binding = this.bindingsByAction.get(action);\n        if (binding) {\n            this.bindingsByAction.delete(action);\n            this.delegate.bindingDisconnected(binding);\n        }\n    }\n    disconnectAllActions() {\n        this.bindings.forEach(binding => this.delegate.bindingDisconnected(binding));\n        this.bindingsByAction.clear();\n    }\n    parseValueForToken(token) {\n        const action = Action.forToken(token);\n        if (action.identifier == this.identifier) {\n            return action;\n        }\n    }\n    elementMatchedValue(element, action) {\n        this.connectAction(action);\n    }\n    elementUnmatchedValue(element, action) {\n        this.disconnectAction(action);\n    }\n}\n\nclass ValueObserver {\n    constructor(context, receiver) {\n        this.context = context;\n        this.receiver = receiver;\n        this.stringMapObserver = new StringMapObserver(this.element, this);\n        this.valueDescriptorMap = this.controller.valueDescriptorMap;\n        this.invokeChangedCallbacksForDefaultValues();\n    }\n    start() {\n        this.stringMapObserver.start();\n    }\n    stop() {\n        this.stringMapObserver.stop();\n    }\n    get element() {\n        return this.context.element;\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    getStringMapKeyForAttribute(attributeName) {\n        if (attributeName in this.valueDescriptorMap) {\n            return this.valueDescriptorMap[attributeName].name;\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        const descriptor = this.valueDescriptorMap[attributeName];\n        if (!this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue));\n        }\n    }\n    stringMapValueChanged(value, name, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[name];\n        if (value === null)\n            return;\n        if (oldValue === null) {\n            oldValue = descriptor.writer(descriptor.defaultValue);\n        }\n        this.invokeChangedCallback(name, value, oldValue);\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[key];\n        if (this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue);\n        }\n        else {\n            this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue);\n        }\n    }\n    invokeChangedCallbacksForDefaultValues() {\n        for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n            if (defaultValue != undefined && !this.controller.data.has(key)) {\n                this.invokeChangedCallback(name, writer(defaultValue), undefined);\n            }\n        }\n    }\n    invokeChangedCallback(name, rawValue, rawOldValue) {\n        const changedMethodName = `${name}Changed`;\n        const changedMethod = this.receiver[changedMethodName];\n        if (typeof changedMethod == \"function\") {\n            const descriptor = this.valueDescriptorNameMap[name];\n            const value = descriptor.reader(rawValue);\n            let oldValue = rawOldValue;\n            if (rawOldValue) {\n                oldValue = descriptor.reader(rawOldValue);\n            }\n            changedMethod.call(this.receiver, value, oldValue);\n        }\n    }\n    get valueDescriptors() {\n        const { valueDescriptorMap } = this;\n        return Object.keys(valueDescriptorMap).map(key => valueDescriptorMap[key]);\n    }\n    get valueDescriptorNameMap() {\n        const descriptors = {};\n        Object.keys(this.valueDescriptorMap).forEach(key => {\n            const descriptor = this.valueDescriptorMap[key];\n            descriptors[descriptor.name] = descriptor;\n        });\n        return descriptors;\n    }\n    hasValue(attributeName) {\n        const descriptor = this.valueDescriptorNameMap[attributeName];\n        const hasMethodName = `has${capitalize(descriptor.name)}`;\n        return this.receiver[hasMethodName];\n    }\n}\n\nclass TargetObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.targetsByName = new Multimap;\n    }\n    start() {\n        if (!this.tokenListObserver) {\n            this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this);\n            this.tokenListObserver.start();\n        }\n    }\n    stop() {\n        if (this.tokenListObserver) {\n            this.disconnectAllTargets();\n            this.tokenListObserver.stop();\n            delete this.tokenListObserver;\n        }\n    }\n    tokenMatched({ element, content: name }) {\n        if (this.scope.containsElement(element)) {\n            this.connectTarget(element, name);\n        }\n    }\n    tokenUnmatched({ element, content: name }) {\n        this.disconnectTarget(element, name);\n    }\n    connectTarget(element, name) {\n        var _a;\n        if (!this.targetsByName.has(name, element)) {\n            this.targetsByName.add(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name));\n        }\n    }\n    disconnectTarget(element, name) {\n        var _a;\n        if (this.targetsByName.has(name, element)) {\n            this.targetsByName.delete(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name));\n        }\n    }\n    disconnectAllTargets() {\n        for (const name of this.targetsByName.keys) {\n            for (const element of this.targetsByName.getValuesForKey(name)) {\n                this.disconnectTarget(element, name);\n            }\n        }\n    }\n    get attributeName() {\n        return `data-${this.context.identifier}-target`;\n    }\n    get element() {\n        return this.context.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nclass Context {\n    constructor(module, scope) {\n        this.logDebugActivity = (functionName, detail = {}) => {\n            const { identifier, controller, element } = this;\n            detail = Object.assign({ identifier, controller, element }, detail);\n            this.application.logDebugActivity(this.identifier, functionName, detail);\n        };\n        this.module = module;\n        this.scope = scope;\n        this.controller = new module.controllerConstructor(this);\n        this.bindingObserver = new BindingObserver(this, this.dispatcher);\n        this.valueObserver = new ValueObserver(this, this.controller);\n        this.targetObserver = new TargetObserver(this, this);\n        try {\n            this.controller.initialize();\n            this.logDebugActivity(\"initialize\");\n        }\n        catch (error) {\n            this.handleError(error, \"initializing controller\");\n        }\n    }\n    connect() {\n        this.bindingObserver.start();\n        this.valueObserver.start();\n        this.targetObserver.start();\n        try {\n            this.controller.connect();\n            this.logDebugActivity(\"connect\");\n        }\n        catch (error) {\n            this.handleError(error, \"connecting controller\");\n        }\n    }\n    disconnect() {\n        try {\n            this.controller.disconnect();\n            this.logDebugActivity(\"disconnect\");\n        }\n        catch (error) {\n            this.handleError(error, \"disconnecting controller\");\n        }\n        this.targetObserver.stop();\n        this.valueObserver.stop();\n        this.bindingObserver.stop();\n    }\n    get application() {\n        return this.module.application;\n    }\n    get identifier() {\n        return this.module.identifier;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get dispatcher() {\n        return this.application.dispatcher;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get parentElement() {\n        return this.element.parentElement;\n    }\n    handleError(error, message, detail = {}) {\n        const { identifier, controller, element } = this;\n        detail = Object.assign({ identifier, controller, element }, detail);\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    targetConnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetConnected`, element);\n    }\n    targetDisconnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetDisconnected`, element);\n    }\n    invokeControllerMethod(methodName, ...args) {\n        const controller = this.controller;\n        if (typeof controller[methodName] == \"function\") {\n            controller[methodName](...args);\n        }\n    }\n}\n\nfunction readInheritableStaticArrayValues(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return Array.from(ancestors.reduce((values, constructor) => {\n        getOwnStaticArrayValues(constructor, propertyName).forEach(name => values.add(name));\n        return values;\n    }, new Set));\n}\nfunction readInheritableStaticObjectPairs(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return ancestors.reduce((pairs, constructor) => {\n        pairs.push(...getOwnStaticObjectPairs(constructor, propertyName));\n        return pairs;\n    }, []);\n}\nfunction getAncestorsForConstructor(constructor) {\n    const ancestors = [];\n    while (constructor) {\n        ancestors.push(constructor);\n        constructor = Object.getPrototypeOf(constructor);\n    }\n    return ancestors.reverse();\n}\nfunction getOwnStaticArrayValues(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return Array.isArray(definition) ? definition : [];\n}\nfunction getOwnStaticObjectPairs(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return definition ? Object.keys(definition).map(key => [key, definition[key]]) : [];\n}\n\nfunction bless(constructor) {\n    return shadow(constructor, getBlessedProperties(constructor));\n}\nfunction shadow(constructor, properties) {\n    const shadowConstructor = extend(constructor);\n    const shadowProperties = getShadowProperties(constructor.prototype, properties);\n    Object.defineProperties(shadowConstructor.prototype, shadowProperties);\n    return shadowConstructor;\n}\nfunction getBlessedProperties(constructor) {\n    const blessings = readInheritableStaticArrayValues(constructor, \"blessings\");\n    return blessings.reduce((blessedProperties, blessing) => {\n        const properties = blessing(constructor);\n        for (const key in properties) {\n            const descriptor = blessedProperties[key] || {};\n            blessedProperties[key] = Object.assign(descriptor, properties[key]);\n        }\n        return blessedProperties;\n    }, {});\n}\nfunction getShadowProperties(prototype, properties) {\n    return getOwnKeys(properties).reduce((shadowProperties, key) => {\n        const descriptor = getShadowedDescriptor(prototype, properties, key);\n        if (descriptor) {\n            Object.assign(shadowProperties, { [key]: descriptor });\n        }\n        return shadowProperties;\n    }, {});\n}\nfunction getShadowedDescriptor(prototype, properties, key) {\n    const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key);\n    const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor;\n    if (!shadowedByValue) {\n        const descriptor = Object.getOwnPropertyDescriptor(properties, key).value;\n        if (shadowingDescriptor) {\n            descriptor.get = shadowingDescriptor.get || descriptor.get;\n            descriptor.set = shadowingDescriptor.set || descriptor.set;\n        }\n        return descriptor;\n    }\n}\nconst getOwnKeys = (() => {\n    if (typeof Object.getOwnPropertySymbols == \"function\") {\n        return (object) => [\n            ...Object.getOwnPropertyNames(object),\n            ...Object.getOwnPropertySymbols(object)\n        ];\n    }\n    else {\n        return Object.getOwnPropertyNames;\n    }\n})();\nconst extend = (() => {\n    function extendWithReflect(constructor) {\n        function extended() {\n            return Reflect.construct(constructor, arguments, new.target);\n        }\n        extended.prototype = Object.create(constructor.prototype, {\n            constructor: { value: extended }\n        });\n        Reflect.setPrototypeOf(extended, constructor);\n        return extended;\n    }\n    function testReflectExtension() {\n        const a = function () { this.a.call(this); };\n        const b = extendWithReflect(a);\n        b.prototype.a = function () { };\n        return new b;\n    }\n    try {\n        testReflectExtension();\n        return extendWithReflect;\n    }\n    catch (error) {\n        return (constructor) => class extended extends constructor {\n        };\n    }\n})();\n\nfunction blessDefinition(definition) {\n    return {\n        identifier: definition.identifier,\n        controllerConstructor: bless(definition.controllerConstructor)\n    };\n}\n\nclass Module {\n    constructor(application, definition) {\n        this.application = application;\n        this.definition = blessDefinition(definition);\n        this.contextsByScope = new WeakMap;\n        this.connectedContexts = new Set;\n    }\n    get identifier() {\n        return this.definition.identifier;\n    }\n    get controllerConstructor() {\n        return this.definition.controllerConstructor;\n    }\n    get contexts() {\n        return Array.from(this.connectedContexts);\n    }\n    connectContextForScope(scope) {\n        const context = this.fetchContextForScope(scope);\n        this.connectedContexts.add(context);\n        context.connect();\n    }\n    disconnectContextForScope(scope) {\n        const context = this.contextsByScope.get(scope);\n        if (context) {\n            this.connectedContexts.delete(context);\n            context.disconnect();\n        }\n    }\n    fetchContextForScope(scope) {\n        let context = this.contextsByScope.get(scope);\n        if (!context) {\n            context = new Context(this, scope);\n            this.contextsByScope.set(scope, context);\n        }\n        return context;\n    }\n}\n\nclass ClassMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    has(name) {\n        return this.data.has(this.getDataKey(name));\n    }\n    get(name) {\n        return this.getAll(name)[0];\n    }\n    getAll(name) {\n        const tokenString = this.data.get(this.getDataKey(name)) || \"\";\n        return tokenize(tokenString);\n    }\n    getAttributeName(name) {\n        return this.data.getAttributeNameForKey(this.getDataKey(name));\n    }\n    getDataKey(name) {\n        return `${name}-class`;\n    }\n    get data() {\n        return this.scope.data;\n    }\n}\n\nclass DataMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.getAttribute(name);\n    }\n    set(key, value) {\n        const name = this.getAttributeNameForKey(key);\n        this.element.setAttribute(name, value);\n        return this.get(key);\n    }\n    has(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.hasAttribute(name);\n    }\n    delete(key) {\n        if (this.has(key)) {\n            const name = this.getAttributeNameForKey(key);\n            this.element.removeAttribute(name);\n            return true;\n        }\n        else {\n            return false;\n        }\n    }\n    getAttributeNameForKey(key) {\n        return `data-${this.identifier}-${dasherize(key)}`;\n    }\n}\n\nclass Guide {\n    constructor(logger) {\n        this.warnedKeysByObject = new WeakMap;\n        this.logger = logger;\n    }\n    warn(object, key, message) {\n        let warnedKeys = this.warnedKeysByObject.get(object);\n        if (!warnedKeys) {\n            warnedKeys = new Set;\n            this.warnedKeysByObject.set(object, warnedKeys);\n        }\n        if (!warnedKeys.has(key)) {\n            warnedKeys.add(key);\n            this.logger.warn(message, object);\n        }\n    }\n}\n\nfunction attributeValueContainsToken(attributeName, token) {\n    return `[${attributeName}~=\"${token}\"]`;\n}\n\nclass TargetSet {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(targetName) {\n        return this.find(targetName) != null;\n    }\n    find(...targetNames) {\n        return targetNames.reduce((target, targetName) => target\n            || this.findTarget(targetName)\n            || this.findLegacyTarget(targetName), undefined);\n    }\n    findAll(...targetNames) {\n        return targetNames.reduce((targets, targetName) => [\n            ...targets,\n            ...this.findAllTargets(targetName),\n            ...this.findAllLegacyTargets(targetName)\n        ], []);\n    }\n    findTarget(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findElement(selector);\n    }\n    findAllTargets(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector);\n    }\n    getSelectorForTargetName(targetName) {\n        const attributeName = this.schema.targetAttributeForScope(this.identifier);\n        return attributeValueContainsToken(attributeName, targetName);\n    }\n    findLegacyTarget(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.deprecate(this.scope.findElement(selector), targetName);\n    }\n    findAllLegacyTargets(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector).map(element => this.deprecate(element, targetName));\n    }\n    getLegacySelectorForTargetName(targetName) {\n        const targetDescriptor = `${this.identifier}.${targetName}`;\n        return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);\n    }\n    deprecate(element, targetName) {\n        if (element) {\n            const { identifier } = this;\n            const attributeName = this.schema.targetAttribute;\n            const revisedAttributeName = this.schema.targetAttributeForScope(identifier);\n            this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n                `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`);\n        }\n        return element;\n    }\n    get guide() {\n        return this.scope.guide;\n    }\n}\n\nclass Scope {\n    constructor(schema, element, identifier, logger) {\n        this.targets = new TargetSet(this);\n        this.classes = new ClassMap(this);\n        this.data = new DataMap(this);\n        this.containsElement = (element) => {\n            return element.closest(this.controllerSelector) === this.element;\n        };\n        this.schema = schema;\n        this.element = element;\n        this.identifier = identifier;\n        this.guide = new Guide(logger);\n    }\n    findElement(selector) {\n        return this.element.matches(selector)\n            ? this.element\n            : this.queryElements(selector).find(this.containsElement);\n    }\n    findAllElements(selector) {\n        return [\n            ...this.element.matches(selector) ? [this.element] : [],\n            ...this.queryElements(selector).filter(this.containsElement)\n        ];\n    }\n    queryElements(selector) {\n        return Array.from(this.element.querySelectorAll(selector));\n    }\n    get controllerSelector() {\n        return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);\n    }\n}\n\nclass ScopeObserver {\n    constructor(element, schema, delegate) {\n        this.element = element;\n        this.schema = schema;\n        this.delegate = delegate;\n        this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);\n        this.scopesByIdentifierByElement = new WeakMap;\n        this.scopeReferenceCounts = new WeakMap;\n    }\n    start() {\n        this.valueListObserver.start();\n    }\n    stop() {\n        this.valueListObserver.stop();\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    parseValueForToken(token) {\n        const { element, content: identifier } = token;\n        const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);\n        let scope = scopesByIdentifier.get(identifier);\n        if (!scope) {\n            scope = this.delegate.createScopeForElementAndIdentifier(element, identifier);\n            scopesByIdentifier.set(identifier, scope);\n        }\n        return scope;\n    }\n    elementMatchedValue(element, value) {\n        const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;\n        this.scopeReferenceCounts.set(value, referenceCount);\n        if (referenceCount == 1) {\n            this.delegate.scopeConnected(value);\n        }\n    }\n    elementUnmatchedValue(element, value) {\n        const referenceCount = this.scopeReferenceCounts.get(value);\n        if (referenceCount) {\n            this.scopeReferenceCounts.set(value, referenceCount - 1);\n            if (referenceCount == 1) {\n                this.delegate.scopeDisconnected(value);\n            }\n        }\n    }\n    fetchScopesByIdentifierForElement(element) {\n        let scopesByIdentifier = this.scopesByIdentifierByElement.get(element);\n        if (!scopesByIdentifier) {\n            scopesByIdentifier = new Map;\n            this.scopesByIdentifierByElement.set(element, scopesByIdentifier);\n        }\n        return scopesByIdentifier;\n    }\n}\n\nclass Router {\n    constructor(application) {\n        this.application = application;\n        this.scopeObserver = new ScopeObserver(this.element, this.schema, this);\n        this.scopesByIdentifier = new Multimap;\n        this.modulesByIdentifier = new Map;\n    }\n    get element() {\n        return this.application.element;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get logger() {\n        return this.application.logger;\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    get modules() {\n        return Array.from(this.modulesByIdentifier.values());\n    }\n    get contexts() {\n        return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []);\n    }\n    start() {\n        this.scopeObserver.start();\n    }\n    stop() {\n        this.scopeObserver.stop();\n    }\n    loadDefinition(definition) {\n        this.unloadIdentifier(definition.identifier);\n        const module = new Module(this.application, definition);\n        this.connectModule(module);\n    }\n    unloadIdentifier(identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            this.disconnectModule(module);\n        }\n    }\n    getContextForElementAndIdentifier(element, identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            return module.contexts.find(context => context.element == element);\n        }\n    }\n    handleError(error, message, detail) {\n        this.application.handleError(error, message, detail);\n    }\n    createScopeForElementAndIdentifier(element, identifier) {\n        return new Scope(this.schema, element, identifier, this.logger);\n    }\n    scopeConnected(scope) {\n        this.scopesByIdentifier.add(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.connectContextForScope(scope);\n        }\n    }\n    scopeDisconnected(scope) {\n        this.scopesByIdentifier.delete(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.disconnectContextForScope(scope);\n        }\n    }\n    connectModule(module) {\n        this.modulesByIdentifier.set(module.identifier, module);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach(scope => module.connectContextForScope(scope));\n    }\n    disconnectModule(module) {\n        this.modulesByIdentifier.delete(module.identifier);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach(scope => module.disconnectContextForScope(scope));\n    }\n}\n\nconst defaultSchema = {\n    controllerAttribute: \"data-controller\",\n    actionAttribute: \"data-action\",\n    targetAttribute: \"data-target\",\n    targetAttributeForScope: identifier => `data-${identifier}-target`\n};\n\nclass Application {\n    constructor(element = document.documentElement, schema = defaultSchema) {\n        this.logger = console;\n        this.debug = false;\n        this.logDebugActivity = (identifier, functionName, detail = {}) => {\n            if (this.debug) {\n                this.logFormattedMessage(identifier, functionName, detail);\n            }\n        };\n        this.element = element;\n        this.schema = schema;\n        this.dispatcher = new Dispatcher(this);\n        this.router = new Router(this);\n    }\n    static start(element, schema) {\n        const application = new Application(element, schema);\n        application.start();\n        return application;\n    }\n    async start() {\n        await domReady();\n        this.logDebugActivity(\"application\", \"starting\");\n        this.dispatcher.start();\n        this.router.start();\n        this.logDebugActivity(\"application\", \"start\");\n    }\n    stop() {\n        this.logDebugActivity(\"application\", \"stopping\");\n        this.dispatcher.stop();\n        this.router.stop();\n        this.logDebugActivity(\"application\", \"stop\");\n    }\n    register(identifier, controllerConstructor) {\n        if (controllerConstructor.shouldLoad) {\n            this.load({ identifier, controllerConstructor });\n        }\n    }\n    load(head, ...rest) {\n        const definitions = Array.isArray(head) ? head : [head, ...rest];\n        definitions.forEach(definition => this.router.loadDefinition(definition));\n    }\n    unload(head, ...rest) {\n        const identifiers = Array.isArray(head) ? head : [head, ...rest];\n        identifiers.forEach(identifier => this.router.unloadIdentifier(identifier));\n    }\n    get controllers() {\n        return this.router.contexts.map(context => context.controller);\n    }\n    getControllerForElementAndIdentifier(element, identifier) {\n        const context = this.router.getContextForElementAndIdentifier(element, identifier);\n        return context ? context.controller : null;\n    }\n    handleError(error, message, detail) {\n        var _a;\n        this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail);\n        (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, \"\", 0, 0, error);\n    }\n    logFormattedMessage(identifier, functionName, detail = {}) {\n        detail = Object.assign({ application: this }, detail);\n        this.logger.groupCollapsed(`${identifier} #${functionName}`);\n        this.logger.log(\"details:\", Object.assign({}, detail));\n        this.logger.groupEnd();\n    }\n}\nfunction domReady() {\n    return new Promise(resolve => {\n        if (document.readyState == \"loading\") {\n            document.addEventListener(\"DOMContentLoaded\", () => resolve());\n        }\n        else {\n            resolve();\n        }\n    });\n}\n\nfunction ClassPropertiesBlessing(constructor) {\n    const classes = readInheritableStaticArrayValues(constructor, \"classes\");\n    return classes.reduce((properties, classDefinition) => {\n        return Object.assign(properties, propertiesForClassDefinition(classDefinition));\n    }, {});\n}\nfunction propertiesForClassDefinition(key) {\n    return {\n        [`${key}Class`]: {\n            get() {\n                const { classes } = this;\n                if (classes.has(key)) {\n                    return classes.get(key);\n                }\n                else {\n                    const attribute = classes.getAttributeName(key);\n                    throw new Error(`Missing attribute \"${attribute}\"`);\n                }\n            }\n        },\n        [`${key}Classes`]: {\n            get() {\n                return this.classes.getAll(key);\n            }\n        },\n        [`has${capitalize(key)}Class`]: {\n            get() {\n                return this.classes.has(key);\n            }\n        }\n    };\n}\n\nfunction TargetPropertiesBlessing(constructor) {\n    const targets = readInheritableStaticArrayValues(constructor, \"targets\");\n    return targets.reduce((properties, targetDefinition) => {\n        return Object.assign(properties, propertiesForTargetDefinition(targetDefinition));\n    }, {});\n}\nfunction propertiesForTargetDefinition(name) {\n    return {\n        [`${name}Target`]: {\n            get() {\n                const target = this.targets.find(name);\n                if (target) {\n                    return target;\n                }\n                else {\n                    throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`);\n                }\n            }\n        },\n        [`${name}Targets`]: {\n            get() {\n                return this.targets.findAll(name);\n            }\n        },\n        [`has${capitalize(name)}Target`]: {\n            get() {\n                return this.targets.has(name);\n            }\n        }\n    };\n}\n\nfunction ValuePropertiesBlessing(constructor) {\n    const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, \"values\");\n    const propertyDescriptorMap = {\n        valueDescriptorMap: {\n            get() {\n                return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n                    const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair);\n                    const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key);\n                    return Object.assign(result, { [attributeName]: valueDescriptor });\n                }, {});\n            }\n        }\n    };\n    return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n        return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair));\n    }, propertyDescriptorMap);\n}\nfunction propertiesForValueDefinitionPair(valueDefinitionPair) {\n    const definition = parseValueDefinitionPair(valueDefinitionPair);\n    const { key, name, reader: read, writer: write } = definition;\n    return {\n        [name]: {\n            get() {\n                const value = this.data.get(key);\n                if (value !== null) {\n                    return read(value);\n                }\n                else {\n                    return definition.defaultValue;\n                }\n            },\n            set(value) {\n                if (value === undefined) {\n                    this.data.delete(key);\n                }\n                else {\n                    this.data.set(key, write(value));\n                }\n            }\n        },\n        [`has${capitalize(name)}`]: {\n            get() {\n                return this.data.has(key) || definition.hasCustomDefaultValue;\n            }\n        }\n    };\n}\nfunction parseValueDefinitionPair([token, typeDefinition]) {\n    return valueDescriptorForTokenAndTypeDefinition(token, typeDefinition);\n}\nfunction parseValueTypeConstant(constant) {\n    switch (constant) {\n        case Array: return \"array\";\n        case Boolean: return \"boolean\";\n        case Number: return \"number\";\n        case Object: return \"object\";\n        case String: return \"string\";\n    }\n}\nfunction parseValueTypeDefault(defaultValue) {\n    switch (typeof defaultValue) {\n        case \"boolean\": return \"boolean\";\n        case \"number\": return \"number\";\n        case \"string\": return \"string\";\n    }\n    if (Array.isArray(defaultValue))\n        return \"array\";\n    if (Object.prototype.toString.call(defaultValue) === \"[object Object]\")\n        return \"object\";\n}\nfunction parseValueTypeObject(typeObject) {\n    const typeFromObject = parseValueTypeConstant(typeObject.type);\n    if (typeFromObject) {\n        const defaultValueType = parseValueTypeDefault(typeObject.default);\n        if (typeFromObject !== defaultValueType) {\n            throw new Error(`Type \"${typeFromObject}\" must match the type of the default value. Given default value: \"${typeObject.default}\" as \"${defaultValueType}\"`);\n        }\n        return typeFromObject;\n    }\n}\nfunction parseValueTypeDefinition(typeDefinition) {\n    const typeFromObject = parseValueTypeObject(typeDefinition);\n    const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n    const typeFromConstant = parseValueTypeConstant(typeDefinition);\n    const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n    if (type)\n        return type;\n    throw new Error(`Unknown value type \"${typeDefinition}\"`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n    const constant = parseValueTypeConstant(typeDefinition);\n    if (constant)\n        return defaultValuesByType[constant];\n    const defaultValue = typeDefinition.default;\n    if (defaultValue !== undefined)\n        return defaultValue;\n    return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(token, typeDefinition) {\n    const key = `${dasherize(token)}-value`;\n    const type = parseValueTypeDefinition(typeDefinition);\n    return {\n        type,\n        key,\n        name: camelize(key),\n        get defaultValue() { return defaultValueForDefinition(typeDefinition); },\n        get hasCustomDefaultValue() { return parseValueTypeDefault(typeDefinition) !== undefined; },\n        reader: readers[type],\n        writer: writers[type] || writers.default\n    };\n}\nconst defaultValuesByType = {\n    get array() { return []; },\n    boolean: false,\n    number: 0,\n    get object() { return {}; },\n    string: \"\"\n};\nconst readers = {\n    array(value) {\n        const array = JSON.parse(value);\n        if (!Array.isArray(array)) {\n            throw new TypeError(\"Expected array\");\n        }\n        return array;\n    },\n    boolean(value) {\n        return !(value == \"0\" || value == \"false\");\n    },\n    number(value) {\n        return Number(value);\n    },\n    object(value) {\n        const object = JSON.parse(value);\n        if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n            throw new TypeError(\"Expected object\");\n        }\n        return object;\n    },\n    string(value) {\n        return value;\n    }\n};\nconst writers = {\n    default: writeString,\n    array: writeJSON,\n    object: writeJSON\n};\nfunction writeJSON(value) {\n    return JSON.stringify(value);\n}\nfunction writeString(value) {\n    return `${value}`;\n}\n\nclass Controller {\n    constructor(context) {\n        this.context = context;\n    }\n    static get shouldLoad() {\n        return true;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get targets() {\n        return this.scope.targets;\n    }\n    get classes() {\n        return this.scope.classes;\n    }\n    get data() {\n        return this.scope.data;\n    }\n    initialize() {\n    }\n    connect() {\n    }\n    disconnect() {\n    }\n    dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true } = {}) {\n        const type = prefix ? `${prefix}:${eventName}` : eventName;\n        const event = new CustomEvent(type, { detail, bubbles, cancelable });\n        target.dispatchEvent(event);\n        return event;\n    }\n}\nController.blessings = [ClassPropertiesBlessing, TargetPropertiesBlessing, ValuePropertiesBlessing];\nController.targets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, StringMapObserver, TokenListObserver, ValueListObserver, add, defaultSchema, del, fetch, prune };\n", "import { Application } from \"@hotwired/stimulus\"\n\nconst application = Application.start()\n\n// Configure Stimulus development experience\napplication.debug = false\nwindow.Stimulus   = application\n\nexport { application }\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { DateTime } from \"luxon\";\n\nexport const YYYYMMDDHHMMSS = /^\\s*([0-9]{4})[:\\-_/]?([0-9]{1,2})[:\\-_/]?([0-9]{1,2})(?:\\s*([0-9]{1,2})[h: ]?([0-9]{1,2})(?:[:m ]?([0-9]{1,2})s?)?)?\\s*$/\nexport const DDMMYYYYHHMMSS = /^\\s*([0-9]{1,2})[:\\-_/]?([0-9]{1,2})(?:[:\\-_/]?([0-9]{4}))?(?:\\s*([0-9]{1,2})[h: ]?([0-9]{1,2})(?:[:m ]?([0-9]{1,2})s?)?)?\\s*$/\nexport const DDMMMYYYYHHMMSS = /^\\s*([0-9]{1,2})[:\\-_/ ]?(janu?a?r?i?|febr?u?a?r?i?|maar?t?|apri?l?|mei|juni?|juli?|augu?s?t?u?s?|sept?e?m?b?e?r?|okto?b?e?r?|nove?m?b?e?r?|dece?m?b?e?r?)(?:[:\\-_/ ]?([0-9]{4}))?(?:\\s*([0-9]{1,2})[h: ]?([0-9]{1,2})(?:[:m ]?([0-9]{1,2})s?)?)?\\s*$/\nexport const DDDHHMMSS = /^(ma(?:a(?:n(?:d(?:ag?)?)?)?)?|di(?:n(?:s(?:d(?:ag?)?)?)?)?|wo(?:e(?:n(?:s(?:d(?:ag?)?)?)?)?)?|do(?:n(?:d(?:e(?:r(?:d(?:ag?)?)?)?)?)?)?|vr(?:i(?:j(?:d(?:ag?)?)?)?)?|za(?:t(?:e(?:r(?:d(?:ag?)?)?)?)?)?|zo(?:n(?:d(?:ag?)?)?)?|va(?:n(?:d(?:a(?:ag?)?)?)?)?|mo(?:r(?:g(?:en?)?)?)?|ov(?:e(?:r(?:m(?:o(?:r(?:g(?:en?)?)?)?)?)?)?)?)(?:\\s+([0-9]{1,2})[h: ]?([0-9]{1,2})(?:[:m ]?([0-9]{1,2})s?)?)?\\s*$/\n\nexport const WEEKDAYS = { ma: 1, di: 2, wo: 3, do: 4, vr: 5, za: 6, zo: 7 }\nexport const MONTHS = { jan: 1, feb: 2, maa: 3, apr: 4, mei: 5, jun: 6, jul: 7, aug: 8, sep: 9, okt: 10, nov: 11, dec: 12 }\n\nexport default class extends Controller {\n  static targets = [\"input\", \"hint\"]\n\n  #nowInterval;\n\n  handleInput() {\n    const date = this._parseDateTime(this.inputTarget.value, this.inputTarget.dataset.type == 'date')\n    if (date == null) {\n      this.inputTarget.classList.remove('is-valid')\n      this.inputTarget.classList.add('is-invalid')\n      this._removeHintText()\n    } else {\n      this.inputTarget.classList.remove('is-invalid')\n      this.inputTarget.classList.add('is-valid')\n      this._setHintText(date, this.inputTarget.dataset.type == 'date')\n    }\n  }\n\n  _removeHintText() {\n    if (this.hasHintTarget) {\n      this.hintTarget.remove()\n    }\n  }\n\n  _setHintText(date, dateOnly=false) {\n    if (!this.hasHintTarget) {\n      const hint = document.createElement('div')\n      hint.setAttribute('id', this.inputTarget.id + \"_hint\")\n      hint.classList.add('form-text')\n      hint.dataset.dateTimeInputTarget = 'hint'\n      this.element.insertBefore(hint, null)\n    }\n    while (this.hintTarget.firstChild) {\n      this.hintTarget.removeChild(this.hintTarget.lastChild);\n    }\n    clearInterval(this.#nowInterval)\n    if (date == 'now') {\n      date = DateTime.now({ zone: 'Europe/Amsterdam' })\n      this.#nowInterval = setInterval(() => { this._updateHintText() }, 1000)\n    }\n    const dateObject = {\n      year: 'numeric',\n      month: 'long',\n      day: 'numeric',\n      weekday: 'short'\n    }\n    if (!dateOnly) {\n      dateObject.hour = 'numeric'\n      dateObject.minute = '2-digit'\n      dateObject.second = '2-digit'\n    }\n    const text = document.createTextNode(date.toLocaleString(dateObject))\n    this.hintTarget.appendChild(text)\n  }\n\n  _updateHintText() {\n    if (!this.hasHintTarget) {\n      return\n    }\n    while (this.hintTarget.firstChild) {\n      this.hintTarget.removeChild(this.hintTarget.lastChild);\n    }\n    const date = DateTime.now({ zone: 'Europe/Amsterdam' })\n    const text = document.createTextNode(date.toLocaleString({\n      year: 'numeric',\n      month: 'long',\n      day: 'numeric',\n      hour: 'numeric',\n      minute: '2-digit',\n      second: '2-digit',\n      weekday: 'short'\n    }))\n    this.hintTarget.appendChild(text)\n  }\n\n  _parseDateTime(value, dateOnly=false) {\n    if (YYYYMMDDHHMMSS.test(value)) {\n      const match = YYYYMMDDHHMMSS.exec(value)\n      const year = this._parseYear(match[1])\n      const month = this._parseMonth(match[2])\n      const day = this._parseDay(year, month, match[3])\n      const [ hour, minute, second ] = this._parseTime(match[4], match[5], match[6])\n      if (dateOnly && (match[4] || match[5] || match[6])) {\n        return null\n      }\n      return this._constructDateTime(year, month, day, hour, minute, second)\n    } else if (DDMMYYYYHHMMSS.test(value)) {\n      const match = DDMMYYYYHHMMSS.exec(value)\n      const year = this._parseYear(match[3])\n      const month = this._parseMonth(match[2])\n      const day = this._parseDay(year, month, match[1])\n      const [ hour, minute, second ] = this._parseTime(match[4], match[5], match[6])\n      if (dateOnly && (match[4] || match[5] || match[6])) {\n        return null\n      }\n      return this._constructDateTime(year, month, day, hour, minute, second)\n    } else if (DDMMMYYYYHHMMSS.test(value)) {\n      const match = DDMMMYYYYHHMMSS.exec(value)\n      const year = this._parseYear(match[3])\n      const month = this._parseWrittenMonth(match[2])\n      const day = this._parseDay(year, month, match[1])\n      const [ hour, minute, second ] = this._parseTime(match[4], match[5], match[6])\n      if (dateOnly && (match[4] || match[5] || match[6])) {\n        return null\n      }\n      return this._constructDateTime(year, month, day, hour, minute, second)\n    } else if (DDDHHMMSS.test(value)) {\n      const match = DDDHHMMSS.exec(value)\n      const [ year, month, day ] = this._parseWeekday(match[1])\n      const [ hour, minute, second ] = this._parseTime(match[2], match[3], match[4])\n      if (dateOnly && (match[2] || match[3] || match[4])) {\n        return null\n      }\n      return this._constructDateTime(year, month, day, hour, minute, second)\n    } else if (value.trim() == 'nu') {\n      return 'now'\n    }\n    return null;\n  }\n\n  _parseYear(year) {\n    const parsed = parseInt(year)\n\n    if (isNaN(parsed)) return null\n\n    return parsed\n  }\n\n  _parseMonth(month) {\n    const parsed = parseInt(month)\n\n    if (isNaN(parsed)) return null\n    if (parsed < 1 || parsed > 12) return null\n\n    return parsed\n  }\n\n  _parseWrittenMonth(month) {\n    if (!MONTHS[month.substr(0, 3)]) return null\n\n    return MONTHS[month.substr(0, 3)]\n  }\n\n  _parseDay(parsed_year, parsed_month, day) {\n    const parsed = parseInt(day)\n\n    if (isNaN(parsed)) return null\n\n    const current_date = DateTime.now({ zone: 'Europe/Amsterdam' })\n    if (!parsed_year) {\n      parsed_year = current_date.year;\n    }\n    const date = DateTime.local(parsed_year, parsed_month, parsed, { zone: 'Europe/Amsterdam' })\n\n    if (!date.isValid) return null\n\n    return parsed\n  }\n\n  _parseWeekday(day) {\n    let date = DateTime.now({ zone: 'Europe/Amsterdam' })\n    let days = 0\n    switch(day.substr(0, 2)) {\n      case \"va\":\n        return [date.year, date.month, date.day]\n      case \"mo\":\n        days = 1\n        break\n      case \"ov\":\n        days = 2\n        break\n      default:\n        if (!WEEKDAYS[day.substr(0, 2)]) return null\n\n        days = WEEKDAYS[day.substr(0, 2)] - date.weekday\n        break\n    }\n    date = date.plus({ days: days > 0 ? days : days + 7 })\n    return [date.year, date.month, date.day]\n  }\n\n  _parseTime(hour, minute, second) {\n    return [this._parseHour(hour), this._parseMinute(minute), this._parseSecond(second)]\n  }\n\n  _parseHour(hour) {\n    const parsed = parseInt(hour)\n\n    if (isNaN(parsed)) return 0\n    if (parsed < 0 || parsed > 23) return 0\n\n    return parsed\n  }\n\n  _parseMinute(minute) {\n    const parsed = parseInt(minute)\n\n    if (isNaN(parsed)) return 0\n    if (parsed < 0 || parsed > 59) return 0\n\n    return parsed\n  }\n\n  _parseSecond(second) {\n    const parsed = parseInt(second)\n\n    if (isNaN(parsed)) return 0\n    if (parsed < 0 || parsed > 59) return 0\n\n    return parsed\n  }\n\n  _constructDateTime(year, month, day, hour, minute, second) {\n    const current_date = DateTime.now({ zone: 'Europe/Amsterdam' })\n    let date_year = year;\n    if (year == null) {\n      date_year = current_date.year;\n    }\n    let date = DateTime.local(date_year, month, day, hour, minute, second, { zone: 'Europe/Amsterdam', locale: 'nl' })\n    if (date < DateTime.local({ zone: 'Europe/Amsterdam' }) && year == null) {\n      date = date.plus({ year: 1 })\n    }\n    if (!date.isValid) return null\n    return date\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"row\", \"switch\"]\n\n  connect() {\n    this._updateStates();\n  }\n\n  filter(event) {\n    if (event.target.checked) {\n      this._activateState(event.target.dataset.filterClass)\n    } else {\n      this._deactivateState(event.target.dataset.filterClass)\n    }\n  }\n\n  _updateStates() {\n    this.switchTargets.forEach(element => {\n      if (element.checked) {\n        this._activateState(element.dataset.filterClass)\n      } else {\n        this._deactivateState(element.dataset.filterClass)\n      }\n    });\n  }\n\n  _activateState(state) {\n    this.rowTargets.forEach(element => {\n      if (element.dataset.filterClasses.split(' ').indexOf(state) < 0) return\n\n      element.classList.remove('d-none')\n    });\n  }\n\n  _deactivateState(state) {\n    this.rowTargets.forEach(element => {\n      if (element.dataset.filterClasses.split(' ').indexOf(state) < 0) return\n\n      element.classList.add('d-none')\n    });\n  }\n}\n", "/*!\n* CreateJS\n* Visit http://createjs.com/ for documentation, updates and examples.\n*\n* Copyright (c) 2010 gskinner.com, inc.\n*\n* Permission is hereby granted, free of charge, to any person\n* obtaining a copy of this software and associated documentation\n* files (the \"Software\"), to deal in the Software without\n* restriction, including without limitation the rights to use,\n* copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the\n* Software is furnished to do so, subject to the following\n* conditions:\n*\n* The above copyright notice and this permission notice shall be\n* included in all copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n* OTHER DEALINGS IN THE SOFTWARE.\n*/\n\nexport const createjs = {};\n\n\n//##############################################################################\n// extend.js\n//##############################################################################\n\n/**\n * @class Utility Methods\n */\n\n/**\n * Sets up the prototype chain and constructor property for a new class.\n *\n * This should be called right after creating the class constructor.\n *\n * \tfunction MySubClass() {}\n * \tcreatejs.extend(MySubClass, MySuperClass);\n * \tMySubClass.prototype.doSomething = function() { }\n *\n * \tvar foo = new MySubClass();\n * \tconsole.log(foo instanceof MySuperClass); // true\n * \tconsole.log(foo.prototype.constructor === MySubClass); // true\n *\n * @method extend\n * @param {Function} subclass The subclass.\n * @param {Function} superclass The superclass to extend.\n * @return {Function} Returns the subclass's new prototype.\n */\ncreatejs.extend = function(subclass, superclass) {\n\t\"use strict\";\n\n\tfunction o() { this.constructor = subclass; }\n\to.prototype = superclass.prototype;\n\treturn (subclass.prototype = new o());\n};\n\n//##############################################################################\n// promote.js\n//##############################################################################\n\n/**\n * @class Utility Methods\n */\n\n/**\n * Promotes any methods on the super class that were overridden, by creating an alias in the format `prefix_methodName`.\n * It is recommended to use the super class's name as the prefix.\n * An alias to the super class's constructor is always added in the format `prefix_constructor`.\n * This allows the subclass to call super class methods without using `function.call`, providing better performance.\n *\n * For example, if `MySubClass` extends `MySuperClass`, and both define a `draw` method, then calling `promote(MySubClass, \"MySuperClass\")`\n * would add a `MySuperClass_constructor` method to MySubClass and promote the `draw` method on `MySuperClass` to the\n * prototype of `MySubClass` as `MySuperClass_draw`.\n *\n * This should be called after the class's prototype is fully defined.\n *\n * \tfunction ClassA(name) {\n * \t\tthis.name = name;\n * \t}\n * \tClassA.prototype.greet = function() {\n * \t\treturn \"Hello \"+this.name;\n * \t}\n *\n * \tfunction ClassB(name, punctuation) {\n * \t\tthis.ClassA_constructor(name);\n * \t\tthis.punctuation = punctuation;\n * \t}\n * \tcreatejs.extend(ClassB, ClassA);\n * \tClassB.prototype.greet = function() {\n * \t\treturn this.ClassA_greet()+this.punctuation;\n * \t}\n * \tcreatejs.promote(ClassB, \"ClassA\");\n *\n * \tvar foo = new ClassB(\"World\", \"!?!\");\n * \tconsole.log(foo.greet()); // Hello World!?!\n *\n * @method promote\n * @param {Function} subclass The class to promote super class methods on.\n * @param {String} prefix The prefix to add to the promoted method names. Usually the name of the superclass.\n * @return {Function} Returns the subclass.\n */\ncreatejs.promote = function(subclass, prefix) {\n\t\"use strict\";\n\n\tvar subP = subclass.prototype, supP = (Object.getPrototypeOf&&Object.getPrototypeOf(subP))||subP.__proto__;\n\tif (supP) {\n\t\tsubP[(prefix+=\"_\") + \"constructor\"] = supP.constructor; // constructor is not always innumerable\n\t\tfor (var n in supP) {\n\t\t\tif (subP.hasOwnProperty(n) && (typeof supP[n] == \"function\")) { subP[prefix + n] = supP[n]; }\n\t\t}\n\t}\n\treturn subclass;\n};\n\n//##############################################################################\n// indexOf.js\n//##############################################################################\n\n/**\n * @class Utility Methods\n */\n\n/**\n * Finds the first occurrence of a specified value searchElement in the passed in array, and returns the index of\n * that value.  Returns -1 if value is not found.\n *\n *      var i = createjs.indexOf(myArray, myElementToFind);\n *\n * @method indexOf\n * @param {Array} array Array to search for searchElement\n * @param searchElement Element to find in array.\n * @return {Number} The first index of searchElement in array.\n */\ncreatejs.indexOf = function (array, searchElement){\n\t\"use strict\";\n\n\tfor (var i = 0,l=array.length; i < l; i++) {\n\t\tif (searchElement === array[i]) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n};\n\n//##############################################################################\n// UID.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Global utility for generating sequential unique ID numbers. The UID class uses a static interface (ex. <code>UID.get()</code>)\n\t * and should not be instantiated.\n\t * @class UID\n\t * @static\n\t **/\n\tfunction UID() {\n\t\tthrow \"UID cannot be instantiated\";\n\t}\n\n\n// private static properties:\n\t/**\n\t * @property _nextID\n\t * @type Number\n\t * @protected\n\t **/\n\tUID._nextID = 0;\n\n\n// public static methods:\n\t/**\n\t * Returns the next unique id.\n\t * @method get\n\t * @return {Number} The next unique id\n\t * @static\n\t **/\n\tUID.get = function() {\n\t\treturn UID._nextID++;\n\t};\n\n\n\tcreatejs.UID = UID;\n}());\n\n//##############################################################################\n// deprecate.js\n//##############################################################################\n\n/**\n * @class Utility Methods\n */\n\n/**\n * Wraps deprecated methods so they still be used, but throw warnings to developers.\n *\n *\tobj.deprecatedMethod = createjs.deprecate(\"Old Method Name\", obj._fallbackMethod);\n *\n * The recommended approach for deprecated properties is:\n *\n *\ttry {\n *\t\tObj\tect.defineProperties(object, {\n *\t\t\treadyOnlyProp: { get: createjs.deprecate(\"readOnlyProp\", function() { return this.alternateProp; }) },\n *\t\t\treadWriteProp: {\n *\t\t\t\tget: createjs.deprecate(\"readOnlyProp\", function() { return this.alternateProp; }),\n *\t\t\t\tset: createjs.deprecate(\"readOnlyProp\", function(val) { this.alternateProp = val; })\n *\t\t});\n *\t} catch (e) {}\n *\n * @method deprecate\n * @param {Function} [fallbackMethod=null] A method to call when the deprecated method is used. See the example for how\n * @param {String} [name=null] The name of the method or property to display in the console warning.\n * to deprecate properties.\n * @return {Function} If a fallbackMethod is supplied, returns a closure that will call the fallback method after\n * logging the warning in the console.\n */\ncreatejs.deprecate = function(fallbackMethod, name) {\n\t\"use strict\";\n\treturn function() {\n\t\tvar msg = \"Deprecated property or method '\"+name+\"'. See docs for info.\";\n\t\tconsole && (console.warn ? console.warn(msg) : console.log(msg));\n\t\treturn fallbackMethod && fallbackMethod.apply(this, arguments);\n\t}\n};\n\n//##############################################################################\n// Event.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n// constructor:\n\t/**\n\t * Contains properties and methods shared by all events for use with\n\t * {{#crossLink \"EventDispatcher\"}}{{/crossLink}}.\n\t * \n\t * Note that Event objects are often reused, so you should never\n\t * rely on an event object's state outside of the call stack it was received in.\n\t * @class Event\n\t * @param {String} type The event type.\n\t * @param {Boolean} bubbles Indicates whether the event will bubble through the display list.\n\t * @param {Boolean} cancelable Indicates whether the default behaviour of this event can be cancelled.\n\t * @constructor\n\t **/\n\tfunction Event(type, bubbles, cancelable) {\n\t\t\n\t\n\t// public properties:\n\t\t/**\n\t\t * The type of event.\n\t\t * @property type\n\t\t * @type String\n\t\t **/\n\t\tthis.type = type;\n\t\n\t\t/**\n\t\t * The object that generated an event.\n\t\t * @property target\n\t\t * @type Object\n\t\t * @default null\n\t\t * @readonly\n\t\t*/\n\t\tthis.target = null;\n\t\n\t\t/**\n\t\t * The current target that a bubbling event is being dispatched from. For non-bubbling events, this will\n\t\t * always be the same as target. For example, if childObj.parent = parentObj, and a bubbling event\n\t\t * is generated from childObj, then a listener on parentObj would receive the event with\n\t\t * target=childObj (the original target) and currentTarget=parentObj (where the listener was added).\n\t\t * @property currentTarget\n\t\t * @type Object\n\t\t * @default null\n\t\t * @readonly\n\t\t*/\n\t\tthis.currentTarget = null;\n\t\n\t\t/**\n\t\t * For bubbling events, this indicates the current event phase:<OL>\n\t\t * \t<LI> capture phase: starting from the top parent to the target</LI>\n\t\t * \t<LI> at target phase: currently being dispatched from the target</LI>\n\t\t * \t<LI> bubbling phase: from the target to the top parent</LI>\n\t\t * </OL>\n\t\t * @property eventPhase\n\t\t * @type Number\n\t\t * @default 0\n\t\t * @readonly\n\t\t*/\n\t\tthis.eventPhase = 0;\n\t\n\t\t/**\n\t\t * Indicates whether the event will bubble through the display list.\n\t\t * @property bubbles\n\t\t * @type Boolean\n\t\t * @default false\n\t\t * @readonly\n\t\t*/\n\t\tthis.bubbles = !!bubbles;\n\t\n\t\t/**\n\t\t * Indicates whether the default behaviour of this event can be cancelled via\n\t\t * {{#crossLink \"Event/preventDefault\"}}{{/crossLink}}. This is set via the Event constructor.\n\t\t * @property cancelable\n\t\t * @type Boolean\n\t\t * @default false\n\t\t * @readonly\n\t\t*/\n\t\tthis.cancelable = !!cancelable;\n\t\n\t\t/**\n\t\t * The epoch time at which this event was created.\n\t\t * @property timeStamp\n\t\t * @type Number\n\t\t * @default 0\n\t\t * @readonly\n\t\t*/\n\t\tthis.timeStamp = (new Date()).getTime();\n\t\n\t\t/**\n\t\t * Indicates if {{#crossLink \"Event/preventDefault\"}}{{/crossLink}} has been called\n\t\t * on this event.\n\t\t * @property defaultPrevented\n\t\t * @type Boolean\n\t\t * @default false\n\t\t * @readonly\n\t\t*/\n\t\tthis.defaultPrevented = false;\n\t\n\t\t/**\n\t\t * Indicates if {{#crossLink \"Event/stopPropagation\"}}{{/crossLink}} or\n\t\t * {{#crossLink \"Event/stopImmediatePropagation\"}}{{/crossLink}} has been called on this event.\n\t\t * @property propagationStopped\n\t\t * @type Boolean\n\t\t * @default false\n\t\t * @readonly\n\t\t*/\n\t\tthis.propagationStopped = false;\n\t\n\t\t/**\n\t\t * Indicates if {{#crossLink \"Event/stopImmediatePropagation\"}}{{/crossLink}} has been called\n\t\t * on this event.\n\t\t * @property immediatePropagationStopped\n\t\t * @type Boolean\n\t\t * @default false\n\t\t * @readonly\n\t\t*/\n\t\tthis.immediatePropagationStopped = false;\n\t\t\n\t\t/**\n\t\t * Indicates if {{#crossLink \"Event/remove\"}}{{/crossLink}} has been called on this event.\n\t\t * @property removed\n\t\t * @type Boolean\n\t\t * @default false\n\t\t * @readonly\n\t\t*/\n\t\tthis.removed = false;\n\t}\n\tvar p = Event.prototype;\n\n// public methods:\n\t/**\n\t * Sets {{#crossLink \"Event/defaultPrevented\"}}{{/crossLink}} to true if the event is cancelable.\n\t * Mirrors the DOM level 2 event standard. In general, cancelable events that have `preventDefault()` called will\n\t * cancel the default behaviour associated with the event.\n\t * @method preventDefault\n\t **/\n\tp.preventDefault = function() {\n\t\tthis.defaultPrevented = this.cancelable&&true;\n\t};\n\n\t/**\n\t * Sets {{#crossLink \"Event/propagationStopped\"}}{{/crossLink}} to true.\n\t * Mirrors the DOM event standard.\n\t * @method stopPropagation\n\t **/\n\tp.stopPropagation = function() {\n\t\tthis.propagationStopped = true;\n\t};\n\n\t/**\n\t * Sets {{#crossLink \"Event/propagationStopped\"}}{{/crossLink}} and\n\t * {{#crossLink \"Event/immediatePropagationStopped\"}}{{/crossLink}} to true.\n\t * Mirrors the DOM event standard.\n\t * @method stopImmediatePropagation\n\t **/\n\tp.stopImmediatePropagation = function() {\n\t\tthis.immediatePropagationStopped = this.propagationStopped = true;\n\t};\n\t\n\t/**\n\t * Causes the active listener to be removed via removeEventListener();\n\t * \n\t * \t\tmyBtn.addEventListener(\"click\", function(evt) {\n\t * \t\t\t// do stuff...\n\t * \t\t\tevt.remove(); // removes this listener.\n\t * \t\t});\n\t * \n\t * @method remove\n\t **/\n\tp.remove = function() {\n\t\tthis.removed = true;\n\t};\n\t\n\t/**\n\t * Returns a clone of the Event instance.\n\t * @method clone\n\t * @return {Event} a clone of the Event instance.\n\t **/\n\tp.clone = function() {\n\t\treturn new Event(this.type, this.bubbles, this.cancelable);\n\t};\n\t\n\t/**\n\t * Provides a chainable shortcut method for setting a number of properties on the instance.\n\t *\n\t * @method set\n\t * @param {Object} props A generic object containing properties to copy to the instance.\n\t * @return {Event} Returns the instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t*/\n\tp.set = function(props) {\n\t\tfor (var n in props) { this[n] = props[n]; }\n\t\treturn this;\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[Event (type=\"+this.type+\")]\";\n\t};\n\n\tcreatejs.Event = Event;\n}());\n\n//##############################################################################\n// EventDispatcher.js\n//##############################################################################\n\n(function() {\r\n\t\"use strict\";\r\n\r\n\r\n// constructor:\r\n\t/**\r\n\t * EventDispatcher provides methods for managing queues of event listeners and dispatching events.\r\n\t *\r\n\t * You can either extend EventDispatcher or mix its methods into an existing prototype or instance by using the\r\n\t * EventDispatcher {{#crossLink \"EventDispatcher/initialize\"}}{{/crossLink}} method.\r\n\t * \r\n\t * Together with the CreateJS Event class, EventDispatcher provides an extended event model that is based on the\r\n\t * DOM Level 2 event model, including addEventListener, removeEventListener, and dispatchEvent. It supports\r\n\t * bubbling / capture, preventDefault, stopPropagation, stopImmediatePropagation, and handleEvent.\r\n\t * \r\n\t * EventDispatcher also exposes a {{#crossLink \"EventDispatcher/on\"}}{{/crossLink}} method, which makes it easier\r\n\t * to create scoped listeners, listeners that only run once, and listeners with associated arbitrary data. The \r\n\t * {{#crossLink \"EventDispatcher/off\"}}{{/crossLink}} method is merely an alias to\r\n\t * {{#crossLink \"EventDispatcher/removeEventListener\"}}{{/crossLink}}.\r\n\t * \r\n\t * Another addition to the DOM Level 2 model is the {{#crossLink \"EventDispatcher/removeAllEventListeners\"}}{{/crossLink}}\r\n\t * method, which can be used to listeners for all events, or listeners for a specific event. The Event object also \r\n\t * includes a {{#crossLink \"Event/remove\"}}{{/crossLink}} method which removes the active listener.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t * Add EventDispatcher capabilities to the \"MyClass\" class.\r\n\t *\r\n\t *      EventDispatcher.initialize(MyClass.prototype);\r\n\t *\r\n\t * Add an event (see {{#crossLink \"EventDispatcher/addEventListener\"}}{{/crossLink}}).\r\n\t *\r\n\t *      instance.addEventListener(\"eventName\", handlerMethod);\r\n\t *      function handlerMethod(event) {\r\n\t *          console.log(event.target + \" Was Clicked\");\r\n\t *      }\r\n\t *\r\n\t * <b>Maintaining proper scope</b><br />\r\n\t * Scope (ie. \"this\") can be be a challenge with events. Using the {{#crossLink \"EventDispatcher/on\"}}{{/crossLink}}\r\n\t * method to subscribe to events simplifies this.\r\n\t *\r\n\t *      instance.addEventListener(\"click\", function(event) {\r\n\t *          console.log(instance == this); // false, scope is ambiguous.\r\n\t *      });\r\n\t *      \r\n\t *      instance.on(\"click\", function(event) {\r\n\t *          console.log(instance == this); // true, \"on\" uses dispatcher scope by default.\r\n\t *      });\r\n\t * \r\n\t * If you want to use addEventListener instead, you may want to use function.bind() or a similar proxy to manage\r\n\t * scope.\r\n\t *\r\n\t * <b>Browser support</b>\r\n\t * The event model in CreateJS can be used separately from the suite in any project, however the inheritance model\r\n\t * requires modern browsers (IE9+).\r\n\t *      \r\n\t *\r\n\t * @class EventDispatcher\r\n\t * @constructor\r\n\t **/\r\n\tfunction EventDispatcher() {\r\n\t\r\n\t\r\n\t// private properties:\r\n\t\t/**\r\n\t\t * @protected\r\n\t\t * @property _listeners\r\n\t\t * @type Object\r\n\t\t **/\r\n\t\tthis._listeners = null;\r\n\t\t\r\n\t\t/**\r\n\t\t * @protected\r\n\t\t * @property _captureListeners\r\n\t\t * @type Object\r\n\t\t **/\r\n\t\tthis._captureListeners = null;\r\n\t}\r\n\tvar p = EventDispatcher.prototype;\r\n\r\n// static public methods:\r\n\t/**\r\n\t * Static initializer to mix EventDispatcher methods into a target object or prototype.\r\n\t * \r\n\t * \t\tEventDispatcher.initialize(MyClass.prototype); // add to the prototype of the class\r\n\t * \t\tEventDispatcher.initialize(myObject); // add to a specific instance\r\n\t * \r\n\t * @method initialize\r\n\t * @static\r\n\t * @param {Object} target The target object to inject EventDispatcher methods into. This can be an instance or a\r\n\t * prototype.\r\n\t **/\r\n\tEventDispatcher.initialize = function(target) {\r\n\t\ttarget.addEventListener = p.addEventListener;\r\n\t\ttarget.on = p.on;\r\n\t\ttarget.removeEventListener = target.off =  p.removeEventListener;\r\n\t\ttarget.removeAllEventListeners = p.removeAllEventListeners;\r\n\t\ttarget.hasEventListener = p.hasEventListener;\r\n\t\ttarget.dispatchEvent = p.dispatchEvent;\r\n\t\ttarget._dispatchEvent = p._dispatchEvent;\r\n\t\ttarget.willTrigger = p.willTrigger;\r\n\t};\r\n\t\r\n\r\n// public methods:\r\n\t/**\r\n\t * Adds the specified event listener. Note that adding multiple listeners to the same function will result in\r\n\t * multiple callbacks getting fired.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      displayObject.addEventListener(\"click\", handleClick);\r\n\t *      function handleClick(event) {\r\n\t *         // Click happened.\r\n\t *      }\r\n\t *\r\n\t * @method addEventListener\r\n\t * @param {String} type The string type of the event.\r\n\t * @param {Function | Object} listener An object with a handleEvent method, or a function that will be called when\r\n\t * the event is dispatched.\r\n\t * @param {Boolean} [useCapture] For events that bubble, indicates whether to listen for the event in the capture or bubbling/target phase.\r\n\t * @return {Function | Object} Returns the listener for chaining or assignment.\r\n\t **/\r\n\tp.addEventListener = function(type, listener, useCapture) {\r\n\t\tvar listeners;\r\n\t\tif (useCapture) {\r\n\t\t\tlisteners = this._captureListeners = this._captureListeners||{};\r\n\t\t} else {\r\n\t\t\tlisteners = this._listeners = this._listeners||{};\r\n\t\t}\r\n\t\tvar arr = listeners[type];\r\n\t\tif (arr) { this.removeEventListener(type, listener, useCapture); }\r\n\t\tarr = listeners[type]; // remove may have deleted the array\r\n\t\tif (!arr) { listeners[type] = [listener];  }\r\n\t\telse { arr.push(listener); }\r\n\t\treturn listener;\r\n\t};\r\n\t\r\n\t/**\r\n\t * A shortcut method for using addEventListener that makes it easier to specify an execution scope, have a listener\r\n\t * only run once, associate arbitrary data with the listener, and remove the listener.\r\n\t * \r\n\t * This method works by creating an anonymous wrapper function and subscribing it with addEventListener.\r\n\t * The wrapper function is returned for use with `removeEventListener` (or `off`).\r\n\t * \r\n\t * <b>IMPORTANT:</b> To remove a listener added with `on`, you must pass in the returned wrapper function as the listener, or use\r\n\t * {{#crossLink \"Event/remove\"}}{{/crossLink}}. Likewise, each time you call `on` a NEW wrapper function is subscribed, so multiple calls\r\n\t * to `on` with the same params will create multiple listeners.\r\n\t * \r\n\t * <h4>Example</h4>\r\n\t * \r\n\t * \t\tvar listener = myBtn.on(\"click\", handleClick, null, false, {count:3});\r\n\t * \t\tfunction handleClick(evt, data) {\r\n\t * \t\t\tdata.count -= 1;\r\n\t * \t\t\tconsole.log(this == myBtn); // true - scope defaults to the dispatcher\r\n\t * \t\t\tif (data.count == 0) {\r\n\t * \t\t\t\talert(\"clicked 3 times!\");\r\n\t * \t\t\t\tmyBtn.off(\"click\", listener);\r\n\t * \t\t\t\t// alternately: evt.remove();\r\n\t * \t\t\t}\r\n\t * \t\t}\r\n\t * \r\n\t * @method on\r\n\t * @param {String} type The string type of the event.\r\n\t * @param {Function | Object} listener An object with a handleEvent method, or a function that will be called when\r\n\t * the event is dispatched.\r\n\t * @param {Object} [scope] The scope to execute the listener in. Defaults to the dispatcher/currentTarget for function listeners, and to the listener itself for object listeners (ie. using handleEvent).\r\n\t * @param {Boolean} [once=false] If true, the listener will remove itself after the first time it is triggered.\r\n\t * @param {*} [data] Arbitrary data that will be included as the second parameter when the listener is called.\r\n\t * @param {Boolean} [useCapture=false] For events that bubble, indicates whether to listen for the event in the capture or bubbling/target phase.\r\n\t * @return {Function} Returns the anonymous function that was created and assigned as the listener. This is needed to remove the listener later using .removeEventListener.\r\n\t **/\r\n\tp.on = function(type, listener, scope, once, data, useCapture) {\r\n\t\tif (listener.handleEvent) {\r\n\t\t\tscope = scope||listener;\r\n\t\t\tlistener = listener.handleEvent;\r\n\t\t}\r\n\t\tscope = scope||this;\r\n\t\treturn this.addEventListener(type, function(evt) {\r\n\t\t\t\tlistener.call(scope, evt, data);\r\n\t\t\t\tonce&&evt.remove();\r\n\t\t\t}, useCapture);\r\n\t};\r\n\r\n\t/**\r\n\t * Removes the specified event listener.\r\n\t *\r\n\t * <b>Important Note:</b> that you must pass the exact function reference used when the event was added. If a proxy\r\n\t * function, or function closure is used as the callback, the proxy/closure reference must be used - a new proxy or\r\n\t * closure will not work.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      displayObject.removeEventListener(\"click\", handleClick);\r\n\t *\r\n\t * @method removeEventListener\r\n\t * @param {String} type The string type of the event.\r\n\t * @param {Function | Object} listener The listener function or object.\r\n\t * @param {Boolean} [useCapture] For events that bubble, indicates whether to listen for the event in the capture or bubbling/target phase.\r\n\t **/\r\n\tp.removeEventListener = function(type, listener, useCapture) {\r\n\t\tvar listeners = useCapture ? this._captureListeners : this._listeners;\r\n\t\tif (!listeners) { return; }\r\n\t\tvar arr = listeners[type];\r\n\t\tif (!arr) { return; }\r\n\t\tfor (var i=0,l=arr.length; i<l; i++) {\r\n\t\t\tif (arr[i] == listener) {\r\n\t\t\t\tif (l==1) { delete(listeners[type]); } // allows for faster checks.\r\n\t\t\t\telse { arr.splice(i,1); }\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\t\r\n\t/**\r\n\t * A shortcut to the removeEventListener method, with the same parameters and return value. This is a companion to the\r\n\t * .on method.\r\n\t * \r\n\t * <b>IMPORTANT:</b> To remove a listener added with `on`, you must pass in the returned wrapper function as the listener. See \r\n\t * {{#crossLink \"EventDispatcher/on\"}}{{/crossLink}} for an example.\r\n\t *\r\n\t * @method off\r\n\t * @param {String} type The string type of the event.\r\n\t * @param {Function | Object} listener The listener function or object.\r\n\t * @param {Boolean} [useCapture] For events that bubble, indicates whether to listen for the event in the capture or bubbling/target phase.\r\n\t **/\r\n\tp.off = p.removeEventListener;\r\n\r\n\t/**\r\n\t * Removes all listeners for the specified type, or all listeners of all types.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      // Remove all listeners\r\n\t *      displayObject.removeAllEventListeners();\r\n\t *\r\n\t *      // Remove all click listeners\r\n\t *      displayObject.removeAllEventListeners(\"click\");\r\n\t *\r\n\t * @method removeAllEventListeners\r\n\t * @param {String} [type] The string type of the event. If omitted, all listeners for all types will be removed.\r\n\t **/\r\n\tp.removeAllEventListeners = function(type) {\r\n\t\tif (!type) { this._listeners = this._captureListeners = null; }\r\n\t\telse {\r\n\t\t\tif (this._listeners) { delete(this._listeners[type]); }\r\n\t\t\tif (this._captureListeners) { delete(this._captureListeners[type]); }\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Dispatches the specified event to all listeners.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      // Use a string event\r\n\t *      this.dispatchEvent(\"complete\");\r\n\t *\r\n\t *      // Use an Event instance\r\n\t *      var event = new createjs.Event(\"progress\");\r\n\t *      this.dispatchEvent(event);\r\n\t *\r\n\t * @method dispatchEvent\r\n\t * @param {Object | String | Event} eventObj An object with a \"type\" property, or a string type.\r\n\t * While a generic object will work, it is recommended to use a CreateJS Event instance. If a string is used,\r\n\t * dispatchEvent will construct an Event instance if necessary with the specified type. This latter approach can\r\n\t * be used to avoid event object instantiation for non-bubbling events that may not have any listeners.\r\n\t * @param {Boolean} [bubbles] Specifies the `bubbles` value when a string was passed to eventObj.\r\n\t * @param {Boolean} [cancelable] Specifies the `cancelable` value when a string was passed to eventObj.\r\n\t * @return {Boolean} Returns false if `preventDefault()` was called on a cancelable event, true otherwise.\r\n\t **/\r\n\tp.dispatchEvent = function(eventObj, bubbles, cancelable) {\r\n\t\tif (typeof eventObj == \"string\") {\r\n\t\t\t// skip everything if there's no listeners and it doesn't bubble:\r\n\t\t\tvar listeners = this._listeners;\r\n\t\t\tif (!bubbles && (!listeners || !listeners[eventObj])) { return true; }\r\n\t\t\teventObj = new createjs.Event(eventObj, bubbles, cancelable);\r\n\t\t} else if (eventObj.target && eventObj.clone) {\r\n\t\t\t// redispatching an active event object, so clone it:\r\n\t\t\teventObj = eventObj.clone();\r\n\t\t}\r\n\t\t\r\n\t\t// TODO: it would be nice to eliminate this. Maybe in favour of evtObj instanceof Event? Or !!evtObj.createEvent\r\n\t\ttry { eventObj.target = this; } catch (e) {} // try/catch allows redispatching of native events\r\n\r\n\t\tif (!eventObj.bubbles || !this.parent) {\r\n\t\t\tthis._dispatchEvent(eventObj, 2);\r\n\t\t} else {\r\n\t\t\tvar top=this, list=[top];\r\n\t\t\twhile (top.parent) { list.push(top = top.parent); }\r\n\t\t\tvar i, l=list.length;\r\n\r\n\t\t\t// capture & atTarget\r\n\t\t\tfor (i=l-1; i>=0 && !eventObj.propagationStopped; i--) {\r\n\t\t\t\tlist[i]._dispatchEvent(eventObj, 1+(i==0));\r\n\t\t\t}\r\n\t\t\t// bubbling\r\n\t\t\tfor (i=1; i<l && !eventObj.propagationStopped; i++) {\r\n\t\t\t\tlist[i]._dispatchEvent(eventObj, 3);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn !eventObj.defaultPrevented;\r\n\t};\r\n\r\n\t/**\r\n\t * Indicates whether there is at least one listener for the specified event type.\r\n\t * @method hasEventListener\r\n\t * @param {String} type The string type of the event.\r\n\t * @return {Boolean} Returns true if there is at least one listener for the specified event.\r\n\t **/\r\n\tp.hasEventListener = function(type) {\r\n\t\tvar listeners = this._listeners, captureListeners = this._captureListeners;\r\n\t\treturn !!((listeners && listeners[type]) || (captureListeners && captureListeners[type]));\r\n\t};\r\n\t\r\n\t/**\r\n\t * Indicates whether there is at least one listener for the specified event type on this object or any of its\r\n\t * ancestors (parent, parent's parent, etc). A return value of true indicates that if a bubbling event of the\r\n\t * specified type is dispatched from this object, it will trigger at least one listener.\r\n\t * \r\n\t * This is similar to {{#crossLink \"EventDispatcher/hasEventListener\"}}{{/crossLink}}, but it searches the entire\r\n\t * event flow for a listener, not just this object.\r\n\t * @method willTrigger\r\n\t * @param {String} type The string type of the event.\r\n\t * @return {Boolean} Returns `true` if there is at least one listener for the specified event.\r\n\t **/\r\n\tp.willTrigger = function(type) {\r\n\t\tvar o = this;\r\n\t\twhile (o) {\r\n\t\t\tif (o.hasEventListener(type)) { return true; }\r\n\t\t\to = o.parent;\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\r\n\t/**\r\n\t * @method toString\r\n\t * @return {String} a string representation of the instance.\r\n\t **/\r\n\tp.toString = function() {\r\n\t\treturn \"[EventDispatcher]\";\r\n\t};\r\n\r\n\r\n// private methods:\r\n\t/**\r\n\t * @method _dispatchEvent\r\n\t * @param {Object | Event} eventObj\r\n\t * @param {Object} eventPhase\r\n\t * @protected\r\n\t **/\r\n\tp._dispatchEvent = function(eventObj, eventPhase) {\r\n\t\tvar l, arr, listeners = (eventPhase <= 2) ? this._captureListeners : this._listeners;\r\n\t\tif (eventObj && listeners && (arr = listeners[eventObj.type]) && (l=arr.length)) {\r\n\t\t\ttry { eventObj.currentTarget = this; } catch (e) {}\r\n\t\t\ttry { eventObj.eventPhase = eventPhase|0; } catch (e) {}\r\n\t\t\teventObj.removed = false;\r\n\t\t\t\r\n\t\t\tarr = arr.slice(); // to avoid issues with items being removed or added during the dispatch\r\n\t\t\tfor (var i=0; i<l && !eventObj.immediatePropagationStopped; i++) {\r\n\t\t\t\tvar o = arr[i];\r\n\t\t\t\tif (o.handleEvent) { o.handleEvent(eventObj); }\r\n\t\t\t\telse { o(eventObj); }\r\n\t\t\t\tif (eventObj.removed) {\r\n\t\t\t\t\tthis.off(eventObj.type, o, eventPhase==1);\r\n\t\t\t\t\teventObj.removed = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (eventPhase === 2) { this._dispatchEvent(eventObj, 2.1); }\r\n\t};\r\n\r\n\r\n\tcreatejs.EventDispatcher = EventDispatcher;\r\n}());\n\n//##############################################################################\n// Ticker.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * The Ticker provides a centralized tick or heartbeat broadcast at a set interval. Listeners can subscribe to the tick\n\t * event to be notified when a set time interval has elapsed.\n\t *\n\t * Note that the interval that the tick event is called is a target interval, and may be broadcast at a slower interval\n\t * when under high CPU load. The Ticker class uses a static interface (ex. `Ticker.framerate = 30;`) and\n\t * can not be instantiated.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      createjs.Ticker.addEventListener(\"tick\", handleTick);\n\t *      function handleTick(event) {\n\t *          // Actions carried out each tick (aka frame)\n\t *          if (!event.paused) {\n\t *              // Actions carried out when the Ticker is not paused.\n\t *          }\n\t *      }\n\t *\n\t * @class Ticker\n\t * @uses EventDispatcher\n\t * @static\n\t **/\n\tfunction Ticker() {\n\t\tthrow \"Ticker cannot be instantiated.\";\n\t}\n\n\n// constants:\n\t/**\n\t * In this mode, Ticker uses the requestAnimationFrame API, but attempts to synch the ticks to target framerate. It\n\t * uses a simple heuristic that compares the time of the RAF return to the target time for the current frame and\n\t * dispatches the tick when the time is within a certain threshold.\n\t *\n\t * This mode has a higher variance for time between frames than {{#crossLink \"Ticker/TIMEOUT:property\"}}{{/crossLink}},\n\t * but does not require that content be time based as with {{#crossLink \"Ticker/RAF:property\"}}{{/crossLink}} while\n\t * gaining the benefits of that API (screen synch, background throttling).\n\t *\n\t * Variance is usually lowest for framerates that are a divisor of the RAF frequency. This is usually 60, so\n\t * framerates of 10, 12, 15, 20, and 30 work well.\n\t *\n\t * Falls back to {{#crossLink \"Ticker/TIMEOUT:property\"}}{{/crossLink}} if the requestAnimationFrame API is not\n\t * supported.\n\t * @property RAF_SYNCHED\n\t * @static\n\t * @type {String}\n\t * @default \"synched\"\n\t * @readonly\n\t **/\n\tTicker.RAF_SYNCHED = \"synched\";\n\n\t/**\n\t * In this mode, Ticker passes through the requestAnimationFrame heartbeat, ignoring the target framerate completely.\n\t * Because requestAnimationFrame frequency is not deterministic, any content using this mode should be time based.\n\t * You can leverage {{#crossLink \"Ticker/getTime\"}}{{/crossLink}} and the {{#crossLink \"Ticker/tick:event\"}}{{/crossLink}}\n\t * event object's \"delta\" properties to make this easier.\n\t *\n\t * Falls back on {{#crossLink \"Ticker/TIMEOUT:property\"}}{{/crossLink}} if the requestAnimationFrame API is not\n\t * supported.\n\t * @property RAF\n\t * @static\n\t * @type {String}\n\t * @default \"raf\"\n\t * @readonly\n\t **/\n\tTicker.RAF = \"raf\";\n\n\t/**\n\t * In this mode, Ticker uses the setTimeout API. This provides predictable, adaptive frame timing, but does not\n\t * provide the benefits of requestAnimationFrame (screen synch, background throttling).\n\t * @property TIMEOUT\n\t * @static\n\t * @type {String}\n\t * @default \"timeout\"\n\t * @readonly\n\t **/\n\tTicker.TIMEOUT = \"timeout\";\n\n\n// static events:\n\t/**\n\t * Dispatched each tick. The event will be dispatched to each listener even when the Ticker has been paused using\n\t * {{#crossLink \"Ticker/paused:property\"}}{{/crossLink}}.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      createjs.Ticker.addEventListener(\"tick\", handleTick);\n\t *      function handleTick(event) {\n\t *          console.log(\"Paused:\", event.paused, event.delta);\n\t *      }\n\t *\n\t * @event tick\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type.\n\t * @param {Boolean} paused Indicates whether the ticker is currently paused.\n\t * @param {Number} delta The time elapsed in ms since the last tick.\n\t * @param {Number} time The total time in ms since Ticker was initialized.\n\t * @param {Number} runTime The total time in ms that Ticker was not paused since it was initialized. For example,\n\t * \tyou could determine the amount of time that the Ticker has been paused since initialization with `time-runTime`.\n\t * @since 0.6.0\n\t */\n\n\n// public static properties:\n\t/**\n\t * Specifies the timing api (setTimeout or requestAnimationFrame) and mode to use. See\n\t * {{#crossLink \"Ticker/TIMEOUT:property\"}}{{/crossLink}}, {{#crossLink \"Ticker/RAF:property\"}}{{/crossLink}}, and\n\t * {{#crossLink \"Ticker/RAF_SYNCHED:property\"}}{{/crossLink}} for mode details.\n\t * @property timingMode\n\t * @static\n\t * @type {String}\n\t * @default Ticker.TIMEOUT\n\t **/\n\tTicker.timingMode = null;\n\n\t/**\n\t * Specifies a maximum value for the delta property in the tick event object. This is useful when building time\n\t * based animations and systems to prevent issues caused by large time gaps caused by background tabs, system sleep,\n\t * alert dialogs, or other blocking routines. Double the expected frame duration is often an effective value\n\t * (ex. maxDelta=50 when running at 40fps).\n\t * \n\t * This does not impact any other values (ex. time, runTime, etc), so you may experience issues if you enable maxDelta\n\t * when using both delta and other values.\n\t * \n\t * If 0, there is no maximum.\n\t * @property maxDelta\n\t * @static\n\t * @type {number}\n\t * @default 0\n\t */\n\tTicker.maxDelta = 0;\n\t\n\t/**\n\t * When the ticker is paused, all listeners will still receive a tick event, but the <code>paused</code> property\n\t * of the event will be `true`. Also, while paused the `runTime` will not increase. See {{#crossLink \"Ticker/tick:event\"}}{{/crossLink}},\n\t * {{#crossLink \"Ticker/getTime\"}}{{/crossLink}}, and {{#crossLink \"Ticker/getEventTime\"}}{{/crossLink}} for more\n\t * info.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      createjs.Ticker.addEventListener(\"tick\", handleTick);\n\t *      createjs.Ticker.paused = true;\n\t *      function handleTick(event) {\n\t *          console.log(event.paused,\n\t *          \tcreatejs.Ticker.getTime(false),\n\t *          \tcreatejs.Ticker.getTime(true));\n\t *      }\n\t *\n\t * @property paused\n\t * @static\n\t * @type {Boolean}\n\t * @default false\n\t **/\n\tTicker.paused = false;\n\n\n// mix-ins:\n\t// EventDispatcher methods:\n\tTicker.removeEventListener = null;\n\tTicker.removeAllEventListeners = null;\n\tTicker.dispatchEvent = null;\n\tTicker.hasEventListener = null;\n\tTicker._listeners = null;\n\tcreatejs.EventDispatcher.initialize(Ticker); // inject EventDispatcher methods.\n\tTicker._addEventListener = Ticker.addEventListener;\n\tTicker.addEventListener = function() {\n\t\t!Ticker._inited&&Ticker.init();\n\t\treturn Ticker._addEventListener.apply(Ticker, arguments);\n\t};\n\n\n// private static properties:\n\t/**\n\t * @property _inited\n\t * @static\n\t * @type {Boolean}\n\t * @private\n\t **/\n\tTicker._inited = false;\n\n\t/**\n\t * @property _startTime\n\t * @static\n\t * @type {Number}\n\t * @private\n\t **/\n\tTicker._startTime = 0;\n\n\t/**\n\t * @property _pausedTime\n\t * @static\n\t * @type {Number}\n\t * @private\n\t **/\n\tTicker._pausedTime=0;\n\n\t/**\n\t * The number of ticks that have passed\n\t * @property _ticks\n\t * @static\n\t * @type {Number}\n\t * @private\n\t **/\n\tTicker._ticks = 0;\n\n\t/**\n\t * The number of ticks that have passed while Ticker has been paused\n\t * @property _pausedTicks\n\t * @static\n\t * @type {Number}\n\t * @private\n\t **/\n\tTicker._pausedTicks = 0;\n\n\t/**\n\t * @property _interval\n\t * @static\n\t * @type {Number}\n\t * @private\n\t **/\n\tTicker._interval = 50;\n\n\t/**\n\t * @property _lastTime\n\t * @static\n\t * @type {Number}\n\t * @private\n\t **/\n\tTicker._lastTime = 0;\n\n\t/**\n\t * @property _times\n\t * @static\n\t * @type {Array}\n\t * @private\n\t **/\n\tTicker._times = null;\n\n\t/**\n\t * @property _tickTimes\n\t * @static\n\t * @type {Array}\n\t * @private\n\t **/\n\tTicker._tickTimes = null;\n\n\t/**\n\t * Stores the timeout or requestAnimationFrame id.\n\t * @property _timerId\n\t * @static\n\t * @type {Number}\n\t * @private\n\t **/\n\tTicker._timerId = null;\n\t\n\t/**\n\t * True if currently using requestAnimationFrame, false if using setTimeout. This may be different than timingMode\n\t * if that property changed and a tick hasn't fired.\n\t * @property _raf\n\t * @static\n\t * @type {Boolean}\n\t * @private\n\t **/\n\tTicker._raf = true;\n\t\n\n// static getter / setters:\n\t/**\n\t * Use the {{#crossLink \"Ticker/interval:property\"}}{{/crossLink}} property instead.\n\t * @method _setInterval\n\t * @private\n\t * @static\n\t * @param {Number} interval\n\t **/\n\tTicker._setInterval = function(interval) {\n\t\tTicker._interval = interval;\n\t\tif (!Ticker._inited) { return; }\n\t\tTicker._setupTick();\n\t};\n\t// Ticker.setInterval is @deprecated. Remove for 1.1+\n\tTicker.setInterval = createjs.deprecate(Ticker._setInterval, \"Ticker.setInterval\");\n\n\t/**\n\t * Use the {{#crossLink \"Ticker/interval:property\"}}{{/crossLink}} property instead.\n\t * @method _getInterval\n\t * @private\n\t * @static\n\t * @return {Number}\n\t **/\n\tTicker._getInterval = function() {\n\t\treturn Ticker._interval;\n\t};\n\t// Ticker.getInterval is @deprecated. Remove for 1.1+\n\tTicker.getInterval = createjs.deprecate(Ticker._getInterval, \"Ticker.getInterval\");\n\n\t/**\n\t * Use the {{#crossLink \"Ticker/framerate:property\"}}{{/crossLink}} property instead.\n\t * @method _setFPS\n\t * @private\n\t * @static\n\t * @param {Number} value\n\t **/\n\tTicker._setFPS = function(value) {\n\t\tTicker._setInterval(1000/value);\n\t};\n\t// Ticker.setFPS is @deprecated. Remove for 1.1+\n\tTicker.setFPS = createjs.deprecate(Ticker._setFPS, \"Ticker.setFPS\");\n\n\t/**\n\t * Use the {{#crossLink \"Ticker/framerate:property\"}}{{/crossLink}} property instead.\n\t * @method _getFPS\n\t * @static\n\t * @private\n\t * @return {Number}\n\t **/\n\tTicker._getFPS = function() {\n\t\treturn 1000/Ticker._interval;\n\t};\n\t// Ticker.getFPS is @deprecated. Remove for 1.1+\n\tTicker.getFPS = createjs.deprecate(Ticker._getFPS, \"Ticker.getFPS\");\n\n\t/**\n\t * Indicates the target time (in milliseconds) between ticks. Default is 50 (20 FPS).\n\t * Note that actual time between ticks may be more than specified depending on CPU load.\n\t * This property is ignored if the ticker is using the `RAF` timing mode.\n\t * @property interval\n\t * @static\n\t * @type {Number}\n\t **/\n\t \n\t/**\n\t * Indicates the target frame rate in frames per second (FPS). Effectively just a shortcut to `interval`, where\n\t * `framerate == 1000/interval`.\n\t * @property framerate\n\t * @static\n\t * @type {Number}\n\t **/\n\ttry {\n\t\tObject.defineProperties(Ticker, {\n\t\t\tinterval: { get: Ticker._getInterval, set: Ticker._setInterval },\n\t\t\tframerate: { get: Ticker._getFPS, set: Ticker._setFPS }\n\t\t});\n\t} catch (e) { console.log(e); }\n\n\n// public static methods:\n\t/**\n\t * Starts the tick. This is called automatically when the first listener is added.\n\t * @method init\n\t * @static\n\t **/\n\tTicker.init = function() {\n\t\tif (Ticker._inited) { return; }\n\t\tTicker._inited = true;\n\t\tTicker._times = [];\n\t\tTicker._tickTimes = [];\n\t\tTicker._startTime = Ticker._getTime();\n\t\tTicker._times.push(Ticker._lastTime = 0);\n\t\tTicker.interval = Ticker._interval;\n\t};\n\t\n\t/**\n\t * Stops the Ticker and removes all listeners. Use init() to restart the Ticker.\n\t * @method reset\n\t * @static\n\t **/\n\tTicker.reset = function() {\n\t\tif (Ticker._raf) {\n\t\t\tvar f = window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || window.oCancelAnimationFrame || window.msCancelAnimationFrame;\n\t\t\tf&&f(Ticker._timerId);\n\t\t} else {\n\t\t\tclearTimeout(Ticker._timerId);\n\t\t}\n\t\tTicker.removeAllEventListeners(\"tick\");\n\t\tTicker._timerId = Ticker._times = Ticker._tickTimes = null;\n\t\tTicker._startTime = Ticker._lastTime = Ticker._ticks = Ticker._pausedTime = 0;\n\t\tTicker._inited = false;\n\t};\n\n\t/**\n\t * Returns the average time spent within a tick. This can vary significantly from the value provided by getMeasuredFPS\n\t * because it only measures the time spent within the tick execution stack. \n\t * \n\t * Example 1: With a target FPS of 20, getMeasuredFPS() returns 20fps, which indicates an average of 50ms between \n\t * the end of one tick and the end of the next. However, getMeasuredTickTime() returns 15ms. This indicates that \n\t * there may be up to 35ms of \"idle\" time between the end of one tick and the start of the next.\n\t *\n\t * Example 2: With a target FPS of 30, {{#crossLink \"Ticker/framerate:property\"}}{{/crossLink}} returns 10fps, which\n\t * indicates an average of 100ms between the end of one tick and the end of the next. However, {{#crossLink \"Ticker/getMeasuredTickTime\"}}{{/crossLink}}\n\t * returns 20ms. This would indicate that something other than the tick is using ~80ms (another script, DOM\n\t * rendering, etc).\n\t * @method getMeasuredTickTime\n\t * @static\n\t * @param {Number} [ticks] The number of previous ticks over which to measure the average time spent in a tick.\n\t * Defaults to the number of ticks per second. To get only the last tick's time, pass in 1.\n\t * @return {Number} The average time spent in a tick in milliseconds.\n\t **/\n\tTicker.getMeasuredTickTime = function(ticks) {\n\t\tvar ttl=0, times=Ticker._tickTimes;\n\t\tif (!times || times.length < 1) { return -1; }\n\n\t\t// by default, calculate average for the past ~1 second:\n\t\tticks = Math.min(times.length, ticks||(Ticker._getFPS()|0));\n\t\tfor (var i=0; i<ticks; i++) { ttl += times[i]; }\n\t\treturn ttl/ticks;\n\t};\n\n\t/**\n\t * Returns the actual frames / ticks per second.\n\t * @method getMeasuredFPS\n\t * @static\n\t * @param {Number} [ticks] The number of previous ticks over which to measure the actual frames / ticks per second.\n\t * Defaults to the number of ticks per second.\n\t * @return {Number} The actual frames / ticks per second. Depending on performance, this may differ\n\t * from the target frames per second.\n\t **/\n\tTicker.getMeasuredFPS = function(ticks) {\n\t\tvar times = Ticker._times;\n\t\tif (!times || times.length < 2) { return -1; }\n\n\t\t// by default, calculate fps for the past ~1 second:\n\t\tticks = Math.min(times.length-1, ticks||(Ticker._getFPS()|0));\n\t\treturn 1000/((times[0]-times[ticks])/ticks);\n\t};\n\n\t/**\n\t * Returns the number of milliseconds that have elapsed since Ticker was initialized via {{#crossLink \"Ticker/init\"}}.\n\t * Returns -1 if Ticker has not been initialized. For example, you could use\n\t * this in a time synchronized animation to determine the exact amount of time that has elapsed.\n\t * @method getTime\n\t * @static\n\t * @param {Boolean} [runTime=false] If true only time elapsed while Ticker was not paused will be returned.\n\t * If false, the value returned will be total time elapsed since the first tick event listener was added.\n\t * @return {Number} Number of milliseconds that have elapsed since Ticker was initialized or -1.\n\t **/\n\tTicker.getTime = function(runTime) {\n\t\treturn Ticker._startTime ? Ticker._getTime() - (runTime ? Ticker._pausedTime : 0) : -1;\n\t};\n\n\t/**\n\t * Similar to the {{#crossLink \"Ticker/getTime\"}}{{/crossLink}} method, but returns the time on the most recent {{#crossLink \"Ticker/tick:event\"}}{{/crossLink}}\n\t * event object.\n\t * @method getEventTime\n\t * @static\n\t * @param runTime {Boolean} [runTime=false] If true, the runTime property will be returned instead of time.\n\t * @returns {number} The time or runTime property from the most recent tick event or -1.\n\t */\n\tTicker.getEventTime = function(runTime) {\n\t\treturn Ticker._startTime ? (Ticker._lastTime || Ticker._startTime) - (runTime ? Ticker._pausedTime : 0) : -1;\n\t};\n\t\n\t/**\n\t * Returns the number of ticks that have been broadcast by Ticker.\n\t * @method getTicks\n\t * @static\n\t * @param {Boolean} pauseable Indicates whether to include ticks that would have been broadcast\n\t * while Ticker was paused. If true only tick events broadcast while Ticker is not paused will be returned.\n\t * If false, tick events that would have been broadcast while Ticker was paused will be included in the return\n\t * value. The default value is false.\n\t * @return {Number} of ticks that have been broadcast.\n\t **/\n\tTicker.getTicks = function(pauseable) {\n\t\treturn  Ticker._ticks - (pauseable ? Ticker._pausedTicks : 0);\n\t};\n\n\n// private static methods:\n\t/**\n\t * @method _handleSynch\n\t * @static\n\t * @private\n\t **/\n\tTicker._handleSynch = function() {\n\t\tTicker._timerId = null;\n\t\tTicker._setupTick();\n\n\t\t// run if enough time has elapsed, with a little bit of flexibility to be early:\n\t\tif (Ticker._getTime() - Ticker._lastTime >= (Ticker._interval-1)*0.97) {\n\t\t\tTicker._tick();\n\t\t}\n\t};\n\n\t/**\n\t * @method _handleRAF\n\t * @static\n\t * @private\n\t **/\n\tTicker._handleRAF = function() {\n\t\tTicker._timerId = null;\n\t\tTicker._setupTick();\n\t\tTicker._tick();\n\t};\n\n\t/**\n\t * @method _handleTimeout\n\t * @static\n\t * @private\n\t **/\n\tTicker._handleTimeout = function() {\n\t\tTicker._timerId = null;\n\t\tTicker._setupTick();\n\t\tTicker._tick();\n\t};\n\n\t/**\n\t * @method _setupTick\n\t * @static\n\t * @private\n\t **/\n\tTicker._setupTick = function() {\n\t\tif (Ticker._timerId != null) { return; } // avoid duplicates\n\n\t\tvar mode = Ticker.timingMode;\n\t\tif (mode == Ticker.RAF_SYNCHED || mode == Ticker.RAF) {\n\t\t\tvar f = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame;\n\t\t\tif (f) {\n\t\t\t\tTicker._timerId = f(mode == Ticker.RAF ? Ticker._handleRAF : Ticker._handleSynch);\n\t\t\t\tTicker._raf = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tTicker._raf = false;\n\t\tTicker._timerId = setTimeout(Ticker._handleTimeout, Ticker._interval);\n\t};\n\n\t/**\n\t * @method _tick\n\t * @static\n\t * @private\n\t **/\n\tTicker._tick = function() {\n\t\tvar paused = Ticker.paused;\n\t\tvar time = Ticker._getTime();\n\t\tvar elapsedTime = time-Ticker._lastTime;\n\t\tTicker._lastTime = time;\n\t\tTicker._ticks++;\n\t\t\n\t\tif (paused) {\n\t\t\tTicker._pausedTicks++;\n\t\t\tTicker._pausedTime += elapsedTime;\n\t\t}\n\t\t\n\t\tif (Ticker.hasEventListener(\"tick\")) {\n\t\t\tvar event = new createjs.Event(\"tick\");\n\t\t\tvar maxDelta = Ticker.maxDelta;\n\t\t\tevent.delta = (maxDelta && elapsedTime > maxDelta) ? maxDelta : elapsedTime;\n\t\t\tevent.paused = paused;\n\t\t\tevent.time = time;\n\t\t\tevent.runTime = time-Ticker._pausedTime;\n\t\t\tTicker.dispatchEvent(event);\n\t\t}\n\t\t\n\t\tTicker._tickTimes.unshift(Ticker._getTime()-time);\n\t\twhile (Ticker._tickTimes.length > 100) { Ticker._tickTimes.pop(); }\n\n\t\tTicker._times.unshift(time);\n\t\twhile (Ticker._times.length > 100) { Ticker._times.pop(); }\n\t};\n\n\t/**\n\t * @method _getTime\n\t * @static\n\t * @private\n\t **/\n\tvar w=window, now=w.performance.now || w.performance.mozNow || w.performance.msNow || w.performance.oNow || w.performance.webkitNow;\n\tTicker._getTime = function() {\n\t\treturn ((now&&now.call(w.performance))||(new Date().getTime())) - Ticker._startTime;\n\t};\n\n\n\tcreatejs.Ticker = Ticker;\n}());\n\n//##############################################################################\n// VideoBuffer.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * When an HTML video seeks, including when looping, there is an indeterminate period before a new frame is available.\n\t * This can result in the video blinking or flashing when it is drawn to a canvas. The VideoBuffer class resolves\n\t * this issue by drawing each frame to an off-screen canvas and preserving the prior frame during a seek.\n\t * \n\t * \tvar myBuffer = new createjs.VideoBuffer(myVideo);\n\t * \tvar myBitmap = new Bitmap(myBuffer);\n\t * \n\t * @class VideoBuffer\n\t * @param {HTMLVideoElement} video The HTML video element to buffer.\n\t * @constructor\n\t **/\n\tfunction VideoBuffer(video) {\n\t\t\n\t// private properties:\n\t\t/**\n\t\t * Used by Bitmap to determine when the video buffer is ready to be drawn. Not intended for general use.\n\t\t * @property readyState\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t **/\n\t\tthis.readyState = video.readyState;\n\t\t\n\t\t/**\n\t\t * @property _video\n\t\t * @protected\n\t\t * @type {HTMLVideoElement}\n\t\t * @default 0\n\t\t **/\n\t\tthis._video = video;\n\t\t\n\t\t/**\n\t\t * @property _canvas\n\t\t * @protected\n\t\t * @type {HTMLCanvasElement}\n\t\t * @default 0\n\t\t **/\n\t\tthis._canvas = null;\n\t\t\n\t\t/**\n\t\t * @property _lastTime\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default -1\n\t\t **/\n\t\tthis._lastTime = -1;\n\t\t\n\t\tif (this.readyState < 2) { video.addEventListener(\"canplaythrough\", this._videoReady.bind(this)); } //once:true isn't supported everywhere, but its a non-critical optimization here.\n\t}\n\tvar p = VideoBuffer.prototype;\n\t\n\t\n// public methods:\n\t/**\n\t * Gets an HTML canvas element showing the current video frame, or the previous frame if in a seek / loop.\n\t * Primarily for use by {{#crossLink \"Bitmap\"}}{{/crossLink}}.\n\t * @method getImage\n\t **/\n\tp.getImage = function() {\n\t\tif (this.readyState < 2) { return; }\n\t\tvar canvas=this._canvas, video = this._video;\n\t\tif (!canvas) {\n\t\t\tcanvas = this._canvas = createjs.createCanvas?createjs.createCanvas():document.createElement(\"canvas\");\n\t\t\tcanvas.width = video.videoWidth;\n\t\t\tcanvas.height = video.videoHeight;\n\t\t}\n\t\tif (video.readyState >= 2 && video.currentTime !== this._lastTime) {\n\t\t\tvar ctx = canvas.getContext(\"2d\");\n\t\t\tctx.clearRect(0,0,canvas.width,canvas.height);\n\t\t\tctx.drawImage(video,0,0,canvas.width,canvas.height);\n\t\t\tthis._lastTime = video.currentTime;\n\t\t}\n\t\treturn canvas;\n\t};\n\t\n// private methods:\n\t/**\n\t * @method _videoReady\n\t * @protected\n\t **/\n\tp._videoReady = function() {\n\t\tthis.readyState = 2;\n\t};\n\n\n\tcreatejs.VideoBuffer = VideoBuffer;\n}());\n\n//##############################################################################\n// MouseEvent.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Passed as the parameter to all mouse/pointer/touch related events. For a listing of mouse events and their properties,\n\t * see the {{#crossLink \"DisplayObject\"}}{{/crossLink}} and {{#crossLink \"Stage\"}}{{/crossLink}} event listings.\n\t * @class MouseEvent\n\t * @param {String} type The event type.\n\t * @param {Boolean} bubbles Indicates whether the event will bubble through the display list.\n\t * @param {Boolean} cancelable Indicates whether the default behaviour of this event can be cancelled.\n\t * @param {Number} stageX The normalized x position relative to the stage.\n\t * @param {Number} stageY The normalized y position relative to the stage.\n\t * @param {MouseEvent} nativeEvent The native DOM event related to this mouse event.\n\t * @param {Number} pointerID The unique id for the pointer.\n\t * @param {Boolean} primary Indicates whether this is the primary pointer in a multitouch environment.\n\t * @param {Number} rawX The raw x position relative to the stage.\n\t * @param {Number} rawY The raw y position relative to the stage.\n\t * @param {DisplayObject} relatedTarget The secondary target for the event.\n\t * @extends Event\n\t * @constructor\n\t **/\n\tfunction MouseEvent(type, bubbles, cancelable, stageX, stageY, nativeEvent, pointerID, primary, rawX, rawY, relatedTarget) {\n\t\tthis.Event_constructor(type, bubbles, cancelable);\n\t\t\n\t\t\n\t// public properties:\n\t\t/**\n\t\t * The normalized x position on the stage. This will always be within the range 0 to stage width.\n\t\t * @property stageX\n\t\t * @type Number\n\t\t*/\n\t\tthis.stageX = stageX;\n\t\n\t\t/**\n\t\t * The normalized y position on the stage. This will always be within the range 0 to stage height.\n\t\t * @property stageY\n\t\t * @type Number\n\t\t **/\n\t\tthis.stageY = stageY;\n\t\n\t\t/**\n\t\t * The raw x position relative to the stage. Normally this will be the same as the stageX value, unless\n\t\t * stage.mouseMoveOutside is true and the pointer is outside of the stage bounds.\n\t\t * @property rawX\n\t\t * @type Number\n\t\t*/\n\t\tthis.rawX = (rawX==null)?stageX:rawX;\n\t\n\t\t/**\n\t\t * The raw y position relative to the stage. Normally this will be the same as the stageY value, unless\n\t\t * stage.mouseMoveOutside is true and the pointer is outside of the stage bounds.\n\t\t * @property rawY\n\t\t * @type Number\n\t\t*/\n\t\tthis.rawY = (rawY==null)?stageY:rawY;\n\t\n\t\t/**\n\t\t * The native MouseEvent generated by the browser. The properties and API for this\n\t\t * event may differ between browsers. This property will be null if the\n\t\t * EaselJS property was not directly generated from a native MouseEvent.\n\t\t * @property nativeEvent\n\t\t * @type HtmlMouseEvent\n\t\t * @default null\n\t\t **/\n\t\tthis.nativeEvent = nativeEvent;\n\t\n\t\t/**\n\t\t * The unique id for the pointer (touch point or cursor). This will be either -1 for the mouse, or the system\n\t\t * supplied id value.\n\t\t * @property pointerID\n\t\t * @type {Number}\n\t\t */\n\t\tthis.pointerID = pointerID;\n\t\n\t\t/**\n\t\t * Indicates whether this is the primary pointer in a multitouch environment. This will always be true for the mouse.\n\t\t * For touch pointers, the first pointer in the current stack will be considered the primary pointer.\n\t\t * @property primary\n\t\t * @type {Boolean}\n\t\t */\n\t\tthis.primary = !!primary;\n\t\t\n\t\t/**\n\t\t * The secondary target for the event, if applicable. This is used for mouseout/rollout\n\t\t * events to indicate the object that the mouse entered from, mouseover/rollover for the object the mouse exited,\n\t\t * and stagemousedown/stagemouseup events for the object that was the under the cursor, if any.\n\t\t * \n\t\t * Only valid interaction targets will be returned (ie. objects with mouse listeners or a cursor set).\n\t\t * @property relatedTarget\n\t\t * @type {DisplayObject}\n\t\t */\n\t\tthis.relatedTarget = relatedTarget;\n\t}\n\tvar p = createjs.extend(MouseEvent, createjs.Event);\n\n\t// TODO: deprecated\n\t// p.initialize = function() {}; // searchable for devs wondering where it is. REMOVED. See docs for details.\n\t\n\t\n// getter / setters:\n\t/**\n\t * Returns the x position of the mouse in the local coordinate system of the current target (ie. the dispatcher).\n\t * @property localX\n\t * @type {Number}\n\t * @readonly\n\t */\n\tp._get_localX = function() {\n\t\treturn this.currentTarget.globalToLocal(this.rawX, this.rawY).x;\n\t};\n\t\n\t/**\n\t * Returns the y position of the mouse in the local coordinate system of the current target (ie. the dispatcher).\n\t * @property localY\n\t * @type {Number}\n\t * @readonly\n\t */\n\tp._get_localY = function() {\n\t\treturn this.currentTarget.globalToLocal(this.rawX, this.rawY).y;\n\t};\n\t\n\t/**\n\t * Indicates whether the event was generated by a touch input (versus a mouse input).\n\t * @property isTouch\n\t * @type {Boolean}\n\t * @readonly\n\t */\n\tp._get_isTouch = function() {\n\t\treturn this.pointerID !== -1;\n\t};\n\t\n\t\n\ttry {\n\t\tObject.defineProperties(p, {\n\t\t\tlocalX: { get: p._get_localX },\n\t\t\tlocalY: { get: p._get_localY },\n\t\t\tisTouch: { get: p._get_isTouch }\n\t\t});\n\t} catch (e) {} // TODO: use Log\n\n\n// public methods:\n\t/**\n\t * Returns a clone of the MouseEvent instance.\n\t * @method clone\n\t * @return {MouseEvent} a clone of the MouseEvent instance.\n\t **/\n\tp.clone = function() {\n\t\treturn new MouseEvent(this.type, this.bubbles, this.cancelable, this.stageX, this.stageY, this.nativeEvent, this.pointerID, this.primary, this.rawX, this.rawY);\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[MouseEvent (type=\"+this.type+\" stageX=\"+this.stageX+\" stageY=\"+this.stageY+\")]\";\n\t};\n\n\n\tcreatejs.MouseEvent = createjs.promote(MouseEvent, \"Event\");\n}());\n\n//##############################################################################\n// Matrix2D.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Represents an affine transformation matrix, and provides tools for constructing and concatenating matrices.\n\t *\n\t * This matrix can be visualized as:\n\t *\n\t * \t[ a  c  tx\n\t * \t  b  d  ty\n\t * \t  0  0  1  ]\n\t *\n\t * Note the locations of b and c.\n\t *\n\t * @class Matrix2D\n\t * @param {Number} [a=1] Specifies the a property for the new matrix.\n\t * @param {Number} [b=0] Specifies the b property for the new matrix.\n\t * @param {Number} [c=0] Specifies the c property for the new matrix.\n\t * @param {Number} [d=1] Specifies the d property for the new matrix.\n\t * @param {Number} [tx=0] Specifies the tx property for the new matrix.\n\t * @param {Number} [ty=0] Specifies the ty property for the new matrix.\n\t * @constructor\n\t **/\n\tfunction Matrix2D(a, b, c, d, tx, ty) {\n\t\tthis.setValues(a,b,c,d,tx,ty);\n\t\t\n\t// public properties:\n\t\t// assigned in the setValues method.\n\t\t/**\n\t\t * Position (0, 0) in a 3x3 affine transformation matrix.\n\t\t * @property a\n\t\t * @type Number\n\t\t **/\n\t\n\t\t/**\n\t\t * Position (0, 1) in a 3x3 affine transformation matrix.\n\t\t * @property b\n\t\t * @type Number\n\t\t **/\n\t\n\t\t/**\n\t\t * Position (1, 0) in a 3x3 affine transformation matrix.\n\t\t * @property c\n\t\t * @type Number\n\t\t **/\n\t\n\t\t/**\n\t\t * Position (1, 1) in a 3x3 affine transformation matrix.\n\t\t * @property d\n\t\t * @type Number\n\t\t **/\n\t\n\t\t/**\n\t\t * Position (2, 0) in a 3x3 affine transformation matrix.\n\t\t * @property tx\n\t\t * @type Number\n\t\t **/\n\t\n\t\t/**\n\t\t * Position (2, 1) in a 3x3 affine transformation matrix.\n\t\t * @property ty\n\t\t * @type Number\n\t\t **/\n\t}\n\tvar p = Matrix2D.prototype;\n\n// constants:\n\t/**\n\t * Multiplier for converting degrees to radians. Used internally by Matrix2D.\n\t * @property DEG_TO_RAD\n\t * @static\n\t * @final\n\t * @type Number\n\t * @readonly\n\t **/\n\tMatrix2D.DEG_TO_RAD = Math.PI/180;\n\n\n// static public properties:\n\t/**\n\t * An identity matrix, representing a null transformation.\n\t * @property identity\n\t * @static\n\t * @type Matrix2D\n\t * @readonly\n\t **/\n\tMatrix2D.identity = null; // set at bottom of class definition.\n\t\n\n// public methods:\n\t/**\n\t * Sets the specified values on this instance. \n\t * @method setValues\n\t * @param {Number} [a=1] Specifies the a property for the new matrix.\n\t * @param {Number} [b=0] Specifies the b property for the new matrix.\n\t * @param {Number} [c=0] Specifies the c property for the new matrix.\n\t * @param {Number} [d=1] Specifies the d property for the new matrix.\n\t * @param {Number} [tx=0] Specifies the tx property for the new matrix.\n\t * @param {Number} [ty=0] Specifies the ty property for the new matrix.\n\t * @return {Matrix2D} This instance. Useful for chaining method calls.\n\t*/\n\tp.setValues = function(a, b, c, d, tx, ty) {\n\t\t// don't forget to update docs in the constructor if these change:\n\t\tthis.a = (a == null) ? 1 : a;\n\t\tthis.b = b || 0;\n\t\tthis.c = c || 0;\n\t\tthis.d = (d == null) ? 1 : d;\n\t\tthis.tx = tx || 0;\n\t\tthis.ty = ty || 0;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Appends the specified matrix properties to this matrix. All parameters are required.\n\t * This is the equivalent of multiplying `(this matrix) * (specified matrix)`.\n\t * @method append\n\t * @param {Number} a\n\t * @param {Number} b\n\t * @param {Number} c\n\t * @param {Number} d\n\t * @param {Number} tx\n\t * @param {Number} ty\n\t * @return {Matrix2D} This matrix. Useful for chaining method calls.\n\t **/\n\tp.append = function(a, b, c, d, tx, ty) {\n\t\tvar a1 = this.a;\n\t\tvar b1 = this.b;\n\t\tvar c1 = this.c;\n\t\tvar d1 = this.d;\n\t\tif (a != 1 || b != 0 || c != 0 || d != 1) {\n\t\t\tthis.a  = a1*a+c1*b;\n\t\t\tthis.b  = b1*a+d1*b;\n\t\t\tthis.c  = a1*c+c1*d;\n\t\t\tthis.d  = b1*c+d1*d;\n\t\t}\n\t\tthis.tx = a1*tx+c1*ty+this.tx;\n\t\tthis.ty = b1*tx+d1*ty+this.ty;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Prepends the specified matrix properties to this matrix.\n\t * This is the equivalent of multiplying `(specified matrix) * (this matrix)`.\n\t * All parameters are required.\n\t * @method prepend\n\t * @param {Number} a\n\t * @param {Number} b\n\t * @param {Number} c\n\t * @param {Number} d\n\t * @param {Number} tx\n\t * @param {Number} ty\n\t * @return {Matrix2D} This matrix. Useful for chaining method calls.\n\t **/\n\tp.prepend = function(a, b, c, d, tx, ty) {\n\t\tvar a1 = this.a;\n\t\tvar c1 = this.c;\n\t\tvar tx1 = this.tx;\n\n\t\tthis.a  = a*a1+c*this.b;\n\t\tthis.b  = b*a1+d*this.b;\n\t\tthis.c  = a*c1+c*this.d;\n\t\tthis.d  = b*c1+d*this.d;\n\t\tthis.tx = a*tx1+c*this.ty+tx;\n\t\tthis.ty = b*tx1+d*this.ty+ty;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Appends the specified matrix to this matrix.\n\t * This is the equivalent of multiplying `(this matrix) * (specified matrix)`.\n\t * @method appendMatrix\n\t * @param {Matrix2D} matrix\n\t * @return {Matrix2D} This matrix. Useful for chaining method calls.\n\t **/\n\tp.appendMatrix = function(matrix) {\n\t\treturn this.append(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);\n\t};\n\n\t/**\n\t * Prepends the specified matrix to this matrix.\n\t * This is the equivalent of multiplying `(specified matrix) * (this matrix)`.\n\t * For example, you could calculate the combined transformation for a child object using:\n\t * \n\t * \tvar o = myDisplayObject;\n\t * \tvar mtx = o.getMatrix();\n\t * \twhile (o = o.parent) {\n\t * \t\t// prepend each parent's transformation in turn:\n\t * \t\to.prependMatrix(o.getMatrix());\n\t * \t}\n\t * @method prependMatrix\n\t * @param {Matrix2D} matrix\n\t * @return {Matrix2D} This matrix. Useful for chaining method calls.\n\t **/\n\tp.prependMatrix = function(matrix) {\n\t\treturn this.prepend(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);\n\t};\n\n\t/**\n\t * Generates matrix properties from the specified display object transform properties, and appends them to this matrix.\n\t * For example, you can use this to generate a matrix representing the transformations of a display object:\n\t * \n\t * \tvar mtx = new createjs.Matrix2D();\n\t * \tmtx.appendTransform(o.x, o.y, o.scaleX, o.scaleY, o.rotation);\n\t * @method appendTransform\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} scaleX\n\t * @param {Number} scaleY\n\t * @param {Number} rotation\n\t * @param {Number} skewX\n\t * @param {Number} skewY\n\t * @param {Number} regX Optional.\n\t * @param {Number} regY Optional.\n\t * @return {Matrix2D} This matrix. Useful for chaining method calls.\n\t **/\n\tp.appendTransform = function(x, y, scaleX, scaleY, rotation, skewX, skewY, regX, regY) {\n\t\tif (rotation%360) {\n\t\t\tvar r = rotation*Matrix2D.DEG_TO_RAD;\n\t\t\tvar cos = Math.cos(r);\n\t\t\tvar sin = Math.sin(r);\n\t\t} else {\n\t\t\tcos = 1;\n\t\t\tsin = 0;\n\t\t}\n\n\t\tif (skewX || skewY) {\n\t\t\t// TODO: can this be combined into a single append operation?\n\t\t\tskewX *= Matrix2D.DEG_TO_RAD;\n\t\t\tskewY *= Matrix2D.DEG_TO_RAD;\n\t\t\tthis.append(Math.cos(skewY), Math.sin(skewY), -Math.sin(skewX), Math.cos(skewX), x, y);\n\t\t\tthis.append(cos*scaleX, sin*scaleX, -sin*scaleY, cos*scaleY, 0, 0);\n\t\t} else {\n\t\t\tthis.append(cos*scaleX, sin*scaleX, -sin*scaleY, cos*scaleY, x, y);\n\t\t}\n\t\t\n\t\tif (regX || regY) {\n\t\t\t// append the registration offset:\n\t\t\tthis.tx -= regX*this.a+regY*this.c; \n\t\t\tthis.ty -= regX*this.b+regY*this.d;\n\t\t}\n\t\treturn this;\n\t};\n\n\t/**\n\t * Generates matrix properties from the specified display object transform properties, and prepends them to this matrix.\n\t * For example, you could calculate the combined transformation for a child object using:\n\t * \n\t * \tvar o = myDisplayObject;\n\t * \tvar mtx = new createjs.Matrix2D();\n\t * \tdo  {\n\t * \t\t// prepend each parent's transformation in turn:\n\t * \t\tmtx.prependTransform(o.x, o.y, o.scaleX, o.scaleY, o.rotation, o.skewX, o.skewY, o.regX, o.regY);\n\t * \t} while (o = o.parent);\n\t * \t\n\t * \tNote that the above example would not account for {{#crossLink \"DisplayObject/transformMatrix:property\"}}{{/crossLink}}\n\t * \tvalues. See {{#crossLink \"Matrix2D/prependMatrix\"}}{{/crossLink}} for an example that does.\n\t * @method prependTransform\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} scaleX\n\t * @param {Number} scaleY\n\t * @param {Number} rotation\n\t * @param {Number} skewX\n\t * @param {Number} skewY\n\t * @param {Number} regX Optional.\n\t * @param {Number} regY Optional.\n\t * @return {Matrix2D} This matrix. Useful for chaining method calls.\n\t **/\n\tp.prependTransform = function(x, y, scaleX, scaleY, rotation, skewX, skewY, regX, regY) {\n\t\tif (rotation%360) {\n\t\t\tvar r = rotation*Matrix2D.DEG_TO_RAD;\n\t\t\tvar cos = Math.cos(r);\n\t\t\tvar sin = Math.sin(r);\n\t\t} else {\n\t\t\tcos = 1;\n\t\t\tsin = 0;\n\t\t}\n\n\t\tif (regX || regY) {\n\t\t\t// prepend the registration offset:\n\t\t\tthis.tx -= regX; this.ty -= regY;\n\t\t}\n\t\tif (skewX || skewY) {\n\t\t\t// TODO: can this be combined into a single prepend operation?\n\t\t\tskewX *= Matrix2D.DEG_TO_RAD;\n\t\t\tskewY *= Matrix2D.DEG_TO_RAD;\n\t\t\tthis.prepend(cos*scaleX, sin*scaleX, -sin*scaleY, cos*scaleY, 0, 0);\n\t\t\tthis.prepend(Math.cos(skewY), Math.sin(skewY), -Math.sin(skewX), Math.cos(skewX), x, y);\n\t\t} else {\n\t\t\tthis.prepend(cos*scaleX, sin*scaleX, -sin*scaleY, cos*scaleY, x, y);\n\t\t}\n\t\treturn this;\n\t};\n\n\t/**\n\t * Applies a clockwise rotation transformation to the matrix.\n\t * @method rotate\n\t * @param {Number} angle The angle to rotate by, in degrees. To use a value in radians, multiply it by `180/Math.PI`.\n\t * @return {Matrix2D} This matrix. Useful for chaining method calls.\n\t **/\n\tp.rotate = function(angle) {\n\t\tangle = angle*Matrix2D.DEG_TO_RAD;\n\t\tvar cos = Math.cos(angle);\n\t\tvar sin = Math.sin(angle);\n\n\t\tvar a1 = this.a;\n\t\tvar b1 = this.b;\n\n\t\tthis.a = a1*cos+this.c*sin;\n\t\tthis.b = b1*cos+this.d*sin;\n\t\tthis.c = -a1*sin+this.c*cos;\n\t\tthis.d = -b1*sin+this.d*cos;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Applies a skew transformation to the matrix.\n\t * @method skew\n\t * @param {Number} skewX The amount to skew horizontally in degrees. To use a value in radians, multiply it by `180/Math.PI`.\n\t * @param {Number} skewY The amount to skew vertically in degrees.\n\t * @return {Matrix2D} This matrix. Useful for chaining method calls.\n\t*/\n\tp.skew = function(skewX, skewY) {\n\t\tskewX = skewX*Matrix2D.DEG_TO_RAD;\n\t\tskewY = skewY*Matrix2D.DEG_TO_RAD;\n\t\tthis.append(Math.cos(skewY), Math.sin(skewY), -Math.sin(skewX), Math.cos(skewX), 0, 0);\n\t\treturn this;\n\t};\n\n\t/**\n\t * Applies a scale transformation to the matrix.\n\t * @method scale\n\t * @param {Number} x The amount to scale horizontally. E.G. a value of 2 will double the size in the X direction, and 0.5 will halve it.\n\t * @param {Number} y The amount to scale vertically.\n\t * @return {Matrix2D} This matrix. Useful for chaining method calls.\n\t **/\n\tp.scale = function(x, y) {\n\t\tthis.a *= x;\n\t\tthis.b *= x;\n\t\tthis.c *= y;\n\t\tthis.d *= y;\n\t\t//this.tx *= x;\n\t\t//this.ty *= y;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Translates the matrix on the x and y axes.\n\t * @method translate\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @return {Matrix2D} This matrix. Useful for chaining method calls.\n\t **/\n\tp.translate = function(x, y) {\n\t\tthis.tx += this.a*x + this.c*y;\n\t\tthis.ty += this.b*x + this.d*y;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Sets the properties of the matrix to those of an identity matrix (one that applies a null transformation).\n\t * @method identity\n\t * @return {Matrix2D} This matrix. Useful for chaining method calls.\n\t **/\n\tp.identity = function() {\n\t\tthis.a = this.d = 1;\n\t\tthis.b = this.c = this.tx = this.ty = 0;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Inverts the matrix, causing it to perform the opposite transformation.\n\t * @method invert\n\t * @return {Matrix2D} This matrix. Useful for chaining method calls.\n\t **/\n\tp.invert = function() {\n\t\tvar a1 = this.a;\n\t\tvar b1 = this.b;\n\t\tvar c1 = this.c;\n\t\tvar d1 = this.d;\n\t\tvar tx1 = this.tx;\n\t\tvar n = a1*d1-b1*c1;\n\n\t\tthis.a = d1/n;\n\t\tthis.b = -b1/n;\n\t\tthis.c = -c1/n;\n\t\tthis.d = a1/n;\n\t\tthis.tx = (c1*this.ty-d1*tx1)/n;\n\t\tthis.ty = -(a1*this.ty-b1*tx1)/n;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Returns true if the matrix is an identity matrix.\n\t * @method isIdentity\n\t * @return {Boolean}\n\t **/\n\tp.isIdentity = function() {\n\t\treturn this.tx === 0 && this.ty === 0 && this.a === 1 && this.b === 0 && this.c === 0 && this.d === 1;\n\t};\n\t\n\t/**\n\t * Returns true if this matrix is equal to the specified matrix (all property values are equal).\n\t * @method equals\n\t * @param {Matrix2D} matrix The matrix to compare.\n\t * @return {Boolean}\n\t **/\n\tp.equals = function(matrix) {\n\t\treturn this.tx === matrix.tx && this.ty === matrix.ty && this.a === matrix.a && this.b === matrix.b && this.c === matrix.c && this.d === matrix.d;\n\t};\n\n\t/**\n\t * Transforms a point according to this matrix.\n\t * @method transformPoint\n\t * @param {Number} x The x component of the point to transform.\n\t * @param {Number} y The y component of the point to transform.\n\t * @param {Point | Object} [pt] An object to copy the result into. If omitted a generic object with x/y properties will be returned.\n\t * @return {Point} This matrix. Useful for chaining method calls.\n\t **/\n\tp.transformPoint = function(x, y, pt) {\n\t\tpt = pt||{};\n\t\tpt.x = x*this.a+y*this.c+this.tx;\n\t\tpt.y = x*this.b+y*this.d+this.ty;\n\t\treturn pt;\n\t};\n\n\t/**\n\t * Decomposes the matrix into transform properties (x, y, scaleX, scaleY, and rotation). Note that these values\n\t * may not match the transform properties you used to generate the matrix, though they will produce the same visual\n\t * results.\n\t * @method decompose\n\t * @param {Object} target The object to apply the transform properties to. If null, then a new object will be returned.\n\t * @return {Object} The target, or a new generic object with the transform properties applied.\n\t*/\n\tp.decompose = function(target) {\n\t\t// TODO: it would be nice to be able to solve for whether the matrix can be decomposed into only scale/rotation even when scale is negative\n\t\tif (target == null) { target = {}; }\n\t\ttarget.x = this.tx;\n\t\ttarget.y = this.ty;\n\t\ttarget.scaleX = Math.sqrt(this.a * this.a + this.b * this.b);\n\t\ttarget.scaleY = Math.sqrt(this.c * this.c + this.d * this.d);\n\n\t\tvar skewX = Math.atan2(-this.c, this.d);\n\t\tvar skewY = Math.atan2(this.b, this.a);\n\n\t\tvar delta = Math.abs(1-skewX/skewY);\n\t\tif (delta < 0.00001) { // effectively identical, can use rotation:\n\t\t\ttarget.rotation = skewY/Matrix2D.DEG_TO_RAD;\n\t\t\tif (this.a < 0 && this.d >= 0) {\n\t\t\t\ttarget.rotation += (target.rotation <= 0) ? 180 : -180;\n\t\t\t}\n\t\t\ttarget.skewX = target.skewY = 0;\n\t\t} else {\n\t\t\ttarget.skewX = skewX/Matrix2D.DEG_TO_RAD;\n\t\t\ttarget.skewY = skewY/Matrix2D.DEG_TO_RAD;\n\t\t}\n\t\treturn target;\n\t};\n\t\n\t/**\n\t * Copies all properties from the specified matrix to this matrix.\n\t * @method copy\n\t * @param {Matrix2D} matrix The matrix to copy properties from.\n\t * @return {Matrix2D} This matrix. Useful for chaining method calls.\n\t*/\n\tp.copy = function(matrix) {\n\t\treturn this.setValues(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);\n\t};\n\n\t/**\n\t * Returns a clone of the Matrix2D instance.\n\t * @method clone\n\t * @return {Matrix2D} a clone of the Matrix2D instance.\n\t **/\n\tp.clone = function() {\n\t\treturn new Matrix2D(this.a, this.b, this.c, this.d, this.tx, this.ty);\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[Matrix2D (a=\"+this.a+\" b=\"+this.b+\" c=\"+this.c+\" d=\"+this.d+\" tx=\"+this.tx+\" ty=\"+this.ty+\")]\";\n\t};\n\n\t// this has to be populated after the class is defined:\n\tMatrix2D.identity = new Matrix2D();\n\n\n\tcreatejs.Matrix2D = Matrix2D;\n}());\n\n//##############################################################################\n// DisplayProps.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\t/**\n\t * Used for calculating and encapsulating display related properties.\n\t * @class DisplayProps\n\t * @param {Number} [visible=true] Visible value.\n\t * @param {Number} [alpha=1] Alpha value.\n\t * @param {Number} [shadow=null] A Shadow instance or null.\n\t * @param {Number} [compositeOperation=null] A compositeOperation value or null.\n\t * @param {Number} [matrix] A transformation matrix. Defaults to a new identity matrix.\n\t * @constructor\n\t **/\n\tfunction DisplayProps(visible, alpha, shadow, compositeOperation, matrix) {\n\t\tthis.setValues(visible, alpha, shadow, compositeOperation, matrix);\n\t\t\n\t// public properties:\n\t\t// assigned in the setValues method.\n\t\t/**\n\t\t * Property representing the alpha that will be applied to a display object.\n\t\t * @property alpha\n\t\t * @type Number\n\t\t **/\n\t\n\t\t/**\n\t\t * Property representing the shadow that will be applied to a display object.\n\t\t * @property shadow\n\t\t * @type Shadow\n\t\t **/\n\t\n\t\t/**\n\t\t * Property representing the compositeOperation that will be applied to a display object.\n\t\t * You can find a list of valid composite operations at:\n\t\t * <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Compositing\">https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Compositing</a>\n\t\t * @property compositeOperation\n\t\t * @type String\n\t\t **/\n\t\t\n\t\t/**\n\t\t * Property representing the value for visible that will be applied to a display object.\n\t\t * @property visible\n\t\t * @type Boolean\n\t\t **/\n\t\t\n\t\t/**\n\t\t * The transformation matrix that will be applied to a display object.\n\t\t * @property matrix\n\t\t * @type Matrix2D\n\t\t **/\n\t}\n\tvar p = DisplayProps.prototype;\n\n// initialization:\n\t/**\n\t * Reinitializes the instance with the specified values.\n\t * @method setValues\n\t * @param {Number} [visible=true] Visible value.\n\t * @param {Number} [alpha=1] Alpha value.\n\t * @param {Number} [shadow=null] A Shadow instance or null.\n\t * @param {Number} [compositeOperation=null] A compositeOperation value or null.\n\t * @param {Number} [matrix] A transformation matrix. Defaults to an identity matrix.\n\t * @return {DisplayProps} This instance. Useful for chaining method calls.\n\t * @chainable\n\t*/\n\tp.setValues = function (visible, alpha, shadow, compositeOperation, matrix) {\n\t\tthis.visible = visible == null ? true : !!visible;\n\t\tthis.alpha = alpha == null ? 1 : alpha;\n\t\tthis.shadow = shadow;\n\t\tthis.compositeOperation = compositeOperation;\n\t\tthis.matrix = matrix || (this.matrix&&this.matrix.identity()) || new createjs.Matrix2D();\n\t\treturn this;\n\t};\n\n// public methods:\n\t/**\n\t * Appends the specified display properties. This is generally used to apply a child's properties its parent's.\n\t * @method append\n\t * @param {Boolean} visible desired visible value\n\t * @param {Number} alpha desired alpha value\n\t * @param {Shadow} shadow desired shadow value\n\t * @param {String} compositeOperation desired composite operation value\n\t * @param {Matrix2D} [matrix] a Matrix2D instance\n\t * @return {DisplayProps} This instance. Useful for chaining method calls.\n\t * @chainable\n\t*/\n\tp.append = function(visible, alpha, shadow, compositeOperation, matrix) {\n\t\tthis.alpha *= alpha;\n\t\tthis.shadow = shadow || this.shadow;\n\t\tthis.compositeOperation = compositeOperation || this.compositeOperation;\n\t\tthis.visible = this.visible && visible;\n\t\tmatrix&&this.matrix.appendMatrix(matrix);\n\t\treturn this;\n\t};\n\t\n\t/**\n\t * Prepends the specified display properties. This is generally used to apply a parent's properties to a child's.\n\t * For example, to get the combined display properties that would be applied to a child, you could use:\n\t * \n\t * \tvar o = myDisplayObject;\n\t * \tvar props = new createjs.DisplayProps();\n\t * \tdo {\n\t * \t\t// prepend each parent's props in turn:\n\t * \t\tprops.prepend(o.visible, o.alpha, o.shadow, o.compositeOperation, o.getMatrix());\n\t * \t} while (o = o.parent);\n\t * \t\n\t * @method prepend\n\t * @param {Boolean} visible desired visible value\n\t * @param {Number} alpha desired alpha value\n\t * @param {Shadow} shadow desired shadow value\n\t * @param {String} compositeOperation desired composite operation value\n\t * @param {Matrix2D} [matrix] a Matrix2D instance\n\t * @return {DisplayProps} This instance. Useful for chaining method calls.\n\t * @chainable\n\t*/\n\tp.prepend = function(visible, alpha, shadow, compositeOperation, matrix) {\n\t\tthis.alpha *= alpha;\n\t\tthis.shadow = this.shadow || shadow;\n\t\tthis.compositeOperation = this.compositeOperation || compositeOperation;\n\t\tthis.visible = this.visible && visible;\n\t\tmatrix&&this.matrix.prependMatrix(matrix);\n\t\treturn this;\n\t};\n\t\n\t/**\n\t * Resets this instance and its matrix to default values.\n\t * @method identity\n\t * @return {DisplayProps} This instance. Useful for chaining method calls.\n\t * @chainable\n\t*/\n\tp.identity = function() {\n\t\tthis.visible = true;\n\t\tthis.alpha = 1;\n\t\tthis.shadow = this.compositeOperation = null;\n\t\tthis.matrix.identity();\n\t\treturn this;\n\t};\n\t\n\t/**\n\t * Returns a clone of the DisplayProps instance. Clones the associated matrix.\n\t * @method clone\n\t * @return {DisplayProps} a clone of the DisplayProps instance.\n\t **/\n\tp.clone = function() {\n\t\treturn new DisplayProps(this.alpha, this.shadow, this.compositeOperation, this.visible, this.matrix.clone());\n\t};\n\n// private methods:\n\n\tcreatejs.DisplayProps = DisplayProps;\n})();\n\n//##############################################################################\n// Point.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Represents a point on a 2 dimensional x / y coordinate system.\n\t *\n\t * <h4>Example</h4>\n\t * \n\t *      var point = new createjs.Point(0, 100);\n\t * \n\t * @class Point\n\t * @param {Number} [x=0] X position.\n\t * @param {Number} [y=0] Y position.\n\t * @constructor\n\t **/\n\tfunction Point(x, y) {\n\t \tthis.setValues(x, y);\n\t \t\n\t \t\n\t// public properties:\n\t\t// assigned in the setValues method.\n\t\t/**\n\t\t * X position.\n\t\t * @property x\n\t\t * @type Number\n\t\t **/\n\t\n\t\t/**\n\t\t * Y position.\n\t\t * @property y\n\t\t * @type Number\n\t\t **/\n\t}\n\tvar p = Point.prototype;\n\t\n// public methods:\n\t/** \n\t * Sets the specified values on this instance.\n\t * @method setValues\n\t * @param {Number} [x=0] X position.\n\t * @param {Number} [y=0] Y position.\n\t * @return {Point} This instance. Useful for chaining method calls.\n\t * @chainable\n\t*/\n\tp.setValues = function(x, y) {\n\t\tthis.x = x||0;\n\t\tthis.y = y||0;\n\t\treturn this;\n\t};\n\t\n\t/**\n\t * Copies all properties from the specified point to this point.\n\t * @method copy\n\t * @param {Point} point The point to copy properties from.\n\t * @return {Point} This point. Useful for chaining method calls.\n\t * @chainable\n\t*/\n\tp.copy = function(point) {\n\t\tthis.x = point.x;\n\t\tthis.y = point.y;\n\t\treturn this;\n\t};\n\t\n\t/**\n\t * Returns a clone of the Point instance.\n\t * @method clone\n\t * @return {Point} a clone of the Point instance.\n\t **/\n\tp.clone = function() {\n\t\treturn new Point(this.x, this.y);\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[Point (x=\"+this.x+\" y=\"+this.y+\")]\";\n\t};\n\t\n\t\n\tcreatejs.Point = Point;\n}());\n\n//##############################################################################\n// Rectangle.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Represents a rectangle as defined by the points (x, y) and (x+width, y+height).\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      var rect = new createjs.Rectangle(0, 0, 100, 100);\n\t *\n\t * @class Rectangle\n\t * @param {Number} [x=0] X position.\n\t * @param {Number} [y=0] Y position.\n\t * @param {Number} [width=0] The width of the Rectangle.\n\t * @param {Number} [height=0] The height of the Rectangle.\n\t * @constructor\n\t **/\n\tfunction Rectangle(x, y, width, height) {\n\t\tthis.setValues(x, y, width, height);\n\t\t\n\t\t\n\t// public properties:\n\t\t// assigned in the setValues method.\n\t\t/**\n\t\t * X position.\n\t\t * @property x\n\t\t * @type Number\n\t\t **/\n\t\n\t\t/**\n\t\t * Y position.\n\t\t * @property y\n\t\t * @type Number\n\t\t **/\n\t\n\t\t/**\n\t\t * Width.\n\t\t * @property width\n\t\t * @type Number\n\t\t **/\n\t\n\t\t/**\n\t\t * Height.\n\t\t * @property height\n\t\t * @type Number\n\t\t **/\n\t}\n\tvar p = Rectangle.prototype;\n\n// public methods:\n\t/** \n\t * Sets the specified values on this instance.\n\t * @method setValues\n\t * @param {Number} [x=0] X position.\n\t * @param {Number} [y=0] Y position.\n\t * @param {Number} [width=0] The width of the Rectangle.\n\t * @param {Number} [height=0] The height of the Rectangle.\n\t * @return {Rectangle} This instance. Useful for chaining method calls.\n\t * @chainable\n\t*/\n\tp.setValues = function(x, y, width, height) {\n\t\t// don't forget to update docs in the constructor if these change:\n\t\tthis.x = x||0;\n\t\tthis.y = y||0;\n\t\tthis.width = width||0;\n\t\tthis.height = height||0;\n\t\treturn this;\n\t};\n\t\n\t/** \n\t * Extends the rectangle's bounds to include the described point or rectangle.\n\t * @method extend\n\t * @param {Number} x X position of the point or rectangle.\n\t * @param {Number} y Y position of the point or rectangle.\n\t * @param {Number} [width=0] The width of the rectangle.\n\t * @param {Number} [height=0] The height of the rectangle.\n\t * @return {Rectangle} This instance. Useful for chaining method calls.\n\t * @chainable\n\t*/\n\tp.extend = function(x, y, width, height) {\n\t\twidth = width||0;\n\t\theight = height||0;\n\t\tif (x+width > this.x+this.width) { this.width = x+width-this.x; }\n\t\tif (y+height > this.y+this.height) { this.height = y+height-this.y; }\n\t\tif (x < this.x) { this.width += this.x-x; this.x = x; }\n\t\tif (y < this.y) { this.height += this.y-y; this.y = y; }\n\t\treturn this;\n\t};\n\t\n\t/** \n\t * Adds the specified padding to the rectangle's bounds.\n\t * @method pad\n\t * @param {Number} top\n\t * @param {Number} left\n\t * @param {Number} bottom\n\t * @param {Number} right\n\t * @return {Rectangle} This instance. Useful for chaining method calls.\n\t * @chainable\n\t*/\n\tp.pad = function(top, left, bottom, right) {\n\t\tthis.x -= left;\n\t\tthis.y -= top;\n\t\tthis.width += left+right;\n\t\tthis.height += top+bottom;\n\t\treturn this;\n\t};\n\t\n\t/**\n\t * Copies all properties from the specified rectangle to this rectangle.\n\t * @method copy\n\t * @param {Rectangle} rectangle The rectangle to copy properties from.\n\t * @return {Rectangle} This rectangle. Useful for chaining method calls.\n\t * @chainable\n\t*/\n\tp.copy = function(rectangle) {\n\t\treturn this.setValues(rectangle.x, rectangle.y, rectangle.width, rectangle.height);\n\t};\n\t\n\t/** \n\t * Returns true if this rectangle fully encloses the described point or rectangle.\n\t * @method contains\n\t * @param {Number} x X position of the point or rectangle.\n\t * @param {Number} y Y position of the point or rectangle.\n\t * @param {Number} [width=0] The width of the rectangle.\n\t * @param {Number} [height=0] The height of the rectangle.\n\t * @return {Boolean} True if the described point or rectangle is contained within this rectangle.\n\t*/\n\tp.contains = function(x, y, width, height) {\n\t\twidth = width||0;\n\t\theight = height||0;\n\t\treturn (x >= this.x && x+width <= this.x+this.width && y >= this.y && y+height <= this.y+this.height);\n\t};\n\t\n\t/** \n\t * Returns a new rectangle which contains this rectangle and the specified rectangle.\n\t * @method union\n\t * @param {Rectangle} rect The rectangle to calculate a union with.\n\t * @return {Rectangle} A new rectangle describing the union.\n\t*/\n\tp.union = function(rect) {\n\t\treturn this.clone().extend(rect.x, rect.y, rect.width, rect.height);\n\t};\n\t\n\t/** \n\t * Returns a new rectangle which describes the intersection (overlap) of this rectangle and the specified rectangle,\n\t * or null if they do not intersect.\n\t * @method intersection\n\t * @param {Rectangle} rect The rectangle to calculate an intersection with.\n\t * @return {Rectangle} A new rectangle describing the intersection or null.\n\t*/\n\tp.intersection = function(rect) {\n\t\tvar x1 = rect.x, y1 = rect.y, x2 = x1+rect.width, y2 = y1+rect.height;\n\t\tif (this.x > x1) { x1 = this.x; }\n\t\tif (this.y > y1) { y1 = this.y; }\n\t\tif (this.x + this.width < x2) { x2 = this.x + this.width; }\n\t\tif (this.y + this.height < y2) { y2 = this.y + this.height; }\n\t\treturn (x2 <= x1 || y2 <= y1) ? null : new Rectangle(x1, y1, x2-x1, y2-y1);\n\t};\n\t\n\t/** \n\t * Returns true if the specified rectangle intersects (has any overlap) with this rectangle.\n\t * @method intersects\n\t * @param {Rectangle} rect The rectangle to compare.\n\t * @return {Boolean} True if the rectangles intersect.\n\t*/\n\tp.intersects = function(rect) {\n\t\treturn (rect.x <= this.x+this.width && this.x <= rect.x+rect.width && rect.y <= this.y+this.height && this.y <= rect.y + rect.height);\n\t};\n\t\n\t/** \n\t * Returns true if the width or height are equal or less than 0.\n\t * @method isEmpty\n\t * @return {Boolean} True if the rectangle is empty.\n\t*/\n\tp.isEmpty = function() {\n\t\treturn this.width <= 0 || this.height <= 0;\n\t};\n\t\n\t/**\n\t * Returns a clone of the Rectangle instance.\n\t * @method clone\n\t * @return {Rectangle} a clone of the Rectangle instance.\n\t **/\n\tp.clone = function() {\n\t\treturn new Rectangle(this.x, this.y, this.width, this.height);\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[Rectangle (x=\"+this.x+\" y=\"+this.y+\" width=\"+this.width+\" height=\"+this.height+\")]\";\n\t};\n\t\n\t\n\tcreatejs.Rectangle = Rectangle;\n}());\n\n//##############################################################################\n// ButtonHelper.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * The ButtonHelper is a helper class to create interactive buttons from {{#crossLink \"MovieClip\"}}{{/crossLink}} or\n\t * {{#crossLink \"Sprite\"}}{{/crossLink}} instances. This class will intercept mouse events from an object, and\n\t * automatically call {{#crossLink \"Sprite/gotoAndStop\"}}{{/crossLink}} or {{#crossLink \"Sprite/gotoAndPlay\"}}{{/crossLink}},\n\t * to the respective animation labels, add a pointer cursor, and allows the user to define a hit state frame.\n\t *\n\t * The ButtonHelper instance does not need to be added to the stage, but a reference should be maintained to prevent\n\t * garbage collection.\n\t * \n\t * Note that over states will not work unless you call {{#crossLink \"Stage/enableMouseOver\"}}{{/crossLink}}.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      var helper = new createjs.ButtonHelper(myInstance, \"out\", \"over\", \"down\", false, myInstance, \"hit\");\n\t *      myInstance.addEventListener(\"click\", handleClick);\n\t *      function handleClick(event) {\n\t *          // Click Happened.\n\t *      }\n\t *\n\t * @class ButtonHelper\n\t * @param {Sprite|MovieClip} target The instance to manage.\n\t * @param {String} [outLabel=\"out\"] The label or animation to go to when the user rolls out of the button.\n\t * @param {String} [overLabel=\"over\"] The label or animation to go to when the user rolls over the button.\n\t * @param {String} [downLabel=\"down\"] The label or animation to go to when the user presses the button.\n\t * @param {Boolean} [play=false] If the helper should call \"gotoAndPlay\" or \"gotoAndStop\" on the button when changing\n\t * states.\n\t * @param {DisplayObject} [hitArea] An optional item to use as the hit state for the button. If this is not defined,\n\t * then the button's visible states will be used instead. Note that the same instance as the \"target\" argument can be\n\t * used for the hitState.\n\t * @param {String} [hitLabel] The label or animation on the hitArea instance that defines the hitArea bounds. If this is\n\t * null, then the default state of the hitArea will be used. *\n\t * @constructor\n\t */\n\tfunction ButtonHelper(target, outLabel, overLabel, downLabel, play, hitArea, hitLabel) {\n\t\tif (!target.addEventListener) { return; }\n\t\n\t\n\t// public properties:\n\t\t/**\n\t\t * The target for this button helper.\n\t\t * @property target\n\t\t * @type MovieClip | Sprite\n\t\t * @readonly\n\t\t **/\n\t\tthis.target = target;\n\t\n\t\t/**\n\t\t * The label name or frame number to display when the user mouses out of the target. Defaults to \"over\".\n\t\t * @property overLabel\n\t\t * @type String | Number\n\t\t **/\n\t\tthis.overLabel = overLabel == null ? \"over\" : overLabel;\n\t\n\t\t/**\n\t\t * The label name or frame number to display when the user mouses over the target. Defaults to \"out\".\n\t\t * @property outLabel\n\t\t * @type String | Number\n\t\t **/\n\t\tthis.outLabel = outLabel == null ? \"out\" : outLabel;\n\t\n\t\t/**\n\t\t * The label name or frame number to display when the user presses on the target. Defaults to \"down\".\n\t\t * @property downLabel\n\t\t * @type String | Number\n\t\t **/\n\t\tthis.downLabel = downLabel == null ? \"down\" : downLabel;\n\t\n\t\t/**\n\t\t * If true, then ButtonHelper will call gotoAndPlay, if false, it will use gotoAndStop. Default is false.\n\t\t * @property play\n\t\t * @default false\n\t\t * @type Boolean\n\t\t **/\n\t\tthis.play = play;\n\t\t\n\t\t\n\t//  private properties\n\t\t/**\n\t\t * @property _isPressed\n\t\t * @type Boolean\n\t\t * @protected\n\t\t **/\n\t\tthis._isPressed = false;\n\t\n\t\t/**\n\t\t * @property _isOver\n\t\t * @type Boolean\n\t\t * @protected\n\t\t **/\n\t\tthis._isOver = false;\n\t\n\t\t/**\n\t\t * @property _enabled\n\t\t * @type Boolean\n\t\t * @protected\n\t\t **/\n\t\tthis._enabled = false;\n\t\t\n\t// setup:\n\t\ttarget.mouseChildren = false; // prevents issues when children are removed from the display list when state changes.\n\t\tthis.enabled = true;\n\t\tthis.handleEvent({});\n\t\tif (hitArea) {\n\t\t\tif (hitLabel) {\n\t\t\t\thitArea.actionsEnabled = false;\n\t\t\t\thitArea.gotoAndStop&&hitArea.gotoAndStop(hitLabel);\n\t\t\t}\n\t\t\ttarget.hitArea = hitArea;\n\t\t}\n\t}\n\tvar p = ButtonHelper.prototype;\n\t\n// getter / setters:\n\t/**\n\t * Use the {{#crossLink \"ButtonHelper/enabled:property\"}}{{/crossLink}} property instead.\n\t * @method setEnabled\n\t * @param {Boolean} value The enabled property to set the instance to.\n\t * @[rptected\n\t * @protected\n\t **/\n\tp._setEnabled = function(value) {\n\t\tif (value == this._enabled) { return; }\n\t\tvar o = this.target;\n\t\tthis._enabled = value;\n\t\tif (value) {\n\t\t\to.cursor = \"pointer\";\n\t\t\to.addEventListener(\"rollover\", this);\n\t\t\to.addEventListener(\"rollout\", this);\n\t\t\to.addEventListener(\"mousedown\", this);\n\t\t\to.addEventListener(\"pressup\", this);\n\t\t\tif (o._reset) { o.__reset = o._reset; o._reset = this._reset;}\n\t\t} else {\n\t\t\to.cursor = null;\n\t\t\to.removeEventListener(\"rollover\", this);\n\t\t\to.removeEventListener(\"rollout\", this);\n\t\t\to.removeEventListener(\"mousedown\", this);\n\t\t\to.removeEventListener(\"pressup\", this);\n\t\t\tif (o.__reset) { o._reset = o.__reset; delete(o.__reset); }\n\t\t}\n\t};\n\t// ButtonHelper.setEnabled is @deprecated. Remove for 1.1+\n\tp.setEnabled = createjs.deprecate(p._setEnabled, \"ButtonHelper.setEnabled\");\n\n\t/**\n\t * Use the {{#crossLink \"ButtonHelper/enabled:property\"}}{{/crossLink}} property instead.\n\t * @method getEnabled\n\t * @protected\n\t * @return {Boolean}\n\t **/\n\tp._getEnabled = function() {\n\t\treturn this._enabled;\n\t};\n\t// ButtonHelper.getEnabled is @deprecated. Remove for 1.1+\n\tp.getEnabled = createjs.deprecate(p._getEnabled, \"ButtonHelper.getEnabled\");\n\n\t/**\n\t * Enables or disables the button functionality on the target.\n\t * @property enabled\n\t * @type {Boolean}\n\t **/\n\ttry {\n\t\tObject.defineProperties(p, {\n\t\t\tenabled: { get: p._getEnabled, set: p._setEnabled }\n\t\t});\n\t} catch (e) {} // TODO: use Log\n\n\n// public methods:\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[ButtonHelper]\";\n\t};\n\n\n// private methods:\n\t/**\n\t * @method handleEvent\n\t * @param {Object} evt The mouse event to handle.\n\t * @protected\n\t **/\n\tp.handleEvent = function(evt) {\n\t\tvar label, t = this.target, type = evt.type;\n\t\tif (type == \"mousedown\") {\n\t\t\tthis._isPressed = true;\n\t\t\tlabel = this.downLabel;\n\t\t} else if (type == \"pressup\") {\n\t\t\tthis._isPressed = false;\n\t\t\tlabel = this._isOver ? this.overLabel : this.outLabel;\n\t\t} else if (type == \"rollover\") {\n\t\t\tthis._isOver = true;\n\t\t\tlabel = this._isPressed ? this.downLabel : this.overLabel;\n\t\t} else { // rollout and default\n\t\t\tthis._isOver = false;\n\t\t\tlabel = this._isPressed ? this.overLabel : this.outLabel;\n\t\t}\n\t\tif (this.play) {\n\t\t\tt.gotoAndPlay&&t.gotoAndPlay(label);\n\t\t} else {\n\t\t\tt.gotoAndStop&&t.gotoAndStop(label);\n\t\t}\n\t};\n\t\n\t/**\n\t * Injected into target. Preserves the paused state through a reset.\n\t * @method _reset\n\t * @protected\n\t **/\n\tp._reset = function() {\n\t\t// TODO: explore better ways to handle this issue. This is hacky & disrupts object signatures.\n\t\tvar p = this.paused;\n\t\tthis.__reset();\n\t\tthis.paused = p;\n\t};\n\n\n\tcreatejs.ButtonHelper = ButtonHelper;\n}());\n\n//##############################################################################\n// Shadow.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * This class encapsulates the properties required to define a shadow to apply to a {{#crossLink \"DisplayObject\"}}{{/crossLink}}\n\t * via its <code>shadow</code> property.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      myImage.shadow = new createjs.Shadow(\"#000000\", 5, 5, 10);\n\t *\n\t * @class Shadow\n\t * @constructor\n\t * @param {String} color The color of the shadow. This can be any valid CSS color value.\n\t * @param {Number} offsetX The x offset of the shadow in pixels.\n\t * @param {Number} offsetY The y offset of the shadow in pixels.\n\t * @param {Number} blur The size of the blurring effect.\n\t **/\n\tfunction Shadow(color, offsetX, offsetY, blur) {\n\t\t\n\t\t\n\t// public properties:\n\t\t/** \n\t\t * The color of the shadow. This can be any valid CSS color value.\n\t\t * @property color\n\t\t * @type String\n\t\t * @default null\n\t\t */\n\t\tthis.color = color||\"black\";\n\t\n\t\t/** The x offset of the shadow.\n\t\t * @property offsetX\n\t\t * @type Number\n\t\t * @default 0\n\t\t */\n\t\tthis.offsetX = offsetX||0;\n\t\n\t\t/** The y offset of the shadow.\n\t\t * @property offsetY\n\t\t * @type Number\n\t\t * @default 0\n\t\t */\n\t\tthis.offsetY = offsetY||0;\n\t\n\t\t/** The blur of the shadow.\n\t\t * @property blur\n\t\t * @type Number\n\t\t * @default 0\n\t\t */\n\t\tthis.blur = blur||0;\n\t}\n\tvar p = Shadow.prototype;\n\n// static public properties:\n\t/**\n\t * An identity shadow object (all properties are set to 0).\n\t * @property identity\n\t * @type Shadow\n\t * @static\n\t * @final\n\t * @readonly\n\t **/\n\tShadow.identity = new Shadow(\"transparent\", 0, 0, 0);\n\n\n// public methods:\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[Shadow]\";\n\t};\n\n\t/**\n\t * Returns a clone of this Shadow instance.\n\t * @method clone\n\t * @return {Shadow} A clone of the current Shadow instance.\n\t **/\n\tp.clone = function() {\n\t\treturn new Shadow(this.color, this.offsetX, this.offsetY, this.blur);\n\t};\n\t\n\n\tcreatejs.Shadow = Shadow;\n}());\n\n//##############################################################################\n// SpriteSheet.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Encapsulates the properties and methods associated with a sprite sheet. A sprite sheet is a series of images (usually\n\t * animation frames) combined into a larger image (or images). For example, an animation consisting of eight 100x100\n\t * images could be combined into a single 400x200 sprite sheet (4 frames across by 2 high).\n\t *\n\t * The data passed to the SpriteSheet constructor defines:\n\t * <ol>\n\t * \t<li> The source image or images to use.</li>\n\t * \t<li> The positions of individual image frames.</li>\n\t * \t<li> Sequences of frames that form named animations. Optional.</li>\n\t * \t<li> The target playback framerate. Optional.</li>\n\t * </ol>\n\t * <h3>SpriteSheet Format</h3>\n\t * SpriteSheets are an object with two required properties (`images` and `frames`), and two optional properties\n\t * (`framerate` and `animations`). This makes them easy to define in javascript code, or in JSON.\n\t *\n\t * <h4>images</h4>\n\t * An array of source images. Images can be either an HTMlimage\n\t * instance, or a uri to an image. The former is recommended to control preloading.\n\t *\n\t * \timages: [image1, \"path/to/image2.png\"],\n\t *\n\t * <h4>frames</h4>\n\t * Defines the individual frames. There are two supported formats for frame data:\n\t * When all of the frames are the same size (in a grid), use an object with `width`, `height`, `regX`, `regY`,\n\t * and `count` properties.\n\t *\n\t * <ul>\n\t *  <li>`width` & `height` are required and specify the dimensions of the frames</li>\n\t *  <li>`regX` & `regY` indicate the registration point or \"origin\" of the frames</li>\n\t *  <li>`spacing` indicate the spacing between frames</li>\n\t *  <li>`margin` specify the margin around the image(s)</li>\n\t *  <li>`count` allows you to specify the total number of frames in the spritesheet; if omitted, this will\n\t *  be calculated based on the dimensions of the source images and the frames. Frames will be assigned\n\t *  indexes based on their position in the source images (left to right, top to bottom).</li>\n\t * </ul>\n\t *\n\t *  \tframes: {width:64, height:64, count:20, regX: 32, regY:64, spacing:0, margin:0}\n\t *\n\t * If the frames are of different sizes, use an array of frame definitions. Each definition is itself an array\n\t * with 4 required and 3 optional entries, in the order:\n\t *\n\t * <ul>\n\t *  <li>The first four, `x`, `y`, `width`, and `height` are required and define the frame rectangle.</li>\n\t *  <li>The fifth, `imageIndex`, specifies the index of the source image (defaults to 0)</li>\n\t *  <li>The last two, `regX` and `regY` specify the registration point of the frame</li>\n\t * </ul>\n\t *\n\t * \tframes: [\n\t * \t\t// x, y, width, height, imageIndex*, regX*, regY*\n\t * \t\t[64, 0, 96, 64],\n\t * \t\t[0, 0, 64, 64, 1, 32, 32]\n\t * \t\t// etc.\n\t * \t]\n\t *\n\t * <h4>animations</h4>\n\t * Optional. An object defining sequences of frames to play as named animations. Each property corresponds to an\n\t * animation of the same name. Each animation must specify the frames to play, and may\n\t * also include a relative playback `speed` (ex. 2 would playback at double speed, 0.5 at half), and\n\t * the name of the `next` animation to sequence to after it completes.\n\t *\n\t * There are three formats supported for defining the frames in an animation, which can be mixed and matched as appropriate:\n\t * <ol>\n\t * \t<li>for a single frame animation, you can simply specify the frame index\n\t *\n\t * \t\tanimations: {\n\t * \t\t\tsit: 7\n\t * \t\t}\n\t *\n\t * </li>\n\t * <li>\n\t *      for an animation of consecutive frames, you can use an array with two required, and two optional entries\n\t * \t\tin the order: `start`, `end`, `next`, and `speed`. This will play the frames from start to end inclusive.\n\t *\n\t * \t\tanimations: {\n\t * \t\t\t// start, end, next*, speed*\n\t * \t\t\trun: [0, 8],\n\t * \t\t\tjump: [9, 12, \"run\", 2]\n\t * \t\t}\n\t *\n\t *  </li>\n\t *  <li>\n\t *     for non-consecutive frames, you can use an object with a `frames` property defining an array of frame\n\t *     indexes to play in order. The object can also specify `next` and `speed` properties.\n\t *\n\t * \t\tanimations: {\n\t * \t\t\twalk: {\n\t * \t\t\t\tframes: [1,2,3,3,2,1]\n\t * \t\t\t},\n\t * \t\t\tshoot: {\n\t * \t\t\t\tframes: [1,4,5,6],\n\t * \t\t\t\tnext: \"walk\",\n\t * \t\t\t\tspeed: 0.5\n\t * \t\t\t}\n\t * \t\t}\n\t *\n\t *  </li>\n\t * </ol>\n\t * <strong>Note:</strong> the `speed` property was added in EaselJS 0.7.0. Earlier versions had a `frequency`\n\t * property instead, which was the inverse of `speed`. For example, a value of \"4\" would be 1/4 normal speed in\n\t * earlier versions, but is 4x normal speed in EaselJS 0.7.0+.\n\t *\n\t * <h4>framerate</h4>\n\t * Optional. Indicates the default framerate to play this spritesheet at in frames per second. See\n\t * {{#crossLink \"SpriteSheet/framerate:property\"}}{{/crossLink}} for more information.\n\t *\n\t * \t\tframerate: 20\n\t *\n\t * Note that the Sprite framerate will only work if the stage update method is provided with the {{#crossLink \"Ticker/tick:event\"}}{{/crossLink}}\n\t * event generated by the {{#crossLink \"Ticker\"}}{{/crossLink}}.\n\t *\n\t * \t\tcreatejs.Ticker.on(\"tick\", handleTick);\n\t * \t\tfunction handleTick(event) {\n\t *\t\t\tstage.update(event);\n\t *\t\t}\n\t *\n\t * <h3>Example</h3>\n\t * To define a simple sprite sheet, with a single image \"sprites.jpg\" arranged in a regular 50x50 grid with three\n\t * animations: \"stand\" showing the first frame, \"run\" looping frame 1-5 inclusive, and \"jump\" playing frame 6-8 and\n\t * sequencing back to run.\n\t *\n\t * \t\tvar data = {\n\t * \t\t\timages: [\"sprites.jpg\"],\n\t * \t\t\tframes: {width:50, height:50},\n\t * \t\t\tanimations: {\n\t * \t\t\t\tstand:0,\n\t * \t\t\t\trun:[1,5],\n\t * \t\t\t\tjump:[6,8,\"run\"]\n\t * \t\t\t}\n\t * \t\t};\n\t * \t\tvar spriteSheet = new createjs.SpriteSheet(data);\n\t * \t\tvar animation = new createjs.Sprite(spriteSheet, \"run\");\n\t *\n\t * <h3>Generating SpriteSheet Images</h3>\n\t * Spritesheets can be created manually by combining images in PhotoShop, and specifying the frame size or\n\t * coordinates manually, however there are a number of tools that facilitate this.\n\t * <ul>\n\t *     <li>Exporting SpriteSheets or HTML5 content from Adobe Flash/Animate supports the EaselJS SpriteSheet format.</li>\n\t *     <li>The popular <a href=\"https://www.codeandweb.com/texturepacker/easeljs\" target=\"_blank\">Texture Packer</a> has\n\t *     EaselJS support.\n\t *     <li>SWF animations in Adobe Flash/Animate can be exported to SpriteSheets using <a href=\"http://createjs.com/zoe\" target=\"_blank\">Zo&euml;</a></li>\n\t * </ul>\n\t *\n\t * <h3>Cross Origin Issues</h3>\n\t * <strong>Warning:</strong> Images loaded cross-origin will throw cross-origin security errors when interacted with\n\t * using:\n\t * <ul>\n\t *     <li>a mouse</li>\n\t *     <li>methods such as {{#crossLink \"Container/getObjectUnderPoint\"}}{{/crossLink}}</li>\n\t *     <li>Filters (see {{#crossLink \"Filter\"}}{{/crossLink}})</li>\n\t *     <li>caching (see {{#crossLink \"DisplayObject/cache\"}}{{/crossLink}})</li>\n\t * </ul>\n\t * You can get around this by setting `crossOrigin` property on your images before passing them to EaselJS, or\n\t * setting the `crossOrigin` property on PreloadJS' LoadQueue or LoadItems.\n\t *\n\t * \t\tvar image = new Image();\n\t * \t\timg.crossOrigin=\"Anonymous\";\n\t * \t\timg.src = \"http://server-with-CORS-support.com/path/to/image.jpg\";\n\t *\n\t * If you pass string paths to SpriteSheets, they will not work cross-origin. The server that stores the image must\n\t * support cross-origin requests, or this will not work. For more information, check out\n\t * <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS\" target=\"_blank\">CORS overview on MDN</a>.\n\t *\n\t * @class SpriteSheet\n\t * @constructor\n\t * @param {Object} data An object describing the SpriteSheet data.\n\t * @extends EventDispatcher\n\t **/\n\tfunction SpriteSheet(data) {\n\t\tthis.EventDispatcher_constructor();\n\n\n\t\t// public properties:\n\t\t/**\n\t\t * Indicates whether all images are finished loading.\n\t\t * @property complete\n\t\t * @type Boolean\n\t\t * @readonly\n\t\t **/\n\t\tthis.complete = true;\n\n\t\t/**\n\t\t * Specifies the framerate to use by default for Sprite instances using the SpriteSheet. See the Sprite class\n\t\t * {{#crossLink \"Sprite/framerate:property\"}}{{/crossLink}} for more information.\n\t\t * @property framerate\n\t\t * @type Number\n\t\t **/\n\t\tthis.framerate = 0;\n\n\n\t\t// private properties:\n\t\t/**\n\t\t * @property _animations\n\t\t * @protected\n\t\t * @type Array\n\t\t **/\n\t\tthis._animations = null;\n\n\t\t/**\n\t\t * @property _frames\n\t\t * @protected\n\t\t * @type Array\n\t\t **/\n\t\tthis._frames = null;\n\n\t\t/**\n\t\t * @property _images\n\t\t * @protected\n\t\t * @type Array\n\t\t **/\n\t\tthis._images = null;\n\n\t\t/**\n\t\t * @property _data\n\t\t * @protected\n\t\t * @type Object\n\t\t **/\n\t\tthis._data = null;\n\n\t\t/**\n\t\t * @property _loadCount\n\t\t * @protected\n\t\t * @type Number\n\t\t **/\n\t\tthis._loadCount = 0;\n\n\t\t// only used for simple frame defs:\n\t\t/**\n\t\t * @property _frameHeight\n\t\t * @protected\n\t\t * @type Number\n\t\t **/\n\t\tthis._frameHeight = 0;\n\n\t\t/**\n\t\t * @property _frameWidth\n\t\t * @protected\n\t\t * @type Number\n\t\t **/\n\t\tthis._frameWidth = 0;\n\n\t\t/**\n\t\t * @property _numFrames\n\t\t * @protected\n\t\t * @type Number\n\t\t **/\n\t\tthis._numFrames = 0;\n\n\t\t/**\n\t\t * @property _regX\n\t\t * @protected\n\t\t * @type Number\n\t\t **/\n\t\tthis._regX = 0;\n\n\t\t/**\n\t\t * @property _regY\n\t\t * @protected\n\t\t * @type Number\n\t\t **/\n\t\tthis._regY = 0;\n\n\t\t/**\n\t\t * @property _spacing\n\t\t * @protected\n\t\t * @type Number\n\t\t **/\n\t\tthis._spacing = 0;\n\n\t\t/**\n\t\t * @property _margin\n\t\t * @protected\n\t\t * @type Number\n\t\t **/\n\t\tthis._margin = 0;\n\n\t\t// setup:\n\t\tthis._parseData(data);\n\t}\n\tvar p = createjs.extend(SpriteSheet, createjs.EventDispatcher);\n\n\t// TODO: deprecated\n\t// p.initialize = function() {}; // searchable for devs wondering where it is. REMOVED. See docs for details.\n\n\n// events:\n\t/**\n\t * Dispatched when all images are loaded.  Note that this only fires if the images\n\t * were not fully loaded when the sprite sheet was initialized. You should check the complete property\n\t * to prior to adding a listener. Ex.\n\t *\n\t * \tvar sheet = new createjs.SpriteSheet(data);\n\t * \tif (!sheet.complete) {\n\t * \t\t// not preloaded, listen for the complete event:\n\t * \t\tsheet.addEventListener(\"complete\", handler);\n\t * \t}\n\t *\n\t * @event complete\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type.\n\t * @since 0.6.0\n\t */\n\n\t/**\n\t * Dispatched when getFrame is called with a valid frame index. This is primarily intended for use by {{#crossLink \"SpriteSheetBuilder\"}}{{/crossLink}}\n\t * when doing on-demand rendering.\n\t * @event getframe\n\t * @param {Number} index The frame index.\n\t * @param {Object} frame The frame object that getFrame will return.\n\t */\n\n\t/**\n\t * Dispatched when an image encounters an error. A SpriteSheet will dispatch an error event for each image that\n\t * encounters an error, and will still dispatch a {{#crossLink \"SpriteSheet/complete:event\"}}{{/crossLink}}\n\t * event once all images are finished processing, even if an error is encountered.\n\t * @event error\n\t * @param {String} src The source of the image that failed to load.\n\t * @since 0.8.2\n\t */\n\n\n// getter / setters:\n\t/**\n\t * Use the {{#crossLink \"SpriteSheet/animations:property\"}}{{/crossLink}} property instead.\n\t * @method _getAnimations\n\t * @protected\n\t * @return {Array}\n\t **/\n\tp._getAnimations = function() {\n\t\treturn this._animations.slice();\n\t};\n\t// SpriteSheet.getAnimations is @deprecated. Remove for 1.1+\n\tp.getAnimations = createjs.deprecate(p._getAnimations, \"SpriteSheet.getAnimations\");\n\n\t/**\n\t * Returns an array of all available animation names available on this sprite sheet as strings.\n\t * @property animations\n\t * @type {Array}\n\t * @readonly\n\t **/\n\ttry {\n\t\tObject.defineProperties(p, {\n\t\t\tanimations: { get: p._getAnimations }\n\t\t});\n\t} catch (e) {}\n\n\n// public methods:\n\t/**\n\t * Returns the total number of frames in the specified animation, or in the whole sprite\n\t * sheet if the animation param is omitted. Returns 0 if the spritesheet relies on calculated frame counts, and\n\t * the images have not been fully loaded.\n\t * @method getNumFrames\n\t * @param {String} animation The name of the animation to get a frame count for.\n\t * @return {Number} The number of frames in the animation, or in the entire sprite sheet if the animation param is omitted.\n\t */\n\tp.getNumFrames = function(animation) {\n\t\tif (animation == null) {\n\t\t\treturn this._frames ? this._frames.length : this._numFrames || 0;\n\t\t} else {\n\t\t\tvar data = this._data[animation];\n\t\t\tif (data == null) { return 0; }\n\t\t\telse { return data.frames.length; }\n\t\t}\n\t};\n\n\t/**\n\t * Returns an object defining the specified animation. The returned object contains:<UL>\n\t * \t<li>frames: an array of the frame ids in the animation</li>\n\t * \t<li>speed: the playback speed for this animation</li>\n\t * \t<li>name: the name of the animation</li>\n\t * \t<li>next: the default animation to play next. If the animation loops, the name and next property will be the\n\t * \tsame.</li>\n\t * </UL>\n\t * @method getAnimation\n\t * @param {String} name The name of the animation to get.\n\t * @return {Object} a generic object with frames, speed, name, and next properties.\n\t **/\n\tp.getAnimation = function(name) {\n\t\treturn this._data[name];\n\t};\n\n\t/**\n\t * Returns an object specifying the image and source rect of the specified frame. The returned object has:<UL>\n\t * \t<li>an image property holding a reference to the image object in which the frame is found</li>\n\t * \t<li>a rect property containing a Rectangle instance which defines the boundaries for the frame within that\n\t * \timage.</li>\n\t * \t<li> A regX and regY property corresponding to the regX/Y values for the frame.\n\t * </UL>\n\t * @method getFrame\n\t * @param {Number} frameIndex The index of the frame.\n\t * @return {Object} a generic object with image and rect properties. Returns null if the frame does not exist.\n\t **/\n\tp.getFrame = function(frameIndex) {\n\t\tvar frame;\n\t\tif (this._frames && (frame=this._frames[frameIndex])) { return frame; }\n\t\treturn null;\n\t};\n\n\t/**\n\t * Returns a {{#crossLink \"Rectangle\"}}{{/crossLink}} instance defining the bounds of the specified frame relative\n\t * to the origin. For example, a 90 x 70 frame with a regX of 50 and a regY of 40 would return:\n\t *\n\t * \t[x=-50, y=-40, width=90, height=70]\n\t *\n\t * @method getFrameBounds\n\t * @param {Number} frameIndex The index of the frame.\n\t * @param {Rectangle} [rectangle] A Rectangle instance to copy the values into. By default a new instance is created.\n\t * @return {Rectangle} A Rectangle instance. Returns null if the frame does not exist, or the image is not fully loaded.\n\t **/\n\tp.getFrameBounds = function(frameIndex, rectangle) {\n\t\tvar frame = this.getFrame(frameIndex);\n\t\treturn frame ? (rectangle||new createjs.Rectangle()).setValues(-frame.regX, -frame.regY, frame.rect.width, frame.rect.height) : null;\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[SpriteSheet]\";\n\t};\n\n\t/**\n\t * SpriteSheet cannot be cloned. A SpriteSheet can be shared by multiple Sprite instances without cloning it.\n\t * @method clone\n\t **/\n\tp.clone = function() {\n\t\tthrow(\"SpriteSheet cannot be cloned.\")\n\t};\n\n// private methods:\n\t/**\n\t * @method _parseData\n\t * @param {Object} data An object describing the SpriteSheet data.\n\t * @protected\n\t **/\n\tp._parseData = function(data) {\n\t\tvar i,l,o,a;\n\t\tif (data == null) { return; }\n\n\t\tthis.framerate = data.framerate||0;\n\n\t\t// parse images:\n\t\tif (data.images && (l=data.images.length) > 0) {\n\t\t\ta = this._images = [];\n\t\t\tfor (i=0; i<l; i++) {\n\t\t\t\tvar img = data.images[i];\n\t\t\t\tif (typeof img == \"string\") {\n\t\t\t\t\tvar src = img;\n\t\t\t\t\timg = document.createElement(\"img\");\n\t\t\t\t\timg.src = src;\n\t\t\t\t}\n\t\t\t\ta.push(img);\n\t\t\t\tif (!img.getContext && !img.naturalWidth) {\n\t\t\t\t\tthis._loadCount++;\n\t\t\t\t\tthis.complete = false;\n\t\t\t\t\t(function(o, src) { img.onload = function() { o._handleImageLoad(src); } })(this, src);\n\t\t\t\t\t(function(o, src) { img.onerror = function() { o._handleImageError(src); } })(this, src);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// parse frames:\n\t\tif (data.frames == null) { // nothing\n\t\t} else if (Array.isArray(data.frames)) {\n\t\t\tthis._frames = [];\n\t\t\ta = data.frames;\n\t\t\tfor (i=0,l=a.length;i<l;i++) {\n\t\t\t\tvar arr = a[i];\n\t\t\t\tthis._frames.push({image:this._images[arr[4]?arr[4]:0], rect:new createjs.Rectangle(arr[0],arr[1],arr[2],arr[3]), regX:arr[5]||0, regY:arr[6]||0 });\n\t\t\t}\n\t\t} else {\n\t\t\to = data.frames;\n\t\t\tthis._frameWidth = o.width;\n\t\t\tthis._frameHeight = o.height;\n\t\t\tthis._regX = o.regX||0;\n\t\t\tthis._regY = o.regY||0;\n\t\t\tthis._spacing = o.spacing||0;\n\t\t\tthis._margin = o.margin||0;\n\t\t\tthis._numFrames = o.count;\n\t\t\tif (this._loadCount == 0) { this._calculateFrames(); }\n\t\t}\n\n\t\t// parse animations:\n\t\tthis._animations = [];\n\t\tif ((o=data.animations) != null) {\n\t\t\tthis._data = {};\n\t\t\tvar name;\n\t\t\tfor (name in o) {\n\t\t\t\tvar anim = {name:name};\n\t\t\t\tvar obj = o[name];\n\t\t\t\tif (typeof obj == \"number\") { // single frame\n\t\t\t\t\ta = anim.frames = [obj];\n\t\t\t\t} else if (Array.isArray(obj)) { // simple\n\t\t\t\t\tif (obj.length == 1) { anim.frames = [obj[0]]; }\n\t\t\t\t\telse {\n\t\t\t\t\t\tanim.speed = obj[3];\n\t\t\t\t\t\tanim.next = obj[2];\n\t\t\t\t\t\ta = anim.frames = [];\n\t\t\t\t\t\tfor (i=obj[0];i<=obj[1];i++) {\n\t\t\t\t\t\t\ta.push(i);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else { // complex\n\t\t\t\t\tanim.speed = obj.speed;\n\t\t\t\t\tanim.next = obj.next;\n\t\t\t\t\tvar frames = obj.frames;\n\t\t\t\t\ta = anim.frames = (typeof frames == \"number\") ? [frames] : frames.slice(0);\n\t\t\t\t}\n\t\t\t\tif (anim.next === true || anim.next === undefined) { anim.next = name; } // loop\n\t\t\t\tif (anim.next === false || (a.length < 2 && anim.next == name)) { anim.next = null; } // stop\n\t\t\t\tif (!anim.speed) { anim.speed = 1; }\n\t\t\t\tthis._animations.push(name);\n\t\t\t\tthis._data[name] = anim;\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * @method _handleImageLoad\n\t * @protected\n\t **/\n\tp._handleImageLoad = function(src) {\n\t\tif (--this._loadCount == 0) {\n\t\t\tthis._calculateFrames();\n\t\t\tthis.complete = true;\n\t\t\tthis.dispatchEvent(\"complete\");\n\t\t}\n\t};\n\n\t/**\n\t * @method _handleImageError\n\t * @protected\n\t */\n\tp._handleImageError = function (src) {\n\t\tvar errorEvent = new createjs.Event(\"error\");\n\t\terrorEvent.src = src;\n\t\tthis.dispatchEvent(errorEvent);\n\n\t\t// Complete is still dispatched.\n\t\tif (--this._loadCount == 0) {\n\t\t\tthis.dispatchEvent(\"complete\");\n\t\t}\n\t};\n\n\t/**\n\t * @method _calculateFrames\n\t * @protected\n\t **/\n\tp._calculateFrames = function() {\n\t\tif (this._frames || this._frameWidth == 0) { return; }\n\n\t\tthis._frames = [];\n\n\t\tvar maxFrames = this._numFrames || 100000; // if we go over this, something is wrong.\n\t\tvar frameCount = 0, frameWidth = this._frameWidth, frameHeight = this._frameHeight;\n\t\tvar spacing = this._spacing, margin = this._margin;\n\t\t\n\t\timgLoop:\n\t\tfor (var i=0, imgs=this._images; i<imgs.length; i++) {\n\t\t\tvar img = imgs[i], imgW = (img.width||img.naturalWidth), imgH = (img.height||img.naturalHeight);\n\n\t\t\tvar y = margin;\n\t\t\twhile (y <= imgH-margin-frameHeight) {\n\t\t\t\tvar x = margin;\n\t\t\t\twhile (x <= imgW-margin-frameWidth) {\n\t\t\t\t\tif (frameCount >= maxFrames) { break imgLoop; }\n\t\t\t\t\tframeCount++;\n\t\t\t\t\tthis._frames.push({\n\t\t\t\t\t\t\timage: img,\n\t\t\t\t\t\t\trect: new createjs.Rectangle(x, y, frameWidth, frameHeight),\n\t\t\t\t\t\t\tregX: this._regX,\n\t\t\t\t\t\t\tregY: this._regY\n\t\t\t\t\t\t});\n\t\t\t\t\tx += frameWidth+spacing;\n\t\t\t\t}\n\t\t\t\ty += frameHeight+spacing;\n\t\t\t}\n\t\t}\n\t\tthis._numFrames = frameCount;\n\t};\n\n\n\tcreatejs.SpriteSheet = createjs.promote(SpriteSheet, \"EventDispatcher\");\n}());\n\n//##############################################################################\n// Graphics.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * The Graphics class exposes an easy to use API for generating vector drawing instructions and drawing them to a\n\t * specified context. Note that you can use Graphics without any dependency on the EaselJS framework by calling {{#crossLink \"Graphics/draw\"}}{{/crossLink}}\n\t * directly, or it can be used with the {{#crossLink \"Shape\"}}{{/crossLink}} object to draw vector graphics within the\n\t * context of an EaselJS display list.\n\t *\n\t * There are two approaches to working with Graphics object: calling methods on a Graphics instance (the \"Graphics API\"), or\n\t * instantiating Graphics command objects and adding them to the graphics queue via {{#crossLink \"Graphics/append\"}}{{/crossLink}}.\n\t * The former abstracts the latter, simplifying beginning and ending paths, fills, and strokes.\n\t *\n\t *      var g = new createjs.Graphics();\n\t *      g.setStrokeStyle(1);\n\t *      g.beginStroke(\"#000000\");\n\t *      g.beginFill(\"red\");\n\t *      g.drawCircle(0,0,30);\n\t *\n\t * All drawing methods in Graphics return the Graphics instance, so they can be chained together. For example,\n\t * the following line of code would generate the instructions to draw a rectangle with a red stroke and blue fill:\n\t *\n\t *      myGraphics.beginStroke(\"red\").beginFill(\"blue\").drawRect(20, 20, 100, 50);\n\t *\n\t * Each graphics API call generates a command object (see below). The last command to be created can be accessed via\n\t * {{#crossLink \"Graphics/command:property\"}}{{/crossLink}}:\n\t *\n\t *      var fillCommand = myGraphics.beginFill(\"red\").command;\n\t *      // ... later, update the fill style/color:\n\t *      fillCommand.style = \"blue\";\n\t *      // or change it to a bitmap fill:\n\t *      fillCommand.bitmap(myImage);\n\t *\n\t * For more direct control of rendering, you can instantiate and append command objects to the graphics queue directly. In this case, you\n\t * need to manage path creation manually, and ensure that fill/stroke is applied to a defined path:\n\t *\n\t *      // start a new path. Graphics.beginCmd is a reusable BeginPath instance:\n\t *      myGraphics.append(createjs.Graphics.beginCmd);\n\t *      // we need to define the path before applying the fill:\n\t *      var circle = new createjs.Graphics.Circle(0,0,30);\n\t *      myGraphics.append(circle);\n\t *      // fill the path we just defined:\n\t *      var fill = new createjs.Graphics.Fill(\"red\");\n\t *      myGraphics.append(fill);\n\t *\n\t * These approaches can be used together, for example to insert a custom command:\n\t *\n\t *      myGraphics.beginFill(\"red\");\n\t *      var customCommand = new CustomSpiralCommand(etc);\n\t *      myGraphics.append(customCommand);\n\t *      myGraphics.beginFill(\"blue\");\n\t *      myGraphics.drawCircle(0, 0, 30);\n\t *\n\t * See {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more info on creating custom commands.\n\t *\n\t * <h4>Tiny API</h4>\n\t * The Graphics class also includes a \"tiny API\", which is one or two-letter methods that are shortcuts for all of the\n\t * Graphics methods. These methods are great for creating compact instructions, and is used by the Toolkit for CreateJS\n\t * to generate readable code. All tiny methods are marked as protected, so you can view them by enabling protected\n\t * descriptions in the docs.\n\t *\n\t * <table>\n\t *     <tr><td><b>Tiny</b></td><td><b>Method</b></td><td><b>Tiny</b></td><td><b>Method</b></td></tr>\n\t *     <tr><td>mt</td><td>{{#crossLink \"Graphics/moveTo\"}}{{/crossLink}} </td>\n\t *     <td>lt</td> <td>{{#crossLink \"Graphics/lineTo\"}}{{/crossLink}}</td></tr>\n\t *     <tr><td>a/at</td><td>{{#crossLink \"Graphics/arc\"}}{{/crossLink}} / {{#crossLink \"Graphics/arcTo\"}}{{/crossLink}} </td>\n\t *     <td>bt</td><td>{{#crossLink \"Graphics/bezierCurveTo\"}}{{/crossLink}} </td></tr>\n\t *     <tr><td>qt</td><td>{{#crossLink \"Graphics/quadraticCurveTo\"}}{{/crossLink}} (also curveTo)</td>\n\t *     <td>r</td><td>{{#crossLink \"Graphics/rect\"}}{{/crossLink}} </td></tr>\n\t *     <tr><td>cp</td><td>{{#crossLink \"Graphics/closePath\"}}{{/crossLink}} </td>\n\t *     <td>c</td><td>{{#crossLink \"Graphics/clear\"}}{{/crossLink}} </td></tr>\n\t *     <tr><td>f</td><td>{{#crossLink \"Graphics/beginFill\"}}{{/crossLink}} </td>\n\t *     <td>lf</td><td>{{#crossLink \"Graphics/beginLinearGradientFill\"}}{{/crossLink}} </td></tr>\n\t *     <tr><td>rf</td><td>{{#crossLink \"Graphics/beginRadialGradientFill\"}}{{/crossLink}} </td>\n\t *     <td>bf</td><td>{{#crossLink \"Graphics/beginBitmapFill\"}}{{/crossLink}} </td></tr>\n\t *     <tr><td>ef</td><td>{{#crossLink \"Graphics/endFill\"}}{{/crossLink}} </td>\n\t *     <td>ss / sd</td><td>{{#crossLink \"Graphics/setStrokeStyle\"}}{{/crossLink}} / {{#crossLink \"Graphics/setStrokeDash\"}}{{/crossLink}} </td></tr>\n\t *     <tr><td>s</td><td>{{#crossLink \"Graphics/beginStroke\"}}{{/crossLink}} </td>\n\t *     <td>ls</td><td>{{#crossLink \"Graphics/beginLinearGradientStroke\"}}{{/crossLink}} </td></tr>\n\t *     <tr><td>rs</td><td>{{#crossLink \"Graphics/beginRadialGradientStroke\"}}{{/crossLink}} </td>\n\t *     <td>bs</td><td>{{#crossLink \"Graphics/beginBitmapStroke\"}}{{/crossLink}} </td></tr>\n\t *     <tr><td>es</td><td>{{#crossLink \"Graphics/endStroke\"}}{{/crossLink}} </td>\n\t *     <td>dr</td><td>{{#crossLink \"Graphics/drawRect\"}}{{/crossLink}} </td></tr>\n\t *     <tr><td>rr</td><td>{{#crossLink \"Graphics/drawRoundRect\"}}{{/crossLink}} </td>\n\t *     <td>rc</td><td>{{#crossLink \"Graphics/drawRoundRectComplex\"}}{{/crossLink}} </td></tr>\n\t *     <tr><td>dc</td><td>{{#crossLink \"Graphics/drawCircle\"}}{{/crossLink}} </td>\n\t *     <td>de</td><td>{{#crossLink \"Graphics/drawEllipse\"}}{{/crossLink}} </td></tr>\n\t *     <tr><td>dp</td><td>{{#crossLink \"Graphics/drawPolyStar\"}}{{/crossLink}} </td>\n\t *     <td>p</td><td>{{#crossLink \"Graphics/decodePath\"}}{{/crossLink}} </td></tr>\n\t * </table>\n\t *\n\t * Here is the above example, using the tiny API instead.\n\t *\n\t *      myGraphics.s(\"red\").f(\"blue\").r(20, 20, 100, 50);\n\t *\n\t * @class Graphics\n\t * @constructor\n\t **/\n\tfunction Graphics() {\n\n\n\t// public properties\n\t\t/**\n\t\t * Holds a reference to the last command that was created or appended. For example, you could retain a reference\n\t\t * to a Fill command in order to dynamically update the color later by using:\n\t\t *\n\t\t * \t\tvar myFill = myGraphics.beginFill(\"red\").command;\n\t\t * \t\t// update color later:\n\t\t * \t\tmyFill.style = \"yellow\";\n\t\t *\n\t\t * @property command\n\t\t * @type Object\n\t\t **/\n\t\tthis.command = null;\n\n\n\t// private properties\n\t\t/**\n\t\t * @property _stroke\n\t\t * @protected\n\t\t * @type {Stroke}\n\t\t **/\n\t\tthis._stroke = null;\n\n\t\t/**\n\t\t * @property _strokeStyle\n\t\t * @protected\n\t\t * @type {StrokeStyle}\n\t\t **/\n\t\tthis._strokeStyle = null;\n\t\t\n\t\t/**\n\t\t * @property _oldStrokeStyle\n\t\t * @protected\n\t\t * @type {StrokeStyle}\n\t\t **/\n\t\tthis._oldStrokeStyle = null;\n\t\t\n\t\t/**\n\t\t * @property _strokeDash\n\t\t * @protected\n\t\t * @type {StrokeDash}\n\t\t **/\n\t\tthis._strokeDash = null;\n\t\t\n\t\t/**\n\t\t * @property _oldStrokeDash\n\t\t * @protected\n\t\t * @type {StrokeDash}\n\t\t **/\n\t\tthis._oldStrokeDash = null;\n\n\t\t/**\n\t\t * @property _strokeIgnoreScale\n\t\t * @protected\n\t\t * @type Boolean\n\t\t **/\n\t\tthis._strokeIgnoreScale = false;\n\n\t\t/**\n\t\t * @property _fill\n\t\t * @protected\n\t\t * @type {Fill}\n\t\t **/\n\t\tthis._fill = null;\n\n\t\t/**\n\t\t * @property _instructions\n\t\t * @protected\n\t\t * @type {Array}\n\t\t **/\n\t\tthis._instructions = [];\n\n\t\t/**\n\t\t * Indicates the last instruction index that was committed.\n\t\t * @property _commitIndex\n\t\t * @protected\n\t\t * @type {Number}\n\t\t **/\n\t\tthis._commitIndex = 0;\n\n\t\t/**\n\t\t * Uncommitted instructions.\n\t\t * @property _activeInstructions\n\t\t * @protected\n\t\t * @type {Array}\n\t\t **/\n\t\tthis._activeInstructions = [];\n\n\t\t/**\n\t\t * This indicates that there have been changes to the activeInstruction list since the last updateInstructions call.\n\t\t * @property _dirty\n\t\t * @protected\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t **/\n\t\tthis._dirty = false;\n\n\t\t/**\n\t\t * Index to draw from if a store operation has happened.\n\t\t * @property _storeIndex\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t **/\n\t\tthis._storeIndex = 0;\n\n\t// setup:\n\t\tthis.clear();\n\t}\n\tvar p = Graphics.prototype;\n\tvar G = Graphics; // shortcut\n\n// static public methods:\n\t/**\n\t * Returns a CSS compatible color string based on the specified RGB numeric color values in the format\n\t * \"rgba(255,255,255,1.0)\", or if alpha is null then in the format \"rgb(255,255,255)\". For example,\n\t *\n\t *      createjs.Graphics.getRGB(50, 100, 150, 0.5);\n\t *      // Returns \"rgba(50,100,150,0.5)\"\n\t *\n\t * It also supports passing a single hex color value as the first param, and an optional alpha value as the second\n\t * param. For example,\n\t *\n\t *      createjs.Graphics.getRGB(0xFF00FF, 0.2);\n\t *      // Returns \"rgba(255,0,255,0.2)\"\n\t *\n\t * @method getRGB\n\t * @static\n\t * @param {Number} r The red component for the color, between 0 and 0xFF (255).\n\t * @param {Number} g The green component for the color, between 0 and 0xFF (255).\n\t * @param {Number} b The blue component for the color, between 0 and 0xFF (255).\n\t * @param {Number} [alpha] The alpha component for the color where 0 is fully transparent and 1 is fully opaque.\n\t * @return {String} A CSS compatible color string based on the specified RGB numeric color values in the format\n\t * \"rgba(255,255,255,1.0)\", or if alpha is null then in the format \"rgb(255,255,255)\".\n\t **/\n\tGraphics.getRGB = function(r, g, b, alpha) {\n\t\tif (r != null && b == null) {\n\t\t\talpha = g;\n\t\t\tb = r&0xFF;\n\t\t\tg = r>>8&0xFF;\n\t\t\tr = r>>16&0xFF;\n\t\t}\n\t\tif (alpha == null) {\n\t\t\treturn \"rgb(\"+r+\",\"+g+\",\"+b+\")\";\n\t\t} else {\n\t\t\treturn \"rgba(\"+r+\",\"+g+\",\"+b+\",\"+alpha+\")\";\n\t\t}\n\t};\n\n\t/**\n\t * Returns a CSS compatible color string based on the specified HSL numeric color values in the format \"hsla(360,100,100,1.0)\",\n\t * or if alpha is null then in the format \"hsl(360,100,100)\".\n\t *\n\t *      createjs.Graphics.getHSL(150, 100, 70);\n\t *      // Returns \"hsl(150,100,70)\"\n\t *\n\t * @method getHSL\n\t * @static\n\t * @param {Number} hue The hue component for the color, between 0 and 360.\n\t * @param {Number} saturation The saturation component for the color, between 0 and 100.\n\t * @param {Number} lightness The lightness component for the color, between 0 and 100.\n\t * @param {Number} [alpha] The alpha component for the color where 0 is fully transparent and 1 is fully opaque.\n\t * @return {String} A CSS compatible color string based on the specified HSL numeric color values in the format\n\t * \"hsla(360,100,100,1.0)\", or if alpha is null then in the format \"hsl(360,100,100)\".\n\t **/\n\tGraphics.getHSL = function(hue, saturation, lightness, alpha) {\n\t\tif (alpha == null) {\n\t\t\treturn \"hsl(\"+(hue%360)+\",\"+saturation+\"%,\"+lightness+\"%)\";\n\t\t} else {\n\t\t\treturn \"hsla(\"+(hue%360)+\",\"+saturation+\"%,\"+lightness+\"%,\"+alpha+\")\";\n\t\t}\n\t};\n\n\n// static properties:\n\t/**\n\t * A reusable instance of {{#crossLink \"Graphics/BeginPath\"}}{{/crossLink}} to avoid\n\t * unnecessary instantiation.\n\t * @property beginCmd\n\t * @type {Graphics.BeginPath}\n\t * @static\n\t **/\n\t // defined at the bottom of this file.\n\n\t/**\n\t * Map of Base64 characters to values. Used by {{#crossLink \"Graphics/decodePath\"}}{{/crossLink}}.\n\t * @property BASE_64\n\t * @static\n\t * @final\n\t * @readonly\n\t * @type {Object}\n\t **/\n\tGraphics.BASE_64 = {\"A\":0,\"B\":1,\"C\":2,\"D\":3,\"E\":4,\"F\":5,\"G\":6,\"H\":7,\"I\":8,\"J\":9,\"K\":10,\"L\":11,\"M\":12,\"N\":13,\"O\":14,\"P\":15,\"Q\":16,\"R\":17,\"S\":18,\"T\":19,\"U\":20,\"V\":21,\"W\":22,\"X\":23,\"Y\":24,\"Z\":25,\"a\":26,\"b\":27,\"c\":28,\"d\":29,\"e\":30,\"f\":31,\"g\":32,\"h\":33,\"i\":34,\"j\":35,\"k\":36,\"l\":37,\"m\":38,\"n\":39,\"o\":40,\"p\":41,\"q\":42,\"r\":43,\"s\":44,\"t\":45,\"u\":46,\"v\":47,\"w\":48,\"x\":49,\"y\":50,\"z\":51,\"0\":52,\"1\":53,\"2\":54,\"3\":55,\"4\":56,\"5\":57,\"6\":58,\"7\":59,\"8\":60,\"9\":61,\"+\":62,\"/\":63};\n\n\t/**\n\t * Maps numeric values for the caps parameter of {{#crossLink \"Graphics/setStrokeStyle\"}}{{/crossLink}} to\n\t * corresponding string values. This is primarily for use with the tiny API. The mappings are as follows: 0 to\n\t * \"butt\", 1 to \"round\", and 2 to \"square\".\n\t * For example, to set the line caps to \"square\":\n\t *\n\t *      myGraphics.ss(16, 2);\n\t *\n\t * @property STROKE_CAPS_MAP\n\t * @static\n\t * @final\n\t * @readonly\n\t * @type {Array}\n\t **/\n\tGraphics.STROKE_CAPS_MAP = [\"butt\", \"round\", \"square\"];\n\n\t/**\n\t * Maps numeric values for the joints parameter of {{#crossLink \"Graphics/setStrokeStyle\"}}{{/crossLink}} to\n\t * corresponding string values. This is primarily for use with the tiny API. The mappings are as follows: 0 to\n\t * \"miter\", 1 to \"round\", and 2 to \"bevel\".\n\t * For example, to set the line joints to \"bevel\":\n\t *\n\t *      myGraphics.ss(16, 0, 2);\n\t *\n\t * @property STROKE_JOINTS_MAP\n\t * @static\n\t * @final\n\t * @readonly\n\t * @type {Array}\n\t **/\n\tGraphics.STROKE_JOINTS_MAP = [\"miter\", \"round\", \"bevel\"];\n\n\t/**\n\t * @property _ctx\n\t * @static\n\t * @protected\n\t * @type {CanvasRenderingContext2D}\n\t **/\n\tvar canvas = (createjs.createCanvas?createjs.createCanvas():document.createElement(\"canvas\"));\n\tif (canvas.getContext) {\n\t\tGraphics._ctx = canvas.getContext(\"2d\");\n\t\tcanvas.width = canvas.height = 1;\n\t}\n\n\n// getter / setters:\n\t/**\n\t * Use the {{#crossLink \"Graphics/instructions:property\"}}{{/crossLink}} property instead.\n\t * @method _getInstructions\n\t * @protected\n\t * @return {Array} The instructions array, useful for chaining\n\t **/\n\tp._getInstructions = function() {\n\t\tthis._updateInstructions();\n\t\treturn this._instructions;\n\t};\n\t// Graphics.getInstructions is @deprecated. Remove for 1.1+\n\tp.getInstructions = createjs.deprecate(p._getInstructions, \"Graphics.getInstructions\");\n\n\t/**\n\t * Returns the graphics instructions array. Each entry is a graphics command object (ex. Graphics.Fill, Graphics.Rect)\n\t * Modifying the returned array directly is not recommended, and is likely to result in unexpected behaviour.\n\t *\n\t * This property is mainly intended for introspection of the instructions (ex. for graphics export).\n\t * @property instructions\n\t * @type {Array}\n\t * @readonly\n\t **/\n\ttry {\n\t\tObject.defineProperties(p, {\n\t\t\tinstructions: { get: p._getInstructions }\n\t\t});\n\t} catch (e) {}\n\n\n// public methods:\n\t/**\n\t * Returns true if this Graphics instance has no drawing commands.\n\t * @method isEmpty\n\t * @return {Boolean} Returns true if this Graphics instance has no drawing commands.\n\t **/\n\tp.isEmpty = function() {\n\t\treturn !(this._instructions.length || this._activeInstructions.length);\n\t};\n\n\t/**\n\t * Draws the display object into the specified context ignoring its visible, alpha, shadow, and transform.\n\t * Returns true if the draw was handled (useful for overriding functionality).\n\t *\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method draw\n\t * @param {CanvasRenderingContext2D} ctx The canvas 2D context object to draw into.\n\t * @param {Object} data Optional data that is passed to graphics command exec methods. When called from a Shape instance, the shape passes itself as the data parameter. This can be used by custom graphic commands to insert contextual data.\n\t **/\n\tp.draw = function(ctx, data) {\n\t\tthis._updateInstructions();\n\t\tvar instr = this._instructions;\n\t\tfor (var i=this._storeIndex, l=instr.length; i<l; i++) {\n\t\t\tinstr[i].exec(ctx, data);\n\t\t}\n\t};\n\n\t/**\n\t * Draws only the path described for this Graphics instance, skipping any non-path instructions, including fill and\n\t * stroke descriptions. Used for <code>DisplayObject.mask</code> to draw the clipping path, for example.\n\t *\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method drawAsPath\n\t * @param {CanvasRenderingContext2D} ctx The canvas 2D context object to draw into.\n\t **/\n\tp.drawAsPath = function(ctx) {\n\t\tthis._updateInstructions();\n\t\tvar instr, instrs = this._instructions;\n\t\tfor (var i=this._storeIndex, l=instrs.length; i<l; i++) {\n\t\t\t// the first command is always a beginPath command.\n\t\t\tif ((instr = instrs[i]).path !== false) { instr.exec(ctx); }\n\t\t}\n\t};\n\n\n// public methods that map directly to context 2D calls:\n\t/**\n\t * Moves the drawing point to the specified position. A tiny API method \"mt\" also exists.\n\t * @method moveTo\n\t * @param {Number} x The x coordinate the drawing point should move to.\n\t * @param {Number} y The y coordinate the drawing point should move to.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls).\n\t * @chainable\n\t **/\n\tp.moveTo = function(x, y) {\n\t\treturn this.append(new G.MoveTo(x,y), true);\n\t};\n\n\t/**\n\t * Draws a line from the current drawing point to the specified position, which become the new current drawing\n\t * point. Note that you *must* call {{#crossLink \"Graphics/moveTo\"}}{{/crossLink}} before the first `lineTo()`.\n\t * A tiny API method \"lt\" also exists.\n\t *\n\t * For detailed information, read the\n\t * <a href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#complex-shapes-(paths)\">\n\t * whatwg spec</a>.\n\t * @method lineTo\n\t * @param {Number} x The x coordinate the drawing point should draw to.\n\t * @param {Number} y The y coordinate the drawing point should draw to.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.lineTo = function(x, y) {\n\t\treturn this.append(new G.LineTo(x,y));\n\t};\n\n\t/**\n\t * Draws an arc with the specified control points and radius.  For detailed information, read the\n\t * <a href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-arcto\">\n\t * whatwg spec</a>. A tiny API method \"at\" also exists.\n\t * @method arcTo\n\t * @param {Number} x1\n\t * @param {Number} y1\n\t * @param {Number} x2\n\t * @param {Number} y2\n\t * @param {Number} radius\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.arcTo = function(x1, y1, x2, y2, radius) {\n\t\treturn this.append(new G.ArcTo(x1, y1, x2, y2, radius));\n\t};\n\n\t/**\n\t * Draws an arc defined by the radius, startAngle and endAngle arguments, centered at the position (x, y). For\n\t * example, to draw a full circle with a radius of 20 centered at (100, 100):\n\t *\n\t *      arc(100, 100, 20, 0, Math.PI*2);\n\t *\n\t * For detailed information, read the\n\t * <a href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-arc\">whatwg spec</a>.\n\t * A tiny API method \"a\" also exists.\n\t * @method arc\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} radius\n\t * @param {Number} startAngle Measured in radians.\n\t * @param {Number} endAngle Measured in radians.\n\t * @param {Boolean} anticlockwise\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.arc = function(x, y, radius, startAngle, endAngle, anticlockwise) {\n\t\treturn this.append(new G.Arc(x, y, radius, startAngle, endAngle, anticlockwise));\n\t};\n\n\t/**\n\t * Draws a quadratic curve from the current drawing point to (x, y) using the control point (cpx, cpy). For detailed\n\t * information, read the <a href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-quadraticcurveto\">\n\t * whatwg spec</a>. A tiny API method \"qt\" also exists.\n\t * @method quadraticCurveTo\n\t * @param {Number} cpx\n\t * @param {Number} cpy\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.quadraticCurveTo = function(cpx, cpy, x, y) {\n\t\treturn this.append(new G.QuadraticCurveTo(cpx, cpy, x, y));\n\t};\n\n\t/**\n\t * Draws a bezier curve from the current drawing point to (x, y) using the control points (cp1x, cp1y) and (cp2x,\n\t * cp2y). For detailed information, read the\n\t * <a href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-beziercurveto\">\n\t * whatwg spec</a>. A tiny API method \"bt\" also exists.\n\t * @method bezierCurveTo\n\t * @param {Number} cp1x\n\t * @param {Number} cp1y\n\t * @param {Number} cp2x\n\t * @param {Number} cp2y\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.bezierCurveTo = function(cp1x, cp1y, cp2x, cp2y, x, y) {\n\t\treturn this.append(new G.BezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y));\n\t};\n\n\t/**\n\t * Draws a rectangle at (x, y) with the specified width and height using the current fill and/or stroke.\n\t * For detailed information, read the\n\t * <a href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-rect\">\n\t * whatwg spec</a>. A tiny API method \"r\" also exists.\n\t * @method rect\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} w Width of the rectangle\n\t * @param {Number} h Height of the rectangle\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.rect = function(x, y, w, h) {\n\t\treturn this.append(new G.Rect(x, y, w, h));\n\t};\n\n\t/**\n\t * Closes the current path, effectively drawing a line from the current drawing point to the first drawing point specified\n\t * since the fill or stroke was last set. A tiny API method \"cp\" also exists.\n\t * @method closePath\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.closePath = function() {\n\t\treturn this._activeInstructions.length ? this.append(new G.ClosePath()) : this;\n\t};\n\n\n// public methods that roughly map to Adobe Flash/Animate graphics APIs:\n\t/**\n\t * Clears all drawing instructions, effectively resetting this Graphics instance. Any line and fill styles will need\n\t * to be redefined to draw shapes following a clear call. A tiny API method \"c\" also exists.\n\t * @method clear\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.clear = function() {\n\t\tthis._instructions.length = this._activeInstructions.length = this._commitIndex = 0;\n\t\tthis._strokeStyle = this._oldStrokeStyle = this._stroke = this._fill = this._strokeDash = this._oldStrokeDash = null;\n\t\tthis._dirty = this._strokeIgnoreScale = false;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Begins a fill with the specified color. This ends the current sub-path. A tiny API method \"f\" also exists.\n\t * @method beginFill\n\t * @param {String} color A CSS compatible color value (ex. \"red\", \"#FF0000\", or \"rgba(255,0,0,0.5)\"). Setting to\n\t * null will result in no fill.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.beginFill = function(color) {\n\t\treturn this._setFill(color ? new G.Fill(color) : null);\n\t};\n\n\t/**\n\t * Begins a linear gradient fill defined by the line (x0, y0) to (x1, y1). This ends the current sub-path. For\n\t * example, the following code defines a black to white vertical gradient ranging from 20px to 120px, and draws a\n\t * square to display it:\n\t *\n\t *      myGraphics.beginLinearGradientFill([\"#000\",\"#FFF\"], [0, 1], 0, 20, 0, 120).drawRect(20, 20, 120, 120);\n\t *\n\t * A tiny API method \"lf\" also exists.\n\t * @method beginLinearGradientFill\n\t * @param {Array} colors An array of CSS compatible color values. For example, [\"#F00\",\"#00F\"] would define a gradient\n\t * drawing from red to blue.\n\t * @param {Array} ratios An array of gradient positions which correspond to the colors. For example, [0.1, 0.9] would draw\n\t * the first color to 10% then interpolating to the second color at 90%.\n\t * @param {Number} x0 The position of the first point defining the line that defines the gradient direction and size.\n\t * @param {Number} y0 The position of the first point defining the line that defines the gradient direction and size.\n\t * @param {Number} x1 The position of the second point defining the line that defines the gradient direction and size.\n\t * @param {Number} y1 The position of the second point defining the line that defines the gradient direction and size.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.beginLinearGradientFill = function(colors, ratios, x0, y0, x1, y1) {\n\t\treturn this._setFill(new G.Fill().linearGradient(colors, ratios, x0, y0, x1, y1));\n\t};\n\n\t/**\n\t * Begins a radial gradient fill. This ends the current sub-path. For example, the following code defines a red to\n\t * blue radial gradient centered at (100, 100), with a radius of 50, and draws a circle to display it:\n\t *\n\t *      myGraphics.beginRadialGradientFill([\"#F00\",\"#00F\"], [0, 1], 100, 100, 0, 100, 100, 50).drawCircle(100, 100, 50);\n\t *\n\t * A tiny API method \"rf\" also exists.\n\t * @method beginRadialGradientFill\n\t * @param {Array} colors An array of CSS compatible color values. For example, [\"#F00\",\"#00F\"] would define\n\t * a gradient drawing from red to blue.\n\t * @param {Array} ratios An array of gradient positions which correspond to the colors. For example, [0.1,\n\t * 0.9] would draw the first color to 10% then interpolating to the second color at 90%.\n\t * @param {Number} x0 Center position of the inner circle that defines the gradient.\n\t * @param {Number} y0 Center position of the inner circle that defines the gradient.\n\t * @param {Number} r0 Radius of the inner circle that defines the gradient.\n\t * @param {Number} x1 Center position of the outer circle that defines the gradient.\n\t * @param {Number} y1 Center position of the outer circle that defines the gradient.\n\t * @param {Number} r1 Radius of the outer circle that defines the gradient.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.beginRadialGradientFill = function(colors, ratios, x0, y0, r0, x1, y1, r1) {\n\t\treturn this._setFill(new G.Fill().radialGradient(colors, ratios, x0, y0, r0, x1, y1, r1));\n\t};\n\n\t/**\n\t * Begins a pattern fill using the specified image. This ends the current sub-path. A tiny API method \"bf\" also\n\t * exists.\n\t * @method beginBitmapFill\n\t * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement} image The Image, Canvas, or Video object to use\n\t * as the pattern. Must be loaded prior to creating a bitmap fill, or the fill will be empty.\n\t * @param {String} repetition Optional. Indicates whether to repeat the image in the fill area. One of \"repeat\",\n\t * \"repeat-x\", \"repeat-y\", or \"no-repeat\". Defaults to \"repeat\". Note that Firefox does not support \"repeat-x\" or\n\t * \"repeat-y\" (latest tests were in FF 20.0), and will default to \"repeat\".\n\t * @param {Matrix2D} matrix Optional. Specifies a transformation matrix for the bitmap fill. This transformation\n\t * will be applied relative to the parent transform.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.beginBitmapFill = function(image, repetition, matrix) {\n\t\treturn this._setFill(new G.Fill(null,matrix).bitmap(image, repetition));\n\t};\n\n\t/**\n\t * Ends the current sub-path, and begins a new one with no fill. Functionally identical to <code>beginFill(null)</code>.\n\t * A tiny API method \"ef\" also exists.\n\t * @method endFill\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.endFill = function() {\n\t\treturn this.beginFill();\n\t};\n\n\t/**\n\t * Sets the stroke style. Like all drawing methods, this can be chained, so you can define\n\t * the stroke style and color in a single line of code like so:\n\t *\n\t * \tmyGraphics.setStrokeStyle(8,\"round\").beginStroke(\"#F00\");\n\t *\n\t * A tiny API method \"ss\" also exists.\n\t * @method setStrokeStyle\n\t * @param {Number} thickness The width of the stroke.\n\t * @param {String | Number} [caps=0] Indicates the type of caps to use at the end of lines. One of butt,\n\t * round, or square. Defaults to \"butt\". Also accepts the values 0 (butt), 1 (round), and 2 (square) for use with\n\t * the tiny API.\n\t * @param {String | Number} [joints=0] Specifies the type of joints that should be used where two lines meet.\n\t * One of bevel, round, or miter. Defaults to \"miter\". Also accepts the values 0 (miter), 1 (round), and 2 (bevel)\n\t * for use with the tiny API.\n\t * @param {Number} [miterLimit=10] If joints is set to \"miter\", then you can specify a miter limit ratio which\n\t * controls at what point a mitered joint will be clipped.\n\t * @param {Boolean} [ignoreScale=false] If true, the stroke will be drawn at the specified thickness regardless\n\t * of active transformations.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.setStrokeStyle = function(thickness, caps, joints, miterLimit, ignoreScale) {\n\t\tthis._updateInstructions(true);\n\t\tthis._strokeStyle = this.command = new G.StrokeStyle(thickness, caps, joints, miterLimit, ignoreScale);\n\n\t\t// ignoreScale lives on Stroke, not StrokeStyle, so we do a little trickery:\n\t\tif (this._stroke) { this._stroke.ignoreScale = ignoreScale; }\n\t\tthis._strokeIgnoreScale = ignoreScale;\n\t\treturn this;\n\t};\n\t\n\t/**\n\t * Sets or clears the stroke dash pattern.\n\t *\n\t * \tmyGraphics.setStrokeDash([20, 10], 0);\n\t *\n\t * A tiny API method `sd` also exists.\n\t * @method setStrokeDash\n\t * @param {Array} [segments] An array specifying the dash pattern, alternating between line and gap.\n\t * For example, `[20,10]` would create a pattern of 20 pixel lines with 10 pixel gaps between them.\n\t * Passing null or an empty array will clear the existing stroke dash.\n\t * @param {Number} [offset=0] The offset of the dash pattern. For example, you could increment this value to create a \"marching ants\" effect.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.setStrokeDash = function(segments, offset) {\n\t\tthis._updateInstructions(true);\n\t\tthis._strokeDash = this.command = new G.StrokeDash(segments, offset);\n\t\treturn this;\n\t};\n\n\t/**\n\t * Begins a stroke with the specified color. This ends the current sub-path. A tiny API method \"s\" also exists.\n\t * @method beginStroke\n\t * @param {String} color A CSS compatible color value (ex. \"#FF0000\", \"red\", or \"rgba(255,0,0,0.5)\"). Setting to\n\t * null will result in no stroke.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.beginStroke = function(color) {\n\t\treturn this._setStroke(color ? new G.Stroke(color) : null);\n\t};\n\n\t/**\n\t * Begins a linear gradient stroke defined by the line (x0, y0) to (x1, y1). This ends the current sub-path. For\n\t * example, the following code defines a black to white vertical gradient ranging from 20px to 120px, and draws a\n\t * square to display it:\n\t *\n\t *      myGraphics.setStrokeStyle(10).\n\t *          beginLinearGradientStroke([\"#000\",\"#FFF\"], [0, 1], 0, 20, 0, 120).drawRect(20, 20, 120, 120);\n\t *\n\t * A tiny API method \"ls\" also exists.\n\t * @method beginLinearGradientStroke\n\t * @param {Array} colors An array of CSS compatible color values. For example, [\"#F00\",\"#00F\"] would define\n\t * a gradient drawing from red to blue.\n\t * @param {Array} ratios An array of gradient positions which correspond to the colors. For example, [0.1,\n\t * 0.9] would draw the first color to 10% then interpolating to the second color at 90%.\n\t * @param {Number} x0 The position of the first point defining the line that defines the gradient direction and size.\n\t * @param {Number} y0 The position of the first point defining the line that defines the gradient direction and size.\n\t * @param {Number} x1 The position of the second point defining the line that defines the gradient direction and size.\n\t * @param {Number} y1 The position of the second point defining the line that defines the gradient direction and size.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.beginLinearGradientStroke = function(colors, ratios, x0, y0, x1, y1) {\n\t\treturn this._setStroke(new G.Stroke().linearGradient(colors, ratios, x0, y0, x1, y1));\n\t};\n\n\t/**\n\t * Begins a radial gradient stroke. This ends the current sub-path. For example, the following code defines a red to\n\t * blue radial gradient centered at (100, 100), with a radius of 50, and draws a rectangle to display it:\n\t *\n\t *      myGraphics.setStrokeStyle(10)\n\t *          .beginRadialGradientStroke([\"#F00\",\"#00F\"], [0, 1], 100, 100, 0, 100, 100, 50)\n\t *          .drawRect(50, 90, 150, 110);\n\t *\n\t * A tiny API method \"rs\" also exists.\n\t * @method beginRadialGradientStroke\n\t * @param {Array} colors An array of CSS compatible color values. For example, [\"#F00\",\"#00F\"] would define\n\t * a gradient drawing from red to blue.\n\t * @param {Array} ratios An array of gradient positions which correspond to the colors. For example, [0.1,\n\t * 0.9] would draw the first color to 10% then interpolating to the second color at 90%, then draw the second color\n\t * to 100%.\n\t * @param {Number} x0 Center position of the inner circle that defines the gradient.\n\t * @param {Number} y0 Center position of the inner circle that defines the gradient.\n\t * @param {Number} r0 Radius of the inner circle that defines the gradient.\n\t * @param {Number} x1 Center position of the outer circle that defines the gradient.\n\t * @param {Number} y1 Center position of the outer circle that defines the gradient.\n\t * @param {Number} r1 Radius of the outer circle that defines the gradient.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.beginRadialGradientStroke = function(colors, ratios, x0, y0, r0, x1, y1, r1) {\n\t\treturn this._setStroke(new G.Stroke().radialGradient(colors, ratios, x0, y0, r0, x1, y1, r1));\n\t};\n\n\t/**\n\t * Begins a pattern fill using the specified image. This ends the current sub-path. Note that unlike bitmap fills,\n\t * strokes do not currently support a matrix parameter due to limitations in the canvas API. A tiny API method \"bs\"\n\t * also exists.\n\t * @method beginBitmapStroke\n\t * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement} image The Image, Canvas, or Video object to use\n\t * as the pattern. Must be loaded prior to creating a bitmap fill, or the fill will be empty.\n\t * @param {String} [repetition=repeat] Optional. Indicates whether to repeat the image in the fill area. One of\n\t * \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\". Defaults to \"repeat\".\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.beginBitmapStroke = function(image, repetition) {\n\t\t// NOTE: matrix is not supported for stroke because transforms on strokes also affect the drawn stroke width.\n\t\treturn this._setStroke(new G.Stroke().bitmap(image, repetition));\n\t};\n\n\t/**\n\t * Ends the current sub-path, and begins a new one with no stroke. Functionally identical to <code>beginStroke(null)</code>.\n\t * A tiny API method \"es\" also exists.\n\t * @method endStroke\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.endStroke = function() {\n\t\treturn this.beginStroke();\n\t};\n\n\t/**\n\t * Maps the familiar ActionScript <code>curveTo()</code> method to the functionally similar {{#crossLink \"Graphics/quadraticCurveTo\"}}{{/crossLink}}\n\t * method.\n\t * @method curveTo\n\t * @param {Number} cpx\n\t * @param {Number} cpy\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.curveTo = p.quadraticCurveTo;\n\n\t/**\n\t *\n\t * Maps the familiar ActionScript <code>drawRect()</code> method to the functionally similar {{#crossLink \"Graphics/rect\"}}{{/crossLink}}\n\t * method.\n\t * @method drawRect\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} w Width of the rectangle\n\t * @param {Number} h Height of the rectangle\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.drawRect = p.rect;\n\n\t/**\n\t * Draws a rounded rectangle with all corners with the specified radius.\n\t * @method drawRoundRect\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} w\n\t * @param {Number} h\n\t * @param {Number} radius Corner radius.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.drawRoundRect = function(x, y, w, h, radius) {\n\t\treturn this.drawRoundRectComplex(x, y, w, h, radius, radius, radius, radius);\n\t};\n\n\t/**\n\t * Draws a rounded rectangle with different corner radii. Supports positive and negative corner radii. A tiny API\n\t * method \"rc\" also exists.\n\t * @method drawRoundRectComplex\n\t * @param {Number} x The horizontal coordinate to draw the round rect.\n\t * @param {Number} y The vertical coordinate to draw the round rect.\n\t * @param {Number} w The width of the round rect.\n\t * @param {Number} h The height of the round rect.\n\t * @param {Number} radiusTL Top left corner radius.\n\t * @param {Number} radiusTR Top right corner radius.\n\t * @param {Number} radiusBR Bottom right corner radius.\n\t * @param {Number} radiusBL Bottom left corner radius.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.drawRoundRectComplex = function(x, y, w, h, radiusTL, radiusTR, radiusBR, radiusBL) {\n\t\treturn this.append(new G.RoundRect(x, y, w, h, radiusTL, radiusTR, radiusBR, radiusBL));\n\t};\n\n\t/**\n\t * Draws a circle with the specified radius at (x, y).\n\t *\n\t *      var g = new createjs.Graphics();\n\t *\t    g.setStrokeStyle(1);\n\t *\t    g.beginStroke(createjs.Graphics.getRGB(0,0,0));\n\t *\t    g.beginFill(createjs.Graphics.getRGB(255,0,0));\n\t *\t    g.drawCircle(0,0,3);\n\t *\n\t *\t    var s = new createjs.Shape(g);\n\t *\t\ts.x = 100;\n\t *\t\ts.y = 100;\n\t *\n\t *\t    stage.addChild(s);\n\t *\t    stage.update();\n\t *\n\t * A tiny API method \"dc\" also exists.\n\t * @method drawCircle\n\t * @param {Number} x x coordinate center point of circle.\n\t * @param {Number} y y coordinate center point of circle.\n\t * @param {Number} radius Radius of circle.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.drawCircle = function(x, y, radius) {\n\t\treturn this.append(new G.Circle(x, y, radius));\n\t};\n\n\t/**\n\t * Draws an ellipse (oval) with a specified width (w) and height (h). Similar to {{#crossLink \"Graphics/drawCircle\"}}{{/crossLink}},\n\t * except the width and height can be different. A tiny API method \"de\" also exists.\n\t * @method drawEllipse\n\t * @param {Number} x The left coordinate point of the ellipse. Note that this is different from {{#crossLink \"Graphics/drawCircle\"}}{{/crossLink}}\n\t * which draws from center.\n\t * @param {Number} y The top coordinate point of the ellipse. Note that this is different from {{#crossLink \"Graphics/drawCircle\"}}{{/crossLink}}\n\t * which draws from the center.\n\t * @param {Number} w The height (horizontal diameter) of the ellipse. The horizontal radius will be half of this\n\t * number.\n\t * @param {Number} h The width (vertical diameter) of the ellipse. The vertical radius will be half of this number.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.drawEllipse = function(x, y, w, h) {\n\t\treturn this.append(new G.Ellipse(x, y, w, h));\n\t};\n\n\t/**\n\t * Draws a star if pointSize is greater than 0, or a regular polygon if pointSize is 0 with the specified number of\n\t * points. For example, the following code will draw a familiar 5 pointed star shape centered at 100, 100 and with a\n\t * radius of 50:\n\t *\n\t *      myGraphics.beginFill(\"#FF0\").drawPolyStar(100, 100, 50, 5, 0.6, -90);\n\t *      // Note: -90 makes the first point vertical\n\t *\n\t * A tiny API method \"dp\" also exists.\n\t *\n\t * @method drawPolyStar\n\t * @param {Number} x Position of the center of the shape.\n\t * @param {Number} y Position of the center of the shape.\n\t * @param {Number} radius The outer radius of the shape.\n\t * @param {Number} sides The number of points on the star or sides on the polygon.\n\t * @param {Number} pointSize The depth or \"pointy-ness\" of the star points. A pointSize of 0 will draw a regular\n\t * polygon (no points), a pointSize of 1 will draw nothing because the points are infinitely pointy.\n\t * @param {Number} angle The angle of the first point / corner. For example a value of 0 will draw the first point\n\t * directly to the right of the center.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.drawPolyStar = function(x, y, radius, sides, pointSize, angle) {\n\t\treturn this.append(new G.PolyStar(x, y, radius, sides, pointSize, angle));\n\t};\n\n\t/**\n\t * Appends a graphics command object to the graphics queue. Command objects expose an \"exec\" method\n\t * that accepts two parameters: the Context2D to operate on, and an arbitrary data object passed into\n\t * {{#crossLink \"Graphics/draw\"}}{{/crossLink}}. The latter will usually be the Shape instance that called draw.\n\t *\n\t * This method is used internally by Graphics methods, such as drawCircle, but can also be used directly to insert\n\t * built-in or custom graphics commands. For example:\n\t *\n\t * \t\t// attach data to our shape, so we can access it during the draw:\n\t * \t\tmyShape.color = \"red\";\n\t *\n\t * \t\t// append a Circle command object:\n\t * \t\tmyShape.graphics.append(new createjs.Graphics.Circle(50, 50, 30));\n\t *\n\t * \t\t// append a custom command object with an exec method that sets the fill style\n\t * \t\t// based on the shape's data, and then fills the circle.\n\t * \t\tmyShape.graphics.append({exec:function(ctx, shape) {\n\t * \t\t\tctx.fillStyle = shape.color;\n\t * \t\t\tctx.fill();\n\t * \t\t}});\n\t *\n\t * @method append\n\t * @param {Object} command A graphics command object exposing an \"exec\" method.\n\t * @param {boolean} clean The clean param is primarily for internal use. A value of true indicates that a command does not generate a path that should be stroked or filled.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.append = function(command, clean) {\n\t\tthis._activeInstructions.push(command);\n\t\tthis.command = command;\n\t\tif (!clean) { this._dirty = true; }\n\t\treturn this;\n\t};\n\n\t/**\n\t * Decodes a compact encoded path string into a series of draw instructions.\n\t * This format is not intended to be human readable, and is meant for use by authoring tools.\n\t * The format uses a base64 character set, with each character representing 6 bits, to define a series of draw\n\t * commands.\n\t *\n\t * Each command is comprised of a single \"header\" character followed by a variable number of alternating x and y\n\t * position values. Reading the header bits from left to right (most to least significant): bits 1 to 3 specify the\n\t * type of operation (0-moveTo, 1-lineTo, 2-quadraticCurveTo, 3-bezierCurveTo, 4-closePath, 5-7 unused). Bit 4\n\t * indicates whether position values use 12 bits (2 characters) or 18 bits (3 characters), with a one indicating the\n\t * latter. Bits 5 and 6 are currently unused.\n\t *\n\t * Following the header is a series of 0 (closePath), 2 (moveTo, lineTo), 4 (quadraticCurveTo), or 6 (bezierCurveTo)\n\t * parameters. These parameters are alternating x/y positions represented by 2 or 3 characters (as indicated by the\n\t * 4th bit in the command char). These characters consist of a 1 bit sign (1 is negative, 0 is positive), followed\n\t * by an 11 (2 char) or 17 (3 char) bit integer value. All position values are in tenths of a pixel. Except in the\n\t * case of move operations which are absolute, this value is a delta from the previous x or y position (as\n\t * appropriate).\n\t *\n\t * For example, the string \"A3cAAMAu4AAA\" represents a line starting at -150,0 and ending at 150,0.\n\t * <br />A - bits 000000. First 3 bits (000) indicate a moveTo operation. 4th bit (0) indicates 2 chars per\n\t * parameter.\n\t * <br />n0 - 110111011100. Absolute x position of -150.0px. First bit indicates a negative value, remaining bits\n\t * indicate 1500 tenths of a pixel.\n\t * <br />AA - 000000000000. Absolute y position of 0.\n\t * <br />I - 001100. First 3 bits (001) indicate a lineTo operation. 4th bit (1) indicates 3 chars per parameter.\n\t * <br />Au4 - 000000101110111000. An x delta of 300.0px, which is added to the previous x value of -150.0px to\n\t * provide an absolute position of +150.0px.\n\t * <br />AAA - 000000000000000000. A y delta value of 0.\n\t *\n\t * A tiny API method \"p\" also exists.\n\t * @method decodePath\n\t * @param {String} str The path string to decode.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.decodePath = function(str) {\n\t\tvar instructions = [this.moveTo, this.lineTo, this.quadraticCurveTo, this.bezierCurveTo, this.closePath];\n\t\tvar paramCount = [2, 2, 4, 6, 0];\n\t\tvar i=0, l=str.length;\n\t\tvar params = [];\n\t\tvar x=0, y=0;\n\t\tvar base64 = Graphics.BASE_64;\n\n\t\twhile (i<l) {\n\t\t\tvar c = str.charAt(i);\n\t\t\tvar n = base64[c];\n\t\t\tvar fi = n>>3; // highest order bits 1-3 code for operation.\n\t\t\tvar f = instructions[fi];\n\t\t\t// check that we have a valid instruction & that the unused bits are empty:\n\t\t\tif (!f || (n&3)) { throw(\"bad path data (@\"+i+\"): \"+c); }\n\t\t\tvar pl = paramCount[fi];\n\t\t\tif (!fi) { x=y=0; } // move operations reset the position.\n\t\t\tparams.length = 0;\n\t\t\ti++;\n\t\t\tvar charCount = (n>>2&1)+2;  // 4th header bit indicates number size for this operation.\n\t\t\tfor (var p=0; p<pl; p++) {\n\t\t\t\tvar num = base64[str.charAt(i)];\n\t\t\t\tvar sign = (num>>5) ? -1 : 1;\n\t\t\t\tnum = ((num&31)<<6)|(base64[str.charAt(i+1)]);\n\t\t\t\tif (charCount == 3) { num = (num<<6)|(base64[str.charAt(i+2)]); }\n\t\t\t\tnum = sign*num/10;\n\t\t\t\tif (p%2) { x = (num += x); }\n\t\t\t\telse { y = (num += y); }\n\t\t\t\tparams[p] = num;\n\t\t\t\ti += charCount;\n\t\t\t}\n\t\t\tf.apply(this,params);\n\t\t}\n\t\treturn this;\n\t};\n\n\t/**\n\t * Stores all graphics commands so they won't be executed in future draws. Calling store() a second time adds to\n\t * the existing store. This also affects `drawAsPath()`.\n\t *\n\t * This is useful in cases where you are creating vector graphics in an iterative manner (ex. generative art), so\n\t * that only new graphics need to be drawn (which can provide huge performance benefits), but you wish to retain all\n\t * of the vector instructions for later use (ex. scaling, modifying, or exporting).\n\t *\n\t * Note that calling store() will force the active path (if any) to be ended in a manner similar to changing\n\t * the fill or stroke.\n\t *\n\t * For example, consider a application where the user draws lines with the mouse. As each line segment (or collection of\n\t * segments) are added to a Shape, it can be rasterized using {{#crossLink \"DisplayObject/updateCache\"}}{{/crossLink}},\n\t * and then stored, so that it can be redrawn at a different scale when the application is resized, or exported to SVG.\n\t *\n\t * \t// set up cache:\n\t * \tmyShape.cache(0,0,500,500,scale);\n\t *\n\t * \t// when the user drags, draw a new line:\n\t * \tmyShape.graphics.moveTo(oldX,oldY).lineTo(newX,newY);\n\t * \t// then draw it into the existing cache:\n\t * \tmyShape.updateCache(\"source-over\");\n\t * \t// store the new line, so it isn't redrawn next time:\n\t * \tmyShape.store();\n\t *\n\t * \t// then, when the window resizes, we can re-render at a different scale:\n\t * \t// first, unstore all our lines:\n\t * \tmyShape.unstore();\n\t * \t// then cache using the new scale:\n\t * \tmyShape.cache(0,0,500,500,newScale);\n\t * \t// finally, store the existing commands again:\n\t * \tmyShape.store();\n\t *\n\t * @method store\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.store = function() {\n\t\tthis._updateInstructions(true);\n\t\tthis._storeIndex = this._instructions.length;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Unstores any graphics commands that were previously stored using {{#crossLink \"Graphics/store\"}}{{/crossLink}}\n\t * so that they will be executed in subsequent draw calls.\n\t *\n\t * @method unstore\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.unstore = function() {\n\t\tthis._storeIndex = 0;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Returns a clone of this Graphics instance. Note that the individual command objects are not cloned.\n\t * @method clone\n\t * @return {Graphics} A clone of the current Graphics instance.\n\t **/\n\tp.clone = function() {\n\t\tvar o = new Graphics();\n\t\to.command = this.command;\n\t\to._stroke = this._stroke;\n\t\to._strokeStyle = this._strokeStyle;\n\t\to._strokeDash = this._strokeDash;\n\t\to._strokeIgnoreScale = this._strokeIgnoreScale;\n\t\to._fill = this._fill;\n\t\to._instructions = this._instructions.slice();\n\t\to._commitIndex = this._commitIndex;\n\t\to._activeInstructions = this._activeInstructions.slice();\n\t\to._dirty = this._dirty;\n\t\to._storeIndex = this._storeIndex;\n\t\treturn o;\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[Graphics]\";\n\t};\n\n\n// tiny API:\n\t/**\n\t * Shortcut to moveTo.\n\t * @method mt\n\t * @param {Number} x The x coordinate the drawing point should move to.\n\t * @param {Number} y The y coordinate the drawing point should move to.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls).\n\t * @chainable\n\t * @protected\n\t **/\n\tp.mt = p.moveTo;\n\n\t/**\n\t * Shortcut to lineTo.\n\t * @method lt\n\t * @param {Number} x The x coordinate the drawing point should draw to.\n\t * @param {Number} y The y coordinate the drawing point should draw to.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.lt = p.lineTo;\n\n\t/**\n\t * Shortcut to arcTo.\n\t * @method at\n\t * @param {Number} x1\n\t * @param {Number} y1\n\t * @param {Number} x2\n\t * @param {Number} y2\n\t * @param {Number} radius\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.at = p.arcTo;\n\n\t/**\n\t * Shortcut to bezierCurveTo.\n\t * @method bt\n\t * @param {Number} cp1x\n\t * @param {Number} cp1y\n\t * @param {Number} cp2x\n\t * @param {Number} cp2y\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.bt = p.bezierCurveTo;\n\n\t/**\n\t * Shortcut to quadraticCurveTo / curveTo.\n\t * @method qt\n\t * @param {Number} cpx\n\t * @param {Number} cpy\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @protected\n\t * @chainable\n\t **/\n\tp.qt = p.quadraticCurveTo;\n\n\t/**\n\t * Shortcut to arc.\n\t * @method a\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} radius\n\t * @param {Number} startAngle Measured in radians.\n\t * @param {Number} endAngle Measured in radians.\n\t * @param {Boolean} anticlockwise\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @protected\n\t * @chainable\n\t **/\n\tp.a = p.arc;\n\n\t/**\n\t * Shortcut to rect.\n\t * @method r\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} w Width of the rectangle\n\t * @param {Number} h Height of the rectangle\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.r = p.rect;\n\n\t/**\n\t * Shortcut to closePath.\n\t * @method cp\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.cp = p.closePath;\n\n\t/**\n\t * Shortcut to clear.\n\t * @method c\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.c = p.clear;\n\n\t/**\n\t * Shortcut to beginFill.\n\t * @method f\n\t * @param {String} color A CSS compatible color value (ex. \"red\", \"#FF0000\", or \"rgba(255,0,0,0.5)\"). Setting to\n\t * null will result in no fill.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.f = p.beginFill;\n\n\t/**\n\t * Shortcut to beginLinearGradientFill.\n\t * @method lf\n\t * @param {Array} colors An array of CSS compatible color values. For example, [\"#F00\",\"#00F\"] would define a gradient\n\t * drawing from red to blue.\n\t * @param {Array} ratios An array of gradient positions which correspond to the colors. For example, [0.1, 0.9] would draw\n\t * the first color to 10% then interpolating to the second color at 90%.\n\t * @param {Number} x0 The position of the first point defining the line that defines the gradient direction and size.\n\t * @param {Number} y0 The position of the first point defining the line that defines the gradient direction and size.\n\t * @param {Number} x1 The position of the second point defining the line that defines the gradient direction and size.\n\t * @param {Number} y1 The position of the second point defining the line that defines the gradient direction and size.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.lf = p.beginLinearGradientFill;\n\n\t/**\n\t * Shortcut to beginRadialGradientFill.\n\t * @method rf\n\t * @param {Array} colors An array of CSS compatible color values. For example, [\"#F00\",\"#00F\"] would define\n\t * a gradient drawing from red to blue.\n\t * @param {Array} ratios An array of gradient positions which correspond to the colors. For example, [0.1,\n\t * 0.9] would draw the first color to 10% then interpolating to the second color at 90%.\n\t * @param {Number} x0 Center position of the inner circle that defines the gradient.\n\t * @param {Number} y0 Center position of the inner circle that defines the gradient.\n\t * @param {Number} r0 Radius of the inner circle that defines the gradient.\n\t * @param {Number} x1 Center position of the outer circle that defines the gradient.\n\t * @param {Number} y1 Center position of the outer circle that defines the gradient.\n\t * @param {Number} r1 Radius of the outer circle that defines the gradient.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.rf = p.beginRadialGradientFill;\n\n\t/**\n\t * Shortcut to beginBitmapFill.\n\t * @method bf\n\t * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement} image The Image, Canvas, or Video object to use\n\t * as the pattern.\n\t * @param {String} repetition Optional. Indicates whether to repeat the image in the fill area. One of \"repeat\",\n\t * \"repeat-x\", \"repeat-y\", or \"no-repeat\". Defaults to \"repeat\". Note that Firefox does not support \"repeat-x\" or\n\t * \"repeat-y\" (latest tests were in FF 20.0), and will default to \"repeat\".\n\t * @param {Matrix2D} matrix Optional. Specifies a transformation matrix for the bitmap fill. This transformation\n\t * will be applied relative to the parent transform.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.bf = p.beginBitmapFill;\n\n\t/**\n\t * Shortcut to endFill.\n\t * @method ef\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.ef = p.endFill;\n\n\t/**\n\t * Shortcut to setStrokeStyle.\n\t * @method ss\n\t * @param {Number} thickness The width of the stroke.\n\t * @param {String | Number} [caps=0] Indicates the type of caps to use at the end of lines. One of butt,\n\t * round, or square. Defaults to \"butt\". Also accepts the values 0 (butt), 1 (round), and 2 (square) for use with\n\t * the tiny API.\n\t * @param {String | Number} [joints=0] Specifies the type of joints that should be used where two lines meet.\n\t * One of bevel, round, or miter. Defaults to \"miter\". Also accepts the values 0 (miter), 1 (round), and 2 (bevel)\n\t * for use with the tiny API.\n\t * @param {Number} [miterLimit=10] If joints is set to \"miter\", then you can specify a miter limit ratio which\n\t * controls at what point a mitered joint will be clipped.\n\t * @param {Boolean} [ignoreScale=false] If true, the stroke will be drawn at the specified thickness regardless\n\t * of active transformations.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.ss = p.setStrokeStyle;\n\t\n\t/**\n\t * Shortcut to setStrokeDash.\n\t * @method sd\n\t * @param {Array} [segments] An array specifying the dash pattern, alternating between line and gap.\n\t * For example, [20,10] would create a pattern of 20 pixel lines with 10 pixel gaps between them.\n\t * Passing null or an empty array will clear any existing dash.\n\t * @param {Number} [offset=0] The offset of the dash pattern. For example, you could increment this value to create a \"marching ants\" effect.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.sd = p.setStrokeDash;\n\n\t/**\n\t * Shortcut to beginStroke.\n\t * @method s\n\t * @param {String} color A CSS compatible color value (ex. \"#FF0000\", \"red\", or \"rgba(255,0,0,0.5)\"). Setting to\n\t * null will result in no stroke.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.s = p.beginStroke;\n\n\t/**\n\t * Shortcut to beginLinearGradientStroke.\n\t * @method ls\n\t * @param {Array} colors An array of CSS compatible color values. For example, [\"#F00\",\"#00F\"] would define\n\t * a gradient drawing from red to blue.\n\t * @param {Array} ratios An array of gradient positions which correspond to the colors. For example, [0.1,\n\t * 0.9] would draw the first color to 10% then interpolating to the second color at 90%.\n\t * @param {Number} x0 The position of the first point defining the line that defines the gradient direction and size.\n\t * @param {Number} y0 The position of the first point defining the line that defines the gradient direction and size.\n\t * @param {Number} x1 The position of the second point defining the line that defines the gradient direction and size.\n\t * @param {Number} y1 The position of the second point defining the line that defines the gradient direction and size.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.ls = p.beginLinearGradientStroke;\n\n\t/**\n\t * Shortcut to beginRadialGradientStroke.\n\t * @method rs\n\t * @param {Array} colors An array of CSS compatible color values. For example, [\"#F00\",\"#00F\"] would define\n\t * a gradient drawing from red to blue.\n\t * @param {Array} ratios An array of gradient positions which correspond to the colors. For example, [0.1,\n\t * 0.9] would draw the first color to 10% then interpolating to the second color at 90%, then draw the second color\n\t * to 100%.\n\t * @param {Number} x0 Center position of the inner circle that defines the gradient.\n\t * @param {Number} y0 Center position of the inner circle that defines the gradient.\n\t * @param {Number} r0 Radius of the inner circle that defines the gradient.\n\t * @param {Number} x1 Center position of the outer circle that defines the gradient.\n\t * @param {Number} y1 Center position of the outer circle that defines the gradient.\n\t * @param {Number} r1 Radius of the outer circle that defines the gradient.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.rs = p.beginRadialGradientStroke;\n\n\t/**\n\t * Shortcut to beginBitmapStroke.\n\t * @method bs\n\t * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement} image The Image, Canvas, or Video object to use\n\t * as the pattern.\n\t * @param {String} [repetition=repeat] Optional. Indicates whether to repeat the image in the fill area. One of\n\t * \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\". Defaults to \"repeat\".\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.bs = p.beginBitmapStroke;\n\n\t/**\n\t * Shortcut to endStroke.\n\t * @method es\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.es = p.endStroke;\n\n\t/**\n\t * Shortcut to drawRect.\n\t * @method dr\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} w Width of the rectangle\n\t * @param {Number} h Height of the rectangle\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.dr = p.drawRect;\n\n\t/**\n\t * Shortcut to drawRoundRect.\n\t * @method rr\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} w\n\t * @param {Number} h\n\t * @param {Number} radius Corner radius.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.rr = p.drawRoundRect;\n\n\t/**\n\t * Shortcut to drawRoundRectComplex.\n\t * @method rc\n\t * @param {Number} x The horizontal coordinate to draw the round rect.\n\t * @param {Number} y The vertical coordinate to draw the round rect.\n\t * @param {Number} w The width of the round rect.\n\t * @param {Number} h The height of the round rect.\n\t * @param {Number} radiusTL Top left corner radius.\n\t * @param {Number} radiusTR Top right corner radius.\n\t * @param {Number} radiusBR Bottom right corner radius.\n\t * @param {Number} radiusBL Bottom left corner radius.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.rc = p.drawRoundRectComplex;\n\n\t/**\n\t * Shortcut to drawCircle.\n\t * @method dc\n\t * @param {Number} x x coordinate center point of circle.\n\t * @param {Number} y y coordinate center point of circle.\n\t * @param {Number} radius Radius of circle.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.dc = p.drawCircle;\n\n\t/**\n\t * Shortcut to drawEllipse.\n\t * @method de\n\t * @param {Number} x The left coordinate point of the ellipse. Note that this is different from {{#crossLink \"Graphics/drawCircle\"}}{{/crossLink}}\n\t * which draws from center.\n\t * @param {Number} y The top coordinate point of the ellipse. Note that this is different from {{#crossLink \"Graphics/drawCircle\"}}{{/crossLink}}\n\t * which draws from the center.\n\t * @param {Number} w The height (horizontal diameter) of the ellipse. The horizontal radius will be half of this\n\t * number.\n\t * @param {Number} h The width (vertical diameter) of the ellipse. The vertical radius will be half of this number.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.de = p.drawEllipse;\n\n\t/**\n\t * Shortcut to drawPolyStar.\n\t * @method dp\n\t * @param {Number} x Position of the center of the shape.\n\t * @param {Number} y Position of the center of the shape.\n\t * @param {Number} radius The outer radius of the shape.\n\t * @param {Number} sides The number of points on the star or sides on the polygon.\n\t * @param {Number} pointSize The depth or \"pointy-ness\" of the star points. A pointSize of 0 will draw a regular\n\t * polygon (no points), a pointSize of 1 will draw nothing because the points are infinitely pointy.\n\t * @param {Number} angle The angle of the first point / corner. For example a value of 0 will draw the first point\n\t * directly to the right of the center.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.dp = p.drawPolyStar;\n\n\t/**\n\t * Shortcut to decodePath.\n\t * @method p\n\t * @param {String} str The path string to decode.\n\t * @return {Graphics} The Graphics instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t * @protected\n\t **/\n\tp.p = p.decodePath;\n\n\n// private methods:\n\t/**\n\t * @method _updateInstructions\n\t * @param commit\n\t * @protected\n\t **/\n\tp._updateInstructions = function(commit) {\n\t\tvar instr = this._instructions, active = this._activeInstructions, commitIndex = this._commitIndex;\n\n\t\tif (this._dirty && active.length) {\n\t\t\tinstr.length = commitIndex; // remove old, uncommitted commands\n\t\t\tinstr.push(Graphics.beginCmd);\n\n\t\t\tvar l = active.length, ll = instr.length;\n\t\t\tinstr.length = ll+l;\n\t\t\tfor (var i=0; i<l; i++) { instr[i+ll] = active[i]; }\n\n\t\t\tif (this._fill) { instr.push(this._fill); }\n\t\t\tif (this._stroke) {\n\t\t\t\t// doesn't need to be re-applied if it hasn't changed.\n\t\t\t\tif (this._strokeDash !== this._oldStrokeDash) {\n\t\t\t\t\tinstr.push(this._strokeDash);\n\t\t\t\t}\n\t\t\t\tif (this._strokeStyle !== this._oldStrokeStyle) {\n\t\t\t\t\tinstr.push(this._strokeStyle);\n\t\t\t\t}\n\t\t\t\tif (commit) {\n\t\t\t\t\tthis._oldStrokeStyle = this._strokeStyle;\n\t\t\t\t\tthis._oldStrokeDash = this._strokeDash;\n\t\t\t\t}\n\t\t\t\tinstr.push(this._stroke);\n\t\t\t}\n\n\t\t\tthis._dirty = false;\n\t\t}\n\n\t\tif (commit) {\n\t\t\tactive.length = 0;\n\t\t\tthis._commitIndex = instr.length;\n\t\t}\n\t};\n\n\t/**\n\t * @method _setFill\n\t * @param fill\n\t * @protected\n\t **/\n\tp._setFill = function(fill) {\n\t\tthis._updateInstructions(true);\n\t\tthis.command = this._fill = fill;\n\t\treturn this;\n\t};\n\n\t/**\n\t * @method _setStroke\n\t * @param stroke\n\t * @protected\n\t **/\n\tp._setStroke = function(stroke) {\n\t\tthis._updateInstructions(true);\n\t\tif (this.command = this._stroke = stroke) {\n\t\t\tstroke.ignoreScale = this._strokeIgnoreScale;\n\t\t}\n\t\treturn this;\n\t};\n\n// Command Objects:\n\t/**\n\t * @namespace Graphics\n\t */\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/lineTo\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information. See {{#crossLink \"Graphics\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class LineTo\n\t * @constructor\n\t * @param {Number} x\n\t * @param {Number} y\n\t **/\n\t/**\n\t * @property x\n\t * @type Number\n\t */\n\t/**\n\t * @property y\n\t * @type Number\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\t(G.LineTo = function(x, y) {\n\t\tthis.x = x; this.y = y;\n\t}).prototype.exec = function(ctx) { ctx.lineTo(this.x,this.y); };\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/moveTo\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class MoveTo\n\t * @constructor\n\t * @param {Number} x\n\t * @param {Number} y\n\t **/\n\t/**\n\t * @property x\n\t * @type Number\n\t */\n\t/**\n\t * @property y\n\t * @type Number\n\t */\n\t/**\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx\n\t */\n\t(G.MoveTo = function(x, y) {\n\t\tthis.x = x; this.y = y;\n\t}).prototype.exec = function(ctx) { ctx.moveTo(this.x, this.y); };\n\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/arcTo\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class ArcTo\n\t * @constructor\n\t * @param {Number} x1\n\t * @param {Number} y1\n\t * @param {Number} x2\n\t * @param {Number} y2\n\t * @param {Number} radius\n\t **/\n\t/**\n\t * @property x1\n\t * @type Number\n\t */\n\t/**\n\t * @property y1\n\t * @type Number\n\t */\n\t/**\n\t * @property x2\n\t * @type Number\n\t */\n\t/**\n\t * @property y2\n\t * @type Number\n\t */\n\t/**\n\t * @property radius\n\t * @type Number\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\t(G.ArcTo = function(x1, y1, x2, y2, radius) {\n\t\tthis.x1 = x1; this.y1 = y1;\n\t\tthis.x2 = x2; this.y2 = y2;\n\t\tthis.radius = radius;\n\t}).prototype.exec = function(ctx) { ctx.arcTo(this.x1, this.y1, this.x2, this.y2, this.radius); };\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/arc\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class Arc\n\t * @constructor\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} radius\n\t * @param {Number} startAngle\n\t * @param {Number} endAngle\n\t * @param {Number} anticlockwise\n\t **/\n\t/**\n\t * @property x\n\t * @type Number\n\t */\n\t/**\n\t * @property y\n\t * @type Number\n\t */\n\t/**\n\t * @property radius\n\t * @type Number\n\t */\n\t/**\n\t * @property startAngle\n\t * @type Number\n\t */\n\t/**\n\t * @property endAngle\n\t * @type Number\n\t */\n\t/**\n\t * @property anticlockwise\n\t * @type Number\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\t(G.Arc = function(x, y, radius, startAngle, endAngle, anticlockwise) {\n\t\tthis.x = x; this.y = y;\n\t\tthis.radius = radius;\n\t\tthis.startAngle = startAngle; this.endAngle = endAngle;\n\t\tthis.anticlockwise = !!anticlockwise;\n\t}).prototype.exec = function(ctx) { ctx.arc(this.x, this.y, this.radius, this.startAngle, this.endAngle, this.anticlockwise); };\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/quadraticCurveTo\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class QuadraticCurveTo\n\t * @constructor\n\t * @param {Number} cpx\n\t * @param {Number} cpy\n\t * @param {Number} x\n\t * @param {Number} y\n\t **/\n\t/**\n\t * @property cpx\n\t * @type Number\n\t */\n\t/**\n\t * @property cpy\n\t * @type Number\n\t */\n\t/**\n\t * @property x\n\t * @type Number\n\t */\n\t/**\n\t * @property y\n\t * @type Number\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\t(G.QuadraticCurveTo = function(cpx, cpy, x, y) {\n\t\tthis.cpx = cpx; this.cpy = cpy;\n\t\tthis.x = x; this.y = y;\n\t}).prototype.exec = function(ctx) { ctx.quadraticCurveTo(this.cpx, this.cpy, this.x, this.y); };\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/bezierCurveTo\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class BezierCurveTo\n\t * @constructor\n\t * @param {Number} cp1x\n\t * @param {Number} cp1y\n\t * @param {Number} cp2x\n\t * @param {Number} cp2y\n\t * @param {Number} x\n\t * @param {Number} y\n\t **/\n\t/**\n\t * @property cp1x\n\t * @type Number\n\t */\n\t/**\n\t * @property cp1y\n\t * @type Number\n\t */\n\t/**\n\t * @property cp2x\n\t * @type Number\n\t */\n\t/**\n\t * @property cp2y\n\t * @type Number\n\t */\n\t/**\n\t * @property x\n\t * @type Number\n\t */\n\t/**\n\t * @property y\n\t * @type Number\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\t(G.BezierCurveTo = function(cp1x, cp1y, cp2x, cp2y, x, y) {\n\t\tthis.cp1x = cp1x; this.cp1y = cp1y;\n\t\tthis.cp2x = cp2x; this.cp2y = cp2y;\n\t\tthis.x = x; this.y = y;\n\t}).prototype.exec = function(ctx) { ctx.bezierCurveTo(this.cp1x, this.cp1y, this.cp2x, this.cp2y, this.x, this.y); };\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/rect\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class Rect\n\t * @constructor\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} w\n\t * @param {Number} h\n\t **/\n\t/**\n\t * @property x\n\t * @type Number\n\t */\n\t/**\n\t * @property y\n\t * @type Number\n\t */\n\t/**\n\t * @property w\n\t * @type Number\n\t */\n\t/**\n\t * @property h\n\t * @type Number\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\t(G.Rect = function(x, y, w, h) {\n\t\tthis.x = x; this.y = y;\n\t\tthis.w = w; this.h = h;\n\t}).prototype.exec = function(ctx) { ctx.rect(this.x, this.y, this.w, this.h); };\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/closePath\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class ClosePath\n\t * @constructor\n\t **/\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\t(G.ClosePath = function() {\n\t}).prototype.exec = function(ctx) { ctx.closePath(); };\n\n\t/**\n\t * Graphics command object to begin a new path. See {{#crossLink \"Graphics\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class BeginPath\n\t * @constructor\n\t **/\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\t(G.BeginPath = function() {\n\t}).prototype.exec = function(ctx) { ctx.beginPath(); };\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/beginFill\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class Fill\n\t * @constructor\n\t * @param {Object} style A valid Context2D fillStyle.\n\t * @param {Matrix2D} matrix\n\t **/\n\t/**\n\t * A valid Context2D fillStyle.\n\t * @property style\n\t * @type Object\n\t */\n\t/**\n\t * @property matrix\n\t * @type Matrix2D\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\tp = (G.Fill = function(style, matrix) {\n\t\tthis.style = style;\n\t\tthis.matrix = matrix;\n\t}).prototype;\n\tp.exec = function(ctx) {\n\t\tif (!this.style) { return; }\n\t\tctx.fillStyle = this.style;\n\t\tvar mtx = this.matrix;\n\t\tif (mtx) { ctx.save(); ctx.transform(mtx.a, mtx.b, mtx.c, mtx.d, mtx.tx, mtx.ty); }\n\t\tctx.fill();\n\t\tif (mtx) { ctx.restore(); }\n\t};\n\t/**\n\t * Creates a linear gradient style and assigns it to {{#crossLink \"Fill/style:property\"}}{{/crossLink}}.\n\t * See {{#crossLink \"Graphics/beginLinearGradientFill\"}}{{/crossLink}} for more information.\n\t * @method linearGradient\n\t * @param {Array} colors\n\t *\n\t * @param {Array} ratios\n\t * @param {Number} x0\n\t * @param {Number} y0\n\t * @param {Number} x1\n\t * @param {Number} y1\n\t * @return {Fill} Returns this Fill object for chaining or assignment.\n\t */\n\tp.linearGradient = function(colors, ratios, x0, y0, x1, y1) {\n\t\tvar o = this.style =  Graphics._ctx.createLinearGradient(x0, y0, x1, y1);\n\t\tfor (var i=0, l=colors.length; i<l; i++) { o.addColorStop(ratios[i], colors[i]); }\n\t\to.props = {colors:colors, ratios:ratios, x0:x0, y0:y0, x1:x1, y1:y1, type:\"linear\"};\n\t\treturn this;\n\t};\n\t/**\n\t * Creates a radial gradient style and assigns it to {{#crossLink \"Fill/style:property\"}}{{/crossLink}}.\n\t * See {{#crossLink \"Graphics/beginRadialGradientFill\"}}{{/crossLink}} for more information.\n\t * @method radialGradient\n\t * @param {Array} colors\n\t * @param {Array} ratios\n\t * @param {Number} x0\n\t * @param {Number} y0\n\t * @param {Number} r0\n\t * @param {Number} x1\n\t * @param {Number} y1\n\t * @param {Number} r1\n\t * @return {Fill} Returns this Fill object for chaining or assignment.\n\t */\n\tp.radialGradient = function(colors, ratios, x0, y0, r0, x1, y1, r1) {\n\t\tvar o = this.style =  Graphics._ctx.createRadialGradient(x0, y0, r0, x1, y1, r1);\n\t\tfor (var i=0, l=colors.length; i<l; i++) { o.addColorStop(ratios[i], colors[i]); }\n\t\to.props = {colors:colors, ratios:ratios, x0:x0, y0:y0, r0:r0, x1:x1, y1:y1, r1:r1, type:\"radial\"};\n\t\treturn this;\n\t};\n\t/**\n\t * Creates a bitmap fill style and assigns it to the {{#crossLink \"Fill/style:property\"}}{{/crossLink}}.\n\t * See {{#crossLink \"Graphics/beginBitmapFill\"}}{{/crossLink}} for more information.\n\t * @method bitmap\n\t * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement} image  Must be loaded prior to creating a bitmap fill, or the fill will be empty.\n\t * @param {String} [repetition] One of: repeat, repeat-x, repeat-y, or no-repeat.\n\t * @return {Fill} Returns this Fill object for chaining or assignment.\n\t */\n\tp.bitmap = function(image, repetition) {\n\t\tif (image.naturalWidth || image.getContext || image.readyState >= 2) {\n\t\t\tvar o = this.style = Graphics._ctx.createPattern(image, repetition || \"\");\n\t\t\to.props = {image: image, repetition: repetition, type: \"bitmap\"};\n\t\t}\n\t\treturn this;\n\t};\n\tp.path = false;\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/beginStroke\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class Stroke\n\t * @constructor\n\t * @param {Object} style A valid Context2D fillStyle.\n\t * @param {Boolean} ignoreScale\n\t **/\n\t/**\n\t * A valid Context2D strokeStyle.\n\t * @property style\n\t * @type Object\n\t */\n\t/**\n\t * @property ignoreScale\n\t * @type Boolean\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\tp = (G.Stroke = function(style, ignoreScale) {\n\t\tthis.style = style;\n\t\tthis.ignoreScale = ignoreScale;\n\t}).prototype;\n\tp.exec = function(ctx) {\n\t\tif (!this.style) { return; }\n\t\tctx.strokeStyle = this.style;\n\t\tif (this.ignoreScale) { ctx.save(); ctx.setTransform(1,0,0,1,0,0); }\n\t\tctx.stroke();\n\t\tif (this.ignoreScale) { ctx.restore(); }\n\t};\n\t/**\n\t * Creates a linear gradient style and assigns it to {{#crossLink \"Stroke/style:property\"}}{{/crossLink}}.\n\t * See {{#crossLink \"Graphics/beginLinearGradientStroke\"}}{{/crossLink}} for more information.\n\t * @method linearGradient\n\t * @param {Array} colors\n\t * @param {Array} ratios\n\t * @param {Number} x0\n\t * @param {Number} y0\n\t * @param {Number} x1\n\t * @param {Number} y1\n\t * @return {Fill} Returns this Stroke object for chaining or assignment.\n\t */\n\tp.linearGradient = G.Fill.prototype.linearGradient;\n\t/**\n\t * Creates a radial gradient style and assigns it to {{#crossLink \"Stroke/style:property\"}}{{/crossLink}}.\n\t * See {{#crossLink \"Graphics/beginRadialGradientStroke\"}}{{/crossLink}} for more information.\n\t * @method radialGradient\n\t * @param {Array} colors\n\t * @param {Array} ratios\n\t * @param {Number} x0\n\t * @param {Number} y0\n\t * @param {Number} r0\n\t * @param {Number} x1\n\t * @param {Number} y1\n\t * @param {Number} r1\n\t * @return {Fill} Returns this Stroke object for chaining or assignment.\n\t */\n\tp.radialGradient = G.Fill.prototype.radialGradient;\n\t/**\n\t * Creates a bitmap fill style and assigns it to {{#crossLink \"Stroke/style:property\"}}{{/crossLink}}.\n\t * See {{#crossLink \"Graphics/beginBitmapStroke\"}}{{/crossLink}} for more information.\n\t * @method bitmap\n\t * @param {HTMLImageElement} image\n\t * @param {String} [repetition] One of: repeat, repeat-x, repeat-y, or no-repeat.\n\t * @return {Fill} Returns this Stroke object for chaining or assignment.\n\t */\n\tp.bitmap = G.Fill.prototype.bitmap;\n\tp.path = false;\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/setStrokeStyle\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class StrokeStyle\n\t * @constructor\n\t * @param {Number} width\n\t * @param {String} [caps=butt]\n\t * @param {String} [joints=miter]\n\t * @param {Number} [miterLimit=10]\n\t * @param {Boolean} [ignoreScale=false]\n\t **/\n\t/**\n\t * @property width\n\t * @type Number\n\t */\n\t/**\n\t * One of: butt, round, square\n\t * @property caps\n\t * @type String\n\t */\n\t/**\n\t * One of: round, bevel, miter\n\t * @property joints\n\t * @type String\n\t */\n\t/**\n\t * @property miterLimit\n\t * @type Number\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\tp = (G.StrokeStyle = function(width, caps, joints, miterLimit, ignoreScale) {\n\t\tthis.width = width;\n\t\tthis.caps = caps;\n\t\tthis.joints = joints;\n\t\tthis.miterLimit = miterLimit;\n\t\tthis.ignoreScale = ignoreScale;\n\t}).prototype;\n\tp.exec = function(ctx) {\n\t\tctx.lineWidth = (this.width == null ? \"1\" : this.width);\n\t\tctx.lineCap = (this.caps == null ? \"butt\" : (isNaN(this.caps) ? this.caps : Graphics.STROKE_CAPS_MAP[this.caps]));\n\t\tctx.lineJoin = (this.joints == null ? \"miter\" : (isNaN(this.joints) ? this.joints : Graphics.STROKE_JOINTS_MAP[this.joints]));\n\t\tctx.miterLimit = (this.miterLimit == null ? \"10\" : this.miterLimit);\n\t\tctx.ignoreScale = (this.ignoreScale == null ? false : this.ignoreScale);\n\t};\n\tp.path = false;\n\t\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/setStrokeDash\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class StrokeDash\n\t * @constructor\n\t * @param {Array} [segments]\n\t * @param {Number} [offset=0]\n\t **/\n\t/**\n\t * @property segments\n\t * @type Array\n\t */\n\t/**\n\t * @property offset\n\t * @type Number\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\t(G.StrokeDash = function(segments, offset) {\n\t\tthis.segments = segments;\n\t\tthis.offset = offset||0;\n\t}).prototype.exec = function(ctx) {\n\t\tif (ctx.setLineDash) { // feature detection.\n\t\t\tctx.setLineDash(this.segments|| G.StrokeDash.EMPTY_SEGMENTS); // instead of [] to reduce churn.\n\t\t\tctx.lineDashOffset = this.offset||0;\n\t\t}\n\t};\n\t/**\n\t * The default value for segments (ie. no dash).\n\t * @property EMPTY_SEGMENTS\n\t * @static\n\t * @final\n\t * @readonly\n\t * @protected\n\t * @type {Array}\n\t **/\n\tG.StrokeDash.EMPTY_SEGMENTS = [];\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/drawRoundRectComplex\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class RoundRect\n\t * @constructor\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} w\n\t * @param {Number} h\n\t * @param {Number} radiusTL\n\t * @param {Number} radiusTR\n\t * @param {Number} radiusBR\n\t * @param {Number} radiusBL\n\t **/\n\t/**\n\t * @property x\n\t * @type Number\n\t */\n\t/**\n\t * @property y\n\t * @type Number\n\t */\n\t/**\n\t * @property w\n\t * @type Number\n\t */\n\t/**\n\t * @property h\n\t * @type Number\n\t */\n\t/**\n\t * @property radiusTL\n\t * @type Number\n\t */\n\t/**\n\t * @property radiusTR\n\t * @type Number\n\t */\n\t/**\n\t * @property radiusBR\n\t * @type Number\n\t */\n\t/**\n\t * @property radiusBL\n\t * @type Number\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\t(G.RoundRect = function(x, y, w, h, radiusTL, radiusTR, radiusBR, radiusBL) {\n\t\tthis.x = x; this.y = y;\n\t\tthis.w = w; this.h = h;\n\t\tthis.radiusTL = radiusTL; this.radiusTR = radiusTR;\n\t\tthis.radiusBR = radiusBR; this.radiusBL = radiusBL;\n\t}).prototype.exec = function(ctx) {\n\t\tvar max = (w<h?w:h)/2;\n\t\tvar mTL=0, mTR=0, mBR=0, mBL=0;\n\t\tvar x = this.x, y = this.y, w = this.w, h = this.h;\n\t\tvar rTL = this.radiusTL, rTR = this.radiusTR, rBR = this.radiusBR, rBL = this.radiusBL;\n\n\t\tif (rTL < 0) { rTL *= (mTL=-1); }\n\t\tif (rTL > max) { rTL = max; }\n\t\tif (rTR < 0) { rTR *= (mTR=-1); }\n\t\tif (rTR > max) { rTR = max; }\n\t\tif (rBR < 0) { rBR *= (mBR=-1); }\n\t\tif (rBR > max) { rBR = max; }\n\t\tif (rBL < 0) { rBL *= (mBL=-1); }\n\t\tif (rBL > max) { rBL = max; }\n\n\t\tctx.moveTo(x+w-rTR, y);\n\t\tctx.arcTo(x+w+rTR*mTR, y-rTR*mTR, x+w, y+rTR, rTR);\n\t\tctx.lineTo(x+w, y+h-rBR);\n\t\tctx.arcTo(x+w+rBR*mBR, y+h+rBR*mBR, x+w-rBR, y+h, rBR);\n\t\tctx.lineTo(x+rBL, y+h);\n\t\tctx.arcTo(x-rBL*mBL, y+h+rBL*mBL, x, y+h-rBL, rBL);\n\t\tctx.lineTo(x, y+rTL);\n\t\tctx.arcTo(x-rTL*mTL, y-rTL*mTL, x+rTL, y, rTL);\n\t\tctx.closePath();\n\t};\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/drawCircle\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class Circle\n\t * @constructor\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} radius\n\t **/\n\t/**\n\t * @property x\n\t * @type Number\n\t */\n\t/**\n\t * @property y\n\t * @type Number\n\t */\n\t/**\n\t * @property radius\n\t * @type Number\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\t(G.Circle = function(x, y, radius) {\n\t\tthis.x = x; this.y = y;\n\t\tthis.radius = radius;\n\t}).prototype.exec = function(ctx) { ctx.arc(this.x, this.y, this.radius, 0, Math.PI*2); };\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/drawEllipse\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class Ellipse\n\t * @constructor\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} w\n\t * @param {Number} h\n\t **/\n\t/**\n\t * @property x\n\t * @type Number\n\t */\n\t/**\n\t * @property y\n\t * @type Number\n\t */\n\t/**\n\t * @property w\n\t * @type Number\n\t */\n\t/**\n\t * @property h\n\t * @type Number\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\t(G.Ellipse = function(x, y, w, h) {\n\t\tthis.x = x; this.y = y;\n\t\tthis.w = w; this.h = h;\n\t}).prototype.exec = function(ctx) {\n\t\tvar x = this.x, y = this.y;\n\t\tvar w = this.w, h = this.h;\n\n\t\tvar k = 0.5522848;\n\t\tvar ox = (w / 2) * k;\n\t\tvar oy = (h / 2) * k;\n\t\tvar xe = x + w;\n\t\tvar ye = y + h;\n\t\tvar xm = x + w / 2;\n\t\tvar ym = y + h / 2;\n\n\t\tctx.moveTo(x, ym);\n\t\tctx.bezierCurveTo(x, ym-oy, xm-ox, y, xm, y);\n\t\tctx.bezierCurveTo(xm+ox, y, xe, ym-oy, xe, ym);\n\t\tctx.bezierCurveTo(xe, ym+oy, xm+ox, ye, xm, ye);\n\t\tctx.bezierCurveTo(xm-ox, ye, x, ym+oy, x, ym);\n\t};\n\n\t/**\n\t * Graphics command object. See {{#crossLink \"Graphics/drawPolyStar\"}}{{/crossLink}} and {{#crossLink \"Graphics/append\"}}{{/crossLink}} for more information.\n\t * @class PolyStar\n\t * @constructor\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} radius\n\t * @param {Number} sides\n\t * @param {Number} pointSize\n\t * @param {Number} angle\n\t **/\n\t/**\n\t * @property x\n\t * @type Number\n\t */\n\t/**\n\t * @property y\n\t * @type Number\n\t */\n\t/**\n\t * @property radius\n\t * @type Number\n\t */\n\t/**\n\t * @property sides\n\t * @type Number\n\t */\n\t/**\n\t * @property pointSize\n\t * @type Number\n\t */\n\t/**\n\t * @property angle\n\t * @type Number\n\t */\n\t/**\n\t * Execute the Graphics command in the provided Canvas context.\n\t * @method exec\n\t * @param {CanvasRenderingContext2D} ctx The canvas rendering context\n\t */\n\t(G.PolyStar = function(x, y, radius, sides, pointSize, angle) {\n\t\tthis.x = x; this.y = y;\n\t\tthis.radius = radius;\n\t\tthis.sides = sides;\n\t\tthis.pointSize = pointSize;\n\t\tthis.angle = angle;\n\t}).prototype.exec = function(ctx) {\n\t\tvar x = this.x, y = this.y;\n\t\tvar radius = this.radius;\n\t\tvar angle = (this.angle||0)/180*Math.PI;\n\t\tvar sides = this.sides;\n\t\tvar ps = 1-(this.pointSize||0);\n\t\tvar a = Math.PI/sides;\n\n\t\tctx.moveTo(x+Math.cos(angle)*radius, y+Math.sin(angle)*radius);\n\t\tfor (var i=0; i<sides; i++) {\n\t\t\tangle += a;\n\t\t\tif (ps != 1) {\n\t\t\t\tctx.lineTo(x+Math.cos(angle)*radius*ps, y+Math.sin(angle)*radius*ps);\n\t\t\t}\n\t\t\tangle += a;\n\t\t\tctx.lineTo(x+Math.cos(angle)*radius, y+Math.sin(angle)*radius);\n\t\t}\n\t\tctx.closePath();\n\t};\n\n\t// docced above.\n\tGraphics.beginCmd = new G.BeginPath(); // so we don't have to instantiate multiple instances.\n\n\n\tcreatejs.Graphics = Graphics;\n}());\n\n//##############################################################################\n// DisplayObject.js\n//##############################################################################\n\n(function() {\r\n\t\"use strict\";\r\n\r\n\r\n// constructor:\r\n\t/**\r\n\t * DisplayObject is an abstract class that should not be constructed directly. Instead construct subclasses such as\r\n\t * {{#crossLink \"Container\"}}{{/crossLink}}, {{#crossLink \"Bitmap\"}}{{/crossLink}}, and {{#crossLink \"Shape\"}}{{/crossLink}}.\r\n\t * DisplayObject is the base class for all display classes in the EaselJS library. It defines the core properties and\r\n\t * methods that are shared between all display objects, such as transformation properties (x, y, scaleX, scaleY, etc),\r\n\t * caching, and mouse handlers.\r\n\t * @class DisplayObject\r\n\t * @extends EventDispatcher\r\n\t * @constructor\r\n\t **/\r\n\tfunction DisplayObject() {\r\n\t\tthis.EventDispatcher_constructor();\r\n\r\n\r\n\t// public properties:\r\n\t\t/**\r\n\t\t * The alpha (transparency) for this display object. 0 is fully transparent, 1 is fully opaque.\r\n\t\t * @property alpha\r\n\t\t * @type {Number}\r\n\t\t * @default 1\r\n\t\t **/\r\n\t\tthis.alpha = 1;\r\n\r\n\t\t/**\r\n\t\t * If a cache is active, this returns the canvas that holds the image of this display object. See {{#crossLink \"DisplayObject/cache:method\"}}{{/crossLink}}\r\n\t\t * for more information. Use this to display the result of a cache. This will be a HTMLCanvasElement unless special cache rules have been deliberately enabled for this cache.\r\n\t\t * @property cacheCanvas\r\n\t\t * @type {HTMLCanvasElement | Object}\r\n\t\t * @default null\r\n\t\t * @readonly\r\n\t\t **/\r\n\t\tthis.cacheCanvas = null;\r\n\r\n\t\t/**\r\n\t\t * If a cache has been made, this returns the class that is managing the cacheCanvas and its properties. See {{#crossLink \"BitmapCache\"}}{{/crossLink}}\r\n\t\t * for more information. Use this to control, inspect, and change the cache. In special circumstances this may be a modified or subclassed BitmapCache.\r\n\t\t * @property bitmapCache\r\n\t\t * @type {BitmapCache}\r\n\t\t * @default null\r\n\t\t * @readonly\r\n\t\t **/\r\n\t\tthis.bitmapCache = null;\r\n\r\n\t\t/**\r\n\t\t * Unique ID for this display object. Makes display objects easier for some uses.\r\n\t\t * @property id\r\n\t\t * @type {Number}\r\n\t\t * @default -1\r\n\t\t **/\r\n\t\tthis.id = createjs.UID.get();\r\n\r\n\t\t/**\r\n\t\t * Indicates whether to include this object when running mouse interactions. Setting this to `false` for children\r\n\t\t * of a {{#crossLink \"Container\"}}{{/crossLink}} will cause events on the Container to not fire when that child is\r\n\t\t * clicked. Setting this property to `false` does not prevent the {{#crossLink \"Container/getObjectsUnderPoint\"}}{{/crossLink}}\r\n\t\t * method from returning the child.\r\n\t\t *\r\n\t\t * <strong>Note:</strong> In EaselJS 0.7.0, the mouseEnabled property will not work properly with nested Containers. Please\r\n\t\t * check out the latest NEXT version in <a href=\"https://github.com/CreateJS/EaselJS/tree/master/lib\">GitHub</a> for an updated version with this issue resolved. The fix will be\r\n\t\t * provided in the next release of EaselJS.\r\n\t\t * @property mouseEnabled\r\n\t\t * @type {Boolean}\r\n\t\t * @default true\r\n\t\t **/\r\n\t\tthis.mouseEnabled = true;\r\n\r\n\t\t/**\r\n\t\t * If false, the tick will not run on this display object (or its children). This can provide some performance benefits.\r\n\t\t * In addition to preventing the \"tick\" event from being dispatched, it will also prevent tick related updates\r\n\t\t * on some display objects (ex. Sprite & MovieClip frame advancing, and DOMElement display properties).\r\n\t\t * @property tickEnabled\r\n\t\t * @type Boolean\r\n\t\t * @default true\r\n\t\t **/\r\n\t\tthis.tickEnabled = true;\r\n\r\n\t\t/**\r\n\t\t * An optional name for this display object. Included in {{#crossLink \"DisplayObject/toString\"}}{{/crossLink}} . Useful for\r\n\t\t * debugging.\r\n\t\t * @property name\r\n\t\t * @type {String}\r\n\t\t * @default null\r\n\t\t **/\r\n\t\tthis.name = null;\r\n\r\n\t\t/**\r\n\t\t * A reference to the {{#crossLink \"Container\"}}{{/crossLink}} or {{#crossLink \"Stage\"}}{{/crossLink}} object that\r\n\t\t * contains this display object, or null if it has not been added\r\n\t\t * to one.\r\n\t\t * @property parent\r\n\t\t * @final\r\n\t\t * @type {Container}\r\n\t\t * @default null\r\n\t\t * @readonly\r\n\t\t **/\r\n\t\tthis.parent = null;\r\n\r\n\t\t/**\r\n\t\t * The left offset for this display object's registration point. For example, to make a 100x100px Bitmap rotate\r\n\t\t * around its center, you would set regX and {{#crossLink \"DisplayObject/regY:property\"}}{{/crossLink}} to 50.\r\n\t\t * Cached object's registration points should be set based on pre-cache conditions, not cached size.\r\n\t\t * @property regX\r\n\t\t * @type {Number}\r\n\t\t * @default 0\r\n\t\t **/\r\n\t\tthis.regX = 0;\r\n\r\n\t\t/**\r\n\t\t * The y offset for this display object's registration point. For example, to make a 100x100px Bitmap rotate around\r\n\t\t * its center, you would set {{#crossLink \"DisplayObject/regX:property\"}}{{/crossLink}} and regY to 50.\r\n\t\t * Cached object's registration points should be set based on pre-cache conditions, not cached size.\r\n\t\t * @property regY\r\n\t\t * @type {Number}\r\n\t\t * @default 0\r\n\t\t **/\r\n\t\tthis.regY = 0;\r\n\r\n\t\t/**\r\n\t\t * The rotation in degrees for this display object.\r\n\t\t * @property rotation\r\n\t\t * @type {Number}\r\n\t\t * @default 0\r\n\t\t **/\r\n\t\tthis.rotation = 0;\r\n\r\n\t\t/**\r\n\t\t * The factor to stretch this display object horizontally. For example, setting scaleX to 2 will stretch the display\r\n\t\t * object to twice its nominal width. To horizontally flip an object, set the scale to a negative number.\r\n\t\t * @property scaleX\r\n\t\t * @type {Number}\r\n\t\t * @default 1\r\n\t\t **/\r\n\t\tthis.scaleX = 1;\r\n\r\n\t\t/**\r\n\t\t * The factor to stretch this display object vertically. For example, setting scaleY to 0.5 will stretch the display\r\n\t\t * object to half its nominal height. To vertically flip an object, set the scale to a negative number.\r\n\t\t * @property scaleY\r\n\t\t * @type {Number}\r\n\t\t * @default 1\r\n\t\t **/\r\n\t\tthis.scaleY = 1;\r\n\r\n\t\t/**\r\n\t\t * The factor to skew this display object horizontally.\r\n\t\t * @property skewX\r\n\t\t * @type {Number}\r\n\t\t * @default 0\r\n\t\t **/\r\n\t\tthis.skewX = 0;\r\n\r\n\t\t/**\r\n\t\t * The factor to skew this display object vertically.\r\n\t\t * @property skewY\r\n\t\t * @type {Number}\r\n\t\t * @default 0\r\n\t\t **/\r\n\t\tthis.skewY = 0;\r\n\r\n\t\t/**\r\n\t\t * A shadow object that defines the shadow to render on this display object. Set to `null` to remove a shadow. If\r\n\t\t * null, this property is inherited from the parent container.\r\n\t\t * @property shadow\r\n\t\t * @type {Shadow}\r\n\t\t * @default null\r\n\t\t **/\r\n\t\tthis.shadow = null;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether this display object should be rendered to the canvas and included when running the Stage\r\n\t\t * {{#crossLink \"Stage/getObjectsUnderPoint\"}}{{/crossLink}} method.\r\n\t\t * @property visible\r\n\t\t * @type {Boolean}\r\n\t\t * @default true\r\n\t\t **/\r\n\t\tthis.visible = true;\r\n\r\n\t\t/**\r\n\t\t * The x (horizontal) position of the display object, relative to its parent.\r\n\t\t * @property x\r\n\t\t * @type {Number}\r\n\t\t * @default 0\r\n\t\t **/\r\n\t\tthis.x = 0;\r\n\r\n\t\t/** The y (vertical) position of the display object, relative to its parent.\r\n\t\t * @property y\r\n\t\t * @type {Number}\r\n\t\t * @default 0\r\n\t\t **/\r\n\t\tthis.y = 0;\r\n\r\n\t\t/**\r\n\t\t * If set, defines the transformation for this display object, overriding all other transformation properties\r\n\t\t * (x, y, rotation, scale, skew).\r\n\t\t * @property transformMatrix\r\n\t\t * @type {Matrix2D}\r\n\t\t * @default null\r\n\t\t **/\r\n\t\tthis.transformMatrix = null;\r\n\r\n\t\t/**\r\n\t\t * The composite operation indicates how the pixels of this display object will be composited with the elements\r\n\t\t * behind it. If `null`, this property is inherited from the parent container. For more information, read the\r\n\t\t * <a href=\"https://html.spec.whatwg.org/multipage/scripting.html#dom-context-2d-globalcompositeoperation\">\r\n\t\t * whatwg spec on compositing</a>. For a list of supported compositeOperation value, visit\r\n\t\t * <a href=\"https://drafts.fxtf.org/compositing/\">the W3C draft on Compositing and Blending</a>.\r\n\t\t * @property compositeOperation\r\n\t\t * @type {String}\r\n\t\t * @default null\r\n\t\t **/\r\n\t\tthis.compositeOperation = null;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether the display object should be drawn to a whole pixel when\r\n\t\t * {{#crossLink \"Stage/snapToPixelEnabled\"}}{{/crossLink}} is true. To enable/disable snapping on whole\r\n\t\t * categories of display objects, set this value on the prototype (Ex. Text.prototype.snapToPixel = true).\r\n\t\t * @property snapToPixel\r\n\t\t * @type {Boolean}\r\n\t\t * @default true\r\n\t\t **/\r\n\t\tthis.snapToPixel = true;\r\n\r\n\t\t/**\r\n\t\t * An array of Filter objects to apply to this display object. Filters are only applied / updated when {{#crossLink \"cache\"}}{{/crossLink}}\r\n\t\t * or {{#crossLink \"updateCache\"}}{{/crossLink}} is called on the display object, and only apply to the area that is\r\n\t\t * cached.\r\n\t\t * @property filters\r\n\t\t * @type {Array}\r\n\t\t * @default null\r\n\t\t **/\r\n\t\tthis.filters = null;\r\n\r\n\t\t/**\r\n\t\t * A Shape instance that defines a vector mask (clipping path) for this display object.  The shape's transformation\r\n\t\t * will be applied relative to the display object's parent coordinates (as if it were a child of the parent).\r\n\t\t * @property mask\r\n\t\t * @type {Shape}\r\n\t\t * @default null\r\n\t\t */\r\n\t\tthis.mask = null;\r\n\r\n\t\t/**\r\n\t\t * A display object that will be tested when checking mouse interactions or testing {{#crossLink \"Container/getObjectsUnderPoint\"}}{{/crossLink}}.\r\n\t\t * The hit area will have its transformation applied relative to this display object's coordinate space (as though\r\n\t\t * the hit test object were a child of this display object and relative to its regX/Y). The hitArea will be tested\r\n\t\t * using only its own `alpha` value regardless of the alpha value on the target display object, or the target's\r\n\t\t * ancestors (parents).\r\n\t\t * \r\n\t\t * If set on a {{#crossLink \"Container\"}}{{/crossLink}}, children of the Container will not receive mouse events.\r\n\t\t * This is similar to setting {{#crossLink \"mouseChildren\"}}{{/crossLink}} to false.\r\n\t\t *\r\n\t\t * Note that hitArea is NOT currently used by the `hitTest()` method, nor is it supported for {{#crossLink \"Stage\"}}{{/crossLink}}.\r\n\t\t * @property hitArea\r\n\t\t * @type {DisplayObject}\r\n\t\t * @default null\r\n\t\t */\r\n\t\tthis.hitArea = null;\r\n\r\n\t\t/**\r\n\t\t * A CSS cursor (ex. \"pointer\", \"help\", \"text\", etc) that will be displayed when the user hovers over this display\r\n\t\t * object. You must enable mouseover events using the {{#crossLink \"Stage/enableMouseOver\"}}{{/crossLink}} method to\r\n\t\t * use this property. Setting a non-null cursor on a Container will override the cursor set on its descendants.\r\n\t\t * @property cursor\r\n\t\t * @type {String}\r\n\t\t * @default null\r\n\t\t */\r\n\t\tthis.cursor = null;\r\n\r\n\r\n\t// private properties:\r\n\t\t/**\r\n\t\t * Moved to {{#crossLink \"BitmapCache\"}}{{/crossLink}}\r\n\t\t * @property _cacheScale\r\n\t\t * @protected\r\n\t\t * @type {Number}\r\n\t\t * @default 1\r\n\t\t * @deprecated\r\n\t\t **/\r\n\r\n\t\t/**\r\n\t\t * Moved to {{#crossLink \"BitmapCache\"}}{{/crossLink}}\r\n\t\t * @property _cacheDataURLID\r\n\t\t * @protected\r\n\t\t * @type {Number}\r\n\t\t * @default 0\r\n\t\t * @deprecated\r\n\t\t */\r\n\r\n\t\t/**\r\n\t\t * Moved to {{#crossLink \"BitmapCache\"}}{{/crossLink}}\r\n\t\t * @property _cacheDataURL\r\n\t\t * @protected\r\n\t\t * @type {String}\r\n\t\t * @default null\r\n\t\t * @deprecated\r\n\t\t */\r\n\r\n\t\t/**\r\n\t\t * @property _props\r\n\t\t * @protected\r\n\t\t * @type {DisplayObject}\r\n\t\t * @default null\r\n\t\t **/\r\n\t\tthis._props = new createjs.DisplayProps();\r\n\r\n\t\t/**\r\n\t\t * @property _rectangle\r\n\t\t * @protected\r\n\t\t * @type {Rectangle}\r\n\t\t * @default null\r\n\t\t **/\r\n\t\tthis._rectangle = new createjs.Rectangle();\r\n\r\n\t\t/**\r\n\t\t * @property _bounds\r\n\t\t * @protected\r\n\t\t * @type {Rectangle}\r\n\t\t * @default null\r\n\t\t **/\r\n\t\tthis._bounds = null;\r\n\r\n\t\t/**\r\n\t\t * Where StageGL should look for required display properties, matters only for leaf display objects. Containers\r\n\t\t * or cached objects won't use this property, it's for native display of terminal elements.\r\n\t\t * @property _webGLRenderStyle\r\n\t\t * @protected\r\n\t\t * @type {number}\r\n\t\t * @default 0\r\n\t\t */\r\n\t\tthis._webGLRenderStyle = DisplayObject._StageGL_NONE;\r\n\t}\r\n\tvar p = createjs.extend(DisplayObject, createjs.EventDispatcher);\r\n\r\n// static properties:\r\n\t/**\r\n\t * Listing of mouse event names. Used in _hasMouseEventListener.\r\n\t * @property _MOUSE_EVENTS\r\n\t * @protected\r\n\t * @static\r\n\t * @type {Array}\r\n\t **/\r\n\tDisplayObject._MOUSE_EVENTS = [\"click\",\"dblclick\",\"mousedown\",\"mouseout\",\"mouseover\",\"pressmove\",\"pressup\",\"rollout\",\"rollover\"];\r\n\r\n\t/**\r\n\t * Suppresses errors generated when using features like hitTest, mouse events, and {{#crossLink \"getObjectsUnderPoint\"}}{{/crossLink}}\r\n\t * with cross domain content.\r\n\t * @property suppressCrossDomainErrors\r\n\t * @static\r\n\t * @type {Boolean}\r\n\t * @default false\r\n\t **/\r\n\tDisplayObject.suppressCrossDomainErrors = false;\r\n\r\n\t/**\r\n\t * @property _snapToPixelEnabled\r\n\t * @protected\r\n\t * @static\r\n\t * @type {Boolean}\r\n\t * @default false\r\n\t **/\r\n\tDisplayObject._snapToPixelEnabled = false; // stage.snapToPixelEnabled is temporarily copied here during a draw to provide global access.\r\n\r\n\t/**\r\n\t * Enum like property for determining StageGL render lookup, i.e. where to expect properties.\r\n\t * @property _StageGL_NONE\r\n\t * @protected\r\n\t * @static\r\n\t * @type {number}\r\n\t */\r\n\tDisplayObject._StageGL_NONE = 0;\r\n\r\n\t/**\r\n\t * Enum like property for determining StageGL render lookup, i.e. where to expect properties.\r\n\t * @property _StageGL_SPRITE\r\n\t * @protected\r\n\t * @static\r\n\t * @type {number}\r\n\t */\r\n\tDisplayObject._StageGL_SPRITE = 1;\r\n\r\n\t/**\r\n\t * Enum like property for determining StageGL render lookup, i.e. where to expect properties.\r\n\t * @property _StageGL_BITMAP\r\n\t * @protected\r\n\t * @static\r\n\t * @type {number}\r\n\t */\r\n\tDisplayObject._StageGL_BITMAP = 2;\r\n\r\n\t/**\r\n\t * @property _hitTestCanvas\r\n\t * @type {HTMLCanvasElement | Object}\r\n\t * @static\r\n\t * @protected\r\n\t **/\r\n\t/**\r\n\t * @property _hitTestContext\r\n\t * @type {CanvasRenderingContext2D}\r\n\t * @static\r\n\t * @protected\r\n\t **/\r\n\tvar canvas = createjs.createCanvas?createjs.createCanvas():document.createElement(\"canvas\"); // prevent errors on load in browsers without canvas.\r\n\tif (canvas.getContext) {\r\n\t\tDisplayObject._hitTestCanvas = canvas;\r\n\t\tDisplayObject._hitTestContext = canvas.getContext(\"2d\");\r\n\t\tcanvas.width = canvas.height = 1;\r\n\t}\r\n\r\n// events:\r\n\t/**\r\n\t * Dispatched when the user presses their left mouse button over the display object. See the \r\n\t * {{#crossLink \"MouseEvent\"}}{{/crossLink}} class for a listing of event properties.\r\n\t * @event mousedown\r\n\t * @since 0.6.0\r\n\t */\r\n\r\n\t/**\r\n\t * Dispatched when the user presses their left mouse button and then releases it while over the display object.\r\n\t * See the {{#crossLink \"MouseEvent\"}}{{/crossLink}} class for a listing of event properties.\r\n\t * @event click\r\n\t * @since 0.6.0\r\n\t */\r\n\r\n\t/**\r\n\t * Dispatched when the user double clicks their left mouse button over this display object.\r\n\t * See the {{#crossLink \"MouseEvent\"}}{{/crossLink}} class for a listing of event properties.\r\n\t * @event dblclick\r\n\t * @since 0.6.0\r\n\t */\r\n\r\n\t/**\r\n\t * Dispatched when the user's mouse enters this display object. This event must be enabled using \r\n\t * {{#crossLink \"Stage/enableMouseOver\"}}{{/crossLink}}. See also {{#crossLink \"DisplayObject/rollover:event\"}}{{/crossLink}}.\r\n\t * See the {{#crossLink \"MouseEvent\"}}{{/crossLink}} class for a listing of event properties.\r\n\t * @event mouseover\r\n\t * @since 0.6.0\r\n\t */\r\n\r\n\t/**\r\n\t * Dispatched when the user's mouse leaves this display object. This event must be enabled using \r\n\t * {{#crossLink \"Stage/enableMouseOver\"}}{{/crossLink}}. See also {{#crossLink \"DisplayObject/rollout:event\"}}{{/crossLink}}.\r\n\t * See the {{#crossLink \"MouseEvent\"}}{{/crossLink}} class for a listing of event properties.\r\n\t * @event mouseout\r\n\t * @since 0.6.0\r\n\t */\r\n\r\n\t/**\r\n\t * This event is similar to {{#crossLink \"DisplayObject/mouseover:event\"}}{{/crossLink}}, with the following\r\n\t * differences: it does not bubble, and it considers {{#crossLink \"Container\"}}{{/crossLink}} instances as an\r\n\t * aggregate of their content.\r\n\t * \r\n\t * For example, myContainer contains two overlapping children: shapeA and shapeB. The user moves their mouse over\r\n\t * shapeA and then directly on to shapeB. With a listener for {{#crossLink \"mouseover:event\"}}{{/crossLink}} on\r\n\t * myContainer, two events would be received, each targeting a child element:<OL>\r\n\t * <LI>when the mouse enters shapeA (target=shapeA)</LI>\r\n\t * <LI>when the mouse enters shapeB (target=shapeB)</LI>\r\n\t * </OL>\r\n\t * However, with a listener for \"rollover\" instead, only a single event is received when the mouse first enters\r\n\t * the aggregate myContainer content (target=myContainer).\r\n\t * \r\n\t * This event must be enabled using {{#crossLink \"Stage/enableMouseOver\"}}{{/crossLink}}.\r\n\t * See the {{#crossLink \"MouseEvent\"}}{{/crossLink}} class for a listing of event properties.\r\n\t * @event rollover\r\n\t * @since 0.7.0\r\n\t */\r\n\r\n\t/**\r\n\t * This event is similar to {{#crossLink \"DisplayObject/mouseout:event\"}}{{/crossLink}}, with the following\r\n\t * differences: it does not bubble, and it considers {{#crossLink \"Container\"}}{{/crossLink}} instances as an\r\n\t * aggregate of their content.\r\n\t * \r\n\t * For example, myContainer contains two overlapping children: shapeA and shapeB. The user moves their mouse over\r\n\t * shapeA, then directly on to shapeB, then off both. With a listener for {{#crossLink \"mouseout:event\"}}{{/crossLink}}\r\n\t * on myContainer, two events would be received, each targeting a child element:<OL>\r\n\t * <LI>when the mouse leaves shapeA (target=shapeA)</LI>\r\n\t * <LI>when the mouse leaves shapeB (target=shapeB)</LI>\r\n\t * </OL>\r\n\t * However, with a listener for \"rollout\" instead, only a single event is received when the mouse leaves\r\n\t * the aggregate myContainer content (target=myContainer).\r\n\t * \r\n\t * This event must be enabled using {{#crossLink \"Stage/enableMouseOver\"}}{{/crossLink}}.\r\n\t * See the {{#crossLink \"MouseEvent\"}}{{/crossLink}} class for a listing of event properties.\r\n\t * @event rollout\r\n\t * @since 0.7.0\r\n\t */\r\n\r\n\t/**\r\n\t * After a {{#crossLink \"DisplayObject/mousedown:event\"}}{{/crossLink}} occurs on a display object, a pressmove\r\n\t * event will be generated on that object whenever the mouse moves until the mouse press is released. This can be\r\n\t * useful for dragging and similar operations.\r\n\t *\r\n\t * **Please note** that if the initial mouse target from a `mousedown` event is removed from the stage after being pressed\r\n\t * (e.g. during a `pressmove` event), a `pressmove` event is still generated. However since it is no longer in the\r\n\t * display list, the event can not bubble. This means that previous ancestors (parent containers) will not receive\r\n\t * the event, and therefore can not re-dispatch it. If you intend to listen for `{{#crossLink \"DisplayObject/pressup:event\"}}{{/crossLink}}`\r\n\t * or `pressmove` on a dynamic object (such as a {{#crossLink \"MovieClip\"}}{{/crossLink}} or {{#crossLink \"Container\"}}{{/crossLink}}),\r\n\t * then ensure you set {{#crossLink \"Container/mouseChildren:property\"}}{{/crossLink}} to `false`.\r\n\t * @event pressmove\r\n\t * @since 0.7.0\r\n\t */\r\n\r\n\t/**\r\n\t * After a {{#crossLink \"DisplayObject/mousedown:event\"}}{{/crossLink}} occurs on a display object, a pressup event\r\n\t * will be generated on that object when that mouse press is released. This can be useful for dragging and similar\r\n\t * operations.\r\n\t *\r\n\t * **Please note** that if the initial mouse target from a `mousedown` event is removed from the stage after being pressed\r\n\t * (e.g. during a `pressmove` event), a `pressup` event is still generated. However since it is no longer in the\r\n\t * display list, the event can not bubble. This means that previous ancestors (parent containers) will not receive\r\n\t * the event, and therefore can not re-dispatch it. If you intend to listen for `{{#crossLink \"DisplayObject/pressmove:event\"}}{{/crossLink}}`\r\n\t * or `pressup` on a dynamic object (such as a {{#crossLink \"MovieClip\"}}{{/crossLink}} or {{#crossLink \"Container\"}}{{/crossLink}}),\r\n\t * then ensure you set {{#crossLink \"Container/mouseChildren:property\"}}{{/crossLink}} to `false`.\r\n\t * @event pressup\r\n\t * @since 0.7.0\r\n\t */\r\n\r\n\t/**\r\n\t * Dispatched when the display object is added to a parent container.\r\n\t * @event added\r\n\t */\r\n\r\n\t/**\r\n\t * Dispatched when the display object is removed from its parent container.\r\n\t * @event removed\r\n\t */\r\n\r\n\t/**\r\n\t * Dispatched on each display object on a stage whenever the stage updates. This occurs immediately before the\r\n\t * rendering (draw) pass. When {{#crossLink \"Stage/update\"}}{{/crossLink}} is called, first all display objects on\r\n\t * the stage dispatch the tick event, then all of the display objects are drawn to stage. Children will have their\r\n\t * {{#crossLink \"tick:event\"}}{{/crossLink}} event dispatched in order of their depth prior to the event being\r\n\t * dispatched on their parent.\r\n\t * @event tick\r\n\t * @param {Object} target The object that dispatched the event.\r\n\t * @param {String} type The event type.\r\n\t * @param {Array} params An array containing any arguments that were passed to the Stage.update() method. For\r\n\t *      example if you called stage.update(\"hello\"), then the params would be [\"hello\"].\r\n\t * @since 0.6.0\r\n\t */\r\n\r\n\r\n// getter / setters:\r\n\t/**\r\n\t * Use the {{#crossLink \"DisplayObject/stage:property\"}}{{/crossLink}} property instead.\r\n\t * @method _getStage\r\n\t * @protected\r\n\t * @return {Stage}\r\n\t **/\r\n\tp._getStage = function() {\r\n\t\t// uses dynamic access to avoid circular dependencies;\r\n\t\tvar o = this, _Stage = createjs[\"Stage\"];\r\n\t\twhile (o.parent) { o = o.parent; }\r\n\t\tif (o instanceof _Stage) { return o; }\r\n\t\treturn null;\r\n\t};\r\n\t// DisplayObject.getStage is @deprecated. Remove for 1.1+\r\n\tp.getStage = createjs.deprecate(p._getStage, \"DisplayObject.getStage\");\r\n\r\n\t/**\r\n\t * Returns the Stage instance that this display object will be rendered on, or null if it has not been added to one.\r\n\t * @property stage\r\n\t * @type {Stage}\r\n\t * @readonly\r\n\t **/\r\n\r\n\t/**\r\n\t * Returns an ID number that uniquely identifies the current cache for this display object. This can be used to\r\n\t * determine if the cache has changed since a previous check.\r\n\t * Moved to {{#crossLink \"BitmapCache\"}}{{/crossLink}}\r\n\t * @property cacheID\r\n\t * @deprecated\r\n\t * @type {Number}\r\n\t * @default 0\r\n\t */\r\n\r\n\t/**\r\n\t * Set both the {{#crossLink \"DisplayObject/scaleX:property\"}}{{/crossLink}} and the {{#crossLink \"DisplayObject/scaleY\"}}{{/crossLink}}\r\n\t * property to the same value. Note that when you get the value, if the `scaleX` and `scaleY` are different values,\r\n\t * it will return only the `scaleX`.\r\n\t * @property scaleX\r\n\t * @type {Number}\r\n\t * @default 1\r\n\t */\r\n\ttry {\r\n\t\tObject.defineProperties(p, {\r\n\t\t\tstage: { get: p._getStage },\r\n\t\t\tcacheID: {\r\n\t\t\t\tget: function(){ return this.bitmapCache && this.bitmapCache.cacheID },\r\n\t\t\t\tset: function(a){ this.bitmapCache && (this.bitmapCache.cacheID = a) }\r\n\t\t\t},\r\n\t\t\tscale: {\r\n\t\t\t\tget: function() { return this.scaleX; },\r\n\t\t\t\tset: function(scale) { this.scaleX = this.scaleY = scale; },\r\n\t\t\t}\r\n\t\t});\r\n\t} catch (e) {}\r\n\r\n\r\n// public methods:\r\n\t/**\r\n\t * Returns true or false indicating whether the display object would be visible if drawn to a canvas.\r\n\t * This does not account for whether it would be visible within the boundaries of the stage.\r\n\t *\r\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\r\n\t * @method isVisible\r\n\t * @return {Boolean} Boolean indicating whether the display object would be visible if drawn to a canvas\r\n\t **/\r\n\tp.isVisible = function() {\r\n\t\treturn !!(this.visible && this.alpha > 0 && this.scaleX != 0 && this.scaleY != 0);\r\n\t};\r\n\r\n\t/**\r\n\t * Draws the display object into the specified context ignoring its visible, alpha, shadow, and transform.\r\n\t * Returns <code>true</code> if the draw was handled (useful for overriding functionality).\r\n\t *\r\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\r\n\t * @method draw\r\n\t * @param {CanvasRenderingContext2D} ctx The canvas 2D context object to draw into.\r\n\t * @param {Boolean} [ignoreCache=false] Indicates whether the draw operation should ignore any current cache. For example,\r\n\t * used for drawing the cache (to prevent it from simply drawing an existing cache back into itself).\r\n\t * @return {Boolean}\r\n\t **/\r\n\tp.draw = function(ctx, ignoreCache) {\r\n\t\tvar cache = this.bitmapCache;\r\n\t\tif(cache && !ignoreCache) {\r\n\t\t\treturn cache.draw(ctx);\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\r\n\t/**\r\n\t * Applies this display object's transformation, alpha, globalCompositeOperation, clipping path (mask), and shadow\r\n\t * to the specified context. This is typically called prior to {{#crossLink \"DisplayObject/draw\"}}{{/crossLink}}.\r\n\t * @method updateContext\r\n\t * @param {CanvasRenderingContext2D} ctx The canvas 2D to update.\r\n\t **/\r\n\tp.updateContext = function(ctx) {\r\n\t\tvar o=this, mask=o.mask, mtx= o._props.matrix;\r\n\t\t\r\n\t\tif (mask && mask.graphics && !mask.graphics.isEmpty()) {\r\n\t\t\tmask.getMatrix(mtx);\r\n\t\t\tctx.transform(mtx.a,  mtx.b, mtx.c, mtx.d, mtx.tx, mtx.ty);\r\n\t\t\t\r\n\t\t\tmask.graphics.drawAsPath(ctx);\r\n\t\t\tctx.clip();\r\n\t\t\t\r\n\t\t\tmtx.invert();\r\n\t\t\tctx.transform(mtx.a,  mtx.b, mtx.c, mtx.d, mtx.tx, mtx.ty);\r\n\t\t}\r\n\t\t\r\n\t\tthis.getMatrix(mtx);\r\n\t\tvar tx = mtx.tx, ty = mtx.ty;\r\n\t\tif (DisplayObject._snapToPixelEnabled && o.snapToPixel) {\r\n\t\t\ttx = tx + (tx < 0 ? -0.5 : 0.5) | 0;\r\n\t\t\tty = ty + (ty < 0 ? -0.5 : 0.5) | 0;\r\n\t\t}\r\n\t\tctx.transform(mtx.a,  mtx.b, mtx.c, mtx.d, tx, ty);\r\n\t\tctx.globalAlpha *= o.alpha;\r\n\t\tif (o.compositeOperation) { ctx.globalCompositeOperation = o.compositeOperation; }\r\n\t\tif (o.shadow) { this._applyShadow(ctx, o.shadow); }\r\n\t};\r\n\r\n\t/**\r\n\t * Draws the display object into a new element, which is then used for subsequent draws. Intended for complex content\r\n\t * that does not change frequently (ex. a Container with many children that do not move, or a complex vector Shape),\r\n\t * this can provide for much faster rendering because the content does not need to be re-rendered each tick. The\r\n\t * cached display object can be moved, rotated, faded, etc freely, however if its content changes, you must manually\r\n\t * update the cache by calling <code>updateCache()</code> again. You must specify the cached area via the x, y, w,\r\n\t * and h parameters. This defines the rectangle that will be rendered and cached using this display object's coordinates.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t * For example if you defined a Shape that drew a circle at 0, 0 with a radius of 25:\r\n\t *\r\n\t *      var shape = new createjs.Shape();\r\n\t *      shape.graphics.beginFill(\"#ff0000\").drawCircle(0, 0, 25);\r\n\t *      shape.cache(-25, -25, 50, 50);\r\n\t *\r\n\t * Note that filters need to be defined <em>before</em> the cache is applied or you will have to call updateCache after\r\n\t * application. Check out the {{#crossLink \"Filter\"}}{{/crossLink}} class for more information. Some filters\r\n\t * (ex. BlurFilter) may not work as expected in conjunction with the scale param.\r\n\t * \r\n\t * Usually, the resulting cacheCanvas will have the dimensions width * scale, height * scale, however some filters (ex. BlurFilter)\r\n\t * will add padding to the canvas dimensions.\r\n\t *\r\n\t * In previous versions caching was handled on DisplayObject but has since been moved to {{#crossLink \"BitmapCache\"}}{{/crossLink}}.\r\n\t * This allows for easier interaction and alternate cache methods like WebGL with {{#crossLink \"StageGL\"}}{{/crossLink}}.\r\n\t * For more information on the options object, see the BitmapCache {{#crossLink \"BitmapCache/define\"}}{{/crossLink}}.\r\n\t *\r\n\t * @method cache\r\n\t * @param {Number} x The x coordinate origin for the cache region.\r\n\t * @param {Number} y The y coordinate origin for the cache region.\r\n\t * @param {Number} width The width of the cache region.\r\n\t * @param {Number} height The height of the cache region.\r\n\t * @param {Number} [scale=1] The scale at which the cache will be created. For example, if you cache a vector shape using\r\n\t * \tmyShape.cache(0,0,100,100,2) then the resulting cacheCanvas will be 200x200 px. This lets you scale and rotate\r\n\t * \tcached elements with greater fidelity. Default is 1.\r\n\t * @param {Object} [options=undefined] Specify additional parameters for the cache logic\r\n\t **/\r\n\tp.cache = function(x, y, width, height, scale, options) {\r\n\t\tif(!this.bitmapCache){\r\n\t\t\tthis.bitmapCache = new createjs.BitmapCache();\r\n\t\t}\r\n\t\tthis.bitmapCache.define(this, x, y, width, height, scale, options);\r\n\t};\r\n\r\n\t/**\r\n\t * Redraws the display object to its cache. Calling updateCache without an active cache will throw an error.\r\n\t * If compositeOperation is null the current cache will be cleared prior to drawing. Otherwise the display object\r\n\t * will be drawn over the existing cache using the specified compositeOperation.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t * Clear the current graphics of a cached shape, draw some new instructions, and then update the cache. The new line\r\n\t * will be drawn on top of the old one.\r\n\t *\r\n\t *      // Not shown: Creating the shape, and caching it.\r\n\t *      shapeInstance.clear();\r\n\t *      shapeInstance.setStrokeStyle(3).beginStroke(\"#ff0000\").moveTo(100, 100).lineTo(200,200);\r\n\t *      shapeInstance.updateCache();\r\n\t *\r\n\t * In previous versions caching was handled on DisplayObject but has since been moved to {{#crossLink \"BitmapCache\"}}{{/crossLink}}.\r\n\t * This allows for easier interaction and alternate cache methods like WebGL and {{#crossLink \"StageGL\"}}{{/crossLink}}.\r\n\t *\r\n\t * @method updateCache\r\n\t * @param {String} compositeOperation The compositeOperation to use, or null to clear the cache and redraw it.\r\n\t * <a href=\"https://html.spec.whatwg.org/multipage/scripting.html#dom-context-2d-globalcompositeoperation\">\r\n\t * whatwg spec on compositing</a>.\r\n\t **/\r\n\tp.updateCache = function(compositeOperation) {\r\n\t\tif(!this.bitmapCache) {\r\n\t\t\tthrow \"cache() must be called before updateCache()\";\r\n\t\t}\r\n\t\tthis.bitmapCache.update(compositeOperation);\r\n\t};\r\n\r\n\t/**\r\n\t * Clears the current cache. See {{#crossLink \"DisplayObject/cache\"}}{{/crossLink}} for more information.\r\n\t * @method uncache\r\n\t **/\r\n\tp.uncache = function() {\r\n\t\tif(this.bitmapCache) {\r\n\t\t\tthis.bitmapCache.release();\r\n\t\t\tthis.bitmapCache = undefined;\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Returns a data URL for the cache, or null if this display object is not cached.\r\n\t * Only generated if the cache has changed, otherwise returns last result.\r\n\t * @method getCacheDataURL\r\n\t * @return {String} The image data url for the cache.\r\n\t **/\r\n\tp.getCacheDataURL = function() {\r\n\t\treturn this.bitmapCache?this.bitmapCache.getDataURL():null;\r\n\t};\r\n\r\n\t/**\r\n\t * Transforms the specified x and y position from the coordinate space of the display object\r\n\t * to the global (stage) coordinate space. For example, this could be used to position an HTML label\r\n\t * over a specific point on a nested display object. Returns a Point instance with x and y properties\r\n\t * correlating to the transformed coordinates on the stage.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      displayObject.x = 300;\r\n\t *      displayObject.y = 200;\r\n\t *      stage.addChild(displayObject);\r\n\t *      var point = displayObject.localToGlobal(100, 100);\r\n\t *      // Results in x=400, y=300\r\n\t *\r\n\t * @method localToGlobal\r\n\t * @param {Number} x The x position in the source display object to transform.\r\n\t * @param {Number} y The y position in the source display object to transform.\r\n\t * @param {Point | Object} [pt] An object to copy the result into. If omitted a new Point object with x/y properties will be returned. \r\n\t * @return {Point} A Point instance with x and y properties correlating to the transformed coordinates\r\n\t * on the stage.\r\n\t **/\r\n\tp.localToGlobal = function(x, y, pt) {\r\n\t\treturn this.getConcatenatedMatrix(this._props.matrix).transformPoint(x,y, pt||new createjs.Point());\r\n\t};\r\n\r\n\t/**\r\n\t * Transforms the specified x and y position from the global (stage) coordinate space to the\r\n\t * coordinate space of the display object. For example, this could be used to determine\r\n\t * the current mouse position within the display object. Returns a Point instance with x and y properties\r\n\t * correlating to the transformed position in the display object's coordinate space.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      displayObject.x = 300;\r\n\t *      displayObject.y = 200;\r\n\t *      stage.addChild(displayObject);\r\n\t *      var point = displayObject.globalToLocal(100, 100);\r\n\t *      // Results in x=-200, y=-100\r\n\t *\r\n\t * @method globalToLocal\r\n\t * @param {Number} x The x position on the stage to transform.\r\n\t * @param {Number} y The y position on the stage to transform.\r\n\t * @param {Point | Object} [pt] An object to copy the result into. If omitted a new Point object with x/y properties will be returned. \r\n\t * @return {Point} A Point instance with x and y properties correlating to the transformed position in the\r\n\t * display object's coordinate space.\r\n\t **/\r\n\tp.globalToLocal = function(x, y, pt) {\r\n\t\treturn this.getConcatenatedMatrix(this._props.matrix).invert().transformPoint(x,y, pt||new createjs.Point());\r\n\t};\r\n\r\n\t/**\r\n\t * Transforms the specified x and y position from the coordinate space of this display object to the coordinate\r\n\t * space of the target display object. Returns a Point instance with x and y properties correlating to the\r\n\t * transformed position in the target's coordinate space. Effectively the same as using the following code with\r\n\t * {{#crossLink \"DisplayObject/localToGlobal\"}}{{/crossLink}} and {{#crossLink \"DisplayObject/globalToLocal\"}}{{/crossLink}}.\r\n\t *\r\n\t *      var pt = this.localToGlobal(x, y);\r\n\t *      pt = target.globalToLocal(pt.x, pt.y);\r\n\t *\r\n\t * @method localToLocal\r\n\t * @param {Number} x The x position in the source display object to transform.\r\n\t * @param {Number} y The y position on the source display object to transform.\r\n\t * @param {DisplayObject} target The target display object to which the coordinates will be transformed.\r\n\t * @param {Point | Object} [pt] An object to copy the result into. If omitted a new Point object with x/y properties will be returned. \r\n\t * @return {Point} Returns a Point instance with x and y properties correlating to the transformed position\r\n\t * in the target's coordinate space.\r\n\t **/\r\n\tp.localToLocal = function(x, y, target, pt) {\r\n\t\tpt = this.localToGlobal(x, y, pt);\r\n\t\treturn target.globalToLocal(pt.x, pt.y, pt);\r\n\t};\r\n\r\n\t/**\r\n\t * Shortcut method to quickly set the transform properties on the display object. All parameters are optional.\r\n\t * Omitted parameters will have the default value set.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      displayObject.setTransform(100, 100, 2, 2);\r\n\t *\r\n\t * @method setTransform\r\n\t * @param {Number} [x=0] The horizontal translation (x position) in pixels\r\n\t * @param {Number} [y=0] The vertical translation (y position) in pixels\r\n\t * @param {Number} [scaleX=1] The horizontal scale, as a percentage of 1\r\n\t * @param {Number} [scaleY=1] the vertical scale, as a percentage of 1\r\n\t * @param {Number} [rotation=0] The rotation, in degrees\r\n\t * @param {Number} [skewX=0] The horizontal skew factor\r\n\t * @param {Number} [skewY=0] The vertical skew factor\r\n\t * @param {Number} [regX=0] The horizontal registration point in pixels\r\n\t * @param {Number} [regY=0] The vertical registration point in pixels\r\n\t * @return {DisplayObject} Returns this instance. Useful for chaining commands.\r\n\t * @chainable\r\n\t*/\r\n\tp.setTransform = function(x, y, scaleX, scaleY, rotation, skewX, skewY, regX, regY) {\r\n\t\tthis.x = x || 0;\r\n\t\tthis.y = y || 0;\r\n\t\tthis.scaleX = scaleX == null ? 1 : scaleX;\r\n\t\tthis.scaleY = scaleY == null ? 1 : scaleY;\r\n\t\tthis.rotation = rotation || 0;\r\n\t\tthis.skewX = skewX || 0;\r\n\t\tthis.skewY = skewY || 0;\r\n\t\tthis.regX = regX || 0;\r\n\t\tthis.regY = regY || 0;\r\n\t\treturn this;\r\n\t};\r\n\r\n\t/**\r\n\t * Returns a matrix based on this object's current transform.\r\n\t * @method getMatrix\r\n\t * @param {Matrix2D} matrix Optional. A Matrix2D object to populate with the calculated values. If null, a new\r\n\t * Matrix object is returned.\r\n\t * @return {Matrix2D} A matrix representing this display object's transform.\r\n\t **/\r\n\tp.getMatrix = function(matrix) {\r\n\t\tvar o = this, mtx = matrix&&matrix.identity() || new createjs.Matrix2D();\r\n\t\treturn o.transformMatrix ?  mtx.copy(o.transformMatrix) : mtx.appendTransform(o.x, o.y, o.scaleX, o.scaleY, o.rotation, o.skewX, o.skewY, o.regX, o.regY);\r\n\t};\r\n\r\n\t/**\r\n\t * Generates a Matrix2D object representing the combined transform of the display object and all of its\r\n\t * parent Containers up to the highest level ancestor (usually the {{#crossLink \"Stage\"}}{{/crossLink}}). This can\r\n\t * be used to transform positions between coordinate spaces, such as with {{#crossLink \"DisplayObject/localToGlobal\"}}{{/crossLink}}\r\n\t * and {{#crossLink \"DisplayObject/globalToLocal\"}}{{/crossLink}}.\r\n\t * @method getConcatenatedMatrix\r\n\t * @param {Matrix2D} [matrix] A {{#crossLink \"Matrix2D\"}}{{/crossLink}} object to populate with the calculated values.\r\n\t * If null, a new Matrix2D object is returned.\r\n\t * @return {Matrix2D} The combined matrix.\r\n\t **/\r\n\tp.getConcatenatedMatrix = function(matrix) {\r\n\t\tvar o = this, mtx = this.getMatrix(matrix);\r\n\t\twhile (o = o.parent) {\r\n\t\t\tmtx.prependMatrix(o.getMatrix(o._props.matrix));\r\n\t\t}\r\n\t\treturn mtx;\r\n\t};\r\n\r\n\t/**\r\n\t * Generates a DisplayProps object representing the combined display properties of the  object and all of its\r\n\t * parent Containers up to the highest level ancestor (usually the {{#crossLink \"Stage\"}}{{/crossLink}}).\r\n\t * @method getConcatenatedDisplayProps\r\n\t * @param {DisplayProps} [props] A {{#crossLink \"DisplayProps\"}}{{/crossLink}} object to populate with the calculated values.\r\n\t * If null, a new DisplayProps object is returned.\r\n\t * @return {DisplayProps} The combined display properties.\r\n\t **/\r\n\tp.getConcatenatedDisplayProps = function(props) {\r\n\t\tprops = props ? props.identity() : new createjs.DisplayProps();\r\n\t\tvar o = this, mtx = o.getMatrix(props.matrix); \r\n\t\tdo {\r\n\t\t\tprops.prepend(o.visible, o.alpha, o.shadow, o.compositeOperation);\r\n\t\t\t\r\n\t\t\t// we do this to avoid problems with the matrix being used for both operations when o._props.matrix is passed in as the props param.\r\n\t\t\t// this could be simplified (ie. just done as part of the prepend above) if we switched to using a pool.\r\n\t\t\tif (o != this) { mtx.prependMatrix(o.getMatrix(o._props.matrix)); }\r\n\t\t} while (o = o.parent);\r\n\t\treturn props;\r\n\t};\r\n\r\n\t/**\r\n\t * Tests whether the display object intersects the specified point in local coordinates (ie. draws a pixel with alpha > 0 at\r\n\t * the specified position). This ignores the alpha, shadow, hitArea, mask, and compositeOperation of the display object.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      stage.addEventListener(\"stagemousedown\", handleMouseDown);\r\n\t *      function handleMouseDown(event) {\r\n\t *          var hit = myShape.hitTest(event.stageX, event.stageY);\r\n\t *      }\r\n\t *\r\n\t * Please note that shape-to-shape collision is not currently supported by EaselJS.\r\n\t * @method hitTest\r\n\t * @param {Number} x The x position to check in the display object's local coordinates.\r\n\t * @param {Number} y The y position to check in the display object's local coordinates.\r\n\t * @return {Boolean} A Boolean indicating whether a visible portion of the DisplayObject intersect the specified\r\n\t * local Point.\r\n\t*/\r\n\tp.hitTest = function(x, y) {\r\n\t\tvar ctx = DisplayObject._hitTestContext;\r\n\t\tctx.setTransform(1, 0, 0, 1, -x, -y);\r\n\t\tthis.draw(ctx);\r\n\r\n\t\tvar hit = this._testHit(ctx);\r\n\t\tctx.setTransform(1, 0, 0, 1, 0, 0);\r\n\t\tctx.clearRect(0, 0, 2, 2);\r\n\t\treturn hit;\r\n\t};\r\n\r\n\t/**\r\n\t * Provides a chainable shortcut method for setting a number of properties on the instance.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      var myGraphics = new createjs.Graphics().beginFill(\"#ff0000\").drawCircle(0, 0, 25);\r\n\t *      var shape = stage.addChild(new Shape()).set({graphics:myGraphics, x:100, y:100, alpha:0.5});\r\n\t *\r\n\t * @method set\r\n\t * @param {Object} props A generic object containing properties to copy to the DisplayObject instance.\r\n\t * @return {DisplayObject} Returns the instance the method is called on (useful for chaining calls.)\r\n\t * @chainable\r\n\t*/\r\n\tp.set = function(props) {\r\n\t\tfor (var n in props) { this[n] = props[n]; }\r\n\t\treturn this;\r\n\t};\r\n\r\n\t/**\r\n\t * Returns a rectangle representing this object's bounds in its local coordinate system (ie. with no transformation).\r\n\t * Objects that have been cached will return the bounds of the cache.\r\n\t * \r\n\t * Not all display objects can calculate their own bounds (ex. Shape). For these objects, you can use \r\n\t * {{#crossLink \"DisplayObject/setBounds\"}}{{/crossLink}} so that they are included when calculating Container\r\n\t * bounds.\r\n\t * \r\n\t * <table>\r\n\t * \t<tr><td><b>All</b></td><td>\r\n\t * \t\tAll display objects support setting bounds manually using setBounds(). Likewise, display objects that\r\n\t * \t\thave been cached using cache() will return the bounds of their cache. Manual and cache bounds will override\r\n\t * \t\tthe automatic calculations listed below.\r\n\t * \t</td></tr>\r\n\t * \t<tr><td><b>Bitmap</b></td><td>\r\n\t * \t\tReturns the width and height of the sourceRect (if specified) or image, extending from (x=0,y=0).\r\n\t * \t</td></tr>\r\n\t * \t<tr><td><b>Sprite</b></td><td>\r\n\t * \t\tReturns the bounds of the current frame. May have non-zero x/y if a frame registration point was specified\r\n\t * \t\tin the spritesheet data. See also {{#crossLink \"SpriteSheet/getFrameBounds\"}}{{/crossLink}}\r\n\t * \t</td></tr>\r\n\t * \t<tr><td><b>Container</b></td><td>\r\n\t * \t\tReturns the aggregate (combined) bounds of all children that return a non-null value from getBounds().\r\n\t * \t</td></tr>\r\n\t * \t<tr><td><b>Shape</b></td><td>\r\n\t * \t\tDoes not currently support automatic bounds calculations. Use setBounds() to manually define bounds.\r\n\t * \t</td></tr>\r\n\t * \t<tr><td><b>Text</b></td><td>\r\n\t * \t\tReturns approximate bounds. Horizontal values (x/width) are quite accurate, but vertical values (y/height) are\r\n\t * \t\tnot, especially when using textBaseline values other than \"top\".\r\n\t * \t</td></tr>\r\n\t * \t<tr><td><b>BitmapText</b></td><td>\r\n\t * \t\tReturns approximate bounds. Values will be more accurate if spritesheet frame registration points are close\r\n\t * \t\tto (x=0,y=0).\r\n\t * \t</td></tr>\r\n\t* </table>\r\n\t * \r\n\t * Bounds can be expensive to calculate for some objects (ex. text, or containers with many children), and\r\n\t * are recalculated each time you call getBounds(). You can prevent recalculation on static objects by setting the\r\n\t * bounds explicitly:\r\n\t * \r\n\t * \tvar bounds = obj.getBounds();\r\n\t * \tobj.setBounds(bounds.x, bounds.y, bounds.width, bounds.height);\r\n\t * \t// getBounds will now use the set values, instead of recalculating\r\n\t * \r\n\t * To reduce memory impact, the returned Rectangle instance may be reused internally; clone the instance or copy its\r\n\t * values if you need to retain it.\r\n\t * \r\n\t * \tvar myBounds = obj.getBounds().clone();\r\n\t * \t// OR:\r\n\t * \tmyRect.copy(obj.getBounds());\r\n\t * \r\n\t * @method getBounds\r\n\t * @return {Rectangle} A Rectangle instance representing the bounds, or null if bounds are not available for this\r\n\t * object.\r\n\t **/\r\n\tp.getBounds = function() {\r\n\t\tif (this._bounds) { return this._rectangle.copy(this._bounds); }\r\n\t\tvar cacheCanvas = this.cacheCanvas;\r\n\t\tif (cacheCanvas) {\r\n\t\t\tvar scale = this._cacheScale;\r\n\t\t\treturn this._rectangle.setValues(this._cacheOffsetX, this._cacheOffsetY, cacheCanvas.width/scale, cacheCanvas.height/scale);\r\n\t\t}\r\n\t\treturn null;\r\n\t};\r\n\r\n\t/**\r\n\t * Returns a rectangle representing this object's bounds in its parent's coordinate system (ie. with transformations applied).\r\n\t * Objects that have been cached will return the transformed bounds of the cache.\r\n\t * \r\n\t * Not all display objects can calculate their own bounds (ex. Shape). For these objects, you can use \r\n\t * {{#crossLink \"DisplayObject/setBounds\"}}{{/crossLink}} so that they are included when calculating Container\r\n\t * bounds.\r\n\t * \r\n\t * To reduce memory impact, the returned Rectangle instance may be reused internally; clone the instance or copy its\r\n\t * values if you need to retain it.\r\n\t * \r\n\t * Container instances calculate aggregate bounds for all children that return bounds via getBounds.\r\n\t * @method getTransformedBounds\r\n\t * @return {Rectangle} A Rectangle instance representing the bounds, or null if bounds are not available for this object.\r\n\t **/\r\n\tp.getTransformedBounds = function() {\r\n\t\treturn this._getBounds();\r\n\t};\r\n\r\n\t/**\r\n\t * Allows you to manually specify the bounds of an object that either cannot calculate their own bounds (ex. Shape &\r\n\t * Text) for future reference, or so the object can be included in Container bounds. Manually set bounds will always\r\n\t * override calculated bounds.\r\n\t * \r\n\t * The bounds should be specified in the object's local (untransformed) coordinates. For example, a Shape instance\r\n\t * with a 25px radius circle centered at 0,0 would have bounds of (-25, -25, 50, 50).\r\n\t * @method setBounds\r\n\t * @param {Number} x The x origin of the bounds. Pass null to remove the manual bounds.\r\n\t * @param {Number} y The y origin of the bounds.\r\n\t * @param {Number} width The width of the bounds.\r\n\t * @param {Number} height The height of the bounds.\r\n\t **/\r\n\tp.setBounds = function(x, y, width, height) {\r\n\t\tif (x == null) { this._bounds = x; return; }\r\n\t\tthis._bounds = (this._bounds || new createjs.Rectangle()).setValues(x, y, width, height);\r\n\t};\r\n\r\n\t/**\r\n\t * Returns a clone of this DisplayObject. Some properties that are specific to this instance's current context are\r\n\t * reverted to their defaults (for example .parent). Caches are not maintained across clones, and some elements\r\n\t * are copied by reference (masks, individual filter instances, hit area)\r\n\t * @method clone\r\n\t * @return {DisplayObject} A clone of the current DisplayObject instance.\r\n\t **/\r\n\tp.clone = function() {\r\n\t\treturn this._cloneProps(new DisplayObject());\r\n\t};\r\n\r\n\t/**\r\n\t * Returns a string representation of this object.\r\n\t * @method toString\r\n\t * @return {String} a string representation of the instance.\r\n\t **/\r\n\tp.toString = function() {\r\n\t\treturn \"[DisplayObject (name=\"+  this.name +\")]\";\r\n\t};\r\n\r\n\r\n// private methods:\r\n\t/**\r\n\t * Called before the object gets drawn and is a chance to ensure the display state of the object is correct.\r\n\t * Mostly used by {{#crossLink \"MovieClip\"}}{{/crossLink}} and {{#crossLink \"BitmapText\"}}{{/crossLink}} to\r\n\t * correct their internal state and children prior to being drawn.\r\n\t *\r\n\t * Is manually called via draw in a {{#crossLink \"Stage\"}}{{/crossLink}} but is automatically called when\r\n\t * present in a {{#crossLink \"StageGL\"}}{{/crossLink}} instance.\r\n\t *\r\n\t * @method _updateState\r\n\t * @default null\r\n\t */\r\n\tp._updateState = null;\r\n\r\n\t// separated so it can be used more easily in subclasses:\r\n\t/**\r\n\t * @method _cloneProps\r\n\t * @param {DisplayObject} o The DisplayObject instance which will have properties from the current DisplayObject\r\n\t * instance copied into.\r\n\t * @return {DisplayObject} o\r\n\t * @protected\r\n\t **/\r\n\tp._cloneProps = function(o) {\r\n\t\to.alpha = this.alpha;\r\n\t\to.mouseEnabled = this.mouseEnabled;\r\n\t\to.tickEnabled = this.tickEnabled;\r\n\t\to.name = this.name;\r\n\t\to.regX = this.regX;\r\n\t\to.regY = this.regY;\r\n\t\to.rotation = this.rotation;\r\n\t\to.scaleX = this.scaleX;\r\n\t\to.scaleY = this.scaleY;\r\n\t\to.shadow = this.shadow;\r\n\t\to.skewX = this.skewX;\r\n\t\to.skewY = this.skewY;\r\n\t\to.visible = this.visible;\r\n\t\to.x  = this.x;\r\n\t\to.y = this.y;\r\n\t\to.compositeOperation = this.compositeOperation;\r\n\t\to.snapToPixel = this.snapToPixel;\r\n\t\to.filters = this.filters==null?null:this.filters.slice(0);\r\n\t\to.mask = this.mask;\r\n\t\to.hitArea = this.hitArea;\r\n\t\to.cursor = this.cursor;\r\n\t\to._bounds = this._bounds;\r\n\t\treturn o;\r\n\t};\r\n\r\n\t/**\r\n\t * @method _applyShadow\r\n\t * @protected\r\n\t * @param {CanvasRenderingContext2D} ctx\r\n\t * @param {Shadow} shadow\r\n\t **/\r\n\tp._applyShadow = function(ctx, shadow) {\r\n\t\tshadow = shadow || Shadow.identity;\r\n\t\tctx.shadowColor = shadow.color;\r\n\t\tctx.shadowOffsetX = shadow.offsetX;\r\n\t\tctx.shadowOffsetY = shadow.offsetY;\r\n\t\tctx.shadowBlur = shadow.blur;\r\n\t};\r\n\r\n\t/**\r\n\t * @method _tick\r\n\t * @param {Object} evtObj An event object that will be dispatched to all tick listeners. This object is reused between dispatchers to reduce construction & GC costs.\r\n\t * @protected\r\n\t **/\r\n\tp._tick = function(evtObj) {\r\n\t\t// because tick can be really performance sensitive, check for listeners before calling dispatchEvent.\r\n\t\tvar ls = this._listeners;\r\n\t\tif (ls && ls[\"tick\"]) {\r\n\t\t\t// reset & reuse the event object to avoid construction / GC costs:\r\n\t\t\tevtObj.target = null;\r\n\t\t\tevtObj.propagationStopped = evtObj.immediatePropagationStopped = false;\r\n\t\t\tthis.dispatchEvent(evtObj);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * @method _testHit\r\n\t * @protected\r\n\t * @param {CanvasRenderingContext2D} ctx\r\n\t * @return {Boolean}\r\n\t **/\r\n\tp._testHit = function(ctx) {\r\n\t\ttry {\r\n\t\t\tvar hit = ctx.getImageData(0, 0, 1, 1).data[3] > 1;\r\n\t\t} catch (e) {\r\n\t\t\tif (!DisplayObject.suppressCrossDomainErrors) {\r\n\t\t\t\tthrow \"An error has occurred. This is most likely due to security restrictions on reading canvas pixel data with local or cross-domain images.\";\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn hit;\r\n\t};\r\n\r\n\t/**\r\n\t * @method _getBounds\r\n\t * @param {Matrix2D} matrix\r\n\t * @param {Boolean} ignoreTransform If true, does not apply this object's transform.\r\n\t * @return {Rectangle}\r\n\t * @protected\r\n\t **/\r\n\tp._getBounds = function(matrix, ignoreTransform){\r\n\t\treturn this._transformBounds(this.getBounds(), matrix, ignoreTransform);\r\n\t};\r\n\r\n\t/**\r\n\t * @method _transformBounds\r\n\t * @param {Rectangle} bounds\r\n\t * @param {Matrix2D} matrix\r\n\t * @param {Boolean} ignoreTransform\r\n\t * @return {Rectangle}\r\n\t * @protected\r\n\t **/\r\n\tp._transformBounds = function(bounds, matrix, ignoreTransform) {\r\n\t\tif (!bounds) { return bounds; }\r\n\t\tvar x = bounds.x, y = bounds.y, width = bounds.width, height = bounds.height, mtx = this._props.matrix;\r\n\t\tmtx = ignoreTransform ? mtx.identity() : this.getMatrix(mtx);\r\n\t\t\r\n\t\tif (x || y) { mtx.appendTransform(0,0,1,1,0,0,0,-x,-y); } // TODO: simplify this.\r\n\t\tif (matrix) { mtx.prependMatrix(matrix); }\r\n\t\t\r\n\t\tvar x_a = width*mtx.a, x_b = width*mtx.b;\r\n\t\tvar y_c = height*mtx.c, y_d = height*mtx.d;\r\n\t\tvar tx = mtx.tx, ty = mtx.ty;\r\n\t\t\r\n\t\tvar minX = tx, maxX = tx, minY = ty, maxY = ty;\r\n\r\n\t\tif ((x = x_a + tx) < minX) { minX = x; } else if (x > maxX) { maxX = x; }\r\n\t\tif ((x = x_a + y_c + tx) < minX) { minX = x; } else if (x > maxX) { maxX = x; }\r\n\t\tif ((x = y_c + tx) < minX) { minX = x; } else if (x > maxX) { maxX = x; }\r\n\r\n\t\tif ((y = x_b + ty) < minY) { minY = y; } else if (y > maxY) { maxY = y; }\r\n\t\tif ((y = x_b + y_d + ty) < minY) { minY = y; } else if (y > maxY) { maxY = y; }\r\n\t\tif ((y = y_d + ty) < minY) { minY = y; } else if (y > maxY) { maxY = y; }\r\n\r\n\t\treturn bounds.setValues(minX, minY, maxX-minX, maxY-minY);\r\n\t};\r\n\r\n\t/**\r\n\t * Indicates whether the display object has any mouse event listeners or a cursor.\r\n\t * @method _isMouseOpaque\r\n\t * @return {Boolean}\r\n\t * @protected\r\n\t **/\r\n\tp._hasMouseEventListener = function() {\r\n\t\tvar evts = DisplayObject._MOUSE_EVENTS;\r\n\t\tfor (var i= 0, l=evts.length; i<l; i++) {\r\n\t\t\tif (this.hasEventListener(evts[i])) { return true; }\r\n\t\t}\r\n\t\treturn !!this.cursor;\r\n\t};\r\n\r\n\tcreatejs.DisplayObject = createjs.promote(DisplayObject, \"EventDispatcher\");\r\n}());\n\n//##############################################################################\n// Container.js\n//##############################################################################\n\n(function() {\r\n\t\"use strict\";\r\n\t\r\n\r\n// constructor:\r\n/**\r\n * A Container is a nestable display list that allows you to work with compound display elements. For  example you could\r\n * group arm, leg, torso and head {{#crossLink \"Bitmap\"}}{{/crossLink}} instances together into a Person Container, and\r\n * transform them as a group, while still being able to move the individual parts relative to each other. Children of\r\n * containers have their <code>transform</code> and <code>alpha</code> properties concatenated with their parent\r\n * Container.\r\n *\r\n * For example, a {{#crossLink \"Shape\"}}{{/crossLink}} with x=100 and alpha=0.5, placed in a Container with <code>x=50</code>\r\n * and <code>alpha=0.7</code> will be rendered to the canvas at <code>x=150</code> and <code>alpha=0.35</code>.\r\n * Containers have some overhead, so you generally shouldn't create a Container to hold a single child.\r\n *\r\n * <h4>Example</h4>\r\n *\r\n *      var container = new createjs.Container();\r\n *      container.addChild(bitmapInstance, shapeInstance);\r\n *      container.x = 100;\r\n *\r\n * @class Container\r\n * @extends DisplayObject\r\n * @constructor\r\n **/\r\n\tfunction Container() {\r\n\t\tthis.DisplayObject_constructor();\r\n\t\t\r\n\t// public properties:\r\n\t\t/**\r\n\t\t * The array of children in the display list. You should usually use the child management methods such as\r\n\t\t * {{#crossLink \"Container/addChild\"}}{{/crossLink}}, {{#crossLink \"Container/removeChild\"}}{{/crossLink}},\r\n\t\t * {{#crossLink \"Container/swapChildren\"}}{{/crossLink}}, etc, rather than accessing this directly, but it is\r\n\t\t * included for advanced uses.\r\n\t\t * @property children\r\n\t\t * @type Array\r\n\t\t * @default null\r\n\t\t **/\r\n\t\tthis.children = [];\r\n\t\t\r\n\t\t/**\r\n\t\t * Indicates whether the children of this container are independently enabled for mouse/pointer interaction.\r\n\t\t * If false, the children will be aggregated under the container - for example, a click on a child shape would\r\n\t\t * trigger a click event on the container.\r\n\t\t * @property mouseChildren\r\n\t\t * @type Boolean\r\n\t\t * @default true\r\n\t\t **/\r\n\t\tthis.mouseChildren = true;\r\n\t\t\r\n\t\t/**\r\n\t\t * If false, the tick will not be propagated to children of this Container. This can provide some performance benefits.\r\n\t\t * In addition to preventing the \"tick\" event from being dispatched, it will also prevent tick related updates\r\n\t\t * on some display objects (ex. Sprite & MovieClip frame advancing, DOMElement visibility handling).\r\n\t\t * @property tickChildren\r\n\t\t * @type Boolean\r\n\t\t * @default true\r\n\t\t **/\r\n\t\tthis.tickChildren = true;\r\n\t}\r\n\tvar p = createjs.extend(Container, createjs.DisplayObject);\r\n\t\r\n\t\r\n// getter / setters:\r\n\t/**\r\n\t * Use the {{#crossLink \"Container/numChildren:property\"}}{{/crossLink}} property instead.\r\n\t * @method _getNumChildren\r\n\t * @protected\r\n\t * @return {Number}\r\n\t **/\r\n\tp._getNumChildren = function() {\r\n\t\treturn this.children.length;\r\n\t};\r\n\t// Container.getNumChildren is @deprecated. Remove for 1.1+\r\n\tp.getNumChildren = createjs.deprecate(p._getNumChildren, \"Container.getNumChildren\");\r\n\r\n\t/**\r\n\t * Returns the number of children in the container.\r\n\t * @property numChildren\r\n\t * @type {Number}\r\n\t * @readonly\r\n\t **/\r\n\ttry {\r\n\t\tObject.defineProperties(p, {\r\n\t\t\tnumChildren: { get: p._getNumChildren }\r\n\t\t});\r\n\t} catch (e) {}\r\n\t\r\n\r\n// public methods:\r\n\t/**\r\n\t * Constructor alias for backwards compatibility. This method will be removed in future versions.\r\n\t * Subclasses should be updated to use {{#crossLink \"Utility Methods/extends\"}}{{/crossLink}}.\r\n\t * @method initialize\r\n\t * @deprecated in favour of `createjs.promote()`\r\n\t **/\r\n\tp.initialize = Container; // TODO: deprecated.\r\n\t\r\n\t/**\r\n\t * Returns true or false indicating whether the display object would be visible if drawn to a canvas.\r\n\t * This does not account for whether it would be visible within the boundaries of the stage.\r\n\t *\r\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\r\n\t * @method isVisible\r\n\t * @return {Boolean} Boolean indicating whether the display object would be visible if drawn to a canvas\r\n\t **/\r\n\tp.isVisible = function() {\r\n\t\tvar hasContent = this.cacheCanvas || this.children.length;\r\n\t\treturn !!(this.visible && this.alpha > 0 && this.scaleX != 0 && this.scaleY != 0 && hasContent);\r\n\t};\r\n\r\n\t/**\r\n\t * Draws the display object into the specified context ignoring its visible, alpha, shadow, and transform.\r\n\t * Returns true if the draw was handled (useful for overriding functionality).\r\n\t *\r\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\r\n\t * @method draw\r\n\t * @param {CanvasRenderingContext2D} ctx The canvas 2D context object to draw into.\r\n\t * @param {Boolean} [ignoreCache=false] Indicates whether the draw operation should ignore any current cache.\r\n\t * For example, used for drawing the cache (to prevent it from simply drawing an existing cache back\r\n\t * into itself).\r\n\t **/\r\n\tp.draw = function(ctx, ignoreCache) {\r\n\t\tif (this.DisplayObject_draw(ctx, ignoreCache)) { return true; }\r\n\t\t\r\n\t\t// this ensures we don't have issues with display list changes that occur during a draw:\r\n\t\tvar list = this.children.slice();\r\n\t\tfor (var i=0,l=list.length; i<l; i++) {\r\n\t\t\tvar child = list[i];\r\n\t\t\tif (!child.isVisible()) { continue; }\r\n\t\t\t\r\n\t\t\t// draw the child:\r\n\t\t\tctx.save();\r\n\t\t\tchild.updateContext(ctx);\r\n\t\t\tchild.draw(ctx);\r\n\t\t\tctx.restore();\r\n\t\t}\r\n\t\treturn true;\r\n\t};\r\n\t\r\n\t/**\r\n\t * Adds a child to the top of the display list.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t * \t\tcontainer.addChild(bitmapInstance);\r\n\t *\r\n\t * You can also add multiple children at once:\r\n\t *\r\n\t * \t\tcontainer.addChild(bitmapInstance, shapeInstance, textInstance);\r\n\t *\r\n\t * @method addChild\r\n\t * @param {DisplayObject} child The display object to add.\r\n\t * @return {DisplayObject} The child that was added, or the last child if multiple children were added.\r\n\t **/\r\n\tp.addChild = function(child) {\r\n\t\tif (child == null) { return child; }\r\n\t\tvar l = arguments.length;\r\n\t\tif (l > 1) {\r\n\t\t\tfor (var i=0; i<l; i++) { this.addChild(arguments[i]); }\r\n\t\t\treturn arguments[l-1];\r\n\t\t}\r\n\t\t// Note: a lot of duplication with addChildAt, but push is WAY faster than splice.\r\n\t\tvar par=child.parent, silent = par === this;\r\n\t\tpar&&par._removeChildAt(createjs.indexOf(par.children, child), silent);\r\n\t\tchild.parent = this;\r\n\t\tthis.children.push(child);\r\n\t\tif (!silent) { child.dispatchEvent(\"added\"); }\r\n\t\treturn child;\r\n\t};\r\n\r\n\t/**\r\n\t * Adds a child to the display list at the specified index, bumping children at equal or greater indexes up one, and\r\n\t * setting its parent to this Container.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      addChildAt(child1, index);\r\n\t *\r\n\t * You can also add multiple children, such as:\r\n\t *\r\n\t *      addChildAt(child1, child2, ..., index);\r\n\t *\r\n\t * The index must be between 0 and numChildren. For example, to add myShape under otherShape in the display list,\r\n\t * you could use:\r\n\t *\r\n\t *      container.addChildAt(myShape, container.getChildIndex(otherShape));\r\n\t *\r\n\t * This would also bump otherShape's index up by one. Fails silently if the index is out of range.\r\n\t *\r\n\t * @method addChildAt\r\n\t * @param {DisplayObject} child The display object to add.\r\n\t * @param {Number} index The index to add the child at.\r\n\t * @return {DisplayObject} Returns the last child that was added, or the last child if multiple children were added.\r\n\t **/\r\n\tp.addChildAt = function(child, index) {\r\n\t\tvar l = arguments.length;\r\n\t\tvar indx = arguments[l-1]; // can't use the same name as the index param or it replaces arguments[1]\r\n\t\tif (indx < 0 || indx > this.children.length) { return arguments[l-2]; }\r\n\t\tif (l > 2) {\r\n\t\t\tfor (var i=0; i<l-1; i++) { this.addChildAt(arguments[i], indx+i); }\r\n\t\t\treturn arguments[l-2];\r\n\t\t}\r\n\t\tvar par=child.parent, silent = par === this;\r\n\t\tpar&&par._removeChildAt(createjs.indexOf(par.children, child), silent);\r\n\t\tchild.parent = this;\r\n\t\tthis.children.splice(index, 0, child);\r\n\t\tif (!silent) { child.dispatchEvent(\"added\"); }\r\n\t\treturn child;\r\n\t};\r\n\r\n\t/**\r\n\t * Removes the specified child from the display list. Note that it is faster to use removeChildAt() if the index is\r\n\t * already known.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      container.removeChild(child);\r\n\t *\r\n\t * You can also remove multiple children:\r\n\t *\r\n\t *      removeChild(child1, child2, ...);\r\n\t *\r\n\t * Returns true if the child (or children) was removed, or false if it was not in the display list.\r\n\t * @method removeChild\r\n\t * @param {DisplayObject} child The child to remove.\r\n\t * @return {Boolean} true if the child (or children) was removed, or false if it was not in the display list.\r\n\t **/\r\n\tp.removeChild = function(child) {\r\n\t\tvar l = arguments.length;\r\n\t\tif (l > 1) {\r\n\t\t\tvar good = true;\r\n\t\t\tfor (var i=0; i<l; i++) { good = good && this.removeChild(arguments[i]); }\r\n\t\t\treturn good;\r\n\t\t}\r\n\t\treturn this._removeChildAt(createjs.indexOf(this.children, child));\r\n\t};\r\n\r\n\t/**\r\n\t * Removes the child at the specified index from the display list, and sets its parent to null.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      container.removeChildAt(2);\r\n\t *\r\n\t * You can also remove multiple children:\r\n\t *\r\n\t *      container.removeChild(2, 7, ...)\r\n\t *\r\n\t * Returns true if the child (or children) was removed, or false if any index was out of range.\r\n\t * @method removeChildAt\r\n\t * @param {Number} index The index of the child to remove.\r\n\t * @return {Boolean} true if the child (or children) was removed, or false if any index was out of range.\r\n\t **/\r\n\tp.removeChildAt = function(index) {\r\n\t\tvar l = arguments.length;\r\n\t\tif (l > 1) {\r\n\t\t\tvar a = [];\r\n\t\t\tfor (var i=0; i<l; i++) { a[i] = arguments[i]; }\r\n\t\t\ta.sort(function(a, b) { return b-a; });\r\n\t\t\tvar good = true;\r\n\t\t\tfor (var i=0; i<l; i++) { good = good && this._removeChildAt(a[i]); }\r\n\t\t\treturn good;\r\n\t\t}\r\n\t\treturn this._removeChildAt(index);\r\n\t};\r\n\r\n\t/**\r\n\t * Removes all children from the display list.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t * \tcontainer.removeAllChildren();\r\n\t *\r\n\t * @method removeAllChildren\r\n\t **/\r\n\tp.removeAllChildren = function() {\r\n\t\tvar kids = this.children;\r\n\t\twhile (kids.length) { this._removeChildAt(0); }\r\n\t};\r\n\r\n\t/**\r\n\t * Returns the child at the specified index.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      container.getChildAt(2);\r\n\t *\r\n\t * @method getChildAt\r\n\t * @param {Number} index The index of the child to return.\r\n\t * @return {DisplayObject} The child at the specified index. Returns null if there is no child at the index.\r\n\t **/\r\n\tp.getChildAt = function(index) {\r\n\t\treturn this.children[index];\r\n\t};\r\n\t\r\n\t/**\r\n\t * Returns the child with the specified name.\r\n\t * @method getChildByName\r\n\t * @param {String} name The name of the child to return.\r\n\t * @return {DisplayObject} The child with the specified name.\r\n\t **/\r\n\tp.getChildByName = function(name) {\r\n\t\tvar kids = this.children;\r\n\t\tfor (var i=0,l=kids.length;i<l;i++) {\r\n\t\t\tif(kids[i].name == name) { return kids[i]; }\r\n\t\t}\r\n\t\treturn null;\r\n\t};\r\n\r\n\t/**\r\n\t * Performs an array sort operation on the child list.\r\n\t *\r\n\t * <h4>Example: Display children with a higher y in front.</h4>\r\n\t * \r\n\t *      var sortFunction = function(obj1, obj2, options) {\r\n\t *          if (obj1.y > obj2.y) { return 1; }\r\n\t *          if (obj1.y < obj2.y) { return -1; }\r\n\t *          return 0;\r\n\t *      }\r\n\t *      container.sortChildren(sortFunction);\r\n\t *\r\n\t * @method sortChildren\r\n\t * @param {Function} sortFunction the function to use to sort the child list. See JavaScript's <code>Array.sort</code>\r\n\t * documentation for details.\r\n\t **/\r\n\tp.sortChildren = function(sortFunction) {\r\n\t\tthis.children.sort(sortFunction);\r\n\t};\r\n\r\n\t/**\r\n\t * Returns the index of the specified child in the display list, or -1 if it is not in the display list.\r\n\t *\r\n\t * <h4>Example</h4>\r\n\t *\r\n\t *      var index = container.getChildIndex(child);\r\n\t *\r\n\t * @method getChildIndex\r\n\t * @param {DisplayObject} child The child to return the index of.\r\n\t * @return {Number} The index of the specified child. -1 if the child is not found.\r\n\t **/\r\n\tp.getChildIndex = function(child) {\r\n\t\treturn createjs.indexOf(this.children, child);\r\n\t};\r\n\t\r\n\t/**\r\n\t * Swaps the children at the specified indexes. Fails silently if either index is out of range.\r\n\t * @method swapChildrenAt\r\n\t * @param {Number} index1\r\n\t * @param {Number} index2\r\n\t **/\r\n\tp.swapChildrenAt = function(index1, index2) {\r\n\t\tvar kids = this.children;\r\n\t\tvar o1 = kids[index1];\r\n\t\tvar o2 = kids[index2];\r\n\t\tif (!o1 || !o2) { return; }\r\n\t\tkids[index1] = o2;\r\n\t\tkids[index2] = o1;\r\n\t};\r\n\t\r\n\t/**\r\n\t * Swaps the specified children's depth in the display list. Fails silently if either child is not a child of this\r\n\t * Container.\r\n\t * @method swapChildren\r\n\t * @param {DisplayObject} child1\r\n\t * @param {DisplayObject} child2\r\n\t **/\r\n\tp.swapChildren = function(child1, child2) {\r\n\t\tvar kids = this.children;\r\n\t\tvar index1,index2;\r\n\t\tfor (var i=0,l=kids.length;i<l;i++) {\r\n\t\t\tif (kids[i] == child1) { index1 = i; }\r\n\t\t\tif (kids[i] == child2) { index2 = i; }\r\n\t\t\tif (index1 != null && index2 != null) { break; }\r\n\t\t}\r\n\t\tif (i==l) { return; } // TODO: throw error?\r\n\t\tkids[index1] = child2;\r\n\t\tkids[index2] = child1;\r\n\t};\r\n\t\r\n\t/**\r\n\t * Changes the depth of the specified child. Fails silently if the child is not a child of this container, or the index is out of range.\r\n\t * @param {DisplayObject} child\r\n\t * @param {Number} index  \r\n\t * @method setChildIndex\r\n\t **/\r\n\tp.setChildIndex = function(child, index) {\r\n\t\tvar kids = this.children, l=kids.length;\r\n\t\tif (child.parent != this || index < 0 || index >= l) { return; }\r\n\t\tfor (var i=0;i<l;i++) {\r\n\t\t\tif (kids[i] == child) { break; }\r\n\t\t}\r\n\t\tif (i==l || i == index) { return; }\r\n\t\tkids.splice(i,1);\r\n\t\tkids.splice(index,0,child);\r\n\t};\r\n\r\n\t/**\r\n\t * Returns true if the specified display object either is this container or is a descendent (child, grandchild, etc)\r\n\t * of this container.\r\n\t * @method contains\r\n\t * @param {DisplayObject} child The DisplayObject to be checked.\r\n\t * @return {Boolean} true if the specified display object either is this container or is a descendent.\r\n\t **/\r\n\tp.contains = function(child) {\r\n\t\twhile (child) {\r\n\t\t\tif (child == this) { return true; }\r\n\t\t\tchild = child.parent;\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\r\n\t/**\r\n\t * Tests whether the display object intersects the specified local point (ie. draws a pixel with alpha > 0 at the\r\n\t * specified position). This ignores the alpha, shadow and compositeOperation of the display object, and all\r\n\t * transform properties including regX/Y.\r\n\t * @method hitTest\r\n\t * @param {Number} x The x position to check in the display object's local coordinates.\r\n\t * @param {Number} y The y position to check in the display object's local coordinates.\r\n\t * @return {Boolean} A Boolean indicating whether there is a visible section of a DisplayObject that overlaps the specified\r\n\t * coordinates.\r\n\t **/\r\n\tp.hitTest = function(x, y) {\r\n\t\t// TODO: optimize to use the fast cache check where possible.\r\n\t\treturn (this.getObjectUnderPoint(x, y) != null);\r\n\t};\r\n\r\n\t/**\r\n\t * Returns an array of all display objects under the specified coordinates that are in this container's display\r\n\t * list. This routine ignores any display objects with {{#crossLink \"DisplayObject/mouseEnabled:property\"}}{{/crossLink}}\r\n\t * set to `false`. The array will be sorted in order of visual depth, with the top-most display object at index 0.\r\n\t * This uses shape based hit detection, and can be an expensive operation to run, so it is best to use it carefully.\r\n\t * For example, if testing for objects under the mouse, test on tick (instead of on {{#crossLink \"DisplayObject/mousemove:event\"}}{{/crossLink}}),\r\n\t * and only if the mouse's position has changed.\r\n\t * \r\n\t * <ul>\r\n\t *     <li>By default (mode=0) this method evaluates all display objects.</li>\r\n\t *     <li>By setting the `mode` parameter to `1`, the {{#crossLink \"DisplayObject/mouseEnabled:property\"}}{{/crossLink}}\r\n\t * \t\tand {{#crossLink \"mouseChildren:property\"}}{{/crossLink}} properties will be respected.</li>\r\n\t * \t   <li>Setting the `mode` to `2` additionally excludes display objects that do not have active mouse event\r\n\t * \t   \tlisteners or a {{#crossLink \"DisplayObject:cursor:property\"}}{{/crossLink}} property. That is, only objects\r\n\t * \t   \tthat would normally intercept mouse interaction will be included. This can significantly improve performance\r\n\t * \t   \tin some cases by reducing the number of display objects that need to be tested.</li>\r\n\t * </li>\r\n\t * \r\n\t * This method accounts for both {{#crossLink \"DisplayObject/hitArea:property\"}}{{/crossLink}} and {{#crossLink \"DisplayObject/mask:property\"}}{{/crossLink}}.\r\n\t * @method getObjectsUnderPoint\r\n\t * @param {Number} x The x position in the container to test.\r\n\t * @param {Number} y The y position in the container to test.\r\n\t * @param {Number} [mode=0] The mode to use to determine which display objects to include. 0-all, 1-respect mouseEnabled/mouseChildren, 2-only mouse opaque objects.\r\n\t * @return {Array} An Array of DisplayObjects under the specified coordinates.\r\n\t **/\r\n\tp.getObjectsUnderPoint = function(x, y, mode) {\r\n\t\tvar arr = [];\r\n\t\tvar pt = this.localToGlobal(x, y);\r\n\t\tthis._getObjectsUnderPoint(pt.x, pt.y, arr, mode>0, mode==1);\r\n\t\treturn arr;\r\n\t};\r\n\r\n\t/**\r\n\t * Similar to {{#crossLink \"Container/getObjectsUnderPoint\"}}{{/crossLink}}, but returns only the top-most display\r\n\t * object. This runs significantly faster than <code>getObjectsUnderPoint()</code>, but is still potentially an expensive\r\n\t * operation. See {{#crossLink \"Container/getObjectsUnderPoint\"}}{{/crossLink}} for more information.\r\n\t * @method getObjectUnderPoint\r\n\t * @param {Number} x The x position in the container to test.\r\n\t * @param {Number} y The y position in the container to test.\r\n\t * @param {Number} mode The mode to use to determine which display objects to include.  0-all, 1-respect mouseEnabled/mouseChildren, 2-only mouse opaque objects.\r\n\t * @return {DisplayObject} The top-most display object under the specified coordinates.\r\n\t **/\r\n\tp.getObjectUnderPoint = function(x, y, mode) {\r\n\t\tvar pt = this.localToGlobal(x, y);\r\n\t\treturn this._getObjectsUnderPoint(pt.x, pt.y, null, mode>0, mode==1);\r\n\t};\r\n\t\r\n\t/**\r\n\t * Docced in superclass.\r\n\t */\r\n\tp.getBounds = function() {\r\n\t\treturn this._getBounds(null, true);\r\n\t};\r\n\t\r\n\t\r\n\t/**\r\n\t * Docced in superclass.\r\n\t */\r\n\tp.getTransformedBounds = function() {\r\n\t\treturn this._getBounds();\r\n\t};\r\n\r\n\t/**\r\n\t * Returns a clone of this Container. Some properties that are specific to this instance's current context are\r\n\t * reverted to their defaults (for example .parent).\r\n\t * @method clone\r\n\t * @param {Boolean} [recursive=false] If true, all of the descendants of this container will be cloned recursively. If false, the\r\n\t * properties of the container will be cloned, but the new instance will not have any children.\r\n\t * @return {Container} A clone of the current Container instance.\r\n\t **/\r\n\tp.clone = function(recursive) {\r\n\t\tvar o = this._cloneProps(new Container());\r\n\t\tif (recursive) { this._cloneChildren(o); }\r\n\t\treturn o;\r\n\t};\r\n\r\n\t/**\r\n\t * Returns a string representation of this object.\r\n\t * @method toString\r\n\t * @return {String} a string representation of the instance.\r\n\t **/\r\n\tp.toString = function() {\r\n\t\treturn \"[Container (name=\"+  this.name +\")]\";\r\n\t};\r\n\r\n\r\n// private methods:\r\n\t/**\r\n\t * @method _tick\r\n\t * @param {Object} evtObj An event object that will be dispatched to all tick listeners. This object is reused between dispatchers to reduce construction & GC costs.\r\n\t * @protected\r\n\t **/\r\n\tp._tick = function(evtObj) {\r\n\t\tif (this.tickChildren) {\r\n\t\t\tfor (var i=this.children.length-1; i>=0; i--) {\r\n\t\t\t\tvar child = this.children[i];\r\n\t\t\t\tif (child.tickEnabled && child._tick) { child._tick(evtObj); }\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.DisplayObject__tick(evtObj);\r\n\t};\r\n\t\r\n\t/**\r\n\t * Recursively clones all children of this container, and adds them to the target container.\r\n\t * @method cloneChildren\r\n\t * @protected\r\n\t * @param {Container} o The target container.\r\n\t **/\r\n\tp._cloneChildren = function(o) {\r\n\t\tif (o.children.length) { o.removeAllChildren(); }\r\n\t\tvar arr = o.children;\r\n\t\tfor (var i=0, l=this.children.length; i<l; i++) {\r\n\t\t\tvar clone = this.children[i].clone(true);\r\n\t\t\tclone.parent = o;\r\n\t\t\tarr.push(clone);\r\n\t\t}\r\n\t};\r\n\t\r\n\t/**\r\n\t * Removes the child at the specified index from the display list, and sets its parent to null.\r\n\t * Used by `removeChildAt`, `addChild`, and `addChildAt`.\r\n\t * @method removeChildAt\r\n\t * @protected\r\n\t * @param {Number} index The index of the child to remove.\r\n\t * @param {Boolean} [silent] Prevents dispatch of `removed` event if true.\r\n\t * @return {Boolean} true if the child (or children) was removed, or false if any index was out of range.\r\n\t **/\r\n\tp._removeChildAt = function(index, silent) {\r\n\t\tif (index < 0 || index > this.children.length-1) { return false; }\r\n\t\tvar child = this.children[index];\r\n\t\tif (child) { child.parent = null; }\r\n\t\tthis.children.splice(index, 1);\r\n\t\tif (!silent) { child.dispatchEvent(\"removed\"); }\r\n\t\treturn true;\r\n\t};\r\n\r\n\t/**\r\n\t * @method _getObjectsUnderPoint\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t * @param {Array} arr\r\n\t * @param {Boolean} mouse If true, it will respect mouse interaction properties like mouseEnabled, mouseChildren, and active listeners.\r\n\t * @param {Boolean} activeListener If true, there is an active mouse event listener on a parent object.\r\n\t * @param {Number} currentDepth Indicates the current depth of the search.\r\n\t * @return {DisplayObject}\r\n\t * @protected\r\n\t **/\r\n\tp._getObjectsUnderPoint = function(x, y, arr, mouse, activeListener, currentDepth) {\r\n\t\tcurrentDepth = currentDepth || 0;\r\n\t\tif (!currentDepth && !this._testMask(this, x, y)) { return null; }\r\n\t\tvar mtx, ctx = createjs.DisplayObject._hitTestContext;\r\n\t\tactiveListener = activeListener || (mouse&&this._hasMouseEventListener());\r\n\r\n\t\t// draw children one at a time, and check if we get a hit:\r\n\t\tvar children = this.children, l = children.length;\r\n\t\tfor (var i=l-1; i>=0; i--) {\r\n\t\t\tvar child = children[i];\r\n\t\t\tvar hitArea = child.hitArea;\r\n\t\t\tif (!child.visible || (!hitArea && !child.isVisible()) || (mouse && !child.mouseEnabled)) { continue; }\r\n\t\t\tif (!hitArea && !this._testMask(child, x, y)) { continue; }\r\n\t\t\t\r\n\t\t\t// if a child container has a hitArea then we only need to check its hitAre2a, so we can treat it as a normal DO:\r\n\t\t\tif (!hitArea && child instanceof Container) {\r\n\t\t\t\tvar result = child._getObjectsUnderPoint(x, y, arr, mouse, activeListener, currentDepth+1);\r\n\t\t\t\tif (!arr && result) { return (mouse && !this.mouseChildren) ? this : result; }\r\n\t\t\t} else {\r\n\t\t\t\tif (mouse && !activeListener && !child._hasMouseEventListener()) { continue; }\r\n\t\t\t\t\r\n\t\t\t\t// TODO: can we pass displayProps forward, to avoid having to calculate this backwards every time? It's kind of a mixed bag. When we're only hunting for DOs with event listeners, it may not make sense.\r\n\t\t\t\tvar props = child.getConcatenatedDisplayProps(child._props);\r\n\t\t\t\tmtx = props.matrix;\r\n\t\t\t\t\r\n\t\t\t\tif (hitArea) {\r\n\t\t\t\t\tmtx.appendMatrix(hitArea.getMatrix(hitArea._props.matrix));\r\n\t\t\t\t\tprops.alpha = hitArea.alpha;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tctx.globalAlpha = props.alpha;\r\n\t\t\t\tctx.setTransform(mtx.a,  mtx.b, mtx.c, mtx.d, mtx.tx-x, mtx.ty-y);\r\n\t\t\t\t(hitArea||child).draw(ctx);\r\n\t\t\t\tif (!this._testHit(ctx)) { continue; }\r\n\t\t\t\tctx.setTransform(1, 0, 0, 1, 0, 0);\r\n\t\t\t\tctx.clearRect(0, 0, 2, 2);\r\n\t\t\t\tif (arr) { arr.push(child); }\r\n\t\t\t\telse { return (mouse && !this.mouseChildren) ? this : child; }\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t};\r\n\t\r\n\t/**\r\n\t * @method _testMask\r\n\t * @param {DisplayObject} target\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t * @return {Boolean} Indicates whether the x/y is within the masked region.\r\n\t * @protected\r\n\t **/\r\n\tp._testMask = function(target, x, y) {\r\n\t\tvar mask = target.mask;\r\n\t\tif (!mask || !mask.graphics || mask.graphics.isEmpty()) { return true; }\r\n\t\t\r\n\t\tvar mtx = this._props.matrix, parent = target.parent;\r\n\t\tmtx = parent ? parent.getConcatenatedMatrix(mtx) : mtx.identity();\r\n\t\tmtx = mask.getMatrix(mask._props.matrix).prependMatrix(mtx);\r\n\t\t\r\n\t\tvar ctx = createjs.DisplayObject._hitTestContext;\r\n\t\tctx.setTransform(mtx.a,  mtx.b, mtx.c, mtx.d, mtx.tx-x, mtx.ty-y);\r\n\t\t\r\n\t\t// draw the mask as a solid fill:\r\n\t\tmask.graphics.drawAsPath(ctx);\r\n\t\tctx.fillStyle = \"#000\";\r\n\t\tctx.fill();\r\n\t\t\r\n\t\tif (!this._testHit(ctx)) { return false; }\r\n\t\tctx.setTransform(1, 0, 0, 1, 0, 0);\r\n\t\tctx.clearRect(0, 0, 2, 2);\r\n\t\t\r\n\t\treturn true;\r\n\t};\r\n\t\r\n\t/**\r\n\t * @method _getBounds\r\n\t * @param {Matrix2D} matrix\r\n\t * @param {Boolean} ignoreTransform If true, does not apply this object's transform.\r\n\t * @return {Rectangle}\r\n\t * @protected\r\n\t **/\r\n\tp._getBounds = function(matrix, ignoreTransform) {\r\n\t\tvar bounds = this.DisplayObject_getBounds();\r\n\t\tif (bounds) { return this._transformBounds(bounds, matrix, ignoreTransform); }\r\n\t\t\r\n\t\tvar mtx = this._props.matrix;\r\n\t\tmtx = ignoreTransform ? mtx.identity() : this.getMatrix(mtx);\r\n\t\tif (matrix) { mtx.prependMatrix(matrix); }\r\n\t\t\r\n\t\tvar l = this.children.length, rect=null;\r\n\t\tfor (var i=0; i<l; i++) {\r\n\t\t\tvar child = this.children[i];\r\n\t\t\tif (!child.visible || !(bounds = child._getBounds(mtx))) { continue; }\r\n\t\t\tif (rect) { rect.extend(bounds.x, bounds.y, bounds.width, bounds.height); }\r\n\t\t\telse { rect = bounds.clone(); }\r\n\t\t}\r\n\t\treturn rect;\r\n\t};\r\n\r\n\r\n\tcreatejs.Container = createjs.promote(Container, \"DisplayObject\");\r\n}());\n\n//##############################################################################\n// Stage.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * A stage is the root level {{#crossLink \"Container\"}}{{/crossLink}} for a display list. Each time its {{#crossLink \"Stage/tick\"}}{{/crossLink}}\n\t * method is called, it will render its display list to its target canvas.\n\t *\n\t * <h4>Example</h4>\n\t * This example creates a stage, adds a child to it, then uses {{#crossLink \"Ticker\"}}{{/crossLink}} to update the child\n\t * and redraw the stage using {{#crossLink \"Stage/update\"}}{{/crossLink}}.\n\t *\n\t *      var stage = new createjs.Stage(\"canvasElementId\");\n\t *      var image = new createjs.Bitmap(\"imagePath.png\");\n\t *      stage.addChild(image);\n\t *      createjs.Ticker.addEventListener(\"tick\", handleTick);\n\t *      function handleTick(event) {\n\t *          image.x += 10;\n\t *          stage.update();\n\t *      }\n\t *\n\t * @class Stage\n\t * @extends Container\n\t * @constructor\n\t * @param {HTMLCanvasElement | String | Object} canvas A canvas object that the Stage will render to, or the string id\n\t * of a canvas object in the current document.\n\t **/\n\tfunction Stage(canvas) {\n\t\tthis.Container_constructor();\n\t\n\t\n\t// public properties:\n\t\t/**\n\t\t * Indicates whether the stage should automatically clear the canvas before each render. You can set this to <code>false</code>\n\t\t * to manually control clearing (for generative art, or when pointing multiple stages at the same canvas for\n\t\t * example).\n\t\t *\n\t\t * <h4>Example</h4>\n\t\t *\n\t\t *      var stage = new createjs.Stage(\"canvasId\");\n\t\t *      stage.autoClear = false;\n\t\t *\n\t\t * @property autoClear\n\t\t * @type Boolean\n\t\t * @default true\n\t\t **/\n\t\tthis.autoClear = true;\n\t\n\t\t/**\n\t\t * The canvas the stage will render to. Multiple stages can share a single canvas, but you must disable autoClear for all but the\n\t\t * first stage that will be ticked (or they will clear each other's render).\n\t\t *\n\t\t * When changing the canvas property you must disable the events on the old canvas, and enable events on the\n\t\t * new canvas or mouse events will not work as expected. For example:\n\t\t *\n\t\t *      myStage.enableDOMEvents(false);\n\t\t *      myStage.canvas = anotherCanvas;\n\t\t *      myStage.enableDOMEvents(true);\n\t\t *\n\t\t * @property canvas\n\t\t * @type HTMLCanvasElement | Object\n\t\t **/\n\t\tthis.canvas = (typeof canvas == \"string\") ? document.getElementById(canvas) : canvas;\n\t\n\t\t/**\n\t\t * The current mouse X position on the canvas. If the mouse leaves the canvas, this will indicate the most recent\n\t\t * position over the canvas, and mouseInBounds will be set to false.\n\t\t * @property mouseX\n\t\t * @type Number\n\t\t * @readonly\n\t\t **/\n\t\tthis.mouseX = 0;\n\t\n\t\t/**\n\t\t * The current mouse Y position on the canvas. If the mouse leaves the canvas, this will indicate the most recent\n\t\t * position over the canvas, and mouseInBounds will be set to false.\n\t\t * @property mouseY\n\t\t * @type Number\n\t\t * @readonly\n\t\t **/\n\t\tthis.mouseY = 0;\n\t\n\t\t/**\n\t\t * Specifies the area of the stage to affect when calling update. This can be use to selectively\n\t\t * re-draw specific regions of the canvas. If null, the whole canvas area is drawn.\n\t\t * @property drawRect\n\t\t * @type {Rectangle}\n\t\t */\n\t\tthis.drawRect = null;\n\t\n\t\t/**\n\t\t * Indicates whether display objects should be rendered on whole pixels. You can set the\n\t\t * {{#crossLink \"DisplayObject/snapToPixel\"}}{{/crossLink}} property of\n\t\t * display objects to false to enable/disable this behaviour on a per instance basis.\n\t\t * @property snapToPixelEnabled\n\t\t * @type Boolean\n\t\t * @default false\n\t\t **/\n\t\tthis.snapToPixelEnabled = false;\n\t\n\t\t/**\n\t\t * Indicates whether the mouse is currently within the bounds of the canvas.\n\t\t * @property mouseInBounds\n\t\t * @type Boolean\n\t\t * @default false\n\t\t **/\n\t\tthis.mouseInBounds = false;\n\t\n\t\t/**\n\t\t * If true, tick callbacks will be called on all display objects on the stage prior to rendering to the canvas.\n\t\t * @property tickOnUpdate\n\t\t * @type Boolean\n\t\t * @default true\n\t\t **/\n\t\tthis.tickOnUpdate = true;\n\t\n\t\t/**\n\t\t * If true, mouse move events will continue to be called when the mouse leaves the target canvas. See\n\t\t * {{#crossLink \"Stage/mouseInBounds:property\"}}{{/crossLink}}, and {{#crossLink \"MouseEvent\"}}{{/crossLink}}\n\t\t * x/y/rawX/rawY.\n\t\t * @property mouseMoveOutside\n\t\t * @type Boolean\n\t\t * @default false\n\t\t **/\n\t\tthis.mouseMoveOutside = false;\n\t\t\n\t\t\n\t\t/**\n\t\t * Prevents selection of other elements in the html page if the user clicks and drags, or double clicks on the canvas.\n\t\t * This works by calling `preventDefault()` on any mousedown events (or touch equivalent) originating on the canvas.\n\t\t * @property preventSelection\n\t\t * @type Boolean\n\t\t * @default true\n\t\t **/\n\t\tthis.preventSelection = true;\n\t\n\t\t/**\n\t\t * The hitArea property is not supported for Stage.\n\t\t * @property hitArea\n\t\t * @type {DisplayObject}\n\t\t * @default null\n\t\t */\n\t\t \n\t\t \n\t// private properties:\n\t\t/**\n\t\t * Holds objects with data for each active pointer id. Each object has the following properties:\n\t\t * x, y, event, target, overTarget, overX, overY, inBounds, posEvtObj (native event that last updated position)\n\t\t * @property _pointerData\n\t\t * @type {Object}\n\t\t * @private\n\t\t */\n\t\tthis._pointerData = {};\n\t\n\t\t/**\n\t\t * Number of active pointers.\n\t\t * @property _pointerCount\n\t\t * @type {Object}\n\t\t * @private\n\t\t */\n\t\tthis._pointerCount = 0;\n\t\n\t\t/**\n\t\t * The ID of the primary pointer.\n\t\t * @property _primaryPointerID\n\t\t * @type {Object}\n\t\t * @private\n\t\t */\n\t\tthis._primaryPointerID = null;\n\t\n\t\t/**\n\t\t * @property _mouseOverIntervalID\n\t\t * @protected\n\t\t * @type Number\n\t\t **/\n\t\tthis._mouseOverIntervalID = null;\n\t\t\n\t\t/**\n\t\t * @property _nextStage\n\t\t * @protected\n\t\t * @type Stage\n\t\t **/\n\t\tthis._nextStage = null;\n\t\t\n\t\t/**\n\t\t * @property _prevStage\n\t\t * @protected\n\t\t * @type Stage\n\t\t **/\n\t\tthis._prevStage = null;\n\t\t\n\t\t\n\t// initialize:\n\t\tthis.enableDOMEvents(true);\n\t}\n\tvar p = createjs.extend(Stage, createjs.Container);\n\n// events:\n\t/**\n\t * Dispatched when the user moves the mouse over the canvas.\n\t * See the {{#crossLink \"MouseEvent\"}}{{/crossLink}} class for a listing of event properties.\n\t * @event stagemousemove\n\t * @since 0.6.0\n\t */\n\n\t/**\n\t * Dispatched when the user presses their left mouse button on the canvas. See the {{#crossLink \"MouseEvent\"}}{{/crossLink}}\n\t * class for a listing of event properties.\n\t * @event stagemousedown\n\t * @since 0.6.0\n\t */\n\n\t/**\n\t * Dispatched when the user the user presses somewhere on the stage, then releases the mouse button anywhere that the page can detect it (this varies slightly between browsers).\n\t * You can use {{#crossLink \"Stage/mouseInBounds:property\"}}{{/crossLink}} to check whether the mouse is currently within the stage bounds.\n\t * See the {{#crossLink \"MouseEvent\"}}{{/crossLink}} class for a listing of event properties.\n\t * @event stagemouseup\n\t * @since 0.6.0\n\t */\n\n\t/**\n\t * Dispatched when the mouse moves from within the canvas area (mouseInBounds == true) to outside it (mouseInBounds == false).\n\t * This is currently only dispatched for mouse input (not touch). See the {{#crossLink \"MouseEvent\"}}{{/crossLink}}\n\t * class for a listing of event properties.\n\t * @event mouseleave\n\t * @since 0.7.0\n\t */\n\n\t/**\n\t * Dispatched when the mouse moves into the canvas area (mouseInBounds == false) from outside it (mouseInBounds == true).\n\t * This is currently only dispatched for mouse input (not touch). See the {{#crossLink \"MouseEvent\"}}{{/crossLink}}\n\t * class for a listing of event properties.\n\t * @event mouseenter\n\t * @since 0.7.0\n\t */\n\t \n\t/**\n\t * Dispatched each update immediately before the tick event is propagated through the display list.\n\t * You can call preventDefault on the event object to cancel propagating the tick event.\n\t * @event tickstart\n\t * @since 0.7.0\n\t */\n\t \n\t/**\n\t * Dispatched each update immediately after the tick event is propagated through the display list. Does not fire if\n\t * tickOnUpdate is false. Precedes the \"drawstart\" event.\n\t * @event tickend\n\t * @since 0.7.0\n\t */\n\t \n\t/**\n\t * Dispatched each update immediately before the canvas is cleared and the display list is drawn to it.\n\t * You can call preventDefault on the event object to cancel the draw.\n\t * @event drawstart\n\t * @since 0.7.0\n\t */\n\t \n\t/**\n\t * Dispatched each update immediately after the display list is drawn to the canvas and the canvas context is restored.\n\t * @event drawend\n\t * @since 0.7.0\n\t */\n\n\t \n// getter / setters:\n\t/**\n\t * Specifies a target stage that will have mouse / touch interactions relayed to it after this stage handles them.\n\t * This can be useful in cases where you have multiple layered canvases and want user interactions\n\t * events to pass through. For example, this would relay mouse events from topStage to bottomStage:\n\t *\n\t *      topStage.nextStage = bottomStage;\n\t *\n\t * To disable relaying, set nextStage to null.\n\t * \n\t * MouseOver, MouseOut, RollOver, and RollOut interactions are also passed through using the mouse over settings\n\t * of the top-most stage, but are only processed if the target stage has mouse over interactions enabled.\n\t * Considerations when using roll over in relay targets:<OL>\n\t * <LI> The top-most (first) stage must have mouse over interactions enabled (via enableMouseOver)</LI>\n\t * <LI> All stages that wish to participate in mouse over interaction must enable them via enableMouseOver</LI>\n\t * <LI> All relay targets will share the frequency value of the top-most stage</LI>\n\t * </OL>\n\t * To illustrate, in this example the targetStage would process mouse over interactions at 10hz (despite passing\n\t * 30 as it's desired frequency):\n\t * \ttopStage.nextStage = targetStage;\n\t * \ttopStage.enableMouseOver(10);\n\t * \ttargetStage.enableMouseOver(30);\n\t * \n\t * If the target stage's canvas is completely covered by this stage's canvas, you may also want to disable its\n\t * DOM events using:\n\t * \n\t *\ttargetStage.enableDOMEvents(false);\n\t * \n\t * @property nextStage\n\t * @type {Stage}\n\t **/\n\tp._get_nextStage = function() {\n\t\treturn this._nextStage;\n\t};\n\tp._set_nextStage = function(value) {\n\t\tif (this._nextStage) { this._nextStage._prevStage = null; }\n\t\tif (value) { value._prevStage = this; }\n\t\tthis._nextStage = value;\n\t};\n\t\n\ttry {\n\t\tObject.defineProperties(p, {\n\t\t\tnextStage: { get: p._get_nextStage, set: p._set_nextStage }\n\t\t});\n\t} catch (e) {} // TODO: use Log\n\n\n// public methods:\n\t/**\n\t * Each time the update method is called, the stage will call {{#crossLink \"Stage/tick\"}}{{/crossLink}}\n\t * unless {{#crossLink \"Stage/tickOnUpdate:property\"}}{{/crossLink}} is set to false,\n\t * and then render the display list to the canvas.\n\t *\n\t * @method update\n\t * @param {Object} [props] Props object to pass to `tick()`. Should usually be a {{#crossLink \"Ticker\"}}{{/crossLink}} event object, or similar object with a delta property.\n\t **/\n\tp.update = function(props) {\n\t\tif (!this.canvas) { return; }\n\t\tif (this.tickOnUpdate) { this.tick(props); }\n\t\tif (this.dispatchEvent(\"drawstart\", false, true) === false) { return; }\n\t\tcreatejs.DisplayObject._snapToPixelEnabled = this.snapToPixelEnabled;\n\t\tvar r = this.drawRect, ctx = this.canvas.getContext(\"2d\");\n\t\tctx.setTransform(1, 0, 0, 1, 0, 0);\n\t\tif (this.autoClear) {\n\t\t\tif (r) { ctx.clearRect(r.x, r.y, r.width, r.height); }\n\t\t\telse { ctx.clearRect(0, 0, this.canvas.width+1, this.canvas.height+1); }\n\t\t}\n\t\tctx.save();\n\t\tif (this.drawRect) {\n\t\t\tctx.beginPath();\n\t\t\tctx.rect(r.x, r.y, r.width, r.height);\n\t\t\tctx.clip();\n\t\t}\n\t\tthis.updateContext(ctx);\n\t\tthis.draw(ctx, false);\n\t\tctx.restore();\n\t\tthis.dispatchEvent(\"drawend\");\n\t};\n\t\n\t/**\n\t * Propagates a tick event through the display list. This is automatically called by {{#crossLink \"Stage/update\"}}{{/crossLink}}\n\t * unless {{#crossLink \"Stage/tickOnUpdate:property\"}}{{/crossLink}} is set to false.\n\t *\n\t * If a props object is passed to `tick()`, then all of its properties will be copied to the event object that is\n\t * propagated to listeners.\n\t *\n\t * Some time-based features in EaselJS (for example {{#crossLink \"Sprite/framerate\"}}{{/crossLink}} require that\n\t * a {{#crossLink \"Ticker/tick:event\"}}{{/crossLink}} event object (or equivalent object with a delta property) be\n\t * passed as the `props` parameter to `tick()`. For example:\n\t *\n\t * \tTicker.on(\"tick\", handleTick);\n\t * \tfunction handleTick(evtObj) {\n\t * \t\t// clone the event object from Ticker, and add some custom data to it:\n\t * \t\tvar evt = evtObj.clone().set({greeting:\"hello\", name:\"world\"});\n\t * \t\t\n\t * \t\t// pass it to stage.update():\n\t * \t\tmyStage.update(evt); // subsequently calls tick() with the same param\n\t * \t}\n\t * \t\n\t * \t// ...\n\t * \tmyDisplayObject.on(\"tick\", handleDisplayObjectTick);\n\t * \tfunction handleDisplayObjectTick(evt) {\n\t * \t\tconsole.log(evt.delta); // the delta property from the Ticker tick event object\n\t * \t\tconsole.log(evt.greeting, evt.name); // custom data: \"hello world\"\n\t * \t}\n\t * \n\t * @method tick\n\t * @param {Object} [props] An object with properties that should be copied to the event object. Should usually be a Ticker event object, or similar object with a delta property.\n\t **/\n\tp.tick = function(props) {\n\t\tif (!this.tickEnabled || this.dispatchEvent(\"tickstart\", false, true) === false) { return; }\n\t\tvar evtObj = new createjs.Event(\"tick\");\n\t\tif (props) {\n\t\t\tfor (var n in props) {\n\t\t\t\tif (props.hasOwnProperty(n)) { evtObj[n] = props[n]; }\n\t\t\t}\n\t\t}\n\t\tthis._tick(evtObj);\n\t\tthis.dispatchEvent(\"tickend\");\n\t};\n\n\t/**\n\t * Default event handler that calls the Stage {{#crossLink \"Stage/update\"}}{{/crossLink}} method when a {{#crossLink \"DisplayObject/tick:event\"}}{{/crossLink}}\n\t * event is received. This allows you to register a Stage instance as a event listener on {{#crossLink \"Ticker\"}}{{/crossLink}}\n\t * directly, using:\n\t *\n\t *      Ticker.addEventListener(\"tick\", myStage);\n\t *\n\t * Note that if you subscribe to ticks using this pattern, then the tick event object will be passed through to\n\t * display object tick handlers, instead of <code>delta</code> and <code>paused</code> parameters.\n\t * @property handleEvent\n\t * @type Function\n\t **/\n\tp.handleEvent = function(evt) {\n\t\tif (evt.type == \"tick\") { this.update(evt); }\n\t};\n\n\t/**\n\t * Clears the target canvas. Useful if {{#crossLink \"Stage/autoClear:property\"}}{{/crossLink}} is set to `false`.\n\t * @method clear\n\t **/\n\tp.clear = function() {\n\t\tif (!this.canvas) { return; }\n\t\tvar ctx = this.canvas.getContext(\"2d\");\n\t\tctx.setTransform(1, 0, 0, 1, 0, 0);\n\t\tctx.clearRect(0, 0, this.canvas.width+1, this.canvas.height+1);\n\t};\n\n\t/**\n\t * Returns a data url that contains a Base64-encoded image of the contents of the stage. The returned data url can\n\t * be specified as the src value of an image element.\n\t * @method toDataURL\n\t * @param {String} [backgroundColor] The background color to be used for the generated image. Any valid CSS color\n\t * value is allowed. The default value is a transparent background.\n\t * @param {String} [mimeType=\"image/png\"] The MIME type of the image format to be create. The default is \"image/png\". If an unknown MIME type\n\t * is passed in, or if the browser does not support the specified MIME type, the default value will be used.\n\t * @return {String} a Base64 encoded image.\n\t **/\n\tp.toDataURL = function(backgroundColor, mimeType) {\n\t\tvar data, ctx = this.canvas.getContext('2d'), w = this.canvas.width, h = this.canvas.height;\n\n\t\tif (backgroundColor) {\n\t\t\tdata = ctx.getImageData(0, 0, w, h);\n\t\t\tvar compositeOperation = ctx.globalCompositeOperation;\n\t\t\tctx.globalCompositeOperation = \"destination-over\";\n\t\t\t\n\t\t\tctx.fillStyle = backgroundColor;\n\t\t\tctx.fillRect(0, 0, w, h);\n\t\t}\n\n\t\tvar dataURL = this.canvas.toDataURL(mimeType||\"image/png\");\n\n\t\tif(backgroundColor) {\n\t\t\tctx.putImageData(data, 0, 0);\n\t\t\tctx.globalCompositeOperation = compositeOperation;\n\t\t}\n\n\t\treturn dataURL;\n\t};\n\n\t/**\n\t * Enables or disables (by passing a frequency of 0) mouse over ({{#crossLink \"DisplayObject/mouseover:event\"}}{{/crossLink}}\n\t * and {{#crossLink \"DisplayObject/mouseout:event\"}}{{/crossLink}}) and roll over events ({{#crossLink \"DisplayObject/rollover:event\"}}{{/crossLink}}\n\t * and {{#crossLink \"DisplayObject/rollout:event\"}}{{/crossLink}}) for this stage's display list. These events can\n\t * be expensive to generate, so they are disabled by default. The frequency of the events can be controlled\n\t * independently of mouse move events via the optional `frequency` parameter.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      var stage = new createjs.Stage(\"canvasId\");\n\t *      stage.enableMouseOver(10); // 10 updates per second\n\t *\n\t * @method enableMouseOver\n\t * @param {Number} [frequency=20] Optional param specifying the maximum number of times per second to broadcast\n\t * mouse over/out events. Set to 0 to disable mouse over events completely. Maximum is 50. A lower frequency is less\n\t * responsive, but uses less CPU.\n\t **/\n\tp.enableMouseOver = function(frequency) {\n\t\tif (this._mouseOverIntervalID) {\n\t\t\tclearInterval(this._mouseOverIntervalID);\n\t\t\tthis._mouseOverIntervalID = null;\n\t\t\tif (frequency == 0) {\n\t\t\t\tthis._testMouseOver(true);\n\t\t\t}\n\t\t}\n\t\tif (frequency == null) { frequency = 20; }\n\t\telse if (frequency <= 0) { return; }\n\t\tvar o = this;\n\t\tthis._mouseOverIntervalID = setInterval(function(){ o._testMouseOver(); }, 1000/Math.min(50,frequency));\n\t};\n\n\t/**\n\t * Enables or disables the event listeners that stage adds to DOM elements (window, document and canvas). It is good\n\t * practice to disable events when disposing of a Stage instance, otherwise the stage will continue to receive\n\t * events from the page.\n\t *\n\t * When changing the canvas property you must disable the events on the old canvas, and enable events on the\n\t * new canvas or mouse events will not work as expected. For example:\n\t *\n\t *      myStage.enableDOMEvents(false);\n\t *      myStage.canvas = anotherCanvas;\n\t *      myStage.enableDOMEvents(true);\n\t *\n\t * @method enableDOMEvents\n\t * @param {Boolean} [enable=true] Indicates whether to enable or disable the events. Default is true.\n\t **/\n\tp.enableDOMEvents = function(enable) {\n\t\tif (enable == null) { enable = true; }\n\t\tvar n, o, ls = this._eventListeners;\n\t\tif (!enable && ls) {\n\t\t\tfor (n in ls) {\n\t\t\t\to = ls[n];\n\t\t\t\to.t.removeEventListener(n, o.f, false);\n\t\t\t}\n\t\t\tthis._eventListeners = null;\n\t\t} else if (enable && !ls && this.canvas) {\n\t\t\tvar t = window.addEventListener ? window : document;\n\t\t\tvar _this = this;\n\t\t\tls = this._eventListeners = {};\n\t\t\tls[\"mouseup\"] = {t:t, f:function(e) { _this._handleMouseUp(e)} };\n\t\t\tls[\"mousemove\"] = {t:t, f:function(e) { _this._handleMouseMove(e)} };\n\t\t\tls[\"dblclick\"] = {t:this.canvas, f:function(e) { _this._handleDoubleClick(e)} };\n\t\t\tls[\"mousedown\"] = {t:this.canvas, f:function(e) { _this._handleMouseDown(e)} };\n\n\t\t\tfor (n in ls) {\n\t\t\t\to = ls[n];\n\t\t\t\to.t.addEventListener(n, o.f, false);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Stage instances cannot be cloned.\n\t * @method clone\n\t **/\n\tp.clone = function() {\n\t\tthrow(\"Stage cannot be cloned.\");\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[Stage (name=\"+  this.name +\")]\";\n\t};\n\n\n// private methods:\n\t/**\n\t * @method _getElementRect\n\t * @protected\n\t * @param {HTMLElement} e\n\t **/\n\tp._getElementRect = function(e) {\n\t\tvar bounds;\n\t\ttry { bounds = e.getBoundingClientRect(); } // this can fail on disconnected DOM elements in IE9\n\t\tcatch (err) { bounds = {top: e.offsetTop, left: e.offsetLeft, width:e.offsetWidth, height:e.offsetHeight}; }\n\n\t\tvar offX = (window.pageXOffset || document.scrollLeft || 0) - (document.clientLeft || document.body.clientLeft || 0);\n\t\tvar offY = (window.pageYOffset || document.scrollTop || 0) - (document.clientTop  || document.body.clientTop  || 0);\n\n\t\tvar styles = window.getComputedStyle ? getComputedStyle(e,null) : e.currentStyle; // IE <9 compatibility.\n\t\tvar padL = parseInt(styles.paddingLeft)+parseInt(styles.borderLeftWidth);\n\t\tvar padT = parseInt(styles.paddingTop)+parseInt(styles.borderTopWidth);\n\t\tvar padR = parseInt(styles.paddingRight)+parseInt(styles.borderRightWidth);\n\t\tvar padB = parseInt(styles.paddingBottom)+parseInt(styles.borderBottomWidth);\n\n\t\t// note: in some browsers bounds properties are read only.\n\t\treturn {\n\t\t\tleft: bounds.left+offX+padL,\n\t\t\tright: bounds.right+offX-padR,\n\t\t\ttop: bounds.top+offY+padT,\n\t\t\tbottom: bounds.bottom+offY-padB\n\t\t}\n\t};\n\n\t/**\n\t * @method _getPointerData\n\t * @protected\n\t * @param {Number} id\n\t **/\n\tp._getPointerData = function(id) {\n\t\tvar data = this._pointerData[id];\n\t\tif (!data) { data = this._pointerData[id] = {x:0,y:0}; }\n\t\treturn data;\n\t};\n\n\t/**\n\t * @method _handleMouseMove\n\t * @protected\n\t * @param {MouseEvent} e\n\t **/\n\tp._handleMouseMove = function(e) {\n\t\tif(!e){ e = window.event; }\n\t\tthis._handlePointerMove(-1, e, e.pageX, e.pageY);\n\t};\n\n\t/**\n\t * @method _handlePointerMove\n\t * @protected\n\t * @param {Number} id\n\t * @param {Event} e\n\t * @param {Number} pageX\n\t * @param {Number} pageY\n\t * @param {Stage} owner Indicates that the event has already been captured & handled by the indicated stage.\n\t **/\n\tp._handlePointerMove = function(id, e, pageX, pageY, owner) {\n\t\tif (this._prevStage && owner === undefined) { return; } // redundant listener.\n\t\tif (!this.canvas) { return; }\n\t\tvar nextStage=this._nextStage, o=this._getPointerData(id);\n\n\t\tvar inBounds = o.inBounds;\n\t\tthis._updatePointerPosition(id, e, pageX, pageY);\n\t\tif (inBounds || o.inBounds || this.mouseMoveOutside) {\n\t\t\tif (id === -1 && o.inBounds == !inBounds) {\n\t\t\t\tthis._dispatchMouseEvent(this, (inBounds ? \"mouseleave\" : \"mouseenter\"), false, id, o, e);\n\t\t\t}\n\t\t\t\n\t\t\tthis._dispatchMouseEvent(this, \"stagemousemove\", false, id, o, e);\n\t\t\tthis._dispatchMouseEvent(o.target, \"pressmove\", true, id, o, e);\n\t\t}\n\t\t\n\t\tnextStage&&nextStage._handlePointerMove(id, e, pageX, pageY, null);\n\t};\n\n\t/**\n\t * @method _updatePointerPosition\n\t * @protected\n\t * @param {Number} id\n\t * @param {Event} e\n\t * @param {Number} pageX\n\t * @param {Number} pageY\n\t **/\n\tp._updatePointerPosition = function(id, e, pageX, pageY) {\n\t\tvar rect = this._getElementRect(this.canvas);\n\t\tpageX -= rect.left;\n\t\tpageY -= rect.top;\n\n\t\tvar w = this.canvas.width;\n\t\tvar h = this.canvas.height;\n\t\tpageX /= (rect.right-rect.left)/w;\n\t\tpageY /= (rect.bottom-rect.top)/h;\n\t\tvar o = this._getPointerData(id);\n\t\tif (o.inBounds = (pageX >= 0 && pageY >= 0 && pageX <= w-1 && pageY <= h-1)) {\n\t\t\to.x = pageX;\n\t\t\to.y = pageY;\n\t\t} else if (this.mouseMoveOutside) {\n\t\t\to.x = pageX < 0 ? 0 : (pageX > w-1 ? w-1 : pageX);\n\t\t\to.y = pageY < 0 ? 0 : (pageY > h-1 ? h-1 : pageY);\n\t\t}\n\n\t\to.posEvtObj = e;\n\t\to.rawX = pageX;\n\t\to.rawY = pageY;\n\n\t\tif (id === this._primaryPointerID || id === -1) {\n\t\t\tthis.mouseX = o.x;\n\t\t\tthis.mouseY = o.y;\n\t\t\tthis.mouseInBounds = o.inBounds;\n\t\t}\n\t};\n\n\t/**\n\t * @method _handleMouseUp\n\t * @protected\n\t * @param {MouseEvent} e\n\t **/\n\tp._handleMouseUp = function(e) {\n\t\tthis._handlePointerUp(-1, e, false);\n\t};\n\n\t/**\n\t * @method _handlePointerUp\n\t * @protected\n\t * @param {Number} id\n\t * @param {Event} e\n\t * @param {Boolean} clear\n\t * @param {Stage} owner Indicates that the event has already been captured & handled by the indicated stage.\n\t **/\n\tp._handlePointerUp = function(id, e, clear, owner) {\n\t\tvar nextStage = this._nextStage, o = this._getPointerData(id);\n\t\tif (this._prevStage && owner === undefined) { return; } // redundant listener.\n\t\t\n\t\tvar target=null, oTarget = o.target;\n\t\tif (!owner && (oTarget || nextStage)) { target = this._getObjectsUnderPoint(o.x, o.y, null, true); }\n\t\t\n\t\tif (o.down) { this._dispatchMouseEvent(this, \"stagemouseup\", false, id, o, e, target); o.down = false; }\n\t\t\n\t\tif (target == oTarget) { this._dispatchMouseEvent(oTarget, \"click\", true, id, o, e); }\n\t\tthis._dispatchMouseEvent(oTarget, \"pressup\", true, id, o, e);\n\t\t\n\t\tif (clear) {\n\t\t\tif (id==this._primaryPointerID) { this._primaryPointerID = null; }\n\t\t\tdelete(this._pointerData[id]);\n\t\t} else { o.target = null; }\n\t\t\n\t\tnextStage&&nextStage._handlePointerUp(id, e, clear, owner || target && this);\n\t};\n\n\t/**\n\t * @method _handleMouseDown\n\t * @protected\n\t * @param {MouseEvent} e\n\t **/\n\tp._handleMouseDown = function(e) {\n\t\tthis._handlePointerDown(-1, e, e.pageX, e.pageY);\n\t};\n\n\t/**\n\t * @method _handlePointerDown\n\t * @protected\n\t * @param {Number} id\n\t * @param {Event} e\n\t * @param {Number} pageX\n\t * @param {Number} pageY\n\t * @param {Stage} owner Indicates that the event has already been captured & handled by the indicated stage.\n\t **/\n\tp._handlePointerDown = function(id, e, pageX, pageY, owner) {\n\t\tif (this.preventSelection) { e.preventDefault(); }\n\t\tif (this._primaryPointerID == null || id === -1) { this._primaryPointerID = id; } // mouse always takes over.\n\t\t\n\t\tif (pageY != null) { this._updatePointerPosition(id, e, pageX, pageY); }\n\t\tvar target = null, nextStage = this._nextStage, o = this._getPointerData(id);\n\t\tif (!owner) { target = o.target = this._getObjectsUnderPoint(o.x, o.y, null, true); }\n\n\t\tif (o.inBounds) { this._dispatchMouseEvent(this, \"stagemousedown\", false, id, o, e, target); o.down = true; }\n\t\tthis._dispatchMouseEvent(target, \"mousedown\", true, id, o, e);\n\t\t\n\t\tnextStage&&nextStage._handlePointerDown(id, e, pageX, pageY, owner || target && this);\n\t};\n\n\t/**\n\t * @method _testMouseOver\n\t * @param {Boolean} clear If true, clears the mouseover / rollover (ie. no target)\n\t * @param {Stage} owner Indicates that the event has already been captured & handled by the indicated stage.\n\t * @param {Stage} eventTarget The stage that the cursor is actively over.\n\t * @protected\n\t **/\n\tp._testMouseOver = function(clear, owner, eventTarget) {\n\t\tif (this._prevStage && owner === undefined) { return; } // redundant listener.\n\t\t\n\t\tvar nextStage = this._nextStage;\n\t\tif (!this._mouseOverIntervalID) {\n\t\t\t// not enabled for mouseover, but should still relay the event.\n\t\t\tnextStage&&nextStage._testMouseOver(clear, owner, eventTarget);\n\t\t\treturn;\n\t\t}\n\t\tvar o = this._getPointerData(-1);\n\t\t// only update if the mouse position has changed. This provides a lot of optimization, but has some trade-offs.\n\t\tif (!o || (!clear && this.mouseX == this._mouseOverX && this.mouseY == this._mouseOverY && this.mouseInBounds)) { return; }\n\t\t\n\t\tvar e = o.posEvtObj;\n\t\tvar isEventTarget = eventTarget || e&&(e.target == this.canvas);\n\t\tvar target=null, common = -1, cursor=\"\", t, i, l;\n\t\t\n\t\tif (!owner && (clear || this.mouseInBounds && isEventTarget)) {\n\t\t\ttarget = this._getObjectsUnderPoint(this.mouseX, this.mouseY, null, true);\n\t\t\tthis._mouseOverX = this.mouseX;\n\t\t\tthis._mouseOverY = this.mouseY;\n\t\t}\n\n\t\tvar oldList = this._mouseOverTarget||[];\n\t\tvar oldTarget = oldList[oldList.length-1];\n\t\tvar list = this._mouseOverTarget = [];\n\n\t\t// generate ancestor list and check for cursor:\n\t\tt = target;\n\t\twhile (t) {\n\t\t\tlist.unshift(t);\n\t\t\tif (!cursor) { cursor = t.cursor; }\n\t\t\tt = t.parent;\n\t\t}\n\t\tthis.canvas.style.cursor = cursor;\n\t\tif (!owner && eventTarget) { eventTarget.canvas.style.cursor = cursor; }\n\n\t\t// find common ancestor:\n\t\tfor (i=0,l=list.length; i<l; i++) {\n\t\t\tif (list[i] != oldList[i]) { break; }\n\t\t\tcommon = i;\n\t\t}\n\n\t\tif (oldTarget != target) {\n\t\t\tthis._dispatchMouseEvent(oldTarget, \"mouseout\", true, -1, o, e, target);\n\t\t}\n\n\t\tfor (i=oldList.length-1; i>common; i--) {\n\t\t\tthis._dispatchMouseEvent(oldList[i], \"rollout\", false, -1, o, e, target);\n\t\t}\n\n\t\tfor (i=list.length-1; i>common; i--) {\n\t\t\tthis._dispatchMouseEvent(list[i], \"rollover\", false, -1, o, e, oldTarget);\n\t\t}\n\n\t\tif (oldTarget != target) {\n\t\t\tthis._dispatchMouseEvent(target, \"mouseover\", true, -1, o, e, oldTarget);\n\t\t}\n\t\t\n\t\tnextStage&&nextStage._testMouseOver(clear, owner || target && this, eventTarget || isEventTarget && this);\n\t};\n\n\t/**\n\t * @method _handleDoubleClick\n\t * @protected\n\t * @param {MouseEvent} e\n\t * @param {Stage} owner Indicates that the event has already been captured & handled by the indicated stage.\n\t **/\n\tp._handleDoubleClick = function(e, owner) {\n\t\tvar target=null, nextStage=this._nextStage, o=this._getPointerData(-1);\n\t\tif (!owner) {\n\t\t\ttarget = this._getObjectsUnderPoint(o.x, o.y, null, true);\n\t\t\tthis._dispatchMouseEvent(target, \"dblclick\", true, -1, o, e);\n\t\t}\n\t\tnextStage&&nextStage._handleDoubleClick(e, owner || target && this);\n\t};\n\n\t/**\n\t * @method _dispatchMouseEvent\n\t * @protected\n\t * @param {DisplayObject} target\n\t * @param {String} type\n\t * @param {Boolean} bubbles\n\t * @param {Number} pointerId\n\t * @param {Object} o\n\t * @param {MouseEvent} [nativeEvent]\n\t * @param {DisplayObject} [relatedTarget]\n\t **/\n\tp._dispatchMouseEvent = function(target, type, bubbles, pointerId, o, nativeEvent, relatedTarget) {\n\t\t// TODO: might be worth either reusing MouseEvent instances, or adding a willTrigger method to avoid GC.\n\t\tif (!target || (!bubbles && !target.hasEventListener(type))) { return; }\n\t\t/*\n\t\t// TODO: account for stage transformations?\n\t\tthis._mtx = this.getConcatenatedMatrix(this._mtx).invert();\n\t\tvar pt = this._mtx.transformPoint(o.x, o.y);\n\t\tvar evt = new createjs.MouseEvent(type, bubbles, false, pt.x, pt.y, nativeEvent, pointerId, pointerId==this._primaryPointerID || pointerId==-1, o.rawX, o.rawY);\n\t\t*/\n\t\tvar evt = new createjs.MouseEvent(type, bubbles, false, o.x, o.y, nativeEvent, pointerId, pointerId === this._primaryPointerID || pointerId === -1, o.rawX, o.rawY, relatedTarget);\n\t\ttarget.dispatchEvent(evt);\n\t};\n\n\n\tcreatejs.Stage = createjs.promote(Stage, \"Container\");\n}());\n\n//##############################################################################\n// StageGL.js\n//##############################################################################\n\n/*\n * README IF EDITING:\n * Terminology for developers:\n *\n * Vertex: a point that help defines a shape, 3 per triangle. Usually has an x,y,z but can have more/less info.\n * Vertex Property: a piece of information attached to the vertex like a vector3 containing x,y,z\n * Index/Indices: used in groups of 3 to define a triangle, points to vertices by their index in an array (some render\n * \t\tmodes do not use these)\n * Card: a group of 2 triangles used to display a rectangular image\n * U/V: common names for the [0-1] texture co-ordinates on an image\n * Batch: a single call to the renderer, best done as little as possible so multiple cards are put into a single batch\n * Buffer: WebGL array data\n * Program/Shader: For every vertex we run the Vertex shader. The results are used per pixel by the Fragment shader. When\n * \t\tcombined and paired these are a shader \"program\"\n * Texture: WebGL representation of image data and associated extra information\n * Slot: A space on the GPU into which textures can be loaded for use in a batch, using \"ActiveTexture\" switches texture slot.\n */\n\n(function () {\n\t\"use strict\";\n\n\t/**\n\t * A StageGL instance is the root level {{#crossLink \"Container\"}}{{/crossLink}} for an WebGL-optimized display list,\n\t * which is used in place of the usual {{#crossLink \"Stage\"}}{{/crossLink}}. This class should behave identically to\n\t * a {{#crossLink \"Stage\"}}{{/crossLink}} except for WebGL-specific functionality.\n\t *\n\t * Each time the {{#crossLink \"Stage/tick\"}}{{/crossLink}} method is called, the display list is rendered to the\n\t * target &lt;canvas/&gt; instance, ignoring non-WebGL-compatible display objects. On devices and browsers that don't\n\t * support WebGL, content will automatically be rendered to canvas 2D context instead.\n\t *\n\t * <h4>Limitations</h4>\n\t * - {{#crossLink \"Shape\"}}{{/crossLink}}, {{#crossLink \"Shadow\"}}{{/crossLink}}, and {{#crossLink \"Text\"}}{{/crossLink}}\n\t * \tare not rendered when added to the display list.\n\t * - To display something StageGL cannot render, {{#crossLink \"displayObject/cache\"}}{{/crossLink}} the object.\n\t *\tCaches can be rendered regardless of source.\n\t * - Images are wrapped as a webGL \"Texture\". Each graphics card has a limit to its concurrent Textures, too many \n\t * Textures will noticeably slow performance.\n\t * - Each cache counts as an individual Texture. As such {{#crossLink \"SpriteSheet\"}}{{/crossLink}} and \n\t * {{#crossLink \"SpriteSheetBuilder\"}}{{/crossLink}} are recommended practices to help keep texture counts low.\n\t * - To use any image node (DOM Image/Canvas Element) between multiple StageGL instances it must be a \n\t * {{#crossLink \"Bitmap/clone\"}}{{/crossLink}}, otherwise the GPU texture loading and tracking will get confused.\n\t * - to avoid an up/down scaled render you must call {{#crossLink \"StageGL/updateViewport\"}}{{/crossLink}} if you\n\t * resize your canvas after making a StageGL instance, this will properly size the WebGL context stored in memory.\n\t * - Best performance in demanding scenarios will come from manual management of texture memory, but it is handled\n\t * automatically by default. See {{#crossLink \"StageGL/releaseTexture\"}}{{/crossLink}} for details.\n\t *\n\t * <h4>Example</h4>\n\t * This example creates a StageGL instance, adds a child to it, then uses the EaselJS {{#crossLink \"Ticker\"}}{{/crossLink}}\n\t * to update the child and redraw the stage.\n\t *\n\t *      var stage = new createjs.StageGL(\"canvasElementId\");\n\t *\n\t *      var image = new createjs.Bitmap(\"imagePath.png\");\n\t *      stage.addChild(image);\n\t *\n\t *      createjs.Ticker.on(\"tick\", handleTick);\n\t *\n\t *      function handleTick(event) {\n\t *          image.x += 10;\n\t *          stage.update();\n\t *      }\n\t *\n\t * <h4>Notes</h4>\n\t * - StageGL is not currently included in the minified version of EaselJS.\n\t * - {{#crossLink \"SpriteContainer\"}}{{/crossLink}} (the previous approach to WebGL with EaselJS) has been deprecated.\n\t * - Earlier versions of WebGL support in EaselJS (SpriteStage and SpriteContainer) had hard limitations on images\n\t * \tper container, which have been solved.\n\t *\n\t * @class StageGL\n\t * @extends Stage\n\t * @constructor\n\t * @param {HTMLCanvasElement | String | Object} canvas A canvas object that StageGL will render to, or the string id\n\t *  of a canvas object in the current DOM.\n\t * @param {Object} options All the option parameters in a reference object, some are not supported by some browsers.\n\t * @param {Boolean} [options.preserveBuffer=false] If `true`, the canvas is NOT auto-cleared by WebGL (the spec\n\t *  discourages setting this to `true`). This is useful if you want persistent draw effects.\n\t * @param {Boolean} [options.antialias=false] Specifies whether or not the browser's WebGL implementation should try\n\t *  to perform anti-aliasing. This will also enable linear pixel sampling on power-of-two textures (smoother images).\n\t * @param {Boolean} [options.transparent=false] If `true`, the canvas is transparent. This is <strong>very</strong>\n\t * expensive, and should be used with caution.\n\t * @param {Boolean} [options.premultiply=false] Alters color handling. If `true`, this assumes the shader must\n\t * account for pre-multiplied alpha. This can help avoid visual halo effects with some assets, but may also cause\n\t * problems with other assets.\n\t * @param {Integer} [options.autoPurge=1200] How often the system should automatically dump unused textures with\n\t * `purgeTextures(autoPurge)` every `autoPurge/2` draws. See {{#crossLink \"StageGL/purgeTextures\"}}{{/crossLink}} for more\n\t * information.\n\t */\n\tfunction StageGL(canvas, options) {\n\t\tthis.Stage_constructor(canvas);\n\n\t\tif (options !== undefined) {\n\t\t\tif (typeof options !== \"object\"){ throw(\"Invalid options object\"); }\n\t\t\tvar premultiply = options.premultiply;\n\t\t\tvar transparent = options.transparent;\n\t\t\tvar antialias = options.antialias;\n\t\t\tvar preserveBuffer = options.preserveBuffer;\n\t\t\tvar autoPurge = options.autoPurge;\n\t\t}\n\n// public properties:\n\t\t/**\n\t\t * Console log potential issues and problems. This is designed to have <em>minimal</em> performance impact, so\n\t\t * if extensive debugging information is required, this may be inadequate. See {{#crossLink \"WebGLInspector\"}}{{/crossLink}}\n\t\t * @property vocalDebug\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.vocalDebug = false;\n\n// private properties:\n\t\t/**\n\t\t * Specifies whether or not the canvas is auto-cleared by WebGL. The WebGL spec discourages `true`.\n\t\t * If true, the canvas is NOT auto-cleared by WebGL. Used when the canvas context is created and requires\n\t\t * context re-creation to update.\n\t\t * @property _preserveBuffer\n\t\t * @protected\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t */\n\t\tthis._preserveBuffer = preserveBuffer||false;\n\n\t\t/**\n\t\t * Specifies whether or not the browser's WebGL implementation should try to perform anti-aliasing.\n\t\t * @property _antialias\n\t\t * @protected\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t */\n\t\tthis._antialias = antialias||false;\n\n\t\t/**\n\t\t * Specifies whether or not the browser's WebGL implementation should be transparent.\n\t\t * @property _transparent\n\t\t * @protected\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t */\n\t\tthis._transparent = transparent||false;\n\n\t\t/**\n\t\t * Specifies whether or not StageGL is handling colours as premultiplied alpha.\n\t\t * @property _premultiply\n\t\t * @protected\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t */\n\t\tthis._premultiply = premultiply||false;\n\n\t\t/**\n\t\t * Internal value of {{#crossLink \"StageGL/autoPurge\"}}{{/crossLink}}\n\t\t * @property _autoPurge\n\t\t * @protected\n\t\t * @type {Integer}\n\t\t * @default null\n\t\t */\n\t\tthis._autoPurge = undefined;\n\t\tthis.autoPurge = autoPurge;\t//getter/setter handles setting the real value and validating\n\n\t\t/**\n\t\t * The width in px of the drawing surface saved in memory.\n\t\t * @property _viewportWidth\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t */\n\t\tthis._viewportWidth = 0;\n\n\t\t/**\n\t\t * The height in px of the drawing surface saved in memory.\n\t\t * @property _viewportHeight\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t */\n\t\tthis._viewportHeight = 0;\n\n\t\t/**\n\t\t * A 2D projection matrix used to convert WebGL's viewspace into canvas co-ordinates. Regular canvas display\n\t\t * uses Top-Left values of [0,0] where WebGL uses a Center [0,0] Top-Right [1,1] (euclidean) system.\n\t\t * @property _projectionMatrix\n\t\t * @protected\n\t\t * @type {Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis._projectionMatrix = null;\n\n\t\t/**\n\t\t * The current WebGL canvas context. Often shorthanded to just \"gl\" in many parts of the code.\n\t\t * @property _webGLContext\n\t\t * @protected\n\t\t * @type {WebGLRenderingContext}\n\t\t * @default null\n\t\t */\n\t\tthis._webGLContext = null;\n\n\t\t/**\n\t\t * The color to use when the WebGL canvas has been cleared. May appear as a background color. Defaults to grey.\n\t\t * @property _clearColor\n\t\t * @protected\n\t\t * @type {Object}\n\t\t * @default {r: 0.50, g: 0.50, b: 0.50, a: 0.00}\n\t\t */\n\t\tthis._clearColor = {r: 0.50, g: 0.50, b: 0.50, a: 0.00};\n\n\t\t/**\n\t\t * The maximum number of cards (aka a single sprite) that can be drawn in one draw call. Use getter/setters to\n\t\t * modify otherwise internal buffers may be incorrect sizes.\n\t\t * @property _maxCardsPerBatch\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default StageGL.DEFAULT_MAX_BATCH_SIZE (10000)\n\t\t */\n\t\tthis._maxCardsPerBatch = StageGL.DEFAULT_MAX_BATCH_SIZE;\t\t\t\t\t\t\t\t\t\t\t\t\t\t//TODO: write getter/setters for this\n\n\t\t/**\n\t\t * The shader program used to draw the current batch.\n\t\t * @property _activeShader\n\t\t * @protected\n\t\t * @type {WebGLProgram}\n\t\t * @default null\n\t\t */\n\t\tthis._activeShader = null;\n\n\t\t/**\n\t\t * The vertex position data for the current draw call.\n\t\t * @property _vertices\n\t\t * @protected\n\t\t * @type {Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis._vertices = null;\n\n\t\t/**\n\t\t * The WebGL buffer attached to {{#crossLink \"StageGL/_vertices:property\"}}{{/crossLink}}.\n\t\t * @property _vertexPositionBuffer\n\t\t * @protected\n\t\t * @type {WebGLBuffer}\n\t\t * @default null\n\t\t */\n\t\tthis._vertexPositionBuffer = null;\n\n\t\t/**\n\t\t * The vertex U/V data for the current draw call.\n\t\t * @property _uvs\n\t\t * @protected\n\t\t * @type {Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis._uvs = null;\n\n\t\t/**\n\t\t * The WebGL buffer attached to {{#crossLink \"StageGL/_uvs:property\"}}{{/crossLink}}.\n\t\t * @property _uvPositionBuffer\n\t\t * @protected\n\t\t * @type {WebGLBuffer}\n\t\t * @default null\n\t\t */\n\t\tthis._uvPositionBuffer = null;\n\n\t\t/**\n\t\t * The vertex indices data for the current draw call.\n\t\t * @property _indices\n\t\t * @protected\n\t\t * @type {Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis._indices = null;\n\n\t\t/**\n\t\t * The WebGL buffer attached to {{#crossLink \"StageGL/_indices:property\"}}{{/crossLink}}.\n\t\t * @property _textureIndexBuffer\n\t\t * @protected\n\t\t * @type {WebGLBuffer}\n\t\t * @default null\n\t\t */\n\t\tthis._textureIndexBuffer = null;\n\n\t\t/**\n\t\t * The vertices data for the current draw call.\n\t\t * @property _alphas\n\t\t * @protected\n\t\t * @type {Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis._alphas = null;\n\n\t\t/**\n\t\t * The WebGL buffer attached to {{#crossLink \"StageGL/_alphas:property\"}}{{/crossLink}}.\n\t\t * @property _alphaBuffer\n\t\t * @protected\n\t\t * @type {WebGLBuffer}\n\t\t * @default null\n\t\t */\n\t\tthis._alphaBuffer = null;\n\n\t\t/**\n\t\t * An index based lookup of every WebGL Texture currently in use.\n\t\t * @property _drawTexture\n\t\t * @protected\n\t\t * @type {Array}\n\t\t */\n\t\tthis._textureDictionary = [];\n\n\t\t/**\n\t\t * A string based lookup hash of which index a texture is stored at in the dictionary. The lookup string is\n\t\t * often the src url.\n\t\t * @property _textureIDs\n\t\t * @protected\n\t\t * @type {Object}\n\t\t */\n\t\tthis._textureIDs = {};\n\n\t\t/**\n\t\t * An array of all the textures currently loaded into the GPU. The index in the array matches the GPU index.\n\t\t * @property _batchTextures\n\t\t * @protected\n\t\t * @type {Array}\n\t\t */\n\t\tthis._batchTextures = [];\n\n\t\t/**\n\t\t * An array of all the simple filler textures used to prevent issues with missing textures in a batch.\n\t\t * @property _baseTextures\n\t\t * @protected\n\t\t * @type {Array}\n\t\t */\n\t\tthis._baseTextures = [];\n\n\t\t/**\n\t\t * The number of concurrent textures the GPU can handle. This value is dynamically set from WebGL during initialization\n\t\t * via `gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS)`. The WebGL spec states that the lowest guaranteed value is 8,\n\t\t * but it could be higher. Do not set this value higher than the value returned by the GPU. Setting it lower will\n\t\t * probably reduce performance, but may be advisable to reserve slots for custom filter work.\n\t\t * NOTE: Can also act as a length for {{#crossLink \"StageGL/_batchTextures:property\"}}.\n\t\t * @property _batchTextureCount\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 8\n\t\t */\n\t\tthis._batchTextureCount = 8;\n\n\t\t/**\n\t\t * The location at which the last texture was inserted into a GPU slot in {{#crossLink \"StageGL/_batchTextures:property\"}}{{/crossLink}}.\n\t\t * Manual control of this variable can yield improvements in performance by intelligently replacing textures\n\t\t * inside a batch to reduce texture re-load. It is impossible to write automated general use code, as it requires\n\t\t * display list look ahead inspection and/or render foreknowledge.\n\t\t * @property _lastTextureInsert\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default -1\n\t\t */\n\t\tthis._lastTextureInsert = -1;\n\n\t\t/**\n\t\t * The current batch being drawn, A batch consists of a call to `drawElements` on the GPU. Many of these calls\n\t\t * can occur per draw.\n\t\t * @property _batchId\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t */\n\t\tthis._batchID = 0;\n\n\t\t/**\n\t\t * The current draw being performed, may contain multiple batches. Comparing to {{#crossLink \"StageGL/_batchID:property\"}}{{/crossLink}}\n\t\t * can reveal batching efficiency.\n\t\t * @property _drawID\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t */\n\t\tthis._drawID = 0;\n\n\t\t/**\n\t\t * Used to prevent textures in certain GPU slots from being replaced by an insert.\n\t\t * @property _slotBlackList\n\t\t * @protected\n\t\t * @type {Array}\n\t\t */\n\t\tthis._slotBlacklist = [];\n\n\t\t/**\n\t\t * Used to prevent nested draw calls from accidentally overwriting drawing information by tracking depth.\n\t\t * @property _isDrawing\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t */\n\t\tthis._isDrawing = 0;\n\n\t\t/**\n\t\t * Used to ensure every canvas used as a texture source has a unique ID.\n\t\t * @property _lastTrackedCanvas\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t */\n\t\tthis._lastTrackedCanvas = 0;\n\n\t\t/**\n\t\t * Controls whether final rendering output of a {{#crossLink \"cacheDraw\"}}{{/crossLink}} is the canvas or a render\n\t\t * texture. See the {{#crossLink \"cache\"}}{{/crossLink}} function modifications for full implications and discussion.\n\t\t * @property isCacheControlled\n\t\t * @protected\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t * @todo LM: is this supposed to be _isCacheControlled since its private?\n\t\t */\n\t\tthis.isCacheControlled = false;\n\n\t\t/**\n\t\t * Used to counter-position the object being cached so it aligns with the cache surface. Additionally ensures\n\t\t * that all rendering starts with a top level container.\n\t\t * @property _cacheContainer\n\t\t * @protected\n\t\t * @type {Container}\n\t\t * @default An instance of an EaselJS Container.\n\t\t */\n\t\tthis._cacheContainer = new createjs.Container();\n\n\t\t// and begin\n\t\tthis._initializeWebGL();\n\t}\n\tvar p = createjs.extend(StageGL, createjs.Stage);\n\n// static methods:\n\t/**\n\t * Calculate the U/V co-ordinate based info for sprite frames. Instead of pixel count it uses a 0-1 space. Also includes\n\t * the ability to get info back for a specific frame, or only calculate that one frame.\n\t *\n\t *     //generate UV rects for all entries\n\t *     StageGL.buildUVRects( spriteSheetA );\n\t *     //generate all, fetch the first\n\t *     var firstFrame = StageGL.buildUVRects( spriteSheetB, 0 );\n\t *     //generate the rect for just a single frame for performance's sake\n\t *     var newFrame = StageGL.buildUVRects( dynamicSpriteSheet, newFrameIndex, true );\n\t *\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method buildUVRects\n\t * @param  {SpriteSheet} spritesheet The spritesheet to find the frames on\n\t * @param  {int} [target=-1] The index of the frame to return\n\t * @param  {Boolean} [onlyTarget=false] Whether \"target\" is the only frame that gets calculated\n\t * @static\n\t * @return {Object} the target frame if supplied and present or a generic frame {t, l, b, r}\n\t */\n\tStageGL.buildUVRects = function (spritesheet, target, onlyTarget) {\n\t\tif (!spritesheet || !spritesheet._frames) { return null; }\n\t\tif (target === undefined) { target = -1; }\n\t\tif (onlyTarget === undefined) { onlyTarget = false; }\n\n\t\tvar start = (target != -1 && onlyTarget)?(target):(0);\n\t\tvar end = (target != -1 && onlyTarget)?(target+1):(spritesheet._frames.length);\n\t\tfor (var i=start; i<end; i++) {\n\t\t\tvar f = spritesheet._frames[i];\n\t\t\tif (f.uvRect || f.image.width <= 0 || f.image.height <= 0) { continue; }\n\n\t\t\tvar r = f.rect;\n\t\t\tf.uvRect = {\n\t\t\t\tt: r.y / f.image.height,\n\t\t\t\tl: r.x / f.image.width,\n\t\t\t\tb: (r.y + r.height) / f.image.height,\n\t\t\t\tr: (r.x + r.width) / f.image.width\n\t\t\t};\n\t\t}\n\n\t\treturn spritesheet._frames[(target != -1) ? target : 0].uvRect || {t:0, l:0, b:1, r:1};\n\t};\n\n\t/**\n\t * Test a context to see if it has WebGL enabled on it.\n\t * @method isWebGLActive\n\t * @param {CanvasContext} ctx The context to test\n\t * @static\n\t * @return {Boolean} Whether WebGL is enabled\n\t */\n\tStageGL.isWebGLActive = function (ctx) {\n\t\treturn ctx &&\n\t\t\tctx instanceof WebGLRenderingContext &&\n\t\t\ttypeof WebGLRenderingContext !== 'undefined';\n\t};\n\n// static properties:\n\t/**\n\t * The number of properties defined per vertex (x, y, textureU, textureV, textureIndex, alpha)\n\t * @property VERTEX_PROPERTY_COUNT\n\t * @static\n\t * @final\n\t * @type {Number}\n\t * @default 6\n\t * @readonly\n\t */\n\tStageGL.VERTEX_PROPERTY_COUNT = 6;\n\n\t/**\n\t * The number of triangle indices it takes to form a Card. 3 per triangle, 2 triangles.\n\t * @property INDICIES_PER_CARD\n\t * @static\n\t * @final\n\t * @type {Number}\n\t * @default 6\n\t * @readonly\n\t */\n\tStageGL.INDICIES_PER_CARD = 6;\n\n\t/**\n\t * The default value for the maximum number of cards we want to process in a batch. See\n\t * {{#crossLink \"StageGL/WEBGL_MAX_INDEX_NUM:property\"}}{{/crossLink}} for a hard limit.\n\t * @property DEFAULT_MAX_BATCH_SIZE\n\t * @static\n\t * @final\n\t * @type {Number}\n\t * @default 10000\n\t * @readonly\n\t */\n\tStageGL.DEFAULT_MAX_BATCH_SIZE = 10000;\n\n\t/**\n\t * The maximum size WebGL allows for element index numbers. Uses a 16 bit unsigned integer. It takes 6 indices to\n\t * make a unique card.\n\t * @property WEBGL_MAX_INDEX_NUM\n\t * @static\n\t * @final\n\t * @type {Number}\n\t * @default 65536\n\t * @readonly\n\t */\n\tStageGL.WEBGL_MAX_INDEX_NUM = Math.pow(2, 16);\n\n\t/**\n\t * Default U/V rect for dealing with full coverage from an image source.\n\t * @property UV_RECT\n\t * @static\n\t * @final\n\t * @type {Object}\n\t * @default {t:0, l:0, b:1, r:1}\n\t * @readonly\n\t */\n\tStageGL.UV_RECT = {t:0, l:0, b:1, r:1};\n\n\ttry {\n\t\t/**\n\t\t * Vertex positions for a card that covers the entire render. Used with render targets primarily.\n\t\t * @property COVER_VERT\n\t\t * @static\n\t\t * @final\n\t\t * @type {Float32Array}\n\t\t * @readonly\n\t\t */\n\t\tStageGL.COVER_VERT = new Float32Array([\n\t\t\t-1,\t\t 1,\t\t//TL\n\t\t\t1,\t\t 1,\t\t//TR\n\t\t\t-1,\t\t-1,\t\t//BL\n\t\t\t1,\t\t 1,\t\t//TR\n\t\t\t1,\t\t-1,\t\t//BR\n\t\t\t-1,\t\t-1\t\t//BL\n\t\t]);\n\n\t\t/**\n\t\t * U/V for {{#crossLink \"StageGL/COVER_VERT:property\"}}{{/crossLink}}.\n\t\t * @property COVER_UV\n\t\t * @static\n\t\t * @final\n\t\t * @type {Float32Array}\n\t\t * @readonly\n\t\t */\n\t\tStageGL.COVER_UV = new Float32Array([\n\t\t\t 0,\t\t 0,\t\t//TL\n\t\t\t 1,\t\t 0,\t\t//TR\n\t\t\t 0,\t\t 1,\t\t//BL\n\t\t\t 1,\t\t 0,\t\t//TR\n\t\t\t 1,\t\t 1,\t\t//BR\n\t\t\t 0,\t\t 1\t\t//BL\n\t\t]);\n\n\t\t/**\n\t\t * Flipped U/V for {{#crossLink \"StageGL:COVER_VERT:property\"}}{{/crossLink}}.\n\t\t * @property COVER_UV_FLIP\n\t\t * @static\n\t\t * @final\n\t\t * @type {Float32Array}\n\t\t * @readonly\n\t\t */\n\t\tStageGL.COVER_UV_FLIP = new Float32Array([\n\t\t\t 0,\t\t 1,\t\t//TL\n\t\t\t 1,\t\t 1,\t\t//TR\n\t\t\t 0,\t\t 0,\t\t//BL\n\t\t\t 1,\t\t 1,\t\t//TR\n\t\t\t 1,\t\t 0,\t\t//BR\n\t\t\t 0,\t\t 0\t\t//BL\n\t\t]);\n\t} catch(e) { /* Breaking in older browsers, but those browsers wont run StageGL so no recovery or warning needed */ }\n\n\t/**\n\t * Portion of the shader that contains the \"varying\" properties required in both vertex and fragment shaders. The\n\t * regular shader is designed to render all expected objects. Shader code may contain templates that are replaced\n\t * pre-compile.\n\t * @property REGULAR_VARYING_HEADER\n\t * @static\n\t * @final\n\t * @type {String}\n\t * @readonly\n\t */\n\tStageGL.REGULAR_VARYING_HEADER = (\n\t\t\"precision mediump float;\" +\n\t\t\"varying vec2 vTextureCoord;\" +\n\t\t\"varying lowp float indexPicker;\" +\n\t\t\"varying lowp float alphaValue;\"\n\t);\n\n\t/**\n\t * Actual full header for the vertex shader. Includes the varying header. The regular shader is designed to render\n\t * all expected objects. Shader code may contain templates that are replaced pre-compile.\n\t * @property REGULAR_VERTEX_HEADER\n\t * @static\n\t * @final\n\t * @type {String}\n\t * @readonly\n\t */\n\tStageGL.REGULAR_VERTEX_HEADER = (\n\t\tStageGL.REGULAR_VARYING_HEADER +\n\t\t\"attribute vec2 vertexPosition;\" +\n\t\t\"attribute vec2 uvPosition;\" +\n\t\t\"attribute lowp float textureIndex;\" +\n\t\t\"attribute lowp float objectAlpha;\" +\n\t\t\"uniform mat4 pMatrix;\"\n\t);\n\n\t/**\n\t * Actual full header for the fragment shader. Includes the varying header. The regular shader is designed to render\n\t * all expected objects. Shader code may contain templates that are replaced pre-compile.\n\t * @property REGULAR_FRAGMENT_HEADER\n\t * @static\n\t * @final\n\t * @type {String}\n\t * @readonly\n\t */\n\tStageGL.REGULAR_FRAGMENT_HEADER = (\n\t\tStageGL.REGULAR_VARYING_HEADER +\n\t\t\"uniform sampler2D uSampler[{{count}}];\"\n\t);\n\n\t/**\n\t * Body of the vertex shader. The regular shader is designed to render all expected objects. Shader code may contain\n\t * templates that are replaced pre-compile.\n\t * @property REGULAR_VERTEX_BODY\n\t * @static\n\t * @final\n\t * @type {String}\n\t * @readonly\n\t */\n\tStageGL.REGULAR_VERTEX_BODY  = (\n\t\t\"void main(void) {\" +\n\t\t\t//DHG TODO: This doesn't work. Must be something wrong with the hand built matrix see js... bypass for now\n\t\t\t//vertexPosition, round if flag\n\t\t\t//\"gl_Position = pMatrix * vec4(vertexPosition.x, vertexPosition.y, 0.0, 1.0);\" +\n\t\t\t\"gl_Position = vec4(\"+\n\t\t\t\t\"(vertexPosition.x * pMatrix[0][0]) + pMatrix[3][0],\" +\n\t\t\t\t\"(vertexPosition.y * pMatrix[1][1]) + pMatrix[3][1],\" +\n\t\t\t\t\"pMatrix[3][2],\" +\n\t\t\t\t\"1.0\" +\n\t\t\t\");\" +\n\t\t\t\"alphaValue = objectAlpha;\" +\n\t\t\t\"indexPicker = textureIndex;\" +\n\t\t\t\"vTextureCoord = uvPosition;\" +\n\t\t\"}\"\n\t);\n\n\t/**\n\t * Body of the fragment shader. The regular shader is designed to render all expected objects. Shader code may\n\t * contain templates that are replaced pre-compile.\n\t * @property REGULAR_FRAGMENT_BODY\n\t * @static\n\t * @final\n\t * @type {String}\n\t * @readonly\n\t */\n\tStageGL.REGULAR_FRAGMENT_BODY = (\n\t\t\"void main(void) {\" +\n\t\t\t\"vec4 color = vec4(1.0, 0.0, 0.0, 1.0);\" +\n\n\t\t\t\"if (indexPicker <= 0.5) {\" +\n\t\t\t\t\"color = texture2D(uSampler[0], vTextureCoord);\" +\n\t\t\t\t\"{{alternates}}\" +\n\t\t\t\"}\" +\n\n\t\t\t\"{{fragColor}}\" +\n\t\t\"}\"\n\t);\n\tStageGL.REGULAR_FRAG_COLOR_NORMAL = (\n\t\t\"gl_FragColor = vec4(color.rgb, color.a * alphaValue);\"\n\t);\n\tStageGL.REGULAR_FRAG_COLOR_PREMULTIPLY = (\n\t\t\"if(color.a > 0.0035) {\" +\t\t// 1/255 = 0.0039, so ignore any value below 1 because it's probably noise\n\t\t\t\"gl_FragColor = vec4(color.rgb/color.a, color.a * alphaValue);\" +\n\t\t\"} else {\" +\n\t\t\t\"gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\" +\n\t\t\"}\"\n\t);\n\n\t//TODO: DHG: a real particle shader\n\t/**\n\t * @property PARTICLE_VERTEX_BODY\n\t * @todo\n\t * @final\n\t * @static\n\t * @type {String}\n\t * @readonly\n\t */\n\tStageGL.PARTICLE_VERTEX_BODY = (\n\t\tStageGL.REGULAR_VERTEX_BODY\n\t);\n\t/**\n\t * @property PARTICLE_FRAGMENT_BODY\n\t * @todo\n\t * @final\n\t * @static\n\t * @type {String}\n\t * @readonly\n\t */\n\tStageGL.PARTICLE_FRAGMENT_BODY = (\n\t\tStageGL.REGULAR_FRAGMENT_BODY\n\t);\n\n\t/**\n\t * Portion of the shader that contains the \"varying\" properties required in both vertex and fragment shaders. The\n\t * cover shader is designed to be a simple vertex/uv only texture render that covers the render surface. Shader\n\t * code may contain templates that are replaced pre-compile.\n\t * @property COVER_VARYING_HEADER\n\t * @static\n\t * @final\n\t * @type {String}\n\t * @readonly\n\t */\n\tStageGL.COVER_VARYING_HEADER = (\n\t\t\"precision mediump float;\" +\n\n\t\t\"varying highp vec2 vRenderCoord;\" +\n\t\t\"varying highp vec2 vTextureCoord;\"\n\t);\n\n\t/**\n\t * Actual full header for the vertex shader. Includes the varying header. The cover shader is designed to be a\n\t * simple vertex/uv only texture render that covers the render surface. Shader code may contain templates that are\n\t * replaced pre-compile.\n\t * @property COVER_VERTEX_HEADER\n\t * @static\n\t * @final\n\t * @type {String}\n\t * @readonly\n\t */\n\tStageGL.COVER_VERTEX_HEADER = (\n\t\tStageGL.COVER_VARYING_HEADER +\n\t\t\"attribute vec2 vertexPosition;\" +\n\t\t\"attribute vec2 uvPosition;\" +\n\t\t\"uniform float uUpright;\"\n\t);\n\n\t/**\n\t * Actual full header for the fragment shader. Includes the varying header. The cover shader is designed to be a\n\t * simple vertex/uv only texture render that covers the render surface. Shader code may contain templates that are\n\t * replaced pre-compile.\n\t * @property COVER_FRAGMENT_HEADER\n\t * @static\n\t * @final\n\t * @type {String}\n\t * @readonly\n\t */\n\tStageGL.COVER_FRAGMENT_HEADER = (\n\t\tStageGL.COVER_VARYING_HEADER +\n\t\t\"uniform sampler2D uSampler;\"\n\t);\n\n\t/**\n\t * Body of the vertex shader. The cover shader is designed to be a simple vertex/uv only texture render that covers\n\t * the render surface. Shader code may contain templates that are replaced pre-compile.\n\t * @property COVER_VERTEX_BODY\n\t * @static\n\t * @final\n\t * @type {String}\n\t * @readonly\n\t */\n\tStageGL.COVER_VERTEX_BODY  = (\n\t\t\"void main(void) {\" +\n\t\t\t\"gl_Position = vec4(vertexPosition.x, vertexPosition.y, 0.0, 1.0);\" +\n\t\t\t\"vRenderCoord = uvPosition;\" +\n\t\t\t\"vTextureCoord = vec2(uvPosition.x, abs(uUpright - uvPosition.y));\" +\n\t\t\"}\"\n\t);\n\n\t/**\n\t * Body of the fragment shader. The cover shader is designed to be a simple vertex/uv only texture render that\n\t * covers the render surface. Shader code may contain templates that are replaced pre-compile.\n\t * @property COVER_FRAGMENT_BODY\n\t * @static\n\t * @final\n\t * @type {String}\n\t * @readonly\n\t */\n\tStageGL.COVER_FRAGMENT_BODY = (\n\t\t\"void main(void) {\" +\n\t\t\t\"vec4 color = texture2D(uSampler, vRenderCoord);\" +\n\t\t\t\"gl_FragColor = color;\" +\n\t\t\"}\"\n\t);\n\n// events:\n\t/**\n\t * Dispatched each update immediately before the canvas is cleared and the display list is drawn to it. You can call\n\t * {{#crossLink \"Event/preventDefault\"}}{{/crossLink}} on the event to cancel the draw.\n\t * @event drawstart\n\t */\n\n\t/**\n\t * Dispatched each update immediately after the display list is drawn to the canvas and the canvas context is restored.\n\t * @event drawend\n\t */\n\n// getter / setters:\n\tp._get_isWebGL = function () {\n\t\treturn !!this._webGLContext;\n\t};\n\n\tp._set_autoPurge = function (value) {\n\t\tvalue = isNaN(value)?1200:value;\n\t\tif (value != -1) {\n\t\t\tvalue = value<10?10:value;\n\t\t}\n\t\tthis._autoPurge = value;\n\t};\n\tp._get_autoPurge = function () {\n\t\treturn Number(this._autoPurge);\n\t};\n\n\ttry {\n\t\tObject.defineProperties(p, {\n\t\t\t/**\n\t\t\t * Indicates whether WebGL is being used for rendering. For example, this would be `false` if WebGL is not\n\t\t\t * supported in the browser.\n\t\t\t * @property isWebGL\n\t\t\t * @type {Boolean}\n\t\t\t * @readonly\n\t\t\t */\n\t\t\tisWebGL: { get: p._get_isWebGL },\n\n\t\t\t/**\n\t\t\t * Specifies whether or not StageGL is automatically purging unused textures. Higher numbers purge less\n\t\t\t * often. Values below 10 are upgraded to 10, and -1 disables this feature.\n\t\t\t * @property autoPurge\n\t\t\t * @protected\n\t\t\t * @type {Integer}\n\t\t\t * @default 1000\n\t\t\t */\n\t\t\tautoPurge: { get: p._get_autoPurge, set: p._set_autoPurge }\n\t\t});\n\t} catch (e) {} // TODO: use Log\n\n\n// constructor methods:\n\t/**\n\t * Create and properly initialize the WebGL instance.\n\t * @method _initializeWebGL\n\t * @protected\n\t * @return {WebGLRenderingContext}\n\t */\n\tp._initializeWebGL = function () {\n\t\tif (this.canvas) {\n\t\t\tif (!this._webGLContext || this._webGLContext.canvas !== this.canvas) {\n\t\t\t\t// A context hasn't been defined yet,\n\t\t\t\t// OR the defined context belongs to a different canvas, so reinitialize.\n\n\t\t\t\t// defaults and options\n\t\t\t\tvar options = {\n\t\t\t\t\tdepth: false, // Disable the depth buffer as it isn't used.\n\t\t\t\t\talpha: this._transparent, // Make the canvas background transparent.\n\t\t\t\t\tstencil: true,\n\t\t\t\t\tantialias: this._antialias,\n\t\t\t\t\tpremultipliedAlpha: this._premultiply, // Assume the drawing buffer contains colors with premultiplied alpha.\n\t\t\t\t\tpreserveDrawingBuffer: this._preserveBuffer\n\t\t\t\t};\n\n\t\t\t\tvar gl = this._webGLContext = this._fetchWebGLContext(this.canvas, options);\n\t\t\t\tif (!gl) { return null; }\n\n\t\t\t\tthis.updateSimultaneousTextureCount(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS));\n\t\t\t\tthis._maxTextureSlots = gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);\n\t\t\t\tthis._createBuffers(gl);\n\t\t\t\tthis._initTextures(gl);\n\n\t\t\t\tgl.disable(gl.DEPTH_TEST);\n\t\t\t\tgl.enable(gl.BLEND);\n\t\t\t\tgl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\t\t\t\tgl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, this._premultiply);\n\t\t\t\t//gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);\n\n\t\t\t\tthis._webGLContext.clearColor(this._clearColor.r, this._clearColor.g, this._clearColor.b, this._clearColor.a);\n\t\t\t\tthis.updateViewport(this._viewportWidth || this.canvas.width, this._viewportHeight || this.canvas.height);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._webGLContext = null;\n\t\t}\n\t\treturn this._webGLContext;\n\t};\n\n// public methods:\n\t/**\n\t * Docced in superclass\n\t */\n\tp.update = function (props) {\n\t\tif (!this.canvas) { return; }\n\t\tif (this.tickOnUpdate) { this.tick(props); }\n\t\tthis.dispatchEvent(\"drawstart\");\n\t\tif (this.autoClear) { this.clear(); }\n\n\t\tif (this._webGLContext) {\n\t\t\t// Use WebGL.\n\t\t\tthis._batchDraw(this, this._webGLContext);\n\t\t\tif (this._autoPurge != -1 && !(this._drawID%((this._autoPurge/2)|0))) {\n\t\t\t\tthis.purgeTextures(this._autoPurge);\n\t\t\t}\n\t\t} else {\n\t\t\t// Use 2D.\n\t\t\tvar ctx = this.canvas.getContext(\"2d\");\n\t\t\tctx.save();\n\t\t\tthis.updateContext(ctx);\n\t\t\tthis.draw(ctx, false);\n\t\t\tctx.restore();\n\t\t}\n\t\tthis.dispatchEvent(\"drawend\");\n\t};\n\n\t/**\n\t * Docced in superclass\n\t */\n\tp.clear = function () {\n\t\tif (!this.canvas) { return; }\n\t\tif (StageGL.isWebGLActive(this._webGLContext)) {\n\t\t\tvar gl = this._webGLContext;\n\t\t\tvar cc = this._clearColor;\n\t\t\tvar adjust = this._transparent ? cc.a : 1.0;\n\t\t\t// Use WebGL settings; adjust for pre multiplied alpha appropriate to scenario\n\t\t\tthis._webGLContext.clearColor(cc.r * adjust, cc.g * adjust, cc.b * adjust, adjust);\n\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t\tthis._webGLContext.clearColor(cc.r, cc.g, cc.b, cc.a);\n\t\t} else {\n\t\t\t// Use 2D.\n\t\t\tthis.Stage_clear();\n\t\t}\n\t};\n\n\t/**\n\t * Draws the stage into the supplied context if possible. Many WebGL properties only exist on their context. As such\n\t * you cannot share contexts among many StageGLs and each context requires a unique StageGL instance. Contexts that\n\t * don't match the context managed by this StageGL will be treated as a 2D context.\n\t *\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method draw\n\t * @param {CanvasRenderingContext2D | WebGLRenderingContext} context The context object to draw into.\n\t * @param {Boolean} [ignoreCache=false] Indicates whether the draw operation should ignore any current cache. For\n\t *  example, used for drawing the cache (to prevent it from simply drawing an existing cache back into itself).\n\t * @return {Boolean} If the draw was handled by this function\n\t */\n\tp.draw = function (context, ignoreCache) {\n\t\tif (context === this._webGLContext && StageGL.isWebGLActive(this._webGLContext)) {\n\t\t\tvar gl = this._webGLContext;\n\t\t\tthis._batchDraw(this, gl, ignoreCache);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn this.Stage_draw(context, ignoreCache);\n\t\t}\n\t};\n\n\t/**\n\t * Draws the target into the correct context, be it a canvas or Render Texture using WebGL.\n\t *\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method cacheDraw\n\t * @param {DisplayObject} target The object we're drawing into cache.\n\t * For example, used for drawing the cache (to prevent it from simply drawing an existing cache back into itself).\n\t * @param {Array} filters The filters we're drawing into cache.\n\t * @param {BitmapCache} manager The BitmapCache instance looking after the cache\n\t * @return {Boolean} If the draw was handled by this function\n\t */\n\tp.cacheDraw = function (target, filters, manager) {\n\t\tif (StageGL.isWebGLActive(this._webGLContext)) {\n\t\t\tvar gl = this._webGLContext;\n\t\t\tthis._cacheDraw(gl, target, filters, manager);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/**\n\t * Blocks, or frees a texture \"slot\" on the GPU. Can be useful if you are overflowing textures. When overflowing\n\t * textures they are re-uploaded to the GPU every time they're encountered, this can be expensive with large textures.\n\t * By blocking the slot you reduce available slots, potentially increasing draw calls, but mostly you prevent a\n\t * texture being re-uploaded if it would have moved slots due to overflow.\n\t *\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * For example, block the slot a background image is stored in so there is less re-loading of that image.\n\t * @method protectTextureSlot\n\t * @param  {Number} id The slot to be affected\n\t * @param  {Boolean} [lock=false] Whether this slot is the one being locked.\n\t */\n\tp.protectTextureSlot = function (id, lock) {\n\t\tif (id > this._maxTextureSlots || id < 0) {\n\t\t\tthrow \"Slot outside of acceptable range\";\n\t\t}\n\t\tthis._slotBlacklist[id] = !!lock;\n\t};\n\n\t/**\n\t * Render textures can't draw into themselves so any item being used for renderTextures needs two to alternate between.\n\t * This function creates, gets, and toggles the render surface between the two.\n\t *\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method getTargetRenderTexture\n\t * @param  {DisplayObject} target The object associated with the render textures, usually a cached object.\n\t * @param  {Number} w The width to create the texture at.\n\t * @param  {Number} h The height to create the texture at.\n\t * @return {Objet}\n\t * @todo fill in return type\n\t */\n\tp.getTargetRenderTexture = function (target, w, h) {\n\t\tvar result, toggle = false;\n\t\tvar gl = this._webGLContext;\n\t\tif (target.__lastRT !== undefined && target.__lastRT === target.__rtA) { toggle = true; }\n\t\tif (!toggle) {\n\t\t\tif (target.__rtA === undefined) {\n\t\t\t\ttarget.__rtA = this.getRenderBufferTexture(w, h);\n\t\t\t} else {\n\t\t\t\tif (w != target.__rtA._width || h != target.__rtA._height) {\n\t\t\t\t\tthis.resizeTexture(target.__rtA, w, h);\n\t\t\t\t}\n\t\t\t\tthis.setTextureParams(gl);\n\t\t\t}\n\t\t\tresult = target.__rtA;\n\t\t} else {\n\t\t\tif (target.__rtB === undefined) {\n\t\t\t\ttarget.__rtB = this.getRenderBufferTexture(w, h);\n\t\t\t} else {\n\t\t\t\tif (w != target.__rtB._width || h != target.__rtB._height) {\n\t\t\t\t\tthis.resizeTexture(target.__rtB, w, h);\n\t\t\t\t}\n\t\t\t\tthis.setTextureParams(gl);\n\t\t\t}\n\t\t\tresult = target.__rtB;\n\t\t}\n\t\tif (!result) {\n\t\t\tthrow \"Problems creating render textures, known causes include using too much VRAM by not releasing WebGL texture instances\";\n\t\t}\n\t\ttarget.__lastRT = result;\n\t\treturn result;\n\t};\n\n\t/**\n\t * For every image encountered StageGL registers and tracks it automatically. This tracking can cause memory leaks \n\t * if not purged. StageGL, by default, automatically purges them. This does have a cost and may unfortunately find\n\t * false positives. This function is for manual management of this memory instead of the automatic system controlled\n\t * by the {{#crossLink \"StageGL/autoPurge:property\"}}{{/crossLink}} property.\n\t *\n\t * This function will recursively remove all textures found on the object, its children, cache, etc. It will uncache \n\t * objects and remove any texture it finds REGARDLESS of whether it is currently in use elsewhere. It is up to the\n\t * developer to ensure that a texture in use is not removed.\n\t *\n\t * Textures in use, or to be used again shortly, should not be removed. This is simply for performance reasons.\n\t * Removing a texture in use will cause the texture to have to be re-uploaded slowing rendering.\n\t * @method releaseTexture\n\t * @param  {DisplayObject | Texture | Image | Canvas} item An object that used the texture to be discarded.\n\t */\n\tp.releaseTexture = function (item) {\n\t\tvar i, l;\n\t\tif (!item) { return; }\n\n\t\t// this is a container object\n\t\tif (item.children) {\n\t\t\tfor (i = 0, l = item.children.length; i < l; i++) {\n\t\t\t\tthis.releaseTexture(item.children[i]);\n\t\t\t}\n\t\t}\n\n\t\t// this has a cache canvas\n\t\tif (item.cacheCanvas) {\n\t\t\titem.uncache();\n\t\t}\n\n\t\tvar foundImage = undefined;\n\t\tif (item._storeID !== undefined) {\n\t\t\t// this is a texture itself\n\t\t\tif (item === this._textureDictionary[item._storeID]) {\n\t\t\t\tthis._killTextureObject(item);\n\t\t\t\titem._storeID = undefined;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// this is an image or canvas\n\t\t\tfoundImage = item;\n\t\t} else if (item._webGLRenderStyle === 2) {\n\t\t\t// this is a Bitmap class\n\t\t\tfoundImage = item.image;\n\t\t} else if (item._webGLRenderStyle === 1) {\n\t\t\t// this is a SpriteSheet, we can't tell which image we used from the list easily so remove them all!\n\t\t\tfor (i = 0, l = item.spriteSheet._images.length; i < l; i++) {\n\t\t\t\tthis.releaseTexture(item.spriteSheet._images[i]);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// did we find anything\n\t\tif (foundImage === undefined) {\n\t\t\tif (this.vocalDebug) {\n\t\t\t\tconsole.log(\"No associated texture found on release\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// remove it\n\t\tthis._killTextureObject(this._textureDictionary[foundImage._storeID]);\n\t\tfoundImage._storeID = undefined;\n\t};\n\n\t/**\n\t * Similar to {{#crossLink \"releaseTexture\"}}{{/crossLink}}, but this function differs by searching for textures to\n\t * release. It works by assuming that it can purge any texture which was last used more than \"count\" draw calls ago.\n\t * Because this process is unaware of the objects and whether they may be used on your stage, false positives can\n\t * occur. It is recommended to manually manage your memory with {{#crossLink \"StageGL/releaseTexture\"}}{{/crossLink}},\n\t * however, there are many use cases where this is simpler and error-free. This process is also run by default under\n\t * the hood to prevent leaks. To disable it see the {{#crossLink \"StageGL/autoPurge:property\"}}{{/crossLink}} property.\n\t * @method purgeTextures\n\t * @param {Number} [count=100] How many renders ago the texture was last used\n\t */\n\tp.purgeTextures = function (count) {\n\t\tif (count == undefined){ count = 100; }\n\n\t\tvar dict = this._textureDictionary;\n\t\tvar l = dict.length;\n\t\tfor (var i= 0; i<l; i++) {\n\t\t\tvar item = dict[i];\n\t\t\tif (!item) { continue; }\n\t\t\tif (item._drawID + count <= this._drawID) {\t// use draw not batch as draw is more indicative of time\n\t\t\t\tthis._killTextureObject(item);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Try to set the max textures the system can handle. It should default to the hardware maximum, and lower values\n\t * may limit performance. Some devices have been known to mis-report their max textures, or you may need a standard\n\t * baseline cross devices for testing. Barring the previous suggestions, there is little need to call this function\n\t * as the library will automatically try to find the best value.\n\t *\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method updateSimultaneousTextureCount\n\t * @param {Number} [count=1] The number of textures intended for simultaneous loading.\n\t */\n\tp.updateSimultaneousTextureCount = function (count) {\n\t\t// TODO: DHG: make sure API works in all instances, may be some issues with buffers etc I haven't foreseen\n\t\tvar gl = this._webGLContext;\n\t\tvar success = false;\n\n\t\tif (count < 1 || isNaN(count)) { count = 1; }\n\t\tthis._batchTextureCount = count;\n\n\t\twhile (!success) {\n\t\t\ttry {\n\t\t\t\tthis._activeShader = this._fetchShaderProgram(gl);\n\t\t\t\tsuccess = true;\n\t\t\t} catch(e) {\n\t\t\t\tif (this._batchTextureCount == 1) {\n\t\t\t\t\tthrow \"Cannot compile shader \" + e;\n\t\t\t\t}\n\n\t\t\t\tthis._batchTextureCount -= 4;\n\t\t\t\tif (this._batchTextureCount < 1) { this._batchTextureCount = 1; }\n\n\t\t\t\tif (this.vocalDebug) {\n\t\t\t\t\tconsole.log(\"Reducing desired texture count due to errors: \" + this._batchTextureCount);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Update the WebGL viewport. Note that this does <strong>not</strong> update the canvas element's width/height, but\n\t * the render surface's instead. This is necessary after manually resizing the canvas element on the DOM to avoid a\n\t * up/down scaled render.\n\t * @method updateViewport\n\t * @param {Integer} width The width of the render surface in pixels.\n\t * @param {Integer} height The height of the render surface in pixels.\n\t */\n\tp.updateViewport = function (width, height) {\n\t\tthis._viewportWidth = width|0;\n\t\tthis._viewportHeight = height|0;\n\t\tvar gl = this._webGLContext;\n\n\t\tif (gl) {\n\t\t\tgl.viewport(0, 0, this._viewportWidth, this._viewportHeight);\n\n\t\t\t// WebGL works with a -1,1 space on its screen. It also follows Y-Up\n\t\t\t// we need to flip the y, scale and then translate the co-ordinates to match this\n\t\t\t// additionally we offset into they Y so the polygons are inside the camera's \"clipping\" plane\n\t\t\tthis._projectionMatrix = new Float32Array([\n\t\t\t\t2 / this._viewportWidth,\t0,\t\t\t\t\t\t\t\t0,\t\t\t\t\t\t\t0,\n\t\t\t\t0,\t\t\t\t\t\t\t-2 / this._viewportHeight,\t\t1,\t\t\t\t\t\t\t0,\n\t\t\t\t0,\t\t\t\t\t\t\t0,\t\t\t\t\t\t\t\t1,\t\t\t\t\t\t\t0,\n\t\t\t\t-1,\t\t\t\t\t\t\t1,\t\t\t\t\t\t\t\t0.1,\t\t\t\t\t\t0\n\t\t\t]);\n\t\t\t// create the flipped version for use with render texture flipping\n\t\t\t// DHG: this would be a slice/clone but some platforms don't offer them for Float32Array\n\t\t\tthis._projectionMatrixFlip = new Float32Array([0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0]);\n\t\t\tthis._projectionMatrixFlip.set(this._projectionMatrix);\n\t\t\tthis._projectionMatrixFlip[5] *= -1;\n\t\t\tthis._projectionMatrixFlip[13] *= -1;\n\t\t}\n\t};\n\n\t/**\n\t * Fetches the shader compiled and set up to work with the provided filter/object. The shader is compiled on first\n\t * use and returned on subsequent calls.\n\t * @method getFilterShader\n\t * @param  {Filter|Object} filter The object which will provide the information needed to construct the filter shader.\n\t * @return {WebGLProgram}\n\t */\n\tp.getFilterShader = function (filter) {\n\t\tif (!filter) { filter = this; }\n\n\t\tvar gl = this._webGLContext;\n\t\tvar targetShader = this._activeShader;\n\n\t\tif (filter._builtShader) {\n\t\t\ttargetShader = filter._builtShader;\n\t\t\tif (filter.shaderParamSetup) {\n\t\t\t\tgl.useProgram(targetShader);\n\t\t\t\tfilter.shaderParamSetup(gl, this, targetShader);\n\t\t\t}\n\t\t} else {\n\t\t\ttry {\n\t\t\t\ttargetShader = this._fetchShaderProgram(\n\t\t\t\t\tgl, \"filter\",\n\t\t\t\t\tfilter.VTX_SHADER_BODY, filter.FRAG_SHADER_BODY,\n\t\t\t\t\tfilter.shaderParamSetup && filter.shaderParamSetup.bind(filter)\n\t\t\t\t);\n\t\t\t\tfilter._builtShader = targetShader;\n\t\t\t\ttargetShader._name = filter.toString();\n\t\t\t} catch (e) {\n\t\t\t\tconsole && console.log(\"SHADER SWITCH FAILURE\", e);\n\t\t\t}\n\t\t}\n\t\treturn targetShader;\n\t};\n\n\t/**\n\t * Returns a base texture that has no image or data loaded. Not intended for loading images. It may return `null`\n\t * in some error cases, and trying to use a \"null\" texture can cause renders to fail.\n\t * @method getBaseTexture\n\t * @param  {uint} [w=1] The width of the texture in pixels, defaults to 1\n\t * @param  {uint} [h=1] The height of the texture in pixels, defaults to 1\n\t */\n\tp.getBaseTexture = function (w, h) {\n\t\tvar width = Math.ceil(w > 0 ? w : 1) || 1;\n\t\tvar height = Math.ceil(h > 0 ? h : 1) || 1;\n\n\t\tvar gl = this._webGLContext;\n\t\tvar texture = gl.createTexture();\n\t\tthis.resizeTexture(texture, width, height);\n\t\tthis.setTextureParams(gl, false);\n\n\t\treturn texture;\n\t};\n\n\t/**\n\t * Resizes a supplied texture element. May generate invalid textures in some error cases such as; when the texture\n\t * is too large, when an out of texture memory error occurs, or other error scenarios. Trying to use an invalid texture\n\t * can cause renders to hard stop on some devices. Check the WebGL bound texture after running this function.\n\t *\n\t * NOTE: The supplied texture must have been made with the WebGL \"texImage2D\" function, all default APIs in StageGL\n\t * use this, so this note only matters for library developers and plugins.\n\t *\n\t * @protected\n\t * @method resizeTexture\n\t * @param  {WebGLTexture} texture The GL Texture to be modified.\n\t * @param  {uint} [width=1] The width of the texture in pixels, defaults to 1\n\t * @param  {uint} [height=1] The height of the texture in pixels, defaults to 1\n\t */\n\tp.resizeTexture = function (texture, width,height) {\n\t\tvar gl = this._webGLContext;\n\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\t\tgl.texImage2D(\n\t\t\tgl.TEXTURE_2D,\t\t\t\t// target\n\t\t\t0,\t\t\t\t\t\t\t// level of detail\n\t\t\tgl.RGBA,\t\t\t\t\t// internal format\n\t\t\twidth, height, 0,\t\t\t// width, height, border (only for array/null sourced textures)\n\t\t\tgl.RGBA,\t\t\t\t\t// format (match internal format)\n\t\t\tgl.UNSIGNED_BYTE,\t\t\t// type of texture(pixel color depth)\n\t\t\tnull\t\t\t\t\t\t// image data, we can do null because we're doing array data\n\t\t);\n\t\ttexture.width = width;\n\t\ttexture.height = height;\n\t};\n\n\t/**\n\t * Returns a base texture (see {{#crossLink \"StageGL/getBaseTexture\"}}{{/crossLink}}) for details. Also includes an\n\t * attached and linked render buffer in `texture._frameBuffer`. RenderTextures can be thought of as an internal\n\t * canvas on the GPU that can be drawn to.\n\t * @method getRenderBufferTexture\n\t * @param  {Number} w The width of the texture in pixels.\n\t * @param  {Number} h The height of the texture in pixels.\n\t * @return {Texture} the basic texture instance with a render buffer property.\n\t */\n\tp.getRenderBufferTexture = function (w, h) {\n\t\tvar gl = this._webGLContext;\n\n\t\t// get the texture\n\t\tvar renderTexture = this.getBaseTexture(w, h);\n\t\tif (!renderTexture) { return null; }\n\n\t\t// get the frame buffer\n\t\tvar frameBuffer = gl.createFramebuffer();\n\t\tif (!frameBuffer) { return null; }\n\n\t\t// set its width and height for spoofing as an image\n\t\trenderTexture.width = w;\n\t\trenderTexture.height = h;\n\n\t\t// attach frame buffer to texture and provide cross links to look up each other\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, renderTexture, 0);\n\t\tframeBuffer._renderTexture = renderTexture;\n\t\trenderTexture._frameBuffer = frameBuffer;\n\n\t\t// these keep track of themselves simply to reduce complexity of some lookup code\n\t\trenderTexture._storeID = this._textureDictionary.length;\n\t\tthis._textureDictionary[renderTexture._storeID] = renderTexture;\n\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\treturn renderTexture;\n\t};\n\n\t/**\n\t * Common utility function used to apply the correct texture processing parameters for the bound texture.\n\t * @method setTextureParams\n\t * @param  {WebGLRenderingContext} gl The canvas WebGL context object to draw into.\n\t * @param  {Boolean} [isPOT=false] Marks whether the texture is \"Power of Two\", this may allow better quality AA.\n\t */\n\tp.setTextureParams = function (gl, isPOT) {\n\t\tif (isPOT && this._antialias) {\n\t\t\t//non POT linear works in some devices, but performance is NOT good, investigate\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\t} else {\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t\t}\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\t};\n\n\t/**\n\t * Changes the webGL clear, aka \"background\" color to the provided value. A transparent clear is recommended, as\n\t * non-transparent colours may create undesired boxes around some visuals.\n\t *\n\t * The clear color will also be used for filters and other \"render textures\". The stage background will ignore the\n\t * transparency value and display a solid color normally. For the stage to recognize and use transparency it must be\n\t * created with the transparent flag set to `true` (see {{#crossLink \"StageGL/constructor\"}}{{/crossLink}})).\n\t *\n\t * Using \"transparent white\" to demonstrate, the valid data formats are as follows:\n\t * <ul>\n\t *     <li>\"#FFF\"</li>\n\t *     <li>\"#FFFFFF\"</li>\n\t *     <li>\"#FFFFFF00\"</li>\n\t *     <li>\"rgba(255,255,255,0.0)\"</li>\n\t * </ul>\n\t * @method setClearColor\n\t * @param {String|int} [color=0x00000000] The new color to use as the background\n\t */\n\tp.setClearColor = function (color) {\n\t\tvar r, g, b, a, output;\n\n\t\tif (typeof color == \"string\") {\n\t\t\tif (color.indexOf(\"#\") == 0) {\n\t\t\t\tif (color.length == 4) {\n\t\t\t\t\tcolor = \"#\" + color.charAt(1)+color.charAt(1) + color.charAt(2)+color.charAt(2) + color.charAt(3)+color.charAt(3)\n\t\t\t\t}\n\t\t\t\tr = Number(\"0x\"+color.slice(1, 3))/255;\n\t\t\t\tg = Number(\"0x\"+color.slice(3, 5))/255;\n\t\t\t\tb = Number(\"0x\"+color.slice(5, 7))/255;\n\t\t\t\ta = Number(\"0x\"+color.slice(7, 9))/255;\n\t\t\t} else if (color.indexOf(\"rgba(\") == 0) {\n\t\t\t\toutput = color.slice(5, -1).split(\",\");\n\t\t\t\tr = Number(output[0])/255;\n\t\t\t\tg = Number(output[1])/255;\n\t\t\t\tb = Number(output[2])/255;\n\t\t\t\ta = Number(output[3]);\n\t\t\t}\n\t\t} else {\t// >>> is an unsigned shift which is what we want as 0x80000000 and up are negative values\n\t\t\tr = ((color & 0xFF000000) >>> 24)/255;\n\t\t\tg = ((color & 0x00FF0000) >>> 16)/255;\n\t\t\tb = ((color & 0x0000FF00) >>> 8)/255;\n\t\t\ta = (color & 0x000000FF)/255;\n\t\t}\n\n\t\tthis._clearColor.r = r || 0;\n\t\tthis._clearColor.g = g || 0;\n\t\tthis._clearColor.b = b || 0;\n\t\tthis._clearColor.a = a || 0;\n\n\t\tif (!this._webGLContext) { return; }\n\t\tthis._webGLContext.clearColor(this._clearColor.r, this._clearColor.g, this._clearColor.b, this._clearColor.a);\n\t};\n\n\t/**\n\t * docced in subclass\n\t */\n\tp.toString = function () {\n\t\treturn \"[StageGL (name=\"+  this.name +\")]\";\n\t};\n\n// private methods:\n\t/**\n\t * Sets up and returns the WebGL context for the canvas. May return undefined in error scenarios. These can include \n\t * situations where the canvas element already has a context, 2D or GL.\n\t * @param  {Canvas} canvas The DOM canvas element to attach to\n\t * @param  {Object} options The options to be handed into the WebGL object, see WebGL spec\n\t * @method _fetchWebGLContext\n\t * @protected\n\t * @return {WebGLRenderingContext} The WebGL context, may return undefined in error scenarios\n\t */\n\tp._fetchWebGLContext = function (canvas, options) {\n\t\tvar gl;\n\n\t\ttry {\n\t\t\tgl = canvas.getContext(\"webgl\", options) || canvas.getContext(\"experimental-webgl\", options);\n\t\t} catch (e) {\n\t\t\t// don't do anything in catch, null check will handle it\n\t\t}\n\n\t\tif (!gl) {\n\t\t\tvar msg = \"Could not initialize WebGL\";\n\t\t\tconsole.error?console.error(msg):console.log(msg);\n\t\t} else {\n\t\t\tgl.viewportWidth = canvas.width;\n\t\t\tgl.viewportHeight = canvas.height;\n\t\t}\n\n\t\treturn gl;\n\t};\n\n\t/**\n\t * Create the completed Shader Program from the vertex and fragment shaders. Allows building of custom shaders for\n\t * filters. Once compiled, shaders are saved so. If the Shader code requires dynamic alterations re-run this function\n\t * to generate a new shader.\n\t * @method _fetchShaderProgram\n\t * @param  {WebGLRenderingContext} gl The canvas WebGL context object to draw into.\n\t * @param  {String} [shaderName=\"regular\"] Working values: \"regular\", \"override\", and \"filter\". Which type of shader to build.\n\t * Filter and override both accept the custom params. Regular and override have all features. Filter is a special case reduced feature shader meant to be over-ridden.\n\t * @param  {String} [customVTX] Extra vertex shader information to replace a regular draw, see \n\t * {{#crossLink \"StageGL/COVER_VERTEX_BODY\"}}{{/crossLink}} for default and {{#crossLink \"Filter\"}}{{/crossLink}} for examples.\n\t * @param  {String} [customFRAG] Extra fragment shader information to replace a regular draw, see \n\t * {{#crossLink \"StageGL/COVER_FRAGMENT_BODY\"}}{{/crossLink}} for default and {{#crossLink \"Filter\"}}{{/crossLink}} for examples.\n\t * @param  {Function} [shaderParamSetup] Function to run so custom shader parameters can get applied for the render.\n\t * @protected\n\t * @return {WebGLProgram} The compiled and linked shader\n\t */\n\tp._fetchShaderProgram = function (gl, shaderName, customVTX, customFRAG, shaderParamSetup) {\n\t\tgl.useProgram(null);\t\t// safety to avoid collisions\n\n\t\t// build the correct shader string out of the right headers and bodies\n\t\tvar targetFrag, targetVtx;\n\t\tswitch (shaderName) {\n\t\t\tcase \"filter\":\n\t\t\t\ttargetVtx = StageGL.COVER_VERTEX_HEADER + (customVTX || StageGL.COVER_VERTEX_BODY);\n\t\t\t\ttargetFrag = StageGL.COVER_FRAGMENT_HEADER + (customFRAG || StageGL.COVER_FRAGMENT_BODY);\n\t\t\t\tbreak;\n\t\t\tcase \"particle\": //TODO\n\t\t\t\ttargetVtx = StageGL.REGULAR_VERTEX_HEADER + StageGL.PARTICLE_VERTEX_BODY;\n\t\t\t\ttargetFrag = StageGL.REGULAR_FRAGMENT_HEADER + StageGL.PARTICLE_FRAGMENT_BODY;\n\t\t\t\tbreak;\n\t\t\tcase \"override\":\n\t\t\t\ttargetVtx = StageGL.REGULAR_VERTEX_HEADER + (customVTX || StageGL.REGULAR_VERTEX_BODY);\n\t\t\t\ttargetFrag = StageGL.REGULAR_FRAGMENT_HEADER + (customFRAG || StageGL.REGULAR_FRAGMENT_BODY);\n\t\t\t\tbreak;\n\t\t\tcase \"regular\":\n\t\t\tdefault:\n\t\t\t\ttargetVtx = StageGL.REGULAR_VERTEX_HEADER + StageGL.REGULAR_VERTEX_BODY;\n\t\t\t\ttargetFrag = StageGL.REGULAR_FRAGMENT_HEADER + StageGL.REGULAR_FRAGMENT_BODY;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// create the separate vars\n\t\tvar vertexShader = this._createShader(gl, gl.VERTEX_SHADER, targetVtx);\n\t\tvar fragmentShader = this._createShader(gl, gl.FRAGMENT_SHADER, targetFrag);\n\n\t\t// link them together\n\t\tvar shaderProgram = gl.createProgram();\n\t\tgl.attachShader(shaderProgram, vertexShader);\n\t\tgl.attachShader(shaderProgram, fragmentShader);\n\t\tgl.linkProgram(shaderProgram);\n\t\tshaderProgram._type = shaderName;\n\n\t\t// check compile status\n\t\tif (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {\n\t\t\tgl.useProgram(this._activeShader);\n\t\t\tthrow gl.getProgramInfoLog(shaderProgram);\n\t\t}\n\n\t\t// set up the parameters on the shader\n\t\tgl.useProgram(shaderProgram);\n\t\tswitch (shaderName) {\n\t\t\tcase \"filter\":\n\t\t\t\t// get the places in memory the shader is stored so we can feed information into them\n\t\t\t\t// then save it off on the shader because it's so tied to the shader itself\n\t\t\t\tshaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, \"vertexPosition\");\n\t\t\t\tgl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);\n\n\t\t\t\tshaderProgram.uvPositionAttribute = gl.getAttribLocation(shaderProgram, \"uvPosition\");\n\t\t\t\tgl.enableVertexAttribArray(shaderProgram.uvPositionAttribute);\n\n\t\t\t\tshaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, \"uSampler\");\n\t\t\t\tgl.uniform1i(shaderProgram.samplerUniform, 0);\n\n\t\t\t\tshaderProgram.uprightUniform = gl.getUniformLocation(shaderProgram, \"uUpright\");\n\t\t\t\tgl.uniform1f(shaderProgram.uprightUniform, 0);\n\n\t\t\t\t// if there's some custom attributes be sure to hook them up\n\t\t\t\tif (shaderParamSetup) {\n\t\t\t\t\tshaderParamSetup(gl, this, shaderProgram);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"override\":\n\t\t\tcase \"particle\":\n\t\t\tcase \"regular\":\n\t\t\tdefault:\n\t\t\t\t// get the places in memory the shader is stored so we can feed information into them\n\t\t\t\t// then save it off on the shader because it's so tied to the shader itself\n\t\t\t\tshaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, \"vertexPosition\");\n\t\t\t\tgl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);\n\n\t\t\t\tshaderProgram.uvPositionAttribute = gl.getAttribLocation(shaderProgram, \"uvPosition\");\n\t\t\t\tgl.enableVertexAttribArray(shaderProgram.uvPositionAttribute);\n\n\t\t\t\tshaderProgram.textureIndexAttribute = gl.getAttribLocation(shaderProgram, \"textureIndex\");\n\t\t\t\tgl.enableVertexAttribArray(shaderProgram.textureIndexAttribute);\n\n\t\t\t\tshaderProgram.alphaAttribute = gl.getAttribLocation(shaderProgram, \"objectAlpha\");\n\t\t\t\tgl.enableVertexAttribArray(shaderProgram.alphaAttribute);\n\n\t\t\t\tvar samplers = [];\n\t\t\t\tfor (var i = 0; i < this._batchTextureCount; i++) {\n\t\t\t\t\tsamplers[i] = i;\n\t\t\t\t}\n\n\t\t\t\tshaderProgram.samplerData = samplers;\n\t\t\t\tshaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, \"uSampler\");\n\t\t\t\tgl.uniform1iv(shaderProgram.samplerUniform, samplers);\n\n\t\t\t\tshaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, \"pMatrix\");\n\t\t\t\tbreak;\n\t\t}\n\n\t\tgl.useProgram(this._activeShader);\n\t\treturn shaderProgram;\n\t};\n\n\t/**\n\t * Creates a shader from the specified string replacing templates. Template items are defined via `{{` `key` `}}``.\n\t * @method _createShader\n\t * @param  {WebGLRenderingContext} gl The canvas WebGL context object to draw into.\n\t * @param  {Number} type The type of shader to create. gl.VERTEX_SHADER | gl.FRAGMENT_SHADER\n\t * @param  {String} str The definition for the shader.\n\t * @return {WebGLShader}\n\t * @protected\n\t */\n\tp._createShader = function (gl, type, str) {\n\t\t// inject the static number\n\t\tstr = str.replace(/{{count}}/g, this._batchTextureCount);\n\n\t\t// resolve issue with no dynamic samplers by creating correct samplers in if else chain\n\t\t// TODO: WebGL 2.0 does not need this support\n\t\tvar insert = \"\";\n\t\tfor (var i = 1; i<this._batchTextureCount; i++) {\n\t\t\tinsert += \"} else if (indexPicker <= \"+ i +\".5) { color = texture2D(uSampler[\"+ i +\"], vTextureCoord);\";\n\t\t}\n\t\tstr = str.replace(/{{alternates}}/g, insert);\n\t\tstr = str.replace(/{{fragColor}}/g, this._premultiply ? StageGL.REGULAR_FRAG_COLOR_PREMULTIPLY : StageGL.REGULAR_FRAG_COLOR_NORMAL);\n\n\t\t// actually compile the shader\n\t\tvar shader = gl.createShader(type);\n\t\tgl.shaderSource(shader, str);\n\t\tgl.compileShader(shader);\n\n\t\t// check compile status\n\t\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\t\tthrow gl.getShaderInfoLog(shader);\n\t\t}\n\n\t\treturn shader;\n\t};\n\n\t/**\n\t * Sets up the necessary vertex property buffers, including position and U/V.\n\t * @method _createBuffers\n\t * @param {WebGLRenderingContext} gl\n\t * @protected\n\t */\n\tp._createBuffers = function (gl) {\n\t\tvar groupCount = this._maxCardsPerBatch * StageGL.INDICIES_PER_CARD;\n\t\tvar groupSize, i, l;\n\n\t\t// INFO:\n\t\t// all buffers are created using this pattern\n\t\t// create a WebGL buffer\n\t\t// attach it to context\n\t\t// figure out how many parts it has to an entry\n\t\t// fill it with empty data to reserve the memory\n\t\t// attach the empty data to the GPU\n\t\t// track the sizes on the buffer object\n\n\t\t// INFO:\n\t\t// a single buffer may be optimal in some situations and would be approached like this,\n\t\t// currently not implemented due to lack of need and potential complications with drawCover\n\n\t\t// var vertexBuffer = this._vertexBuffer = gl.createBuffer();\n\t\t// gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);\n\t\t// groupSize = 2 + 2 + 1 + 1; //x/y, u/v, index, alpha\n\t\t// var vertexData = this._vertexData = new Float32Array(groupCount * groupSize);\n\t\t// for (i=0; i<vertexData.length; i+=groupSize) {\n\t\t// \tvertexData[i+0] = vertexData[i+1] = 0;\n\t\t// \tvertexData[i+2] = vertexData[i+3] = 0.5;\n\t\t// \tvertexData[i+4] = 0;\n\t\t// \tvertexData[i+5] = 1;\n\t\t// }\n\t\t// vertexBuffer.itemSize = groupSize;\n\t\t// vertexBuffer.numItems = groupCount;\n\t\t// TODO bechmark and test using unified buffer\n\n\t\t// the actual position information\n\t\tvar vertexPositionBuffer = this._vertexPositionBuffer = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vertexPositionBuffer);\n\t\tgroupSize = 2;\n\t\tvar vertices = this._vertices = new Float32Array(groupCount * groupSize);\n\t\tfor (i=0, l=vertices.length; i<l; i+=groupSize) { vertices[i] = vertices[i+1] = 0; }\n\t\tgl.bufferData(gl.ARRAY_BUFFER, vertices, gl.DYNAMIC_DRAW);\n\t\tvertexPositionBuffer.itemSize = groupSize;\n\t\tvertexPositionBuffer.numItems = groupCount;\n\n\t\t// where on the texture it gets its information\n\t\tvar uvPositionBuffer = this._uvPositionBuffer = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, uvPositionBuffer);\n\t\tgroupSize = 2;\n\t\tvar uvs = this._uvs = new Float32Array(groupCount * groupSize);\n\t\tfor (i=0, l=uvs.length; i<l; i+=groupSize) { uvs[i] = uvs[i+1] = 0; }\n\t\tgl.bufferData(gl.ARRAY_BUFFER, uvs, gl.DYNAMIC_DRAW);\n\t\tuvPositionBuffer.itemSize = groupSize;\n\t\tuvPositionBuffer.numItems = groupCount;\n\n\t\t// what texture it should use\n\t\tvar textureIndexBuffer = this._textureIndexBuffer = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, textureIndexBuffer);\n\t\tgroupSize = 1;\n\t\tvar indices = this._indices = new Float32Array(groupCount * groupSize);\n\t\tfor (i=0, l=indices.length; i<l; i++) { indices[i] = 0; }\n\t\tgl.bufferData(gl.ARRAY_BUFFER, indices, gl.DYNAMIC_DRAW);\n\t\ttextureIndexBuffer.itemSize = groupSize;\n\t\ttextureIndexBuffer.numItems = groupCount;\n\n\t\t// what alpha it should have\n\t\tvar alphaBuffer = this._alphaBuffer = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, alphaBuffer);\n\t\tgroupSize = 1;\n\t\tvar alphas = this._alphas = new Float32Array(groupCount * groupSize);\n\t\tfor (i=0, l=alphas.length; i<l; i++) { alphas[i] = 1; }\n\t\tgl.bufferData(gl.ARRAY_BUFFER, alphas, gl.DYNAMIC_DRAW);\n\t\talphaBuffer.itemSize = groupSize;\n\t\talphaBuffer.numItems = groupCount;\n\t};\n\n\t/**\n\t * Do all the setup steps for textures in the system.\n\t * @method _initTextures\n\t * @protected\n\t */\n\tp._initTextures = function () {\n\t\t//TODO: DHG: add a cleanup routine in here in case this happens mid stream\n\n\t\t// reset counters\n\t\tthis._lastTextureInsert = -1;\n\n\t\t// clear containers\n\t\tthis._textureDictionary = [];\n\t\tthis._textureIDs = {};\n\t\tthis._baseTextures = [];\n\t\tthis._batchTextures = [];\n\n\t\t// fill in blanks as it helps the renderer be stable while textures are loading and reduces need for safety code\n\t\tfor (var i=0; i<this._batchTextureCount;i++) {\n\t\t\tvar tex = this.getBaseTexture();\n\t\t\tthis._baseTextures[i] = this._batchTextures[i] = tex;\n\t\t\tif (!tex) {\n\t\t\t\tthrow \"Problems creating basic textures, known causes include using too much VRAM by not releasing WebGL texture instances\";\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Load a specific texture, accounting for potential delay, as it might not be preloaded.\n\t * @method _loadTextureImage\n\t * @param {WebGLRenderingContext} gl\n\t * @param {Image} image Actual image to be loaded\n\t * @return {WebGLTexture} The resulting Texture object\n\t * @protected\n\t */\n\tp._loadTextureImage = function (gl, image) {\n\t\tvar src = image.src;\n\n\t\tif (!src) {\n\t\t\t// one time canvas property setup\n\t\t\timage._isCanvas = true;\n\t\t\tsrc = image.src = \"canvas_\" + this._lastTrackedCanvas++;\n\t\t}\n\n\t\t// put the texture into our storage system\n\t\tvar storeID = this._textureIDs[src];\n\t\tif (storeID === undefined) {\n\t\t\tstoreID = this._textureIDs[src] = this._textureDictionary.length;\n\t\t}\n\t\tif (this._textureDictionary[storeID] === undefined) {\n\t\t\tthis._textureDictionary[storeID] = this.getBaseTexture();\n\t\t}\n\n\t\tvar texture = this._textureDictionary[storeID];\n\n\t\tif (texture) {\n\t\t\t// get texture params all set up\n\t\t\ttexture._batchID = this._batchID;\n\t\t\ttexture._storeID = storeID;\n\t\t\ttexture._imageData = image;\n\t\t\tthis._insertTextureInBatch(gl, texture);\n\n\t\t\t// get the data into the texture or wait for it to load\n\t\t\timage._storeID = storeID;\n\t\t\tif (image.complete || image.naturalWidth || image._isCanvas) {\t// is it already loaded\n\t\t\t\tthis._updateTextureImageData(gl, image);\n\t\t\t} else  {\n\t\t\t\timage.addEventListener(\"load\", this._updateTextureImageData.bind(this, gl, image));\n\t\t\t}\n\t\t} else {\n\t\t\t// we really really should have a texture, try to recover the error by using a saved empty texture so we don't crash\n\t\t\tvar msg = \"Problem creating desired texture, known causes include using too much VRAM by not releasing WebGL texture instances\";\n\t\t\t(console.error && console.error(msg)) || console.log(msg);\n\n\t\t\ttexture = this._baseTextures[0];\n\t\t\ttexture._batchID = this._batchID;\n\t\t\ttexture._storeID = -1;\n\t\t\ttexture._imageData = texture;\n\t\t\tthis._insertTextureInBatch(gl, texture);\n\t\t}\n\n\t\treturn texture;\n\t};\n\n\t/**\n\t * Necessary to upload the actual image data to the GPU. Without this the texture will be blank. Called automatically\n\t * in most cases due to loading and caching APIs. Flagging an image source with `_invalid = true` will trigger this\n\t * next time the image is rendered.\n\t * @param {WebGLRenderingContext} gl\n\t * @param {Image | Canvas} image The image data to be uploaded\n\t * @protected\n\t */\n\tp._updateTextureImageData = function (gl, image) {\n\t\t// the bitwise & is intentional, cheap exponent 2 check\n\t\tvar isNPOT = (image.width & image.width-1) || (image.height & image.height-1);\n\t\tvar texture = this._textureDictionary[image._storeID];\n\n\t\tgl.activeTexture(gl.TEXTURE0 + texture._activeIndex);\n\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\n\t\ttexture.isPOT = !isNPOT;\n\t\tthis.setTextureParams(gl, texture.isPOT);\n\n\t\ttry {\n\t\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n\t\t} catch(e) {\n\t\t\tvar errString = \"\\nAn error has occurred. This is most likely due to security restrictions on WebGL images with local or cross-domain origins\";\n\t\t\tif(console.error) {\n\t\t\t\t//TODO: LM: I recommend putting this into a log function internally, since you do it so often, and each is implemented differently.\n\t\t\t\tconsole.error(errString);\n\t\t\t\tconsole.error(e);\n\t\t\t} else if (console) {\n\t\t\t\tconsole.log(errString);\n\t\t\t\tconsole.log(e);\n\t\t\t}\n\t\t}\n\n\t\timage._invalid = false;\n\n\t\ttexture._w = image.width;\n\t\ttexture._h = image.height;\n\n\t\tif (this.vocalDebug) {\n\t\t\tif (isNPOT) {\n\t\t\t\tconsole.warn(\"NPOT(Non Power of Two) Texture: \"+ image.src);\n\t\t\t}\n\t\t\tif (image.width > gl.MAX_TEXTURE_SIZE || image.height > gl.MAX_TEXTURE_SIZE){\n\t\t\t\tconsole && console.error(\"Oversized Texture: \"+ image.width+\"x\"+image.height +\" vs \"+ gl.MAX_TEXTURE_SIZE +\"max\");\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Adds the texture to a spot in the current batch, forcing a draw if no spots are free.\n\t * @method _insertTextureInBatch\n\t * @param {WebGLRenderingContext} gl The canvas WebGL context object to draw into.\n\t * @param {WebGLTexture} texture The texture to be inserted.\n\t * @protected\n\t */\n\tp._insertTextureInBatch = function (gl, texture) {\n\t\t// if it wasn't used last batch\n\t\tif (this._batchTextures[texture._activeIndex] !== texture) {\n\t\t\t// we've got to find it a a spot.\n\t\t\tvar found = -1;\n\t\t\tvar start = (this._lastTextureInsert+1) % this._batchTextureCount;\n\t\t\tvar look = start;\n\t\t\tdo {\n\t\t\t\tif (this._batchTextures[look]._batchID != this._batchID && !this._slotBlacklist[look]) {\n\t\t\t\t\tfound = look;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tlook = (look+1) % this._batchTextureCount;\n\t\t\t} while (look !== start);\n\n\t\t\t// we couldn't find anywhere for it go, meaning we're maxed out\n\t\t\tif (found === -1) {\n\t\t\t\tthis.batchReason = \"textureOverflow\";\n\t\t\t\tthis._drawBuffers(gl);\t\t// <------------------------------------------------------------------------\n\t\t\t\tthis.batchCardCount = 0;\n\t\t\t\tfound = start;\n\t\t\t}\n\n\t\t\t// lets put it into that spot\n\t\t\tthis._batchTextures[found] = texture;\n\t\t\ttexture._activeIndex = found;\n\t\t\tvar image = texture._imageData;\n\t\t\tif (image && image._invalid && texture._drawID !== undefined) {\n\t\t\t\tthis._updateTextureImageData(gl, image);\n\t\t\t} else {\n\t\t\t\tgl.activeTexture(gl.TEXTURE0 + found);\n\t\t\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\t\t\t\tthis.setTextureParams(gl);\n\t\t\t}\n\t\t\tthis._lastTextureInsert = found;\n\t\t} else {\n\t\t\tvar image = texture._imageData;\n\t\t\tif (texture._storeID != undefined && image && image._invalid) {\n\t\t\t\tthis._updateTextureImageData(gl, image);\n\t\t\t}\n\t\t}\n\n\t\ttexture._drawID = this._drawID;\n\t\ttexture._batchID = this._batchID;\n\t};\n\n\t/**\n\t * Remove and clean the texture, expects a texture and is inflexible. Mostly for internal use, recommended to call \n\t * {{#crossLink \"StageGL/releaseTexture\"}}{{/crossLink}} instead as it will call this with the correct texture object(s).\n\t * Note: Testing shows this may not happen immediately, have to wait frames for WebGL to have actually adjust memory.\n\t * @method _killTextureObject\n\t * @param {Texture} tex The texture to be cleaned out\n\t * @protected\n\t */\n\tp._killTextureObject = function (tex) {\n\t\tif (!tex) { return; }\n\t\tvar gl = this._webGLContext;\n\n\t\t// remove linkage\n\t\tif (tex._storeID !== undefined && tex._storeID >= 0) {\n\t\t\tthis._textureDictionary[tex._storeID] = undefined;\n\t\t\tfor (var n in this._textureIDs) {\n\t\t\t\tif (this._textureIDs[n] == tex._storeID) { delete this._textureIDs[n]; }\n\t\t\t}\n\t\t\tif(tex._imageData) { tex._imageData._storeID = undefined; }\n\t\t\ttex._imageData = tex._storeID = undefined;\n\t\t}\n\n\t\t// make sure to drop it out of an active slot\n\t\tif (tex._activeIndex !== undefined && this._batchTextures[tex._activeIndex] === tex) {\n\t\t\tthis._batchTextures[tex._activeIndex] = this._baseTextures[tex._activeIndex];\n\t\t}\n\n\t\t// remove buffers if present\n\t\ttry {\n\t\t\tif (tex._frameBuffer) { gl.deleteFramebuffer(tex._frameBuffer); }\n\t\t\ttex._frameBuffer = undefined;\n\t\t} catch(e) {\n\t\t\t/* suppress delete errors because it's already gone or didn't need deleting probably */\n\t\t\tif (this.vocalDebug) { console.log(e); }\n\t\t}\n\n\t\t// remove entry\n\t\ttry {\n\t\t\tgl.deleteTexture(tex);\n\t\t} catch(e) {\n\t\t\t/* suppress delete errors because it's already gone or didn't need deleting probably */\n\t\t\tif (this.vocalDebug) { console.log(e); }\n\t\t}\n\t};\n\n\t/**\n\t * Store or restore current batch textures into a backup array\n\t * @method _backupBatchTextures\n\t * @param {Boolean} restore Perform a restore instead of a store.\n\t * @param {Array} [target=this._backupTextures] Where to perform the backup, defaults to internal backup.\n\t * @protected\n\t */\n\tp._backupBatchTextures = function (restore, target) {\n\t\tvar gl = this._webGLContext;\n\n\t\tif (!this._backupTextures) { this._backupTextures = []; }\n\t\tif (target === undefined) { target = this._backupTextures; }\n\n\t\tfor (var i=0; i<this._batchTextureCount; i++) {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + i);\n\t\t\tif (restore) {\n\t\t\t\tthis._batchTextures[i] = target[i];\n\t\t\t} else {\n\t\t\t\ttarget[i] = this._batchTextures[i];\n\t\t\t\tthis._batchTextures[i] = this._baseTextures[i];\n\t\t\t}\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, this._batchTextures[i]);\n\t\t\tthis.setTextureParams(gl, this._batchTextures[i].isPOT);\n\t\t}\n\n\t\tif (restore && target === this._backupTextures) { this._backupTextures = []; }\n\t};\n\n\t/**\n\t * Begin the drawing process for a regular render.\n\t * @method _batchDraw\n\t * @param {WebGLRenderingContext} gl The canvas WebGL context object to draw into.\n\t * @param {Stage || Container} sceneGraph {{#crossLink \"Container\"}}{{/crossLink}} object with all that needs to rendered, preferably a Stage.\n\t * @param {Boolean} ignoreCache\n\t * @protected\n\t */\n\tp._batchDraw = function (sceneGraph, gl, ignoreCache) {\n\t\tif (this._isDrawing > 0) {\n\t\t\tthis._drawBuffers(gl);\n\t\t}\n\t\tthis._isDrawing++;\n\t\tthis._drawID++;\n\n\t\tthis.batchCardCount = 0;\n\t\tthis.depth = 0;\n\n\t\tthis._appendToBatchGroup(sceneGraph, gl, new createjs.Matrix2D(), this.alpha, ignoreCache);\n\n\t\tthis.batchReason = \"drawFinish\";\n\t\tthis._drawBuffers(gl);\t\t\t\t\t\t\t\t// <--------------------------------------------------------\n\t\tthis._isDrawing--;\n\t};\n\n\t/**\n\t * Perform the drawing process to fill a specific cache texture, including applying filters.\n\t * @method _cacheDraw\n\t * @param {DisplayObject} target The object we're drawing into the cache. For example, used for drawing the cache\n\t * (to prevent it from simply drawing an existing cache back into itself).\n\t * @param {Array} filters The filters we're drawing into cache.\n\t * @param {BitmapCache} manager The BitmapCache instance looking after the cache\n\t * @protected\n\t */\n\tp._cacheDraw = function (gl, target, filters, manager) {\n\t\t/*\n\t\tImplicitly there are 4 modes to this function: filtered-sameContext, filtered-uniqueContext, sameContext, uniqueContext.\n\t\tEach situation must be handled slightly differently as 'sameContext' or 'uniqueContext' define how the output works,\n\t\tone drawing directly into the main context and the other drawing into a stored renderTexture respectively.\n\t\tWhen the draw is a 'filtered' draw, the filters are applied sequentially and will draw into saved textures repeatedly.\n\t\tOnce the final filter is done the final output is treated depending upon whether it is a same or unique context.\n\t\tThe internal complexity comes from reducing over-draw, shared code, and issues like textures needing to be flipped\n\t\tsometimes when written to render textures.\n\t\t*/\n\t\tvar renderTexture;\n\t\tvar shaderBackup = this._activeShader;\n\t\tvar blackListBackup = this._slotBlacklist;\n\t\tvar lastTextureSlot = this._maxTextureSlots-1;\n\t\tvar wBackup = this._viewportWidth, hBackup = this._viewportHeight;\n\n\t\t// protect the last slot so that we have somewhere to bind the renderTextures so it doesn't get upset\n\t\tthis.protectTextureSlot(lastTextureSlot, true);\n\n\t\t// create offset container for drawing item\n\t\tvar mtx = target.getMatrix();\n\t\tmtx = mtx.clone();\n\t\tmtx.scale(1/manager.scale, 1/manager.scale);\n\t\tmtx = mtx.invert();\n\t\tmtx.translate(-manager.offX/manager.scale*target.scaleX, -manager.offY/manager.scale*target.scaleY);\n\t\tvar container = this._cacheContainer;\n\t\tcontainer.children = [target];\n\t\tcontainer.transformMatrix = mtx;\n\n\t\tthis._backupBatchTextures(false);\n\n\t\tif (filters && filters.length) {\n\t\t\tthis._drawFilters(target, filters, manager);\n\t\t} else {\n\t\t\t// is this for another stage or mine?\n\t\t\tif (this.isCacheControlled) {\n\t\t\t\t// draw item to canvas\t\t\t\tI -> C\n\t\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t\t\tthis._batchDraw(container, gl, true);\n\t\t\t} else {\n\t\t\t\tgl.activeTexture(gl.TEXTURE0 + lastTextureSlot);\n\t\t\t\ttarget.cacheCanvas = this.getTargetRenderTexture(target, manager._drawWidth, manager._drawHeight);\n\t\t\t\trenderTexture = target.cacheCanvas;\n\n\t\t\t\t// draw item to render texture\t\tI -> T\n\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, renderTexture._frameBuffer);\n\t\t\t\tthis.updateViewport(manager._drawWidth, manager._drawHeight);\n\t\t\t\tthis._projectionMatrix = this._projectionMatrixFlip;\n\t\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t\t\tthis._batchDraw(container, gl, true);\n\n\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\t\tthis.updateViewport(wBackup, hBackup);\n\t\t\t}\n\t\t}\n\n\t\tthis._backupBatchTextures(true);\n\n\t\tthis.protectTextureSlot(lastTextureSlot, false);\n\t\tthis._activeShader = shaderBackup;\n\t\tthis._slotBlacklist = blackListBackup;\n\t};\n\n\t/**\n\t * Sub portion of _cacheDraw, split off for readability. Do not call independently.\n\t * @method _drawFilters\n\t * @param {DisplayObject} target The object we're drawing with a filter.\n\t * @param {Array} filters The filters we're drawing into cache.\n\t * @param {BitmapCache} manager The BitmapCache instance looking after the cache\n\t */\n\tp._drawFilters = function (target, filters, manager) {\n\t\tvar gl = this._webGLContext;\n\t\tvar renderTexture;\n\t\tvar lastTextureSlot = this._maxTextureSlots-1;\n\t\tvar wBackup = this._viewportWidth, hBackup = this._viewportHeight;\n\n\t\tvar container = this._cacheContainer;\n\t\tvar filterCount = filters.length;\n\n\t\t// we don't know which texture slot we're dealing with previously and we need one out of the way\n\t\t// once we're using that slot activate it so when we make and bind our RenderTexture it's safe there\n\t\tgl.activeTexture(gl.TEXTURE0 + lastTextureSlot);\n\t\trenderTexture = this.getTargetRenderTexture(target, manager._drawWidth, manager._drawHeight);\n\n\t\t// draw item to render texture\t\tI -> T\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, renderTexture._frameBuffer);\n\t\tthis.updateViewport(manager._drawWidth, manager._drawHeight);\n\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\tthis._batchDraw(container, gl, true);\n\n\t\t// bind the result texture to slot 0 as all filters and cover draws assume original content is in slot 0\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.bindTexture(gl.TEXTURE_2D, renderTexture);\n\t\tthis.setTextureParams(gl);\n\n\t\tvar flipY = false;\n\t\tvar i = 0, filter = filters[i];\n\t\tdo { // this is safe because we wouldn't be in apply filters without a filter count of at least 1\n\n\t\t\t// swap to correct shader\n\t\t\tthis._activeShader = this.getFilterShader(filter);\n\t\t\tif (!this._activeShader) { continue; }\n\n\t\t\t// now the old result is stored in slot 0, make a new render texture\n\t\t\tgl.activeTexture(gl.TEXTURE0 + lastTextureSlot);\n\t\t\trenderTexture = this.getTargetRenderTexture(target, manager._drawWidth, manager._drawHeight);\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, renderTexture._frameBuffer);\n\n\t\t\t// draw result to render texture\tR -> T\n\t\t\tgl.viewport(0, 0, manager._drawWidth, manager._drawHeight);\n\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t\tthis._drawCover(gl, flipY);\n\n\t\t\t// bind the result texture to slot 0 as all filters and cover draws assume original content is in slot 0\n\t\t\tgl.activeTexture(gl.TEXTURE0);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, renderTexture);\n\t\t\tthis.setTextureParams(gl);\n\n\t\t\t// use flipping to keep things upright, things already cancel out on a single filter\n\t\t\t// this needs to be here as multiPass is not accurate to _this_ frame until after shader acquisition\n\t\t\tif (filterCount > 1 || filters[0]._multiPass) {\n\t\t\t\tflipY = !flipY;\n\t\t\t}\n\n\t\t\t// work through the multipass if it's there, otherwise move on\n\t\t\tfilter = filter._multiPass !== null ? filter._multiPass : filters[++i];\n\t\t} while (filter);\n\n\t\t// is this for another stage or mine\n\t\tif (this.isCacheControlled) {\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\tthis.updateViewport(wBackup, hBackup);\n\n\t\t\t// draw result to canvas\t\t\tR -> C\n\t\t\tthis._activeShader = this.getFilterShader(this);\n\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t\tthis._drawCover(gl, flipY);\n\t\t} else {\n\t\t\t//TODO: DHG: this is less than ideal. A flipped initial render for this circumstance might help. Adjust the perspective matrix?\n\t\t\tif (flipY) {\n\t\t\t\tgl.activeTexture(gl.TEXTURE0 + lastTextureSlot);\n\t\t\t\trenderTexture = this.getTargetRenderTexture(target, manager._drawWidth, manager._drawHeight);\n\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, renderTexture._frameBuffer);\n\n\t\t\t\tthis._activeShader = this.getFilterShader(this);\n\t\t\t\tgl.viewport(0, 0, manager._drawWidth, manager._drawHeight);\n\t\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t\t\tthis._drawCover(gl, !flipY);\n\t\t\t}\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\tthis.updateViewport(wBackup, hBackup);\n\n\t\t\t// make sure the last texture is the active thing to draw\n\t\t\ttarget.cacheCanvas = renderTexture;\n\t\t}\n\t};\n\n\t/**\n\t * Add all the contents of a container to the pending buffers, called recursively on each container. This may\n\t * trigger a draw if a buffer runs out of space. This is the main workforce of the render loop.\n\t * @method _appendToBatchGroup\n\t * @param {Container} container The {{#crossLink \"Container\"}}{{/crossLink}} that contains everything to be drawn.\n\t * @param {WebGLRenderingContext} gl The canvas WebGL context object to draw into.\n\t * @param {Matrix2D} concatMtx The effective (concatenated) transformation matrix when beginning this container\n\t * @param {Number} concatAlpha The effective (concatenated) alpha when beginning this container\n\t * @param {Boolean} ignoreCache Don't use an element's cache during this draw\n\t * @protected\n\t */\n\tp._appendToBatchGroup = function (container, gl, concatMtx, concatAlpha, ignoreCache) {\n\t\t// sort out shared properties\n\t\tif (!container._glMtx) { container._glMtx = new createjs.Matrix2D(); }\n\t\tvar cMtx = container._glMtx;\n\t\tcMtx.copy(concatMtx);\n\t\tif (container.transformMatrix) {\n\t\t\tcMtx.appendMatrix(container.transformMatrix);\n\t\t} else {\n\t\t\tcMtx.appendTransform(\n\t\t\t\tcontainer.x, container.y,\n\t\t\t\tcontainer.scaleX, container.scaleY,\n\t\t\t\tcontainer.rotation, container.skewX, container.skewY,\n\t\t\t\tcontainer.regX, container.regY\n\t\t\t);\n\t\t}\n\n\t\t// sub components of figuring out the position an object holds\n\t\tvar subL, subT, subR, subB;\n\n\t\t// actually apply its data to the buffers\n\t\tvar l = container.children.length;\n\t\tfor (var i = 0; i < l; i++) {\n\t\t\tvar item = container.children[i];\n\n\t\t\tif (!(item.visible && concatAlpha)) { continue; }\n\t\t\tif (!item.cacheCanvas || ignoreCache) {\n\t\t\t\tif (item._updateState){\n\t\t\t\t\titem._updateState();\n\t\t\t\t}\n\t\t\t\tif (item.children) {\n\t\t\t\t\tthis._appendToBatchGroup(item, gl, cMtx, item.alpha * concatAlpha);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// check for overflowing batch, if yes then force a render\n\t\t\t// TODO: DHG: consider making this polygon count dependant for things like vector draws\n\t\t\tif (this.batchCardCount+1 > this._maxCardsPerBatch) {\n\t\t\t\tthis.batchReason = \"vertexOverflow\";\n\t\t\t\tthis._drawBuffers(gl);\t\t\t\t\t// <------------------------------------------------------------\n\t\t\t\tthis.batchCardCount = 0;\n\t\t\t}\n\n\t\t\t// keep track of concatenated position\n\t\t\tif (!item._glMtx) { item._glMtx = new createjs.Matrix2D(); }\n\t\t\tvar iMtx = item._glMtx;\n\t\t\tiMtx.copy(cMtx);\n\t\t\tif (item.transformMatrix) {\n\t\t\t\tiMtx.appendMatrix(item.transformMatrix);\n\t\t\t} else {\n\t\t\t\tiMtx.appendTransform(\n\t\t\t\t\titem.x, item.y,\n\t\t\t\t\titem.scaleX, item.scaleY,\n\t\t\t\t\titem.rotation, item.skewX, item.skewY,\n\t\t\t\t\titem.regX, item.regY\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tvar uvRect, texIndex, image, frame, texture, src;\n\t\t\tvar useCache = item.cacheCanvas && !ignoreCache;\n\n\t\t\tif (item._webGLRenderStyle === 2 || useCache) {\t\t\t// BITMAP / Cached Canvas\n\t\t\t\timage = (ignoreCache?false:item.cacheCanvas) || item.image;\n\t\t\t} else if (item._webGLRenderStyle === 1) {\t\t\t\t\t\t\t\t\t\t\t// SPRITE\n\t\t\t\tframe = item.spriteSheet.getFrame(item.currentFrame);\t//TODO: Faster way?\n\t\t\t\tif (frame === null) { continue; }\n\t\t\t\timage = frame.image;\n\t\t\t} else {\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// MISC (DOM objects render themselves later)\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar uvs = this._uvs;\n\t\t\tvar vertices = this._vertices;\n\t\t\tvar texI = this._indices;\n\t\t\tvar alphas = this._alphas;\n\n\t\t\t// calculate texture\n\t\t\tif (!image) { continue; }\n\t\t\tif (image._storeID === undefined) {\n\t\t\t\t// this texture is new to us so load it and add it to the batch\n\t\t\t\ttexture = this._loadTextureImage(gl, image);\n\t\t\t\tthis._insertTextureInBatch(gl, texture);\n\t\t\t} else {\n\t\t\t\t// fetch the texture (render textures know how to look themselves up to simplify this logic)\n\t\t\t\ttexture = this._textureDictionary[image._storeID];\n\t\t\t\tif (!texture){\n\t\t\t\t\tif (this.vocalDebug){ console.log(\"Texture should not be looked up while not being stored.\"); }\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// put it in the batch if needed\n\t\t\t\tif (texture._batchID !== this._batchID) {\n\t\t\t\t\tthis._insertTextureInBatch(gl, texture);\n\t\t\t\t}\n\t\t\t}\n\t\t\ttexIndex = texture._activeIndex;\n\n\t\t\tif (item._webGLRenderStyle === 2 || useCache) {\t\t\t// BITMAP / Cached Canvas\n\t\t\t\tif (!useCache && item.sourceRect) {\n\t\t\t\t\t// calculate uvs\n\t\t\t\t\tif (!item._uvRect) { item._uvRect = {}; }\n\t\t\t\t\tsrc = item.sourceRect;\n\t\t\t\t\tuvRect = item._uvRect;\n\t\t\t\t\tuvRect.t = (src.y)/image.height;\n\t\t\t\t\tuvRect.l = (src.x)/image.width;\n\t\t\t\t\tuvRect.b = (src.y + src.height)/image.height;\n\t\t\t\t\tuvRect.r = (src.x + src.width)/image.width;\n\n\t\t\t\t\t// calculate vertices\n\t\t\t\t\tsubL = 0;\t\t\t\t\t\t\tsubT = 0;\n\t\t\t\t\tsubR = src.width+subL;\t\t\t\tsubB = src.height+subT;\n\t\t\t\t} else {\n\t\t\t\t\t// calculate uvs\n\t\t\t\t\tuvRect = StageGL.UV_RECT;\n\t\t\t\t\t// calculate vertices\n\t\t\t\t\tif (useCache) {\n\t\t\t\t\t\tsrc = item.bitmapCache;\n\t\t\t\t\t\tsubL = src.x+(src._filterOffX/src.scale);\tsubT = src.y+(src._filterOffY/src.scale);\n\t\t\t\t\t\tsubR = (src._drawWidth/src.scale)+subL;\t\tsubB = (src._drawHeight/src.scale)+subT;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsubL = 0;\t\t\t\t\t\tsubT = 0;\n\t\t\t\t\t\tsubR = image.width+subL;\t\tsubB = image.height+subT;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (item._webGLRenderStyle === 1) {\t\t\t\t\t\t\t\t\t\t\t// SPRITE\n\t\t\t\tvar rect = frame.rect;\n\n\t\t\t\t// calculate uvs\n\t\t\t\tuvRect = frame.uvRect;\n\t\t\t\tif (!uvRect) {\n\t\t\t\t\tuvRect = StageGL.buildUVRects(item.spriteSheet, item.currentFrame, false);\n\t\t\t\t}\n\n\t\t\t\t// calculate vertices\n\t\t\t\tsubL = -frame.regX;\t\t\t\t\t\t\t\tsubT = -frame.regY;\n\t\t\t\tsubR = rect.width-frame.regX;\t\t\t\t\tsubB = rect.height-frame.regY;\n\t\t\t}\n\n\t\t\t// These must be calculated here else a forced draw might happen after they're set\n\t\t\tvar offV1 = this.batchCardCount*StageGL.INDICIES_PER_CARD;\t\t// offset for 1 component vectors\n\t\t\tvar offV2 = offV1*2;\t\t\t\t\t\t\t\t\t\t\t// offset for 2 component vectors\n\n\t\t\t//DHG: See Matrix2D.transformPoint for why this math specifically\n\t\t\t// apply vertices\n\t\t\tvertices[offV2] =\t\tsubL *iMtx.a + subT *iMtx.c +iMtx.tx;\t\tvertices[offV2+1] =\t\tsubL *iMtx.b + subT *iMtx.d +iMtx.ty;\n\t\t\tvertices[offV2+2] =\t\tsubL *iMtx.a + subB *iMtx.c +iMtx.tx;\t\tvertices[offV2+3] =\t\tsubL *iMtx.b + subB *iMtx.d +iMtx.ty;\n\t\t\tvertices[offV2+4] =\t\tsubR *iMtx.a + subT *iMtx.c +iMtx.tx;\t\tvertices[offV2+5] =\t\tsubR *iMtx.b + subT *iMtx.d +iMtx.ty;\n\t\t\tvertices[offV2+6] =\t\tvertices[offV2+2];\t\t\t\t\t\t\tvertices[offV2+7] =\t\tvertices[offV2+3];\n\t\t\tvertices[offV2+8] =\t\tvertices[offV2+4];\t\t\t\t\t\t\tvertices[offV2+9] =\t\tvertices[offV2+5];\n\t\t\tvertices[offV2+10] =\tsubR *iMtx.a + subB *iMtx.c +iMtx.tx;\t\tvertices[offV2+11] =\tsubR *iMtx.b + subB *iMtx.d +iMtx.ty;\n\n\t\t\t// apply uvs\n\t\t\tuvs[offV2] =\tuvRect.l;\t\t\tuvs[offV2+1] =\tuvRect.t;\n\t\t\tuvs[offV2+2] =\tuvRect.l;\t\t\tuvs[offV2+3] =\tuvRect.b;\n\t\t\tuvs[offV2+4] =\tuvRect.r;\t\t\tuvs[offV2+5] =\tuvRect.t;\n\t\t\tuvs[offV2+6] =\tuvRect.l;\t\t\tuvs[offV2+7] =\tuvRect.b;\n\t\t\tuvs[offV2+8] =\tuvRect.r;\t\t\tuvs[offV2+9] =\tuvRect.t;\n\t\t\tuvs[offV2+10] =\tuvRect.r;\t\t\tuvs[offV2+11] =\tuvRect.b;\n\n\t\t\t// apply texture\n\t\t\ttexI[offV1] = texI[offV1+1] = texI[offV1+2] = texI[offV1+3] = texI[offV1+4] = texI[offV1+5] = texIndex;\n\n\t\t\t// apply alpha\n\t\t\talphas[offV1] = alphas[offV1+1] = alphas[offV1+2] = alphas[offV1+3] = alphas[offV1+4] = alphas[offV1+5] = item.alpha * concatAlpha;\n\n\t\t\tthis.batchCardCount++;\n\t\t}\n\t};\n\n\t/**\n\t * Draws all the currently defined cards in the buffer to the render surface.\n\t * @method _drawBuffers\n\t * @param {WebGLRenderingContext} gl The canvas WebGL context object to draw into.\n\t * @protected\n\t */\n\tp._drawBuffers = function (gl) {\n\t\tif (this.batchCardCount <= 0) { return; }\t// prevents error logs on stages filled with un-renederable content.\n\n\t\tif (this.vocalDebug) {\n\t\t\tconsole.log(\"Draw[\"+ this._drawID +\":\"+ this._batchID +\"] : \"+ this.batchReason);\n\t\t}\n\t\tvar shaderProgram = this._activeShader;\n\t\tvar vertexPositionBuffer = this._vertexPositionBuffer;\n\t\tvar textureIndexBuffer = this._textureIndexBuffer;\n\t\tvar uvPositionBuffer = this._uvPositionBuffer;\n\t\tvar alphaBuffer = this._alphaBuffer;\n\n\t\tgl.useProgram(shaderProgram);\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vertexPositionBuffer);\n\t\tgl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, vertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\tgl.bufferSubData(gl.ARRAY_BUFFER, 0, this._vertices);\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, textureIndexBuffer);\n\t\tgl.vertexAttribPointer(shaderProgram.textureIndexAttribute, textureIndexBuffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\tgl.bufferSubData(gl.ARRAY_BUFFER, 0, this._indices);\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, uvPositionBuffer);\n\t\tgl.vertexAttribPointer(shaderProgram.uvPositionAttribute, uvPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\tgl.bufferSubData(gl.ARRAY_BUFFER, 0, this._uvs);\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, alphaBuffer);\n\t\tgl.vertexAttribPointer(shaderProgram.alphaAttribute, alphaBuffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\tgl.bufferSubData(gl.ARRAY_BUFFER, 0, this._alphas);\n\n\t\tgl.uniformMatrix4fv(shaderProgram.pMatrixUniform, gl.FALSE, this._projectionMatrix);\n\n\t\tfor (var i = 0; i < this._batchTextureCount; i++) {\n\t\t\tvar texture = this._batchTextures[i];\n\t\t\tgl.activeTexture(gl.TEXTURE0 + i);\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\t\t\tthis.setTextureParams(gl, texture.isPOT);\n\t\t}\n\n\t\tgl.drawArrays(gl.TRIANGLES, 0, this.batchCardCount*StageGL.INDICIES_PER_CARD);\n\t\tthis._batchID++;\n\t};\n\n\t/**\n\t * Draws a card that covers the entire render surface. Mainly used for filters.\n\t * @method _drawBuffers\n\t * @param {WebGLRenderingContext} gl The canvas WebGL context object to draw into.\n\t * @param {Boolean} flipY Covers are used for things like RenderTextures and because of 3D vs Canvas space this can\n\t * end up meaning the `y` space sometimes requires flipping in the render.\n\t * @protected\n\t */\n\tp._drawCover = function (gl, flipY) {\n\t\tif (this._isDrawing > 0) {\n\t\t\tthis._drawBuffers(gl);\n\t\t}\n\n\t\tif (this.vocalDebug) {\n\t\t\tconsole.log(\"Draw[\"+ this._drawID +\":\"+ this._batchID +\"] : \"+ \"Cover\");\n\t\t}\n\t\tvar shaderProgram = this._activeShader;\n\t\tvar vertexPositionBuffer = this._vertexPositionBuffer;\n\t\tvar uvPositionBuffer = this._uvPositionBuffer;\n\n\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\tgl.useProgram(shaderProgram);\n\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, vertexPositionBuffer);\n\t\tgl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, vertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\tgl.bufferSubData(gl.ARRAY_BUFFER, 0, StageGL.COVER_VERT);\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, uvPositionBuffer);\n\t\tgl.vertexAttribPointer(shaderProgram.uvPositionAttribute, uvPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);\n\t\tgl.bufferSubData(gl.ARRAY_BUFFER, 0, flipY?StageGL.COVER_UV_FLIP:StageGL.COVER_UV);\n\n\t\tgl.uniform1i(shaderProgram.samplerUniform, 0);\n\t\tgl.uniform1f(shaderProgram.uprightUniform, flipY?0:1);\n\n\t\tgl.drawArrays(gl.TRIANGLES, 0, StageGL.INDICIES_PER_CARD);\n\t};\n\n\tcreatejs.StageGL = createjs.promote(StageGL, \"Stage\");\n}());\n\n//##############################################################################\n// Bitmap.js\n//##############################################################################\n\n(function() {\n\t\n\t/**\n\t * A Bitmap represents an Image, Canvas, or Video in the display list. A Bitmap can be instantiated using an existing\n\t * HTML element, or a string.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t * \tvar bitmap = new createjs.Bitmap(\"imagePath.jpg\");\n\t *\n\t * <strong>Notes:</strong>\n\t * <ol>\n\t * \t<li>When using a video source that may loop or seek, use a {{#crossLink \"VideoBuffer\"}}{{/crossLink}} object to\n\t * \t prevent blinking / flashing.\n\t * \t<li>When a string path or image tag that is not yet loaded is used, the stage may need to be redrawn before it\n\t * \t will be displayed.</li>\n\t * \t<li>Bitmaps with an SVG source currently will not respect an alpha value other than 0 or 1. To get around this,\n\t * \tthe Bitmap can be cached.</li>\n\t * \t<li>Bitmaps with an SVG source will taint the canvas with cross-origin data, which prevents interactivity. This\n\t * \thappens in all browsers except recent Firefox builds.</li>\n\t * \t<li>Images loaded cross-origin will throw cross-origin security errors when interacted with using a mouse, using\n\t * \tmethods such as `getObjectUnderPoint`, or using filters, or caching. You can get around this by setting\n\t * \t`crossOrigin` flags on your images before passing them to EaselJS, eg: `img.crossOrigin=\"Anonymous\";`</li>\n\t * </ol>\n\t *\n\t * @class Bitmap\n\t * @extends DisplayObject\n\t * @constructor\n\t * @param {CanvasImageSource | String | Object} imageOrUri The source image to display. This can be a CanvasImageSource\n\t * (image, video, canvas), an object with a `getImage` method that returns a CanvasImageSource, or a string URL to an image.\n\t * If the latter, a new Image instance with the URL as its src will be used.\n\t **/\n\tfunction Bitmap(imageOrUri) {\n\t\tthis.DisplayObject_constructor();\n\t\t\n\t\t\n\t// public properties:\n\t\t/**\n\t\t * The source image to display. This can be a CanvasImageSource\n\t\t * (image, video, canvas), an object with a `getImage` method that returns a CanvasImageSource, or a string URL to an image.\n\t\t * If the latter, a new Image instance with the URL as its src will be used.\n\t\t * @property image\n\t\t * @type CanvasImageSource | Object\n\t\t **/\n\t\tif (typeof imageOrUri == \"string\") {\n\t\t\tthis.image = document.createElement(\"img\");\n\t\t\tthis.image.src = imageOrUri;\n\t\t} else {\n\t\t\tthis.image = imageOrUri;\n\t\t}\n\t\n\t\t/**\n\t\t * Specifies an area of the source image to draw. If omitted, the whole image will be drawn.\n\t\t * Notes:\n\t\t * <ul>\n\t\t *     <li>that video sources must have a width / height set to work correctly with `sourceRect`</li>\n\t\t *     <li>Cached objects will ignore the `sourceRect` property</li>\n\t\t * </ul>\n\t\t * @property sourceRect\n\t\t * @type Rectangle\n\t\t * @default null\n\t\t */\n\t\tthis.sourceRect = null;\n\n\t// private properties:\n\t\t/**\n\t\t * Docced in superclass.\n\t\t */\n\t\tthis._webGLRenderStyle = createjs.DisplayObject._StageGL_BITMAP;\n\t}\n\tvar p = createjs.extend(Bitmap, createjs.DisplayObject);\n\t\n\t\n// public methods:\n\t/**\n\t * Constructor alias for backwards compatibility. This method will be removed in future versions.\n\t * Subclasses should be updated to use {{#crossLink \"Utility Methods/extends\"}}{{/crossLink}}.\n\t * @method initialize\n\t * @deprecated in favour of `createjs.promote()`\n\t **/\n\tp.initialize = Bitmap; // TODO: deprecated.\n\n\t/**\n\t * Returns true or false indicating whether the display object would be visible if drawn to a canvas.\n\t * This does not account for whether it would be visible within the boundaries of the stage.\n\t *\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method isVisible\n\t * @return {Boolean} Boolean indicating whether the display object would be visible if drawn to a canvas\n\t **/\n\tp.isVisible = function() {\n\t\tvar image = this.image;\n\t\tvar hasContent = this.cacheCanvas || (image && (image.naturalWidth || image.getContext || image.readyState >= 2));\n\t\treturn !!(this.visible && this.alpha > 0 && this.scaleX != 0 && this.scaleY != 0 && hasContent);\n\t};\n\n\t/**\n\t * Draws the display object into the specified context ignoring its visible, alpha, shadow, and transform.\n\t * Returns true if the draw was handled (useful for overriding functionality).\n\t *\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method draw\n\t * @param {CanvasRenderingContext2D} ctx The canvas 2D context object to draw into.\n\t * @param {Boolean} [ignoreCache=false] Indicates whether the draw operation should ignore any current cache.\n\t * For example, used for drawing the cache (to prevent it from simply drawing an existing cache back\n\t * into itself).\n\t * @return {Boolean}\n\t **/\n\tp.draw = function(ctx, ignoreCache) {\n\t\tif (this.DisplayObject_draw(ctx, ignoreCache)) { return true; }\n\t\tvar img = this.image, rect = this.sourceRect;\n\t\tif (img.getImage) { img = img.getImage(); }\n\t\tif (!img) { return true; }\n\t\tif (rect) {\n\t\t\t// some browsers choke on out of bound values, so we'll fix them:\n\t\t\tvar x1 = rect.x, y1 = rect.y, x2 = x1 + rect.width, y2 = y1 + rect.height, x = 0, y = 0, w = img.width, h = img.height;\n\t\t\tif (x1 < 0) { x -= x1; x1 = 0; }\n\t\t\tif (x2 > w) { x2 = w; }\n\t\t\tif (y1 < 0) { y -= y1; y1 = 0; }\n\t\t\tif (y2 > h) { y2 = h; }\n\t\t\tctx.drawImage(img, x1, y1, x2-x1, y2-y1, x, y, x2-x1, y2-y1);\n\t\t} else {\n\t\t\tctx.drawImage(img, 0, 0);\n\t\t}\n\t\treturn true;\n\t};\n\t\n\t//Note, the doc sections below document using the specified APIs (from DisplayObject)  from\n\t//Bitmap. This is why they have no method implementations.\n\t\n\t/**\n\t * Because the content of a Bitmap is already in a simple format, cache is unnecessary for Bitmap instances.\n\t * You should <b>not</b> cache Bitmap instances as it can degrade performance.\n\t *\n\t * <strong>However: If you want to use a filter on a Bitmap, you <em>MUST</em> cache it, or it will not work.</strong>\n\t * To see the API for caching, please visit the DisplayObject {{#crossLink \"DisplayObject/cache\"}}{{/crossLink}}\n\t * method.\n\t * @method cache\n\t **/\n\t\n\t/**\n\t * Because the content of a Bitmap is already in a simple format, cache is unnecessary for Bitmap instances.\n\t * You should <b>not</b> cache Bitmap instances as it can degrade performance.\n\t *\n\t * <strong>However: If you want to use a filter on a Bitmap, you <em>MUST</em> cache it, or it will not work.</strong>\n\t * To see the API for caching, please visit the DisplayObject {{#crossLink \"DisplayObject/cache\"}}{{/crossLink}}\n\t * method.\n\t * @method updateCache\n\t **/\n\t\n\t/**\n\t * Because the content of a Bitmap is already in a simple format, cache is unnecessary for Bitmap instances.\n\t * You should <b>not</b> cache Bitmap instances as it can degrade performance.\n\t *\n\t * <strong>However: If you want to use a filter on a Bitmap, you <em>MUST</em> cache it, or it will not work.</strong>\n\t * To see the API for caching, please visit the DisplayObject {{#crossLink \"DisplayObject/cache\"}}{{/crossLink}}\n\t * method.\n\t * @method uncache\n\t **/\n\n\t/**\n\t * Docced in superclass.\n\t */\n\tp.getBounds = function() {\n\t\tvar rect = this.DisplayObject_getBounds();\n\t\tif (rect) { return rect; }\n\t\tvar image = this.image, o = this.sourceRect || image;\n\t\tvar hasContent = (image && (image.naturalWidth || image.getContext || image.readyState >= 2));\n\t\treturn hasContent ? this._rectangle.setValues(0, 0, o.width, o.height) : null;\n\t};\n\t\n\t/**\n\t * Returns a clone of the Bitmap instance.\n\t * @method clone\n\t * @param {Boolean} node Whether the underlying dom element should be cloned as well.\n\t * @return {Bitmap} a clone of the Bitmap instance.\n\t **/\n\tp.clone = function(node) {\n\t\tvar image = this.image;\n\t\tif(image && node){ image = image.cloneNode(); }\n\t\tvar o = new Bitmap(image);\n\t\tif (this.sourceRect) { o.sourceRect = this.sourceRect.clone(); }\n\t\tthis._cloneProps(o);\n\t\treturn o;\n\t};\n\t\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[Bitmap (name=\"+  this.name +\")]\";\n\t};\n\n\t\n\tcreatejs.Bitmap = createjs.promote(Bitmap, \"DisplayObject\");\n}());\n\n//##############################################################################\n// Sprite.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Displays a frame or sequence of frames (ie. an animation) from a SpriteSheet instance. A sprite sheet is a series of\n\t * images (usually animation frames) combined into a single image. For example, an animation consisting of 8 100x100\n\t * images could be combined into a 400x200 sprite sheet (4 frames across by 2 high). You can display individual frames,\n\t * play frames as an animation, and even sequence animations together.\n\t *\n\t * See the {{#crossLink \"SpriteSheet\"}}{{/crossLink}} class for more information on setting up frames and animations.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      var instance = new createjs.Sprite(spriteSheet);\n\t *      instance.gotoAndStop(\"frameName\");\n\t *\n\t * Until {{#crossLink \"Sprite/gotoAndStop\"}}{{/crossLink}} or {{#crossLink \"Sprite/gotoAndPlay\"}}{{/crossLink}} is called,\n\t * only the first defined frame defined in the sprite sheet will be displayed.\n\t *\n\t * @class Sprite\n\t * @extends DisplayObject\n\t * @constructor\n\t * @param {SpriteSheet} spriteSheet The SpriteSheet instance to play back. This includes the source image(s), frame\n\t * dimensions, and frame data. See {{#crossLink \"SpriteSheet\"}}{{/crossLink}} for more information.\n\t * @param {String|Number} [frameOrAnimation] The frame number or animation to play initially.\n\t **/\n\tfunction Sprite(spriteSheet, frameOrAnimation) {\n\t\tthis.DisplayObject_constructor();\n\t\t\n\t\t\n\t// public properties:\n\t\t/**\n\t\t * The frame index that will be drawn when draw is called. Note that with some {{#crossLink \"SpriteSheet\"}}{{/crossLink}}\n\t\t * definitions, this will advance non-sequentially. This will always be an integer value.\n\t\t * @property currentFrame\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t **/\n\t\tthis.currentFrame = 0;\n\t\n\t\t/**\n\t\t * Returns the name of the currently playing animation.\n\t\t * @property currentAnimation\n\t\t * @type {String}\n\t\t * @final\n\t\t * @readonly\n\t\t **/\n\t\tthis.currentAnimation = null;\n\t\n\t\t/**\n\t\t * Prevents the animation from advancing each tick automatically. For example, you could create a sprite\n\t\t * sheet of icons, set paused to true, and display the appropriate icon by setting <code>currentFrame</code>.\n\t\t * @property paused\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t **/\n\t\tthis.paused = true;\n\t\n\t\t/**\n\t\t * The SpriteSheet instance to play back. This includes the source image, frame dimensions, and frame\n\t\t * data. See {{#crossLink \"SpriteSheet\"}}{{/crossLink}} for more information.\n\t\t * @property spriteSheet\n\t\t * @type {SpriteSheet}\n\t\t * @readonly\n\t\t **/\n\t\tthis.spriteSheet = spriteSheet;\n\t\n\t\t/**\n\t\t * Specifies the current frame index within the currently playing animation. When playing normally, this will increase\n\t\t * from 0 to n-1, where n is the number of frames in the current animation.\n\t\t *\n\t\t * This could be a non-integer value if\n\t\t * using time-based playback (see {{#crossLink \"Sprite/framerate\"}}{{/crossLink}}, or if the animation's speed is\n\t\t * not an integer.\n\t\t * @property currentAnimationFrame\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t **/\n\t\tthis.currentAnimationFrame = 0;\n\t\n\t\t/**\n\t\t * By default Sprite instances advance one frame per tick. Specifying a framerate for the Sprite (or its related\n\t\t * SpriteSheet) will cause it to advance based on elapsed time between ticks as appropriate to maintain the target\n\t\t * framerate.\n\t\t *\n\t\t * For example, if a Sprite with a framerate of 10 is placed on a Stage being updated at 40fps, then the Sprite will\n\t\t * advance roughly one frame every 4 ticks. This will not be exact, because the time between each tick will\n\t\t * vary slightly between frames.\n\t\t *\n\t\t * This feature is dependent on the tick event object (or an object with an appropriate \"delta\" property) being\n\t\t * passed into {{#crossLink \"Stage/update\"}}{{/crossLink}}.\n\t\t * @property framerate\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t **/\n\t\tthis.framerate = 0;\n\t\n\t\n\t// private properties:\n\t\t/**\n\t\t * Current animation object.\n\t\t * @property _animation\n\t\t * @protected\n\t\t * @type {Object}\n\t\t * @default null\n\t\t **/\n\t\tthis._animation = null;\n\t\n\t\t/**\n\t\t * Current frame index.\n\t\t * @property _currentFrame\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default null\n\t\t **/\n\t\tthis._currentFrame = null;\n\t\t\n\t\t/**\n\t\t * Skips the next auto advance. Used by gotoAndPlay to avoid immediately jumping to the next frame\n\t\t * @property _skipAdvance\n\t\t * @protected\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t **/\n\t\tthis._skipAdvance = false;\n\n\t\t/**\n\t\t * Docced in superclass.\n\t\t */\n\t\tthis._webGLRenderStyle = createjs.DisplayObject._StageGL_SPRITE;\n\n\t\tif (frameOrAnimation != null) { this.gotoAndPlay(frameOrAnimation); }\n\t}\n\tvar p = createjs.extend(Sprite, createjs.DisplayObject);\n\n\t/**\n\t * Constructor alias for backwards compatibility. This method will be removed in future versions.\n\t * Subclasses should be updated to use {{#crossLink \"Utility Methods/extends\"}}{{/crossLink}}.\n\t * @method initialize\n\t * @deprecated in favour of `createjs.promote()`\n\t **/\n\tp.initialize = Sprite; // TODO: Deprecated. This is for backwards support of Flash/Animate spritesheet export.\n\n\n// events:\n\t/**\n\t * Dispatched when an animation reaches its ends.\n\t * @event animationend\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type.\n\t * @param {String} name The name of the animation that just ended.\n\t * @param {String} next The name of the next animation that will be played, or null. This will be the same as name if the animation is looping.\n\t * @since 0.6.0\n\t */\n\t \n\t/**\n\t * Dispatched any time the current frame changes. For example, this could be due to automatic advancement on a tick,\n\t * or calling gotoAndPlay() or gotoAndStop().\n\t * @event change\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type.\n\t */\n\n\n// public methods:\n\t/**\n\t * Returns true or false indicating whether the display object would be visible if drawn to a canvas.\n\t * This does not account for whether it would be visible within the boundaries of the stage.\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method isVisible\n\t * @return {Boolean} Boolean indicating whether the display object would be visible if drawn to a canvas\n\t **/\n\tp.isVisible = function() {\n\t\tvar hasContent = this.cacheCanvas || this.spriteSheet.complete;\n\t\treturn !!(this.visible && this.alpha > 0 && this.scaleX != 0 && this.scaleY != 0 && hasContent);\n\t};\n\n\t/**\n\t * Draws the display object into the specified context ignoring its visible, alpha, shadow, and transform.\n\t * Returns true if the draw was handled (useful for overriding functionality).\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method draw\n\t * @param {CanvasRenderingContext2D} ctx The canvas 2D context object to draw into.\n\t * @param {Boolean} ignoreCache Indicates whether the draw operation should ignore any current cache.\n\t * For example, used for drawing the cache (to prevent it from simply drawing an existing cache back\n\t * into itself).\n\t **/\n\tp.draw = function(ctx, ignoreCache) {\n\t\tif (this.DisplayObject_draw(ctx, ignoreCache)) { return true; }\n\t\tthis._normalizeFrame();\n\t\tvar o = this.spriteSheet.getFrame(this._currentFrame|0);\n\t\tif (!o) { return false; }\n\t\tvar rect = o.rect;\n\t\tif (rect.width && rect.height) { ctx.drawImage(o.image, rect.x, rect.y, rect.width, rect.height, -o.regX, -o.regY, rect.width, rect.height); }\n\t\treturn true;\n\t};\n\n\t//Note, the doc sections below document using the specified APIs (from DisplayObject)  from\n\t//Bitmap. This is why they have no method implementations.\n\n\t/**\n\t * Because the content of a Sprite is already in a raster format, cache is unnecessary for Sprite instances.\n\t * You should not cache Sprite instances as it can degrade performance.\n\t * @method cache\n\t **/\n\n\t/**\n\t * Because the content of a Sprite is already in a raster format, cache is unnecessary for Sprite instances.\n\t * You should not cache Sprite instances as it can degrade performance.\n\t * @method updateCache\n\t **/\n\n\t/**\n\t * Because the content of a Sprite is already in a raster format, cache is unnecessary for Sprite instances.\n\t * You should not cache Sprite instances as it can degrade performance.\n\t * @method uncache\n\t **/\n\n\t/**\n\t * Play (unpause) the current animation. The Sprite will be paused if either {{#crossLink \"Sprite/stop\"}}{{/crossLink}}\n\t * or {{#crossLink \"Sprite/gotoAndStop\"}}{{/crossLink}} is called. Single frame animations will remain\n\t * unchanged.\n\t * @method play\n\t **/\n\tp.play = function() {\n\t\tthis.paused = false;\n\t};\n\n\t/**\n\t * Stop playing a running animation. The Sprite will be playing if {{#crossLink \"Sprite/gotoAndPlay\"}}{{/crossLink}}\n\t * is called. Note that calling {{#crossLink \"Sprite/gotoAndPlay\"}}{{/crossLink}} or {{#crossLink \"Sprite/play\"}}{{/crossLink}}\n\t * will resume playback.\n\t * @method stop\n\t **/\n\tp.stop = function() {\n\t\tthis.paused = true;\n\t};\n\n\t/**\n\t * Sets paused to false and plays the specified animation name, named frame, or frame number.\n\t * @method gotoAndPlay\n\t * @param {String|Number} frameOrAnimation The frame number or animation name that the playhead should move to\n\t * and begin playing.\n\t **/\n\tp.gotoAndPlay = function(frameOrAnimation) {\n\t\tthis.paused = false;\n\t\tthis._skipAdvance = true;\n\t\tthis._goto(frameOrAnimation);\n\t};\n\n\t/**\n\t * Sets paused to true and seeks to the specified animation name, named frame, or frame number.\n\t * @method gotoAndStop\n\t * @param {String|Number} frameOrAnimation The frame number or animation name that the playhead should move to\n\t * and stop.\n\t **/\n\tp.gotoAndStop = function(frameOrAnimation) {\n\t\tthis.paused = true;\n\t\tthis._goto(frameOrAnimation);\n\t};\n\n\t/**\n\t * Advances the playhead. This occurs automatically each tick by default.\n\t * @param [time] {Number} The amount of time in ms to advance by. Only applicable if framerate is set on the Sprite\n\t * or its SpriteSheet.\n\t * @method advance\n\t*/\n\tp.advance = function(time) {\n\t\tvar fps = this.framerate || this.spriteSheet.framerate;\n\t\tvar t = (fps && time != null) ? time/(1000/fps) : 1;\n\t\tthis._normalizeFrame(t);\n\t};\n\t\n\t/**\n\t * Returns a {{#crossLink \"Rectangle\"}}{{/crossLink}} instance defining the bounds of the current frame relative to\n\t * the origin. For example, a 90 x 70 frame with <code>regX=50</code> and <code>regY=40</code> would return a\n\t * rectangle with [x=-50, y=-40, width=90, height=70]. This ignores transformations on the display object.\n\t *\n\t * Also see the SpriteSheet {{#crossLink \"SpriteSheet/getFrameBounds\"}}{{/crossLink}} method.\n\t * @method getBounds\n\t * @return {Rectangle} A Rectangle instance. Returns null if the frame does not exist, or the image is not fully\n\t * loaded.\n\t **/\n\tp.getBounds = function() {\n\t\t// TODO: should this normalizeFrame?\n\t\treturn this.DisplayObject_getBounds() || this.spriteSheet.getFrameBounds(this.currentFrame, this._rectangle);\n\t};\n\n\t/**\n\t * Returns a clone of the Sprite instance. Note that the same SpriteSheet is shared between cloned\n\t * instances.\n\t * @method clone\n\t * @return {Sprite} a clone of the Sprite instance.\n\t **/\n\tp.clone = function() {\n\t\treturn this._cloneProps(new Sprite(this.spriteSheet));\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[Sprite (name=\"+  this.name +\")]\";\n\t};\n\n// private methods:\n\t/**\n\t * @method _cloneProps\n\t * @param {Sprite} o\n\t * @return {Sprite} o\n\t * @protected\n\t **/\n\tp._cloneProps = function(o) {\n\t\tthis.DisplayObject__cloneProps(o);\n\t\to.currentFrame = this.currentFrame;\n\t\to.currentAnimation = this.currentAnimation;\n\t\to.paused = this.paused;\n\t\to.currentAnimationFrame = this.currentAnimationFrame;\n\t\to.framerate = this.framerate;\n\t\t\n\t\to._animation = this._animation;\n\t\to._currentFrame = this._currentFrame;\n\t\to._skipAdvance = this._skipAdvance;\n\t\treturn o;\n\t};\n\t\n\t/**\n\t * Advances the <code>currentFrame</code> if paused is not true. This is called automatically when the {{#crossLink \"Stage\"}}{{/crossLink}}\n\t * ticks.\n\t * @param {Object} evtObj An event object that will be dispatched to all tick listeners. This object is reused between dispatchers to reduce construction & GC costs.\n\t * @protected\n\t * @method _tick\n\t **/\n\tp._tick = function(evtObj) {\n\t\tif (!this.paused) {\n\t\t\tif (!this._skipAdvance) { this.advance(evtObj&&evtObj.delta); }\n\t\t\tthis._skipAdvance = false;\n\t\t}\n\t\tthis.DisplayObject__tick(evtObj);\n\t};\n\n\n\t/**\n\t * Normalizes the current frame, advancing animations and dispatching callbacks as appropriate.\n\t * @protected\n\t * @method _normalizeFrame\n\t **/\n\tp._normalizeFrame = function(frameDelta) {\n\t\tframeDelta = frameDelta || 0;\n\t\tvar animation = this._animation;\n\t\tvar paused = this.paused;\n\t\tvar frame = this._currentFrame;\n\t\tvar l;\n\t\t\n\t\tif (animation) {\n\t\t\tvar speed = animation.speed || 1;\n\t\t\tvar animFrame = this.currentAnimationFrame;\n\t\t\tl = animation.frames.length;\n\t\t\tif (animFrame + frameDelta * speed >= l) {\n\t\t\t\tvar next = animation.next;\n\t\t\t\tif (this._dispatchAnimationEnd(animation, frame, paused, next, l - 1)) {\n\t\t\t\t\t// something changed in the event stack, so we shouldn't make any more changes here.\n\t\t\t\t\treturn;\n\t\t\t\t} else if (next) {\n\t\t\t\t\t// sequence. Automatically calls _normalizeFrame again with the remaining frames.\n\t\t\t\t\treturn this._goto(next, frameDelta - (l - animFrame) / speed);\n\t\t\t\t} else {\n\t\t\t\t\t// end.\n\t\t\t\t\tthis.paused = true;\n\t\t\t\t\tanimFrame = animation.frames.length - 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tanimFrame += frameDelta * speed;\n\t\t\t}\n\t\t\tthis.currentAnimationFrame = animFrame;\n\t\t\tthis._currentFrame = animation.frames[animFrame | 0]\n\t\t} else {\n\t\t\tframe = (this._currentFrame += frameDelta);\n\t\t\tl = this.spriteSheet.getNumFrames();\n\t\t\tif (frame >= l && l > 0) {\n\t\t\t\tif (!this._dispatchAnimationEnd(animation, frame, paused, l - 1)) {\n\t\t\t\t\t// looped.\n\t\t\t\t\tif ((this._currentFrame -= l) >= l) { return this._normalizeFrame(); }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tframe = this._currentFrame | 0;\n\t\tif (this.currentFrame != frame) {\n\t\t\tthis.currentFrame = frame;\n\t\t\tthis.dispatchEvent(\"change\");\n\t\t}\n\t};\n\n\t/**\n\t * Dispatches the \"animationend\" event. Returns true if a handler changed the animation (ex. calling {{#crossLink \"Sprite/stop\"}}{{/crossLink}},\n\t * {{#crossLink \"Sprite/gotoAndPlay\"}}{{/crossLink}}, etc.)\n\t * @property _dispatchAnimationEnd\n\t * @private\n\t * @type {Function}\n\t **/\n\tp._dispatchAnimationEnd = function(animation, frame, paused, next, end) {\n\t\tvar name = animation ? animation.name : null;\n\t\tif (this.hasEventListener(\"animationend\")) {\n\t\t\tvar evt = new createjs.Event(\"animationend\");\n\t\t\tevt.name = name;\n\t\t\tevt.next = next;\n\t\t\tthis.dispatchEvent(evt);\n\t\t}\n\t\t// did the animation get changed in the event stack?:\n\t\tvar changed = (this._animation != animation || this._currentFrame != frame);\n\t\t// if the animation hasn't changed, but the sprite was paused, then we want to stick to the last frame:\n\t\tif (!changed && !paused && this.paused) { this.currentAnimationFrame = end; changed = true; }\n\t\treturn changed;\n\t};\n\n\t/**\n\t * Moves the playhead to the specified frame number or animation.\n\t * @method _goto\n\t * @param {String|Number} frameOrAnimation The frame number or animation that the playhead should move to.\n\t * @param {Boolean} [frame] The frame of the animation to go to. Defaults to 0.\n\t * @protected\n\t **/\n\tp._goto = function(frameOrAnimation, frame) {\n\t\tthis.currentAnimationFrame = 0;\n\t\tif (isNaN(frameOrAnimation)) {\n\t\t\tvar data = this.spriteSheet.getAnimation(frameOrAnimation);\n\t\t\tif (data) {\n\t\t\t\tthis._animation = data;\n\t\t\t\tthis.currentAnimation = frameOrAnimation;\n\t\t\t\tthis._normalizeFrame(frame);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.currentAnimation = this._animation = null;\n\t\t\tthis._currentFrame = frameOrAnimation;\n\t\t\tthis._normalizeFrame();\n\t\t}\n\t};\n\n\n\tcreatejs.Sprite = createjs.promote(Sprite, \"DisplayObject\");\n}());\n\n//##############################################################################\n// Shape.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * A Shape allows you to display vector art in the display list. It composites a {{#crossLink \"Graphics\"}}{{/crossLink}}\n\t * instance which exposes all of the vector drawing methods. The Graphics instance can be shared between multiple Shape\n\t * instances to display the same vector graphics with different positions or transforms.\n\t *\n\t * If the vector art will not\n\t * change between draws, you may want to use the {{#crossLink \"DisplayObject/cache\"}}{{/crossLink}} method to reduce the\n\t * rendering cost.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      var graphics = new createjs.Graphics().beginFill(\"#ff0000\").drawRect(0, 0, 100, 100);\n\t *      var shape = new createjs.Shape(graphics);\n\t *\n\t *      //Alternatively use can also use the graphics property of the Shape class to renderer the same as above.\n\t *      var shape = new createjs.Shape();\n\t *      shape.graphics.beginFill(\"#ff0000\").drawRect(0, 0, 100, 100);\n\t *\n\t * @class Shape\n\t * @extends DisplayObject\n\t * @constructor\n\t * @param {Graphics} graphics Optional. The graphics instance to display. If null, a new Graphics instance will be created.\n\t **/\n\tfunction Shape(graphics) {\n\t\tthis.DisplayObject_constructor();\n\t\t\n\t\t\n\t// public properties:\n\t\t/**\n\t\t * The graphics instance to display.\n\t\t * @property graphics\n\t\t * @type Graphics\n\t\t **/\n\t\tthis.graphics = graphics ? graphics : new createjs.Graphics();\n\t}\n\tvar p = createjs.extend(Shape, createjs.DisplayObject);\n\n\t// TODO: deprecated\n\t// p.initialize = function() {}; // searchable for devs wondering where it is. REMOVED. See docs for details.\n\n\n// public methods:\n\t/**\n\t * Returns true or false indicating whether the Shape would be visible if drawn to a canvas.\n\t * This does not account for whether it would be visible within the boundaries of the stage.\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method isVisible\n\t * @return {Boolean} Boolean indicating whether the Shape would be visible if drawn to a canvas\n\t **/\n\tp.isVisible = function() {\n\t\tvar hasContent = this.cacheCanvas || (this.graphics && !this.graphics.isEmpty());\n\t\treturn !!(this.visible && this.alpha > 0 && this.scaleX != 0 && this.scaleY != 0 && hasContent);\n\t};\n\n\t/**\n\t * Draws the Shape into the specified context ignoring its visible, alpha, shadow, and transform. Returns true if\n\t * the draw was handled (useful for overriding functionality).\n\t *\n\t * <i>NOTE: This method is mainly for internal use, though it may be useful for advanced uses.</i>\n\t * @method draw\n\t * @param {CanvasRenderingContext2D} ctx The canvas 2D context object to draw into.\n\t * @param {Boolean} [ignoreCache=false] Indicates whether the draw operation should ignore any current cache. For example,\n\t * used for drawing the cache (to prevent it from simply drawing an existing cache back into itself).\n\t * @return {Boolean}\n\t **/\n\tp.draw = function(ctx, ignoreCache) {\n\t\tif (this.DisplayObject_draw(ctx, ignoreCache)) { return true; }\n\t\tthis.graphics.draw(ctx, this);\n\t\treturn true;\n\t};\n\n\t/**\n\t * Returns a clone of this Shape. Some properties that are specific to this instance's current context are reverted to\n\t * their defaults (for example .parent).\n\t * @method clone\n\t * @param {Boolean} recursive If true, this Shape's {{#crossLink \"Graphics\"}}{{/crossLink}} instance will also be\n\t * cloned. If false, the Graphics instance will be shared with the new Shape.\n\t **/\n\tp.clone = function(recursive) {\n\t\tvar g = (recursive && this.graphics) ? this.graphics.clone() : this.graphics;\n\t\treturn  this._cloneProps(new Shape(g));\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[Shape (name=\"+  this.name +\")]\";\n\t};\n\n\n\tcreatejs.Shape = createjs.promote(Shape, \"DisplayObject\");\n}());\n\n//##############################################################################\n// Text.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Display one or more lines of dynamic text (not user editable) in the display list. Line wrapping support (using the\n\t * lineWidth) is very basic, wrapping on spaces and tabs only. Note that as an alternative to Text, you can position HTML\n\t * text above or below the canvas relative to items in the display list using the {{#crossLink \"DisplayObject/localToGlobal\"}}{{/crossLink}}\n\t * method, or using {{#crossLink \"DOMElement\"}}{{/crossLink}}.\n\t *\n\t * <b>Please note that Text does not support HTML text, and can only display one font style at a time.</b> To use\n\t * multiple font styles, you will need to create multiple text instances, and position them manually.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      var text = new createjs.Text(\"Hello World\", \"20px Arial\", \"#ff7700\");\n\t *      text.x = 100;\n\t *      text.textBaseline = \"alphabetic\";\n\t *\n\t * CreateJS Text supports web fonts (the same rules as Canvas). The font must be loaded and supported by the browser\n\t * before it can be displayed.\n\t *\n\t * <strong>Note:</strong> Text can be expensive to generate, so cache instances where possible. Be aware that not all\n\t * browsers will render Text exactly the same.\n\t * @class Text\n\t * @extends DisplayObject\n\t * @constructor\n\t * @param {String} [text] The text to display.\n\t * @param {String} [font] The font style to use. Any valid value for the CSS font attribute is acceptable (ex. \"bold\n\t * 36px Arial\").\n\t * @param {String} [color] The color to draw the text in. Any valid value for the CSS color attribute is acceptable (ex.\n\t * \"#F00\", \"red\", or \"#FF0000\").\n\t **/\n\tfunction Text(text, font, color) {\n\t\tthis.DisplayObject_constructor();\n\t\t\n\t\t\n\t// public properties:\n\t\t/**\n\t\t * The text to display.\n\t\t * @property text\n\t\t * @type String\n\t\t **/\n\t\tthis.text = text;\n\t\n\t\t/**\n\t\t * The font style to use. Any valid value for the CSS font attribute is acceptable (ex. \"bold 36px Arial\").\n\t\t * @property font\n\t\t * @type String\n\t\t **/\n\t\tthis.font = font;\n\t\n\t\t/**\n\t\t * The color to draw the text in. Any valid value for the CSS color attribute is acceptable (ex. \"#F00\"). Default is \"#000\".\n\t\t * It will also accept valid canvas fillStyle values.\n\t\t * @property color\n\t\t * @type String\n\t\t **/\n\t\tthis.color = color;\n\t\n\t\t/**\n\t\t * The horizontal text alignment. Any of \"start\", \"end\", \"left\", \"right\", and \"center\". For detailed\n\t\t * information view the\n\t\t * <a href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#text-styles\">\n\t\t * whatwg spec</a>. Default is \"left\".\n\t\t * @property textAlign\n\t\t * @type String\n\t\t **/\n\t\tthis.textAlign = \"left\";\n\t\n\t\t/**\n\t\t * The vertical alignment point on the font. Any of \"top\", \"hanging\", \"middle\", \"alphabetic\", \"ideographic\", or\n\t\t * \"bottom\". For detailed information view the <a href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#text-styles\">\n\t\t * whatwg spec</a>. Default is \"top\".\n\t\t * @property textBaseline\n\t\t * @type String\n\t\t*/\n\t\tthis.textBaseline = \"top\";\n\t\n\t\t/**\n\t\t * The maximum width to draw the text. If maxWidth is specified (not null), the text will be condensed or\n\t\t * shrunk to make it fit in this width. For detailed information view the\n\t\t * <a href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#text-styles\">\n\t\t * whatwg spec</a>.\n\t\t * @property maxWidth\n\t\t * @type Number\n\t\t*/\n\t\tthis.maxWidth = null;\n\t\n\t\t/**\n\t\t * If greater than 0, the text will be drawn as a stroke (outline) of the specified width.\n\t\t * @property outline\n\t\t * @type Number\n\t\t **/\n\t\tthis.outline = 0;\n\t\n\t\t/**\n\t\t * Indicates the line height (vertical distance between baselines) for multi-line text. If null or 0,\n\t\t * the value of getMeasuredLineHeight is used.\n\t\t * @property lineHeight\n\t\t * @type Number\n\t\t **/\n\t\tthis.lineHeight = 0;\n\t\n\t\t/**\n\t\t * Indicates the maximum width for a line of text before it is wrapped to multiple lines. If null,\n\t\t * the text will not be wrapped.\n\t\t * @property lineWidth\n\t\t * @type Number\n\t\t **/\n\t\tthis.lineWidth = null;\n\t}\n\tvar p = createjs.extend(Text, createjs.DisplayObject);\n\n\t// TODO: deprecated\n\t// p.initialize = function() {}; // searchable for devs wondering where it is. REMOVED. See docs for details.\n\n\t\n// static properties:\n\t/**\n\t * @property _workingContext\n\t * @type CanvasRenderingContext2D\n\t * @private\n\t **/\n\tvar canvas = (createjs.createCanvas?createjs.createCanvas():document.createElement(\"canvas\"));\n\tif (canvas.getContext) { Text._workingContext = canvas.getContext(\"2d\"); canvas.width = canvas.height = 1; }\n\t\n\t\n// constants:\n\t/**\n\t * Lookup table for the ratio to offset bounds x calculations based on the textAlign property.\n\t * @property H_OFFSETS\n\t * @type Object\n\t * @protected\n\t * @static\n\t **/\n\tText.H_OFFSETS = {start: 0, left: 0, center: -0.5, end: -1, right: -1};\n\t\n\t/**\n\t * Lookup table for the ratio to offset bounds y calculations based on the textBaseline property.\n\t * @property H_OFFSETS\n\t * @type Object\n\t * @protected\n\t * @static\n\t **/\n\tText.V_OFFSETS = {top: 0, hanging: -0.01, middle: -0.4, alphabetic: -0.8, ideographic: -0.85, bottom: -1};\n\n\n// public methods:\n\t/**\n\t * Returns true or false indicating whether the display object would be visible if drawn to a canvas.\n\t * This does not account for whether it would be visible within the boundaries of the stage.\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method isVisible\n\t * @return {Boolean} Whether the display object would be visible if drawn to a canvas\n\t **/\n\tp.isVisible = function() {\n\t\tvar hasContent = this.cacheCanvas || (this.text != null && this.text !== \"\");\n\t\treturn !!(this.visible && this.alpha > 0 && this.scaleX != 0 && this.scaleY != 0 && hasContent);\n\t};\n\n\t/**\n\t * Draws the Text into the specified context ignoring its visible, alpha, shadow, and transform.\n\t * Returns true if the draw was handled (useful for overriding functionality).\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method draw\n\t * @param {CanvasRenderingContext2D} ctx The canvas 2D context object to draw into.\n\t * @param {Boolean} ignoreCache Indicates whether the draw operation should ignore any current cache.\n\t * For example, used for drawing the cache (to prevent it from simply drawing an existing cache back\n\t * into itself).\n\t **/\n\tp.draw = function(ctx, ignoreCache) {\n\t\tif (this.DisplayObject_draw(ctx, ignoreCache)) { return true; }\n\n\t\tvar col = this.color || \"#000\";\n\t\tif (this.outline) { ctx.strokeStyle = col; ctx.lineWidth = this.outline*1; }\n\t\telse { ctx.fillStyle = col; }\n\t\t\n\t\tthis._drawText(this._prepContext(ctx));\n\t\treturn true;\n\t};\n\n\t/**\n\t * Returns the measured, untransformed width of the text without wrapping. Use getBounds for a more robust value.\n\t * @method getMeasuredWidth\n\t * @return {Number} The measured, untransformed width of the text.\n\t **/\n\tp.getMeasuredWidth = function() {\n\t\treturn this._getMeasuredWidth(this.text);\n\t};\n\n\t/**\n\t * Returns an approximate line height of the text, ignoring the lineHeight property. This is based on the measured\n\t * width of a \"M\" character multiplied by 1.2, which provides an approximate line height for most fonts.\n\t * @method getMeasuredLineHeight\n\t * @return {Number} an approximate line height of the text, ignoring the lineHeight property. This is\n\t * based on the measured width of a \"M\" character multiplied by 1.2, which approximates em for most fonts.\n\t **/\n\tp.getMeasuredLineHeight = function() {\n\t\treturn this._getMeasuredWidth(\"M\")*1.2;\n\t};\n\n\t/**\n\t * Returns the approximate height of multi-line text by multiplying the number of lines against either the\n\t * <code>lineHeight</code> (if specified) or {{#crossLink \"Text/getMeasuredLineHeight\"}}{{/crossLink}}. Note that\n\t * this operation requires the text flowing logic to run, which has an associated CPU cost.\n\t * @method getMeasuredHeight\n\t * @return {Number} The approximate height of the untransformed multi-line text.\n\t **/\n\tp.getMeasuredHeight = function() {\n\t\treturn this._drawText(null,{}).height;\n\t};\n\n\t/**\n\t * Docced in superclass.\n\t */\n\tp.getBounds = function() {\n\t\tvar rect = this.DisplayObject_getBounds();\n\t\tif (rect) { return rect; }\n\t\tif (this.text == null || this.text === \"\") { return null; }\n\t\tvar o = this._drawText(null, {});\n\t\tvar w = (this.maxWidth && this.maxWidth < o.width) ? this.maxWidth : o.width;\n\t\tvar x = w * Text.H_OFFSETS[this.textAlign||\"left\"];\n\t\tvar lineHeight = this.lineHeight||this.getMeasuredLineHeight();\n\t\tvar y = lineHeight * Text.V_OFFSETS[this.textBaseline||\"top\"];\n\t\treturn this._rectangle.setValues(x, y, w, o.height);\n\t};\n\t\n\t/**\n\t * Returns an object with width, height, and lines properties. The width and height are the visual width and height\n\t * of the drawn text. The lines property contains an array of strings, one for\n\t * each line of text that will be drawn, accounting for line breaks and wrapping. These strings have trailing\n\t * whitespace removed.\n\t * @method getMetrics\n\t * @return {Object} An object with width, height, and lines properties.\n\t **/\n\tp.getMetrics = function() {\n\t\tvar o = {lines:[]};\n\t\to.lineHeight = this.lineHeight || this.getMeasuredLineHeight();\n\t\to.vOffset = o.lineHeight * Text.V_OFFSETS[this.textBaseline||\"top\"];\n\t\treturn this._drawText(null, o, o.lines);\n\t};\n\n\t/**\n\t * Returns a clone of the Text instance.\n\t * @method clone\n\t * @return {Text} a clone of the Text instance.\n\t **/\n\tp.clone = function() {\n\t\treturn this._cloneProps(new Text(this.text, this.font, this.color));\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[Text (text=\"+  (this.text.length > 20 ? this.text.substr(0, 17)+\"...\" : this.text) +\")]\";\n\t};\n\n\n// private methods:\n\t/**\n\t * @method _cloneProps\n\t * @param {Text} o\n\t * @protected\n\t * @return {Text} o\n\t **/\n\tp._cloneProps = function(o) {\n\t\tthis.DisplayObject__cloneProps(o);\n\t\to.textAlign = this.textAlign;\n\t\to.textBaseline = this.textBaseline;\n\t\to.maxWidth = this.maxWidth;\n\t\to.outline = this.outline;\n\t\to.lineHeight = this.lineHeight;\n\t\to.lineWidth = this.lineWidth;\n\t\treturn o;\n\t};\n\n\t/**\n\t * @method _getWorkingContext\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @return {CanvasRenderingContext2D}\n\t * @protected\n\t **/\n\tp._prepContext = function(ctx) {\n\t\tctx.font = this.font||\"10px sans-serif\";\n\t\tctx.textAlign = this.textAlign||\"left\";\n\t\tctx.textBaseline = this.textBaseline||\"top\";\n\t\tctx.lineJoin = \"miter\";\n\t\tctx.miterLimit = 2.5;\n\t\treturn ctx;\n\t};\n\n\t/**\n\t * Draws multiline text.\n\t * @method _drawText\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {Object} o\n\t * @param {Array} lines\n\t * @return {Object}\n\t * @protected\n\t **/\n\tp._drawText = function(ctx, o, lines) {\n\t\tvar paint = !!ctx;\n\t\tif (!paint) {\n\t\t\tctx = Text._workingContext;\n\t\t\tctx.save();\n\t\t\tthis._prepContext(ctx);\n\t\t}\n\t\tvar lineHeight = this.lineHeight||this.getMeasuredLineHeight();\n\t\t\n\t\tvar maxW = 0, count = 0;\n\t\tvar hardLines = String(this.text).split(/(?:\\r\\n|\\r|\\n)/);\n\t\tfor (var i=0, l=hardLines.length; i<l; i++) {\n\t\t\tvar str = hardLines[i];\n\t\t\tvar w = null;\n\t\t\t\n\t\t\tif (this.lineWidth != null && (w = ctx.measureText(str).width) > this.lineWidth) {\n\t\t\t\t// text wrapping:\n\t\t\t\tvar words = str.split(/(\\s)/);\n\t\t\t\tstr = words[0];\n\t\t\t\tw = ctx.measureText(str).width;\n\t\t\t\t\n\t\t\t\tfor (var j=1, jl=words.length; j<jl; j+=2) {\n\t\t\t\t\t// Line needs to wrap:\n\t\t\t\t\tvar wordW = ctx.measureText(words[j] + words[j+1]).width;\n\t\t\t\t\tif (w + wordW > this.lineWidth) {\n\t\t\t\t\t\tif (paint) { this._drawTextLine(ctx, str, count*lineHeight); }\n\t\t\t\t\t\tif (lines) { lines.push(str); }\n\t\t\t\t\t\tif (w > maxW) { maxW = w; }\n\t\t\t\t\t\tstr = words[j+1];\n\t\t\t\t\t\tw = ctx.measureText(str).width;\n\t\t\t\t\t\tcount++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstr += words[j] + words[j+1];\n\t\t\t\t\t\tw += wordW;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (paint) { this._drawTextLine(ctx, str, count*lineHeight); }\n\t\t\tif (lines) { lines.push(str); }\n\t\t\tif (o && w == null) { w = ctx.measureText(str).width; }\n\t\t\tif (w > maxW) { maxW = w; }\n\t\t\tcount++;\n\t\t}\n\t\t\n\t\tif (o) {\n\t\t\to.width = maxW;\n\t\t\to.height = count*lineHeight;\n\t\t}\n\t\tif (!paint) { ctx.restore(); }\n\t\treturn o;\n\t};\n\n\t/**\n\t * @method _drawTextLine\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {String} text\n\t * @param {Number} y\n\t * @protected\n\t **/\n\tp._drawTextLine = function(ctx, text, y) {\n\t\t// Chrome 17 will fail to draw the text if the last param is included but null, so we feed it a large value instead:\n\t\tif (this.outline) { ctx.strokeText(text, 0, y, this.maxWidth||0xFFFF); }\n\t\telse { ctx.fillText(text, 0, y, this.maxWidth||0xFFFF); }\n\t};\n\t\n\t\n\t/**\n\t * @method _getMeasuredWidth\n\t * @param {String} text\n\t * @protected\n\t **/\n\tp._getMeasuredWidth = function(text) {\n\t\tvar ctx = Text._workingContext;\n\t\tctx.save();\n\t\tvar w = this._prepContext(ctx).measureText(text).width;\n\t\tctx.restore();\n\t\treturn w;\n\t};\n\n\n\tcreatejs.Text = createjs.promote(Text, \"DisplayObject\");\n}());\n\n//##############################################################################\n// BitmapText.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Displays text using bitmap glyphs defined in a sprite sheet. Multi-line text is supported using new line characters,\n\t * but automatic wrapping is not supported. See the {{#crossLink \"BitmapText/spriteSheet:property\"}}{{/crossLink}}\n\t * property for more information on defining glyphs.\n\t *\n\t * <strong>Important:</strong> While BitmapText extends Container, it is not designed to be used as one.\n\t * As such, methods like addChild and removeChild are disabled.\n\t *\n\t *\n\t * @class BitmapText\n\t * @extends DisplayObject\n\t * @param {String} [text=\"\"] The text to display.\n\t * @param {SpriteSheet} [spriteSheet=null] The spritesheet that defines the character glyphs.\n\t * @constructor\n\t **/\n\tfunction BitmapText(text, spriteSheet) {\n\t\tthis.Container_constructor();\n\t\t\n\t\t\n\t// public properties:\n\t\t/**\n\t\t * The text to display.\n\t\t * @property text\n\t\t * @type String\n\t\t * @default \"\"\n\t\t **/\n\t\tthis.text = text||\"\";\n\t\t\n\t\t/**\n\t\t * A SpriteSheet instance that defines the glyphs for this bitmap text. Each glyph/character\n\t\t * should have a single frame animation defined in the sprite sheet named the same as\n\t\t * corresponding character. For example, the following animation definition:\n\t\t *\n\t\t * \t\t\"A\": {frames: [0]}\n\t\t *\n\t\t * would indicate that the frame at index 0 of the spritesheet should be drawn for the \"A\" character. The short form\n\t\t * is also acceptable:\n\t\t * \n\t\t * \t\t\"A\": 0\n\t\t *\n\t\t * Note that if a character in the text is not found in the sprite sheet, it will also\n\t\t * try to use the alternate case (upper or lower).\n\t\t *\n\t\t * See SpriteSheet for more information on defining sprite sheet data.\n\t\t * @property spriteSheet\n\t\t * @type SpriteSheet\n\t\t * @default null\n\t\t **/\n\t\tthis.spriteSheet = spriteSheet;\n\t\n\t\t/**\n\t\t * The height of each line of text. If 0, then it will use a line height calculated\n\t\t * by checking for the height of the \"1\", \"T\", or \"L\" character (in that order). If\n\t\t * those characters are not defined, it will use the height of the first frame of the\n\t\t * sprite sheet.\n\t\t * @property lineHeight\n\t\t * @type Number\n\t\t * @default 0\n\t\t **/\n\t\tthis.lineHeight = 0;\n\t\n\t\t/**\n\t\t * This spacing (in pixels) will be added after each character in the output.\n\t\t * @property letterSpacing\n\t\t * @type Number\n\t\t * @default 0\n\t\t **/\n\t\tthis.letterSpacing = 0;\n\t\n\t\t/**\n\t\t * If a space character is not defined in the sprite sheet, then empty pixels equal to\n\t\t * spaceWidth will be inserted instead. If 0, then it will use a value calculated\n\t\t * by checking for the width of the \"1\", \"l\", \"E\", or \"A\" character (in that order). If\n\t\t * those characters are not defined, it will use the width of the first frame of the\n\t\t * sprite sheet.\n\t\t * @property spaceWidth\n\t\t * @type Number\n\t\t * @default 0\n\t\t **/\n\t\tthis.spaceWidth = 0;\n\t\t\n\t\t\n\t// private properties:\n\t \t/**\n\t\t * @property _oldProps\n\t\t * @type Object\n\t\t * @protected\n\t\t **/\n\t\tthis._oldProps = {text:0,spriteSheet:0,lineHeight:0,letterSpacing:0,spaceWidth:0};\n\n\t\t/**\n\t\t * Used to track the object which this class attached listeners to, helps optimize listener attachment.\n\t\t * @property _oldStage\n\t\t * @type Stage\n\t\t * @protected\n\t\t */\n\t\tthis._oldStage = null;\n\t\t/**\n\t\t * The event listener proxy triggered drawing draw for special circumstances.\n\t\t * @property _drawAction\n\t\t * @type function\n\t\t * @protected\n\t\t */\n\t\tthis._drawAction = null;\n\t}\n\tvar p = createjs.extend(BitmapText, createjs.Container);\n\n// static properties:\n\t/**\n\t * BitmapText uses Sprite instances to draw text. To reduce the creation and destruction of instances (and thus garbage collection), it maintains\n\t * an internal object pool of sprite instances to reuse. Increasing this value can cause more sprites to be\n\t * retained, slightly increasing memory use, but reducing instantiation.\n\t * @property maxPoolSize\n\t * @type Number\n\t * @static\n\t * @default 100\n\t **/\n\tBitmapText.maxPoolSize = 100;\n\t\n\t/**\n\t * Sprite object pool.\n\t * @type {Array}\n\t * @static\n\t * @private\n\t */\n\tBitmapText._spritePool = [];\n\n\t\n// public methods:\n\t/**\n\t * Docced in superclass.\n\t **/\n\tp.draw = function(ctx, ignoreCache) {\n\t\tif (this.DisplayObject_draw(ctx, ignoreCache)) { return; }\n\t\tthis._updateState();\n\t\tthis.Container_draw(ctx, ignoreCache);\n\t};\n\t\n\t/**\n\t * Docced in superclass.\n\t **/\n\tp.getBounds = function() {\n\t\tthis._updateText();\n\t\treturn this.Container_getBounds();\n\t};\n\t\n\t/**\n\t * Returns true or false indicating whether the display object would be visible if drawn to a canvas.\n\t * This does not account for whether it would be visible within the boundaries of the stage.\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method isVisible\n\t * @return {Boolean} Boolean indicating whether the display object would be visible if drawn to a canvas\n\t **/\n\tp.isVisible = function() {\n\t\tvar hasContent = this.cacheCanvas || (this.spriteSheet && this.spriteSheet.complete && this.text);\n\t\treturn !!(this.visible && this.alpha > 0 && this.scaleX !== 0 && this.scaleY !== 0 && hasContent);\n\t};\n\t\n\tp.clone = function() {\n\t\treturn this._cloneProps(new BitmapText(this.text, this.spriteSheet));\n\t};\n\t\n\t/**\n\t * <strong>Disabled in BitmapText.</strong>\n\t * @method addChild\n\t **/\n\t/**\n\t * <strong>Disabled in BitmapText.</strong>\n\t * @method addChildAt\n\t **/\n\t/**\n\t * <strong>Disabled in BitmapText.</strong>\n\t * @method removeChild\n\t **/\n\t/**\n\t * <strong>Disabled in BitmapText.</strong>\n\t * @method removeChildAt\n\t **/\n\t/**\n\t * <strong>Disabled in BitmapText.</strong>\n\t * @method removeAllChildren\n\t **/\n\tp.addChild = p.addChildAt = p.removeChild = p.removeChildAt = p.removeAllChildren = function() {};\n\n\n// private methods:\n\t/**\n\t * Docced in superclass.\n\t **/\n\tp._updateState = function() {\n\t\tthis._updateText();\n\t};\n\n \t/**\n\t * @method _cloneProps\n\t * @param {BitmapText} o\n\t * @return {BitmapText} o\n\t * @protected\n\t **/\n\tp._cloneProps = function(o) {\n\t\tthis.Container__cloneProps(o);\n\t\to.lineHeight = this.lineHeight;\n\t\to.letterSpacing = this.letterSpacing;\n\t\to.spaceWidth = this.spaceWidth;\n\t\treturn o;\n\t};\n\t\n\t/**\n\t * @method _getFrameIndex\n\t * @param {String} character\n\t * @param {SpriteSheet} spriteSheet\n\t * @return {Number}\n\t * @protected\n\t **/\n\tp._getFrameIndex = function(character, spriteSheet) {\n\t\tvar c, o = spriteSheet.getAnimation(character);\n\t\tif (!o) {\n\t\t\t(character != (c = character.toUpperCase())) || (character != (c = character.toLowerCase())) || (c=null);\n\t\t\tif (c) { o = spriteSheet.getAnimation(c); }\n\t\t}\n\t\treturn o && o.frames[0];\n\t};\n\t\n\t/**\n\t * @method _getFrame\n\t * @param {String} character\n\t * @param {SpriteSheet} spriteSheet\n\t * @return {Object}\n\t * @protected\n\t **/\n\tp._getFrame = function(character, spriteSheet) {\n\t\tvar index = this._getFrameIndex(character, spriteSheet);\n\t\treturn index == null ? index : spriteSheet.getFrame(index);\n\t};\n\n\t/**\n\t * @method _getLineHeight\n\t * @param {SpriteSheet} ss\n\t * @return {Number}\n\t * @protected\n\t **/\n\tp._getLineHeight = function(ss) {\n\t\tvar frame = this._getFrame(\"1\",ss) || this._getFrame(\"T\",ss) || this._getFrame(\"L\",ss) || ss.getFrame(0);\n\t\treturn frame ? frame.rect.height : 1;\n\t};\n\n\t/**\n\t * @method _getSpaceWidth\n\t * @param {SpriteSheet} ss\n\t * @return {Number}\n\t * @protected\n\t **/\n\tp._getSpaceWidth = function(ss) {\n\t\tvar frame = this._getFrame(\"1\",ss) || this._getFrame(\"l\",ss) || this._getFrame(\"e\",ss) || this._getFrame(\"a\",ss) || ss.getFrame(0);\n\t\treturn frame ? frame.rect.width : 1;\n\t};\n\n\t/**\n\t * @method _updateText\n\t * @protected\n\t **/\n\tp._updateText = function() {\n\t\tvar x=0, y=0, o=this._oldProps, change=false, spaceW=this.spaceWidth, lineH=this.lineHeight, ss=this.spriteSheet;\n\t\tvar pool=BitmapText._spritePool, kids=this.children, childIndex=0, numKids=kids.length, sprite;\n\t\t\n\t\tfor (var n in o) {\n\t\t\tif (o[n] != this[n]) {\n\t\t\t\to[n] = this[n];\n\t\t\t\tchange = true;\n\t\t\t}\n\t\t}\n\t\tif (!change) { return; }\n\t\t\n\t\tvar hasSpace = !!this._getFrame(\" \", ss);\n\t\tif (!hasSpace && !spaceW) { spaceW = this._getSpaceWidth(ss); }\n\t\tif (!lineH) { lineH = this._getLineHeight(ss); }\n\t\t\n\t\tfor(var i=0, l=this.text.length; i<l; i++) {\n\t\t\tvar character = this.text.charAt(i);\n\t\t\tif (character == \" \" && !hasSpace) {\n\t\t\t\tx += spaceW;\n\t\t\t\tcontinue;\n\t\t\t} else if (character==\"\\n\" || character==\"\\r\") {\n\t\t\t\tif (character==\"\\r\" && this.text.charAt(i+1) == \"\\n\") { i++; } // crlf\n\t\t\t\tx = 0;\n\t\t\t\ty += lineH;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar index = this._getFrameIndex(character, ss);\n\t\t\tif (index == null) { continue; }\n\t\t\t\n\t\t\tif (childIndex < numKids) {\n\t\t\t\tsprite = kids[childIndex];\n\t\t\t} else {\n\t\t\t\tkids.push(sprite = pool.length ? pool.pop() : new createjs.Sprite());\n\t\t\t\tsprite.parent = this;\n\t\t\t\tnumKids++;\n\t\t\t}\n\t\t\tsprite.spriteSheet = ss;\n\t\t\tsprite.gotoAndStop(index);\n\t\t\tsprite.x = x;\n\t\t\tsprite.y = y;\n\t\t\tchildIndex++;\n\t\t\t\n\t\t\tx += sprite.getBounds().width + this.letterSpacing;\n\t\t}\n\t\twhile (numKids > childIndex) {\n\t\t\t // faster than removeChild.\n\t\t\tpool.push(sprite = kids.pop());\n\t\t\tsprite.parent = null;\n\t\t\tnumKids--;\n\t\t}\n\t\tif (pool.length > BitmapText.maxPoolSize) { pool.length = BitmapText.maxPoolSize; }\n\t};\n\n\n\tcreatejs.BitmapText = createjs.promote(BitmapText, \"Container\");\n}());\n\n//##############################################################################\n// MovieClip.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * The MovieClip class associates a TweenJS Timeline with an EaselJS {{#crossLink \"Container\"}}{{/crossLink}}. It allows\n\t * you to create objects which encapsulate timeline animations, state changes, and synched actions. The MovieClip\n\t * class has been included in the EaselJS minified file since 0.7.0.\n\t *\n\t * Currently MovieClip only works properly if it is tick based (as opposed to time based) though some concessions have\n\t * been made to support time-based timelines in the future.\n\t *\n\t * <h4>Example</h4>\n\t * This example animates two shapes back and forth. The grey shape starts on the left, but we jump to a mid-point in\n\t * the animation using {{#crossLink \"MovieClip/gotoAndPlay\"}}{{/crossLink}}.\n\t *\n\t *      var stage = new createjs.Stage(\"canvas\");\n\t *      createjs.Ticker.addEventListener(\"tick\", stage);\n\t *\n\t *      var mc = new createjs.MovieClip({loop:-1, labels:{myLabel:20}});\n\t *      stage.addChild(mc);\n\t *\n\t *      var child1 = new createjs.Shape(\n\t *          new createjs.Graphics().beginFill(\"#999999\")\n\t *              .drawCircle(30,30,30));\n\t *      var child2 = new createjs.Shape(\n\t *          new createjs.Graphics().beginFill(\"#5a9cfb\")\n\t *              .drawCircle(30,30,30));\n\t *\n\t *      mc.timeline.addTween(\n\t *          createjs.Tween.get(child1)\n\t *              .to({x:0}).to({x:60}, 50).to({x:0}, 50));\n\t *      mc.timeline.addTween(\n\t *          createjs.Tween.get(child2)\n\t *              .to({x:60}).to({x:0}, 50).to({x:60}, 50));\n\t *\n\t *      mc.gotoAndPlay(\"start\");\n\t *\n\t * It is recommended to use <code>tween.to()</code> to animate and set properties (use no duration to have it set\n\t * immediately), and the <code>tween.wait()</code> method to create delays between animations. Note that using the\n\t * <code>tween.set()</code> method to affect properties will likely not provide the desired result.\n\t *\n\t * @class MovieClip\n\t * @main MovieClip\n\t * @param {Object} [props] The configuration properties to apply to this instance (ex. `{mode:MovieClip.SYNCHED}`).\n\t * Supported props for the MovieClip are listed below. These props are set on the corresponding instance properties except where\n\t * specified.<UL>\n\t *    <LI> `mode`</LI>\n\t *    <LI> `startPosition`</LI>\n\t *    <LI> `frameBounds`</LI>\n\t * </UL>\n\t * \n\t * This object will also be passed into the Timeline instance associated with this MovieClip. See the documentation\n\t * for Timeline for a list of supported props (ex. `paused`, `labels`, `loop`, `reversed`, etc.)\n\t * @extends Container\n\t * @constructor\n\t **/\n\tfunction MovieClip(props) {\n\t\tthis.Container_constructor();\n\t\t!MovieClip.inited&&MovieClip.init(); // static init\n\t\t\n\t\tvar mode, startPosition, loop, labels;\n\t\t\n\t\t// handle old params (mode, startPosition, loop, labels):\n\t\t// TODO: deprecated param handling:\n\t\tif (props instanceof String || arguments.length > 1) {\n\t\t\tmode = props;\n\t\t\tstartPosition = arguments[1];\n\t\t\tloop = arguments[2];\n\t\t\tlabels = arguments[3];\n\t\t\tif (loop == null) { loop = -1; }\n\t\t\tprops = null;\n\t\t} else if (props) {\n\t\t\tmode = props.mode;\n\t\t\tstartPosition = props.startPosition;\n\t\t\tloop = props.loop;\n\t\t\tlabels = props.labels;\n\t\t}\n\t\tif (!props) { props = {labels:labels}; }\n\t\t\n\t\t\n\t// public properties:\n\t\t/**\n\t\t * Controls how this MovieClip advances its time. Must be one of 0 (INDEPENDENT), 1 (SINGLE_FRAME), or 2 (SYNCHED).\n\t\t * See each constant for a description of the behaviour.\n\t\t * @property mode\n\t\t * @type String\n\t\t * @default null\n\t\t **/\n\t\tthis.mode = mode||MovieClip.INDEPENDENT;\n\t\n\t\t/**\n\t\t * Specifies what the first frame to play in this movieclip, or the only frame to display if mode is SINGLE_FRAME.\n\t\t * @property startPosition\n\t\t * @type Number\n\t\t * @default 0\n\t\t */\n\t\tthis.startPosition = startPosition||0;\n\t\n\t\t/**\n\t\t * Specifies how many times this MovieClip should loop. A value of -1 indicates it should loop indefinitely. A value of\n\t\t * 1 would cause it to loop once (ie. play a total of twice).\n\t\t * @property loop\n\t\t * @type Number\n\t\t * @default -1\n\t\t */\n\t\tthis.loop = loop === true ? -1 : (loop || 0);\n\t\n\t\t/**\n\t\t * The current frame of the movieclip.\n\t\t * @property currentFrame\n\t\t * @type Number\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.currentFrame = 0;\n\t\n\t\t/**\n\t\t * If true, the MovieClip's position will not advance when ticked.\n\t\t * @property paused\n\t\t * @type Boolean\n\t\t * @default false\n\t\t */\n\t\tthis.paused = props.paused||false;\n\t\n\t\t/**\n\t\t * If true, actions in this MovieClip's tweens will be run when the playhead advances.\n\t\t * @property actionsEnabled\n\t\t * @type Boolean\n\t\t * @default true\n\t\t */\n\t\tthis.actionsEnabled = true;\n\t\n\t\t/**\n\t\t * If true, the MovieClip will automatically be reset to its first frame whenever the timeline adds\n\t\t * it back onto the display list. This only applies to MovieClip instances with mode=INDEPENDENT.\n\t\t * <br><br>\n\t\t * For example, if you had a character animation with a \"body\" child MovieClip instance\n\t\t * with different costumes on each frame, you could set body.autoReset = false, so that\n\t\t * you can manually change the frame it is on, without worrying that it will be reset\n\t\t * automatically.\n\t\t * @property autoReset\n\t\t * @type Boolean\n\t\t * @default true\n\t\t */\n\t\tthis.autoReset = true;\n\t\t\n\t\t/**\n\t\t * An array of bounds for each frame in the MovieClip. This is mainly intended for tool output.\n\t\t * @property frameBounds\n\t\t * @type Array\n\t\t * @default null\n\t\t */\n\t\tthis.frameBounds = this.frameBounds||props.frameBounds; // frameBounds are set on the prototype in Animate.\n\t\t\n\t\t/**\n\t\t * By default MovieClip instances advance one frame per tick. Specifying a framerate for the MovieClip\n\t\t * will cause it to advance based on elapsed time between ticks as appropriate to maintain the target\n\t\t * framerate.\n\t\t *\n\t\t * For example, if a MovieClip with a framerate of 10 is placed on a Stage being updated at 40fps, then the MovieClip will\n\t\t * advance roughly one frame every 4 ticks. This will not be exact, because the time between each tick will\n\t\t * vary slightly between frames.\n\t\t *\n\t\t * This feature is dependent on the tick event object (or an object with an appropriate \"delta\" property) being\n\t\t * passed into {{#crossLink \"Stage/update\"}}{{/crossLink}}.\n\t\t * @property framerate\n\t\t * @type {Number}\n\t\t * @default null\n\t\t **/\n\t\tthis.framerate = null;\n\t\t\n\t\t// set up the needed props for Timeline:\n\t\tprops.useTicks = props.paused = true;\n\t\t\n\t\t/**\n\t\t * The TweenJS Timeline that is associated with this MovieClip. This is created automatically when the MovieClip\n\t\t * instance is initialized. Animations are created by adding <a href=\"http://tweenjs.com\">TweenJS</a> Tween\n\t\t * instances to the timeline.\n\t\t *\n\t\t * <h4>Example</h4>\n\t\t *\n\t\t *      var tween = createjs.Tween.get(target).to({x:0}).to({x:100}, 30);\n\t\t *      var mc = new createjs.MovieClip();\n\t\t *      mc.timeline.addTween(tween);\n\t\t *\n\t\t * Elements can be added and removed from the timeline by toggling an \"_off\" property\n\t\t * using the <code>tweenInstance.to()</code> method. Note that using <code>Tween.set</code> is not recommended to\n\t\t * create MovieClip animations. The following example will toggle the target off on frame 0, and then back on for\n\t\t * frame 1. You can use the \"visible\" property to achieve the same effect.\n\t\t *\n\t\t *      var tween = createjs.Tween.get(target).to({_off:false})\n\t\t *          .wait(1).to({_off:true})\n\t\t *          .wait(1).to({_off:false});\n\t\t *\n\t\t * @property timeline\n\t\t * @type Timeline\n\t\t * @default null\n\t\t */\n\t\tthis.timeline = new createjs.Timeline(props);\n\t\t\n\t\t\n\t// private properties:\n\t\t/**\n\t\t * @property _synchOffset\n\t\t * @type Number\n\t\t * @default 0\n\t\t * @private\n\t\t */\n\t\tthis._synchOffset = 0;\n\t\n\t\t/**\n\t\t * @property _rawPosition\n\t\t * @type Number\n\t\t * @default -1\n\t\t * @private\n\t\t */\n\t\tthis._rawPosition = -1; // TODO: evaluate using a ._reset Boolean prop instead of -1.\n\t\t\n\t\t/**\n\t\t * @property _bound_resolveState\n\t\t * @type Function\n\t\t * @private\n\t\t */\n\t\tthis._bound_resolveState = this._resolveState.bind(this);\n\t\n\t\n\t\t/**\n\t\t * The time remaining from the previous tick, only applicable when .framerate is set.\n\t\t * @property _t\n\t\t * @type Number\n\t\t * @private\n\t\t */\n\t\tthis._t = 0;\n\t\n\t\t/**\n\t\t * List of display objects that are actively being managed by the MovieClip.\n\t\t * @property _managed\n\t\t * @type Object\n\t\t * @private\n\t\t */\n\t\tthis._managed = {};\n\t}\n\tvar p = createjs.extend(MovieClip, createjs.Container);\n\n\n// constants:\n\t/**\n\t * The MovieClip will advance independently of its parent, even if its parent is paused.\n\t * This is the default mode.\n\t * @property INDEPENDENT\n\t * @static\n\t * @type String\n\t * @default \"independent\"\n\t * @readonly\n\t **/\n\tMovieClip.INDEPENDENT = \"independent\";\n\n\t/**\n\t * The MovieClip will only display a single frame (as determined by the startPosition property).\n\t * @property SINGLE_FRAME\n\t * @static\n\t * @type String\n\t * @default \"single\"\n\t * @readonly\n\t **/\n\tMovieClip.SINGLE_FRAME = \"single\";\n\n\t/**\n\t * The MovieClip will be advanced only when its parent advances and will be synched to the position of\n\t * the parent MovieClip.\n\t * @property SYNCHED\n\t * @static\n\t * @type String\n\t * @default \"synched\"\n\t * @readonly\n\t **/\n\tMovieClip.SYNCHED = \"synched\";\n\t\n\t\n// static properties:\n\tMovieClip.inited = false;\n\t\n\t\n// static methods:\n\tMovieClip.init = function() {\n\t\tif (MovieClip.inited) { return; }\n\t\t// plugins introduce some overhead to Tween, so we only install this if an MC is instantiated.\n\t\tMovieClipPlugin.install();\n\t\tMovieClip.inited = true;\n\t};\n\t\n\t\n// getter / setters:\n\t/**\n\t * Use the {{#crossLink \"MovieClip/labels:property\"}}{{/crossLink}} property instead.\n\t * @method _getLabels\n\t * @protected\n\t * @return {Array}\n\t **/\n\tp._getLabels = function() {\n\t\treturn this.timeline.getLabels();\n\t};\n\t// MovieClip.getLabels is @deprecated. Remove for 1.1+\n\tp.getLabels = createjs.deprecate(p._getLabels, \"MovieClip.getLabels\");\n\n\t/**\n\t * Use the {{#crossLink \"MovieClip/currentLabel:property\"}}{{/crossLink}} property instead.\n\t * @method _getCurrentLabel\n\t * @protected\n\t * @return {String}\n\t **/\n\tp._getCurrentLabel = function() {\n\t\treturn this.timeline.currentLabel;\n\t};\n\t// MovieClip.getCurrentLabel is @deprecated. Remove for 1.1+\n\tp.getCurrentLabel = createjs.deprecate(p._getCurrentLabel, \"MovieClip.getCurrentLabel\");\n\n\t/**\n\t * Use the {{#crossLink \"MovieClip/duration:property\"}}{{/crossLink}} property instead.\n\t * @method _getDuration\n\t * @protected\n\t * @return {Number}\n\t **/\n\tp._getDuration = function() {\n\t\treturn this.timeline.duration;\n\t};\n\t// MovieClip.getDuration is @deprecated. Remove for 1.1+\n\tp.getDuration = createjs.deprecate(p._getDuration, \"MovieClip.getDuration\");\n\n\t/**\n\t * Returns an array of objects with label and position (aka frame) properties, sorted by position.\n\t * @property labels\n\t * @type {Array}\n\t * @readonly\n\t **/\n\t\n\t/**\n\t * Returns the name of the label on or immediately before the current frame.\n\t * @property currentLabel\n\t * @type {String}\n\t * @readonly\n\t **/\n\t\n\t/**\n\t * Returns the duration of this MovieClip in seconds or ticks.\n\t * @property totalFrames\n\t * @type {Number}\n\t * @readonly\n\t **/\n\t\n\t/**\n\t * Returns the duration of this MovieClip in seconds or ticks.\n\t * @property duration\n\t * @type {Number}\n\t * @readonly\n\t **/\n\ttry {\n\t\tObject.defineProperties(p, {\n\t\t\tlabels: { get: p._getLabels },\n\t\t\tcurrentLabel: { get: p._getCurrentLabel },\n\t\t\ttotalFrames: { get: p._getDuration },\n\t\t\tduration: { get: p._getDuration }\n\t\t\t// TODO: can we just proxy .currentFrame to tl.position as well? Ditto for .loop (or just remove entirely).\n\t\t});\n\t} catch (e) {}\n\n\n// public methods:\n\t/**\n\t * Constructor alias for backwards compatibility. This method will be removed in future versions.\n\t * Subclasses should be updated to use {{#crossLink \"Utility Methods/extends\"}}{{/crossLink}}.\n\t * @method initialize\n\t * @deprecated in favour of `createjs.promote()`\n\t **/\n\tp.initialize = MovieClip; // TODO: Deprecated. This is for backwards support of Adobe Flash/Animate\n\n\t/**\n\t * Returns true or false indicating whether the display object would be visible if drawn to a canvas.\n\t * This does not account for whether it would be visible within the boundaries of the stage.\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method isVisible\n\t * @return {Boolean} Boolean indicating whether the display object would be visible if drawn to a canvas\n\t **/\n\tp.isVisible = function() {\n\t\t// children are placed in draw, so we can't determine if we have content.\n\t\treturn !!(this.visible && this.alpha > 0 && this.scaleX != 0 && this.scaleY != 0);\n\t};\n\n\t/**\n\t * Draws the display object into the specified context ignoring its visible, alpha, shadow, and transform.\n\t * Returns true if the draw was handled (useful for overriding functionality).\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method draw\n\t * @param {CanvasRenderingContext2D} ctx The canvas 2D context object to draw into.\n\t * @param {Boolean} ignoreCache Indicates whether the draw operation should ignore any current cache.\n\t * For example, used for drawing the cache (to prevent it from simply drawing an existing cache back\n\t * into itself).\n\t **/\n\tp.draw = function(ctx, ignoreCache) {\n\t\t// draw to cache first:\n\t\tif (this.DisplayObject_draw(ctx, ignoreCache)) { return true; }\n\t\tthis._updateState();\n\t\tthis.Container_draw(ctx, ignoreCache);\n\t\treturn true;\n\t};\n\n\t/**\n\t * Sets paused to false.\n\t * @method play\n\t **/\n\tp.play = function() {\n\t\tthis.paused = false;\n\t};\n\t\n\t/**\n\t * Sets paused to true.\n\t * @method stop\n\t **/\n\tp.stop = function() {\n\t\tthis.paused = true;\n\t};\n\t\n\t/**\n\t * Advances this movie clip to the specified position or label and sets paused to false.\n\t * @method gotoAndPlay\n\t * @param {String|Number} positionOrLabel The animation name or frame number to go to.\n\t **/\n\tp.gotoAndPlay = function(positionOrLabel) {\n\t\tthis.paused = false;\n\t\tthis._goto(positionOrLabel);\n\t};\n\t\n\t/**\n\t * Advances this movie clip to the specified position or label and sets paused to true.\n\t * @method gotoAndStop\n\t * @param {String|Number} positionOrLabel The animation or frame name to go to.\n\t **/\n\tp.gotoAndStop = function(positionOrLabel) {\n\t\tthis.paused = true;\n\t\tthis._goto(positionOrLabel);\n\t};\n\t\n\t/**\n\t * Advances the playhead. This occurs automatically each tick by default.\n\t * @param [time] {Number} The amount of time in ms to advance by. Only applicable if framerate is set.\n\t * @method advance\n\t*/\n\tp.advance = function(time) {\n\t\tvar independent = MovieClip.INDEPENDENT;\n\t\tif (this.mode !== independent) { return; } // update happens in draw for synched clips\n\t\t\n\t\t// if this MC doesn't have a framerate, hunt ancestors for one:\n\t\tvar o=this, fps = o.framerate;\n\t\twhile ((o = o.parent) && fps === null) { if (o.mode === independent) { fps = o._framerate; } }\n\t\tthis._framerate = fps;\n\t\t\n\t\tif (this.paused) { return; }\n\t\t\n\t\t// calculate how many frames to advance:\n\t\tvar t = (fps !== null && fps !== -1 && time !== null) ? time/(1000/fps) + this._t : 1;\n\t\tvar frames = t|0;\n\t\tthis._t = t-frames; // leftover time, save to add to next advance.\n\t\t\n\t\twhile (frames--) { this._updateTimeline(this._rawPosition+1, false); }\n\t};\n\t\n\t/**\n\t * MovieClip instances cannot be cloned.\n\t * @method clone\n\t **/\n\tp.clone = function() {\n\t\t// TODO: add support for this? Need to clone the Timeline & retarget tweens - pretty complex.\n\t\tthrow(\"MovieClip cannot be cloned.\");\n\t};\n\t\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[MovieClip (name=\"+  this.name +\")]\";\n\t};\n\n\n// private methods:\n\t/**\n\t * Docced in superclass.\n\t **/\n\tp._updateState = function() {\n\t\tif (this._rawPosition === -1 || this.mode !== MovieClip.INDEPENDENT) { this._updateTimeline(-1); }\n\t};\n\n\t/**\n\t * @method _tick\n\t * @param {Object} evtObj An event object that will be dispatched to all tick listeners. This object is reused between dispatchers to reduce construction & GC costs.\n\t * function.\n\t * @protected\n\t **/\n\tp._tick = function(evtObj) {\n\t\tthis.advance(evtObj&&evtObj.delta);\n\t\tthis.Container__tick(evtObj);\n\t};\n\t\n\t/**\n\t * @method _goto\n\t * @param {String|Number} positionOrLabel The animation name or frame number to go to.\n\t * @protected\n\t **/\n\tp._goto = function(positionOrLabel) {\n\t\tvar pos = this.timeline.resolve(positionOrLabel);\n\t\tif (pos == null) { return; }\n\t\tthis._t = 0;\n\t\tthis._updateTimeline(pos, true);\n\t};\n\t\n\t/**\n\t * @method _reset\n\t * @private\n\t **/\n\tp._reset = function() {\n\t\tthis._rawPosition = -1;\n\t\tthis._t = this.currentFrame = 0;\n\t\tthis.paused = false;\n\t};\n\t\n\t/**\n\t * @method _updateTimeline\n\t * @param {Boolean} jump Indicates whether this update is due to jumping (via gotoAndXX) to a new position.\n\t * @protected\n\t **/\n\tp._updateTimeline = function(rawPosition, jump) {\n\t\tvar synced = this.mode !== MovieClip.INDEPENDENT, tl = this.timeline;\n\t\tif (synced) { rawPosition = this.startPosition + (this.mode===MovieClip.SINGLE_FRAME?0:this._synchOffset); }\n\t\tif (rawPosition < 0) { rawPosition = 0; }\n\t\tif (this._rawPosition === rawPosition && !synced) { return; }\n\t\tthis._rawPosition = rawPosition;\n\t\t\n\t\t// update timeline position, ignoring actions if this is a graphic.\n\t\ttl.loop = this.loop; // TODO: should we maintain this on MovieClip, or just have it on timeline?\n\t\ttl.setPosition(rawPosition, synced || !this.actionsEnabled, jump, this._bound_resolveState);\n\t};\n\t\n\t/**\n\t * Renders position 0 without running actions or updating _rawPosition.\n\t * Primarily used by Animate CC to build out the first frame in the constructor of MC symbols.\n\t * NOTE: not tested when run after the MC advances past the first frame.\n\t * @method _renderFirstFrame\n\t * @protected\n\t **/\n\tp._renderFirstFrame = function() {\n\t\tvar tl = this.timeline, pos = tl.rawPosition;\n\t\ttl.setPosition(0, true, true, this._bound_resolveState);\n\t\ttl.rawPosition = pos;\n\t};\n\t\n\t/**\n\t * Runs via a callback after timeline property updates and before actions.\n\t * @method _resolveState\n\t * @protected\n\t **/\n\tp._resolveState = function() {\n\t\tvar tl = this.timeline;\n\t\tthis.currentFrame = tl.position;\n\t\t\n\t\tfor (var n in this._managed) { this._managed[n] = 1; }\n\n\t\tvar tweens = tl.tweens;\n\t\tfor (var i=0, l=tweens.length; i<l; i++) {\n\t\t\tvar tween = tweens[i],  target = tween.target;\n\t\t\tif (target === this || tween.passive) { continue; } // TODO: this assumes the actions tween from Animate has `this` as the target. There's likely a better approach.\n\t\t\tvar offset = tween._stepPosition;\n\n\t\t\tif (target instanceof createjs.DisplayObject) {\n\t\t\t\t// motion tween.\n\t\t\t\tthis._addManagedChild(target, offset);\n\t\t\t} else {\n\t\t\t\t// state tween.\n\t\t\t\tthis._setState(target.state, offset);\n\t\t\t}\n\t\t}\n\n\t\tvar kids = this.children;\n\t\tfor (i=kids.length-1; i>=0; i--) {\n\t\t\tvar id = kids[i].id;\n\t\t\tif (this._managed[id] === 1) {\n\t\t\t\tthis.removeChildAt(i);\n\t\t\t\tdelete(this._managed[id]);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * @method _setState\n\t * @param {Array} state\n\t * @param {Number} offset\n\t * @protected\n\t **/\n\tp._setState = function(state, offset) {\n\t\tif (!state) { return; }\n\t\tfor (var i=state.length-1;i>=0;i--) {\n\t\t\tvar o = state[i];\n\t\t\tvar target = o.t;\n\t\t\tvar props = o.p;\n\t\t\tfor (var n in props) { target[n] = props[n]; }\n\t\t\tthis._addManagedChild(target, offset);\n\t\t}\n\t};\n\n\t/**\n\t * Adds a child to the timeline, and sets it up as a managed child.\n\t * @method _addManagedChild\n\t * @param {MovieClip} child The child MovieClip to manage\n\t * @param {Number} offset\n\t * @private\n\t **/\n\tp._addManagedChild = function(child, offset) {\n\t\tif (child._off) { return; }\n\t\tthis.addChildAt(child,0);\n\n\t\tif (child instanceof MovieClip) {\n\t\t\tchild._synchOffset = offset;\n\t\t\t// TODO: this does not precisely match Adobe Flash/Animate, which loses track of the clip if it is renamed or removed from the timeline, which causes it to reset.\n\t\t\t// TODO: should also reset when MovieClip loops, though that will be a bit tricky to detect.\n\t\t\tif (child.mode === MovieClip.INDEPENDENT && child.autoReset && (!this._managed[child.id])) { child._reset(); }\n\t\t}\n\t\tthis._managed[child.id] = 2;\n\t};\n\t\n\t/**\n\t * @method _getBounds\n\t * @param {Matrix2D} matrix\n\t * @param {Boolean} ignoreTransform\n\t * @return {Rectangle}\n\t * @protected\n\t **/\n\tp._getBounds = function(matrix, ignoreTransform) {\n\t\tvar bounds = this.DisplayObject_getBounds();\n\t\tif (!bounds) {\n\t\t\tif (this.frameBounds) { bounds = this._rectangle.copy(this.frameBounds[this.currentFrame]); }\n\t\t}\n\t\tif (bounds) { return this._transformBounds(bounds, matrix, ignoreTransform); }\n\t\treturn this.Container__getBounds(matrix, ignoreTransform);\n\t};\n\n\n\tcreatejs.MovieClip = createjs.promote(MovieClip, \"Container\");\n\n\n\n// MovieClipPlugin for TweenJS:\n\t/**\n\t * This plugin works with <a href=\"http://tweenjs.com\" target=\"_blank\">TweenJS</a> to prevent the startPosition\n\t * property from tweening.\n\t * @private\n\t * @class MovieClipPlugin\n\t * @constructor\n\t **/\n\tfunction MovieClipPlugin() {\n\t\tthrow(\"MovieClipPlugin cannot be instantiated.\")\n\t}\n\t\n\t/**\n\t * @property priority\n\t * @type {Number}\n\t * @static\n\t * @readonly\n\t **/\n\tMovieClipPlugin.priority = 100; // very high priority, should run first\n\t\n\t/**\n\t * @property ID\n\t * @type {String}\n\t * @static\n\t * @readonly\n\t **/\n\tMovieClipPlugin.ID = \"MovieClip\";\n\n\t/**\n\t * @method install\n\t * @static\n\t **/\n\tMovieClipPlugin.install = function() {\n\t\tcreatejs.Tween._installPlugin(MovieClipPlugin);\n\t};\n\t\n\t/**\n\t * @method init\n\t * @param {Tween} tween\n\t * @param {String} prop\n\t * @param {*} value\n\t * @static\n\t **/\n\tMovieClipPlugin.init = function(tween, prop, value) {\n\t\tif (prop === \"startPosition\" && tween.target instanceof MovieClip) { tween._addPlugin(MovieClipPlugin); }\n\t};\n\t\n\t/**\n\t * @method step\n\t * @param {Tween} tween\n\t * @param {TweenStep} step\n\t * @param {Object} props\n\t * @static\n\t **/\n\tMovieClipPlugin.step = function(tween, step, props) {};\n\n\t/**\n\t * @method change\n\t * @param {Tween} tween\n\t * @param {TweenStep} step\n\t * @param {*} value\n\t * @param {Number} ratio\n\t * @param {Object} end\n\t * @return {*}\n\t * @static\n\t */\n\tMovieClipPlugin.change = function(tween, step, prop, value, ratio, end) {\n\t\tif (prop === \"startPosition\") { return (ratio === 1 ? step.props[prop] : step.prev.props[prop]); }\n\t};\n\n}());\n\n//##############################################################################\n// SpriteSheetUtils.js\n//##############################################################################\n\n(function() {\r\n\t\"use strict\";\r\n\t\r\n\t\r\n// constructor:\r\n\t/**\r\n\t * The SpriteSheetUtils class is a collection of static methods for working with {{#crossLink \"SpriteSheet\"}}{{/crossLink}}s.\r\n\t * A sprite sheet is a series of images (usually animation frames) combined into a single image on a regular grid. For\r\n\t * example, an animation consisting of 8 100x100 images could be combined into a 400x200 sprite sheet (4 frames across\r\n\t * by 2 high). The SpriteSheetUtils class uses a static interface and should not be instantiated.\r\n\t * @class SpriteSheetUtils\r\n\t * @static\r\n\t **/\r\n\tfunction SpriteSheetUtils() {\r\n\t\tthrow \"SpriteSheetUtils cannot be instantiated\";\r\n\t}\r\n\r\n\r\n// private static properties:\r\n\t/**\r\n\t * @property _workingCanvas\r\n\t * @static\r\n\t * @type HTMLCanvasElement | Object\r\n\t * @protected\r\n\t*/\r\n\t/**\r\n\t * @property _workingContext\r\n\t * @static\r\n\t * @type CanvasRenderingContext2D\r\n\t * @protected\r\n\t*/\r\n\tvar canvas = (createjs.createCanvas?createjs.createCanvas():document.createElement(\"canvas\"));\r\n\tif (canvas.getContext) {\r\n\t\tSpriteSheetUtils._workingCanvas = canvas;\r\n\t\tSpriteSheetUtils._workingContext = canvas.getContext(\"2d\");\r\n\t\tcanvas.width = canvas.height = 1;\r\n\t}\r\n\r\n\r\n// public static methods:\r\n\t/**\r\n\t * Returns a single frame of the specified sprite sheet as a new PNG image. An example of when this may be useful is\r\n\t * to use a spritesheet frame as the source for a bitmap fill.\r\n\t *\r\n\t * <strong>WARNING:</strong> In almost all cases it is better to display a single frame using a {{#crossLink \"Sprite\"}}{{/crossLink}}\r\n\t * with a {{#crossLink \"Sprite/gotoAndStop\"}}{{/crossLink}} call than it is to slice out a frame using this\r\n\t * method and display it with a Bitmap instance. You can also crop an image using the {{#crossLink \"Bitmap/sourceRect\"}}{{/crossLink}}\r\n\t * property of {{#crossLink \"Bitmap\"}}{{/crossLink}}.\r\n\t *\r\n\t * The extractFrame method may cause cross-domain warnings since it accesses pixels directly on the canvas.\r\n\t * @method extractFrame\r\n\t * @static\r\n\t * @param {SpriteSheet} spriteSheet The SpriteSheet instance to extract a frame from.\r\n\t * @param {Number|String} frameOrAnimation The frame number or animation name to extract. If an animation\r\n\t * name is specified, only the first frame of the animation will be extracted.\r\n\t * @return {HTMLImageElement} a single frame of the specified sprite sheet as a new PNG image.\r\n\t*/\r\n\tSpriteSheetUtils.extractFrame = function(spriteSheet, frameOrAnimation) {\r\n\t\tif (isNaN(frameOrAnimation)) {\r\n\t\t\tframeOrAnimation = spriteSheet.getAnimation(frameOrAnimation).frames[0];\r\n\t\t}\r\n\t\tvar data = spriteSheet.getFrame(frameOrAnimation);\r\n\t\tif (!data) { return null; }\r\n\t\tvar r = data.rect;\r\n\t\tvar canvas = SpriteSheetUtils._workingCanvas;\r\n\t\tcanvas.width = r.width;\r\n\t\tcanvas.height = r.height;\r\n\t\tSpriteSheetUtils._workingContext.drawImage(data.image, r.x, r.y, r.width, r.height, 0, 0, r.width, r.height);\r\n\t\tvar img = document.createElement(\"img\");\r\n\t\timg.src = canvas.toDataURL(\"image/png\");\r\n\t\treturn img;\r\n\t};\r\n\r\n\t// SpriteSheetUtils.addFlippedFrames is @deprecated. Remove for 1.1+\r\n\tSpriteSheetUtils.addFlippedFrames = createjs.deprecate(null, \"SpriteSheetUtils.addFlippedFrames\");\r\n\r\n\t// SpriteSheetUtils.addFlippedFrames is @deprecated. Remove for 1.1+\r\n\tSpriteSheetUtils.mergeAlpha = createjs.deprecate(null, \"SpriteSheetUtils.mergeAlpha\");\r\n\r\n\t\r\n// private static methods:\r\n\tSpriteSheetUtils._flip = function(spriteSheet, count, h, v) {\r\n\t\tvar imgs = spriteSheet._images;\r\n\t\tvar canvas = SpriteSheetUtils._workingCanvas;\r\n\t\tvar ctx = SpriteSheetUtils._workingContext;\r\n\t\tvar il = imgs.length/count;\r\n\t\tfor (var i=0;i<il;i++) {\r\n\t\t\tvar src = imgs[i];\r\n\t\t\tsrc.__tmp = i; // a bit hacky, but faster than doing indexOf below.\r\n\t\t\tctx.setTransform(1,0,0,1,0,0);\r\n\t\t\tctx.clearRect(0,0,canvas.width+1,canvas.height+1);\r\n\t\t\tcanvas.width = src.width;\r\n\t\t\tcanvas.height = src.height;\r\n\t\t\tctx.setTransform(h?-1:1, 0, 0, v?-1:1, h?src.width:0, v?src.height:0);\r\n\t\t\tctx.drawImage(src,0,0);\r\n\t\t\tvar img = document.createElement(\"img\");\r\n\t\t\timg.src = canvas.toDataURL(\"image/png\");\r\n\t\t\t// work around a strange bug in Safari:\r\n\t\t\timg.width = (src.width||src.naturalWidth);\r\n\t\t\timg.height = (src.height||src.naturalHeight);\r\n\t\t\timgs.push(img);\r\n\t\t}\r\n\r\n\t\tvar frames = spriteSheet._frames;\r\n\t\tvar fl = frames.length/count;\r\n\t\tfor (i=0;i<fl;i++) {\r\n\t\t\tsrc = frames[i];\r\n\t\t\tvar rect = src.rect.clone();\r\n\t\t\timg = imgs[src.image.__tmp+il*count];\r\n\r\n\t\t\tvar frame = {image:img,rect:rect,regX:src.regX,regY:src.regY};\r\n\t\t\tif (h) {\r\n\t\t\t\trect.x = (img.width||img.naturalWidth)-rect.x-rect.width; // update rect\r\n\t\t\t\tframe.regX = rect.width-src.regX; // update registration point\r\n\t\t\t}\r\n\t\t\tif (v) {\r\n\t\t\t\trect.y = (img.height||img.naturalHeight)-rect.y-rect.height;  // update rect\r\n\t\t\t\tframe.regY = rect.height-src.regY; // update registration point\r\n\t\t\t}\r\n\t\t\tframes.push(frame);\r\n\t\t}\r\n\r\n\t\tvar sfx = \"_\"+(h?\"h\":\"\")+(v?\"v\":\"\");\r\n\t\tvar names = spriteSheet._animations;\r\n\t\tvar data = spriteSheet._data;\r\n\t\tvar al = names.length/count;\r\n\t\tfor (i=0;i<al;i++) {\r\n\t\t\tvar name = names[i];\r\n\t\t\tsrc = data[name];\r\n\t\t\tvar anim = {name:name+sfx,speed:src.speed,next:src.next,frames:[]};\r\n\t\t\tif (src.next) { anim.next += sfx; }\r\n\t\t\tframes = src.frames;\r\n\t\t\tfor (var j=0,l=frames.length;j<l;j++) {\r\n\t\t\t\tanim.frames.push(frames[j]+fl*count);\r\n\t\t\t}\r\n\t\t\tdata[anim.name] = anim;\r\n\t\t\tnames.push(anim.name);\r\n\t\t}\r\n\t};\r\n\r\n\r\n\tcreatejs.SpriteSheetUtils = SpriteSheetUtils;\r\n}());\n\n//##############################################################################\n// SpriteSheetBuilder.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * The SpriteSheetBuilder allows you to generate {{#crossLink \"SpriteSheet\"}}{{/crossLink}} instances at run time\n\t * from any display object. This can allow you to maintain your assets as vector graphics (for low file size), and\n\t * render them at run time as SpriteSheets for better performance.\n\t *\n\t * SpriteSheets can be built either synchronously, or asynchronously, so that large SpriteSheets can be generated\n\t * without locking the UI.\n\t *\n\t * Note that the \"images\" used in the generated SpriteSheet are actually canvas elements, and that they will be\n\t * sized to the nearest power of 2 up to the value of {{#crossLink \"SpriteSheetBuilder/maxWidth:property\"}}{{/crossLink}}\n\t * or {{#crossLink \"SpriteSheetBuilder/maxHeight:property\"}}{{/crossLink}}.\n\t * @class SpriteSheetBuilder\n\t * @param {Number} [framerate=0] The {{#crossLink \"SpriteSheet/framerate:property\"}}{{/crossLink}} of\n\t * {{#crossLink \"SpriteSheet\"}}{{/crossLink}} instances that are created.\n\t * @extends EventDispatcher\n\t * @constructor\n\t **/\n\tfunction SpriteSheetBuilder(framerate) {\n\t\tthis.EventDispatcher_constructor();\n\t\t\n\t// public properties:\n\t\t/**\n\t\t * The maximum width for the images (not individual frames) in the generated SpriteSheet. It is recommended to\n\t\t * use a power of 2 for this value (ex. 1024, 2048, 4096). If the frames cannot all fit within the max\n\t\t * dimensions, then additional images will be created as needed.\n\t\t * @property maxWidth\n\t\t * @type Number\n\t\t * @default 2048\n\t\t*/\n\t\tthis.maxWidth = 2048;\n\t\n\t\t/**\n\t\t * The maximum height for the images (not individual frames) in the generated SpriteSheet. It is recommended to\n\t\t * use a power of 2 for this value (ex. 1024, 2048, 4096). If the frames cannot all fit within the max\n\t\t * dimensions, then additional images will be created as needed.\n\t\t * @property maxHeight\n\t\t * @type Number\n\t\t * @default 2048\n\t\t **/\n\t\tthis.maxHeight = 2048;\n\t\n\t\t/**\n\t\t * The SpriteSheet that was generated. This will be null before a build is completed successfully.\n\t\t * @property spriteSheet\n\t\t * @type SpriteSheet\n\t\t **/\n\t\tthis.spriteSheet = null;\n\t\n\t\t/**\n\t\t * The scale to apply when drawing all frames to the SpriteSheet. This is multiplied against any scale specified\n\t\t * in the addFrame call. This can be used, for example, to generate a SpriteSheet at run time that is tailored\n\t\t * to the a specific device resolution (ex. tablet vs mobile).\n\t\t * @property scale\n\t\t * @type Number\n\t\t * @default 1\n\t\t **/\n\t\tthis.scale = 1;\n\t\n\t\t/**\n\t\t* The padding to use between frames. This is helpful to preserve antialiasing on drawn vector content.\n\t\t* @property padding\n\t\t* @type Number\n\t\t* @default 1\n\t\t**/\n\t\tthis.padding = 1;\n\t\n\t\t/**\n\t\t * A number from 0.01 to 0.99 that indicates what percentage of time the builder can use. This can be\n\t\t * thought of as the number of seconds per second the builder will use. For example, with a timeSlice value of 0.3,\n\t\t * the builder will run 20 times per second, using approximately 15ms per build (30% of available time, or 0.3s per second).\n\t\t * Defaults to 0.3.\n\t\t * @property timeSlice\n\t\t * @type Number\n\t\t * @default 0.3\n\t\t **/\n\t\tthis.timeSlice = 0.3;\n\t\n\t\t/**\n\t\t * A value between 0 and 1 that indicates the progress of a build, or -1 if a build has not\n\t\t * been initiated.\n\t\t * @property progress\n\t\t * @type Number\n\t\t * @default -1\n\t\t * @readonly\n\t\t */\n\t\tthis.progress = -1;\n\n\t\t/**\n\t\t * A {{#crossLink \"SpriteSheet/framerate:property\"}}{{/crossLink}} value that will be passed to new {{#crossLink \"SpriteSheet\"}}{{/crossLink}} instances that are\n\t\t * created. If no framerate is specified (or it is 0), then SpriteSheets will use the {{#crossLink \"Ticker\"}}{{/crossLink}}\n\t\t * framerate.\n\t\t * @property framerate\n\t\t * @type Number\n\t\t * @default 0\n\t\t */\n\t\tthis.framerate = framerate || 0;\n\t\n\t\n\t// private properties:\n\t\t/**\n\t\t * @property _frames\n\t\t * @protected\n\t\t * @type Array\n\t\t **/\n\t\tthis._frames = [];\n\t\n\t\t/**\n\t\t * @property _animations\n\t\t * @protected\n\t\t * @type Array\n\t\t **/\n\t\tthis._animations = {};\n\t\n\t\t/**\n\t\t * @property _data\n\t\t * @protected\n\t\t * @type Array\n\t\t **/\n\t\tthis._data = null;\n\t\n\t\t/**\n\t\t * @property _nextFrameIndex\n\t\t * @protected\n\t\t * @type Number\n\t\t **/\n\t\tthis._nextFrameIndex = 0;\n\t\n\t\t/**\n\t\t * @property _index\n\t\t * @protected\n\t\t * @type Number\n\t\t **/\n\t\tthis._index = 0;\n\t\n\t\t/**\n\t\t * @property _timerID\n\t\t * @protected\n\t\t * @type Number\n\t\t **/\n\t\tthis._timerID = null;\n\t\n\t\t/**\n\t\t * @property _scale\n\t\t * @protected\n\t\t * @type Number\n\t\t **/\n\t\tthis._scale = 1;\n\t}\n\tvar p = createjs.extend(SpriteSheetBuilder, createjs.EventDispatcher);\n\n// constants:\n\tSpriteSheetBuilder.ERR_DIMENSIONS = \"frame dimensions exceed max spritesheet dimensions\";\n\tSpriteSheetBuilder.ERR_RUNNING = \"a build is already running\";\n\n// events:\n\t/**\n\t * Dispatched when a build completes.\n\t * @event complete\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type.\n\t * @since 0.6.0\n\t */\n\n\t/**\n\t * Dispatched when an asynchronous build has progress.\n\t * @event progress\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type.\n\t * @param {Number} progress The current progress value (0-1).\n\t * @since 0.6.0\n\t */\n\n\n// public methods:\n\t/**\n\t * Adds a frame to the {{#crossLink \"SpriteSheet\"}}{{/crossLink}}. Note that the frame will not be drawn until you\n\t * call {{#crossLink \"SpriteSheetBuilder/build\"}}{{/crossLink}} method. The optional setup params allow you to have\n\t * a function run immediately before the draw occurs. For example, this allows you to add a single source multiple\n\t * times, but manipulate it or its children to change it to generate different frames.\n\t *\n\t * Note that the source's transformations (x, y, scale, rotate, alpha) will be ignored, except for regX/Y. To apply\n\t * transforms to a source object and have them captured in the SpriteSheet, simply place it into a {{#crossLink \"Container\"}}{{/crossLink}}\n\t * and pass in the Container as the source.\n\t * @method addFrame\n\t * @param {DisplayObject} source The source {{#crossLink \"DisplayObject\"}}{{/crossLink}}  to draw as the frame.\n\t * @param {Rectangle} [sourceRect] A {{#crossLink \"Rectangle\"}}{{/crossLink}} defining the portion of the\n\t * source to draw to the frame. If not specified, it will look for a `getBounds` method, bounds property, or\n\t * `nominalBounds` property on the source to use. If one is not found, the frame will be skipped.\n\t * @param {Number} [scale=1] Optional. The scale to draw this frame at. Default is 1.\n\t * @param {Function} [setupFunction] A function to call immediately before drawing this frame. It will be called with two parameters: the source, and setupData.\n\t * @param {Object} [setupData] Arbitrary setup data to pass to setupFunction as the second parameter.\n\t * @return {Number} The index of the frame that was just added, or null if a sourceRect could not be determined.\n\t **/\n\tp.addFrame = function(source, sourceRect, scale, setupFunction, setupData) {\n\t\tif (this._data) { throw SpriteSheetBuilder.ERR_RUNNING; }\n\t\tvar rect = sourceRect||source.bounds||source.nominalBounds;\n\t\tif (!rect&&source.getBounds) { rect = source.getBounds(); }\n\t\tif (!rect) { return null; }\n\t\tscale = scale||1;\n\t\treturn this._frames.push({source:source, sourceRect:rect, scale:scale, funct:setupFunction, data:setupData, index:this._frames.length, height:rect.height*scale})-1;\n\t};\n\n\t/**\n\t * Adds an animation that will be included in the created {{#crossLink \"SpriteSheet\"}}{{/crossLink}}.\n\t * @method addAnimation\n\t * @param {String} name The name for the animation.\n\t * @param {Array} frames An array of frame indexes that comprise the animation. Ex. [3,6,5] would describe an animation\n\t * that played frame indexes 3, 6, and 5 in that order.\n\t * @param {String} [next] Specifies the name of the animation to continue to after this animation ends. You can\n\t * also pass false to have the animation stop when it ends. By default it will loop to the start of the same animation.\n\t * @param {Number} [speed] Specifies a frame advance speed for this animation. For example, a value of 0.5 would\n\t * cause the animation to advance every second tick. Note that earlier versions used `frequency` instead, which had\n\t * the opposite effect.\n\t **/\n\tp.addAnimation = function(name, frames, next, speed) {\n\t\tif (this._data) { throw SpriteSheetBuilder.ERR_RUNNING; }\n\t\tthis._animations[name] = {frames:frames, next:next, speed:speed};\n\t};\n\n\t/**\n\t * This will take a {{#crossLink \"MovieClip\"}}{{/crossLink}} instance, and add its frames and labels to this\n\t * builder. Labels will be added as an animation running from the label index to the next label. For example, if\n\t * there is a label named \"foo\" at frame 0 and a label named \"bar\" at frame 10, in a MovieClip with 15 frames, it\n\t * will add an animation named \"foo\" that runs from frame index 0 to 9, and an animation named \"bar\" that runs from\n\t * frame index 10 to 14.\n\t *\n\t * Note that this will iterate through the full MovieClip with {{#crossLink \"MovieClip/actionsEnabled:property\"}}{{/crossLink}}\n\t * set to `false`, ending on the last frame.\n\t * @method addMovieClip\n\t * @param {MovieClip} source The source MovieClip instance to add to the SpriteSheet.\n\t * @param {Rectangle} [sourceRect] A {{#crossLink \"Rectangle\"}}{{/crossLink}} defining the portion of the source to\n\t * draw to the frame. If not specified, it will look for a {{#crossLink \"DisplayObject/getBounds\"}}{{/crossLink}}\n\t * method, `frameBounds` Array, `bounds` property, or `nominalBounds` property on the source to use. If one is not\n\t * found, the MovieClip will be skipped.\n\t * @param {Number} [scale=1] The scale to draw the movie clip at.\n\t * @param {Function} [setupFunction] A function to call immediately before drawing each frame. It will be called\n\t * with three parameters: the source, setupData, and the frame index.\n\t * @param {Object} [setupData] Arbitrary setup data to pass to setupFunction as the second parameter.\n\t * @param {Function} [labelFunction] This method will be called for each MovieClip label that is added with four\n\t * parameters: the label name, the source MovieClip instance, the starting frame index (in the movieclip timeline)\n\t * and the end index. It must return a new name for the label/animation, or `false` to exclude the label.\n\t **/\n\tp.addMovieClip = function(source, sourceRect, scale, setupFunction, setupData, labelFunction) {\n\t\tif (this._data) { throw SpriteSheetBuilder.ERR_RUNNING; }\n\t\tvar rects = source.frameBounds;\n\t\tvar rect = sourceRect||source.bounds||source.nominalBounds;\n\t\tif (!rect&&source.getBounds) { rect = source.getBounds(); }\n\t\tif (!rect && !rects) { return; }\n\n\t\tvar i, l, baseFrameIndex = this._frames.length;\n\t\tvar duration = source.timeline.duration;\n\t\tfor (i=0; i<duration; i++) {\n\t\t\tvar r = (rects&&rects[i]) ? rects[i] : rect;\n\t\t\tthis.addFrame(source, r, scale, this._setupMovieClipFrame, {i:i, f:setupFunction, d:setupData});\n\t\t}\n\t\tvar labels = source.timeline._labels;\n\t\tvar lbls = [];\n\t\tfor (var n in labels) {\n\t\t\tlbls.push({index:labels[n], label:n});\n\t\t}\n\t\tif (lbls.length) {\n\t\t\tlbls.sort(function(a,b){ return a.index-b.index; });\n\t\t\tfor (i=0,l=lbls.length; i<l; i++) {\n\t\t\t\tvar label = lbls[i].label;\n\t\t\t\tvar start = baseFrameIndex+lbls[i].index;\n\t\t\t\tvar end = baseFrameIndex+((i == l-1) ? duration : lbls[i+1].index);\n\t\t\t\tvar frames = [];\n\t\t\t\tfor (var j=start; j<end; j++) { frames.push(j); }\n\t\t\t\tif (labelFunction) {\n\t\t\t\t\tlabel = labelFunction(label, source, start, end);\n\t\t\t\t\tif (!label) { continue; }\n\t\t\t\t}\n\t\t\t\tthis.addAnimation(label, frames, true); // for now, this loops all animations.\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Builds a {{#crossLink \"SpriteSheet\"}}{{/crossLink}} instance based on the current frames.\n\t * @method build\n\t * @return {SpriteSheet} The created SpriteSheet instance, or null if a build is already running or an error\n\t * occurred.\n\t **/\n\tp.build = function() {\n\t\tif (this._data) { throw SpriteSheetBuilder.ERR_RUNNING; }\n\t\tthis._startBuild();\n\t\twhile (this._drawNext()) {}\n\t\tthis._endBuild();\n\t\treturn this.spriteSheet;\n\t};\n\n\t/**\n\t * Asynchronously builds a {{#crossLink \"SpriteSheet\"}}{{/crossLink}} instance based on the current frames. It will\n\t * run 20 times per second, using an amount of time defined by `timeSlice`. When it is complete it will call the\n\t * specified callback.\n\t * @method buildAsync\n\t * @param {Number} [timeSlice] Sets the timeSlice property on this instance.\n\t **/\n\tp.buildAsync = function(timeSlice) {\n\t\tif (this._data) { throw SpriteSheetBuilder.ERR_RUNNING; }\n\t\tthis.timeSlice = timeSlice;\n\t\tthis._startBuild();\n\t\tvar _this = this;\n\t\tthis._timerID = setTimeout(function() { _this._run(); }, 50-Math.max(0.01, Math.min(0.99, this.timeSlice||0.3))*50);\n\t};\n\n\t/**\n\t * Stops the current asynchronous build.\n\t * @method stopAsync\n\t **/\n\tp.stopAsync = function() {\n\t\tclearTimeout(this._timerID);\n\t\tthis._data = null;\n\t};\n\n\t/**\n\t * SpriteSheetBuilder instances cannot be cloned.\n\t * @method clone\n\t **/\n\tp.clone = function() {\n\t\tthrow(\"SpriteSheetBuilder cannot be cloned.\");\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[SpriteSheetBuilder]\";\n\t};\n\n\n// private methods:\n\t/**\n\t * @method _startBuild\n\t * @protected\n\t **/\n\tp._startBuild = function() {\n\t\tvar pad = this.padding||0;\n\t\tthis.progress = 0;\n\t\tthis.spriteSheet = null;\n\t\tthis._index = 0;\n\t\tthis._scale = this.scale;\n\t\tvar dataFrames = [];\n\t\tthis._data = {\n\t\t\timages: [],\n\t\t\tframes: dataFrames,\n\t\t\tframerate: this.framerate,\n\t\t\tanimations: this._animations // TODO: should we \"clone\" _animations in case someone adds more animations after a build?\n\t\t};\n\n\t\tvar frames = this._frames.slice();\n\t\tframes.sort(function(a,b) { return (a.height<=b.height) ? -1 : 1; });\n\n\t\tif (frames[frames.length-1].height+pad*2 > this.maxHeight) { throw SpriteSheetBuilder.ERR_DIMENSIONS; }\n\t\tvar y=0, x=0;\n\t\tvar img = 0;\n\t\twhile (frames.length) {\n\t\t\tvar o = this._fillRow(frames, y, img, dataFrames, pad);\n\t\t\tif (o.w > x) { x = o.w; }\n\t\t\ty += o.h;\n\t\t\tif (!o.h || !frames.length) {\n\t\t\t\tvar canvas = createjs.createCanvas?createjs.createCanvas():document.createElement(\"canvas\");\n\t\t\t\tcanvas.width = this._getSize(x,this.maxWidth);\n\t\t\t\tcanvas.height = this._getSize(y,this.maxHeight);\n\t\t\t\tthis._data.images[img] = canvas;\n\t\t\t\tif (!o.h) {\n\t\t\t\t\tx=y=0;\n\t\t\t\t\timg++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\t\n\t/**\n\t * @method _setupMovieClipFrame\n\t * @protected\n\t * @return {Number} The width & height of the row.\n\t **/\n\tp._setupMovieClipFrame = function(source, data) {\n\t\tvar ae = source.actionsEnabled;\n\t\tsource.actionsEnabled = false;\n\t\tsource.gotoAndStop(data.i);\n\t\tsource.actionsEnabled = ae;\n\t\tdata.f&&data.f(source, data.d, data.i);\n\t};\n\n\t/**\n\t * @method _getSize\n\t * @protected\n\t * @return {Number} The width & height of the row.\n\t **/\n\tp._getSize = function(size,max) {\n\t\tvar pow = 4;\n\t\twhile (Math.pow(2,++pow) < size){}\n\t\treturn Math.min(max,Math.pow(2,pow));\n\t};\n\n\t/**\n\t * @method _fillRow\n\t * @param {Array} frames\n\t * @param {Number} y\n\t * @param {HTMLImageElement} img\n\t * @param {Object} dataFrames\n\t * @param {Number} pad\n\t * @protected\n\t * @return {Number} The width & height of the row.\n\t **/\n\tp._fillRow = function(frames, y, img, dataFrames, pad) {\n\t\tvar w = this.maxWidth;\n\t\tvar maxH = this.maxHeight;\n\t\ty += pad;\n\t\tvar h = maxH-y;\n\t\tvar x = pad;\n\t\tvar height = 0;\n\t\tfor (var i=frames.length-1; i>=0; i--) {\n\t\t\tvar frame = frames[i];\n\t\t\tvar sc = this._scale*frame.scale;\n\t\t\tvar rect = frame.sourceRect;\n\t\t\tvar source = frame.source;\n\t\t\tvar rx = Math.floor(sc*rect.x-pad);\n\t\t\tvar ry = Math.floor(sc*rect.y-pad);\n\t\t\tvar rh = Math.ceil(sc*rect.height+pad*2);\n\t\t\tvar rw = Math.ceil(sc*rect.width+pad*2);\n\t\t\tif (rw > w) { throw SpriteSheetBuilder.ERR_DIMENSIONS; }\n\t\t\tif (rh > h || x+rw > w) { continue; }\n\t\t\tframe.img = img;\n\t\t\tframe.rect = new createjs.Rectangle(x,y,rw,rh);\n\t\t\theight = height || rh;\n\t\t\tframes.splice(i,1);\n\t\t\tdataFrames[frame.index] = [x,y,rw,rh,img,Math.round(-rx+sc*source.regX-pad),Math.round(-ry+sc*source.regY-pad)];\n\t\t\tx += rw;\n\t\t}\n\t\treturn {w:x, h:height};\n\t};\n\n\t/**\n\t * @method _endBuild\n\t * @protected\n\t **/\n\tp._endBuild = function() {\n\t\tthis.spriteSheet = new createjs.SpriteSheet(this._data);\n\t\tthis._data = null;\n\t\tthis.progress = 1;\n\t\tthis.dispatchEvent(\"complete\");\n\t};\n\n\t/**\n\t * @method _run\n\t * @protected\n\t **/\n\tp._run = function() {\n\t\tvar ts = Math.max(0.01, Math.min(0.99, this.timeSlice||0.3))*50;\n\t\tvar t = (new Date()).getTime()+ts;\n\t\tvar complete = false;\n\t\twhile (t > (new Date()).getTime()) {\n\t\t\tif (!this._drawNext()) { complete = true; break; }\n\t\t}\n\t\tif (complete) {\n\t\t\tthis._endBuild();\n\t\t} else {\n\t\t\tvar _this = this;\n\t\t\tthis._timerID = setTimeout(function() { _this._run(); }, 50-ts);\n\t\t}\n\t\tvar p = this.progress = this._index/this._frames.length;\n\t\tif (this.hasEventListener(\"progress\")) {\n\t\t\tvar evt = new createjs.Event(\"progress\");\n\t\t\tevt.progress = p;\n\t\t\tthis.dispatchEvent(evt);\n\t\t}\n\t};\n\n\t/**\n\t * @method _drawNext\n\t * @protected\n\t * @return Boolean Returns false if this is the last draw.\n\t **/\n\tp._drawNext = function() {\n\t\tvar frame = this._frames[this._index];\n\t\tvar sc = frame.scale*this._scale;\n\t\tvar rect = frame.rect;\n\t\tvar sourceRect = frame.sourceRect;\n\t\tvar canvas = this._data.images[frame.img];\n\t\tvar ctx = canvas.getContext(\"2d\");\n\t\tframe.funct&&frame.funct(frame.source, frame.data);\n\t\tctx.save();\n\t\tctx.beginPath();\n\t\tctx.rect(rect.x, rect.y, rect.width, rect.height);\n\t\tctx.clip();\n\t\tctx.translate(Math.ceil(rect.x-sourceRect.x*sc), Math.ceil(rect.y-sourceRect.y*sc));\n\t\tctx.scale(sc,sc);\n\t\tframe.source.draw(ctx); // display object will draw itself.\n\t\tctx.restore();\n\t\treturn (++this._index) < this._frames.length;\n\t};\n\n\n\tcreatejs.SpriteSheetBuilder = createjs.promote(SpriteSheetBuilder, \"EventDispatcher\");\n}());\n\n//##############################################################################\n// DOMElement.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * <b>This class is still experimental, and more advanced use is likely to be buggy. Please report bugs.</b>\n\t *\n\t * A DOMElement allows you to associate a HTMLElement with the display list. It will be transformed\n\t * within the DOM as though it is child of the {{#crossLink \"Container\"}}{{/crossLink}} it is added to. However, it is\n\t * not rendered to canvas, and as such will retain whatever z-index it has relative to the canvas (ie. it will be\n\t * drawn in front of or behind the canvas).\n\t *\n\t * The position of a DOMElement is relative to their parent node in the DOM. It is recommended that\n\t * the DOM Object be added to a div that also contains the canvas so that they share the same position\n\t * on the page.\n\t *\n\t * DOMElement is useful for positioning HTML elements over top of canvas content, and for elements\n\t * that you want to display outside the bounds of the canvas. For example, a tooltip with rich HTML\n\t * content.\n\t *\n\t * <h4>Mouse Interaction</h4>\n\t *\n\t * DOMElement instances are not full EaselJS display objects, and do not participate in EaselJS mouse\n\t * events or support methods like hitTest. To get mouse events from a DOMElement, you must instead add handlers to\n\t * the htmlElement (note, this does not support EventDispatcher)\n\t *\n\t *      var domElement = new createjs.DOMElement(htmlElement);\n\t *      domElement.htmlElement.onclick = function() {\n\t *          console.log(\"clicked\");\n\t *      }\n\t *\n\t * <strong>Important:</strong> This class needs to be notified it is about to be drawn, this will happen automatically\n\t * if you call stage.update, calling stage.draw or disabling tickEnabled will miss important steps and it will render\n\t * stale information.\n\t *\n\t * @class DOMElement\n\t * @extends DisplayObject\n\t * @constructor\n\t * @param {HTMLElement} htmlElement A reference or id for the DOM element to manage.\n\t */\n\tfunction DOMElement(htmlElement) {\n\t\tthis.DisplayObject_constructor();\n\t\t\n\t\tif (typeof(htmlElement)==\"string\") { htmlElement = document.getElementById(htmlElement); }\n\t\tthis.mouseEnabled = false;\n\t\t\n\t\tvar style = htmlElement.style;\n\t\tstyle.position = \"absolute\";\n\t\tstyle.transformOrigin = style.WebkitTransformOrigin = style.msTransformOrigin = style.MozTransformOrigin = style.OTransformOrigin = \"0% 0%\";\n\t\t\n\t\t\n\t// public properties:\n\t\t/**\n\t\t * The DOM object to manage.\n\t\t * @property htmlElement\n\t\t * @type HTMLElement\n\t\t */\n\t\tthis.htmlElement = htmlElement;\n\t\n\t\n\t// private properties:\n\t\t/**\n\t\t * @property _oldMtx\n\t\t * @type Matrix2D\n\t\t * @protected\n\t\t */\n\t\tthis._oldProps = null;\n\n\t\t/**\n\t\t * Used to track the object which this class attached listeners to, helps optimize listener attachment.\n\t\t * @property _oldStage\n\t\t * @type Stage\n\t\t * @protected\n\t\t */\n\t\tthis._oldStage = null;\n\t\t/**\n\t\t * The event listener proxy triggered drawing draw for special circumstances.\n\t\t * @property _drawAction\n\t\t * @type function\n\t\t * @protected\n\t\t */\n\t\tthis._drawAction = null;\n\t}\n\tvar p = createjs.extend(DOMElement, createjs.DisplayObject);\n\n\t// TODO: deprecated\n\t// p.initialize = function() {}; // searchable for devs wondering where it is. REMOVED. See docs for details.\n\n\n// public methods:\n\t/**\n\t * Returns true or false indicating whether the display object would be visible if drawn to a canvas.\n\t * This does not account for whether it would be visible within the boundaries of the stage.\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method isVisible\n\t * @return {Boolean} Boolean indicating whether the display object would be visible if drawn to a canvas\n\t */\n\tp.isVisible = function() {\n\t\treturn this.htmlElement != null;\n\t};\n\n\t/**\n\t * Draws the display object into the specified context ignoring its visible, alpha, shadow, and transform.\n\t * Returns true if the draw was handled (useful for overriding functionality).\n\t * NOTE: This method is mainly for internal use, though it may be useful for advanced uses.\n\t * @method draw\n\t * @param {CanvasRenderingContext2D} ctx The canvas 2D context object to draw into.\n\t * @param {Boolean} ignoreCache Indicates whether the draw operation should ignore any current cache.\n\t * For example, used for drawing the cache (to prevent it from simply drawing an existing cache back\n\t * into itself).\n\t * @return {Boolean}\n\t */\n\tp.draw = function(ctx, ignoreCache) {\n\t\t// this relies on the _tick method because draw isn't called if the parent is not visible.\n\t\t// the actual update happens in _handleDrawEnd\n\t\treturn true;\n\t};\n\n\t/**\n\t * Not applicable to DOMElement.\n\t * @method cache\n\t */\n\tp.cache = function() {};\n\n\t/**\n\t * Not applicable to DOMElement.\n\t * @method uncache\n\t */\n\tp.uncache = function() {};\n\n\t/**\n\t * Not applicable to DOMElement.\n\t * @method updateCache\n\t */\n\tp.updateCache = function() {};\n\n\t/**\n\t * Not applicable to DOMElement.\n\t * @method hitTest\n\t */\n\tp.hitTest = function() {};\n\n\t/**\n\t * Not applicable to DOMElement.\n\t * @method localToGlobal\n\t */\n\tp.localToGlobal = function() {};\n\n\t/**\n\t * Not applicable to DOMElement.\n\t * @method globalToLocal\n\t */\n\tp.globalToLocal = function() {};\n\n\t/**\n\t * Not applicable to DOMElement.\n\t * @method localToLocal\n\t */\n\tp.localToLocal = function() {};\n\n\t/**\n\t * DOMElement cannot be cloned. Throws an error.\n\t * @method clone\n\t */\n\tp.clone = function() {\n\t\tthrow(\"DOMElement cannot be cloned.\")\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t */\n\tp.toString = function() {\n\t\treturn \"[DOMElement (name=\"+  this.name +\")]\";\n\t};\n\n\t/**\n     * Interaction events should be added to `htmlElement`, and not the DOMElement instance, since DOMElement instances\n\t * are not full EaselJS display objects and do not participate in EaselJS mouse events.\n\t * @event click\n\t */\n\n     /**\n     * Interaction events should be added to `htmlElement`, and not the DOMElement instance, since DOMElement instances\n \t * are not full EaselJS display objects and do not participate in EaselJS mouse events.\n\t * @event dblClick\n\t */\n\n     /**\n      * Interaction events should be added to `htmlElement`, and not the DOMElement instance, since DOMElement instances\n \t  * are not full EaselJS display objects and do not participate in EaselJS mouse events.\n\t  * @event mousedown\n\t  */\n\n     /**\n      * The HTMLElement can listen for the mouseover event, not the DOMElement instance.\n      * Since DOMElement instances are not full EaselJS display objects and do not participate in EaselJS mouse events.\n      * @event mouseover\n\t  */\n\n     /**\n      * Not applicable to DOMElement.\n\t  * @event tick\n\t  */\n\n\n// private methods:\n\t/**\n\t * @method _tick\n\t * @param {Object} evtObj An event object that will be dispatched to all tick listeners. This object is reused between dispatchers to reduce construction & GC costs.\n\t * function.\n\t * @protected\n\t */\n\tp._tick = function(evtObj) {\n\t\tvar stage = this.stage;\n\t\tif(stage && stage !== this._oldStage) {\n\t\t\tthis._drawAction && stage.off(\"drawend\", this._drawAction);\n\t\t\tthis._drawAction = stage.on(\"drawend\", this._handleDrawEnd, this);\n\t\t\tthis._oldStage = stage;\n\t\t}\n\t\tthis.DisplayObject__tick(evtObj);\n\t};\n\t\n\t/**\n\t * @method _handleDrawEnd\n\t * @param {Event} evt\n\t * @protected\n\t */\n\tp._handleDrawEnd = function(evt) {\n\t\tvar o = this.htmlElement;\n\t\tif (!o) { return; }\n\t\tvar style = o.style;\n\t\t\n\t\tvar props = this.getConcatenatedDisplayProps(this._props), mtx = props.matrix;\n\t\t\n\t\tvar visibility = props.visible ? \"visible\" : \"hidden\";\n\t\tif (visibility != style.visibility) { style.visibility = visibility; }\n\t\tif (!props.visible) { return; }\n\t\t\n\t\tvar oldProps = this._oldProps, oldMtx = oldProps&&oldProps.matrix;\n\t\tvar n = 10000; // precision\n\t\t\n\t\tif (!oldMtx || !oldMtx.equals(mtx)) {\n\t\t\tvar str = \"matrix(\" + (mtx.a*n|0)/n +\",\"+ (mtx.b*n|0)/n +\",\"+ (mtx.c*n|0)/n +\",\"+ (mtx.d*n|0)/n +\",\"+ (mtx.tx+0.5|0);\n\t\t\tstyle.transform = style.WebkitTransform = style.OTransform = style.msTransform = str +\",\"+ (mtx.ty+0.5|0) +\")\";\n\t\t\tstyle.MozTransform = str +\"px,\"+ (mtx.ty+0.5|0) +\"px)\";\n\t\t\tif (!oldProps) { oldProps = this._oldProps = new createjs.DisplayProps(true, null); }\n\t\t\toldProps.matrix.copy(mtx);\n\t\t}\n\t\t\n\t\tif (oldProps.alpha != props.alpha) {\n\t\t\tstyle.opacity = \"\"+(props.alpha*n|0)/n;\n\t\t\toldProps.alpha = props.alpha;\n\t\t}\n\t};\n\n\n\tcreatejs.DOMElement = createjs.promote(DOMElement, \"DisplayObject\");\n}());\n\n//##############################################################################\n// Filter.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Base class that all filters should inherit from. Filters need to be applied to objects that have been cached using\n\t * the {{#crossLink \"DisplayObject/cache\"}}{{/crossLink}} method. If an object changes, please cache it again, or use\n\t * {{#crossLink \"DisplayObject/updateCache\"}}{{/crossLink}}. Note that the filters must be applied before caching.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      myInstance.filters = [\n\t *          new createjs.ColorFilter(0, 0, 0, 1, 255, 0, 0),\n\t *          new createjs.BlurFilter(5, 5, 10)\n\t *      ];\n\t *      myInstance.cache(0,0, 100, 100);\n\t *\n\t * Note that each filter can implement a {{#crossLink \"Filter/getBounds\"}}{{/crossLink}} method, which returns the\n\t * margins that need to be applied in order to fully display the filter. For example, the {{#crossLink \"BlurFilter\"}}{{/crossLink}}\n\t * will cause an object to feather outwards, resulting in a margin around the shape.\n\t *\n\t * <h4>EaselJS Filters</h4>\n\t * EaselJS comes with a number of pre-built filters:\n\t * <ul><li>{{#crossLink \"AlphaMapFilter\"}}{{/crossLink}} : Map a greyscale image to the alpha channel of a display object</li>\n\t *      <li>{{#crossLink \"AlphaMaskFilter\"}}{{/crossLink}}: Map an image's alpha channel to the alpha channel of a display object</li>\n\t *      <li>{{#crossLink \"BlurFilter\"}}{{/crossLink}}: Apply vertical and horizontal blur to a display object</li>\n\t *      <li>{{#crossLink \"ColorFilter\"}}{{/crossLink}}: Color transform a display object</li>\n\t *      <li>{{#crossLink \"ColorMatrixFilter\"}}{{/crossLink}}: Transform an image using a {{#crossLink \"ColorMatrix\"}}{{/crossLink}}</li>\n\t * </ul>\n\t *\n\t * @class Filter\n\t * @constructor\n\t **/\n\tfunction Filter() {\n\t\t/**\n\t\t * A flag stating that this filter uses a context draw mode and cannot be batched into imageData processing.\n\t\t * @property usesContext\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.usesContext = false;\n\n\t\t/**\n\t\t * Another filter that is required to act as part of this filter and created and managed under the hood.\n\t\t * @private\n\t\t * @property _multiPass\n\t\t * @type {Filter}\n\t\t * @default null\n\t\t */\n\t\tthis._multiPass = null;\n\n\t\t/**\n\t\t * Pre-processed template shader code. It will be parsed before being fed in into the shader compiler.\n\t\t * This should be based upon StageGL.SHADER_VERTEX_BODY_REGULAR\n\t\t * @property VTX_SHADER\n\t\t * @virtual\n\t\t * @type {String}\n\t\t * @readonly\n\t\t */\n\t\tthis.VTX_SHADER_BODY = null;\n\n\t\t/**\n\t\t * Pre-processed template shader code. It will be parsed before being fed in into the shader compiler.\n\t\t * This should be based upon StageGL.SHADER_FRAGMENT_BODY_REGULAR\n\t\t * @property FRAG_SHADER\n\t\t * @virtual\n\t\t * @type {String}\n\t\t * @readonly\n\t\t */\n\t\tthis.FRAG_SHADER_BODY = null;\n\t}\n\tvar p = Filter.prototype;\n\n// public methods:\n\t/**\n\t * Provides padding values for this filter. That is, how much the filter will extend the visual bounds of an object it is applied to.\n\t * @method getBounds\n\t * @param {Rectangle} [rect] If specified, the provided Rectangle instance will be expanded by the padding amounts and returned.\n\t * @return {Rectangle} If a `rect` param was provided, it is returned. If not, either a new rectangle with the padding values, or null if no padding is required for this filter.\n\t **/\n\tp.getBounds = function(rect) {\n\t\treturn rect;\n\t};\n\n\t/**\n\t * Assign any unique uniforms or other setup functionality here.\n\t * @method shaderParamSetup\n\t * @virtual\n\t * @param {WebGLContext} gl The context associated with the stage performing the render.\n\t * @param {StageGL} stage The stage instance that will be rendering.\n\t * @param {ShaderProgram} shaderProgram The compiled shader that is going to be used to perform the render.\n\t */\n\tp.shaderParamSetup = function(gl, stage, shaderProgram) {};\n\n\t/**\n\t * Applies the filter to the specified context.\n\t * @method applyFilter\n\t * @param {CanvasRenderingContext2D} ctx The 2D context to use as the source.\n\t * @param {Number} x The x position to use for the source rect.\n\t * @param {Number} y The y position to use for the source rect.\n\t * @param {Number} width The width to use for the source rect.\n\t * @param {Number} height The height to use for the source rect.\n\t * @param {CanvasRenderingContext2D} [targetCtx] The 2D context to draw the result to. Defaults to the context passed to ctx.\n\t * @param {Number} [targetX] The x position to draw the result to. Defaults to the value passed to x.\n\t * @param {Number} [targetY] The y position to draw the result to. Defaults to the value passed to y.\n\t * @return {Boolean} If the filter was applied successfully.\n\t **/\n\tp.applyFilter = function(ctx, x, y, width, height, targetCtx, targetX, targetY) {\n\t\t// this is the default behaviour because most filters access pixel data. It is overridden when not needed.\n\t\ttargetCtx = targetCtx || ctx;\n\t\tif (targetX == null) { targetX = x; }\n\t\tif (targetY == null) { targetY = y; }\n\t\ttry {\n\t\t\tvar imageData = ctx.getImageData(x, y, width, height);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this._applyFilter(imageData)) {\n\t\t\ttargetCtx.putImageData(imageData, targetX, targetY);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[Filter]\";\n\t};\n\n\t/**\n\t * Returns a clone of this Filter instance.\n\t * @method clone\n\t * @return {Filter} A clone of the current Filter instance.\n\t **/\n\tp.clone = function() {\n\t\treturn new Filter();\n\t};\n\t\n// private methods:\n\t/**\n\t * @method _applyFilter\n\t * @param {ImageData} imageData Target ImageData instance.\n\t * @return {Boolean}\n\t **/\n\tp._applyFilter = function(imageData) { return true; };\n\n\n\tcreatejs.Filter = Filter;\n}());\n\n//##############################################################################\n// BitmapCache.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * The BitmapCache is an internal representation of all the cache properties and logic required in order to \"cache\"\n\t * an object. This information and functionality used to be located on a {{#crossLink \"DisplayObject/cache\"}}{{/crossLink}}\n\t * method in {{#crossLink \"DisplayObject\"}}{{/crossLink}}, but was moved to its own class.\n\t *\n\t * Caching in this context is purely visual, and will render the DisplayObject out into an image to be used instead\n\t * of the object. The actual cache itself is still stored on the target with the {{#crossLink \"DisplayObject/cacheCanvas:property\"}}{{/crossLink}}.\n\t * Working with a singular image like a {{#crossLink \"Bitmap\"}}{{/crossLink}} there is little benefit to performing \n\t * a cache as it is already a single image. Caching is best done on containers containing multiple complex parts that \n\t * do not move often, so that rendering the image instead will improve overall rendering speed. A cached object will \n\t * not visually update until explicitly told to do so with a call to update, much like a Stage. If a cache is being \n\t * updated every frame it is likely not improving rendering performance. Cache are best used when updates will be sparse.\n\t *\n\t * Caching is also a co-requisite for applying filters to prevent expensive filters running constantly without need, \n\t * and to physically enable some effects. The BitmapCache is also responsible for applying filters to objects and \n\t * reads each {{#crossLink \"Filter\"}}{{/crossLink}} due to this relationship. Real-time Filters are not recommended \n\t * performance wise when dealing with a Context2D canvas. For best performance and to still allow for some visual \n\t * effects use a compositeOperation when possible.\n\t * @class BitmapCache\n\t * @constructor\n\t **/\n\tfunction BitmapCache() {\n\n\t\t// public:\n\t\t/**\n\t\t * Width of the cache relative to the target object.\n\t\t * @property width\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default undefined\n\t\t **/\n\t\tthis.width = undefined;\n\n\t\t/**\n\t\t * Height of the cache relative to the target object.\n\t\t * @property height\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default undefined\n\t\t * @todo Should the width and height be protected?\n\t\t **/\n\t\tthis.height = undefined;\n\n\t\t/**\n\t\t * Horizontal position of the cache relative to the target's origin.\n\t\t * @property x\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default undefined\n\t\t **/\n\t\tthis.x = undefined;\n\n\t\t/**\n\t\t * Vertical position of the cache relative to target's origin.\n\t\t * @property y\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default undefined\n\t\t **/\n\t\tthis.y = undefined;\n\n\t\t/**\n\t\t * The internal scale of the cache image, does not affects display size. This is useful to both increase and\n\t\t * decrease render quality. Objects with increased scales are more likely to look good when scaled up or rotated.\n\t\t * Objects with decreased scales can save on rendering performance.\n\t\t * @property scale\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 1\n\t\t **/\n\t\tthis.scale = 1;\n\n\t\t/**\n\t\t * The x offset used for drawing into the cache itself, accounts for both transforms applied.\n\t\t * @property offX\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t **/\n\t\tthis.offX = 0;\n\n\t\t/**\n\t\t * The y offset used for drawing into the cache itself, accounts for both transforms applied.\n\t\t * @property offY\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t **/\n\t\tthis.offY = 0;\n\n\t\t/**\n\t\t * Track how many times the cache has been updated, mostly used for preventing duplicate cacheURLs.\n\t\t * This can be useful to see if a cache has been updated.\n\t\t * @property cacheID\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t **/\n\t\tthis.cacheID = 0;\n\n\t\t// protected:\n\t\t/**\n\t\t * The relative offset of the filter's x position, used for drawing the cache onto its container.\n\t\t * Re-calculated every update call before drawing.\n\t\t * @property _filterOffY\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t **/\n\t\tthis._filterOffX = 0;\n\n\t\t/**\n\t\t * The relative offset of the filter's y position, used for drawing the cache onto its container.\n\t\t * Re-calculated every update call before drawing.\n\t\t * @property _filterOffY\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t **/\n\t\tthis._filterOffY = 0;\n\n\t\t/**\n\t\t * The cacheID when a DataURL was requested.\n\t\t * @property _cacheDataURLID\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t **/\n\t\tthis._cacheDataURLID = 0;\n\n\t\t/**\n\t\t * The cache's DataURL, generated on-demand using the getter.\n\t\t * @property _cacheDataURL\n\t\t * @protected\n\t\t * @type {String}\n\t\t * @default null\n\t\t **/\n\t\tthis._cacheDataURL = null;\n\n\t\t/**\n\t\t * Internal tracking of final bounding width, approximately width*scale; however, filters can complicate the actual value.\n\t\t * @property _drawWidth\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t **/\n\t\tthis._drawWidth = 0;\n\n\t\t/**\n\t\t * Internal tracking of final bounding height, approximately height*scale; however, filters can complicate the actual value.\n\t\t * @property _drawHeight\n\t\t * @protected\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t **/\n\t\tthis._drawHeight = 0;\n\t}\n\tvar p = BitmapCache.prototype;\n\n\t/**\n\t * Returns the bounds that surround all applied filters, relies on each filter to describe how it changes bounds.\n\t * @method getFilterBounds\n\t * @param {DisplayObject} target The object to check the filter bounds for.\n\t * @param {Rectangle} [output=null] Optional parameter, if provided then calculated bounds will be applied to that object.\n\t * @return {Rectangle} bounds object representing the bounds with filters.\n\t * @static\n\t **/\n\tBitmapCache.getFilterBounds = function(target, output) {\n\t\tif(!output){ output = new createjs.Rectangle(); }\n\t\tvar filters = target.filters;\n\t\tvar filterCount = filters && filters.length;\n\t\tif (!!filterCount <= 0) { return output; }\n\n\t\tfor(var i=0; i<filterCount; i++) {\n\t\t\tvar f = filters[i];\n\t\t\tif(!f || !f.getBounds){ continue; }\n\t\t\tvar test = f.getBounds();\n\t\t\tif(!test){ continue; }\n\t\t\tif(i==0) {\n\t\t\t\toutput.setValues(test.x, test.y, test.width, test.height);\n\t\t\t} else {\n\t\t\t\toutput.extend(test.x, test.y, test.width, test.height);\n\t\t\t}\n\t\t}\n\n\t\treturn output;\n\t};\n\n// public methods:\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[BitmapCache]\";\n\t};\n\n\t/**\n\t * Actually create the correct cache surface and properties associated with it. Caching and it's benefits are discussed\n\t * by the {{#crossLink \"DisplayObject/cache\"}}{{/crossLink}} function and this class description. Here are the detailed\n\t * specifics of how to use the options object.\n\t *\n\t * - If options.useGL is set to \"new\" a StageGL is created and contained on this for use when rendering the cache.\n\t * - If options.useGL is set to \"stage\" if the current stage is a StageGL it will be used. If not then it will default to \"new\".\n\t * - If options.useGL is a StageGL instance it will not create one but use the one provided.\n\t * - If options.useGL is undefined a Context 2D cache will be performed.\n\t *\n\t * This means you can use any combination of StageGL and 2D with either, neither, or both the stage and cache being\n\t * WebGL. Using \"new\" with a StageGL display list is highly unrecommended, but still an option. It should be avoided\n\t * due to negative performance reasons and the Image loading limitation noted in the class complications above.\n\t *\n\t * When \"options.useGL\" is set to the parent stage of the target and WebGL, performance is increased by using\n\t * \"RenderTextures\" instead of canvas elements. These are internal Textures on the graphics card stored in the GPU.\n\t * Because they are no longer canvases you cannot perform operations you could with a regular canvas. The benefit\n\t * is that this avoids the slowdown of copying the texture back and forth from the GPU to a Canvas element.\n\t * This means \"stage\" is the recommended option when available.\n\t *\n\t * A StageGL cache does not infer the ability to draw objects a StageGL cannot currently draw, i.e. do not use a\n\t * WebGL context cache when caching a Shape, Text, etc.\n\t * <h4>WebGL cache with a 2D context</h4>\n\t *\n\t *     var stage = new createjs.Stage();\n\t *     var bmp = new createjs.Bitmap(src);\n\t *     bmp.cache(0, 0, bmp.width, bmp.height, 1, {gl: \"new\"});          // no StageGL to use, so make one\n\t *\n\t *     var shape = new createjs.Shape();\n\t *     shape.graphics.clear().fill(\"red\").drawRect(0,0,20,20);\n\t *     shape.cache(0, 0, 20, 20, 1);                             // cannot use WebGL cache\n\t *\n\t * <h4>WebGL cache with a WebGL context</h4>\n\t *\n\t *     var stageGL = new createjs.StageGL();\n\t *     var bmp = new createjs.Bitmap(src);\n\t *     bmp.cache(0, 0, bmp.width, bmp.height, 1, {gl: \"stage\"});       // use our StageGL to cache\n\t *\n\t *     var shape = new createjs.Shape();\n\t *     shape.graphics.clear().fill(\"red\").drawRect(0,0,20,20);\n\t *     shape.cache(0, 0, 20, 20, 1);                             // cannot use WebGL cache\n\t *\n\t * You may wish to create your own StageGL instance to control factors like clear color, transparency, AA, and\n\t * others. If you do, pass a new instance in instead of \"true\", the library will automatically set the\n\t * {{#crossLink \"StageGL/isCacheControlled\"}}{{/crossLink}} to true on your instance. This will trigger it to behave\n\t * correctly, and not assume your main context is WebGL.\n\t *\n\t * @public\n\t * @method BitmapCache.cache\n\t * @param {Number} x The x coordinate origin for the cache region.\n\t * @param {Number} y The y coordinate origin for the cache region.\n\t * @param {Number} width The width of the cache region.\n\t * @param {Number} height The height of the cache region.\n\t * @param {Number} [scale=1] The scale at which the cache will be created. For example, if you cache a vector shape\n\t * using myShape.cache(0,0,100,100,2) then the resulting cacheCanvas will be 200x200 px. This lets you scale and\n\t * rotate cached elements with greater fidelity. Default is 1.\n\t * @param {Object} [options=undefined] Specify additional parameters for the cache logic\n\t * @param {undefined|\"new\"|\"stage\"|StageGL} [options.useGL=undefined] Select whether to use context 2D, or WebGL rendering, and\n\t * whether to make a new stage instance or use an existing one. See above for extensive details on use.\n\t * @for BitmapCache\n\t */\n\t p.define = function(target, x, y, width, height, scale, options) {\n\t\tif(!target){ throw \"No symbol to cache\"; }\n\t\tthis._options = options;\n\t\tthis.target = target;\n\n\t\tthis.width =\t\twidth >= 1 ? width : 1;\n\t\tthis.height =\t\theight >= 1 ? height : 1;\n\t\tthis.x =\t\t\tx || 0;\n\t\tthis.y =\t\t\ty || 0;\n\t\tthis.scale =\t\tscale || 1;\n\n\t\tthis.update();\n\t};\n\n\t/**\n\t * Directly called via {{#crossLink \"DisplayObject/updateCache:method\"}}{{/crossLink}}, but also internally. This\n\t * has the dual responsibility of making sure the surface is ready to be drawn to, and performing the draw. For\n\t * full details of each behaviour, check the protected functions {{#crossLink \"BitmapCache/_updateSurface\"}}{{/crossLink}}\n\t * and {{#crossLink \"BitmapCache/_drawToCache\"}}{{/crossLink}} respectively.\n\t * @method update\n\t * @param {String} [compositeOperation=null] The DisplayObject this cache is linked to.\n\t **/\n\tp.update = function(compositeOperation) {\n\t\tif(!this.target) { throw \"define() must be called before update()\"; }\n\n\t\tvar filterBounds = BitmapCache.getFilterBounds(this.target);\n\t\tvar surface = this.target.cacheCanvas;\n\n\t\tthis._drawWidth = Math.ceil(this.width*this.scale) + filterBounds.width;\n\t\tthis._drawHeight = Math.ceil(this.height*this.scale) + filterBounds.height;\n\n\t\tif(!surface || this._drawWidth != surface.width || this._drawHeight != surface.height) {\n\t\t\tthis._updateSurface();\n\t\t}\n\n\t\tthis._filterOffX = filterBounds.x;\n\t\tthis._filterOffY = filterBounds.y;\n\t\tthis.offX = this.x*this.scale + this._filterOffX;\n\t\tthis.offY = this.y*this.scale + this._filterOffY;\n\n\t\tthis._drawToCache(compositeOperation);\n\n\t\tthis.cacheID = this.cacheID?this.cacheID+1:1;\n\t};\n\n\t/**\n\t * Reset and release all the properties and memory associated with this cache.\n\t * @method release\n\t **/\n\tp.release = function() {\n\t\tif (this._webGLCache) {\n\t\t\t// if it isn't cache controlled clean up after yourself\n\t\t\tif (!this._webGLCache.isCacheControlled) {\n\t\t\t\tif (this.__lastRT){ this.__lastRT = undefined; }\n\t\t\t\tif (this.__rtA){ this._webGLCache._killTextureObject(this.__rtA); }\n\t\t\t\tif (this.__rtB){ this._webGLCache._killTextureObject(this.__rtB); }\n\t\t\t\tif (this.target && this.target.cacheCanvas){ this._webGLCache._killTextureObject(this.target.cacheCanvas); }\n\t\t\t}\n\t\t\t// set the context to none and let the garbage collector get the rest when the canvas itself gets removed\n\t\t\tthis._webGLCache = false;\n\t\t} else {\n\t\t\tvar stage = this.target.stage;\n\t\t\tif (stage instanceof createjs.StageGL){\n\t\t\t\tstage.releaseTexture(this.target.cacheCanvas);\n\t\t\t}\n\t\t}\n\n\t\tthis.target = this.target.cacheCanvas = null;\n\t\tthis.cacheID = this._cacheDataURLID = this._cacheDataURL = undefined;\n\t\tthis.width = this.height = this.x = this.y = this.offX = this.offY = 0;\n\t\tthis.scale = 1;\n\t};\n\n\t/**\n\t * Returns a data URL for the cache, or `null` if this display object is not cached.\n\t * Uses {{#crossLink \"BitmapCache/cacheID:property\"}}{{/crossLink}} to ensure a new data URL is not generated if the\n\t * cache has not changed.\n\t * @method getCacheDataURL\n\t * @return {String} The image data url for the cache.\n\t **/\n\tp.getCacheDataURL = function() {\n\t\tvar cacheCanvas = this.target && this.target.cacheCanvas;\n\t\tif (!cacheCanvas) { return null; }\n\t\tif (this.cacheID != this._cacheDataURLID) {\n\t\t\tthis._cacheDataURLID = this.cacheID;\n\t\t\tthis._cacheDataURL = cacheCanvas.toDataURL?cacheCanvas.toDataURL():null;\t// incase function is\n\t\t}\n\t\treturn this._cacheDataURL;\n\t};\n\n\t/**\n\t * Use context2D drawing commands to display the cache canvas being used.\n\t * @method draw\n\t * @param {CanvasRenderingContext2D} ctx The context to draw into.\n\t * @return {Boolean} Whether the draw was handled successfully.\n\t **/\n\tp.draw = function(ctx) {\n\t\tif(!this.target) { return false; }\n\t\tctx.drawImage(this.target.cacheCanvas,\n\t\t\tthis.x + (this._filterOffX/this.scale),\t\tthis.y + (this._filterOffY/this.scale),\n\t\t\tthis._drawWidth/this.scale,\t\t\t\t\tthis._drawHeight/this.scale\n\t\t);\n\t\treturn true;\n\t};\n\n// private methods:\n\t/**\n\t * Create or resize the invisible canvas/surface that is needed for the display object(s) to draw to,\n\t * and in turn be used in their stead when drawing. The surface is resized to the size defined\n\t * by the width and height, factoring in scaling and filters. Adjust them to adjust the output size.\n\t * @method _updateSurface\n\t * @protected\n\t **/\n\tp._updateSurface = function() {\n\t\tif (!this._options || !this._options.useGL) {\n\t\t\tvar surface = this.target.cacheCanvas;\n\n\t\t\t// create it if it's missing\n\t\t\tif(!surface) {\n\t\t\t\tsurface = this.target.cacheCanvas = createjs.createCanvas?createjs.createCanvas():document.createElement(\"canvas\");\n\t\t\t}\n\n\t\t\t// now size it\n\t\t\tsurface.width = this._drawWidth;\n\t\t\tsurface.height = this._drawHeight;\n\t\t\treturn;\n\t\t}\n\n\t\t// create it if it's missing\n\t\tif (!this._webGLCache) {\n\t\t\tif (this._options.useGL === \"stage\") {\n\t\t\t\tif(!(this.target.stage && this.target.stage.isWebGL)){\n\t\t\t\t\tvar error = \"Cannot use 'stage' for cache because the object's parent stage is \";\n\t\t\t\t\terror += this.target.stage ? \"non WebGL.\" : \"not set, please addChild to the correct stage.\";\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tthis.target.cacheCanvas = true; // will be replaced with RenderTexture, temporary positive value for old \"isCached\" checks\n\t\t\t\tthis._webGLCache = this.target.stage;\n\n\t\t\t} else if(this._options.useGL === \"new\") {\n\t\t\t\tthis.target.cacheCanvas = document.createElement(\"canvas\"); // we can turn off autopurge because we wont be making textures here\n\t\t\t\tthis._webGLCache = new createjs.StageGL(this.target.cacheCanvas, {antialias: true, transparent: true, autoPurge: -1});\n\t\t\t\tthis._webGLCache.isCacheControlled = true;\t// use this flag to control stage sizing and final output\n\n\t\t\t} else if(this._options.useGL instanceof createjs.StageGL) {\n\t\t\t\tthis.target.cacheCanvas = true; // will be replaced with RenderTexture, temporary positive value for old \"isCached\" checks\n\t\t\t\tthis._webGLCache = this._options.useGL;\n\t\t\t\tthis._webGLCache.isCacheControlled = true;\t// use this flag to control stage sizing and final output\n\n\t\t\t} else {\n\t\t\t\tthrow \"Invalid option provided to useGL, expected ['stage', 'new', StageGL, undefined], got \"+ this._options.useGL;\n\t\t\t}\n\t\t}\n\n\t\t// now size render surfaces\n\t\tvar surface = this.target.cacheCanvas;\n\t\tvar stageGL = this._webGLCache;\n\n\t\t// if we have a dedicated stage we've gotta size it\n\t\tif (stageGL.isCacheControlled) {\n\t\t\tsurface.width = this._drawWidth;\n\t\t\tsurface.height = this._drawHeight;\n\t\t\tstageGL.updateViewport(this._drawWidth, this._drawHeight);\n\t\t}\n\t\tif (this.target.filters) {\n\t\t\t// with filters we can't tell how many we'll need but the most we'll ever need is two, so make them now\n\t\t\tstageGL.getTargetRenderTexture(this.target, this._drawWidth,this._drawHeight);\n\t\t\tstageGL.getTargetRenderTexture(this.target, this._drawWidth,this._drawHeight);\n\t\t} else {\n\t\t\t// without filters then we only need one RenderTexture, and that's only if its not a dedicated stage\n\t\t\tif (!stageGL.isCacheControlled) {\n\t\t\t\tstageGL.getTargetRenderTexture(this.target, this._drawWidth,this._drawHeight);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Perform the cache draw out for context 2D now that the setup properties have been performed.\n\t * @method _drawToCache\n\t * @protected\n\t **/\n\tp._drawToCache = function(compositeOperation) {\n\t\tvar surface = this.target.cacheCanvas;\n\t\tvar target = this.target;\n\t\tvar webGL = this._webGLCache;\n\n\t\tif (webGL){\n\t\t\t//TODO: auto split blur into an x/y pass\n\t\t\twebGL.cacheDraw(target, target.filters, this);\n\n\t\t\t// we may of swapped around which element the surface is, so we re-fetch it\n\t\t\tsurface = this.target.cacheCanvas;\n\n\t\t\tsurface.width = this._drawWidth;\n\t\t\tsurface.height = this._drawHeight;\n\t\t} else {\n\t\t\tvar ctx = surface.getContext(\"2d\");\n\n\t\t\tif (!compositeOperation) {\n\t\t\t\tctx.clearRect(0, 0, this._drawWidth+1, this._drawHeight+1);\n\t\t\t}\n\n\t\t\tctx.save();\n\t\t\tctx.globalCompositeOperation = compositeOperation;\n\t\t\tctx.setTransform(this.scale,0,0,this.scale, -this._filterOffX,-this._filterOffY);\n\t\t\tctx.translate(-this.x, -this.y);\n\t\t\ttarget.draw(ctx, true);\n\t\t\tctx.restore();\n\n\n\t\t\tif (target.filters && target.filters.length) {\n\t\t\t\tthis._applyFilters(ctx);\n\t\t\t}\n\t\t}\n\t\tsurface._invalid = true;\n\t};\n\n\t/**\n\t * Work through every filter and apply its individual visual transformation.\n\t * @method _applyFilters\n\t * @protected\n\t **/\n\tp._applyFilters = function(ctx) {\n\t\tvar filters = this.target.filters;\n\n\t\tvar w = this._drawWidth;\n\t\tvar h = this._drawHeight;\n\n\t\tvar data;\n\n\t\tvar i = 0, filter = filters[i];\n\t\tdo { // this is safe because we wouldn't be in apply filters without a filter count of at least 1\n\t\t\tif(filter.usesContext){\n\t\t\t\tif(data) {\n\t\t\t\t\tctx.putImageData(data, 0,0);\n\t\t\t\t\tdata = null;\n\t\t\t\t}\n\t\t\t\tfilter.applyFilter(ctx, 0,0, w,h);\n\t\t\t} else {\n\t\t\t\tif(!data) {\n\t\t\t\t\tdata = ctx.getImageData(0,0, w,h);\n\t\t\t\t}\n\t\t\t\tfilter._applyFilter(data);\n\t\t\t}\n\n\t\t\t// work through the multipass if it's there, otherwise move on\n\t\t\tfilter = filter._multiPass !== null ? filter._multiPass : filters[++i];\n\t\t} while (filter);\n\n\t\t//done\n\t\tif(data) {\n\t\t\tctx.putImageData(data, 0,0);\n\t\t}\n\t};\n\n\tcreatejs.BitmapCache = BitmapCache;\n}());\n\n//##############################################################################\n// BlurFilter.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Applies a box blur to DisplayObjects in context 2D and a Gaussian blur in webgl. Note that this filter is fairly\n\t * intensive, particularly if the quality is set higher than 1.\n\t *\n\t * <h4>Example</h4>\n\t * This example creates a red circle, and then applies a 5 pixel blur to it. It uses the {{#crossLink \"Filter/getBounds\"}}{{/crossLink}}\n\t * method to account for the spread that the blur causes.\n\t *\n\t *      var shape = new createjs.Shape().set({x:100,y:100});\n\t *      shape.graphics.beginFill(\"#ff0000\").drawCircle(0,0,50);\n\t *\n\t *      var blurFilter = new createjs.BlurFilter(5, 5, 1);\n\t *      shape.filters = [blurFilter];\n\t *      var bounds = blurFilter.getBounds();\n\t *\n\t *      shape.cache(-50+bounds.x, -50+bounds.y, 100+bounds.width, 100+bounds.height);\n\t *\n\t * See {{#crossLink \"Filter\"}}{{/crossLink}} for an more information on applying filters.\n\t * @class BlurFilter\n\t * @extends Filter\n\t * @constructor\n\t * @param {Number} [blurX=0] The horizontal blur radius in pixels.\n\t * @param {Number} [blurY=0] The vertical blur radius in pixels.\n\t * @param {Number} [quality=1] The number of blur iterations.\n\t **/\n\tfunction BlurFilter( blurX, blurY, quality) {\n\t\tthis.Filter_constructor();\n\n\t\t// public properties:\n\t\t/**\n\t\t * Horizontal blur radius in pixels\n\t\t * @property blurX\n\t\t * @default 0\n\t\t * @type Number\n\t\t **/\n\t\tthis._blurX = blurX;\n\t\tthis._blurXTable = [];\n\t\tthis._lastBlurX = null;\n\n\t\t/**\n\t\t * Vertical blur radius in pixels\n\t\t * @property blurY\n\t\t * @default 0\n\t\t * @type Number\n\t\t **/\n\t\tthis._blurY = blurY;\n\t\tthis._blurYTable = [];\n\t\tthis._lastBlurY = null;\n\n\t\t/**\n\t\t * Number of blur iterations. For example, a value of 1 will produce a rough blur. A value of 2 will produce a\n\t\t * smoother blur, but take twice as long to run.\n\t\t * @property quality\n\t\t * @default 1\n\t\t * @type Number\n\t\t **/\n\t\tthis._quality;\n\t\tthis._lastQuality = null;\n\n\t\t/**\n\t\t * This is a template to generate the shader for {{#crossLink FRAG_SHADER_BODY}}{{/crossLink}}\n\t\t */\n\t\tthis.FRAG_SHADER_TEMPLATE = (\n\t\t\t\"uniform float xWeight[{{blurX}}];\" +\n\t\t\t\"uniform float yWeight[{{blurY}}];\" +\n\t\t\t\"uniform vec2 textureOffset;\" +\n\t\t\t\"void main(void) {\" +\n\t\t\t\t\"vec4 color = vec4(0.0);\" +\n\n\t\t\t\t\"float xAdj = ({{blurX}}.0-1.0)/2.0;\" +\n\t\t\t\t\"float yAdj = ({{blurY}}.0-1.0)/2.0;\" +\n\t\t\t\t\"vec2 sampleOffset;\" +\n\n\t\t\t\t\"for(int i=0; i<{{blurX}}; i++) {\" +\n\t\t\t\t\t\"for(int j=0; j<{{blurY}}; j++) {\" +\n\t\t\t\t\t\t\"sampleOffset = vRenderCoord + (textureOffset * vec2(float(i)-xAdj, float(j)-yAdj));\" +\n\t\t\t\t\t\t\"color += texture2D(uSampler, sampleOffset) * (xWeight[i] * yWeight[j]);\" +\n\t\t\t\t\t\"}\" +\n\t\t\t\t\"}\" +\n\n\t\t\t\t\"gl_FragColor = color.rgba;\" +\n\t\t\t\"}\"\n\t\t);\n\n\t\t// update the filter using the setters\n\t\tif(isNaN(quality) || quality < 1){ quality = 1; }\n\t\tthis.setQuality(quality|0);\n\t}\n\tvar p = createjs.extend(BlurFilter, createjs.Filter);\n\n\t// TODO: deprecated\n\t// p.initialize = function() {}; // searchable for devs wondering where it is. REMOVED. See docs for details.\n\n\tp.getBlurX = function() { return this._blurX; };\n\tp.getBlurY = function() { return this._blurY; };\n\tp.setBlurX = function(value) {\n\t\tif(isNaN(value) || value < 0){ value = 0; }\n\t\tthis._blurX = value;\n\t};\n\tp.setBlurY = function(value) {\n\t\tif(isNaN(value) || value < 0){ value = 0; }\n\t\tthis._blurY = value;\n\t};\n\tp.getQuality = function() { return this._quality; };\n\tp.setQuality = function(value) {\n\t\tif(isNaN(value) || value < 0){ value = 0; }\n\t\tthis._quality = value | 0;\n\t};\n\tp._getShader = function() {\n\t\tvar xChange = this._lastBlurX !== this._blurX;\n\t\tvar yChange = this._lastBlurY !== this._blurY;\n\t\tvar qChange = this._lastQuality !== this._quality;\n\t\tif(xChange || yChange || qChange) {\n\t\t\tif(xChange || qChange) { this._blurXTable = this._getTable(this._blurX * this._quality); }\n\t\t\tif(yChange || qChange) { this._blurYTable = this._getTable(this._blurY * this._quality); }\n\t\t\tthis._updateShader();\n\t\t\tthis._lastBlurX = this._blurX;\n\t\t\tthis._lastBlurY = this._blurY;\n\t\t\tthis._lastQuality = this._quality;\n\t\t\treturn undefined; // force a rebuild\n\t\t}\n\t\treturn this._compiledShader;\n\t};\n\tp._setShader = function() { this._compiledShader; };\n\n\ttry {\n\t\tObject.defineProperties(p, {\n\t\t\tblurX: { get: p.getBlurX, set: p.setBlurX },\n\t\t\tblurY: { get: p.getBlurY, set: p.setBlurY },\n\t\t\tquality: { get: p.getQuality, set: p.setQuality },\n\t\t\t_builtShader: { get: p._getShader, set: p._setShader}\n\t\t});\n\t} catch (e) { console.log(e); }\n\n\t/**\n\t * Internal lookup function to create gaussian distribution.\n\t * @method _getTable\n\t * @param {Number} spread How many steps in the curve.\n\t * @return {Array<Number>} An array with Math.ceil(spread*2) entries with appropriately distributed weights.\n\t */\n\tp._getTable = function(spread) {\n\t\tvar EDGE = 4.2;\n\t\tif(spread<=1) { return [1]; }\n\n\t\tvar result = [];\n\t\tvar count = Math.ceil(spread*2);\n\t\tcount += (count%2)?0:1;\n\t\tvar adjust = (count/2)|0;\n\t\tfor(var i = -adjust; i<=adjust; i++) {\n\t\t\tvar x = (i/adjust)*EDGE;\n\t\t\tresult.push(1/Math.sqrt(2*Math.PI) * Math.pow(Math.E, -(Math.pow(x,2)/4)));\n\t\t}\n\t\tvar factor = result.reduce(function(a, b) { return a + b; });\n\t\treturn result.map(function(currentValue, index, array) { return currentValue/factor; });\n\t};\n\n\t/**\n\t * Internal update function to create shader properties.\n\t * @method _updateShader\n\t */\n\tp._updateShader = function() {\n\t\tif(this._blurX === undefined || this._blurY === undefined){ return; }\n\t\tvar result = this.FRAG_SHADER_TEMPLATE;\n\t\tresult = result.replace(/\\{\\{blurX\\}\\}/g, (this._blurXTable.length).toFixed(0));\n\t\tresult = result.replace(/\\{\\{blurY\\}\\}/g, (this._blurYTable.length).toFixed(0));\n\t\tthis.FRAG_SHADER_BODY = result;\n\t};\n\n\t/** docced in super class **/\n\tp.shaderParamSetup = function(gl, stage, shaderProgram) {\n\t\t// load the normalized gaussian weight tables\n\t\tgl.uniform1fv(\n\t\t\tgl.getUniformLocation(shaderProgram, \"xWeight\"),\n\t\t\tthis._blurXTable\n\t\t);\n\t\tgl.uniform1fv(\n\t\t\tgl.getUniformLocation(shaderProgram, \"yWeight\"),\n\t\t\tthis._blurYTable\n\t\t);\n\n\t\t// what is the size of a single pixel in -1, 1 (webGL) space\n\t\tgl.uniform2f(\n\t\t\tgl.getUniformLocation(shaderProgram, \"textureOffset\"),\n\t\t\t2/(stage._viewportWidth*this._quality), 2/(stage._viewportHeight*this._quality)\n\t\t);\n\t};\n\n// constants:\n\t/**\n\t * Array of multiply values for blur calculations.\n\t * @property MUL_TABLE\n\t * @type Array\n\t * @protected\n\t * @static\n\t **/\n\tBlurFilter.MUL_TABLE = [1, 171, 205, 293, 57, 373, 79, 137, 241, 27, 391, 357, 41, 19, 283, 265, 497, 469, 443, 421, 25, 191, 365, 349, 335, 161, 155, 149, 9, 278, 269, 261, 505, 245, 475, 231, 449, 437, 213, 415, 405, 395, 193, 377, 369, 361, 353, 345, 169, 331, 325, 319, 313, 307, 301, 37, 145, 285, 281, 69, 271, 267, 263, 259, 509, 501, 493, 243, 479, 118, 465, 459, 113, 446, 55, 435, 429, 423, 209, 413, 51, 403, 199, 393, 97, 3, 379, 375, 371, 367, 363, 359, 355, 351, 347, 43, 85, 337, 333, 165, 327, 323, 5, 317, 157, 311, 77, 305, 303, 75, 297, 294, 73, 289, 287, 71, 141, 279, 277, 275, 68, 135, 67, 133, 33, 262, 260, 129, 511, 507, 503, 499, 495, 491, 61, 121, 481, 477, 237, 235, 467, 232, 115, 457, 227, 451, 7, 445, 221, 439, 218, 433, 215, 427, 425, 211, 419, 417, 207, 411, 409, 203, 202, 401, 399, 396, 197, 49, 389, 387, 385, 383, 95, 189, 47, 187, 93, 185, 23, 183, 91, 181, 45, 179, 89, 177, 11, 175, 87, 173, 345, 343, 341, 339, 337, 21, 167, 83, 331, 329, 327, 163, 81, 323, 321, 319, 159, 79, 315, 313, 39, 155, 309, 307, 153, 305, 303, 151, 75, 299, 149, 37, 295, 147, 73, 291, 145, 289, 287, 143, 285, 71, 141, 281, 35, 279, 139, 69, 275, 137, 273, 17, 271, 135, 269, 267, 133, 265, 33, 263, 131, 261, 130, 259, 129, 257, 1];\n\n\t/**\n\t * Array of shift values for blur calculations.\n\t * @property SHG_TABLE\n\t * @type Array\n\t * @protected\n\t * @static\n\t **/\n\tBlurFilter.SHG_TABLE = [0, 9, 10, 11, 9, 12, 10, 11, 12, 9, 13, 13, 10, 9, 13, 13, 14, 14, 14, 14, 10, 13, 14, 14, 14, 13, 13, 13, 9, 14, 14, 14, 15, 14, 15, 14, 15, 15, 14, 15, 15, 15, 14, 15, 15, 15, 15, 15, 14, 15, 15, 15, 15, 15, 15, 12, 14, 15, 15, 13, 15, 15, 15, 15, 16, 16, 16, 15, 16, 14, 16, 16, 14, 16, 13, 16, 16, 16, 15, 16, 13, 16, 15, 16, 14, 9, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 14, 16, 16, 15, 16, 16, 10, 16, 15, 16, 14, 16, 16, 14, 16, 16, 14, 16, 16, 14, 15, 16, 16, 16, 14, 15, 14, 15, 13, 16, 16, 15, 17, 17, 17, 17, 17, 17, 14, 15, 17, 17, 16, 16, 17, 16, 15, 17, 16, 17, 11, 17, 16, 17, 16, 17, 16, 17, 17, 16, 17, 17, 16, 17, 17, 16, 16, 17, 17, 17, 16, 14, 17, 17, 17, 17, 15, 16, 14, 16, 15, 16, 13, 16, 15, 16, 14, 16, 15, 16, 12, 16, 15, 16, 17, 17, 17, 17, 17, 13, 16, 15, 17, 17, 17, 16, 15, 17, 17, 17, 16, 15, 17, 17, 14, 16, 17, 17, 16, 17, 17, 16, 15, 17, 16, 14, 17, 16, 15, 17, 16, 17, 17, 16, 17, 15, 16, 17, 14, 17, 16, 15, 17, 16, 17, 13, 17, 16, 17, 17, 16, 17, 14, 17, 16, 17, 16, 17, 16, 17, 9];\n\n// public methods:\n\t/** docced in super class **/\n\tp.getBounds = function (rect) {\n\t\tvar x = this.blurX|0, y = this.blurY| 0;\n\t\tif(x <= 0 && y <= 0) { return rect; }\n\t\tvar q = Math.pow(this.quality, 0.2);\n\t\treturn (rect || new createjs.Rectangle()).pad(y*q+1,x*q+1,y*q+1,x*q+1);\n\t};\n\n\t/** docced in super class **/\n\tp.clone = function() {\n\t\treturn new BlurFilter(this.blurX, this.blurY, this.quality);\n\t};\n\n\t/** docced in super class **/\n\tp.toString = function() {\n\t\treturn \"[BlurFilter]\";\n\t};\n\n\n// private methods:\n\n\t/** docced in super class **/\n\tp._applyFilter = function (imageData) {\n\t\tvar radiusX = this._blurX >> 1;\n\t\tif (isNaN(radiusX) || radiusX < 0) return false;\n\t\tvar radiusY = this._blurY >> 1;\n\t\tif (isNaN(radiusY) || radiusY < 0) return false;\n\t\tif (radiusX == 0 && radiusY == 0) return false;\n\n\t\tvar iterations = this.quality;\n\t\tif (isNaN(iterations) || iterations < 1) iterations = 1;\n\t\titerations |= 0;\n\t\tif (iterations > 3) iterations = 3;\n\t\tif (iterations < 1) iterations = 1;\n\n\t\tvar px = imageData.data;\n\t\tvar x=0, y=0, i=0, p=0, yp=0, yi=0, yw=0, r=0, g=0, b=0, a=0, pr=0, pg=0, pb=0, pa=0;\n\n\t\tvar divx = (radiusX + radiusX + 1) | 0;\n\t\tvar divy = (radiusY + radiusY + 1) | 0;\n\t\tvar w = imageData.width | 0;\n\t\tvar h = imageData.height | 0;\n\n\t\tvar w1 = (w - 1) | 0;\n\t\tvar h1 = (h - 1) | 0;\n\t\tvar rxp1 = (radiusX + 1) | 0;\n\t\tvar ryp1 = (radiusY + 1) | 0;\n\n\t\tvar ssx = {r:0,b:0,g:0,a:0};\n\t\tvar sx = ssx;\n\t\tfor ( i = 1; i < divx; i++ )\n\t\t{\n\t\t\tsx = sx.n = {r:0,b:0,g:0,a:0};\n\t\t}\n\t\tsx.n = ssx;\n\n\t\tvar ssy = {r:0,b:0,g:0,a:0};\n\t\tvar sy = ssy;\n\t\tfor ( i = 1; i < divy; i++ )\n\t\t{\n\t\t\tsy = sy.n = {r:0,b:0,g:0,a:0};\n\t\t}\n\t\tsy.n = ssy;\n\n\t\tvar si = null;\n\n\n\t\tvar mtx = BlurFilter.MUL_TABLE[radiusX] | 0;\n\t\tvar stx = BlurFilter.SHG_TABLE[radiusX] | 0;\n\t\tvar mty = BlurFilter.MUL_TABLE[radiusY] | 0;\n\t\tvar sty = BlurFilter.SHG_TABLE[radiusY] | 0;\n\n\t\twhile (iterations-- > 0) {\n\n\t\t\tyw = yi = 0;\n\t\t\tvar ms = mtx;\n\t\t\tvar ss = stx;\n\t\t\tfor (y = h; --y > -1;) {\n\t\t\t\tr = rxp1 * (pr = px[(yi) | 0]);\n\t\t\t\tg = rxp1 * (pg = px[(yi + 1) | 0]);\n\t\t\t\tb = rxp1 * (pb = px[(yi + 2) | 0]);\n\t\t\t\ta = rxp1 * (pa = px[(yi + 3) | 0]);\n\n\t\t\t\tsx = ssx;\n\n\t\t\t\tfor( i = rxp1; --i > -1; )\n\t\t\t\t{\n\t\t\t\t\tsx.r = pr;\n\t\t\t\t\tsx.g = pg;\n\t\t\t\t\tsx.b = pb;\n\t\t\t\t\tsx.a = pa;\n\t\t\t\t\tsx = sx.n;\n\t\t\t\t}\n\n\t\t\t\tfor( i = 1; i < rxp1; i++ )\n\t\t\t\t{\n\t\t\t\t\tp = (yi + ((w1 < i ? w1 : i) << 2)) | 0;\n\t\t\t\t\tr += ( sx.r = px[p]);\n\t\t\t\t\tg += ( sx.g = px[p+1]);\n\t\t\t\t\tb += ( sx.b = px[p+2]);\n\t\t\t\t\ta += ( sx.a = px[p+3]);\n\n\t\t\t\t\tsx = sx.n;\n\t\t\t\t}\n\n\t\t\t\tsi = ssx;\n\t\t\t\tfor ( x = 0; x < w; x++ )\n\t\t\t\t{\n\t\t\t\t\tpx[yi++] = (r * ms) >>> ss;\n\t\t\t\t\tpx[yi++] = (g * ms) >>> ss;\n\t\t\t\t\tpx[yi++] = (b * ms) >>> ss;\n\t\t\t\t\tpx[yi++] = (a * ms) >>> ss;\n\n\t\t\t\t\tp = ((yw + ((p = x + radiusX + 1) < w1 ? p : w1)) << 2);\n\n\t\t\t\t\tr -= si.r - ( si.r = px[p]);\n\t\t\t\t\tg -= si.g - ( si.g = px[p+1]);\n\t\t\t\t\tb -= si.b - ( si.b = px[p+2]);\n\t\t\t\t\ta -= si.a - ( si.a = px[p+3]);\n\n\t\t\t\t\tsi = si.n;\n\n\t\t\t\t}\n\t\t\t\tyw += w;\n\t\t\t}\n\n\t\t\tms = mty;\n\t\t\tss = sty;\n\t\t\tfor (x = 0; x < w; x++) {\n\t\t\t\tyi = (x << 2) | 0;\n\n\t\t\t\tr = (ryp1 * (pr = px[yi])) | 0;\n\t\t\t\tg = (ryp1 * (pg = px[(yi + 1) | 0])) | 0;\n\t\t\t\tb = (ryp1 * (pb = px[(yi + 2) | 0])) | 0;\n\t\t\t\ta = (ryp1 * (pa = px[(yi + 3) | 0])) | 0;\n\n\t\t\t\tsy = ssy;\n\t\t\t\tfor( i = 0; i < ryp1; i++ )\n\t\t\t\t{\n\t\t\t\t\tsy.r = pr;\n\t\t\t\t\tsy.g = pg;\n\t\t\t\t\tsy.b = pb;\n\t\t\t\t\tsy.a = pa;\n\t\t\t\t\tsy = sy.n;\n\t\t\t\t}\n\n\t\t\t\typ = w;\n\n\t\t\t\tfor( i = 1; i <= radiusY; i++ )\n\t\t\t\t{\n\t\t\t\t\tyi = ( yp + x ) << 2;\n\n\t\t\t\t\tr += ( sy.r = px[yi]);\n\t\t\t\t\tg += ( sy.g = px[yi+1]);\n\t\t\t\t\tb += ( sy.b = px[yi+2]);\n\t\t\t\t\ta += ( sy.a = px[yi+3]);\n\n\t\t\t\t\tsy = sy.n;\n\n\t\t\t\t\tif( i < h1 )\n\t\t\t\t\t{\n\t\t\t\t\t\typ += w;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tyi = x;\n\t\t\t\tsi = ssy;\n\t\t\t\tif ( iterations > 0 )\n\t\t\t\t{\n\t\t\t\t\tfor ( y = 0; y < h; y++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tp = yi << 2;\n\t\t\t\t\t\tpx[p+3] = pa =(a * ms) >>> ss;\n\t\t\t\t\t\tif ( pa > 0 )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpx[p]   = ((r * ms) >>> ss );\n\t\t\t\t\t\t\tpx[p+1] = ((g * ms) >>> ss );\n\t\t\t\t\t\t\tpx[p+2] = ((b * ms) >>> ss );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpx[p] = px[p+1] = px[p+2] = 0\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tp = ( x + (( ( p = y + ryp1) < h1 ? p : h1 ) * w )) << 2;\n\n\t\t\t\t\t\tr -= si.r - ( si.r = px[p]);\n\t\t\t\t\t\tg -= si.g - ( si.g = px[p+1]);\n\t\t\t\t\t\tb -= si.b - ( si.b = px[p+2]);\n\t\t\t\t\t\ta -= si.a - ( si.a = px[p+3]);\n\n\t\t\t\t\t\tsi = si.n;\n\n\t\t\t\t\t\tyi += w;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor ( y = 0; y < h; y++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tp = yi << 2;\n\t\t\t\t\t\tpx[p+3] = pa =(a * ms) >>> ss;\n\t\t\t\t\t\tif ( pa > 0 )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpa = 255 / pa;\n\t\t\t\t\t\t\tpx[p]   = ((r * ms) >>> ss ) * pa;\n\t\t\t\t\t\t\tpx[p+1] = ((g * ms) >>> ss ) * pa;\n\t\t\t\t\t\t\tpx[p+2] = ((b * ms) >>> ss ) * pa;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpx[p] = px[p+1] = px[p+2] = 0\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tp = ( x + (( ( p = y + ryp1) < h1 ? p : h1 ) * w )) << 2;\n\n\t\t\t\t\t\tr -= si.r - ( si.r = px[p]);\n\t\t\t\t\t\tg -= si.g - ( si.g = px[p+1]);\n\t\t\t\t\t\tb -= si.b - ( si.b = px[p+2]);\n\t\t\t\t\t\ta -= si.a - ( si.a = px[p+3]);\n\n\t\t\t\t\t\tsi = si.n;\n\n\t\t\t\t\t\tyi += w;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn true;\n\t};\n\n\tcreatejs.BlurFilter = createjs.promote(BlurFilter, \"Filter\");\n}());\n\n//##############################################################################\n// AlphaMapFilter.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\t\n\t\n// constructor:\n\t/**\n\t * Applies a greyscale alpha map image (or canvas) to the target, such that the alpha channel of the result will\n\t * be copied from the red channel of the map, and the RGB channels will be copied from the target.\n\t *\n\t * Generally, it is recommended that you use {{#crossLink \"AlphaMaskFilter\"}}{{/crossLink}}, because it has much\n\t * better performance.\n\t *\n\t * <h4>Example</h4>\n\t * This example draws a red->blue box, caches it, and then uses the cache canvas as an alpha map on a 100x100 image.\n\t *\n\t *       var box = new createjs.Shape();\n\t *       box.graphics.beginLinearGradientFill([\"#ff0000\", \"#0000ff\"], [0, 1], 0, 0, 0, 100)\n\t *       box.graphics.drawRect(0, 0, 100, 100);\n\t *       box.cache(0, 0, 100, 100);\n\t *\n\t *       var bmp = new createjs.Bitmap(\"path/to/image.jpg\");\n\t *       bmp.filters = [\n\t *           new createjs.AlphaMapFilter(box.cacheCanvas)\n\t *       ];\n\t *       bmp.cache(0, 0, 100, 100);\n\t *       stage.addChild(bmp);\n\t *\n\t * See {{#crossLink \"Filter\"}}{{/crossLink}} for more information on applying filters.\n\t * @class AlphaMapFilter\n\t * @extends Filter\n\t * @constructor\n\t * @param {HTMLImageElement|HTMLCanvasElement} alphaMap The greyscale image (or canvas) to use as the alpha value for the\n\t * result. This should be exactly the same dimensions as the target.\n\t **/\n\tfunction AlphaMapFilter(alphaMap) {\n\t\tthis.Filter_constructor();\n\t\n\t// public properties:\n\t\t/**\n\t\t * The greyscale image (or canvas) to use as the alpha value for the result. This should be exactly the same\n\t\t * dimensions as the target.\n\t\t * @property alphaMap\n\t\t * @type HTMLImageElement|HTMLCanvasElement\n\t\t **/\n\t\tthis.alphaMap = alphaMap;\n\t\t\n\t\t\n\t// private properties:\n\t\t/**\n\t\t * @property _alphaMap\n\t\t * @protected\n\t\t * @type HTMLImageElement|HTMLCanvasElement\n\t\t **/\n\t\tthis._alphaMap = null;\n\t\t\n\t\t/**\n\t\t * @property _mapData\n\t\t * @protected\n\t\t * @type Uint8ClampedArray\n\t\t **/\n\t\tthis._mapData = null;\n\t\tthis._mapTexture = null;\n\n\t\tthis.FRAG_SHADER_BODY = (\n\t\t\t\"uniform sampler2D uAlphaSampler;\"+\n\n\t\t\t\"void main(void) {\" +\n\t\t\t\t\"vec4 color = texture2D(uSampler, vRenderCoord);\" +\n\t\t\t\t\"vec4 alphaMap = texture2D(uAlphaSampler, vTextureCoord);\" +\n\n\t\t\t\t// some image formats can have transparent white rgba(1,1,1, 0) when put on the GPU, this means we need a slight tweak\n\t\t\t\t// using ceil ensure that the colour will be used so long as it exists but pure transparency will be treated black\n\t\t\t\t\"gl_FragColor = vec4(color.rgb, color.a * (alphaMap.r * ceil(alphaMap.a)));\" +\n\t\t\t\"}\"\n\t\t);\n\t}\n\tvar p = createjs.extend(AlphaMapFilter, createjs.Filter);\n\n\t// TODO: deprecated\n\t// p.initialize = function() {}; // searchable for devs wondering where it is. REMOVED. See docs for details.\n\n\t/** docced in super class **/\n\tp.shaderParamSetup = function(gl, stage, shaderProgram) {\n\t\tif(!this._mapTexture) { this._mapTexture = gl.createTexture(); }\n\n\t\tgl.activeTexture(gl.TEXTURE1);\n\t\tgl.bindTexture(gl.TEXTURE_2D, this._mapTexture);\n\t\tstage.setTextureParams(gl);\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.alphaMap);\n\n\t\tgl.uniform1i(\n\t\t\tgl.getUniformLocation(shaderProgram, \"uAlphaSampler\"),\n\t\t\t1\n\t\t);\n\t};\n\n// public methods:\n\t/** docced in super class **/\n\tp.clone = function () {\n\t\tvar o = new AlphaMapFilter(this.alphaMap);\n\t\to._alphaMap = this._alphaMap;\n\t\to._mapData = this._mapData;\n\t\treturn o;\n\t};\n\n\t/** docced in super class **/\n\tp.toString = function () {\n\t\treturn \"[AlphaMapFilter]\";\n\t};\n\n\n// private methods:\n\t/** docced in super class **/\n\tp._applyFilter = function (imageData) {\n\t\tif (!this.alphaMap) { return true; }\n\t\tif (!this._prepAlphaMap()) { return false; }\n\t\t\n\t\t// TODO: update to support scenarios where the target has different dimensions.\n\t\tvar data = imageData.data;\n\t\tvar map = this._mapData;\n\t\tfor(var i=0, l=data.length; i<l; i += 4) { data[i + 3] = map[i] || 0; }\n\t\t\n\t\treturn true;\n\t};\n\n\t/**\n\t * @method _prepAlphaMap\n\t * @protected\n\t **/\n\tp._prepAlphaMap = function () {\n\t\tif (!this.alphaMap) { return false; }\n\t\tif (this.alphaMap == this._alphaMap && this._mapData) { return true; }\n\n\t\tthis._mapData = null;\n\t\tvar map = this._alphaMap = this.alphaMap;\n\t\tvar canvas = map;\n\t\tvar ctx;\n\t\tif (map instanceof HTMLCanvasElement) {\n\t\t\tctx = canvas.getContext(\"2d\");\n\t\t} else {\n\t\t\tcanvas = createjs.createCanvas ? createjs.createCanvas() : document.createElement(\"canvas\");\n\t\t\tcanvas.width = map.width;\n\t\t\tcanvas.height = map.height;\n\t\t\tctx = canvas.getContext(\"2d\");\n\t\t\tctx.drawImage(map, 0, 0);\n\t\t}\n\n\t\ttry {\n\t\t\tvar imgData = ctx.getImageData(0, 0, map.width, map.height);\n\t\t} catch (e) {\n\t\t\t//if (!this.suppressCrossDomainErrors) throw new Error(\"unable to access local image data: \" + e);\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tthis._mapData = imgData.data;\n\t\treturn true;\n\t};\n\n\n\tcreatejs.AlphaMapFilter = createjs.promote(AlphaMapFilter, \"Filter\");\n}());\n\n//##############################################################################\n// AlphaMaskFilter.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Applies the alpha from the mask image (or canvas) to the target, such that the alpha channel of the result will\n\t * be derived from the mask, and the RGB channels will be copied from the target. This can be used, for example, to\n\t * apply an alpha mask to a display object. This can also be used to combine a JPG compressed RGB image with a PNG32\n\t * alpha mask, which can result in a much smaller file size than a single PNG32 containing ARGB.\n\t *\n\t * <b>IMPORTANT NOTE: This filter currently does not support the targetCtx, or targetX/Y parameters correctly.</b>\n\t *\n\t * <h4>Example</h4>\n\t * This example draws a gradient box, then caches it and uses the \"cacheCanvas\" as the alpha mask on a 100x100 image.\n\t *\n\t *      var box = new createjs.Shape();\n\t *      box.graphics.beginLinearGradientFill([\"#000000\", \"rgba(0, 0, 0, 0)\"], [0, 1], 0, 0, 100, 100)\n\t *      box.graphics.drawRect(0, 0, 100, 100);\n\t *      box.cache(0, 0, 100, 100);\n\t *\n\t *      var bmp = new createjs.Bitmap(\"path/to/image.jpg\");\n\t *      bmp.filters = [\n\t *          new createjs.AlphaMaskFilter(box.cacheCanvas)\n\t *      ];\n\t *      bmp.cache(0, 0, 100, 100);\n\t *\n\t * See {{#crossLink \"Filter\"}}{{/crossLink}} for more information on applying filters.\n\t * @class AlphaMaskFilter\n\t * @extends Filter\n\t * @constructor\n\t * @param {HTMLImageElement|HTMLCanvasElement} mask\n\t **/\n\tfunction AlphaMaskFilter(mask) {\n\t\tthis.Filter_constructor();\n\t\n\t// public properties:\n\t\t/**\n\t\t * The image (or canvas) to use as the mask.\n\t\t * @property mask\n\t\t * @type HTMLImageElement|HTMLCanvasElement\n\t\t **/\n\t\tthis.mask = mask;\n\n\t\t/** docced in super class **/\n\t\tthis.usesContext = true;\n\n\t\tthis.FRAG_SHADER_BODY = (\n\t\t\t\"uniform sampler2D uAlphaSampler;\"+\n\n\t\t\t\"void main(void) {\" +\n\t\t\t\t\"vec4 color = texture2D(uSampler, vRenderCoord);\" +\n\t\t\t\t\"vec4 alphaMap = texture2D(uAlphaSampler, vTextureCoord);\" +\n\n\t\t\t\t\"gl_FragColor = vec4(color.rgb, color.a * alphaMap.a);\" +\n\t\t\t\"}\"\n\t\t);\n\t}\n\tvar p = createjs.extend(AlphaMaskFilter, createjs.Filter);\n\n\t// TODO: deprecated\n\t// p.initialize = function() {}; // searchable for devs wondering where it is. REMOVED. See docs for details.\n\n\t/** docced in super class **/\n\tp.shaderParamSetup = function(gl, stage, shaderProgram) {\n\t\tif(!this._mapTexture) { this._mapTexture = gl.createTexture(); }\n\n\t\tgl.activeTexture(gl.TEXTURE1);\n\t\tgl.bindTexture(gl.TEXTURE_2D, this._mapTexture);\n\t\tstage.setTextureParams(gl);\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.mask);\n\n\t\tgl.uniform1i(\n\t\t\tgl.getUniformLocation(shaderProgram, \"uAlphaSampler\"),\n\t\t\t1\n\t\t);\n\t};\n\n// public methods:\n\t/**\n\t * Applies the filter to the specified context.\n\t *\n\t * <strong>IMPORTANT NOTE: This filter currently does not support the targetCtx, or targetX/Y parameters\n\t * correctly.</strong>\n\t * @method applyFilter\n\t * @param {CanvasRenderingContext2D} ctx The 2D context to use as the source.\n\t * @param {Number} x The x position to use for the source rect.\n\t * @param {Number} y The y position to use for the source rect.\n\t * @param {Number} width The width to use for the source rect.\n\t * @param {Number} height The height to use for the source rect.\n\t * @param {CanvasRenderingContext2D} [targetCtx] NOT SUPPORTED IN THIS FILTER. The 2D context to draw the result to. Defaults to the context passed to ctx.\n\t * @param {Number} [targetX] NOT SUPPORTED IN THIS FILTER. The x position to draw the result to. Defaults to the value passed to x.\n\t * @param {Number} [targetY] NOT SUPPORTED IN THIS FILTER. The y position to draw the result to. Defaults to the value passed to y.\n\t * @return {Boolean} If the filter was applied successfully.\n\t **/\n\tp.applyFilter = function (ctx, x, y, width, height, targetCtx, targetX, targetY) {\n\t\tif (!this.mask) { return true; }\n\t\ttargetCtx = targetCtx || ctx;\n\t\tif (targetX == null) { targetX = x; }\n\t\tif (targetY == null) { targetY = y; }\n\n\t\ttargetCtx.save();\n\t\tif (ctx != targetCtx) {\n\t\t\t// TODO: support targetCtx and targetX/Y\n\t\t\t// clearRect, then draw the ctx in?\n\t\t\treturn false;\n\t\t}\n\n\t\ttargetCtx.globalCompositeOperation = \"destination-in\";\n\t\ttargetCtx.drawImage(this.mask, targetX, targetY);\n\t\ttargetCtx.restore();\n\t\treturn true;\n\t};\n\n\t/** docced in super class **/\n\tp.clone = function () {\n\t\treturn new AlphaMaskFilter(this.mask);\n\t};\n\n\t/** docced in super class **/\n\tp.toString = function () {\n\t\treturn \"[AlphaMaskFilter]\";\n\t};\n\n\n\tcreatejs.AlphaMaskFilter = createjs.promote(AlphaMaskFilter, \"Filter\");\n}());\n\n//##############################################################################\n// ColorFilter.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Applies a color transform to DisplayObjects.\n\t *\n\t * <h4>Example</h4>\n\t * This example draws a red circle, and then transforms it to Blue. This is accomplished by multiplying all the channels\n\t * to 0 (except alpha, which is set to 1), and then adding 255 to the blue channel.\n\t *\n\t *      var shape = new createjs.Shape().set({x:100,y:100});\n\t *      shape.graphics.beginFill(\"#ff0000\").drawCircle(0,0,50);\n\t *\n\t *      shape.filters = [\n\t *          new createjs.ColorFilter(0,0,0,1, 0,0,255,0)\n\t *      ];\n\t *      shape.cache(-50, -50, 100, 100);\n\t *\n\t * See {{#crossLink \"Filter\"}}{{/crossLink}} for an more information on applying filters.\n\t * @class ColorFilter\n\t * @param {Number} [redMultiplier=1] The amount to multiply against the red channel. This is a range between 0 and 1.\n\t * @param {Number} [greenMultiplier=1] The amount to multiply against the green channel. This is a range between 0 and 1.\n\t * @param {Number} [blueMultiplier=1] The amount to multiply against the blue channel. This is a range between 0 and 1.\n\t * @param {Number} [alphaMultiplier=1] The amount to multiply against the alpha channel. This is a range between 0 and 1.\n\t * @param {Number} [redOffset=0] The amount to add to the red channel after it has been multiplied. This is a range\n\t * between -255 and 255.\n\t * @param {Number} [greenOffset=0] The amount to add to the green channel after it has been multiplied. This is a range\n\t  * between -255 and 255.\n\t * @param {Number} [blueOffset=0] The amount to add to the blue channel after it has been multiplied. This is a range\n\t  * between -255 and 255.\n\t * @param {Number} [alphaOffset=0] The amount to add to the alpha channel after it has been multiplied. This is a range\n\t  * between -255 and 255.\n\t * @constructor\n\t * @extends Filter\n\t **/\n\tfunction ColorFilter(redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier, redOffset, greenOffset, blueOffset, alphaOffset) {\n\t\tthis.Filter_constructor();\n\n\t// public properties:\n\t\t/**\n\t\t * Red channel multiplier.\n\t\t * @property redMultiplier\n\t\t * @type Number\n\t\t **/\n\t\tthis.redMultiplier = redMultiplier != null ? redMultiplier : 1;\n\t\n\t\t/**\n\t\t * Green channel multiplier.\n\t\t * @property greenMultiplier\n\t\t * @type Number\n\t\t **/\n\t\tthis.greenMultiplier = greenMultiplier != null ? greenMultiplier : 1;\n\t\n\t\t/**\n\t\t * Blue channel multiplier.\n\t\t * @property blueMultiplier\n\t\t * @type Number\n\t\t **/\n\t\tthis.blueMultiplier = blueMultiplier != null ? blueMultiplier : 1;\n\t\n\t\t/**\n\t\t * Alpha channel multiplier.\n\t\t * @property alphaMultiplier\n\t\t * @type Number\n\t\t **/\n\t\tthis.alphaMultiplier = alphaMultiplier != null ? alphaMultiplier : 1;\n\t\n\t\t/**\n\t\t * Red channel offset (added to value).\n\t\t * @property redOffset\n\t\t * @type Number\n\t\t **/\n\t\tthis.redOffset = redOffset || 0;\n\t\n\t\t/**\n\t\t * Green channel offset (added to value).\n\t\t * @property greenOffset\n\t\t * @type Number\n\t\t **/\n\t\tthis.greenOffset = greenOffset || 0;\n\t\n\t\t/**\n\t\t * Blue channel offset (added to value).\n\t\t * @property blueOffset\n\t\t * @type Number\n\t\t **/\n\t\tthis.blueOffset = blueOffset || 0;\n\t\n\t\t/**\n\t\t * Alpha channel offset (added to value).\n\t\t * @property alphaOffset\n\t\t * @type Number\n\t\t **/\n\t\tthis.alphaOffset = alphaOffset || 0;\n\n\t\tthis.FRAG_SHADER_BODY = (\n\t\t\t\"uniform vec4 uColorMultiplier;\" +\n\t\t\t\"uniform vec4 uColorOffset;\" +\n\n\t\t\t\"void main(void) {\" +\n\t\t\t\t\"vec4 color = texture2D(uSampler, vRenderCoord);\" +\n\n\t\t\t\t\"gl_FragColor = (color * uColorMultiplier) + uColorOffset;\" +\n\t\t\t\"}\"\n\t\t);\n\n\t}\n\tvar p = createjs.extend(ColorFilter, createjs.Filter);\n\n\t// TODO: deprecated\n\t// p.initialize = function() {}; // searchable for devs wondering where it is. REMOVED. See docs for details.\n\n\n// public methods:\n\t/** docced in super class **/\n\tp.shaderParamSetup = function(gl, stage, shaderProgram) {\n\t\tgl.uniform4f(\n\t\t\tgl.getUniformLocation(shaderProgram, \"uColorMultiplier\"),\n\t\t\tthis.redMultiplier, this.greenMultiplier, this.blueMultiplier, this.alphaMultiplier\n\t\t);\n\n\t\tgl.uniform4f(\n\t\t\tgl.getUniformLocation(shaderProgram, \"uColorOffset\"),\n\t\t\tthis.redOffset/255, this.greenOffset/255, this.blueOffset/255, this.alphaOffset/255\n\t\t);\n\t};\n\n\t/** docced in super class **/\n\tp.toString = function() {\n\t\treturn \"[ColorFilter]\";\n\t};\n\n\t/** docced in super class **/\n\tp.clone = function() {\n\t\treturn new ColorFilter(\n\t\t\tthis.redMultiplier, this.greenMultiplier, this.blueMultiplier, this.alphaMultiplier,\n\t\t\tthis.redOffset, this.greenOffset, this.blueOffset, this.alphaOffset\n\t\t);\n\t};\n\n// private methods:\n\t/** docced in super class **/\n\tp._applyFilter = function(imageData) {\n\t\tvar data = imageData.data;\n\t\tvar l = data.length;\n\t\tfor (var i=0; i<l; i+=4) {\n\t\t\tdata[i] = data[i]*this.redMultiplier+this.redOffset;\n\t\t\tdata[i+1] = data[i+1]*this.greenMultiplier+this.greenOffset;\n\t\t\tdata[i+2] = data[i+2]*this.blueMultiplier+this.blueOffset;\n\t\t\tdata[i+3] = data[i+3]*this.alphaMultiplier+this.alphaOffset;\n\t\t}\n\t\treturn true;\n\t};\n\n\n\tcreatejs.ColorFilter = createjs.promote(ColorFilter, \"Filter\");\n}());\n\n//##############################################################################\n// ColorMatrix.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Provides helper functions for assembling a matrix for use with the {{#crossLink \"ColorMatrixFilter\"}}{{/crossLink}}.\n\t * Most methods return the instance to facilitate chained calls.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      myColorMatrix.adjustHue(20).adjustBrightness(50);\n\t *\n\t * See {{#crossLink \"Filter\"}}{{/crossLink}} for an example of how to apply filters, or {{#crossLink \"ColorMatrixFilter\"}}{{/crossLink}}\n\t * for an example of how to use ColorMatrix to change a DisplayObject's color.\n\t * @class ColorMatrix\n\t * @param {Number} brightness\n\t * @param {Number} contrast\n\t * @param {Number} saturation\n\t * @param {Number} hue\n\t * @constructor\n\t **/\n\tfunction ColorMatrix(brightness, contrast, saturation, hue) {\n\t\tthis.setColor(brightness, contrast, saturation, hue);\n\t}\n\tvar p = ColorMatrix.prototype;\n\n// constants:\n\t/**\n\t * Array of delta values for contrast calculations.\n\t * @property DELTA_INDEX\n\t * @type Array\n\t * @protected\n\t * @static\n\t **/\n\tColorMatrix.DELTA_INDEX = [\n\t\t0,    0.01, 0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.1,  0.11,\n\t\t0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.20, 0.21, 0.22, 0.24,\n\t\t0.25, 0.27, 0.28, 0.30, 0.32, 0.34, 0.36, 0.38, 0.40, 0.42,\n\t\t0.44, 0.46, 0.48, 0.5,  0.53, 0.56, 0.59, 0.62, 0.65, 0.68,\n\t\t0.71, 0.74, 0.77, 0.80, 0.83, 0.86, 0.89, 0.92, 0.95, 0.98,\n\t\t1.0,  1.06, 1.12, 1.18, 1.24, 1.30, 1.36, 1.42, 1.48, 1.54,\n\t\t1.60, 1.66, 1.72, 1.78, 1.84, 1.90, 1.96, 2.0,  2.12, 2.25,\n\t\t2.37, 2.50, 2.62, 2.75, 2.87, 3.0,  3.2,  3.4,  3.6,  3.8,\n\t\t4.0,  4.3,  4.7,  4.9,  5.0,  5.5,  6.0,  6.5,  6.8,  7.0,\n\t\t7.3,  7.5,  7.8,  8.0,  8.4,  8.7,  9.0,  9.4,  9.6,  9.8,\n\t\t10.0\n\t];\n\n\t/**\n\t * Identity matrix values.\n\t * @property IDENTITY_MATRIX\n\t * @type Array\n\t * @protected\n\t * @static\n\t **/\n\tColorMatrix.IDENTITY_MATRIX = [\n\t\t1,0,0,0,0,\n\t\t0,1,0,0,0,\n\t\t0,0,1,0,0,\n\t\t0,0,0,1,0,\n\t\t0,0,0,0,1\n\t];\n\n\t/**\n\t * The constant length of a color matrix.\n\t * @property LENGTH\n\t * @type Number\n\t * @protected\n\t * @static\n\t **/\n\tColorMatrix.LENGTH = ColorMatrix.IDENTITY_MATRIX.length;\n\n\n// public methods:\n\t/**\n\t * Resets the instance with the specified values.\n\t * @method setColor\n\t * @param {Number} brightness\n\t * @param {Number} contrast\n\t * @param {Number} saturation\n\t * @param {Number} hue\n\t * @return {ColorMatrix} The ColorMatrix instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t */\n\tp.setColor = function(brightness,contrast,saturation,hue) {\n\t\treturn this.reset().adjustColor(brightness,contrast,saturation,hue);\n\t};\n\n\t/**\n\t * Resets the matrix to identity values.\n\t * @method reset\n\t * @return {ColorMatrix} The ColorMatrix instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t */\n\tp.reset = function() {\n\t\treturn this.copy(ColorMatrix.IDENTITY_MATRIX);\n\t};\n\n\t/**\n\t * Shortcut method to adjust brightness, contrast, saturation and hue.\n\t * Equivalent to calling adjustHue(hue), adjustContrast(contrast),\n\t * adjustBrightness(brightness), adjustSaturation(saturation), in that order.\n\t * @method adjustColor\n\t * @param {Number} brightness\n\t * @param {Number} contrast\n\t * @param {Number} saturation\n\t * @param {Number} hue\n\t * @return {ColorMatrix} The ColorMatrix instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.adjustColor = function(brightness,contrast,saturation,hue) {\n\t\tthis.adjustHue(hue);\n\t\tthis.adjustContrast(contrast);\n\t\tthis.adjustBrightness(brightness);\n\t\treturn this.adjustSaturation(saturation);\n\t};\n\n\t/**\n\t * Adjusts the brightness of pixel color by adding the specified value to the red, green and blue channels.\n\t * Positive values will make the image brighter, negative values will make it darker.\n\t * @method adjustBrightness\n\t * @param {Number} value A value between -255 & 255 that will be added to the RGB channels.\n\t * @return {ColorMatrix} The ColorMatrix instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.adjustBrightness = function(value) {\n\t\tif (value == 0 || isNaN(value)) { return this; }\n\t\tvalue = this._cleanValue(value,255);\n\t\tthis._multiplyMatrix([\n\t\t\t1,0,0,0,value,\n\t\t\t0,1,0,0,value,\n\t\t\t0,0,1,0,value,\n\t\t\t0,0,0,1,0,\n\t\t\t0,0,0,0,1\n\t\t]);\n\t\treturn this;\n\t};\n\n\t/**\n\t * Adjusts the contrast of pixel color.\n\t * Positive values will increase contrast, negative values will decrease contrast.\n\t * @method adjustContrast\n\t * @param {Number} value A value between -100 & 100.\n\t * @return {ColorMatrix} The ColorMatrix instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.adjustContrast = function(value) {\n\t\tif (value == 0 || isNaN(value)) { return this; }\n\t\tvalue = this._cleanValue(value,100);\n\t\tvar x;\n\t\tif (value<0) {\n\t\t\tx = 127+value/100*127;\n\t\t} else {\n\t\t\tx = value%1;\n\t\t\tif (x == 0) {\n\t\t\t\tx = ColorMatrix.DELTA_INDEX[value];\n\t\t\t} else {\n\t\t\t\tx = ColorMatrix.DELTA_INDEX[(value<<0)]*(1-x)+ColorMatrix.DELTA_INDEX[(value<<0)+1]*x; // use linear interpolation for more granularity.\n\t\t\t}\n\t\t\tx = x*127+127;\n\t\t}\n\t\tthis._multiplyMatrix([\n\t\t\tx/127,0,0,0,0.5*(127-x),\n\t\t\t0,x/127,0,0,0.5*(127-x),\n\t\t\t0,0,x/127,0,0.5*(127-x),\n\t\t\t0,0,0,1,0,\n\t\t\t0,0,0,0,1\n\t\t]);\n\t\treturn this;\n\t};\n\n\t/**\n\t * Adjusts the color saturation of the pixel.\n\t * Positive values will increase saturation, negative values will decrease saturation (trend towards greyscale).\n\t * @method adjustSaturation\n\t * @param {Number} value A value between -100 & 100.\n\t * @return {ColorMatrix} The ColorMatrix instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.adjustSaturation = function(value) {\n\t\tif (value == 0 || isNaN(value)) { return this; }\n\t\tvalue = this._cleanValue(value,100);\n\t\tvar x = 1+((value > 0) ? 3*value/100 : value/100);\n\t\tvar lumR = 0.3086;\n\t\tvar lumG = 0.6094;\n\t\tvar lumB = 0.0820;\n\t\tthis._multiplyMatrix([\n\t\t\tlumR*(1-x)+x,lumG*(1-x),lumB*(1-x),0,0,\n\t\t\tlumR*(1-x),lumG*(1-x)+x,lumB*(1-x),0,0,\n\t\t\tlumR*(1-x),lumG*(1-x),lumB*(1-x)+x,0,0,\n\t\t\t0,0,0,1,0,\n\t\t\t0,0,0,0,1\n\t\t]);\n\t\treturn this;\n\t};\n\n\n\t/**\n\t * Adjusts the hue of the pixel color.\n\t * @method adjustHue\n\t * @param {Number} value A value between -180 & 180.\n\t * @return {ColorMatrix} The ColorMatrix instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.adjustHue = function(value) {\n\t\tif (value == 0 || isNaN(value)) { return this; }\n\t\tvalue = this._cleanValue(value,180)/180*Math.PI;\n\t\tvar cosVal = Math.cos(value);\n\t\tvar sinVal = Math.sin(value);\n\t\tvar lumR = 0.213;\n\t\tvar lumG = 0.715;\n\t\tvar lumB = 0.072;\n\t\tthis._multiplyMatrix([\n\t\t\tlumR+cosVal*(1-lumR)+sinVal*(-lumR),lumG+cosVal*(-lumG)+sinVal*(-lumG),lumB+cosVal*(-lumB)+sinVal*(1-lumB),0,0,\n\t\t\tlumR+cosVal*(-lumR)+sinVal*(0.143),lumG+cosVal*(1-lumG)+sinVal*(0.140),lumB+cosVal*(-lumB)+sinVal*(-0.283),0,0,\n\t\t\tlumR+cosVal*(-lumR)+sinVal*(-(1-lumR)),lumG+cosVal*(-lumG)+sinVal*(lumG),lumB+cosVal*(1-lumB)+sinVal*(lumB),0,0,\n\t\t\t0,0,0,1,0,\n\t\t\t0,0,0,0,1\n\t\t]);\n\t\treturn this;\n\t};\n\n\t/**\n\t * Concatenates (multiplies) the specified matrix with this one.\n\t * @method concat\n\t * @param {Array} matrix An array or ColorMatrix instance.\n\t * @return {ColorMatrix} The ColorMatrix instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.concat = function(matrix) {\n\t\tmatrix = this._fixMatrix(matrix);\n\t\tif (matrix.length != ColorMatrix.LENGTH) { return this; }\n\t\tthis._multiplyMatrix(matrix);\n\t\treturn this;\n\t};\n\n\t/**\n\t * Returns a clone of this ColorMatrix.\n\t * @method clone\n\t * @return {ColorMatrix} A clone of this ColorMatrix.\n\t **/\n\tp.clone = function() {\n\t\treturn (new ColorMatrix()).copy(this);\n\t};\n\n\t/**\n\t * Return a length 25 (5x5) array instance containing this matrix's values.\n\t * @method toArray\n\t * @return {Array} An array holding this matrix's values.\n\t **/\n\tp.toArray = function() {\n\t\tvar arr = [];\n\t\tfor (var i= 0, l=ColorMatrix.LENGTH; i<l; i++) {\n\t\t\tarr[i] = this[i];\n\t\t}\n\t\treturn arr;\n\t};\n\n\t/**\n\t * Copy the specified matrix's values to this matrix.\n\t * @method copy\n\t * @param {Array} matrix An array or ColorMatrix instance.\n\t * @return {ColorMatrix} The ColorMatrix instance the method is called on (useful for chaining calls.)\n\t * @chainable\n\t **/\n\tp.copy = function(matrix) {\n\t\tvar l = ColorMatrix.LENGTH;\n\t\tfor (var i=0;i<l;i++) {\n\t\t\tthis[i] = matrix[i];\n\t\t}\n\t\treturn this;\n\t};\n\t\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t **/\n\tp.toString = function() {\n\t\treturn \"[ColorMatrix]\";\n\t};\n\n\n// private methods:\n\t/**\n\t * @method _multiplyMatrix\n\t * @param {Array} matrix\n\t * @protected\n\t **/\n\tp._multiplyMatrix = function(matrix) {\n\t\tvar i, j, k, col = [];\n\n\t\tfor (i=0;i<5;i++) {\n\t\t\tfor (j=0;j<5;j++) {\n\t\t\t\tcol[j] = this[j+i*5];\n\t\t\t}\n\t\t\tfor (j=0;j<5;j++) {\n\t\t\t\tvar val=0;\n\t\t\t\tfor (k=0;k<5;k++) {\n\t\t\t\t\tval += matrix[j+k*5]*col[k];\n\t\t\t\t}\n\t\t\t\tthis[j+i*5] = val;\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Make sure values are within the specified range, hue has a limit of 180, brightness is 255, others are 100.\n\t * @method _cleanValue\n\t * @param {Number} value The raw number\n\t * @param {Number} limit The maximum that the number can be. The minimum is the limit * -1.\n\t * @protected\n\t **/\n\tp._cleanValue = function(value, limit) {\n\t\treturn Math.min(limit,Math.max(-limit,value));\n\t};\n\n\t/**\n\t * Makes sure matrixes are 5x5 (25 long).\n\t * @method _fixMatrix\n\t * @param {Array} matrix\n\t * @protected\n\t **/\n\tp._fixMatrix = function(matrix) {\n\t\tif (matrix instanceof ColorMatrix) { matrix = matrix.toArray(); }\n\t\tif (matrix.length < ColorMatrix.LENGTH) {\n\t\t\tmatrix = matrix.slice(0,matrix.length).concat(ColorMatrix.IDENTITY_MATRIX.slice(matrix.length,ColorMatrix.LENGTH));\n\t\t} else if (matrix.length > ColorMatrix.LENGTH) {\n\t\t\tmatrix = matrix.slice(0,ColorMatrix.LENGTH);\n\t\t}\n\t\treturn matrix;\n\t};\n\n\n\tcreatejs.ColorMatrix = ColorMatrix;\n}());\n\n//##############################################################################\n// ColorMatrixFilter.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n\t * Allows you to carry out complex color operations such as modifying saturation, brightness, or inverting. See the\n\t * {{#crossLink \"ColorMatrix\"}}{{/crossLink}} for more information on changing colors. For an easier color transform,\n\t * consider the {{#crossLink \"ColorFilter\"}}{{/crossLink}}.\n\t *\n\t * <h4>Example</h4>\n\t * This example creates a red circle, inverts its hue, and then saturates it to brighten it up.\n\t *\n\t *      var shape = new createjs.Shape().set({x:100,y:100});\n\t *      shape.graphics.beginFill(\"#ff0000\").drawCircle(0,0,50);\n\t *\n\t *      var matrix = new createjs.ColorMatrix().adjustHue(180).adjustSaturation(100);\n\t *      shape.filters = [\n\t *          new createjs.ColorMatrixFilter(matrix)\n\t *      ];\n\t *\n\t *      shape.cache(-50, -50, 100, 100);\n\t *\n\t * See {{#crossLink \"Filter\"}}{{/crossLink}} for an more information on applying filters.\n\t * @class ColorMatrixFilter\n\t * @constructor\n\t * @extends Filter\n\t * @param {Array | ColorMatrix} matrix A 4x5 matrix describing the color operation to perform. See also the {{#crossLink \"ColorMatrix\"}}{{/crossLink}}\n\t * class.\n\t **/\n\tfunction ColorMatrixFilter(matrix) {\n\t\tthis.Filter_constructor();\n\n\t// public properties:\n\t\t/**\n\t\t * A 4x5 matrix describing the color operation to perform. See also the {{#crossLink \"ColorMatrix\"}}{{/crossLink}}\n\t\t * @property matrix\n\t\t * @type Array | ColorMatrix\n\t\t **/\n\t\tthis.matrix = matrix;\n\n\t\tthis.FRAG_SHADER_BODY = (\n\t\t\t\"uniform mat4 uColorMatrix;\" +\n\t\t\t\"uniform vec4 uColorMatrixOffset;\" +\n\n\t\t\t\"void main(void) {\" +\n\t\t\t\t\"vec4 color = texture2D(uSampler, vRenderCoord);\" +\n\n\t\t\t\t\"mat4 m = uColorMatrix;\" +\n\t\t\t\t\"vec4 newColor = vec4(0,0,0,0);\" +\n\t\t\t\t\"newColor.r = color.r*m[0][0] + color.g*m[0][1] + color.b*m[0][2] + color.a*m[0][3];\" +\n\t\t\t\t\"newColor.g = color.r*m[1][0] + color.g*m[1][1] + color.b*m[1][2] + color.a*m[1][3];\" +\n\t\t\t\t\"newColor.b = color.r*m[2][0] + color.g*m[2][1] + color.b*m[2][2] + color.a*m[2][3];\" +\n\t\t\t\t\"newColor.a = color.r*m[3][0] + color.g*m[3][1] + color.b*m[3][2] + color.a*m[3][3];\" +\n\n\t\t\t\t\"gl_FragColor = newColor + uColorMatrixOffset;\" +\n\t\t\t\"}\"\n\t\t);\n\t}\n\tvar p = createjs.extend(ColorMatrixFilter, createjs.Filter);\n\n\t// TODO: deprecated\n\t// p.initialize = function() {}; // searchable for devs wondering where it is. REMOVED. See docs for details.\n\n\t/** docced in super class **/\n\tp.shaderParamSetup = function(gl, stage, shaderProgram) {\n\t\tvar mat = this.matrix;\n\t\tvar colorMatrix = new Float32Array([\n\t\t\tmat[0],mat[1],mat[2],mat[3],\n\t\t\tmat[5],mat[6],mat[7],mat[8],\n\t\t\tmat[10],mat[11],mat[12],mat[13],\n\t\t\tmat[15],mat[16],mat[17],mat[18]\n\t\t]);\n\n\t\tgl.uniformMatrix4fv(\n\t\t\tgl.getUniformLocation(shaderProgram, \"uColorMatrix\"),\n\t\t\tfalse, colorMatrix\n\t\t);\n\t\tgl.uniform4f(\n\t\t\tgl.getUniformLocation(shaderProgram, \"uColorMatrixOffset\"),\n\t\t\tmat[4]/255, mat[9]/255, mat[14]/255, mat[19]/255\n\t\t);\n\t};\n\n// public methods:\n\t/** docced in super class **/\n\tp.toString = function() {\n\t\treturn \"[ColorMatrixFilter]\";\n\t};\n\n\t/** docced in super class **/\n\tp.clone = function() {\n\t\treturn new ColorMatrixFilter(this.matrix);\n\t};\n\n// private methods:\n\t/** docced in super class **/\n\tp._applyFilter = function(imageData) { \n\t\tvar data = imageData.data;\n\t\tvar l = data.length;\n\t\tvar r,g,b,a;\n\t\tvar mtx = this.matrix;\n\t\tvar m0 =  mtx[0],  m1 =  mtx[1],  m2 =  mtx[2],  m3 =  mtx[3],  m4 =  mtx[4];\n\t\tvar m5 =  mtx[5],  m6 =  mtx[6],  m7 =  mtx[7],  m8 =  mtx[8],  m9 =  mtx[9];\n\t\tvar m10 = mtx[10], m11 = mtx[11], m12 = mtx[12], m13 = mtx[13], m14 = mtx[14];\n\t\tvar m15 = mtx[15], m16 = mtx[16], m17 = mtx[17], m18 = mtx[18], m19 = mtx[19];\n\n\t\tfor (var i=0; i<l; i+=4) {\n\t\t\tr = data[i];\n\t\t\tg = data[i+1];\n\t\t\tb = data[i+2];\n\t\t\ta = data[i+3];\n\t\t\tdata[i] = r*m0+g*m1+b*m2+a*m3+m4; // red\n\t\t\tdata[i+1] = r*m5+g*m6+b*m7+a*m8+m9; // green\n\t\t\tdata[i+2] = r*m10+g*m11+b*m12+a*m13+m14; // blue\n\t\t\tdata[i+3] = r*m15+g*m16+b*m17+a*m18+m19; // alpha\n\t\t}\n\t\treturn true;\n\t};\n\n\tcreatejs.ColorMatrixFilter = createjs.promote(ColorMatrixFilter, \"Filter\");\n}());\n\n//##############################################################################\n// Touch.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor:\n\t/**\n * Global utility for working with multi-touch enabled devices in EaselJS. Currently supports W3C Touch API (iOS and\n * modern Android browser) and the Pointer API (IE), including ms-prefixed events in IE10, and unprefixed in IE11.\n *\n * Ensure that you {{#crossLink \"Touch/disable\"}}{{/crossLink}} touch when cleaning up your application. You do not have\n * to check if touch is supported to enable it, as it will fail gracefully if it is not supported.\n *\n * <h4>Example</h4>\n *\n *      var stage = new createjs.Stage(\"canvasId\");\n *      createjs.Touch.enable(stage);\n *\n * <strong>Note:</strong> It is important to disable Touch on a stage that you are no longer using:\n *\n *      createjs.Touch.disable(stage);\n *\n * @class Touch\n * @static\n **/\n\tfunction Touch() {\n\t\tthrow \"Touch cannot be instantiated\";\n\t}\n\n\n// public static methods:\n\t/**\n\t * Returns `true` if touch is supported in the current browser.\n\t * @method isSupported\n\t * @return {Boolean} Indicates whether touch is supported in the current browser.\n\t * @static\n\t **/\n\tTouch.isSupported = function() {\n\t\treturn\t!!(('ontouchstart' in window) // iOS & Android\n\t\t\t|| (window.navigator['msPointerEnabled'] && window.navigator['msMaxTouchPoints'] > 0) // IE10\n\t\t\t|| (window.navigator['pointerEnabled'] && window.navigator['maxTouchPoints'] > 0)); // IE11+\n\t};\n\n\t/**\n\t * Enables touch interaction for the specified EaselJS {{#crossLink \"Stage\"}}{{/crossLink}}. Currently supports iOS\n\t * (and compatible browsers, such as modern Android browsers), and IE10/11. Supports both single touch and\n\t * multi-touch modes. Extends the EaselJS {{#crossLink \"MouseEvent\"}}{{/crossLink}} model, but without support for\n\t * double click or over/out events. See the MouseEvent {{#crossLink \"MouseEvent/pointerId:property\"}}{{/crossLink}}\n\t * for more information.\n\t * @method enable\n\t * @param {Stage} stage The {{#crossLink \"Stage\"}}{{/crossLink}} to enable touch on.\n\t * @param {Boolean} [singleTouch=false] If `true`, only a single touch will be active at a time.\n\t * @param {Boolean} [allowDefault=false] If `true`, then default gesture actions (ex. scrolling, zooming) will be\n\t * allowed when the user is interacting with the target canvas.\n\t * @return {Boolean} Returns `true` if touch was successfully enabled on the target stage.\n\t * @static\n\t **/\n\tTouch.enable = function(stage, singleTouch, allowDefault) {\n\t\tif (!stage || !stage.canvas || !Touch.isSupported()) { return false; }\n\t\tif (stage.__touch) { return true; }\n\n\t\t// inject required properties on stage:\n\t\tstage.__touch = {pointers:{}, multitouch:!singleTouch, preventDefault:!allowDefault, count:0};\n\n\t\t// note that in the future we may need to disable the standard mouse event model before adding\n\t\t// these to prevent duplicate calls. It doesn't seem to be an issue with iOS devices though.\n\t\tif ('ontouchstart' in window) { Touch._IOS_enable(stage); }\n\t\telse if (window.navigator['msPointerEnabled'] || window.navigator[\"pointerEnabled\"]) { Touch._IE_enable(stage); }\n\t\treturn true;\n\t};\n\n\t/**\n\t * Removes all listeners that were set up when calling `Touch.enable()` on a stage.\n\t * @method disable\n\t * @param {Stage} stage The {{#crossLink \"Stage\"}}{{/crossLink}} to disable touch on.\n\t * @static\n\t **/\n\tTouch.disable = function(stage) {\n\t\tif (!stage) { return; }\n\t\tif ('ontouchstart' in window) { Touch._IOS_disable(stage); }\n\t\telse if (window.navigator['msPointerEnabled'] || window.navigator[\"pointerEnabled\"]) { Touch._IE_disable(stage); }\n\t\t\n\t\tdelete stage.__touch;\n\t};\n\n\n// Private static methods:\n\t/**\n\t * @method _IOS_enable\n\t * @protected\n\t * @param {Stage} stage\n\t * @static\n\t **/\n\tTouch._IOS_enable = function(stage) {\n\t\tvar canvas = stage.canvas;\n\t\tvar f = stage.__touch.f = function(e) { Touch._IOS_handleEvent(stage,e); };\n\t\tcanvas.addEventListener(\"touchstart\", f, false);\n\t\tcanvas.addEventListener(\"touchmove\", f, false);\n\t\tcanvas.addEventListener(\"touchend\", f, false);\n\t\tcanvas.addEventListener(\"touchcancel\", f, false);\n\t};\n\n\t/**\n\t * @method _IOS_disable\n\t * @protected\n\t * @param {Stage} stage\n\t * @static\n\t **/\n\tTouch._IOS_disable = function(stage) {\n\t\tvar canvas = stage.canvas;\n\t\tif (!canvas) { return; }\n\t\tvar f = stage.__touch.f;\n\t\tcanvas.removeEventListener(\"touchstart\", f, false);\n\t\tcanvas.removeEventListener(\"touchmove\", f, false);\n\t\tcanvas.removeEventListener(\"touchend\", f, false);\n\t\tcanvas.removeEventListener(\"touchcancel\", f, false);\n\t};\n\n\t/**\n\t * @method _IOS_handleEvent\n\t * @param {Stage} stage\n\t * @param {Object} e The event to handle\n\t * @protected\n\t * @static\n\t **/\n\tTouch._IOS_handleEvent = function(stage, e) {\n\t\tif (!stage) { return; }\n\t\tif (stage.__touch.preventDefault) { e.preventDefault&&e.preventDefault(); }\n\t\tvar touches = e.changedTouches;\n\t\tvar type = e.type;\n\t\tfor (var i= 0,l=touches.length; i<l; i++) {\n\t\t\tvar touch = touches[i];\n\t\t\tvar id = touch.identifier;\n\t\t\tif (touch.target != stage.canvas) { continue; }\n\n\t\t\tif (type == \"touchstart\") {\n\t\t\t\tthis._handleStart(stage, id, e, touch.pageX, touch.pageY);\n\t\t\t} else if (type == \"touchmove\") {\n\t\t\t\tthis._handleMove(stage, id, e, touch.pageX, touch.pageY);\n\t\t\t} else if (type == \"touchend\" || type == \"touchcancel\") {\n\t\t\t\tthis._handleEnd(stage, id, e);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * @method _IE_enable\n\t * @protected\n\t * @param {Stage} stage\n\t * @static\n\t **/\n\tTouch._IE_enable = function(stage) {\n\t\tvar canvas = stage.canvas;\n\t\tvar f = stage.__touch.f = function(e) { Touch._IE_handleEvent(stage,e); };\n\n\t\tif (window.navigator[\"pointerEnabled\"] === undefined) {\n\t\t\tcanvas.addEventListener(\"MSPointerDown\", f, false);\n\t\t\twindow.addEventListener(\"MSPointerMove\", f, false);\n\t\t\twindow.addEventListener(\"MSPointerUp\", f, false);\n\t\t\twindow.addEventListener(\"MSPointerCancel\", f, false);\n\t\t\tif (stage.__touch.preventDefault) { canvas.style.msTouchAction = \"none\"; }\n\t\t} else {\n\t\t\tcanvas.addEventListener(\"pointerdown\", f, false);\n\t\t\twindow.addEventListener(\"pointermove\", f, false);\n\t\t\twindow.addEventListener(\"pointerup\", f, false);\n\t\t\twindow.addEventListener(\"pointercancel\", f, false);\n\t\t\tif (stage.__touch.preventDefault) { canvas.style.touchAction = \"none\"; }\n\n\t\t}\n\t\tstage.__touch.activeIDs = {};\n\t};\n\n\t/**\n\t * @method _IE_disable\n\t * @protected\n\t * @param {Stage} stage\n\t * @static\n\t **/\n\tTouch._IE_disable = function(stage) {\n\t\tvar f = stage.__touch.f;\n\n\t\tif (window.navigator[\"pointerEnabled\"] === undefined) {\n\t\t\twindow.removeEventListener(\"MSPointerMove\", f, false);\n\t\t\twindow.removeEventListener(\"MSPointerUp\", f, false);\n\t\t\twindow.removeEventListener(\"MSPointerCancel\", f, false);\n\t\t\tif (stage.canvas) {\n\t\t\t\tstage.canvas.removeEventListener(\"MSPointerDown\", f, false);\n\t\t\t}\n\t\t} else {\n\t\t\twindow.removeEventListener(\"pointermove\", f, false);\n\t\t\twindow.removeEventListener(\"pointerup\", f, false);\n\t\t\twindow.removeEventListener(\"pointercancel\", f, false);\n\t\t\tif (stage.canvas) {\n\t\t\t\tstage.canvas.removeEventListener(\"pointerdown\", f, false);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * @method _IE_handleEvent\n\t * @param {Stage} stage\n\t * @param {Object} e The event to handle.\n\t * @protected\n\t * @static\n\t **/\n\tTouch._IE_handleEvent = function(stage, e) {\n\t\tif (!stage) { return; }\n\t\tif (stage.__touch.preventDefault) { e.preventDefault && e.preventDefault(); }\n\t\tvar type = e.type;\n\t\tvar id = e.pointerId;\n\t\tvar ids = stage.__touch.activeIDs;\n\n\t\tif (type == \"MSPointerDown\" || type == \"pointerdown\") {\n\t\t\tif (e.srcElement != stage.canvas) { return; }\n\t\t\tids[id] = true;\n\t\t\tthis._handleStart(stage, id, e, e.pageX, e.pageY);\n\t\t} else if (ids[id]) { // it's an id we're watching\n\t\t\tif (type == \"MSPointerMove\" || type == \"pointermove\") {\n\t\t\t\tthis._handleMove(stage, id, e, e.pageX, e.pageY);\n\t\t\t} else if (type == \"MSPointerUp\" || type == \"MSPointerCancel\"\n\t\t\t\t\t|| type == \"pointerup\" || type == \"pointercancel\") {\n\t\t\t\tdelete(ids[id]);\n\t\t\t\tthis._handleEnd(stage, id, e);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * @method _handleStart\n\t * @param {Stage} stage\n\t * @param {String|Number} id\n\t * @param {Object} e\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @protected\n\t **/\n\tTouch._handleStart = function(stage, id, e, x, y) {\n\t\tvar props = stage.__touch;\n\t\tif (!props.multitouch && props.count) { return; }\n\t\tvar ids = props.pointers;\n\t\tif (ids[id]) { return; }\n\t\tids[id] = true;\n\t\tprops.count++;\n\t\tstage._handlePointerDown(id, e, x, y);\n\t};\n\n\t/**\n\t * @method _handleMove\n\t * @param {Stage} stage\n\t * @param {String|Number} id\n\t * @param {Object} e\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @protected\n\t **/\n\tTouch._handleMove = function(stage, id, e, x, y) {\n\t\tif (!stage.__touch.pointers[id]) { return; }\n\t\tstage._handlePointerMove(id, e, x, y);\n\t};\n\n\t/**\n\t * @method _handleEnd\n\t * @param {Stage} stage\n\t * @param {String|Number} id\n\t * @param {Object} e\n\t * @protected\n\t **/\n\tTouch._handleEnd = function(stage, id, e) {\n\t\t// TODO: cancel should be handled differently for proper UI (ex. an up would trigger a click, a cancel would more closely resemble an out).\n\t\tvar props = stage.__touch;\n\t\tvar ids = props.pointers;\n\t\tif (!ids[id]) { return; }\n\t\tprops.count--;\n\t\tstage._handlePointerUp(id, e, true);\n\t\tdelete(ids[id]);\n\t};\n\n\n\tcreatejs.Touch = Touch;\n}());\n\n//##############################################################################\n// version.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\t/**\n\t * Static class holding library specific information such as the version and buildDate of\n\t * the library.\n\t * @class EaselJS\n\t **/\n\tvar s = createjs.EaselJS = createjs.EaselJS || {};\n\n\t/**\n\t * The version string for this release.\n\t * @property version\n\t * @type String\n\t * @static\n\t **/\n\ts.version = /*=version*/\"NEXT\"; // injected by build process\n\n\t/**\n\t * The build date for this release in UTC format.\n\t * @property buildDate\n\t * @type String\n\t * @static\n\t **/\n\ts.buildDate = /*=date*/\"Thu, 14 Sep 2017 22:19:48 GMT\"; // injected by build process\n\n})();\n\n//##############################################################################\n// version.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t/**\n\t * Static class holding library specific information such as the version and buildDate of the library.\n\t * @class PreloadJS\n\t **/\n\tvar s = createjs.PreloadJS = createjs.PreloadJS || {};\n\n\t/**\n\t * The version string for this release.\n\t * @property version\n\t * @type {String}\n\t * @static\n\t **/\n\ts.version = /*=version*/\"NEXT\"; // injected by build process\n\n\t/**\n\t * The build date for this release in UTC format.\n\t * @property buildDate\n\t * @type {String}\n\t * @static\n\t **/\n\ts.buildDate = /*=date*/\"Thu, 14 Sep 2017 22:19:45 GMT\"; // injected by build process\n\n})();\n\n//##############################################################################\n// proxy.js\n//##############################################################################\n\n/**\n * Various utilities that the CreateJS Suite uses. Utilities are created as separate files, and will be available on the\n * createjs namespace directly.\n *\n * <h4>Example</h4>\n *\n *      myObject.addEventListener(\"change\", createjs.proxy(myMethod, scope));\n *\n * @class Utility Methods\n * @main Utility Methods\n */\n\n(function() {\n\t\"use strict\";\n\n\t/**\n\t * A function proxy for methods. By default, JavaScript methods do not maintain scope, so passing a method as a\n\t * callback will result in the method getting called in the scope of the caller. Using a proxy ensures that the\n\t * method gets called in the correct scope.\n\t *\n\t * Additional arguments can be passed that will be applied to the function when it is called.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      myObject.addEventListener(\"event\", createjs.proxy(myHandler, this, arg1, arg2));\n\t *\n\t *      function myHandler(arg1, arg2) {\n\t *           // This gets called when myObject.myCallback is executed.\n\t *      }\n\t *\n\t * @method proxy\n\t * @param {Function} method The function to call\n\t * @param {Object} scope The scope to call the method name on\n\t * @param {mixed} [arg] * Arguments that are appended to the callback for additional params.\n\t * @public\n\t * @static\n\t */\n\tcreatejs.proxy = function (method, scope) {\n\t\tvar aArgs = Array.prototype.slice.call(arguments, 2);\n\t\treturn function () {\n\t\t\treturn method.apply(scope, Array.prototype.slice.call(arguments, 0).concat(aArgs));\n\t\t};\n\t}\n\n}());\n\n//##############################################################################\n// ErrorEvent.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\t/**\n\t * A general error {{#crossLink \"Event\"}}{{/crossLink}}, that describes an error that occurred, as well as any details.\n\t * @class ErrorEvent\n\t * @param {String} [title] The error title\n\t * @param {String} [message] The error description\n\t * @param {Object} [data] Additional error data\n\t * @constructor\n\t */\n\tfunction ErrorEvent(title, message, data) {\n\t\tthis.Event_constructor(\"error\");\n\n\t\t/**\n\t\t * The short error title, which indicates the type of error that occurred.\n\t\t * @property title\n\t\t * @type String\n\t\t */\n\t\tthis.title = title;\n\n\t\t/**\n\t\t * The verbose error message, containing details about the error.\n\t\t * @property message\n\t\t * @type String\n\t\t */\n\t\tthis.message = message;\n\n\t\t/**\n\t\t * Additional data attached to an error.\n\t\t * @property data\n\t\t * @type {Object}\n\t\t */\n\t\tthis.data = data;\n\t}\n\n\tvar p = createjs.extend(ErrorEvent, createjs.Event);\n\n\tp.clone = function() {\n\t\treturn new createjs.ErrorEvent(this.title, this.message, this.data);\n\t};\n\n\tcreatejs.ErrorEvent = createjs.promote(ErrorEvent, \"Event\");\n\n}());\n\n//##############################################################################\n// ProgressEvent.js\n//##############################################################################\n\n(function (scope) {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A CreateJS {{#crossLink \"Event\"}}{{/crossLink}} that is dispatched when progress changes.\n\t * @class ProgressEvent\n\t * @param {Number} loaded The amount that has been loaded. This can be any number relative to the total.\n\t * @param {Number} [total=1] The total amount that will load. This will default to 1, so if the `loaded` value is\n\t * a percentage (between 0 and 1), it can be omitted.\n\t * @todo Consider having this event be a \"fileprogress\" event as well\n\t * @constructor\n\t */\n\tfunction ProgressEvent(loaded, total) {\n\t\tthis.Event_constructor(\"progress\");\n\n\t\t/**\n\t\t * The amount that has been loaded (out of a total amount)\n\t\t * @property loaded\n\t\t * @type {Number}\n\t\t */\n\t\tthis.loaded = loaded;\n\n\t\t/**\n\t\t * The total \"size\" of the load.\n\t\t * @property total\n\t\t * @type {Number}\n\t\t * @default 1\n\t\t */\n\t\tthis.total = (total == null) ? 1 : total;\n\n\t\t/**\n\t\t * The percentage (out of 1) that the load has been completed. This is calculated using `loaded/total`.\n\t\t * @property progress\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t */\n\t\tthis.progress = (total == 0) ? 0 : this.loaded / this.total;\n\t};\n\n\tvar p = createjs.extend(ProgressEvent, createjs.Event);\n\n\t/**\n\t * Returns a clone of the ProgressEvent instance.\n\t * @method clone\n\t * @return {ProgressEvent} a clone of the Event instance.\n\t **/\n\tp.clone = function() {\n\t\treturn new createjs.ProgressEvent(this.loaded, this.total);\n\t};\n\n\tcreatejs.ProgressEvent = createjs.promote(ProgressEvent, \"Event\");\n\n}(window));\n\n//##############################################################################\n// json3.js\n//##############################################################################\n\n/*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */\n;(function () {\n  // Detect the `define` function exposed by asynchronous module loaders. The\n  // strict `define` check is necessary for compatibility with `r.js`.\n  var isLoader = typeof define === \"function\" && define.amd;\n\n  // A set of types used to distinguish objects from primitives.\n  var objectTypes = {\n    \"function\": true,\n    \"object\": true\n  };\n\n  // Detect the `exports` object exposed by CommonJS implementations.\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n  // Use the `global` object exposed by Node (including Browserify via\n  // `insert-module-globals`), Narwhal, and Ringo as the default context,\n  // and the `window` object in browsers. Rhino exports a `global` function\n  // instead.\n  var root = objectTypes[typeof window] && window || this,\n      freeGlobal = freeExports && objectTypes[typeof module] && module && !module.nodeType && typeof global == \"object\" && global;\n\n  if (freeGlobal && (freeGlobal[\"global\"] === freeGlobal || freeGlobal[\"window\"] === freeGlobal || freeGlobal[\"self\"] === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  // Public: Initializes JSON 3 using the given `context` object, attaching the\n  // `stringify` and `parse` functions to the specified `exports` object.\n  function runInContext(context, exports) {\n    context || (context = root[\"Object\"]());\n    exports || (exports = root[\"Object\"]());\n\n    // Native constructor aliases.\n    var Number = context[\"Number\"] || root[\"Number\"],\n        String = context[\"String\"] || root[\"String\"],\n        Object = context[\"Object\"] || root[\"Object\"],\n        Date = context[\"Date\"] || root[\"Date\"],\n        SyntaxError = context[\"SyntaxError\"] || root[\"SyntaxError\"],\n        TypeError = context[\"TypeError\"] || root[\"TypeError\"],\n        Math = context[\"Math\"] || root[\"Math\"],\n        nativeJSON = context[\"JSON\"] || root[\"JSON\"];\n\n    // Delegate to the native `stringify` and `parse` implementations.\n    if (typeof nativeJSON == \"object\" && nativeJSON) {\n      exports.stringify = nativeJSON.stringify;\n      exports.parse = nativeJSON.parse;\n    }\n\n    // Convenience aliases.\n    var objectProto = Object.prototype,\n        getClass = objectProto.toString,\n        isProperty, forEach, undef;\n\n    // Test the `Date#getUTC*` methods. Based on work by @Yaffle.\n    var isExtended = new Date(-3509827334573292);\n    try {\n      // The `getUTCFullYear`, `Month`, and `Date` methods return nonsensical\n      // results for certain dates in Opera >= 10.53.\n      isExtended = isExtended.getUTCFullYear() == -109252 && isExtended.getUTCMonth() === 0 && isExtended.getUTCDate() === 1 &&\n        // Safari < 2.0.2 stores the internal millisecond time value correctly,\n        // but clips the values returned by the date methods to the range of\n        // signed 32-bit integers ([-2 ** 31, 2 ** 31 - 1]).\n        isExtended.getUTCHours() == 10 && isExtended.getUTCMinutes() == 37 && isExtended.getUTCSeconds() == 6 && isExtended.getUTCMilliseconds() == 708;\n    } catch (exception) {}\n\n    // Internal: Determines whether the native `JSON.stringify` and `parse`\n    // implementations are spec-compliant. Based on work by Ken Snyder.\n    function has(name) {\n      if (has[name] !== undef) {\n        // Return cached feature test result.\n        return has[name];\n      }\n      var isSupported;\n      if (name == \"bug-string-char-index\") {\n        // IE <= 7 doesn't support accessing string characters using square\n        // bracket notation. IE 8 only supports this for primitives.\n        isSupported = \"a\"[0] != \"a\";\n      } else if (name == \"json\") {\n        // Indicates whether both `JSON.stringify` and `JSON.parse` are\n        // supported.\n        isSupported = has(\"json-stringify\") && has(\"json-parse\");\n      } else {\n        var value, serialized = '{\"a\":[1,true,false,null,\"\\\\u0000\\\\b\\\\n\\\\f\\\\r\\\\t\"]}';\n        // Test `JSON.stringify`.\n        if (name == \"json-stringify\") {\n          var stringify = exports.stringify, stringifySupported = typeof stringify == \"function\" && isExtended;\n          if (stringifySupported) {\n            // A test function object with a custom `toJSON` method.\n            (value = function () {\n              return 1;\n            }).toJSON = value;\n            try {\n              stringifySupported =\n                // Firefox 3.1b1 and b2 serialize string, number, and boolean\n                // primitives as object literals.\n                stringify(0) === \"0\" &&\n                // FF 3.1b1, b2, and JSON 2 serialize wrapped primitives as object\n                // literals.\n                stringify(new Number()) === \"0\" &&\n                stringify(new String()) == '\"\"' &&\n                // FF 3.1b1, 2 throw an error if the value is `null`, `undefined`, or\n                // does not define a canonical JSON representation (this applies to\n                // objects with `toJSON` properties as well, *unless* they are nested\n                // within an object or array).\n                stringify(getClass) === undef &&\n                // IE 8 serializes `undefined` as `\"undefined\"`. Safari <= 5.1.7 and\n                // FF 3.1b3 pass this test.\n                stringify(undef) === undef &&\n                // Safari <= 5.1.7 and FF 3.1b3 throw `Error`s and `TypeError`s,\n                // respectively, if the value is omitted entirely.\n                stringify() === undef &&\n                // FF 3.1b1, 2 throw an error if the given value is not a number,\n                // string, array, object, Boolean, or `null` literal. This applies to\n                // objects with custom `toJSON` methods as well, unless they are nested\n                // inside object or array literals. YUI 3.0.0b1 ignores custom `toJSON`\n                // methods entirely.\n                stringify(value) === \"1\" &&\n                stringify([value]) == \"[1]\" &&\n                // Prototype <= 1.6.1 serializes `[undefined]` as `\"[]\"` instead of\n                // `\"[null]\"`.\n                stringify([undef]) == \"[null]\" &&\n                // YUI 3.0.0b1 fails to serialize `null` literals.\n                stringify(null) == \"null\" &&\n                // FF 3.1b1, 2 halts serialization if an array contains a function:\n                // `[1, true, getClass, 1]` serializes as \"[1,true,],\". FF 3.1b3\n                // elides non-JSON values from objects and arrays, unless they\n                // define custom `toJSON` methods.\n                stringify([undef, getClass, null]) == \"[null,null,null]\" &&\n                // Simple serialization test. FF 3.1b1 uses Unicode escape sequences\n                // where character escape codes are expected (e.g., `\\b` => `\\u0008`).\n                stringify({ \"a\": [value, true, false, null, \"\\x00\\b\\n\\f\\r\\t\"] }) == serialized &&\n                // FF 3.1b1 and b2 ignore the `filter` and `width` arguments.\n                stringify(null, value) === \"1\" &&\n                stringify([1, 2], null, 1) == \"[\\n 1,\\n 2\\n]\" &&\n                // JSON 2, Prototype <= 1.7, and older WebKit builds incorrectly\n                // serialize extended years.\n                stringify(new Date(-8.64e15)) == '\"-271821-04-20T00:00:00.000Z\"' &&\n                // The milliseconds are optional in ES 5, but required in 5.1.\n                stringify(new Date(8.64e15)) == '\"+275760-09-13T00:00:00.000Z\"' &&\n                // Firefox <= 11.0 incorrectly serializes years prior to 0 as negative\n                // four-digit years instead of six-digit years. Credits: @Yaffle.\n                stringify(new Date(-621987552e5)) == '\"-000001-01-01T00:00:00.000Z\"' &&\n                // Safari <= 5.1.5 and Opera >= 10.53 incorrectly serialize millisecond\n                // values less than 1000. Credits: @Yaffle.\n                stringify(new Date(-1)) == '\"1969-12-31T23:59:59.999Z\"';\n            } catch (exception) {\n              stringifySupported = false;\n            }\n          }\n          isSupported = stringifySupported;\n        }\n        // Test `JSON.parse`.\n        if (name == \"json-parse\") {\n          var parse = exports.parse;\n          if (typeof parse == \"function\") {\n            try {\n              // FF 3.1b1, b2 will throw an exception if a bare literal is provided.\n              // Conforming implementations should also coerce the initial argument to\n              // a string prior to parsing.\n              if (parse(\"0\") === 0 && !parse(false)) {\n                // Simple parsing test.\n                value = parse(serialized);\n                var parseSupported = value[\"a\"].length == 5 && value[\"a\"][0] === 1;\n                if (parseSupported) {\n                  try {\n                    // Safari <= 5.1.2 and FF 3.1b1 allow unescaped tabs in strings.\n                    parseSupported = !parse('\"\\t\"');\n                  } catch (exception) {}\n                  if (parseSupported) {\n                    try {\n                      // FF 4.0 and 4.0.1 allow leading `+` signs and leading\n                      // decimal points. FF 4.0, 4.0.1, and IE 9-10 also allow\n                      // certain octal literals.\n                      parseSupported = parse(\"01\") !== 1;\n                    } catch (exception) {}\n                  }\n                  if (parseSupported) {\n                    try {\n                      // FF 4.0, 4.0.1, and Rhino 1.7R3-R4 allow trailing decimal\n                      // points. These environments, along with FF 3.1b1 and 2,\n                      // also allow trailing commas in JSON objects and arrays.\n                      parseSupported = parse(\"1.\") !== 1;\n                    } catch (exception) {}\n                  }\n                }\n              }\n            } catch (exception) {\n              parseSupported = false;\n            }\n          }\n          isSupported = parseSupported;\n        }\n      }\n      return has[name] = !!isSupported;\n    }\n\n    if (!has(\"json\")) {\n      // Common `[[Class]]` name aliases.\n      var functionClass = \"[object Function]\",\n          dateClass = \"[object Date]\",\n          numberClass = \"[object Number]\",\n          stringClass = \"[object String]\",\n          arrayClass = \"[object Array]\",\n          booleanClass = \"[object Boolean]\";\n\n      // Detect incomplete support for accessing string characters by index.\n      var charIndexBuggy = has(\"bug-string-char-index\");\n\n      // Define additional utility methods if the `Date` methods are buggy.\n      if (!isExtended) {\n        var floor = Math.floor;\n        // A mapping between the months of the year and the number of days between\n        // January 1st and the first of the respective month.\n        var Months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];\n        // Internal: Calculates the number of days between the Unix epoch and the\n        // first day of the given month.\n        var getDay = function (year, month) {\n          return Months[month] + 365 * (year - 1970) + floor((year - 1969 + (month = +(month > 1))) / 4) - floor((year - 1901 + month) / 100) + floor((year - 1601 + month) / 400);\n        };\n      }\n\n      // Internal: Determines if a property is a direct property of the given\n      // object. Delegates to the native `Object#hasOwnProperty` method.\n      if (!(isProperty = objectProto.hasOwnProperty)) {\n        isProperty = function (property) {\n          var members = {}, constructor;\n          if ((members.__proto__ = null, members.__proto__ = {\n            // The *proto* property cannot be set multiple times in recent\n            // versions of Firefox and SeaMonkey.\n            \"toString\": 1\n          }, members).toString != getClass) {\n            // Safari <= 2.0.3 doesn't implement `Object#hasOwnProperty`, but\n            // supports the mutable *proto* property.\n            isProperty = function (property) {\n              // Capture and break the object's prototype chain (see section 8.6.2\n              // of the ES 5.1 spec). The parenthesized expression prevents an\n              // unsafe transformation by the Closure Compiler.\n              var original = this.__proto__, result = property in (this.__proto__ = null, this);\n              // Restore the original prototype chain.\n              this.__proto__ = original;\n              return result;\n            };\n          } else {\n            // Capture a reference to the top-level `Object` constructor.\n            constructor = members.constructor;\n            // Use the `constructor` property to simulate `Object#hasOwnProperty` in\n            // other environments.\n            isProperty = function (property) {\n              var parent = (this.constructor || constructor).prototype;\n              return property in this && !(property in parent && this[property] === parent[property]);\n            };\n          }\n          members = null;\n          return isProperty.call(this, property);\n        };\n      }\n\n      // Internal: Normalizes the `for...in` iteration algorithm across\n      // environments. Each enumerated key is yielded to a `callback` function.\n      forEach = function (object, callback) {\n        var size = 0, Properties, members, property;\n\n        // Tests for bugs in the current environment's `for...in` algorithm. The\n        // `valueOf` property inherits the non-enumerable flag from\n        // `Object.prototype` in older versions of IE, Netscape, and Mozilla.\n        (Properties = function () {\n          this.valueOf = 0;\n        }).prototype.valueOf = 0;\n\n        // Iterate over a new instance of the `Properties` class.\n        members = new Properties();\n        for (property in members) {\n          // Ignore all properties inherited from `Object.prototype`.\n          if (isProperty.call(members, property)) {\n            size++;\n          }\n        }\n        Properties = members = null;\n\n        // Normalize the iteration algorithm.\n        if (!size) {\n          // A list of non-enumerable properties inherited from `Object.prototype`.\n          members = [\"valueOf\", \"toString\", \"toLocaleString\", \"propertyIsEnumerable\", \"isPrototypeOf\", \"hasOwnProperty\", \"constructor\"];\n          // IE <= 8, Mozilla 1.0, and Netscape 6.2 ignore shadowed non-enumerable\n          // properties.\n          forEach = function (object, callback) {\n            var isFunction = getClass.call(object) == functionClass, property, length;\n            var hasProperty = !isFunction && typeof object.constructor != \"function\" && objectTypes[typeof object.hasOwnProperty] && object.hasOwnProperty || isProperty;\n            for (property in object) {\n              // Gecko <= 1.0 enumerates the `prototype` property of functions under\n              // certain conditions; IE does not.\n              if (!(isFunction && property == \"prototype\") && hasProperty.call(object, property)) {\n                callback(property);\n              }\n            }\n            // Manually invoke the callback for each non-enumerable property.\n            for (length = members.length; property = members[--length]; hasProperty.call(object, property) && callback(property));\n          };\n        } else if (size == 2) {\n          // Safari <= 2.0.4 enumerates shadowed properties twice.\n          forEach = function (object, callback) {\n            // Create a set of iterated properties.\n            var members = {}, isFunction = getClass.call(object) == functionClass, property;\n            for (property in object) {\n              // Store each property name to prevent double enumeration. The\n              // `prototype` property of functions is not enumerated due to cross-\n              // environment inconsistencies.\n              if (!(isFunction && property == \"prototype\") && !isProperty.call(members, property) && (members[property] = 1) && isProperty.call(object, property)) {\n                callback(property);\n              }\n            }\n          };\n        } else {\n          // No bugs detected; use the standard `for...in` algorithm.\n          forEach = function (object, callback) {\n            var isFunction = getClass.call(object) == functionClass, property, isConstructor;\n            for (property in object) {\n              if (!(isFunction && property == \"prototype\") && isProperty.call(object, property) && !(isConstructor = property === \"constructor\")) {\n                callback(property);\n              }\n            }\n            // Manually invoke the callback for the `constructor` property due to\n            // cross-environment inconsistencies.\n            if (isConstructor || isProperty.call(object, (property = \"constructor\"))) {\n              callback(property);\n            }\n          };\n        }\n        return forEach(object, callback);\n      };\n\n      // Public: Serializes a JavaScript `value` as a JSON string. The optional\n      // `filter` argument may specify either a function that alters how object and\n      // array members are serialized, or an array of strings and numbers that\n      // indicates which properties should be serialized. The optional `width`\n      // argument may be either a string or number that specifies the indentation\n      // level of the output.\n      if (!has(\"json-stringify\")) {\n        // Internal: A map of control characters and their escaped equivalents.\n        var Escapes = {\n          92: \"\\\\\\\\\",\n          34: '\\\\\"',\n          8: \"\\\\b\",\n          12: \"\\\\f\",\n          10: \"\\\\n\",\n          13: \"\\\\r\",\n          9: \"\\\\t\"\n        };\n\n        // Internal: Converts `value` into a zero-padded string such that its\n        // length is at least equal to `width`. The `width` must be <= 6.\n        var leadingZeroes = \"000000\";\n        var toPaddedString = function (width, value) {\n          // The `|| 0` expression is necessary to work around a bug in\n          // Opera <= 7.54u2 where `0 == -0`, but `String(-0) !== \"0\"`.\n          return (leadingZeroes + (value || 0)).slice(-width);\n        };\n\n        // Internal: Double-quotes a string `value`, replacing all ASCII control\n        // characters (characters with code unit values between 0 and 31) with\n        // their escaped equivalents. This is an implementation of the\n        // `Quote(value)` operation defined in ES 5.1 section 15.12.3.\n        var unicodePrefix = \"\\\\u00\";\n        var quote = function (value) {\n          var result = '\"', index = 0, length = value.length, useCharIndex = !charIndexBuggy || length > 10;\n          var symbols = useCharIndex && (charIndexBuggy ? value.split(\"\") : value);\n          for (; index < length; index++) {\n            var charCode = value.charCodeAt(index);\n            // If the character is a control character, append its Unicode or\n            // shorthand escape sequence; otherwise, append the character as-is.\n            switch (charCode) {\n              case 8: case 9: case 10: case 12: case 13: case 34: case 92:\n                result += Escapes[charCode];\n                break;\n              default:\n                if (charCode < 32) {\n                  result += unicodePrefix + toPaddedString(2, charCode.toString(16));\n                  break;\n                }\n                result += useCharIndex ? symbols[index] : value.charAt(index);\n            }\n          }\n          return result + '\"';\n        };\n\n        // Internal: Recursively serializes an object. Implements the\n        // `Str(key, holder)`, `JO(value)`, and `JA(value)` operations.\n        var serialize = function (property, object, callback, properties, whitespace, indentation, stack) {\n          var value, className, year, month, date, time, hours, minutes, seconds, milliseconds, results, element, index, length, prefix, result;\n          try {\n            // Necessary for host object support.\n            value = object[property];\n          } catch (exception) {}\n          if (typeof value == \"object\" && value) {\n            className = getClass.call(value);\n            if (className == dateClass && !isProperty.call(value, \"toJSON\")) {\n              if (value > -1 / 0 && value < 1 / 0) {\n                // Dates are serialized according to the `Date#toJSON` method\n                // specified in ES 5.1 section 15.9.5.44. See section 15.9.1.15\n                // for the ISO 8601 date time string format.\n                if (getDay) {\n                  // Manually compute the year, month, date, hours, minutes,\n                  // seconds, and milliseconds if the `getUTC*` methods are\n                  // buggy. Adapted from @Yaffle's `date-shim` project.\n                  date = floor(value / 864e5);\n                  for (year = floor(date / 365.2425) + 1970 - 1; getDay(year + 1, 0) <= date; year++);\n                  for (month = floor((date - getDay(year, 0)) / 30.42); getDay(year, month + 1) <= date; month++);\n                  date = 1 + date - getDay(year, month);\n                  // The `time` value specifies the time within the day (see ES\n                  // 5.1 section 15.9.1.2). The formula `(A % B + B) % B` is used\n                  // to compute `A modulo B`, as the `%` operator does not\n                  // correspond to the `modulo` operation for negative numbers.\n                  time = (value % 864e5 + 864e5) % 864e5;\n                  // The hours, minutes, seconds, and milliseconds are obtained by\n                  // decomposing the time within the day. See section 15.9.1.10.\n                  hours = floor(time / 36e5) % 24;\n                  minutes = floor(time / 6e4) % 60;\n                  seconds = floor(time / 1e3) % 60;\n                  milliseconds = time % 1e3;\n                } else {\n                  year = value.getUTCFullYear();\n                  month = value.getUTCMonth();\n                  date = value.getUTCDate();\n                  hours = value.getUTCHours();\n                  minutes = value.getUTCMinutes();\n                  seconds = value.getUTCSeconds();\n                  milliseconds = value.getUTCMilliseconds();\n                }\n                // Serialize extended years correctly.\n                value = (year <= 0 || year >= 1e4 ? (year < 0 ? \"-\" : \"+\") + toPaddedString(6, year < 0 ? -year : year) : toPaddedString(4, year)) +\n                  \"-\" + toPaddedString(2, month + 1) + \"-\" + toPaddedString(2, date) +\n                  // Months, dates, hours, minutes, and seconds should have two\n                  // digits; milliseconds should have three.\n                  \"T\" + toPaddedString(2, hours) + \":\" + toPaddedString(2, minutes) + \":\" + toPaddedString(2, seconds) +\n                  // Milliseconds are optional in ES 5.0, but required in 5.1.\n                  \".\" + toPaddedString(3, milliseconds) + \"Z\";\n              } else {\n                value = null;\n              }\n            } else if (typeof value.toJSON == \"function\" && ((className != numberClass && className != stringClass && className != arrayClass) || isProperty.call(value, \"toJSON\"))) {\n              // Prototype <= 1.6.1 adds non-standard `toJSON` methods to the\n              // `Number`, `String`, `Date`, and `Array` prototypes. JSON 3\n              // ignores all `toJSON` methods on these objects unless they are\n              // defined directly on an instance.\n              value = value.toJSON(property);\n            }\n          }\n          if (callback) {\n            // If a replacement function was provided, call it to obtain the value\n            // for serialization.\n            value = callback.call(object, property, value);\n          }\n          if (value === null) {\n            return \"null\";\n          }\n          className = getClass.call(value);\n          if (className == booleanClass) {\n            // Booleans are represented literally.\n            return \"\" + value;\n          } else if (className == numberClass) {\n            // JSON numbers must be finite. `Infinity` and `NaN` are serialized as\n            // `\"null\"`.\n            return value > -1 / 0 && value < 1 / 0 ? \"\" + value : \"null\";\n          } else if (className == stringClass) {\n            // Strings are double-quoted and escaped.\n            return quote(\"\" + value);\n          }\n          // Recursively serialize objects and arrays.\n          if (typeof value == \"object\") {\n            // Check for cyclic structures. This is a linear search; performance\n            // is inversely proportional to the number of unique nested objects.\n            for (length = stack.length; length--;) {\n              if (stack[length] === value) {\n                // Cyclic structures cannot be serialized by `JSON.stringify`.\n                throw TypeError();\n              }\n            }\n            // Add the object to the stack of traversed objects.\n            stack.push(value);\n            results = [];\n            // Save the current indentation level and indent one additional level.\n            prefix = indentation;\n            indentation += whitespace;\n            if (className == arrayClass) {\n              // Recursively serialize array elements.\n              for (index = 0, length = value.length; index < length; index++) {\n                element = serialize(index, value, callback, properties, whitespace, indentation, stack);\n                results.push(element === undef ? \"null\" : element);\n              }\n              result = results.length ? (whitespace ? \"[\\n\" + indentation + results.join(\",\\n\" + indentation) + \"\\n\" + prefix + \"]\" : (\"[\" + results.join(\",\") + \"]\")) : \"[]\";\n            } else {\n              // Recursively serialize object members. Members are selected from\n              // either a user-specified list of property names, or the object\n              // itself.\n              forEach(properties || value, function (property) {\n                var element = serialize(property, value, callback, properties, whitespace, indentation, stack);\n                if (element !== undef) {\n                  // According to ES 5.1 section 15.12.3: \"If `gap` {whitespace}\n                  // is not the empty string, let `member` {quote(property) + \":\"}\n                  // be the concatenation of `member` and the `space` character.\"\n                  // The \"`space` character\" refers to the literal space\n                  // character, not the `space` {width} argument provided to\n                  // `JSON.stringify`.\n                  results.push(quote(property) + \":\" + (whitespace ? \" \" : \"\") + element);\n                }\n              });\n              result = results.length ? (whitespace ? \"{\\n\" + indentation + results.join(\",\\n\" + indentation) + \"\\n\" + prefix + \"}\" : (\"{\" + results.join(\",\") + \"}\")) : \"{}\";\n            }\n            // Remove the object from the traversed object stack.\n            stack.pop();\n            return result;\n          }\n        };\n\n        // Public: `JSON.stringify`. See ES 5.1 section 15.12.3.\n        exports.stringify = function (source, filter, width) {\n          var whitespace, callback, properties, className;\n          if (objectTypes[typeof filter] && filter) {\n            if ((className = getClass.call(filter)) == functionClass) {\n              callback = filter;\n            } else if (className == arrayClass) {\n              // Convert the property names array into a makeshift set.\n              properties = {};\n              for (var index = 0, length = filter.length, value; index < length; value = filter[index++], ((className = getClass.call(value)), className == stringClass || className == numberClass) && (properties[value] = 1));\n            }\n          }\n          if (width) {\n            if ((className = getClass.call(width)) == numberClass) {\n              // Convert the `width` to an integer and create a string containing\n              // `width` number of space characters.\n              if ((width -= width % 1) > 0) {\n                for (whitespace = \"\", width > 10 && (width = 10); whitespace.length < width; whitespace += \" \");\n              }\n            } else if (className == stringClass) {\n              whitespace = width.length <= 10 ? width : width.slice(0, 10);\n            }\n          }\n          // Opera <= 7.54u2 discards the values associated with empty string keys\n          // (`\"\"`) only if they are used directly within an object member list\n          // (e.g., `!(\"\" in { \"\": 1})`).\n          return serialize(\"\", (value = {}, value[\"\"] = source, value), callback, properties, whitespace, \"\", []);\n        };\n      }\n\n      // Public: Parses a JSON source string.\n      if (!has(\"json-parse\")) {\n        var fromCharCode = String.fromCharCode;\n\n        // Internal: A map of escaped control characters and their unescaped\n        // equivalents.\n        var Unescapes = {\n          92: \"\\\\\",\n          34: '\"',\n          47: \"/\",\n          98: \"\\b\",\n          116: \"\\t\",\n          110: \"\\n\",\n          102: \"\\f\",\n          114: \"\\r\"\n        };\n\n        // Internal: Stores the parser state.\n        var Index, Source;\n\n        // Internal: Resets the parser state and throws a `SyntaxError`.\n        var abort = function () {\n          Index = Source = null;\n          throw SyntaxError();\n        };\n\n        // Internal: Returns the next token, or `\"$\"` if the parser has reached\n        // the end of the source string. A token may be a string, number, `null`\n        // literal, or Boolean literal.\n        var lex = function () {\n          var source = Source, length = source.length, value, begin, position, isSigned, charCode;\n          while (Index < length) {\n            charCode = source.charCodeAt(Index);\n            switch (charCode) {\n              case 9: case 10: case 13: case 32:\n                // Skip whitespace tokens, including tabs, carriage returns, line\n                // feeds, and space characters.\n                Index++;\n                break;\n              case 123: case 125: case 91: case 93: case 58: case 44:\n                // Parse a punctuator token (`{`, `}`, `[`, `]`, `:`, or `,`) at\n                // the current position.\n                value = charIndexBuggy ? source.charAt(Index) : source[Index];\n                Index++;\n                return value;\n              case 34:\n                // `\"` delimits a JSON string; advance to the next character and\n                // begin parsing the string. String tokens are prefixed with the\n                // sentinel `@` character to distinguish them from punctuators and\n                // end-of-string tokens.\n                for (value = \"@\", Index++; Index < length;) {\n                  charCode = source.charCodeAt(Index);\n                  if (charCode < 32) {\n                    // Unescaped ASCII control characters (those with a code unit\n                    // less than the space character) are not permitted.\n                    abort();\n                  } else if (charCode == 92) {\n                    // A reverse solidus (`\\`) marks the beginning of an escaped\n                    // control character (including `\"`, `\\`, and `/`) or Unicode\n                    // escape sequence.\n                    charCode = source.charCodeAt(++Index);\n                    switch (charCode) {\n                      case 92: case 34: case 47: case 98: case 116: case 110: case 102: case 114:\n                        // Revive escaped control characters.\n                        value += Unescapes[charCode];\n                        Index++;\n                        break;\n                      case 117:\n                        // `\\u` marks the beginning of a Unicode escape sequence.\n                        // Advance to the first character and validate the\n                        // four-digit code point.\n                        begin = ++Index;\n                        for (position = Index + 4; Index < position; Index++) {\n                          charCode = source.charCodeAt(Index);\n                          // A valid sequence comprises four hexdigits (case-\n                          // insensitive) that form a single hexadecimal value.\n                          if (!(charCode >= 48 && charCode <= 57 || charCode >= 97 && charCode <= 102 || charCode >= 65 && charCode <= 70)) {\n                            // Invalid Unicode escape sequence.\n                            abort();\n                          }\n                        }\n                        // Revive the escaped character.\n                        value += fromCharCode(\"0x\" + source.slice(begin, Index));\n                        break;\n                      default:\n                        // Invalid escape sequence.\n                        abort();\n                    }\n                  } else {\n                    if (charCode == 34) {\n                      // An unescaped double-quote character marks the end of the\n                      // string.\n                      break;\n                    }\n                    charCode = source.charCodeAt(Index);\n                    begin = Index;\n                    // Optimize for the common case where a string is valid.\n                    while (charCode >= 32 && charCode != 92 && charCode != 34) {\n                      charCode = source.charCodeAt(++Index);\n                    }\n                    // Append the string as-is.\n                    value += source.slice(begin, Index);\n                  }\n                }\n                if (source.charCodeAt(Index) == 34) {\n                  // Advance to the next character and return the revived string.\n                  Index++;\n                  return value;\n                }\n                // Unterminated string.\n                abort();\n              default:\n                // Parse numbers and literals.\n                begin = Index;\n                // Advance past the negative sign, if one is specified.\n                if (charCode == 45) {\n                  isSigned = true;\n                  charCode = source.charCodeAt(++Index);\n                }\n                // Parse an integer or floating-point value.\n                if (charCode >= 48 && charCode <= 57) {\n                  // Leading zeroes are interpreted as octal literals.\n                  if (charCode == 48 && ((charCode = source.charCodeAt(Index + 1)), charCode >= 48 && charCode <= 57)) {\n                    // Illegal octal literal.\n                    abort();\n                  }\n                  isSigned = false;\n                  // Parse the integer component.\n                  for (; Index < length && ((charCode = source.charCodeAt(Index)), charCode >= 48 && charCode <= 57); Index++);\n                  // Floats cannot contain a leading decimal point; however, this\n                  // case is already accounted for by the parser.\n                  if (source.charCodeAt(Index) == 46) {\n                    position = ++Index;\n                    // Parse the decimal component.\n                    for (; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);\n                    if (position == Index) {\n                      // Illegal trailing decimal.\n                      abort();\n                    }\n                    Index = position;\n                  }\n                  // Parse exponents. The `e` denoting the exponent is\n                  // case-insensitive.\n                  charCode = source.charCodeAt(Index);\n                  if (charCode == 101 || charCode == 69) {\n                    charCode = source.charCodeAt(++Index);\n                    // Skip past the sign following the exponent, if one is\n                    // specified.\n                    if (charCode == 43 || charCode == 45) {\n                      Index++;\n                    }\n                    // Parse the exponential component.\n                    for (position = Index; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);\n                    if (position == Index) {\n                      // Illegal empty exponent.\n                      abort();\n                    }\n                    Index = position;\n                  }\n                  // Coerce the parsed value to a JavaScript number.\n                  return +source.slice(begin, Index);\n                }\n                // A negative sign may only precede numbers.\n                if (isSigned) {\n                  abort();\n                }\n                // `true`, `false`, and `null` literals.\n                if (source.slice(Index, Index + 4) == \"true\") {\n                  Index += 4;\n                  return true;\n                } else if (source.slice(Index, Index + 5) == \"false\") {\n                  Index += 5;\n                  return false;\n                } else if (source.slice(Index, Index + 4) == \"null\") {\n                  Index += 4;\n                  return null;\n                }\n                // Unrecognized token.\n                abort();\n            }\n          }\n          // Return the sentinel `$` character if the parser has reached the end\n          // of the source string.\n          return \"$\";\n        };\n\n        // Internal: Parses a JSON `value` token.\n        var get = function (value) {\n          var results, hasMembers;\n          if (value == \"$\") {\n            // Unexpected end of input.\n            abort();\n          }\n          if (typeof value == \"string\") {\n            if ((charIndexBuggy ? value.charAt(0) : value[0]) == \"@\") {\n              // Remove the sentinel `@` character.\n              return value.slice(1);\n            }\n            // Parse object and array literals.\n            if (value == \"[\") {\n              // Parses a JSON array, returning a new JavaScript array.\n              results = [];\n              for (;; hasMembers || (hasMembers = true)) {\n                value = lex();\n                // A closing square bracket marks the end of the array literal.\n                if (value == \"]\") {\n                  break;\n                }\n                // If the array literal contains elements, the current token\n                // should be a comma separating the previous element from the\n                // next.\n                if (hasMembers) {\n                  if (value == \",\") {\n                    value = lex();\n                    if (value == \"]\") {\n                      // Unexpected trailing `,` in array literal.\n                      abort();\n                    }\n                  } else {\n                    // A `,` must separate each array element.\n                    abort();\n                  }\n                }\n                // Elisions and leading commas are not permitted.\n                if (value == \",\") {\n                  abort();\n                }\n                results.push(get(value));\n              }\n              return results;\n            } else if (value == \"{\") {\n              // Parses a JSON object, returning a new JavaScript object.\n              results = {};\n              for (;; hasMembers || (hasMembers = true)) {\n                value = lex();\n                // A closing curly brace marks the end of the object literal.\n                if (value == \"}\") {\n                  break;\n                }\n                // If the object literal contains members, the current token\n                // should be a comma separator.\n                if (hasMembers) {\n                  if (value == \",\") {\n                    value = lex();\n                    if (value == \"}\") {\n                      // Unexpected trailing `,` in object literal.\n                      abort();\n                    }\n                  } else {\n                    // A `,` must separate each object member.\n                    abort();\n                  }\n                }\n                // Leading commas are not permitted, object property names must be\n                // double-quoted strings, and a `:` must separate each property\n                // name and value.\n                if (value == \",\" || typeof value != \"string\" || (charIndexBuggy ? value.charAt(0) : value[0]) != \"@\" || lex() != \":\") {\n                  abort();\n                }\n                results[value.slice(1)] = get(lex());\n              }\n              return results;\n            }\n            // Unexpected token encountered.\n            abort();\n          }\n          return value;\n        };\n\n        // Internal: Updates a traversed object member.\n        var update = function (source, property, callback) {\n          var element = walk(source, property, callback);\n          if (element === undef) {\n            delete source[property];\n          } else {\n            source[property] = element;\n          }\n        };\n\n        // Internal: Recursively traverses a parsed JSON object, invoking the\n        // `callback` function for each value. This is an implementation of the\n        // `Walk(holder, name)` operation defined in ES 5.1 section 15.12.2.\n        var walk = function (source, property, callback) {\n          var value = source[property], length;\n          if (typeof value == \"object\" && value) {\n            // `forEach` can't be used to traverse an array in Opera <= 8.54\n            // because its `Object#hasOwnProperty` implementation returns `false`\n            // for array indices (e.g., `![1, 2, 3].hasOwnProperty(\"0\")`).\n            if (getClass.call(value) == arrayClass) {\n              for (length = value.length; length--;) {\n                update(value, length, callback);\n              }\n            } else {\n              forEach(value, function (property) {\n                update(value, property, callback);\n              });\n            }\n          }\n          return callback.call(source, property, value);\n        };\n\n        // Public: `JSON.parse`. See ES 5.1 section 15.12.2.\n        exports.parse = function (source, callback) {\n          var result, value;\n          Index = 0;\n          Source = \"\" + source;\n          result = get(lex());\n          // If a JSON string contains multiple tokens, it is invalid.\n          if (lex() != \"$\") {\n            abort();\n          }\n          // Reset the parser state.\n          Index = Source = null;\n          return callback && getClass.call(callback) == functionClass ? walk((value = {}, value[\"\"] = result, value), \"\", callback) : result;\n        };\n      }\n    }\n\n    exports[\"runInContext\"] = runInContext;\n    return exports;\n  }\n\n  if (freeExports && !isLoader) {\n    // Export for CommonJS environments.\n    runInContext(root, freeExports);\n  } else {\n    // Export for web browsers and JavaScript engines.\n    var nativeJSON = root.JSON,\n        previousJSON = root[\"JSON3\"],\n        isRestored = false;\n\n    var JSON3 = runInContext(root, (root[\"JSON3\"] = {\n      // Public: Restores the original value of the global `JSON` object and\n      // returns a reference to the `JSON3` object.\n      \"noConflict\": function () {\n        if (!isRestored) {\n          isRestored = true;\n          root.JSON = nativeJSON;\n          root[\"JSON3\"] = previousJSON;\n          nativeJSON = previousJSON = null;\n        }\n        return JSON3;\n      }\n    }));\n\n    root.JSON = {\n      \"parse\": JSON3.parse,\n      \"stringify\": JSON3.stringify\n    };\n  }\n\n  // Export for asynchronous module loaders.\n  if (isLoader) {\n    define(function () {\n      return JSON3;\n    });\n  }\n}).call(this);\n\n//##############################################################################\n// Elements.js\n//##############################################################################\n\n(function () {\n\n\t/**\n\t * Convenience methods for creating various elements used by PrelaodJS.\n\t *\n\t * @class DomUtils\n\t */\n\tvar s = {};\n\n\ts.a = function() {\n\t\treturn s.el(\"a\");\n\t}\n\n\ts.svg = function() {\n\t\treturn s.el(\"svg\");\n\t}\n\n\ts.object = function() {\n\t\treturn s.el(\"object\");\n\t}\n\n\ts.image = function() {\n\t\treturn s.el(\"image\");\n\t}\n\n\ts.img = function() {\n\t\treturn s.el(\"img\");\n\t}\n\n\ts.style = function() {\n\t\treturn s.el(\"style\");\n\t}\n\n\ts.link = function() {\n\t\treturn s.el(\"link\");\n\t}\n\n\ts.script = function() {\n\t\treturn s.el(\"script\");\n\t}\n\n\ts.audio = function() {\n\t\treturn s.el(\"audio\");\n\t}\n\n\ts.video = function() {\n\t\treturn s.el(\"video\");\n\t}\n\n\ts.text = function(value) {\n\t\treturn document.createTextNode(value);\n\t}\n\n\ts.el = function(name) {\n\t\treturn document.createElement(name);\n\t}\n\n\tcreatejs.Elements = s;\n\n}());\n\n//##############################################################################\n// URLUtils.js\n//##############################################################################\n\n(function () {\n\n\t/**\n\t * Utilities that assist with parsing load items, and determining file types, etc.\n\t * @class URLUtils\n\t */\n\tvar s = {};\n\n\t/**\n\t * The Regular Expression used to test file URLS for an absolute path.\n\t * @property ABSOLUTE_PATH\n\t * @type {RegExp}\n\t * @static\n\t */\n\ts.ABSOLUTE_PATT = /^(?:\\w+:)?\\/{2}/i;\n\n\t/**\n\t * The Regular Expression used to test file URLS for a relative path.\n\t * @property RELATIVE_PATH\n\t * @type {RegExp}\n\t * @static\n\t */\n\ts.RELATIVE_PATT = (/^[./]*?\\//i);\n\n\t/**\n\t * The Regular Expression used to test file URLS for an extension. Note that URIs must already have the query string\n\t * removed.\n\t * @property EXTENSION_PATT\n\t * @type {RegExp}\n\t * @static\n\t */\n\ts.EXTENSION_PATT = /\\/?[^/]+\\.(\\w{1,5})$/i;\n\n\t/**\n\t * Parse a file path to determine the information we need to work with it. Currently, PreloadJS needs to know:\n\t * <ul>\n\t *     <li>If the path is absolute. Absolute paths start with a protocol (such as `http://`, `file://`, or\n\t *     `//networkPath`)</li>\n\t *     <li>If the path is relative. Relative paths start with `../` or `/path` (or similar)</li>\n\t *     <li>The file extension. This is determined by the filename with an extension. Query strings are dropped, and\n\t *     the file path is expected to follow the format `name.ext`.</li>\n\t * </ul>\n\t *\n\t * @method parseURI\n\t * @param {String} path\n\t * @returns {Object} An Object with an `absolute` and `relative` Boolean values,\n\t * \tthe pieces of the path (protocol, hostname, port, pathname, search, hash, host)\n\t * \tas well as an optional 'extension` property, which is the lowercase extension.\n\t *\n\t * @static\n\t */\n\ts.parseURI = function (path) {\n\t\tvar info = {\n\t\t\tabsolute: false,\n\t\t\trelative: false,\n\t\t\tprotocol: null,\n\t\t\thostname: null,\n\t\t\tport: null,\n\t\t\tpathname: null,\n\t\t\tsearch: null,\n\t\t\thash: null,\n\t\t\thost: null\n\t\t};\n\n\t\tif (path == null) { return info; }\n\n\t\t// Inject the path parts.\n\t\tvar parser = createjs.Elements.a();\n\t\tparser.href = path;\n\n\t\tfor (var n in info) {\n\t\t\tif (n in parser) {\n\t\t\t\tinfo[n] = parser[n];\n\t\t\t}\n\t\t}\n\n\t\t// Drop the query string\n\t\tvar queryIndex = path.indexOf(\"?\");\n\t\tif (queryIndex > -1) {\n\t\t\tpath = path.substr(0, queryIndex);\n\t\t}\n\n\t\t// Absolute\n\t\tvar match;\n\t\tif (s.ABSOLUTE_PATT.test(path)) {\n\t\t\tinfo.absolute = true;\n\n\t\t\t// Relative\n\t\t} else if (s.RELATIVE_PATT.test(path)) {\n\t\t\tinfo.relative = true;\n\t\t}\n\n\t\t// Extension\n\t\tif (match = path.match(s.EXTENSION_PATT)) {\n\t\t\tinfo.extension = match[1].toLowerCase();\n\t\t}\n\n\t\treturn info;\n\t};\n\n\t/**\n\t * Formats an object into a query string for either a POST or GET request.\n\t * @method formatQueryString\n\t * @param {Object} data The data to convert to a query string.\n\t * @param {Array} [query] Existing name/value pairs to append on to this query.\n\t * @static\n\t */\n\ts.formatQueryString = function (data, query) {\n\t\tif (data == null) {\n\t\t\tthrow new Error(\"You must specify data.\");\n\t\t}\n\t\tvar params = [];\n\t\tfor (var n in data) {\n\t\t\tparams.push(n + \"=\" + escape(data[n]));\n\t\t}\n\t\tif (query) {\n\t\t\tparams = params.concat(query);\n\t\t}\n\t\treturn params.join(\"&\");\n\t};\n\n\t/**\n\t * A utility method that builds a file path using a source and a data object, and formats it into a new path.\n\t * @method buildURI\n\t * @param {String} src The source path to add values to.\n\t * @param {Object} [data] Object used to append values to this request as a query string. Existing parameters on the\n\t * path will be preserved.\n\t * @returns {string} A formatted string that contains the path and the supplied parameters.\n\t * @static\n\t */\n\ts.buildURI = function (src, data) {\n\t\tif (data == null) {\n\t\t\treturn src;\n\t\t}\n\n\t\tvar query = [];\n\t\tvar idx = src.indexOf(\"?\");\n\n\t\tif (idx != -1) {\n\t\t\tvar q = src.slice(idx + 1);\n\t\t\tquery = query.concat(q.split(\"&\"));\n\t\t}\n\n\t\tif (idx != -1) {\n\t\t\treturn src.slice(0, idx) + \"?\" + this.formatQueryString(data, query);\n\t\t} else {\n\t\t\treturn src + \"?\" + this.formatQueryString(data, query);\n\t\t}\n\t};\n\n\t/**\n\t * @method isCrossDomain\n\t * @param {LoadItem|Object} item A load item with a `src` property.\n\t * @return {Boolean} If the load item is loading from a different domain than the current location.\n\t * @static\n\t */\n\ts.isCrossDomain = function (item) {\n\t\tvar target = createjs.Elements.a();\n\t\ttarget.href = item.src;\n\n\t\tvar host = createjs.Elements.a();\n\t\thost.href = location.href;\n\n\t\tvar crossdomain = (target.hostname != \"\") &&\n\t\t\t(target.port != host.port ||\n\t\t\ttarget.protocol != host.protocol ||\n\t\t\ttarget.hostname != host.hostname);\n\t\treturn crossdomain;\n\t};\n\n\t/**\n\t * @method isLocal\n\t * @param {LoadItem|Object} item A load item with a `src` property\n\t * @return {Boolean} If the load item is loading from the \"file:\" protocol. Assume that the host must be local as\n\t * well.\n\t * @static\n\t */\n\ts.isLocal = function (item) {\n\t\tvar target = createjs.Elements.a();\n\t\ttarget.href = item.src;\n\t\treturn target.hostname == \"\" && target.protocol == \"file:\";\n\t};\n\n\tcreatejs.URLUtils = s;\n\n}());\n\n//##############################################################################\n// DomUtils.js\n//##############################################################################\n\n(function () {\n\n\t/**\n\t * A few utilities for interacting with the dom.\n\t * @class DomUtils\n\t */\n\tvar s = {\n\t\tcontainer: null\n\t};\n\n\ts.appendToHead = function (el) {\n\t\ts.getHead().appendChild(el);\n\t}\n\n\ts.appendToBody = function (el) {\n\t\tif (s.container == null) {\n\t\t\ts.container = document.createElement(\"div\");\n\t\t\ts.container.id = \"preloadjs-container\";\n\t\t\tvar style = s.container.style;\n\t\t\tstyle.visibility = \"hidden\";\n\t\t\tstyle.position = \"absolute\";\n\t\t\tstyle.width = s.container.style.height = \"10px\";\n\t\t\tstyle.overflow = \"hidden\";\n\t\t\tstyle.transform = style.msTransform = style.webkitTransform = style.oTransform = \"translate(-10px, -10px)\"; //LM: Not working\n\t\t\ts.getBody().appendChild(s.container);\n\t\t}\n\t\ts.container.appendChild(el);\n\t}\n\n\ts.getHead = function () {\n\t\treturn document.head || document.getElementsByTagName(\"head\")[0];\n\t}\n\n\ts.getBody = function () {\n\t\treturn document.body || document.getElementsByTagName(\"body\")[0];\n\t}\n\n\ts.removeChild = function(el) {\n\t\tif (el.parent) {\n\t\t\tel.parent.removeChild(el);\n\t\t}\n\t}\n\n\t/**\n\t * Check if item is a valid HTMLImageElement\n\t * @method isImageTag\n\t * @param {Object} item\n\t * @returns {Boolean}\n\t * @static\n\t */\n\ts.isImageTag = function(item) {\n\t\treturn item instanceof HTMLImageElement;\n\t};\n\n\t/**\n\t * Check if item is a valid HTMLAudioElement\n\t * @method isAudioTag\n\t * @param {Object} item\n\t * @returns {Boolean}\n\t * @static\n\t */\n\ts.isAudioTag = function(item) {\n\t\tif (window.HTMLAudioElement) {\n\t\t\treturn item instanceof HTMLAudioElement;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/**\n\t * Check if item is a valid HTMLVideoElement\n\t * @method isVideoTag\n\t * @param {Object} item\n\t * @returns {Boolean}\n\t * @static\n\t */\n\ts.isVideoTag = function(item) {\n\t\tif (window.HTMLVideoElement) {\n\t\t\treturn item instanceof HTMLVideoElement;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tcreatejs.DomUtils = s;\n\n}());\n\n//##############################################################################\n// DataUtils.js\n//##############################################################################\n\n(function () {\n\n\t/**\n\t * A few data utilities for formatting different data types.\n\t * @class DataUtils\n\t */\n\tvar s = {};\n\n\t// static methods\n\t/**\n\t * Parse XML using the DOM. This is required when preloading XML or SVG.\n\t * @method parseXML\n\t * @param {String} text The raw text or XML that is loaded by XHR.\n\t * @return {XML} An XML document\n\t * @static\n\t */\n\ts.parseXML = function (text) {\n\t\tvar xml = null;\n\t\t// CocoonJS does not support XML parsing with either method.\n\n\t\t// Most browsers will use DOMParser\n\t\t// IE fails on certain SVG files, so we have a fallback below.\n\t\ttry {\n\t\t\tif (window.DOMParser) {\n\t\t\t\tvar parser = new DOMParser();\n\t\t\t\txml = parser.parseFromString(text, \"text/xml\");\n\t\t\t}\n\t\t} catch (e) {\n\t\t}\n\n\t\t// Fallback for IE support.\n\t\tif (!xml) {\n\t\t\ttry {\n\t\t\t\txml = new ActiveXObject(\"Microsoft.XMLDOM\");\n\t\t\t\txml.async = false;\n\t\t\t\txml.loadXML(text);\n\t\t\t} catch (e) {\n\t\t\t\txml = null;\n\t\t\t}\n\t\t}\n\n\t\treturn xml;\n\t};\n\n\t/**\n\t * Parse a string into an Object.\n\t * @method parseJSON\n\t * @param {String} value The loaded JSON string\n\t * @returns {Object} A JavaScript object.\n\t */\n\ts.parseJSON = function (value) {\n\t\tif (value == null) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\treturn JSON.parse(value);\n\t\t} catch (e) {\n\t\t\t// TODO; Handle this with a custom error?\n\t\t\tthrow e;\n\t\t}\n\t};\n\n\tcreatejs.DataUtils = s;\n\n}());\n\n//##############################################################################\n// Types.js\n//##############################################################################\n\n(function() {\n\tvar s = {};\n\n\t/**\n\t * The preload type for generic binary types. Note that images are loaded as binary files when using XHR.\n\t * @property BINARY\n\t * @type {String}\n\t * @default binary\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.BINARY = \"binary\";\n\n\t/**\n\t * The preload type for css files. CSS files are loaded using a &lt;link&gt; when loaded with XHR, or a\n\t * &lt;style&gt; tag when loaded with tags.\n\t * @property CSS\n\t * @type {String}\n\t * @default css\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.CSS = \"css\";\n\n\t/**\n\t * The preload type for font files.\n\t * @property FONT\n\t * @type {String}\n\t * @default font\n\t * @static\n\t * @since 0.9.0\n\t */\n\ts.FONT = \"font\";\n\n\t/**\n\t * The preload type for fonts specified with CSS (such as Google fonts)\n\t * @property FONTCSS\n\t * @type {String}\n\t * @default fontcss\n\t * @static\n\t * @since 0.9.0\n\t */\n\ts.FONTCSS = \"fontcss\";\n\n\t/**\n\t * The preload type for image files, usually png, gif, or jpg/jpeg. Images are loaded into an &lt;image&gt; tag.\n\t * @property IMAGE\n\t * @type {String}\n\t * @default image\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.IMAGE = \"image\";\n\n\t/**\n\t * The preload type for javascript files, usually with the \"js\" file extension. JavaScript files are loaded into a\n\t * &lt;script&gt; tag.\n\t *\n\t * Since version 0.4.1+, due to how tag-loaded scripts work, all JavaScript files are automatically injected into\n\t * the body of the document to maintain parity between XHR and tag-loaded scripts. In version 0.4.0 and earlier,\n\t * only tag-loaded scripts are injected.\n\t * @property JAVASCRIPT\n\t * @type {String}\n\t * @default javascript\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.JAVASCRIPT = \"javascript\";\n\n\t/**\n\t * The preload type for json files, usually with the \"json\" file extension. JSON data is loaded and parsed into a\n\t * JavaScript object. Note that if a `callback` is present on the load item, the file will be loaded with JSONP,\n\t * no matter what the {{#crossLink \"LoadQueue/preferXHR:property\"}}{{/crossLink}} property is set to, and the JSON\n\t * must contain a matching wrapper function.\n\t * @property JSON\n\t * @type {String}\n\t * @default json\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.JSON = \"json\";\n\n\t/**\n\t * The preload type for jsonp files, usually with the \"json\" file extension. JSON data is loaded and parsed into a\n\t * JavaScript object. You are required to pass a callback parameter that matches the function wrapper in the JSON.\n\t * Note that JSONP will always be used if there is a callback present, no matter what the {{#crossLink \"LoadQueue/preferXHR:property\"}}{{/crossLink}}\n\t * property is set to.\n\t * @property JSONP\n\t * @type {String}\n\t * @default jsonp\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.JSONP = \"jsonp\";\n\n\t/**\n\t * The preload type for json-based manifest files, usually with the \"json\" file extension. The JSON data is loaded\n\t * and parsed into a JavaScript object. PreloadJS will then look for a \"manifest\" property in the JSON, which is an\n\t * Array of files to load, following the same format as the {{#crossLink \"LoadQueue/loadManifest\"}}{{/crossLink}}\n\t * method. If a \"callback\" is specified on the manifest object, then it will be loaded using JSONP instead,\n\t * regardless of what the {{#crossLink \"LoadQueue/preferXHR:property\"}}{{/crossLink}} property is set to.\n\t * @property MANIFEST\n\t * @type {String}\n\t * @default manifest\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.MANIFEST = \"manifest\";\n\n\t/**\n\t * The preload type for sound files, usually mp3, ogg, or wav. When loading via tags, audio is loaded into an\n\t * &lt;audio&gt; tag.\n\t * @property SOUND\n\t * @type {String}\n\t * @default sound\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.SOUND = \"sound\";\n\n\t/**\n\t * The preload type for video files, usually mp4, ts, or ogg. When loading via tags, video is loaded into an\n\t * &lt;video&gt; tag.\n\t * @property VIDEO\n\t * @type {String}\n\t * @default video\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.VIDEO = \"video\";\n\n\t/**\n\t * The preload type for SpriteSheet files. SpriteSheet files are JSON files that contain string image paths.\n\t * @property SPRITESHEET\n\t * @type {String}\n\t * @default spritesheet\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.SPRITESHEET = \"spritesheet\";\n\n\t/**\n\t * The preload type for SVG files.\n\t * @property SVG\n\t * @type {String}\n\t * @default svg\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.SVG = \"svg\";\n\n\t/**\n\t * The preload type for text files, which is also the default file type if the type can not be determined. Text is\n\t * loaded as raw text.\n\t * @property TEXT\n\t * @type {String}\n\t * @default text\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.TEXT = \"text\";\n\n\t/**\n\t * The preload type for xml files. XML is loaded into an XML document.\n\t * @property XML\n\t * @type {String}\n\t * @default xml\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.XML = \"xml\";\n\n\tcreatejs.Types = s;\n}());\n\n//##############################################################################\n// Methods.js\n//##############################################################################\n\n(function() {\n\tvar s = {};\n\n\t/**\n\t * Defines a POST request, use for a method value when loading data.\n\t * @property POST\n\t * @type {string}\n\t * @default post\n\t * @static\n\t */\n\ts.POST = \"POST\";\n\n\t/**\n\t * Defines a GET request, use for a method value when loading data.\n\t * @property GET\n\t * @type {string}\n\t * @default get\n\t * @static\n\t */\n\ts.GET = \"GET\";\n\n\tcreatejs.Methods = s;\n}());\n\n//##############################################################################\n// LoadItem.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t/**\n\t * All loaders accept an item containing the properties defined in this class. If a raw object is passed instead,\n\t * it will not be affected, but it must contain at least a {{#crossLink \"src:property\"}}{{/crossLink}} property. A\n\t * string path or HTML tag is also acceptable, but it will be automatically converted to a LoadItem using the\n\t * {{#crossLink \"create\"}}{{/crossLink}} method by {{#crossLink \"AbstractLoader\"}}{{/crossLink}}\n\t * @class LoadItem\n\t * @constructor\n\t * @since 0.6.0\n\t */\n\tfunction LoadItem() {\n\t\t/**\n\t\t * The source of the file that is being loaded. This property is <b>required</b>. The source can either be a\n\t\t * string (recommended), or an HTML tag.\n\t\t * This can also be an object, but in that case it has to include a type and be handled by a plugin.\n\t\t * @property src\n\t\t * @type {String}\n\t\t * @default null\n\t\t */\n\t\tthis.src = null;\n\n\t\t/**\n\t\t * The type file that is being loaded. The type of the file is usually inferred by the extension, but can also\n\t\t * be set manually. This is helpful in cases where a file does not have an extension.\n\t\t * @property type\n\t\t * @type {String}\n\t\t * @default null\n\t\t */\n\t\tthis.type = null;\n\n\t\t/**\n\t\t * A string identifier which can be used to reference the loaded object. If none is provided, this will be\n\t\t * automatically set to the {{#crossLink \"src:property\"}}{{/crossLink}}.\n\t\t * @property id\n\t\t * @type {String}\n\t\t * @default null\n\t\t */\n\t\tthis.id = null;\n\n\t\t/**\n\t\t * Determines if a manifest will maintain the order of this item, in relation to other items in the manifest\n\t\t * that have also set the `maintainOrder` property to `true`. This only applies when the max connections has\n\t\t * been set above 1 (using {{#crossLink \"LoadQueue/setMaxConnections\"}}{{/crossLink}}). Everything with this\n\t\t * property set to `false` will finish as it is loaded. Ordered items are combined with script tags loading in\n\t\t * order when {{#crossLink \"LoadQueue/maintainScriptOrder:property\"}}{{/crossLink}} is set to `true`.\n\t\t * @property maintainOrder\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.maintainOrder = false;\n\n\t\t/**\n\t\t * A callback used by JSONP requests that defines what global method to call when the JSONP content is loaded.\n\t\t * @property callback\n\t\t * @type {String}\n\t\t * @default null\n\t\t */\n\t\tthis.callback = null;\n\n\t\t/**\n\t\t * An arbitrary data object, which is included with the loaded object.\n\t\t * @property data\n\t\t * @type {Object}\n\t\t * @default null\n\t\t */\n\t\tthis.data = null;\n\n\t\t/**\n\t\t * The request method used for HTTP calls. Both {{#crossLink \"Methods/GET:property\"}}{{/crossLink}} or\n\t\t * {{#crossLink \"Methods/POST:property\"}}{{/crossLink}} request types are supported, and are defined as\n\t\t * constants on {{#crossLink \"AbstractLoader\"}}{{/crossLink}}.\n\t\t * @property method\n\t\t * @type {String}\n\t\t * @default GET\n\t\t */\n\t\tthis.method = createjs.Methods.GET;\n\n\t\t/**\n\t\t * An object hash of name/value pairs to send to the server.\n\t\t * @property values\n\t\t * @type {Object}\n\t\t * @default null\n\t\t */\n\t\tthis.values = null;\n\n\t\t/**\n\t\t * An object hash of headers to attach to an XHR request. PreloadJS will automatically attach some default\n\t\t * headers when required, including \"Origin\", \"Content-Type\", and \"X-Requested-With\". You may override the\n\t\t * default headers by including them in your headers object.\n\t\t * @property headers\n\t\t * @type {Object}\n\t\t * @default null\n\t\t */\n\t\tthis.headers = null;\n\n\t\t/**\n\t\t * Enable credentials for XHR requests.\n\t\t * @property withCredentials\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.withCredentials = false;\n\n\t\t/**\n\t\t * Set the mime type of XHR-based requests. This is automatically set to \"text/plain; charset=utf-8\" for text\n\t\t * based files (json, xml, text, css, js).\n\t\t * @property mimeType\n\t\t * @type {String}\n\t\t * @default null\n\t\t */\n\t\tthis.mimeType = null;\n\n\t\t/**\n\t\t * Sets the crossOrigin attribute for CORS-enabled images loading cross-domain.\n\t\t * @property crossOrigin\n\t\t * @type {boolean}\n\t\t * @default Anonymous\n\t\t */\n\t\tthis.crossOrigin = null;\n\n\t\t/**\n\t\t * The duration in milliseconds to wait before a request times out. This only applies to tag-based and and XHR\n\t\t * (level one) loading, as XHR (level 2) provides its own timeout event.\n\t\t * @property loadTimeout\n\t\t * @type {Number}\n\t\t * @default 8000 (8 seconds)\n\t\t */\n\t\tthis.loadTimeout = s.LOAD_TIMEOUT_DEFAULT;\n\t};\n\n\tvar p = LoadItem.prototype = {};\n\tvar s = LoadItem;\n\n\t/**\n\t * Default duration in milliseconds to wait before a request times out. This only applies to tag-based and and XHR\n\t * (level one) loading, as XHR (level 2) provides its own timeout event.\n\t * @property LOAD_TIMEOUT_DEFAULT\n\t * @type {number}\n\t * @static\n\t */\n\ts.LOAD_TIMEOUT_DEFAULT = 8000;\n\n\t/**\n\t * Create a LoadItem.\n\t * <ul>\n\t *     <li>String-based items are converted to a LoadItem with a populated {{#crossLink \"src:property\"}}{{/crossLink}}.</li>\n\t *     <li>LoadItem instances are returned as-is</li>\n\t *     <li>Objects are returned with any needed properties added</li>\n\t * </ul>\n\t * @method create\n\t * @param {LoadItem|String|Object} value The load item value\n\t * @returns {LoadItem|Object}\n\t * @static\n\t */\n\ts.create = function (value) {\n\t\tif (typeof value == \"string\") {\n\t\t\tvar item = new LoadItem();\n\t\t\titem.src = value;\n\t\t\treturn item;\n\t\t} else if (value instanceof s) {\n\t\t\treturn value;\n\t\t} else if (value instanceof Object && value.src) {\n\t\t\tif (value.loadTimeout == null) {\n\t\t\t\tvalue.loadTimeout = s.LOAD_TIMEOUT_DEFAULT;\n\t\t\t}\n\t\t\treturn value;\n\t\t} else {\n\t\t\tthrow new Error(\"Type not recognized.\");\n\t\t}\n\t};\n\n\t/**\n\t * Provides a chainable shortcut method for setting a number of properties on the instance.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      var loadItem = new createjs.LoadItem().set({src:\"image.png\", maintainOrder:true});\n\t *\n\t * @method set\n\t * @param {Object} props A generic object containing properties to copy to the LoadItem instance.\n\t * @return {LoadItem} Returns the instance the method is called on (useful for chaining calls.)\n\t*/\n\tp.set = function(props) {\n\t\tfor (var n in props) { this[n] = props[n]; }\n\t\treturn this;\n\t};\n\n\tcreatejs.LoadItem = s;\n\n}());\n\n//##############################################################################\n// RequestUtils.js\n//##############################################################################\n\n(function () {\n\n\t/**\n\t * Utilities that assist with parsing load items, and determining file types, etc.\n\t * @class RequestUtils\n\t */\n\tvar s = {};\n\n\t/**\n\t * Determine if a specific type should be loaded as a binary file. Currently, only images and items marked\n\t * specifically as \"binary\" are loaded as binary. Note that audio is <b>not</b> a binary type, as we can not play\n\t * back using an audio tag if it is loaded as binary. Plugins can change the item type to binary to ensure they get\n\t * a binary result to work with. Binary files are loaded using XHR2. Types are defined as static constants on\n\t * {{#crossLink \"AbstractLoader\"}}{{/crossLink}}.\n\t * @method isBinary\n\t * @param {String} type The item type.\n\t * @return {Boolean} If the specified type is binary.\n\t * @static\n\t */\n\ts.isBinary = function (type) {\n\t\tswitch (type) {\n\t\t\tcase createjs.Types.IMAGE:\n\t\t\tcase createjs.Types.BINARY:\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t};\n\n\t/**\n\t * Determine if a specific type is a text-based asset, and should be loaded as UTF-8.\n\t * @method isText\n\t * @param {String} type The item type.\n\t * @return {Boolean} If the specified type is text.\n\t * @static\n\t */\n\ts.isText = function (type) {\n\t\tswitch (type) {\n\t\t\tcase createjs.Types.TEXT:\n\t\t\tcase createjs.Types.JSON:\n\t\t\tcase createjs.Types.MANIFEST:\n\t\t\tcase createjs.Types.XML:\n\t\t\tcase createjs.Types.CSS:\n\t\t\tcase createjs.Types.SVG:\n\t\t\tcase createjs.Types.JAVASCRIPT:\n\t\t\tcase createjs.Types.SPRITESHEET:\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t};\n\n\t/**\n\t * Determine the type of the object using common extensions. Note that the type can be passed in with the load item\n\t * if it is an unusual extension.\n\t * @method getTypeByExtension\n\t * @param {String} extension The file extension to use to determine the load type.\n\t * @return {String} The determined load type (for example, `createjs.Types.IMAGE`). Will return `null` if\n\t * the type can not be determined by the extension.\n\t * @static\n\t */\n\ts.getTypeByExtension = function (extension) {\n\t\tif (extension == null) {\n\t\t\treturn createjs.Types.TEXT;\n\t\t}\n\n\t\tswitch (extension.toLowerCase()) {\n\t\t\tcase \"jpeg\":\n\t\t\tcase \"jpg\":\n\t\t\tcase \"gif\":\n\t\t\tcase \"png\":\n\t\t\tcase \"webp\":\n\t\t\tcase \"bmp\":\n\t\t\t\treturn createjs.Types.IMAGE;\n\t\t\tcase \"ogg\":\n\t\t\tcase \"mp3\":\n\t\t\tcase \"webm\":\n\t\t\t\treturn createjs.Types.SOUND;\n\t\t\tcase \"mp4\":\n\t\t\tcase \"webm\":\n\t\t\tcase \"ts\":\n\t\t\t\treturn createjs.Types.VIDEO;\n\t\t\tcase \"json\":\n\t\t\t\treturn createjs.Types.JSON;\n\t\t\tcase \"xml\":\n\t\t\t\treturn createjs.Types.XML;\n\t\t\tcase \"css\":\n\t\t\t\treturn createjs.Types.CSS;\n\t\t\tcase \"js\":\n\t\t\t\treturn createjs.Types.JAVASCRIPT;\n\t\t\tcase 'svg':\n\t\t\t\treturn createjs.Types.SVG;\n\t\t\tdefault:\n\t\t\t\treturn createjs.Types.TEXT;\n\t\t}\n\t};\n\n\tcreatejs.RequestUtils = s;\n\n}());\n\n//##############################################################################\n// AbstractLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n// constructor\n\t/**\n\t * The base loader, which defines all the generic methods, properties, and events. All loaders extend this class,\n\t * including the {{#crossLink \"LoadQueue\"}}{{/crossLink}}.\n\t * @class AbstractLoader\n\t * @param {LoadItem|object|string} loadItem The item to be loaded.\n\t * @param {Boolean} [preferXHR] Determines if the LoadItem should <em>try</em> and load using XHR, or take a\n\t * tag-based approach, which can be better in cross-domain situations. Not all loaders can load using one or the\n\t * other, so this is a suggested directive.\n\t * @param {String} [type] The type of loader. Loader types are defined as constants on the AbstractLoader class,\n\t * such as {{#crossLink \"IMAGE:property\"}}{{/crossLink}}, {{#crossLink \"CSS:property\"}}{{/crossLink}}, etc.\n\t * @extends EventDispatcher\n\t */\n\tfunction AbstractLoader(loadItem, preferXHR, type) {\n\t\tthis.EventDispatcher_constructor();\n\n\t\t// public properties\n\t\t/**\n\t\t * If the loader has completed loading. This provides a quick check, but also ensures that the different approaches\n\t\t * used for loading do not pile up resulting in more than one `complete` {{#crossLink \"Event\"}}{{/crossLink}}.\n\t\t * @property loaded\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.loaded = false;\n\n\t\t/**\n\t\t * Determine if the loader was canceled. Canceled loads will not fire complete events. Note that this property\n\t\t * is readonly, so {{#crossLink \"LoadQueue\"}}{{/crossLink}} queues should be closed using {{#crossLink \"LoadQueue/close\"}}{{/crossLink}}\n\t\t * instead.\n\t\t * @property canceled\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.canceled = false;\n\n\t\t/**\n\t\t * The current load progress (percentage) for this item. This will be a number between 0 and 1.\n\t\t *\n\t\t * <h4>Example</h4>\n\t\t *\n\t\t *     var queue = new createjs.LoadQueue();\n\t\t *     queue.loadFile(\"largeImage.png\");\n\t\t *     queue.on(\"progress\", function() {\n\t\t *         console.log(\"Progress:\", queue.progress, event.progress);\n\t\t *     });\n\t\t *\n\t\t * @property progress\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t */\n\t\tthis.progress = 0;\n\n\t\t/**\n\t\t * The type of item this loader will load. See {{#crossLink \"AbstractLoader\"}}{{/crossLink}} for a full list of\n\t\t * supported types.\n\t\t * @property type\n\t\t * @type {String}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * A formatter function that converts the loaded raw result into the final result. For example, the JSONLoader\n\t\t * converts a string of text into a JavaScript object. Not all loaders have a resultFormatter, and this property\n\t\t * can be overridden to provide custom formatting.\n\t\t *\n\t\t * Optionally, a resultFormatter can return a callback function in cases where the formatting needs to be\n\t\t * asynchronous, such as creating a new image. The callback function is passed 2 parameters, which are callbacks\n\t\t * to handle success and error conditions in the resultFormatter. Note that the resultFormatter method is\n\t\t * called in the current scope, as well as the success and error callbacks.\n\t\t *\n\t\t * <h4>Example asynchronous resultFormatter</h4>\n\t\t *\n\t\t * \tfunction _formatResult(loader) {\n\t\t * \t\treturn function(success, error) {\n\t\t * \t\t\tif (errorCondition) { error(errorDetailEvent); }\n\t\t * \t\t\tsuccess(result);\n\t\t * \t\t}\n\t\t * \t}\n\t\t * @property resultFormatter\n\t\t * @type {Function}\n\t\t * @default null\n\t\t */\n\t\tthis.resultFormatter = null;\n\n\t\t// protected properties\n\t\t/**\n\t\t * The {{#crossLink \"LoadItem\"}}{{/crossLink}} this loader represents. Note that this is null in a {{#crossLink \"LoadQueue\"}}{{/crossLink}},\n\t\t * but will be available on loaders such as {{#crossLink \"XMLLoader\"}}{{/crossLink}} and {{#crossLink \"ImageLoader\"}}{{/crossLink}}.\n\t\t * @property _item\n\t\t * @type {LoadItem|Object}\n\t\t * @private\n\t\t */\n\t\tif (loadItem) {\n\t\t\tthis._item = createjs.LoadItem.create(loadItem);\n\t\t} else {\n\t\t\tthis._item = null;\n\t\t}\n\n\t\t/**\n\t\t * Whether the loader will try and load content using XHR (true) or HTML tags (false).\n\t\t * @property _preferXHR\n\t\t * @type {Boolean}\n\t\t * @private\n\t\t */\n\t\tthis._preferXHR = preferXHR;\n\n\t\t/**\n\t\t * The loaded result after it is formatted by an optional {{#crossLink \"resultFormatter\"}}{{/crossLink}}. For\n\t\t * items that are not formatted, this will be the same as the {{#crossLink \"_rawResult:property\"}}{{/crossLink}}.\n\t\t * The result is accessed using the {{#crossLink \"getResult\"}}{{/crossLink}} method.\n\t\t * @property _result\n\t\t * @type {Object|String}\n\t\t * @private\n\t\t */\n\t\tthis._result = null;\n\n\t\t/**\n\t\t * The loaded result before it is formatted. The rawResult is accessed using the {{#crossLink \"getResult\"}}{{/crossLink}}\n\t\t * method, and passing `true`.\n\t\t * @property _rawResult\n\t\t * @type {Object|String}\n\t\t * @private\n\t\t */\n\t\tthis._rawResult = null;\n\n\t\t/**\n\t\t * A list of items that loaders load behind the scenes. This does not include the main item the loader is\n\t\t * responsible for loading. Examples of loaders that have sub-items include the {{#crossLink \"SpriteSheetLoader\"}}{{/crossLink}} and\n\t\t * {{#crossLink \"ManifestLoader\"}}{{/crossLink}}.\n\t\t * @property _loadItems\n\t\t * @type {null}\n\t\t * @protected\n\t\t */\n\t\tthis._loadedItems = null;\n\n\t\t/**\n\t\t * The attribute the items loaded using tags use for the source.\n\t\t * @type {string}\n\t\t * @default null\n\t\t * @private\n\t\t */\n\t\tthis._tagSrcAttribute = null;\n\n\t\t/**\n\t\t * An HTML tag (or similar) that a loader may use to load HTML content, such as images, scripts, etc.\n\t\t * @property _tag\n\t\t * @type {Object}\n\t\t * @private\n\t\t */\n\t\tthis._tag = null;\n\t};\n\n\tvar p = createjs.extend(AbstractLoader, createjs.EventDispatcher);\n\tvar s = AbstractLoader;\n\n\t// Remove these @deprecated properties after 1.0\n\ttry {\n\t\tObject.defineProperties(s, {\n\t\t\tPOST: { get: createjs.deprecate(function() { return createjs.Methods.POST; }, \"AbstractLoader.POST\") },\n\t\t\tGET: { get: createjs.deprecate(function() { return createjs.Methods.GET; }, \"AbstractLoader.GET\") },\n\n\t\t\tBINARY: { get: createjs.deprecate(function() { return createjs.Types.BINARY; }, \"AbstractLoader.BINARY\") },\n\t\t\tCSS: { get: createjs.deprecate(function() { return createjs.Types.CSS; }, \"AbstractLoader.CSS\") },\n\t\t\tFONT: { get: createjs.deprecate(function() { return createjs.Types.FONT; }, \"AbstractLoader.FONT\") },\n\t\t\tFONTCSS: { get: createjs.deprecate(function() { return createjs.Types.FONTCSS; }, \"AbstractLoader.FONTCSS\") },\n\t\t\tIMAGE: { get: createjs.deprecate(function() { return createjs.Types.IMAGE; }, \"AbstractLoader.IMAGE\") },\n\t\t\tJAVASCRIPT: { get: createjs.deprecate(function() { return createjs.Types.JAVASCRIPT; }, \"AbstractLoader.JAVASCRIPT\") },\n\t\t\tJSON: { get: createjs.deprecate(function() { return createjs.Types.JSON; }, \"AbstractLoader.JSON\") },\n\t\t\tJSONP: { get: createjs.deprecate(function() { return createjs.Types.JSONP; }, \"AbstractLoader.JSONP\") },\n\t\t\tMANIFEST: { get: createjs.deprecate(function() { return createjs.Types.MANIFEST; }, \"AbstractLoader.MANIFEST\") },\n\t\t\tSOUND: { get: createjs.deprecate(function() { return createjs.Types.SOUND; }, \"AbstractLoader.SOUND\") },\n\t\t\tVIDEO: { get: createjs.deprecate(function() { return createjs.Types.VIDEO; }, \"AbstractLoader.VIDEO\") },\n\t\t\tSPRITESHEET: { get: createjs.deprecate(function() { return createjs.Types.SPRITESHEET; }, \"AbstractLoader.SPRITESHEET\") },\n\t\t\tSVG: { get: createjs.deprecate(function() { return createjs.Types.SVG; }, \"AbstractLoader.SVG\") },\n\t\t\tTEXT: { get: createjs.deprecate(function() { return createjs.Types.TEXT; }, \"AbstractLoader.TEXT\") },\n\t\t\tXML: { get: createjs.deprecate(function() { return createjs.Types.XML; }, \"AbstractLoader.XML\") }\n\t\t});\n\t} catch (e) {}\n\n// Events\n\t/**\n\t * The {{#crossLink \"ProgressEvent\"}}{{/crossLink}} that is fired when the overall progress changes. Prior to\n\t * version 0.6.0, this was just a regular {{#crossLink \"Event\"}}{{/crossLink}}.\n\t * @event progress\n\t * @since 0.3.0\n\t */\n\n\t/**\n\t * The {{#crossLink \"Event\"}}{{/crossLink}} that is fired when a load starts.\n\t * @event loadstart\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type.\n\t * @since 0.3.1\n\t */\n\n\t/**\n\t * The {{#crossLink \"Event\"}}{{/crossLink}} that is fired when the entire queue has been loaded.\n\t * @event complete\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type.\n\t * @since 0.3.0\n\t */\n\n\t/**\n\t * The {{#crossLink \"ErrorEvent\"}}{{/crossLink}} that is fired when the loader encounters an error. If the error was\n\t * encountered by a file, the event will contain the item that caused the error. Prior to version 0.6.0, this was\n\t * just a regular {{#crossLink \"Event\"}}{{/crossLink}}.\n\t * @event error\n\t * @since 0.3.0\n\t */\n\n\t/**\n\t * The {{#crossLink \"Event\"}}{{/crossLink}} that is fired when the loader encounters an internal file load error.\n\t * This enables loaders to maintain internal queues, and surface file load errors.\n\t * @event fileerror\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type (\"fileerror\")\n\t * @param {LoadItem|object} The item that encountered the error\n\t * @since 0.6.0\n\t */\n\n\t/**\n\t * The {{#crossLink \"Event\"}}{{/crossLink}} that is fired when a loader internally loads a file. This enables\n\t * loaders such as {{#crossLink \"ManifestLoader\"}}{{/crossLink}} to maintain internal {{#crossLink \"LoadQueue\"}}{{/crossLink}}s\n\t * and notify when they have loaded a file. The {{#crossLink \"LoadQueue\"}}{{/crossLink}} class dispatches a\n\t * slightly different {{#crossLink \"LoadQueue/fileload:event\"}}{{/crossLink}} event.\n\t * @event fileload\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type (\"fileload\")\n\t * @param {Object} item The file item which was specified in the {{#crossLink \"LoadQueue/loadFile\"}}{{/crossLink}}\n\t * or {{#crossLink \"LoadQueue/loadManifest\"}}{{/crossLink}} call. If only a string path or tag was specified, the\n\t * object will contain that value as a `src` property.\n\t * @param {Object} result The HTML tag or parsed result of the loaded item.\n\t * @param {Object} rawResult The unprocessed result, usually the raw text or binary data before it is converted\n\t * to a usable object.\n\t * @since 0.6.0\n\t */\n\n\t/**\n\t * The {{#crossLink \"Event\"}}{{/crossLink}} that is fired after the internal request is created, but before a load.\n\t * This allows updates to the loader for specific loading needs, such as binary or XHR image loading.\n\t * @event initialize\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type (\"initialize\")\n\t * @param {AbstractLoader} loader The loader that has been initialized.\n\t */\n\n\n\t/**\n\t * Get a reference to the manifest item that is loaded by this loader. In some cases this will be the value that was\n\t * passed into {{#crossLink \"LoadQueue\"}}{{/crossLink}} using {{#crossLink \"LoadQueue/loadFile\"}}{{/crossLink}} or\n\t * {{#crossLink \"LoadQueue/loadManifest\"}}{{/crossLink}}. However if only a String path was passed in, then it will\n\t * be a {{#crossLink \"LoadItem\"}}{{/crossLink}}.\n\t * @method getItem\n\t * @return {Object} The manifest item that this loader is responsible for loading.\n\t * @since 0.6.0\n\t */\n\tp.getItem = function () {\n\t\treturn this._item;\n\t};\n\n\t/**\n\t * Get a reference to the content that was loaded by the loader (only available after the {{#crossLink \"complete:event\"}}{{/crossLink}}\n\t * event is dispatched.\n\t * @method getResult\n\t * @param {Boolean} [raw=false] Determines if the returned result will be the formatted content, or the raw loaded\n\t * data (if it exists).\n\t * @return {Object}\n\t * @since 0.6.0\n\t */\n\tp.getResult = function (raw) {\n\t\treturn raw ? this._rawResult : this._result;\n\t};\n\n\t/**\n\t * Return the `tag` this object creates or uses for loading.\n\t * @method getTag\n\t * @return {Object} The tag instance\n\t * @since 0.6.0\n\t */\n\tp.getTag = function () {\n\t\treturn this._tag;\n\t};\n\n\t/**\n\t * Set the `tag` this item uses for loading.\n\t * @method setTag\n\t * @param {Object} tag The tag instance\n\t * @since 0.6.0\n\t */\n\tp.setTag = function(tag) {\n\t  this._tag = tag;\n\t};\n\n\t/**\n\t * Begin loading the item. This method is required when using a loader by itself.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      var queue = new createjs.LoadQueue();\n\t *      queue.on(\"complete\", handleComplete);\n\t *      queue.loadManifest(fileArray, false); // Note the 2nd argument that tells the queue not to start loading yet\n\t *      queue.load();\n\t *\n\t * @method load\n\t */\n\tp.load = function () {\n\t\tthis._createRequest();\n\n\t\tthis._request.on(\"complete\", this, this);\n\t\tthis._request.on(\"progress\", this, this);\n\t\tthis._request.on(\"loadStart\", this, this);\n\t\tthis._request.on(\"abort\", this, this);\n\t\tthis._request.on(\"timeout\", this, this);\n\t\tthis._request.on(\"error\", this, this);\n\n\t\tvar evt = new createjs.Event(\"initialize\");\n\t\tevt.loader = this._request;\n\t\tthis.dispatchEvent(evt);\n\n\t\tthis._request.load();\n\t};\n\n\t/**\n\t * Close the the item. This will stop any open requests (although downloads using HTML tags may still continue in\n\t * the background), but events will not longer be dispatched.\n\t * @method cancel\n\t */\n\tp.cancel = function () {\n\t\tthis.canceled = true;\n\t\tthis.destroy();\n\t};\n\n\t/**\n\t * Clean up the loader.\n\t * @method destroy\n\t */\n\tp.destroy = function() {\n\t\tif (this._request) {\n\t\t\tthis._request.removeAllEventListeners();\n\t\t\tthis._request.destroy();\n\t\t}\n\n\t\tthis._request = null;\n\n\t\tthis._item = null;\n\t\tthis._rawResult = null;\n\t\tthis._result = null;\n\n\t\tthis._loadItems = null;\n\n\t\tthis.removeAllEventListeners();\n\t};\n\n\t/**\n\t * Get any items loaded internally by the loader. The enables loaders such as {{#crossLink \"ManifestLoader\"}}{{/crossLink}}\n\t * to expose items it loads internally.\n\t * @method getLoadedItems\n\t * @return {Array} A list of the items loaded by the loader.\n\t * @since 0.6.0\n\t */\n\tp.getLoadedItems = function () {\n\t\treturn this._loadedItems;\n\t};\n\n\n\t// Private methods\n\t/**\n\t * Create an internal request used for loading. By default, an {{#crossLink \"XHRRequest\"}}{{/crossLink}} or\n\t * {{#crossLink \"TagRequest\"}}{{/crossLink}} is created, depending on the value of {{#crossLink \"preferXHR:property\"}}{{/crossLink}}.\n\t * Other loaders may override this to use different request types, such as {{#crossLink \"ManifestLoader\"}}{{/crossLink}},\n\t * which uses {{#crossLink \"JSONLoader\"}}{{/crossLink}} or {{#crossLink \"JSONPLoader\"}}{{/crossLink}} under the hood.\n\t * @method _createRequest\n\t * @protected\n\t */\n\tp._createRequest = function() {\n\t\tif (!this._preferXHR) {\n\t\t\tthis._request = new createjs.TagRequest(this._item, this._tag || this._createTag(), this._tagSrcAttribute);\n\t\t} else {\n\t\t\tthis._request = new createjs.XHRRequest(this._item);\n\t\t}\n\t};\n\n\t/**\n\t * Create the HTML tag used for loading. This method does nothing by default, and needs to be implemented\n\t * by loaders that require tag loading.\n\t * @method _createTag\n\t * @param {String} src The tag source\n\t * @return {HTMLElement} The tag that was created\n\t * @protected\n\t */\n\tp._createTag = function(src) { return null; };\n\n\t/**\n\t * Dispatch a loadstart {{#crossLink \"Event\"}}{{/crossLink}}. Please see the {{#crossLink \"AbstractLoader/loadstart:event\"}}{{/crossLink}}\n\t * event for details on the event payload.\n\t * @method _sendLoadStart\n\t * @protected\n\t */\n\tp._sendLoadStart = function () {\n\t\tif (this._isCanceled()) { return; }\n\t\tthis.dispatchEvent(\"loadstart\");\n\t};\n\n\t/**\n\t * Dispatch a {{#crossLink \"ProgressEvent\"}}{{/crossLink}}.\n\t * @method _sendProgress\n\t * @param {Number | Object} value The progress of the loaded item, or an object containing <code>loaded</code>\n\t * and <code>total</code> properties.\n\t * @protected\n\t */\n\tp._sendProgress = function (value) {\n\t\tif (this._isCanceled()) { return; }\n\t\tvar event = null;\n\t\tif (typeof(value) == \"number\") {\n\t\t\tthis.progress = value;\n\t\t\tevent = new createjs.ProgressEvent(this.progress);\n\t\t} else {\n\t\t\tevent = value;\n\t\t\tthis.progress = value.loaded / value.total;\n\t\t\tevent.progress = this.progress;\n\t\t\tif (isNaN(this.progress) || this.progress == Infinity) { this.progress = 0; }\n\t\t}\n\t\tthis.hasEventListener(\"progress\") && this.dispatchEvent(event);\n\t};\n\n\t/**\n\t * Dispatch a complete {{#crossLink \"Event\"}}{{/crossLink}}. Please see the {{#crossLink \"AbstractLoader/complete:event\"}}{{/crossLink}} event\n\t * @method _sendComplete\n\t * @protected\n\t */\n\tp._sendComplete = function () {\n\t\tif (this._isCanceled()) { return; }\n\n\t\tthis.loaded = true;\n\n\t\tvar event = new createjs.Event(\"complete\");\n\t\tevent.rawResult = this._rawResult;\n\n\t\tif (this._result != null) {\n\t\t\tevent.result = this._result;\n\t\t}\n\n\t\tthis.dispatchEvent(event);\n\t};\n\n\t/**\n\t * Dispatch an error {{#crossLink \"Event\"}}{{/crossLink}}. Please see the {{#crossLink \"AbstractLoader/error:event\"}}{{/crossLink}}\n\t * event for details on the event payload.\n\t * @method _sendError\n\t * @param {ErrorEvent} event The event object containing specific error properties.\n\t * @protected\n\t */\n\tp._sendError = function (event) {\n\t\tif (this._isCanceled() || !this.hasEventListener(\"error\")) { return; }\n\t\tif (event == null) {\n\t\t\tevent = new createjs.ErrorEvent(\"PRELOAD_ERROR_EMPTY\"); // TODO: Populate error\n\t\t}\n\t\tthis.dispatchEvent(event);\n\t};\n\n\t/**\n\t * Determine if the load has been canceled. This is important to ensure that method calls or asynchronous events\n\t * do not cause issues after the queue has been cleaned up.\n\t * @method _isCanceled\n\t * @return {Boolean} If the loader has been canceled.\n\t * @protected\n\t */\n\tp._isCanceled = function () {\n\t\tif (window.createjs == null || this.canceled) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\t/**\n\t * A custom result formatter function, which is called just before a request dispatches its complete event. Most\n\t * loader types already have an internal formatter, but this can be user-overridden for custom formatting. The\n\t * formatted result will be available on Loaders using {{#crossLink \"getResult\"}}{{/crossLink}}, and passing `true`.\n\t * @property resultFormatter\n\t * @type Function\n\t * @return {Object} The formatted result\n\t * @since 0.6.0\n\t */\n\tp.resultFormatter = null;\n\n\t/**\n\t * Handle events from internal requests. By default, loaders will handle, and redispatch the necessary events, but\n\t * this method can be overridden for custom behaviours.\n\t * @method handleEvent\n\t * @param {Event} event The event that the internal request dispatches.\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp.handleEvent = function (event) {\n\t\tswitch (event.type) {\n\t\t\tcase \"complete\":\n\t\t\t\tthis._rawResult = event.target._response;\n\t\t\t\tvar result = this.resultFormatter && this.resultFormatter(this);\n\t\t\t\t// The resultFormatter is asynchronous\n\t\t\t\tif (result instanceof Function) {\n\t\t\t\t\tresult.call(this,\n\t\t\t\t\t\t\tcreatejs.proxy(this._resultFormatSuccess, this),\n\t\t\t\t\t\t\tcreatejs.proxy(this._resultFormatFailed, this)\n\t\t\t\t\t);\n\t\t\t\t// The result formatter is synchronous\n\t\t\t\t} else {\n\t\t\t\t\tthis._result =  result || this._rawResult;\n\t\t\t\t\tthis._sendComplete();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"progress\":\n\t\t\t\tthis._sendProgress(event);\n\t\t\t\tbreak;\n\t\t\tcase \"error\":\n\t\t\t\tthis._sendError(event);\n\t\t\t\tbreak;\n\t\t\tcase \"loadstart\":\n\t\t\t\tthis._sendLoadStart();\n\t\t\t\tbreak;\n\t\t\tcase \"abort\":\n\t\t\tcase \"timeout\":\n\t\t\t\tif (!this._isCanceled()) {\n\t\t\t\t\tthis.dispatchEvent(new createjs.ErrorEvent(\"PRELOAD_\" + event.type.toUpperCase() + \"_ERROR\"));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\t/**\n\t * The \"success\" callback passed to {{#crossLink \"AbstractLoader/resultFormatter\"}}{{/crossLink}} asynchronous\n\t * functions.\n\t * @method _resultFormatSuccess\n\t * @param {Object} result The formatted result\n\t * @private\n\t */\n\tp._resultFormatSuccess = function (result) {\n\t\tthis._result = result;\n\t\tthis._sendComplete();\n\t};\n\n\t/**\n\t * The \"error\" callback passed to {{#crossLink \"AbstractLoader/resultFormatter\"}}{{/crossLink}} asynchronous\n\t * functions.\n\t * @method _resultFormatSuccess\n\t * @param {Object} error The error event\n\t * @private\n\t */\n\tp._resultFormatFailed = function (event) {\n\t\tthis._sendError(event);\n\t};\n\n\t/**\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t */\n\tp.toString = function () {\n\t\treturn \"[PreloadJS AbstractLoader]\";\n\t};\n\n\tcreatejs.AbstractLoader = createjs.promote(AbstractLoader, \"EventDispatcher\");\n\n}());\n\n//##############################################################################\n// AbstractMediaLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * The AbstractMediaLoader is a base class that handles some of the shared methods and properties of loaders that\n\t * handle HTML media elements, such as Video and Audio.\n\t * @class AbstractMediaLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @param {Boolean} preferXHR\n\t * @param {String} type The type of media to load. Usually \"video\" or \"audio\".\n\t * @extends AbstractLoader\n\t * @constructor\n\t */\n\tfunction AbstractMediaLoader(loadItem, preferXHR, type) {\n\t\tthis.AbstractLoader_constructor(loadItem, preferXHR, type);\n\n\t\t// public properties\n\t\tthis.resultFormatter = this._formatResult;\n\n\t\t// protected properties\n\t\tthis._tagSrcAttribute = \"src\";\n\n        this.on(\"initialize\", this._updateXHR, this);\n\t};\n\n\tvar p = createjs.extend(AbstractMediaLoader, createjs.AbstractLoader);\n\n\t// static properties\n\t// public methods\n\tp.load = function () {\n\t\t// TagRequest will handle most of this, but Sound / Video need a few custom properties, so just handle them here.\n\t\tif (!this._tag) {\n\t\t\tthis._tag = this._createTag(this._item.src);\n\t\t}\n\n\t\tthis._tag.preload = \"auto\";\n\t\tthis._tag.load();\n\n\t\tthis.AbstractLoader_load();\n\t};\n\n\t// protected methods\n\t/**\n\t * Creates a new tag for loading if it doesn't exist yet.\n\t * @method _createTag\n\t * @private\n\t */\n\tp._createTag = function () {};\n\n\n\tp._createRequest = function() {\n\t\tif (!this._preferXHR) {\n\t\t\tthis._request = new createjs.MediaTagRequest(this._item, this._tag || this._createTag(), this._tagSrcAttribute);\n\t\t} else {\n\t\t\tthis._request = new createjs.XHRRequest(this._item);\n\t\t}\n\t};\n\n    // protected methods\n    /**\n     * Before the item loads, set its mimeType and responseType.\n     * @property _updateXHR\n     * @param {Event} event\n     * @private\n     */\n    p._updateXHR = function (event) {\n        // Only exists for XHR\n        if (event.loader.setResponseType) {\n            event.loader.setResponseType(\"blob\");\n        }\n    };\n\n\t/**\n\t * The result formatter for media files.\n\t * @method _formatResult\n\t * @param {AbstractLoader} loader\n\t * @returns {HTMLVideoElement|HTMLAudioElement}\n\t * @private\n\t */\n\tp._formatResult = function (loader) {\n\t\tthis._tag.removeEventListener && this._tag.removeEventListener(\"canplaythrough\", this._loadedHandler);\n\t\tthis._tag.onstalled = null;\n\t\tif (this._preferXHR) {\n            var URL = window.URL || window.webkitURL;\n            var result = loader.getResult(true);\n\n\t\t\tloader.getTag().src = URL.createObjectURL(result);\n\t\t}\n\t\treturn loader.getTag();\n\t};\n\n\tcreatejs.AbstractMediaLoader = createjs.promote(AbstractMediaLoader, \"AbstractLoader\");\n\n}());\n\n//##############################################################################\n// AbstractRequest.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t/**\n\t * A base class for actual data requests, such as {{#crossLink \"XHRRequest\"}}{{/crossLink}}, {{#crossLink \"TagRequest\"}}{{/crossLink}},\n\t * and {{#crossLink \"MediaRequest\"}}{{/crossLink}}. PreloadJS loaders will typically use a data loader under the\n\t * hood to get data.\n\t * @class AbstractRequest\n\t * @param {LoadItem} item\n\t * @constructor\n\t */\n\tvar AbstractRequest = function (item) {\n\t\tthis._item = item;\n\t};\n\n\tvar p = createjs.extend(AbstractRequest, createjs.EventDispatcher);\n\n\t// public methods\n\t/**\n\t * Begin a load.\n\t * @method load\n\t */\n\tp.load =  function() {};\n\n\t/**\n\t * Clean up a request.\n\t * @method destroy\n\t */\n\tp.destroy = function() {};\n\n\t/**\n\t * Cancel an in-progress request.\n\t * @method cancel\n\t */\n\tp.cancel = function() {};\n\n\tcreatejs.AbstractRequest = createjs.promote(AbstractRequest, \"EventDispatcher\");\n\n}());\n\n//##############################################################################\n// TagRequest.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * An {{#crossLink \"AbstractRequest\"}}{{/crossLink}} that loads HTML tags, such as images and scripts.\n\t * @class TagRequest\n\t * @param {LoadItem} loadItem\n\t * @param {HTMLElement} tag\n\t * @param {String} srcAttribute The tag attribute that specifies the source, such as \"src\", \"href\", etc.\n\t */\n\tfunction TagRequest(loadItem, tag, srcAttribute) {\n\t\tthis.AbstractRequest_constructor(loadItem);\n\n\t\t// protected properties\n\t\t/**\n\t\t * The HTML tag instance that is used to load.\n\t\t * @property _tag\n\t\t * @type {HTMLElement}\n\t\t * @protected\n\t\t */\n\t\tthis._tag = tag;\n\n\t\t/**\n\t\t * The tag attribute that specifies the source, such as \"src\", \"href\", etc.\n\t\t * @property _tagSrcAttribute\n\t\t * @type {String}\n\t\t * @protected\n\t\t */\n\t\tthis._tagSrcAttribute = srcAttribute;\n\n\t\t/**\n\t\t * A method closure used for handling the tag load event.\n\t\t * @property _loadedHandler\n\t\t * @type {Function}\n\t\t * @private\n\t\t */\n\t\tthis._loadedHandler = createjs.proxy(this._handleTagComplete, this);\n\n\t\t/**\n\t\t * Determines if the element was added to the DOM automatically by PreloadJS, so it can be cleaned up after.\n\t\t * @property _addedToDOM\n\t\t * @type {Boolean}\n\t\t * @private\n\t\t */\n\t\tthis._addedToDOM = false;\n\n\t};\n\n\tvar p = createjs.extend(TagRequest, createjs.AbstractRequest);\n\n\t// public methods\n\tp.load = function () {\n\t\tthis._tag.onload = createjs.proxy(this._handleTagComplete, this);\n\t\tthis._tag.onreadystatechange = createjs.proxy(this._handleReadyStateChange, this);\n\t\tthis._tag.onerror = createjs.proxy(this._handleError, this);\n\n\t\tvar evt = new createjs.Event(\"initialize\");\n\t\tevt.loader = this._tag;\n\n\t\tthis.dispatchEvent(evt);\n\n\t\tthis._loadTimeout = setTimeout(createjs.proxy(this._handleTimeout, this), this._item.loadTimeout);\n\n\t\tthis._tag[this._tagSrcAttribute] = this._item.src;\n\n\t\t// wdg:: Append the tag AFTER setting the src, or SVG loading on iOS will fail.\n\t\tif (this._tag.parentNode == null) {\n\t\t\tcreatejs.DomUtils.appendToBody(this._tag);\n\t\t\tthis._addedToDOM = true;\n\t\t}\n\t};\n\n\tp.destroy = function() {\n\t\tthis._clean();\n\t\tthis._tag = null;\n\n\t\tthis.AbstractRequest_destroy();\n\t};\n\n\t// private methods\n\t/**\n\t * Handle the readyStateChange event from a tag. We need this in place of the `onload` callback (mainly SCRIPT\n\t * and LINK tags), but other cases may exist.\n\t * @method _handleReadyStateChange\n\t * @private\n\t */\n\tp._handleReadyStateChange = function () {\n\t\tclearTimeout(this._loadTimeout);\n\t\t// This is strictly for tags in browsers that do not support onload.\n\t\tvar tag = this._tag;\n\n\t\t// Complete is for old IE support.\n\t\tif (tag.readyState == \"loaded\" || tag.readyState == \"complete\") {\n\t\t\tthis._handleTagComplete();\n\t\t}\n\t};\n\n\t/**\n\t * Handle any error events from the tag.\n\t * @method _handleError\n\t * @protected\n\t */\n\tp._handleError = function() {\n\t\tthis._clean();\n\t\tthis.dispatchEvent(\"error\");\n\t};\n\n\t/**\n\t * Handle the tag's onload callback.\n\t * @method _handleTagComplete\n\t * @private\n\t */\n\tp._handleTagComplete = function () {\n\t\tthis._rawResult = this._tag;\n\t\tthis._result = this.resultFormatter && this.resultFormatter(this) || this._rawResult;\n\n\t\tthis._clean();\n\n\t\tthis.dispatchEvent(\"complete\");\n\t};\n\n\t/**\n\t * The tag request has not loaded within the time specified in loadTimeout.\n\t * @method _handleError\n\t * @param {Object} event The XHR error event.\n\t * @private\n\t */\n\tp._handleTimeout = function () {\n\t\tthis._clean();\n\t\tthis.dispatchEvent(new createjs.Event(\"timeout\"));\n\t};\n\n\t/**\n\t * Remove event listeners, but don't destroy the request object\n\t * @method _clean\n\t * @private\n\t */\n\tp._clean = function() {\n\t\tthis._tag.onload = null;\n\t\tthis._tag.onreadystatechange = null;\n\t\tthis._tag.onerror = null;\n\t\tif (this._addedToDOM && this._tag.parentNode != null) {\n\t\t\tthis._tag.parentNode.removeChild(this._tag);\n\t\t}\n\t\tclearTimeout(this._loadTimeout);\n\t};\n\n\t/**\n\t * Handle a stalled audio event. The main place this happens is with HTMLAudio in Chrome when playing back audio\n\t * that is already in a load, but not complete.\n\t * @method _handleStalled\n\t * @private\n\t */\n\tp._handleStalled = function () {\n\t\t//Ignore, let the timeout take care of it. Sometimes its not really stopped.\n\t};\n\n\tcreatejs.TagRequest = createjs.promote(TagRequest, \"AbstractRequest\");\n\n}());\n\n//##############################################################################\n// MediaTagRequest.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * An {{#crossLink \"TagRequest\"}}{{/crossLink}} that loads HTML tags for video and audio.\n\t * @class MediaTagRequest\n\t * @param {LoadItem} loadItem\n\t * @param {HTMLAudioElement|HTMLVideoElement} tag\n\t * @param {String} srcAttribute The tag attribute that specifies the source, such as \"src\", \"href\", etc.\n\t * @constructor\n\t */\n\tfunction MediaTagRequest(loadItem, tag, srcAttribute) {\n\t\tthis.AbstractRequest_constructor(loadItem);\n\n\t\t// protected properties\n\t\tthis._tag = tag;\n\t\tthis._tagSrcAttribute = srcAttribute;\n\t\tthis._loadedHandler = createjs.proxy(this._handleTagComplete, this);\n\t};\n\n\tvar p = createjs.extend(MediaTagRequest, createjs.TagRequest);\n\tvar s = MediaTagRequest;\n\n\t// public methods\n\tp.load = function () {\n\t\tvar sc = createjs.proxy(this._handleStalled, this);\n\t\tthis._stalledCallback = sc;\n\n\t\tvar pc = createjs.proxy(this._handleProgress, this);\n\t\tthis._handleProgress = pc;\n\n\t\tthis._tag.addEventListener(\"stalled\", sc);\n\t\tthis._tag.addEventListener(\"progress\", pc);\n\n\t\t// This will tell us when audio is buffered enough to play through, but not when its loaded.\n\t\t// The tag doesn't keep loading in Chrome once enough has buffered, and we have decided that behaviour is sufficient.\n\t\tthis._tag.addEventListener && this._tag.addEventListener(\"canplaythrough\", this._loadedHandler, false); // canplaythrough callback doesn't work in Chrome, so we use an event.\n\n\t\tthis.TagRequest_load();\n\t};\n\n\t// private methods\n\tp._handleReadyStateChange = function () {\n\t\tclearTimeout(this._loadTimeout);\n\t\t// This is strictly for tags in browsers that do not support onload.\n\t\tvar tag = this._tag;\n\n\t\t// Complete is for old IE support.\n\t\tif (tag.readyState == \"loaded\" || tag.readyState == \"complete\") {\n\t\t\tthis._handleTagComplete();\n\t\t}\n\t};\n\n\tp._handleStalled = function () {\n\t\t//Ignore, let the timeout take care of it. Sometimes its not really stopped.\n\t};\n\n\t/**\n\t * An XHR request has reported progress.\n\t * @method _handleProgress\n\t * @param {Object} event The XHR progress event.\n\t * @private\n\t */\n\tp._handleProgress = function (event) {\n\t\tif (!event || event.loaded > 0 && event.total == 0) {\n\t\t\treturn; // Sometimes we get no \"total\", so just ignore the progress event.\n\t\t}\n\n\t\tvar newEvent = new createjs.ProgressEvent(event.loaded, event.total);\n\t\tthis.dispatchEvent(newEvent);\n\t};\n\n\t// protected methods\n\tp._clean = function () {\n\t\tthis._tag.removeEventListener && this._tag.removeEventListener(\"canplaythrough\", this._loadedHandler);\n\t\tthis._tag.removeEventListener(\"stalled\", this._stalledCallback);\n\t\tthis._tag.removeEventListener(\"progress\", this._progressCallback);\n\n\t\tthis.TagRequest__clean();\n\t};\n\n\tcreatejs.MediaTagRequest = createjs.promote(MediaTagRequest, \"TagRequest\");\n\n}());\n\n//##############################################################################\n// XHRRequest.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n// constructor\n\t/**\n\t * A preloader that loads items using XHR requests, usually XMLHttpRequest. However XDomainRequests will be used\n\t * for cross-domain requests if possible, and older versions of IE fall back on to ActiveX objects when necessary.\n\t * XHR requests load the content as text or binary data, provide progress and consistent completion events, and\n\t * can be canceled during load. Note that XHR is not supported in IE 6 or earlier, and is not recommended for\n\t * cross-domain loading.\n\t * @class XHRRequest\n\t * @constructor\n\t * @param {Object} item The object that defines the file to load. Please see the {{#crossLink \"LoadQueue/loadFile\"}}{{/crossLink}}\n\t * for an overview of supported file properties.\n\t * @extends AbstractLoader\n\t */\n\tfunction XHRRequest (item) {\n\t\tthis.AbstractRequest_constructor(item);\n\n\t\t// protected properties\n\t\t/**\n\t\t * A reference to the XHR request used to load the content.\n\t\t * @property _request\n\t\t * @type {XMLHttpRequest | XDomainRequest | ActiveX.XMLHTTP}\n\t\t * @private\n\t\t */\n\t\tthis._request = null;\n\n\t\t/**\n\t\t * A manual load timeout that is used for browsers that do not support the onTimeout event on XHR (XHR level 1,\n\t\t * typically IE9).\n\t\t * @property _loadTimeout\n\t\t * @type {Number}\n\t\t * @private\n\t\t */\n\t\tthis._loadTimeout = null;\n\n\t\t/**\n\t\t * The browser's XHR (XMLHTTPRequest) version. Supported versions are 1 and 2. There is no official way to detect\n\t\t * the version, so we use capabilities to make a best guess.\n\t\t * @property _xhrLevel\n\t\t * @type {Number}\n\t\t * @default 1\n\t\t * @private\n\t\t */\n\t\tthis._xhrLevel = 1;\n\n\t\t/**\n\t\t * The response of a loaded file. This is set because it is expensive to look up constantly. This property will be\n\t\t * null until the file is loaded.\n\t\t * @property _response\n\t\t * @type {mixed}\n\t\t * @private\n\t\t */\n\t\tthis._response = null;\n\n\t\t/**\n\t\t * The response of the loaded file before it is modified. In most cases, content is converted from raw text to\n\t\t * an HTML tag or a formatted object which is set to the <code>result</code> property, but the developer may still\n\t\t * want to access the raw content as it was loaded.\n\t\t * @property _rawResponse\n\t\t * @type {String|Object}\n\t\t * @private\n\t\t */\n\t\tthis._rawResponse = null;\n\n\t\tthis._canceled = false;\n\n\t\t// Setup our event handlers now.\n\t\tthis._handleLoadStartProxy = createjs.proxy(this._handleLoadStart, this);\n\t\tthis._handleProgressProxy = createjs.proxy(this._handleProgress, this);\n\t\tthis._handleAbortProxy = createjs.proxy(this._handleAbort, this);\n\t\tthis._handleErrorProxy = createjs.proxy(this._handleError, this);\n\t\tthis._handleTimeoutProxy = createjs.proxy(this._handleTimeout, this);\n\t\tthis._handleLoadProxy = createjs.proxy(this._handleLoad, this);\n\t\tthis._handleReadyStateChangeProxy = createjs.proxy(this._handleReadyStateChange, this);\n\n\t\tif (!this._createXHR(item)) {\n\t\t\t//TODO: Throw error?\n\t\t}\n\t};\n\n\tvar p = createjs.extend(XHRRequest, createjs.AbstractRequest);\n\n// static properties\n\t/**\n\t * A list of XMLHTTP object IDs to try when building an ActiveX object for XHR requests in earlier versions of IE.\n\t * @property ACTIVEX_VERSIONS\n\t * @type {Array}\n\t * @since 0.4.2\n\t * @private\n\t */\n\tXHRRequest.ACTIVEX_VERSIONS = [\n\t\t\"Msxml2.XMLHTTP.6.0\",\n\t\t\"Msxml2.XMLHTTP.5.0\",\n\t\t\"Msxml2.XMLHTTP.4.0\",\n\t\t\"MSXML2.XMLHTTP.3.0\",\n\t\t\"MSXML2.XMLHTTP\",\n\t\t\"Microsoft.XMLHTTP\"\n\t];\n\n// Public methods\n\t/**\n\t * Look up the loaded result.\n\t * @method getResult\n\t * @param {Boolean} [raw=false] Return a raw result instead of a formatted result. This applies to content\n\t * loaded via XHR such as scripts, XML, CSS, and Images. If there is no raw result, the formatted result will be\n\t * returned instead.\n\t * @return {Object} A result object containing the content that was loaded, such as:\n\t * <ul>\n\t *      <li>An image tag (&lt;image /&gt;) for images</li>\n\t *      <li>A script tag for JavaScript (&lt;script /&gt;). Note that scripts loaded with tags may be added to the\n\t *      HTML head.</li>\n\t *      <li>A style tag for CSS (&lt;style /&gt;)</li>\n\t *      <li>Raw text for TEXT</li>\n\t *      <li>A formatted JavaScript object defined by JSON</li>\n\t *      <li>An XML document</li>\n\t *      <li>An binary arraybuffer loaded by XHR</li>\n\t * </ul>\n\t * Note that if a raw result is requested, but not found, the result will be returned instead.\n\t */\n\tp.getResult = function (raw) {\n\t\tif (raw && this._rawResponse) {\n\t\t\treturn this._rawResponse;\n\t\t}\n\t\treturn this._response;\n\t};\n\n\t// Overrides abstract method in AbstractRequest\n\tp.cancel = function () {\n\t\tthis.canceled = true;\n\t\tthis._clean();\n\t\tthis._request.abort();\n\t};\n\n\t// Overrides abstract method in AbstractLoader\n\tp.load = function () {\n\t\tif (this._request == null) {\n\t\t\tthis._handleError();\n\t\t\treturn;\n\t\t}\n\n\t\t//Events\n\t\tif (this._request.addEventListener != null) {\n\t\t\tthis._request.addEventListener(\"loadstart\", this._handleLoadStartProxy, false);\n\t\t\tthis._request.addEventListener(\"progress\", this._handleProgressProxy, false);\n\t\t\tthis._request.addEventListener(\"abort\", this._handleAbortProxy, false);\n\t\t\tthis._request.addEventListener(\"error\", this._handleErrorProxy, false);\n\t\t\tthis._request.addEventListener(\"timeout\", this._handleTimeoutProxy, false);\n\n\t\t\t// Note: We don't get onload in all browsers (earlier FF and IE). onReadyStateChange handles these.\n\t\t\tthis._request.addEventListener(\"load\", this._handleLoadProxy, false);\n\t\t\tthis._request.addEventListener(\"readystatechange\", this._handleReadyStateChangeProxy, false);\n\t\t} else {\n\t\t\t// IE9 support\n\t\t\tthis._request.onloadstart = this._handleLoadStartProxy;\n\t\t\tthis._request.onprogress = this._handleProgressProxy;\n\t\t\tthis._request.onabort = this._handleAbortProxy;\n\t\t\tthis._request.onerror = this._handleErrorProxy;\n\t\t\tthis._request.ontimeout = this._handleTimeoutProxy;\n\n\t\t\t// Note: We don't get onload in all browsers (earlier FF and IE). onReadyStateChange handles these.\n\t\t\tthis._request.onload = this._handleLoadProxy;\n\t\t\tthis._request.onreadystatechange = this._handleReadyStateChangeProxy;\n\t\t}\n\n\t\t// Set up a timeout if we don't have XHR2\n\t\tif (this._xhrLevel == 1) {\n\t\t\tthis._loadTimeout = setTimeout(createjs.proxy(this._handleTimeout, this), this._item.loadTimeout);\n\t\t}\n\n\t\t// Sometimes we get back 404s immediately, particularly when there is a cross origin request.  // note this does not catch in Chrome\n\t\ttry {\n\t\t\tif (!this._item.values) {\n\t\t\t\tthis._request.send();\n\t\t\t} else {\n\t\t\t\tthis._request.send(createjs.URLUtils.formatQueryString(this._item.values));\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.dispatchEvent(new createjs.ErrorEvent(\"XHR_SEND\", null, error));\n\t\t}\n\t};\n\n\tp.setResponseType = function (type) {\n\t\t// Some old browsers doesn't support blob, so we convert arraybuffer to blob after response is downloaded\n\t\tif (type === 'blob') {\n\t\t\ttype = window.URL ? 'blob' : 'arraybuffer';\n\t\t\tthis._responseType = type;\n\t\t}\n\t\tthis._request.responseType = type;\n\t};\n\n\t/**\n\t * Get all the response headers from the XmlHttpRequest.\n\t *\n\t * <strong>From the docs:</strong> Return all the HTTP headers, excluding headers that are a case-insensitive match\n\t * for Set-Cookie or Set-Cookie2, as a single string, with each header line separated by a U+000D CR U+000A LF pair,\n\t * excluding the status line, and with each header name and header value separated by a U+003A COLON U+0020 SPACE\n\t * pair.\n\t * @method getAllResponseHeaders\n\t * @return {String}\n\t * @since 0.4.1\n\t */\n\tp.getAllResponseHeaders = function () {\n\t\tif (this._request.getAllResponseHeaders instanceof Function) {\n\t\t\treturn this._request.getAllResponseHeaders();\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t};\n\n\t/**\n\t * Get a specific response header from the XmlHttpRequest.\n\t *\n\t * <strong>From the docs:</strong> Returns the header field value from the response of which the field name matches\n\t * header, unless the field name is Set-Cookie or Set-Cookie2.\n\t * @method getResponseHeader\n\t * @param {String} header The header name to retrieve.\n\t * @return {String}\n\t * @since 0.4.1\n\t */\n\tp.getResponseHeader = function (header) {\n\t\tif (this._request.getResponseHeader instanceof Function) {\n\t\t\treturn this._request.getResponseHeader(header);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t};\n\n// protected methods\n\t/**\n\t * The XHR request has reported progress.\n\t * @method _handleProgress\n\t * @param {Object} event The XHR progress event.\n\t * @private\n\t */\n\tp._handleProgress = function (event) {\n\t\tif (!event || event.loaded > 0 && event.total == 0) {\n\t\t\treturn; // Sometimes we get no \"total\", so just ignore the progress event.\n\t\t}\n\n\t\tvar newEvent = new createjs.ProgressEvent(event.loaded, event.total);\n\t\tthis.dispatchEvent(newEvent);\n\t};\n\n\t/**\n\t * The XHR request has reported a load start.\n\t * @method _handleLoadStart\n\t * @param {Object} event The XHR loadStart event.\n\t * @private\n\t */\n\tp._handleLoadStart = function (event) {\n\t\tclearTimeout(this._loadTimeout);\n\t\tthis.dispatchEvent(\"loadstart\");\n\t};\n\n\t/**\n\t * The XHR request has reported an abort event.\n\t * @method handleAbort\n\t * @param {Object} event The XHR abort event.\n\t * @private\n\t */\n\tp._handleAbort = function (event) {\n\t\tthis._clean();\n\t\tthis.dispatchEvent(new createjs.ErrorEvent(\"XHR_ABORTED\", null, event));\n\t};\n\n\t/**\n\t * The XHR request has reported an error event.\n\t * @method _handleError\n\t * @param {Object} event The XHR error event.\n\t * @private\n\t */\n\tp._handleError = function (event) {\n\t\tthis._clean();\n\t\tthis.dispatchEvent(new createjs.ErrorEvent(event.message));\n\t};\n\n\t/**\n\t * The XHR request has reported a readyState change. Note that older browsers (IE 7 & 8) do not provide an onload\n\t * event, so we must monitor the readyStateChange to determine if the file is loaded.\n\t * @method _handleReadyStateChange\n\t * @param {Object} event The XHR readyStateChange event.\n\t * @private\n\t */\n\tp._handleReadyStateChange = function (event) {\n\t\tif (this._request.readyState == 4) {\n\t\t\tthis._handleLoad();\n\t\t}\n\t};\n\n\t/**\n\t * The XHR request has completed. This is called by the XHR request directly, or by a readyStateChange that has\n\t * <code>request.readyState == 4</code>. Only the first call to this method will be processed.\n\t *\n\t * Note that This method uses {{#crossLink \"_checkError\"}}{{/crossLink}} to determine if the server has returned an\n\t * error code.\n\t * @method _handleLoad\n\t * @param {Object} event The XHR load event.\n\t * @private\n\t */\n\tp._handleLoad = function (event) {\n\t\tif (this.loaded) {\n\t\t\treturn;\n\t\t}\n\t\tthis.loaded = true;\n\n\t\tvar error = this._checkError();\n\t\tif (error) {\n\t\t\tthis._handleError(error);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._response = this._getResponse();\n\t\t// Convert arraybuffer back to blob\n\t\tif (this._responseType === 'arraybuffer') {\n\t\t\ttry {\n\t\t\t\tthis._response = new Blob([this._response]);\n\t\t\t} catch (e) {\n\t\t\t\t// Fallback to use BlobBuilder if Blob constructor is not supported\n\t\t\t\t// Tested on Android 2.3 ~ 4.2 and iOS5 safari\n\t\t\t\twindow.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n\t\t\t\tif (e.name === 'TypeError' && window.BlobBuilder) {\n\t\t\t\t\tvar builder = new BlobBuilder();\n\t\t\t\t\tbuilder.append(this._response);\n\t\t\t\t\tthis._response = builder.getBlob();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis._clean();\n\n\t\tthis.dispatchEvent(new createjs.Event(\"complete\"));\n\t};\n\n\t/**\n\t * The XHR request has timed out. This is called by the XHR request directly, or via a <code>setTimeout</code>\n\t * callback.\n\t * @method _handleTimeout\n\t * @param {Object} [event] The XHR timeout event. This is occasionally null when called by the backup setTimeout.\n\t * @private\n\t */\n\tp._handleTimeout = function (event) {\n\t\tthis._clean();\n\t\tthis.dispatchEvent(new createjs.ErrorEvent(\"PRELOAD_TIMEOUT\", null, event));\n\t};\n\n// Protected\n\t/**\n\t * Determine if there is an error in the current load.\n\t * Currently this checks the status of the request for problem codes, and not actual response content:\n\t * <ul>\n\t *     <li>Status codes between 400 and 599 (HTTP error range)</li>\n\t *     <li>A status of 0, but *only when the application is running on a server*. If the application is running\n\t *     on `file:`, then it may incorrectly treat an error on local (or embedded applications) as a successful\n\t *     load.</li>\n\t * </ul>\n\t * @method _checkError\n\t * @return {Error} An error with the status code in the `message` argument.\n\t * @private\n\t */\n\tp._checkError = function () {\n\t\tvar status = parseInt(this._request.status);\n\t\tif (status >= 400 && status <= 599) {\n\t\t\treturn new Error(status);\n\t\t} else if (status == 0) {\n\t\t\tif ((/^https?:/).test(location.protocol)) { return new Error(0); }\n\t\t\treturn null; // Likely an embedded app.\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t};\n\n\n\t/**\n\t * Validate the response. Different browsers have different approaches, some of which throw errors when accessed\n\t * in other browsers. If there is no response, the <code>_response</code> property will remain null.\n\t * @method _getResponse\n\t * @private\n\t */\n\tp._getResponse = function () {\n\t\tif (this._response != null) {\n\t\t\treturn this._response;\n\t\t}\n\n\t\tif (this._request.response != null) {\n\t\t\treturn this._request.response;\n\t\t}\n\n\t\t// Android 2.2 uses .responseText\n\t\ttry {\n\t\t\tif (this._request.responseText != null) {\n\t\t\t\treturn this._request.responseText;\n\t\t\t}\n\t\t} catch (e) {\n\t\t}\n\n\t\t// When loading XML, IE9 does not return .response, instead it returns responseXML.xml\n\t\ttry {\n\t\t\tif (this._request.responseXML != null) {\n\t\t\t\treturn this._request.responseXML;\n\t\t\t}\n\t\t} catch (e) {\n\t\t}\n\n\t\treturn null;\n\t};\n\n\t/**\n\t * Create an XHR request. Depending on a number of factors, we get totally different results.\n\t * <ol><li>Some browsers get an <code>XDomainRequest</code> when loading cross-domain.</li>\n\t *      <li>XMLHttpRequest are created when available.</li>\n\t *      <li>ActiveX.XMLHTTP objects are used in older IE browsers.</li>\n\t *      <li>Text requests override the mime type if possible</li>\n\t *      <li>Origin headers are sent for crossdomain requests in some browsers.</li>\n\t *      <li>Binary loads set the response type to \"arraybuffer\"</li></ol>\n\t * @method _createXHR\n\t * @param {Object} item The requested item that is being loaded.\n\t * @return {Boolean} If an XHR request or equivalent was successfully created.\n\t * @private\n\t */\n\tp._createXHR = function (item) {\n\t\t// Check for cross-domain loads. We can't fully support them, but we can try.\n\t\tvar crossdomain = createjs.URLUtils.isCrossDomain(item);\n\t\tvar headers = {};\n\n\t\t// Create the request. Fallback to whatever support we have.\n\t\tvar req = null;\n\t\tif (window.XMLHttpRequest) {\n\t\t\treq = new XMLHttpRequest();\n\t\t\t// This is 8 or 9, so use XDomainRequest instead.\n\t\t\tif (crossdomain && req.withCredentials === undefined && window.XDomainRequest) {\n\t\t\t\treq = new XDomainRequest();\n\t\t\t}\n\t\t} else { // Old IE versions use a different approach\n\t\t\tfor (var i = 0, l = s.ACTIVEX_VERSIONS.length; i < l; i++) {\n\t\t\t\tvar axVersion = s.ACTIVEX_VERSIONS[i];\n\t\t\t\ttry {\n\t\t\t\t\treq = new ActiveXObject(axVersion);\n\t\t\t\t\tbreak;\n\t\t\t\t} catch (e) {\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (req == null) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Default to utf-8 for Text requests.\n\t\tif (item.mimeType == null && createjs.RequestUtils.isText(item.type)) {\n\t\t\titem.mimeType = \"text/plain; charset=utf-8\";\n\t\t}\n\n\t\t// IE9 doesn't support overrideMimeType(), so we need to check for it.\n\t\tif (item.mimeType && req.overrideMimeType) {\n\t\t\treq.overrideMimeType(item.mimeType);\n\t\t}\n\n\t\t// Determine the XHR level\n\t\tthis._xhrLevel = (typeof req.responseType === \"string\") ? 2 : 1;\n\n\t\tvar src = null;\n\t\tif (item.method == createjs.Methods.GET) {\n\t\t\tsrc = createjs.URLUtils.buildURI(item.src, item.values);\n\t\t} else {\n\t\t\tsrc = item.src;\n\t\t}\n\n\t\t// Open the request.  Set cross-domain flags if it is supported (XHR level 1 only)\n\t\treq.open(item.method || createjs.Methods.GET, src, true);\n\n\t\tif (crossdomain && req instanceof XMLHttpRequest && this._xhrLevel == 1) {\n\t\t\theaders[\"Origin\"] = location.origin;\n\t\t}\n\n\t\t// To send data we need to set the Content-type header)\n\t\tif (item.values && item.method == createjs.Methods.POST) {\n\t\t\theaders[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n\t\t}\n\n\t\tif (!crossdomain && !headers[\"X-Requested-With\"]) {\n\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t}\n\n\t\tif (item.headers) {\n\t\t\tfor (var n in item.headers) {\n\t\t\t\theaders[n] = item.headers[n];\n\t\t\t}\n\t\t}\n\n\t\tfor (n in headers) {\n\t\t\treq.setRequestHeader(n, headers[n])\n\t\t}\n\n\t\tif (req instanceof XMLHttpRequest && item.withCredentials !== undefined) {\n\t\t\treq.withCredentials = item.withCredentials;\n\t\t}\n\n\t\tthis._request = req;\n\n\t\treturn true;\n\t};\n\n\t/**\n\t * A request has completed (or failed or canceled), and needs to be disposed.\n\t * @method _clean\n\t * @private\n\t */\n\tp._clean = function () {\n\t\tclearTimeout(this._loadTimeout);\n\n\t\tif (this._request.removeEventListener != null) {\n\t\t\tthis._request.removeEventListener(\"loadstart\", this._handleLoadStartProxy);\n\t\t\tthis._request.removeEventListener(\"progress\", this._handleProgressProxy);\n\t\t\tthis._request.removeEventListener(\"abort\", this._handleAbortProxy);\n\t\t\tthis._request.removeEventListener(\"error\", this._handleErrorProxy);\n\t\t\tthis._request.removeEventListener(\"timeout\", this._handleTimeoutProxy);\n\t\t\tthis._request.removeEventListener(\"load\", this._handleLoadProxy);\n\t\t\tthis._request.removeEventListener(\"readystatechange\", this._handleReadyStateChangeProxy);\n\t\t} else {\n\t\t\tthis._request.onloadstart = null;\n\t\t\tthis._request.onprogress = null;\n\t\t\tthis._request.onabort = null;\n\t\t\tthis._request.onerror = null;\n\t\t\tthis._request.ontimeout = null;\n\t\t\tthis._request.onload = null;\n\t\t\tthis._request.onreadystatechange = null;\n\t\t}\n\t};\n\n\tp.toString = function () {\n\t\treturn \"[PreloadJS XHRRequest]\";\n\t};\n\n\tcreatejs.XHRRequest = createjs.promote(XHRRequest, \"AbstractRequest\");\n\n}());\n\n//##############################################################################\n// LoadQueue.js\n//##############################################################################\n\n/*\n TODO: WINDOWS ISSUES\n * No error for HTML audio in IE 678\n * SVG no failure error in IE 67 (maybe 8) TAGS AND XHR\n * No script complete handler in IE 67 TAGS (XHR is fine)\n * No XML/JSON in IE6 TAGS\n * Need to hide loading SVG in Opera TAGS\n * No CSS onload/readystatechange in Safari or Android TAGS (requires rule checking)\n * SVG no load or failure in Opera XHR\n * Reported issues with IE7/8\n */\n\n(function () {\n\t\"use strict\";\n\n// constructor\n\t/**\n\t * The LoadQueue class is the main API for preloading content. LoadQueue is a load manager, which can preload either\n\t * a single file, or queue of files.\n\t *\n\t * <b>Creating a Queue</b><br />\n\t * To use LoadQueue, create a LoadQueue instance. If you want to force tag loading where possible, set the preferXHR\n\t * argument to false.\n\t *\n\t *      var queue = new createjs.LoadQueue(true);\n\t *\n\t * <b>Listening for Events</b><br />\n\t * Add any listeners you want to the queue. Since PreloadJS 0.3.0, the {{#crossLink \"EventDispatcher\"}}{{/crossLink}}\n\t * lets you add as many listeners as you want for events. You can subscribe to the following events:<ul>\n\t *     <li>{{#crossLink \"AbstractLoader/complete:event\"}}{{/crossLink}}: fired when a queue completes loading all\n\t *     files</li>\n\t *     <li>{{#crossLink \"AbstractLoader/error:event\"}}{{/crossLink}}: fired when the queue encounters an error with\n\t *     any file.</li>\n\t *     <li>{{#crossLink \"AbstractLoader/progress:event\"}}{{/crossLink}}: Progress for the entire queue has\n\t *     changed.</li>\n\t *     <li>{{#crossLink \"LoadQueue/fileload:event\"}}{{/crossLink}}: A single file has completed loading.</li>\n\t *     <li>{{#crossLink \"LoadQueue/fileprogress:event\"}}{{/crossLink}}: Progress for a single file has changes. Note\n\t *     that only files loaded with XHR (or possibly by plugins) will fire progress events other than 0 or 100%.</li>\n\t * </ul>\n\t *\n\t *      queue.on(\"fileload\", handleFileLoad, this);\n\t *      queue.on(\"complete\", handleComplete, this);\n\t *\n\t * <b>Adding files and manifests</b><br />\n\t * Add files you want to load using {{#crossLink \"LoadQueue/loadFile\"}}{{/crossLink}} or add multiple files at a\n\t * time using a list or a manifest definition using {{#crossLink \"LoadQueue/loadManifest\"}}{{/crossLink}}. Files are\n\t * appended to the end of the active queue, so you can use these methods as many times as you like, whenever you\n\t * like.\n\t *\n\t *      queue.loadFile(\"filePath/file.jpg\");\n\t *      queue.loadFile({id:\"image\", src:\"filePath/file.jpg\"});\n\t *      queue.loadManifest([\"filePath/file.jpg\", {id:\"image\", src:\"filePath/file.jpg\"}]);\n\t *\n\t *      // Use an external manifest\n\t *      queue.loadManifest(\"path/to/manifest.json\");\n\t *      queue.loadManifest({src:\"manifest.json\", type:\"manifest\"});\n\t *\n\t * If you pass `false` as the `loadNow` parameter, the queue will not kick of the load of the files, but it will not\n\t * stop if it has already been started. Call the {{#crossLink \"AbstractLoader/load\"}}{{/crossLink}} method to begin\n\t * a paused queue. Note that a paused queue will automatically resume when new files are added to it with a\n\t * `loadNow` argument of `true`.\n\t *\n\t *      queue.load();\n\t *\n\t * <b>File Types</b><br />\n\t * The file type of a manifest item is auto-determined by the file extension. The pattern matching in PreloadJS\n\t * should handle the majority of standard file and url formats, and works with common file extensions. If you have\n\t * either a non-standard file extension, or are serving the file using a proxy script, then you can pass in a\n\t * <code>type</code> property with any manifest item.\n\t *\n\t *      queue.loadFile({src:\"path/to/myFile.mp3x\", type:createjs.Types.SOUND});\n\t *\n\t *      // Note that PreloadJS will not read a file extension from the query string\n\t *      queue.loadFile({src:\"http://server.com/proxy?file=image.jpg\", type:createjs.Types.IMAGE});\n\t *\n\t * Supported types are defined on the {{#crossLink \"AbstractLoader\"}}{{/crossLink}} class, and include:\n\t * <ul>\n\t *     <li>{{#crossLink \"Types/BINARY:property\"}}{{/crossLink}}: Raw binary data via XHR</li>\n\t *     <li>{{#crossLink \"Types/CSS:property\"}}{{/crossLink}}: CSS files</li>\n\t *     <li>{{#crossLink \"Types/IMAGE:property\"}}{{/crossLink}}: Common image formats</li>\n\t *     <li>{{#crossLink \"Types/JAVASCRIPT:property\"}}{{/crossLink}}: JavaScript files</li>\n\t *     <li>{{#crossLink \"Types/JSON:property\"}}{{/crossLink}}: JSON data</li>\n\t *     <li>{{#crossLink \"Types/JSONP:property\"}}{{/crossLink}}: JSON files cross-domain</li>\n\t *     <li>{{#crossLink \"Types/MANIFEST:property\"}}{{/crossLink}}: A list of files to load in JSON format, see\n\t *     {{#crossLink \"AbstractLoader/loadManifest\"}}{{/crossLink}}</li>\n\t *     <li>{{#crossLink \"Types/SOUND:property\"}}{{/crossLink}}: Audio file formats</li>\n\t *     <li>{{#crossLink \"Types/SPRITESHEET:property\"}}{{/crossLink}}: JSON SpriteSheet definitions. This\n\t *     will also load sub-images, and provide a {{#crossLink \"SpriteSheet\"}}{{/crossLink}} instance.</li>\n\t *     <li>{{#crossLink \"Types/SVG:property\"}}{{/crossLink}}: SVG files</li>\n\t *     <li>{{#crossLink \"Types/TEXT:property\"}}{{/crossLink}}: Text files - XHR only</li>\n     *     <li>{{#crossLink \"Types/VIDEO:property\"}}{{/crossLink}}: Video objects</li>\n\t *     <li>{{#crossLink \"Types/XML:property\"}}{{/crossLink}}: XML data</li>\n\t * </ul>\n\t *\n\t * <em>Note: Loader types used to be defined on LoadQueue, but have been moved to the Types class</em>\n\t *\n\t * <b>Handling Results</b><br />\n\t * When a file is finished downloading, a {{#crossLink \"LoadQueue/fileload:event\"}}{{/crossLink}} event is\n\t * dispatched. In an example above, there is an event listener snippet for fileload. Loaded files are usually a\n\t * formatted object that can be used immediately, including:\n\t * <ul>\n\t *     <li>Binary: The binary loaded result</li>\n\t *     <li>CSS: A &lt;link /&gt; tag</li>\n\t *     <li>Image: An &lt;img /&gt; tag</li>\n\t *     <li>JavaScript: A &lt;script /&gt; tag</li>\n\t *     <li>JSON/JSONP: A formatted JavaScript Object</li>\n\t *     <li>Manifest: A JavaScript object.\n\t *     <li>Sound: An &lt;audio /&gt; tag</a>\n\t *     <li>SpriteSheet: A {{#crossLink \"SpriteSheet\"}}{{/crossLink}} instance, containing loaded images.\n\t *     <li>SVG: An &lt;object /&gt; tag</li>\n\t *     <li>Text: Raw text</li>\n     *     <li>Video: A Video DOM node</li>\n\t *     <li>XML: An XML DOM node</li>\n\t * </ul>\n\t *\n\t *      function handleFileLoad(event) {\n\t *          var item = event.item; // A reference to the item that was passed in to the LoadQueue\n\t *          var type = item.type;\n\t *\n\t *          // Add any images to the page body.\n\t *          if (type == createjs.Types.IMAGE) {\n\t *              document.body.appendChild(event.result);\n\t *          }\n\t *      }\n\t *\n\t * At any time after the file has been loaded (usually after the queue has completed), any result can be looked up\n\t * via its \"id\" using {{#crossLink \"LoadQueue/getResult\"}}{{/crossLink}}. If no id was provided, then the\n\t * \"src\" or file path can be used instead, including the `path` defined by a manifest, but <strong>not including</strong>\n\t * a base path defined on the LoadQueue. It is recommended to always pass an id if you want to look up content.\n\t *\n\t *      var image = queue.getResult(\"image\");\n\t *      document.body.appendChild(image);\n\t *\n\t * Raw loaded content can be accessed using the <code>rawResult</code> property of the {{#crossLink \"LoadQueue/fileload:event\"}}{{/crossLink}}\n\t * event, or can be looked up using {{#crossLink \"LoadQueue/getResult\"}}{{/crossLink}}, passing `true` as the 2nd\n\t * argument. This is only applicable for content that has been parsed for the browser, specifically: JavaScript,\n\t * CSS, XML, SVG, and JSON objects, or anything loaded with XHR.\n\t *\n\t *      var image = queue.getResult(\"image\", true); // load the binary image data loaded with XHR.\n\t *\n\t * <b>Plugins</b><br />\n\t * LoadQueue has a simple plugin architecture to help process and preload content. For example, to preload audio,\n\t * make sure to install the <a href=\"http://soundjs.com\">SoundJS</a> Sound class, which will help load HTML audio,\n\t * Flash audio, and WebAudio files. This should be installed <strong>before</strong> loading any audio files.\n\t *\n\t *      queue.installPlugin(createjs.Sound);\n\t *\n\t * <h4>Known Browser Issues</h4>\n\t * <ul>\n\t *     <li>Browsers without audio support can not load audio files.</li>\n\t *     <li>Safari on Mac OS X can only play HTML audio if QuickTime is installed</li>\n\t *     <li>HTML Audio tags will only download until their <code>canPlayThrough</code> event is fired. Browsers other\n\t *     than Chrome will continue to download in the background.</li>\n\t *     <li>When loading scripts using tags, they are automatically added to the document.</li>\n\t *     <li>Scripts loaded via XHR may not be properly inspectable with browser tools.</li>\n\t *     <li>IE6 and IE7 (and some other browsers) may not be able to load XML, Text, or JSON, since they require\n\t *     XHR to work.</li>\n\t *     <li>Content loaded via tags will not show progress, and will continue to download in the background when\n\t *     canceled, although no events will be dispatched.</li>\n\t * </ul>\n\t *\n\t * @class LoadQueue\n\t * @param {Boolean} [preferXHR=true] Determines whether the preload instance will favor loading with XHR (XML HTTP\n\t * Requests), or HTML tags. When this is `false`, the queue will use tag loading when possible, and fall back on XHR\n\t * when necessary.\n\t * @param {String} [basePath=\"\"] A path that will be prepended on to the source parameter of all items in the queue\n\t * before they are loaded.  Sources beginning with a protocol such as `http://` or a relative path such as `../`\n\t * will not receive a base path.\n\t * @param {String|Boolean} [crossOrigin=\"\"] An optional flag to support images loaded from a CORS-enabled server. To\n\t * use it, set this value to `true`, which will default the crossOrigin property on images to \"Anonymous\". Any\n\t * string value will be passed through, but only \"\" and \"Anonymous\" are recommended. <strong>Note: The crossOrigin\n\t * parameter is deprecated. Use LoadItem.crossOrigin instead</strong>\n\t *\n\t * @constructor\n\t * @extends AbstractLoader\n\t */\n\tfunction LoadQueue (preferXHR, basePath, crossOrigin) {\n\t\tthis.AbstractLoader_constructor();\n\n\t\t/**\n\t\t * An array of the plugins registered using {{#crossLink \"LoadQueue/installPlugin\"}}{{/crossLink}}.\n\t\t * @property _plugins\n\t\t * @type {Array}\n\t\t * @private\n\t\t * @since 0.6.1\n\t\t */\n\t\tthis._plugins = [];\n\n\t\t/**\n\t\t * An object hash of callbacks that are fired for each file type before the file is loaded, giving plugins the\n\t\t * ability to override properties of the load. Please see the {{#crossLink \"LoadQueue/installPlugin\"}}{{/crossLink}}\n\t\t * method for more information.\n\t\t * @property _typeCallbacks\n\t\t * @type {Object}\n\t\t * @private\n\t\t */\n\t\tthis._typeCallbacks = {};\n\n\t\t/**\n\t\t * An object hash of callbacks that are fired for each file extension before the file is loaded, giving plugins the\n\t\t * ability to override properties of the load. Please see the {{#crossLink \"LoadQueue/installPlugin\"}}{{/crossLink}}\n\t\t * method for more information.\n\t\t * @property _extensionCallbacks\n\t\t * @type {null}\n\t\t * @private\n\t\t */\n\t\tthis._extensionCallbacks = {};\n\n\t\t/**\n\t\t * The next preload queue to process when this one is complete. If an error is thrown in the current queue, and\n\t\t * {{#crossLink \"LoadQueue/stopOnError:property\"}}{{/crossLink}} is `true`, the next queue will not be processed.\n\t\t * @property next\n\t\t * @type {LoadQueue}\n\t\t * @default null\n\t\t */\n\t\tthis.next = null;\n\n\t\t/**\n\t\t * Ensure loaded scripts \"complete\" in the order they are specified. Loaded scripts are added to the document head\n\t\t * once they are loaded. Scripts loaded via tags will load one-at-a-time when this property is `true`, whereas\n\t\t * scripts loaded using XHR can load in any order, but will \"finish\" and be added to the document in the order\n\t\t * specified.\n\t\t *\n\t\t * Any items can be set to load in order by setting the {{#crossLink \"maintainOrder:property\"}}{{/crossLink}}\n\t\t * property on the load item, or by ensuring that only one connection can be open at a time using\n\t\t * {{#crossLink \"LoadQueue/setMaxConnections\"}}{{/crossLink}}. Note that when the `maintainScriptOrder` property\n\t\t * is set to `true`, scripts items are automatically set to `maintainOrder=true`, and changing the\n\t\t * `maintainScriptOrder` to `false` during a load will not change items already in a queue.\n\t\t *\n\t\t * <h4>Example</h4>\n\t\t *\n\t\t *      var queue = new createjs.LoadQueue();\n\t\t *      queue.setMaxConnections(3); // Set a higher number to load multiple items at once\n\t\t *      queue.maintainScriptOrder = true; // Ensure scripts are loaded in order\n\t\t *      queue.loadManifest([\n\t\t *          \"script1.js\",\n\t\t *          \"script2.js\",\n\t\t *          \"image.png\", // Load any time\n\t\t *          {src: \"image2.png\", maintainOrder: true} // Will wait for script2.js\n\t\t *          \"image3.png\",\n\t\t *          \"script3.js\" // Will wait for image2.png before loading (or completing when loading with XHR)\n\t\t *      ]);\n\t\t *\n\t\t * @property maintainScriptOrder\n\t\t * @type {Boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.maintainScriptOrder = true;\n\n\t\t/**\n\t\t * Determines if the LoadQueue will stop processing the current queue when an error is encountered.\n\t\t * @property stopOnError\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stopOnError = false;\n\n\t\t/**\n\t\t * The number of maximum open connections that a loadQueue tries to maintain. Please see\n\t\t * {{#crossLink \"LoadQueue/setMaxConnections\"}}{{/crossLink}} for more information.\n\t\t * @property _maxConnections\n\t\t * @type {Number}\n\t\t * @default 1\n\t\t * @private\n\t\t */\n\t\tthis._maxConnections = 1;\n\n\t\t/**\n\t\t * An internal list of all the default Loaders that are included with PreloadJS. Before an item is loaded, the\n\t\t * available loader list is iterated, in the order they are included, and as soon as a loader indicates it can\n\t\t * handle the content, it will be selected. The default loader, ({{#crossLink \"TextLoader\"}}{{/crossLink}} is\n\t\t * last in the list, so it will be used if no other match is found. Typically, loaders will match based on the\n\t\t * {{#crossLink \"LoadItem/type\"}}{{/crossLink}}, which is automatically determined using the file extension of\n\t\t * the {{#crossLink \"LoadItem/src:property\"}}{{/crossLink}}.\n\t\t *\n\t\t * Loaders can be removed from PreloadJS by simply not including them.\n\t\t *\n\t\t * Custom loaders installed using {{#crossLink \"registerLoader\"}}{{/crossLink}} will be prepended to this list\n\t\t * so that they are checked first.\n\t\t * @property _availableLoaders\n\t\t * @type {Array}\n\t\t * @private\n\t\t * @since 0.6.0\n\t\t */\n\t\tthis._availableLoaders = [\n            createjs.FontLoader,\n\t\t\tcreatejs.ImageLoader,\n\t\t\tcreatejs.JavaScriptLoader,\n\t\t\tcreatejs.CSSLoader,\n\t\t\tcreatejs.JSONLoader,\n\t\t\tcreatejs.JSONPLoader,\n\t\t\tcreatejs.SoundLoader,\n\t\t\tcreatejs.ManifestLoader,\n\t\t\tcreatejs.SpriteSheetLoader,\n\t\t\tcreatejs.XMLLoader,\n\t\t\tcreatejs.SVGLoader,\n\t\t\tcreatejs.BinaryLoader,\n\t\t\tcreatejs.VideoLoader,\n\t\t\tcreatejs.TextLoader\n\t\t];\n\n\t\t/**\n\t\t * The number of built in loaders, so they can't be removed by {{#crossLink \"unregisterLoader\"}}{{/crossLink}.\n\t\t\t\t * @property _defaultLoaderLength\n\t\t * @type {Number}\n\t\t * @private\n\t\t * @since 0.6.0\n\t\t */\n\t\tthis._defaultLoaderLength = this._availableLoaders.length;\n\n\t\tthis.init(preferXHR, basePath, crossOrigin);\n\t}\n\n\tvar p = createjs.extend(LoadQueue, createjs.AbstractLoader);\n\tvar s = LoadQueue;\n\n\t// Remove these @deprecated properties after 1.0\n\ttry {\n\t\tObject.defineProperties(s, {\n\t\t\tPOST: { get: createjs.deprecate(function() { return createjs.Methods.POST; }, \"AbstractLoader.POST\") },\n\t\t\tGET: { get: createjs.deprecate(function() { return createjs.Methods.GET; }, \"AbstractLoader.GET\") },\n\n\t\t\tBINARY: { get: createjs.deprecate(function() { return createjs.Types.BINARY; }, \"AbstractLoader.BINARY\") },\n\t\t\tCSS: { get: createjs.deprecate(function() { return createjs.Types.CSS; }, \"AbstractLoader.CSS\") },\n\t\t\tFONT: { get: createjs.deprecate(function() { return createjs.Types.FONT; }, \"AbstractLoader.FONT\") },\n\t\t\tFONTCSS: { get: createjs.deprecate(function() { return createjs.Types.FONTCSS; }, \"AbstractLoader.FONTCSS\") },\n\t\t\tIMAGE: { get: createjs.deprecate(function() { return createjs.Types.IMAGE; }, \"AbstractLoader.IMAGE\") },\n\t\t\tJAVASCRIPT: { get: createjs.deprecate(function() { return createjs.Types.JAVASCRIPT; }, \"AbstractLoader.JAVASCRIPT\") },\n\t\t\tJSON: { get: createjs.deprecate(function() { return createjs.Types.JSON; }, \"AbstractLoader.JSON\") },\n\t\t\tJSONP: { get: createjs.deprecate(function() { return createjs.Types.JSONP; }, \"AbstractLoader.JSONP\") },\n\t\t\tMANIFEST: { get: createjs.deprecate(function() { return createjs.Types.MANIFEST; }, \"AbstractLoader.MANIFEST\") },\n\t\t\tSOUND: { get: createjs.deprecate(function() { return createjs.Types.SOUND; }, \"AbstractLoader.SOUND\") },\n\t\t\tVIDEO: { get: createjs.deprecate(function() { return createjs.Types.VIDEO; }, \"AbstractLoader.VIDEO\") },\n\t\t\tSPRITESHEET: { get: createjs.deprecate(function() { return createjs.Types.SPRITESHEET; }, \"AbstractLoader.SPRITESHEET\") },\n\t\t\tSVG: { get: createjs.deprecate(function() { return createjs.Types.SVG; }, \"AbstractLoader.SVG\") },\n\t\t\tTEXT: { get: createjs.deprecate(function() { return createjs.Types.TEXT; }, \"AbstractLoader.TEXT\") },\n\t\t\tXML: { get: createjs.deprecate(function() { return createjs.Types.XML; }, \"AbstractLoader.XML\") }\n\t\t});\n\t} catch (e) {}\n\n\t/**\n\t * An internal initialization method, which is used for initial set up, but also to reset the LoadQueue.\n\t * @method init\n\t * @param preferXHR\n\t * @param basePath\n\t * @param crossOrigin\n\t * @private\n\t */\n\tp.init = function (preferXHR, basePath, crossOrigin) {\n\n\t\t// public properties\n\n\t\t/**\n\t\t * Try and use XMLHttpRequest (XHR) when possible. Note that LoadQueue will default to tag loading or XHR\n\t\t * loading depending on the requirements for a media type. For example, HTML audio can not be loaded with XHR,\n\t\t * and plain text can not be loaded with tags, so it will default the the correct type instead of using the\n\t\t * user-defined type.\n\t\t * @type {Boolean}\n\t\t * @default true\n\t\t * @since 0.6.0\n\t\t */\n\t\tthis.preferXHR = true; //TODO: Get/Set\n\t\tthis._preferXHR = true;\n\t\tthis.setPreferXHR(preferXHR);\n\n\t\t// protected properties\n\t\t/**\n\t\t * Whether the queue is currently paused or not.\n\t\t * @property _paused\n\t\t * @type {boolean}\n\t\t * @private\n\t\t */\n\t\tthis._paused = false;\n\n\t\t/**\n\t\t * A path that will be prepended on to the item's {{#crossLink \"LoadItem/src:property\"}}{{/crossLink}}. The\n\t\t * `_basePath` property will only be used if an item's source is relative, and does not include a protocol such\n\t\t * as `http://`, or a relative path such as `../`.\n\t\t * @property _basePath\n\t\t * @type {String}\n\t\t * @private\n\t\t * @since 0.3.1\n\t\t */\n\t\tthis._basePath = basePath;\n\n\t\t/**\n\t\t * An optional flag to set on images that are loaded using PreloadJS, which enables CORS support. Images loaded\n\t\t * cross-domain by servers that support CORS require the crossOrigin flag to be loaded and interacted with by\n\t\t * a canvas. When loading locally, or with a server with no CORS support, this flag can cause other security issues,\n\t\t * so it is recommended to only set it if you are sure the server supports it. Currently, supported values are \"\"\n\t\t * and \"Anonymous\".\n\t\t * @property _crossOrigin\n\t\t * @type {String}\n\t\t * @default \"\"\n\t\t * @private\n\t\t * @since 0.4.1\n\t\t */\n\t\tthis._crossOrigin = crossOrigin;\n\n\t\t/**\n\t\t * Determines if the loadStart event was dispatched already. This event is only fired one time, when the first\n\t\t * file is requested.\n\t\t * @property _loadStartWasDispatched\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t * @private\n\t\t */\n\t\tthis._loadStartWasDispatched = false;\n\n\t\t/**\n\t\t * Determines if there is currently a script loading. This helps ensure that only a single script loads at once when\n\t\t * using a script tag to do preloading.\n\t\t * @property _currentlyLoadingScript\n\t\t * @type {Boolean}\n\t\t * @private\n\t\t */\n\t\tthis._currentlyLoadingScript = null;\n\n\t\t/**\n\t\t * An array containing the currently downloading files.\n\t\t * @property _currentLoads\n\t\t * @type {Array}\n\t\t * @private\n\t\t */\n\t\tthis._currentLoads = [];\n\n\t\t/**\n\t\t * An array containing the queued items that have not yet started downloading.\n\t\t * @property _loadQueue\n\t\t * @type {Array}\n\t\t * @private\n\t\t */\n\t\tthis._loadQueue = [];\n\n\t\t/**\n\t\t * An array containing downloads that have not completed, so that the LoadQueue can be properly reset.\n\t\t * @property _loadQueueBackup\n\t\t * @type {Array}\n\t\t * @private\n\t\t */\n\t\tthis._loadQueueBackup = [];\n\n\t\t/**\n\t\t * An object hash of items that have finished downloading, indexed by the {{#crossLink \"LoadItem\"}}{{/crossLink}}\n\t\t * id.\n\t\t * @property _loadItemsById\n\t\t * @type {Object}\n\t\t * @private\n\t\t */\n\t\tthis._loadItemsById = {};\n\n\t\t/**\n\t\t * An object hash of items that have finished downloading, indexed by {{#crossLink \"LoadItem\"}}{{/crossLink}}\n\t\t * source.\n\t\t * @property _loadItemsBySrc\n\t\t * @type {Object}\n\t\t * @private\n\t\t */\n\t\tthis._loadItemsBySrc = {};\n\n\t\t/**\n\t\t * An object hash of loaded items, indexed by the ID of the {{#crossLink \"LoadItem\"}}{{/crossLink}}.\n\t\t * @property _loadedResults\n\t\t * @type {Object}\n\t\t * @private\n\t\t */\n\t\tthis._loadedResults = {};\n\n\t\t/**\n\t\t * An object hash of un-parsed loaded items, indexed by the ID of the {{#crossLink \"LoadItem\"}}{{/crossLink}}.\n\t\t * @property _loadedRawResults\n\t\t * @type {Object}\n\t\t * @private\n\t\t */\n\t\tthis._loadedRawResults = {};\n\n\t\t/**\n\t\t * The number of items that have been requested. This helps manage an overall progress without knowing how large\n\t\t * the files are before they are downloaded. This does not include items inside of loaders such as the\n\t\t * {{#crossLink \"ManifestLoader\"}}{{/crossLink}}.\n\t\t * @property _numItems\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t * @private\n\t\t */\n\t\tthis._numItems = 0;\n\n\t\t/**\n\t\t * The number of items that have completed loaded. This helps manage an overall progress without knowing how large\n\t\t * the files are before they are downloaded.\n\t\t * @property _numItemsLoaded\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t * @private\n\t\t */\n\t\tthis._numItemsLoaded = 0;\n\n\t\t/**\n\t\t * A list of scripts in the order they were requested. This helps ensure that scripts are \"completed\" in the right\n\t\t * order.\n\t\t * @property _scriptOrder\n\t\t * @type {Array}\n\t\t * @private\n\t\t */\n\t\tthis._scriptOrder = [];\n\n\t\t/**\n\t\t * A list of scripts that have been loaded. Items are added to this list as <code>null</code> when they are\n\t\t * requested, contain the loaded item if it has completed, but not been dispatched to the user, and <code>true</true>\n\t\t * once they are complete and have been dispatched.\n\t\t * @property _loadedScripts\n\t\t * @type {Array}\n\t\t * @private\n\t\t */\n\t\tthis._loadedScripts = [];\n\n\t\t/**\n\t\t * The last progress amount. This is used to suppress duplicate progress events.\n\t\t * @property _lastProgress\n\t\t * @type {Number}\n\t\t * @private\n\t\t * @since 0.6.0\n\t\t */\n\t\tthis._lastProgress = NaN;\n\n\t};\n\n// static properties\n\n// events\n\t/**\n\t * This event is fired when an individual file has loaded, and been processed.\n\t * @event fileload\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type.\n\t * @param {Object} item The file item which was specified in the {{#crossLink \"LoadQueue/loadFile\"}}{{/crossLink}}\n\t * or {{#crossLink \"LoadQueue/loadManifest\"}}{{/crossLink}} call. If only a string path or tag was specified, the\n\t * object will contain that value as a `src` property.\n\t * @param {Object} result The HTML tag or parsed result of the loaded item.\n\t * @param {Object} rawResult The unprocessed result, usually the raw text or binary data before it is converted\n\t * to a usable object.\n\t * @since 0.3.0\n\t */\n\n\t/**\n\t * This {{#crossLink \"ProgressEvent\"}}{{/crossLink}} that is fired when an an individual file's progress changes.\n\t * @event fileprogress\n\t * @since 0.3.0\n\t */\n\n\t/**\n\t * This event is fired when an individual file starts to load.\n\t * @event filestart\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type.\n\t * @param {Object} item The file item which was specified in the {{#crossLink \"LoadQueue/loadFile\"}}{{/crossLink}}\n\t * or {{#crossLink \"LoadQueue/loadManifest\"}}{{/crossLink}} call. If only a string path or tag was specified, the\n\t * object will contain that value as a property.\n\t */\n\n\t/**\n\t * Although it extends {{#crossLink \"AbstractLoader\"}}{{/crossLink}}, the `initialize` event is never fired from\n\t * a LoadQueue instance.\n\t * @event initialize\n\t * @private\n\t */\n\n// public methods\n\t/**\n\t * Register a custom loaders class. New loaders are given precedence over loaders added earlier and default loaders.\n\t * It is recommended that loaders extend {{#crossLink \"AbstractLoader\"}}{{/crossLink}}. Loaders can only be added\n\t * once, and will be prepended to the list of available loaders.\n\t * @method registerLoader\n\t * @param {Function|AbstractLoader} loader The AbstractLoader class to add.\n\t * @since 0.6.0\n\t */\n\tp.registerLoader = function (loader) {\n\t\tif (!loader || !loader.canLoadItem) {\n\t\t\tthrow new Error(\"loader is of an incorrect type.\");\n\t\t} else if (this._availableLoaders.indexOf(loader) != -1) {\n\t\t\tthrow new Error(\"loader already exists.\"); //LM: Maybe just silently fail here\n\t\t}\n\n\t\tthis._availableLoaders.unshift(loader);\n\t};\n\n\t/**\n\t * Remove a custom loader added using {{#crossLink \"registerLoader\"}}{{/crossLink}}. Only custom loaders can be\n\t * unregistered, the default loaders will always be available.\n\t * @method unregisterLoader\n\t * @param {Function|AbstractLoader} loader The AbstractLoader class to remove\n\t */\n\tp.unregisterLoader = function (loader) {\n\t\tvar idx = this._availableLoaders.indexOf(loader);\n\t\tif (idx != -1 && idx < this._defaultLoaderLength - 1) {\n\t\t\tthis._availableLoaders.splice(idx, 1);\n\t\t}\n\t};\n\n\t/**\n\t * Change the {{#crossLink \"preferXHR:property\"}}{{/crossLink}} value. Note that if this is set to `true`, it may\n\t * fail, or be ignored depending on the browser's capabilities and the load type.\n\t * @method setPreferXHR\n\t * @param {Boolean} value\n\t * @returns {Boolean} The value of {{#crossLink \"preferXHR\"}}{{/crossLink}} that was successfully set.\n\t * @since 0.6.0\n\t */\n\tp.setPreferXHR = function (value) {\n\t\t// Determine if we can use XHR. XHR defaults to TRUE, but the browser may not support it.\n\t\t//TODO: Should we be checking for the other XHR types? Might have to do a try/catch on the different types similar to createXHR.\n\t\tthis.preferXHR = (value != false && window.XMLHttpRequest != null);\n\t\treturn this.preferXHR;\n\t};\n\n\t/**\n\t * Stops all queued and loading items, and clears the queue. This also removes all internal references to loaded\n\t * content, and allows the queue to be used again.\n\t * @method removeAll\n\t * @since 0.3.0\n\t */\n\tp.removeAll = function () {\n\t\tthis.remove();\n\t};\n\n\t/**\n\t * Stops an item from being loaded, and removes it from the queue. If nothing is passed, all items are removed.\n\t * This also removes internal references to loaded item(s).\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      queue.loadManifest([\n\t *          {src:\"test.png\", id:\"png\"},\n\t *          {src:\"test.jpg\", id:\"jpg\"},\n\t *          {src:\"test.mp3\", id:\"mp3\"}\n\t *      ]);\n\t *      queue.remove(\"png\"); // Single item by ID\n\t *      queue.remove(\"png\", \"test.jpg\"); // Items as arguments. Mixed id and src.\n\t *      queue.remove([\"test.png\", \"jpg\"]); // Items in an Array. Mixed id and src.\n\t *\n\t * @method remove\n\t * @param {String | Array} idsOrUrls* The id or ids to remove from this queue. You can pass an item, an array of\n\t * items, or multiple items as arguments.\n\t * @since 0.3.0\n\t */\n\tp.remove = function (idsOrUrls) {\n\t\tvar args = null;\n\n\t\tif (idsOrUrls && !Array.isArray(idsOrUrls)) {\n\t\t\targs = [idsOrUrls];\n\t\t} else if (idsOrUrls) {\n\t\t\targs = idsOrUrls;\n\t\t} else if (arguments.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar itemsWereRemoved = false;\n\n\t\t// Destroy everything\n\t\tif (!args) {\n\t\t\tthis.close();\n\t\t\tfor (var n in this._loadItemsById) {\n\t\t\t\tthis._disposeItem(this._loadItemsById[n]);\n\t\t\t}\n\t\t\tthis.init(this.preferXHR, this._basePath);\n\n\t\t\t// Remove specific items\n\t\t} else {\n\t\t\twhile (args.length) {\n\t\t\t\tvar item = args.pop();\n\t\t\t\tvar r = this.getResult(item);\n\n\t\t\t\t//Remove from the main load Queue\n\t\t\t\tfor (i = this._loadQueue.length - 1; i >= 0; i--) {\n\t\t\t\t\tloadItem = this._loadQueue[i].getItem();\n\t\t\t\t\tif (loadItem.id == item || loadItem.src == item) {\n\t\t\t\t\t\tthis._loadQueue.splice(i, 1)[0].cancel();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//Remove from the backup queue\n\t\t\t\tfor (i = this._loadQueueBackup.length - 1; i >= 0; i--) {\n\t\t\t\t\tloadItem = this._loadQueueBackup[i].getItem();\n\t\t\t\t\tif (loadItem.id == item || loadItem.src == item) {\n\t\t\t\t\t\tthis._loadQueueBackup.splice(i, 1)[0].cancel();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (r) {\n\t\t\t\t\tthis._disposeItem(this.getItem(item));\n\t\t\t\t} else {\n\t\t\t\t\tfor (var i = this._currentLoads.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tvar loadItem = this._currentLoads[i].getItem();\n\t\t\t\t\t\tif (loadItem.id == item || loadItem.src == item) {\n\t\t\t\t\t\t\tthis._currentLoads.splice(i, 1)[0].cancel();\n\t\t\t\t\t\t\titemsWereRemoved = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If this was called during a load, try to load the next item.\n\t\t\tif (itemsWereRemoved) {\n\t\t\t\tthis._loadNext();\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Stops all open loads, destroys any loaded items, and resets the queue, so all items can\n\t * be reloaded again by calling {{#crossLink \"AbstractLoader/load\"}}{{/crossLink}}. Items are not removed from the\n\t * queue. To remove items use the {{#crossLink \"LoadQueue/remove\"}}{{/crossLink}} or\n\t * {{#crossLink \"LoadQueue/removeAll\"}}{{/crossLink}} method.\n\t * @method reset\n\t * @since 0.3.0\n\t */\n\tp.reset = function () {\n\t\tthis.close();\n\t\tfor (var n in this._loadItemsById) {\n\t\t\tthis._disposeItem(this._loadItemsById[n]);\n\t\t}\n\n\t\t//Reset the queue to its start state\n\t\tvar a = [];\n\t\tfor (var i = 0, l = this._loadQueueBackup.length; i < l; i++) {\n\t\t\ta.push(this._loadQueueBackup[i].getItem());\n\t\t}\n\n\t\tthis.loadManifest(a, false);\n\t};\n\n\t/**\n\t * Register a plugin. Plugins can map to load types (sound, image, etc), or specific extensions (png, mp3, etc).\n\t * Currently, only one plugin can exist per type/extension.\n\t *\n\t * When a plugin is installed, a <code>getPreloadHandlers()</code> method will be called on it. For more information\n\t * on this method, check out the {{#crossLink \"SamplePlugin/getPreloadHandlers\"}}{{/crossLink}} method in the\n\t * {{#crossLink \"SamplePlugin\"}}{{/crossLink}} class.\n\t *\n\t * Before a file is loaded, a matching plugin has an opportunity to modify the load. If a `callback` is returned\n\t * from the {{#crossLink \"SamplePlugin/getPreloadHandlers\"}}{{/crossLink}} method, it will be invoked first, and its\n\t * result may cancel or modify the item. The callback method can also return a `completeHandler` to be fired when\n\t * the file is loaded, or a `tag` object, which will manage the actual download. For more information on these\n\t * methods, check out the {{#crossLink \"SamplePlugin/preloadHandler\"}}{{/crossLink}} and {{#crossLink \"SamplePlugin/fileLoadHandler\"}}{{/crossLink}}\n\t * methods on the {{#crossLink \"SamplePlugin\"}}{{/crossLink}}.\n\t *\n\t * @method installPlugin\n\t * @param {Function} plugin The plugin class to install.\n\t */\n\tp.installPlugin = function (plugin) {\n\t\tif (plugin == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (plugin.getPreloadHandlers != null) {\n\t\t\tthis._plugins.push(plugin);\n\t\t\tvar map = plugin.getPreloadHandlers();\n\t\t\tmap.scope = plugin;\n\n\t\t\tif (map.types != null) {\n\t\t\t\tfor (var i = 0, l = map.types.length; i < l; i++) {\n\t\t\t\t\tthis._typeCallbacks[map.types[i]] = map;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (map.extensions != null) {\n\t\t\t\tfor (i = 0, l = map.extensions.length; i < l; i++) {\n\t\t\t\t\tthis._extensionCallbacks[map.extensions[i]] = map;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Set the maximum number of concurrent connections. Note that browsers and servers may have a built-in maximum\n\t * number of open connections, so any additional connections may remain in a pending state until the browser\n\t * opens the connection. When loading scripts using tags, and when {{#crossLink \"LoadQueue/maintainScriptOrder:property\"}}{{/crossLink}}\n\t * is `true`, only one script is loaded at a time due to browser limitations.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      var queue = new createjs.LoadQueue();\n\t *      queue.setMaxConnections(10); // Allow 10 concurrent loads\n\t *\n\t * @method setMaxConnections\n\t * @param {Number} value The number of concurrent loads to allow. By default, only a single connection per LoadQueue\n\t * is open at any time.\n\t */\n\tp.setMaxConnections = function (value) {\n\t\tthis._maxConnections = value;\n\t\tif (!this._paused && this._loadQueue.length > 0) {\n\t\t\tthis._loadNext();\n\t\t}\n\t};\n\n\t/**\n\t * Load a single file. To add multiple files at once, use the {{#crossLink \"LoadQueue/loadManifest\"}}{{/crossLink}}\n\t * method.\n\t *\n\t * Files are always appended to the current queue, so this method can be used multiple times to add files.\n\t * To clear the queue first, use the {{#crossLink \"AbstractLoader/close\"}}{{/crossLink}} method.\n\t * @method loadFile\n\t * @param {LoadItem|Object|String} file The file object or path to load. A file can be either\n\t * <ul>\n\t *     <li>A {{#crossLink \"LoadItem\"}}{{/crossLink}} instance</li>\n\t *     <li>An object containing properties defined by {{#crossLink \"LoadItem\"}}{{/crossLink}}</li>\n\t *     <li>OR A string path to a resource. Note that this kind of load item will be converted to a {{#crossLink \"LoadItem\"}}{{/crossLink}}\n\t *     in the background.</li>\n\t * </ul>\n\t * @param {Boolean} [loadNow=true] Kick off an immediate load (true) or wait for a load call (false). The default\n\t * value is true. If the queue is paused using {{#crossLink \"LoadQueue/setPaused\"}}{{/crossLink}}, and the value is\n\t * `true`, the queue will resume automatically.\n\t * @param {String} [basePath] A base path that will be prepended to each file. The basePath argument overrides the\n\t * path specified in the constructor. Note that if you load a manifest using a file of type {{#crossLink \"Types/MANIFEST:property\"}}{{/crossLink}},\n\t * its files will <strong>NOT</strong> use the basePath parameter. <strong>The basePath parameter is deprecated.</strong>\n\t * This parameter will be removed in a future version. Please either use the `basePath` parameter in the LoadQueue\n\t * constructor, or a `path` property in a manifest definition.\n\t */\n\tp.loadFile = function (file, loadNow, basePath) {\n\t\tif (file == null) {\n\t\t\tvar event = new createjs.ErrorEvent(\"PRELOAD_NO_FILE\");\n\t\t\tthis._sendError(event);\n\t\t\treturn;\n\t\t}\n\t\tthis._addItem(file, null, basePath);\n\n\t\tif (loadNow !== false) {\n\t\t\tthis.setPaused(false);\n\t\t} else {\n\t\t\tthis.setPaused(true);\n\t\t}\n\t};\n\n\t/**\n\t * Load an array of files. To load a single file, use the {{#crossLink \"LoadQueue/loadFile\"}}{{/crossLink}} method.\n\t * The files in the manifest are requested in the same order, but may complete in a different order if the max\n\t * connections are set above 1 using {{#crossLink \"LoadQueue/setMaxConnections\"}}{{/crossLink}}. Scripts will load\n\t * in the right order as long as {{#crossLink \"LoadQueue/maintainScriptOrder\"}}{{/crossLink}} is true (which is\n\t * default).\n\t *\n\t * Files are always appended to the current queue, so this method can be used multiple times to add files.\n\t * To clear the queue first, use the {{#crossLink \"AbstractLoader/close\"}}{{/crossLink}} method.\n\t * @method loadManifest\n\t * @param {Array|String|Object} manifest An list of files to load. The loadManifest call supports four types of\n\t * manifests:\n\t * <ol>\n\t *     <li>A string path, which points to a manifest file, which is a JSON file that contains a \"manifest\" property,\n\t *     which defines the list of files to load, and can optionally contain a \"path\" property, which will be\n\t *     prepended to each file in the list.</li>\n\t *     <li>An object which defines a \"src\", which is a JSON or JSONP file. A \"callback\" can be defined for JSONP\n\t *     file. The JSON/JSONP file should contain a \"manifest\" property, which defines the list of files to load,\n\t *     and can optionally contain a \"path\" property, which will be prepended to each file in the list.</li>\n\t *     <li>An object which contains a \"manifest\" property, which defines the list of files to load, and can\n\t *     optionally contain a \"path\" property, which will be prepended to each file in the list.</li>\n\t *     <li>An Array of files to load.</li>\n\t * </ol>\n\t *\n\t * Each \"file\" in a manifest can be either:\n\t * <ul>\n\t *     <li>A {{#crossLink \"LoadItem\"}}{{/crossLink}} instance</li>\n\t *     <li>An object containing properties defined by {{#crossLink \"LoadItem\"}}{{/crossLink}}</li>\n\t *     <li>OR A string path to a resource. Note that this kind of load item will be converted to a {{#crossLink \"LoadItem\"}}{{/crossLink}}\n\t *     in the background.</li>\n\t * </ul>\n\t *\n\t * @param {Boolean} [loadNow=true] Kick off an immediate load (true) or wait for a load call (false). The default\n\t * value is true. If the queue is paused using {{#crossLink \"LoadQueue/setPaused\"}}{{/crossLink}} and this value is\n\t * `true`, the queue will resume automatically.\n\t * @param {String} [basePath] A base path that will be prepended to each file. The basePath argument overrides the\n\t * path specified in the constructor. Note that if you load a manifest using a file of type {{#crossLink \"LoadQueue/MANIFEST:property\"}}{{/crossLink}},\n\t * its files will <strong>NOT</strong> use the basePath parameter. <strong>The basePath parameter is deprecated.</strong>\n\t * This parameter will be removed in a future version. Please either use the `basePath` parameter in the LoadQueue\n\t * constructor, or a `path` property in a manifest definition.\n\t */\n\tp.loadManifest = function (manifest, loadNow, basePath) {\n\t\tvar fileList = null;\n\t\tvar path = null;\n\n\t\t// Array-based list of items\n\t\tif (Array.isArray(manifest)) {\n\t\t\tif (manifest.length == 0) {\n\t\t\t\tvar event = new createjs.ErrorEvent(\"PRELOAD_MANIFEST_EMPTY\");\n\t\t\t\tthis._sendError(event);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfileList = manifest;\n\n\t\t\t// String-based. Only file manifests can be specified this way. Any other types will cause an error when loaded.\n\t\t} else if (typeof(manifest) === \"string\") {\n\t\t\tfileList = [\n\t\t\t\t{\n\t\t\t\t\tsrc: manifest,\n\t\t\t\t\ttype: s.MANIFEST\n\t\t\t\t}\n\t\t\t];\n\n\t\t} else if (typeof(manifest) == \"object\") {\n\n\t\t\t// An object that defines a manifest path\n\t\t\tif (manifest.src !== undefined) {\n\t\t\t\tif (manifest.type == null) {\n\t\t\t\t\tmanifest.type = s.MANIFEST;\n\t\t\t\t} else if (manifest.type != s.MANIFEST) {\n\t\t\t\t\tvar event = new createjs.ErrorEvent(\"PRELOAD_MANIFEST_TYPE\");\n\t\t\t\t\tthis._sendError(event);\n\t\t\t\t}\n\t\t\t\tfileList = [manifest];\n\n\t\t\t\t// An object that defines a manifest\n\t\t\t} else if (manifest.manifest !== undefined) {\n\t\t\t\tfileList = manifest.manifest;\n\t\t\t\tpath = manifest.path;\n\t\t\t}\n\n\t\t\t// Unsupported. This will throw an error.\n\t\t} else {\n\t\t\tvar event = new createjs.ErrorEvent(\"PRELOAD_MANIFEST_NULL\");\n\t\t\tthis._sendError(event);\n\t\t\treturn;\n\t\t}\n\n\t\tfor (var i = 0, l = fileList.length; i < l; i++) {\n\t\t\tthis._addItem(fileList[i], path, basePath);\n\t\t}\n\n\t\tif (loadNow !== false) {\n\t\t\tthis.setPaused(false);\n\t\t} else {\n\t\t\tthis.setPaused(true);\n\t\t}\n\n\t};\n\n\t/**\n\t * Start a LoadQueue that was created, but not automatically started.\n\t * @method load\n\t */\n\tp.load = function () {\n\t\tthis.setPaused(false);\n\t};\n\n\t/**\n\t * Look up a {{#crossLink \"LoadItem\"}}{{/crossLink}} using either the \"id\" or \"src\" that was specified when loading it. Note that if no \"id\" was\n\t * supplied with the load item, the ID will be the \"src\", including a `path` property defined by a manifest. The\n\t * `basePath` will not be part of the ID.\n\t * @method getItem\n\t * @param {String} value The <code>id</code> or <code>src</code> of the load item.\n\t * @return {Object} The load item that was initially requested using {{#crossLink \"LoadQueue/loadFile\"}}{{/crossLink}}\n\t * or {{#crossLink \"LoadQueue/loadManifest\"}}{{/crossLink}}. This object is also returned via the {{#crossLink \"LoadQueue/fileload:event\"}}{{/crossLink}}\n\t * event as the `item` parameter.\n\t */\n\tp.getItem = function (value) {\n\t\treturn this._loadItemsById[value] || this._loadItemsBySrc[value];\n\t};\n\n\t/**\n\t * Look up a loaded result using either the \"id\" or \"src\" that was specified when loading it. Note that if no \"id\"\n\t * was supplied with the load item, the ID will be the \"src\", including a `path` property defined by a manifest. The\n\t * `basePath` will not be part of the ID.\n\t * @method getResult\n\t * @param {String} value The <code>id</code> or <code>src</code> of the load item.\n\t * @param {Boolean} [rawResult=false] Return a raw result instead of a formatted result. This applies to content\n\t * loaded via XHR such as scripts, XML, CSS, and Images. If there is no raw result, the formatted result will be\n\t * returned instead.\n\t * @return {Object} A result object containing the content that was loaded, such as:\n\t * <ul>\n\t *      <li>An image tag (&lt;image /&gt;) for images</li>\n\t *      <li>A script tag for JavaScript (&lt;script /&gt;). Note that scripts are automatically added to the HTML\n\t *      DOM.</li>\n\t *      <li>A style tag for CSS (&lt;style /&gt; or &lt;link &gt;)</li>\n\t *      <li>Raw text for TEXT</li>\n\t *      <li>A formatted JavaScript object defined by JSON</li>\n\t *      <li>An XML document</li>\n\t *      <li>A binary arraybuffer loaded by XHR</li>\n\t *      <li>An audio tag (&lt;audio &gt;) for HTML audio. Note that it is recommended to use SoundJS APIs to play\n\t *      loaded audio. Specifically, audio loaded by Flash and WebAudio will return a loader object using this method\n\t *      which can not be used to play audio back.</li>\n\t * </ul>\n\t * This object is also returned via the {{#crossLink \"LoadQueue/fileload:event\"}}{{/crossLink}} event as the 'item`\n\t * parameter. Note that if a raw result is requested, but not found, the result will be returned instead.\n\t */\n\tp.getResult = function (value, rawResult) {\n\t\tvar item = this._loadItemsById[value] || this._loadItemsBySrc[value];\n\t\tif (item == null) {\n\t\t\treturn null;\n\t\t}\n\t\tvar id = item.id;\n\t\tif (rawResult && this._loadedRawResults[id]) {\n\t\t\treturn this._loadedRawResults[id];\n\t\t}\n\t\treturn this._loadedResults[id];\n\t};\n\n\t/**\n\t * Generate an list of items loaded by this queue.\n\t * @method getItems\n\t * @param {Boolean} loaded Determines if only items that have been loaded should be returned. If false, in-progress\n\t * and failed load items will also be included.\n\t * @returns {Array} A list of objects that have been loaded. Each item includes the {{#crossLink \"LoadItem\"}}{{/crossLink}},\n\t * result, and rawResult.\n\t * @since 0.6.0\n\t */\n\tp.getItems = function (loaded) {\n\t\tvar arr = [];\n\t\tfor (var n in this._loadItemsById) {\n\t\t\tvar item = this._loadItemsById[n];\n\t\t\tvar result = this.getResult(n);\n\t\t\tif (loaded === true && result == null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tarr.push({\n\t\t\t\titem: item,\n\t\t\t\tresult: result,\n\t\t\t\trawResult: this.getResult(n, true)\n\t\t\t});\n\t\t}\n\t\treturn arr;\n\t};\n\n\t/**\n\t * Pause or resume the current load. Active loads will not be cancelled, but the next items in the queue will not\n\t * be processed when active loads complete. LoadQueues are not paused by default.\n\t *\n\t * Note that if new items are added to the queue using {{#crossLink \"LoadQueue/loadFile\"}}{{/crossLink}} or\n\t * {{#crossLink \"LoadQueue/loadManifest\"}}{{/crossLink}}, a paused queue will be resumed, unless the `loadNow`\n\t * argument is `false`.\n\t * @method setPaused\n\t * @param {Boolean} value Whether the queue should be paused or not.\n\t */\n\tp.setPaused = function (value) {\n\t\tthis._paused = value;\n\t\tif (!this._paused) {\n\t\t\tthis._loadNext();\n\t\t}\n\t};\n\n\t/**\n\t * Close the active queue. Closing a queue completely empties the queue, and prevents any remaining items from\n\t * starting to download. Note that currently any active loads will remain open, and events may be processed.\n\t *\n\t * To stop and restart a queue, use the {{#crossLink \"LoadQueue/setPaused\"}}{{/crossLink}} method instead.\n\t * @method close\n\t */\n\tp.close = function () {\n\t\twhile (this._currentLoads.length) {\n\t\t\tthis._currentLoads.pop().cancel();\n\t\t}\n\t\tthis._scriptOrder.length = 0;\n\t\tthis._loadedScripts.length = 0;\n\t\tthis.loadStartWasDispatched = false;\n\t\tthis._itemCount = 0;\n\t\tthis._lastProgress = NaN;\n\t};\n\n// protected methods\n\t/**\n\t * Add an item to the queue. Items are formatted into a usable object containing all the properties necessary to\n\t * load the content. The load queue is populated with the loader instance that handles preloading, and not the load\n\t * item that was passed in by the user. To look up the load item by id or src, use the {{#crossLink \"LoadQueue.getItem\"}}{{/crossLink}}\n\t * method.\n\t * @method _addItem\n\t * @param {String|Object} value The item to add to the queue.\n\t * @param {String} [path] An optional path prepended to the `src`. The path will only be prepended if the src is\n\t * relative, and does not start with a protocol such as `http://`, or a path like `../`. If the LoadQueue was\n\t * provided a {{#crossLink \"_basePath\"}}{{/crossLink}}, then it will optionally be prepended after.\n\t * @param {String} [basePath] <strong>Deprecated</strong>An optional basePath passed into a {{#crossLink \"LoadQueue/loadManifest\"}}{{/crossLink}}\n\t * or {{#crossLink \"LoadQueue/loadFile\"}}{{/crossLink}} call. This parameter will be removed in a future tagged\n\t * version.\n\t * @private\n\t */\n\tp._addItem = function (value, path, basePath) {\n\t\tvar item = this._createLoadItem(value, path, basePath); // basePath and manifest path are added to the src.\n\t\tif (item == null) {\n\t\t\treturn;\n\t\t} // Sometimes plugins or types should be skipped.\n\t\tvar loader = this._createLoader(item);\n\t\tif (loader != null) {\n\t\t\tif (\"plugins\" in loader) {\n\t\t\t\tloader.plugins = this._plugins;\n\t\t\t}\n\t\t\titem._loader = loader;\n\t\t\tthis._loadQueue.push(loader);\n\t\t\tthis._loadQueueBackup.push(loader);\n\n\t\t\tthis._numItems++;\n\t\t\tthis._updateProgress();\n\n\t\t\t// Only worry about script order when using XHR to load scripts. Tags are only loading one at a time.\n\t\t\tif ((this.maintainScriptOrder\n\t\t\t\t\t&& item.type == createjs.Types.JAVASCRIPT\n\t\t\t\t\t\t//&& loader instanceof createjs.XHRLoader //NOTE: Have to track all JS files this way\n\t\t\t\t\t)\n\t\t\t\t\t|| item.maintainOrder === true) {\n\t\t\t\tthis._scriptOrder.push(item);\n\t\t\t\tthis._loadedScripts.push(null);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Create a refined {{#crossLink \"LoadItem\"}}{{/crossLink}}, which contains all the required properties. The type of\n\t * item is determined by browser support, requirements based on the file type, and developer settings. For example,\n\t * XHR is only used for file types that support it in new browsers.\n\t *\n\t * Before the item is returned, any plugins registered to handle the type or extension will be fired, which may\n\t * alter the load item.\n\t * @method _createLoadItem\n\t * @param {String | Object | HTMLAudioElement | HTMLImageElement} value The item that needs to be preloaded.\n\t * @param {String} [path] A path to prepend to the item's source. Sources beginning with http:// or similar will\n\t * not receive a path. Since PreloadJS 0.4.1, the src will be modified to include the `path` and {{#crossLink \"LoadQueue/_basePath:property\"}}{{/crossLink}}\n\t * when it is added.\n\t * @param {String} [basePath] <strong>Deprectated</strong> A base path to prepend to the items source in addition to\n\t * the path argument.\n\t * @return {Object} The loader instance that will be used.\n\t * @private\n\t */\n\tp._createLoadItem = function (value, path, basePath) {\n\t\tvar item = createjs.LoadItem.create(value);\n\t\tif (item == null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar bp = \"\"; // Store the generated basePath\n\t\tvar useBasePath = basePath || this._basePath;\n\n\t\tif (item.src instanceof Object) {\n\t\t\tif (!item.type) {\n\t\t\t\treturn null;\n\t\t\t} // the the src is an object, type is required to pass off to plugin\n\t\t\tif (path) {\n\t\t\t\tbp = path;\n\t\t\t\tvar pathMatch = createjs.URLUtils.parseURI(path);\n\t\t\t\t// Also append basePath\n\t\t\t\tif (useBasePath != null && !pathMatch.absolute && !pathMatch.relative) {\n\t\t\t\t\tbp = useBasePath + bp;\n\t\t\t\t}\n\t\t\t} else if (useBasePath != null) {\n\t\t\t\tbp = useBasePath;\n\t\t\t}\n\t\t} else {\n\t\t\t// Determine Extension, etc.\n\t\t\tvar match = createjs.URLUtils.parseURI(item.src);\n\t\t\tif (match.extension) {\n\t\t\t\titem.ext = match.extension;\n\t\t\t}\n\t\t\tif (item.type == null) {\n\t\t\t\titem.type = createjs.RequestUtils.getTypeByExtension(item.ext);\n\t\t\t}\n\n\t\t\t// Inject path & basePath\n\t\t\tvar autoId = item.src;\n\t\t\tif (!match.absolute && !match.relative) {\n\t\t\t\tif (path) {\n\t\t\t\t\tbp = path;\n\t\t\t\t\tvar pathMatch = createjs.URLUtils.parseURI(path);\n\t\t\t\t\tautoId = path + autoId;\n\t\t\t\t\t// Also append basePath\n\t\t\t\t\tif (useBasePath != null && !pathMatch.absolute && !pathMatch.relative) {\n\t\t\t\t\t\tbp = useBasePath + bp;\n\t\t\t\t\t}\n\t\t\t\t} else if (useBasePath != null) {\n\t\t\t\t\tbp = useBasePath;\n\t\t\t\t}\n\t\t\t}\n\t\t\titem.src = bp + item.src;\n\t\t}\n\t\titem.path = bp;\n\n\t\t// If there's no id, set one now.\n\t\tif (item.id === undefined || item.id === null || item.id === \"\") {\n\t\t\titem.id = autoId;\n\t\t}\n\n\t\t// Give plugins a chance to modify the loadItem:\n\t\tvar customHandler = this._typeCallbacks[item.type] || this._extensionCallbacks[item.ext];\n\t\tif (customHandler) {\n\t\t\t// Plugins are now passed both the full source, as well as a combined path+basePath (appropriately)\n\t\t\tvar result = customHandler.callback.call(customHandler.scope, item, this);\n\n\t\t\t// The plugin will handle the load, or has canceled it. Ignore it.\n\t\t\tif (result === false) {\n\t\t\t\treturn null;\n\n\t\t\t\t// Load as normal:\n\t\t\t} else if (result === true) {\n\t\t\t\t// Do Nothing\n\n\t\t\t\t// Result is a loader class:\n\t\t\t} else if (result != null) {\n\t\t\t\titem._loader = result;\n\t\t\t}\n\n\t\t\t// Update the extension in case the type changed:\n\t\t\tmatch = createjs.URLUtils.parseURI(item.src);\n\t\t\tif (match.extension != null) {\n\t\t\t\titem.ext = match.extension;\n\t\t\t}\n\t\t}\n\n\t\t// Store the item for lookup. This also helps clean-up later.\n\t\tthis._loadItemsById[item.id] = item;\n\t\tthis._loadItemsBySrc[item.src] = item;\n\n\t\tif (item.crossOrigin == null) {\n\t\t\titem.crossOrigin = this._crossOrigin;\n\t\t}\n\n\t\treturn item;\n\t};\n\n\t/**\n\t * Create a loader for a load item.\n\t * @method _createLoader\n\t * @param {Object} item A formatted load item that can be used to generate a loader.\n\t * @return {AbstractLoader} A loader that can be used to load content.\n\t * @private\n\t */\n\tp._createLoader = function (item) {\n\t\tif (item._loader != null) { // A plugin already specified a loader\n\t\t\treturn item._loader;\n\t\t}\n\n\t\t// Initially, try and use the provided/supported XHR mode:\n\t\tvar preferXHR = this.preferXHR;\n\n\t\tfor (var i = 0; i < this._availableLoaders.length; i++) {\n\t\t\tvar loader = this._availableLoaders[i];\n\t\t\tif (loader && loader.canLoadItem(item)) {\n\t\t\t\treturn new loader(item, preferXHR);\n\t\t\t}\n\t\t}\n\n\t\t// TODO: Log error (requires createjs.log)\n\t\treturn null;\n\t};\n\n\t/**\n\t * Load the next item in the queue. If the queue is empty (all items have been loaded), then the complete event\n\t * is processed. The queue will \"fill up\" any empty slots, up to the max connection specified using\n\t * {{#crossLink \"LoadQueue.setMaxConnections\"}}{{/crossLink}} method. The only exception is scripts that are loaded\n\t * using tags, which have to be loaded one at a time to maintain load order.\n\t * @method _loadNext\n\t * @private\n\t */\n\tp._loadNext = function () {\n\t\tif (this._paused) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Only dispatch loadstart event when the first file is loaded.\n\t\tif (!this._loadStartWasDispatched) {\n\t\t\tthis._sendLoadStart();\n\t\t\tthis._loadStartWasDispatched = true;\n\t\t}\n\n\t\t// The queue has completed.\n\t\tif (this._numItems == this._numItemsLoaded) {\n\t\t\tthis.loaded = true;\n\t\t\tthis._sendComplete();\n\n\t\t\t// Load the next queue, if it has been defined.\n\t\t\tif (this.next && this.next.load) {\n\t\t\t\tthis.next.load();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.loaded = false;\n\t\t}\n\n\t\t// Must iterate forwards to load in the right order.\n\t\tfor (var i = 0; i < this._loadQueue.length; i++) {\n\t\t\tif (this._currentLoads.length >= this._maxConnections) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar loader = this._loadQueue[i];\n\n\t\t\t// Determine if we should be only loading one tag-script at a time:\n\t\t\t// Note: maintainOrder items don't do anything here because we can hold onto their loaded value\n\t\t\tif (!this._canStartLoad(loader)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis._loadQueue.splice(i, 1);\n\t\t\ti--;\n\t\t\tthis._loadItem(loader);\n\t\t}\n\t};\n\n\t/**\n\t * Begin loading an item. Event listeners are not added to the loaders until the load starts.\n\t * @method _loadItem\n\t * @param {AbstractLoader} loader The loader instance to start. Currently, this will be an XHRLoader or TagLoader.\n\t * @private\n\t */\n\tp._loadItem = function (loader) {\n\t\tloader.on(\"fileload\", this._handleFileLoad, this);\n\t\tloader.on(\"progress\", this._handleProgress, this);\n\t\tloader.on(\"complete\", this._handleFileComplete, this);\n\t\tloader.on(\"error\", this._handleError, this);\n\t\tloader.on(\"fileerror\", this._handleFileError, this);\n\t\tthis._currentLoads.push(loader);\n\t\tthis._sendFileStart(loader.getItem());\n\t\tloader.load();\n\t};\n\n\t/**\n\t * The callback that is fired when a loader loads a file. This enables loaders like {{#crossLink \"ManifestLoader\"}}{{/crossLink}}\n\t * to maintain internal queues, but for this queue to dispatch the {{#crossLink \"fileload:event\"}}{{/crossLink}}\n\t * events.\n\t * @param {Event} event The {{#crossLink \"AbstractLoader/fileload:event\"}}{{/crossLink}} event from the loader.\n\t * @private\n\t * @since 0.6.0\n\t */\n\tp._handleFileLoad = function (event) {\n\t\tevent.target = null;\n\t\tthis.dispatchEvent(event);\n\t};\n\n\t/**\n\t * The callback that is fired when a loader encounters an error from an internal file load operation. This enables\n\t * loaders like M\n\t * @param event\n\t * @private\n\t */\n\tp._handleFileError = function (event) {\n\t\tvar newEvent = new createjs.ErrorEvent(\"FILE_LOAD_ERROR\", null, event.item);\n\t\tthis._sendError(newEvent);\n\t};\n\n\t/**\n\t * The callback that is fired when a loader encounters an error. The queue will continue loading unless {{#crossLink \"LoadQueue/stopOnError:property\"}}{{/crossLink}}\n\t * is set to `true`.\n\t * @method _handleError\n\t * @param {ErrorEvent} event The error event, containing relevant error information.\n\t * @private\n\t */\n\tp._handleError = function (event) {\n\t\tvar loader = event.target;\n\t\tthis._numItemsLoaded++;\n\n\t\tthis._finishOrderedItem(loader, true);\n\t\tthis._updateProgress();\n\n\t\tvar newEvent = new createjs.ErrorEvent(\"FILE_LOAD_ERROR\", null, loader.getItem());\n\t\t// TODO: Propagate actual error message.\n\n\t\tthis._sendError(newEvent);\n\n\t\tif (!this.stopOnError) {\n\t\t\tthis._removeLoadItem(loader);\n\t\t\tthis._cleanLoadItem(loader);\n\t\t\tthis._loadNext();\n\t\t} else {\n\t\t\tthis.setPaused(true);\n\t\t}\n\t};\n\n\t/**\n\t * An item has finished loading. We can assume that it is totally loaded, has been parsed for immediate use, and\n\t * is available as the \"result\" property on the load item. The raw text result for a parsed item (such as JSON, XML,\n\t * CSS, JavaScript, etc) is available as the \"rawResult\" property, and can also be looked up using {{#crossLink \"LoadQueue/getResult\"}}{{/crossLink}}.\n\t * @method _handleFileComplete\n\t * @param {Event} event The event object from the loader.\n\t * @private\n\t */\n\tp._handleFileComplete = function (event) {\n\t\tvar loader = event.target;\n\t\tvar item = loader.getItem();\n\n\t\tvar result = loader.getResult();\n\t\tthis._loadedResults[item.id] = result;\n\t\tvar rawResult = loader.getResult(true);\n\t\tif (rawResult != null && rawResult !== result) {\n\t\t\tthis._loadedRawResults[item.id] = rawResult;\n\t\t}\n\n\t\tthis._saveLoadedItems(loader);\n\n\t\t// Remove the load item\n\t\tthis._removeLoadItem(loader);\n\n\t\tif (!this._finishOrderedItem(loader)) {\n\t\t\t// The item was NOT managed, so process it now\n\t\t\tthis._processFinishedLoad(item, loader);\n\t\t}\n\n\t\t// Clean up the load item\n\t\tthis._cleanLoadItem(loader);\n\t};\n\n\t/**\n\t * Some loaders might load additional content, other than the item they were passed (such as {{#crossLink \"ManifestLoader\"}}{{/crossLink}}).\n\t * Any items exposed by the loader using {{#crossLink \"AbstractLoader/getLoadItems\"}}{{/crossLink}} are added to the\n\t * LoadQueue's look-ups, including {{#crossLink \"getItem\"}}{{/crossLink}} and {{#crossLink \"getResult\"}}{{/crossLink}}\n\t * methods.\n\t * @method _saveLoadedItems\n\t * @param {AbstractLoader} loader\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._saveLoadedItems = function (loader) {\n\t\t// TODO: Not sure how to handle this. Would be nice to expose the items.\n\t\t// Loaders may load sub-items. This adds them to this queue\n\t\tvar list = loader.getLoadedItems();\n\t\tif (list === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (var i = 0; i < list.length; i++) {\n\t\t\tvar item = list[i].item;\n\n\t\t\t// Store item lookups\n\t\t\tthis._loadItemsBySrc[item.src] = item;\n\t\t\tthis._loadItemsById[item.id] = item;\n\n\t\t\t// Store loaded content\n\t\t\tthis._loadedResults[item.id] = list[i].result;\n\t\t\tthis._loadedRawResults[item.id] = list[i].rawResult;\n\t\t}\n\t};\n\n\t/**\n\t * Flag an item as finished. If the item's order is being managed, then ensure that it is allowed to finish, and if\n\t * so, trigger prior items to trigger as well.\n\t * @method _finishOrderedItem\n\t * @param {AbstractLoader} loader\n\t * @param {Boolean} loadFailed\n\t * @return {Boolean} If the item's order is being managed. This allows the caller to take an alternate\n\t * behaviour if it is.\n\t * @private\n\t */\n\tp._finishOrderedItem = function (loader, loadFailed) {\n\t\tvar item = loader.getItem();\n\n\t\tif ((this.maintainScriptOrder && item.type == createjs.Types.JAVASCRIPT)\n\t\t\t\t|| item.maintainOrder) {\n\n\t\t\t//TODO: Evaluate removal of the _currentlyLoadingScript\n\t\t\tif (loader instanceof createjs.JavaScriptLoader) {\n\t\t\t\tthis._currentlyLoadingScript = false;\n\t\t\t}\n\n\t\t\tvar index = createjs.indexOf(this._scriptOrder, item);\n\t\t\tif (index == -1) {\n\t\t\t\treturn false;\n\t\t\t} // This loader no longer exists\n\t\t\tthis._loadedScripts[index] = (loadFailed === true) ? true : item;\n\n\t\t\tthis._checkScriptLoadOrder();\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Ensure the scripts load and dispatch in the correct order. When using XHR, scripts are stored in an array in the\n\t * order they were added, but with a \"null\" value. When they are completed, the value is set to the load item,\n\t * and then when they are processed and dispatched, the value is set to `true`. This method simply\n\t * iterates the array, and ensures that any loaded items that are not preceded by a `null` value are\n\t * dispatched.\n\t * @method _checkScriptLoadOrder\n\t * @private\n\t */\n\tp._checkScriptLoadOrder = function () {\n\t\tvar l = this._loadedScripts.length;\n\n\t\tfor (var i = 0; i < l; i++) {\n\t\t\tvar item = this._loadedScripts[i];\n\t\t\tif (item === null) {\n\t\t\t\tbreak;\n\t\t\t} // This is still loading. Do not process further.\n\t\t\tif (item === true) {\n\t\t\t\tcontinue;\n\t\t\t} // This has completed, and been processed. Move on.\n\n\t\t\tvar loadItem = this._loadedResults[item.id];\n\t\t\tif (item.type == createjs.Types.JAVASCRIPT) {\n\t\t\t\t// Append script tags to the head automatically.\n\t\t\t\tcreatejs.DomUtils.appendToHead(loadItem);\n\t\t\t}\n\n\t\t\tvar loader = item._loader;\n\t\t\tthis._processFinishedLoad(item, loader);\n\t\t\tthis._loadedScripts[i] = true;\n\t\t}\n\t};\n\n\t/**\n\t * A file has completed loading, and the LoadQueue can move on. This triggers the complete event, and kick-starts\n\t * the next item.\n\t * @method _processFinishedLoad\n\t * @param {LoadItem|Object} item\n\t * @param {AbstractLoader} loader\n\t * @protected\n\t */\n\tp._processFinishedLoad = function (item, loader) {\n\t\tthis._numItemsLoaded++;\n\n\t\t// Since LoadQueue needs maintain order, we can't append scripts in the loader.\n\t\t// So we do it here instead. Or in _checkScriptLoadOrder();\n\t\tif (!this.maintainScriptOrder && item.type == createjs.Types.JAVASCRIPT) {\n\t\t\tvar tag = loader.getTag();\n\t\t\tcreatejs.DomUtils.appendToHead(tag);\n\t\t}\n\n\t\tthis._updateProgress();\n\t\tthis._sendFileComplete(item, loader);\n\t\tthis._loadNext();\n\t};\n\n\t/**\n\t * Ensure items with `maintainOrder=true` that are before the specified item have loaded. This only applies to\n\t * JavaScript items that are being loaded with a TagLoader, since they have to be loaded and completed <strong>before</strong>\n\t * the script can even be started, since it exist in the DOM while loading.\n\t * @method _canStartLoad\n\t * @param {AbstractLoader} loader The loader for the item\n\t * @return {Boolean} Whether the item can start a load or not.\n\t * @private\n\t */\n\tp._canStartLoad = function (loader) {\n\t\tif (!this.maintainScriptOrder || loader.preferXHR) {\n\t\t\treturn true;\n\t\t}\n\t\tvar item = loader.getItem();\n\t\tif (item.type != createjs.Types.JAVASCRIPT) {\n\t\t\treturn true;\n\t\t}\n\t\tif (this._currentlyLoadingScript) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar index = this._scriptOrder.indexOf(item);\n\t\tvar i = 0;\n\t\twhile (i < index) {\n\t\t\tvar checkItem = this._loadedScripts[i];\n\t\t\tif (checkItem == null) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t\tthis._currentlyLoadingScript = true;\n\t\treturn true;\n\t};\n\n\t/**\n\t * A load item is completed or was canceled, and needs to be removed from the LoadQueue.\n\t * @method _removeLoadItem\n\t * @param {AbstractLoader} loader A loader instance to remove.\n\t * @private\n\t */\n\tp._removeLoadItem = function (loader) {\n\t\tvar l = this._currentLoads.length;\n\t\tfor (var i = 0; i < l; i++) {\n\t\t\tif (this._currentLoads[i] == loader) {\n\t\t\t\tthis._currentLoads.splice(i, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Remove unneeded references from a loader.\n\t *\n\t * @param loader\n\t * @private\n\t */\n\tp._cleanLoadItem = function(loader) {\n\t\tvar item = loader.getItem();\n\t\tif (item) {\n\t\t\tdelete item._loader;\n\t\t}\n\t}\n\n\t/**\n\t * An item has dispatched progress. Propagate that progress, and update the LoadQueue's overall progress.\n\t * @method _handleProgress\n\t * @param {ProgressEvent} event The progress event from the item.\n\t * @private\n\t */\n\tp._handleProgress = function (event) {\n\t\tvar loader = event.target;\n\t\tthis._sendFileProgress(loader.getItem(), loader.progress);\n\t\tthis._updateProgress();\n\t};\n\n\t/**\n\t * Overall progress has changed, so determine the new progress amount and dispatch it. This changes any time an\n\t * item dispatches progress or completes. Note that since we don't always know the actual filesize of items before\n\t * they are loaded. In this case, we define a \"slot\" for each item (1 item in 10 would get 10%), and then append\n\t * loaded progress on top of the already-loaded items.\n\t *\n\t * For example, if 5/10 items have loaded, and item 6 is 20% loaded, the total progress would be:\n\t * <ul>\n\t *      <li>5/10 of the items in the queue (50%)</li>\n\t *      <li>plus 20% of item 6's slot (2%)</li>\n\t *      <li>equals 52%</li>\n\t * </ul>\n\t * @method _updateProgress\n\t * @private\n\t */\n\tp._updateProgress = function () {\n\t\tvar loaded = this._numItemsLoaded / this._numItems; // Fully Loaded Progress\n\t\tvar remaining = this._numItems - this._numItemsLoaded;\n\t\tif (remaining > 0) {\n\t\t\tvar chunk = 0;\n\t\t\tfor (var i = 0, l = this._currentLoads.length; i < l; i++) {\n\t\t\t\tchunk += this._currentLoads[i].progress;\n\t\t\t}\n\t\t\tloaded += (chunk / remaining) * (remaining / this._numItems);\n\t\t}\n\n\t\tif (this._lastProgress != loaded) {\n\t\t\tthis._sendProgress(loaded);\n\t\t\tthis._lastProgress = loaded;\n\t\t}\n\t};\n\n\t/**\n\t * Clean out item results, to free them from memory. Mainly, the loaded item and results are cleared from internal\n\t * hashes.\n\t * @method _disposeItem\n\t * @param {LoadItem|Object} item The item that was passed in for preloading.\n\t * @private\n\t */\n\tp._disposeItem = function (item) {\n\t\tdelete this._loadedResults[item.id];\n\t\tdelete this._loadedRawResults[item.id];\n\t\tdelete this._loadItemsById[item.id];\n\t\tdelete this._loadItemsBySrc[item.src];\n\t};\n\n\t/**\n\t * Dispatch a \"fileprogress\" {{#crossLink \"Event\"}}{{/crossLink}}. Please see the LoadQueue {{#crossLink \"LoadQueue/fileprogress:event\"}}{{/crossLink}}\n\t * event for details on the event payload.\n\t * @method _sendFileProgress\n\t * @param {LoadItem|Object} item The item that is being loaded.\n\t * @param {Number} progress The amount the item has been loaded (between 0 and 1).\n\t * @protected\n\t */\n\tp._sendFileProgress = function (item, progress) {\n\t\tif (this._isCanceled() || this._paused) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this.hasEventListener(\"fileprogress\")) {\n\t\t\treturn;\n\t\t}\n\n\t\t//LM: Rework ProgressEvent to support this?\n\t\tvar event = new createjs.Event(\"fileprogress\");\n\t\tevent.progress = progress;\n\t\tevent.loaded = progress;\n\t\tevent.total = 1;\n\t\tevent.item = item;\n\n\t\tthis.dispatchEvent(event);\n\t};\n\n\t/**\n\t * Dispatch a fileload {{#crossLink \"Event\"}}{{/crossLink}}. Please see the {{#crossLink \"LoadQueue/fileload:event\"}}{{/crossLink}} event for\n\t * details on the event payload.\n\t * @method _sendFileComplete\n\t * @param {LoadItemObject} item The item that is being loaded.\n\t * @param {AbstractLoader} loader\n\t * @protected\n\t */\n\tp._sendFileComplete = function (item, loader) {\n\t\tif (this._isCanceled() || this._paused) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar event = new createjs.Event(\"fileload\");\n\t\tevent.loader = loader;\n\t\tevent.item = item;\n\t\tevent.result = this._loadedResults[item.id];\n\t\tevent.rawResult = this._loadedRawResults[item.id];\n\n\t\t// This calls a handler specified on the actual load item. Currently, the SoundJS plugin uses this.\n\t\tif (item.completeHandler) {\n\t\t\titem.completeHandler(event);\n\t\t}\n\n\t\tthis.hasEventListener(\"fileload\") && this.dispatchEvent(event);\n\t};\n\n\t/**\n\t * Dispatch a filestart {{#crossLink \"Event\"}}{{/crossLink}} immediately before a file starts to load. Please see\n\t * the {{#crossLink \"LoadQueue/filestart:event\"}}{{/crossLink}} event for details on the event payload.\n\t * @method _sendFileStart\n\t * @param {LoadItem|Object} item The item that is being loaded.\n\t * @protected\n\t */\n\tp._sendFileStart = function (item) {\n\t\tvar event = new createjs.Event(\"filestart\");\n\t\tevent.item = item;\n\t\tthis.hasEventListener(\"filestart\") && this.dispatchEvent(event);\n\t};\n\n\tp.toString = function () {\n\t\treturn \"[PreloadJS LoadQueue]\";\n\t};\n\n\tcreatejs.LoadQueue = createjs.promote(LoadQueue, \"AbstractLoader\");\n}());\n\n//##############################################################################\n// TextLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A loader for Text files.\n\t * @class TextLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @extends AbstractLoader\n\t * @constructor\n\t */\n\tfunction TextLoader(loadItem) {\n\t\tthis.AbstractLoader_constructor(loadItem, true, createjs.Types.TEXT);\n\t};\n\n\tvar p = createjs.extend(TextLoader, createjs.AbstractLoader);\n\tvar s = TextLoader;\n\n\t// static methods\n\t/**\n\t * Determines if the loader can load a specific item. This loader loads items that are of type {{#crossLink \"Types/TEXT:property\"}}{{/crossLink}},\n\t * but is also the default loader if a file type can not be determined.\n\t * @method canLoadItem\n\t * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n\t * @returns {Boolean} Whether the loader can load the item.\n\t * @static\n\t */\n\ts.canLoadItem = function (item) {\n\t\treturn item.type == createjs.Types.TEXT;\n\t};\n\n\tcreatejs.TextLoader = createjs.promote(TextLoader, \"AbstractLoader\");\n\n}());\n\n//##############################################################################\n// BinaryLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A loader for binary files. This is useful for loading web audio, or content that requires an ArrayBuffer.\n\t * @class BinaryLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @extends AbstractLoader\n\t * @constructor\n\t */\n\tfunction BinaryLoader(loadItem) {\n\t\tthis.AbstractLoader_constructor(loadItem, true, createjs.Types.BINARY);\n\t\tthis.on(\"initialize\", this._updateXHR, this);\n\t};\n\n\tvar p = createjs.extend(BinaryLoader, createjs.AbstractLoader);\n\tvar s = BinaryLoader;\n\n\t// static methods\n\t/**\n\t * Determines if the loader can load a specific item. This loader can only load items that are of type\n\t * {{#crossLink \"Types/BINARY:property\"}}{{/crossLink}}\n\t * @method canLoadItem\n\t * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n\t * @returns {Boolean} Whether the loader can load the item.\n\t * @static\n\t */\n\ts.canLoadItem = function (item) {\n\t\treturn item.type == createjs.Types.BINARY;\n\t};\n\n\t// private methods\n\t/**\n\t * Before the item loads, set the response type to \"arraybuffer\"\n\t * @property _updateXHR\n\t * @param {Event} event\n\t * @private\n\t */\n\tp._updateXHR = function (event) {\n\t\tevent.loader.setResponseType(\"arraybuffer\");\n\t};\n\n\tcreatejs.BinaryLoader = createjs.promote(BinaryLoader, \"AbstractLoader\");\n\n}());\n\n//##############################################################################\n// CSSLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A loader for CSS files.\n\t * @class CSSLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @param {Boolean} preferXHR\n\t * @extends AbstractLoader\n\t * @constructor\n\t */\n\tfunction CSSLoader(loadItem, preferXHR) {\n\t\tthis.AbstractLoader_constructor(loadItem, preferXHR, createjs.Types.CSS);\n\n\t\t// public properties\n\t\tthis.resultFormatter = this._formatResult;\n\n\t\t// protected properties\n\t\tthis._tagSrcAttribute = \"href\";\n\n\t\tif (preferXHR) {\n\t\t\tthis._tag = createjs.Elements.style();\n\t\t} else {\n\t\t\tthis._tag = createjs.Elements.link();\n\t\t}\n\n\t\tthis._tag.rel = \"stylesheet\";\n\t\tthis._tag.type = \"text/css\";\n\t};\n\n\tvar p = createjs.extend(CSSLoader, createjs.AbstractLoader);\n\tvar s = CSSLoader;\n\n\t// static methods\n\t/**\n\t * Determines if the loader can load a specific item. This loader can only load items that are of type\n\t * {{#crossLink \"Types/CSS:property\"}}{{/crossLink}}.\n\t * @method canLoadItem\n\t * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n\t * @returns {Boolean} Whether the loader can load the item.\n\t * @static\n\t */\n\ts.canLoadItem = function (item) {\n\t\treturn item.type == createjs.Types.CSS;\n\t};\n\n\t// protected methods\n\t/**\n\t * The result formatter for CSS files.\n\t * @method _formatResult\n\t * @param {AbstractLoader} loader\n\t * @returns {HTMLLinkElement|HTMLStyleElement}\n\t * @private\n\t */\n\tp._formatResult = function (loader) {\n\t\tif (this._preferXHR) {\n\t\t\tvar tag = loader.getTag();\n\n\t\t\tif (tag.styleSheet) { // IE\n\t\t\t\ttag.styleSheet.cssText = loader.getResult(true);\n\t\t\t} else {\n\t\t\t\tvar textNode = createjs.Elements.text(loader.getResult(true));\n\t\t\t\ttag.appendChild(textNode);\n\t\t\t}\n\t\t} else {\n\t\t\ttag = this._tag;\n\t\t}\n\n\t\tcreatejs.DomUtils.appendToHead(tag);\n\n\t\treturn tag;\n\t};\n\n\tcreatejs.CSSLoader = createjs.promote(CSSLoader, \"AbstractLoader\");\n\n}());\n\n//##############################################################################\n// FontLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n// constructor:\n\t/**\n\t * A loader that handles font files, CSS definitions, and CSS paths. FontLoader doesn't actually preload fonts\n\t * themselves, but rather generates CSS definitions, and then tests the size changes on an HTML5 Canvas element.\n\t *\n\t * Note that FontLoader does not support tag-based loading due to the requirement that CSS be read to determine the\n\t * font definitions to test for.\n\t * @class FontLoader\n\t * @param {LoadItem|object|string} loadItem The item to be loaded.\n\t * @extends AbstractLoader\n\t * @constructor\n\t **/\n\tfunction FontLoader(loadItem, preferXHR) {\n\t\tthis.AbstractLoader_constructor(loadItem, preferXHR, loadItem.type);\n\n\t\t// private properties:\n\t\t/**\n\t\t * A lookup of font faces to load.\n\t\t * @property _faces\n\t\t * @protected\n\t\t * @type Object\n\t\t **/\n\t\tthis._faces = {};\n\n\t\t/**\n\t\t * A list of font faces currently being \"watched\". Watched fonts will be tested on a regular interval, and be\n\t\t * removed from this list when they are complete.\n\t\t * @oroperty _watched\n\t\t * @type {Array}\n\t\t * @protected\n\t\t */\n\t\tthis._watched = [];\n\n\t\t/**\n\t\t * A count of the total font faces to load.\n\t\t * @property _count\n\t\t * @type {number}\n\t\t * @protected\n\t\t * @default 0\n\t\t */\n\t\tthis._count = 0;\n\n\t\t/**\n\t\t * The interval for checking if fonts have been loaded.\n\t\t * @property _watchInterval\n\t\t * @type {Number}\n\t\t * @protected\n\t\t */\n\t\tthis._watchInterval = null;\n\n\t\t/**\n\t\t * The timeout for determining if a font can't be loaded. Uses the LoadItem {{#crossLink \"LoadImte/timeout:property\"}}{{/crossLink}}\n\t\t * value.\n\t\t * @property _loadTimeout\n\t\t * @type {Number}\n\t\t * @protected\n\t\t */\n\t\tthis._loadTimeout = null;\n\t\t/**\n\t\t * Determines if generated CSS should be injected into the document.\n\t\t * @property _injectCSS\n\t\t * @type {boolean}\n\t\t * @protected\n\t\t */\n\t\tthis._injectCSS = (loadItem.injectCSS === undefined) ? true : loadItem.injectCSS;\n\n\t\tthis.dispatchEvent(\"initialize\");\n\t}\n\tvar p = createjs.extend(FontLoader, createjs.AbstractLoader);\n    \n    /**\n     * Determines if the loader can load a specific item. This loader can only load items that are of type\n     * {{#crossLink \"Types/FONT:property\"}}{{/crossLink}}.\n     * @method canLoadItem\n     * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n     * @returns {Boolean} Whether the loader can load the item.\n     * @static\n     */\n    FontLoader.canLoadItem = function (item) {\n        return item.type == createjs.Types.FONT || item.type == createjs.Types.FONTCSS;\n    };\n\n// static properties:\n\t/**\n\t * Sample text used by the FontLoader to determine if the font has been loaded. The sample text size is compared\n\t * to the loaded font size, and a change indicates that the font has completed.\n\t * @property sampleText\n\t * @type {String}\n\t * @default abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ\n\t * @static\n\t * @private\n\t */\n\tFontLoader.sampleText = \"abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\n\t/**\n\t * The canvas context used to test the font size. Note that this currently requires an HTML DOM.\n\t * @property _ctx\n\t * @type {CanvasRenderingContext2D}\n\t * @static\n\t * @private\n\t */\n\tFontLoader._ctx = document.createElement(\"canvas\").getContext(\"2d\"); // TODO: Consider a method to do this like EaselJS Stage has.\n\n\t/**\n\t * A list of reference fonts to test. Multiple faces are tested to address the rare case of a loaded font being the\n\t * exact same dimensions as the test font.\n\t * @property _referenceFonts\n\t * @type {Array}\n\t * @default [\"serif\", \"monospace\"]\n\t * @private\n\t */\n\tFontLoader._referenceFonts = [\"serif\",\"monospace\"];\n\n\t/**\n\t * A regular expression that pulls out possible style values from the font name.\n\t * <ul>\n\t *     <li>This includes font names that include thin, normal, book, regular, medium, black, and heavy (such as\n\t *     \"Arial Black\")</li>\n\t *     <li>Weight modifiers including extra, ultra, semi, demi, light, and bold (such as \"WorkSans SemiBold\")</li>\n\t * </ul>\n\t *\n\t * Weight descriptions map to font weight values by default using the following (from\n\t * http://www.w3.org/TR/css3-fonts/#font-weight-numeric-values):\n\t * <ul>\n\t *     <li>100 - Thin</li>\n\t * \t   <li>200 - Extra Light, Ultra Light</li>\n\t *     <li>300 - Light, Semi Light, Demi Light</li>\n\t *     <li>400 - Normal, Book, Regular</li>\n\t *     <li>500 - Medium</li>\n\t *     <li>600 - Semi Bold, Demi Bold</li>\n\t *     <li>700 - Bold</li>\n\t *     <li>800 - Extra Bold, Ultra Bold</li>\n\t *     <li>900 - Black, Heavy</li>\n\t * </ul>\n\t * @property WEIGHT_REGEX\n\t * @type {RegExp}\n\t * @static\n\t */\n\tFontLoader.WEIGHT_REGEX = /[- ._]*(thin|normal|book|regular|medium|black|heavy|[1-9]00|(?:extra|ultra|semi|demi)?[- ._]*(?:light|bold))[- ._]*/ig;\n\n\t/**\n\t * A regular expression that pulls out possible style values from the font name. These include \"italic\"\n\t * and \"oblique\".\n\t * @property STYLE_REGEX\n\t * @type {RegExp}\n\t * @static\n\t */\n\tFontLoader.STYLE_REGEX = /[- ._]*(italic|oblique)[- ._]*/ig;\n\n\t/**\n\t * A lookup of font types for generating a CSS definition. For example, TTF fonts requires a \"truetype\" type.\n\t * @property FONT_FORMAT\n\t * @type {Object}\n\t * @static\n\t */\n\tFontLoader.FONT_FORMAT = {woff2:\"woff2\", woff:\"woff\", ttf:\"truetype\", otf:\"truetype\"};\n\n\t/**\n\t * A lookup of font weights based on a name. These values are from http://www.w3.org/TR/css3-fonts/#font-weight-numeric-values.\n\t * @property FONT_WEIGHT\n\t * @type {Object}\n\t * @static\n\t */\n\tFontLoader.FONT_WEIGHT = {thin:100, extralight:200, ultralight:200, light:300, semilight:300, demilight:300, book:\"normal\", regular:\"normal\", semibold:600, demibold:600, extrabold:800, ultrabold:800, black:900, heavy:900};\n\n\t/**\n\t * The frequency in milliseconds to check for loaded fonts.\n\t * @property WATCH_DURATION\n\t * @type {number}\n\t * @default 10\n\t * @static\n\t */\n\tFontLoader.WATCH_DURATION = 10;\n// public methods:\n\tp.load = function() {\n\t\tif (this.type == createjs.Types.FONTCSS) {\n\t\t\tvar loaded = this._watchCSS();\n\n\t\t\t// If the CSS is not ready, it will create a request, which AbstractLoader can handle.\n\t\t\tif (!loaded) {\n\t\t\t\tthis.AbstractLoader_load();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t} else if (this._item.src instanceof Array) {\n\t\t\tthis._watchFontArray();\n\t\t} else {\n\t\t\tvar def = this._defFromSrc(this._item.src);\n\t\t\tthis._watchFont(def);\n\t\t\tthis._injectStyleTag(this._cssFromDef(def));\n\t\t}\n\n\t\tthis._loadTimeout = setTimeout(createjs.proxy(this._handleTimeout, this), this._item.loadTimeout);\n\n\t\tthis.dispatchEvent(\"loadstart\");\n\t};\n\n\t/**\n\t * The font load has timed out. This is called via a <code>setTimeout</code>.\n\t * callback.\n\t * @method _handleTimeout\n\t * @protected\n\t */\n\tp._handleTimeout = function () {\n\t\tthis._stopWatching();\n\t\tthis.dispatchEvent(new createjs.ErrorEvent(\"PRELOAD_TIMEOUT\"));\n\t};\n\n\t// WatchCSS does the work for us, and provides a modified src.\n\tp._createRequest = function() {\n\t\treturn this._request;\n\t};\n\n\t// Events come from the internal XHR loader.\n\tp.handleEvent = function (event) {\n\t\tswitch (event.type) {\n\t\t\tcase \"complete\":\n\t\t\t\tthis._rawResult = event.target._response;\n\t\t\t\tthis._result = true;\n\t\t\t\tthis._parseCSS(this._rawResult);\n\t\t\t\tbreak;\n\n\t\t\tcase \"error\":\n\t\t\t\tthis._stopWatching();\n\t\t\t\tthis.AbstractLoader_handleEvent(event);\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n// private methods:\n\t/**\n\t * Determine if the provided CSS is a string definition, CSS HTML element, or a CSS file URI. Depending on the\n\t * format, the CSS will be parsed, or loaded.\n\t * @method _watchCSS\n\t * @returns {boolean} Whether or not the CSS is ready\n\t * @protected\n\t */\n\tp._watchCSS = function() {\n\t\tvar src = this._item.src;\n\n\t\t// An HTMLElement was passed in. Just use it.\n\t\tif (src instanceof HTMLStyleElement) {\n\t\t\tif (this._injectCSS && !src.parentNode) { (document.head || document.getElementsByTagName('head')[0]).appendChild(src); }\n\t\t\tthis._injectCSS = false;\n\t\t\tsrc = \"\\n\"+src.textContent;\n\t\t}\n\n\t\t// A CSS string was passed in. Parse and use it\n\t\tif (src.search(/\\n|\\r|@font-face/i) !== -1) { // css string.\n\t\t\tthis._parseCSS(src);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Load a CSS Path. Note that we CAN NOT load it without XHR because we need to read the CSS definition\n\t\tthis._request = new createjs.XHRRequest(this._item);\n\t\treturn false;\n\t};\n\n\t/**\n\t * Parse a CSS string to determine the fonts to load.\n\t * @method _parseCSS\n\t * @param {String} css The CSS string to parse\n\t * @protected\n\t */\n\tp._parseCSS = function(css) {\n\t\tvar regex = /@font-face\\s*\\{([^}]+)}/g\n\t\twhile (true) {\n\t\t\tvar result = regex.exec(css);\n\t\t\tif (!result) { break; }\n\t\t\tthis._watchFont(this._parseFontFace(result[1]));\n\t\t}\n\t\tthis._injectStyleTag(css);\n\t};\n\n\t/**\n\t * The provided fonts were an array of object or string definitions. Parse them, and inject any that are ready.\n\t * @method _watchFontArray\n\t * @protected\n\t */\n\tp._watchFontArray = function() {\n\t\tvar arr = this._item.src, css = \"\", def;\n\t\tfor (var i=arr.length-1; i>=0; i--) {\n\t\t\tvar o = arr[i];\n\t\t\tif (typeof o === \"string\") { def = this._defFromSrc(o) }\n\t\t\telse { def = this._defFromObj(o); }\n\t\t\tthis._watchFont(def);\n\t\t\tcss += this._cssFromDef(def)+\"\\n\";\n\t\t}\n\t\tthis._injectStyleTag(css);\n\t};\n\n\t/**\n\t * Inject any style definitions into the document head. This is necessary when the definition is just a string or\n\t * object definition in order for the styles to be applied to the document. If the loaded fonts are already HTML CSS\n\t * elements, they don't need to be appended again.\n\t * @method _injectStyleTag\n\t * @param {String} css The CSS string content to be appended to the\n\t * @protected\n\t */\n\tp._injectStyleTag = function(css) {\n\t\tif (!this._injectCSS) { return; }\n\t\tvar head = document.head || document.getElementsByTagName('head')[0];\n\t\tvar styleTag = document.createElement(\"style\");\n\t\tstyleTag.type = \"text/css\";\n\t\tif (styleTag.styleSheet){\n\t\t\tstyleTag.styleSheet.cssText = css;\n\t\t} else {\n\t\t\tstyleTag.appendChild(document.createTextNode(css));\n\t\t}\n\t\thead.appendChild(styleTag);\n\t};\n\n\t/**\n\t * Determine the font face from a CSS definition.\n\t * @method _parseFontFace\n\t * @param {String} str The CSS string definition\n\t * @protected\n\t * @return {String} A modified CSS object containing family name, src, style, and weight\n\t */\n\tp._parseFontFace = function(str) {\n\t\tvar family = this._getCSSValue(str, \"font-family\"), src = this._getCSSValue(str, \"src\");\n\t\tif (!family || !src) { return null; }\n\t\treturn this._defFromObj({\n\t\t\tfamily: family,\n\t\t\tsrc: src,\n\t\t\tstyle: this._getCSSValue(str, \"font-style\"),\n\t\t\tweight: this._getCSSValue(str, \"font-weight\")\n\t\t});\n\t};\n\n\t/**\n\t * Add a font to the list of fonts currently being watched. If the font is already watched or loaded, it won't be\n\t * added again.\n\t * @method _watchFont\n\t * @param {Object} def The font definition\n\t * @protected\n\t */\n\tp._watchFont = function(def) {\n\t\tif (!def || this._faces[def.id]) { return; }\n\t\tthis._faces[def.id] = def;\n\t\tthis._watched.push(def);\n\t\tthis._count++;\n\n\t\tthis._calculateReferenceSizes(def);\n\t\tthis._startWatching();\n\t};\n\n\t/**\n\t * Create a interval to check for loaded fonts. Only one interval is used for all fonts. The fonts are checked based\n\t * on the {{#crossLink \"FontLoader/WATCH_DURATION:property\"}}{{/crossLink}}.\n\t * @method _startWatching\n\t * @protected\n\t */\n\tp._startWatching = function() {\n\t\tif (this._watchInterval != null) { return; }\n\t\tthis._watchInterval = setInterval(createjs.proxy(this._watch, this), FontLoader.WATCH_DURATION);\n\t};\n\n\t/**\n\t * Clear the interval used to check fonts. This happens when all fonts are loaded, or an error occurs, such as a\n\t * CSS file error, or a load timeout.\n\t * @method _stopWatching\n\t * @protected\n\t */\n\tp._stopWatching = function() {\n\t\tclearInterval(this._watchInterval);\n\t\tclearTimeout(this._loadTimeout);\n\t\tthis._watchInterval = null;\n\t};\n\n\t/**\n\t * Check all the fonts that have not been loaded. The fonts are drawn to a canvas in memory, and if their font size\n\t * varies from the default text size, then the font is considered loaded.\n\t *\n\t * A {{#crossLink \"AbstractLoader/fileload\"}}{{/crossLink}} event will be dispatched when each file is loaded, along\n\t * with the font family name as the `item` value. A {{#crossLink \"ProgressEvent\"}}{{/crossLink}} is dispatched a\n\t * maximum of one time per check when any fonts are loaded, with the {{#crossLink \"ProgressEvent/progress:property\"}}{{/crossLink}}\n\t * value showing the percentage of fonts that have loaded.\n\t * @method _watch\n\t * @protected\n\t */\n\tp._watch = function() {\n\t\tvar defs = this._watched, refFonts = FontLoader._referenceFonts, l = defs.length;\n\t\tfor (var i = l - 1; i >= 0; i--) {\n\t\t\tvar def = defs[i], refs = def.refs;\n\t\t\tfor (var j = refs.length - 1; j >= 0; j--) {\n\t\t\t\tvar w = this._getTextWidth(def.family + \",\" + refFonts[j], def.weight, def.style);\n\t\t\t\tif (w != refs[j]) {\n\t\t\t\t\tvar event = new createjs.Event(\"fileload\");\n\t\t\t\t\tdef.type = \"font-family\";\n\t\t\t\t\tevent.item = def;\n\t\t\t\t\tthis.dispatchEvent(event);\n\t\t\t\t\tdefs.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (l !== defs.length) {\n\t\t\tvar event = new createjs.ProgressEvent(this._count-defs.length, this._count);\n\t\t\tthis.dispatchEvent(event);\n\t\t}\n\t\tif (l === 0) {\n\t\t\tthis._stopWatching();\n\t\t\tthis._sendComplete();\n\t\t}\n\t};\n\n\t/**\n\t * Determine the default size of the reference fonts used to compare against loaded fonts.\n\t * @method _calculateReferenceSizes\n\t * @param {Object} def The font definition to get the size of.\n\t * @protected\n\t */\n\tp._calculateReferenceSizes = function(def) {\n\t\tvar refFonts = FontLoader._referenceFonts;\n\t\tvar refs = def.refs = [];\n\t\tfor (var i=0; i<refFonts.length; i++) {\n\t\t\trefs[i] = this._getTextWidth(refFonts[i], def.weight, def.style);\n\t\t}\n\t};\n\n\t/**\n\t * Get a CSS definition from a font source and name.\n\t * @method _defFromSrc\n\t * @param {String} src The font source\n\t * @protected\n\t */\n\tp._defFromSrc = function(src) {\n\t\tvar re = /[- ._]+/g, name = src, ext = null, index;\n\t\t\n\t\tindex = name.search(/[?#]/);\n\t\tif (index !== -1) {\n\t\t\tname = name.substr(0,index);\n\t\t}\n\t\tindex = name.lastIndexOf(\".\");\n\t\tif (index !== -1) {\n\t\t\text = name.substr(index+1);\n\t\t\tname = name.substr(0,index);\n\t\t}\n\t\tindex = name.lastIndexOf(\"/\");\n\t\tif (index !== -1) {\n\t\t\tname = name.substr(index+1);\n\t\t}\n\t\t\n\t\tvar family = name,\n\t\t\t\tweight = family.match(FontLoader.WEIGHT_REGEX);\n\t\tif (weight) {\n\t\t\tweight = weight[0];\n\t\t\tfamily = family.replace(weight, \"\");\n\t\t\tweight = weight.replace(re, \"\").toLowerCase();\n\t\t}\n\t\tvar style = name.match(FontLoader.STYLE_REGEX);\n\t\tif (style) {\n\t\t\tfamily = family.replace(style[0], \"\");\n\t\t\tstyle = \"italic\";\n\t\t}\n\t\tfamily = family.replace(re, \"\");\n\t\t\n\t\tvar cssSrc = \"local('\"+name.replace(re,\" \")+\"'), url('\"+src+\"')\";\n\t\tvar format = FontLoader.FONT_FORMAT[ext];\n\t\tif (format) { cssSrc += \" format('\"+format+\"')\"; }\n\t\t\n\t\treturn this._defFromObj({\n\t\t\tfamily: family,\n\t\t\tweight: FontLoader.FONT_WEIGHT[weight]||weight,\n\t\t\tstyle: style,\n\t\t\tsrc: cssSrc\n\t\t});\n\t};\n\n\t/**\n\t * Get a font definition from a raw font object.\n\t * @method _defFromObj\n\t * @param {Object} o A raw object provided to the FontLoader\n\t * @returns {Object} A standard font object that the FontLoader understands\n\t * @protected\n\t */\n\tp._defFromObj = function(o) {\n\t\tvar def = {\n\t\t\tfamily: o.family,\n\t\t\tsrc: o.src,\n\t\t\tstyle: o.style || \"normal\",\n\t\t\tweight: o.weight || \"normal\"\n\t\t};\n\t\tdef.id = def.family + \";\" + def.style + \";\" + def.weight;\n\t\treturn def;\n\t};\n\n\t/**\n\t * Get CSS from a font definition.\n\t * @method _cssFromDef\n\t * @param {Object} def A font definition\n\t * @returns {string} A CSS string representing the object\n\t * @protected\n\t */\n\tp._cssFromDef = function(def) {\n\t\treturn \"@font-face {\\n\" +\n\t\t\t\"\\tfont-family: '\"+def.family+\"';\\n\" +\n\t\t\t\"\\tfont-style: \"+def.style+\";\\n\" +\n\t\t\t\"\\tfont-weight: \"+def.weight+\";\\n\" +\n\t\t\t\"\\tsrc: \"+def.src+\";\\n\" +\n\t\t\t\"}\";\n\t};\n\n\t/**\n\t * Get the text width of text using the family, weight, and style\n\t * @method _getTextWidth\n\t * @param {String} family The font family\n\t * @param {String} weight The font weight\n\t * @param {String} style The font style\n\t * @returns {Number} The pixel measurement of the font.\n\t * @protected\n\t */\n\tp._getTextWidth = function(family, weight, style) {\n\t\tvar ctx = FontLoader._ctx;\n\t\tctx.font = style+\" \"+weight+\" 72px \"+family;\n\t\treturn ctx.measureText(FontLoader.sampleText).width;\n\t};\n\n\t/**\n\t * Get the value of a property from a CSS string. For example, searches a CSS string for the value of the\n\t * \"font-family\" property.\n\t * @method _getCSSValue\n\t * @param {String} str The CSS string to search\n\t * @param {String} propName The property name to get the value for\n\t * @returns {String} The value in the CSS for the provided property name\n\t * @protected\n\t */\n\tp._getCSSValue = function(str, propName) {\n\t\tvar regex = new RegExp(propName+\":\\s*([^;}]+?)\\s*[;}]\");\n\t\tvar result = regex.exec(str);\n\t\tif (!result || !result[1]) { return null; }\n\t\treturn result[1];\n\t};\n\n\tcreatejs.FontLoader = createjs.promote(FontLoader, \"AbstractLoader\");\n\n})();\n\n//##############################################################################\n// ImageLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A loader for image files.\n\t * @class ImageLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @param {Boolean} preferXHR\n\t * @extends AbstractLoader\n\t * @constructor\n\t */\n\tfunction ImageLoader (loadItem, preferXHR) {\n\t\tthis.AbstractLoader_constructor(loadItem, preferXHR, createjs.Types.IMAGE);\n\n\t\t// public properties\n\t\tthis.resultFormatter = this._formatResult;\n\n\t\t// protected properties\n\t\tthis._tagSrcAttribute = \"src\";\n\n\t\t// Check if the preload item is already a tag.\n\t\tif (createjs.DomUtils.isImageTag(loadItem)) {\n\t\t\tthis._tag = loadItem;\n\t\t} else if (createjs.DomUtils.isImageTag(loadItem.src)) {\n\t\t\tthis._tag = loadItem.src;\n\t\t} else if (createjs.DomUtils.isImageTag(loadItem.tag)) {\n\t\t\tthis._tag = loadItem.tag;\n\t\t}\n\n\t\tif (this._tag != null) {\n\t\t\tthis._preferXHR = false;\n\t\t} else {\n\t\t\tthis._tag = createjs.Elements.img();\n\t\t}\n\n\t\tthis.on(\"initialize\", this._updateXHR, this);\n\t};\n\n\tvar p = createjs.extend(ImageLoader, createjs.AbstractLoader);\n\tvar s = ImageLoader;\n\n\t// static methods\n\t/**\n\t * Determines if the loader can load a specific item. This loader can only load items that are of type\n\t * {{#crossLink \"Types/IMAGE:property\"}}{{/crossLink}}.\n\t * @method canLoadItem\n\t * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n\t * @returns {Boolean} Whether the loader can load the item.\n\t * @static\n\t */\n\ts.canLoadItem = function (item) {\n\t\treturn item.type == createjs.Types.IMAGE;\n\t};\n\n\t// public methods\n\tp.load = function () {\n\t\tif (this._tag.src != \"\" && this._tag.complete) {\n\t\t\tthis._sendComplete();\n\t\t\treturn;\n\t\t}\n\n\t\tvar crossOrigin = this._item.crossOrigin;\n\t\tif (crossOrigin == true) { crossOrigin = \"Anonymous\"; }\n\t\tif (crossOrigin != null && !createjs.URLUtils.isLocal(this._item)) {\n\t\t\tthis._tag.crossOrigin = crossOrigin;\n\t\t}\n\n\t\tthis.AbstractLoader_load();\n\t};\n\n\t// protected methods\n\t/**\n\t * Before the item loads, set its mimeType and responseType.\n\t * @property _updateXHR\n\t * @param {Event} event\n\t * @private\n\t */\n\tp._updateXHR = function (event) {\n\t\tevent.loader.mimeType = 'text/plain; charset=x-user-defined-binary';\n\n\t\t// Only exists for XHR\n\t\tif (event.loader.setResponseType) {\n\t\t\tevent.loader.setResponseType(\"blob\");\n\t\t}\n\t};\n\n\t/**\n\t * The result formatter for Image files.\n\t * @method _formatResult\n\t * @param {AbstractLoader} loader\n\t * @returns {HTMLImageElement}\n\t * @private\n\t */\n\tp._formatResult = function (loader) {\n\t\treturn this._formatImage;\n\t};\n\n\t/**\n\t * The asynchronous image formatter function. This is required because images have\n\t * a short delay before they are ready.\n\t * @method _formatImage\n\t * @param {Function} successCallback The method to call when the result has finished formatting\n\t * @param {Function} errorCallback The method to call if an error occurs during formatting\n\t * @private\n\t */\n\tp._formatImage = function (successCallback, errorCallback) {\n\t\tvar tag = this._tag;\n\t\tvar URL = window.URL || window.webkitURL;\n\n\t\tif (!this._preferXHR) {\n\n\t\t\t//document.body.removeChild(tag);\n\t\t} else if (URL) {\n\t\t\tvar objURL = URL.createObjectURL(this.getResult(true));\n\t\t\ttag.src = objURL;\n\n\t\t\ttag.addEventListener(\"load\", this._cleanUpURL, false);\n\t\t\ttag.addEventListener(\"error\", this._cleanUpURL, false);\n\t\t} else {\n\t\t\ttag.src = this._item.src;\n\t\t}\n\n\t\tif (tag.complete) {\n\t\t\tsuccessCallback(tag);\n\t\t} else {\n            tag.onload = createjs.proxy(function() {\n                successCallback(this._tag);\n                tag.onload = tag.onerror = null;\n            }, this);\n\n            tag.onerror = createjs.proxy(function(event) {\n                errorCallback(new createjs.ErrorEvent('IMAGE_FORMAT', null, event));\n                tag.onload = tag.onerror = null;\n            }, this);\n\t\t}\n\t};\n\n\t/**\n\t * Clean up the ObjectURL, the tag is done with it. Note that this function is run\n\t * as an event listener without a proxy/closure, as it doesn't require it - so do not\n\t * include any functionality that requires scope without changing it.\n\t * @method _cleanUpURL\n\t * @param event\n\t * @private\n\t */\n\tp._cleanUpURL = function (event) {\n\t\tvar URL = window.URL || window.webkitURL;\n\t\tURL.revokeObjectURL(event.target.src);\n\t};\n\n\tcreatejs.ImageLoader = createjs.promote(ImageLoader, \"AbstractLoader\");\n\n}());\n\n//##############################################################################\n// JavaScriptLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A loader for JavaScript files.\n\t * @class JavaScriptLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @param {Boolean} preferXHR\n\t * @extends AbstractLoader\n\t * @constructor\n\t */\n\tfunction JavaScriptLoader(loadItem, preferXHR) {\n\t\tthis.AbstractLoader_constructor(loadItem, preferXHR, createjs.Types.JAVASCRIPT);\n\n\t\t// public properties\n\t\tthis.resultFormatter = this._formatResult;\n\n\t\t// protected properties\n\t\tthis._tagSrcAttribute = \"src\";\n\t\tthis.setTag(createjs.Elements.script());\n\t};\n\n\tvar p = createjs.extend(JavaScriptLoader, createjs.AbstractLoader);\n\tvar s = JavaScriptLoader;\n\n\t// static methods\n\t/**\n\t * Determines if the loader can load a specific item. This loader can only load items that are of type\n\t * {{#crossLink \"Types/JAVASCRIPT:property\"}}{{/crossLink}}\n\t * @method canLoadItem\n\t * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n\t * @returns {Boolean} Whether the loader can load the item.\n\t * @static\n\t */\n\ts.canLoadItem = function (item) {\n\t\treturn item.type == createjs.Types.JAVASCRIPT;\n\t};\n\n\t// protected methods\n\t/**\n\t * The result formatter for JavaScript files.\n\t * @method _formatResult\n\t * @param {AbstractLoader} loader\n\t * @returns {HTMLLinkElement|HTMLStyleElement}\n\t * @private\n\t */\n\tp._formatResult = function (loader) {\n\t\tvar tag = loader.getTag();\n\t\tif (this._preferXHR) {\n\t\t\ttag.text = loader.getResult(true);\n\t\t}\n\t\treturn tag;\n\t};\n\n\tcreatejs.JavaScriptLoader = createjs.promote(JavaScriptLoader, \"AbstractLoader\");\n\n}());\n\n//##############################################################################\n// JSONLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A loader for JSON files. To load JSON cross-domain, use JSONP and the {{#crossLink \"JSONPLoader\"}}{{/crossLink}}\n\t * instead. To load JSON-formatted manifests, use {{#crossLink \"ManifestLoader\"}}{{/crossLink}}, and to\n\t * load EaselJS SpriteSheets, use {{#crossLink \"SpriteSheetLoader\"}}{{/crossLink}}.\n\t * @class JSONLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @extends AbstractLoader\n\t * @constructor\n\t */\n\tfunction JSONLoader(loadItem) {\n\t\tthis.AbstractLoader_constructor(loadItem, true, createjs.Types.JSON);\n\n\t\t// public properties\n\t\tthis.resultFormatter = this._formatResult;\n\t};\n\n\tvar p = createjs.extend(JSONLoader, createjs.AbstractLoader);\n\tvar s = JSONLoader;\n\n\t// static methods\n\t/**\n\t * Determines if the loader can load a specific item. This loader can only load items that are of type\n\t * {{#crossLink \"Types/JSON:property\"}}{{/crossLink}}.\n\t * @method canLoadItem\n\t * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n\t * @returns {Boolean} Whether the loader can load the item.\n\t * @static\n\t */\n\ts.canLoadItem = function (item) {\n\t\treturn item.type == createjs.Types.JSON;\n\t};\n\n\t// protected methods\n\t/**\n\t * The result formatter for JSON files.\n\t * @method _formatResult\n\t * @param {AbstractLoader} loader\n\t * @returns {HTMLLinkElement|HTMLStyleElement}\n\t * @private\n\t */\n\tp._formatResult = function (loader) {\n\t\tvar json = null;\n\t\ttry {\n\t\t\tjson = createjs.DataUtils.parseJSON(loader.getResult(true));\n\t\t} catch (e) {\n\t\t\tvar event = new createjs.ErrorEvent(\"JSON_FORMAT\", null, e);\n\t\t\tthis._sendError(event);\n\t\t\treturn e;\n\t\t}\n\n\t\treturn json;\n\t};\n\n\tcreatejs.JSONLoader = createjs.promote(JSONLoader, \"AbstractLoader\");\n\n}());\n\n//##############################################################################\n// JSONPLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A loader for JSONP files, which are JSON-formatted text files, wrapped in a callback. To load regular JSON\n\t * without a callback use the {{#crossLink \"JSONLoader\"}}{{/crossLink}} instead. To load JSON-formatted manifests,\n\t * use {{#crossLink \"ManifestLoader\"}}{{/crossLink}}, and to load EaselJS SpriteSheets, use\n\t * {{#crossLink \"SpriteSheetLoader\"}}{{/crossLink}}.\n\t *\n\t * JSONP is a format that provides a solution for loading JSON files cross-domain <em>without</em> requiring CORS.\n\t * JSONP files are loaded as JavaScript, and the \"callback\" is executed once they are loaded. The callback in the\n\t * JSONP must match the callback passed to the loadItem.\n\t *\n\t * <h4>Example JSONP</h4>\n\t *\n\t * \t\tcallbackName({\n\t * \t\t\t\"name\": \"value\",\n\t *\t \t\t\"num\": 3,\n\t *\t\t\t\"obj\": { \"bool\":true }\n\t * \t\t});\n\t *\n\t * <h4>Example</h4>\n\t *\n\t * \t\tvar loadItem = {id:\"json\", type:\"jsonp\", src:\"http://server.com/text.json\", callback:\"callbackName\"}\n\t * \t\tvar queue = new createjs.LoadQueue();\n\t * \t\tqueue.on(\"complete\", handleComplete);\n\t * \t\tqueue.loadItem(loadItem);\n\t *\n\t * \t\tfunction handleComplete(event) }\n\t * \t\t\tvar json = queue.getResult(\"json\");\n\t * \t\t\tconsole.log(json.obj.bool); // true\n\t * \t\t}\n\t *\n\t * JSONP files loaded concurrently require a <em>unique</em> callback. To ensure JSONP files are loaded in order,\n\t * either use the {{#crossLink \"LoadQueue/setMaxConnections\"}}{{/crossLink}} method (set to 1), or set\n\t * {{#crossLink \"LoadItem/maintainOrder:property\"}}{{/crossLink}} on items with the same callback.\n\t *\n\t * Important note: Some browsers will prevent JSONP from firing the callback if the file was loaded as JSON, and not\n\t * JavaScript. You may have to have your server give you a JavaScript mime-type for this to work.\n\t *\n\t * @class JSONPLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @extends AbstractLoader\n\t * @constructor\n\t */\n\tfunction JSONPLoader(loadItem) {\n\t\tthis.AbstractLoader_constructor(loadItem, false, createjs.Types.JSONP);\n\t\tthis.setTag(createjs.Elements.script());\n\t\tthis.getTag().type = \"text/javascript\";\n\t};\n\n\tvar p = createjs.extend(JSONPLoader, createjs.AbstractLoader);\n\tvar s = JSONPLoader;\n\n\n\t// static methods\n\t/**\n\t * Determines if the loader can load a specific item. This loader can only load items that are of type\n\t * {{#crossLink \"Types/JSONP:property\"}}{{/crossLink}}.\n\t * @method canLoadItem\n\t * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n\t * @returns {Boolean} Whether the loader can load the item.\n\t * @static\n\t */\n\ts.canLoadItem = function (item) {\n\t\treturn item.type == createjs.Types.JSONP;\n\t};\n\n\t// public methods\n\tp.cancel = function () {\n\t\tthis.AbstractLoader_cancel();\n\t\tthis._dispose();\n\t};\n\n\t/**\n\t * Loads the JSONp file.  Because of the unique loading needs of JSONp\n\t * we don't use the AbstractLoader.load() method.\n\t *\n\t * @method load\n\t *\n\t */\n\tp.load = function () {\n\t\tif (this._item.callback == null) {\n\t\t\tthrow new Error('callback is required for loading JSONP requests.');\n\t\t}\n\n\t\t// TODO: Look into creating our own iFrame to handle the load\n\t\t// In the first attempt, FF did not get the result\n\t\t//   result instanceof Object did not work either\n\t\t//   so we would need to clone the result.\n\t\tif (window[this._item.callback] != null) {\n\t\t\tthrow new Error(\n\t\t\t\t\"JSONP callback '\" +\n\t\t\t\tthis._item.callback +\n\t\t\t\t\"' already exists on window. You need to specify a different callback or re-name the current one.\");\n\t\t}\n\n\t\twindow[this._item.callback] = createjs.proxy(this._handleLoad, this);\n\t\tcreatejs.DomUtils.appendToBody(this._tag);\n\n\t\tthis._loadTimeout = setTimeout(createjs.proxy(this._handleTimeout, this), this._item.loadTimeout);\n\n\t\t// Load the tag\n\t\tthis._tag.src = this._item.src;\n\t};\n\n\t// private methods\n\t/**\n\t * Handle the JSONP callback, which is a public method defined on `window`.\n\t * @method _handleLoad\n\t * @param {Object} data The formatted JSON data.\n\t * @private\n\t */\n\tp._handleLoad = function (data) {\n\t\tthis._result = this._rawResult = data;\n\t\tthis._sendComplete();\n\n\t\tthis._dispose();\n\t};\n\n\t/**\n\t * The tag request has not loaded within the time specfied in loadTimeout.\n\t * @method _handleError\n\t * @param {Object} event The XHR error event.\n\t * @private\n\t */\n\tp._handleTimeout = function () {\n\t\tthis._dispose();\n\t\tthis.dispatchEvent(new createjs.ErrorEvent(\"timeout\"));\n\t};\n\n\t/**\n\t * Clean up the JSONP load. This clears out the callback and script tag that this loader creates.\n\t * @method _dispose\n\t * @private\n\t */\n\tp._dispose = function () {\n\t\tcreatejs.DomUtils.removeChild(this._tag);\n\t\tdelete window[this._item.callback];\n\n\t\tclearTimeout(this._loadTimeout);\n\t};\n\n\tcreatejs.JSONPLoader = createjs.promote(JSONPLoader, \"AbstractLoader\");\n\n}());\n\n//##############################################################################\n// ManifestLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A loader for JSON manifests. Items inside the manifest are loaded before the loader completes. To load manifests\n\t * using JSONP, specify a {{#crossLink \"LoadItem/callback:property\"}}{{/crossLink}} as part of the\n\t * {{#crossLink \"LoadItem\"}}{{/crossLink}}.\n\t *\n\t * The list of files in the manifest must be defined on the top-level JSON object in a `manifest` property. This\n\t * example shows a sample manifest definition, as well as how to to include a sub-manifest.\n\t *\n\t * \t\t{\n\t * \t\t\t\"path\": \"assets/\",\n\t *\t \t    \"manifest\": [\n\t *\t\t\t\t\"image.png\",\n\t *\t\t\t\t{\"src\": \"image2.png\", \"id\":\"image2\"},\n\t *\t\t\t\t{\"src\": \"sub-manifest.json\", \"type\":\"manifest\", \"callback\":\"jsonCallback\"}\n\t *\t \t    ]\n\t *\t \t}\n\t *\n\t * When a ManifestLoader has completed loading, the parent loader (usually a {{#crossLink \"LoadQueue\"}}{{/crossLink}},\n\t * but could also be another ManifestLoader) will inherit all the loaded items, so you can access them directly.\n\t *\n\t * Note that the {{#crossLink \"JSONLoader\"}}{{/crossLink}} and {{#crossLink \"JSONPLoader\"}}{{/crossLink}} are\n\t * higher priority loaders, so manifests <strong>must</strong> set the {{#crossLink \"LoadItem\"}}{{/crossLink}}\n\t * {{#crossLink \"LoadItem/type:property\"}}{{/crossLink}} property to {{#crossLink \"Types/MANIFEST:property\"}}{{/crossLink}}.\n\t *\n\t * Additionally, some browsers require the server to serve a JavaScript mime-type for JSONP, so it may not work in\n\t * some conditions.\n\t * @class ManifestLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @extends AbstractLoader\n\t * @constructor\n\t */\n\tfunction ManifestLoader(loadItem, preferXHR) {\n\t\tthis.AbstractLoader_constructor(loadItem, preferXHR, createjs.Types.MANIFEST);\n\n\t// Public Properties\n\t\t/**\n\t\t * An array of the plugins registered using {{#crossLink \"LoadQueue/installPlugin\"}}{{/crossLink}},\n\t\t * used to pass plugins to new LoadQueues that may be created.\n\t\t * @property _plugins\n\t\t * @type {Array}\n\t\t * @private\n\t\t * @since 0.6.1\n\t\t */\n\t\tthis.plugins = null;\n\n\n\t// Protected Properties\n\t\t/**\n\t\t * An internal {{#crossLink \"LoadQueue\"}}{{/crossLink}} that loads the contents of the manifest.\n\t\t * @property _manifestQueue\n\t\t * @type {LoadQueue}\n\t\t * @private\n\t\t */\n\t\tthis._manifestQueue = null;\n\t};\n\n\tvar p = createjs.extend(ManifestLoader, createjs.AbstractLoader);\n\tvar s = ManifestLoader;\n\n\t// static properties\n\t/**\n\t * The amount of progress that the manifest itself takes up.\n\t * @property MANIFEST_PROGRESS\n\t * @type {number}\n\t * @default 0.25 (25%)\n\t * @private\n\t * @static\n\t */\n\ts.MANIFEST_PROGRESS = 0.25;\n\n\t// static methods\n\t/**\n\t * Determines if the loader can load a specific item. This loader can only load items that are of type\n\t * {{#crossLink \"Types/MANIFEST:property\"}}{{/crossLink}}\n\t * @method canLoadItem\n\t * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n\t * @returns {Boolean} Whether the loader can load the item.\n\t * @static\n\t */\n\ts.canLoadItem = function (item) {\n\t\treturn item.type == createjs.Types.MANIFEST;\n\t};\n\n\t// public methods\n\tp.load = function () {\n\t\tthis.AbstractLoader_load();\n\t};\n\n\t// protected methods\n\tp._createRequest = function() {\n\t\tvar callback = this._item.callback;\n\t\tif (callback != null) {\n\t\t\tthis._request = new createjs.JSONPLoader(this._item);\n\t\t} else {\n\t\t\tthis._request = new createjs.JSONLoader(this._item);\n\t\t}\n\t};\n\n\tp.handleEvent = function (event) {\n\t\tswitch (event.type) {\n\t\t\tcase \"complete\":\n\t\t\t\tthis._rawResult = event.target.getResult(true);\n\t\t\t\tthis._result = event.target.getResult();\n\t\t\t\tthis._sendProgress(s.MANIFEST_PROGRESS);\n\t\t\t\tthis._loadManifest(this._result);\n\t\t\t\treturn;\n\t\t\tcase \"progress\":\n\t\t\t\tevent.loaded *= s.MANIFEST_PROGRESS;\n\t\t\t\tthis.progress = event.loaded / event.total;\n\t\t\t\tif (isNaN(this.progress) || this.progress == Infinity) { this.progress = 0; }\n\t\t\t\tthis._sendProgress(event);\n\t\t\t\treturn;\n\t\t}\n\t\tthis.AbstractLoader_handleEvent(event);\n\t};\n\n\tp.destroy = function() {\n\t\tthis.AbstractLoader_destroy();\n\t\tthis._manifestQueue.close();\n\t};\n\n\t/**\n\t * Create and load the manifest items once the actual manifest has been loaded.\n\t * @method _loadManifest\n\t * @param {Object} json\n\t * @private\n\t */\n\tp._loadManifest = function (json) {\n\t\tif (json && json.manifest) {\n\t\t\tvar queue = this._manifestQueue = new createjs.LoadQueue(this._preferXHR);\n\t\t\tqueue.on(\"fileload\", this._handleManifestFileLoad, this);\n\t\t\tqueue.on(\"progress\", this._handleManifestProgress, this);\n\t\t\tqueue.on(\"complete\", this._handleManifestComplete, this, true);\n\t\t\tqueue.on(\"error\", this._handleManifestError, this, true);\n\t\t\tfor(var i = 0, l = this.plugins.length; i < l; i++) {\t// conserve order of plugins\n\t\t\t\tqueue.installPlugin(this.plugins[i]);\n\t\t\t}\n\t\t\tqueue.loadManifest(json);\n\t\t} else {\n\t\t\tthis._sendComplete();\n\t\t}\n\t};\n\n\t/**\n\t * An item from the {{#crossLink \"_manifestQueue:property\"}}{{/crossLink}} has completed.\n\t * @method _handleManifestFileLoad\n\t * @param {Event} event\n\t * @private\n\t */\n\tp._handleManifestFileLoad = function (event) {\n\t\tevent.target = null;\n\t\tthis.dispatchEvent(event);\n\t};\n\n\t/**\n\t * The manifest has completed loading. This triggers the {{#crossLink \"AbstractLoader/complete:event\"}}{{/crossLink}}\n\t * {{#crossLink \"Event\"}}{{/crossLink}} from the ManifestLoader.\n\t * @method _handleManifestComplete\n\t * @param {Event} event\n\t * @private\n\t */\n\tp._handleManifestComplete = function (event) {\n\t\tthis._loadedItems = this._manifestQueue.getItems(true);\n\t\tthis._sendComplete();\n\t};\n\n\t/**\n\t * The manifest has reported progress.\n\t * @method _handleManifestProgress\n\t * @param {ProgressEvent} event\n\t * @private\n\t */\n\tp._handleManifestProgress = function (event) {\n\t\tthis.progress = event.progress * (1 - s.MANIFEST_PROGRESS) + s.MANIFEST_PROGRESS;\n\t\tthis._sendProgress(this.progress);\n\t};\n\n\t/**\n\t * The manifest has reported an error with one of the files.\n\t * @method _handleManifestError\n\t * @param {ErrorEvent} event\n\t * @private\n\t */\n\tp._handleManifestError = function (event) {\n\t\tvar newEvent = new createjs.Event(\"fileerror\");\n\t\tnewEvent.item = event.data;\n\t\tthis.dispatchEvent(newEvent);\n\t};\n\n\tcreatejs.ManifestLoader = createjs.promote(ManifestLoader, \"AbstractLoader\");\n\n}());\n\n//##############################################################################\n// SoundLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A loader for HTML audio files. PreloadJS can not load WebAudio files, as a WebAudio context is required, which\n\t * should be created by either a library playing the sound (such as <a href=\"http://soundjs.com\">SoundJS</a>, or an\n\t * external framework that handles audio playback. To load content that can be played by WebAudio, use the\n\t * {{#crossLink \"BinaryLoader\"}}{{/crossLink}}, and handle the audio context decoding manually.\n\t * @class SoundLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @param {Boolean} preferXHR\n\t * @extends AbstractMediaLoader\n\t * @constructor\n\t */\n\tfunction SoundLoader(loadItem, preferXHR) {\n\t\tthis.AbstractMediaLoader_constructor(loadItem, preferXHR, createjs.Types.SOUND);\n\n\t\t// protected properties\n\t\tif (createjs.DomUtils.isAudioTag(loadItem)) {\n\t\t\tthis._tag = loadItem;\n\t\t} else if (createjs.DomUtils.isAudioTag(loadItem.src)) {\n\t\t\tthis._tag = loadItem;\n\t\t} else if (createjs.DomUtils.isAudioTag(loadItem.tag)) {\n\t\t\tthis._tag = createjs.DomUtils.isAudioTag(loadItem) ? loadItem : loadItem.src;\n\t\t}\n\n\t\tif (this._tag != null) {\n\t\t\tthis._preferXHR = false;\n\t\t}\n\t};\n\n\tvar p = createjs.extend(SoundLoader, createjs.AbstractMediaLoader);\n\tvar s = SoundLoader;\n\n\t// static methods\n\t/**\n\t * Determines if the loader can load a specific item. This loader can only load items that are of type\n\t * {{#crossLink \"Types/SOUND:property\"}}{{/crossLink}}.\n\t * @method canLoadItem\n\t * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n\t * @returns {Boolean} Whether the loader can load the item.\n\t * @static\n\t */\n\ts.canLoadItem = function (item) {\n\t\treturn item.type == createjs.Types.SOUND;\n\t};\n\n\t// protected methods\n\tp._createTag = function (src) {\n\t\tvar tag = createjs.Elements.audio();\n\t\ttag.autoplay = false;\n\t\ttag.preload = \"none\";\n\n\t\t//LM: Firefox fails when this the preload=\"none\" for other tags, but it needs to be \"none\" to ensure PreloadJS works.\n\t\ttag.src = src;\n\t\treturn tag;\n\t};\n\n\tcreatejs.SoundLoader = createjs.promote(SoundLoader, \"AbstractMediaLoader\");\n\n}());\n\n//##############################################################################\n// VideoLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A loader for video files.\n\t * @class VideoLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @param {Boolean} preferXHR\n\t * @extends AbstractMediaLoader\n\t * @constructor\n\t */\n\tfunction VideoLoader(loadItem, preferXHR) {\n\t\tthis.AbstractMediaLoader_constructor(loadItem, preferXHR, createjs.Types.VIDEO);\n\n\t\tif (createjs.DomUtils.isVideoTag(loadItem) || createjs.DomUtils.isVideoTag(loadItem.src)) {\n\t\t\tthis.setTag(createjs.DomUtils.isVideoTag(loadItem)?loadItem:loadItem.src);\n\n\t\t\t// We can't use XHR for a tag that's passed in.\n\t\t\tthis._preferXHR = false;\n\t\t} else {\n\t\t\tthis.setTag(this._createTag());\n\t\t}\n\t};\n\n\tvar p = createjs.extend(VideoLoader, createjs.AbstractMediaLoader);\n\tvar s = VideoLoader;\n\n\t/**\n\t * Create a new video tag\n\t *\n\t * @returns {HTMLElement}\n\t * @private\n\t */\n\tp._createTag = function () {\n\t\treturn createjs.Elements.video();\n\t};\n\n\t// static methods\n\t/**\n\t * Determines if the loader can load a specific item. This loader can only load items that are of type\n\t * {{#crossLink \"Types/VIDEO:property\"}}{{/crossLink}}.\n\t * @method canLoadItem\n\t * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n\t * @returns {Boolean} Whether the loader can load the item.\n\t * @static\n\t */\n\ts.canLoadItem = function (item) {\n\t\treturn item.type == createjs.Types.VIDEO;\n\t};\n\n\tcreatejs.VideoLoader = createjs.promote(VideoLoader, \"AbstractMediaLoader\");\n\n}());\n\n//##############################################################################\n// SpriteSheetLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A loader for EaselJS SpriteSheets. Images inside the spritesheet definition are loaded before the loader\n\t * completes. To load SpriteSheets using JSONP, specify a {{#crossLink \"LoadItem/callback:property\"}}{{/crossLink}}\n\t * as part of the {{#crossLink \"LoadItem\"}}{{/crossLink}}. Note that the {{#crossLink \"JSONLoader\"}}{{/crossLink}}\n\t * and {{#crossLink \"JSONPLoader\"}}{{/crossLink}} are higher priority loaders, so SpriteSheets <strong>must</strong>\n\t * set the {{#crossLink \"LoadItem\"}}{{/crossLink}} {{#crossLink \"LoadItem/type:property\"}}{{/crossLink}} property\n\t * to {{#crossLink \"Types/SPRITESHEET:property\"}}{{/crossLink}}.\n\t *\n\t * The {{#crossLink \"LoadItem\"}}{{/crossLink}} {{#crossLink \"LoadItem/crossOrigin:property\"}}{{/crossLink}} as well\n\t * as the {{#crossLink \"LoadQueue's\"}}{{/crossLink}} `basePath` argument and {{#crossLink \"LoadQueue/_preferXHR\"}}{{/crossLink}}\n\t * property supplied to the {{#crossLink \"LoadQueue\"}}{{/crossLink}} are passed on to the sub-manifest that loads\n\t * the SpriteSheet images.\n\t *\n\t * Note that the SpriteSheet JSON does not respect the {{#crossLink \"LoadQueue/_preferXHR:property\"}}{{/crossLink}}\n\t * property, which should instead be determined by the presence of a {{#crossLink \"LoadItem/callback:property\"}}{{/crossLink}}\n\t * property on the SpriteSheet load item. This is because the JSON loaded will have a different format depending on\n\t * if it is loaded as JSON, so just changing `preferXHR` is not enough to change how it is loaded.\n\t * @class SpriteSheetLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @extends AbstractLoader\n\t * @constructor\n\t */\n\tfunction SpriteSheetLoader(loadItem, preferXHR) {\n\t\tthis.AbstractLoader_constructor(loadItem, preferXHR, createjs.Types.SPRITESHEET);\n\n\t\t// protected properties\n\t\t/**\n\t\t * An internal queue which loads the SpriteSheet's images.\n\t\t * @method _manifestQueue\n\t\t * @type {LoadQueue}\n\t\t * @private\n\t\t */\n\t\tthis._manifestQueue = null;\n\t}\n\n\tvar p = createjs.extend(SpriteSheetLoader, createjs.AbstractLoader);\n\tvar s = SpriteSheetLoader;\n\n\t// static properties\n\t/**\n\t * The amount of progress that the manifest itself takes up.\n\t * @property SPRITESHEET_PROGRESS\n\t * @type {number}\n\t * @default 0.25 (25%)\n\t * @private\n\t * @static\n\t */\n\ts.SPRITESHEET_PROGRESS = 0.25;\n\n\t// static methods\n\t/**\n\t * Determines if the loader can load a specific item. This loader can only load items that are of type\n\t * {{#crossLink \"Types/SPRITESHEET:property\"}}{{/crossLink}}\n\t * @method canLoadItem\n\t * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n\t * @returns {Boolean} Whether the loader can load the item.\n\t * @static\n\t */\n\ts.canLoadItem = function (item) {\n\t\treturn item.type == createjs.Types.SPRITESHEET;\n\t};\n\n\t// public methods\n\tp.destroy = function() {\n\t\tthis.AbstractLoader_destroy();\n\t\tthis._manifestQueue.close();\n\t};\n\n\t// protected methods\n\tp._createRequest = function() {\n\t\tvar callback = this._item.callback;\n\t\tif (callback != null) {\n\t\t\tthis._request = new createjs.JSONPLoader(this._item);\n\t\t} else {\n\t\t\tthis._request = new createjs.JSONLoader(this._item);\n\t\t}\n\t};\n\n\tp.handleEvent = function (event) {\n\t\tswitch (event.type) {\n\t\t\tcase \"complete\":\n\t\t\t\tthis._rawResult = event.target.getResult(true);\n\t\t\t\tthis._result = event.target.getResult();\n\t\t\t\tthis._sendProgress(s.SPRITESHEET_PROGRESS);\n\t\t\t\tthis._loadManifest(this._result);\n\t\t\t\treturn;\n\t\t\tcase \"progress\":\n\t\t\t\tevent.loaded *= s.SPRITESHEET_PROGRESS;\n\t\t\t\tthis.progress = event.loaded / event.total;\n\t\t\t\tif (isNaN(this.progress) || this.progress == Infinity) { this.progress = 0; }\n\t\t\t\tthis._sendProgress(event);\n\t\t\t\treturn;\n\t\t}\n\t\tthis.AbstractLoader_handleEvent(event);\n\t};\n\n\t/**\n\t * Create and load the images once the SpriteSheet JSON has been loaded.\n\t * @method _loadManifest\n\t * @param {Object} json\n\t * @private\n\t */\n\tp._loadManifest = function (json) {\n\t\tif (json && json.images) {\n\t\t\tvar queue = this._manifestQueue = new createjs.LoadQueue(this._preferXHR, this._item.path, this._item.crossOrigin);\n\t\t\tqueue.on(\"complete\", this._handleManifestComplete, this, true);\n\t\t\tqueue.on(\"fileload\", this._handleManifestFileLoad, this);\n\t\t\tqueue.on(\"progress\", this._handleManifestProgress, this);\n\t\t\tqueue.on(\"error\", this._handleManifestError, this, true);\n\t\t\tqueue.loadManifest(json.images);\n\t\t}\n\t};\n\n\t/**\n\t * An item from the {{#crossLink \"_manifestQueue:property\"}}{{/crossLink}} has completed.\n\t * @method _handleManifestFileLoad\n\t * @param {Event} event\n\t * @private\n\t */\n\tp._handleManifestFileLoad = function (event) {\n\t\tvar image = event.result;\n\t\tif (image != null) {\n\t\t\tvar images = this.getResult().images;\n\t\t\tvar pos = images.indexOf(event.item.src);\n\t\t\timages[pos] = image;\n\t\t}\n\t};\n\n\t/**\n\t * The images have completed loading. This triggers the {{#crossLink \"AbstractLoader/complete:event\"}}{{/crossLink}}\n\t * {{#crossLink \"Event\"}}{{/crossLink}} from the SpriteSheetLoader.\n\t * @method _handleManifestComplete\n\t * @param {Event} event\n\t * @private\n\t */\n\tp._handleManifestComplete = function (event) {\n\t\tthis._result = new createjs.SpriteSheet(this._result);\n\t\tthis._loadedItems = this._manifestQueue.getItems(true);\n\t\tthis._sendComplete();\n\t};\n\n\t/**\n\t * The images {{#crossLink \"LoadQueue\"}}{{/crossLink}} has reported progress.\n\t * @method _handleManifestProgress\n\t * @param {ProgressEvent} event\n\t * @private\n\t */\n\tp._handleManifestProgress = function (event) {\n\t\tthis.progress = event.progress * (1 - s.SPRITESHEET_PROGRESS) + s.SPRITESHEET_PROGRESS;\n\t\tthis._sendProgress(this.progress);\n\t};\n\n\t/**\n\t * An image has reported an error.\n\t * @method _handleManifestError\n\t * @param {ErrorEvent} event\n\t * @private\n\t */\n\tp._handleManifestError = function (event) {\n\t\tvar newEvent = new createjs.Event(\"fileerror\");\n\t\tnewEvent.item = event.data;\n\t\tthis.dispatchEvent(newEvent);\n\t};\n\n\tcreatejs.SpriteSheetLoader = createjs.promote(SpriteSheetLoader, \"AbstractLoader\");\n\n}());\n\n//##############################################################################\n// SVGLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A loader for SVG files.\n\t * @class SVGLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @param {Boolean} preferXHR\n\t * @extends AbstractLoader\n\t * @constructor\n\t */\n\tfunction SVGLoader(loadItem, preferXHR) {\n\t\tthis.AbstractLoader_constructor(loadItem, preferXHR, createjs.Types.SVG);\n\n\t\t// public properties\n\t\tthis.resultFormatter = this._formatResult;\n\n\t\t// protected properties\n\t\tthis._tagSrcAttribute = \"data\";\n\n\t\tif (preferXHR) {\n\t\t\tthis.setTag(createjs.Elements.svg());\n\t\t} else {\n\t\t\tthis.setTag(createjs.Elements.object());\n\t\t\tthis.getTag().type = \"image/svg+xml\";\n\t\t}\n\t};\n\n\tvar p = createjs.extend(SVGLoader, createjs.AbstractLoader);\n\tvar s = SVGLoader;\n\n\t// static methods\n\t/**\n\t * Determines if the loader can load a specific item. This loader can only load items that are of type\n\t * {{#crossLink \"Types/SVG:property\"}}{{/crossLink}}\n\t * @method canLoadItem\n\t * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n\t * @returns {Boolean} Whether the loader can load the item.\n\t * @static\n\t */\n\ts.canLoadItem = function (item) {\n\t\treturn item.type == createjs.Types.SVG;\n\t};\n\n\t// protected methods\n\t/**\n\t * The result formatter for SVG files.\n\t * @method _formatResult\n\t * @param {AbstractLoader} loader\n\t * @returns {Object}\n\t * @private\n\t */\n\tp._formatResult = function (loader) {\n\t\t// mime should be image/svg+xml, but Opera requires text/xml\n\t\tvar xml = createjs.DataUtils.parseXML(loader.getResult(true));\n\t\tvar tag = loader.getTag();\n\n\t\tif (!this._preferXHR && document.body.contains(tag)) {\n\t\t\tdocument.body.removeChild(tag);\n\t\t}\n\n\t\tif (xml.documentElement != null) {\n\t\t\tvar element = xml.documentElement;\n\t\t\t// Support loading an SVG from a different domain in ID\n\t\t\tif (document.importNode) {\n\t\t\t\telement = document.importNode(element, true);\n\t\t\t}\n\t\t\ttag.appendChild(element);\n\t\t\treturn tag;\n\t\t} else { // For browsers that don't support SVG, just give them the XML. (IE 9-8)\n\t\t\treturn xml;\n\t\t}\n\t};\n\n\tcreatejs.SVGLoader = createjs.promote(SVGLoader, \"AbstractLoader\");\n\n}());\n\n//##############################################################################\n// XMLLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t// constructor\n\t/**\n\t * A loader for CSS files.\n\t * @class XMLLoader\n\t * @param {LoadItem|Object} loadItem\n\t * @extends AbstractLoader\n\t * @constructor\n\t */\n\tfunction XMLLoader(loadItem) {\n\t\tthis.AbstractLoader_constructor(loadItem, true, createjs.Types.XML);\n\n\t\t// public properties\n\t\tthis.resultFormatter = this._formatResult;\n\t};\n\n\tvar p = createjs.extend(XMLLoader, createjs.AbstractLoader);\n\tvar s = XMLLoader;\n\n\t// static methods\n\t/**\n\t * Determines if the loader can load a specific item. This loader can only load items that are of type\n\t * {{#crossLink \"Types/XML:property\"}}{{/crossLink}}.\n\t * @method canLoadItem\n\t * @param {LoadItem|Object} item The LoadItem that a LoadQueue is trying to load.\n\t * @returns {Boolean} Whether the loader can load the item.\n\t * @static\n\t */\n\ts.canLoadItem = function (item) {\n\t\treturn item.type == createjs.Types.XML;\n\t};\n\n\t// protected methods\n\t/**\n\t * The result formatter for XML files.\n\t * @method _formatResult\n\t * @param {AbstractLoader} loader\n\t * @returns {XMLDocument}\n\t * @private\n\t */\n\tp._formatResult = function (loader) {\n\t\treturn createjs.DataUtils.parseXML(loader.getResult(true));\n\t};\n\n\tcreatejs.XMLLoader = createjs.promote(XMLLoader, \"AbstractLoader\");\n\n}());\n\n//##############################################################################\n// version.js\n//##############################################################################\n\n(function () {\n\n\t/**\n\t * Static class holding library specific information such as the version and buildDate of the library.\n\t * The SoundJS class has been renamed {{#crossLink \"Sound\"}}{{/crossLink}}.  Please see {{#crossLink \"Sound\"}}{{/crossLink}}\n\t * for information on using sound.\n\t * @class SoundJS\n\t **/\n\tvar s = createjs.SoundJS = createjs.SoundJS || {};\n\n\t/**\n\t * The version string for this release.\n\t * @property version\n\t * @type String\n\t * @static\n\t **/\n\ts.version = /*=version*/\"NEXT\"; // injected by build process\n\n\t/**\n\t * The build date for this release in UTC format.\n\t * @property buildDate\n\t * @type String\n\t * @static\n\t **/\n\ts.buildDate = /*=date*/\"Thu, 14 Sep 2017 22:19:45 GMT\"; // injected by build process\n\n})();\n\n//##############################################################################\n// BrowserDetect.js\n//##############################################################################\n\n/**\n * @class Utility Methods\n */\n(function() {\n\t\"use strict\";\n\n\t/**\n\t * An object that determines the current browser, version, operating system, and other environment\n\t * variables via user agent string.\n\t *\n\t * Used for audio because feature detection is unable to detect the many limitations of mobile devices.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      if (createjs.BrowserDetect.isIOS) { // do stuff }\n\t *\n\t * @property BrowserDetect\n\t * @type {Object}\n\t * @param {Boolean} isFirefox True if our browser is Firefox.\n\t * @param {Boolean} isOpera True if our browser is opera.\n\t * @param {Boolean} isChrome True if our browser is Chrome.  Note that Chrome for Android returns true, but is a\n\t * completely different browser with different abilities.\n\t * @param {Boolean} isIOS True if our browser is safari for iOS devices (iPad, iPhone, and iPod).\n\t * @param {Boolean} isAndroid True if our browser is Android.\n\t * @param {Boolean} isBlackberry True if our browser is Blackberry.\n\t * @constructor\n\t * @static\n\t */\n\tfunction BrowserDetect() {\n\t\tthrow \"BrowserDetect cannot be instantiated\";\n\t};\n\n\tvar agent = BrowserDetect.agent = window.navigator.userAgent;\n\tBrowserDetect.isWindowPhone = (agent.indexOf(\"IEMobile\") > -1) || (agent.indexOf(\"Windows Phone\") > -1);\n\tBrowserDetect.isFirefox = (agent.indexOf(\"Firefox\") > -1);\n\tBrowserDetect.isOpera = (window.opera != null);\n\tBrowserDetect.isChrome = (agent.indexOf(\"Chrome\") > -1);  // NOTE that Chrome on Android returns true but is a completely different browser with different abilities\n\tBrowserDetect.isIOS = (agent.indexOf(\"iPod\") > -1 || agent.indexOf(\"iPhone\") > -1 || agent.indexOf(\"iPad\") > -1) && !BrowserDetect.isWindowPhone;\n\tBrowserDetect.isAndroid = (agent.indexOf(\"Android\") > -1) && !BrowserDetect.isWindowPhone;\n\tBrowserDetect.isBlackberry = (agent.indexOf(\"Blackberry\") > -1);\n\n\tcreatejs.BrowserDetect = BrowserDetect;\n\n}());\n\n//##############################################################################\n// AudioSprite.js\n//##############################################################################\n\n//  NOTE this is \"Class\" is purely to document audioSprite Setup and usage.\n\n\n/**\n * <strong>Note: AudioSprite is not a class, but its usage is easily lost in the documentation, so it has been called\n * out here for quick reference.</strong>\n *\n * Audio sprites are much like CSS sprites or image sprite sheets: multiple audio assets grouped into a single file.\n * Audio sprites work around limitations in certain browsers, where only a single sound can be loaded and played at a\n * time. We recommend at least 300ms of silence between audio clips to deal with HTML audio tag inaccuracy, and to prevent\n * accidentally playing bits of the neighbouring clips.\n *\n * <strong>Benefits of Audio Sprites:</strong>\n * <ul>\n *     <li>More robust support for older browsers and devices that only allow a single audio instance, such as iOS 5.</li>\n *     <li>They provide a work around for the Internet Explorer 9 audio tag limit, which restricts how many different\n *     sounds that could be loaded at once.</li>\n *     <li>Faster loading by only requiring a single network request for several sounds, especially on mobile devices\n * where the network round trip for each file can add significant latency.</li>\n * </ul>\n *\n * <strong>Drawbacks of Audio Sprites</strong>\n * <ul>\n *     <li>No guarantee of smooth looping when using HTML or Flash audio. If you have a track that needs to loop\n * \t\tsmoothly and you are supporting non-web audio browsers, do not use audio sprites for that sound if you can avoid\n * \t\tit.</li>\n *     <li>No guarantee that HTML audio will play back immediately, especially the first time. In some browsers\n *     (Chrome!), HTML audio will only load enough to play through at the current download speed \u2013 so we rely on the\n *     `canplaythrough` event to determine if the audio is loaded. Since audio sprites must jump ahead to play specific\n *     sounds, the audio may not yet have downloaded fully.</li>\n *     <li>Audio sprites share the same core source, so if you have a sprite with 5 sounds and are limited to 2\n * \t\tconcurrently playing instances, you can only play 2 of the sounds at the same time.</li>\n * </ul>\n *\n * <h4>Example</h4>\n *\n *\t\tcreatejs.Sound.initializeDefaultPlugins();\n *\t\tvar assetsPath = \"./assets/\";\n *\t\tvar sounds = [{\n *\t\t\tsrc:\"MyAudioSprite.ogg\", data: {\n *\t\t\t\taudioSprite: [\n *\t\t\t\t\t{id:\"sound1\", startTime:0, duration:500},\n *\t\t\t\t\t{id:\"sound2\", startTime:1000, duration:400},\n *\t\t\t\t\t{id:\"sound3\", startTime:1700, duration: 1000}\n *\t\t\t\t]}\n *\t\t\t}\n *\t\t];\n *\t\tcreatejs.Sound.alternateExtensions = [\"mp3\"];\n *\t\tcreatejs.Sound.on(\"fileload\", loadSound);\n *\t\tcreatejs.Sound.registerSounds(sounds, assetsPath);\n *\t\t// after load is complete\n *\t\tcreatejs.Sound.play(\"sound2\");\n *\n * You can also create audio sprites on the fly by setting the startTime and duration when creating an new AbstractSoundInstance.\n *\n * \t\tcreatejs.Sound.play(\"MyAudioSprite\", {startTime: 1000, duration: 400});\n *\n * The excellent CreateJS community has created a tool to create audio sprites, available at\n * <a href=\"https://github.com/tonistiigi/audiosprite\" target=\"_blank\">https://github.com/tonistiigi/audiosprite</a>,\n * as well as a <a href=\"http://jsfiddle.net/bharat_battu/g8fFP/12/\" target=\"_blank\">jsfiddle</a> to convert the output\n * to SoundJS format.\n *\n * @class AudioSprite\n * @since 0.6.0\n */\n\n//##############################################################################\n// PlayPropsConfig.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\t/**\n\t * A class to store the optional play properties passed in {{#crossLink \"Sound/play\"}}{{/crossLink}} and\n\t * {{#crossLink \"AbstractSoundInstance/play\"}}{{/crossLink}} calls.\n\t *\n\t * Optional Play Properties Include:\n\t * <ul>\n\t * <li>interrupt - How to interrupt any currently playing instances of audio with the same source,\n\t * if the maximum number of instances of the sound are already playing. Values are defined as <code>INTERRUPT_TYPE</code>\n\t * constants on the Sound class, with the default defined by {{#crossLink \"Sound/defaultInterruptBehavior:property\"}}{{/crossLink}}.</li>\n\t * <li>delay - The amount of time to delay the start of audio playback, in milliseconds.</li>\n\t * <li>offset - The offset from the start of the audio to begin playback, in milliseconds.</li>\n\t * <li>loop - How many times the audio loops when it reaches the end of playback. The default is 0 (no\n\t * loops), and -1 can be used for infinite playback.</li>\n\t * <li>volume - The volume of the sound, between 0 and 1. Note that the master volume is applied\n\t * against the individual volume.</li>\n\t * <li>pan - The left-right pan of the sound (if supported), between -1 (left) and 1 (right).</li>\n\t * <li>startTime - To create an audio sprite (with duration), the initial offset to start playback and loop from, in milliseconds.</li>\n\t * <li>duration - To create an audio sprite (with startTime), the amount of time to play the clip for, in milliseconds.</li>\n\t * </ul>\n\t *\n\t * <h4>Example</h4>\n\t *\n\t * \tvar props = new createjs.PlayPropsConfig().set({interrupt: createjs.Sound.INTERRUPT_ANY, loop: -1, volume: 0.5})\n\t * \tcreatejs.Sound.play(\"mySound\", props);\n\t * \t// OR\n\t * \tmySoundInstance.play(props);\n\t *\n\t * @class PlayPropsConfig\n\t * @constructor\n\t * @since 0.6.1\n\t */\n\t// TODO think of a better name for this class\n\tvar PlayPropsConfig = function () {\n// Public Properties\n\t\t/**\n\t\t * How to interrupt any currently playing instances of audio with the same source,\n\t\t * if the maximum number of instances of the sound are already playing. Values are defined as\n\t\t * <code>INTERRUPT_TYPE</code> constants on the Sound class, with the default defined by\n\t\t * {{#crossLink \"Sound/defaultInterruptBehavior:property\"}}{{/crossLink}}.\n\t\t * @property interrupt\n\t\t * @type {string}\n\t\t * @default null\n\t\t */\n\t\tthis.interrupt = null;\n\n\t\t/**\n\t\t * The amount of time to delay the start of audio playback, in milliseconds.\n\t\t * @property delay\n\t\t * @type {Number}\n\t\t * @default null\n\t\t */\n\t\tthis.delay = null;\n\n\t\t/**\n\t\t * The offset from the start of the audio to begin playback, in milliseconds.\n\t\t * @property offset\n\t\t * @type {number}\n\t\t * @default null\n\t\t */\n\t\tthis.offset = null;\n\n\t\t/**\n\t\t * How many times the audio loops when it reaches the end of playback. The default is 0 (no\n\t\t * loops), and -1 can be used for infinite playback.\n\t\t * @property loop\n\t\t * @type {number}\n\t\t * @default null\n\t\t */\n\t\tthis.loop = null;\n\n\t\t/**\n\t\t * The volume of the sound, between 0 and 1. Note that the master volume is applied\n\t\t * against the individual volume.\n\t\t * @property volume\n\t\t * @type {number}\n\t\t * @default null\n\t\t */\n\t\tthis.volume = null;\n\n\t\t/**\n\t\t * The left-right pan of the sound (if supported), between -1 (left) and 1 (right).\n\t\t * @property pan\n\t\t * @type {number}\n\t\t * @default null\n\t\t */\n\t\tthis.pan = null;\n\n\t\t/**\n\t\t * Used to create an audio sprite (with duration), the initial offset to start playback and loop from, in milliseconds.\n\t\t * @property startTime\n\t\t * @type {number}\n\t\t * @default null\n\t\t */\n\t\tthis.startTime = null;\n\n\t\t/**\n\t\t * Used to create an audio sprite (with startTime), the amount of time to play the clip for, in milliseconds.\n\t\t * @property duration\n\t\t * @type {number}\n\t\t * @default null\n\t\t */\n\t\tthis.duration = null;\n\t};\n\tvar p = PlayPropsConfig.prototype = {};\n\tvar s = PlayPropsConfig;\n\n\n// Static Methods\n\t/**\n\t * Creates a PlayPropsConfig from another PlayPropsConfig or an Object.\n\t *\n\t * @method create\n\t * @param {PlayPropsConfig|Object} value The play properties\n\t * @returns {PlayPropsConfig}\n\t * @static\n\t */\n\ts.create = function (value) {\n\t\tif (typeof(value) === \"string\") {\n\t\t\t// Handle the old API gracefully.\n\t\t\tconsole && (console.warn || console.log)(\"Deprecated behaviour. Sound.play takes a configuration object instead of individual arguments. See docs for info.\");\n\t\t\treturn new createjs.PlayPropsConfig().set({interrupt:value});\n\t\t} else if (value == null || value instanceof s || value instanceof Object) {\n\t\t\treturn new createjs.PlayPropsConfig().set(value);\n\t\t} else if (value == null) {\n\t\t\tthrow new Error(\"PlayProps configuration not recognized.\");\n\t\t}\n\t};\n\n// Public Methods\n\t/**\n\t * Provides a chainable shortcut method for setting a number of properties on the instance.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      var PlayPropsConfig = new createjs.PlayPropsConfig().set({loop:-1, volume:0.7});\n\t *\n\t * @method set\n\t * @param {Object} props A generic object containing properties to copy to the PlayPropsConfig instance.\n\t * @return {PlayPropsConfig} Returns the instance the method is called on (useful for chaining calls.)\n\t*/\n\tp.set = function(props) {\n\t\tif (props != null) {\n\t\t\tfor (var n in props) { this[n] = props[n]; }\n\t\t}\n\t\treturn this;\n\t};\n\n\tp.toString = function() {\n\t\treturn \"[PlayPropsConfig]\";\n\t};\n\n\tcreatejs.PlayPropsConfig = s;\n\n}());\n\n//##############################################################################\n// Sound.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t/**\n\t * The Sound class is the public API for creating sounds, controlling the overall sound levels, and managing plugins.\n\t * All Sound APIs on this class are static.\n\t *\n\t * <b>Registering and Preloading</b><br />\n\t * Before you can play a sound, it <b>must</b> be registered. You can do this with {{#crossLink \"Sound/registerSound\"}}{{/crossLink}},\n\t * or register multiple sounds using {{#crossLink \"Sound/registerSounds\"}}{{/crossLink}}. If you don't register a\n\t * sound prior to attempting to play it using {{#crossLink \"Sound/play\"}}{{/crossLink}} or create it using {{#crossLink \"Sound/createInstance\"}}{{/crossLink}},\n\t * the sound source will be automatically registered but playback will fail as the source will not be ready. If you use\n\t * <a href=\"http://preloadjs.com\" target=\"_blank\">PreloadJS</a>, registration is handled for you when the sound is\n\t * preloaded. It is recommended to preload sounds either internally using the register functions or externally using\n\t * PreloadJS so they are ready when you want to use them.\n\t *\n\t * <b>Playback</b><br />\n\t * To play a sound once it's been registered and preloaded, use the {{#crossLink \"Sound/play\"}}{{/crossLink}} method.\n\t * This method returns a {{#crossLink \"AbstractSoundInstance\"}}{{/crossLink}} which can be paused, resumed, muted, etc.\n\t * Please see the {{#crossLink \"AbstractSoundInstance\"}}{{/crossLink}} documentation for more on the instance control APIs.\n\t *\n\t * <b>Plugins</b><br />\n\t * By default, the {{#crossLink \"WebAudioPlugin\"}}{{/crossLink}} or the {{#crossLink \"HTMLAudioPlugin\"}}{{/crossLink}}\n\t * are used (when available), although developers can change plugin priority or add new plugins (such as the\n\t * provided {{#crossLink \"FlashAudioPlugin\"}}{{/crossLink}}). Please see the {{#crossLink \"Sound\"}}{{/crossLink}} API\n\t * methods for more on the playback and plugin APIs. To install plugins, or specify a different plugin order, see\n\t * {{#crossLink \"Sound/installPlugins\"}}{{/crossLink}}.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      createjs.FlashAudioPlugin.swfPath = \"../src/soundjs/flashaudio\";\n\t *      createjs.Sound.registerPlugins([createjs.WebAudioPlugin, createjs.FlashAudioPlugin]);\n\t *      createjs.Sound.alternateExtensions = [\"mp3\"];\n\t *      createjs.Sound.on(\"fileload\", this.loadHandler, this);\n\t *      createjs.Sound.registerSound(\"path/to/mySound.ogg\", \"sound\");\n\t *      function loadHandler(event) {\n     *          // This is fired for each sound that is registered.\n     *          var instance = createjs.Sound.play(\"sound\");  // play using id.  Could also use full source path or event.src.\n     *          instance.on(\"complete\", this.handleComplete, this);\n     *          instance.volume = 0.5;\n\t *      }\n\t *\n\t * The maximum number of concurrently playing instances of the same sound can be specified in the \"data\" argument\n\t * of {{#crossLink \"Sound/registerSound\"}}{{/crossLink}}.  Note that if not specified, the active plugin will apply\n\t * a default limit.  Currently HTMLAudioPlugin sets a default limit of 2, while WebAudioPlugin and FlashAudioPlugin set a\n\t * default limit of 100.\n\t *\n\t *      createjs.Sound.registerSound(\"sound.mp3\", \"soundId\", 4);\n\t *\n\t * Sound can be used as a plugin with PreloadJS to help preload audio properly. Audio preloaded with PreloadJS is\n\t * automatically registered with the Sound class. When audio is not preloaded, Sound will do an automatic internal\n\t * load. As a result, it may fail to play the first time play is called if the audio is not finished loading. Use\n\t * the {{#crossLink \"Sound/fileload:event\"}}{{/crossLink}} event to determine when a sound has finished internally\n\t * preloading. It is recommended that all audio is preloaded before it is played.\n\t *\n\t *      var queue = new createjs.LoadQueue();\n\t *\t\tqueue.installPlugin(createjs.Sound);\n\t *\n\t * <b>Audio Sprites</b><br />\n\t * SoundJS has added support for {{#crossLink \"AudioSprite\"}}{{/crossLink}}, available as of version 0.6.0.\n\t * For those unfamiliar with audio sprites, they are much like CSS sprites or sprite sheets: multiple audio assets\n\t * grouped into a single file.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *\t\tvar assetsPath = \"./assets/\";\n\t *\t\tvar sounds = [{\n\t *\t\t\tsrc:\"MyAudioSprite.ogg\", data: {\n\t *\t\t\t\taudioSprite: [\n\t *\t\t\t\t\t{id:\"sound1\", startTime:0, duration:500},\n\t *\t\t\t\t\t{id:\"sound2\", startTime:1000, duration:400},\n\t *\t\t\t\t\t{id:\"sound3\", startTime:1700, duration: 1000}\n\t *\t\t\t\t]}\n \t *\t\t\t}\n\t *\t\t];\n\t *\t\tcreatejs.Sound.alternateExtensions = [\"mp3\"];\n\t *\t\tcreatejs.Sound.on(\"fileload\", loadSound);\n\t *\t\tcreatejs.Sound.registerSounds(sounds, assetsPath);\n\t *\t\t// after load is complete\n\t *\t\tcreatejs.Sound.play(\"sound2\");\n\t *\n\t * <b>Mobile Playback</b><br />\n\t * Devices running iOS require the WebAudio context to be \"unlocked\" by playing at least one sound inside of a user-\n\t * initiated event (such as touch/click). Earlier versions of SoundJS included a \"MobileSafe\" sample, but this is no\n\t * longer necessary as of SoundJS 0.6.2.\n\t * <ul>\n\t *     <li>\n\t *         In SoundJS 0.4.1 and above, you can either initialize plugins or use the {{#crossLink \"WebAudioPlugin/playEmptySound\"}}{{/crossLink}}\n\t *         method in the call stack of a user input event to manually unlock the audio context.\n\t *     </li>\n\t *     <li>\n\t *         In SoundJS 0.6.2 and above, SoundJS will automatically listen for the first document-level \"mousedown\"\n\t *         and \"touchend\" event, and unlock WebAudio. This will continue to check these events until the WebAudio\n\t *         context becomes \"unlocked\" (changes from \"suspended\" to \"running\")\n\t *     </li>\n\t *     <li>\n\t *         Both the \"mousedown\" and \"touchend\" events can be used to unlock audio in iOS9+, the \"touchstart\" event\n\t *         will work in iOS8 and below. The \"touchend\" event will only work in iOS9 when the gesture is interpreted\n\t *         as a \"click\", so if the user long-presses the button, it will no longer work.\n\t *     </li>\n\t *     <li>\n\t *         When using the <a href=\"http://www.createjs.com/docs/easeljs/classes/Touch.html\">EaselJS Touch class</a>,\n\t *         the \"mousedown\" event will not fire when a canvas is clicked, since MouseEvents are prevented, to ensure\n\t *         only touch events fire. To get around this, you can either rely on \"touchend\", or:\n\t *         <ol>\n\t *             <li>Set the `allowDefault` property on the Touch class constructor to `true` (defaults to `false`).</li>\n\t *             <li>Set the `preventSelection` property on the EaselJS `Stage` to `false`.</li>\n\t *         </ol>\n\t *         These settings may change how your application behaves, and are not recommended.\n\t *     </li>\n\t * </ul>\n\t *\n\t * <b>Loading Alternate Paths and Extension-less Files</b><br />\n\t * SoundJS supports loading alternate paths and extension-less files by passing an object instead of a string for\n\t * the `src` property, which is a hash using the format `{extension:\"path\", extension2:\"path2\"}`. These labels are\n\t * how SoundJS determines if the browser will support the sound. This also enables multiple formats to live in\n\t * different folders, or on CDNs, which often has completely different filenames for each file.\n\t *\n\t * Priority is determined by the property order (first property is tried first).  This is supported by both internal loading\n\t * and loading with PreloadJS.\n\t *\n\t * <em>Note: an id is required for playback.</em>\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *\t\tvar sounds = {path:\"./audioPath/\",\n\t * \t\t\t\tmanifest: [\n\t *\t\t\t\t{id: \"cool\", src: {mp3:\"mp3/awesome.mp3\", ogg:\"noExtensionOggFile\"}}\n\t *\t\t]};\n\t *\n\t *\t\tcreatejs.Sound.alternateExtensions = [\"mp3\"];\n\t *\t\tcreatejs.Sound.addEventListener(\"fileload\", handleLoad);\n\t *\t\tcreatejs.Sound.registerSounds(sounds);\n\t *\n\t * <h3>Known Browser and OS issues</h3>\n\t * <b>IE 9 HTML Audio limitations</b><br />\n\t * <ul><li>There is a delay in applying volume changes to tags that occurs once playback is started. So if you have\n\t * muted all sounds, they will all play during this delay until the mute applies internally. This happens regardless of\n\t * when or how you apply the volume change, as the tag seems to need to play to apply it.</li>\n     * <li>MP3 encoding will not always work for audio tags, particularly in Internet Explorer. We've found default\n\t * encoding with 64kbps works.</li>\n\t * <li>Occasionally very short samples will get cut off.</li>\n\t * <li>There is a limit to how many audio tags you can load and play at once, which appears to be determined by\n\t * hardware and browser settings.  See {{#crossLink \"HTMLAudioPlugin.MAX_INSTANCES\"}}{{/crossLink}} for a safe\n\t * estimate.</li></ul>\n\t *\n\t * <b>Firefox 25 Web Audio limitations</b>\n\t * <ul><li>mp3 audio files do not load properly on all windows machines, reported\n\t * <a href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=929969\" target=\"_blank\">here</a>. </br>\n\t * For this reason it is recommended to pass another FF supported type (ie ogg) first until this bug is resolved, if\n\t * possible.</li></ul>\n\n\t * <b>Safari limitations</b><br />\n\t * <ul><li>Safari requires Quicktime to be installed for audio playback.</li></ul>\n\t *\n\t * <b>iOS 6 Web Audio limitations</b><br />\n\t * <ul><li>Sound is initially locked, and must be unlocked via a user-initiated event. Please see the section on\n\t * Mobile Playback above.</li>\n\t * <li>A bug exists that will distort un-cached web audio when a video element is present in the DOM that has audio\n\t * at a different sampleRate.</li>\n\t * </ul>\n\t *\n\t * <b>Android HTML Audio limitations</b><br />\n\t * <ul><li>We have no control over audio volume. Only the user can set volume on their device.</li>\n\t * <li>We can only play audio inside a user event (touch/click).  This currently means you cannot loop sound or use\n\t * a delay.</li></ul>\n\t *\n\t * <b>Web Audio and PreloadJS</b><br />\n\t * <ul><li>Web Audio must be loaded through XHR, therefore when used with PreloadJS, tag loading is not possible.\n\t * This means that tag loading can not be used to avoid cross domain issues.</li><ul>\n\t *\n\t * @class Sound\n\t * @static\n\t * @uses EventDispatcher\n\t */\n\tfunction Sound() {\n\t\tthrow \"Sound cannot be instantiated\";\n\t}\n\n\tvar s = Sound;\n\n\n// Static Properties\n\t/**\n\t * The interrupt value to interrupt any currently playing instance with the same source, if the maximum number of\n\t * instances of the sound are already playing.\n\t * @property INTERRUPT_ANY\n\t * @type {String}\n\t * @default any\n\t * @static\n\t */\n\ts.INTERRUPT_ANY = \"any\";\n\n\t/**\n\t * The interrupt value to interrupt the earliest currently playing instance with the same source that progressed the\n\t * least distance in the audio track, if the maximum number of instances of the sound are already playing.\n\t * @property INTERRUPT_EARLY\n\t * @type {String}\n\t * @default early\n\t * @static\n\t */\n\ts.INTERRUPT_EARLY = \"early\";\n\n\t/**\n\t * The interrupt value to interrupt the currently playing instance with the same source that progressed the most\n\t * distance in the audio track, if the maximum number of instances of the sound are already playing.\n\t * @property INTERRUPT_LATE\n\t * @type {String}\n\t * @default late\n\t * @static\n\t */\n\ts.INTERRUPT_LATE = \"late\";\n\n\t/**\n\t * The interrupt value to not interrupt any currently playing instances with the same source, if the maximum number of\n\t * instances of the sound are already playing.\n\t * @property INTERRUPT_NONE\n\t * @type {String}\n\t * @default none\n\t * @static\n\t */\n\ts.INTERRUPT_NONE = \"none\";\n\n\t/**\n\t * Defines the playState of an instance that is still initializing.\n\t * @property PLAY_INITED\n\t * @type {String}\n\t * @default playInited\n\t * @static\n\t */\n\ts.PLAY_INITED = \"playInited\";\n\n\t/**\n\t * Defines the playState of an instance that is currently playing or paused.\n\t * @property PLAY_SUCCEEDED\n\t * @type {String}\n\t * @default playSucceeded\n\t * @static\n\t */\n\ts.PLAY_SUCCEEDED = \"playSucceeded\";\n\n\t/**\n\t * Defines the playState of an instance that was interrupted by another instance.\n\t * @property PLAY_INTERRUPTED\n\t * @type {String}\n\t * @default playInterrupted\n\t * @static\n\t */\n\ts.PLAY_INTERRUPTED = \"playInterrupted\";\n\n\t/**\n\t * Defines the playState of an instance that completed playback.\n\t * @property PLAY_FINISHED\n\t * @type {String}\n\t * @default playFinished\n\t * @static\n\t */\n\ts.PLAY_FINISHED = \"playFinished\";\n\n\t/**\n\t * Defines the playState of an instance that failed to play. This is usually caused by a lack of available channels\n\t * when the interrupt mode was \"INTERRUPT_NONE\", the playback stalled, or the sound could not be found.\n\t * @property PLAY_FAILED\n\t * @type {String}\n\t * @default playFailed\n\t * @static\n\t */\n\ts.PLAY_FAILED = \"playFailed\";\n\n\t/**\n\t * A list of the default supported extensions that Sound will <i>try</i> to play. Plugins will check if the browser\n\t * can play these types, so modifying this list before a plugin is initialized will allow the plugins to try to\n\t * support additional media types.\n\t *\n\t * NOTE this does not currently work for {{#crossLink \"FlashAudioPlugin\"}}{{/crossLink}}.\n\t *\n\t * More details on file formats can be found at <a href=\"http://en.wikipedia.org/wiki/Audio_file_format\" target=\"_blank\">http://en.wikipedia.org/wiki/Audio_file_format</a>.<br />\n\t * A very detailed list of file formats can be found at <a href=\"http://www.fileinfo.com/filetypes/audio\" target=\"_blank\">http://www.fileinfo.com/filetypes/audio</a>.\n\t * @property SUPPORTED_EXTENSIONS\n\t * @type {Array[String]}\n\t * @default [\"mp3\", \"ogg\", \"opus\", \"mpeg\", \"wav\", \"m4a\", \"mp4\", \"aiff\", \"wma\", \"mid\"]\n\t * @since 0.4.0\n\t * @static\n\t */\n\ts.SUPPORTED_EXTENSIONS = [\"mp3\", \"ogg\", \"opus\", \"mpeg\", \"wav\", \"m4a\", \"mp4\", \"aiff\", \"wma\", \"mid\"];\n\n\t/**\n\t * Some extensions use another type of extension support to play (one of them is a codex).  This allows you to map\n\t * that support so plugins can accurately determine if an extension is supported.  Adding to this list can help\n\t * plugins determine more accurately if an extension is supported.\n\t *\n \t * A useful list of extensions for each format can be found at <a href=\"http://html5doctor.com/html5-audio-the-state-of-play/\" target=\"_blank\">http://html5doctor.com/html5-audio-the-state-of-play/</a>.\n\t * @property EXTENSION_MAP\n\t * @type {Object}\n\t * @since 0.4.0\n\t * @default {m4a:\"mp4\"}\n\t * @static\n\t */\n\ts.EXTENSION_MAP = {\n\t\tm4a:\"mp4\"\n\t};\n\n\t/**\n\t * The RegExp pattern used to parse file URIs. This supports simple file names, as well as full domain URIs with\n\t * query strings. The resulting match is: protocol:$1 domain:$2 path:$3 file:$4 extension:$5 query:$6.\n\t * @property FILE_PATTERN\n\t * @type {RegExp}\n\t * @static\n\t * @private\n\t */\n\ts.FILE_PATTERN = /^(?:(\\w+:)\\/{2}(\\w+(?:\\.\\w+)*\\/?))?([/.]*?(?:[^?]+)?\\/)?((?:[^/?]+)\\.(\\w+))(?:\\?(\\S+)?)?$/;\n\n\n// Class Public properties\n\t/**\n\t * Determines the default behavior for interrupting other currently playing instances with the same source, if the\n\t * maximum number of instances of the sound are already playing.  Currently the default is {{#crossLink \"Sound/INTERRUPT_NONE:property\"}}{{/crossLink}}\n\t * but this can be set and will change playback behavior accordingly.  This is only used when {{#crossLink \"Sound/play\"}}{{/crossLink}}\n\t * is called without passing a value for interrupt.\n\t * @property defaultInterruptBehavior\n\t * @type {String}\n\t * @default Sound.INTERRUPT_NONE, or \"none\"\n\t * @static\n\t * @since 0.4.0\n\t */\n\ts.defaultInterruptBehavior = s.INTERRUPT_NONE;  // OJR does s.INTERRUPT_ANY make more sense as default?  Needs game dev testing to see which case makes more sense.\n\n\t/**\n\t * An array of extensions to attempt to use when loading sound, if the default is unsupported by the active plugin.\n\t * These are applied in order, so if you try to Load Thunder.ogg in a browser that does not support ogg, and your\n\t * extensions array is [\"mp3\", \"m4a\", \"wav\"] it will check mp3 support, then m4a, then wav. The audio files need\n\t * to exist in the same location, as only the extension is altered.\n\t *\n\t * Note that regardless of which file is loaded, you can call {{#crossLink \"Sound/createInstance\"}}{{/crossLink}}\n\t * and {{#crossLink \"Sound/play\"}}{{/crossLink}} using the same id or full source path passed for loading.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *\tvar sounds = [\n\t *\t\t{src:\"myPath/mySound.ogg\", id:\"example\"},\n\t *\t];\n\t *\tcreatejs.Sound.alternateExtensions = [\"mp3\"]; // now if ogg is not supported, SoundJS will try asset0.mp3\n\t *\tcreatejs.Sound.on(\"fileload\", handleLoad); // call handleLoad when each sound loads\n\t *\tcreatejs.Sound.registerSounds(sounds, assetPath);\n\t *\t// ...\n\t *\tcreatejs.Sound.play(\"myPath/mySound.ogg\"); // works regardless of what extension is supported.  Note calling with ID is a better approach\n\t *\n\t * @property alternateExtensions\n\t * @type {Array}\n\t * @since 0.5.2\n\t * @static\n\t */\n\ts.alternateExtensions = [];\n\n\t/**\n\t * The currently active plugin. If this is null, then no plugin could be initialized. If no plugin was specified,\n\t * Sound attempts to apply the default plugins: {{#crossLink \"WebAudioPlugin\"}}{{/crossLink}}, followed by\n\t * {{#crossLink \"HTMLAudioPlugin\"}}{{/crossLink}}.\n\t * @property activePlugin\n\t * @type {Object}\n\t * @static\n\t */\n    s.activePlugin = null;\n\n\n// class getter / setter properties\n\n\t/**\n\t * Set the master volume of Sound. The master volume is multiplied against each sound's individual volume.  For\n\t * example, if master volume is 0.5 and a sound's volume is 0.5, the resulting volume is 0.25. To set individual\n\t * sound volume, use AbstractSoundInstance {{#crossLink \"AbstractSoundInstance/volume:property\"}}{{/crossLink}}\n\t * instead.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *     createjs.Sound.volume = 0.5;\n\t *\n\t * @property volume\n\t * @type {Number}\n\t * @default 1\n\t * @since 0.6.1\n\t */\n\n\t/**\n\t * The internal volume level. Use {{#crossLink \"Sound/volume:property\"}}{{/crossLink}} to adjust the master volume.\n\t * @property _masterVolume\n\t * @type {number}\n\t * @default 1\n\t * @private\n\t */\n\ts._masterVolume = 1;\n\n\t/**\n\t * Use the {{#crossLink \"Sound/volume:property\"}}{{/crossLink}} property instead.\n\t * @method _getMasterVolume\n\t * @private\n\t * @static\n\t * @return {Number}\n\t **/\n\ts._getMasterVolume = function() {\n\t\treturn this._masterVolume;\n\t};\n\t// Sound.getMasterVolume is @deprecated. Remove for 1.1+\n\ts.getVolume = createjs.deprecate(s._getMasterVolume, \"Sound.getVolume\");\n\t/**\n\t * Use the {{#crossLink \"Sound/volume:property\"}}{{/crossLink}} property instead.\n\t * @method _setMasterVolume\n\t * @static\n\t * @private\n\t **/\n\ts._setMasterVolume = function(value) {\n\t\tif (Number(value) == null) { return; }\n\t\tvalue = Math.max(0, Math.min(1, value));\n\t\ts._masterVolume = value;\n\t\tif (!this.activePlugin || !this.activePlugin.setVolume || !this.activePlugin.setVolume(value)) {\n\t\t\tvar instances = this._instances;\n\t\t\tfor (var i = 0, l = instances.length; i < l; i++) {\n\t\t\t\tinstances[i].setMasterVolume(value);\n\t\t\t}\n\t\t}\n\t};\n\t// Sound.stMasterVolume is @deprecated. Remove for 1.1+\n\ts.setVolume = createjs.deprecate(s._setMasterVolume, \"Sound.setVolume\");\n\n\t/**\n\t * Mute/Unmute all audio. Note that muted audio still plays at 0 volume. This global mute value is maintained\n\t * separately and when set will override, but not change the mute property of individual instances. To mute an individual\n\t * instance, use AbstractSoundInstance {{#crossLink \"AbstractSoundInstance/muted:property\"}}{{/crossLink}} instead.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *     createjs.Sound.muted = true;\n\t *\n\t *\n\t * @property muted\n\t * @type {Boolean}\n\t * @default false\n\t * @since 0.6.1\n\t */\n\ts._masterMute = false;\n\n\t/**\n\t * Use the {{#crossLink \"Sound/muted:property\"}}{{/crossLink}} property instead.\n\t * @method _getMute\n\t * @returns {Boolean}\n\t * @static\n\t * @private\n\t */\n\ts._getMute = function () {\n\t\treturn this._masterMute;\n\t};\n\t// Sound.getMute is @deprecated. Remove for 1.1+\n\ts.getMute = createjs.deprecate(s._getMute, \"Sound.getMute\");\n\n\t/**\n\t * Use the {{#crossLink \"Sound/muted:property\"}}{{/crossLink}} property instead.\n\t * @method _setMute\n\t * @param {Boolean} value The muted value\n\t * @static\n\t * @private\n\t */\n\ts._setMute = function (value) {\n\t\tif (value == null) { return; }\n\t\tthis._masterMute = value;\n\t\tif (!this.activePlugin || !this.activePlugin.setMute || !this.activePlugin.setMute(value)) {\n\t\t\tvar instances = this._instances;\n\t\t\tfor (var i = 0, l = instances.length; i < l; i++) {\n\t\t\t\tinstances[i].setMasterMute(value);\n\t\t\t}\n\t\t}\n\t};\n\t// Sound.setMute is @deprecated. Remove for 1.1+\n\ts.setMute = createjs.deprecate(s._setMute, \"Sound.setMute\");\n\n\t/**\n\t * Get the active plugins capabilities, which help determine if a plugin can be used in the current environment,\n\t * or if the plugin supports a specific feature. Capabilities include:\n\t * <ul>\n\t *     <li><b>panning:</b> If the plugin can pan audio from left to right</li>\n\t *     <li><b>volume;</b> If the plugin can control audio volume.</li>\n\t *     <li><b>tracks:</b> The maximum number of audio tracks that can be played back at a time. This will be -1\n\t *     if there is no known limit.</li>\n\t * <br />An entry for each file type in {{#crossLink \"Sound/SUPPORTED_EXTENSIONS:property\"}}{{/crossLink}}:\n\t *     <li><b>mp3:</b> If MP3 audio is supported.</li>\n\t *     <li><b>ogg:</b> If OGG audio is supported.</li>\n\t *     <li><b>wav:</b> If WAV audio is supported.</li>\n\t *     <li><b>mpeg:</b> If MPEG audio is supported.</li>\n\t *     <li><b>m4a:</b> If M4A audio is supported.</li>\n\t *     <li><b>mp4:</b> If MP4 audio is supported.</li>\n\t *     <li><b>aiff:</b> If aiff audio is supported.</li>\n\t *     <li><b>wma:</b> If wma audio is supported.</li>\n\t *     <li><b>mid:</b> If mid audio is supported.</li>\n\t * </ul>\n\t *\n\t * You can get a specific capability of the active plugin using standard object notation\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      var mp3 = createjs.Sound.capabilities.mp3;\n\t *\n\t * Note this property is read only.\n\t *\n\t * @property capabilities\n\t * @type {Object}\n\t * @static\n\t * @readOnly\n\t * @since 0.6.1\n\t */\n\n\t/**\n\t * Use the {{#crossLink \"Sound/capabilities:property\"}}{{/crossLink}} property instead.\n\t * @returns {null}\n\t * @private\n\t */\n\ts._getCapabilities = function() {\n\t\tif (s.activePlugin == null) { return null; }\n\t\treturn s.activePlugin._capabilities;\n\t};\n\t// Sound.getCapabilities is @deprecated. Remove for 1.1+\n\ts.getCapabilities = createjs.deprecate(s._getCapabilities, \"Sound.getCapabilities\");\n\n\tObject.defineProperties(s, {\n\t\tvolume: { get: s._getMasterVolume, set: s._setMasterVolume },\n\t\tmuted: { get: s._getMute, set: s._setMute },\n\t\tcapabilities: { get: s._getCapabilities }\n\t});\n\n\n// Class Private properties\n\t/**\n\t * Determines if the plugins have been registered. If false, the first call to {{#crossLink \"play\"}}{{/crossLink}} will instantiate the default\n\t * plugins ({{#crossLink \"WebAudioPlugin\"}}{{/crossLink}}, followed by {{#crossLink \"HTMLAudioPlugin\"}}{{/crossLink}}).\n\t * If plugins have been registered, but none are applicable, then sound playback will fail.\n\t * @property _pluginsRegistered\n\t * @type {Boolean}\n\t * @default false\n\t * @static\n\t * @private\n\t */\n\ts._pluginsRegistered = false;\n\n\t/**\n\t * Used internally to assign unique IDs to each AbstractSoundInstance.\n\t * @property _lastID\n\t * @type {Number}\n\t * @static\n\t * @private\n\t */\n\ts._lastID = 0;\n\n\t/**\n\t * An array containing all currently playing instances. This allows Sound to control the volume, mute, and playback of\n\t * all instances when using static APIs like {{#crossLink \"Sound/stop\"}}{{/crossLink}} and {{#crossLink \"Sound/volume:property\"}}{{/crossLink}}.\n\t * When an instance has finished playback, it gets removed via the {{#crossLink \"Sound/finishedPlaying\"}}{{/crossLink}}\n\t * method. If the user replays an instance, it gets added back in via the {{#crossLink \"Sound/_beginPlaying\"}}{{/crossLink}}\n\t * method.\n\t * @property _instances\n\t * @type {Array}\n\t * @private\n\t * @static\n\t */\n\ts._instances = [];\n\n\t/**\n\t * An object hash storing objects with sound sources, startTime, and duration via there corresponding ID.\n\t * @property _idHash\n\t * @type {Object}\n\t * @private\n\t * @static\n\t */\n\ts._idHash = {};\n\n\t/**\n\t * An object hash that stores preloading sound sources via the parsed source that is passed to the plugin.  Contains the\n\t * source, id, and data that was passed in by the user.  Parsed sources can contain multiple instances of source, id,\n\t * and data.\n\t * @property _preloadHash\n\t * @type {Object}\n\t * @private\n\t * @static\n\t */\n\ts._preloadHash = {};\n\n\t/**\n\t * An object hash storing {{#crossLink \"PlayPropsConfig\"}}{{/crossLink}} via the parsed source that is passed as defaultPlayProps in\n\t * {{#crossLink \"Sound/registerSound\"}}{{/crossLink}} and {{#crossLink \"Sound/registerSounds\"}}{{/crossLink}}.\n\t * @property _defaultPlayPropsHash\n\t * @type {Object}\n\t * @private\n\t * @static\n\t * @since 0.6.1\n\t */\n\ts._defaultPlayPropsHash = {};\n\n\n// EventDispatcher methods:\n\ts.addEventListener = null;\n\ts.removeEventListener = null;\n\ts.removeAllEventListeners = null;\n\ts.dispatchEvent = null;\n\ts.hasEventListener = null;\n\ts._listeners = null;\n\n\tcreatejs.EventDispatcher.initialize(s); // inject EventDispatcher methods.\n\n\n// Events\n\t/**\n\t * This event is fired when a file finishes loading internally. This event is fired for each loaded sound,\n\t * so any handler methods should look up the <code>event.src</code> to handle a particular sound.\n\t * @event fileload\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type.\n\t * @param {String} src The source of the sound that was loaded.\n\t * @param {String} [id] The id passed in when the sound was registered. If one was not provided, it will be null.\n\t * @param {Number|Object} [data] Any additional data associated with the item. If not provided, it will be undefined.\n\t * @since 0.4.1\n\t */\n\n\t/**\n\t * This event is fired when a file fails loading internally. This event is fired for each loaded sound,\n\t * so any handler methods should look up the <code>event.src</code> to handle a particular sound.\n\t * @event fileerror\n\t * @param {Object} target The object that dispatched the event.\n\t * @param {String} type The event type.\n\t * @param {String} src The source of the sound that was loaded.\n\t * @param {String} [id] The id passed in when the sound was registered. If one was not provided, it will be null.\n\t * @param {Number|Object} [data] Any additional data associated with the item. If not provided, it will be undefined.\n\t * @since 0.6.0\n\t */\n\n\n// Class Public Methods\n\t/**\n\t * Get the preload rules to allow Sound to be used as a plugin by <a href=\"http://preloadjs.com\" target=\"_blank\">PreloadJS</a>.\n\t * Any load calls that have the matching type or extension will fire the callback method, and use the resulting\n\t * object, which is potentially modified by Sound. This helps when determining the correct path, as well as\n\t * registering the audio instance(s) with Sound. This method should not be called, except by PreloadJS.\n\t * @method getPreloadHandlers\n\t * @return {Object} An object containing:\n\t * <ul><li>callback: A preload callback that is fired when a file is added to PreloadJS, which provides\n\t *      Sound a mechanism to modify the load parameters, select the correct file format, register the sound, etc.</li>\n\t *      <li>types: A list of file types that are supported by Sound (currently supports \"sound\").</li>\n\t *      <li>extensions: A list of file extensions that are supported by Sound (see {{#crossLink \"Sound/SUPPORTED_EXTENSIONS:property\"}}{{/crossLink}}).</li></ul>\n\t * @static\n\t * @private\n\t */\n\ts.getPreloadHandlers = function () {\n\t\treturn {\n\t\t\tcallback:createjs.proxy(s.initLoad, s),\n\t\t\ttypes:[\"sound\"],\n\t\t\textensions:s.SUPPORTED_EXTENSIONS\n\t\t};\n\t};\n\n\t/**\n\t * Used to dispatch fileload events from internal loading.\n\t * @method _handleLoadComplete\n\t * @param event A loader event.\n\t * @private\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts._handleLoadComplete = function(event) {\n\t\tvar src = event.target.getItem().src;\n\t\tif (!s._preloadHash[src]) {return;}\n\n\t\tfor (var i = 0, l = s._preloadHash[src].length; i < l; i++) {\n\t\t\tvar item = s._preloadHash[src][i];\n\t\t\ts._preloadHash[src][i] = true;\n\n\t\t\tif (!s.hasEventListener(\"fileload\")) { continue; }\n\n\t\t\tvar event = new createjs.Event(\"fileload\");\n\t\t\tevent.src = item.src;\n\t\t\tevent.id = item.id;\n\t\t\tevent.data = item.data;\n\t\t\tevent.sprite = item.sprite;\n\n\t\t\ts.dispatchEvent(event);\n\t\t}\n\t};\n\n\t/**\n\t * Used to dispatch error events from internal preloading.\n\t * @param event\n\t * @private\n\t * @since 0.6.0\n\t * @static\n\t */\n\ts._handleLoadError = function(event) {\n\t\tvar src = event.target.getItem().src;\n\t\tif (!s._preloadHash[src]) {return;}\n\n\t\tfor (var i = 0, l = s._preloadHash[src].length; i < l; i++) {\n\t\t\tvar item = s._preloadHash[src][i];\n\t\t\ts._preloadHash[src][i] = false;\n\n\t\t\tif (!s.hasEventListener(\"fileerror\")) { continue; }\n\n\t\t\tvar event = new createjs.Event(\"fileerror\");\n\t\t\tevent.src = item.src;\n\t\t\tevent.id = item.id;\n\t\t\tevent.data = item.data;\n\t\t\tevent.sprite = item.sprite;\n\n\t\t\ts.dispatchEvent(event);\n\t\t}\n\t};\n\n\t/**\n\t * Used by {{#crossLink \"Sound/registerPlugins\"}}{{/crossLink}} to register a Sound plugin.\n\t *\n\t * @method _registerPlugin\n\t * @param {Object} plugin The plugin class to install.\n\t * @return {Boolean} Whether the plugin was successfully initialized.\n\t * @static\n\t * @private\n\t */\n\ts._registerPlugin = function (plugin) {\n\t\t// Note: Each plugin is passed in as a class reference, but we store the activePlugin as an instance\n\t\tif (plugin.isSupported()) {\n\t\t\ts.activePlugin = new plugin();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\t/**\n\t * Register a list of Sound plugins, in order of precedence. To register a single plugin, pass a single element in the array.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      createjs.FlashAudioPlugin.swfPath = \"../src/soundjs/flashaudio/\";\n\t *      createjs.Sound.registerPlugins([createjs.WebAudioPlugin, createjs.HTMLAudioPlugin, createjs.FlashAudioPlugin]);\n\t *\n\t * @method registerPlugins\n\t * @param {Array} plugins An array of plugins classes to install.\n\t * @return {Boolean} Whether a plugin was successfully initialized.\n\t * @static\n\t */\n\ts.registerPlugins = function (plugins) {\n\t\ts._pluginsRegistered = true;\n\t\tfor (var i = 0, l = plugins.length; i < l; i++) {\n\t\t\tif (s._registerPlugin(plugins[i])) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n\n\t/**\n\t * Initialize the default plugins. This method is automatically called when any audio is played or registered before\n\t * the user has manually registered plugins, and enables Sound to work without manual plugin setup. Currently, the\n\t * default plugins are {{#crossLink \"WebAudioPlugin\"}}{{/crossLink}} followed by {{#crossLink \"HTMLAudioPlugin\"}}{{/crossLink}}.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t * \tif (!createjs.initializeDefaultPlugins()) { return; }\n\t *\n\t * @method initializeDefaultPlugins\n\t * @returns {Boolean} True if a plugin was initialized, false otherwise.\n\t * @since 0.4.0\n\t * @static\n\t */\n\ts.initializeDefaultPlugins = function () {\n\t\tif (s.activePlugin != null) {return true;}\n\t\tif (s._pluginsRegistered) {return false;}\n\t\tif (s.registerPlugins([createjs.WebAudioPlugin, createjs.HTMLAudioPlugin])) {return true;}\n\t\treturn false;\n\t};\n\n\t/**\n\t * Determines if Sound has been initialized, and a plugin has been activated.\n\t *\n\t * <h4>Example</h4>\n\t * This example sets up a Flash fallback, but only if there is no plugin specified yet.\n\t *\n\t * \tif (!createjs.Sound.isReady()) {\n\t *\t\tcreatejs.FlashAudioPlugin.swfPath = \"../src/soundjs/flashaudio/\";\n\t * \t\tcreatejs.Sound.registerPlugins([createjs.WebAudioPlugin, createjs.HTMLAudioPlugin, createjs.FlashAudioPlugin]);\n\t *\t}\n\t *\n\t * @method isReady\n\t * @return {Boolean} If Sound has initialized a plugin.\n\t * @static\n\t */\n\ts.isReady = function () {\n\t\treturn (s.activePlugin != null);\n\t};\n\n\t/**\n\t * Process manifest items from <a href=\"http://preloadjs.com\" target=\"_blank\">PreloadJS</a>. This method is intended\n\t * for usage by a plugin, and not for direct interaction.\n\t * @method initLoad\n\t * @param {Object} src The object to load.\n\t * @return {Object|AbstractLoader} An instance of AbstractLoader.\n\t * @private\n\t * @static\n\t */\n\ts.initLoad = function (loadItem) {\n\t\tif (loadItem.type == \"video\") { return true; } // Don't handle video. PreloadJS's plugin model is really aggressive.\n\t\treturn s._registerSound(loadItem);\n\t};\n\n\t/**\n\t * Internal method for loading sounds.  This should not be called directly.\n\t *\n\t * @method _registerSound\n\t * @param {Object} src The object to load, containing src property and optionally containing id and data.\n\t * @return {Object} An object with the modified values that were passed in, which defines the sound.\n\t * Returns false if the source cannot be parsed or no plugins can be initialized.\n\t * Returns true if the source is already loaded.\n\t * @static\n\t * @private\n\t * @since 0.6.0\n\t */\n\n\ts._registerSound = function (loadItem) {\n\t\tif (!s.initializeDefaultPlugins()) {return false;}\n\n\t\tvar details;\n\t\tif (loadItem.src instanceof Object) {\n\t\t\tdetails = s._parseSrc(loadItem.src);\n\t\t\tdetails.src = loadItem.path + details.src;\n\t\t} else {\n\t\t\tdetails = s._parsePath(loadItem.src);\n\t\t}\n\t\tif (details == null) {return false;}\n\t\tloadItem.src = details.src;\n\t\tloadItem.type = \"sound\";\n\n\t\tvar data = loadItem.data;\n\t\tvar numChannels = null;\n\t\tif (data != null) {\n\t\t\tif (!isNaN(data.channels)) {\n\t\t\t\tnumChannels = parseInt(data.channels);\n\t\t\t} else if (!isNaN(data)) {\n\t\t\t\tnumChannels = parseInt(data);\n\t\t\t}\n\n\t\t\tif(data.audioSprite) {\n\t\t\t\tvar sp;\n\t\t\t\tfor(var i = data.audioSprite.length; i--; ) {\n\t\t\t\t\tsp = data.audioSprite[i];\n\t\t\t\t\ts._idHash[sp.id] = {src: loadItem.src, startTime: parseInt(sp.startTime), duration: parseInt(sp.duration)};\n\n\t\t\t\t\tif (sp.defaultPlayProps) {\n\t\t\t\t\t\ts._defaultPlayPropsHash[sp.id] = createjs.PlayPropsConfig.create(sp.defaultPlayProps);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (loadItem.id != null) {s._idHash[loadItem.id] = {src: loadItem.src}};\n\t\tvar loader = s.activePlugin.register(loadItem);\n\n\t\tSoundChannel.create(loadItem.src, numChannels);\n\n\t\t// return the number of instances to the user.  This will also be returned in the load event.\n\t\tif (data == null || !isNaN(data)) {\n\t\t\tloadItem.data = numChannels || SoundChannel.maxPerChannel();\n\t\t} else {\n\t\t\tloadItem.data.channels = numChannels || SoundChannel.maxPerChannel();\n\t\t}\n\n\t\tif (loader.type) {loadItem.type = loader.type;}\n\n\t\tif (loadItem.defaultPlayProps) {\n\t\t\ts._defaultPlayPropsHash[loadItem.src] = createjs.PlayPropsConfig.create(loadItem.defaultPlayProps);\n\t\t}\n\t\treturn loader;\n\t};\n\n\t/**\n\t * Register an audio file for loading and future playback in Sound. This is automatically called when using\n\t * <a href=\"http://preloadjs.com\" target=\"_blank\">PreloadJS</a>.  It is recommended to register all sounds that\n\t * need to be played back in order to properly prepare and preload them. Sound does internal preloading when required.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      createjs.Sound.alternateExtensions = [\"mp3\"];\n\t *      createjs.Sound.on(\"fileload\", handleLoad); // add an event listener for when load is completed\n\t *      createjs.Sound.registerSound(\"myAudioPath/mySound.ogg\", \"myID\", 3);\n\t *      createjs.Sound.registerSound({ogg:\"path1/mySound.ogg\", mp3:\"path2/mySoundNoExtension\"}, \"myID\", 3);\n\t *\n\t *\n\t * @method registerSound\n\t * @param {String | Object} src The source or an Object with a \"src\" property or an Object with multiple extension labeled src properties.\n\t * @param {String} [id] An id specified by the user to play the sound later.  Note id is required for when src is multiple extension labeled src properties.\n\t * @param {Number | Object} [data] Data associated with the item. Sound uses the data parameter as the number of\n\t * channels for an audio instance, however a \"channels\" property can be appended to the data object if it is used\n\t * for other information. The audio channels will set a default based on plugin if no value is found.\n\t * Sound also uses the data property to hold an {{#crossLink \"AudioSprite\"}}{{/crossLink}} array of objects in the following format {id, startTime, duration}.<br/>\n\t *   id used to play the sound later, in the same manner as a sound src with an id.<br/>\n\t *   startTime is the initial offset to start playback and loop from, in milliseconds.<br/>\n\t *   duration is the amount of time to play the clip for, in milliseconds.<br/>\n\t * This allows Sound to support audio sprites that are played back by id.\n\t * @param {string} basePath Set a path that will be prepended to src for loading.\n\t * @param {Object | PlayPropsConfig} defaultPlayProps Optional Playback properties that will be set as the defaults on any new AbstractSoundInstance.\n\t * See {{#crossLink \"PlayPropsConfig\"}}{{/crossLink}} for options.\n\t * @return {Object} An object with the modified values that were passed in, which defines the sound.\n\t * Returns false if the source cannot be parsed or no plugins can be initialized.\n\t * Returns true if the source is already loaded.\n\t * @static\n\t * @since 0.4.0\n\t */\n\ts.registerSound = function (src, id, data, basePath, defaultPlayProps) {\n\t\tvar loadItem = {src: src, id: id, data:data, defaultPlayProps:defaultPlayProps};\n\t\tif (src instanceof Object && src.src) {\n\t\t\tbasePath = id;\n\t\t\tloadItem = src;\n\t\t}\n\t\tloadItem = createjs.LoadItem.create(loadItem);\n\t\tloadItem.path = basePath;\n\n\t\tif (basePath != null && !(loadItem.src instanceof Object)) {loadItem.src = basePath + loadItem.src;}\n\n\t\tvar loader = s._registerSound(loadItem);\n\t\tif(!loader) {return false;}\n\n\t\tif (!s._preloadHash[loadItem.src]) { s._preloadHash[loadItem.src] = [];}\n\t\ts._preloadHash[loadItem.src].push(loadItem);\n\t\tif (s._preloadHash[loadItem.src].length == 1) {\n\t\t\t// OJR note this will disallow reloading a sound if loading fails or the source changes\n\t\t\tloader.on(\"complete\", this._handleLoadComplete, this);\n\t\t\tloader.on(\"error\", this._handleLoadError, this);\n\t\t\ts.activePlugin.preload(loader);\n\t\t} else {\n\t\t\tif (s._preloadHash[loadItem.src][0] == true) {return true;}\n\t\t}\n\n\t\treturn loadItem;\n\t};\n\n\t/**\n\t * Register an array of audio files for loading and future playback in Sound. It is recommended to register all\n\t * sounds that need to be played back in order to properly prepare and preload them. Sound does internal preloading\n\t * when required.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t * \t\tvar assetPath = \"./myAudioPath/\";\n\t *      var sounds = [\n\t *          {src:\"asset0.ogg\", id:\"example\"},\n\t *          {src:\"asset1.ogg\", id:\"1\", data:6},\n\t *          {src:\"asset2.mp3\", id:\"works\"}\n\t *          {src:{mp3:\"path1/asset3.mp3\", ogg:\"path2/asset3NoExtension\"}, id:\"better\"}\n\t *      ];\n\t *      createjs.Sound.alternateExtensions = [\"mp3\"];\t// if the passed extension is not supported, try this extension\n\t *      createjs.Sound.on(\"fileload\", handleLoad); // call handleLoad when each sound loads\n\t *      createjs.Sound.registerSounds(sounds, assetPath);\n\t *\n\t * @method registerSounds\n\t * @param {Array} sounds An array of objects to load. Objects are expected to be in the format needed for\n\t * {{#crossLink \"Sound/registerSound\"}}{{/crossLink}}: <code>{src:srcURI, id:ID, data:Data}</code>\n\t * with \"id\" and \"data\" being optional.\n\t * You can also pass an object with path and manifest properties, where path is a basePath and manifest is an array of objects to load.\n\t * Note id is required if src is an object with extension labeled src properties.\n\t * @param {string} basePath Set a path that will be prepended to each src when loading.  When creating, playing, or removing\n\t * audio that was loaded with a basePath by src, the basePath must be included.\n\t * @return {Object} An array of objects with the modified values that were passed in, which defines each sound.\n\t * Like registerSound, it will return false for any values when the source cannot be parsed or if no plugins can be initialized.\n\t * Also, it will return true for any values when the source is already loaded.\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.registerSounds = function (sounds, basePath) {\n\t\tvar returnValues = [];\n\t\tif (sounds.path) {\n\t\t\tif (!basePath) {\n\t\t\t\tbasePath = sounds.path;\n\t\t\t} else {\n\t\t\t\tbasePath = basePath + sounds.path;\n\t\t\t}\n\t\t\tsounds = sounds.manifest;\n\t\t\t// TODO document this feature\n\t\t}\n\t\tfor (var i = 0, l = sounds.length; i < l; i++) {\n\t\t\treturnValues[i] = createjs.Sound.registerSound(sounds[i].src, sounds[i].id, sounds[i].data, basePath, sounds[i].defaultPlayProps);\n\t\t}\n\t\treturn returnValues;\n\t};\n\n\t/**\n\t * Remove a sound that has been registered with {{#crossLink \"Sound/registerSound\"}}{{/crossLink}} or\n\t * {{#crossLink \"Sound/registerSounds\"}}{{/crossLink}}.\n\t * <br />Note this will stop playback on active instances playing this sound before deleting them.\n\t * <br />Note if you passed in a basePath, you need to pass it or prepend it to the src here.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      createjs.Sound.removeSound(\"myID\");\n\t *      createjs.Sound.removeSound(\"myAudioBasePath/mySound.ogg\");\n\t *      createjs.Sound.removeSound(\"myPath/myOtherSound.mp3\", \"myBasePath/\");\n\t *      createjs.Sound.removeSound({mp3:\"musicNoExtension\", ogg:\"music.ogg\"}, \"myBasePath/\");\n\t *\n\t * @method removeSound\n\t * @param {String | Object} src The src or ID of the audio, or an Object with a \"src\" property, or an Object with multiple extension labeled src properties.\n\t * @param {string} basePath Set a path that will be prepended to each src when removing.\n\t * @return {Boolean} True if sound is successfully removed.\n\t * @static\n\t * @since 0.4.1\n\t */\n\ts.removeSound = function(src, basePath) {\n\t\tif (s.activePlugin == null) {return false;}\n\n\t\tif (src instanceof Object && src.src) {src = src.src;}\n\n\t\tvar details;\n\t\tif (src instanceof Object) {\n\t\t\tdetails = s._parseSrc(src);\n\t\t} else {\n\t\t\tsrc = s._getSrcById(src).src;\n\t\t\tdetails = s._parsePath(src);\n\t\t}\n\t\tif (details == null) {return false;}\n\t\tsrc = details.src;\n\t\tif (basePath != null) {src = basePath + src;}\n\n\t\tfor(var prop in s._idHash){\n\t\t\tif(s._idHash[prop].src == src) {\n\t\t\t\tdelete(s._idHash[prop]);\n\t\t\t}\n\t\t}\n\n\t\t// clear from SoundChannel, which also stops and deletes all instances\n\t\tSoundChannel.removeSrc(src);\n\n\t\tdelete(s._preloadHash[src]);\n\n\t\ts.activePlugin.removeSound(src);\n\n\t\treturn true;\n\t};\n\n\t/**\n\t * Remove an array of audio files that have been registered with {{#crossLink \"Sound/registerSound\"}}{{/crossLink}} or\n\t * {{#crossLink \"Sound/registerSounds\"}}{{/crossLink}}.\n\t * <br />Note this will stop playback on active instances playing this audio before deleting them.\n\t * <br />Note if you passed in a basePath, you need to pass it or prepend it to the src here.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t * \t\tassetPath = \"./myPath/\";\n\t *      var sounds = [\n\t *          {src:\"asset0.ogg\", id:\"example\"},\n\t *          {src:\"asset1.ogg\", id:\"1\", data:6},\n\t *          {src:\"asset2.mp3\", id:\"works\"}\n\t *      ];\n\t *      createjs.Sound.removeSounds(sounds, assetPath);\n\t *\n\t * @method removeSounds\n\t * @param {Array} sounds An array of objects to remove. Objects are expected to be in the format needed for\n\t * {{#crossLink \"Sound/removeSound\"}}{{/crossLink}}: <code>{srcOrID:srcURIorID}</code>.\n\t * You can also pass an object with path and manifest properties, where path is a basePath and manifest is an array of objects to remove.\n\t * @param {string} basePath Set a path that will be prepended to each src when removing.\n\t * @return {Object} An array of Boolean values representing if the sounds with the same array index were\n\t * successfully removed.\n\t * @static\n\t * @since 0.4.1\n\t */\n\ts.removeSounds = function (sounds, basePath) {\n\t\tvar returnValues = [];\n\t\tif (sounds.path) {\n\t\t\tif (!basePath) {\n\t\t\t\tbasePath = sounds.path;\n\t\t\t} else {\n\t\t\t\tbasePath = basePath + sounds.path;\n\t\t\t}\n\t\t\tsounds = sounds.manifest;\n\t\t}\n\t\tfor (var i = 0, l = sounds.length; i < l; i++) {\n\t\t\treturnValues[i] = createjs.Sound.removeSound(sounds[i].src, basePath);\n\t\t}\n\t\treturn returnValues;\n\t};\n\n\t/**\n\t * Remove all sounds that have been registered with {{#crossLink \"Sound/registerSound\"}}{{/crossLink}} or\n\t * {{#crossLink \"Sound/registerSounds\"}}{{/crossLink}}.\n\t * <br />Note this will stop playback on all active sound instances before deleting them.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *     createjs.Sound.removeAllSounds();\n\t *\n\t * @method removeAllSounds\n\t * @static\n\t * @since 0.4.1\n\t */\n\ts.removeAllSounds = function() {\n\t\ts._idHash = {};\n\t\ts._preloadHash = {};\n\t\tSoundChannel.removeAll();\n\t\tif (s.activePlugin) {s.activePlugin.removeAllSounds();}\n\t};\n\n\t/**\n\t * Check if a source has been loaded by internal preloaders. This is necessary to ensure that sounds that are\n\t * not completed preloading will not kick off a new internal preload if they are played.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *     var mySound = \"assetPath/asset0.ogg\";\n\t *     if(createjs.Sound.loadComplete(mySound) {\n\t *         createjs.Sound.play(mySound);\n\t *     }\n\t *\n\t * @method loadComplete\n\t * @param {String} src The src or id that is being loaded.\n\t * @return {Boolean} If the src is already loaded.\n\t * @since 0.4.0\n\t * @static\n\t */\n\ts.loadComplete = function (src) {\n\t\tif (!s.isReady()) { return false; }\n\t\tvar details = s._parsePath(src);\n\t\tif (details) {\n\t\t\tsrc = s._getSrcById(details.src).src;\n\t\t} else {\n\t\t\tsrc = s._getSrcById(src).src;\n\t\t}\n\t\tif(s._preloadHash[src] == undefined) {return false;}\n\t\treturn (s._preloadHash[src][0] == true);  // src only loads once, so if it's true for the first it's true for all\n\t};\n\n\t/**\n\t * Parse the path of a sound. Alternate extensions will be attempted in order if the\n\t * current extension is not supported\n\t * @method _parsePath\n\t * @param {String} value The path to an audio source.\n\t * @return {Object} A formatted object that can be registered with the {{#crossLink \"Sound/activePlugin:property\"}}{{/crossLink}}\n\t * and returned to a preloader like <a href=\"http://preloadjs.com\" target=\"_blank\">PreloadJS</a>.\n\t * @private\n\t * @static\n\t */\n\ts._parsePath = function (value) {\n\t\tif (typeof(value) != \"string\") {value = value.toString();}\n\n\t\tvar match = value.match(s.FILE_PATTERN);\n\t\tif (match == null) {return false;}\n\n\t\tvar name = match[4];\n\t\tvar ext = match[5];\n\t\tvar c = s.capabilities;\n\t\tvar i = 0;\n\t\twhile (!c[ext]) {\n\t\t\text = s.alternateExtensions[i++];\n\t\t\tif (i > s.alternateExtensions.length) { return null;}\t// no extensions are supported\n\t\t}\n\t\tvalue = value.replace(\".\"+match[5], \".\"+ext);\n\n\t\tvar ret = {name:name, src:value, extension:ext};\n\t\treturn ret;\n\t};\n\n\t/**\n\t * Parse the path of a sound based on properties of src matching with supported extensions.\n\t * Returns false if none of the properties are supported\n\t * @method _parseSrc\n\t * @param {Object} value The paths to an audio source, indexed by extension type.\n\t * @return {Object} A formatted object that can be registered with the {{#crossLink \"Sound/activePlugin:property\"}}{{/crossLink}}\n\t * and returned to a preloader like <a href=\"http://preloadjs.com\" target=\"_blank\">PreloadJS</a>.\n\t * @private\n\t * @static\n\t */\n\ts._parseSrc = function (value) {\n\t\tvar ret = {name:undefined, src:undefined, extension:undefined};\n\t\tvar c = s.capabilities;\n\n\t\tfor (var prop in value) {\n\t\t  if(value.hasOwnProperty(prop) && c[prop]) {\n\t\t\t\tret.src = value[prop];\n\t\t\t\tret.extension = prop;\n\t\t\t\tbreak;\n\t\t  }\n\t\t}\n\t\tif (!ret.src) {return false;}\t// no matches\n\n\t\tvar i = ret.src.lastIndexOf(\"/\");\n\t\tif (i != -1) {\n\t\t\tret.name = ret.src.slice(i+1);\n\t\t} else {\n\t\t\tret.name = ret.src;\n\t\t}\n\n\t\treturn ret;\n\t};\n\n\t/* ---------------\n\t Static API.\n\t --------------- */\n\t/**\n\t * Play a sound and get a {{#crossLink \"AbstractSoundInstance\"}}{{/crossLink}} to control. If the sound fails to\n\t * play, an AbstractSoundInstance will still be returned, and have a playState of {{#crossLink \"Sound/PLAY_FAILED:property\"}}{{/crossLink}}.\n\t * Note that even on sounds with failed playback, you may still be able to call the {{#crossLink \"AbstractSoundInstance/play\"}}{{/crossLink}},\n\t * method, since the failure could be due to lack of available channels. If the src does not have a supported\n\t * extension or if there is no available plugin, a default AbstractSoundInstance will still be returned, which will\n\t * not play any audio, but will not generate errors.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      createjs.Sound.on(\"fileload\", handleLoad);\n\t *      createjs.Sound.registerSound(\"myAudioPath/mySound.mp3\", \"myID\", 3);\n\t *      function handleLoad(event) {\n\t *      \tcreatejs.Sound.play(\"myID\");\n\t *      \t// store off AbstractSoundInstance for controlling\n\t *      \tvar myInstance = createjs.Sound.play(\"myID\", {interrupt: createjs.Sound.INTERRUPT_ANY, loop:-1});\n\t *      }\n\t *\n\t * NOTE: To create an audio sprite that has not already been registered, both startTime and duration need to be set.\n\t * This is only when creating a new audio sprite, not when playing using the id of an already registered audio sprite.\n\t *\n\t * @method play\n\t * @param {String} src The src or ID of the audio.\n\t * @param {Object | PlayPropsConfig} props A PlayPropsConfig instance, or an object that contains the parameters to\n\t * play a sound. See the {{#crossLink \"PlayPropsConfig\"}}{{/crossLink}} for more info.\n\t * @return {AbstractSoundInstance} A {{#crossLink \"AbstractSoundInstance\"}}{{/crossLink}} that can be controlled\n\t * after it is created.\n\t * @static\n\t */\n\ts.play = function (src, props) {\n\t\tvar playProps = createjs.PlayPropsConfig.create(props);\n\t\tvar instance = s.createInstance(src, playProps.startTime, playProps.duration);\n\t\tvar ok = s._playInstance(instance, playProps);\n\t\tif (!ok) {instance._playFailed();}\n\t\treturn instance;\n\t};\n\n\t/**\n\t * Creates a {{#crossLink \"AbstractSoundInstance\"}}{{/crossLink}} using the passed in src. If the src does not have a\n\t * supported extension or if there is no available plugin, a default AbstractSoundInstance will be returned that can be\n\t * called safely but does nothing.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      var myInstance = null;\n\t *      createjs.Sound.on(\"fileload\", handleLoad);\n\t *      createjs.Sound.registerSound(\"myAudioPath/mySound.mp3\", \"myID\", 3);\n\t *      function handleLoad(event) {\n\t *      \tmyInstance = createjs.Sound.createInstance(\"myID\");\n\t *      \t// alternately we could call the following\n\t *      \tmyInstance = createjs.Sound.createInstance(\"myAudioPath/mySound.mp3\");\n\t *      }\n\t *\n\t * NOTE to create an audio sprite that has not already been registered, both startTime and duration need to be set.\n\t * This is only when creating a new audio sprite, not when playing using the id of an already registered audio sprite.\n\t *\n\t * @method createInstance\n\t * @param {String} src The src or ID of the audio.\n\t * @param {Number} [startTime=null] To create an audio sprite (with duration), the initial offset to start playback and loop from, in milliseconds.\n\t * @param {Number} [duration=null] To create an audio sprite (with startTime), the amount of time to play the clip for, in milliseconds.\n\t * @return {AbstractSoundInstance} A {{#crossLink \"AbstractSoundInstance\"}}{{/crossLink}} that can be controlled after it is created.\n\t * Unsupported extensions will return the default AbstractSoundInstance.\n\t * @since 0.4.0\n\t * @static\n\t */\n\ts.createInstance = function (src, startTime, duration) {\n\t\tif (!s.initializeDefaultPlugins()) { return new createjs.DefaultSoundInstance(src, startTime, duration); }\n\n\t\tvar defaultPlayProps = s._defaultPlayPropsHash[src];\t// for audio sprites, which create and store defaults by id\n\t\tsrc = s._getSrcById(src);\n\n\t\tvar details = s._parsePath(src.src);\n\n\t\tvar instance = null;\n\t\tif (details != null && details.src != null) {\n\t\t\tSoundChannel.create(details.src);\n\t\t\tif (startTime == null) { startTime = src.startTime; }\n\t\t\tinstance = s.activePlugin.create(details.src, startTime, duration || src.duration);\n\n\t\t\tdefaultPlayProps = defaultPlayProps || s._defaultPlayPropsHash[details.src];\n\t\t\tif (defaultPlayProps) {\n\t\t\t\tinstance.applyPlayProps(defaultPlayProps);\n\t\t\t}\n\t\t} else {\n\t\t\tinstance = new createjs.DefaultSoundInstance(src, startTime, duration);\n\t\t}\n\n\t\tinstance.uniqueId = s._lastID++;\n\n\t\treturn instance;\n\t};\n\n\t/**\n\t * Stop all audio (global stop). Stopped audio is reset, and not paused. To play audio that has been stopped,\n\t * call AbstractSoundInstance {{#crossLink \"AbstractSoundInstance/play\"}}{{/crossLink}}.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *     createjs.Sound.stop();\n\t *\n\t * @method stop\n\t * @static\n\t */\n\ts.stop = function () {\n\t\tvar instances = this._instances;\n\t\tfor (var i = instances.length; i--; ) {\n\t\t\tinstances[i].stop();  // NOTE stop removes instance from this._instances\n\t\t}\n\t};\n\n\t/**\n\t * Set the default playback properties for all new SoundInstances of the passed in src or ID.\n\t * See {{#crossLink \"PlayPropsConfig\"}}{{/crossLink}} for available properties.\n\t *\n\t * @method setDefaultPlayProps\n\t * @param {String} src The src or ID used to register the audio.\n\t * @param {Object | PlayPropsConfig} playProps The playback properties you would like to set.\n\t * @since 0.6.1\n\t */\n\ts.setDefaultPlayProps = function(src, playProps) {\n\t\tsrc = s._getSrcById(src);\n\t\ts._defaultPlayPropsHash[s._parsePath(src.src).src] = createjs.PlayPropsConfig.create(playProps);\n\t};\n\n\t/**\n\t * Get the default playback properties for the passed in src or ID.  These properties are applied to all\n\t * new SoundInstances.  Returns null if default does not exist.\n\t *\n\t * @method getDefaultPlayProps\n\t * @param {String} src The src or ID used to register the audio.\n\t * @returns {PlayPropsConfig} returns an existing PlayPropsConfig or null if one does not exist\n\t * @since 0.6.1\n\t */\n\ts.getDefaultPlayProps = function(src) {\n\t\tsrc = s._getSrcById(src);\n\t\treturn s._defaultPlayPropsHash[s._parsePath(src.src).src];\n\t};\n\n\n\t/* ---------------\n\t Internal methods\n\t --------------- */\n\t/**\n\t * Play an instance. This is called by the static API, as well as from plugins. This allows the core class to\n\t * control delays.\n\t * @method _playInstance\n\t * @param {AbstractSoundInstance} instance The {{#crossLink \"AbstractSoundInstance\"}}{{/crossLink}} to start playing.\n\t * @param {PlayPropsConfig} playProps A PlayPropsConfig object.\n\t * @return {Boolean} If the sound can start playing. Sounds that fail immediately will return false. Sounds that\n\t * have a delay will return true, but may still fail to play.\n\t * @private\n\t * @static\n\t */\n\ts._playInstance = function (instance, playProps) {\n\t\tvar defaultPlayProps = s._defaultPlayPropsHash[instance.src] || {};\n\t\tif (playProps.interrupt == null) {playProps.interrupt = defaultPlayProps.interrupt || s.defaultInterruptBehavior};\n\t\tif (playProps.delay == null) {playProps.delay = defaultPlayProps.delay || 0;}\n\t\tif (playProps.offset == null) {playProps.offset = instance.position;}\n\t\tif (playProps.loop == null) {playProps.loop = instance.loop;}\n\t\tif (playProps.volume == null) {playProps.volume = instance.volume;}\n\t\tif (playProps.pan == null) {playProps.pan = instance.pan;}\n\n\t\tif (playProps.delay == 0) {\n\t\t\tvar ok = s._beginPlaying(instance, playProps);\n\t\t\tif (!ok) {return false;}\n\t\t} else {\n\t\t\t//Note that we can't pass arguments to proxy OR setTimeout (IE only), so just wrap the function call.\n\t\t\t// OJR WebAudio may want to handle this differently, so it might make sense to move this functionality into the plugins in the future\n\t\t\tvar delayTimeoutId = setTimeout(function () {\n\t\t\t\ts._beginPlaying(instance, playProps);\n\t\t\t}, playProps.delay);\n\t\t\tinstance.delayTimeoutId = delayTimeoutId;\n\t\t}\n\n\t\tthis._instances.push(instance);\n\n\t\treturn true;\n\t};\n\n\t/**\n\t * Begin playback. This is called immediately or after delay by {{#crossLink \"Sound/playInstance\"}}{{/crossLink}}.\n\t * @method _beginPlaying\n\t * @param {AbstractSoundInstance} instance A {{#crossLink \"AbstractSoundInstance\"}}{{/crossLink}} to begin playback.\n\t * @param {PlayPropsConfig} playProps A PlayPropsConfig object.\n\t * @return {Boolean} If the sound can start playing. If there are no available channels, or the instance fails to\n\t * start, this will return false.\n\t * @private\n\t * @static\n\t */\n\ts._beginPlaying = function (instance, playProps) {\n\t\tif (!SoundChannel.add(instance, playProps.interrupt)) {\n\t\t\treturn false;\n\t\t}\n\t\tvar result = instance._beginPlaying(playProps);\n\t\tif (!result) {\n\t\t\tvar index = createjs.indexOf(this._instances, instance);\n\t\t\tif (index > -1) {this._instances.splice(index, 1);}\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\t/**\n\t * Get the source of a sound via the ID passed in with a register call. If no ID is found the value is returned\n\t * instead.\n\t * @method _getSrcById\n\t * @param {String} value The ID the sound was registered with.\n\t * @return {String} The source of the sound if it has been registered with this ID or the value that was passed in.\n\t * @private\n\t * @static\n\t */\n\ts._getSrcById = function (value) {\n\t\treturn s._idHash[value] || {src: value};\n\t};\n\n\t/**\n\t * A sound has completed playback, been interrupted, failed, or been stopped. This method removes the instance from\n\t * Sound management. It will be added again, if the sound re-plays. Note that this method is called from the\n\t * instances themselves.\n\t * @method _playFinished\n\t * @param {AbstractSoundInstance} instance The instance that finished playback.\n\t * @private\n\t * @static\n\t */\n\ts._playFinished = function (instance) {\n\t\tSoundChannel.remove(instance);\n\t\tvar index = createjs.indexOf(this._instances, instance);\n\t\tif (index > -1) {this._instances.splice(index, 1);}\t// OJR this will always be > -1, there is no way for an instance to exist without being added to this._instances\n\t};\n\n\tcreatejs.Sound = Sound;\n\n\t/**\n\t * An internal class that manages the number of active {{#crossLink \"AbstractSoundInstance\"}}{{/crossLink}} instances for\n\t * each sound type. This method is only used internally by the {{#crossLink \"Sound\"}}{{/crossLink}} class.\n\t *\n\t * The number of sounds is artificially limited by Sound in order to prevent over-saturation of a\n\t * single sound, as well as to stay within hardware limitations, although the latter may disappear with better\n\t * browser support.\n\t *\n\t * When a sound is played, this class ensures that there is an available instance, or interrupts an appropriate\n\t * sound that is already playing.\n\t * #class SoundChannel\n\t * @param {String} src The source of the instances\n\t * @param {Number} [max=1] The number of instances allowed\n\t * @constructor\n\t * @protected\n\t */\n\tfunction SoundChannel(src, max) {\n\t\tthis.init(src, max);\n\t}\n\n\t/* ------------\n\t Static API\n\t ------------ */\n\t/**\n\t * A hash of channel instances indexed by source.\n\t * #property channels\n\t * @type {Object}\n\t * @static\n\t */\n\tSoundChannel.channels = {};\n\n\t/**\n\t * Create a sound channel. Note that if the sound channel already exists, this will fail.\n\t * #method create\n\t * @param {String} src The source for the channel\n\t * @param {Number} max The maximum amount this channel holds. The default is {{#crossLink \"SoundChannel.maxDefault\"}}{{/crossLink}}.\n\t * @return {Boolean} If the channels were created.\n\t * @static\n\t */\n\tSoundChannel.create = function (src, max) {\n\t\tvar channel = SoundChannel.get(src);\n\t\tif (channel == null) {\n\t\t\tSoundChannel.channels[src] = new SoundChannel(src, max);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\t/**\n\t * Delete a sound channel, stop and delete all related instances. Note that if the sound channel does not exist, this will fail.\n\t * #method remove\n\t * @param {String} src The source for the channel\n\t * @return {Boolean} If the channels were deleted.\n\t * @static\n\t */\n\tSoundChannel.removeSrc = function (src) {\n\t\tvar channel = SoundChannel.get(src);\n\t\tif (channel == null) {return false;}\n\t\tchannel._removeAll();\t// this stops and removes all active instances\n\t\tdelete(SoundChannel.channels[src]);\n\t\treturn true;\n\t};\n\t/**\n\t * Delete all sound channels, stop and delete all related instances.\n\t * #method removeAll\n\t * @static\n\t */\n\tSoundChannel.removeAll = function () {\n\t\tfor(var channel in SoundChannel.channels) {\n\t\t\tSoundChannel.channels[channel]._removeAll();\t// this stops and removes all active instances\n\t\t}\n\t\tSoundChannel.channels = {};\n\t};\n\t/**\n\t * Add an instance to a sound channel.\n\t * #method add\n\t * @param {AbstractSoundInstance} instance The instance to add to the channel\n\t * @param {String} interrupt The interrupt value to use. Please see the {{#crossLink \"Sound/play\"}}{{/crossLink}}\n\t * for details on interrupt modes.\n\t * @return {Boolean} The success of the method call. If the channel is full, it will return false.\n\t * @static\n\t */\n\tSoundChannel.add = function (instance, interrupt) {\n\t\tvar channel = SoundChannel.get(instance.src);\n\t\tif (channel == null) {return false;}\n\t\treturn channel._add(instance, interrupt);\n\t};\n\t/**\n\t * Remove an instance from the channel.\n\t * #method remove\n\t * @param {AbstractSoundInstance} instance The instance to remove from the channel\n\t * @return The success of the method call. If there is no channel, it will return false.\n\t * @static\n\t */\n\tSoundChannel.remove = function (instance) {\n\t\tvar channel = SoundChannel.get(instance.src);\n\t\tif (channel == null) {return false;}\n\t\tchannel._remove(instance);\n\t\treturn true;\n\t};\n\t/**\n\t * Get the maximum number of sounds you can have in a channel.\n\t * #method maxPerChannel\n\t * @return {Number} The maximum number of sounds you can have in a channel.\n\t */\n\tSoundChannel.maxPerChannel = function () {\n\t\treturn p.maxDefault;\n\t};\n\t/**\n\t * Get a channel instance by its src.\n\t * #method get\n\t * @param {String} src The src to use to look up the channel\n\t * @static\n\t */\n\tSoundChannel.get = function (src) {\n\t\treturn SoundChannel.channels[src];\n\t};\n\n\tvar p = SoundChannel.prototype;\n\tp.constructor = SoundChannel;\n\n\t/**\n\t * The source of the channel.\n\t * #property src\n\t * @type {String}\n\t */\n\tp.src = null;\n\n\t/**\n\t * The maximum number of instances in this channel.  -1 indicates no limit\n\t * #property max\n\t * @type {Number}\n\t */\n\tp.max = null;\n\n\t/**\n\t * The default value to set for max, if it isn't passed in.  Also used if -1 is passed.\n\t * #property maxDefault\n\t * @type {Number}\n\t * @default 100\n\t * @since 0.4.0\n\t */\n\tp.maxDefault = 100;\n\n\t/**\n\t * The current number of active instances.\n\t * #property length\n\t * @type {Number}\n\t */\n\tp.length = 0;\n\n\t/**\n\t * Initialize the channel.\n\t * #method init\n\t * @param {String} src The source of the channel\n\t * @param {Number} max The maximum number of instances in the channel\n\t * @protected\n\t */\n\tp.init = function (src, max) {\n\t\tthis.src = src;\n\t\tthis.max = max || this.maxDefault;\n\t\tif (this.max == -1) {this.max = this.maxDefault;}\n\t\tthis._instances = [];\n\t};\n\n\t/**\n\t * Get an instance by index.\n\t * #method get\n\t * @param {Number} index The index to return.\n\t * @return {AbstractSoundInstance} The AbstractSoundInstance at a specific instance.\n\t */\n\tp._get = function (index) {\n\t\treturn this._instances[index];\n\t};\n\n\t/**\n\t * Add a new instance to the channel.\n\t * #method add\n\t * @param {AbstractSoundInstance} instance The instance to add.\n\t * @return {Boolean} The success of the method call. If the channel is full, it will return false.\n\t */\n\tp._add = function (instance, interrupt) {\n\t\tif (!this._getSlot(interrupt, instance)) {return false;}\n\t\tthis._instances.push(instance);\n\t\tthis.length++;\n\t\treturn true;\n\t};\n\n\t/**\n\t * Remove an instance from the channel, either when it has finished playing, or it has been interrupted.\n\t * #method remove\n\t * @param {AbstractSoundInstance} instance The instance to remove\n\t * @return {Boolean} The success of the remove call. If the instance is not found in this channel, it will\n\t * return false.\n\t */\n\tp._remove = function (instance) {\n\t\tvar index = createjs.indexOf(this._instances, instance);\n\t\tif (index == -1) {return false;}\n\t\tthis._instances.splice(index, 1);\n\t\tthis.length--;\n\t\treturn true;\n\t};\n\n\t/**\n\t * Stop playback and remove all instances from the channel.  Usually in response to a delete call.\n\t * #method removeAll\n\t */\n\tp._removeAll = function () {\n\t\t// Note that stop() removes the item from the list\n\t\tfor (var i=this.length-1; i>=0; i--) {\n\t\t\tthis._instances[i].stop();\n\t\t}\n\t};\n\n\t/**\n\t * Get an available slot depending on interrupt value and if slots are available.\n\t * #method getSlot\n\t * @param {String} interrupt The interrupt value to use.\n\t * @param {AbstractSoundInstance} instance The sound instance that will go in the channel if successful.\n\t * @return {Boolean} Determines if there is an available slot. Depending on the interrupt mode, if there are no slots,\n\t * an existing AbstractSoundInstance may be interrupted. If there are no slots, this method returns false.\n\t */\n\tp._getSlot = function (interrupt, instance) {\n\t\tvar target, replacement;\n\n\t\tif (interrupt != Sound.INTERRUPT_NONE) {\n\t\t\t// First replacement candidate\n\t\t\treplacement = this._get(0);\n\t\t\tif (replacement == null) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tfor (var i = 0, l = this.max; i < l; i++) {\n\t\t\ttarget = this._get(i);\n\n\t\t\t// Available Space\n\t\t\tif (target == null) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Audio is complete or not playing\n\t\t\tif (target.playState == Sound.PLAY_FINISHED ||\n\t\t\t\ttarget.playState == Sound.PLAY_INTERRUPTED ||\n\t\t\t\ttarget.playState == Sound.PLAY_FAILED) {\n\t\t\t\treplacement = target;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (interrupt == Sound.INTERRUPT_NONE) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Audio is a better candidate than the current target, according to playhead\n\t\t\tif ((interrupt == Sound.INTERRUPT_EARLY && target.position < replacement.position) ||\n\t\t\t\t(interrupt == Sound.INTERRUPT_LATE && target.position > replacement.position)) {\n\t\t\t\t\treplacement = target;\n\t\t\t}\n\t\t}\n\n\t\tif (replacement != null) {\n\t\t\treplacement._interrupt();\n\t\t\tthis._remove(replacement);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\tp.toString = function () {\n\t\treturn \"[Sound SoundChannel]\";\n\t};\n\t// do not add SoundChannel to namespace\n\n}());\n\n//##############################################################################\n// AbstractSoundInstance.js\n//##############################################################################\n\n/**\n * A AbstractSoundInstance is created when any calls to the Sound API method {{#crossLink \"Sound/play\"}}{{/crossLink}} or\n * {{#crossLink \"Sound/createInstance\"}}{{/crossLink}} are made. The AbstractSoundInstance is returned by the active plugin\n * for control by the user.\n *\n * <h4>Example</h4>\n *\n *      var myInstance = createjs.Sound.play(\"myAssetPath/mySrcFile.mp3\");\n *\n * A number of additional parameters provide a quick way to determine how a sound is played. Please see the Sound\n * API method {{#crossLink \"Sound/play\"}}{{/crossLink}} for a list of arguments.\n *\n * Once a AbstractSoundInstance is created, a reference can be stored that can be used to control the audio directly through\n * the AbstractSoundInstance. If the reference is not stored, the AbstractSoundInstance will play out its audio (and any loops), and\n * is then de-referenced from the {{#crossLink \"Sound\"}}{{/crossLink}} class so that it can be cleaned up. If audio\n * playback has completed, a simple call to the {{#crossLink \"AbstractSoundInstance/play\"}}{{/crossLink}} instance method\n * will rebuild the references the Sound class need to control it.\n *\n *      var myInstance = createjs.Sound.play(\"myAssetPath/mySrcFile.mp3\", {loop:2});\n *      myInstance.on(\"loop\", handleLoop);\n *      function handleLoop(event) {\n *          myInstance.volume = myInstance.volume * 0.5;\n *      }\n *\n * Events are dispatched from the instance to notify when the sound has completed, looped, or when playback fails\n *\n *      var myInstance = createjs.Sound.play(\"myAssetPath/mySrcFile.mp3\");\n *      myInstance.on(\"complete\", handleComplete);\n *      myInstance.on(\"loop\", handleLoop);\n *      myInstance.on(\"failed\", handleFailed);\n *\n *\n * @class AbstractSoundInstance\n * @param {String} src The path to and file name of the sound.\n * @param {Number} startTime Audio sprite property used to apply an offset, in milliseconds.\n * @param {Number} duration Audio sprite property used to set the time the clip plays for, in milliseconds.\n * @param {Object} playbackResource Any resource needed by plugin to support audio playback.\n * @extends EventDispatcher\n * @constructor\n */\n\n(function () {\n\t\"use strict\";\n\n\n// Constructor:\n\tvar AbstractSoundInstance = function (src, startTime, duration, playbackResource) {\n\t\tthis.EventDispatcher_constructor();\n\n\n\t// public properties:\n\t\t/**\n\t\t * The source of the sound.\n\t\t * @property src\n\t\t * @type {String}\n\t\t * @default null\n\t\t */\n\t\tthis.src = src;\n\n\t\t/**\n\t\t * The unique ID of the instance. This is set by {{#crossLink \"Sound\"}}{{/crossLink}}.\n\t\t * @property uniqueId\n\t\t * @type {String} | Number\n\t\t * @default -1\n\t\t */\n\t\tthis.uniqueId = -1;\n\n\t\t/**\n\t\t * The play state of the sound. Play states are defined as constants on {{#crossLink \"Sound\"}}{{/crossLink}}.\n\t\t * @property playState\n\t\t * @type {String}\n\t\t * @default null\n\t\t */\n\t\tthis.playState = null;\n\n\t\t/**\n\t\t * A Timeout created by {{#crossLink \"Sound\"}}{{/crossLink}} when this AbstractSoundInstance is played with a delay.\n\t\t * This allows AbstractSoundInstance to remove the delay if stop, pause, or cleanup are called before playback begins.\n\t\t * @property delayTimeoutId\n\t\t * @type {timeoutVariable}\n\t\t * @default null\n\t\t * @protected\n\t\t * @since 0.4.0\n\t\t */\n\t\tthis.delayTimeoutId = null;\n\t\t// TODO consider moving delay into AbstractSoundInstance so it can be handled by plugins\n\n\n\t// private properties\n\t// Getter / Setter Properties\n\t\t// OJR TODO find original reason that we didn't use defined functions.  I think it was performance related\n\t\t/**\n\t\t * The volume of the sound, between 0 and 1.\n\t\t *\n\t\t * The actual output volume of a sound can be calculated using:\n\t\t * <code>myInstance.volume * createjs.Sound._getVolume();</code>\n\t\t *\n\t\t * @property volume\n\t\t * @type {Number}\n\t\t * @default 1\n\t\t */\n\t\tthis._volume =  1;\n\t\tObject.defineProperty(this, \"volume\", {\n\t\t\tget: this._getVolume,\n\t\t\tset: this._setVolume\n\t\t});\n\n\t\t/**\n\t\t * The pan of the sound, between -1 (left) and 1 (right). Note that pan is not supported by HTML Audio.\n\t\t *\n\t\t * Note in WebAudioPlugin this only gives us the \"x\" value of what is actually 3D audio\n\t\t * @property pan\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t */\n\t\tthis._pan =  0;\n\t\tObject.defineProperty(this, \"pan\", {\n\t\t\tget: this._getPan,\n\t\t\tset: this._setPan\n\t\t});\n\n\t\t/**\n\t\t * Audio sprite property used to determine the starting offset.\n\t\t * @property startTime\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t * @since 0.6.1\n\t\t */\n\t\tthis._startTime = Math.max(0, startTime || 0);\n\t\tObject.defineProperty(this, \"startTime\", {\n\t\t\tget: this._getStartTime,\n\t\t\tset: this._setStartTime\n\t\t});\n\n\t\t/**\n\t\t * Sets or gets the length of the audio clip, value is in milliseconds.\n\t\t *\n\t\t * @property duration\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t * @since 0.6.0\n\t\t */\n\t\tthis._duration = Math.max(0, duration || 0);\n\t\tObject.defineProperty(this, \"duration\", {\n\t\t\tget: this._getDuration,\n\t\t\tset: this._setDuration\n\t\t});\n\n\t\t/**\n\t\t * Object that holds plugin specific resource need for audio playback.\n\t\t * This is set internally by the plugin.  For example, WebAudioPlugin will set an array buffer,\n\t\t * HTMLAudioPlugin will set a tag, FlashAudioPlugin will set a flash reference.\n\t\t *\n\t\t * @property playbackResource\n\t\t * @type {Object}\n\t\t * @default null\n\t\t */\n\t\tthis._playbackResource = null;\n\t\tObject.defineProperty(this, \"playbackResource\", {\n\t\t\tget: this._getPlaybackResource,\n\t\t\tset: this._setPlaybackResource\n\t\t});\n\t\tif(playbackResource !== false && playbackResource !== true) { this._setPlaybackResource(playbackResource); }\n\n\t\t/**\n\t\t * The position of the playhead in milliseconds. This can be set while a sound is playing, paused, or stopped.\n\t\t *\n\t\t * @property position\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t * @since 0.6.0\n\t\t */\n\t\tthis._position = 0;\n\t\tObject.defineProperty(this, \"position\", {\n\t\t\tget: this._getPosition,\n\t\t\tset: this._setPosition\n\t\t});\n\n\t\t/**\n\t\t * The number of play loops remaining. Negative values will loop infinitely.\n\t\t *\n\t\t * @property loop\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t * @public\n\t\t * @since 0.6.0\n\t\t */\n\t\tthis._loop = 0;\n\t\tObject.defineProperty(this, \"loop\", {\n\t\t\tget: this._getLoop,\n\t\t\tset: this._setLoop\n\t\t});\n\n\t\t/**\n\t\t * Mutes or unmutes the current audio instance.\n\t\t *\n\t\t * @property muted\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t * @since 0.6.0\n\t\t */\n\t\tthis._muted = false;\n\t\tObject.defineProperty(this, \"muted\", {\n\t\t\tget: this._getMuted,\n\t\t\tset: this._setMuted\n\t\t});\n\n\t\t/**\n\t\t * Pauses or resumes the current audio instance.\n\t\t *\n\t\t * @property paused\n\t\t * @type {Boolean}\n\t\t */\n\t\tthis._paused = false;\n\t\tObject.defineProperty(this, \"paused\", {\n\t\t\tget: this._getPaused,\n\t\t\tset: this._setPaused\n\t\t});\n\n\n\t// Events\n\t\t/**\n\t\t * The event that is fired when playback has started successfully.\n\t\t * @event succeeded\n\t\t * @param {Object} target The object that dispatched the event.\n\t\t * @param {String} type The event type.\n\t\t * @since 0.4.0\n\t\t */\n\n\t\t/**\n\t\t * The event that is fired when playback is interrupted. This happens when another sound with the same\n\t\t * src property is played using an interrupt value that causes this instance to stop playing.\n\t\t * @event interrupted\n\t\t * @param {Object} target The object that dispatched the event.\n\t\t * @param {String} type The event type.\n\t\t * @since 0.4.0\n\t\t */\n\n\t\t/**\n\t\t * The event that is fired when playback has failed. This happens when there are too many channels with the same\n\t\t * src property already playing (and the interrupt value doesn't cause an interrupt of another instance), or\n\t\t * the sound could not be played, perhaps due to a 404 error.\n\t\t * @event failed\n\t\t * @param {Object} target The object that dispatched the event.\n\t\t * @param {String} type The event type.\n\t\t * @since 0.4.0\n\t\t */\n\n\t\t/**\n\t\t * The event that is fired when a sound has completed playing but has loops remaining.\n\t\t * @event loop\n\t\t * @param {Object} target The object that dispatched the event.\n\t\t * @param {String} type The event type.\n\t\t * @since 0.4.0\n\t\t */\n\n\t\t/**\n\t\t * The event that is fired when playback completes. This means that the sound has finished playing in its\n\t\t * entirety, including its loop iterations.\n\t\t * @event complete\n\t\t * @param {Object} target The object that dispatched the event.\n\t\t * @param {String} type The event type.\n\t\t * @since 0.4.0\n\t\t */\n\t};\n\n\tvar p = createjs.extend(AbstractSoundInstance, createjs.EventDispatcher);\n\n// Public Methods:\n\t/**\n\t * Play an instance. This method is intended to be called on SoundInstances that already exist (created\n\t * with the Sound API {{#crossLink \"Sound/createInstance\"}}{{/crossLink}} or {{#crossLink \"Sound/play\"}}{{/crossLink}}).\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *      var myInstance = createjs.Sound.createInstance(mySrc);\n\t *      myInstance.play({interrupt:createjs.Sound.INTERRUPT_ANY, loop:2, pan:0.5});\n\t *\n\t * Note that if this sound is already playing, this call will still set the passed in parameters.\n\n\t * <b>Parameters Deprecated</b><br />\n\t * The parameters for this method are deprecated in favor of a single parameter that is an Object or {{#crossLink \"PlayPropsConfig\"}}{{/crossLink}}.\n\t *\n\t * @method play\n\t * @param {Object | PlayPropsConfig} props A PlayPropsConfig instance, or an object that contains the parameters to\n\t * play a sound. See the {{#crossLink \"PlayPropsConfig\"}}{{/crossLink}} for more info.\n\t * @return {AbstractSoundInstance} A reference to itself, intended for chaining calls.\n\t */\n\tp.play = function (props) {\n\t\tvar playProps = createjs.PlayPropsConfig.create(props);\n\t\tif (this.playState == createjs.Sound.PLAY_SUCCEEDED) {\n\t\t\tthis.applyPlayProps(playProps);\n\t\t\tif (this._paused) {\tthis._setPaused(false); }\n\t\t\treturn;\n\t\t}\n\t\tthis._cleanUp();\n\t\tcreatejs.Sound._playInstance(this, playProps);\t// make this an event dispatch??\n\t\treturn this;\n\t};\n\n\t/**\n\t * Stop playback of the instance. Stopped sounds will reset their position to 0, and calls to {{#crossLink \"AbstractSoundInstance/resume\"}}{{/crossLink}}\n\t * will fail. To start playback again, call {{#crossLink \"AbstractSoundInstance/play\"}}{{/crossLink}}.\n     *\n     * If you don't want to lose your position use yourSoundInstance.paused = true instead. {{#crossLink \"AbstractSoundInstance/paused\"}}{{/crossLink}}.\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *     myInstance.stop();\n\t *\n\t * @method stop\n\t * @return {AbstractSoundInstance} A reference to itself, intended for chaining calls.\n\t */\n\tp.stop = function () {\n\t\tthis._position = 0;\n\t\tthis._paused = false;\n\t\tthis._handleStop();\n\t\tthis._cleanUp();\n\t\tthis.playState = createjs.Sound.PLAY_FINISHED;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Remove all external references and resources from AbstractSoundInstance.  Note this is irreversible and AbstractSoundInstance will no longer work\n\t * @method destroy\n\t * @since 0.6.0\n\t */\n\tp.destroy = function() {\n\t\tthis._cleanUp();\n\t\tthis.src = null;\n\t\tthis.playbackResource = null;\n\n\t\tthis.removeAllEventListeners();\n\t};\n\n\t/**\n\t * Takes an PlayPropsConfig or Object with the same properties and sets them on this instance.\n\t * @method applyPlayProps\n\t * @param {PlayPropsConfig | Object} playProps A PlayPropsConfig or object containing the same properties.\n\t * @since 0.6.1\n\t * @return {AbstractSoundInstance} A reference to itself, intended for chaining calls.\n\t */\n\tp.applyPlayProps = function(playProps) {\n\t\tif (playProps.offset != null) { this._setPosition(playProps.offset) }\n\t\tif (playProps.loop != null) { this._setLoop(playProps.loop); }\n\t\tif (playProps.volume != null) { this._setVolume(playProps.volume); }\n\t\tif (playProps.pan != null) { this._setPan(playProps.pan); }\n\t\tif (playProps.startTime != null) {\n\t\t\tthis._setStartTime(playProps.startTime);\n\t\t\tthis._setDuration(playProps.duration);\n\t\t}\n\t\treturn this;\n\t};\n\n\tp.toString = function () {\n\t\treturn \"[AbstractSoundInstance]\";\n\t};\n\n// get/set methods that allow support for IE8\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/paused:property\"}}{{/crossLink}} directly as a property.\n\t * @method _getPaused\n\t * @protected\n\t * @return {boolean} If the instance is currently paused\n\t * @since 0.6.0\n\t */\n\tp._getPaused = function() {\n\t\treturn this._paused;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/paused:property\"}}{{/crossLink}} directly as a property\n\t * @method _setPaused\n\t * @protected\n\t * @param {boolean} value\n\t * @since 0.6.0\n\t * @return {AbstractSoundInstance} A reference to itself, intended for chaining calls.\n\t */\n\tp._setPaused = function (value) {\n\t\tif ((value !== true && value !== false) || this._paused == value) {return;}\n\t\tif (value == true && this.playState != createjs.Sound.PLAY_SUCCEEDED) {return;}\n\t\tthis._paused = value;\n\t\tif(value) {\n\t\t\tthis._pause();\n\t\t} else {\n\t\t\tthis._resume();\n\t\t}\n\t\tclearTimeout(this.delayTimeoutId);\n\t\treturn this;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/volume:property\"}}{{/crossLink}} directly as a property\n\t * @method _setVolume\n\t * @protected\n\t * @param {Number} value The volume to set, between 0 and 1.\n\t * @return {AbstractSoundInstance} A reference to itself, intended for chaining calls.\n\t */\n\tp._setVolume = function (value) {\n\t\tif (value == this._volume) { return this; }\n\t\tthis._volume = Math.max(0, Math.min(1, value));\n\t\tif (!this._muted) {\n\t\t\tthis._updateVolume();\n\t\t}\n\t\treturn this;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/volume:property\"}}{{/crossLink}} directly as a property\n\t * @method _getVolume\n\t * @protected\n\t * @return {Number} The current volume of the sound instance.\n\t */\n\tp._getVolume = function () {\n\t\treturn this._volume;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/muted:property\"}}{{/crossLink}} directly as a property\n\t * @method _setMuted\n\t * @protected\n\t * @param {Boolean} value If the sound should be muted.\n\t * @return {AbstractSoundInstance} A reference to itself, intended for chaining calls.\n\t * @since 0.6.0\n\t */\n\tp._setMuted = function (value) {\n\t\tif (value !== true && value !== false) {return;}\n\t\tthis._muted = value;\n\t\tthis._updateVolume();\n\t\treturn this;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/muted:property\"}}{{/crossLink}} directly as a property\n\t * @method _getMuted\n\t * @protected\n\t * @return {Boolean} If the sound is muted.\n\t * @since 0.6.0\n\t */\n\tp._getMuted = function () {\n\t\treturn this._muted;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/pan:property\"}}{{/crossLink}} directly as a property\n\t * @method _setPan\n\t * @protected\n\t * @param {Number} value The pan value, between -1 (left) and 1 (right).\n\t * @return {AbstractSoundInstance} Returns reference to itself for chaining calls\n\t */\n\tp._setPan = function (value) {\n\t\tif(value == this._pan) { return this; }\n\t\tthis._pan = Math.max(-1, Math.min(1, value));\n\t\tthis._updatePan();\n\t\treturn this;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/pan:property\"}}{{/crossLink}} directly as a property\n\t * @method _getPan\n\t * @protected\n\t * @return {Number} The value of the pan, between -1 (left) and 1 (right).\n\t */\n\tp._getPan = function () {\n\t\treturn this._pan;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/position:property\"}}{{/crossLink}} directly as a property\n\t * @method _getPosition\n\t * @protected\n\t * @return {Number} The position of the playhead in the sound, in milliseconds.\n\t */\n\tp._getPosition = function () {\n\t\tif (!this._paused && this.playState == createjs.Sound.PLAY_SUCCEEDED) {\n\t\t\tthis._position = this._calculateCurrentPosition();\n\t\t}\n\t\treturn this._position;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/position:property\"}}{{/crossLink}} directly as a property\n\t * @method _setPosition\n\t * @protected\n\t * @param {Number} value The position to place the playhead, in milliseconds.\n\t * @return {AbstractSoundInstance} Returns reference to itself for chaining calls\n\t */\n\tp._setPosition = function (value) {\n\t\tthis._position = Math.max(0, value);\n\t\tif (this.playState == createjs.Sound.PLAY_SUCCEEDED) {\n\t\t\tthis._updatePosition();\n\t\t}\n\t\treturn this;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/startTime:property\"}}{{/crossLink}} directly as a property\n\t * @method _getStartTime\n\t * @protected\n\t * @return {Number} The startTime of the sound instance in milliseconds.\n\t */\n\tp._getStartTime = function () {\n\t\treturn this._startTime;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/startTime:property\"}}{{/crossLink}} directly as a property\n\t * @method _setStartTime\n\t * @protected\n\t * @param {number} value The new startTime time in milli seconds.\n\t * @return {AbstractSoundInstance} Returns reference to itself for chaining calls\n\t */\n\tp._setStartTime = function (value) {\n\t\tif (value == this._startTime) { return this; }\n\t\tthis._startTime = Math.max(0, value || 0);\n\t\tthis._updateStartTime();\n\t\treturn this;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/duration:property\"}}{{/crossLink}} directly as a property\n\t * @method _getDuration\n\t * @protected\n\t * @return {Number} The duration of the sound instance in milliseconds.\n\t */\n\tp._getDuration = function () {\n\t\treturn this._duration;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/duration:property\"}}{{/crossLink}} directly as a property\n\t * @method _setDuration\n\t * @protected\n\t * @param {number} value The new duration time in milli seconds.\n\t * @return {AbstractSoundInstance} Returns reference to itself for chaining calls\n\t * @since 0.6.0\n\t */\n\tp._setDuration = function (value) {\n\t\tif (value == this._duration) { return this; }\n\t\tthis._duration = Math.max(0, value || 0);\n\t\tthis._updateDuration();\n\t\treturn this;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/playbackResource:property\"}}{{/crossLink}} directly as a property\n\t * @method _setPlaybackResource\n\t * @protected\n\t * @param {Object} value The new playback resource.\n\t * @return {AbstractSoundInstance} Returns reference to itself for chaining calls\n\t * @since 0.6.0\n\t **/\n\tp._setPlaybackResource = function (value) {\n\t\tthis._playbackResource = value;\n\t\tif (this._duration == 0 && this._playbackResource) { this._setDurationFromSource(); }\n\t\treturn this;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/playbackResource:property\"}}{{/crossLink}} directly as a property\n\t * @method _getPlaybackResource\n\t * @protected\n\t * @param {Object} value The new playback resource.\n\t * @return {Object} playback resource used for playing audio\n\t * @since 0.6.0\n\t **/\n\tp._getPlaybackResource = function () {\n\t\treturn this._playbackResource;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/loop:property\"}}{{/crossLink}} directly as a property\n\t * @method _getLoop\n\t * @protected\n\t * @return {number}\n\t * @since 0.6.0\n\t **/\n\tp._getLoop = function () {\n\t\treturn this._loop;\n\t};\n\n\t/**\n\t * Please use {{#crossLink \"AbstractSoundInstance/loop:property\"}}{{/crossLink}} directly as a property\n\t * @method _setLoop\n\t * @protected\n\t * @param {number} value The number of times to loop after play.\n\t * @since 0.6.0\n\t */\n\tp._setLoop = function (value) {\n\t\tif(this._playbackResource != null) {\n\t\t\t// remove looping\n\t\t\tif (this._loop != 0 && value == 0) {\n\t\t\t\tthis._removeLooping(value);\n\t\t\t}\n\t\t\t// add looping\n\t\t\telse if (this._loop == 0 && value != 0) {\n\t\t\t\tthis._addLooping(value);\n\t\t\t}\n\t\t}\n\t\tthis._loop = value;\n\t};\n\n\n// Private Methods:\n\t/**\n\t * A helper method that dispatches all events for AbstractSoundInstance.\n\t * @method _sendEvent\n\t * @param {String} type The event type\n\t * @protected\n\t */\n\tp._sendEvent = function (type) {\n\t\tvar event = new createjs.Event(type);\n\t\tthis.dispatchEvent(event);\n\t};\n\n\t/**\n\t * Clean up the instance. Remove references and clean up any additional properties such as timers.\n\t * @method _cleanUp\n\t * @protected\n\t */\n\tp._cleanUp = function () {\n\t\tclearTimeout(this.delayTimeoutId); // clear timeout that plays delayed sound\n\t\tthis._handleCleanUp();\n\t\tthis._paused = false;\n\n\t\tcreatejs.Sound._playFinished(this);\t// TODO change to an event\n\t};\n\n\t/**\n\t * The sound has been interrupted.\n\t * @method _interrupt\n\t * @protected\n\t */\n\tp._interrupt = function () {\n\t\tthis._cleanUp();\n\t\tthis.playState = createjs.Sound.PLAY_INTERRUPTED;\n\t\tthis._sendEvent(\"interrupted\");\n\t};\n\n\t/**\n\t * Called by the Sound class when the audio is ready to play (delay has completed). Starts sound playing if the\n\t * src is loaded, otherwise playback will fail.\n\t * @method _beginPlaying\n\t * @param {PlayPropsConfig} playProps A PlayPropsConfig object.\n\t * @return {Boolean} If playback succeeded.\n\t * @protected\n\t */\n\t// OJR FlashAudioSoundInstance overwrites\n\tp._beginPlaying = function (playProps) {\n\t\tthis._setPosition(playProps.offset);\n\t\tthis._setLoop(playProps.loop);\n\t\tthis._setVolume(playProps.volume);\n\t\tthis._setPan(playProps.pan);\n\t\tif (playProps.startTime != null) {\n\t\t\tthis._setStartTime(playProps.startTime);\n\t\t\tthis._setDuration(playProps.duration);\n\t\t}\n\n\t\tif (this._playbackResource != null && this._position < this._duration) {\n\t\t\tthis._paused = false;\n\t\t\tthis._handleSoundReady();\n\t\t\tthis.playState = createjs.Sound.PLAY_SUCCEEDED;\n\t\t\tthis._sendEvent(\"succeeded\");\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis._playFailed();\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/**\n\t * Play has failed, which can happen for a variety of reasons.\n\t * Cleans up instance and dispatches failed event\n\t * @method _playFailed\n\t * @private\n\t */\n\tp._playFailed = function () {\n\t\tthis._cleanUp();\n\t\tthis.playState = createjs.Sound.PLAY_FAILED;\n\t\tthis._sendEvent(\"failed\");\n\t};\n\n\t/**\n\t * Audio has finished playing. Manually loop it if required.\n\t * @method _handleSoundComplete\n\t * @param event\n\t * @protected\n\t */\n\tp._handleSoundComplete = function (event) {\n\t\tthis._position = 0;  // have to set this as it can be set by pause during playback\n\n\t\tif (this._loop != 0) {\n\t\t\tthis._loop--;  // NOTE this introduces a theoretical limit on loops = float max size x 2 - 1\n\t\t\tthis._handleLoop();\n\t\t\tthis._sendEvent(\"loop\");\n\t\t\treturn;\n\t\t}\n\n\t\tthis._cleanUp();\n\t\tthis.playState = createjs.Sound.PLAY_FINISHED;\n\t\tthis._sendEvent(\"complete\");\n\t};\n\n// Plugin specific code\n\t/**\n\t * Handles starting playback when the sound is ready for playing.\n\t * @method _handleSoundReady\n\t * @protected\n \t */\n\tp._handleSoundReady = function () {\n\t\t// plugin specific code\n\t};\n\n\t/**\n\t * Internal function used to update the volume based on the instance volume, master volume, instance mute value,\n\t * and master mute value.\n\t * @method _updateVolume\n\t * @protected\n\t */\n\tp._updateVolume = function () {\n\t\t// plugin specific code\n\t};\n\n\t/**\n\t * Internal function used to update the pan\n\t * @method _updatePan\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._updatePan = function () {\n\t\t// plugin specific code\n\t};\n\n\t/**\n\t * Internal function used to update the startTime of the audio.\n\t * @method _updateStartTime\n\t * @protected\n\t * @since 0.6.1\n\t */\n\tp._updateStartTime = function () {\n\t\t// plugin specific code\n\t};\n\n\t/**\n\t * Internal function used to update the duration of the audio.\n\t * @method _updateDuration\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._updateDuration = function () {\n\t\t// plugin specific code\n\t};\n\n\t/**\n\t * Internal function used to get the duration of the audio from the source we'll be playing.\n\t * @method _updateDuration\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._setDurationFromSource = function () {\n\t\t// plugin specific code\n\t};\n\n\t/**\n\t * Internal function that calculates the current position of the playhead and sets this._position to that value\n\t * @method _calculateCurrentPosition\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._calculateCurrentPosition = function () {\n\t\t// plugin specific code that sets this.position\n\t};\n\n\t/**\n\t * Internal function used to update the position of the playhead.\n\t * @method _updatePosition\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._updatePosition = function () {\n\t\t// plugin specific code\n\t};\n\n\t/**\n\t * Internal function called when looping is removed during playback.\n\t * @method _removeLooping\n\t * @param {number} value The number of times to loop after play.\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._removeLooping = function (value) {\n\t\t// plugin specific code\n\t};\n\n\t/**\n\t * Internal function called when looping is added during playback.\n\t * @method _addLooping\n\t * @param {number} value The number of times to loop after play.\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._addLooping = function (value) {\n\t\t// plugin specific code\n\t};\n\n\t/**\n\t * Internal function called when pausing playback\n\t * @method _pause\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._pause = function () {\n\t\t// plugin specific code\n\t};\n\n\t/**\n\t * Internal function called when resuming playback\n\t * @method _resume\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._resume = function () {\n\t\t// plugin specific code\n\t};\n\n\t/**\n\t * Internal function called when stopping playback\n\t * @method _handleStop\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._handleStop = function() {\n\t\t// plugin specific code\n\t};\n\n\t/**\n\t * Internal function called when AbstractSoundInstance is being cleaned up\n\t * @method _handleCleanUp\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._handleCleanUp = function() {\n\t\t// plugin specific code\n\t};\n\n\t/**\n\t * Internal function called when AbstractSoundInstance has played to end and is looping\n\t * @method _handleLoop\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._handleLoop = function () {\n\t\t// plugin specific code\n\t};\n\n\tcreatejs.AbstractSoundInstance = createjs.promote(AbstractSoundInstance, \"EventDispatcher\");\n\tcreatejs.DefaultSoundInstance = createjs.AbstractSoundInstance;\t// used when no plugin is supported\n}());\n\n//##############################################################################\n// AbstractPlugin.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\n// constructor:\n \t/**\n\t * A default plugin class used as a base for all other plugins.\n\t * @class AbstractPlugin\n\t * @constructor\n\t * @since 0.6.0\n\t */\n\n\tvar AbstractPlugin = function () {\n\t// private properties:\n\t\t/**\n\t\t * The capabilities of the plugin.\n\t\t * method and is used internally.\n\t\t * @property _capabilities\n\t\t * @type {Object}\n\t\t * @default null\n\t\t * @protected\n\t\t * @static\n\t\t */\n\t\tthis._capabilities = null;\n\n\t\t/**\n\t\t * Object hash indexed by the source URI of all created loaders, used to properly destroy them if sources are removed.\n\t\t * @type {Object}\n\t\t * @protected\n\t\t */\n\t\tthis._loaders = {};\n\n\t\t/**\n\t\t * Object hash indexed by the source URI of each file to indicate if an audio source has begun loading,\n\t\t * is currently loading, or has completed loading.  Can be used to store non boolean data after loading\n\t\t * is complete (for example arrayBuffers for web audio).\n\t\t * @property _audioSources\n\t\t * @type {Object}\n\t\t * @protected\n\t\t */\n\t\tthis._audioSources = {};\n\n\t\t/**\n\t\t * Object hash indexed by the source URI of all created SoundInstances, updates the playbackResource if it loads after they are created,\n\t\t * and properly destroy them if sources are removed\n\t\t * @type {Object}\n\t\t * @protected\n\t\t */\n\t\tthis._soundInstances = {};\n\n\t\t/**\n\t\t * The internal master volume value of the plugin.\n\t\t * @property _volume\n\t\t * @type {Number}\n\t\t * @default 1\n\t\t * @protected\n\t\t */\n\t\tthis._volume = 1;\n\n\t\t/**\n\t\t * A reference to a loader class used by a plugin that must be set.\n\t\t * @type {Object}\n\t\t * @protected\n\t\t */\n\t\tthis._loaderClass;\n\n\t\t/**\n\t\t * A reference to an AbstractSoundInstance class used by a plugin that must be set.\n\t\t * @type {Object}\n\t\t * @protected;\n\t\t */\n\t\tthis._soundInstanceClass;\n\t};\n\tvar p = AbstractPlugin.prototype;\n\n// Static Properties:\n// NOTE THESE PROPERTIES NEED TO BE ADDED TO EACH PLUGIN\n\t/**\n\t * The capabilities of the plugin. This is generated via the _generateCapabilities method and is used internally.\n\t * @property _capabilities\n\t * @type {Object}\n\t * @default null\n\t * @private\n\t * @static\n\t */\n\tAbstractPlugin._capabilities = null;\n\n\t/**\n\t * Determine if the plugin can be used in the current browser/OS.\n\t * @method isSupported\n\t * @return {Boolean} If the plugin can be initialized.\n\t * @static\n\t */\n\tAbstractPlugin.isSupported = function () {\n\t\treturn true;\n\t};\n\n\n// public methods:\n\t/**\n\t * Pre-register a sound for preloading and setup. This is called by {{#crossLink \"Sound\"}}{{/crossLink}}.\n\t * Note all plugins provide a <code>Loader</code> instance, which <a href=\"http://preloadjs.com\" target=\"_blank\">PreloadJS</a>\n\t * can use to assist with preloading.\n\t * @method register\n\t * @param {String} loadItem An Object containing the source of the audio\n\t * Note that not every plugin will manage this value.\n\t * @return {Object} A result object, containing a \"tag\" for preloading purposes.\n\t */\n\tp.register = function (loadItem) {\n\t\tvar loader = this._loaders[loadItem.src];\n\t\tif(loader && !loader.canceled) {return this._loaders[loadItem.src];}\t// already loading/loaded this, so don't load twice\n\t\t// OJR potential issue that we won't be firing loaded event, might need to trigger if this is already loaded?\n\t\tthis._audioSources[loadItem.src] = true;\n\t\tthis._soundInstances[loadItem.src] = [];\n\t\tloader = new this._loaderClass(loadItem);\n\t\tloader.on(\"complete\", this._handlePreloadComplete, this);\n\t\tthis._loaders[loadItem.src] = loader;\n\t\treturn loader;\n\t};\n\n\t// note sound calls register before calling preload\n\t/**\n\t * Internally preload a sound.\n\t * @method preload\n\t * @param {Loader} loader The sound URI to load.\n\t */\n\tp.preload = function (loader) {\n\t\tloader.on(\"error\", this._handlePreloadError, this);\n\t\tloader.load();\n\t};\n\n\t/**\n\t * Checks if preloading has started for a specific source. If the source is found, we can assume it is loading,\n\t * or has already finished loading.\n\t * @method isPreloadStarted\n\t * @param {String} src The sound URI to check.\n\t * @return {Boolean}\n\t */\n\tp.isPreloadStarted = function (src) {\n\t\treturn (this._audioSources[src] != null);\n\t};\n\n\t/**\n\t * Checks if preloading has finished for a specific source.\n\t * @method isPreloadComplete\n\t * @param {String} src The sound URI to load.\n\t * @return {Boolean}\n\t */\n\tp.isPreloadComplete = function (src) {\n\t\treturn (!(this._audioSources[src] == null || this._audioSources[src] == true));\n\t};\n\n\t/**\n\t * Remove a sound added using {{#crossLink \"WebAudioPlugin/register\"}}{{/crossLink}}. Note this does not cancel a preload.\n\t * @method removeSound\n\t * @param {String} src The sound URI to unload.\n\t */\n\tp.removeSound = function (src) {\n\t\tif (!this._soundInstances[src]) { return; }\n\t\tfor (var i = this._soundInstances[src].length; i--; ) {\n\t\t\tvar item = this._soundInstances[src][i];\n\t\t\titem.destroy();\n\t\t}\n\t\tdelete(this._soundInstances[src]);\n\t\tdelete(this._audioSources[src]);\n\t\tif(this._loaders[src]) { this._loaders[src].destroy(); }\n\t\tdelete(this._loaders[src]);\n\t};\n\n\t/**\n\t * Remove all sounds added using {{#crossLink \"WebAudioPlugin/register\"}}{{/crossLink}}. Note this does not cancel a preload.\n\t * @method removeAllSounds\n\t * @param {String} src The sound URI to unload.\n\t */\n\tp.removeAllSounds = function () {\n\t\tfor(var key in this._audioSources) {\n\t\t\tthis.removeSound(key);\n\t\t}\n\t};\n\n\t/**\n\t * Create a sound instance. If the sound has not been preloaded, it is internally preloaded here.\n\t * @method create\n\t * @param {String} src The sound source to use.\n\t * @param {Number} startTime Audio sprite property used to apply an offset, in milliseconds.\n\t * @param {Number} duration Audio sprite property used to set the time the clip plays for, in milliseconds.\n\t * @return {AbstractSoundInstance} A sound instance for playback and control.\n\t */\n\tp.create = function (src, startTime, duration) {\n\t\tif (!this.isPreloadStarted(src)) {\n\t\t\tthis.preload(this.register(src));\n\t\t}\n\t\tvar si = new this._soundInstanceClass(src, startTime, duration, this._audioSources[src]);\n\t\tif(this._soundInstances[src]){\n\t\t\tthis._soundInstances[src].push(si);\n\t\t}\n\n\t\t// Plugins that don't have a setVolume should implement a setMasterVolune/setMasterMute\n\t\t// So we have to check that here.\n\t\tsi.setMasterVolume && si.setMasterVolume(createjs.Sound.volume);\n\t\tsi.setMasterMute && si.setMasterMute(createjs.Sound.muted);\n\n\t\treturn si;\n\t};\n\n\t// if a plugin does not support volume and mute, it should set these to null\n\t/**\n\t * Set the master volume of the plugin, which affects all SoundInstances.\n\t * @method setVolume\n\t * @param {Number} value The volume to set, between 0 and 1.\n\t * @return {Boolean} If the plugin processes the setVolume call (true). The Sound class will affect all the\n\t * instances manually otherwise.\n\t */\n\tp.setVolume = function (value) {\n\t\tthis._volume = value;\n\t\tthis._updateVolume();\n\t\treturn true;\n\t};\n\n\t/**\n\t * Get the master volume of the plugin, which affects all SoundInstances.\n\t * @method getVolume\n\t * @return {Number} The volume level, between 0 and 1.\n\t */\n\tp.getVolume = function () {\n\t\treturn this._volume;\n\t};\n\n\t/**\n\t * Mute all sounds via the plugin.\n\t * @method setMute\n\t * @param {Boolean} value If all sound should be muted or not. Note that plugin-level muting just looks up\n\t * the mute value of Sound {{#crossLink \"Sound/muted:property\"}}{{/crossLink}}, so this property is not used here.\n\t * @return {Boolean} If the mute call succeeds.\n\t */\n\tp.setMute = function (value) {\n\t\tthis._updateVolume();\n\t\treturn true;\n\t};\n\n\t// plugins should overwrite this method\n\tp.toString = function () {\n\t\treturn \"[AbstractPlugin]\";\n\t};\n\n\n// private methods:\n\t/**\n\t * Handles internal preload completion.\n\t * @method _handlePreloadComplete\n\t * @param event\n\t * @protected\n\t */\n\tp._handlePreloadComplete = function (event) {\n\t\tvar src = event.target.getItem().src;\n\t\tthis._audioSources[src] = event.result;\n\t\tfor (var i = 0, l = this._soundInstances[src].length; i < l; i++) {\n\t\t\tvar item = this._soundInstances[src][i];\n\t\t\titem.setPlaybackResource(this._audioSources[src]);\n\t\t\t// ToDo consider adding play call here if playstate == playfailed\n\t\t\tthis._soundInstances[src] = null;\n\t\t}\n\t};\n\n\t/**\n\t * Handles internal preload errors\n\t * @method _handlePreloadError\n\t * @param event\n\t * @protected\n\t */\n\tp._handlePreloadError = function(event) {\n\t\t//delete(this._audioSources[src]);\n\t};\n\n\t/**\n\t * Set the gain value for master audio. Should not be called externally.\n\t * @method _updateVolume\n\t * @protected\n\t */\n\tp._updateVolume = function () {\n\t\t// Plugin Specific code\n\t};\n\n\tcreatejs.AbstractPlugin = AbstractPlugin;\n}());\n\n//##############################################################################\n// WebAudioLoader.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t/**\n\t * Loader provides a mechanism to preload Web Audio content via PreloadJS or internally. Instances are returned to\n\t * the preloader, and the load method is called when the asset needs to be requested.\n\t *\n\t * @class WebAudioLoader\n\t * @param {String} loadItem The item to be loaded\n\t * @extends XHRRequest\n\t * @protected\n\t */\n\tfunction Loader(loadItem) {\n\t\tthis.AbstractLoader_constructor(loadItem, true, createjs.Types.SOUND);\n\n\t};\n\tvar p = createjs.extend(Loader, createjs.AbstractLoader);\n\n\t/**\n\t * web audio context required for decoding audio\n\t * @property context\n\t * @type {AudioContext}\n\t * @static\n\t */\n\tLoader.context = null;\n\n\n// public methods\n\tp.toString = function () {\n\t\treturn \"[WebAudioLoader]\";\n\t};\n\n\n// private methods\n\tp._createRequest = function() {\n\t\tthis._request = new createjs.XHRRequest(this._item, false);\n\t\tthis._request.setResponseType(\"arraybuffer\");\n\t};\n\n\tp._sendComplete = function (event) {\n\t\t// OJR we leave this wrapped in Loader because we need to reference src and the handler only receives a single argument, the decodedAudio\n\t\tLoader.context.decodeAudioData(this._rawResult,\n\t         createjs.proxy(this._handleAudioDecoded, this),\n\t         createjs.proxy(this._sendError, this));\n\t};\n\n\n\t/**\n\t* The audio has been decoded.\n\t* @method handleAudioDecoded\n\t* @param decoded\n\t* @protected\n\t*/\n\tp._handleAudioDecoded = function (decodedAudio) {\n\t\tthis._result = decodedAudio;\n\t\tthis.AbstractLoader__sendComplete();\n\t};\n\n\tcreatejs.WebAudioLoader = createjs.promote(Loader, \"AbstractLoader\");\n}());\n\n//##############################################################################\n// WebAudioSoundInstance.js\n//##############################################################################\n\n/**\n * WebAudioSoundInstance extends the base api of {{#crossLink \"AbstractSoundInstance\"}}{{/crossLink}} and is used by\n * {{#crossLink \"WebAudioPlugin\"}}{{/crossLink}}.\n *\n * WebAudioSoundInstance exposes audioNodes for advanced users.\n *\n * @param {String} src The path to and file name of the sound.\n * @param {Number} startTime Audio sprite property used to apply an offset, in milliseconds.\n * @param {Number} duration Audio sprite property used to set the time the clip plays for, in milliseconds.\n * @param {Object} playbackResource Any resource needed by plugin to support audio playback.\n * @class WebAudioSoundInstance\n * @extends AbstractSoundInstance\n * @constructor\n */\n(function () {\n\t\"use strict\";\n\n\tfunction WebAudioSoundInstance(src, startTime, duration, playbackResource) {\n\t\tthis.AbstractSoundInstance_constructor(src, startTime, duration, playbackResource);\n\n\n// public properties\n\t\t/**\n\t\t * NOTE this is only intended for use by advanced users.\n\t\t * <br />GainNode for controlling <code>WebAudioSoundInstance</code> volume. Connected to the {{#crossLink \"WebAudioSoundInstance/destinationNode:property\"}}{{/crossLink}}.\n\t\t * @property gainNode\n\t\t * @type {AudioGainNode}\n\t\t * @since 0.4.0\n\t\t *\n\t\t */\n\t\tthis.gainNode = s.context.createGain();\n\n\t\t/**\n\t\t * NOTE this is only intended for use by advanced users.\n\t\t * <br />A panNode allowing left and right audio channel panning only. Connected to WebAudioSoundInstance {{#crossLink \"WebAudioSoundInstance/gainNode:property\"}}{{/crossLink}}.\n\t\t * @property panNode\n\t\t * @type {AudioPannerNode}\n\t\t * @since 0.4.0\n\t\t */\n\t\tthis.panNode = s.context.createPanner();\n\t\tthis.panNode.panningModel = s._panningModel;\n\t\tthis.panNode.connect(this.gainNode);\n\t\tthis._updatePan();\n\n\t\t/**\n\t\t * NOTE this is only intended for use by advanced users.\n\t\t * <br />sourceNode is the audio source. Connected to WebAudioSoundInstance {{#crossLink \"WebAudioSoundInstance/panNode:property\"}}{{/crossLink}}.\n\t\t * @property sourceNode\n\t\t * @type {AudioNode}\n\t\t * @since 0.4.0\n\t\t *\n\t\t */\n\t\tthis.sourceNode = null;\n\n\n// private properties\n\t\t/**\n\t\t * Timeout that is created internally to handle sound playing to completion.\n\t\t * Stored so we can remove it when stop, pause, or cleanup are called\n\t\t * @property _soundCompleteTimeout\n\t\t * @type {timeoutVariable}\n\t\t * @default null\n\t\t * @protected\n\t\t * @since 0.4.0\n\t\t */\n\t\tthis._soundCompleteTimeout = null;\n\n\t\t/**\n\t\t * NOTE this is only intended for use by very advanced users.\n\t\t * _sourceNodeNext is the audio source for the next loop, inserted in a look ahead approach to allow for smooth\n\t\t * looping. Connected to {{#crossLink \"WebAudioSoundInstance/gainNode:property\"}}{{/crossLink}}.\n\t\t * @property _sourceNodeNext\n\t\t * @type {AudioNode}\n\t\t * @default null\n\t\t * @protected\n\t\t * @since 0.4.1\n\t\t *\n\t\t */\n\t\tthis._sourceNodeNext = null;\n\n\t\t/**\n\t\t * Time audio started playback, in seconds. Used to handle set position, get position, and resuming from paused.\n\t\t * @property _playbackStartTime\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t * @protected\n\t\t * @since 0.4.0\n\t\t */\n\t\tthis._playbackStartTime = 0;\n\n\t\t// Proxies, make removing listeners easier.\n\t\tthis._endedHandler = createjs.proxy(this._handleSoundComplete, this);\n\t};\n\tvar p = createjs.extend(WebAudioSoundInstance, createjs.AbstractSoundInstance);\n\tvar s = WebAudioSoundInstance;\n\n\t/**\n\t * Note this is only intended for use by advanced users.\n\t * <br />Audio context used to create nodes.  This is and needs to be the same context used by {{#crossLink \"WebAudioPlugin\"}}{{/crossLink}}.\n  \t * @property context\n\t * @type {AudioContext}\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.context = null;\n\n\t/**\n\t * Note this is only intended for use by advanced users.\n\t * <br />The scratch buffer that will be assigned to the buffer property of a source node on close.  \n\t * This is and should be the same scratch buffer referenced by {{#crossLink \"WebAudioPlugin\"}}{{/crossLink}}.\n  \t * @property _scratchBuffer\n\t * @type {AudioBufferSourceNode}\n\t * @static\n\t */\n\ts._scratchBuffer = null;\n\n\t/**\n\t * Note this is only intended for use by advanced users.\n\t * <br /> Audio node from WebAudioPlugin that sequences to <code>context.destination</code>\n\t * @property destinationNode\n\t * @type {AudioNode}\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts.destinationNode = null;\n\n\t/**\n\t * Value to set panning model to equal power for WebAudioSoundInstance.  Can be \"equalpower\" or 0 depending on browser implementation.\n\t * @property _panningModel\n\t * @type {Number / String}\n\t * @protected\n\t * @static\n\t * @since 0.6.0\n\t */\n\ts._panningModel = \"equalpower\";\n\n\n// Public methods\n\tp.destroy = function() {\n\t\tthis.AbstractSoundInstance_destroy();\n\n\t\tthis.panNode.disconnect(0);\n\t\tthis.panNode = null;\n\t\tthis.gainNode.disconnect(0);\n\t\tthis.gainNode = null;\n\t};\n\n\tp.toString = function () {\n\t\treturn \"[WebAudioSoundInstance]\";\n\t};\n\n\n// Private Methods\n\tp._updatePan = function() {\n\t\tthis.panNode.setPosition(this._pan, 0, -0.5);\n\t\t// z need to be -0.5 otherwise the sound only plays in left, right, or center\n\t};\n\n\tp._removeLooping = function(value) {\n\t\tthis._sourceNodeNext = this._cleanUpAudioNode(this._sourceNodeNext);\n\t};\n\n\tp._addLooping = function(value) {\n\t\tif (this.playState != createjs.Sound.PLAY_SUCCEEDED) { return; }\n\t\tthis._sourceNodeNext = this._createAndPlayAudioNode(this._playbackStartTime, 0);\n\t};\n\n\tp._setDurationFromSource = function () {\n\t\tthis._duration = this.playbackResource.duration * 1000;\n\t};\n\n\tp._handleCleanUp = function () {\n\t\tif (this.sourceNode && this.playState == createjs.Sound.PLAY_SUCCEEDED) {\n\t\t\tthis.sourceNode = this._cleanUpAudioNode(this.sourceNode);\n\t\t\tthis._sourceNodeNext = this._cleanUpAudioNode(this._sourceNodeNext);\n\t\t}\n\n\t\tif (this.gainNode.numberOfOutputs != 0) {this.gainNode.disconnect(0);}\n\t\t// OJR there appears to be a bug that this doesn't always work in webkit (Chrome and Safari). According to the documentation, this should work.\n\n\t\tclearTimeout(this._soundCompleteTimeout);\n\n\t\tthis._playbackStartTime = 0;\t// This is used by _getPosition\n\t};\n\n\t/**\n\t * Turn off and disconnect an audioNode, then set reference to null to release it for garbage collection\n\t * @method _cleanUpAudioNode\n\t * @param audioNode\n\t * @return {audioNode}\n\t * @protected\n\t * @since 0.4.1\n\t */\n\tp._cleanUpAudioNode = function(audioNode) {\n\t\tif(audioNode) {\n\t\t\taudioNode.stop(0);\n\t\t\taudioNode.disconnect(0);\n\t\t\t// necessary to prevent leak on iOS Safari 7-9. will throw in almost all other\n\t\t\t// browser implementations.\n\t\t\tif ( createjs.BrowserDetect.isIOS ) {\n\t\t\t\ttry { audioNode.buffer = s._scratchBuffer; } catch(e) {}\n\t\t\t}\n\t\t\taudioNode = null;\n\t\t}\n\t\treturn audioNode;\n\t};\n\n\tp._handleSoundReady = function (event) {\n\t\tthis.gainNode.connect(s.destinationNode);  // this line can cause a memory leak.  Nodes need to be disconnected from the audioDestination or any sequence that leads to it.\n\n\t\tvar dur = this._duration * 0.001,\n\t\t\tpos = Math.min(Math.max(0, this._position) * 0.001, dur);\n\t\tthis.sourceNode = this._createAndPlayAudioNode((s.context.currentTime - dur), pos);\n\t\tthis._playbackStartTime = this.sourceNode.startTime - pos;\n\n\t\tthis._soundCompleteTimeout = setTimeout(this._endedHandler, (dur - pos) * 1000);\n\n\t\tif(this._loop != 0) {\n\t\t\tthis._sourceNodeNext = this._createAndPlayAudioNode(this._playbackStartTime, 0);\n\t\t}\n\t};\n\n\t/**\n\t * Creates an audio node using the current src and context, connects it to the gain node, and starts playback.\n\t * @method _createAndPlayAudioNode\n\t * @param {Number} startTime The time to add this to the web audio context, in seconds.\n\t * @param {Number} offset The amount of time into the src audio to start playback, in seconds.\n\t * @return {audioNode}\n\t * @protected\n\t * @since 0.4.1\n\t */\n\tp._createAndPlayAudioNode = function(startTime, offset) {\n\t\tvar audioNode = s.context.createBufferSource();\n\t\taudioNode.buffer = this.playbackResource;\n\t\taudioNode.connect(this.panNode);\n\t\tvar dur = this._duration * 0.001;\n\t\taudioNode.startTime = startTime + dur;\n\t\taudioNode.start(audioNode.startTime, offset+(this._startTime*0.001), dur - offset);\n\t\treturn audioNode;\n\t};\n\n\tp._pause = function () {\n\t\tthis._position = (s.context.currentTime - this._playbackStartTime) * 1000;  // * 1000 to give milliseconds, lets us restart at same point\n\t\tthis.sourceNode = this._cleanUpAudioNode(this.sourceNode);\n\t\tthis._sourceNodeNext = this._cleanUpAudioNode(this._sourceNodeNext);\n\n\t\tif (this.gainNode.numberOfOutputs != 0) {this.gainNode.disconnect(0);}\n\n\t\tclearTimeout(this._soundCompleteTimeout);\n\t};\n\n\tp._resume = function () {\n\t\tthis._handleSoundReady();\n\t};\n\n\t/*\n\tp._handleStop = function () {\n\t\t// web audio does not need to do anything extra\n\t};\n\t*/\n\n\tp._updateVolume = function () {\n\t\tvar newVolume = this._muted ? 0 : this._volume;\n\t  \tif (newVolume != this.gainNode.gain.value) {\n\t\t  this.gainNode.gain.value = newVolume;\n  \t\t}\n\t};\n\n\tp._calculateCurrentPosition = function () {\n\t\treturn ((s.context.currentTime - this._playbackStartTime) * 1000); // pos in seconds * 1000 to give milliseconds\n\t};\n\n\tp._updatePosition = function () {\n\t\tthis.sourceNode = this._cleanUpAudioNode(this.sourceNode);\n\t\tthis._sourceNodeNext = this._cleanUpAudioNode(this._sourceNodeNext);\n\t\tclearTimeout(this._soundCompleteTimeout);\n\n\t\tif (!this._paused) {this._handleSoundReady();}\n\t};\n\n\t// OJR we are using a look ahead approach to ensure smooth looping.\n\t// We add _sourceNodeNext to the audio context so that it starts playing even if this callback is delayed.\n\t// This technique is described here:  http://www.html5rocks.com/en/tutorials/audio/scheduling/\n\t// NOTE the cost of this is that our audio loop may not always match the loop event timing precisely.\n\tp._handleLoop = function () {\n\t\tthis._cleanUpAudioNode(this.sourceNode);\n\t\tthis.sourceNode = this._sourceNodeNext;\n\t\tthis._playbackStartTime = this.sourceNode.startTime;\n\t\tthis._sourceNodeNext = this._createAndPlayAudioNode(this._playbackStartTime, 0);\n\t\tthis._soundCompleteTimeout = setTimeout(this._endedHandler, this._duration);\n\t};\n\n\tp._updateDuration = function () {\n\t\tif(this.playState == createjs.Sound.PLAY_SUCCEEDED) {\n\t\t\tthis._pause();\n\t\t\tthis._resume();\n\t\t}\n\t};\n\n\tcreatejs.WebAudioSoundInstance = createjs.promote(WebAudioSoundInstance, \"AbstractSoundInstance\");\n}());\n\n//##############################################################################\n// WebAudioPlugin.js\n//##############################################################################\n\n(function () {\n\n\t\"use strict\";\n\n\t/**\n\t * Play sounds using Web Audio in the browser. The WebAudioPlugin is currently the default plugin, and will be used\n\t * anywhere that it is supported. To change plugin priority, check out the Sound API\n\t * {{#crossLink \"Sound/registerPlugins\"}}{{/crossLink}} method.\n\n\t * <h4>Known Browser and OS issues for Web Audio</h4>\n\t * <b>Firefox 25</b>\n\t * <li>\n\t *     mp3 audio files do not load properly on all windows machines, reported <a href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=929969\" target=\"_blank\">here</a>.\n\t *     <br />For this reason it is recommended to pass another FireFox-supported type (i.e. ogg) as the default\n\t *     extension, until this bug is resolved\n\t * </li>\n\t *\n\t * <b>Webkit (Chrome and Safari)</b>\n\t * <li>\n\t *     AudioNode.disconnect does not always seem to work.  This can cause the file size to grow over time if you\n\t * \t   are playing a lot of audio files.\n\t * </li>\n\t *\n\t * <b>iOS 6 limitations</b>\n\t * <ul>\n\t *     <li>\n\t *         Sound is initially muted and will only unmute through play being called inside a user initiated event\n\t *         (touch/click). Please read the mobile playback notes in the the {{#crossLink \"Sound\"}}{{/crossLink}}\n\t *         class for a full overview of the limitations, and how to get around them.\n\t *     </li>\n\t *\t   <li>\n\t *\t       A bug exists that will distort un-cached audio when a video element is present in the DOM. You can avoid\n\t *\t       this bug by ensuring the audio and video audio share the same sample rate.\n\t *\t   </li>\n\t * </ul>\n\t * @class WebAudioPlugin\n\t * @extends AbstractPlugin\n\t * @constructor\n\t * @since 0.4.0\n\t */\n\tfunction WebAudioPlugin() {\n\t\tthis.AbstractPlugin_constructor();\n\n\n// Private Properties\n\t\t/**\n\t\t * Value to set panning model to equal power for WebAudioSoundInstance.  Can be \"equalpower\" or 0 depending on browser implementation.\n\t\t * @property _panningModel\n\t\t * @type {Number / String}\n\t\t * @protected\n\t\t */\n\t\tthis._panningModel = s._panningModel;;\n\n\t\t/**\n\t\t * The web audio context, which WebAudio uses to play audio. All nodes that interact with the WebAudioPlugin\n\t\t * need to be created within this context.\n\t\t * @property context\n\t\t * @type {AudioContext}\n\t\t */\n\t\tthis.context = s.context;\n\n\t\t/**\n\t\t * A DynamicsCompressorNode, which is used to improve sound quality and prevent audio distortion.\n\t\t * It is connected to <code>context.destination</code>.\n\t\t *\n\t\t * Can be accessed by advanced users through createjs.Sound.activePlugin.dynamicsCompressorNode.\n\t\t * @property dynamicsCompressorNode\n\t\t * @type {AudioNode}\n\t\t */\n\t\tthis.dynamicsCompressorNode = this.context.createDynamicsCompressor();\n\t\tthis.dynamicsCompressorNode.connect(this.context.destination);\n\n\t\t/**\n\t\t * A GainNode for controlling master volume. It is connected to {{#crossLink \"WebAudioPlugin/dynamicsCompressorNode:property\"}}{{/crossLink}}.\n\t\t *\n\t\t * Can be accessed by advanced users through createjs.Sound.activePlugin.gainNode.\n\t\t * @property gainNode\n\t\t * @type {AudioGainNode}\n\t\t */\n\t\tthis.gainNode = this.context.createGain();\n\t\tthis.gainNode.connect(this.dynamicsCompressorNode);\n\t\tcreatejs.WebAudioSoundInstance.destinationNode = this.gainNode;\n\n\t\tthis._capabilities = s._capabilities;\n\n\t\tthis._loaderClass = createjs.WebAudioLoader;\n\t\tthis._soundInstanceClass = createjs.WebAudioSoundInstance;\n\n\t\tthis._addPropsToClasses();\n\t}\n\tvar p = createjs.extend(WebAudioPlugin, createjs.AbstractPlugin);\n\n// Static Properties\n\tvar s = WebAudioPlugin;\n\t/**\n\t * The capabilities of the plugin. This is generated via the {{#crossLink \"WebAudioPlugin/_generateCapabilities:method\"}}{{/crossLink}}\n\t * method and is used internally.\n\t * @property _capabilities\n\t * @type {Object}\n\t * @default null\n\t * @private\n\t * @static\n\t */\n\ts._capabilities = null;\n\n\t/**\n\t * Value to set panning model to equal power for WebAudioSoundInstance.  Can be \"equalpower\" or 0 depending on browser implementation.\n\t * @property _panningModel\n\t * @type {Number / String}\n\t * @private\n\t * @static\n\t */\n\ts._panningModel = \"equalpower\";\n\n\t/**\n\t * The web audio context, which WebAudio uses to play audio. All nodes that interact with the WebAudioPlugin\n\t * need to be created within this context.\n\t *\n\t * Advanced users can set this to an existing context, but <b>must</b> do so before they call\n\t * {{#crossLink \"Sound/registerPlugins\"}}{{/crossLink}} or {{#crossLink \"Sound/initializeDefaultPlugins\"}}{{/crossLink}}.\n\t *\n\t * @property context\n\t * @type {AudioContext}\n\t * @static\n\t */\n\ts.context = null;\n\n\t/**\n\t * The scratch buffer that will be assigned to the buffer property of a source node on close.\n\t * Works around an iOS Safari bug: https://github.com/CreateJS/SoundJS/issues/102\n\t *\n\t * Advanced users can set this to an existing source node, but <b>must</b> do so before they call\n\t * {{#crossLink \"Sound/registerPlugins\"}}{{/crossLink}} or {{#crossLink \"Sound/initializeDefaultPlugins\"}}{{/crossLink}}.\n\t *\n\t * @property _scratchBuffer\n\t * @type {AudioBuffer}\n\t * @private\n\t * @static\n\t */\n\t s._scratchBuffer = null;\n\n\t/**\n\t * Indicated whether audio on iOS has been unlocked, which requires a touchend/mousedown event that plays an\n\t * empty sound.\n\t * @property _unlocked\n\t * @type {boolean}\n\t * @since 0.6.2\n\t * @private\n\t */\n\ts._unlocked = false;\n\n\t/**\n\t * The default sample rate used when checking for iOS compatibility. See {{#crossLink \"WebAudioPlugin/_createAudioContext\"}}{{/crossLink}}.\n\t * @property DEFAULT_SAMPLE_REATE\n\t * @type {number}\n\t * @default 44100\n\t * @static\n\t */\n\ts.DEFAULT_SAMPLE_RATE = 44100;\n\n// Static Public Methods\n\t/**\n\t * Determine if the plugin can be used in the current browser/OS.\n\t * @method isSupported\n\t * @return {Boolean} If the plugin can be initialized.\n\t * @static\n\t */\n\ts.isSupported = function () {\n\t\t// check if this is some kind of mobile device, Web Audio works with local protocol under PhoneGap and it is unlikely someone is trying to run a local file\n\t\tvar isMobilePhoneGap = createjs.BrowserDetect.isIOS || createjs.BrowserDetect.isAndroid || createjs.BrowserDetect.isBlackberry;\n\t\t// OJR isMobile may be redundant with _isFileXHRSupported available.  Consider removing.\n\t\tif (location.protocol == \"file:\" && !isMobilePhoneGap && !this._isFileXHRSupported()) { return false; }  // Web Audio requires XHR, which is not usually available locally\n\t\ts._generateCapabilities();\n\t\tif (s.context == null) {return false;}\n\t\treturn true;\n\t};\n\n\t/**\n\t * Plays an empty sound in the web audio context.  This is used to enable web audio on iOS devices, as they\n\t * require the first sound to be played inside of a user initiated event (touch/click).  This is called when\n\t * {{#crossLink \"WebAudioPlugin\"}}{{/crossLink}} is initialized (by Sound {{#crossLink \"Sound/initializeDefaultPlugins\"}}{{/crossLink}}\n\t * for example).\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *     function handleTouch(event) {\n\t *         createjs.WebAudioPlugin.playEmptySound();\n\t *     }\n\t *\n\t * @method playEmptySound\n\t * @static\n\t * @since 0.4.1\n\t */\n\ts.playEmptySound = function() {\n\t\tif (s.context == null) {return;}\n\t\tvar source = s.context.createBufferSource();\n\t\tsource.buffer = s._scratchBuffer;\n\t\tsource.connect(s.context.destination);\n\t\tsource.start(0, 0, 0);\n\t};\n\n\n// Static Private Methods\n\t/**\n\t * Determine if XHR is supported, which is necessary for web audio.\n\t * @method _isFileXHRSupported\n\t * @return {Boolean} If XHR is supported.\n\t * @since 0.4.2\n\t * @private\n\t * @static\n\t */\n\ts._isFileXHRSupported = function() {\n\t\t// it's much easier to detect when something goes wrong, so let's start optimistically\n\t\tvar supported = true;\n\n\t\tvar xhr = new XMLHttpRequest();\n\t\ttry {\n\t\t\txhr.open(\"GET\", \"WebAudioPluginTest.fail\", false); // loading non-existant file triggers 404 only if it could load (synchronous call)\n\t\t} catch (error) {\n\t\t\t// catch errors in cases where the onerror is passed by\n\t\t\tsupported = false;\n\t\t\treturn supported;\n\t\t}\n\t\txhr.onerror = function() { supported = false; }; // cause irrelevant\n\t\t// with security turned off, we can get empty success results, which is actually a failed read (status code 0?)\n\t\txhr.onload = function() { supported = this.status == 404 || (this.status == 200 || (this.status == 0 && this.response != \"\")); };\n\t\ttry {\n\t\t\txhr.send();\n\t\t} catch (error) {\n\t\t\t// catch errors in cases where the onerror is passed by\n\t\t\tsupported = false;\n\t\t}\n\n\t\treturn supported;\n\t};\n\n\t/**\n\t * Determine the capabilities of the plugin. Used internally. Please see the Sound API {{#crossLink \"Sound/capabilities:property\"}}{{/crossLink}}\n\t * method for an overview of plugin capabilities.\n\t * @method _generateCapabilities\n\t * @static\n\t * @private\n\t */\n\ts._generateCapabilities = function () {\n\t\tif (s._capabilities != null) {return;}\n\t\t// Web Audio can be in any formats supported by the audio element, from http://www.w3.org/TR/webaudio/#AudioContext-section\n\t\tvar t = document.createElement(\"audio\");\n\t\tif (t.canPlayType == null) {return null;}\n\n\t\tif (s.context == null) {\n\t\t\ts.context = s._createAudioContext();\n\t\t\tif (s.context == null) { return null; }\n\t\t}\n\t\tif (s._scratchBuffer == null) {\n\t\t\ts._scratchBuffer = s.context.createBuffer(1, 1, 22050);\n\t\t}\n\n\t\ts._compatibilitySetUp();\n\n\t\t// Listen for document level clicks to unlock WebAudio on iOS. See the _unlock method.\n\t\tif (\"ontouchstart\" in window && s.context.state != \"running\") {\n\t\t\ts._unlock(); // When played inside of a touch event, this will enable audio on iOS immediately.\n\t\t\tdocument.addEventListener(\"mousedown\", s._unlock, true);\n\t\t\tdocument.addEventListener(\"touchstart\", s._unlock, true);\n\t\t\tdocument.addEventListener(\"touchend\", s._unlock, true);\n\t\t}\n\n\t\ts._capabilities = {\n\t\t\tpanning:true,\n\t\t\tvolume:true,\n\t\t\ttracks:-1\n\t\t};\n\n\t\t// determine which extensions our browser supports for this plugin by iterating through Sound.SUPPORTED_EXTENSIONS\n\t\tvar supportedExtensions = createjs.Sound.SUPPORTED_EXTENSIONS;\n\t\tvar extensionMap = createjs.Sound.EXTENSION_MAP;\n\t\tfor (var i = 0, l = supportedExtensions.length; i < l; i++) {\n\t\t\tvar ext = supportedExtensions[i];\n\t\t\tvar playType = extensionMap[ext] || ext;\n\t\t\ts._capabilities[ext] = (t.canPlayType(\"audio/\" + ext) != \"no\" && t.canPlayType(\"audio/\" + ext) != \"\") || (t.canPlayType(\"audio/\" + playType) != \"no\" && t.canPlayType(\"audio/\" + playType) != \"\");\n\t\t}  // OJR another way to do this might be canPlayType:\"m4a\", codex: mp4\n\n\t\t// 0=no output, 1=mono, 2=stereo, 4=surround, 6=5.1 surround.\n\t\t// See http://www.w3.org/TR/webaudio/#AudioChannelSplitter for more details on channels.\n\t\tif (s.context.destination.numberOfChannels < 2) {\n\t\t\ts._capabilities.panning = false;\n\t\t}\n\t};\n\n\t/**\n\t * Create an audio context for the sound.\n\t *\n\t * This method handles both vendor prefixes (specifically webkit support), as well as a case on iOS where\n\t * audio played with a different sample rate may play garbled when first started. The default sample rate is\n\t * 44,100, however it can be changed using the {{#crossLink \"WebAudioPlugin/DEFAULT_SAMPLE_RATE:property\"}}{{/crossLink}}.\n\t * @method _createAudioContext\n\t * @return {AudioContext | webkitAudioContext}\n\t * @private\n\t * @static\n\t * @since 1.0.0\n\t */\n\ts._createAudioContext = function() {\n\t\t// Slightly modified version of https://github.com/Jam3/ios-safe-audio-context\n\t\t// Resolves issues with first-run contexts playing garbled on iOS.\n\t\tvar AudioCtor = (window.AudioContext || window.webkitAudioContext);\n\t\tif (AudioCtor == null) { return null; }\n\t\tvar context = new AudioCtor();\n\n\t\t// Check if hack is necessary. Only occurs in iOS6+ devices\n\t\t// and only when you first boot the iPhone, or play a audio/video\n\t\t// with a different sample rate\n\t\tif (/(iPhone|iPad)/i.test(navigator.userAgent)\n\t\t\t\t&& context.sampleRate !== s.DEFAULT_SAMPLE_RATE) {\n\t\t\tvar buffer = context.createBuffer(1, 1, s.DEFAULT_SAMPLE_RATE),\n\t\t\t\t\tdummy = context.createBufferSource();\n\t\t\tdummy.buffer = buffer;\n\t\t\tdummy.connect(context.destination);\n\t\t\tdummy.start(0);\n\t\t\tdummy.disconnect();\n\t\t\tcontext.close() // dispose old context\n\n\t\t\tcontext = new AudioCtor();\n\t\t}\n\t\treturn context;\n\t}\n\n\t/**\n\t * Set up compatibility if only deprecated web audio calls are supported.\n\t * See http://www.w3.org/TR/webaudio/#DeprecationNotes\n\t * Needed so we can support new browsers that don't support deprecated calls (Firefox) as well as old browsers that\n\t * don't support new calls.\n\t *\n\t * @method _compatibilitySetUp\n\t * @static\n\t * @private\n\t * @since 0.4.2\n\t */\n\ts._compatibilitySetUp = function() {\n\t\ts._panningModel = \"equalpower\";\n\t\t//assume that if one new call is supported, they all are\n\t\tif (s.context.createGain) { return; }\n\n\t\t// simple name change, functionality the same\n\t\ts.context.createGain = s.context.createGainNode;\n\n\t\t// source node, add to prototype\n\t\tvar audioNode = s.context.createBufferSource();\n\t\taudioNode.__proto__.start = audioNode.__proto__.noteGrainOn;\t// note that noteGrainOn requires all 3 parameters\n\t\taudioNode.__proto__.stop = audioNode.__proto__.noteOff;\n\n\t\t// panningModel\n\t\ts._panningModel = 0;\n\t};\n\n\t/**\n\t * Try to unlock audio on iOS. This is triggered from either WebAudio plugin setup (which will work if inside of\n\t * a `mousedown` or `touchend` event stack), or the first document touchend/mousedown event. If it fails (touchend\n\t * will fail if the user presses for too long, indicating a scroll event instead of a click event.\n\t *\n\t * Note that earlier versions of iOS supported `touchstart` for this, but iOS9 removed this functionality. Adding\n\t * a `touchstart` event to support older platforms may preclude a `mousedown` even from getting fired on iOS9, so we\n\t * stick with `mousedown` and `touchend`.\n\t * @method _unlock\n\t * @since 0.6.2\n\t * @private\n\t */\n\ts._unlock = function() {\n\t\tif (s._unlocked) { return; }\n\t\ts.playEmptySound();\n\t\tif (s.context.state == \"running\") {\n\t\t\tdocument.removeEventListener(\"mousedown\", s._unlock, true);\n\t\t\tdocument.removeEventListener(\"touchend\", s._unlock, true);\n\t\t\tdocument.removeEventListener(\"touchstart\", s._unlock, true);\n\t\t\ts._unlocked = true;\n\t\t}\n\t};\n\n\n// Public Methods\n\tp.toString = function () {\n\t\treturn \"[WebAudioPlugin]\";\n\t};\n\n\n// Private Methods\n\t/**\n\t * Set up needed properties on supported classes WebAudioSoundInstance and WebAudioLoader.\n\t * @method _addPropsToClasses\n\t * @static\n\t * @protected\n\t * @since 0.6.0\n\t */\n\tp._addPropsToClasses = function() {\n\t\tvar c = this._soundInstanceClass;\n\t\tc.context = this.context;\n\t\tc._scratchBuffer = s._scratchBuffer;\n\t\tc.destinationNode = this.gainNode;\n\t\tc._panningModel = this._panningModel;\n\n\t\tthis._loaderClass.context = this.context;\n\t};\n\n\n\t/**\n\t * Set the gain value for master audio. Should not be called externally.\n\t * @method _updateVolume\n\t * @protected\n\t */\n\tp._updateVolume = function () {\n\t\tvar newVolume = createjs.Sound._masterMute ? 0 : this._volume;\n\t\tif (newVolume != this.gainNode.gain.value) {\n\t\t\tthis.gainNode.gain.value = newVolume;\n\t\t}\n\t};\n\n\tcreatejs.WebAudioPlugin = createjs.promote(WebAudioPlugin, \"AbstractPlugin\");\n}());\n\n//##############################################################################\n// HTMLAudioTagPool.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t/**\n\t * HTMLAudioTagPool is an object pool for HTMLAudio tag instances.\n\t * @class HTMLAudioTagPool\n\t * @param {String} src The source of the channel.\n\t * @protected\n\t */\n\tfunction HTMLAudioTagPool() {\n\t\t\tthrow \"HTMLAudioTagPool cannot be instantiated\";\n\t}\n\n\tvar s = HTMLAudioTagPool;\n\n// Static Properties\n\t/**\n\t * A hash lookup of each base audio tag, indexed by the audio source.\n\t * @property _tags\n\t * @type {{}}\n\t * @static\n\t * @private\n\t */\n\ts._tags = {};\n\n\t/**\n\t * An object pool for html audio tags\n\t * @property _tagPool\n\t * @type {TagPool}\n\t * @static\n\t * @private\n\t */\n\ts._tagPool = new TagPool();\n\n\t/**\n\t * A hash lookup of if a base audio tag is available, indexed by the audio source\n\t * @property _tagsUsed\n\t * @type {{}}\n\t * @private\n\t * @static\n\t */\n\ts._tagUsed = {};\n\n// Static Methods\n\t/**\n\t  * Get an audio tag with the given source.\n\t  * @method get\n\t  * @param {String} src The source file used by the audio tag.\n\t  * @static\n\t  */\n\t s.get = function (src) {\n\t\tvar t = s._tags[src];\n\t\tif (t == null) {\n\t\t\t// create new base tag\n\t\t\tt = s._tags[src] = s._tagPool.get();\n\t\t\tt.src = src;\n\t\t} else {\n\t\t\t// get base or pool\n\t\t\tif (s._tagUsed[src]) {\n\t\t\t\tt = s._tagPool.get();\n\t\t\t\tt.src = src;\n\t\t\t} else {\n\t\t\t\ts._tagUsed[src] = true;\n\t\t\t}\n\t\t}\n\t\treturn t;\n\t };\n\n\t /**\n\t  * Return an audio tag to the pool.\n\t  * @method set\n\t  * @param {String} src The source file used by the audio tag.\n\t  * @param {HTMLElement} tag Audio tag to set.\n\t  * @static\n\t  */\n\t s.set = function (src, tag) {\n\t\t // check if this is base, if yes set boolean if not return to pool\n\t\t if(tag == s._tags[src]) {\n\t\t\t s._tagUsed[src] = false;\n\t\t } else {\n\t\t\t s._tagPool.set(tag);\n\t\t }\n\t };\n\n\t/**\n\t * Delete stored tag reference and return them to pool. Note that if the tag reference does not exist, this will fail.\n\t * @method remove\n\t * @param {String} src The source for the tag\n\t * @return {Boolean} If the TagPool was deleted.\n\t * @static\n\t */\n\ts.remove = function (src) {\n\t\tvar tag = s._tags[src];\n\t\tif (tag == null) {return false;}\n\t\ts._tagPool.set(tag);\n\t\tdelete(s._tags[src]);\n\t\tdelete(s._tagUsed[src]);\n\t\treturn true;\n\t};\n\n\t/**\n\t * Gets the duration of the src audio in milliseconds\n\t * @method getDuration\n\t * @param {String} src The source file used by the audio tag.\n\t * @return {Number} Duration of src in milliseconds\n\t * @static\n\t */\n\ts.getDuration= function (src) {\n\t\tvar t = s._tags[src];\n\t\tif (t == null || !t.duration) {return 0;}\t// OJR duration is NaN if loading has not completed\n\t\treturn t.duration * 1000;\n\t};\n\n\tcreatejs.HTMLAudioTagPool = HTMLAudioTagPool;\n\n\n// ************************************************************************************************************\n\t/**\n\t * The TagPool is an object pool for HTMLAudio tag instances.\n\t * #class TagPool\n\t * @param {String} src The source of the channel.\n\t * @protected\n\t */\n\tfunction TagPool(src) {\n\n// Public Properties\n\t\t/**\n\t\t * A list of all available tags in the pool.\n\t\t * #property tags\n\t\t * @type {Array}\n\t\t * @protected\n\t\t */\n\t\tthis._tags = [];\n\t};\n\n\tvar p = TagPool.prototype;\n\tp.constructor = TagPool;\n\n\n// Public Methods\n\t/**\n\t * Get an HTMLAudioElement for immediate playback. This takes it out of the pool.\n\t * #method get\n\t * @return {HTMLAudioElement} An HTML audio tag.\n\t */\n\tp.get = function () {\n\t\tvar tag;\n\t\tif (this._tags.length == 0) {\n\t\t\ttag = this._createTag();\n\t\t} else {\n\t\t\ttag = this._tags.pop();\n\t\t}\n\t\tif (tag.parentNode == null) {document.body.appendChild(tag);}\n\t\treturn tag;\n\t};\n\n\t/**\n\t * Put an HTMLAudioElement back in the pool for use.\n\t * #method set\n\t * @param {HTMLAudioElement} tag HTML audio tag\n\t */\n\tp.set = function (tag) {\n\t\t// OJR this first step seems unnecessary\n\t\tvar index = createjs.indexOf(this._tags, tag);\n\t\tif (index == -1) {\n\t\t\tthis._tags.src = null;\n\t\t\tthis._tags.push(tag);\n\t\t}\n\t};\n\n\tp.toString = function () {\n\t\treturn \"[TagPool]\";\n\t};\n\n\n// Private Methods\n\t/**\n\t * Create an HTML audio tag.\n\t * #method _createTag\n\t * @param {String} src The source file to set for the audio tag.\n\t * @return {HTMLElement} Returns an HTML audio tag.\n\t * @protected\n\t */\n\tp._createTag = function () {\n\t\tvar tag = document.createElement(\"audio\");\n\t\ttag.autoplay = false;\n\t\ttag.preload = \"none\";\n\t\t//LM: Firefox fails when this the preload=\"none\" for other tags, but it needs to be \"none\" to ensure PreloadJS works.\n\t\treturn tag;\n\t};\n\n}());\n\n//##############################################################################\n// HTMLAudioSoundInstance.js\n//##############################################################################\n\n(function () {\n\t\"use strict\";\n\n\t/**\n\t * HTMLAudioSoundInstance extends the base api of {{#crossLink \"AbstractSoundInstance\"}}{{/crossLink}} and is used by\n\t * {{#crossLink \"HTMLAudioPlugin\"}}{{/crossLink}}.\n\t *\n\t * @param {String} src The path to and file name of the sound.\n\t * @param {Number} startTime Audio sprite property used to apply an offset, in milliseconds.\n\t * @param {Number} duration Audio sprite property used to set the time the clip plays for, in milliseconds.\n\t * @param {Object} playbackResource Any resource needed by plugin to support audio playback.\n\t * @class HTMLAudioSoundInstance\n\t * @extends AbstractSoundInstance\n\t * @constructor\n\t */\n\tfunction HTMLAudioSoundInstance(src, startTime, duration, playbackResource) {\n\t\tthis.AbstractSoundInstance_constructor(src, startTime, duration, playbackResource);\n\n\n// Private Properties\n\t\tthis._audioSpriteStopTime = null;\n\t\tthis._delayTimeoutId = null;\n\n\t\t// Proxies, make removing listeners easier.\n\t\tthis._endedHandler = createjs.proxy(this._handleSoundComplete, this);\n\t\tthis._readyHandler = createjs.proxy(this._handleTagReady, this);\n\t\tthis._stalledHandler = createjs.proxy(this._playFailed, this);\n\t\tthis._audioSpriteEndHandler = createjs.proxy(this._handleAudioSpriteLoop, this);\n\t\tthis._loopHandler = createjs.proxy(this._handleSoundComplete, this);\n\n\t\tif (duration) {\n\t\t\tthis._audioSpriteStopTime = (startTime + duration) * 0.001;\n\t\t} else {\n\t\t\tthis._duration = createjs.HTMLAudioTagPool.getDuration(this.src);\n\t\t}\n\t}\n\tvar p = createjs.extend(HTMLAudioSoundInstance, createjs.AbstractSoundInstance);\n\n// Public Methods\n\t/**\n\t * Called by {{#crossLink \"Sound\"}}{{/crossLink}} when plugin does not handle master volume.\n\t * undoc'd because it is not meant to be used outside of Sound\n\t * #method setMasterVolume\n\t * @param value\n\t */\n\tp.setMasterVolume = function (value) {\n\t\tthis._updateVolume();\n\t};\n\n\t/**\n\t * Called by {{#crossLink \"Sound\"}}{{/crossLink}} when plugin does not handle master mute.\n\t * undoc'd because it is not meant to be used outside of Sound\n\t * #method setMasterMute\n\t * @param value\n\t */\n\tp.setMasterMute = function (isMuted) {\n\t\tthis._updateVolume();\n\t};\n\n\tp.toString = function () {\n\t\treturn \"[HTMLAudioSoundInstance]\";\n\t};\n\n//Private Methods\n\tp._removeLooping = function() {\n\t\tif(this._playbackResource == null) {return;}\n\t\tthis._playbackResource.loop = false;\n\t\tthis._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED, this._loopHandler, false);\n\t};\n\n\tp._addLooping = function() {\n\t\tif(this._playbackResource == null  || this._audioSpriteStopTime) {return;}\n\t\tthis._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED, this._loopHandler, false);\n\t\tthis._playbackResource.loop = true;\n\t};\n\n\tp._handleCleanUp = function () {\n\t\tvar tag = this._playbackResource;\n\t\tif (tag != null) {\n\t\t\ttag.pause();\n\t\t\ttag.loop = false;\n\t\t\ttag.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_ENDED, this._endedHandler, false);\n\t\t\ttag.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_READY, this._readyHandler, false);\n\t\t\ttag.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_STALLED, this._stalledHandler, false);\n\t\t\ttag.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED, this._loopHandler, false);\n\t\t\ttag.removeEventListener(createjs.HTMLAudioPlugin._TIME_UPDATE, this._audioSpriteEndHandler, false);\n\n\t\t\ttry {\n\t\t\t\ttag.currentTime = this._startTime;\n\t\t\t} catch (e) {\n\t\t\t} // Reset Position\n\t\t\tcreatejs.HTMLAudioTagPool.set(this.src, tag);\n\t\t\tthis._playbackResource = null;\n\t\t}\n\t};\n\n\tp._beginPlaying = function (playProps) {\n\t\tthis._playbackResource = createjs.HTMLAudioTagPool.get(this.src);\n\t\treturn this.AbstractSoundInstance__beginPlaying(playProps);\n\t};\n\n\tp._handleSoundReady = function (event) {\n\t\tif (this._playbackResource.readyState !== 4) {\n\t\t\tvar tag = this._playbackResource;\n\t\t\ttag.addEventListener(createjs.HTMLAudioPlugin._AUDIO_READY, this._readyHandler, false);\n\t\t\ttag.addEventListener(createjs.HTMLAudioPlugin._AUDIO_STALLED, this._stalledHandler, false);\n\t\t\ttag.preload = \"auto\"; // This is necessary for Firefox, as it won't ever \"load\" until this is set.\n\t\t\ttag.load();\n\t\t\treturn;\n\t\t}\n\n\t\tthis._updateVolume();\n\t\tthis._playbackResource.currentTime = (this._startTime + this._position) * 0.001;\n\t\tif (this._audioSpriteStopTime) {\n\t\t\tthis._playbackResource.addEventListener(createjs.HTMLAudioPlugin._TIME_UPDATE, this._audioSpriteEndHandler, false);\n\t\t} else {\n\t\t\tthis._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_ENDED, this._endedHandler, false);\n\t\t\tif(this._loop != 0) {\n\t\t\t\tthis._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED, this._loopHandler, false);\n\t\t\t\tthis._playbackResource.loop = true;\n\t\t\t}\n\t\t}\n\n\t\tthis._playbackResource.play();\n\t};\n\n\t/**\n\t * Used to handle when a tag is not ready for immediate playback when it is returned from the HTMLAudioTagPool.\n\t * @method _handleTagReady\n\t * @param event\n\t * @protected\n\t */\n\tp._handleTagReady = function (event) {\n\t\tthis._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_READY, this._readyHandler, false);\n\t\tthis._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_STALLED, this._stalledHandler, false);\n\n\t\tthis._handleSoundReady();\n\t};\n\n\tp._pause = function () {\n\t\tthis._playbackResource.pause();\n\t};\n\n\tp._resume = function () {\n\t\tthis._playbackResource.play();\n\t};\n\n\tp._updateVolume = function () {\n\t\tif (this._playbackResource != null) {\n\t\t\tvar newVolume = (this._muted || createjs.Sound._masterMute) ? 0 : this._volume * createjs.Sound._masterVolume;\n\t\t\tif (newVolume != this._playbackResource.volume) {this._playbackResource.volume = newVolume;}\n\t\t}\n\t};\n\n\tp._calculateCurrentPosition = function() {\n\t\treturn (this._playbackResource.currentTime * 1000) - this._startTime;\n\t};\n\n\tp._updatePosition = function() {\n\t\tthis._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED, this._loopHandler, false);\n\t\tthis._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED, this._handleSetPositionSeek, false);\n\t\ttry {\n\t\t\tthis._playbackResource.currentTime = (this._position + this._startTime) * 0.001;\n\t\t} catch (error) { // Out of range\n\t\t\tthis._handleSetPositionSeek(null);\n\t\t}\n\t};\n\n\t/**\n\t * Used to enable setting position, as we need to wait for that seek to be done before we add back our loop handling seek listener\n\t * @method _handleSetPositionSeek\n\t * @param event\n\t * @protected\n\t */\n\tp._handleSetPositionSeek = function(event) {\n\t\tif (this._playbackResource == null) { return; }\n\t\tthis._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED, this._handleSetPositionSeek, false);\n\t\tthis._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED, this._loopHandler, false);\n\t};\n\n\t/**\n\t * Timer used to loop audio sprites.\n\t * NOTE because of the inaccuracies in the timeupdate event (15 - 250ms) and in setting the tag to the desired timed\n\t * (up to 300ms), it is strongly recommended not to loop audio sprites with HTML Audio if smooth looping is desired\n\t *\n\t * @method _handleAudioSpriteLoop\n\t * @param event\n\t * @private\n\t */\n\tp._handleAudioSpriteLoop = function (event) {\n\t\tif(this._playbackResource.currentTime <= this._audioSpriteStopTime) {return;}\n\t\tthis._playbackResource.pause();\n\t\tif(this._loop == 0) {\n\t\t\tthis._handleSoundComplete(null);\n\t\t} else {\n\t\t\tthis._position = 0;\n\t\t\tthis._loop--;\n\t\t\tthis._playbackResource.currentTime = this._startTime * 0.001;\n\t\t\tif(!this._paused) {this._playbackResource.play();}\n\t\t\tthis._sendEvent(\"loop\");\n\t\t}\n\t};\n\n\t// NOTE with this approach audio will loop as reliably as the browser allows\n\t// but we could end up sending the loop event after next loop playback begins\n\tp._handleLoop = function (event) {\n\t\tif(this._loop == 0) {\n\t\t\tthis._playbackResource.loop = false;\n\t\t\tthis._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED, this._loopHandler, false);\n\t\t}\n\t};\n\n\tp._updateStartTime = function () {\n\t\tthis._audioSpriteStopTime = (this._startTime + this._duration) * 0.001;\n\n\t\tif(this.playState == createjs.Sound.PLAY_SUCCEEDED) {\n\t\t\tthis._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_ENDED, this._endedHandler, false);\n\t\t\tthis._playbackResource.addEventListener(createjs.HTMLAudioPlugin._TIME_UPDATE, this._audioSpriteEndHandler, false);\n\t\t}\n\t};\n\n\tp._updateDuration = function () {\n\t\tthis._audioSpriteStopTime = (this._startTime + this._duration) * 0.001;\n\n\t\tif(this.playState == createjs.Sound.PLAY_SUCCEEDED) {\n\t\t\tthis._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_ENDED, this._endedHandler, false);\n\t\t\tthis._playbackResource.addEventListener(createjs.HTMLAudioPlugin._TIME_UPDATE, this._audioSpriteEndHandler, false);\n\t\t}\n\t};\n\n\tp._setDurationFromSource = function () {\n\t\tthis._duration = createjs.HTMLAudioTagPool.getDuration(this.src);\n\t\tthis._playbackResource = null;\n\t};\n\n\tcreatejs.HTMLAudioSoundInstance = createjs.promote(HTMLAudioSoundInstance, \"AbstractSoundInstance\");\n}());\n\n//##############################################################################\n// HTMLAudioPlugin.js\n//##############################################################################\n\n(function () {\n\n\t\"use strict\";\n\n\t/**\n\t * Play sounds using HTML &lt;audio&gt; tags in the browser. This plugin is the second priority plugin installed\n\t * by default, after the {{#crossLink \"WebAudioPlugin\"}}{{/crossLink}}.  For older browsers that do not support html\n\t * audio, include and install the {{#crossLink \"FlashAudioPlugin\"}}{{/crossLink}}.\n\t *\n\t * <h4>Known Browser and OS issues for HTML Audio</h4>\n\t * <b>All browsers</b><br />\n\t * Testing has shown in all browsers there is a limit to how many audio tag instances you are allowed.  If you exceed\n\t * this limit, you can expect to see unpredictable results. Please use {{#crossLink \"Sound.MAX_INSTANCES\"}}{{/crossLink}} as\n\t * a guide to how many total audio tags you can safely use in all browsers.  This issue is primarily limited to IE9.\n\t *\n     * <b>IE html limitations</b><br />\n     * <ul><li>There is a delay in applying volume changes to tags that occurs once playback is started. So if you have\n     * muted all sounds, they will all play during this delay until the mute applies internally. This happens regardless of\n     * when or how you apply the volume change, as the tag seems to need to play to apply it.</li>\n     * <li>MP3 encoding will not always work for audio tags if it's not default.  We've found default encoding with\n     * 64kbps works.</li>\n\t * <li>Occasionally very short samples will get cut off.</li>\n\t * <li>There is a limit to how many audio tags you can load or play at once, which appears to be determined by\n\t * hardware and browser settings.  See {{#crossLink \"HTMLAudioPlugin.MAX_INSTANCES\"}}{{/crossLink}} for a safe estimate.\n\t * Note that audio sprites can be used as a solution to this issue.</li></ul>\n\t *\n\t * <b>Safari limitations</b><br />\n\t * <ul><li>Safari requires Quicktime to be installed for audio playback.</li></ul>\n\t *\n\t * <b>iOS 6 limitations</b><br />\n\t * <ul><li>can only have one &lt;audio&gt; tag</li>\n\t * \t\t<li>can not preload or autoplay the audio</li>\n\t * \t\t<li>can not cache the audio</li>\n\t * \t\t<li>can not play the audio except inside a user initiated event.</li>\n\t *\t\t<li>Note it is recommended to use {{#crossLink \"WebAudioPlugin\"}}{{/crossLink}} for iOS (6+)</li>\n\t * \t\t<li>audio sprites can be used to mitigate some of these issues and are strongly recommended on iOS</li>\n\t * </ul>\n\t *\n\t * <b>Android Native Browser limitations</b><br />\n\t * <ul><li>We have no control over audio volume. Only the user can set volume on their device.</li>\n\t *      <li>We can only play audio inside a user event (touch/click).  This currently means you cannot loop sound or use a delay.</li></ul>\n\t * <b> Android Chrome 26.0.1410.58 specific limitations</b><br />\n\t * <ul> <li>Can only play 1 sound at a time.</li>\n\t *      <li>Sound is not cached.</li>\n\t *      <li>Sound can only be loaded in a user initiated touch/click event.</li>\n\t *      <li>There is a delay before a sound is played, presumably while the src is loaded.</li>\n\t * </ul>\n\t *\n\t * See {{#crossLink \"Sound\"}}{{/crossLink}} for general notes on known issues.\n\t *\n\t * @class HTMLAudioPlugin\n\t * @extends AbstractPlugin\n\t * @constructor\n\t */\n\tfunction HTMLAudioPlugin() {\n\t\tthis.AbstractPlugin_constructor();\n\n\n\t// Public Properties\n\t\tthis._capabilities = s._capabilities;\n\n\t\tthis._loaderClass = createjs.SoundLoader;\n\t\tthis._soundInstanceClass = createjs.HTMLAudioSoundInstance;\n\t}\n\n\tvar p = createjs.extend(HTMLAudioPlugin, createjs.AbstractPlugin);\n\tvar s = HTMLAudioPlugin;\n\n// Static Properties\n\t/**\n\t * The maximum number of instances that can be loaded or played. This is a browser limitation, primarily limited to IE9.\n\t * The actual number varies from browser to browser (and is largely hardware dependant), but this is a safe estimate.\n\t * Audio sprites work around this limitation.\n\t * @property MAX_INSTANCES\n\t * @type {Number}\n\t * @default 30\n\t * @static\n\t */\n\ts.MAX_INSTANCES = 30;\n\n\t/**\n\t * Event constant for the \"canPlayThrough\" event for cleaner code.\n\t * @property _AUDIO_READY\n\t * @type {String}\n\t * @default canplaythrough\n\t * @static\n\t * @private\n\t */\n\ts._AUDIO_READY = \"canplaythrough\";\n\n\t/**\n\t * Event constant for the \"ended\" event for cleaner code.\n\t * @property _AUDIO_ENDED\n\t * @type {String}\n\t * @default ended\n\t * @static\n\t * @private\n\t */\n\ts._AUDIO_ENDED = \"ended\";\n\n\t/**\n\t * Event constant for the \"seeked\" event for cleaner code.  We utilize this event for maintaining loop events.\n\t * @property _AUDIO_SEEKED\n\t * @type {String}\n\t * @default seeked\n\t * @static\n\t * @private\n\t */\n\ts._AUDIO_SEEKED = \"seeked\";\n\n\t/**\n\t * Event constant for the \"stalled\" event for cleaner code.\n\t * @property _AUDIO_STALLED\n\t * @type {String}\n\t * @default stalled\n\t * @static\n\t * @private\n\t */\n\ts._AUDIO_STALLED = \"stalled\";\n\n\t/**\n\t * Event constant for the \"timeupdate\" event for cleaner code.  Utilized for looping audio sprites.\n\t * This event callsback ever 15 to 250ms and can be dropped by the browser for performance.\n\t * @property _TIME_UPDATE\n\t * @type {String}\n\t * @default timeupdate\n\t * @static\n\t * @private\n\t */\n\ts._TIME_UPDATE = \"timeupdate\";\n\n\t/**\n\t * The capabilities of the plugin. This is generated via the {{#crossLink \"HTMLAudioPlugin/_generateCapabilities\"}}{{/crossLink}}\n\t * method. Please see the Sound {{#crossLink \"Sound/capabilities:property\"}}{{/crossLink}} method for an overview of all\n\t * of the available properties.\n\t * @property _capabilities\n\t * @type {Object}\n\t * @private\n\t * @static\n\t */\n\ts._capabilities = null;\n\n\n// Static Methods\n\t/**\n\t * Determine if the plugin can be used in the current browser/OS. Note that HTML audio is available in most modern\n\t * browsers, but is disabled in iOS because of its limitations.\n\t * @method isSupported\n\t * @return {Boolean} If the plugin can be initialized.\n\t * @static\n\t */\n\ts.isSupported = function () {\n\t\ts._generateCapabilities();\n\t\treturn (s._capabilities != null);\n\t};\n\n\t/**\n\t * Determine the capabilities of the plugin. Used internally. Please see the Sound API {{#crossLink \"Sound/capabilities:property\"}}{{/crossLink}}\n\t * method for an overview of plugin capabilities.\n\t * @method _generateCapabilities\n\t * @static\n\t * @private\n\t */\n\ts._generateCapabilities = function () {\n\t\tif (s._capabilities != null) {return;}\n\t\tvar t = document.createElement(\"audio\");\n\t\tif (t.canPlayType == null) {return null;}\n\n\t\ts._capabilities = {\n\t\t\tpanning:false,\n\t\t\tvolume:true,\n\t\t\ttracks:-1\n\t\t};\n\n\t\t// determine which extensions our browser supports for this plugin by iterating through Sound.SUPPORTED_EXTENSIONS\n\t\tvar supportedExtensions = createjs.Sound.SUPPORTED_EXTENSIONS;\n\t\tvar extensionMap = createjs.Sound.EXTENSION_MAP;\n\t\tfor (var i = 0, l = supportedExtensions.length; i < l; i++) {\n\t\t\tvar ext = supportedExtensions[i];\n\t\t\tvar playType = extensionMap[ext] || ext;\n\t\t\ts._capabilities[ext] = (t.canPlayType(\"audio/\" + ext) != \"no\" && t.canPlayType(\"audio/\" + ext) != \"\") || (t.canPlayType(\"audio/\" + playType) != \"no\" && t.canPlayType(\"audio/\" + playType) != \"\");\n\t\t}  // OJR another way to do this might be canPlayType:\"m4a\", codex: mp4\n\t};\n\n\n// public methods\n\tp.register = function (loadItem) {\n\t\tvar tag = createjs.HTMLAudioTagPool.get(loadItem.src);\n\t\tvar loader = this.AbstractPlugin_register(loadItem);\n\t\tloader.setTag(tag);\n\n\t\treturn loader;\n\t};\n\n\tp.removeSound = function (src) {\n\t\tthis.AbstractPlugin_removeSound(src);\n\t\tcreatejs.HTMLAudioTagPool.remove(src);\n\t};\n\n\tp.create = function (src, startTime, duration) {\n\t\tvar si = this.AbstractPlugin_create(src, startTime, duration);\n\t\tsi.playbackResource = null;\n\t\treturn si;\n\t};\n\n\tp.toString = function () {\n\t\treturn \"[HTMLAudioPlugin]\";\n\t};\n\n\t// plugin does not support these\n\tp.setVolume = p.getVolume = p.setMute = null;\n\n\n\tcreatejs.HTMLAudioPlugin = createjs.promote(HTMLAudioPlugin, \"AbstractPlugin\");\n}());\n\n//##############################################################################\n// AbstractTween.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor\n\t/**\n\t * Base class that both {{#crossLink \"Tween\"}}{{/crossLink}} and {{#crossLink \"Timeline\"}}{{/crossLink}} extend. Should not be instantiated directly.\n\t * @class AbstractTween\n\t * @param {Object} [props] The configuration properties to apply to this instance (ex. `{loop:-1, paused:true}`).\n\t * Supported props are listed below. These props are set on the corresponding instance properties except where\n\t * specified.\n\t * @param {boolean} [props.useTicks=false]  See the {{#crossLink \"AbstractTween/useTicks:property\"}}{{/crossLink}} property for more information.\n\t * @param {boolean} [props.ignoreGlobalPause=false] See the {{#crossLink \"AbstractTween/ignoreGlobalPause:property\"}}{{/crossLink}} for more information.\n\t * @param {number|boolean} [props.loop=0] See the {{#crossLink \"AbstractTween/loop:property\"}}{{/crossLink}} for more information.\n\t * @param {boolean} [props.reversed=false] See the {{#crossLink \"AbstractTween/reversed:property\"}}{{/crossLink}} for more information.\n\t * @param {boolean} [props.bounce=false] See the {{#crossLink \"AbstractTween/bounce:property\"}}{{/crossLink}} for more information.\n\t * @param {number} [props.timeScale=1] See the {{#crossLink \"AbstractTween/timeScale:property\"}}{{/crossLink}} for more information.\n\t * @param {Function} [props.onChange] Adds the specified function as a listener to the {{#crossLink \"AbstractTween/change:event\"}}{{/crossLink}} event\n\t * @param {Function} [props.onComplete] Adds the specified function as a listener to the {{#crossLink \"AbstractTween/complete:event\"}}{{/crossLink}} event\n\t * @extends EventDispatcher\n\t * @constructor\n\t */\n\tfunction AbstractTween(props) {\n\t\tthis.EventDispatcher_constructor();\n\t\t\n\t// public properties:\n\t\t/**\n\t\t * Causes this tween to continue playing when a global pause is active. For example, if TweenJS is using {{#crossLink \"Ticker\"}}{{/crossLink}},\n\t\t * then setting this to false (the default) will cause this tween to be paused when `Ticker.paused` is set to\n\t\t * `true`. See the {{#crossLink \"Tween/tick\"}}{{/crossLink}} method for more info. Can be set via the `props`\n\t\t * parameter.\n\t\t * @property ignoreGlobalPause\n\t\t * @type Boolean\n\t\t * @default false\n\t\t */\n\t\tthis.ignoreGlobalPause = false;\n\t\n\t\t/**\n\t\t * Indicates the number of times to loop. If set to -1, the tween will loop continuously.\n\t\t *\n\t\t * Note that a tween must loop at _least_ once to see it play in both directions when `{{#crossLink \"AbstractTween/bounce:property\"}}{{/crossLink}}`\n\t\t * is set to `true`.\n\t\t * @property loop\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loop = 0;\n\t\n\t\t/**\n\t\t * Uses ticks for all durations instead of milliseconds. This also changes the behaviour of some actions (such as `call`).\n\t\t * Changing this value on a running tween could have unexpected results.\n\t\t * @property useTicks\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.useTicks = false;\n\t\t\n\t\t/**\n\t\t * Causes the tween to play in reverse.\n\t\t * @property reversed\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.reversed = false;\n\t\t\n\t\t/**\n\t\t * Causes the tween to reverse direction at the end of each loop. Each single-direction play-through of the\n\t\t * tween counts as a single bounce. For example, to play a tween once forward, and once back, set the\n\t\t * `{{#crossLink \"AbstractTween/loop:property\"}}{{/crossLink}}` to `1`.\n\t\t * @property bounce\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.bounce = false;\n\t\t\n\t\t/**\n\t\t * Changes the rate at which the tween advances. For example, a `timeScale` value of `2` will double the\n\t\t * playback speed, a value of `0.5` would halve it.\n\t\t * @property timeScale\n\t\t * @type {Number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1;\n\t\n\t\t/**\n\t\t * Indicates the duration of this tween in milliseconds (or ticks if `useTicks` is true), irrespective of `loops`.\n\t\t * This value is automatically updated as you modify the tween. Changing it directly could result in unexpected\n\t\t * behaviour.\n\t\t * @property duration\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.duration = 0;\n\t\n\t\t/**\n\t\t * The current normalized position of the tween. This will always be a value between 0 and `duration`.\n\t\t * Changing this property directly will have unexpected results, use {{#crossLink \"Tween/setPosition\"}}{{/crossLink}}.\n\t\t * @property position\n\t\t * @type {Object}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.position = 0;\n\t\t\n\t\t/**\n\t\t * The raw tween position. This value will be between `0` and `loops * duration` while the tween is active, or -1 before it activates.\n\t\t * @property rawPosition\n\t\t * @type {Number}\n\t\t * @default -1\n\t\t * @readonly\n\t\t */\n\t\tthis.rawPosition = -1;\n\t\t\n\t\t\n\t// private properties:\n\t\t/**\n\t\t * @property _paused\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t * @protected\n\t\t */\n\t\tthis._paused = true;\n\t\t\n\t\t/**\n\t\t * @property _next\n\t\t * @type {Tween}\n\t\t * @default null\n\t\t * @protected\n\t\t */\n\t\tthis._next = null;\n\t\t\n\t\t/**\n\t\t * @property _prev\n\t\t * @type {Tween}\n\t\t * @default null\n\t\t * @protected\n\t\t */\n\t\tthis._prev = null;\n\t\t\n\t\t/**\n\t\t * @property _parent\n\t\t * @type {Object}\n\t\t * @default null\n\t\t * @protected\n\t\t */\n\t\tthis._parent = null;\n\n\t\t/**\n\t\t * @property _labels\n\t\t * @type Object\n\t\t * @protected\n\t\t **/\n\t\tthis._labels = null;\n\n\t\t/**\n\t\t * @property _labelList\n\t\t * @type Array[Object]\n\t\t * @protected\n\t\t **/\n\t\tthis._labelList = null;\n\n\t\tif (props) {\n\t\t\tthis.useTicks = !!props.useTicks;\n\t\t\tthis.ignoreGlobalPause = !!props.ignoreGlobalPause;\n\t\t\tthis.loop = props.loop === true ? -1 : (props.loop||0);\n\t\t\tthis.reversed = !!props.reversed;\n\t\t\tthis.bounce = !!props.bounce;\n\t\t\tthis.timeScale = props.timeScale||1;\n\t\t\tprops.onChange && this.addEventListener(\"change\", props.onChange);\n\t\t\tprops.onComplete && this.addEventListener(\"complete\", props.onComplete);\n\t\t}\n\t\t\n\t\t// while `position` is shared, it needs to happen after ALL props are set, so it's handled in _init()\n\t};\n\n\tvar p = createjs.extend(AbstractTween, createjs.EventDispatcher);\n\n// events:\n\t/**\n\t * Dispatched whenever the tween's position changes. It occurs after all tweened properties are updated and actions\n\t * are executed.\n\t * @event change\n\t **/\n\t \n\t/**\n\t * Dispatched when the tween reaches its end and has paused itself. This does not fire until all loops are complete;\n\t * tweens that loop continuously will never fire a complete event.\n\t * @event complete\n\t **/\n\t\n// getter / setters:\n\t\n\t/**\n\t * Use the {{#crossLink \"AbstractTween/paused:property\"}}{{/crossLink}} property instead.\n\t * @method _setPaused\n\t * @param {Boolean} [value=true] Indicates whether the tween should be paused (`true`) or played (`false`).\n\t * @return {AbstractTween} This tween instance (for chaining calls)\n\t * @protected\n\t * @chainable\n\t */\n\tp._setPaused = function(value) {\n\t\tcreatejs.Tween._register(this, value);\n\t\treturn this;\n\t};\n\tp.setPaused = createjs.deprecate(p._setPaused, \"AbstractTween.setPaused\");\n\t\n\t/**\n\t * Use the {{#crossLink \"AbstractTween/paused:property\"}}{{/crossLink}} property instead.\n\t * @method _getPaused\n\t * @protected\n\t */\n\tp._getPaused = function() {\n\t\treturn this._paused;\n\t};\n\tp.getPaused = createjs.deprecate(p._getPaused, \"AbstactTween.getPaused\");\n\t\n\t/**\n\t * Use the {{#crossLink \"AbstractTween/currentLabel:property\"}}{{/crossLink}} property instead.\n\t * @method _getCurrentLabel\n\t * @protected\n\t * @return {String} The name of the current label or null if there is no label\n\t **/\n\tp._getCurrentLabel = function(pos) {\n\t\tvar labels = this.getLabels();\n\t\tif (pos == null) { pos = this.position; }\n\t\tfor (var i = 0, l = labels.length; i<l; i++) { if (pos < labels[i].position) { break; } }\n\t\treturn (i===0) ? null : labels[i-1].label;\n\t};\n\tp.getCurrentLabel = createjs.deprecate(p._getCurrentLabel, \"AbstractTween.getCurrentLabel\");\n\t\n\t/**\n\t * Pauses or unpauses the tween. A paused tween is removed from the global registry and is eligible for garbage\n\t * collection if no other references to it exist.\n\t * @property paused\n\t * @type Boolean\n\t * @readonly\n\t **/\n\t \n\t/**\n\t * Returns the name of the label on or immediately before the current position. For example, given a tween with\n\t * two labels, \"first\" on frame index 4, and \"second\" on frame 8, `currentLabel` would return:\n\t * <UL>\n\t * \t\t<LI>null if the current position is 2.</LI>\n\t * \t\t<LI>\"first\" if the current position is 4.</LI>\n\t * \t\t<LI>\"first\" if the current position is 7.</LI>\n\t * \t\t<LI>\"second\" if the current position is 15.</LI>\n\t * </UL>\n\t * @property currentLabel\n\t * @type String\n\t * @readonly\n\t **/\n\t \n\ttry {\n\t\tObject.defineProperties(p, {\n\t\t\tpaused: { set: p._setPaused, get: p._getPaused },\n\t\t\tcurrentLabel: { get: p._getCurrentLabel }\n\t\t});\n\t} catch (e) {}\n\n// public methods:\n\t/**\n\t * Advances the tween by a specified amount.\n\t * @method advance\n\t * @param {Number} delta The amount to advance in milliseconds (or ticks if useTicks is true). Negative values are supported.\n\t * @param {Number} [ignoreActions=false] If true, actions will not be executed due to this change in position.\n\t */\n\tp.advance = function(delta, ignoreActions) {\n\t\tthis.setPosition(this.rawPosition+delta*this.timeScale, ignoreActions);\n\t};\n\t\n\t/**\n\t * Advances the tween to a specified position.\n\t * @method setPosition\n\t * @param {Number} rawPosition The raw position to seek to in milliseconds (or ticks if useTicks is true).\n\t * @param {Boolean} [ignoreActions=false] If true, do not run any actions that would be triggered by this operation.\n\t * @param {Boolean} [jump=false] If true, only actions at the new position will be run. If false, actions between the old and new position are run.\n\t * @param {Function} [callback] Primarily for use with MovieClip, this callback is called after properties are updated, but before actions are run.\n\t */\n\tp.setPosition = function(rawPosition, ignoreActions, jump, callback) {\n\t\tvar d=this.duration, loopCount=this.loop, prevRawPos = this.rawPosition;\n\t\tvar loop=0, t=0, end=false;\n\t\t\n\t\t// normalize position:\n\t\tif (rawPosition < 0) { rawPosition = 0; }\n\t\t\n\t\tif (d === 0) {\n\t\t\t// deal with 0 length tweens.\n\t\t\tend = true;\n\t\t\tif (prevRawPos !== -1) { return end; } // we can avoid doing anything else if we're already at 0.\n\t\t} else {\n\t\t\tloop = rawPosition/d|0;\n\t\t\tt = rawPosition-loop*d;\n\t\t\t\n\t\t\tend = (loopCount !== -1 && rawPosition >= loopCount*d+d);\n\t\t\tif (end) { rawPosition = (t=d)*(loop=loopCount)+d; }\n\t\t\tif (rawPosition === prevRawPos) { return end; } // no need to update\n\t\t\t\n\t\t\tvar rev = !this.reversed !== !(this.bounce && loop%2); // current loop is reversed\n\t\t\tif (rev) { t = d-t; }\n\t\t}\n\t\t\n\t\t// set this in advance in case an action modifies position:\n\t\tthis.position = t;\n\t\tthis.rawPosition = rawPosition;\n\t\t\n\t\tthis._updatePosition(jump, end);\n\t\tif (end) { this.paused = true; }\n\t\t\n\t\tcallback&&callback(this);\n\t\t\n\t\tif (!ignoreActions) { this._runActions(prevRawPos, rawPosition, jump, !jump && prevRawPos === -1); }\n\t\t\n\t\tthis.dispatchEvent(\"change\");\n\t\tif (end) { this.dispatchEvent(\"complete\"); }\n\t};\n\t\n\t/**\n\t * Calculates a normalized position based on a raw position. For example, given a tween with a duration of 3000ms set to loop:\n\t * \tconsole.log(myTween.calculatePosition(3700); // 700\n\t * @method calculatePosition\n\t * @param {Number} rawPosition A raw position.\n\t */\n\tp.calculatePosition = function(rawPosition) {\n\t\t// largely duplicated from setPosition, but necessary to avoid having to instantiate generic objects to pass values (end, loop, position) back.\n\t\tvar d=this.duration, loopCount=this.loop, loop=0, t=0;\n\t\t\n\t\tif (d===0) { return 0; }\n\t\tif (loopCount !== -1 && rawPosition >= loopCount*d+d) { t = d; loop = loopCount } // end\n\t\telse if (rawPosition < 0) { t = 0; }\n\t\telse { loop = rawPosition/d|0; t = rawPosition-loop*d;  }\n\t\t\n\t\tvar rev = !this.reversed !== !(this.bounce && loop%2); // current loop is reversed\n\t\treturn rev ? d-t : t;\n\t};\n\t\n\t/**\n\t * Returns a list of the labels defined on this tween sorted by position.\n\t * @method getLabels\n\t * @return {Array[Object]} A sorted array of objects with label and position properties.\n\t **/\n\tp.getLabels = function() {\n\t\tvar list = this._labelList;\n\t\tif (!list) {\n\t\t\tlist = this._labelList = [];\n\t\t\tvar labels = this._labels;\n\t\t\tfor (var n in labels) {\n\t\t\t\tlist.push({label:n, position:labels[n]});\n\t\t\t}\n\t\t\tlist.sort(function (a,b) { return a.position- b.position; });\n\t\t}\n\t\treturn list;\n\t};\n\t\n\n\t/**\n\t * Defines labels for use with gotoAndPlay/Stop. Overwrites any previously set labels.\n\t * @method setLabels\n\t * @param {Object} labels An object defining labels for using {{#crossLink \"Timeline/gotoAndPlay\"}}{{/crossLink}}/{{#crossLink \"Timeline/gotoAndStop\"}}{{/crossLink}}\n\t * in the form `{myLabelName:time}` where time is in milliseconds (or ticks if `useTicks` is `true`).\n\t **/\n\tp.setLabels = function(labels) {\n\t\tthis._labels = labels;\n\t\tthis._labelList = null;\n\t};\n\n\t/**\n\t * Adds a label that can be used with {{#crossLink \"Timeline/gotoAndPlay\"}}{{/crossLink}}/{{#crossLink \"Timeline/gotoAndStop\"}}{{/crossLink}}.\n\t * @method addLabel\n\t * @param {String} label The label name.\n\t * @param {Number} position The position this label represents.\n\t **/\n\tp.addLabel = function(label, position) {\n\t\tif (!this._labels) { this._labels = {}; }\n\t\tthis._labels[label] = position;\n\t\tvar list = this._labelList;\n\t\tif (list) {\n\t\t\tfor (var i= 0,l=list.length; i<l; i++) { if (position < list[i].position) { break; } }\n\t\t\tlist.splice(i, 0, {label:label, position:position});\n\t\t}\n\t};\n\t\n\t/**\n\t * Unpauses this timeline and jumps to the specified position or label.\n\t * @method gotoAndPlay\n\t * @param {String|Number} positionOrLabel The position in milliseconds (or ticks if `useTicks` is `true`)\n\t * or label to jump to.\n\t **/\n\tp.gotoAndPlay = function(positionOrLabel) {\n\t\tthis.paused = false;\n\t\tthis._goto(positionOrLabel);\n\t};\n\n\t/**\n\t * Pauses this timeline and jumps to the specified position or label.\n\t * @method gotoAndStop\n\t * @param {String|Number} positionOrLabel The position in milliseconds (or ticks if `useTicks` is `true`) or label\n\t * to jump to.\n\t **/\n\tp.gotoAndStop = function(positionOrLabel) {\n\t\tthis.paused = true;\n\t\tthis._goto(positionOrLabel);\n\t};\n\t\n\t/**\n\t * If a numeric position is passed, it is returned unchanged. If a string is passed, the position of the\n\t * corresponding frame label will be returned, or `null` if a matching label is not defined.\n\t * @method resolve\n\t * @param {String|Number} positionOrLabel A numeric position value or label string.\n\t **/\n\tp.resolve = function(positionOrLabel) {\n\t\tvar pos = Number(positionOrLabel);\n\t\tif (isNaN(pos)) { pos = this._labels && this._labels[positionOrLabel]; }\n\t\treturn pos;\n\t};\n\t\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t */\n\tp.toString = function() {\n\t\treturn \"[AbstractTween]\";\n\t};\n\n\t/**\n\t * @method clone\n\t * @protected\n\t */\n\tp.clone = function() {\n\t\tthrow(\"AbstractTween can not be cloned.\")\n\t};\n\n\n// private methods:\n\t/**\n\t * Shared logic that executes at the end of the subclass constructor.\n\t * @method _init\n\t * @protected\n\t */\n\tp._init = function(props) {\n\t\tif (!props || !props.paused) { this.paused = false; }\n\t\tif (props&&(props.position!=null)) { this.setPosition(props.position); }\n\t};\n\n\t/**\n\t * @method _updatePosition\n\t * @protected\n\t */\n\tp._updatePosition = function(jump, end) {\n\t\t// abstract.\n\t};\n\t\n\t/**\n\t * @method _goto\n\t * @protected\n\t **/\n\tp._goto = function(positionOrLabel) {\n\t\tvar pos = this.resolve(positionOrLabel);\n\t\tif (pos != null) { this.setPosition(pos, false, true); }\n\t};\n\t\n\t/**\n\t * @method _runActions\n\t * @protected\n\t */\n\tp._runActions = function(startRawPos, endRawPos, jump, includeStart) {\n\t\t// runs actions between startPos & endPos. Separated to support action deferral.\n\t\t\n\t\t//console.log(this.passive === false ? \" > Tween\" : \"Timeline\", \"run\", startRawPos, endRawPos, jump, includeStart);\n\t\t\n\t\t// if we don't have any actions, and we're not a Timeline, then return:\n\t\t// TODO: a cleaner way to handle this would be to override this method in Tween, but I'm not sure it's worth the overhead.\n\t\tif (!this._actionHead && !this.tweens) { return; } \n\t\t\n\t\tvar d=this.duration, reversed=this.reversed, bounce=this.bounce, loopCount=this.loop;\n\t\tvar loop0, loop1, t0, t1;\n\t\t\n\t\tif (d === 0) {\n\t\t\t// deal with 0 length tweens:\n\t\t\tloop0 = loop1 = t0 = t1 = 0;\n\t\t\treversed = bounce = false;\n\t\t} else {\n\t\t\tloop0=startRawPos/d|0;\n\t\t\tloop1=endRawPos/d|0;\n\t\t\tt0=startRawPos-loop0*d;\n\t\t\tt1=endRawPos-loop1*d;\n\t\t}\n\t\t\n\t\t// catch positions that are past the end:\n\t\tif (loopCount !== -1) {\n\t\t\tif (loop1 > loopCount) { t1=d; loop1=loopCount; }\n\t\t\tif (loop0 > loopCount) { t0=d; loop0=loopCount; }\n\t\t}\n\t\t\n\t\t// special cases:\n\t\tif (jump) { return this._runActionsRange(t1, t1, jump, includeStart); } // jump.\n\t\telse if (loop0 === loop1 && t0 === t1 && !jump && !includeStart) { return; } // no actions if the position is identical and we aren't including the start\n\t\telse if (loop0 === -1) { loop0 = t0 = 0; } // correct the -1 value for first advance, important with useTicks.\n\t\t\n\t\tvar dir = (startRawPos <= endRawPos), loop = loop0;\n\t\tdo {\n\t\t\tvar rev = !reversed !== !(bounce && loop % 2);\n\n\t\t\tvar start = (loop === loop0) ? t0 : dir ? 0 : d;\n\t\t\tvar end = (loop === loop1) ? t1 : dir ? d : 0;\n\t\t\t\n\t\t\tif (rev) {\n\t\t\t\tstart = d - start;\n\t\t\t\tend = d - end;\n\t\t\t}\n\t\t\t\n\t\t\tif (bounce && loop !== loop0 && start === end) { /* bounced onto the same time/frame, don't re-execute end actions */ }\n\t\t\telse if (this._runActionsRange(start, end, jump, includeStart || (loop !== loop0 && !bounce))) { return true; }\n\t\t\t\t\n\t\t\tincludeStart = false;\n\t\t} while ((dir && ++loop <= loop1) || (!dir && --loop >= loop1));\n\t};\n\t\n\tp._runActionsRange = function(startPos, endPos, jump, includeStart) {\n\t\t// abstract\n\t};\n\n\tcreatejs.AbstractTween = createjs.promote(AbstractTween, \"EventDispatcher\");\n}());\n\n//##############################################################################\n// Tween.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\n// constructor\n\t/**\n\t * Tweens properties for a single target. Methods can be chained to create complex animation sequences:\n\t *\n\t * <h4>Example</h4>\n\t *\n\t *\tcreatejs.Tween.get(target)\n\t *\t\t.wait(500)\n\t *\t\t.to({alpha:0, visible:false}, 1000)\n\t *\t\t.call(handleComplete);\n\t *\n\t * Multiple tweens can share a target, however if they affect the same properties there could be unexpected\n\t * behaviour. To stop all tweens on an object, use {{#crossLink \"Tween/removeTweens\"}}{{/crossLink}} or pass `override:true`\n\t * in the props argument.\n\t *\n\t * \tcreatejs.Tween.get(target, {override:true}).to({x:100});\n\t *\n\t * Subscribe to the {{#crossLink \"Tween/change:event\"}}{{/crossLink}} event to be notified when the tween position changes.\n\t *\n\t * \tcreatejs.Tween.get(target, {override:true}).to({x:100}).addEventListener(\"change\", handleChange);\n\t * \tfunction handleChange(event) {\n\t * \t\t// The tween changed.\n\t * \t}\n\t *\n\t * See the {{#crossLink \"Tween/get\"}}{{/crossLink}} method also.\n\t * @class Tween\n\t * @param {Object} target The target object that will have its properties tweened.\n\t * @param {Object} [props] The configuration properties to apply to this instance (ex. `{loop:-1, paused:true}`).\n\t * Supported props are listed below. These props are set on the corresponding instance properties except where\n\t * specified.\n\t * @param {boolean} [props.useTicks=false]  See the {{#crossLink \"AbstractTween/useTicks:property\"}}{{/crossLink}} property for more information.\n\t * @param {boolean} [props.ignoreGlobalPause=false] See the {{#crossLink \"AbstractTween/ignoreGlobalPause:property\"}}{{/crossLink}} for more information.\n\t * @param {number|boolean} [props.loop=0] See the {{#crossLink \"AbstractTween/loop:property\"}}{{/crossLink}} for more information.\n\t * @param {boolean} [props.reversed=false] See the {{#crossLink \"AbstractTween/reversed:property\"}}{{/crossLink}} for more information.\n\t * @param {boolean} [props.bounce=false] See the {{#crossLink \"AbstractTween/bounce:property\"}}{{/crossLink}} for more information.\n\t * @param {number} [props.timeScale=1] See the {{#crossLink \"AbstractTween/timeScale:property\"}}{{/crossLink}} for more information.\n\t * @param {object} [props.pluginData] See the {{#crossLink \"Tween/pluginData:property\"}}{{/crossLink}} for more information.\n\t * @param {boolean} [props.paused=false] See the {{#crossLink \"AbstractTween/paused:property\"}}{{/crossLink}} for more information.\n\t * @param {number} [props.position=0] The initial position for this tween. See {{#crossLink \"AbstractTween/position:property\"}}{{/crossLink}}\n\t * @param {Function} [props.onChange] Adds the specified function as a listener to the {{#crossLink \"AbstractTween/change:event\"}}{{/crossLink}} event\n\t * @param {Function} [props.onComplete] Adds the specified function as a listener to the {{#crossLink \"AbstractTween/complete:event\"}}{{/crossLink}} event\n\t * @param {boolean} [props.override=false] Removes all existing tweens for the target when set to `true`.\n\t * </UL>\n\t * @extends AbstractTween\n\t * @constructor\n\t */\n\tfunction Tween(target, props) {\n\t\tthis.AbstractTween_constructor(props);\n\t\t\n\t// public properties:\n\t\n\t\t/**\n\t\t * Allows you to specify data that will be used by installed plugins. Each plugin uses this differently, but in general\n\t\t * you specify data by assigning it to a property of `pluginData` with the same name as the plugin.\n\t\t * Note that in many cases, this data is used as soon as the plugin initializes itself for the tween.\n\t\t * As such, this data should be set before the first `to` call in most cases.\n\t\t * @example\n\t\t *\tmyTween.pluginData.SmartRotation = data;\n\t\t * \n\t\t * Most plugins also support a property to disable them for a specific tween. This is typically the plugin name followed by \"_disabled\".\n\t\t * @example\n\t\t *\tmyTween.pluginData.SmartRotation_disabled = true;\n\t\t * \n\t\t * Some plugins also store working data in this object, usually in a property named `_PluginClassName`.\n\t\t * See the documentation for individual plugins for more details.\n\t\t * @property pluginData\n\t\t * @type {Object}\n\t\t */\n\t\tthis.pluginData = null;\n\t\n\t\t/**\n\t\t * The target of this tween. This is the object on which the tweened properties will be changed.\n\t\t * @property target\n\t\t * @type {Object}\n\t\t * @readonly\n\t\t */\n\t\tthis.target = target;\n\t\n\t\t/**\n\t\t * Indicates the tween's current position is within a passive wait.\n\t\t * @property passive\n\t\t * @type {Boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t **/\n\t\tthis.passive = false;\n\t\t\n\t\t\n\t// private properties:\n\t\n\t\t/**\n\t\t * @property _stepHead\n\t\t * @type {TweenStep}\n\t\t * @protected\n\t\t */\n\t\tthis._stepHead = new TweenStep(null, 0, 0, {}, null, true);\n\t\t\n\t\t/**\n\t\t * @property _stepTail\n\t\t * @type {TweenStep}\n\t\t * @protected\n\t\t */\n\t\tthis._stepTail = this._stepHead;\n\t\t\n\t\t/**\n\t\t * The position within the current step. Used by MovieClip.\n\t\t * @property _stepPosition\n\t\t * @type {Number}\n\t\t * @default 0\n\t\t * @protected\n\t\t */\n\t\tthis._stepPosition = 0;\n\t\t\n\t\t/**\n\t\t * @property _actionHead\n\t\t * @type {TweenAction}\n\t\t * @protected\n\t\t */\n\t\tthis._actionHead = null;\n\t\t\n\t\t/**\n\t\t * @property _actionTail\n\t\t * @type {TweenAction}\n\t\t * @protected\n\t\t */\n\t\tthis._actionTail = null;\n\t\t\n\t\t/**\n\t\t * Plugins added to this tween instance.\n\t\t * @property _plugins\n\t\t * @type Array[Object]\n\t\t * @default null\n\t\t * @protected\n\t\t */\n\t\tthis._plugins = null;\n\t\t\n\t\t/**\n\t\t * Hash for quickly looking up added plugins. Null until a plugin is added.\n\t\t * @property _plugins\n\t\t * @type Object\n\t\t * @default null\n\t\t * @protected\n\t\t */\n\t\tthis._pluginIds = null;\n\t\t\n\t\t/**\n\t\t * Used by plugins to inject new properties.\n\t\t * @property _injected\n\t\t * @type {Object}\n\t\t * @default null\n\t\t * @protected\n\t\t */\n\t\tthis._injected = null;\n\n\t\tif (props) {\n\t\t\tthis.pluginData = props.pluginData;\n\t\t\tif (props.override) { Tween.removeTweens(target); }\n\t\t}\n\t\tif (!this.pluginData) { this.pluginData = {}; }\n\t\t\n\t\tthis._init(props);\n\t};\n\n\tvar p = createjs.extend(Tween, createjs.AbstractTween);\n\n// static properties\n\n\t/**\n\t * Constant returned by plugins to tell the tween not to use default assignment.\n\t * @property IGNORE\n\t * @type Object\n\t * @static\n\t */\n\tTween.IGNORE = {};\n\n\t/**\n\t * @property _listeners\n\t * @type Array[Tween]\n\t * @static\n\t * @protected\n\t */\n\tTween._tweens = [];\n\n\t/**\n\t * @property _plugins\n\t * @type Object\n\t * @static\n\t * @protected\n\t */\n\tTween._plugins = null;\n\t\n\t/**\n\t * @property _tweenHead\n\t * @type Tween\n\t * @static\n\t * @protected\n\t */\n\tTween._tweenHead = null;\n\t\n\t/**\n\t * @property _tweenTail\n\t * @type Tween\n\t * @static\n\t * @protected\n\t */\n\tTween._tweenTail = null;\n\n\n// static methods\t\n\t/**\n\t * Returns a new tween instance. This is functionally identical to using `new Tween(...)`, but may look cleaner\n\t * with the chained syntax of TweenJS.\n\t * <h4>Example</h4>\n\t *\n\t *\tvar tween = createjs.Tween.get(target).to({x:100}, 500);\n\t *\t// equivalent to:\n\t *\tvar tween = new createjs.Tween(target).to({x:100}, 500);\n\t *\n\t * @method get\n\t * @param {Object} target The target object that will have its properties tweened.\n\t * @param {Object} [props] The configuration properties to apply to this instance (ex. `{loop:-1, paused:true}`).\n\t * Supported props are listed below. These props are set on the corresponding instance properties except where\n\t * specified.\n\t * @param {boolean} [props.useTicks=false]  See the {{#crossLink \"AbstractTween/useTicks:property\"}}{{/crossLink}} property for more information.\n\t * @param {boolean} [props.ignoreGlobalPause=false] See the {{#crossLink \"AbstractTween/ignoreGlobalPause:property\"}}{{/crossLink}} for more information.\n\t * @param {number|boolean} [props.loop=0] See the {{#crossLink \"AbstractTween/loop:property\"}}{{/crossLink}} for more information.\n\t * @param {boolean} [props.reversed=false] See the {{#crossLink \"AbstractTween/reversed:property\"}}{{/crossLink}} for more information.\n\t * @param {boolean} [props.bounce=false] See the {{#crossLink \"AbstractTween/bounce:property\"}}{{/crossLink}} for more information.\n\t * @param {number} [props.timeScale=1] See the {{#crossLink \"AbstractTween/timeScale:property\"}}{{/crossLink}} for more information.\n\t * @param {object} [props.pluginData] See the {{#crossLink \"Tween/pluginData:property\"}}{{/crossLink}} for more information.\n\t * @param {boolean} [props.paused=false] See the {{#crossLink \"AbstractTween/paused:property\"}}{{/crossLink}} for more information.\n\t * @param {number} [props.position=0] The initial position for this tween. See {{#crossLink \"AbstractTween/position:property\"}}{{/crossLink}}\n\t * @param {Function} [props.onChange] Adds the specified function as a listener to the {{#crossLink \"AbstractTween/change:event\"}}{{/crossLink}} event\n\t * @param {Function} [props.onComplete] Adds the specified function as a listener to the {{#crossLink \"AbstractTween/complete:event\"}}{{/crossLink}} event\n\t * @param {boolean} [props.override=false] Removes all existing tweens for the target when set to `true`.\n\t * @return {Tween} A reference to the created tween.\n\t * @static\n\t */\n\tTween.get = function(target, props) {\n\t\treturn new Tween(target, props);\n\t};\n\n\t/**\n\t * Advances all tweens. This typically uses the {{#crossLink \"Ticker\"}}{{/crossLink}} class, but you can call it\n\t * manually if you prefer to use your own \"heartbeat\" implementation.\n\t * @method tick\n\t * @param {Number} delta The change in time in milliseconds since the last tick. Required unless all tweens have\n\t * `useTicks` set to true.\n\t * @param {Boolean} paused Indicates whether a global pause is in effect. Tweens with {{#crossLink \"Tween/ignoreGlobalPause:property\"}}{{/crossLink}}\n\t * will ignore this, but all others will pause if this is `true`.\n\t * @static\n\t */\n\tTween.tick = function(delta, paused) {\n\t\tvar tween = Tween._tweenHead;\n\t\twhile (tween) {\n\t\t\tvar next = tween._next; // in case it completes and wipes its _next property\n\t\t\tif ((paused && !tween.ignoreGlobalPause) || tween._paused) { /* paused */ }\n\t\t\telse { tween.advance(tween.useTicks?1:delta); }\n\t\t\ttween = next;\n\t\t}\n\t};\n\n\t/**\n\t * Handle events that result from Tween being used as an event handler. This is included to allow Tween to handle\n\t * {{#crossLink \"Ticker/tick:event\"}}{{/crossLink}} events from the createjs {{#crossLink \"Ticker\"}}{{/crossLink}}.\n\t * No other events are handled in Tween.\n\t * @method handleEvent\n\t * @param {Object} event An event object passed in by the {{#crossLink \"EventDispatcher\"}}{{/crossLink}}. Will\n\t * usually be of type \"tick\".\n\t * @private\n\t * @static\n\t * @since 0.4.2\n\t */\n\tTween.handleEvent = function(event) {\n\t\tif (event.type === \"tick\") {\n\t\t\tthis.tick(event.delta, event.paused);\n\t\t}\n\t};\n\n\t/**\n\t * Removes all existing tweens for a target. This is called automatically by new tweens if the `override`\n\t * property is `true`.\n\t * @method removeTweens\n\t * @param {Object} target The target object to remove existing tweens from.\n\t * @static\n\t */\n\tTween.removeTweens = function(target) {\n\t\tif (!target.tweenjs_count) { return; }\n\t\tvar tween = Tween._tweenHead;\n\t\twhile (tween) {\n\t\t\tvar next = tween._next;\n\t\t\tif (tween.target === target) { Tween._register(tween, true); }\n\t\t\ttween = next;\n\t\t}\n\t\ttarget.tweenjs_count = 0;\n\t};\n\n\t/**\n\t * Stop and remove all existing tweens.\n\t * @method removeAllTweens\n\t * @static\n\t * @since 0.4.1\n\t */\n\tTween.removeAllTweens = function() {\n\t\tvar tween = Tween._tweenHead;\n\t\twhile (tween) {\n\t\t\tvar next = tween._next;\n\t\t\ttween._paused = true;\n\t\t\ttween.target&&(tween.target.tweenjs_count = 0);\n\t\t\ttween._next = tween._prev = null;\n\t\t\ttween = next;\n\t\t}\n\t\tTween._tweenHead = Tween._tweenTail = null;\n\t};\n\n\t/**\n\t * Indicates whether there are any active tweens on the target object (if specified) or in general.\n\t * @method hasActiveTweens\n\t * @param {Object} [target] The target to check for active tweens. If not specified, the return value will indicate\n\t * if there are any active tweens on any target.\n\t * @return {Boolean} Indicates if there are active tweens.\n\t * @static\n\t */\n\tTween.hasActiveTweens = function(target) {\n\t\tif (target) { return !!target.tweenjs_count; }\n\t\treturn !!Tween._tweenHead;\n\t};\n\n\t/**\n\t * Installs a plugin, which can modify how certain properties are handled when tweened. See the {{#crossLink \"SamplePlugin\"}}{{/crossLink}}\n\t * for an example of how to write TweenJS plugins. Plugins should generally be installed via their own `install` method, in order to provide\n\t * the plugin with an opportunity to configure itself.\n\t * @method _installPlugin\n\t * @param {Object} plugin The plugin to install\n\t * @static\n\t * @protected\n\t */\n\tTween._installPlugin = function(plugin) {\n\t\tvar priority = (plugin.priority = plugin.priority||0), arr = (Tween._plugins = Tween._plugins || []);\n\t\tfor (var i=0,l=arr.length;i<l;i++) {\n\t\t\tif (priority < arr[i].priority) { break; }\n\t\t}\n\t\tarr.splice(i,0,plugin);\n\t};\n\n\t/**\n\t * Registers or unregisters a tween with the ticking system.\n\t * @method _register\n\t * @param {Tween} tween The tween instance to register or unregister.\n\t * @param {Boolean} paused If `false`, the tween is registered. If `true` the tween is unregistered.\n\t * @static\n\t * @protected\n\t */\n\tTween._register = function(tween, paused) {\n\t\tvar target = tween.target;\n\t\tif (!paused && tween._paused) {\n\t\t\t// TODO: this approach might fail if a dev is using sealed objects\n\t\t\tif (target) { target.tweenjs_count = target.tweenjs_count ? target.tweenjs_count+1 : 1; }\n\t\t\tvar tail = Tween._tweenTail;\n\t\t\tif (!tail) { Tween._tweenHead = Tween._tweenTail = tween; }\n\t\t\telse {\n\t\t\t\tTween._tweenTail = tail._next = tween;\n\t\t\t\ttween._prev = tail;\n\t\t\t}\n\t\t\tif (!Tween._inited && createjs.Ticker) { createjs.Ticker.addEventListener(\"tick\", Tween); Tween._inited = true; }\n\t\t} else if (paused && !tween._paused) {\n\t\t\tif (target) { target.tweenjs_count--; }\n\t\t\tvar next = tween._next, prev = tween._prev;\n\t\t\t\n\t\t\tif (next) { next._prev = prev; }\n\t\t\telse { Tween._tweenTail = prev; } // was tail\n\t\t\tif (prev) { prev._next = next; }\n\t\t\telse { Tween._tweenHead = next; } // was head.\n\t\t\t\n\t\t\ttween._next = tween._prev = null;\n\t\t}\n\t\ttween._paused = paused;\n\t};\n\n\n// events:\n\n// public methods:\n\t/**\n\t * Adds a wait (essentially an empty tween).\n\t * <h4>Example</h4>\n\t *\n\t *\t//This tween will wait 1s before alpha is faded to 0.\n\t *\tcreatejs.Tween.get(target).wait(1000).to({alpha:0}, 1000);\n\t *\n\t * @method wait\n\t * @param {Number} duration The duration of the wait in milliseconds (or in ticks if `useTicks` is true).\n\t * @param {Boolean} [passive=false] Tween properties will not be updated during a passive wait. This\n\t * is mostly useful for use with {{#crossLink \"Timeline\"}}{{/crossLink}} instances that contain multiple tweens\n\t * affecting the same target at different times.\n\t * @return {Tween} This tween instance (for chaining calls).\n\t * @chainable\n\t **/\n\tp.wait = function(duration, passive) {\n\t\tif (duration > 0) { this._addStep(+duration, this._stepTail.props, null, passive); }\n\t\treturn this;\n\t};\n\n\t/**\n\t * Adds a tween from the current values to the specified properties. Set duration to 0 to jump to these value.\n\t * Numeric properties will be tweened from their current value in the tween to the target value. Non-numeric\n\t * properties will be set at the end of the specified duration.\n\t * <h4>Example</h4>\n\t *\n\t *\tcreatejs.Tween.get(target).to({alpha:0, visible:false}, 1000);\n\t *\n\t * @method to\n\t * @param {Object} props An object specifying property target values for this tween (Ex. `{x:300}` would tween the x\n\t * property of the target to 300).\n\t * @param {Number} [duration=0] The duration of the tween in milliseconds (or in ticks if `useTicks` is true).\n\t * @param {Function} [ease=\"linear\"] The easing function to use for this tween. See the {{#crossLink \"Ease\"}}{{/crossLink}}\n\t * class for a list of built-in ease functions.\n\t * @return {Tween} This tween instance (for chaining calls).\n\t * @chainable\n\t */\n\tp.to = function(props, duration, ease) {\n\t\tif (duration == null || duration < 0) { duration = 0; }\n\t\tvar step = this._addStep(+duration, null, ease);\n\t\tthis._appendProps(props, step);\n\t\treturn this;\n\t};\n\t\n\t/**\n\t * Adds a label that can be used with {{#crossLink \"Tween/gotoAndPlay\"}}{{/crossLink}}/{{#crossLink \"Tween/gotoAndStop\"}}{{/crossLink}}\n\t * at the current point in the tween. For example:\n\t * \n\t * \tvar tween = createjs.Tween.get(foo)\n\t * \t\t\t\t\t.to({x:100}, 1000)\n\t * \t\t\t\t\t.label(\"myLabel\")\n\t * \t\t\t\t\t.to({x:200}, 1000);\n\t * // ...\n\t * tween.gotoAndPlay(\"myLabel\"); // would play from 1000ms in.\n\t * \n\t * @method addLabel\n\t * @param {String} label The label name.\n\t * @return {Tween} This tween instance (for chaining calls).\n\t * @chainable\n\t **/\n\tp.label = function(name) {\n\t\tthis.addLabel(name, this.duration);\n\t\treturn this;\n\t};\n\n\t/**\n\t * Adds an action to call the specified function.\n\t * <h4>Example</h4>\n\t *\n\t * \t//would call myFunction() after 1 second.\n\t * \tcreatejs.Tween.get().wait(1000).call(myFunction);\n\t *\n\t * @method call\n\t * @param {Function} callback The function to call.\n\t * @param {Array} [params]. The parameters to call the function with. If this is omitted, then the function\n\t * will be called with a single param pointing to this tween.\n\t * @param {Object} [scope]. The scope to call the function in. If omitted, it will be called in the target's scope.\n\t * @return {Tween} This tween instance (for chaining calls).\n\t * @chainable\n\t */\n\tp.call = function(callback, params, scope) {\n\t\treturn this._addAction(scope||this.target, callback, params||[this]);\n\t};\n\n\t/**\n\t * Adds an action to set the specified props on the specified target. If `target` is null, it will use this tween's\n\t * target. Note that for properties on the target object, you should consider using a zero duration {{#crossLink \"Tween/to\"}}{{/crossLink}}\n\t * operation instead so the values are registered as tweened props.\n\t * <h4>Example</h4>\n\t *\n\t *\tmyTween.wait(1000).set({visible:false}, foo);\n\t *\n\t * @method set\n\t * @param {Object} props The properties to set (ex. `{visible:false}`).\n\t * @param {Object} [target] The target to set the properties on. If omitted, they will be set on the tween's target.\n\t * @return {Tween} This tween instance (for chaining calls).\n\t * @chainable\n\t */\n\tp.set = function(props, target) {\n\t\treturn this._addAction(target||this.target, this._set, [props]);\n\t};\n\n\t/**\n\t * Adds an action to play (unpause) the specified tween. This enables you to sequence multiple tweens.\n\t * <h4>Example</h4>\n\t *\n\t *\tmyTween.to({x:100}, 500).play(otherTween);\n\t *\n\t * @method play\n\t * @param {Tween} [tween] The tween to play. Defaults to this tween.\n\t * @return {Tween} This tween instance (for chaining calls).\n\t * @chainable\n\t */\n\tp.play = function(tween) {\n\t\treturn this._addAction(tween||this, this._set, [{paused:false}]);\n\t};\n\n\t/**\n\t * Adds an action to pause the specified tween.\n\t * \n\t * \tmyTween.pause(otherTween).to({alpha:1}, 1000).play(otherTween);\n\t * \n\t * Note that this executes at the end of a tween update, so the tween may advance beyond the time the pause\n\t * action was inserted at. For example:\n\t * \n\t * myTween.to({foo:0}, 1000).pause().to({foo:1}, 1000);\n\t * \n\t * At 60fps the tween will advance by ~16ms per tick, if the tween above was at 999ms prior to the current tick, it\n\t * will advance to 1015ms (15ms into the second \"step\") and then pause.\n\t * \n\t * @method pause\n\t * @param {Tween} [tween] The tween to pause. Defaults to this tween.\n\t * @return {Tween} This tween instance (for chaining calls)\n\t * @chainable\n\t */\n\tp.pause = function(tween) {\n\t\treturn this._addAction(tween||this, this._set, [{paused:true}]);\n\t};\n\n\t// tiny api (primarily for tool output):\n\tp.w = p.wait;\n\tp.t = p.to;\n\tp.c = p.call;\n\tp.s = p.set;\n\n\t/**\n\t * Returns a string representation of this object.\n\t * @method toString\n\t * @return {String} a string representation of the instance.\n\t */\n\tp.toString = function() {\n\t\treturn \"[Tween]\";\n\t};\n\n\t/**\n\t * @method clone\n\t * @protected\n\t */\n\tp.clone = function() {\n\t\tthrow(\"Tween can not be cloned.\")\n\t};\n\n\n// private methods:\n\t/**\n\t * Adds a plugin to this tween.\n\t * @method _addPlugin\n\t * @param {Object} plugin\n\t * @protected\n\t */\n\tp._addPlugin = function(plugin) {\n\t\tvar ids = this._pluginIds || (this._pluginIds = {}), id = plugin.ID;\n\t\tif (!id || ids[id]) { return; } // already added\n\t\t\n\t\tids[id] = true;\n\t\tvar plugins = this._plugins || (this._plugins = []), priority = plugin.priority || 0;\n\t\tfor (var i=0,l=plugins.length; i<l; i++) {\n\t\t\tif (priority < plugins[i].priority) {\n\t\t\t\tplugins.splice(i,0,plugin);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tplugins.push(plugin);\n\t};\n\t\n\t// Docced in AbstractTween\n\tp._updatePosition = function(jump, end) {\n\t\tvar step = this._stepHead.next, t=this.position, d=this.duration;\n\t\tif (this.target && step) {\n\t\t\t// find our new step index:\n\t\t\tvar stepNext = step.next;\n\t\t\twhile (stepNext && stepNext.t <= t) { step = step.next; stepNext = step.next; }\n\t\t\tvar ratio = end ? d === 0 ? 1 : t/d : (t-step.t)/step.d; // TODO: revisit this.\n\t\t\tthis._updateTargetProps(step, ratio, end);\n\t\t}\n\t\tthis._stepPosition = step ? t-step.t : 0;\n\t};\n\t\n\t/**\n\t * @method _updateTargetProps\n\t * @param {Object} step\n\t * @param {Number} ratio\n\t * @param {Boolean} end Indicates to plugins that the full tween has ended.\n\t * @protected\n\t */\n\tp._updateTargetProps = function(step, ratio, end) {\n\t\tif (this.passive = !!step.passive) { return; } // don't update props.\n\t\t\n\t\tvar v, v0, v1, ease;\n\t\tvar p0 = step.prev.props;\n\t\tvar p1 = step.props;\n\t\tif (ease = step.ease) { ratio = ease(ratio,0,1,1); }\n\t\t\n\t\tvar plugins = this._plugins;\n\t\tproploop : for (var n in p0) {\n\t\t\tv0 = p0[n];\n\t\t\tv1 = p1[n];\n\t\t\t\n\t\t\t// values are different & it is numeric then interpolate:\n\t\t\tif (v0 !== v1 && (typeof(v0) === \"number\")) {\n\t\t\t\tv = v0+(v1-v0)*ratio;\n\t\t\t} else {\n\t\t\t\tv = ratio >= 1 ? v1 : v0;\n\t\t\t}\n\t\t\t\n\t\t\tif (plugins) {\n\t\t\t\tfor (var i=0,l=plugins.length;i<l;i++) {\n\t\t\t\t\tvar value = plugins[i].change(this, step, n, v, ratio, end);\n\t\t\t\t\tif (value === Tween.IGNORE) { continue proploop; }\n\t\t\t\t\tif (value !== undefined) { v = value; }\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.target[n] = v;\n\t\t}\n\n\t};\n\t\n\t/**\n\t * @method _runActionsRange\n\t * @param {Number} startPos\n\t * @param {Number} endPos\n\t * @param {Boolean} includeStart\n\t * @protected\n\t */\n\tp._runActionsRange = function(startPos, endPos, jump, includeStart) {\n\t\tvar rev = startPos > endPos;\n\t\tvar action = rev ? this._actionTail : this._actionHead;\n\t\tvar ePos = endPos, sPos = startPos;\n\t\tif (rev) { ePos=startPos; sPos=endPos; }\n\t\tvar t = this.position;\n\t\twhile (action) {\n\t\t\tvar pos = action.t;\n\t\t\tif (pos === endPos || (pos > sPos && pos < ePos) || (includeStart && pos === startPos)) {\n\t\t\t\taction.funct.apply(action.scope, action.params);\n\t\t\t\tif (t !== this.position) { return true; }\n\t\t\t}\n\t\t\taction = rev ? action.prev : action.next;\n\t\t}\n\t};\n\n\t/**\n\t * @method _appendProps\n\t * @param {Object} props\n\t * @protected\n\t */\n\tp._appendProps = function(props, step, stepPlugins) {\n\t\tvar initProps = this._stepHead.props, target = this.target, plugins = Tween._plugins;\n\t\tvar n, i, value, initValue, inject;\n\t\tvar oldStep = step.prev, oldProps = oldStep.props;\n\t\tvar stepProps = step.props || (step.props = this._cloneProps(oldProps));\n\t\tvar cleanProps = {}; // TODO: is there some way to avoid this additional object?\n\n\t\tfor (n in props) {\n\t\t\tif (!props.hasOwnProperty(n)) { continue; }\n\t\t\tcleanProps[n] = stepProps[n] = props[n];\n\n\t\t\tif (initProps[n] !== undefined) { continue; }\n\n\t\t\tinitValue = undefined; // accessing missing properties on DOMElements when using CSSPlugin is INSANELY expensive, so we let the plugin take a first swing at it.\n\t\t\tif (plugins) {\n\t\t\t\tfor (i = plugins.length-1; i >= 0; i--) {\n\t\t\t\t\tvalue = plugins[i].init(this, n, initValue);\n\t\t\t\t\tif (value !== undefined) { initValue = value; }\n\t\t\t\t\tif (initValue === Tween.IGNORE) {\n\t\t\t\t\t\tdelete(stepProps[n]);\n\t\t\t\t\t\tdelete(cleanProps[n]);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (initValue !== Tween.IGNORE) {\n\t\t\t\tif (initValue === undefined) { initValue = target[n]; }\n\t\t\t\toldProps[n] = (initValue === undefined) ? null : initValue;\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (n in cleanProps) {\n\t\t\tvalue = props[n];\n\n\t\t\t// propagate old value to previous steps:\n\t\t\tvar o, prev=oldStep;\n\t\t\twhile ((o = prev) && (prev = o.prev)) {\n\t\t\t\tif (prev.props === o.props) { continue; } // wait step\n\t\t\t\tif (prev.props[n] !== undefined) { break; } // already has a value, we're done.\n\t\t\t\tprev.props[n] = oldProps[n];\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (stepPlugins !== false && (plugins = this._plugins)) {\n\t\t\tfor (i = plugins.length-1; i >= 0; i--) {\n\t\t\t\tplugins[i].step(this, step, cleanProps);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (inject = this._injected) {\n\t\t\tthis._injected = null;\n\t\t\tthis._appendProps(inject, step, false);\n\t\t}\n\t};\n\t\n\t/**\n\t * Used by plugins to inject properties onto the current step. Called from within `Plugin.step` calls.\n\t * For example, a plugin dealing with color, could read a hex color, and inject red, green, and blue props into the tween.\n\t * See the SamplePlugin for more info.\n\t * @method _injectProp\n\t * @param {String} name\n\t * @param {Object} value\n\t * @protected\n\t */\n\tp._injectProp = function(name, value) {\n\t\tvar o = this._injected || (this._injected = {});\n\t\to[name] = value;\n\t};\n\n\t/**\n\t * @method _addStep\n\t * @param {Number} duration\n\t * @param {Object} props\n\t * @param {Function} ease\n\t * @param {Boolean} passive\n\t * @protected\n\t */\n\tp._addStep = function(duration, props, ease, passive) {\n\t\tvar step = new TweenStep(this._stepTail, this.duration, duration, props, ease, passive||false);\n\t\tthis.duration += duration;\n\t\treturn this._stepTail = (this._stepTail.next = step);\n\t};\n\n\t/**\n\t * @method _addAction\n\t * @param {Object} scope\n\t * @param {Function} funct\n\t * @param {Array} params\n\t * @protected\n\t */\n\tp._addAction = function(scope, funct, params) {\n\t\tvar action = new TweenAction(this._actionTail, this.duration, scope, funct, params);\n\t\tif (this._actionTail) { this._actionTail.next = action; }\n\t\telse { this._actionHead = action; }\n\t\tthis._actionTail = action;\n\t\treturn this;\n\t};\n\n\t/**\n\t * @method _set\n\t * @param {Object} props\n\t * @protected\n\t */\n\tp._set = function(props) {\n\t\tfor (var n in props) {\n\t\t\tthis[n] = props[n];\n\t\t}\n\t};\n\n\t/**\n\t * @method _cloneProps\n\t * @param {Object} props\n\t * @protected\n\t */\n\tp._cloneProps = function(props) {\n\t\tvar o = {};\n\t\tfor (var n in props) { o[n] = props[n]; }\n\t\treturn o;\n\t};\n\n\tcreatejs.Tween = createjs.promote(Tween, \"AbstractTween\");\n\t\n\tfunction TweenStep(prev, t, d, props, ease, passive) {\n\t\tthis.next = null;\n\t\tthis.prev = prev;\n\t\tthis.t = t;\n\t\tthis.d = d;\n\t\tthis.props = props;\n\t\tthis.ease = ease;\n\t\tthis.passive = passive;\n\t\tthis.index = prev ? prev.index+1 : 0;\n\t};\n\t\n\tfunction TweenAction(prev, t, scope, funct, params) {\n\t\tthis.next = null;\n\t\tthis.prev = prev;\n\t\tthis.t = t;\n\t\tthis.d = 0;\n\t\tthis.scope = scope;\n\t\tthis.funct = funct;\n\t\tthis.params = params;\n\t};\n}());\n\n//##############################################################################\n// Timeline.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\t\n\n// constructor\t\n\t/**\n\t * The Timeline class synchronizes multiple tweens and allows them to be controlled as a group. Please note that if a\n\t * timeline is looping, the tweens on it may appear to loop even if the \"loop\" property of the tween is false.\n\t * \n\t * NOTE: Timeline currently also accepts a param list in the form: `tweens, labels, props`. This is for backwards\n\t * compatibility only and will be removed in the future. Include tweens and labels as properties on the props object.\n\t * @class Timeline\n\t * @param {Object} [props] The configuration properties to apply to this instance (ex. `{loop:-1, paused:true}`).\n\t * Supported props are listed below. These props are set on the corresponding instance properties except where\n\t * specified.<UL>\n\t *    <LI> `useTicks`</LI>\n\t *    <LI> `ignoreGlobalPause`</LI>\n\t *    <LI> `loop`</LI>\n\t *    <LI> `reversed`</LI>\n\t *    <LI> `bounce`</LI>\n\t *    <LI> `timeScale`</LI>\n\t *    <LI> `paused`</LI>\n\t *    <LI> `position`: indicates the initial position for this tween.</LI>\n\t *    <LI> `onChange`: adds the specified function as a listener to the `change` event</LI>\n\t *    <LI> `onComplete`: adds the specified function as a listener to the `complete` event</LI>\n\t * </UL>\n\t * @extends AbstractTween\n\t * @constructor\n\t **/\n\tfunction Timeline(props) {\n\t\tvar tweens, labels;\n\t\t// handle old params (tweens, labels, props):\n\t\t// TODO: deprecated.\n\t\tif (props instanceof Array || (props == null && arguments.length > 1)) {\n\t\t\ttweens = props;\n\t\t\tlabels = arguments[1];\n\t\t\tprops = arguments[2];\n\t\t} else if (props) {\n\t\t\ttweens = props.tweens;\n\t\t\tlabels = props.labels;\n\t\t}\n\t\t\n\t\tthis.AbstractTween_constructor(props);\n\n\t// private properties:\n\t\t/**\n\t\t * The array of tweens in the timeline. It is *strongly* recommended that you use\n\t\t * {{#crossLink \"Tween/addTween\"}}{{/crossLink}} and {{#crossLink \"Tween/removeTween\"}}{{/crossLink}},\n\t\t * rather than accessing this directly, but it is included for advanced uses.\n\t\t * @property tweens\n\t\t * @type Array\n\t\t **/\n\t\tthis.tweens = [];\n\t\t\n\t\tif (tweens) { this.addTween.apply(this, tweens); }\n\t\tthis.setLabels(labels);\n\t\t\n\t\tthis._init(props);\n\t};\n\t\n\tvar p = createjs.extend(Timeline, createjs.AbstractTween);\n\n\t\n// events:\n\t// docced in AbstractTween.\n\n\n// public methods:\n\t/**\n\t * Adds one or more tweens (or timelines) to this timeline. The tweens will be paused (to remove them from the\n\t * normal ticking system) and managed by this timeline. Adding a tween to multiple timelines will result in\n\t * unexpected behaviour.\n\t * @method addTween\n\t * @param {Tween} ...tween The tween(s) to add. Accepts multiple arguments.\n\t * @return {Tween} The first tween that was passed in.\n\t **/\n\tp.addTween = function(tween) {\n\t\tif (tween._parent) { tween._parent.removeTween(tween); }\n\t\t\n\t\tvar l = arguments.length;\n\t\tif (l > 1) {\n\t\t\tfor (var i=0; i<l; i++) { this.addTween(arguments[i]); }\n\t\t\treturn arguments[l-1];\n\t\t} else if (l === 0) { return null; }\n\t\t\n\t\tthis.tweens.push(tween);\n\t\ttween._parent = this;\n\t\ttween.paused = true;\n\t\tvar d = tween.duration;\n\t\tif (tween.loop > 0) { d *= tween.loop+1; }\n\t\tif (d > this.duration) { this.duration = d; }\n\t\t\n\t\tif (this.rawPosition >= 0) { tween.setPosition(this.rawPosition); }\n\t\treturn tween;\n\t};\n\n\t/**\n\t * Removes one or more tweens from this timeline.\n\t * @method removeTween\n\t * @param {Tween} ...tween The tween(s) to remove. Accepts multiple arguments.\n\t * @return Boolean Returns `true` if all of the tweens were successfully removed.\n\t **/\n\tp.removeTween = function(tween) {\n\t\tvar l = arguments.length;\n\t\tif (l > 1) {\n\t\t\tvar good = true;\n\t\t\tfor (var i=0; i<l; i++) { good = good && this.removeTween(arguments[i]); }\n\t\t\treturn good;\n\t\t} else if (l === 0) { return true; }\n\n\t\tvar tweens = this.tweens;\n\t\tvar i = tweens.length;\n\t\twhile (i--) {\n\t\t\tif (tweens[i] === tween) {\n\t\t\t\ttweens.splice(i, 1);\n\t\t\t\ttween._parent = null;\n\t\t\t\tif (tween.duration >= this.duration) { this.updateDuration(); }\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n\n\t/**\n\t * Recalculates the duration of the timeline. The duration is automatically updated when tweens are added or removed,\n\t * but this method is useful if you modify a tween after it was added to the timeline.\n\t * @method updateDuration\n\t **/\n\tp.updateDuration = function() {\n\t\tthis.duration = 0;\n\t\tfor (var i=0,l=this.tweens.length; i<l; i++) {\n\t\t\tvar tween = this.tweens[i];\n\t\t\tvar d = tween.duration;\n\t\t\tif (tween.loop > 0) { d *= tween.loop+1; }\n\t\t\tif (d > this.duration) { this.duration = d; }\n\t\t}\n\t};\n\n\t/**\n\t* Returns a string representation of this object.\n\t* @method toString\n\t* @return {String} a string representation of the instance.\n\t**/\n\tp.toString = function() {\n\t\treturn \"[Timeline]\";\n\t};\n\n\t/**\n\t * @method clone\n\t * @protected\n\t **/\n\tp.clone = function() {\n\t\tthrow(\"Timeline can not be cloned.\")\n\t};\n\n// private methods:\n\t\n\t// Docced in AbstractTween\n\tp._updatePosition = function(jump, end) {\n\t\tvar t = this.position;\n\t\tfor (var i=0, l=this.tweens.length; i<l; i++) {\n\t\t\tthis.tweens[i].setPosition(t, true, jump); // actions will run after all the tweens update.\n\t\t}\n\t};\n\t\n\t// Docced in AbstractTween\n\tp._runActionsRange = function(startPos, endPos, jump, includeStart) {\n\t\t//console.log(\"\trange\", startPos, endPos, jump, includeStart);\n\t\tvar t = this.position;\n\t\tfor (var i=0, l=this.tweens.length; i<l; i++) {\n\t\t\tthis.tweens[i]._runActions(startPos, endPos, jump, includeStart);\n\t\t\tif (t !== this.position) { return true; } // an action changed this timeline's position.\n\t\t}\n\t};\n\n\n\tcreatejs.Timeline = createjs.promote(Timeline, \"AbstractTween\");\n\n}());\n\n//##############################################################################\n// Ease.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\t/**\n\t * The Ease class provides a collection of easing functions for use with TweenJS. It does not use the standard 4 param\n\t * easing signature. Instead it uses a single param which indicates the current linear ratio (0 to 1) of the tween.\n\t *\n\t * Most methods on Ease can be passed directly as easing functions:\n\t *\n\t *      Tween.get(target).to({x:100}, 500, Ease.linear);\n\t *\n\t * However, methods beginning with \"get\" will return an easing function based on parameter values:\n\t *\n\t *      Tween.get(target).to({y:200}, 500, Ease.getPowIn(2.2));\n\t *\n\t * Please see the <a href=\"http://www.createjs.com/Demos/TweenJS/Tween_SparkTable\">spark table demo</a> for an\n\t * overview of the different ease types on <a href=\"http://tweenjs.com\">TweenJS.com</a>.\n\t *\n\t * <em>Equations derived from work by Robert Penner.</em>\n\t * @class Ease\n\t * @static\n\t **/\n\tfunction Ease() {\n\t\tthrow \"Ease cannot be instantiated.\";\n\t}\n\n\n// static methods and properties\n\t/**\n\t * @method linear\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.linear = function(t) { return t; };\n\n\t/**\n\t * Identical to linear.\n\t * @method none\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.none = Ease.linear;\n\n\t/**\n\t * Mimics the simple -100 to 100 easing in Adobe Flash/Animate.\n\t * @method get\n\t * @param {Number} amount A value from -1 (ease in) to 1 (ease out) indicating the strength and direction of the ease.\n\t * @static\n\t * @return {Function}\n\t **/\n\tEase.get = function(amount) {\n\t\tif (amount < -1) { amount = -1; }\n\t\telse if (amount > 1) { amount = 1; }\n\t\treturn function(t) {\n\t\t\tif (amount==0) { return t; }\n\t\t\tif (amount<0) { return t*(t*-amount+1+amount); }\n\t\t\treturn t*((2-t)*amount+(1-amount));\n\t\t};\n\t};\n\n\t/**\n\t * Configurable exponential ease.\n\t * @method getPowIn\n\t * @param {Number} pow The exponent to use (ex. 3 would return a cubic ease).\n\t * @static\n\t * @return {Function}\n\t **/\n\tEase.getPowIn = function(pow) {\n\t\treturn function(t) {\n\t\t\treturn Math.pow(t,pow);\n\t\t};\n\t};\n\n\t/**\n\t * Configurable exponential ease.\n\t * @method getPowOut\n\t * @param {Number} pow The exponent to use (ex. 3 would return a cubic ease).\n\t * @static\n\t * @return {Function}\n\t **/\n\tEase.getPowOut = function(pow) {\n\t\treturn function(t) {\n\t\t\treturn 1-Math.pow(1-t,pow);\n\t\t};\n\t};\n\n\t/**\n\t * Configurable exponential ease.\n\t * @method getPowInOut\n\t * @param {Number} pow The exponent to use (ex. 3 would return a cubic ease).\n\t * @static\n\t * @return {Function}\n\t **/\n\tEase.getPowInOut = function(pow) {\n\t\treturn function(t) {\n\t\t\tif ((t*=2)<1) return 0.5*Math.pow(t,pow);\n\t\t\treturn 1-0.5*Math.abs(Math.pow(2-t,pow));\n\t\t};\n\t};\n\n\t/**\n\t * @method quadIn\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.quadIn = Ease.getPowIn(2);\n\t/**\n\t * @method quadOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.quadOut = Ease.getPowOut(2);\n\t/**\n\t * @method quadInOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.quadInOut = Ease.getPowInOut(2);\n\n\t/**\n\t * @method cubicIn\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.cubicIn = Ease.getPowIn(3);\n\t/**\n\t * @method cubicOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.cubicOut = Ease.getPowOut(3);\n\t/**\n\t * @method cubicInOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.cubicInOut = Ease.getPowInOut(3);\n\n\t/**\n\t * @method quartIn\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.quartIn = Ease.getPowIn(4);\n\t/**\n\t * @method quartOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.quartOut = Ease.getPowOut(4);\n\t/**\n\t * @method quartInOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.quartInOut = Ease.getPowInOut(4);\n\n\t/**\n\t * @method quintIn\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.quintIn = Ease.getPowIn(5);\n\t/**\n\t * @method quintOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.quintOut = Ease.getPowOut(5);\n\t/**\n\t * @method quintInOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.quintInOut = Ease.getPowInOut(5);\n\n\t/**\n\t * @method sineIn\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.sineIn = function(t) {\n\t\treturn 1-Math.cos(t*Math.PI/2);\n\t};\n\n\t/**\n\t * @method sineOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.sineOut = function(t) {\n\t\treturn Math.sin(t*Math.PI/2);\n\t};\n\n\t/**\n\t * @method sineInOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.sineInOut = function(t) {\n\t\treturn -0.5*(Math.cos(Math.PI*t) - 1);\n\t};\n\n\t/**\n\t * Configurable \"back in\" ease.\n\t * @method getBackIn\n\t * @param {Number} amount The strength of the ease.\n\t * @static\n\t * @return {Function}\n\t **/\n\tEase.getBackIn = function(amount) {\n\t\treturn function(t) {\n\t\t\treturn t*t*((amount+1)*t-amount);\n\t\t};\n\t};\n\t/**\n\t * @method backIn\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.backIn = Ease.getBackIn(1.7);\n\n\t/**\n\t * Configurable \"back out\" ease.\n\t * @method getBackOut\n\t * @param {Number} amount The strength of the ease.\n\t * @static\n\t * @return {Function}\n\t **/\n\tEase.getBackOut = function(amount) {\n\t\treturn function(t) {\n\t\t\treturn (--t*t*((amount+1)*t + amount) + 1);\n\t\t};\n\t};\n\t/**\n\t * @method backOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.backOut = Ease.getBackOut(1.7);\n\n\t/**\n\t * Configurable \"back in out\" ease.\n\t * @method getBackInOut\n\t * @param {Number} amount The strength of the ease.\n\t * @static\n\t * @return {Function}\n\t **/\n\tEase.getBackInOut = function(amount) {\n\t\tamount*=1.525;\n\t\treturn function(t) {\n\t\t\tif ((t*=2)<1) return 0.5*(t*t*((amount+1)*t-amount));\n\t\t\treturn 0.5*((t-=2)*t*((amount+1)*t+amount)+2);\n\t\t};\n\t};\n\t/**\n\t * @method backInOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.backInOut = Ease.getBackInOut(1.7);\n\n\t/**\n\t * @method circIn\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.circIn = function(t) {\n\t\treturn -(Math.sqrt(1-t*t)- 1);\n\t};\n\n\t/**\n\t * @method circOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.circOut = function(t) {\n\t\treturn Math.sqrt(1-(--t)*t);\n\t};\n\n\t/**\n\t * @method circInOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.circInOut = function(t) {\n\t\tif ((t*=2) < 1) return -0.5*(Math.sqrt(1-t*t)-1);\n\t\treturn 0.5*(Math.sqrt(1-(t-=2)*t)+1);\n\t};\n\n\t/**\n\t * @method bounceIn\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.bounceIn = function(t) {\n\t\treturn 1-Ease.bounceOut(1-t);\n\t};\n\n\t/**\n\t * @method bounceOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.bounceOut = function(t) {\n\t\tif (t < 1/2.75) {\n\t\t\treturn (7.5625*t*t);\n\t\t} else if (t < 2/2.75) {\n\t\t\treturn (7.5625*(t-=1.5/2.75)*t+0.75);\n\t\t} else if (t < 2.5/2.75) {\n\t\t\treturn (7.5625*(t-=2.25/2.75)*t+0.9375);\n\t\t} else {\n\t\t\treturn (7.5625*(t-=2.625/2.75)*t +0.984375);\n\t\t}\n\t};\n\n\t/**\n\t * @method bounceInOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.bounceInOut = function(t) {\n\t\tif (t<0.5) return Ease.bounceIn (t*2) * .5;\n\t\treturn Ease.bounceOut(t*2-1)*0.5+0.5;\n\t};\n\n\t/**\n\t * Configurable elastic ease.\n\t * @method getElasticIn\n\t * @param {Number} amplitude\n\t * @param {Number} period\n\t * @static\n\t * @return {Function}\n\t **/\n\tEase.getElasticIn = function(amplitude,period) {\n\t\tvar pi2 = Math.PI*2;\n\t\treturn function(t) {\n\t\t\tif (t==0 || t==1) return t;\n\t\t\tvar s = period/pi2*Math.asin(1/amplitude);\n\t\t\treturn -(amplitude*Math.pow(2,10*(t-=1))*Math.sin((t-s)*pi2/period));\n\t\t};\n\t};\n\t/**\n\t * @method elasticIn\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.elasticIn = Ease.getElasticIn(1,0.3);\n\n\t/**\n\t * Configurable elastic ease.\n\t * @method getElasticOut\n\t * @param {Number} amplitude\n\t * @param {Number} period\n\t * @static\n\t * @return {Function}\n\t **/\n\tEase.getElasticOut = function(amplitude,period) {\n\t\tvar pi2 = Math.PI*2;\n\t\treturn function(t) {\n\t\t\tif (t==0 || t==1) return t;\n\t\t\tvar s = period/pi2 * Math.asin(1/amplitude);\n\t\t\treturn (amplitude*Math.pow(2,-10*t)*Math.sin((t-s)*pi2/period )+1);\n\t\t};\n\t};\n\t/**\n\t * @method elasticOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.elasticOut = Ease.getElasticOut(1,0.3);\n\n\t/**\n\t * Configurable elastic ease.\n\t * @method getElasticInOut\n\t * @param {Number} amplitude\n\t * @param {Number} period\n\t * @static\n\t * @return {Function}\n\t **/\n\tEase.getElasticInOut = function(amplitude,period) {\n\t\tvar pi2 = Math.PI*2;\n\t\treturn function(t) {\n\t\t\tvar s = period/pi2 * Math.asin(1/amplitude);\n\t\t\tif ((t*=2)<1) return -0.5*(amplitude*Math.pow(2,10*(t-=1))*Math.sin( (t-s)*pi2/period ));\n\t\t\treturn amplitude*Math.pow(2,-10*(t-=1))*Math.sin((t-s)*pi2/period)*0.5+1;\n\t\t};\n\t};\n\t/**\n\t * @method elasticInOut\n\t * @param {Number} t\n\t * @static\n\t * @return {Number}\n\t **/\n\tEase.elasticInOut = Ease.getElasticInOut(1,0.3*1.5);\n\n\tcreatejs.Ease = Ease;\n\n}());\n\n//##############################################################################\n// MotionGuidePlugin.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\t/**\n\t * A TweenJS plugin for working with motion guides. Defined paths which objects can follow or orient along.\n\t *\n\t * To use the plugin, install the plugin after TweenJS has loaded. To define a path, add\n\t *\n\t * \t\tcreatejs.MotionGuidePlugin.install();\n\t *\n\t * <h4>Example</h4>\n\t *\n\t * \t\t// Using a Motion Guide\n\t * \t\tcreatejs.Tween.get(target).to({guide:{ path:[0,0, 0,200,200,200, 200,0,0,0] }},7000);\n\t * \t\t// Visualizing the line\n\t * \t\tgraphics.moveTo(0,0).curveTo(0,200,200,200).curveTo(200,0,0,0);\n\t *\n\t * Each path needs pre-computation to ensure there's fast performance. Because of the pre-computation there's no\n\t * built in support for path changes mid tween. These are the Guide Object's properties:<UL>\n\t * \t\t<LI> path: Required, Array : The x/y points used to draw the path with a moveTo and 1 to n curveTo calls.</LI>\n\t * \t\t<LI> start: Optional, 0-1 : Initial position, default 0 except for when continuing along the same path.</LI>\n\t * \t\t<LI> end: Optional, 0-1 : Final position, default 1 if not specified.</LI>\n\t * \t\t<LI> orient: Optional, string : \"fixed\"/\"auto\"/\"cw\"/\"ccw\"<UL>\n\t *\t\t\t\t<LI>\"fixed\" forces the object to face down the path all movement (relative to start rotation),</LI>\n\t * \t\t\t\t<LI>\"auto\" rotates the object along the path relative to the line.</LI>\n\t * \t\t\t\t<LI>\"cw\"/\"ccw\" force clockwise or counter clockwise rotations including Adobe Flash/Animate-like\n\t * \t\t\t\tbehaviour. This may override your end rotation value.</LI>\n\t * \t\t</UL></LI>\n\t * </UL>\n\t * Guide objects should not be shared between tweens even if all properties are identical, the library stores\n\t * information on these objects in the background and sharing them can cause unexpected behaviour. Values\n\t * outside 0-1 range of tweens will be a \"best guess\" from the appropriate part of the defined curve.\n\t *\n\t * @class MotionGuidePlugin\n\t * @constructor\n\t */\n\tfunction MotionGuidePlugin() {\n\t\tthrow(\"MotionGuidePlugin cannot be instantiated.\")\n\t}\n\tvar s = MotionGuidePlugin;\n\n\n// static properties:\n\t/**\n\t * @property priority\n\t * @protected\n\t * @static\n\t */\n\ts.priority = 0; // high priority, should run sooner\n\n\t/**\n\t * READ-ONLY. A unique identifying string for this plugin. Used by TweenJS to ensure duplicate plugins are not installed on a tween.\n\t * @property ID\n\t * @type {String}\n\t * @static\n\t * @readonly\n\t */\n\ts.ID = \"MotionGuide\";\n\n// static methods\n\t/**\n\t * Installs this plugin for use with TweenJS. Call this once after TweenJS is loaded to enable this plugin.\n\t * @method install\n\t * @static\n\t */\n\ts.install = function() {\n\t\tcreatejs.Tween._installPlugin(MotionGuidePlugin);\n\t\treturn createjs.Tween.IGNORE;\n\t};\n\n\t/**\n\t * Called by TweenJS when a new property initializes on a tween.\n\t * See {{#crossLink \"SamplePlugin/init\"}}{{/crossLink}} for more info.\n\t * @method init\n\t * @param {Tween} tween\n\t * @param {String} prop\n\t * @param {any} value\n\t * @return {any}\n\t * @static\n\t */\n\ts.init = function(tween, prop, value) {\n\t\tif(prop == \"guide\") {\n\t\t\ttween._addPlugin(s);\n\t\t}\n\t};\n\n\t/**\n\t * Called when a new step is added to a tween (ie. a new \"to\" action is added to a tween).\n\t * See {{#crossLink \"SamplePlugin/step\"}}{{/crossLink}} for more info.\n\t * @method step\n\t * @param {Tween} tween\n\t * @param {TweenStep} step\n\t * @param {Object} props\n\t * @static\n\t */\n\ts.step = function(tween, step, props) {\n\t\tfor (var n in props) {\n\t\t\tif(n !== \"guide\") { continue; }\n\n\t\t\tvar guideData = step.props.guide;\n\t\t\tvar error = s._solveGuideData(props.guide, guideData);\n\t\t\tguideData.valid = !error;\n\n\t\t\tvar end = guideData.endData;\n\t\t\ttween._injectProp(\"x\", end.x);\n\t\t\ttween._injectProp(\"y\", end.y);\n\n\t\t\tif(error || !guideData.orient) { break; }\n\n\t\t\tvar initRot = step.prev.props.rotation === undefined ? (tween.target.rotation || 0) : step.prev.props.rotation;\n\n\t\t\tguideData.startOffsetRot = initRot - guideData.startData.rotation;\n\n\t\t\tif(guideData.orient == \"fixed\") {\n\t\t\t\t// controlled rotation\n\t\t\t\tguideData.endAbsRot = end.rotation + guideData.startOffsetRot;\n\t\t\t\tguideData.deltaRotation = 0;\n\t\t\t} else {\n\t\t\t\t// interpreted rotation\n\n\t\t\t\tvar finalRot = props.rotation === undefined ? (tween.target.rotation || 0) : props.rotation;\n\t\t\t\tvar deltaRot = (finalRot - guideData.endData.rotation) - guideData.startOffsetRot;\n\t\t\t\tvar modRot = deltaRot % 360;\n\n\t\t\t\tguideData.endAbsRot = finalRot;\n\n\t\t\t\tswitch(guideData.orient) {\n\t\t\t\t\tcase \"auto\":\n\t\t\t\t\t\tguideData.deltaRotation = deltaRot;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"cw\":\n\t\t\t\t\t\tguideData.deltaRotation = ((modRot + 360) % 360) + (360 * Math.abs((deltaRot/360) |0));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"ccw\":\n\t\t\t\t\t\tguideData.deltaRotation = ((modRot - 360) % 360) + (-360 * Math.abs((deltaRot/360) |0));\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttween._injectProp(\"rotation\", guideData.endAbsRot);\n\t\t}\n\t};\n\n\t/**\n\t * Called before a property is updated by the tween.\n\t * See {{#crossLink \"SamplePlugin/change\"}}{{/crossLink}} for more info.\n\t * @method change\n\t * @param {Tween} tween\n\t * @param {TweenStep} step\n\t * @param {String} prop\n\t * @param {any} value\n\t * @param {Number} ratio\n\t * @param {Boolean} end\n\t * @return {any}\n\t * @static\n\t */\n\ts.change = function(tween, step, prop, value, ratio, end) {\n\t\tvar guideData = step.props.guide;\n\n\t\tif(\n\t\t\t\t!guideData ||\t\t\t\t\t\t\t// Missing data\n\t\t\t\t(step.props === step.prev.props) || \t// In a wait()\n\t\t\t\t(guideData === step.prev.props.guide) \t// Guide hasn't changed\n\t\t) {\n\t\t\treturn; // have no business making decisions\n\t\t}\n\t\tif(\n\t\t\t\t(prop === \"guide\" && !guideData.valid) ||\t\t// this data is broken\n\t\t\t\t(prop == \"x\" || prop == \"y\") ||\t\t\t\t\t// these always get over-written\n\t\t\t\t(prop === \"rotation\" && guideData.orient)\t\t// currently over-written\n\t\t){\n\t\t\treturn createjs.Tween.IGNORE;\n\t\t}\n\n\t\ts._ratioToPositionData(ratio, guideData, tween.target);\n\t};\n\n// public methods\n\t/**\n\t * Provide potentially useful debugging information, like running the error detection system, and rendering the path\n\t * defined in the guide data.\n\t *\n\t * NOTE: you will need to transform your context 2D to the local space of the guide if you wish to line it up.\n\t * @param {Object} guideData All the information describing the guide to be followed.\n\t * @param {DrawingContext2D} [ctx=undefined] The context to draw the object into.\n\t * @param {Array} [higlight=undefined] Array of ratio positions to highlight\n\t * @returns {undefined|String}\n\t */\n\ts.debug = function(guideData, ctx, higlight) {\n\t\tguideData = guideData.guide || guideData;\n\n\t\t// errors\n\t\tvar err = s._findPathProblems(guideData);\n\t\tif(err) {\n\t\t\tconsole.error(\"MotionGuidePlugin Error found: \\n\" + err);\n\t\t}\n\n\t\t// drawing\n\t\tif(!ctx){ return err; }\n\n\t\tvar i;\n\t\tvar path = guideData.path;\n\t\tvar pathLength = path.length;\n\t\tvar width = 3;\n\t\tvar length = 9;\n\n\t\tctx.save();\n\t\t//ctx.resetTransform();\n\n\t\tctx.lineCap = \"round\";\n\t\tctx.lineJoin = \"miter\";\n\t\tctx.beginPath();\n\n\t\t// curve\n\t\tctx.moveTo(path[0], path[1]);\n\t\tfor(i=2; i < pathLength; i+=4) {\n\t\t\tctx.quadraticCurveTo(\n\t\t\t\tpath[i], path[i+1],\n\t\t\t\tpath[i+2], path[i+3]\n\t\t\t);\n\t\t}\n\n\t\tctx.strokeStyle = \"black\";\n\t\tctx.lineWidth = width*1.5;\n\t\tctx.stroke();\n\t\tctx.strokeStyle = \"white\";\n\t\tctx.lineWidth = width;\n\t\tctx.stroke();\n\t\tctx.closePath();\n\n\t\t// highlights\n\t\tvar hiCount = higlight.length;\n\t\tif(higlight && hiCount) {\n\t\t\tvar tempStore = {};\n\t\t\tvar tempLook = {};\n\t\t\ts._solveGuideData(guideData, tempStore);\n\n\t\t\tfor(var i=0; i<hiCount; i++){\n\t\t\t\ttempStore.orient = \"fixed\";\n\t\t\t\ts._ratioToPositionData(higlight[i], tempStore, tempLook);\n\n\t\t\t\tctx.beginPath();\n\n\t\t\t\tctx.moveTo(tempLook.x, tempLook.y);\n\t\t\t\tctx.lineTo(\n\t\t\t\t\ttempLook.x + Math.cos(tempLook.rotation * 0.0174533) * length,\n\t\t\t\t\ttempLook.y + Math.sin(tempLook.rotation * 0.0174533) * length\n\t\t\t\t);\n\n\t\t\t\tctx.strokeStyle = \"black\";\n\t\t\t\tctx.lineWidth = width*1.5;\n\t\t\t\tctx.stroke();\n\t\t\t\tctx.strokeStyle = \"red\";\n\t\t\t\tctx.lineWidth = width;\n\t\t\t\tctx.stroke();\n\t\t\t\tctx.closePath();\n\t\t\t}\n\t\t}\n\n\t\t// end draw\n\t\tctx.restore();\n\n\t\treturn err;\n\t};\n\n// private methods\n\t/**\n\t * Calculate and store optimization data about the desired path to improve performance and accuracy of positions.\n\t * @param {Object} source The guide data provided to the tween call\n\t * @param {Object} storage the guide data used by the step calls and plugin to do the job, will be overwritten\n\t * @returns {undefined|String} Can return an error if unable to generate the data.\n\t * @private\n\t */\n\ts._solveGuideData = function(source, storage) {\n\t\tvar err = undefined;\n\t\tif(err = s.debug(source)) { return err; }\n\n\t\tvar path = storage.path = source.path;\n\t\tvar orient = storage.orient = source.orient;\n\t\tstorage.subLines = [];\n\t\tstorage.totalLength = 0;\n\t\tstorage.startOffsetRot = 0;\n\t\tstorage.deltaRotation = 0;\n\t\tstorage.startData = {ratio: 0};\n\t\tstorage.endData = {ratio: 1};\n\t\tstorage.animSpan = 1;\n\n\t\tvar pathLength = path.length;\n\n\t\tvar precision = 10;\n\t\tvar sx,sy, cx,cy, ex,ey, i,j, len, temp = {};\n\n\t\tsx = path[0];\t\tsy = path[1];\n\n\t\t// get the data for each curve\n\t\tfor(i=2; i < pathLength; i+=4) {\n\t\t\tcx = path[i];\t\t\tcy = path[i+1];\n\t\t\tex = path[i+2];\t\t\tey = path[i+3];\n\n\t\t\tvar subLine = {\n\t\t\t\tweightings: [],\n\t\t\t\testLength: 0,\n\t\t\t\tportion: 0\n\t\t\t};\n\n\t\t\tvar subX = sx, subY = sy;\n\t\t\t// get the distance data for each point\n\t\t\tfor(j=1; j <= precision;j++) {\t// we need to evaluate t = 1 not t = 0\n\t\t\t\ts._getParamsForCurve(sx,sy, cx,cy, ex,ey, j/precision, false, temp);\n\n\t\t\t\tvar dx = temp.x - subX, dy = temp.y - subY;\n\t\t\t\tlen = Math.sqrt(dx*dx + dy*dy);\n\t\t\t\tsubLine.weightings.push(len);\n\t\t\t\tsubLine.estLength += len;\n\n\t\t\t\tsubX = temp.x;\n\t\t\t\tsubY = temp.y;\n\t\t\t}\n\n\t\t\t// figure out full lengths\n\t\t\tstorage.totalLength += subLine.estLength;\n\n\t\t\t// use length to figure out proportional weightings\n\t\t\tfor(j=0; j < precision; j++) {\n\t\t\t\tlen = subLine.estLength;\n\t\t\t\tsubLine.weightings[j] = subLine.weightings[j] / len;\n\t\t\t}\n\n\t\t\tstorage.subLines.push(subLine);\n\t\t\tsx = ex;\n\t\t\tsy = ey;\n\t\t}\n\n\t\t// use length to figure out proportional weightings\n\t\tlen = storage.totalLength;\n\t\tvar l = storage.subLines.length;\n\t\tfor(i=0; i<l; i++) {\n\t\t\tstorage.subLines[i].portion = storage.subLines[i].estLength / len;\n\t\t}\n\n\t\t// determine start and end data\n\t\tvar startRatio = isNaN(source.start) ? 0 : source.start;\n\t\tvar endRatio = isNaN(source.end) ? 1 : source.end;\n\t\ts._ratioToPositionData(startRatio, storage, storage.startData);\n\t\ts._ratioToPositionData(endRatio, storage, storage.endData);\n\n\t\t// this has to be done last else the prev ratios will be out of place\n\t\tstorage.startData.ratio = startRatio;\n\t\tstorage.endData.ratio = endRatio;\n\t\tstorage.animSpan = storage.endData.ratio - storage.startData.ratio;\n\t};\n\n\t/**\n\t * Convert a percentage along the line into, a local line (start, control, end) t-value for calculation.\n\t * @param {Number} ratio The (euclidean distance) percentage into the whole curve.\n\t * @param {Object} guideData All the information describing the guide to be followed.\n\t * @param {Object} output Object to save output properties of x,y, and rotation onto.\n\t * @returns {Object} The output object, useful for isolated calls.\n\t * @private\n\t */\n\ts._ratioToPositionData = function(ratio, guideData, output) {\n\t\tvar lineSegments = guideData.subLines;\n\n\t\tvar i,l, t, test, target;\n\n\t\tvar look = 0;\n\t\tvar precision = 10;\n\t\tvar effRatio = (ratio * guideData.animSpan) + guideData.startData.ratio;\n\n\t\t// find subline\n\t\tl = lineSegments.length;\n\t\tfor(i=0; i<l; i++) {\n\t\t\ttest = lineSegments[i].portion;\n\t\t\tif(look + test >= effRatio){ target = i; break; }\n\t\t\tlook += test;\n\t\t}\n\t\tif(target === undefined) { target = l-1;  look -= test; }\n\n\t\t// find midline weighting\n\t\tvar subLines = lineSegments[target].weightings;\n\t\tvar portion = test;\n\t\tl = subLines.length;\n\t\tfor(i=0; i<l; i++) {\n\t\t\ttest = subLines[i] * portion;\n\t\t\tif(look + test >= effRatio){ break; }\n\t\t\tlook += test;\n\t\t}\n\n\t\t// translate the subline index into a position in the path data\n\t\ttarget = (target*4) + 2;\n\t\t// take the distance we've covered in our ratio, and scale it to distance into the weightings\n\t\tt = (i/precision) + (((effRatio-look) / test) * (1/precision));\n\n\t\t// position\n\t\tvar pathData = guideData.path;\n\t\ts._getParamsForCurve(\n\t\t\tpathData[target-2],\t\t\tpathData[target-1],\n\t\t\tpathData[target],\t\t\tpathData[target+1],\n\t\t\tpathData[target+2],\t\t\tpathData[target+3],\n\t\t\tt,\n\t\t\tguideData.orient,\n\t\t\toutput\n\t\t);\n\n\t\tif(guideData.orient) {\n\t\t\tif(ratio >= 0.99999 && ratio <= 1.00001 && guideData.endAbsRot !== undefined) {\n\t\t\t\toutput.rotation = guideData.endAbsRot;\n\t\t\t} else {\n\t\t\t\toutput.rotation += guideData.startOffsetRot + (ratio * guideData.deltaRotation);\n\t\t\t}\n\t\t}\n\n\t\treturn output;\n\t};\n\n\t/**\n\t * For a given quadratic bezier t-value, what is the position and rotation. Save it onto the output object.\n\t * @param {Number} sx Start x.\n\t * @param {Number} sy Start y.\n\t * @param {Number} cx Control x.\n\t * @param {Number} cy Control y.\n\t * @param {Number} ex End x.\n\t * @param {Number} ey End y.\n\t * @param {Number} t T value (parametric distance into curve).\n\t * @param {Boolean} orient Save rotation data.\n\t * @param {Object} output Object to save output properties of x,y, and rotation onto.\n\t * @private\n\t */\n\ts._getParamsForCurve = function(sx,sy, cx,cy, ex,ey, t, orient, output) {\n\t\tvar inv = 1 - t;\n\n\t\t// finding a point on a bezier curve\n\t\toutput.x =\tinv*inv * sx + 2 * inv * t * cx + t*t * ex;\n\t\toutput.y =\tinv*inv * sy + 2 * inv * t * cy + t*t * ey;\n\n\t\t// finding an angle on a bezier curve\n\t\tif(orient) {\n\t\t\t// convert from radians back to degrees\n\t\t\toutput.rotation = 57.2957795 * Math.atan2(\n\t\t\t\t(cy - sy)*inv + (ey - cy)*t,\n\t\t\t\t(cx - sx)*inv + (ex - cx)*t\n\t\t\t);\n\t\t}\n\t};\n\n\t/**\n\t * Perform a check to validate path information so plugin can avoid later error checking.\n\t * @param {Object} guideData All the information describing the guide to be followed.\n\t * @returns {undefined|String} The problem found, or undefined if no problems.\n\t * @private\n\t */\n\ts._findPathProblems = function(guideData) {\n\t\tvar path = guideData.path;\n\t\tvar valueCount = (path && path.length) || 0;\t// ensure this is a number to simplify later logic\n\t\tif(valueCount < 6 || (valueCount-2) % 4) {\n\t\t\tvar message =\t\"\\tCannot parse 'path' array due to invalid number of entries in path. \";\n\t\t\tmessage +=\t\t\"There should be an odd number of points, at least 3 points, and 2 entries per point (x & y). \";\n\t\t\tmessage +=\t\t\"See 'CanvasRenderingContext2D.quadraticCurveTo' for details as 'path' models a quadratic bezier.\\n\\n\";\n\t\t\tmessage +=\t\t\"Only [ \"+ valueCount +\" ] values found. Expected: \"+ Math.max(Math.ceil((valueCount-2)/4)*4+2, 6); //6, 10, 14,...\n\t\t\treturn message;\n\t\t}\n\n\t\tfor(var i=0; i<valueCount; i++) {\n\t\t\tif(isNaN(path[i])){\n\t\t\t\treturn \"All data in path array must be numeric\";\n\t\t\t}\n\t\t}\n\n\t\tvar start = guideData.start;\n\t\tif(isNaN(start) && !(start === undefined)/* || start < 0 || start > 1*/) {\t// outside 0-1 is unpredictable, but not breaking\n\t\t\treturn \"'start' out of bounds. Expected 0 to 1, got: \"+ start;\n\t\t}\n\t\tvar end = guideData.end;\n\t\tif(isNaN(end) && (end !== undefined)/* || end < 0 || end > 1*/) {\t// outside 0-1 is unpredictable, but not breaking\n\t\t\treturn \"'end' out of bounds. Expected 0 to 1, got: \"+ end;\n\t\t}\n\n\t\tvar orient = guideData.orient;\n\t\tif(orient) { // mirror the check used elsewhere\n\t\t\tif(orient != \"fixed\" && orient != \"auto\" && orient != \"cw\" && orient != \"ccw\") {\n\t\t\t\treturn 'Invalid orientation value. Expected [\"fixed\", \"auto\", \"cw\", \"ccw\", undefined], got: '+ orient;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t};\n\n\tcreatejs.MotionGuidePlugin = MotionGuidePlugin;\n\n}());\n\n//##############################################################################\n// version.js\n//##############################################################################\n\n(function() {\n\t\"use strict\";\n\n\t/**\n\t * Static class holding library specific information such as the version and buildDate of\n\t * the library.\n\t * @class TweenJS\n\t **/\n\tvar s = createjs.TweenJS = createjs.TweenJS || {};\n\n\t/**\n\t * The version string for this release.\n\t * @property version\n\t * @type String\n\t * @static\n\t **/\n\ts.version = /*=version*/\"NEXT\"; // injected by build process\n\n\t/**\n\t * The build date for this release in UTC format.\n\t * @property buildDate\n\t * @type String\n\t * @static\n\t **/\n\ts.buildDate = /*=date*/\"Thu, 14 Sep 2017 22:19:45 GMT\"; // injected by build process\n\n})();export default createjs", "import { Controller } from \"@hotwired/stimulus\"\nimport { createjs } from 'createjs/builds/1.0.0/createjs'\n\nexport default class extends Controller {\n  connect() {\n    var AdobeAn = {};\n\n    (function (cjs, an) {\n\n      var p; // shortcut to reference prototypes\n      var lib = {}; var ss = {}; var img = {};\n      lib.ssMetadata = [];\n\n\n      (lib.AnMovieClip = function () {\n        this.actionFrames = [];\n        this.ignorePause = false;\n        this.gotoAndPlay = function (positionOrLabel) {\n          cjs.MovieClip.prototype.gotoAndPlay.call(this, positionOrLabel);\n        }\n        this.play = function () {\n          cjs.MovieClip.prototype.play.call(this);\n        }\n        this.gotoAndStop = function (positionOrLabel) {\n          cjs.MovieClip.prototype.gotoAndStop.call(this, positionOrLabel);\n        }\n        this.stop = function () {\n          cjs.MovieClip.prototype.stop.call(this);\n        }\n      }).prototype = p = new cjs.MovieClip();\n      // symbols:\n      // helper functions:\n\n      function mc_symbol_clone() {\n        var clone = this._cloneProps(new this.constructor(this.mode, this.startPosition, this.loop, this.reversed));\n        clone.gotoAndStop(this.currentFrame);\n        clone.paused = this.paused;\n        clone.framerate = this.framerate;\n        return clone;\n      }\n\n      function getMCSymbolPrototype(symbol, nominalBounds, frameBounds) {\n        var prototype = cjs.extend(symbol, cjs.MovieClip);\n        prototype.clone = mc_symbol_clone;\n        prototype.nominalBounds = nominalBounds;\n        prototype.frameBounds = frameBounds;\n        return prototype;\n      }\n\n\n      (lib.Wave_Smallai = function (mode, startPosition, loop, reversed) {\n        if (loop == null) { loop = true; }\n        if (reversed == null) { reversed = false; }\n        var props = new Object();\n        props.mode = mode;\n        props.startPosition = startPosition;\n        props.labels = {};\n        props.loop = loop;\n        props.reversed = reversed;\n        cjs.MovieClip.apply(this, [props]);\n\n        // Wave_Small_ai\n        this.shape = new cjs.Shape();\n        this.shape.graphics.f(\"#00CCFF\").s().p(\"Ekr/AL1IAA07IAFAAIAAgDQFciXHkgRQHEgRGMBmQCXApBZAqIAAADIAGAAQBWAoCUAoQGLBmHCgQQHhgSFdiUIAFAAIAAgDQFciXHkgRQHEgRGMBmQCXApBZAqIAAADIAFAAQBXAoCUAoQGLBmHCgQQHhgSFdiUIAFAAIAAgDQFciXHkgRQHEgRGMBmQCXApBZAqIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAGAAIAAgDQFciXHkgRQHEgRGLBmQCYApBZAqIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAGAAIAAgDQFciXHkgRQHEgRGLBmQCYApBZAqIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAFAAIAAgDQFciXHjgRQHFgRGMBmQCYAqBYApIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAGAAIAAgDQFciXHjgRQHFgRGMBmQCYAqBYApIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAGAAIAAgDQFciXHjgRQHFgRGMBmQCYAqBYApIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAGAAIAAgDQFciXHjgRQHFgRGMBmQCXAqBZApIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAGAAIAAgDQFciXHkgRQHEgRGMBmQCXAqBZApIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIABAAIAAU7g\");\n        this.shape.setTransform(1920.5, 76.1786);\n\n        this.timeline.addTween(cjs.Tween.get(this.shape).wait(1));\n\n        this._renderFirstFrame();\n\n      }).prototype = p = new cjs.MovieClip();\n      p.nominalBounds = new cjs.Rectangle(0.5, 0.5, 3840, 151.4);\n\n\n      (lib.Wave_Largeai = function (mode, startPosition, loop, reversed) {\n        if (loop == null) { loop = true; }\n        if (reversed == null) { reversed = false; }\n        var props = new Object();\n        props.mode = mode;\n        props.startPosition = startPosition;\n        props.labels = {};\n        props.loop = loop;\n        props.reversed = reversed;\n        cjs.MovieClip.apply(this, [props]);\n\n        // Wave_Large_ai\n        this.shape = new cjs.Shape();\n        this.shape.graphics.f(\"#00548A\").s().p(\"Ekr/ANIIAA07IAHAAQCjiRDWhWQDNhSDmgUQDigUDeArQDiArDABmQBHAmA0AjQBAArAzAxIADAAQA0AwA/ArQA1AjBHAnQDCBmDgArQDfArDigUQHlgqFHkjIADAAQFHkjHlgqQDigUDeArQDiArDABmQBHAmA0AjQA/ArA0AxIADAAQA0AwBAArQA0AjBHAnQDCBmDgArQDfArDjgUQHkgqFHkjIADAAQFHkjHlgqQDigUDeArQDhArDBBmQBHAmA0AjQA/ArA0AxIACAAQA1AwA/ArQA0AjBIAnQDBBmDhArQDeArDjgUQHlgqFHkjIADAAQFHkjHkgqQDjgUDeArQDhArDABmQBHAmA1AjQA/ArA0AxIACAAQA1AwA/ArQA0AjBIAnQDBBmDhArQDeArDjgUQHlgqFHkjIADAAQCiiRDWhWQDNhSDmgUQDigUDfArQDhArDABmQBIAmAzAjQBAArA0AxIACAAQA0AwBAArQA0AjBIAnQDBBmDhArQDfArDigUQHkgqFHkjIACAAQCkiRDWhWQDMhSDngUQDhgUDfArQDhArDABmQBIAmAzAjQBAArA0AxIACAAQA1AwA/ArQA0AjBIAnQDBBmDhArQDfArDigUQHkgqFIkjIACAAQCkiRDWhWQDMhSDngUQDigUDdArQDiArDBBmQBHAmAzAjQBAArA0AxIADAAQA0AwA/ArQA0AjBIAnQDBBmDhArQDeArDjgUQHkgqFIkjIACAAQCjiRDXhWQDMhSDngUQDigUDdArQDiArDABmQBHAmA0AjQBAArA0AxIADAAQAzAwBAArQA0AjBIAnQDBBmDhArQDeArDjgUQHlgqFHkjIACAAQCjiRDWhWQDOhSDlgUQDigUDfArQDiArDABmQBHAmA0AjQA/ArA0AxIADAAQAzAwBAArQA0AjBIAnQDBBmDhArQDeArDjgUQHlgqFHkjIADAAQCiiRDWhWQDOhSDlgUQDigUDfArQDhArDBBmQBHAmA0AjQA/ArA0AxIACAAQA1AwA/ArQA0AjBIAnQDABmDgArQDfArDhgUQHjgpFIkhIAAU4g\");\n        this.shape.setTransform(1920.5, 84.4433);\n\n        this.timeline.addTween(cjs.Tween.get(this.shape).wait(1));\n\n        this._renderFirstFrame();\n\n      }).prototype = p = new cjs.MovieClip();\n      p.nominalBounds = new cjs.Rectangle(0.5, 0.5, 3840, 167.9);\n\n\n      (lib.Path = function (mode, startPosition, loop, reversed) {\n        if (loop == null) { loop = true; }\n        if (reversed == null) { reversed = false; }\n        var props = new Object();\n        props.mode = mode;\n        props.startPosition = startPosition;\n        props.labels = {};\n        props.loop = loop;\n        props.reversed = reversed;\n        cjs.MovieClip.apply(this, [props]);\n\n        // Laag_1\n        this.shape = new cjs.Shape();\n        this.shape.graphics.f(\"#FFFFFF\").s().p(\"AAIBPQgUgDgXgZQgvgzgngiIgdgaQgJgJACgFQADgJAqAEIB4AMQAyADA5ABQAiADAHAOQAJASgVAfQgKARgPAOQgQARgUAMQgfASgdAAIgPgCg\");\n        this.shape.setTransform(15.8691, 8.1016);\n\n        this.timeline.addTween(cjs.Tween.get(this.shape).wait(1));\n\n        this._renderFirstFrame();\n\n      }).prototype = getMCSymbolPrototype(lib.Path, new cjs.Rectangle(0, 0.1, 31.7, 16.099999999999998), null);\n\n\n      (lib.LogoRGBai = function (mode, startPosition, loop, reversed) {\n        if (loop == null) { loop = true; }\n        if (reversed == null) { reversed = false; }\n        var props = new Object();\n        props.mode = mode;\n        props.startPosition = startPosition;\n        props.labels = {};\n        props.loop = loop;\n        props.reversed = reversed;\n        cjs.MovieClip.apply(this, [props]);\n\n        // LogoRGB_ai\n        this.instance = new lib.Path();\n        this.instance.setTransform(263, 37.8, 1, 1, 0, 0, 0, 15.8, 8.1);\n        this.instance.alpha = 0.6484;\n\n        this.shape = new cjs.Shape();\n        this.shape.graphics.f(\"#CD7D00\").s().p(\"ADSEEIg3gKIndjBIiuhfIgcgUIg1guIgrgzIgihCIAAgtQCsCEEEBLQEMBNEyAAQAbACAkAAQBoAABLgSIAvBHIAOAjIgEAkIgKATIgTAXIgkAbIgqAUIggAKIg9AOIg2AHIhjADg\");\n        this.shape.setTransform(89.025, 242.05);\n\n        this.shape_1 = new cjs.Shape();\n        this.shape_1.graphics.f(\"#F39200\").s().p(\"AFIJBIg3gKInejAIithhIgdgTIg1guIgrg0IgihBIAAgtQhxhWg8hlQg+hoAAhvIACgoIAKgwIAQgsIAdgvIARgSIAmgbIAVgHIAagCIAjAJICWBAIBlAeIBdAPICIAJICcgGICjgUIARAAIAVAFIAeAKIATAKIAYATIATAYIApBCIBmDTIBLDCIAmBWIArBRIBsCoIAPAjIgFAjIgKAUIgSAWIglAbIgqAUIgfAKIg9AOIg3AIIhjACg\");\n        this.shape_1.setTransform(77.275, 210.3);\n\n        this.shape_2 = new cjs.Shape();\n        this.shape_2.graphics.f(\"#FFFFFF\").s().p(\"Ag3A4QgYgXAAghQAAggAYgXQAWgYAhAAQAhAAAXAYQAYAXAAAgQAAAhgYAXQgXAYghAAQghAAgWgYg\");\n        this.shape_2.setTransform(186.35, 151.5);\n\n        this.shape_3 = new cjs.Shape();\n        this.shape_3.graphics.f(\"#005578\").s().p(\"AknEoQh6h7AAitQAAisB6h7QB7h6CsAAQCtAAB7B6QB6B7AACsQAACth6B7Qh7B6itAAQisAAh7h6g\");\n        this.shape_3.setTransform(194.325, 166.675);\n\n        this.shape_4 = new cjs.Shape();\n        this.shape_4.graphics.f(\"#FFFFFF\").s().p(\"Al1F2QibibAAjbQAAjaCbibQCbibDaAAQDbAACbCbQCbCbAADaQAADbibCbQibCbjbAAQjaAAibibg\");\n        this.shape_4.setTransform(205.375, 168.675);\n\n        this.shape_5 = new cjs.Shape();\n        this.shape_5.graphics.f(\"#009EE2\").s().p(\"Aj6YBIhZgRIikgvIjdhdIiqhkIh2heIiZidIiMi6IhPiGIhJiiIgWg7Igih5IgjjMIADjIIAKhWIAaiJIA6izIAzhzIA9htIBciJICEibICSiIICbh0ICXhaIBngyICTg5IC0gvIC5gYIBcAAIC7AOIClAjIAbgTIA8ghIA0gXIBWgcICCgaIBhAAIBFAMIAxAQIAiAQIAjAXIAaAXIAUAXIAXAkIAVAtIAXBZIAGAsIgDBQIgSBUIgOAhIgKASIAAAUIAkAmICQC0IAbAoIBpC+IA3CGIAqCUIAVB1IALBqIgGDrIgTCCIgkCQIg5CfIhNCaIhvCnIiNChIhbBSIiiB4IgxAeIiLBIIg1AYIihA5IiAAgIi4AaIjeADg\");\n        this.shape_5.setTransform(236, 155.625);\n\n        this.shape_6 = new cjs.Shape();\n        this.shape_6.graphics.f().s(\"#009FE3\").ss(18, 1).p(\"Ap/CuQCsA6DMgKQC8gJC8hBQC0g+CMhhQCNhkBChw\");\n        this.shape_6.setTransform(422.45, 504.2735);\n\n        this.shape_7 = new cjs.Shape();\n        this.shape_7.graphics.f().s(\"#009FE3\").ss(18, 1).p(\"AK9llQgeCpiPCXQiHCNjSBkQjMBijnAlQjuAmjSgl\");\n        this.shape_7.setTransform(441.775, 424.5377);\n\n        this.shape_8 = new cjs.Shape();\n        this.shape_8.graphics.f(\"#0087C1\").s().p(\"Ar2VAIiSgdIhPgYIhbgiIhxg3IgvgbIiAhXIh6hsIAAgCQjCi6hrj3QhvkAAAkaQAAjpBNjaQBKjTCLivIgBgIIBXhoICFh9ICXhqIBqg5ICDg2IB4gkIDJgjICqADIBlALIA/ALICUAlICIA3IBnA1ICEBZIDjDEIAxAhIBiA3IBDAdICDApICiAdIBJAFICxgEIAigEICrgiIB3goIBdgsIBag5IA+gyIA4g6IA4hQIAagQIAOAFIARANIgEEZIgWDTIgeCjIhIEDIhsEPIh4DeIiVDYIilC+IidCSIh7BgIjCB9IjLBkIjPBLIjFAvIi4AYIo7AGg\");\n        this.shape_8.setTransform(313.275, 465.05);\n\n        this.shape_9 = new cjs.Shape();\n        this.shape_9.graphics.f(\"#009FE3\").s().p(\"EgDoAhgIjYgVIipgeIkMhKIj3hgIkgicIiGhcIhOg7IjDiwIiTijIhYhzIiBjQIhai7Igwh7Ig7jSIggi0IgQjGIABh5IAVjnIAHgsIA7j2IA+ipIBkjSICMjbIBliBIC+jGICYiAID0imICchVIBEggICrhGIDJhCIC9gsIDBgeIDUgQICpAAIChALICtAZIBbATICRAoIB7AmICNA8IEpCfICaBHIBHAZIBaAQIA3ABIA3gFIBIgOIBDgUIBbgpIA0gjIA2g1IAzhOIAagaIATgHIAZAAIAUAGIApAXIAsAkIAZAZIA2BFIBHB4IA+CKIAcBOIAjCZIAhENIALD6IgBCXIgYFKIgVCcIhYGmIhLD3Ig6CbIiJEoIiBDPIiEClIh+CGIjXC5Ij6ClIiJBJIkNByIkuBVIkUAtIjTAOg\");\n        this.shape_9.setTransform(285.8, 430.25);\n\n        this.timeline.addTween(cjs.Tween.get({}).to({ state: [{ t: this.shape_9 }, { t: this.shape_8 }, { t: this.shape_7 }, { t: this.shape_6 }, { t: this.shape_5 }, { t: this.shape_4 }, { t: this.shape_3 }, { t: this.shape_2 }, { t: this.shape_1 }, { t: this.shape }, { t: this.instance }] }).wait(1));\n\n        this._renderFirstFrame();\n\n      }).prototype = p = new cjs.MovieClip();\n      p.nominalBounds = new cjs.Rectangle(0, 0, 529.5, 645.2);\n\n\n      // stage content:\n      (lib.header = function (mode, startPosition, loop, reversed) {\n        if (loop == null) { loop = true; }\n        if (reversed == null) { reversed = false; }\n        var props = new Object();\n        props.mode = mode;\n        props.startPosition = startPosition;\n        props.labels = {};\n        props.loop = loop;\n        props.reversed = reversed;\n        cjs.MovieClip.apply(this, [props]);\n\n        // wave_front\n        this.instance = new lib.Wave_Smallai(\"synched\", 0);\n        this.instance.setTransform(96.55, 334.15, 1, 1, 0, 0, 0, 1920.5, 76);\n\n        this.timeline.addTween(cjs.Tween.get(this.instance).to({ x: 480.55 }, 191).wait(1));\n\n        // blub\n        this.instance_1 = new lib.LogoRGBai(\"synched\", 0);\n        this.instance_1.setTransform(959.7, 151, 0.3777, 0.3776, 0.4283, 0, 0, 259.9, 317.4);\n\n        this.timeline.addTween(cjs.Tween.get(this.instance_1).wait(1).to({ regX: 264.8, regY: 322.6, rotation: 0.1759, x: 961.55, y: 152.95 }, 0).wait(1).to({ rotation: -0.063, y: 153 }, 0).wait(1).to({ rotation: -0.2922, x: 961.5, y: 153.1 }, 0).wait(1).to({ rotation: -0.5133, x: 961.55, y: 153.15 }, 0).wait(1).to({ rotation: -0.7272, y: 153.3 }, 0).wait(1).to({ rotation: -0.9344, x: 961.6, y: 153.35 }, 0).wait(1).to({ rotation: -1.1353, x: 961.55, y: 153.5 }, 0).wait(1).to({ rotation: -1.3303, x: 961.6, y: 153.7 }, 0).wait(1).to({ rotation: -1.5195, x: 961.65, y: 153.8 }, 0).wait(1).to({ rotation: -1.7031, x: 961.55, y: 153.95 }, 0).wait(1).to({ rotation: -1.8814, x: 961.6, y: 154.1 }, 0).wait(1).to({ rotation: -2.0544, y: 154.3 }, 0).wait(1).to({ rotation: -2.2222, y: 154.55 }, 0).wait(1).to({ rotation: -2.385, y: 154.7 }, 0).wait(1).to({ rotation: -2.5428, y: 154.9 }, 0).wait(1).to({ rotation: -2.6957, y: 155.2 }, 0).wait(1).to({ rotation: -2.8437, x: 961.65, y: 155.4 }, 0).wait(1).to({ rotation: -2.987, y: 155.65 }, 0).wait(1).to({ rotation: -3.1254, y: 155.95 }, 0).wait(1).to({ rotation: -3.2592, y: 156.2 }, 0).wait(1).to({ rotation: -3.3882, y: 156.5 }, 0).wait(1).to({ rotation: -3.5126, y: 156.8 }, 0).wait(1).to({ rotation: -3.6323, y: 157.15 }, 0).wait(1).to({ rotation: -3.7474, y: 157.45 }, 0).wait(1).to({ rotation: -3.8579, x: 961.7, y: 157.8 }, 0).wait(1).to({ scaleY: 0.3777, rotation: -3.9638, x: 961.6, y: 158.2 }, 0).wait(1).to({ scaleY: 0.3776, rotation: -4.065, x: 961.65, y: 158.5 }, 0).wait(1).to({ rotation: -4.1617, x: 961.7, y: 158.95 }, 0).wait(1).to({ rotation: -4.2538, y: 159.35 }, 0).wait(1).to({ rotation: -4.3412, x: 961.65, y: 159.8 }, 0).wait(1).to({ rotation: -4.4241, y: 160.15 }, 0).wait(1).to({ rotation: -4.5024, y: 160.6 }, 0).wait(1).to({ rotation: -4.576, y: 161.05 }, 0).wait(1).to({ rotation: -4.645, x: 961.7, y: 161.55 }, 0).wait(1).to({ rotation: -4.7094, y: 162.05 }, 0).wait(1).to({ rotation: -4.7692, y: 162.6 }, 0).wait(1).to({ rotation: -4.8243, y: 163.1 }, 0).wait(1).to({ rotation: -4.8747, y: 163.65 }, 0).wait(1).to({ rotation: -4.9204, y: 164.2 }, 0).wait(1).to({ rotation: -4.9614, x: 961.75, y: 164.8 }, 0).wait(1).to({ scaleY: 0.3777, rotation: -4.9977, x: 961.7, y: 165.45 }, 0).wait(1).to({ scaleY: 0.3776, rotation: -5.0293, x: 961.75, y: 166.1 }, 0).wait(1).to({ rotation: -5.056, x: 961.7, y: 166.75 }, 0).wait(1).to({ rotation: -5.078, y: 167.4 }, 0).wait(1).to({ rotation: -5.0951, x: 961.65, y: 168.1 }, 0).wait(1).to({ rotation: -5.1073, x: 961.7, y: 168.85 }, 0).wait(1).to({ rotation: -5.1147, y: 169.65 }, 0).wait(1).to({ rotation: -5.1172, y: 170 }, 0).wait(1).to({ rotation: -5.1124, y: 170.35 }, 0).wait(1).to({ rotation: -5.0983, x: 961.65, y: 170.65 }, 0).wait(1).to({ rotation: -5.0755, x: 961.7, y: 171.05 }, 0).wait(1).to({ rotation: -5.0446, y: 171.4 }, 0).wait(1).to({ rotation: -5.006, x: 961.75, y: 171.75 }, 0).wait(1).to({ rotation: -4.9602, y: 172.1 }, 0).wait(1).to({ scaleY: 0.3777, rotation: -4.9076, x: 961.7, y: 172.5 }, 0).wait(1).to({ scaleY: 0.3776, rotation: -4.8486, y: 172.85 }, 0).wait(1).to({ rotation: -4.7836, x: 961.65, y: 173.2 }, 0).wait(1).to({ rotation: -4.7128, x: 961.7, y: 173.55 }, 0).wait(1).to({ rotation: -4.6367, y: 173.9 }, 0).wait(1).to({ rotation: -4.5554, x: 961.65, y: 174.25 }, 0).wait(1).to({ rotation: -4.4693, x: 961.7, y: 174.6 }, 0).wait(1).to({ rotation: -4.3787, x: 961.65, y: 174.95 }, 0).wait(1).to({ rotation: -4.2837, x: 961.7, y: 175.4 }, 0).wait(1).to({ rotation: -4.1846, y: 175.7 }, 0).wait(1).to({ rotation: -4.0816, x: 961.65, y: 176.05 }, 0).wait(1).to({ rotation: -3.9749, y: 176.45 }, 0).wait(1).to({ rotation: -3.8647, y: 176.8 }, 0).wait(1).to({ rotation: -3.7513, y: 177.15 }, 0).wait(1).to({ rotation: -3.6347, x: 961.6, y: 177.5 }, 0).wait(1).to({ rotation: -3.5152, x: 961.65, y: 177.85 }, 0).wait(1).to({ rotation: -3.3929, y: 178.25 }, 0).wait(1).to({ rotation: -3.2679, y: 178.55 }, 0).wait(1).to({ rotation: -3.1405, x: 961.6, y: 178.95 }, 0).wait(1).to({ rotation: -3.0107, y: 179.3 }, 0).wait(1).to({ rotation: -2.8787, x: 961.65, y: 179.7 }, 0).wait(1).to({ rotation: -2.7447, y: 180.05 }, 0).wait(1).to({ rotation: -2.6087, x: 961.6, y: 180.4 }, 0).wait(1).to({ rotation: -2.4709, y: 180.75 }, 0).wait(1).to({ rotation: -2.3314, x: 961.65, y: 181.1 }, 0).wait(1).to({ rotation: -2.1904, x: 961.6, y: 181.55 }, 0).wait(1).to({ rotation: -2.0478, y: 181.9 }, 0).wait(1).to({ rotation: -1.904, y: 182.25 }, 0).wait(1).to({ rotation: -1.7589, y: 182.6 }, 0).wait(1).to({ rotation: -1.6126, y: 183 }, 0).wait(1).to({ rotation: -1.4654, y: 183.3 }, 0).wait(1).to({ rotation: -1.3172, y: 183.65 }, 0).wait(1).to({ rotation: -1.1682, y: 184 }, 0).wait(1).to({ rotation: -1.0184, x: 961.55, y: 184.4 }, 0).wait(1).to({ rotation: -0.8681, y: 184.75 }, 0).wait(1).to({ rotation: -0.7172, y: 185.1 }, 0).wait(1).to({ scaleY: 0.3777, rotation: -0.5659, y: 185.45 }, 0).wait(1).to({ scaleY: 0.3776, rotation: -0.4142, y: 185.85 }, 0).wait(1).to({ rotation: -0.2623, y: 186.2 }, 0).wait(1).to({ rotation: -0.1102, y: 186.55 }, 0).wait(1).to({ rotation: 0.0419, x: 961.5, y: 186.9 }, 0).wait(1).to({ rotation: 0.194, x: 961.55, y: 186.55 }, 0).wait(1).to({ scaleY: 0.3777, rotation: 0.346, x: 961.5, y: 186.2 }, 0).wait(1).to({ scaleY: 0.3776, rotation: 0.4978, y: 185.85 }, 0).wait(1).to({ rotation: 0.6492, y: 185.55 }, 0).wait(1).to({ rotation: 0.8003, y: 185.2 }, 0).wait(1).to({ rotation: 0.9509, x: 961.55, y: 184.85 }, 0).wait(1).to({ rotation: 1.1008, x: 961.5, y: 184.5 }, 0).wait(1).to({ rotation: 1.2501, y: 184.2 }, 0).wait(1).to({ rotation: 1.3987, x: 961.55, y: 183.85 }, 0).wait(1).to({ rotation: 1.5463, x: 961.45, y: 183.5 }, 0).wait(1).to({ rotation: 1.693, y: 183.1 }, 0).wait(1).to({ rotation: 1.8386, y: 182.75 }, 0).wait(1).to({ rotation: 1.983, x: 961.5, y: 182.45 }, 0).wait(1).to({ scaleY: 0.3777, rotation: 2.1262, y: 182.1 }, 0).wait(1).to({ scaleY: 0.3776, rotation: 2.268, y: 181.75 }, 0).wait(1).to({ rotation: 2.4083, y: 181.4 }, 0).wait(1).to({ rotation: 2.547, x: 961.45, y: 181.05 }, 0).wait(1).to({ rotation: 2.684, y: 180.75 }, 0).wait(1).to({ rotation: 2.8192, y: 180.4 }, 0).wait(1).to({ rotation: 2.9525, x: 961.5, y: 180 }, 0).wait(1).to({ rotation: 3.0837, x: 961.4, y: 179.7 }, 0).wait(1).to({ scaleY: 0.3777, rotation: 3.2127, y: 179.35 }, 0).wait(1).to({ scaleY: 0.3776, rotation: 3.3394, y: 178.95 }, 0).wait(1).to({ rotation: 3.4637, x: 961.45, y: 178.65 }, 0).wait(1).to({ rotation: 3.5854, x: 961.4, y: 178.3 }, 0).wait(1).to({ rotation: 3.7044, y: 177.95 }, 0).wait(1).to({ rotation: 3.8205, x: 961.45, y: 177.6 }, 0).wait(1).to({ rotation: 3.9335, y: 177.3 }, 0).wait(1).to({ rotation: 4.0434, x: 961.35, y: 176.9 }, 0).wait(1).to({ rotation: 4.15, x: 961.4, y: 176.6 }, 0).wait(1).to({ rotation: 4.253, y: 176.25 }, 0).wait(1).to({ rotation: 4.3523, x: 961.35, y: 175.9 }, 0).wait(1).to({ rotation: 4.4477, y: 175.55 }, 0).wait(1).to({ rotation: 4.539, y: 175.2 }, 0).wait(1).to({ rotation: 4.626, y: 174.85 }, 0).wait(1).to({ rotation: 4.7085, x: 961.4, y: 174.5 }, 0).wait(1).to({ rotation: 4.7862, x: 961.35, y: 174.15 }, 0).wait(1).to({ rotation: 4.8589, x: 961.4, y: 173.8 }, 0).wait(1).to({ rotation: 4.9262, y: 173.45 }, 0).wait(1).to({ rotation: 4.9881, x: 961.35, y: 173.1 }, 0).wait(1).to({ rotation: 5.044, x: 961.4, y: 172.8 }, 0).wait(1).to({ rotation: 5.0938, x: 961.35, y: 172.45 }, 0).wait(1).to({ rotation: 5.137, y: 172.1 }, 0).wait(1).to({ rotation: 5.1733, y: 171.75 }, 0).wait(1).to({ rotation: 5.2024, y: 171.35 }, 0).wait(1).to({ rotation: 5.2237, y: 171 }, 0).wait(1).to({ rotation: 5.2369, x: 961.4, y: 170.7 }, 0).wait(1).to({ rotation: 5.2414, y: 170.35 }, 0).wait(1).to({ rotation: 5.2392, y: 169.5 }, 0).wait(1).to({ rotation: 5.2325, x: 961.35, y: 168.7 }, 0).wait(1).to({ rotation: 5.2214, y: 167.95 }, 0).wait(1).to({ rotation: 5.2059, y: 167.2 }, 0).wait(1).to({ rotation: 5.186, y: 166.55 }, 0).wait(1).to({ rotation: 5.1617, y: 165.95 }, 0).wait(1).to({ rotation: 5.1331, y: 165.3 }, 0).wait(1).to({ rotation: 5.1001, x: 961.3, y: 164.7 }, 0).wait(1).to({ rotation: 5.0627, x: 961.35, y: 164.1 }, 0).wait(1).to({ rotation: 5.021, x: 961.4, y: 163.55 }, 0).wait(1).to({ rotation: 4.975, y: 163 }, 0).wait(1).to({ rotation: 4.9247, y: 162.55 }, 0).wait(1).to({ rotation: 4.8701, x: 961.35, y: 162.05 }, 0).wait(1).to({ rotation: 4.8111, y: 161.6 }, 0).wait(1).to({ rotation: 4.7479, y: 161.15 }, 0).wait(1).to({ rotation: 4.6803, x: 961.4, y: 160.65 }, 0).wait(1).to({ rotation: 4.6085, x: 961.35, y: 160.3 }, 0).wait(1).to({ rotation: 4.5323, x: 961.4, y: 159.85 }, 0).wait(1).to({ rotation: 4.4518, x: 961.35, y: 159.45 }, 0).wait(1).to({ rotation: 4.367, x: 961.4, y: 159.05 }, 0).wait(1).to({ rotation: 4.2779, y: 158.75 }, 0).wait(1).to({ rotation: 4.1844, y: 158.4 }, 0).wait(1).to({ rotation: 4.0866, x: 961.35, y: 158.1 }, 0).wait(1).to({ rotation: 3.9845, x: 961.4, y: 157.8 }, 0).wait(1).to({ rotation: 3.8779, y: 157.45 }, 0).wait(1).to({ rotation: 3.767, y: 157.15 }, 0).wait(1).to({ rotation: 3.6516, y: 156.9 }, 0).wait(1).to({ rotation: 3.5318, x: 961.45, y: 156.6 }, 0).wait(1).to({ rotation: 3.4075, x: 961.4, y: 156.35 }, 0).wait(1).to({ rotation: 3.2786, x: 961.45, y: 156.05 }, 0).wait(1).to({ rotation: 3.1452, x: 961.4, y: 155.9 }, 0).wait(1).to({ rotation: 3.0072, y: 155.65 }, 0).wait(1).to({ rotation: 2.8645, x: 961.45, y: 155.4 }, 0).wait(1).to({ rotation: 2.717, y: 155.25 }, 0).wait(1).to({ rotation: 2.5647, y: 155 }, 0).wait(1).to({ rotation: 2.4076, x: 961.5, y: 154.8 }, 0).wait(1).to({ rotation: 2.2454, y: 154.65 }, 0).wait(1).to({ rotation: 2.0781, y: 154.5 }, 0).wait(1).to({ rotation: 1.9056, x: 961.45, y: 154.35 }, 0).wait(1).to({ rotation: 1.7276, x: 961.5, y: 154.15 }, 0).wait(1).to({ rotation: 1.5441, y: 154.1 }, 0).wait(1).to({ rotation: 1.3546, y: 153.95 }, 0).wait(1).to({ rotation: 1.159, y: 153.8 }, 0).wait(1).to({ rotation: 0.9568, y: 153.7 }, 0).wait(1).to({ rotation: 0.7474, y: 153.6 }, 0).wait(1).to({ rotation: 0.5299, x: 961.55, y: 153.5 }, 0).wait(1).to({ rotation: 0.303, x: 961.5 }, 0).wait(1).to({ rotation: 0.0621, y: 153.45 }, 0).wait(1));\n\n        // wave_back\n        this.instance_2 = new lib.Wave_Largeai(\"synched\", 0);\n        this.instance_2.setTransform(1632.55, 309.5, 1, 1, 0, 0, 0, 1920.5, 84.5);\n\n        this.timeline.addTween(cjs.Tween.get(this.instance_2).to({ x: 1248.55 }, 191).wait(1));\n\n        this._renderFirstFrame();\n\n      }).prototype = p = new lib.AnMovieClip();\n      p.nominalBounds = new cjs.Rectangle(-863.4, 206.2, 4416, 203.8);\n      // library properties:\n      lib.properties = {\n        id: '90F03647C15B4ADDB70E6D9ACD334532',\n        width: 1920,\n        height: 350,\n        fps: 24,\n        color: \"#FFFFFF\",\n        opacity: 1.00,\n        manifest: [],\n        preloads: []\n      };\n\n\n\n      // bootstrap callback support:\n\n      (lib.Stage = function (canvas) {\n        createjs.Stage.call(this, canvas);\n      }).prototype = p = new createjs.Stage();\n\n      p.setAutoPlay = function (autoPlay) {\n        this.tickEnabled = autoPlay;\n      }\n      p.play = function () { this.tickEnabled = true; this.getChildAt(0).gotoAndPlay(this.getTimelinePosition()) }\n      p.stop = function (ms) { if (ms) this.seek(ms); this.tickEnabled = false; }\n      p.seek = function (ms) { this.tickEnabled = true; this.getChildAt(0).gotoAndStop(lib.properties.fps * ms / 1000); }\n      p.getDuration = function () { return this.getChildAt(0).totalFrames / lib.properties.fps * 1000; }\n\n      p.getTimelinePosition = function () { return this.getChildAt(0).currentFrame / lib.properties.fps * 1000; }\n\n      an.bootcompsLoaded = an.bootcompsLoaded || [];\n      if (!an.bootstrapListeners) {\n        an.bootstrapListeners = [];\n      }\n\n      an.bootstrapCallback = function (fnCallback) {\n        an.bootstrapListeners.push(fnCallback);\n        if (an.bootcompsLoaded.length > 0) {\n          for (var i = 0; i < an.bootcompsLoaded.length; ++i) {\n            fnCallback(an.bootcompsLoaded[i]);\n          }\n        }\n      };\n\n      an.compositions = an.compositions || {};\n      an.compositions['90F03647C15B4ADDB70E6D9ACD334532'] = {\n        getStage: function () { return exportRoot.stage; },\n        getLibrary: function () { return lib; },\n        getSpriteSheet: function () { return ss; },\n        getImages: function () { return img; }\n      };\n\n      an.compositionLoaded = function (id) {\n        an.bootcompsLoaded.push(id);\n        for (var j = 0; j < an.bootstrapListeners.length; j++) {\n          an.bootstrapListeners[j](id);\n        }\n      }\n\n      an.getComposition = function (id) {\n        return an.compositions[id];\n      }\n\n\n      an.makeResponsive = function (isResp, respDim, isScale, scaleType, domContainers) {\n        var lastW, lastH, lastS = 1;\n        window.addEventListener('resize', resizeCanvas);\n        resizeCanvas();\n        function resizeCanvas() {\n          var w = lib.properties.width, h = lib.properties.height;\n          var iw = domContainers[1].clientWidth, ih = window.innerHeight;\n          var pRatio = window.devicePixelRatio || 1, xRatio = iw / w, yRatio = ih / h, sRatio = 1;\n          if (isResp) {\n            if ((respDim == 'width' && lastW == iw) || (respDim == 'height' && lastH == ih)) {\n              sRatio = lastS;\n            }\n            else if (!isScale) {\n              if (iw < w || ih < h)\n                sRatio = Math.min(xRatio, yRatio);\n            }\n            else if (scaleType == 1) {\n              sRatio = Math.min(xRatio, yRatio);\n            }\n            else if (scaleType == 2) {\n              sRatio = Math.max(xRatio, yRatio);\n            }\n          }\n          domContainers[0].width = w * pRatio * sRatio;\n          domContainers[0].height = h * pRatio * sRatio;\n          domContainers.forEach(function (container) {\n            if (container != domContainers[1]) {\n              container.style.width = w * sRatio + 'px';\n            }\n            container.style.height = h * sRatio + 'px';\n          });\n          stage.scaleX = pRatio * sRatio;\n          stage.scaleY = pRatio * sRatio;\n          lastW = iw; lastH = ih; lastS = sRatio;\n          stage.tickOnUpdate = false;\n          stage.update();\n          stage.tickOnUpdate = true;\n        }\n      }\n      an.handleSoundStreamOnTick = function (event) {\n        if (!event.paused) {\n          var stageChild = stage.getChildAt(0);\n          if (!stageChild.paused || stageChild.ignorePause) {\n            stageChild.syncStreamSounds();\n          }\n        }\n      }\n      an.handleFilterCache = function (event) {\n        if (!event.paused) {\n          var target = event.target;\n          if (target) {\n            if (target.filterCacheList) {\n              for (var index = 0; index < target.filterCacheList.length; index++) {\n                var cacheInst = target.filterCacheList[index];\n                if ((cacheInst.startFrame <= target.currentFrame) && (target.currentFrame <= cacheInst.endFrame)) {\n                  cacheInst.instance.cache(cacheInst.x, cacheInst.y, cacheInst.w, cacheInst.h);\n                }\n              }\n            }\n          }\n        }\n      }\n\n    })(createjs, AdobeAn);\n\n    var canvas, stage, exportRoot, anim_container, dom_overlay_container, fnStartAnimation;\n\n    function handleComplete(evt, comp) {\n      //This function is always called, irrespective of the content. You can use the variable \"stage\" after it is created in token create_stage.\n      var lib = comp.getLibrary();\n      exportRoot = new lib.header();\n      stage = new lib.Stage(canvas);\n      //Registers the \"tick\" event listener.\n      fnStartAnimation = function () {\n        stage.addChild(exportRoot);\n        createjs.Ticker.framerate = lib.properties.fps;\n        createjs.Ticker.addEventListener(\"tick\", stage);\n      }\n      //Code to support hidpi screens and responsive scaling.\n      AdobeAn.makeResponsive(true, 'width', true, 1, [canvas, anim_container, dom_overlay_container]);\n      AdobeAn.compositionLoaded(lib.properties.id);\n      fnStartAnimation();\n    }\n\n    anim_container = this.element;\n    canvas = this.element.getElementsByTagName(\"canvas\")[0];\n    dom_overlay_container = this.element.getElementsByTagName('div')[0];\n    var comp = AdobeAn.getComposition(\"90F03647C15B4ADDB70E6D9ACD334532\");\n    handleComplete({}, comp);\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { createjs } from 'createjs/builds/1.0.0/createjs'\n\nexport default class extends Controller {\n  connect() {\n    var AdobeAn = {};\n\n    (function (cjs, an) {\n\n      var p; // shortcut to reference prototypes\n      var lib = {}; var ss = {}; var img = {};\n      lib.ssMetadata = [];\n\n\n      (lib.AnMovieClip = function () {\n        this.actionFrames = [];\n        this.ignorePause = false;\n        this.gotoAndPlay = function (positionOrLabel) {\n          cjs.MovieClip.prototype.gotoAndPlay.call(this, positionOrLabel);\n        }\n        this.play = function () {\n          cjs.MovieClip.prototype.play.call(this);\n        }\n        this.gotoAndStop = function (positionOrLabel) {\n          cjs.MovieClip.prototype.gotoAndStop.call(this, positionOrLabel);\n        }\n        this.stop = function () {\n          cjs.MovieClip.prototype.stop.call(this);\n        }\n      }).prototype = p = new cjs.MovieClip();\n      // symbols:\n      // helper functions:\n\n      function mc_symbol_clone() {\n        var clone = this._cloneProps(new this.constructor(this.mode, this.startPosition, this.loop, this.reversed));\n        clone.gotoAndStop(this.currentFrame);\n        clone.paused = this.paused;\n        clone.framerate = this.framerate;\n        return clone;\n      }\n\n      function getMCSymbolPrototype(symbol, nominalBounds, frameBounds) {\n        var prototype = cjs.extend(symbol, cjs.MovieClip);\n        prototype.clone = mc_symbol_clone;\n        prototype.nominalBounds = nominalBounds;\n        prototype.frameBounds = frameBounds;\n        return prototype;\n      }\n\n\n      (lib.Wave_Smallai = function (mode, startPosition, loop, reversed) {\n        if (loop == null) { loop = true; }\n        if (reversed == null) { reversed = false; }\n        var props = new Object();\n        props.mode = mode;\n        props.startPosition = startPosition;\n        props.labels = {};\n        props.loop = loop;\n        props.reversed = reversed;\n        cjs.MovieClip.apply(this, [props]);\n\n        // Wave_Small_ai\n        this.shape = new cjs.Shape();\n        this.shape.graphics.f(\"#00CCFF\").s().p(\"Ekr/AL1IAA07IAFAAIAAgDQFciXHkgRQHEgRGMBmQCXApBZAqIAAADIAGAAQBWAoCUAoQGLBmHCgQQHhgSFdiUIAFAAIAAgDQFciXHkgRQHEgRGMBmQCXApBZAqIAAADIAFAAQBXAoCUAoQGLBmHCgQQHhgSFdiUIAFAAIAAgDQFciXHkgRQHEgRGMBmQCXApBZAqIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAGAAIAAgDQFciXHkgRQHEgRGLBmQCYApBZAqIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAGAAIAAgDQFciXHkgRQHEgRGLBmQCYApBZAqIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAFAAIAAgDQFciXHjgRQHFgRGMBmQCYAqBYApIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAGAAIAAgDQFciXHjgRQHFgRGMBmQCYAqBYApIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAGAAIAAgDQFciXHjgRQHFgRGMBmQCYAqBYApIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAGAAIAAgDQFciXHjgRQHFgRGMBmQCXAqBZApIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIAGAAIAAgDQFciXHkgRQHEgRGMBmQCXAqBZApIAAADIAFAAQBXAoCUAoQGKBmHDgQQHhgSFciUIABAAIAAU7g\");\n        this.shape.setTransform(1920.5, 76.1786);\n\n        this.timeline.addTween(cjs.Tween.get(this.shape).wait(1));\n\n        this._renderFirstFrame();\n\n      }).prototype = p = new cjs.MovieClip();\n      p.nominalBounds = new cjs.Rectangle(0.5, 0.5, 3840, 151.4);\n\n\n      (lib.Wave_Largeai = function (mode, startPosition, loop, reversed) {\n        if (loop == null) { loop = true; }\n        if (reversed == null) { reversed = false; }\n        var props = new Object();\n        props.mode = mode;\n        props.startPosition = startPosition;\n        props.labels = {};\n        props.loop = loop;\n        props.reversed = reversed;\n        cjs.MovieClip.apply(this, [props]);\n\n        // Wave_Large_ai\n        this.shape = new cjs.Shape();\n        this.shape.graphics.f(\"#00548A\").s().p(\"Ekr/ANIIAA07IAHAAQCjiRDWhWQDNhSDmgUQDigUDeArQDiArDABmQBHAmA0AjQBAArAzAxIADAAQA0AwA/ArQA1AjBHAnQDCBmDgArQDfArDigUQHlgqFHkjIADAAQFHkjHlgqQDigUDeArQDiArDABmQBHAmA0AjQA/ArA0AxIADAAQA0AwBAArQA0AjBHAnQDCBmDgArQDfArDjgUQHkgqFHkjIADAAQFHkjHlgqQDigUDeArQDhArDBBmQBHAmA0AjQA/ArA0AxIACAAQA1AwA/ArQA0AjBIAnQDBBmDhArQDeArDjgUQHlgqFHkjIADAAQFHkjHkgqQDjgUDeArQDhArDABmQBHAmA1AjQA/ArA0AxIACAAQA1AwA/ArQA0AjBIAnQDBBmDhArQDeArDjgUQHlgqFHkjIADAAQCiiRDWhWQDNhSDmgUQDigUDfArQDhArDABmQBIAmAzAjQBAArA0AxIACAAQA0AwBAArQA0AjBIAnQDBBmDhArQDfArDigUQHkgqFHkjIACAAQCkiRDWhWQDMhSDngUQDhgUDfArQDhArDABmQBIAmAzAjQBAArA0AxIACAAQA1AwA/ArQA0AjBIAnQDBBmDhArQDfArDigUQHkgqFIkjIACAAQCkiRDWhWQDMhSDngUQDigUDdArQDiArDBBmQBHAmAzAjQBAArA0AxIADAAQA0AwA/ArQA0AjBIAnQDBBmDhArQDeArDjgUQHkgqFIkjIACAAQCjiRDXhWQDMhSDngUQDigUDdArQDiArDABmQBHAmA0AjQBAArA0AxIADAAQAzAwBAArQA0AjBIAnQDBBmDhArQDeArDjgUQHlgqFHkjIACAAQCjiRDWhWQDOhSDlgUQDigUDfArQDiArDABmQBHAmA0AjQA/ArA0AxIADAAQAzAwBAArQA0AjBIAnQDBBmDhArQDeArDjgUQHlgqFHkjIADAAQCiiRDWhWQDOhSDlgUQDigUDfArQDhArDBBmQBHAmA0AjQA/ArA0AxIACAAQA1AwA/ArQA0AjBIAnQDABmDgArQDfArDhgUQHjgpFIkhIAAU4g\");\n        this.shape.setTransform(1920.5, 84.4433);\n\n        this.timeline.addTween(cjs.Tween.get(this.shape).wait(1));\n\n        this._renderFirstFrame();\n\n      }).prototype = p = new cjs.MovieClip();\n      p.nominalBounds = new cjs.Rectangle(0.5, 0.5, 3840, 167.9);\n\n\n      (lib.Path = function (mode, startPosition, loop, reversed) {\n        if (loop == null) { loop = true; }\n        if (reversed == null) { reversed = false; }\n        var props = new Object();\n        props.mode = mode;\n        props.startPosition = startPosition;\n        props.labels = {};\n        props.loop = loop;\n        props.reversed = reversed;\n        cjs.MovieClip.apply(this, [props]);\n\n        // Laag_1\n        this.shape = new cjs.Shape();\n        this.shape.graphics.f(\"#FFFFFF\").s().p(\"AAIBPQgUgDgXgZQgvgzgngiIgdgaQgJgJACgFQADgJAqAEIB4AMQAyADA5ABQAiADAHAOQAJASgVAfQgKARgPAOQgQARgUAMQgfASgdAAIgPgCg\");\n        this.shape.setTransform(15.8691, 8.1016);\n\n        this.timeline.addTween(cjs.Tween.get(this.shape).wait(1));\n\n        this._renderFirstFrame();\n\n      }).prototype = getMCSymbolPrototype(lib.Path, new cjs.Rectangle(0, 0.1, 31.7, 16.099999999999998), null);\n\n\n      (lib.Symbool1 = function (mode, startPosition, loop, reversed) {\n        if (loop == null) { loop = true; }\n        if (reversed == null) { reversed = false; }\n        var props = new Object();\n        props.mode = mode;\n        props.startPosition = startPosition;\n        props.labels = {};\n        props.loop = loop;\n        props.reversed = reversed;\n        cjs.MovieClip.apply(this, [props]);\n\n        // Laag_1\n        this.instance = new lib.Path();\n        this.instance.setTransform(263, 37.8, 1, 1, 0, 0, 0, 15.8, 8.1);\n        this.instance.alpha = 0.6484;\n\n        this.shape = new cjs.Shape();\n        this.shape.graphics.f(\"#CD7D00\").s().p(\"ADSEEIg3gKIndjBIiuhfIgcgUIg1guIgrgzIgihCIAAgtQCsCEEEBLQEMBNEyAAQAbACAkAAQBoAABLgSIAvBHIAOAjIgEAkIgKATIgTAXIgkAbIgqAUIggAKIg9AOIg2AHIhjADg\");\n        this.shape.setTransform(89.025, 242.05);\n\n        this.shape_1 = new cjs.Shape();\n        this.shape_1.graphics.f(\"#F39200\").s().p(\"AFIJBIg3gKInejAIithhIgdgTIg1guIgrg0IgihBIAAgtQhxhWg8hlQg+hoAAhvIACgoIAKgwIAQgsIAdgvIARgSIAmgbIAVgHIAagCIAjAJICWBAIBlAeIBdAPICIAJICcgGICjgUIARAAIAVAFIAeAKIATAKIAYATIATAYIApBCIBmDTIBLDCIAmBWIArBRIBsCoIAPAjIgFAjIgKAUIgSAWIglAbIgqAUIgfAKIg9AOIg3AIIhjACg\");\n        this.shape_1.setTransform(77.275, 210.3);\n\n        this.shape_2 = new cjs.Shape();\n        this.shape_2.graphics.f(\"#FFFFFF\").s().p(\"Ag3A4QgYgXAAghQAAggAYgXQAWgYAhAAQAhAAAXAYQAYAXAAAgQAAAhgYAXQgXAYghAAQghAAgWgYg\");\n        this.shape_2.setTransform(186.35, 151.5);\n\n        this.shape_3 = new cjs.Shape();\n        this.shape_3.graphics.f(\"#380400\").s().p(\"AknEoQh6h7AAitQAAisB6h7QB7h6CsAAQCtAAB7B6QB6B7AACsQAACth6B7Qh7B6itAAQisAAh7h6g\");\n        this.shape_3.setTransform(194.325, 166.675);\n\n        this.shape_4 = new cjs.Shape();\n        this.shape_4.graphics.f(\"#FFFFFF\").s().p(\"Al1F2QibibAAjbQAAjaCbibQCbibDaAAQDbAACbCbQCbCbAADaQAADbibCbQibCbjbAAQjaAAibibg\");\n        this.shape_4.setTransform(205.375, 168.675);\n\n        this.shape_5 = new cjs.Shape();\n        this.shape_5.graphics.f(\"#AA1922\").s().p(\"Aj6YBIhZgRIikgvIjdhdIiqhkIh2heIiZidIiMi6IhPiGIhJiiIgWg7Igih5IgjjMIADjIIAKhWIAaiJIA6izIAzhzIA9htIBciJICEibICSiIICbh0ICXhaIBngyICTg5IC0gvIC5gYIBcAAIC7AOIClAjIAbgTIA8ghIA0gXIBWgcICCgaIBhAAIBFAMIAxAQIAiAQIAjAXIAaAXIAUAXIAXAkIAVAtIAXBZIAGAsIgDBQIgSBUIgOAhIgKASIAAAUIAkAmICQC0IAbAoIBpC+IA3CGIAqCUIAVB1IALBqIgGDrIgTCCIgkCQIg5CfIhNCaIhvCnIiNChIhbBSIiiB4IgxAeIiLBIIg1AYIihA5IiAAgIi4AaIjeADg\");\n        this.shape_5.setTransform(236, 155.625);\n\n        this.shape_6 = new cjs.Shape();\n        this.shape_6.graphics.f().s(\"#AB1923\").ss(18, 1).p(\"Ap/CuQCsA6DMgKQC8gJC8hBQC0g+CMhhQCNhkBChw\");\n        this.shape_6.setTransform(422.45, 504.2735);\n\n        this.shape_7 = new cjs.Shape();\n        this.shape_7.graphics.f().s(\"#AB1923\").ss(18, 1).p(\"AK9llQgeCpiPCXQiHCNjSBkQjMBijnAlQjuAmjSgl\");\n        this.shape_7.setTransform(441.775, 424.5377);\n\n        this.shape_8 = new cjs.Shape();\n        this.shape_8.graphics.f(\"#8C161A\").s().p(\"Ar2VAIiSgdIhPgYIhbgiIhxg3IgvgbIiAhXIh6hsIAAgCQjCi6hrj3QhvkAAAkaQAAjpBNjaQBKjTCLivIgBgIIBXhoICFh9ICXhqIBqg5ICDg2IB4gkIDJgjICqADIBlALIA/ALICUAlICIA3IBnA1ICEBZIDjDEIAxAhIBiA3IBDAdICDApICiAdIBJAFICxgEIAigEICrgiIB3goIBdgsIBag5IA+gyIA4g6IA4hQIAagQIAOAFIARANIgEEZIgWDTIgeCjIhIEDIhsEPIh4DeIiVDYIilC+IidCSIh7BgIjCB9IjLBkIjPBLIjFAvIi4AYIo7AGg\");\n        this.shape_8.setTransform(313.275, 465.05);\n\n        this.shape_9 = new cjs.Shape();\n        this.shape_9.graphics.f(\"#AB1923\").s().p(\"EgDoAhgIjYgVIipgeIkMhKIj3hgIkgicIiGhcIhOg7IjDiwIiTijIhYhzIiBjQIhai7Igwh7Ig7jSIggi0IgQjGIABh5IAVjnIAHgsIA7j2IA+ipIBkjSICMjbIBliBIC+jGICYiAID0imICchVIBEggICrhGIDJhCIC9gsIDBgeIDUgQICpAAIChALICtAZIBbATICRAoIB7AmICNA8IEpCfICaBHIBHAZIBaAQIA3ABIA3gFIBIgOIBDgUIBbgpIA0gjIA2g1IAzhOIAagaIATgHIAZAAIAUAGIApAXIAsAkIAZAZIA2BFIBHB4IA+CKIAcBOIAjCZIAhENIALD6IgBCXIgYFKIgVCcIhYGmIhLD3Ig6CbIiJEoIiBDPIiEClIh+CGIjXC5Ij6ClIiJBJIkNByIkuBVIkUAtIjTAOg\");\n        this.shape_9.setTransform(285.8, 430.25);\n\n        this.timeline.addTween(cjs.Tween.get({}).to({ state: [{ t: this.shape_9 }, { t: this.shape_8 }, { t: this.shape_7 }, { t: this.shape_6 }, { t: this.shape_5 }, { t: this.shape_4 }, { t: this.shape_3 }, { t: this.shape_2 }, { t: this.shape_1 }, { t: this.shape }, { t: this.instance }] }).wait(1));\n\n        this._renderFirstFrame();\n\n      }).prototype = getMCSymbolPrototype(lib.Symbool1, new cjs.Rectangle(0, 0, 529.5, 645.2), null);\n\n\n      (lib.logo_vector_rgbai = function (mode, startPosition, loop, reversed) {\n        if (loop == null) { loop = true; }\n        if (reversed == null) { reversed = false; }\n        var props = new Object();\n        props.mode = mode;\n        props.startPosition = startPosition;\n        props.labels = {};\n        props.loop = loop;\n        props.reversed = reversed;\n        cjs.MovieClip.apply(this, [props]);\n\n        // logo_vector_rgb_ai\n        this.instance = new lib.Symbool1();\n        this.instance.setTransform(264.8, 322.6, 1, 1, 0, 0, 0, 264.8, 322.6);\n\n        this.timeline.addTween(cjs.Tween.get(this.instance).wait(1).to({ y: 316.45 }, 0).wait(1).to({ y: 310.25 }, 0).wait(1).to({ y: 304.05 }, 0).wait(1).to({ y: 297.85 }, 0).wait(1).to({ y: 291.65 }, 0).wait(1).to({ y: 285.45 }, 0).wait(1).to({ y: 279.25 }, 0).wait(1).to({ y: 273.05 }, 0).wait(1).to({ y: 266.85 }, 0).wait(1).to({ y: 260.65 }, 0).wait(1).to({ y: 254.45 }, 0).wait(1).to({ y: 248.25 }, 0).wait(1).to({ y: 242.05 }, 0).wait(1).to({ y: 241.9 }, 0).wait(1).to({ y: 241.85 }, 0).wait(2).to({ y: 242 }, 0).wait(1).to({ y: 242.35 }, 0).wait(1).to({ y: 243 }, 0).wait(1).to({ y: 245.05 }, 0).wait(1).to({ y: 252.2 }, 0).wait(1).to({ y: 261.65 }, 0).wait(1).to({ y: 273.35 }, 0).wait(1).to({ y: 287.2 }, 0).wait(1).to({ y: 303.3 }, 0).wait(1).to({ y: 322.05 }, 0).wait(1));\n\n        this._renderFirstFrame();\n\n      }).prototype = p = new cjs.MovieClip();\n      p.nominalBounds = new cjs.Rectangle(0, -80.7, 529.5, 725.9000000000001);\n\n\n      // stage content:\n      (lib.header_race = function (mode, startPosition, loop, reversed) {\n        if (loop == null) { loop = true; }\n        if (reversed == null) { reversed = false; }\n        var props = new Object();\n        props.mode = mode;\n        props.startPosition = startPosition;\n        props.labels = {};\n        props.loop = loop;\n        props.reversed = reversed;\n        cjs.MovieClip.apply(this, [props]);\n\n        // wave_front\n        this.instance = new lib.Wave_Smallai(\"synched\", 0);\n        this.instance.setTransform(96.55, 334.15, 1, 1, 0, 0, 0, 1920.5, 76);\n\n        this.timeline.addTween(cjs.Tween.get(this.instance).to({ x: 480.55 }, 191).wait(1));\n\n        // blub\n        this.instance_1 = new lib.logo_vector_rgbai(\"synched\", 12);\n        this.instance_1.setTransform(2106.4, 177.7, 0.3811, 0.381, -9.9946, 0, 0, 253.8, 305.1);\n\n        this.timeline.addTween(cjs.Tween.get(this.instance_1).to({ x: -216.95, startPosition: 0 }, 191).wait(1));\n\n        // wave_back\n        this.instance_2 = new lib.Wave_Largeai(\"synched\", 0);\n        this.instance_2.setTransform(1632.55, 309.5, 1, 1, 0, 0, 0, 1920.5, 84.5);\n\n        this.timeline.addTween(cjs.Tween.get(this.instance_2).to({ x: 1248.55 }, 191).wait(1));\n\n        this._renderFirstFrame();\n\n      }).prototype = p = new lib.AnMovieClip();\n      p.nominalBounds = new cjs.Rectangle(-863.4, 203.5, 4416, 206.5);\n      // library properties:\n      lib.properties = {\n        id: '90F03647C15B4ADDB70E6D9ACD334532',\n        width: 1920,\n        height: 350,\n        fps: 24,\n        color: \"#FFFFFF\",\n        opacity: 1.00,\n        manifest: [],\n        preloads: []\n      };\n\n\n\n      // bootstrap callback support:\n\n      (lib.Stage = function (canvas) {\n        createjs.Stage.call(this, canvas);\n      }).prototype = p = new createjs.Stage();\n\n      p.setAutoPlay = function (autoPlay) {\n        this.tickEnabled = autoPlay;\n      }\n      p.play = function () { this.tickEnabled = true; this.getChildAt(0).gotoAndPlay(this.getTimelinePosition()) }\n      p.stop = function (ms) { if (ms) this.seek(ms); this.tickEnabled = false; }\n      p.seek = function (ms) { this.tickEnabled = true; this.getChildAt(0).gotoAndStop(lib.properties.fps * ms / 1000); }\n      p.getDuration = function () { return this.getChildAt(0).totalFrames / lib.properties.fps * 1000; }\n\n      p.getTimelinePosition = function () { return this.getChildAt(0).currentFrame / lib.properties.fps * 1000; }\n\n      an.bootcompsLoaded = an.bootcompsLoaded || [];\n      if (!an.bootstrapListeners) {\n        an.bootstrapListeners = [];\n      }\n\n      an.bootstrapCallback = function (fnCallback) {\n        an.bootstrapListeners.push(fnCallback);\n        if (an.bootcompsLoaded.length > 0) {\n          for (var i = 0; i < an.bootcompsLoaded.length; ++i) {\n            fnCallback(an.bootcompsLoaded[i]);\n          }\n        }\n      };\n\n      an.compositions = an.compositions || {};\n      an.compositions['90F03647C15B4ADDB70E6D9ACD334532'] = {\n        getStage: function () { return exportRoot.stage; },\n        getLibrary: function () { return lib; },\n        getSpriteSheet: function () { return ss; },\n        getImages: function () { return img; }\n      };\n\n      an.compositionLoaded = function (id) {\n        an.bootcompsLoaded.push(id);\n        for (var j = 0; j < an.bootstrapListeners.length; j++) {\n          an.bootstrapListeners[j](id);\n        }\n      }\n\n      an.getComposition = function (id) {\n        return an.compositions[id];\n      }\n\n\n      an.makeResponsive = function (isResp, respDim, isScale, scaleType, domContainers) {\n        var lastW, lastH, lastS = 1;\n        window.addEventListener('resize', resizeCanvas);\n        resizeCanvas();\n        function resizeCanvas() {\n          var w = lib.properties.width, h = lib.properties.height;\n          var iw = domContainers[1].clientWidth, ih = window.innerHeight;\n          var pRatio = window.devicePixelRatio || 1, xRatio = iw / w, yRatio = ih / h, sRatio = 1;\n          if (isResp) {\n            if ((respDim == 'width' && lastW == iw) || (respDim == 'height' && lastH == ih)) {\n              sRatio = lastS;\n            }\n            else if (!isScale) {\n              if (iw < w || ih < h)\n                sRatio = Math.min(xRatio, yRatio);\n            }\n            else if (scaleType == 1) {\n              sRatio = Math.min(xRatio, yRatio);\n            }\n            else if (scaleType == 2) {\n              sRatio = Math.max(xRatio, yRatio);\n            }\n          }\n          domContainers[0].width = w * pRatio * sRatio;\n          domContainers[0].height = h * pRatio * sRatio;\n          domContainers.forEach(function (container) {\n            if (container != domContainers[1]) {\n              container.style.width = w * sRatio + 'px';\n            }\n            container.style.height = h * sRatio + 'px';\n          });\n          stage.scaleX = pRatio * sRatio;\n          stage.scaleY = pRatio * sRatio;\n          lastW = iw; lastH = ih; lastS = sRatio;\n          stage.tickOnUpdate = false;\n          stage.update();\n          stage.tickOnUpdate = true;\n        }\n      }\n      an.handleSoundStreamOnTick = function (event) {\n        if (!event.paused) {\n          var stageChild = stage.getChildAt(0);\n          if (!stageChild.paused || stageChild.ignorePause) {\n            stageChild.syncStreamSounds();\n          }\n        }\n      }\n      an.handleFilterCache = function (event) {\n        if (!event.paused) {\n          var target = event.target;\n          if (target) {\n            if (target.filterCacheList) {\n              for (var index = 0; index < target.filterCacheList.length; index++) {\n                var cacheInst = target.filterCacheList[index];\n                if ((cacheInst.startFrame <= target.currentFrame) && (target.currentFrame <= cacheInst.endFrame)) {\n                  cacheInst.instance.cache(cacheInst.x, cacheInst.y, cacheInst.w, cacheInst.h);\n                }\n              }\n            }\n          }\n        }\n      }\n\n    })(createjs, AdobeAn);\n\n    var canvas, stage, exportRoot, anim_container, dom_overlay_container, fnStartAnimation;\n\n    function handleComplete(evt, comp) {\n      //This function is always called, irrespective of the content. You can use the variable \"stage\" after it is created in token create_stage.\n      var lib = comp.getLibrary();\n      exportRoot = new lib.header_race();\n      stage = new lib.Stage(canvas);\n      //Registers the \"tick\" event listener.\n      fnStartAnimation = function () {\n        stage.addChild(exportRoot);\n        createjs.Ticker.framerate = lib.properties.fps;\n        createjs.Ticker.addEventListener(\"tick\", stage);\n      }\n      //Code to support hidpi screens and responsive scaling.\n      AdobeAn.makeResponsive(true, 'width', true, 1, [canvas, anim_container, dom_overlay_container]);\n      AdobeAn.compositionLoaded(lib.properties.id);\n      fnStartAnimation();\n    }\n\n    anim_container = this.element;\n    canvas = this.element.getElementsByTagName(\"canvas\")[0];\n    dom_overlay_container = this.element.getElementsByTagName('div')[0];\n    var comp = AdobeAn.getComposition(\"90F03647C15B4ADDB70E6D9ACD334532\");\n    handleComplete({}, comp);\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport Cropper from 'cropperjs';\n\nexport default class extends Controller {\n  static targets = [\"image\", \"fileInput\", \"pictureX\", \"pictureY\", \"pictureW\", \"pictureH\", \"wrapper\"]\n\n  #cropper;\n\n  connect() {\n    this._initializeCropper();\n  }\n\n  changed() {\n    if (!this.fileInputTarget.files || !this.fileInputTarget.files[0]) return;\n\n    const fr = new FileReader();\n    fr.onload = () => { this._setImage(fr.result) }\n    fr.readAsDataURL(this.fileInputTarget.files[0]);\n  }\n\n  _initializeCropper() {\n    if (this.#cropper) return;\n    if (!this.hasImageTarget) return;\n\n    this.#cropper = new Cropper(this.imageTarget, {\n      viewMode: 2,\n      dragMode: 'move',\n      aspectRatio: 1,\n      autoCropArea: 1,\n      rotatable: false,\n      scalable: false,\n      data: this._initialCrop(),\n      crop: () => { this._crop() }\n    });\n  }\n\n  _setImage(src) {\n    if (this.#cropper) {\n      this.#cropper.replace(src)\n    } else {\n      const image = document.createElement('img')\n      image.src = src;\n      image.dataset.imageCropTarget = 'image'\n      this.wrapperTarget.insertBefore(image, null)\n      this._initializeCropper()\n    }\n  }\n\n  _crop() {\n    const data = this.#cropper.getData(false)\n    this.pictureXTarget.value = data.x;\n    this.pictureYTarget.value = data.y;\n    this.pictureWTarget.value = data.width;\n    this.pictureHTarget.value = data.height;\n  }\n\n  _initialCrop() {\n    let data = {}\n    if (this.hasPictureXTarget && this.pictureXTarget.value) {\n      data.x = parseFloat(this.pictureXTarget.value)\n    }\n    if (this.hasPictureYTarget && this.pictureYTarget.value) {\n      data.y = parseFloat(this.pictureYTarget.value)\n    }\n    if (this.hasPictureWTarget && this.pictureWTarget.value) {\n      data.width = parseFloat(this.pictureWTarget.value)\n    }\n    if (this.hasPictureHTarget && this.pictureHTarget.value) {\n      data.height = parseFloat(this.pictureHTarget.value)\n    }\n    return data;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"map\", \"latitude\", \"longitude\", \"placeId\"]\n\n  connect() {\n    this._updateMap();\n  }\n\n  changed() {\n    this._updateMap();\n  }\n\n  _updateMap() {\n    this.mapTarget.src = this._getMapsUrl();\n  }\n\n  _getMapsUrl() {\n    if (this.hasPlaceIdTarget && this.placeIdTarget.value) {\n      return \"https://www.google.com/maps/embed/v1/place?q=place_id:\" + this.placeIdTarget.value + \"&key=\" + this._mapsApiKey();\n    } else if (this.hasLatitudeTarget && this.hasLongitudeTarget && this.latitudeTarget.value && this.longitudeTarget.value) {\n      return \"https://www.google.com/maps/embed/v1/view?zoom=17&center=\" + this.latitudeTarget.value + \",\" + this.longitudeTarget.value + \"&key=\" + this._mapsApiKey();\n    }\n    return \"https://www.google.com/maps/embed/v1/place?q=place_id:ChIJu-SH28MJxkcRnwq9_851obM&key=\" + this._mapsApiKey();\n  }\n\n  _mapsApiKey() {\n    return this.mapTarget.dataset.apiKey\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"checkbox\", \"field\"]\n\n  connect() {\n    this._updateFields(this.checkboxTarget.checked);\n  }\n\n  handleChange() {\n    this._updateFields(this.checkboxTarget.checked);\n  }\n\n  _updateFields(disabled) {\n    this.fieldTargets.forEach(element => {\n      element.disabled = disabled\n    });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"autocomplete\", \"datalist\", \"input\"]\n\n  connect() {\n    this._buildDatalist()\n    this._buildInput()\n    this._hideSelect()\n    this._initialOption()\n  }\n\n  handleInput() {\n    this.autocompleteTarget.classList.remove('is-invalid')\n    this.autocompleteTarget.classList.remove('is-valid')\n    this._updateValue();\n  }\n\n  handleChange() {\n    this._updateValue();\n\n    if (this.inputTarget.value) return;\n\n    this.autocompleteTarget.classList.remove('is-valid')\n    this.autocompleteTarget.classList.add('is-invalid')\n  }\n\n  _buildDatalist() {\n    const datalist = document.createElement('datalist')\n    datalist.setAttribute('id', this.inputTarget.id + \"_datalist\")\n    datalist.dataset.selectAutocompleteTarget = 'datalist'\n    this.inputTarget.querySelectorAll('option').forEach(element => {\n      if (!element.value) return\n      \n      const option = document.createElement('option')\n      option.value = element.text\n      option.dataset.id = element.value\n      datalist.insertBefore(option, null)\n    })\n    this.element.insertBefore(datalist, this.element.firstChild)\n  }\n\n  _buildInput() {\n    const input = document.createElement('input')\n    input.setAttribute('id', this.inputTarget.id + \"_autocomplete\")\n    input.setAttribute('autocomplete', 'off')\n    input.setAttribute('list', this.inputTarget.id + \"_datalist\")\n    input.classList.add('form-control')\n    if (this.inputTarget.classList.contains('is-invalid')) {\n      input.classList.add('is-invalid')\n    }\n    input.dataset.action = 'change->select-autocomplete#handleChange input->select-autocomplete#handleInput'\n    input.dataset.selectAutocompleteTarget = 'autocomplete'\n    this.element.insertBefore(input, this.element.firstChild)\n  }\n\n  _hideSelect() {\n    this.inputTarget.classList.add('d-none')\n    this.inputTarget.classList.remove('is-invalid')\n    this.inputTarget.classList.remove('is-valid')\n  }\n\n  _initialOption() {\n    this.datalistTarget.querySelectorAll('option').forEach(element => {\n      if (element.dataset.id == this.inputTarget.value) {\n        this.autocompleteTarget.value = element.value\n        if (!this.autocompleteTarget.classList.contains('is-invalid')) {\n          this.autocompleteTarget.classList.add('is-valid')\n        }\n      }\n    });\n  }\n\n  _updateValue() {\n    this.inputTarget.value = null\n    this.datalistTarget.querySelectorAll('option').forEach(element => {\n      if (element.value == this.autocompleteTarget.value) {\n        this.inputTarget.value = element.dataset.id\n        this.autocompleteTarget.classList.remove('is-invalid')\n        this.autocompleteTarget.classList.add('is-valid')\n      }\n    });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { Tooltip } from 'bootstrap'\n\nexport default class extends Controller {\n  static targets = [\"trigger\"]\n\n  connect() {\n    return new Tooltip(this.triggerTarget)\n  }\n}\n", "// This file is auto-generated by ./bin/rails stimulus:manifest:update\n// Run that command whenever you add a new controller or create them with\n// ./bin/rails generate stimulus controllerName\n\nimport { application } from \"./application\"\n\nimport DateTimeInputController from \"./date_time_input_controller.js\"\napplication.register(\"date-time-input\", DateTimeInputController)\n\nimport FilteredTableController from \"./filtered_table_controller.js\"\napplication.register(\"filtered-table\", FilteredTableController)\n\nimport HeaderController from \"./header_controller.js\"\napplication.register(\"header\", HeaderController)\n\nimport HeaderRaceController from \"./header_race_controller.js\"\napplication.register(\"header-race\", HeaderRaceController)\n\nimport ImageCropController from \"./image_crop_controller.js\"\napplication.register(\"image-crop\", ImageCropController)\n\nimport MapsEmbedInputController from \"./maps_embed_input_controller.js\"\napplication.register(\"maps-embed-input\", MapsEmbedInputController)\n\nimport OptionalFieldsController from \"./optional_fields_controller.js\"\napplication.register(\"optional-fields\", OptionalFieldsController)\n\nimport SelectAutocompleteController from \"./select_autocomplete_controller.js\"\napplication.register(\"select-autocomplete\", SelectAutocompleteController)\n\nimport TooltipController from \"./tooltip_controller.js\"\napplication.register(\"tooltip\", TooltipController)\n"],
  "mappings": "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,KAAK,KAAK,KAAK,KAAK,GAAG,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AASluC,eAAW,YAAY,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAIjhC,MAAE,YAAY,SAAU,MAAM;AAC7B,UAAI,IAAI,KAAK,QAAM,GAAG,IAAI,KAAK,QAAO;AACtC,UAAG,KAAK,KAAK,KAAK,GAAG;AAAE,eAAO;AAAA;AAC9B,UAAI,IAAI,KAAK,IAAI,KAAK,SAAS;AAC/B,aAAQ,SAAQ,IAAI,SAAS,aAAa,IAAI,IAAE,IAAE,GAAE,IAAE,IAAE,GAAE,IAAE,IAAE,GAAE,IAAE,IAAE;AAAA;AAIrE,MAAE,QAAQ,WAAW;AACpB,aAAO,IAAI,WAAW,KAAK,OAAO,KAAK,OAAO,KAAK;AAAA;AAIpD,MAAE,WAAW,WAAW;AACvB,aAAO;AAAA;AAOR,MAAE,eAAe,SAAU,WAAW;AACrC,UAAI,UAAU,KAAK,UAAU;AAC7B,UAAI,MAAM,YAAY,UAAU;AAAG,eAAO;AAC1C,UAAI,UAAU,KAAK,UAAU;AAC7B,UAAI,MAAM,YAAY,UAAU;AAAG,eAAO;AAC1C,UAAI,WAAW,KAAK,WAAW;AAAG,eAAO;AAEzC,UAAI,aAAa,KAAK;AACtB,UAAI,MAAM,eAAe,aAAa;AAAG,qBAAa;AACtD,oBAAc;AACd,UAAI,aAAa;AAAG,qBAAa;AACjC,UAAI,aAAa;AAAG,qBAAa;AAEjC,UAAI,KAAK,UAAU;AACnB,UAAI,IAAE,GAAG,IAAE,GAAG,IAAE,GAAG,KAAE,GAAG,KAAG,GAAG,KAAG,GAAG,KAAG,GAAG,IAAE,GAAG,IAAE,GAAG,IAAE,GAAG,IAAE,GAAG,KAAG,GAAG,KAAG,GAAG,KAAG,GAAG,KAAG;AAEnF,UAAI,OAAQ,UAAU,UAAU,IAAK;AACrC,UAAI,OAAQ,UAAU,UAAU,IAAK;AACrC,UAAI,IAAI,UAAU,QAAQ;AAC1B,UAAI,IAAI,UAAU,SAAS;AAE3B,UAAI,KAAM,IAAI,IAAK;AACnB,UAAI,KAAM,IAAI,IAAK;AACnB,UAAI,OAAQ,UAAU,IAAK;AAC3B,UAAI,OAAQ,UAAU,IAAK;AAE3B,UAAI,MAAM,EAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE;AACzB,UAAI,KAAK;AACT,WAAM,IAAI,GAAG,IAAI,MAAM,KACvB;AACC,aAAK,GAAG,IAAI,EAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE;AAAA;AAE5B,SAAG,IAAI;AAEP,UAAI,MAAM,EAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE;AACzB,UAAI,KAAK;AACT,WAAM,IAAI,GAAG,IAAI,MAAM,KACvB;AACC,aAAK,GAAG,IAAI,EAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE;AAAA;AAE5B,SAAG,IAAI;AAEP,UAAI,KAAK;AAGT,UAAI,MAAM,WAAW,UAAU,WAAW;AAC1C,UAAI,MAAM,WAAW,UAAU,WAAW;AAC1C,UAAI,MAAM,WAAW,UAAU,WAAW;AAC1C,UAAI,MAAM,WAAW,UAAU,WAAW;AAE1C,aAAO,eAAe,GAAG;AAExB,aAAK,KAAK;AACV,YAAI,KAAK;AACT,YAAI,KAAK;AACT,aAAK,IAAI,GAAG,EAAE,IAAI,MAAK;AACtB,cAAI,OAAQ,MAAK,GAAI,KAAM;AAC3B,cAAI,OAAQ,MAAK,GAAI,KAAK,IAAK;AAC/B,cAAI,OAAQ,MAAK,GAAI,KAAK,IAAK;AAC/B,cAAI,OAAQ,MAAK,GAAI,KAAK,IAAK;AAE/B,eAAK;AAEL,eAAK,IAAI,MAAM,EAAE,IAAI,MACrB;AACC,eAAG,IAAI;AACP,eAAG,IAAI;AACP,eAAG,IAAI;AACP,eAAG,IAAI;AACP,iBAAK,GAAG;AAAA;AAGT,eAAK,IAAI,GAAG,IAAI,MAAM,KACtB;AACC,iBAAK,KAAO,OAAK,IAAI,KAAK,MAAM,KAAM;AACtC,iBAAO,GAAG,IAAI,GAAG;AACjB,iBAAO,GAAG,IAAI,GAAG,KAAE;AACnB,iBAAO,GAAG,IAAI,GAAG,KAAE;AACnB,iBAAO,GAAG,IAAI,GAAG,KAAE;AAEnB,iBAAK,GAAG;AAAA;AAGT,eAAK;AACL,eAAM,IAAI,GAAG,IAAI,GAAG,KACpB;AACC,eAAG,QAAS,IAAI,OAAQ;AACxB,eAAG,QAAS,IAAI,OAAQ;AACxB,eAAG,QAAS,IAAI,OAAQ;AACxB,eAAG,QAAS,IAAI,OAAQ;AAExB,iBAAM,KAAO,OAAI,IAAI,UAAU,KAAK,KAAK,KAAI,OAAQ;AAErD,iBAAK,GAAG,IAAM,IAAG,IAAI,GAAG;AACxB,iBAAK,GAAG,IAAM,IAAG,IAAI,GAAG,KAAE;AAC1B,iBAAK,GAAG,IAAM,IAAG,IAAI,GAAG,KAAE;AAC1B,iBAAK,GAAG,IAAM,IAAG,IAAI,GAAG,KAAE;AAE1B,iBAAK,GAAG;AAAA;AAGT,gBAAM;AAAA;AAGP,aAAK;AACL,aAAK;AACL,aAAK,IAAI,GAAG,IAAI,GAAG,KAAK;AACvB,eAAM,KAAK,IAAK;AAEhB,cAAK,OAAQ,MAAK,GAAG,OAAQ;AAC7B,cAAK,OAAQ,MAAK,GAAI,KAAK,IAAK,MAAO;AACvC,cAAK,OAAQ,MAAK,GAAI,KAAK,IAAK,MAAO;AACvC,cAAK,OAAQ,MAAK,GAAI,KAAK,IAAK,MAAO;AAEvC,eAAK;AACL,eAAK,IAAI,GAAG,IAAI,MAAM,KACtB;AACC,eAAG,IAAI;AACP,eAAG,IAAI;AACP,eAAG,IAAI;AACP,eAAG,IAAI;AACP,iBAAK,GAAG;AAAA;AAGT,eAAK;AAEL,eAAK,IAAI,GAAG,KAAK,SAAS,KAC1B;AACC,iBAAO,KAAK,KAAO;AAEnB,iBAAO,GAAG,IAAI,GAAG;AACjB,iBAAO,GAAG,IAAI,GAAG,KAAG;AACpB,iBAAO,GAAG,IAAI,GAAG,KAAG;AACpB,iBAAO,GAAG,IAAI,GAAG,KAAG;AAEpB,iBAAK,GAAG;AAER,gBAAI,IAAI,IACR;AACC,oBAAM;AAAA;AAAA;AAIR,eAAK;AACL,eAAK;AACL,cAAK,aAAa,GAClB;AACC,iBAAM,IAAI,GAAG,IAAI,GAAG,KACpB;AACC,mBAAI,MAAM;AACV,iBAAG,KAAE,KAAK,KAAK,IAAI,OAAQ;AAC3B,kBAAK,KAAK,GACV;AACC,mBAAG,MAAS,IAAI,OAAQ;AACxB,mBAAG,KAAE,KAAO,IAAI,OAAQ;AACxB,mBAAG,KAAE,KAAO,IAAI,OAAQ;AAAA,qBAClB;AACN,mBAAG,MAAK,GAAG,KAAE,KAAK,GAAG,KAAE,KAAK;AAAA;AAG7B,mBAAM,IAAS,OAAI,IAAI,QAAQ,KAAK,KAAI,MAAO,KAAQ;AAEvD,mBAAK,GAAG,IAAM,IAAG,IAAI,GAAG;AACxB,mBAAK,GAAG,IAAM,IAAG,IAAI,GAAG,KAAE;AAC1B,mBAAK,GAAG,IAAM,IAAG,IAAI,GAAG,KAAE;AAC1B,mBAAK,GAAG,IAAM,IAAG,IAAI,GAAG,KAAE;AAE1B,mBAAK,GAAG;AAER,oBAAM;AAAA;AAAA,iBAED;AACN,iBAAM,IAAI,GAAG,IAAI,GAAG,KACpB;AACC,mBAAI,MAAM;AACV,iBAAG,KAAE,KAAK,KAAK,IAAI,OAAQ;AAC3B,kBAAK,KAAK,GACV;AACC,qBAAK,MAAM;AACX,mBAAG,MAAS,KAAI,OAAQ,MAAO;AAC/B,mBAAG,KAAE,KAAO,KAAI,OAAQ,MAAO;AAC/B,mBAAG,KAAE,KAAO,KAAI,OAAQ,MAAO;AAAA,qBACzB;AACN,mBAAG,MAAK,GAAG,KAAE,KAAK,GAAG,KAAE,KAAK;AAAA;AAG7B,mBAAM,IAAS,OAAI,IAAI,QAAQ,KAAK,KAAI,MAAO,KAAQ;AAEvD,mBAAK,GAAG,IAAM,IAAG,IAAI,GAAG;AACxB,mBAAK,GAAG,IAAM,IAAG,IAAI,GAAG,KAAE;AAC1B,mBAAK,GAAG,IAAM,IAAG,IAAI,GAAG,KAAE;AAC1B,mBAAK,GAAG,IAAM,IAAG,IAAI,GAAG,KAAE;AAE1B,mBAAK,GAAG;AAER,oBAAM;AAAA;AAAA;AAAA;AAAA;AAMV,aAAO;AAAA;AAGR,aAAS,aAAa,SAAS,QAAQ,YAAY;AAAA;AAOpD,EAAC,YAAY;AACZ;AAiCA,4BAAwB,UAAU;AACjC,WAAK;AASL,WAAK,WAAW;AAShB,WAAK,YAAY;AAOjB,WAAK,WAAW;AAChB,WAAK,cAAc;AAEnB,WAAK,mBACJ;AAAA;AAYF,QAAI,IAAI,SAAS,OAAO,gBAAgB,SAAS;AAMjD,MAAE,mBAAmB,SAAS,IAAI,OAAO,eAAe;AACvD,UAAG,CAAC,KAAK,aAAa;AAAE,aAAK,cAAc,GAAG;AAAA;AAE9C,SAAG,cAAc,GAAG;AACpB,SAAG,YAAY,GAAG,YAAY,KAAK;AACnC,YAAM,iBAAiB;AACvB,SAAG,WAAW,GAAG,YAAY,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe,KAAK;AAEzE,SAAG,UACF,GAAG,mBAAmB,eAAe,kBACrC;AAAA;AAMF,MAAE,QAAQ,WAAY;AACrB,UAAI,IAAI,IAAI,eAAe,KAAK;AAChC,QAAE,YAAY,KAAK;AACnB,QAAE,WAAW,KAAK;AAClB,aAAO;AAAA;AAIR,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAMR,MAAE,eAAe,SAAU,WAAW;AACrC,UAAI,CAAC,KAAK,UAAU;AAAE,eAAO;AAAA;AAC7B,UAAI,CAAC,KAAK,iBAAiB;AAAE,eAAO;AAAA;AAGpC,UAAI,OAAO,UAAU;AACrB,UAAI,MAAM,KAAK;AACf,eAAQ,IAAE,GAAG,IAAE,KAAK,QAAQ,IAAE,GAAG,KAAK,GAAG;AAAE,aAAK,IAAI,KAAK,IAAI,MAAM;AAAA;AAEnE,aAAO;AAAA;AAOR,MAAE,gBAAgB,WAAY;AAC7B,UAAI,CAAC,KAAK,UAAU;AAAE,eAAO;AAAA;AAC7B,UAAI,KAAK,YAAY,KAAK,aAAa,KAAK,UAAU;AAAE,eAAO;AAAA;AAE/D,WAAK,WAAW;AAChB,UAAI,MAAM,KAAK,YAAY,KAAK;AAChC,UAAI,SAAS;AACb,UAAI;AACJ,UAAI,eAAe,mBAAmB;AACrC,cAAM,OAAO,WAAW;AAAA,aAClB;AACN,iBAAS,SAAS,eAAe,SAAS,iBAAiB,SAAS,cAAc;AAClF,eAAO,QAAQ,IAAI;AACnB,eAAO,SAAS,IAAI;AACpB,cAAM,OAAO,WAAW;AACxB,YAAI,UAAU,KAAK,GAAG;AAAA;AAGvB,UAAI;AACH,YAAI,UAAU,IAAI,aAAa,GAAG,GAAG,IAAI,OAAO,IAAI;AAAA,eAC5C,GAAP;AAED,eAAO;AAAA;AAGR,WAAK,WAAW,QAAQ;AACxB,aAAO;AAAA;AAIR,aAAS,iBAAiB,SAAS,QAAQ,gBAAgB;AAAA;AAO5D,EAAC,YAAY;AACZ;AAgCA,6BAAyB,MAAM;AAC9B,WAAK;AAQL,WAAK,OAAO;AAGZ,WAAK,cAAc;AAEnB,WAAK,mBACJ;AAAA;AAUF,QAAI,IAAI,SAAS,OAAO,iBAAiB,SAAS;AAMlD,MAAE,mBAAmB,SAAS,IAAI,OAAO,eAAe;AACvD,UAAG,CAAC,KAAK,aAAa;AAAE,aAAK,cAAc,GAAG;AAAA;AAE9C,SAAG,cAAc,GAAG;AACpB,SAAG,YAAY,GAAG,YAAY,KAAK;AACnC,YAAM,iBAAiB;AACvB,SAAG,WAAW,GAAG,YAAY,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe,KAAK;AAEzE,SAAG,UACF,GAAG,mBAAmB,eAAe,kBACrC;AAAA;AAqBF,MAAE,cAAc,SAAU,KAAK,GAAG,GAAG,OAAO,QAAQ,WAAW,SAAS,SAAS;AAChF,UAAI,CAAC,KAAK,MAAM;AAAE,eAAO;AAAA;AACzB,kBAAY,aAAa;AACzB,UAAI,WAAW,MAAM;AAAE,kBAAU;AAAA;AACjC,UAAI,WAAW,MAAM;AAAE,kBAAU;AAAA;AAEjC,gBAAU;AACV,UAAI,OAAO,WAAW;AAGrB,eAAO;AAAA;AAGR,gBAAU,2BAA2B;AACrC,gBAAU,UAAU,KAAK,MAAM,SAAS;AACxC,gBAAU;AACV,aAAO;AAAA;AAIR,MAAE,QAAQ,WAAY;AACrB,aAAO,IAAI,gBAAgB,KAAK;AAAA;AAIjC,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAIR,aAAS,kBAAkB,SAAS,QAAQ,iBAAiB;AAAA;AAO9D,EAAC,YAAW;AACX;AAoCA,yBAAqB,eAAe,iBAAiB,gBAAgB,iBAAiB,WAAW,aAAa,YAAY,aAAa;AACtI,WAAK;AAQL,WAAK,gBAAgB,iBAAiB,OAAO,gBAAgB;AAO7D,WAAK,kBAAkB,mBAAmB,OAAO,kBAAkB;AAOnE,WAAK,iBAAiB,kBAAkB,OAAO,iBAAiB;AAOhE,WAAK,kBAAkB,mBAAmB,OAAO,kBAAkB;AAOnE,WAAK,YAAY,aAAa;AAO9B,WAAK,cAAc,eAAe;AAOlC,WAAK,aAAa,cAAc;AAOhC,WAAK,cAAc,eAAe;AAElC,WAAK,mBACJ;AAAA;AAWF,QAAI,IAAI,SAAS,OAAO,aAAa,SAAS;AAQ9C,MAAE,mBAAmB,SAAS,IAAI,OAAO,eAAe;AACvD,SAAG,UACF,GAAG,mBAAmB,eAAe,qBACrC,KAAK,eAAe,KAAK,iBAAiB,KAAK,gBAAgB,KAAK;AAGrE,SAAG,UACF,GAAG,mBAAmB,eAAe,iBACrC,KAAK,YAAU,KAAK,KAAK,cAAY,KAAK,KAAK,aAAW,KAAK,KAAK,cAAY;AAAA;AAKlF,MAAE,WAAW,WAAW;AACvB,aAAO;AAAA;AAIR,MAAE,QAAQ,WAAW;AACpB,aAAO,IAAI,YACV,KAAK,eAAe,KAAK,iBAAiB,KAAK,gBAAgB,KAAK,iBACpE,KAAK,WAAW,KAAK,aAAa,KAAK,YAAY,KAAK;AAAA;AAM1D,MAAE,eAAe,SAAS,WAAW;AACpC,UAAI,OAAO,UAAU;AACrB,UAAI,IAAI,KAAK;AACb,eAAS,IAAE,GAAG,IAAE,GAAG,KAAG,GAAG;AACxB,aAAK,KAAK,KAAK,KAAG,KAAK,gBAAc,KAAK;AAC1C,aAAK,IAAE,KAAK,KAAK,IAAE,KAAG,KAAK,kBAAgB,KAAK;AAChD,aAAK,IAAE,KAAK,KAAK,IAAE,KAAG,KAAK,iBAAe,KAAK;AAC/C,aAAK,IAAE,KAAK,KAAK,IAAE,KAAG,KAAK,kBAAgB,KAAK;AAAA;AAEjD,aAAO;AAAA;AAIR,aAAS,cAAc,SAAS,QAAQ,aAAa;AAAA;AAOtD,EAAC,YAAW;AACX;AAqBA,yBAAqB,YAAY,UAAU,YAAY,KAAK;AAC3D,WAAK,SAAS,YAAY,UAAU,YAAY;AAAA;AAEjD,QAAI,IAAI,YAAY;AAUpB,gBAAY,cAAc;AAAA,MACzB;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtD;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtD;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtD;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtD;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtD;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtD;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtD;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtD;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtD;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtD;AAAA;AAUD,gBAAY,kBAAkB;AAAA,MAC7B;AAAA,MAAE;AAAA,MAAE;AAAA,MAAE;AAAA,MAAE;AAAA,MACR;AAAA,MAAE;AAAA,MAAE;AAAA,MAAE;AAAA,MAAE;AAAA,MACR;AAAA,MAAE;AAAA,MAAE;AAAA,MAAE;AAAA,MAAE;AAAA,MACR;AAAA,MAAE;AAAA,MAAE;AAAA,MAAE;AAAA,MAAE;AAAA,MACR;AAAA,MAAE;AAAA,MAAE;AAAA,MAAE;AAAA,MAAE;AAAA;AAUT,gBAAY,SAAS,YAAY,gBAAgB;AAcjD,MAAE,WAAW,SAAS,YAAW,UAAS,YAAW,KAAK;AACzD,aAAO,KAAK,QAAQ,YAAY,YAAW,UAAS,YAAW;AAAA;AAShE,MAAE,QAAQ,WAAW;AACpB,aAAO,KAAK,KAAK,YAAY;AAAA;AAe9B,MAAE,cAAc,SAAS,YAAW,UAAS,YAAW,KAAK;AAC5D,WAAK,UAAU;AACf,WAAK,eAAe;AACpB,WAAK,iBAAiB;AACtB,aAAO,KAAK,iBAAiB;AAAA;AAW9B,MAAE,mBAAmB,SAAS,OAAO;AACpC,UAAI,SAAS,KAAK,MAAM,QAAQ;AAAE,eAAO;AAAA;AACzC,cAAQ,KAAK,YAAY,OAAM;AAC/B,WAAK,gBAAgB;AAAA,QACpB;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QACR;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QACR;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QACR;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QACR;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA;AAET,aAAO;AAAA;AAWR,MAAE,iBAAiB,SAAS,OAAO;AAClC,UAAI,SAAS,KAAK,MAAM,QAAQ;AAAE,eAAO;AAAA;AACzC,cAAQ,KAAK,YAAY,OAAM;AAC/B,UAAI;AACJ,UAAI,QAAM,GAAG;AACZ,YAAI,MAAI,QAAM,MAAI;AAAA,aACZ;AACN,YAAI,QAAM;AACV,YAAI,KAAK,GAAG;AACX,cAAI,YAAY,YAAY;AAAA,eACtB;AACN,cAAI,YAAY,YAAa,SAAO,KAAK,KAAE,KAAG,YAAY,YAAa,UAAO,KAAG,KAAG;AAAA;AAErF,YAAI,IAAE,MAAI;AAAA;AAEX,WAAK,gBAAgB;AAAA,QACpB,IAAE;AAAA,QAAI;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE,MAAK,OAAI;AAAA,QACrB;AAAA,QAAE,IAAE;AAAA,QAAI;AAAA,QAAE;AAAA,QAAE,MAAK,OAAI;AAAA,QACrB;AAAA,QAAE;AAAA,QAAE,IAAE;AAAA,QAAI;AAAA,QAAE,MAAK,OAAI;AAAA,QACrB;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QACR;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA;AAET,aAAO;AAAA;AAWR,MAAE,mBAAmB,SAAS,OAAO;AACpC,UAAI,SAAS,KAAK,MAAM,QAAQ;AAAE,eAAO;AAAA;AACzC,cAAQ,KAAK,YAAY,OAAM;AAC/B,UAAI,IAAI,IAAI,SAAQ,IAAK,IAAE,QAAM,MAAM,QAAM;AAC7C,UAAI,OAAO;AACX,UAAI,OAAO;AACX,UAAI,OAAO;AACX,WAAK,gBAAgB;AAAA,QACpB,OAAM,KAAE,KAAG;AAAA,QAAE,OAAM,KAAE;AAAA,QAAG,OAAM,KAAE;AAAA,QAAG;AAAA,QAAE;AAAA,QACrC,OAAM,KAAE;AAAA,QAAG,OAAM,KAAE,KAAG;AAAA,QAAE,OAAM,KAAE;AAAA,QAAG;AAAA,QAAE;AAAA,QACrC,OAAM,KAAE;AAAA,QAAG,OAAM,KAAE;AAAA,QAAG,OAAM,KAAE,KAAG;AAAA,QAAE;AAAA,QAAE;AAAA,QACrC;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QACR;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA;AAET,aAAO;AAAA;AAWR,MAAE,YAAY,SAAS,OAAO;AAC7B,UAAI,SAAS,KAAK,MAAM,QAAQ;AAAE,eAAO;AAAA;AACzC,cAAQ,KAAK,YAAY,OAAM,OAAK,MAAI,KAAK;AAC7C,UAAI,SAAS,KAAK,IAAI;AACtB,UAAI,SAAS,KAAK,IAAI;AACtB,UAAI,OAAO;AACX,UAAI,OAAO;AACX,UAAI,OAAO;AACX,WAAK,gBAAgB;AAAA,QACpB,OAAK,SAAQ,KAAE,QAAM,SAAQ,CAAC;AAAA,QAAM,OAAK,SAAQ,CAAC,OAAM,SAAQ,CAAC;AAAA,QAAM,OAAK,SAAQ,CAAC,OAAM,SAAQ,KAAE;AAAA,QAAM;AAAA,QAAE;AAAA,QAC7G,OAAK,SAAQ,CAAC,OAAM,SAAQ;AAAA,QAAO,OAAK,SAAQ,KAAE,QAAM,SAAQ;AAAA,QAAO,OAAK,SAAQ,CAAC,OAAM,SAAQ;AAAA,QAAQ;AAAA,QAAE;AAAA,QAC7G,OAAK,SAAQ,CAAC,OAAM,SAAQ,CAAE,KAAE;AAAA,QAAO,OAAK,SAAQ,CAAC,OAAM,SAAQ;AAAA,QAAM,OAAK,SAAQ,KAAE,QAAM,SAAQ;AAAA,QAAM;AAAA,QAAE;AAAA,QAC9G;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QACR;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA,QAAE;AAAA;AAET,aAAO;AAAA;AAUR,MAAE,SAAS,SAAS,QAAQ;AAC3B,eAAS,KAAK,WAAW;AACzB,UAAI,OAAO,UAAU,YAAY,QAAQ;AAAE,eAAO;AAAA;AAClD,WAAK,gBAAgB;AACrB,aAAO;AAAA;AAQR,MAAE,QAAQ,WAAW;AACpB,aAAQ,IAAI,cAAe,KAAK;AAAA;AAQjC,MAAE,UAAU,WAAW;AACtB,UAAI,MAAM;AACV,eAAS,IAAG,GAAG,IAAE,YAAY,QAAQ,IAAE,GAAG,KAAK;AAC9C,YAAI,KAAK,KAAK;AAAA;AAEf,aAAO;AAAA;AAUR,MAAE,OAAO,SAAS,QAAQ;AACzB,UAAI,IAAI,YAAY;AACpB,eAAS,IAAE,GAAE,IAAE,GAAE,KAAK;AACrB,aAAK,KAAK,OAAO;AAAA;AAElB,aAAO;AAAA;AAQR,MAAE,WAAW,WAAW;AACvB,aAAO;AAAA;AAUR,MAAE,kBAAkB,SAAS,QAAQ;AACpC,UAAI,GAAG,GAAG,GAAG,MAAM;AAEnB,WAAK,IAAE,GAAE,IAAE,GAAE,KAAK;AACjB,aAAK,IAAE,GAAE,IAAE,GAAE,KAAK;AACjB,cAAI,KAAK,KAAK,IAAE,IAAE;AAAA;AAEnB,aAAK,IAAE,GAAE,IAAE,GAAE,KAAK;AACjB,cAAI,MAAI;AACR,eAAK,IAAE,GAAE,IAAE,GAAE,KAAK;AACjB,mBAAO,OAAO,IAAE,IAAE,KAAG,IAAI;AAAA;AAE1B,eAAK,IAAE,IAAE,KAAK;AAAA;AAAA;AAAA;AAYjB,MAAE,cAAc,SAAS,OAAO,OAAO;AACtC,aAAO,KAAK,IAAI,OAAM,KAAK,IAAI,CAAC,OAAM;AAAA;AASvC,MAAE,aAAa,SAAS,QAAQ;AAC/B,UAAI,kBAAkB,aAAa;AAAE,iBAAS,OAAO;AAAA;AACrD,UAAI,OAAO,SAAS,YAAY,QAAQ;AACvC,iBAAS,OAAO,MAAM,GAAE,OAAO,QAAQ,OAAO,YAAY,gBAAgB,MAAM,OAAO,QAAO,YAAY;AAAA,iBAChG,OAAO,SAAS,YAAY,QAAQ;AAC9C,iBAAS,OAAO,MAAM,GAAE,YAAY;AAAA;AAErC,aAAO;AAAA;AAIR,aAAS,cAAc;AAAA;AAOxB,EAAC,YAAW;AACX;AA6BA,+BAA2B,QAAQ;AAClC,WAAK;AAQL,WAAK,SAAS;AAEd,WAAK,mBACJ;AAAA;AAiBF,QAAI,IAAI,SAAS,OAAO,mBAAmB,SAAS;AAMpD,MAAE,mBAAmB,SAAS,IAAI,OAAO,eAAe;AACvD,UAAI,MAAM,KAAK;AACf,UAAI,cAAc,IAAI,aAAa;AAAA,QAClC,IAAI;AAAA,QAAG,IAAI;AAAA,QAAG,IAAI;AAAA,QAAG,IAAI;AAAA,QACzB,IAAI;AAAA,QAAG,IAAI;AAAA,QAAG,IAAI;AAAA,QAAG,IAAI;AAAA,QACzB,IAAI;AAAA,QAAI,IAAI;AAAA,QAAI,IAAI;AAAA,QAAI,IAAI;AAAA,QAC5B,IAAI;AAAA,QAAI,IAAI;AAAA,QAAI,IAAI;AAAA,QAAI,IAAI;AAAA;AAG7B,SAAG,iBACF,GAAG,mBAAmB,eAAe,iBACrC,OAAO;AAER,SAAG,UACF,GAAG,mBAAmB,eAAe,uBACrC,IAAI,KAAG,KAAK,IAAI,KAAG,KAAK,IAAI,MAAI,KAAK,IAAI,MAAI;AAAA;AAM/C,MAAE,WAAW,WAAW;AACvB,aAAO;AAAA;AAIR,MAAE,QAAQ,WAAW;AACpB,aAAO,IAAI,kBAAkB,KAAK;AAAA;AAKnC,MAAE,eAAe,SAAS,WAAW;AACpC,UAAI,OAAO,UAAU;AACrB,UAAI,IAAI,KAAK;AACb,UAAI,GAAE,GAAE,GAAE;AACV,UAAI,MAAM,KAAK;AACf,UAAI,KAAM,IAAI,IAAK,KAAM,IAAI,IAAK,KAAM,IAAI,IAAK,KAAM,IAAI,IAAK,KAAM,IAAI;AAC1E,UAAI,KAAM,IAAI,IAAK,KAAM,IAAI,IAAK,KAAM,IAAI,IAAK,KAAM,IAAI,IAAK,KAAM,IAAI;AAC1E,UAAI,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI;AAC1E,UAAI,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI;AAE1E,eAAS,IAAE,GAAG,IAAE,GAAG,KAAG,GAAG;AACxB,YAAI,KAAK;AACT,YAAI,KAAK,IAAE;AACX,YAAI,KAAK,IAAE;AACX,YAAI,KAAK,IAAE;AACX,aAAK,KAAK,IAAE,KAAG,IAAE,KAAG,IAAE,KAAG,IAAE,KAAG;AAC9B,aAAK,IAAE,KAAK,IAAE,KAAG,IAAE,KAAG,IAAE,KAAG,IAAE,KAAG;AAChC,aAAK,IAAE,KAAK,IAAE,MAAI,IAAE,MAAI,IAAE,MAAI,IAAE,MAAI;AACpC,aAAK,IAAE,KAAK,IAAE,MAAI,IAAE,MAAI,IAAE,MAAI,IAAE,MAAI;AAAA;AAErC,aAAO;AAAA;AAGR,aAAS,oBAAoB,SAAS,QAAQ,mBAAmB;AAAA;AAOlE,EAAC,YAAW;AACX;AAuBA,qBAAiB;AAChB,YAAM;AAAA;AAWP,UAAM,cAAc,WAAW;AAC9B,aAAO,CAAC,CAAG,mBAAkB,UACxB,OAAO,UAAU,uBAAuB,OAAO,UAAU,sBAAsB,KAC/E,OAAO,UAAU,qBAAqB,OAAO,UAAU,oBAAoB;AAAA;AAiBjF,UAAM,SAAS,SAAS,OAAO,aAAa,cAAc;AACzD,UAAI,CAAC,SAAS,CAAC,MAAM,UAAU,CAAC,MAAM,eAAe;AAAE,eAAO;AAAA;AAC9D,UAAI,MAAM,SAAS;AAAE,eAAO;AAAA;AAG5B,YAAM,UAAU,EAAC,UAAS,IAAI,YAAW,CAAC,aAAa,gBAAe,CAAC,cAAc,OAAM;AAI3F,UAAI,kBAAkB,QAAQ;AAAE,cAAM,YAAY;AAAA,iBACzC,OAAO,UAAU,uBAAuB,OAAO,UAAU,mBAAmB;AAAE,cAAM,WAAW;AAAA;AACxG,aAAO;AAAA;AASR,UAAM,UAAU,SAAS,OAAO;AAC/B,UAAI,CAAC,OAAO;AAAE;AAAA;AACd,UAAI,kBAAkB,QAAQ;AAAE,cAAM,aAAa;AAAA,iBAC1C,OAAO,UAAU,uBAAuB,OAAO,UAAU,mBAAmB;AAAE,cAAM,YAAY;AAAA;AAEzG,aAAO,MAAM;AAAA;AAWd,UAAM,cAAc,SAAS,OAAO;AACnC,UAAI,SAAS,MAAM;AACnB,UAAI,IAAI,MAAM,QAAQ,IAAI,SAAS,GAAG;AAAE,cAAM,iBAAiB,OAAM;AAAA;AACrE,aAAO,iBAAiB,cAAc,GAAG;AACzC,aAAO,iBAAiB,aAAa,GAAG;AACxC,aAAO,iBAAiB,YAAY,GAAG;AACvC,aAAO,iBAAiB,eAAe,GAAG;AAAA;AAS3C,UAAM,eAAe,SAAS,OAAO;AACpC,UAAI,SAAS,MAAM;AACnB,UAAI,CAAC,QAAQ;AAAE;AAAA;AACf,UAAI,IAAI,MAAM,QAAQ;AACtB,aAAO,oBAAoB,cAAc,GAAG;AAC5C,aAAO,oBAAoB,aAAa,GAAG;AAC3C,aAAO,oBAAoB,YAAY,GAAG;AAC1C,aAAO,oBAAoB,eAAe,GAAG;AAAA;AAU9C,UAAM,mBAAmB,SAAS,OAAO,GAAG;AAC3C,UAAI,CAAC,OAAO;AAAE;AAAA;AACd,UAAI,MAAM,QAAQ,gBAAgB;AAAE,UAAE,kBAAgB,EAAE;AAAA;AACxD,UAAI,UAAU,EAAE;AAChB,UAAI,OAAO,EAAE;AACb,eAAS,IAAG,GAAE,IAAE,QAAQ,QAAQ,IAAE,GAAG,KAAK;AACzC,YAAI,QAAQ,QAAQ;AACpB,YAAI,KAAK,MAAM;AACf,YAAI,MAAM,UAAU,MAAM,QAAQ;AAAE;AAAA;AAEpC,YAAI,QAAQ,cAAc;AACzB,eAAK,aAAa,OAAO,IAAI,GAAG,MAAM,OAAO,MAAM;AAAA,mBACzC,QAAQ,aAAa;AAC/B,eAAK,YAAY,OAAO,IAAI,GAAG,MAAM,OAAO,MAAM;AAAA,mBACxC,QAAQ,cAAc,QAAQ,eAAe;AACvD,eAAK,WAAW,OAAO,IAAI;AAAA;AAAA;AAAA;AAW9B,UAAM,aAAa,SAAS,OAAO;AAClC,UAAI,SAAS,MAAM;AACnB,UAAI,IAAI,MAAM,QAAQ,IAAI,SAAS,GAAG;AAAE,cAAM,gBAAgB,OAAM;AAAA;AAEpE,UAAI,OAAO,UAAU,sBAAsB,QAAW;AACrD,eAAO,iBAAiB,iBAAiB,GAAG;AAC5C,eAAO,iBAAiB,iBAAiB,GAAG;AAC5C,eAAO,iBAAiB,eAAe,GAAG;AAC1C,eAAO,iBAAiB,mBAAmB,GAAG;AAC9C,YAAI,MAAM,QAAQ,gBAAgB;AAAE,iBAAO,MAAM,gBAAgB;AAAA;AAAA,aAC3D;AACN,eAAO,iBAAiB,eAAe,GAAG;AAC1C,eAAO,iBAAiB,eAAe,GAAG;AAC1C,eAAO,iBAAiB,aAAa,GAAG;AACxC,eAAO,iBAAiB,iBAAiB,GAAG;AAC5C,YAAI,MAAM,QAAQ,gBAAgB;AAAE,iBAAO,MAAM,cAAc;AAAA;AAAA;AAGhE,YAAM,QAAQ,YAAY;AAAA;AAS3B,UAAM,cAAc,SAAS,OAAO;AACnC,UAAI,IAAI,MAAM,QAAQ;AAEtB,UAAI,OAAO,UAAU,sBAAsB,QAAW;AACrD,eAAO,oBAAoB,iBAAiB,GAAG;AAC/C,eAAO,oBAAoB,eAAe,GAAG;AAC7C,eAAO,oBAAoB,mBAAmB,GAAG;AACjD,YAAI,MAAM,QAAQ;AACjB,gBAAM,OAAO,oBAAoB,iBAAiB,GAAG;AAAA;AAAA,aAEhD;AACN,eAAO,oBAAoB,eAAe,GAAG;AAC7C,eAAO,oBAAoB,aAAa,GAAG;AAC3C,eAAO,oBAAoB,iBAAiB,GAAG;AAC/C,YAAI,MAAM,QAAQ;AACjB,gBAAM,OAAO,oBAAoB,eAAe,GAAG;AAAA;AAAA;AAAA;AAYtD,UAAM,kBAAkB,SAAS,OAAO,GAAG;AAC1C,UAAI,CAAC,OAAO;AAAE;AAAA;AACd,UAAI,MAAM,QAAQ,gBAAgB;AAAE,UAAE,kBAAkB,EAAE;AAAA;AAC1D,UAAI,OAAO,EAAE;AACb,UAAI,KAAK,EAAE;AACX,UAAI,MAAM,MAAM,QAAQ;AAExB,UAAI,QAAQ,mBAAmB,QAAQ,eAAe;AACrD,YAAI,EAAE,cAAc,MAAM,QAAQ;AAAE;AAAA;AACpC,YAAI,MAAM;AACV,aAAK,aAAa,OAAO,IAAI,GAAG,EAAE,OAAO,EAAE;AAAA,iBACjC,IAAI,KAAK;AACnB,YAAI,QAAQ,mBAAmB,QAAQ,eAAe;AACrD,eAAK,YAAY,OAAO,IAAI,GAAG,EAAE,OAAO,EAAE;AAAA,mBAChC,QAAQ,iBAAiB,QAAQ,qBACvC,QAAQ,eAAe,QAAQ,iBAAiB;AACpD,iBAAO,IAAI;AACX,eAAK,WAAW,OAAO,IAAI;AAAA;AAAA;AAAA;AAc9B,UAAM,eAAe,SAAS,OAAO,IAAI,GAAG,GAAG,GAAG;AACjD,UAAI,QAAQ,MAAM;AAClB,UAAI,CAAC,MAAM,cAAc,MAAM,OAAO;AAAE;AAAA;AACxC,UAAI,MAAM,MAAM;AAChB,UAAI,IAAI,KAAK;AAAE;AAAA;AACf,UAAI,MAAM;AACV,YAAM;AACN,YAAM,mBAAmB,IAAI,GAAG,GAAG;AAAA;AAYpC,UAAM,cAAc,SAAS,OAAO,IAAI,GAAG,GAAG,GAAG;AAChD,UAAI,CAAC,MAAM,QAAQ,SAAS,KAAK;AAAE;AAAA;AACnC,YAAM,mBAAmB,IAAI,GAAG,GAAG;AAAA;AAUpC,UAAM,aAAa,SAAS,OAAO,IAAI,GAAG;AAEzC,UAAI,QAAQ,MAAM;AAClB,UAAI,MAAM,MAAM;AAChB,UAAI,CAAC,IAAI,KAAK;AAAE;AAAA;AAChB,YAAM;AACN,YAAM,iBAAiB,IAAI,GAAG;AAC9B,aAAO,IAAI;AAAA;AAIZ,aAAS,QAAQ;AAAA;AAOlB,EAAC,YAAW;AACX;AAOA,QAAI,KAAI,SAAS,UAAU,SAAS,WAAW;AAQ/C,OAAE,UAAsB;AAQxB,OAAE,YAAqB;AAAA;AAQxB,EAAC,YAAY;AACZ;AAMA,QAAI,KAAI,SAAS,YAAY,SAAS,aAAa;AAQnD,OAAE,UAAsB;AAQxB,OAAE,YAAqB;AAAA;AAoBxB,EAAC,YAAW;AACX;AAwBA,aAAS,QAAQ,SAAU,QAAQ,OAAO;AACzC,UAAI,QAAQ,MAAM,UAAU,MAAM,KAAK,WAAW;AAClD,aAAO,WAAY;AAClB,eAAO,OAAO,MAAM,OAAO,MAAM,UAAU,MAAM,KAAK,WAAW,GAAG,OAAO;AAAA;AAAA;AAAA;AAU9E,EAAC,YAAW;AACX;AAUA,wBAAoB,OAAO,SAAS,MAAM;AACzC,WAAK,kBAAkB;AAOvB,WAAK,QAAQ;AAOb,WAAK,UAAU;AAOf,WAAK,OAAO;AAAA;AAGb,QAAI,IAAI,SAAS,OAAO,YAAY,SAAS;AAE7C,MAAE,QAAQ,WAAW;AACpB,aAAO,IAAI,SAAS,WAAW,KAAK,OAAO,KAAK,SAAS,KAAK;AAAA;AAG/D,aAAS,aAAa,SAAS,QAAQ,YAAY;AAAA;AAQpD,EAAC,UAAU,OAAO;AACjB;AAYA,2BAAuB,QAAQ,OAAO;AACrC,WAAK,kBAAkB;AAOvB,WAAK,SAAS;AAQd,WAAK,QAAS,SAAS,OAAQ,IAAI;AAQnC,WAAK,WAAY,SAAS,IAAK,IAAI,KAAK,SAAS,KAAK;AAAA;AACtD;AAED,QAAI,IAAI,SAAS,OAAO,eAAe,SAAS;AAOhD,MAAE,QAAQ,WAAW;AACpB,aAAO,IAAI,SAAS,cAAc,KAAK,QAAQ,KAAK;AAAA;AAGrD,aAAS,gBAAgB,SAAS,QAAQ,eAAe;AAAA,KAExD;AAMF,AACC,EAAC,YAAY;AAGZ,QAAI,WAAW,OAAO,WAAW,cAAc,OAAO;AAGtD,QAAI,cAAc;AAAA,MAChB,YAAY;AAAA,MACZ,UAAU;AAAA;AAIZ,QAAI,cAAc,YAAY,OAAO,YAAY,WAAW,CAAC,QAAQ,YAAY;AAMjF,QAAI,OAAO,YAAY,OAAO,WAAW,UAAU,MAC/C,aAAa,eAAe,YAAY,OAAO,WAAW,UAAU,CAAC,OAAO,YAAY,OAAO,UAAU,YAAY;AAEzH,QAAI,cAAe,YAAW,cAAc,cAAc,WAAW,cAAc,cAAc,WAAW,YAAY,aAAa;AACnI,aAAO;AAAA;AAKT,0BAAsB,SAAS,UAAS;AACtC,iBAAY,WAAU,KAAK;AAC3B,kBAAY,YAAU,KAAK;AAG3B,UAAI,UAAS,QAAQ,aAAa,KAAK,WACnC,UAAS,QAAQ,aAAa,KAAK,WACnC,UAAS,QAAQ,aAAa,KAAK,WACnC,QAAO,QAAQ,WAAW,KAAK,SAC/B,cAAc,QAAQ,kBAAkB,KAAK,gBAC7C,aAAY,QAAQ,gBAAgB,KAAK,cACzC,QAAO,QAAQ,WAAW,KAAK,SAC/B,cAAa,QAAQ,WAAW,KAAK;AAGzC,UAAI,OAAO,eAAc,YAAY,aAAY;AAC/C,iBAAQ,YAAY,YAAW;AAC/B,iBAAQ,QAAQ,YAAW;AAAA;AAI7B,UAAI,cAAc,QAAO,WACrB,WAAW,YAAY,UACvB,YAAY,SAAS;AAGzB,UAAI,aAAa,IAAI,MAAK;AAC1B,UAAI;AAGF,qBAAa,WAAW,oBAAoB,WAAW,WAAW,kBAAkB,KAAK,WAAW,iBAAiB,KAInH,WAAW,iBAAiB,MAAM,WAAW,mBAAmB,MAAM,WAAW,mBAAmB,KAAK,WAAW,wBAAwB;AAAA,eACvI,WAAP;AAAA;AAIF,mBAAa,MAAM;AACjB,YAAI,IAAI,UAAU,OAAO;AAEvB,iBAAO,IAAI;AAAA;AAEb,YAAI;AACJ,YAAI,QAAQ,yBAAyB;AAGnC,wBAAc,IAAI,MAAM;AAAA,mBACf,QAAQ,QAAQ;AAGzB,wBAAc,IAAI,qBAAqB,IAAI;AAAA,eACtC;AACL,cAAI,OAAO,aAAa;AAExB,cAAI,QAAQ,kBAAkB;AAC5B,gBAAI,YAAY,SAAQ,WAAW,qBAAqB,OAAO,aAAa,cAAc;AAC1F,gBAAI,oBAAoB;AAEtB,cAAC,SAAQ,WAAY;AACnB,uBAAO;AAAA,iBACN,SAAS;AACZ,kBAAI;AACF,qCAGE,UAAU,OAAO,OAGjB,UAAU,IAAI,eAAc,OAC5B,UAAU,IAAI,cAAa,QAK3B,UAAU,cAAc,SAGxB,UAAU,WAAW,SAGrB,gBAAgB,SAMhB,UAAU,WAAW,OACrB,UAAU,CAAC,WAAW,SAGtB,UAAU,CAAC,WAAW,YAEtB,UAAU,SAAS,UAKnB,UAAU,CAAC,OAAO,UAAU,UAAU,sBAGtC,UAAU,EAAE,KAAK,CAAC,OAAO,MAAM,OAAO,MAAM,qBAAwB,cAEpE,UAAU,MAAM,WAAW,OAC3B,UAAU,CAAC,GAAG,IAAI,MAAM,MAAM,mBAG9B,UAAU,IAAI,MAAK,aAAc,mCAEjC,UAAU,IAAI,MAAK,YAAa,mCAGhC,UAAU,IAAI,MAAK,kBAAkB,mCAGrC,UAAU,IAAI,MAAK,QAAQ;AAAA,uBACtB,WAAP;AACA,qCAAqB;AAAA;AAAA;AAGzB,0BAAc;AAAA;AAGhB,cAAI,QAAQ,cAAc;AACxB,gBAAI,QAAQ,SAAQ;AACpB,gBAAI,OAAO,SAAS,YAAY;AAC9B,kBAAI;AAIF,oBAAI,MAAM,SAAS,KAAK,CAAC,MAAM,QAAQ;AAErC,0BAAQ,MAAM;AACd,sBAAI,iBAAiB,MAAM,KAAK,UAAU,KAAK,MAAM,KAAK,OAAO;AACjE,sBAAI,gBAAgB;AAClB,wBAAI;AAEF,uCAAiB,CAAC,MAAM;AAAA,6BACjB,WAAP;AAAA;AACF,wBAAI,gBAAgB;AAClB,0BAAI;AAIF,yCAAiB,MAAM,UAAU;AAAA,+BAC1B,WAAP;AAAA;AAAA;AAEJ,wBAAI,gBAAgB;AAClB,0BAAI;AAIF,yCAAiB,MAAM,UAAU;AAAA,+BAC1B,WAAP;AAAA;AAAA;AAAA;AAAA;AAAA,uBAID,WAAP;AACA,iCAAiB;AAAA;AAAA;AAGrB,0BAAc;AAAA;AAAA;AAGlB,eAAO,IAAI,QAAQ,CAAC,CAAC;AAAA;AAGvB,UAAI,CAAC,IAAI,SAAS;AAEhB,YAAI,gBAAgB,qBAChB,YAAY,iBACZ,cAAc,mBACd,cAAc,mBACd,aAAa,kBACb,eAAe;AAGnB,YAAI,iBAAiB,IAAI;AAGzB,YAAI,CAAC,YAAY;AACf,cAAI,QAAQ,MAAK;AAGjB,cAAI,SAAS,CAAC,GAAG,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AAGhE,cAAI,SAAS,SAAU,MAAM,OAAO;AAClC,mBAAO,OAAO,SAAS,MAAO,QAAO,QAAQ,MAAO,QAAO,OAAQ,SAAQ,CAAE,SAAQ,OAAO,KAAK,MAAO,QAAO,OAAO,SAAS,OAAO,MAAO,QAAO,OAAO,SAAS;AAAA;AAAA;AAMxK,YAAI,CAAE,cAAa,YAAY,iBAAiB;AAC9C,uBAAa,SAAU,UAAU;AAC/B,gBAAI,UAAU,IAAI;AAClB,gBAAK,SAAQ,YAAY,MAAM,QAAQ,YAAY;AAAA,cAGjD,YAAY;AAAA,eACX,SAAS,YAAY,UAAU;AAGhC,2BAAa,SAAU,WAAU;AAI/B,oBAAI,WAAW,KAAK,WAAW,SAAS,aAAa,MAAK,YAAY,MAAM;AAE5E,qBAAK,YAAY;AACjB,uBAAO;AAAA;AAAA,mBAEJ;AAEL,4BAAc,QAAQ;AAGtB,2BAAa,SAAU,WAAU;AAC/B,oBAAI,SAAU,MAAK,eAAe,aAAa;AAC/C,uBAAO,aAAY,QAAQ,CAAE,cAAY,UAAU,KAAK,eAAc,OAAO;AAAA;AAAA;AAGjF,sBAAU;AACV,mBAAO,WAAW,KAAK,MAAM;AAAA;AAAA;AAMjC,kBAAU,SAAU,QAAQ,UAAU;AACpC,cAAI,OAAO,GAAG,YAAY,SAAS;AAKnC,UAAC,cAAa,WAAY;AACxB,iBAAK,UAAU;AAAA,aACd,UAAU,UAAU;AAGvB,oBAAU,IAAI;AACd,eAAK,YAAY,SAAS;AAExB,gBAAI,WAAW,KAAK,SAAS,WAAW;AACtC;AAAA;AAAA;AAGJ,uBAAa,UAAU;AAGvB,cAAI,CAAC,MAAM;AAET,sBAAU,CAAC,WAAW,YAAY,kBAAkB,wBAAwB,iBAAiB,kBAAkB;AAG/G,sBAAU,SAAU,SAAQ,WAAU;AACpC,kBAAI,aAAa,SAAS,KAAK,YAAW,eAAe,WAAU;AACnE,kBAAI,cAAc,CAAC,cAAc,OAAO,QAAO,eAAe,cAAc,YAAY,OAAO,QAAO,mBAAmB,QAAO,kBAAkB;AAClJ,mBAAK,aAAY,SAAQ;AAGvB,oBAAI,CAAE,eAAc,aAAY,gBAAgB,YAAY,KAAK,SAAQ,YAAW;AAClF,4BAAS;AAAA;AAAA;AAIb,mBAAK,SAAS,QAAQ,QAAQ,YAAW,QAAQ,EAAE,SAAS,YAAY,KAAK,SAAQ,cAAa,UAAS;AAAU;AAAA;AAAA,qBAE9G,QAAQ,GAAG;AAEpB,sBAAU,SAAU,SAAQ,WAAU;AAEpC,kBAAI,WAAU,IAAI,aAAa,SAAS,KAAK,YAAW,eAAe;AACvE,mBAAK,aAAY,SAAQ;AAIvB,oBAAI,CAAE,eAAc,aAAY,gBAAgB,CAAC,WAAW,KAAK,UAAS,cAAc,UAAQ,aAAY,MAAM,WAAW,KAAK,SAAQ,YAAW;AACnJ,4BAAS;AAAA;AAAA;AAAA;AAAA,iBAIV;AAEL,sBAAU,SAAU,SAAQ,WAAU;AACpC,kBAAI,aAAa,SAAS,KAAK,YAAW,eAAe,WAAU;AACnE,mBAAK,aAAY,SAAQ;AACvB,oBAAI,CAAE,eAAc,aAAY,gBAAgB,WAAW,KAAK,SAAQ,cAAa,CAAE,iBAAgB,cAAa,gBAAgB;AAClI,4BAAS;AAAA;AAAA;AAKb,kBAAI,iBAAiB,WAAW,KAAK,SAAS,YAAW,gBAAiB;AACxE,0BAAS;AAAA;AAAA;AAAA;AAIf,iBAAO,QAAQ,QAAQ;AAAA;AASzB,YAAI,CAAC,IAAI,mBAAmB;AAE1B,cAAI,UAAU;AAAA,YACZ,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,GAAG;AAAA,YACH,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,GAAG;AAAA;AAKL,cAAI,gBAAgB;AACpB,cAAI,iBAAiB,SAAU,OAAO,OAAO;AAG3C,mBAAQ,iBAAiB,UAAS,IAAI,MAAM,CAAC;AAAA;AAO/C,cAAI,gBAAgB;AACpB,cAAI,QAAQ,SAAU,OAAO;AAC3B,gBAAI,SAAS,KAAK,QAAQ,GAAG,SAAS,MAAM,QAAQ,eAAe,CAAC,kBAAkB,SAAS;AAC/F,gBAAI,UAAU,gBAAiB,kBAAiB,MAAM,MAAM,MAAM;AAClE,mBAAO,QAAQ,QAAQ,SAAS;AAC9B,kBAAI,WAAW,MAAM,WAAW;AAGhC,sBAAQ;AAAA,qBACD;AAAA,qBAAQ;AAAA,qBAAQ;AAAA,qBAAS;AAAA,qBAAS;AAAA,qBAAS;AAAA,qBAAS;AACvD,4BAAU,QAAQ;AAClB;AAAA;AAEA,sBAAI,WAAW,IAAI;AACjB,8BAAU,gBAAgB,eAAe,GAAG,SAAS,SAAS;AAC9D;AAAA;AAEF,4BAAU,eAAe,QAAQ,SAAS,MAAM,OAAO;AAAA;AAAA;AAG7D,mBAAO,SAAS;AAAA;AAKlB,cAAI,YAAY,SAAU,UAAU,QAAQ,UAAU,YAAY,YAAY,aAAa,OAAO;AAChG,gBAAI,OAAO,WAAW,MAAM,OAAO,MAAM,MAAM,OAAO,SAAS,SAAS,cAAc,SAAS,SAAS,OAAO,QAAQ,QAAQ;AAC/H,gBAAI;AAEF,sBAAQ,OAAO;AAAA,qBACR,WAAP;AAAA;AACF,gBAAI,OAAO,SAAS,YAAY,OAAO;AACrC,0BAAY,SAAS,KAAK;AAC1B,kBAAI,aAAa,aAAa,CAAC,WAAW,KAAK,OAAO,WAAW;AAC/D,oBAAI,QAAQ,KAAK,KAAK,QAAQ,IAAI,GAAG;AAInC,sBAAI,QAAQ;AAIV,2BAAO,MAAM,QAAQ;AACrB,yBAAK,OAAO,MAAM,OAAO,YAAY,OAAO,GAAG,OAAO,OAAO,GAAG,MAAM,MAAM;AAAO;AACnF,yBAAK,QAAQ,MAAO,QAAO,OAAO,MAAM,MAAM,QAAQ,OAAO,MAAM,QAAQ,MAAM,MAAM;AAAQ;AAC/F,2BAAO,IAAI,OAAO,OAAO,MAAM;AAK/B,2BAAQ,SAAQ,QAAQ,SAAS;AAGjC,4BAAQ,MAAM,OAAO,QAAQ;AAC7B,8BAAU,MAAM,OAAO,OAAO;AAC9B,8BAAU,MAAM,OAAO,OAAO;AAC9B,mCAAe,OAAO;AAAA,yBACjB;AACL,2BAAO,MAAM;AACb,4BAAQ,MAAM;AACd,2BAAO,MAAM;AACb,4BAAQ,MAAM;AACd,8BAAU,MAAM;AAChB,8BAAU,MAAM;AAChB,mCAAe,MAAM;AAAA;AAGvB,0BAAS,SAAQ,KAAK,QAAQ,MAAO,QAAO,IAAI,MAAM,OAAO,eAAe,GAAG,OAAO,IAAI,CAAC,OAAO,QAAQ,eAAe,GAAG,SAC1H,MAAM,eAAe,GAAG,QAAQ,KAAK,MAAM,eAAe,GAAG,QAG7D,MAAM,eAAe,GAAG,SAAS,MAAM,eAAe,GAAG,WAAW,MAAM,eAAe,GAAG,WAE5F,MAAM,eAAe,GAAG,gBAAgB;AAAA,uBACrC;AACL,0BAAQ;AAAA;AAAA,yBAED,OAAO,MAAM,UAAU,cAAgB,cAAa,eAAe,aAAa,eAAe,aAAa,cAAe,WAAW,KAAK,OAAO,YAAY;AAKvK,wBAAQ,MAAM,OAAO;AAAA;AAAA;AAGzB,gBAAI,UAAU;AAGZ,sBAAQ,SAAS,KAAK,QAAQ,UAAU;AAAA;AAE1C,gBAAI,UAAU,MAAM;AAClB,qBAAO;AAAA;AAET,wBAAY,SAAS,KAAK;AAC1B,gBAAI,aAAa,cAAc;AAE7B,qBAAO,KAAK;AAAA,uBACH,aAAa,aAAa;AAGnC,qBAAO,QAAQ,KAAK,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ;AAAA,uBAC7C,aAAa,aAAa;AAEnC,qBAAO,MAAM,KAAK;AAAA;AAGpB,gBAAI,OAAO,SAAS,UAAU;AAG5B,mBAAK,SAAS,MAAM,QAAQ,YAAW;AACrC,oBAAI,MAAM,YAAY,OAAO;AAE3B,wBAAM;AAAA;AAAA;AAIV,oBAAM,KAAK;AACX,wBAAU;AAEV,uBAAS;AACT,6BAAe;AACf,kBAAI,aAAa,YAAY;AAE3B,qBAAK,QAAQ,GAAG,SAAS,MAAM,QAAQ,QAAQ,QAAQ,SAAS;AAC9D,4BAAU,UAAU,OAAO,OAAO,UAAU,YAAY,YAAY,aAAa;AACjF,0BAAQ,KAAK,YAAY,QAAQ,SAAS;AAAA;AAE5C,yBAAS,QAAQ,SAAU,aAAa,QAAQ,cAAc,QAAQ,KAAK,QAAQ,eAAe,OAAO,SAAS,MAAO,MAAM,QAAQ,KAAK,OAAO,MAAQ;AAAA,qBACtJ;AAIL,wBAAQ,cAAc,OAAO,SAAU,WAAU;AAC/C,sBAAI,WAAU,UAAU,WAAU,OAAO,UAAU,YAAY,YAAY,aAAa;AACxF,sBAAI,aAAY,OAAO;AAOrB,4BAAQ,KAAK,MAAM,aAAY,MAAO,cAAa,MAAM,MAAM;AAAA;AAAA;AAGnE,yBAAS,QAAQ,SAAU,aAAa,QAAQ,cAAc,QAAQ,KAAK,QAAQ,eAAe,OAAO,SAAS,MAAO,MAAM,QAAQ,KAAK,OAAO,MAAQ;AAAA;AAG7J,oBAAM;AACN,qBAAO;AAAA;AAAA;AAKX,mBAAQ,YAAY,SAAU,QAAQ,QAAQ,OAAO;AACnD,gBAAI,YAAY,UAAU,YAAY;AACtC,gBAAI,YAAY,OAAO,WAAW,QAAQ;AACxC,kBAAK,aAAY,SAAS,KAAK,YAAY,eAAe;AACxD,2BAAW;AAAA,yBACF,aAAa,YAAY;AAElC,6BAAa;AACb,yBAAS,QAAQ,GAAG,SAAS,OAAO,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,OAAO,UAAY,aAAY,SAAS,KAAK,QAAS,aAAa,eAAe,aAAa,gBAAiB,YAAW,SAAS;AAAG;AAAA;AAAA;AAGtN,gBAAI,OAAO;AACT,kBAAK,aAAY,SAAS,KAAK,WAAW,aAAa;AAGrD,oBAAK,UAAS,QAAQ,KAAK,GAAG;AAC5B,uBAAK,aAAa,IAAI,QAAQ,MAAO,SAAQ,KAAK,WAAW,SAAS,OAAO,cAAc;AAAI;AAAA;AAAA,yBAExF,aAAa,aAAa;AACnC,6BAAa,MAAM,UAAU,KAAK,QAAQ,MAAM,MAAM,GAAG;AAAA;AAAA;AAM7D,mBAAO,UAAU,IAAK,SAAQ,IAAI,MAAM,MAAM,QAAQ,QAAQ,UAAU,YAAY,YAAY,IAAI;AAAA;AAAA;AAKxG,YAAI,CAAC,IAAI,eAAe;AACtB,cAAI,eAAe,QAAO;AAI1B,cAAI,YAAY;AAAA,YACd,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA;AAIP,cAAI,OAAO;AAGX,cAAI,QAAQ,WAAY;AACtB,oBAAQ,SAAS;AACjB,kBAAM;AAAA;AAMR,cAAI,MAAM,WAAY;AACpB,gBAAI,SAAS,QAAQ,SAAS,OAAO,QAAQ,OAAO,OAAO,UAAU,UAAU;AAC/E,mBAAO,QAAQ,QAAQ;AACrB,yBAAW,OAAO,WAAW;AAC7B,sBAAQ;AAAA,qBACD;AAAA,qBAAQ;AAAA,qBAAS;AAAA,qBAAS;AAG7B;AACA;AAAA,qBACG;AAAA,qBAAU;AAAA,qBAAU;AAAA,qBAAS;AAAA,qBAAS;AAAA,qBAAS;AAGlD,0BAAQ,iBAAiB,OAAO,OAAO,SAAS,OAAO;AACvD;AACA,yBAAO;AAAA,qBACJ;AAKH,uBAAK,QAAQ,KAAK,SAAS,QAAQ,UAAS;AAC1C,+BAAW,OAAO,WAAW;AAC7B,wBAAI,WAAW,IAAI;AAGjB;AAAA,+BACS,YAAY,IAAI;AAIzB,iCAAW,OAAO,WAAW,EAAE;AAC/B,8BAAQ;AAAA,6BACD;AAAA,6BAAS;AAAA,6BAAS;AAAA,6BAAS;AAAA,6BAAS;AAAA,6BAAU;AAAA,6BAAU;AAAA,6BAAU;AAErE,mCAAS,UAAU;AACnB;AACA;AAAA,6BACG;AAIH,kCAAQ,EAAE;AACV,+BAAK,WAAW,QAAQ,GAAG,QAAQ,UAAU,SAAS;AACpD,uCAAW,OAAO,WAAW;AAG7B,gCAAI,CAAE,aAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,OAAO,YAAY,MAAM,YAAY,KAAK;AAEhH;AAAA;AAAA;AAIJ,mCAAS,aAAa,OAAO,OAAO,MAAM,OAAO;AACjD;AAAA;AAGA;AAAA;AAAA,2BAEC;AACL,0BAAI,YAAY,IAAI;AAGlB;AAAA;AAEF,iCAAW,OAAO,WAAW;AAC7B,8BAAQ;AAER,6BAAO,YAAY,MAAM,YAAY,MAAM,YAAY,IAAI;AACzD,mCAAW,OAAO,WAAW,EAAE;AAAA;AAGjC,+BAAS,OAAO,MAAM,OAAO;AAAA;AAAA;AAGjC,sBAAI,OAAO,WAAW,UAAU,IAAI;AAElC;AACA,2BAAO;AAAA;AAGT;AAAA;AAGA,0BAAQ;AAER,sBAAI,YAAY,IAAI;AAClB,+BAAW;AACX,+BAAW,OAAO,WAAW,EAAE;AAAA;AAGjC,sBAAI,YAAY,MAAM,YAAY,IAAI;AAEpC,wBAAI,YAAY,MAAQ,YAAW,OAAO,WAAW,QAAQ,IAAK,YAAY,MAAM,YAAY,KAAK;AAEnG;AAAA;AAEF,+BAAW;AAEX,2BAAO,QAAQ,UAAY,YAAW,OAAO,WAAW,QAAS,YAAY,MAAM,YAAY,KAAK;AAAQ;AAG5G,wBAAI,OAAO,WAAW,UAAU,IAAI;AAClC,iCAAW,EAAE;AAEb,6BAAO,WAAW,UAAY,YAAW,OAAO,WAAW,WAAY,YAAY,MAAM,YAAY,KAAK;AAAW;AACrH,0BAAI,YAAY,OAAO;AAErB;AAAA;AAEF,8BAAQ;AAAA;AAIV,+BAAW,OAAO,WAAW;AAC7B,wBAAI,YAAY,OAAO,YAAY,IAAI;AACrC,iCAAW,OAAO,WAAW,EAAE;AAG/B,0BAAI,YAAY,MAAM,YAAY,IAAI;AACpC;AAAA;AAGF,2BAAK,WAAW,OAAO,WAAW,UAAY,YAAW,OAAO,WAAW,WAAY,YAAY,MAAM,YAAY,KAAK;AAAW;AACrI,0BAAI,YAAY,OAAO;AAErB;AAAA;AAEF,8BAAQ;AAAA;AAGV,2BAAO,CAAC,OAAO,MAAM,OAAO;AAAA;AAG9B,sBAAI,UAAU;AACZ;AAAA;AAGF,sBAAI,OAAO,MAAM,OAAO,QAAQ,MAAM,QAAQ;AAC5C,6BAAS;AACT,2BAAO;AAAA,6BACE,OAAO,MAAM,OAAO,QAAQ,MAAM,SAAS;AACpD,6BAAS;AACT,2BAAO;AAAA,6BACE,OAAO,MAAM,OAAO,QAAQ,MAAM,QAAQ;AACnD,6BAAS;AACT,2BAAO;AAAA;AAGT;AAAA;AAAA;AAKN,mBAAO;AAAA;AAIT,cAAI,MAAM,SAAU,OAAO;AACzB,gBAAI,SAAS;AACb,gBAAI,SAAS,KAAK;AAEhB;AAAA;AAEF,gBAAI,OAAO,SAAS,UAAU;AAC5B,kBAAK,kBAAiB,MAAM,OAAO,KAAK,MAAM,OAAO,KAAK;AAExD,uBAAO,MAAM,MAAM;AAAA;AAGrB,kBAAI,SAAS,KAAK;AAEhB,0BAAU;AACV,yBAAQ,cAAe,cAAa,OAAO;AACzC,0BAAQ;AAER,sBAAI,SAAS,KAAK;AAChB;AAAA;AAKF,sBAAI,YAAY;AACd,wBAAI,SAAS,KAAK;AAChB,8BAAQ;AACR,0BAAI,SAAS,KAAK;AAEhB;AAAA;AAAA,2BAEG;AAEL;AAAA;AAAA;AAIJ,sBAAI,SAAS,KAAK;AAChB;AAAA;AAEF,0BAAQ,KAAK,IAAI;AAAA;AAEnB,uBAAO;AAAA,yBACE,SAAS,KAAK;AAEvB,0BAAU;AACV,yBAAQ,cAAe,cAAa,OAAO;AACzC,0BAAQ;AAER,sBAAI,SAAS,KAAK;AAChB;AAAA;AAIF,sBAAI,YAAY;AACd,wBAAI,SAAS,KAAK;AAChB,8BAAQ;AACR,0BAAI,SAAS,KAAK;AAEhB;AAAA;AAAA,2BAEG;AAEL;AAAA;AAAA;AAMJ,sBAAI,SAAS,OAAO,OAAO,SAAS,YAAa,kBAAiB,MAAM,OAAO,KAAK,MAAM,OAAO,OAAO,SAAS,KAAK;AACpH;AAAA;AAEF,0BAAQ,MAAM,MAAM,MAAM,IAAI;AAAA;AAEhC,uBAAO;AAAA;AAGT;AAAA;AAEF,mBAAO;AAAA;AAIT,cAAI,SAAS,SAAU,QAAQ,UAAU,UAAU;AACjD,gBAAI,UAAU,KAAK,QAAQ,UAAU;AACrC,gBAAI,YAAY,OAAO;AACrB,qBAAO,OAAO;AAAA,mBACT;AACL,qBAAO,YAAY;AAAA;AAAA;AAOvB,cAAI,OAAO,SAAU,QAAQ,UAAU,UAAU;AAC/C,gBAAI,QAAQ,OAAO,WAAW;AAC9B,gBAAI,OAAO,SAAS,YAAY,OAAO;AAIrC,kBAAI,SAAS,KAAK,UAAU,YAAY;AACtC,qBAAK,SAAS,MAAM,QAAQ,YAAW;AACrC,yBAAO,OAAO,QAAQ;AAAA;AAAA,qBAEnB;AACL,wBAAQ,OAAO,SAAU,WAAU;AACjC,yBAAO,OAAO,WAAU;AAAA;AAAA;AAAA;AAI9B,mBAAO,SAAS,KAAK,QAAQ,UAAU;AAAA;AAIzC,mBAAQ,QAAQ,SAAU,QAAQ,UAAU;AAC1C,gBAAI,QAAQ;AACZ,oBAAQ;AACR,qBAAS,KAAK;AACd,qBAAS,IAAI;AAEb,gBAAI,SAAS,KAAK;AAChB;AAAA;AAGF,oBAAQ,SAAS;AACjB,mBAAO,YAAY,SAAS,KAAK,aAAa,gBAAgB,KAAM,SAAQ,IAAI,MAAM,MAAM,QAAQ,QAAQ,IAAI,YAAY;AAAA;AAAA;AAAA;AAKlI,eAAQ,kBAAkB;AAC1B,aAAO;AAAA;AAGT,QAAI,eAAe,CAAC,UAAU;AAE5B,mBAAa,MAAM;AAAA,WACd;AAEL,UAAI,aAAa,KAAK,MAClB,eAAe,KAAK,UACpB,aAAa;AAEjB,UAAI,QAAQ,aAAa,MAAO,KAAK,WAAW;AAAA,QAG9C,cAAc,WAAY;AACxB,cAAI,CAAC,YAAY;AACf,yBAAa;AACb,iBAAK,OAAO;AACZ,iBAAK,WAAW;AAChB,yBAAa,eAAe;AAAA;AAE9B,iBAAO;AAAA;AAAA;AAIX,WAAK,OAAO;AAAA,QACV,SAAS,MAAM;AAAA,QACf,aAAa,MAAM;AAAA;AAAA;AAKvB,QAAI,UAAU;AACZ,aAAO,WAAY;AACjB,eAAO;AAAA;AAAA;AAAA,KAGV,KAAK;AAMR,EAAC,YAAY;AAOZ,QAAI,KAAI;AAER,OAAE,IAAI,WAAW;AAChB,aAAO,GAAE,GAAG;AAAA;AAGb,OAAE,MAAM,WAAW;AAClB,aAAO,GAAE,GAAG;AAAA;AAGb,OAAE,SAAS,WAAW;AACrB,aAAO,GAAE,GAAG;AAAA;AAGb,OAAE,QAAQ,WAAW;AACpB,aAAO,GAAE,GAAG;AAAA;AAGb,OAAE,MAAM,WAAW;AAClB,aAAO,GAAE,GAAG;AAAA;AAGb,OAAE,QAAQ,WAAW;AACpB,aAAO,GAAE,GAAG;AAAA;AAGb,OAAE,OAAO,WAAW;AACnB,aAAO,GAAE,GAAG;AAAA;AAGb,OAAE,SAAS,WAAW;AACrB,aAAO,GAAE,GAAG;AAAA;AAGb,OAAE,QAAQ,WAAW;AACpB,aAAO,GAAE,GAAG;AAAA;AAGb,OAAE,QAAQ,WAAW;AACpB,aAAO,GAAE,GAAG;AAAA;AAGb,OAAE,OAAO,SAAS,OAAO;AACxB,aAAO,SAAS,eAAe;AAAA;AAGhC,OAAE,KAAK,SAAS,MAAM;AACrB,aAAO,SAAS,cAAc;AAAA;AAG/B,aAAS,WAAW;AAAA;AAQrB,EAAC,YAAY;AAMZ,QAAI,KAAI;AAQR,OAAE,gBAAgB;AAQlB,OAAE,gBAAiB;AASnB,OAAE,iBAAiB;AAoBnB,OAAE,WAAW,SAAU,MAAM;AAC5B,UAAI,OAAO;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA;AAGP,UAAI,QAAQ,MAAM;AAAE,eAAO;AAAA;AAG3B,UAAI,SAAS,SAAS,SAAS;AAC/B,aAAO,OAAO;AAEd,eAAS,KAAK,MAAM;AACnB,YAAI,KAAK,QAAQ;AAChB,eAAK,KAAK,OAAO;AAAA;AAAA;AAKnB,UAAI,aAAa,KAAK,QAAQ;AAC9B,UAAI,aAAa,IAAI;AACpB,eAAO,KAAK,OAAO,GAAG;AAAA;AAIvB,UAAI;AACJ,UAAI,GAAE,cAAc,KAAK,OAAO;AAC/B,aAAK,WAAW;AAAA,iBAGN,GAAE,cAAc,KAAK,OAAO;AACtC,aAAK,WAAW;AAAA;AAIjB,UAAI,QAAQ,KAAK,MAAM,GAAE,iBAAiB;AACzC,aAAK,YAAY,MAAM,GAAG;AAAA;AAG3B,aAAO;AAAA;AAUR,OAAE,oBAAoB,SAAU,MAAM,OAAO;AAC5C,UAAI,QAAQ,MAAM;AACjB,cAAM,IAAI,MAAM;AAAA;AAEjB,UAAI,SAAS;AACb,eAAS,KAAK,MAAM;AACnB,eAAO,KAAK,IAAI,MAAM,OAAO,KAAK;AAAA;AAEnC,UAAI,OAAO;AACV,iBAAS,OAAO,OAAO;AAAA;AAExB,aAAO,OAAO,KAAK;AAAA;AAYpB,OAAE,WAAW,SAAU,KAAK,MAAM;AACjC,UAAI,QAAQ,MAAM;AACjB,eAAO;AAAA;AAGR,UAAI,QAAQ;AACZ,UAAI,MAAM,IAAI,QAAQ;AAEtB,UAAI,OAAO,IAAI;AACd,YAAI,IAAI,IAAI,MAAM,MAAM;AACxB,gBAAQ,MAAM,OAAO,EAAE,MAAM;AAAA;AAG9B,UAAI,OAAO,IAAI;AACd,eAAO,IAAI,MAAM,GAAG,OAAO,MAAM,KAAK,kBAAkB,MAAM;AAAA,aACxD;AACN,eAAO,MAAM,MAAM,KAAK,kBAAkB,MAAM;AAAA;AAAA;AAUlD,OAAE,gBAAgB,SAAU,MAAM;AACjC,UAAI,SAAS,SAAS,SAAS;AAC/B,aAAO,OAAO,KAAK;AAEnB,UAAI,OAAO,SAAS,SAAS;AAC7B,WAAK,OAAO,SAAS;AAErB,UAAI,cAAe,OAAO,YAAY,MACpC,QAAO,QAAQ,KAAK,QACrB,OAAO,YAAY,KAAK,YACxB,OAAO,YAAY,KAAK;AACzB,aAAO;AAAA;AAUR,OAAE,UAAU,SAAU,MAAM;AAC3B,UAAI,SAAS,SAAS,SAAS;AAC/B,aAAO,OAAO,KAAK;AACnB,aAAO,OAAO,YAAY,MAAM,OAAO,YAAY;AAAA;AAGpD,aAAS,WAAW;AAAA;AAQrB,EAAC,YAAY;AAMZ,QAAI,KAAI;AAAA,MACP,WAAW;AAAA;AAGZ,OAAE,eAAe,SAAU,IAAI;AAC9B,SAAE,UAAU,YAAY;AAAA;AAGzB,OAAE,eAAe,SAAU,IAAI;AAC9B,UAAI,GAAE,aAAa,MAAM;AACxB,WAAE,YAAY,SAAS,cAAc;AACrC,WAAE,UAAU,KAAK;AACjB,YAAI,QAAQ,GAAE,UAAU;AACxB,cAAM,aAAa;AACnB,cAAM,WAAW;AACjB,cAAM,QAAQ,GAAE,UAAU,MAAM,SAAS;AACzC,cAAM,WAAW;AACjB,cAAM,YAAY,MAAM,cAAc,MAAM,kBAAkB,MAAM,aAAa;AACjF,WAAE,UAAU,YAAY,GAAE;AAAA;AAE3B,SAAE,UAAU,YAAY;AAAA;AAGzB,OAAE,UAAU,WAAY;AACvB,aAAO,SAAS,QAAQ,SAAS,qBAAqB,QAAQ;AAAA;AAG/D,OAAE,UAAU,WAAY;AACvB,aAAO,SAAS,QAAQ,SAAS,qBAAqB,QAAQ;AAAA;AAG/D,OAAE,cAAc,SAAS,IAAI;AAC5B,UAAI,GAAG,QAAQ;AACd,WAAG,OAAO,YAAY;AAAA;AAAA;AAWxB,OAAE,aAAa,SAAS,MAAM;AAC7B,aAAO,gBAAgB;AAAA;AAUxB,OAAE,aAAa,SAAS,MAAM;AAC7B,UAAI,OAAO,kBAAkB;AAC5B,eAAO,gBAAgB;AAAA,aACjB;AACN,eAAO;AAAA;AAAA;AAWT,OAAE,aAAa,SAAS,MAAM;AAC7B,UAAI,OAAO,kBAAkB;AAC5B,eAAO,gBAAgB;AAAA,aACjB;AACN,eAAO;AAAA;AAAA;AAIT,aAAS,WAAW;AAAA;AAQrB,EAAC,YAAY;AAMZ,QAAI,KAAI;AAUR,OAAE,WAAW,SAAU,MAAM;AAC5B,UAAI,MAAM;AAKV,UAAI;AACH,YAAI,OAAO,WAAW;AACrB,cAAI,SAAS,IAAI;AACjB,gBAAM,OAAO,gBAAgB,MAAM;AAAA;AAAA,eAE5B,GAAP;AAAA;AAIF,UAAI,CAAC,KAAK;AACT,YAAI;AACH,gBAAM,IAAI,cAAc;AACxB,cAAI,QAAQ;AACZ,cAAI,QAAQ;AAAA,iBACJ,GAAP;AACD,gBAAM;AAAA;AAAA;AAIR,aAAO;AAAA;AASR,OAAE,YAAY,SAAU,OAAO;AAC9B,UAAI,SAAS,MAAM;AAClB,eAAO;AAAA;AAGR,UAAI;AACH,eAAO,KAAK,MAAM;AAAA,eACV,GAAP;AAED,cAAM;AAAA;AAAA;AAIR,aAAS,YAAY;AAAA;AAQtB,EAAC,YAAW;AACX,QAAI,KAAI;AAUR,OAAE,SAAS;AAWX,OAAE,MAAM;AAUR,OAAE,OAAO;AAUT,OAAE,UAAU;AAUZ,OAAE,QAAQ;AAeV,OAAE,aAAa;AAaf,OAAE,OAAO;AAaT,OAAE,QAAQ;AAcV,OAAE,WAAW;AAWb,OAAE,QAAQ;AAWV,OAAE,QAAQ;AAUV,OAAE,cAAc;AAUhB,OAAE,MAAM;AAWR,OAAE,OAAO;AAUT,OAAE,MAAM;AAER,aAAS,QAAQ;AAAA;AAOlB,EAAC,YAAW;AACX,QAAI,KAAI;AASR,OAAE,OAAO;AAST,OAAE,MAAM;AAER,aAAS,UAAU;AAAA;AAOpB,EAAC,YAAY;AACZ;AAWA,wBAAoB;AASnB,WAAK,MAAM;AASX,WAAK,OAAO;AASZ,WAAK,KAAK;AAYV,WAAK,gBAAgB;AAQrB,WAAK,WAAW;AAQhB,WAAK,OAAO;AAUZ,WAAK,SAAS,SAAS,QAAQ;AAQ/B,WAAK,SAAS;AAUd,WAAK,UAAU;AAQf,WAAK,kBAAkB;AASvB,WAAK,WAAW;AAQhB,WAAK,cAAc;AASnB,WAAK,cAAc,GAAE;AAAA;AACrB;AAED,QAAI,IAAI,SAAS,YAAY;AAC7B,QAAI,KAAI;AASR,OAAE,uBAAuB;AAczB,OAAE,SAAS,SAAU,OAAO;AAC3B,UAAI,OAAO,SAAS,UAAU;AAC7B,YAAI,OAAO,IAAI;AACf,aAAK,MAAM;AACX,eAAO;AAAA,iBACG,iBAAiB,IAAG;AAC9B,eAAO;AAAA,iBACG,iBAAiB,UAAU,MAAM,KAAK;AAChD,YAAI,MAAM,eAAe,MAAM;AAC9B,gBAAM,cAAc,GAAE;AAAA;AAEvB,eAAO;AAAA,aACD;AACN,cAAM,IAAI,MAAM;AAAA;AAAA;AAelB,MAAE,MAAM,SAAS,OAAO;AACvB,eAAS,KAAK,OAAO;AAAE,aAAK,KAAK,MAAM;AAAA;AACvC,aAAO;AAAA;AAGR,aAAS,WAAW;AAAA;AAQrB,EAAC,YAAY;AAMZ,QAAI,KAAI;AAaR,OAAE,WAAW,SAAU,MAAM;AAC5B,cAAQ;AAAA,aACF,SAAS,MAAM;AAAA,aACf,SAAS,MAAM;AACnB,iBAAO;AAAA;AAEP,iBAAO;AAAA;AAAA;AAWV,OAAE,SAAS,SAAU,MAAM;AAC1B,cAAQ;AAAA,aACF,SAAS,MAAM;AAAA,aACf,SAAS,MAAM;AAAA,aACf,SAAS,MAAM;AAAA,aACf,SAAS,MAAM;AAAA,aACf,SAAS,MAAM;AAAA,aACf,SAAS,MAAM;AAAA,aACf,SAAS,MAAM;AAAA,aACf,SAAS,MAAM;AACnB,iBAAO;AAAA;AAEP,iBAAO;AAAA;AAAA;AAaV,OAAE,qBAAqB,SAAU,WAAW;AAC3C,UAAI,aAAa,MAAM;AACtB,eAAO,SAAS,MAAM;AAAA;AAGvB,cAAQ,UAAU;AAAA,aACZ;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AAAA,aACA;AACJ,iBAAO,SAAS,MAAM;AAAA,aAClB;AAAA,aACA;AAAA,aACA;AACJ,iBAAO,SAAS,MAAM;AAAA,aAClB;AAAA,aACA;AAAA,aACA;AACJ,iBAAO,SAAS,MAAM;AAAA,aAClB;AACJ,iBAAO,SAAS,MAAM;AAAA,aAClB;AACJ,iBAAO,SAAS,MAAM;AAAA,aAClB;AACJ,iBAAO,SAAS,MAAM;AAAA,aAClB;AACJ,iBAAO,SAAS,MAAM;AAAA,aAClB;AACJ,iBAAO,SAAS,MAAM;AAAA;AAEtB,iBAAO,SAAS,MAAM;AAAA;AAAA;AAIzB,aAAS,eAAe;AAAA;AAQzB,EAAC,YAAY;AACZ;AAeA,4BAAwB,UAAU,WAAW,MAAM;AAClD,WAAK;AAUL,WAAK,SAAS;AAWd,WAAK,WAAW;AAiBhB,WAAK,WAAW;AAQhB,WAAK,OAAO;AAwBZ,WAAK,kBAAkB;AAUvB,UAAI,UAAU;AACb,aAAK,QAAQ,SAAS,SAAS,OAAO;AAAA,aAChC;AACN,aAAK,QAAQ;AAAA;AASd,WAAK,aAAa;AAUlB,WAAK,UAAU;AASf,WAAK,aAAa;AAUlB,WAAK,eAAe;AAQpB,WAAK,mBAAmB;AAQxB,WAAK,OAAO;AAAA;AACZ;AAED,QAAI,IAAI,SAAS,OAAO,gBAAgB,SAAS;AACjD,QAAI,KAAI;AAGR,QAAI;AACH,aAAO,iBAAiB,IAAG;AAAA,QAC1B,MAAM,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,QAAQ;AAAA,WAAS;AAAA,QAC9E,KAAK,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,QAAQ;AAAA,WAAQ;AAAA,QAE5E,QAAQ,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAW;AAAA,QAChF,KAAK,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAQ;AAAA,QAC1E,MAAM,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAS;AAAA,QAC5E,SAAS,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAY;AAAA,QAClF,OAAO,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAU;AAAA,QAC9E,YAAY,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAe;AAAA,QACxF,MAAM,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAS;AAAA,QAC5E,OAAO,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAU;AAAA,QAC9E,UAAU,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAa;AAAA,QACpF,OAAO,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAU;AAAA,QAC9E,OAAO,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAU;AAAA,QAC9E,aAAa,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAgB;AAAA,QAC1F,KAAK,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAQ;AAAA,QAC1E,MAAM,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAS;AAAA,QAC5E,KAAK,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAQ;AAAA;AAAA,aAEnE,GAAP;AAAA;AAgFF,MAAE,UAAU,WAAY;AACvB,aAAO,KAAK;AAAA;AAYb,MAAE,YAAY,SAAU,KAAK;AAC5B,aAAO,MAAM,KAAK,aAAa,KAAK;AAAA;AASrC,MAAE,SAAS,WAAY;AACtB,aAAO,KAAK;AAAA;AASb,MAAE,SAAS,SAAS,KAAK;AACvB,WAAK,OAAO;AAAA;AAed,MAAE,OAAO,WAAY;AACpB,WAAK;AAEL,WAAK,SAAS,GAAG,YAAY,MAAM;AACnC,WAAK,SAAS,GAAG,YAAY,MAAM;AACnC,WAAK,SAAS,GAAG,aAAa,MAAM;AACpC,WAAK,SAAS,GAAG,SAAS,MAAM;AAChC,WAAK,SAAS,GAAG,WAAW,MAAM;AAClC,WAAK,SAAS,GAAG,SAAS,MAAM;AAEhC,UAAI,MAAM,IAAI,SAAS,MAAM;AAC7B,UAAI,SAAS,KAAK;AAClB,WAAK,cAAc;AAEnB,WAAK,SAAS;AAAA;AAQf,MAAE,SAAS,WAAY;AACtB,WAAK,WAAW;AAChB,WAAK;AAAA;AAON,MAAE,UAAU,WAAW;AACtB,UAAI,KAAK,UAAU;AAClB,aAAK,SAAS;AACd,aAAK,SAAS;AAAA;AAGf,WAAK,WAAW;AAEhB,WAAK,QAAQ;AACb,WAAK,aAAa;AAClB,WAAK,UAAU;AAEf,WAAK,aAAa;AAElB,WAAK;AAAA;AAUN,MAAE,iBAAiB,WAAY;AAC9B,aAAO,KAAK;AAAA;AAab,MAAE,iBAAiB,WAAW;AAC7B,UAAI,CAAC,KAAK,YAAY;AACrB,aAAK,WAAW,IAAI,SAAS,WAAW,KAAK,OAAO,KAAK,QAAQ,KAAK,cAAc,KAAK;AAAA,aACnF;AACN,aAAK,WAAW,IAAI,SAAS,WAAW,KAAK;AAAA;AAAA;AAY/C,MAAE,aAAa,SAAS,KAAK;AAAE,aAAO;AAAA;AAQtC,MAAE,iBAAiB,WAAY;AAC9B,UAAI,KAAK,eAAe;AAAE;AAAA;AAC1B,WAAK,cAAc;AAAA;AAUpB,MAAE,gBAAgB,SAAU,OAAO;AAClC,UAAI,KAAK,eAAe;AAAE;AAAA;AAC1B,UAAI,QAAQ;AACZ,UAAI,OAAO,SAAU,UAAU;AAC9B,aAAK,WAAW;AAChB,gBAAQ,IAAI,SAAS,cAAc,KAAK;AAAA,aAClC;AACN,gBAAQ;AACR,aAAK,WAAW,MAAM,SAAS,MAAM;AACrC,cAAM,WAAW,KAAK;AACtB,YAAI,MAAM,KAAK,aAAa,KAAK,YAAY,UAAU;AAAE,eAAK,WAAW;AAAA;AAAA;AAE1E,WAAK,iBAAiB,eAAe,KAAK,cAAc;AAAA;AAQzD,MAAE,gBAAgB,WAAY;AAC7B,UAAI,KAAK,eAAe;AAAE;AAAA;AAE1B,WAAK,SAAS;AAEd,UAAI,QAAQ,IAAI,SAAS,MAAM;AAC/B,YAAM,YAAY,KAAK;AAEvB,UAAI,KAAK,WAAW,MAAM;AACzB,cAAM,SAAS,KAAK;AAAA;AAGrB,WAAK,cAAc;AAAA;AAUpB,MAAE,aAAa,SAAU,OAAO;AAC/B,UAAI,KAAK,iBAAiB,CAAC,KAAK,iBAAiB,UAAU;AAAE;AAAA;AAC7D,UAAI,SAAS,MAAM;AAClB,gBAAQ,IAAI,SAAS,WAAW;AAAA;AAEjC,WAAK,cAAc;AAAA;AAUpB,MAAE,cAAc,WAAY;AAC3B,UAAI,OAAO,YAAY,QAAQ,KAAK,UAAU;AAC7C,eAAO;AAAA;AAER,aAAO;AAAA;AAYR,MAAE,kBAAkB;AAUpB,MAAE,cAAc,SAAU,OAAO;AAChC,cAAQ,MAAM;AAAA,aACR;AACJ,eAAK,aAAa,MAAM,OAAO;AAC/B,cAAI,SAAS,KAAK,mBAAmB,KAAK,gBAAgB;AAE1D,cAAI,kBAAkB,UAAU;AAC/B,mBAAO,KAAK,MACV,SAAS,MAAM,KAAK,sBAAsB,OAC1C,SAAS,MAAM,KAAK,qBAAqB;AAAA,iBAGrC;AACN,iBAAK,UAAW,UAAU,KAAK;AAC/B,iBAAK;AAAA;AAEN;AAAA,aACI;AACJ,eAAK,cAAc;AACnB;AAAA,aACI;AACJ,eAAK,WAAW;AAChB;AAAA,aACI;AACJ,eAAK;AACL;AAAA,aACI;AAAA,aACA;AACJ,cAAI,CAAC,KAAK,eAAe;AACxB,iBAAK,cAAc,IAAI,SAAS,WAAW,aAAa,MAAM,KAAK,gBAAgB;AAAA;AAEpF;AAAA;AAAA;AAWH,MAAE,uBAAuB,SAAU,QAAQ;AAC1C,WAAK,UAAU;AACf,WAAK;AAAA;AAUN,MAAE,sBAAsB,SAAU,OAAO;AACxC,WAAK,WAAW;AAAA;AAOjB,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAGR,aAAS,iBAAiB,SAAS,QAAQ,gBAAgB;AAAA;AAQ5D,EAAC,YAAY;AACZ;AAaA,iCAA6B,UAAU,WAAW,MAAM;AACvD,WAAK,2BAA2B,UAAU,WAAW;AAGrD,WAAK,kBAAkB,KAAK;AAG5B,WAAK,mBAAmB;AAElB,WAAK,GAAG,cAAc,KAAK,YAAY;AAAA;AAC7C;AAED,QAAI,IAAI,SAAS,OAAO,qBAAqB,SAAS;AAItD,MAAE,OAAO,WAAY;AAEpB,UAAI,CAAC,KAAK,MAAM;AACf,aAAK,OAAO,KAAK,WAAW,KAAK,MAAM;AAAA;AAGxC,WAAK,KAAK,UAAU;AACpB,WAAK,KAAK;AAEV,WAAK;AAAA;AASN,MAAE,aAAa,WAAY;AAAA;AAG3B,MAAE,iBAAiB,WAAW;AAC7B,UAAI,CAAC,KAAK,YAAY;AACrB,aAAK,WAAW,IAAI,SAAS,gBAAgB,KAAK,OAAO,KAAK,QAAQ,KAAK,cAAc,KAAK;AAAA,aACxF;AACN,aAAK,WAAW,IAAI,SAAS,WAAW,KAAK;AAAA;AAAA;AAW5C,MAAE,aAAa,SAAU,OAAO;AAE5B,UAAI,MAAM,OAAO,iBAAiB;AAC9B,cAAM,OAAO,gBAAgB;AAAA;AAAA;AAWxC,MAAE,gBAAgB,SAAU,QAAQ;AACnC,WAAK,KAAK,uBAAuB,KAAK,KAAK,oBAAoB,kBAAkB,KAAK;AACtF,WAAK,KAAK,YAAY;AACtB,UAAI,KAAK,YAAY;AACX,YAAI,OAAM,OAAO,OAAO,OAAO;AAC/B,YAAI,SAAS,OAAO,UAAU;AAEvC,eAAO,SAAS,MAAM,KAAI,gBAAgB;AAAA;AAE3C,aAAO,OAAO;AAAA;AAGf,aAAS,sBAAsB,SAAS,QAAQ,qBAAqB;AAAA;AAQtE,EAAC,YAAY;AACZ;AAUA,QAAI,kBAAkB,SAAU,MAAM;AACrC,WAAK,QAAQ;AAAA;AAGd,QAAI,IAAI,SAAS,OAAO,iBAAiB,SAAS;AAOlD,MAAE,OAAQ,WAAW;AAAA;AAMrB,MAAE,UAAU,WAAW;AAAA;AAMvB,MAAE,SAAS,WAAW;AAAA;AAEtB,aAAS,kBAAkB,SAAS,QAAQ,iBAAiB;AAAA;AAQ9D,EAAC,YAAY;AACZ;AAUA,wBAAoB,UAAU,KAAK,cAAc;AAChD,WAAK,4BAA4B;AASjC,WAAK,OAAO;AAQZ,WAAK,mBAAmB;AAQxB,WAAK,iBAAiB,SAAS,MAAM,KAAK,oBAAoB;AAQ9D,WAAK,cAAc;AAAA;AAEnB;AAED,QAAI,IAAI,SAAS,OAAO,YAAY,SAAS;AAG7C,MAAE,OAAO,WAAY;AACpB,WAAK,KAAK,SAAS,SAAS,MAAM,KAAK,oBAAoB;AAC3D,WAAK,KAAK,qBAAqB,SAAS,MAAM,KAAK,yBAAyB;AAC5E,WAAK,KAAK,UAAU,SAAS,MAAM,KAAK,cAAc;AAEtD,UAAI,MAAM,IAAI,SAAS,MAAM;AAC7B,UAAI,SAAS,KAAK;AAElB,WAAK,cAAc;AAEnB,WAAK,eAAe,WAAW,SAAS,MAAM,KAAK,gBAAgB,OAAO,KAAK,MAAM;AAErF,WAAK,KAAK,KAAK,oBAAoB,KAAK,MAAM;AAG9C,UAAI,KAAK,KAAK,cAAc,MAAM;AACjC,iBAAS,SAAS,aAAa,KAAK;AACpC,aAAK,cAAc;AAAA;AAAA;AAIrB,MAAE,UAAU,WAAW;AACtB,WAAK;AACL,WAAK,OAAO;AAEZ,WAAK;AAAA;AAUN,MAAE,0BAA0B,WAAY;AACvC,mBAAa,KAAK;AAElB,UAAI,MAAM,KAAK;AAGf,UAAI,IAAI,cAAc,YAAY,IAAI,cAAc,YAAY;AAC/D,aAAK;AAAA;AAAA;AASP,MAAE,eAAe,WAAW;AAC3B,WAAK;AACL,WAAK,cAAc;AAAA;AAQpB,MAAE,qBAAqB,WAAY;AAClC,WAAK,aAAa,KAAK;AACvB,WAAK,UAAU,KAAK,mBAAmB,KAAK,gBAAgB,SAAS,KAAK;AAE1E,WAAK;AAEL,WAAK,cAAc;AAAA;AASpB,MAAE,iBAAiB,WAAY;AAC9B,WAAK;AACL,WAAK,cAAc,IAAI,SAAS,MAAM;AAAA;AAQvC,MAAE,SAAS,WAAW;AACrB,WAAK,KAAK,SAAS;AACnB,WAAK,KAAK,qBAAqB;AAC/B,WAAK,KAAK,UAAU;AACpB,UAAI,KAAK,eAAe,KAAK,KAAK,cAAc,MAAM;AACrD,aAAK,KAAK,WAAW,YAAY,KAAK;AAAA;AAEvC,mBAAa,KAAK;AAAA;AASnB,MAAE,iBAAiB,WAAY;AAAA;AAI/B,aAAS,aAAa,SAAS,QAAQ,YAAY;AAAA;AAQpD,EAAC,YAAY;AACZ;AAWA,6BAAyB,UAAU,KAAK,cAAc;AACrD,WAAK,4BAA4B;AAGjC,WAAK,OAAO;AACZ,WAAK,mBAAmB;AACxB,WAAK,iBAAiB,SAAS,MAAM,KAAK,oBAAoB;AAAA;AAC9D;AAED,QAAI,IAAI,SAAS,OAAO,iBAAiB,SAAS;AAClD,QAAI,KAAI;AAGR,MAAE,OAAO,WAAY;AACpB,UAAI,KAAK,SAAS,MAAM,KAAK,gBAAgB;AAC7C,WAAK,mBAAmB;AAExB,UAAI,KAAK,SAAS,MAAM,KAAK,iBAAiB;AAC9C,WAAK,kBAAkB;AAEvB,WAAK,KAAK,iBAAiB,WAAW;AACtC,WAAK,KAAK,iBAAiB,YAAY;AAIvC,WAAK,KAAK,oBAAoB,KAAK,KAAK,iBAAiB,kBAAkB,KAAK,gBAAgB;AAEhG,WAAK;AAAA;AAIN,MAAE,0BAA0B,WAAY;AACvC,mBAAa,KAAK;AAElB,UAAI,MAAM,KAAK;AAGf,UAAI,IAAI,cAAc,YAAY,IAAI,cAAc,YAAY;AAC/D,aAAK;AAAA;AAAA;AAIP,MAAE,iBAAiB,WAAY;AAAA;AAU/B,MAAE,kBAAkB,SAAU,OAAO;AACpC,UAAI,CAAC,SAAS,MAAM,SAAS,KAAK,MAAM,SAAS,GAAG;AACnD;AAAA;AAGD,UAAI,WAAW,IAAI,SAAS,cAAc,MAAM,QAAQ,MAAM;AAC9D,WAAK,cAAc;AAAA;AAIpB,MAAE,SAAS,WAAY;AACtB,WAAK,KAAK,uBAAuB,KAAK,KAAK,oBAAoB,kBAAkB,KAAK;AACtF,WAAK,KAAK,oBAAoB,WAAW,KAAK;AAC9C,WAAK,KAAK,oBAAoB,YAAY,KAAK;AAE/C,WAAK;AAAA;AAGN,aAAS,kBAAkB,SAAS,QAAQ,iBAAiB;AAAA;AAQ9D,EAAC,YAAY;AACZ;AAeA,wBAAqB,MAAM;AAC1B,WAAK,4BAA4B;AASjC,WAAK,WAAW;AAShB,WAAK,eAAe;AAUpB,WAAK,YAAY;AASjB,WAAK,YAAY;AAUjB,WAAK,eAAe;AAEpB,WAAK,YAAY;AAGjB,WAAK,wBAAwB,SAAS,MAAM,KAAK,kBAAkB;AACnE,WAAK,uBAAuB,SAAS,MAAM,KAAK,iBAAiB;AACjE,WAAK,oBAAoB,SAAS,MAAM,KAAK,cAAc;AAC3D,WAAK,oBAAoB,SAAS,MAAM,KAAK,cAAc;AAC3D,WAAK,sBAAsB,SAAS,MAAM,KAAK,gBAAgB;AAC/D,WAAK,mBAAmB,SAAS,MAAM,KAAK,aAAa;AACzD,WAAK,+BAA+B,SAAS,MAAM,KAAK,yBAAyB;AAEjF,UAAI,CAAC,KAAK,WAAW,OAAO;AAAA;AAAA;AAG5B;AAED,QAAI,IAAI,SAAS,OAAO,YAAY,SAAS;AAU7C,eAAW,mBAAmB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAuBD,MAAE,YAAY,SAAU,KAAK;AAC5B,UAAI,OAAO,KAAK,cAAc;AAC7B,eAAO,KAAK;AAAA;AAEb,aAAO,KAAK;AAAA;AAIb,MAAE,SAAS,WAAY;AACtB,WAAK,WAAW;AAChB,WAAK;AACL,WAAK,SAAS;AAAA;AAIf,MAAE,OAAO,WAAY;AACpB,UAAI,KAAK,YAAY,MAAM;AAC1B,aAAK;AACL;AAAA;AAID,UAAI,KAAK,SAAS,oBAAoB,MAAM;AAC3C,aAAK,SAAS,iBAAiB,aAAa,KAAK,uBAAuB;AACxE,aAAK,SAAS,iBAAiB,YAAY,KAAK,sBAAsB;AACtE,aAAK,SAAS,iBAAiB,SAAS,KAAK,mBAAmB;AAChE,aAAK,SAAS,iBAAiB,SAAS,KAAK,mBAAmB;AAChE,aAAK,SAAS,iBAAiB,WAAW,KAAK,qBAAqB;AAGpE,aAAK,SAAS,iBAAiB,QAAQ,KAAK,kBAAkB;AAC9D,aAAK,SAAS,iBAAiB,oBAAoB,KAAK,8BAA8B;AAAA,aAChF;AAEN,aAAK,SAAS,cAAc,KAAK;AACjC,aAAK,SAAS,aAAa,KAAK;AAChC,aAAK,SAAS,UAAU,KAAK;AAC7B,aAAK,SAAS,UAAU,KAAK;AAC7B,aAAK,SAAS,YAAY,KAAK;AAG/B,aAAK,SAAS,SAAS,KAAK;AAC5B,aAAK,SAAS,qBAAqB,KAAK;AAAA;AAIzC,UAAI,KAAK,aAAa,GAAG;AACxB,aAAK,eAAe,WAAW,SAAS,MAAM,KAAK,gBAAgB,OAAO,KAAK,MAAM;AAAA;AAItF,UAAI;AACH,YAAI,CAAC,KAAK,MAAM,QAAQ;AACvB,eAAK,SAAS;AAAA,eACR;AACN,eAAK,SAAS,KAAK,SAAS,SAAS,kBAAkB,KAAK,MAAM;AAAA;AAAA,eAE3D,QAAP;AACD,aAAK,cAAc,IAAI,SAAS,WAAW,YAAY,MAAM;AAAA;AAAA;AAI/D,MAAE,kBAAkB,SAAU,MAAM;AAEnC,UAAI,SAAS,QAAQ;AACpB,eAAO,OAAO,MAAM,SAAS;AAC7B,aAAK,gBAAgB;AAAA;AAEtB,WAAK,SAAS,eAAe;AAAA;AAc9B,MAAE,wBAAwB,WAAY;AACrC,UAAI,KAAK,SAAS,iCAAiC,UAAU;AAC5D,eAAO,KAAK,SAAS;AAAA,aACf;AACN,eAAO;AAAA;AAAA;AAcT,MAAE,oBAAoB,SAAU,QAAQ;AACvC,UAAI,KAAK,SAAS,6BAA6B,UAAU;AACxD,eAAO,KAAK,SAAS,kBAAkB;AAAA,aACjC;AACN,eAAO;AAAA;AAAA;AAWT,MAAE,kBAAkB,SAAU,OAAO;AACpC,UAAI,CAAC,SAAS,MAAM,SAAS,KAAK,MAAM,SAAS,GAAG;AACnD;AAAA;AAGD,UAAI,WAAW,IAAI,SAAS,cAAc,MAAM,QAAQ,MAAM;AAC9D,WAAK,cAAc;AAAA;AASpB,MAAE,mBAAmB,SAAU,OAAO;AACrC,mBAAa,KAAK;AAClB,WAAK,cAAc;AAAA;AASpB,MAAE,eAAe,SAAU,OAAO;AACjC,WAAK;AACL,WAAK,cAAc,IAAI,SAAS,WAAW,eAAe,MAAM;AAAA;AASjE,MAAE,eAAe,SAAU,OAAO;AACjC,WAAK;AACL,WAAK,cAAc,IAAI,SAAS,WAAW,MAAM;AAAA;AAUlD,MAAE,0BAA0B,SAAU,OAAO;AAC5C,UAAI,KAAK,SAAS,cAAc,GAAG;AAClC,aAAK;AAAA;AAAA;AAcP,MAAE,cAAc,SAAU,OAAO;AAChC,UAAI,KAAK,QAAQ;AAChB;AAAA;AAED,WAAK,SAAS;AAEd,UAAI,SAAQ,KAAK;AACjB,UAAI,QAAO;AACV,aAAK,aAAa;AAClB;AAAA;AAGD,WAAK,YAAY,KAAK;AAEtB,UAAI,KAAK,kBAAkB,eAAe;AACzC,YAAI;AACH,eAAK,YAAY,IAAI,KAAK,CAAC,KAAK;AAAA,iBACxB,GAAP;AAGD,iBAAO,cAAc,OAAO,eAAe,OAAO,qBAAqB,OAAO,kBAAkB,OAAO;AACvG,cAAI,EAAE,SAAS,eAAe,OAAO,aAAa;AACjD,gBAAI,UAAU,IAAI;AAClB,oBAAQ,OAAO,KAAK;AACpB,iBAAK,YAAY,QAAQ;AAAA;AAAA;AAAA;AAI5B,WAAK;AAEL,WAAK,cAAc,IAAI,SAAS,MAAM;AAAA;AAUvC,MAAE,iBAAiB,SAAU,OAAO;AACnC,WAAK;AACL,WAAK,cAAc,IAAI,SAAS,WAAW,mBAAmB,MAAM;AAAA;AAiBrE,MAAE,cAAc,WAAY;AAC3B,UAAI,SAAS,SAAS,KAAK,SAAS;AACpC,UAAI,UAAU,OAAO,UAAU,KAAK;AACnC,eAAO,IAAI,MAAM;AAAA,iBACP,UAAU,GAAG;AACvB,YAAK,WAAY,KAAK,SAAS,WAAW;AAAE,iBAAO,IAAI,MAAM;AAAA;AAC7D,eAAO;AAAA,aACD;AACN,eAAO;AAAA;AAAA;AAWT,MAAE,eAAe,WAAY;AAC5B,UAAI,KAAK,aAAa,MAAM;AAC3B,eAAO,KAAK;AAAA;AAGb,UAAI,KAAK,SAAS,YAAY,MAAM;AACnC,eAAO,KAAK,SAAS;AAAA;AAItB,UAAI;AACH,YAAI,KAAK,SAAS,gBAAgB,MAAM;AACvC,iBAAO,KAAK,SAAS;AAAA;AAAA,eAEd,GAAP;AAAA;AAIF,UAAI;AACH,YAAI,KAAK,SAAS,eAAe,MAAM;AACtC,iBAAO,KAAK,SAAS;AAAA;AAAA,eAEd,GAAP;AAAA;AAGF,aAAO;AAAA;AAgBR,MAAE,aAAa,SAAU,MAAM;AAE9B,UAAI,cAAc,SAAS,SAAS,cAAc;AAClD,UAAI,UAAU;AAGd,UAAI,MAAM;AACV,UAAI,OAAO,gBAAgB;AAC1B,cAAM,IAAI;AAEV,YAAI,eAAe,IAAI,oBAAoB,UAAa,OAAO,gBAAgB;AAC9E,gBAAM,IAAI;AAAA;AAAA,aAEL;AACN,iBAAS,IAAI,GAAG,IAAI,EAAE,iBAAiB,QAAQ,IAAI,GAAG,KAAK;AAC1D,cAAI,YAAY,EAAE,iBAAiB;AACnC,cAAI;AACH,kBAAM,IAAI,cAAc;AACxB;AAAA,mBACQ,GAAP;AAAA;AAAA;AAGH,YAAI,OAAO,MAAM;AAChB,iBAAO;AAAA;AAAA;AAKT,UAAI,KAAK,YAAY,QAAQ,SAAS,aAAa,OAAO,KAAK,OAAO;AACrE,aAAK,WAAW;AAAA;AAIjB,UAAI,KAAK,YAAY,IAAI,kBAAkB;AAC1C,YAAI,iBAAiB,KAAK;AAAA;AAI3B,WAAK,YAAa,OAAO,IAAI,iBAAiB,WAAY,IAAI;AAE9D,UAAI,MAAM;AACV,UAAI,KAAK,UAAU,SAAS,QAAQ,KAAK;AACxC,cAAM,SAAS,SAAS,SAAS,KAAK,KAAK,KAAK;AAAA,aAC1C;AACN,cAAM,KAAK;AAAA;AAIZ,UAAI,KAAK,KAAK,UAAU,SAAS,QAAQ,KAAK,KAAK;AAEnD,UAAI,eAAe,eAAe,kBAAkB,KAAK,aAAa,GAAG;AACxE,gBAAQ,YAAY,SAAS;AAAA;AAI9B,UAAI,KAAK,UAAU,KAAK,UAAU,SAAS,QAAQ,MAAM;AACxD,gBAAQ,kBAAkB;AAAA;AAG3B,UAAI,CAAC,eAAe,CAAC,QAAQ,qBAAqB;AACjD,gBAAQ,sBAAsB;AAAA;AAG/B,UAAI,KAAK,SAAS;AACjB,iBAAS,KAAK,KAAK,SAAS;AAC3B,kBAAQ,KAAK,KAAK,QAAQ;AAAA;AAAA;AAI5B,WAAK,KAAK,SAAS;AAClB,YAAI,iBAAiB,GAAG,QAAQ;AAAA;AAGjC,UAAI,eAAe,kBAAkB,KAAK,oBAAoB,QAAW;AACxE,YAAI,kBAAkB,KAAK;AAAA;AAG5B,WAAK,WAAW;AAEhB,aAAO;AAAA;AAQR,MAAE,SAAS,WAAY;AACtB,mBAAa,KAAK;AAElB,UAAI,KAAK,SAAS,uBAAuB,MAAM;AAC9C,aAAK,SAAS,oBAAoB,aAAa,KAAK;AACpD,aAAK,SAAS,oBAAoB,YAAY,KAAK;AACnD,aAAK,SAAS,oBAAoB,SAAS,KAAK;AAChD,aAAK,SAAS,oBAAoB,SAAS,KAAK;AAChD,aAAK,SAAS,oBAAoB,WAAW,KAAK;AAClD,aAAK,SAAS,oBAAoB,QAAQ,KAAK;AAC/C,aAAK,SAAS,oBAAoB,oBAAoB,KAAK;AAAA,aACrD;AACN,aAAK,SAAS,cAAc;AAC5B,aAAK,SAAS,aAAa;AAC3B,aAAK,SAAS,UAAU;AACxB,aAAK,SAAS,UAAU;AACxB,aAAK,SAAS,YAAY;AAC1B,aAAK,SAAS,SAAS;AACvB,aAAK,SAAS,qBAAqB;AAAA;AAAA;AAIrC,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAGR,aAAS,aAAa,SAAS,QAAQ,YAAY;AAAA;AAoBpD,EAAC,YAAY;AACZ;AAmKA,uBAAoB,WAAW,UAAU,aAAa;AACrD,WAAK;AASL,WAAK,WAAW;AAUhB,WAAK,iBAAiB;AAUtB,WAAK,sBAAsB;AAS3B,WAAK,OAAO;AAgCZ,WAAK,sBAAsB;AAQ3B,WAAK,cAAc;AAUnB,WAAK,kBAAkB;AAmBvB,WAAK,oBAAoB;AAAA,QACf,SAAS;AAAA,QAClB,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA;AAUV,WAAK,uBAAuB,KAAK,kBAAkB;AAEnD,WAAK,KAAK,WAAW,UAAU;AAAA;AAGhC,QAAI,IAAI,SAAS,OAAO,WAAW,SAAS;AAC5C,QAAI,KAAI;AAGR,QAAI;AACH,aAAO,iBAAiB,IAAG;AAAA,QAC1B,MAAM,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,QAAQ;AAAA,WAAS;AAAA,QAC9E,KAAK,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,QAAQ;AAAA,WAAQ;AAAA,QAE5E,QAAQ,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAW;AAAA,QAChF,KAAK,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAQ;AAAA,QAC1E,MAAM,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAS;AAAA,QAC5E,SAAS,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAY;AAAA,QAClF,OAAO,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAU;AAAA,QAC9E,YAAY,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAe;AAAA,QACxF,MAAM,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAS;AAAA,QAC5E,OAAO,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAU;AAAA,QAC9E,UAAU,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAa;AAAA,QACpF,OAAO,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAU;AAAA,QAC9E,OAAO,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAU;AAAA,QAC9E,aAAa,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAgB;AAAA,QAC1F,KAAK,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAQ;AAAA,QAC1E,MAAM,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAS;AAAA,QAC5E,KAAK,EAAE,KAAK,SAAS,UAAU,WAAW;AAAE,iBAAO,SAAS,MAAM;AAAA,WAAQ;AAAA;AAAA,aAEnE,GAAP;AAAA;AAUF,MAAE,OAAO,SAAU,WAAW,UAAU,aAAa;AAapD,WAAK,YAAY;AACjB,WAAK,aAAa;AAClB,WAAK,aAAa;AASlB,WAAK,UAAU;AAWf,WAAK,YAAY;AAcjB,WAAK,eAAe;AAUpB,WAAK,0BAA0B;AAS/B,WAAK,0BAA0B;AAQ/B,WAAK,gBAAgB;AAQrB,WAAK,aAAa;AAQlB,WAAK,mBAAmB;AASxB,WAAK,iBAAiB;AAStB,WAAK,kBAAkB;AAQvB,WAAK,iBAAiB;AAQtB,WAAK,oBAAoB;AAWzB,WAAK,YAAY;AAUjB,WAAK,kBAAkB;AASvB,WAAK,eAAe;AAUpB,WAAK,iBAAiB;AAStB,WAAK,gBAAgB;AAAA;AAqDtB,MAAE,iBAAiB,SAAU,QAAQ;AACpC,UAAI,CAAC,UAAU,CAAC,OAAO,aAAa;AACnC,cAAM,IAAI,MAAM;AAAA,iBACN,KAAK,kBAAkB,QAAQ,WAAW,IAAI;AACxD,cAAM,IAAI,MAAM;AAAA;AAGjB,WAAK,kBAAkB,QAAQ;AAAA;AAShC,MAAE,mBAAmB,SAAU,QAAQ;AACtC,UAAI,MAAM,KAAK,kBAAkB,QAAQ;AACzC,UAAI,OAAO,MAAM,MAAM,KAAK,uBAAuB,GAAG;AACrD,aAAK,kBAAkB,OAAO,KAAK;AAAA;AAAA;AAYrC,MAAE,eAAe,SAAU,OAAO;AAGjC,WAAK,YAAa,SAAS,SAAS,OAAO,kBAAkB;AAC7D,aAAO,KAAK;AAAA;AASb,MAAE,YAAY,WAAY;AACzB,WAAK;AAAA;AAuBN,MAAE,SAAS,SAAU,WAAW;AAC/B,UAAI,OAAO;AAEX,UAAI,aAAa,CAAC,MAAM,QAAQ,YAAY;AAC3C,eAAO,CAAC;AAAA,iBACE,WAAW;AACrB,eAAO;AAAA,iBACG,UAAU,SAAS,GAAG;AAChC;AAAA;AAGD,UAAI,mBAAmB;AAGvB,UAAI,CAAC,MAAM;AACV,aAAK;AACL,iBAAS,KAAK,KAAK,gBAAgB;AAClC,eAAK,aAAa,KAAK,eAAe;AAAA;AAEvC,aAAK,KAAK,KAAK,WAAW,KAAK;AAAA,aAGzB;AACN,eAAO,KAAK,QAAQ;AACnB,cAAI,OAAO,KAAK;AAChB,cAAI,IAAI,KAAK,UAAU;AAGvB,eAAK,IAAI,KAAK,WAAW,SAAS,GAAG,KAAK,GAAG,KAAK;AACjD,uBAAW,KAAK,WAAW,GAAG;AAC9B,gBAAI,SAAS,MAAM,QAAQ,SAAS,OAAO,MAAM;AAChD,mBAAK,WAAW,OAAO,GAAG,GAAG,GAAG;AAChC;AAAA;AAAA;AAKF,eAAK,IAAI,KAAK,iBAAiB,SAAS,GAAG,KAAK,GAAG,KAAK;AACvD,uBAAW,KAAK,iBAAiB,GAAG;AACpC,gBAAI,SAAS,MAAM,QAAQ,SAAS,OAAO,MAAM;AAChD,mBAAK,iBAAiB,OAAO,GAAG,GAAG,GAAG;AACtC;AAAA;AAAA;AAIF,cAAI,GAAG;AACN,iBAAK,aAAa,KAAK,QAAQ;AAAA,iBACzB;AACN,qBAAS,IAAI,KAAK,cAAc,SAAS,GAAG,KAAK,GAAG,KAAK;AACxD,kBAAI,WAAW,KAAK,cAAc,GAAG;AACrC,kBAAI,SAAS,MAAM,QAAQ,SAAS,OAAO,MAAM;AAChD,qBAAK,cAAc,OAAO,GAAG,GAAG,GAAG;AACnC,mCAAmB;AACnB;AAAA;AAAA;AAAA;AAAA;AAOJ,YAAI,kBAAkB;AACrB,eAAK;AAAA;AAAA;AAAA;AAaR,MAAE,QAAQ,WAAY;AACrB,WAAK;AACL,eAAS,KAAK,KAAK,gBAAgB;AAClC,aAAK,aAAa,KAAK,eAAe;AAAA;AAIvC,UAAI,IAAI;AACR,eAAS,IAAI,GAAG,IAAI,KAAK,iBAAiB,QAAQ,IAAI,GAAG,KAAK;AAC7D,UAAE,KAAK,KAAK,iBAAiB,GAAG;AAAA;AAGjC,WAAK,aAAa,GAAG;AAAA;AAqBtB,MAAE,gBAAgB,SAAU,QAAQ;AACnC,UAAI,UAAU,MAAM;AACnB;AAAA;AAGD,UAAI,OAAO,sBAAsB,MAAM;AACtC,aAAK,SAAS,KAAK;AACnB,YAAI,MAAM,OAAO;AACjB,YAAI,QAAQ;AAEZ,YAAI,IAAI,SAAS,MAAM;AACtB,mBAAS,IAAI,GAAG,IAAI,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAK;AACjD,iBAAK,eAAe,IAAI,MAAM,MAAM;AAAA;AAAA;AAItC,YAAI,IAAI,cAAc,MAAM;AAC3B,eAAK,IAAI,GAAG,IAAI,IAAI,WAAW,QAAQ,IAAI,GAAG,KAAK;AAClD,iBAAK,oBAAoB,IAAI,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAqBlD,MAAE,oBAAoB,SAAU,OAAO;AACtC,WAAK,kBAAkB;AACvB,UAAI,CAAC,KAAK,WAAW,KAAK,WAAW,SAAS,GAAG;AAChD,aAAK;AAAA;AAAA;AA2BP,MAAE,WAAW,SAAU,MAAM,SAAS,UAAU;AAC/C,UAAI,QAAQ,MAAM;AACjB,YAAI,QAAQ,IAAI,SAAS,WAAW;AACpC,aAAK,WAAW;AAChB;AAAA;AAED,WAAK,SAAS,MAAM,MAAM;AAE1B,UAAI,YAAY,OAAO;AACtB,aAAK,UAAU;AAAA,aACT;AACN,aAAK,UAAU;AAAA;AAAA;AA6CjB,MAAE,eAAe,SAAU,UAAU,SAAS,UAAU;AACvD,UAAI,WAAW;AACf,UAAI,OAAO;AAGX,UAAI,MAAM,QAAQ,WAAW;AAC5B,YAAI,SAAS,UAAU,GAAG;AACzB,cAAI,QAAQ,IAAI,SAAS,WAAW;AACpC,eAAK,WAAW;AAChB;AAAA;AAED,mBAAW;AAAA,iBAGD,OAAO,aAAc,UAAU;AACzC,mBAAW;AAAA,UACV;AAAA,YACC,KAAK;AAAA,YACL,MAAM,GAAE;AAAA;AAAA;AAAA,iBAIA,OAAO,YAAa,UAAU;AAGxC,YAAI,SAAS,QAAQ,QAAW;AAC/B,cAAI,SAAS,QAAQ,MAAM;AAC1B,qBAAS,OAAO,GAAE;AAAA,qBACR,SAAS,QAAQ,GAAE,UAAU;AACvC,gBAAI,QAAQ,IAAI,SAAS,WAAW;AACpC,iBAAK,WAAW;AAAA;AAEjB,qBAAW,CAAC;AAAA,mBAGF,SAAS,aAAa,QAAW;AAC3C,qBAAW,SAAS;AACpB,iBAAO,SAAS;AAAA;AAAA,aAIX;AACN,YAAI,QAAQ,IAAI,SAAS,WAAW;AACpC,aAAK,WAAW;AAChB;AAAA;AAGD,eAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,IAAI,GAAG,KAAK;AAChD,aAAK,SAAS,SAAS,IAAI,MAAM;AAAA;AAGlC,UAAI,YAAY,OAAO;AACtB,aAAK,UAAU;AAAA,aACT;AACN,aAAK,UAAU;AAAA;AAAA;AASjB,MAAE,OAAO,WAAY;AACpB,WAAK,UAAU;AAAA;AAahB,MAAE,UAAU,SAAU,OAAO;AAC5B,aAAO,KAAK,eAAe,UAAU,KAAK,gBAAgB;AAAA;AA6B3D,MAAE,YAAY,SAAU,OAAO,WAAW;AACzC,UAAI,OAAO,KAAK,eAAe,UAAU,KAAK,gBAAgB;AAC9D,UAAI,QAAQ,MAAM;AACjB,eAAO;AAAA;AAER,UAAI,KAAK,KAAK;AACd,UAAI,aAAa,KAAK,kBAAkB,KAAK;AAC5C,eAAO,KAAK,kBAAkB;AAAA;AAE/B,aAAO,KAAK,eAAe;AAAA;AAY5B,MAAE,WAAW,SAAU,QAAQ;AAC9B,UAAI,MAAM;AACV,eAAS,KAAK,KAAK,gBAAgB;AAClC,YAAI,OAAO,KAAK,eAAe;AAC/B,YAAI,SAAS,KAAK,UAAU;AAC5B,YAAI,WAAW,QAAQ,UAAU,MAAM;AACtC;AAAA;AAED,YAAI,KAAK;AAAA,UACR;AAAA,UACA;AAAA,UACA,WAAW,KAAK,UAAU,GAAG;AAAA;AAAA;AAG/B,aAAO;AAAA;AAaR,MAAE,YAAY,SAAU,OAAO;AAC9B,WAAK,UAAU;AACf,UAAI,CAAC,KAAK,SAAS;AAClB,aAAK;AAAA;AAAA;AAWP,MAAE,QAAQ,WAAY;AACrB,aAAO,KAAK,cAAc,QAAQ;AACjC,aAAK,cAAc,MAAM;AAAA;AAE1B,WAAK,aAAa,SAAS;AAC3B,WAAK,eAAe,SAAS;AAC7B,WAAK,yBAAyB;AAC9B,WAAK,aAAa;AAClB,WAAK,gBAAgB;AAAA;AAmBtB,MAAE,WAAW,SAAU,OAAO,MAAM,UAAU;AAC7C,UAAI,OAAO,KAAK,gBAAgB,OAAO,MAAM;AAC7C,UAAI,QAAQ,MAAM;AACjB;AAAA;AAED,UAAI,SAAS,KAAK,cAAc;AAChC,UAAI,UAAU,MAAM;AACnB,YAAI,aAAa,QAAQ;AACxB,iBAAO,UAAU,KAAK;AAAA;AAEvB,aAAK,UAAU;AACf,aAAK,WAAW,KAAK;AACrB,aAAK,iBAAiB,KAAK;AAE3B,aAAK;AACL,aAAK;AAGL,YAAK,KAAK,uBACL,KAAK,QAAQ,SAAS,MAAM,cAG5B,KAAK,kBAAkB,MAAM;AACjC,eAAK,aAAa,KAAK;AACvB,eAAK,eAAe,KAAK;AAAA;AAAA;AAAA;AAsB5B,MAAE,kBAAkB,SAAU,OAAO,MAAM,UAAU;AACpD,UAAI,OAAO,SAAS,SAAS,OAAO;AACpC,UAAI,QAAQ,MAAM;AACjB,eAAO;AAAA;AAGR,UAAI,KAAK;AACT,UAAI,cAAc,YAAY,KAAK;AAEnC,UAAI,KAAK,eAAe,QAAQ;AAC/B,YAAI,CAAC,KAAK,MAAM;AACf,iBAAO;AAAA;AAER,YAAI,MAAM;AACT,eAAK;AACL,cAAI,YAAY,SAAS,SAAS,SAAS;AAE3C,cAAI,eAAe,QAAQ,CAAC,UAAU,YAAY,CAAC,UAAU,UAAU;AACtE,iBAAK,cAAc;AAAA;AAAA,mBAEV,eAAe,MAAM;AAC/B,eAAK;AAAA;AAAA,aAEA;AAEN,YAAI,QAAQ,SAAS,SAAS,SAAS,KAAK;AAC5C,YAAI,MAAM,WAAW;AACpB,eAAK,MAAM,MAAM;AAAA;AAElB,YAAI,KAAK,QAAQ,MAAM;AACtB,eAAK,OAAO,SAAS,aAAa,mBAAmB,KAAK;AAAA;AAI3D,YAAI,SAAS,KAAK;AAClB,YAAI,CAAC,MAAM,YAAY,CAAC,MAAM,UAAU;AACvC,cAAI,MAAM;AACT,iBAAK;AACL,gBAAI,YAAY,SAAS,SAAS,SAAS;AAC3C,qBAAS,OAAO;AAEhB,gBAAI,eAAe,QAAQ,CAAC,UAAU,YAAY,CAAC,UAAU,UAAU;AACtE,mBAAK,cAAc;AAAA;AAAA,qBAEV,eAAe,MAAM;AAC/B,iBAAK;AAAA;AAAA;AAGP,aAAK,MAAM,KAAK,KAAK;AAAA;AAEtB,WAAK,OAAO;AAGZ,UAAI,KAAK,OAAO,UAAa,KAAK,OAAO,QAAQ,KAAK,OAAO,IAAI;AAChE,aAAK,KAAK;AAAA;AAIX,UAAI,gBAAgB,KAAK,eAAe,KAAK,SAAS,KAAK,oBAAoB,KAAK;AACpF,UAAI,eAAe;AAElB,YAAI,SAAS,cAAc,SAAS,KAAK,cAAc,OAAO,MAAM;AAGpE,YAAI,WAAW,OAAO;AACrB,iBAAO;AAAA,mBAGG,WAAW,MAAM;AAAA,mBAIjB,UAAU,MAAM;AAC1B,eAAK,UAAU;AAAA;AAIhB,gBAAQ,SAAS,SAAS,SAAS,KAAK;AACxC,YAAI,MAAM,aAAa,MAAM;AAC5B,eAAK,MAAM,MAAM;AAAA;AAAA;AAKnB,WAAK,eAAe,KAAK,MAAM;AAC/B,WAAK,gBAAgB,KAAK,OAAO;AAEjC,UAAI,KAAK,eAAe,MAAM;AAC7B,aAAK,cAAc,KAAK;AAAA;AAGzB,aAAO;AAAA;AAUR,MAAE,gBAAgB,SAAU,MAAM;AACjC,UAAI,KAAK,WAAW,MAAM;AACzB,eAAO,KAAK;AAAA;AAIb,UAAI,YAAY,KAAK;AAErB,eAAS,IAAI,GAAG,IAAI,KAAK,kBAAkB,QAAQ,KAAK;AACvD,YAAI,SAAS,KAAK,kBAAkB;AACpC,YAAI,UAAU,OAAO,YAAY,OAAO;AACvC,iBAAO,IAAI,OAAO,MAAM;AAAA;AAAA;AAK1B,aAAO;AAAA;AAWR,MAAE,YAAY,WAAY;AACzB,UAAI,KAAK,SAAS;AACjB;AAAA;AAID,UAAI,CAAC,KAAK,yBAAyB;AAClC,aAAK;AACL,aAAK,0BAA0B;AAAA;AAIhC,UAAI,KAAK,aAAa,KAAK,iBAAiB;AAC3C,aAAK,SAAS;AACd,aAAK;AAGL,YAAI,KAAK,QAAQ,KAAK,KAAK,MAAM;AAChC,eAAK,KAAK;AAAA;AAAA,aAEL;AACN,aAAK,SAAS;AAAA;AAIf,eAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,KAAK;AAChD,YAAI,KAAK,cAAc,UAAU,KAAK,iBAAiB;AACtD;AAAA;AAED,YAAI,SAAS,KAAK,WAAW;AAI7B,YAAI,CAAC,KAAK,cAAc,SAAS;AAChC;AAAA;AAED,aAAK,WAAW,OAAO,GAAG;AAC1B;AACA,aAAK,UAAU;AAAA;AAAA;AAUjB,MAAE,YAAY,SAAU,QAAQ;AAC/B,aAAO,GAAG,YAAY,KAAK,iBAAiB;AAC5C,aAAO,GAAG,YAAY,KAAK,iBAAiB;AAC5C,aAAO,GAAG,YAAY,KAAK,qBAAqB;AAChD,aAAO,GAAG,SAAS,KAAK,cAAc;AACtC,aAAO,GAAG,aAAa,KAAK,kBAAkB;AAC9C,WAAK,cAAc,KAAK;AACxB,WAAK,eAAe,OAAO;AAC3B,aAAO;AAAA;AAWR,MAAE,kBAAkB,SAAU,OAAO;AACpC,YAAM,SAAS;AACf,WAAK,cAAc;AAAA;AASpB,MAAE,mBAAmB,SAAU,OAAO;AACrC,UAAI,WAAW,IAAI,SAAS,WAAW,mBAAmB,MAAM,MAAM;AACtE,WAAK,WAAW;AAAA;AAUjB,MAAE,eAAe,SAAU,OAAO;AACjC,UAAI,SAAS,MAAM;AACnB,WAAK;AAEL,WAAK,mBAAmB,QAAQ;AAChC,WAAK;AAEL,UAAI,WAAW,IAAI,SAAS,WAAW,mBAAmB,MAAM,OAAO;AAGvE,WAAK,WAAW;AAEhB,UAAI,CAAC,KAAK,aAAa;AACtB,aAAK,gBAAgB;AACrB,aAAK,eAAe;AACpB,aAAK;AAAA,aACC;AACN,aAAK,UAAU;AAAA;AAAA;AAYjB,MAAE,sBAAsB,SAAU,OAAO;AACxC,UAAI,SAAS,MAAM;AACnB,UAAI,OAAO,OAAO;AAElB,UAAI,SAAS,OAAO;AACpB,WAAK,eAAe,KAAK,MAAM;AAC/B,UAAI,YAAY,OAAO,UAAU;AACjC,UAAI,aAAa,QAAQ,cAAc,QAAQ;AAC9C,aAAK,kBAAkB,KAAK,MAAM;AAAA;AAGnC,WAAK,iBAAiB;AAGtB,WAAK,gBAAgB;AAErB,UAAI,CAAC,KAAK,mBAAmB,SAAS;AAErC,aAAK,qBAAqB,MAAM;AAAA;AAIjC,WAAK,eAAe;AAAA;AAarB,MAAE,mBAAmB,SAAU,QAAQ;AAGtC,UAAI,OAAO,OAAO;AAClB,UAAI,SAAS,MAAM;AAClB;AAAA;AAGD,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACrC,YAAI,OAAO,KAAK,GAAG;AAGnB,aAAK,gBAAgB,KAAK,OAAO;AACjC,aAAK,eAAe,KAAK,MAAM;AAG/B,aAAK,eAAe,KAAK,MAAM,KAAK,GAAG;AACvC,aAAK,kBAAkB,KAAK,MAAM,KAAK,GAAG;AAAA;AAAA;AAc5C,MAAE,qBAAqB,SAAU,QAAQ,YAAY;AACpD,UAAI,OAAO,OAAO;AAElB,UAAK,KAAK,uBAAuB,KAAK,QAAQ,SAAS,MAAM,cACxD,KAAK,eAAe;AAGxB,YAAI,kBAAkB,SAAS,kBAAkB;AAChD,eAAK,0BAA0B;AAAA;AAGhC,YAAI,QAAQ,SAAS,QAAQ,KAAK,cAAc;AAChD,YAAI,SAAS,IAAI;AAChB,iBAAO;AAAA;AAER,aAAK,eAAe,SAAU,eAAe,OAAQ,OAAO;AAE5D,aAAK;AACL,eAAO;AAAA;AAGR,aAAO;AAAA;AAYR,MAAE,wBAAwB,WAAY;AACrC,UAAI,IAAI,KAAK,eAAe;AAE5B,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC3B,YAAI,OAAO,KAAK,eAAe;AAC/B,YAAI,SAAS,MAAM;AAClB;AAAA;AAED,YAAI,SAAS,MAAM;AAClB;AAAA;AAGD,YAAI,WAAW,KAAK,eAAe,KAAK;AACxC,YAAI,KAAK,QAAQ,SAAS,MAAM,YAAY;AAE3C,mBAAS,SAAS,aAAa;AAAA;AAGhC,YAAI,SAAS,KAAK;AAClB,aAAK,qBAAqB,MAAM;AAChC,aAAK,eAAe,KAAK;AAAA;AAAA;AAY3B,MAAE,uBAAuB,SAAU,MAAM,QAAQ;AAChD,WAAK;AAIL,UAAI,CAAC,KAAK,uBAAuB,KAAK,QAAQ,SAAS,MAAM,YAAY;AACxE,YAAI,MAAM,OAAO;AACjB,iBAAS,SAAS,aAAa;AAAA;AAGhC,WAAK;AACL,WAAK,kBAAkB,MAAM;AAC7B,WAAK;AAAA;AAYN,MAAE,gBAAgB,SAAU,QAAQ;AACnC,UAAI,CAAC,KAAK,uBAAuB,OAAO,WAAW;AAClD,eAAO;AAAA;AAER,UAAI,OAAO,OAAO;AAClB,UAAI,KAAK,QAAQ,SAAS,MAAM,YAAY;AAC3C,eAAO;AAAA;AAER,UAAI,KAAK,yBAAyB;AACjC,eAAO;AAAA;AAGR,UAAI,QAAQ,KAAK,aAAa,QAAQ;AACtC,UAAI,IAAI;AACR,aAAO,IAAI,OAAO;AACjB,YAAI,YAAY,KAAK,eAAe;AACpC,YAAI,aAAa,MAAM;AACtB,iBAAO;AAAA;AAER;AAAA;AAED,WAAK,0BAA0B;AAC/B,aAAO;AAAA;AASR,MAAE,kBAAkB,SAAU,QAAQ;AACrC,UAAI,IAAI,KAAK,cAAc;AAC3B,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC3B,YAAI,KAAK,cAAc,MAAM,QAAQ;AACpC,eAAK,cAAc,OAAO,GAAG;AAC7B;AAAA;AAAA;AAAA;AAWH,MAAE,iBAAiB,SAAS,QAAQ;AACnC,UAAI,OAAO,OAAO;AAClB,UAAI,MAAM;AACT,eAAO,KAAK;AAAA;AAAA;AAUd,MAAE,kBAAkB,SAAU,OAAO;AACpC,UAAI,SAAS,MAAM;AACnB,WAAK,kBAAkB,OAAO,WAAW,OAAO;AAChD,WAAK;AAAA;AAkBN,MAAE,kBAAkB,WAAY;AAC/B,UAAI,SAAS,KAAK,kBAAkB,KAAK;AACzC,UAAI,YAAY,KAAK,YAAY,KAAK;AACtC,UAAI,YAAY,GAAG;AAClB,YAAI,QAAQ;AACZ,iBAAS,IAAI,GAAG,IAAI,KAAK,cAAc,QAAQ,IAAI,GAAG,KAAK;AAC1D,mBAAS,KAAK,cAAc,GAAG;AAAA;AAEhC,kBAAW,QAAQ,YAAc,aAAY,KAAK;AAAA;AAGnD,UAAI,KAAK,iBAAiB,QAAQ;AACjC,aAAK,cAAc;AACnB,aAAK,gBAAgB;AAAA;AAAA;AAWvB,MAAE,eAAe,SAAU,MAAM;AAChC,aAAO,KAAK,eAAe,KAAK;AAChC,aAAO,KAAK,kBAAkB,KAAK;AACnC,aAAO,KAAK,eAAe,KAAK;AAChC,aAAO,KAAK,gBAAgB,KAAK;AAAA;AAWlC,MAAE,oBAAoB,SAAU,MAAM,UAAU;AAC/C,UAAI,KAAK,iBAAiB,KAAK,SAAS;AACvC;AAAA;AAED,UAAI,CAAC,KAAK,iBAAiB,iBAAiB;AAC3C;AAAA;AAID,UAAI,QAAQ,IAAI,SAAS,MAAM;AAC/B,YAAM,WAAW;AACjB,YAAM,SAAS;AACf,YAAM,QAAQ;AACd,YAAM,OAAO;AAEb,WAAK,cAAc;AAAA;AAWpB,MAAE,oBAAoB,SAAU,MAAM,QAAQ;AAC7C,UAAI,KAAK,iBAAiB,KAAK,SAAS;AACvC;AAAA;AAGD,UAAI,QAAQ,IAAI,SAAS,MAAM;AAC/B,YAAM,SAAS;AACf,YAAM,OAAO;AACb,YAAM,SAAS,KAAK,eAAe,KAAK;AACxC,YAAM,YAAY,KAAK,kBAAkB,KAAK;AAG9C,UAAI,KAAK,iBAAiB;AACzB,aAAK,gBAAgB;AAAA;AAGtB,WAAK,iBAAiB,eAAe,KAAK,cAAc;AAAA;AAUzD,MAAE,iBAAiB,SAAU,MAAM;AAClC,UAAI,QAAQ,IAAI,SAAS,MAAM;AAC/B,YAAM,OAAO;AACb,WAAK,iBAAiB,gBAAgB,KAAK,cAAc;AAAA;AAG1D,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAGR,aAAS,YAAY,SAAS,QAAQ,WAAW;AAAA;AAOlD,EAAC,YAAY;AACZ;AAUA,wBAAoB,UAAU;AAC7B,WAAK,2BAA2B,UAAU,MAAM,SAAS,MAAM;AAAA;AAC/D;AAED,QAAI,IAAI,SAAS,OAAO,YAAY,SAAS;AAC7C,QAAI,KAAI;AAWR,OAAE,cAAc,SAAU,MAAM;AAC/B,aAAO,KAAK,QAAQ,SAAS,MAAM;AAAA;AAGpC,aAAS,aAAa,SAAS,QAAQ,YAAY;AAAA;AAQpD,EAAC,YAAY;AACZ;AAUA,0BAAsB,UAAU;AAC/B,WAAK,2BAA2B,UAAU,MAAM,SAAS,MAAM;AAC/D,WAAK,GAAG,cAAc,KAAK,YAAY;AAAA;AACvC;AAED,QAAI,IAAI,SAAS,OAAO,cAAc,SAAS;AAC/C,QAAI,KAAI;AAWR,OAAE,cAAc,SAAU,MAAM;AAC/B,aAAO,KAAK,QAAQ,SAAS,MAAM;AAAA;AAUpC,MAAE,aAAa,SAAU,OAAO;AAC/B,YAAM,OAAO,gBAAgB;AAAA;AAG9B,aAAS,eAAe,SAAS,QAAQ,cAAc;AAAA;AAQxD,EAAC,YAAY;AACZ;AAWA,uBAAmB,UAAU,WAAW;AACvC,WAAK,2BAA2B,UAAU,WAAW,SAAS,MAAM;AAGpE,WAAK,kBAAkB,KAAK;AAG5B,WAAK,mBAAmB;AAExB,UAAI,WAAW;AACd,aAAK,OAAO,SAAS,SAAS;AAAA,aACxB;AACN,aAAK,OAAO,SAAS,SAAS;AAAA;AAG/B,WAAK,KAAK,MAAM;AAChB,WAAK,KAAK,OAAO;AAAA;AACjB;AAED,QAAI,IAAI,SAAS,OAAO,WAAW,SAAS;AAC5C,QAAI,KAAI;AAWR,OAAE,cAAc,SAAU,MAAM;AAC/B,aAAO,KAAK,QAAQ,SAAS,MAAM;AAAA;AAWpC,MAAE,gBAAgB,SAAU,QAAQ;AACnC,UAAI,KAAK,YAAY;AACpB,YAAI,MAAM,OAAO;AAEjB,YAAI,IAAI,YAAY;AACnB,cAAI,WAAW,UAAU,OAAO,UAAU;AAAA,eACpC;AACN,cAAI,WAAW,SAAS,SAAS,KAAK,OAAO,UAAU;AACvD,cAAI,YAAY;AAAA;AAAA,aAEX;AACN,cAAM,KAAK;AAAA;AAGZ,eAAS,SAAS,aAAa;AAE/B,aAAO;AAAA;AAGR,aAAS,YAAY,SAAS,QAAQ,WAAW;AAAA;AAQlD,EAAC,YAAY;AACZ;AAcA,wBAAoB,UAAU,WAAW;AACxC,WAAK,2BAA2B,UAAU,WAAW,SAAS;AAS9D,WAAK,SAAS;AASd,WAAK,WAAW;AAShB,WAAK,SAAS;AAQd,WAAK,iBAAiB;AAStB,WAAK,eAAe;AAOpB,WAAK,aAAc,SAAS,cAAc,SAAa,OAAO,SAAS;AAEvE,WAAK,cAAc;AAAA;AAEpB,QAAI,IAAI,SAAS,OAAO,YAAY,SAAS;AAU1C,eAAW,cAAc,SAAU,MAAM;AACrC,aAAO,KAAK,QAAQ,SAAS,MAAM,QAAQ,KAAK,QAAQ,SAAS,MAAM;AAAA;AAa9E,eAAW,aAAa;AASxB,eAAW,OAAO,SAAS,cAAc,UAAU,WAAW;AAU9D,eAAW,kBAAkB,CAAC,SAAQ;AA2BtC,eAAW,eAAe;AAS1B,eAAW,cAAc;AAQzB,eAAW,cAAc,EAAC,OAAM,SAAS,MAAK,QAAQ,KAAI,YAAY,KAAI;AAQ1E,eAAW,cAAc,EAAC,MAAK,KAAK,YAAW,KAAK,YAAW,KAAK,OAAM,KAAK,WAAU,KAAK,WAAU,KAAK,MAAK,UAAU,SAAQ,UAAU,UAAS,KAAK,UAAS,KAAK,WAAU,KAAK,WAAU,KAAK,OAAM,KAAK,OAAM;AASzN,eAAW,iBAAiB;AAE5B,MAAE,OAAO,WAAW;AACnB,UAAI,KAAK,QAAQ,SAAS,MAAM,SAAS;AACxC,YAAI,SAAS,KAAK;AAGlB,YAAI,CAAC,QAAQ;AACZ,eAAK;AACL;AAAA;AAAA,iBAGS,KAAK,MAAM,eAAe,OAAO;AAC3C,aAAK;AAAA,aACC;AACN,YAAI,MAAM,KAAK,YAAY,KAAK,MAAM;AACtC,aAAK,WAAW;AAChB,aAAK,gBAAgB,KAAK,YAAY;AAAA;AAGvC,WAAK,eAAe,WAAW,SAAS,MAAM,KAAK,gBAAgB,OAAO,KAAK,MAAM;AAErF,WAAK,cAAc;AAAA;AASpB,MAAE,iBAAiB,WAAY;AAC9B,WAAK;AACL,WAAK,cAAc,IAAI,SAAS,WAAW;AAAA;AAI5C,MAAE,iBAAiB,WAAW;AAC7B,aAAO,KAAK;AAAA;AAIb,MAAE,cAAc,SAAU,OAAO;AAChC,cAAQ,MAAM;AAAA,aACR;AACJ,eAAK,aAAa,MAAM,OAAO;AAC/B,eAAK,UAAU;AACf,eAAK,UAAU,KAAK;AACpB;AAAA,aAEI;AACJ,eAAK;AACL,eAAK,2BAA2B;AAChC;AAAA;AAAA;AAYH,MAAE,YAAY,WAAW;AACxB,UAAI,MAAM,KAAK,MAAM;AAGrB,UAAI,eAAe,kBAAkB;AACpC,YAAI,KAAK,cAAc,CAAC,IAAI,YAAY;AAAE,UAAC,UAAS,QAAQ,SAAS,qBAAqB,QAAQ,IAAI,YAAY;AAAA;AAClH,aAAK,aAAa;AAClB,cAAM,OAAK,IAAI;AAAA;AAIhB,UAAI,IAAI,OAAO,yBAAyB,IAAI;AAC3C,aAAK,UAAU;AACf,eAAO;AAAA;AAIR,WAAK,WAAW,IAAI,SAAS,WAAW,KAAK;AAC7C,aAAO;AAAA;AASR,MAAE,YAAY,SAAS,KAAK;AAC3B,UAAI,QAAQ;AACZ,aAAO,MAAM;AACZ,YAAI,SAAS,MAAM,KAAK;AACxB,YAAI,CAAC,QAAQ;AAAE;AAAA;AACf,aAAK,WAAW,KAAK,eAAe,OAAO;AAAA;AAE5C,WAAK,gBAAgB;AAAA;AAQtB,MAAE,kBAAkB,WAAW;AAC9B,UAAI,MAAM,KAAK,MAAM,KAAK,MAAM,IAAI;AACpC,eAAS,IAAE,IAAI,SAAO,GAAG,KAAG,GAAG,KAAK;AACnC,YAAI,IAAI,IAAI;AACZ,YAAI,OAAO,MAAM,UAAU;AAAE,gBAAM,KAAK,YAAY;AAAA,eAC/C;AAAE,gBAAM,KAAK,YAAY;AAAA;AAC9B,aAAK,WAAW;AAChB,eAAO,KAAK,YAAY,OAAK;AAAA;AAE9B,WAAK,gBAAgB;AAAA;AAWtB,MAAE,kBAAkB,SAAS,KAAK;AACjC,UAAI,CAAC,KAAK,YAAY;AAAE;AAAA;AACxB,UAAI,OAAO,SAAS,QAAQ,SAAS,qBAAqB,QAAQ;AAClE,UAAI,WAAW,SAAS,cAAc;AACtC,eAAS,OAAO;AAChB,UAAI,SAAS,YAAW;AACvB,iBAAS,WAAW,UAAU;AAAA,aACxB;AACN,iBAAS,YAAY,SAAS,eAAe;AAAA;AAE9C,WAAK,YAAY;AAAA;AAUlB,MAAE,iBAAiB,SAAS,KAAK;AAChC,UAAI,SAAS,KAAK,aAAa,KAAK,gBAAgB,MAAM,KAAK,aAAa,KAAK;AACjF,UAAI,CAAC,UAAU,CAAC,KAAK;AAAE,eAAO;AAAA;AAC9B,aAAO,KAAK,YAAY;AAAA,QACvB;AAAA,QACA;AAAA,QACA,OAAO,KAAK,aAAa,KAAK;AAAA,QAC9B,QAAQ,KAAK,aAAa,KAAK;AAAA;AAAA;AAWjC,MAAE,aAAa,SAAS,KAAK;AAC5B,UAAI,CAAC,OAAO,KAAK,OAAO,IAAI,KAAK;AAAE;AAAA;AACnC,WAAK,OAAO,IAAI,MAAM;AACtB,WAAK,SAAS,KAAK;AACnB,WAAK;AAEL,WAAK,yBAAyB;AAC9B,WAAK;AAAA;AASN,MAAE,iBAAiB,WAAW;AAC7B,UAAI,KAAK,kBAAkB,MAAM;AAAE;AAAA;AACnC,WAAK,iBAAiB,YAAY,SAAS,MAAM,KAAK,QAAQ,OAAO,WAAW;AAAA;AASjF,MAAE,gBAAgB,WAAW;AAC5B,oBAAc,KAAK;AACnB,mBAAa,KAAK;AAClB,WAAK,iBAAiB;AAAA;AAcvB,MAAE,SAAS,WAAW;AACrB,UAAI,OAAO,KAAK,UAAU,WAAW,WAAW,iBAAiB,IAAI,KAAK;AAC1E,eAAS,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK;AAChC,YAAI,MAAM,KAAK,IAAI,OAAO,IAAI;AAC9B,iBAAS,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AAC1C,cAAI,IAAI,KAAK,cAAc,IAAI,SAAS,MAAM,SAAS,IAAI,IAAI,QAAQ,IAAI;AAC3E,cAAI,KAAK,KAAK,IAAI;AACjB,gBAAI,QAAQ,IAAI,SAAS,MAAM;AAC/B,gBAAI,OAAO;AACX,kBAAM,OAAO;AACb,iBAAK,cAAc;AACnB,iBAAK,OAAO,GAAG;AACf;AAAA;AAAA;AAAA;AAIH,UAAI,MAAM,KAAK,QAAQ;AACtB,YAAI,QAAQ,IAAI,SAAS,cAAc,KAAK,SAAO,KAAK,QAAQ,KAAK;AACrE,aAAK,cAAc;AAAA;AAEpB,UAAI,MAAM,GAAG;AACZ,aAAK;AACL,aAAK;AAAA;AAAA;AAUP,MAAE,2BAA2B,SAAS,KAAK;AAC1C,UAAI,WAAW,WAAW;AAC1B,UAAI,OAAO,IAAI,OAAO;AACtB,eAAS,IAAE,GAAG,IAAE,SAAS,QAAQ,KAAK;AACrC,aAAK,KAAK,KAAK,cAAc,SAAS,IAAI,IAAI,QAAQ,IAAI;AAAA;AAAA;AAU5D,MAAE,cAAc,SAAS,KAAK;AAC7B,UAAI,KAAK,YAAY,OAAO,KAAK,MAAM,MAAM;AAE7C,cAAQ,KAAK,OAAO;AACpB,UAAI,UAAU,IAAI;AACjB,eAAO,KAAK,OAAO,GAAE;AAAA;AAEtB,cAAQ,KAAK,YAAY;AACzB,UAAI,UAAU,IAAI;AACjB,cAAM,KAAK,OAAO,QAAM;AACxB,eAAO,KAAK,OAAO,GAAE;AAAA;AAEtB,cAAQ,KAAK,YAAY;AACzB,UAAI,UAAU,IAAI;AACjB,eAAO,KAAK,OAAO,QAAM;AAAA;AAG1B,UAAI,SAAS,MACX,SAAS,OAAO,MAAM,WAAW;AACnC,UAAI,QAAQ;AACX,iBAAS,OAAO;AAChB,iBAAS,OAAO,QAAQ,QAAQ;AAChC,iBAAS,OAAO,QAAQ,IAAI,IAAI;AAAA;AAEjC,UAAI,QAAQ,KAAK,MAAM,WAAW;AAClC,UAAI,OAAO;AACV,iBAAS,OAAO,QAAQ,MAAM,IAAI;AAClC,gBAAQ;AAAA;AAET,eAAS,OAAO,QAAQ,IAAI;AAE5B,UAAI,SAAS,YAAU,KAAK,QAAQ,IAAG,OAAK,cAAY,MAAI;AAC5D,UAAI,UAAS,WAAW,YAAY;AACpC,UAAI,SAAQ;AAAE,kBAAU,cAAY,UAAO;AAAA;AAE3C,aAAO,KAAK,YAAY;AAAA,QACvB;AAAA,QACA,QAAQ,WAAW,YAAY,WAAS;AAAA,QACxC;AAAA,QACA,KAAK;AAAA;AAAA;AAWP,MAAE,cAAc,SAAS,GAAG;AAC3B,UAAI,MAAM;AAAA,QACT,QAAQ,EAAE;AAAA,QACV,KAAK,EAAE;AAAA,QACP,OAAO,EAAE,SAAS;AAAA,QAClB,QAAQ,EAAE,UAAU;AAAA;AAErB,UAAI,KAAK,IAAI,SAAS,MAAM,IAAI,QAAQ,MAAM,IAAI;AAClD,aAAO;AAAA;AAUR,MAAE,cAAc,SAAS,KAAK;AAC7B,aAAO,kCACa,IAAI,SAAO,sBACb,IAAI,QAAM,sBACT,IAAI,SAAO,cACnB,IAAI,MAAI;AAAA;AAapB,MAAE,gBAAgB,SAAS,QAAQ,QAAQ,OAAO;AACjD,UAAI,MAAM,WAAW;AACrB,UAAI,OAAO,QAAM,MAAI,SAAO,WAAS;AACrC,aAAO,IAAI,YAAY,WAAW,YAAY;AAAA;AAY/C,MAAE,eAAe,SAAS,KAAK,UAAU;AACxC,UAAI,QAAQ,IAAI,OAAO,WAAS;AAChC,UAAI,SAAS,MAAM,KAAK;AACxB,UAAI,CAAC,UAAU,CAAC,OAAO,IAAI;AAAE,eAAO;AAAA;AACpC,aAAO,OAAO;AAAA;AAGf,aAAS,aAAa,SAAS,QAAQ,YAAY;AAAA;AAQpD,EAAC,YAAY;AACZ;AAWA,yBAAsB,UAAU,WAAW;AAC1C,WAAK,2BAA2B,UAAU,WAAW,SAAS,MAAM;AAGpE,WAAK,kBAAkB,KAAK;AAG5B,WAAK,mBAAmB;AAGxB,UAAI,SAAS,SAAS,WAAW,WAAW;AAC3C,aAAK,OAAO;AAAA,iBACF,SAAS,SAAS,WAAW,SAAS,MAAM;AACtD,aAAK,OAAO,SAAS;AAAA,iBACX,SAAS,SAAS,WAAW,SAAS,MAAM;AACtD,aAAK,OAAO,SAAS;AAAA;AAGtB,UAAI,KAAK,QAAQ,MAAM;AACtB,aAAK,aAAa;AAAA,aACZ;AACN,aAAK,OAAO,SAAS,SAAS;AAAA;AAG/B,WAAK,GAAG,cAAc,KAAK,YAAY;AAAA;AACvC;AAED,QAAI,IAAI,SAAS,OAAO,aAAa,SAAS;AAC9C,QAAI,KAAI;AAWR,OAAE,cAAc,SAAU,MAAM;AAC/B,aAAO,KAAK,QAAQ,SAAS,MAAM;AAAA;AAIpC,MAAE,OAAO,WAAY;AACpB,UAAI,KAAK,KAAK,OAAO,MAAM,KAAK,KAAK,UAAU;AAC9C,aAAK;AACL;AAAA;AAGD,UAAI,cAAc,KAAK,MAAM;AAC7B,UAAI,eAAe,MAAM;AAAE,sBAAc;AAAA;AACzC,UAAI,eAAe,QAAQ,CAAC,SAAS,SAAS,QAAQ,KAAK,QAAQ;AAClE,aAAK,KAAK,cAAc;AAAA;AAGzB,WAAK;AAAA;AAUN,MAAE,aAAa,SAAU,OAAO;AAC/B,YAAM,OAAO,WAAW;AAGxB,UAAI,MAAM,OAAO,iBAAiB;AACjC,cAAM,OAAO,gBAAgB;AAAA;AAAA;AAW/B,MAAE,gBAAgB,SAAU,QAAQ;AACnC,aAAO,KAAK;AAAA;AAWb,MAAE,eAAe,SAAU,iBAAiB,eAAe;AAC1D,UAAI,MAAM,KAAK;AACf,UAAI,OAAM,OAAO,OAAO,OAAO;AAE/B,UAAI,CAAC,KAAK,YAAY;AAAA,iBAGX,MAAK;AACf,YAAI,SAAS,KAAI,gBAAgB,KAAK,UAAU;AAChD,YAAI,MAAM;AAEV,YAAI,iBAAiB,QAAQ,KAAK,aAAa;AAC/C,YAAI,iBAAiB,SAAS,KAAK,aAAa;AAAA,aAC1C;AACN,YAAI,MAAM,KAAK,MAAM;AAAA;AAGtB,UAAI,IAAI,UAAU;AACjB,wBAAgB;AAAA,aACV;AACG,YAAI,SAAS,SAAS,MAAM,WAAW;AACnC,0BAAgB,KAAK;AACrB,cAAI,SAAS,IAAI,UAAU;AAAA,WAC5B;AAEH,YAAI,UAAU,SAAS,MAAM,SAAS,OAAO;AACzC,wBAAc,IAAI,SAAS,WAAW,gBAAgB,MAAM;AAC5D,cAAI,SAAS,IAAI,UAAU;AAAA,WAC5B;AAAA;AAAA;AAYd,MAAE,cAAc,SAAU,OAAO;AAChC,UAAI,OAAM,OAAO,OAAO,OAAO;AAC/B,WAAI,gBAAgB,MAAM,OAAO;AAAA;AAGlC,aAAS,cAAc,SAAS,QAAQ,aAAa;AAAA;AAQtD,EAAC,YAAY;AACZ;AAWA,8BAA0B,UAAU,WAAW;AAC9C,WAAK,2BAA2B,UAAU,WAAW,SAAS,MAAM;AAGpE,WAAK,kBAAkB,KAAK;AAG5B,WAAK,mBAAmB;AACxB,WAAK,OAAO,SAAS,SAAS;AAAA;AAC9B;AAED,QAAI,IAAI,SAAS,OAAO,kBAAkB,SAAS;AACnD,QAAI,KAAI;AAWR,OAAE,cAAc,SAAU,MAAM;AAC/B,aAAO,KAAK,QAAQ,SAAS,MAAM;AAAA;AAWpC,MAAE,gBAAgB,SAAU,QAAQ;AACnC,UAAI,MAAM,OAAO;AACjB,UAAI,KAAK,YAAY;AACpB,YAAI,OAAO,OAAO,UAAU;AAAA;AAE7B,aAAO;AAAA;AAGR,aAAS,mBAAmB,SAAS,QAAQ,kBAAkB;AAAA;AAQhE,EAAC,YAAY;AACZ;AAYA,wBAAoB,UAAU;AAC7B,WAAK,2BAA2B,UAAU,MAAM,SAAS,MAAM;AAG/D,WAAK,kBAAkB,KAAK;AAAA;AAC5B;AAED,QAAI,IAAI,SAAS,OAAO,YAAY,SAAS;AAC7C,QAAI,KAAI;AAWR,OAAE,cAAc,SAAU,MAAM;AAC/B,aAAO,KAAK,QAAQ,SAAS,MAAM;AAAA;AAWpC,MAAE,gBAAgB,SAAU,QAAQ;AACnC,UAAI,OAAO;AACX,UAAI;AACH,eAAO,SAAS,UAAU,UAAU,OAAO,UAAU;AAAA,eAC7C,GAAP;AACD,YAAI,QAAQ,IAAI,SAAS,WAAW,eAAe,MAAM;AACzD,aAAK,WAAW;AAChB,eAAO;AAAA;AAGR,aAAO;AAAA;AAGR,aAAS,aAAa,SAAS,QAAQ,YAAY;AAAA;AAQpD,EAAC,YAAY;AACZ;AA6CA,yBAAqB,UAAU;AAC9B,WAAK,2BAA2B,UAAU,OAAO,SAAS,MAAM;AAChE,WAAK,OAAO,SAAS,SAAS;AAC9B,WAAK,SAAS,OAAO;AAAA;AACrB;AAED,QAAI,IAAI,SAAS,OAAO,aAAa,SAAS;AAC9C,QAAI,KAAI;AAYR,OAAE,cAAc,SAAU,MAAM;AAC/B,aAAO,KAAK,QAAQ,SAAS,MAAM;AAAA;AAIpC,MAAE,SAAS,WAAY;AACtB,WAAK;AACL,WAAK;AAAA;AAUN,MAAE,OAAO,WAAY;AACpB,UAAI,KAAK,MAAM,YAAY,MAAM;AAChC,cAAM,IAAI,MAAM;AAAA;AAOjB,UAAI,OAAO,KAAK,MAAM,aAAa,MAAM;AACxC,cAAM,IAAI,MACT,qBACA,KAAK,MAAM,WACX;AAAA;AAGF,aAAO,KAAK,MAAM,YAAY,SAAS,MAAM,KAAK,aAAa;AAC/D,eAAS,SAAS,aAAa,KAAK;AAEpC,WAAK,eAAe,WAAW,SAAS,MAAM,KAAK,gBAAgB,OAAO,KAAK,MAAM;AAGrF,WAAK,KAAK,MAAM,KAAK,MAAM;AAAA;AAU5B,MAAE,cAAc,SAAU,MAAM;AAC/B,WAAK,UAAU,KAAK,aAAa;AACjC,WAAK;AAEL,WAAK;AAAA;AASN,MAAE,iBAAiB,WAAY;AAC9B,WAAK;AACL,WAAK,cAAc,IAAI,SAAS,WAAW;AAAA;AAQ5C,MAAE,WAAW,WAAY;AACxB,eAAS,SAAS,YAAY,KAAK;AACnC,aAAO,OAAO,KAAK,MAAM;AAEzB,mBAAa,KAAK;AAAA;AAGnB,aAAS,cAAc,SAAS,QAAQ,aAAa;AAAA;AAQtD,EAAC,YAAY;AACZ;AAkCA,4BAAwB,UAAU,WAAW;AAC5C,WAAK,2BAA2B,UAAU,WAAW,SAAS,MAAM;AAWpE,WAAK,UAAU;AAUf,WAAK,iBAAiB;AAAA;AACtB;AAED,QAAI,IAAI,SAAS,OAAO,gBAAgB,SAAS;AACjD,QAAI,KAAI;AAWR,OAAE,oBAAoB;AAWtB,OAAE,cAAc,SAAU,MAAM;AAC/B,aAAO,KAAK,QAAQ,SAAS,MAAM;AAAA;AAIpC,MAAE,OAAO,WAAY;AACpB,WAAK;AAAA;AAIN,MAAE,iBAAiB,WAAW;AAC7B,UAAI,WAAW,KAAK,MAAM;AAC1B,UAAI,YAAY,MAAM;AACrB,aAAK,WAAW,IAAI,SAAS,YAAY,KAAK;AAAA,aACxC;AACN,aAAK,WAAW,IAAI,SAAS,WAAW,KAAK;AAAA;AAAA;AAI/C,MAAE,cAAc,SAAU,OAAO;AAChC,cAAQ,MAAM;AAAA,aACR;AACJ,eAAK,aAAa,MAAM,OAAO,UAAU;AACzC,eAAK,UAAU,MAAM,OAAO;AAC5B,eAAK,cAAc,GAAE;AACrB,eAAK,cAAc,KAAK;AACxB;AAAA,aACI;AACJ,gBAAM,UAAU,GAAE;AAClB,eAAK,WAAW,MAAM,SAAS,MAAM;AACrC,cAAI,MAAM,KAAK,aAAa,KAAK,YAAY,UAAU;AAAE,iBAAK,WAAW;AAAA;AACzE,eAAK,cAAc;AACnB;AAAA;AAEF,WAAK,2BAA2B;AAAA;AAGjC,MAAE,UAAU,WAAW;AACtB,WAAK;AACL,WAAK,eAAe;AAAA;AASrB,MAAE,gBAAgB,SAAU,MAAM;AACjC,UAAI,QAAQ,KAAK,UAAU;AAC1B,YAAI,QAAQ,KAAK,iBAAiB,IAAI,SAAS,UAAU,KAAK;AAC9D,cAAM,GAAG,YAAY,KAAK,yBAAyB;AACnD,cAAM,GAAG,YAAY,KAAK,yBAAyB;AACnD,cAAM,GAAG,YAAY,KAAK,yBAAyB,MAAM;AACzD,cAAM,GAAG,SAAS,KAAK,sBAAsB,MAAM;AACnD,iBAAQ,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK;AACnD,gBAAM,cAAc,KAAK,QAAQ;AAAA;AAElC,cAAM,aAAa;AAAA,aACb;AACN,aAAK;AAAA;AAAA;AAUP,MAAE,0BAA0B,SAAU,OAAO;AAC5C,YAAM,SAAS;AACf,WAAK,cAAc;AAAA;AAUpB,MAAE,0BAA0B,SAAU,OAAO;AAC5C,WAAK,eAAe,KAAK,eAAe,SAAS;AACjD,WAAK;AAAA;AASN,MAAE,0BAA0B,SAAU,OAAO;AAC5C,WAAK,WAAW,MAAM,WAAY,KAAI,GAAE,qBAAqB,GAAE;AAC/D,WAAK,cAAc,KAAK;AAAA;AASzB,MAAE,uBAAuB,SAAU,OAAO;AACzC,UAAI,WAAW,IAAI,SAAS,MAAM;AAClC,eAAS,OAAO,MAAM;AACtB,WAAK,cAAc;AAAA;AAGpB,aAAS,iBAAiB,SAAS,QAAQ,gBAAgB;AAAA;AAQ5D,EAAC,YAAY;AACZ;AAcA,yBAAqB,UAAU,WAAW;AACzC,WAAK,gCAAgC,UAAU,WAAW,SAAS,MAAM;AAGzE,UAAI,SAAS,SAAS,WAAW,WAAW;AAC3C,aAAK,OAAO;AAAA,iBACF,SAAS,SAAS,WAAW,SAAS,MAAM;AACtD,aAAK,OAAO;AAAA,iBACF,SAAS,SAAS,WAAW,SAAS,MAAM;AACtD,aAAK,OAAO,SAAS,SAAS,WAAW,YAAY,WAAW,SAAS;AAAA;AAG1E,UAAI,KAAK,QAAQ,MAAM;AACtB,aAAK,aAAa;AAAA;AAAA;AAEnB;AAED,QAAI,IAAI,SAAS,OAAO,aAAa,SAAS;AAC9C,QAAI,KAAI;AAWR,OAAE,cAAc,SAAU,MAAM;AAC/B,aAAO,KAAK,QAAQ,SAAS,MAAM;AAAA;AAIpC,MAAE,aAAa,SAAU,KAAK;AAC7B,UAAI,MAAM,SAAS,SAAS;AAC5B,UAAI,WAAW;AACf,UAAI,UAAU;AAGd,UAAI,MAAM;AACV,aAAO;AAAA;AAGR,aAAS,cAAc,SAAS,QAAQ,aAAa;AAAA;AAQtD,EAAC,YAAY;AACZ;AAWA,yBAAqB,UAAU,WAAW;AACzC,WAAK,gCAAgC,UAAU,WAAW,SAAS,MAAM;AAEzE,UAAI,SAAS,SAAS,WAAW,aAAa,SAAS,SAAS,WAAW,SAAS,MAAM;AACzF,aAAK,OAAO,SAAS,SAAS,WAAW,YAAU,WAAS,SAAS;AAGrE,aAAK,aAAa;AAAA,aACZ;AACN,aAAK,OAAO,KAAK;AAAA;AAAA;AAElB;AAED,QAAI,IAAI,SAAS,OAAO,aAAa,SAAS;AAC9C,QAAI,KAAI;AAQR,MAAE,aAAa,WAAY;AAC1B,aAAO,SAAS,SAAS;AAAA;AAY1B,OAAE,cAAc,SAAU,MAAM;AAC/B,aAAO,KAAK,QAAQ,SAAS,MAAM;AAAA;AAGpC,aAAS,cAAc,SAAS,QAAQ,aAAa;AAAA;AAQtD,EAAC,YAAY;AACZ;AAyBA,+BAA2B,UAAU,WAAW;AAC/C,WAAK,2BAA2B,UAAU,WAAW,SAAS,MAAM;AASpE,WAAK,iBAAiB;AAAA;AAGvB,QAAI,IAAI,SAAS,OAAO,mBAAmB,SAAS;AACpD,QAAI,KAAI;AAWR,OAAE,uBAAuB;AAWzB,OAAE,cAAc,SAAU,MAAM;AAC/B,aAAO,KAAK,QAAQ,SAAS,MAAM;AAAA;AAIpC,MAAE,UAAU,WAAW;AACtB,WAAK;AACL,WAAK,eAAe;AAAA;AAIrB,MAAE,iBAAiB,WAAW;AAC7B,UAAI,WAAW,KAAK,MAAM;AAC1B,UAAI,YAAY,MAAM;AACrB,aAAK,WAAW,IAAI,SAAS,YAAY,KAAK;AAAA,aACxC;AACN,aAAK,WAAW,IAAI,SAAS,WAAW,KAAK;AAAA;AAAA;AAI/C,MAAE,cAAc,SAAU,OAAO;AAChC,cAAQ,MAAM;AAAA,aACR;AACJ,eAAK,aAAa,MAAM,OAAO,UAAU;AACzC,eAAK,UAAU,MAAM,OAAO;AAC5B,eAAK,cAAc,GAAE;AACrB,eAAK,cAAc,KAAK;AACxB;AAAA,aACI;AACJ,gBAAM,UAAU,GAAE;AAClB,eAAK,WAAW,MAAM,SAAS,MAAM;AACrC,cAAI,MAAM,KAAK,aAAa,KAAK,YAAY,UAAU;AAAE,iBAAK,WAAW;AAAA;AACzE,eAAK,cAAc;AACnB;AAAA;AAEF,WAAK,2BAA2B;AAAA;AASjC,MAAE,gBAAgB,SAAU,MAAM;AACjC,UAAI,QAAQ,KAAK,QAAQ;AACxB,YAAI,QAAQ,KAAK,iBAAiB,IAAI,SAAS,UAAU,KAAK,YAAY,KAAK,MAAM,MAAM,KAAK,MAAM;AACtG,cAAM,GAAG,YAAY,KAAK,yBAAyB,MAAM;AACzD,cAAM,GAAG,YAAY,KAAK,yBAAyB;AACnD,cAAM,GAAG,YAAY,KAAK,yBAAyB;AACnD,cAAM,GAAG,SAAS,KAAK,sBAAsB,MAAM;AACnD,cAAM,aAAa,KAAK;AAAA;AAAA;AAU1B,MAAE,0BAA0B,SAAU,OAAO;AAC5C,UAAI,QAAQ,MAAM;AAClB,UAAI,SAAS,MAAM;AAClB,YAAI,SAAS,KAAK,YAAY;AAC9B,YAAI,MAAM,OAAO,QAAQ,MAAM,KAAK;AACpC,eAAO,OAAO;AAAA;AAAA;AAWhB,MAAE,0BAA0B,SAAU,OAAO;AAC5C,WAAK,UAAU,IAAI,SAAS,YAAY,KAAK;AAC7C,WAAK,eAAe,KAAK,eAAe,SAAS;AACjD,WAAK;AAAA;AASN,MAAE,0BAA0B,SAAU,OAAO;AAC5C,WAAK,WAAW,MAAM,WAAY,KAAI,GAAE,wBAAwB,GAAE;AAClE,WAAK,cAAc,KAAK;AAAA;AASzB,MAAE,uBAAuB,SAAU,OAAO;AACzC,UAAI,WAAW,IAAI,SAAS,MAAM;AAClC,eAAS,OAAO,MAAM;AACtB,WAAK,cAAc;AAAA;AAGpB,aAAS,oBAAoB,SAAS,QAAQ,mBAAmB;AAAA;AAQlE,EAAC,YAAY;AACZ;AAWA,uBAAmB,UAAU,WAAW;AACvC,WAAK,2BAA2B,UAAU,WAAW,SAAS,MAAM;AAGpE,WAAK,kBAAkB,KAAK;AAG5B,WAAK,mBAAmB;AAExB,UAAI,WAAW;AACd,aAAK,OAAO,SAAS,SAAS;AAAA,aACxB;AACN,aAAK,OAAO,SAAS,SAAS;AAC9B,aAAK,SAAS,OAAO;AAAA;AAAA;AAEtB;AAED,QAAI,IAAI,SAAS,OAAO,WAAW,SAAS;AAC5C,QAAI,KAAI;AAWR,OAAE,cAAc,SAAU,MAAM;AAC/B,aAAO,KAAK,QAAQ,SAAS,MAAM;AAAA;AAWpC,MAAE,gBAAgB,SAAU,QAAQ;AAEnC,UAAI,MAAM,SAAS,UAAU,SAAS,OAAO,UAAU;AACvD,UAAI,MAAM,OAAO;AAEjB,UAAI,CAAC,KAAK,cAAc,SAAS,KAAK,SAAS,MAAM;AACpD,iBAAS,KAAK,YAAY;AAAA;AAG3B,UAAI,IAAI,mBAAmB,MAAM;AAChC,YAAI,UAAU,IAAI;AAElB,YAAI,SAAS,YAAY;AACxB,oBAAU,SAAS,WAAW,SAAS;AAAA;AAExC,YAAI,YAAY;AAChB,eAAO;AAAA,aACD;AACN,eAAO;AAAA;AAAA;AAIT,aAAS,YAAY,SAAS,QAAQ,WAAW;AAAA;AAQlD,EAAC,YAAY;AACZ;AAUA,uBAAmB,UAAU;AAC5B,WAAK,2BAA2B,UAAU,MAAM,SAAS,MAAM;AAG/D,WAAK,kBAAkB,KAAK;AAAA;AAC5B;AAED,QAAI,IAAI,SAAS,OAAO,WAAW,SAAS;AAC5C,QAAI,KAAI;AAWR,OAAE,cAAc,SAAU,MAAM;AAC/B,aAAO,KAAK,QAAQ,SAAS,MAAM;AAAA;AAWpC,MAAE,gBAAgB,SAAU,QAAQ;AACnC,aAAO,SAAS,UAAU,SAAS,OAAO,UAAU;AAAA;AAGrD,aAAS,YAAY,SAAS,QAAQ,WAAW;AAAA;AAQlD,EAAC,YAAY;AAQZ,QAAI,KAAI,SAAS,UAAU,SAAS,WAAW;AAQ/C,OAAE,UAAsB;AAQxB,OAAE,YAAqB;AAAA;AAWxB,EAAC,YAAW;AACX;AAwBA,6BAAyB;AACxB,YAAM;AAAA;AACN;AAED,QAAI,QAAQ,cAAc,QAAQ,OAAO,UAAU;AACnD,kBAAc,gBAAiB,MAAM,QAAQ,cAAc,MAAQ,MAAM,QAAQ,mBAAmB;AACpG,kBAAc,YAAa,MAAM,QAAQ,aAAa;AACtD,kBAAc,UAAW,OAAO,SAAS;AACzC,kBAAc,WAAY,MAAM,QAAQ,YAAY;AACpD,kBAAc,QAAS,OAAM,QAAQ,UAAU,MAAM,MAAM,QAAQ,YAAY,MAAM,MAAM,QAAQ,UAAU,OAAO,CAAC,cAAc;AACnI,kBAAc,YAAa,MAAM,QAAQ,aAAa,MAAO,CAAC,cAAc;AAC5E,kBAAc,eAAgB,MAAM,QAAQ,gBAAgB;AAE5D,aAAS,gBAAgB;AAAA;AA8E1B,EAAC,YAAY;AACZ;AAiCA,QAAI,kBAAkB,WAAY;AAWjC,WAAK,YAAY;AAQjB,WAAK,QAAQ;AAQb,WAAK,SAAS;AASd,WAAK,OAAO;AASZ,WAAK,SAAS;AAQd,WAAK,MAAM;AAQX,WAAK,YAAY;AAQjB,WAAK,WAAW;AAAA;AAEjB,QAAI,IAAI,gBAAgB,YAAY;AACpC,QAAI,KAAI;AAYR,OAAE,SAAS,SAAU,OAAO;AAC3B,UAAI,OAAO,UAAW,UAAU;AAE/B,mBAAY,SAAQ,QAAQ,QAAQ,KAAK;AACzC,eAAO,IAAI,SAAS,kBAAkB,IAAI,EAAC,WAAU;AAAA,iBAC3C,SAAS,QAAQ,iBAAiB,MAAK,iBAAiB,QAAQ;AAC1E,eAAO,IAAI,SAAS,kBAAkB,IAAI;AAAA,iBAChC,SAAS,MAAM;AACzB,cAAM,IAAI,MAAM;AAAA;AAAA;AAgBlB,MAAE,MAAM,SAAS,OAAO;AACvB,UAAI,SAAS,MAAM;AAClB,iBAAS,KAAK,OAAO;AAAE,eAAK,KAAK,MAAM;AAAA;AAAA;AAExC,aAAO;AAAA;AAGR,MAAE,WAAW,WAAW;AACvB,aAAO;AAAA;AAGR,aAAS,kBAAkB;AAAA;AAQ5B,EAAC,YAAY;AACZ;AA8KA,qBAAiB;AAChB,YAAM;AAAA;AAGP,QAAI,KAAI;AAYR,OAAE,gBAAgB;AAUlB,OAAE,kBAAkB;AAUpB,OAAE,iBAAiB;AAUnB,OAAE,iBAAiB;AASnB,OAAE,cAAc;AAShB,OAAE,iBAAiB;AASnB,OAAE,mBAAmB;AASrB,OAAE,gBAAgB;AAUlB,OAAE,cAAc;AAiBhB,OAAE,uBAAuB,CAAC,OAAO,OAAO,QAAQ,QAAQ,OAAO,OAAO,OAAO,QAAQ,OAAO;AAc5F,OAAE,gBAAgB;AAAA,MACjB,KAAI;AAAA;AAWL,OAAE,eAAe;AAejB,OAAE,2BAA2B,GAAE;AA2B/B,OAAE,sBAAsB;AAUrB,OAAE,eAAe;AA4BpB,OAAE,gBAAgB;AASlB,OAAE,mBAAmB,WAAW;AAC/B,aAAO,KAAK;AAAA;AAGb,OAAE,YAAY,SAAS,UAAU,GAAE,kBAAkB;AAOrD,OAAE,mBAAmB,SAAS,OAAO;AACpC,UAAI,OAAO,UAAU,MAAM;AAAE;AAAA;AAC7B,cAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG;AAChC,SAAE,gBAAgB;AAClB,UAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,aAAa,aAAa,CAAC,KAAK,aAAa,UAAU,QAAQ;AAC9F,YAAI,YAAY,KAAK;AACrB,iBAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,IAAI,GAAG,KAAK;AACjD,oBAAU,GAAG,gBAAgB;AAAA;AAAA;AAAA;AAKhC,OAAE,YAAY,SAAS,UAAU,GAAE,kBAAkB;AAiBrD,OAAE,cAAc;AAShB,OAAE,WAAW,WAAY;AACxB,aAAO,KAAK;AAAA;AAGb,OAAE,UAAU,SAAS,UAAU,GAAE,UAAU;AAS3C,OAAE,WAAW,SAAU,OAAO;AAC7B,UAAI,SAAS,MAAM;AAAE;AAAA;AACrB,WAAK,cAAc;AACnB,UAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,aAAa,WAAW,CAAC,KAAK,aAAa,QAAQ,QAAQ;AAC1F,YAAI,YAAY,KAAK;AACrB,iBAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,IAAI,GAAG,KAAK;AACjD,oBAAU,GAAG,cAAc;AAAA;AAAA;AAAA;AAK9B,OAAE,UAAU,SAAS,UAAU,GAAE,UAAU;AA0C3C,OAAE,mBAAmB,WAAW;AAC/B,UAAI,GAAE,gBAAgB,MAAM;AAAE,eAAO;AAAA;AACrC,aAAO,GAAE,aAAa;AAAA;AAGvB,OAAE,kBAAkB,SAAS,UAAU,GAAE,kBAAkB;AAE3D,WAAO,iBAAiB,IAAG;AAAA,MAC1B,QAAQ,EAAE,KAAK,GAAE,kBAAkB,KAAK,GAAE;AAAA,MAC1C,OAAO,EAAE,KAAK,GAAE,UAAU,KAAK,GAAE;AAAA,MACjC,cAAc,EAAE,KAAK,GAAE;AAAA;AAexB,OAAE,qBAAqB;AASvB,OAAE,UAAU;AAaZ,OAAE,aAAa;AASf,OAAE,UAAU;AAWZ,OAAE,eAAe;AAWjB,OAAE,wBAAwB;AAI1B,OAAE,mBAAmB;AACrB,OAAE,sBAAsB;AACxB,OAAE,0BAA0B;AAC5B,OAAE,gBAAgB;AAClB,OAAE,mBAAmB;AACrB,OAAE,aAAa;AAEf,aAAS,gBAAgB,WAAW;AA4CpC,OAAE,qBAAqB,WAAY;AAClC,aAAO;AAAA,QACN,UAAS,SAAS,MAAM,GAAE,UAAU;AAAA,QACpC,OAAM,CAAC;AAAA,QACP,YAAW,GAAE;AAAA;AAAA;AAYf,OAAE,sBAAsB,SAAS,OAAO;AACvC,UAAI,MAAM,MAAM,OAAO,UAAU;AACjC,UAAI,CAAC,GAAE,aAAa,MAAM;AAAC;AAAA;AAE3B,eAAS,IAAI,GAAG,IAAI,GAAE,aAAa,KAAK,QAAQ,IAAI,GAAG,KAAK;AAC3D,YAAI,OAAO,GAAE,aAAa,KAAK;AAC/B,WAAE,aAAa,KAAK,KAAK;AAEzB,YAAI,CAAC,GAAE,iBAAiB,aAAa;AAAE;AAAA;AAEvC,YAAI,QAAQ,IAAI,SAAS,MAAM;AAC/B,cAAM,MAAM,KAAK;AACjB,cAAM,KAAK,KAAK;AAChB,cAAM,OAAO,KAAK;AAClB,cAAM,SAAS,KAAK;AAEpB,WAAE,cAAc;AAAA;AAAA;AAWlB,OAAE,mBAAmB,SAAS,OAAO;AACpC,UAAI,MAAM,MAAM,OAAO,UAAU;AACjC,UAAI,CAAC,GAAE,aAAa,MAAM;AAAC;AAAA;AAE3B,eAAS,IAAI,GAAG,IAAI,GAAE,aAAa,KAAK,QAAQ,IAAI,GAAG,KAAK;AAC3D,YAAI,OAAO,GAAE,aAAa,KAAK;AAC/B,WAAE,aAAa,KAAK,KAAK;AAEzB,YAAI,CAAC,GAAE,iBAAiB,cAAc;AAAE;AAAA;AAExC,YAAI,QAAQ,IAAI,SAAS,MAAM;AAC/B,cAAM,MAAM,KAAK;AACjB,cAAM,KAAK,KAAK;AAChB,cAAM,OAAO,KAAK;AAClB,cAAM,SAAS,KAAK;AAEpB,WAAE,cAAc;AAAA;AAAA;AAalB,OAAE,kBAAkB,SAAU,QAAQ;AAErC,UAAI,OAAO,eAAe;AACzB,WAAE,eAAe,IAAI;AACrB,eAAO;AAAA;AAER,aAAO;AAAA;AAgBR,OAAE,kBAAkB,SAAU,SAAS;AACtC,SAAE,qBAAqB;AACvB,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAAI,GAAG,KAAK;AAC/C,YAAI,GAAE,gBAAgB,QAAQ,KAAK;AAClC,iBAAO;AAAA;AAAA;AAGT,aAAO;AAAA;AAiBR,OAAE,2BAA2B,WAAY;AACxC,UAAI,GAAE,gBAAgB,MAAM;AAAC,eAAO;AAAA;AACpC,UAAI,GAAE,oBAAoB;AAAC,eAAO;AAAA;AAClC,UAAI,GAAE,gBAAgB,CAAC,SAAS,gBAAgB,SAAS,mBAAmB;AAAC,eAAO;AAAA;AACpF,aAAO;AAAA;AAkBR,OAAE,UAAU,WAAY;AACvB,aAAQ,GAAE,gBAAgB;AAAA;AAY3B,OAAE,WAAW,SAAU,UAAU;AAChC,UAAI,SAAS,QAAQ,SAAS;AAAE,eAAO;AAAA;AACvC,aAAO,GAAE,eAAe;AAAA;AAgBzB,OAAE,iBAAiB,SAAU,UAAU;AACtC,UAAI,CAAC,GAAE,4BAA4B;AAAC,eAAO;AAAA;AAE3C,UAAI;AACJ,UAAI,SAAS,eAAe,QAAQ;AACnC,kBAAU,GAAE,UAAU,SAAS;AAC/B,gBAAQ,MAAM,SAAS,OAAO,QAAQ;AAAA,aAChC;AACN,kBAAU,GAAE,WAAW,SAAS;AAAA;AAEjC,UAAI,WAAW,MAAM;AAAC,eAAO;AAAA;AAC7B,eAAS,MAAM,QAAQ;AACvB,eAAS,OAAO;AAEhB,UAAI,OAAO,SAAS;AACpB,UAAI,cAAc;AAClB,UAAI,QAAQ,MAAM;AACjB,YAAI,CAAC,MAAM,KAAK,WAAW;AAC1B,wBAAc,SAAS,KAAK;AAAA,mBAClB,CAAC,MAAM,OAAO;AACxB,wBAAc,SAAS;AAAA;AAGxB,YAAG,KAAK,aAAa;AACpB,cAAI;AACJ,mBAAQ,IAAI,KAAK,YAAY,QAAQ,OAAO;AAC3C,iBAAK,KAAK,YAAY;AACtB,eAAE,QAAQ,GAAG,MAAM,EAAC,KAAK,SAAS,KAAK,WAAW,SAAS,GAAG,YAAY,UAAU,SAAS,GAAG;AAEhG,gBAAI,GAAG,kBAAkB;AACxB,iBAAE,sBAAsB,GAAG,MAAM,SAAS,gBAAgB,OAAO,GAAG;AAAA;AAAA;AAAA;AAAA;AAKxE,UAAI,SAAS,MAAM,MAAM;AAAC,WAAE,QAAQ,SAAS,MAAM,EAAC,KAAK,SAAS;AAAA;AAAK;AACvE,UAAI,SAAS,GAAE,aAAa,SAAS;AAErC,mBAAa,OAAO,SAAS,KAAK;AAGlC,UAAI,QAAQ,QAAQ,CAAC,MAAM,OAAO;AACjC,iBAAS,OAAO,eAAe,aAAa;AAAA,aACtC;AACN,iBAAS,KAAK,WAAW,eAAe,aAAa;AAAA;AAGtD,UAAI,OAAO,MAAM;AAAC,iBAAS,OAAO,OAAO;AAAA;AAEzC,UAAI,SAAS,kBAAkB;AAC9B,WAAE,sBAAsB,SAAS,OAAO,SAAS,gBAAgB,OAAO,SAAS;AAAA;AAElF,aAAO;AAAA;AAoCR,OAAE,gBAAgB,SAAU,KAAK,IAAI,MAAM,UAAU,kBAAkB;AACtE,UAAI,WAAW,EAAC,KAAU,IAAQ,MAAW;AAC7C,UAAI,eAAe,UAAU,IAAI,KAAK;AACrC,mBAAW;AACX,mBAAW;AAAA;AAEZ,iBAAW,SAAS,SAAS,OAAO;AACpC,eAAS,OAAO;AAEhB,UAAI,YAAY,QAAQ,CAAE,UAAS,eAAe,SAAS;AAAC,iBAAS,MAAM,WAAW,SAAS;AAAA;AAE/F,UAAI,SAAS,GAAE,eAAe;AAC9B,UAAG,CAAC,QAAQ;AAAC,eAAO;AAAA;AAEpB,UAAI,CAAC,GAAE,aAAa,SAAS,MAAM;AAAE,WAAE,aAAa,SAAS,OAAO;AAAA;AACpE,SAAE,aAAa,SAAS,KAAK,KAAK;AAClC,UAAI,GAAE,aAAa,SAAS,KAAK,UAAU,GAAG;AAE7C,eAAO,GAAG,YAAY,KAAK,qBAAqB;AAChD,eAAO,GAAG,SAAS,KAAK,kBAAkB;AAC1C,WAAE,aAAa,QAAQ;AAAA,aACjB;AACN,YAAI,GAAE,aAAa,SAAS,KAAK,MAAM,MAAM;AAAC,iBAAO;AAAA;AAAA;AAGtD,aAAO;AAAA;AAmCR,OAAE,iBAAiB,SAAU,QAAQ,UAAU;AAC9C,UAAI,eAAe;AACnB,UAAI,OAAO,MAAM;AAChB,YAAI,CAAC,UAAU;AACd,qBAAW,OAAO;AAAA,eACZ;AACN,qBAAW,WAAW,OAAO;AAAA;AAE9B,iBAAS,OAAO;AAAA;AAGjB,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAI,GAAG,KAAK;AAC9C,qBAAa,KAAK,SAAS,MAAM,cAAc,OAAO,GAAG,KAAK,OAAO,GAAG,IAAI,OAAO,GAAG,MAAM,UAAU,OAAO,GAAG;AAAA;AAEjH,aAAO;AAAA;AAuBR,OAAE,cAAc,SAAS,KAAK,UAAU;AACvC,UAAI,GAAE,gBAAgB,MAAM;AAAC,eAAO;AAAA;AAEpC,UAAI,eAAe,UAAU,IAAI,KAAK;AAAC,cAAM,IAAI;AAAA;AAEjD,UAAI;AACJ,UAAI,eAAe,QAAQ;AAC1B,kBAAU,GAAE,UAAU;AAAA,aAChB;AACN,cAAM,GAAE,YAAY,KAAK;AACzB,kBAAU,GAAE,WAAW;AAAA;AAExB,UAAI,WAAW,MAAM;AAAC,eAAO;AAAA;AAC7B,YAAM,QAAQ;AACd,UAAI,YAAY,MAAM;AAAC,cAAM,WAAW;AAAA;AAExC,eAAQ,QAAQ,GAAE,SAAQ;AACzB,YAAG,GAAE,QAAQ,MAAM,OAAO,KAAK;AAC9B,iBAAO,GAAE,QAAQ;AAAA;AAAA;AAKnB,mBAAa,UAAU;AAEvB,aAAO,GAAE,aAAa;AAEtB,SAAE,aAAa,YAAY;AAE3B,aAAO;AAAA;AA6BR,OAAE,eAAe,SAAU,QAAQ,UAAU;AAC5C,UAAI,eAAe;AACnB,UAAI,OAAO,MAAM;AAChB,YAAI,CAAC,UAAU;AACd,qBAAW,OAAO;AAAA,eACZ;AACN,qBAAW,WAAW,OAAO;AAAA;AAE9B,iBAAS,OAAO;AAAA;AAEjB,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAI,GAAG,KAAK;AAC9C,qBAAa,KAAK,SAAS,MAAM,YAAY,OAAO,GAAG,KAAK;AAAA;AAE7D,aAAO;AAAA;AAgBR,OAAE,kBAAkB,WAAW;AAC9B,SAAE,UAAU;AACZ,SAAE,eAAe;AACjB,mBAAa;AACb,UAAI,GAAE,cAAc;AAAC,WAAE,aAAa;AAAA;AAAA;AAoBrC,OAAE,eAAe,SAAU,KAAK;AAC/B,UAAI,CAAC,GAAE,WAAW;AAAE,eAAO;AAAA;AAC3B,UAAI,UAAU,GAAE,WAAW;AAC3B,UAAI,SAAS;AACZ,cAAM,GAAE,YAAY,QAAQ,KAAK;AAAA,aAC3B;AACN,cAAM,GAAE,YAAY,KAAK;AAAA;AAE1B,UAAG,GAAE,aAAa,QAAQ,QAAW;AAAC,eAAO;AAAA;AAC7C,aAAQ,GAAE,aAAa,KAAK,MAAM;AAAA;AAanC,OAAE,aAAa,SAAU,OAAO;AAC/B,UAAI,OAAO,SAAU,UAAU;AAAC,gBAAQ,MAAM;AAAA;AAE9C,UAAI,QAAQ,MAAM,MAAM,GAAE;AAC1B,UAAI,SAAS,MAAM;AAAC,eAAO;AAAA;AAE3B,UAAI,OAAO,MAAM;AACjB,UAAI,MAAM,MAAM;AAChB,UAAI,IAAI,GAAE;AACV,UAAI,IAAI;AACR,aAAO,CAAC,EAAE,MAAM;AACf,cAAM,GAAE,oBAAoB;AAC5B,YAAI,IAAI,GAAE,oBAAoB,QAAQ;AAAE,iBAAO;AAAA;AAAA;AAEhD,cAAQ,MAAM,QAAQ,MAAI,MAAM,IAAI,MAAI;AAExC,UAAI,MAAM,EAAC,MAAW,KAAI,OAAO,WAAU;AAC3C,aAAO;AAAA;AAaR,OAAE,YAAY,SAAU,OAAO;AAC9B,UAAI,MAAM,EAAC,MAAK,QAAW,KAAI,QAAW,WAAU;AACpD,UAAI,IAAI,GAAE;AAEV,eAAS,QAAQ,OAAO;AACtB,YAAG,MAAM,eAAe,SAAS,EAAE,OAAO;AAC1C,cAAI,MAAM,MAAM;AAChB,cAAI,YAAY;AAChB;AAAA;AAAA;AAGF,UAAI,CAAC,IAAI,KAAK;AAAC,eAAO;AAAA;AAEtB,UAAI,IAAI,IAAI,IAAI,YAAY;AAC5B,UAAI,KAAK,IAAI;AACZ,YAAI,OAAO,IAAI,IAAI,MAAM,IAAE;AAAA,aACrB;AACN,YAAI,OAAO,IAAI;AAAA;AAGhB,aAAO;AAAA;AAmCR,OAAE,OAAO,SAAU,KAAK,OAAO;AAC9B,UAAI,YAAY,SAAS,gBAAgB,OAAO;AAChD,UAAI,WAAW,GAAE,eAAe,KAAK,UAAU,WAAW,UAAU;AACpE,UAAI,KAAK,GAAE,cAAc,UAAU;AACnC,UAAI,CAAC,IAAI;AAAC,iBAAS;AAAA;AACnB,aAAO;AAAA;AA+BR,OAAE,iBAAiB,SAAU,KAAK,WAAW,UAAU;AACtD,UAAI,CAAC,GAAE,4BAA4B;AAAE,eAAO,IAAI,SAAS,qBAAqB,KAAK,WAAW;AAAA;AAE9F,UAAI,mBAAmB,GAAE,sBAAsB;AAC/C,YAAM,GAAE,YAAY;AAEpB,UAAI,UAAU,GAAE,WAAW,IAAI;AAE/B,UAAI,WAAW;AACf,UAAI,WAAW,QAAQ,QAAQ,OAAO,MAAM;AAC3C,qBAAa,OAAO,QAAQ;AAC5B,YAAI,aAAa,MAAM;AAAE,sBAAY,IAAI;AAAA;AACzC,mBAAW,GAAE,aAAa,OAAO,QAAQ,KAAK,WAAW,YAAY,IAAI;AAEzE,2BAAmB,oBAAoB,GAAE,sBAAsB,QAAQ;AACvE,YAAI,kBAAkB;AACrB,mBAAS,eAAe;AAAA;AAAA,aAEnB;AACN,mBAAW,IAAI,SAAS,qBAAqB,KAAK,WAAW;AAAA;AAG9D,eAAS,WAAW,GAAE;AAEtB,aAAO;AAAA;AAcR,OAAE,OAAO,WAAY;AACpB,UAAI,YAAY,KAAK;AACrB,eAAS,IAAI,UAAU,QAAQ,OAAO;AACrC,kBAAU,GAAG;AAAA;AAAA;AAaf,OAAE,sBAAsB,SAAS,KAAK,WAAW;AAChD,YAAM,GAAE,YAAY;AACpB,SAAE,sBAAsB,GAAE,WAAW,IAAI,KAAK,OAAO,SAAS,gBAAgB,OAAO;AAAA;AAYtF,OAAE,sBAAsB,SAAS,KAAK;AACrC,YAAM,GAAE,YAAY;AACpB,aAAO,GAAE,sBAAsB,GAAE,WAAW,IAAI,KAAK;AAAA;AAkBtD,OAAE,gBAAgB,SAAU,UAAU,WAAW;AAChD,UAAI,mBAAmB,GAAE,sBAAsB,SAAS,QAAQ;AAChE,UAAI,UAAU,aAAa,MAAM;AAAC,kBAAU,YAAY,iBAAiB,aAAa,GAAE;AAAA;AAAyB;AACjH,UAAI,UAAU,SAAS,MAAM;AAAC,kBAAU,QAAQ,iBAAiB,SAAS;AAAA;AAC1E,UAAI,UAAU,UAAU,MAAM;AAAC,kBAAU,SAAS,SAAS;AAAA;AAC3D,UAAI,UAAU,QAAQ,MAAM;AAAC,kBAAU,OAAO,SAAS;AAAA;AACvD,UAAI,UAAU,UAAU,MAAM;AAAC,kBAAU,SAAS,SAAS;AAAA;AAC3D,UAAI,UAAU,OAAO,MAAM;AAAC,kBAAU,MAAM,SAAS;AAAA;AAErD,UAAI,UAAU,SAAS,GAAG;AACzB,YAAI,KAAK,GAAE,cAAc,UAAU;AACnC,YAAI,CAAC,IAAI;AAAC,iBAAO;AAAA;AAAA,aACX;AAGN,YAAI,iBAAiB,WAAW,WAAY;AAC3C,aAAE,cAAc,UAAU;AAAA,WACxB,UAAU;AACb,iBAAS,iBAAiB;AAAA;AAG3B,WAAK,WAAW,KAAK;AAErB,aAAO;AAAA;AAaR,OAAE,gBAAgB,SAAU,UAAU,WAAW;AAChD,UAAI,CAAC,aAAa,IAAI,UAAU,UAAU,YAAY;AACrD,eAAO;AAAA;AAER,UAAI,SAAS,SAAS,cAAc;AACpC,UAAI,CAAC,QAAQ;AACZ,YAAI,QAAQ,SAAS,QAAQ,KAAK,YAAY;AAC9C,YAAI,QAAQ,IAAI;AAAC,eAAK,WAAW,OAAO,OAAO;AAAA;AAC/C,eAAO;AAAA;AAER,aAAO;AAAA;AAYR,OAAE,cAAc,SAAU,OAAO;AAChC,aAAO,GAAE,QAAQ,UAAU,EAAC,KAAK;AAAA;AAYlC,OAAE,gBAAgB,SAAU,UAAU;AACrC,mBAAa,OAAO;AACpB,UAAI,QAAQ,SAAS,QAAQ,KAAK,YAAY;AAC9C,UAAI,QAAQ,IAAI;AAAC,aAAK,WAAW,OAAO,OAAO;AAAA;AAAA;AAGhD,aAAS,QAAQ;AAkBjB,0BAAsB,KAAK,MAAK;AAC/B,WAAK,KAAK,KAAK;AAAA;AAYhB,iBAAa,WAAW;AAUxB,iBAAa,SAAS,SAAU,KAAK,MAAK;AACzC,UAAI,UAAU,aAAa,IAAI;AAC/B,UAAI,WAAW,MAAM;AACpB,qBAAa,SAAS,OAAO,IAAI,aAAa,KAAK;AACnD,eAAO;AAAA;AAER,aAAO;AAAA;AASR,iBAAa,YAAY,SAAU,KAAK;AACvC,UAAI,UAAU,aAAa,IAAI;AAC/B,UAAI,WAAW,MAAM;AAAC,eAAO;AAAA;AAC7B,cAAQ;AACR,aAAO,aAAa,SAAS;AAC7B,aAAO;AAAA;AAOR,iBAAa,YAAY,WAAY;AACpC,eAAQ,WAAW,aAAa,UAAU;AACzC,qBAAa,SAAS,SAAS;AAAA;AAEhC,mBAAa,WAAW;AAAA;AAWzB,iBAAa,MAAM,SAAU,UAAU,WAAW;AACjD,UAAI,UAAU,aAAa,IAAI,SAAS;AACxC,UAAI,WAAW,MAAM;AAAC,eAAO;AAAA;AAC7B,aAAO,QAAQ,KAAK,UAAU;AAAA;AAS/B,iBAAa,SAAS,SAAU,UAAU;AACzC,UAAI,UAAU,aAAa,IAAI,SAAS;AACxC,UAAI,WAAW,MAAM;AAAC,eAAO;AAAA;AAC7B,cAAQ,QAAQ;AAChB,aAAO;AAAA;AAOR,iBAAa,gBAAgB,WAAY;AACxC,aAAO,EAAE;AAAA;AAQV,iBAAa,MAAM,SAAU,KAAK;AACjC,aAAO,aAAa,SAAS;AAAA;AAG9B,QAAI,IAAI,aAAa;AACrB,MAAE,cAAc;AAOhB,MAAE,MAAM;AAOR,MAAE,MAAM;AASR,MAAE,aAAa;AAOf,MAAE,SAAS;AASX,MAAE,OAAO,SAAU,KAAK,MAAK;AAC5B,WAAK,MAAM;AACX,WAAK,MAAM,QAAO,KAAK;AACvB,UAAI,KAAK,OAAO,IAAI;AAAC,aAAK,MAAM,KAAK;AAAA;AACrC,WAAK,aAAa;AAAA;AASnB,MAAE,OAAO,SAAU,OAAO;AACzB,aAAO,KAAK,WAAW;AAAA;AASxB,MAAE,OAAO,SAAU,UAAU,WAAW;AACvC,UAAI,CAAC,KAAK,SAAS,WAAW,WAAW;AAAC,eAAO;AAAA;AACjD,WAAK,WAAW,KAAK;AACrB,WAAK;AACL,aAAO;AAAA;AAUR,MAAE,UAAU,SAAU,UAAU;AAC/B,UAAI,QAAQ,SAAS,QAAQ,KAAK,YAAY;AAC9C,UAAI,SAAS,IAAI;AAAC,eAAO;AAAA;AACzB,WAAK,WAAW,OAAO,OAAO;AAC9B,WAAK;AACL,aAAO;AAAA;AAOR,MAAE,aAAa,WAAY;AAE1B,eAAS,IAAE,KAAK,SAAO,GAAG,KAAG,GAAG,KAAK;AACpC,aAAK,WAAW,GAAG;AAAA;AAAA;AAYrB,MAAE,WAAW,SAAU,WAAW,UAAU;AAC3C,UAAI,QAAQ;AAEZ,UAAI,aAAa,MAAM,gBAAgB;AAEtC,sBAAc,KAAK,KAAK;AACxB,YAAI,eAAe,MAAM;AACxB,iBAAO;AAAA;AAAA;AAIT,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK;AACzC,iBAAS,KAAK,KAAK;AAGnB,YAAI,UAAU,MAAM;AACnB,iBAAO;AAAA;AAIR,YAAI,OAAO,aAAa,MAAM,iBAC7B,OAAO,aAAa,MAAM,oBAC1B,OAAO,aAAa,MAAM,aAAa;AACvC,wBAAc;AACd;AAAA;AAGD,YAAI,aAAa,MAAM,gBAAgB;AACtC;AAAA;AAID,YAAK,aAAa,MAAM,mBAAmB,OAAO,WAAW,YAAY,YACvE,aAAa,MAAM,kBAAkB,OAAO,WAAW,YAAY,UAAW;AAC9E,wBAAc;AAAA;AAAA;AAIjB,UAAI,eAAe,MAAM;AACxB,oBAAY;AACZ,aAAK,QAAQ;AACb,eAAO;AAAA;AAER,aAAO;AAAA;AAGR,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAAA;AAmDT,EAAC,YAAY;AACZ;AAIA,QAAI,wBAAwB,SAAU,KAAK,WAAW,UAAU,kBAAkB;AACjF,WAAK;AAUL,WAAK,MAAM;AAQX,WAAK,WAAW;AAQhB,WAAK,YAAY;AAWjB,WAAK,iBAAiB;AAiBtB,WAAK,UAAW;AAChB,aAAO,eAAe,MAAM,UAAU;AAAA,QACrC,KAAK,KAAK;AAAA,QACV,KAAK,KAAK;AAAA;AAWX,WAAK,OAAQ;AACb,aAAO,eAAe,MAAM,OAAO;AAAA,QAClC,KAAK,KAAK;AAAA,QACV,KAAK,KAAK;AAAA;AAUX,WAAK,aAAa,KAAK,IAAI,GAAG,aAAa;AAC3C,aAAO,eAAe,MAAM,aAAa;AAAA,QACxC,KAAK,KAAK;AAAA,QACV,KAAK,KAAK;AAAA;AAWX,WAAK,YAAY,KAAK,IAAI,GAAG,YAAY;AACzC,aAAO,eAAe,MAAM,YAAY;AAAA,QACvC,KAAK,KAAK;AAAA,QACV,KAAK,KAAK;AAAA;AAYX,WAAK,oBAAoB;AACzB,aAAO,eAAe,MAAM,oBAAoB;AAAA,QAC/C,KAAK,KAAK;AAAA,QACV,KAAK,KAAK;AAAA;AAEX,UAAG,qBAAqB,SAAS,qBAAqB,MAAM;AAAE,aAAK,qBAAqB;AAAA;AAUxF,WAAK,YAAY;AACjB,aAAO,eAAe,MAAM,YAAY;AAAA,QACvC,KAAK,KAAK;AAAA,QACV,KAAK,KAAK;AAAA;AAYX,WAAK,QAAQ;AACb,aAAO,eAAe,MAAM,QAAQ;AAAA,QACnC,KAAK,KAAK;AAAA,QACV,KAAK,KAAK;AAAA;AAWX,WAAK,SAAS;AACd,aAAO,eAAe,MAAM,SAAS;AAAA,QACpC,KAAK,KAAK;AAAA,QACV,KAAK,KAAK;AAAA;AASX,WAAK,UAAU;AACf,aAAO,eAAe,MAAM,UAAU;AAAA,QACrC,KAAK,KAAK;AAAA,QACV,KAAK,KAAK;AAAA;AAAA;AAkDZ,QAAI,IAAI,SAAS,OAAO,uBAAuB,SAAS;AAsBxD,MAAE,OAAO,SAAU,OAAO;AACzB,UAAI,YAAY,SAAS,gBAAgB,OAAO;AAChD,UAAI,KAAK,aAAa,SAAS,MAAM,gBAAgB;AACpD,aAAK,eAAe;AACpB,YAAI,KAAK,SAAS;AAAE,eAAK,WAAW;AAAA;AACpC;AAAA;AAED,WAAK;AACL,eAAS,MAAM,cAAc,MAAM;AACnC,aAAO;AAAA;AAgBR,MAAE,OAAO,WAAY;AACpB,WAAK,YAAY;AACjB,WAAK,UAAU;AACf,WAAK;AACL,WAAK;AACL,WAAK,YAAY,SAAS,MAAM;AAChC,aAAO;AAAA;AAQR,MAAE,UAAU,WAAW;AACtB,WAAK;AACL,WAAK,MAAM;AACX,WAAK,mBAAmB;AAExB,WAAK;AAAA;AAUN,MAAE,iBAAiB,SAAS,WAAW;AACtC,UAAI,UAAU,UAAU,MAAM;AAAE,aAAK,aAAa,UAAU;AAAA;AAC5D,UAAI,UAAU,QAAQ,MAAM;AAAE,aAAK,SAAS,UAAU;AAAA;AACtD,UAAI,UAAU,UAAU,MAAM;AAAE,aAAK,WAAW,UAAU;AAAA;AAC1D,UAAI,UAAU,OAAO,MAAM;AAAE,aAAK,QAAQ,UAAU;AAAA;AACpD,UAAI,UAAU,aAAa,MAAM;AAChC,aAAK,cAAc,UAAU;AAC7B,aAAK,aAAa,UAAU;AAAA;AAE7B,aAAO;AAAA;AAGR,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAWR,MAAE,aAAa,WAAW;AACzB,aAAO,KAAK;AAAA;AAWb,MAAE,aAAa,SAAU,OAAO;AAC/B,UAAK,UAAU,QAAQ,UAAU,SAAU,KAAK,WAAW,OAAO;AAAC;AAAA;AACnE,UAAI,SAAS,QAAQ,KAAK,aAAa,SAAS,MAAM,gBAAgB;AAAC;AAAA;AACvE,WAAK,UAAU;AACf,UAAG,OAAO;AACT,aAAK;AAAA,aACC;AACN,aAAK;AAAA;AAEN,mBAAa,KAAK;AAClB,aAAO;AAAA;AAUR,MAAE,aAAa,SAAU,OAAO;AAC/B,UAAI,SAAS,KAAK,SAAS;AAAE,eAAO;AAAA;AACpC,WAAK,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG;AACvC,UAAI,CAAC,KAAK,QAAQ;AACjB,aAAK;AAAA;AAEN,aAAO;AAAA;AASR,MAAE,aAAa,WAAY;AAC1B,aAAO,KAAK;AAAA;AAWb,MAAE,YAAY,SAAU,OAAO;AAC9B,UAAI,UAAU,QAAQ,UAAU,OAAO;AAAC;AAAA;AACxC,WAAK,SAAS;AACd,WAAK;AACL,aAAO;AAAA;AAUR,MAAE,YAAY,WAAY;AACzB,aAAO,KAAK;AAAA;AAUb,MAAE,UAAU,SAAU,OAAO;AAC5B,UAAG,SAAS,KAAK,MAAM;AAAE,eAAO;AAAA;AAChC,WAAK,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG;AACrC,WAAK;AACL,aAAO;AAAA;AASR,MAAE,UAAU,WAAY;AACvB,aAAO,KAAK;AAAA;AASb,MAAE,eAAe,WAAY;AAC5B,UAAI,CAAC,KAAK,WAAW,KAAK,aAAa,SAAS,MAAM,gBAAgB;AACrE,aAAK,YAAY,KAAK;AAAA;AAEvB,aAAO,KAAK;AAAA;AAUb,MAAE,eAAe,SAAU,OAAO;AACjC,WAAK,YAAY,KAAK,IAAI,GAAG;AAC7B,UAAI,KAAK,aAAa,SAAS,MAAM,gBAAgB;AACpD,aAAK;AAAA;AAEN,aAAO;AAAA;AASR,MAAE,gBAAgB,WAAY;AAC7B,aAAO,KAAK;AAAA;AAUb,MAAE,gBAAgB,SAAU,OAAO;AAClC,UAAI,SAAS,KAAK,YAAY;AAAE,eAAO;AAAA;AACvC,WAAK,aAAa,KAAK,IAAI,GAAG,SAAS;AACvC,WAAK;AACL,aAAO;AAAA;AASR,MAAE,eAAe,WAAY;AAC5B,aAAO,KAAK;AAAA;AAWb,MAAE,eAAe,SAAU,OAAO;AACjC,UAAI,SAAS,KAAK,WAAW;AAAE,eAAO;AAAA;AACtC,WAAK,YAAY,KAAK,IAAI,GAAG,SAAS;AACtC,WAAK;AACL,aAAO;AAAA;AAWR,MAAE,uBAAuB,SAAU,OAAO;AACzC,WAAK,oBAAoB;AACzB,UAAI,KAAK,aAAa,KAAK,KAAK,mBAAmB;AAAE,aAAK;AAAA;AAC1D,aAAO;AAAA;AAWR,MAAE,uBAAuB,WAAY;AACpC,aAAO,KAAK;AAAA;AAUb,MAAE,WAAW,WAAY;AACxB,aAAO,KAAK;AAAA;AAUb,MAAE,WAAW,SAAU,OAAO;AAC7B,UAAG,KAAK,qBAAqB,MAAM;AAElC,YAAI,KAAK,SAAS,KAAK,SAAS,GAAG;AAClC,eAAK,eAAe;AAAA,mBAGZ,KAAK,SAAS,KAAK,SAAS,GAAG;AACvC,eAAK,YAAY;AAAA;AAAA;AAGnB,WAAK,QAAQ;AAAA;AAWd,MAAE,aAAa,SAAU,MAAM;AAC9B,UAAI,QAAQ,IAAI,SAAS,MAAM;AAC/B,WAAK,cAAc;AAAA;AAQpB,MAAE,WAAW,WAAY;AACxB,mBAAa,KAAK;AAClB,WAAK;AACL,WAAK,UAAU;AAEf,eAAS,MAAM,cAAc;AAAA;AAQ9B,MAAE,aAAa,WAAY;AAC1B,WAAK;AACL,WAAK,YAAY,SAAS,MAAM;AAChC,WAAK,WAAW;AAAA;AAYjB,MAAE,gBAAgB,SAAU,WAAW;AACtC,WAAK,aAAa,UAAU;AAC5B,WAAK,SAAS,UAAU;AACxB,WAAK,WAAW,UAAU;AAC1B,WAAK,QAAQ,UAAU;AACvB,UAAI,UAAU,aAAa,MAAM;AAChC,aAAK,cAAc,UAAU;AAC7B,aAAK,aAAa,UAAU;AAAA;AAG7B,UAAI,KAAK,qBAAqB,QAAQ,KAAK,YAAY,KAAK,WAAW;AACtE,aAAK,UAAU;AACf,aAAK;AACL,aAAK,YAAY,SAAS,MAAM;AAChC,aAAK,WAAW;AAChB,eAAO;AAAA,aACD;AACN,aAAK;AACL,eAAO;AAAA;AAAA;AAUT,MAAE,cAAc,WAAY;AAC3B,WAAK;AACL,WAAK,YAAY,SAAS,MAAM;AAChC,WAAK,WAAW;AAAA;AASjB,MAAE,uBAAuB,SAAU,OAAO;AACzC,WAAK,YAAY;AAEjB,UAAI,KAAK,SAAS,GAAG;AACpB,aAAK;AACL,aAAK;AACL,aAAK,WAAW;AAChB;AAAA;AAGD,WAAK;AACL,WAAK,YAAY,SAAS,MAAM;AAChC,WAAK,WAAW;AAAA;AASjB,MAAE,oBAAoB,WAAY;AAAA;AAUlC,MAAE,gBAAgB,WAAY;AAAA;AAU9B,MAAE,aAAa,WAAY;AAAA;AAU3B,MAAE,mBAAmB,WAAY;AAAA;AAUjC,MAAE,kBAAkB,WAAY;AAAA;AAUhC,MAAE,yBAAyB,WAAY;AAAA;AAUvC,MAAE,4BAA4B,WAAY;AAAA;AAU1C,MAAE,kBAAkB,WAAY;AAAA;AAWhC,MAAE,iBAAiB,SAAU,OAAO;AAAA;AAWpC,MAAE,cAAc,SAAU,OAAO;AAAA;AAUjC,MAAE,SAAS,WAAY;AAAA;AAUvB,MAAE,UAAU,WAAY;AAAA;AAUxB,MAAE,cAAc,WAAW;AAAA;AAU3B,MAAE,iBAAiB,WAAW;AAAA;AAU9B,MAAE,cAAc,WAAY;AAAA;AAI5B,aAAS,wBAAwB,SAAS,QAAQ,uBAAuB;AACzE,aAAS,uBAAuB,SAAS;AAAA;AAO1C,EAAC,YAAY;AACZ;AAWA,QAAI,iBAAiB,WAAY;AAWhC,WAAK,gBAAgB;AAOrB,WAAK,WAAW;AAUhB,WAAK,gBAAgB;AAQrB,WAAK,kBAAkB;AASvB,WAAK,UAAU;AAOf,WAAK;AAOL,WAAK;AAAA;AAEN,QAAI,IAAI,eAAe;AAYvB,mBAAe,gBAAgB;AAQ/B,mBAAe,cAAc,WAAY;AACxC,aAAO;AAAA;AAcR,MAAE,WAAW,SAAU,UAAU;AAChC,UAAI,SAAS,KAAK,SAAS,SAAS;AACpC,UAAG,UAAU,CAAC,OAAO,UAAU;AAAC,eAAO,KAAK,SAAS,SAAS;AAAA;AAE9D,WAAK,cAAc,SAAS,OAAO;AACnC,WAAK,gBAAgB,SAAS,OAAO;AACrC,eAAS,IAAI,KAAK,aAAa;AAC/B,aAAO,GAAG,YAAY,KAAK,wBAAwB;AACnD,WAAK,SAAS,SAAS,OAAO;AAC9B,aAAO;AAAA;AASR,MAAE,UAAU,SAAU,QAAQ;AAC7B,aAAO,GAAG,SAAS,KAAK,qBAAqB;AAC7C,aAAO;AAAA;AAUR,MAAE,mBAAmB,SAAU,KAAK;AACnC,aAAQ,KAAK,cAAc,QAAQ;AAAA;AASpC,MAAE,oBAAoB,SAAU,KAAK;AACpC,aAAQ,CAAE,MAAK,cAAc,QAAQ,QAAQ,KAAK,cAAc,QAAQ;AAAA;AAQzE,MAAE,cAAc,SAAU,KAAK;AAC9B,UAAI,CAAC,KAAK,gBAAgB,MAAM;AAAE;AAAA;AAClC,eAAS,IAAI,KAAK,gBAAgB,KAAK,QAAQ,OAAO;AACrD,YAAI,OAAO,KAAK,gBAAgB,KAAK;AACrC,aAAK;AAAA;AAEN,aAAO,KAAK,gBAAgB;AAC5B,aAAO,KAAK,cAAc;AAC1B,UAAG,KAAK,SAAS,MAAM;AAAE,aAAK,SAAS,KAAK;AAAA;AAC5C,aAAO,KAAK,SAAS;AAAA;AAQtB,MAAE,kBAAkB,WAAY;AAC/B,eAAQ,OAAO,KAAK,eAAe;AAClC,aAAK,YAAY;AAAA;AAAA;AAYnB,MAAE,SAAS,SAAU,KAAK,WAAW,UAAU;AAC9C,UAAI,CAAC,KAAK,iBAAiB,MAAM;AAChC,aAAK,QAAQ,KAAK,SAAS;AAAA;AAE5B,UAAI,KAAK,IAAI,KAAK,oBAAoB,KAAK,WAAW,UAAU,KAAK,cAAc;AACnF,UAAG,KAAK,gBAAgB,MAAK;AAC5B,aAAK,gBAAgB,KAAK,KAAK;AAAA;AAKhC,SAAG,mBAAmB,GAAG,gBAAgB,SAAS,MAAM;AACxD,SAAG,iBAAiB,GAAG,cAAc,SAAS,MAAM;AAEpD,aAAO;AAAA;AAWR,MAAE,YAAY,SAAU,OAAO;AAC9B,WAAK,UAAU;AACf,WAAK;AACL,aAAO;AAAA;AAQR,MAAE,YAAY,WAAY;AACzB,aAAO,KAAK;AAAA;AAUb,MAAE,UAAU,SAAU,OAAO;AAC5B,WAAK;AACL,aAAO;AAAA;AAIR,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAWR,MAAE,yBAAyB,SAAU,OAAO;AAC3C,UAAI,MAAM,MAAM,OAAO,UAAU;AACjC,WAAK,cAAc,OAAO,MAAM;AAChC,eAAS,IAAI,GAAG,IAAI,KAAK,gBAAgB,KAAK,QAAQ,IAAI,GAAG,KAAK;AACjE,YAAI,OAAO,KAAK,gBAAgB,KAAK;AACrC,aAAK,oBAAoB,KAAK,cAAc;AAE5C,aAAK,gBAAgB,OAAO;AAAA;AAAA;AAU9B,MAAE,sBAAsB,SAAS,OAAO;AAAA;AASxC,MAAE,gBAAgB,WAAY;AAAA;AAI9B,aAAS,iBAAiB;AAAA;AAO3B,EAAC,YAAY;AACZ;AAWA,oBAAgB,UAAU;AACzB,WAAK,2BAA2B,UAAU,MAAM,SAAS,MAAM;AAAA;AAE/D;AACD,QAAI,IAAI,SAAS,OAAO,QAAQ,SAAS;AAQzC,WAAO,UAAU;AAIjB,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAKR,MAAE,iBAAiB,WAAW;AAC7B,WAAK,WAAW,IAAI,SAAS,WAAW,KAAK,OAAO;AACpD,WAAK,SAAS,gBAAgB;AAAA;AAG/B,MAAE,gBAAgB,SAAU,OAAO;AAElC,aAAO,QAAQ,gBAAgB,KAAK,YAC5B,SAAS,MAAM,KAAK,qBAAqB,OACzC,SAAS,MAAM,KAAK,YAAY;AAAA;AAUzC,MAAE,sBAAsB,SAAU,cAAc;AAC/C,WAAK,UAAU;AACf,WAAK;AAAA;AAGN,aAAS,iBAAiB,SAAS,QAAQ,QAAQ;AAAA;AAqBpD,EAAC,YAAY;AACZ;AAEA,mCAA+B,KAAK,WAAW,UAAU,kBAAkB;AAC1E,WAAK,kCAAkC,KAAK,WAAW,UAAU;AAYjE,WAAK,WAAW,GAAE,QAAQ;AAS1B,WAAK,UAAU,GAAE,QAAQ;AACzB,WAAK,QAAQ,eAAe,GAAE;AAC9B,WAAK,QAAQ,QAAQ,KAAK;AAC1B,WAAK;AAUL,WAAK,aAAa;AAalB,WAAK,wBAAwB;AAa7B,WAAK,kBAAkB;AAUvB,WAAK,qBAAqB;AAG1B,WAAK,gBAAgB,SAAS,MAAM,KAAK,sBAAsB;AAAA;AAC/D;AACD,QAAI,IAAI,SAAS,OAAO,uBAAuB,SAAS;AACxD,QAAI,KAAI;AAUR,OAAE,UAAU;AAUZ,OAAE,iBAAiB;AAUnB,OAAE,kBAAkB;AAUpB,OAAE,gBAAgB;AAIlB,MAAE,UAAU,WAAW;AACtB,WAAK;AAEL,WAAK,QAAQ,WAAW;AACxB,WAAK,UAAU;AACf,WAAK,SAAS,WAAW;AACzB,WAAK,WAAW;AAAA;AAGjB,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAKR,MAAE,aAAa,WAAW;AACzB,WAAK,QAAQ,YAAY,KAAK,MAAM,GAAG;AAAA;AAIxC,MAAE,iBAAiB,SAAS,OAAO;AAClC,WAAK,kBAAkB,KAAK,kBAAkB,KAAK;AAAA;AAGpD,MAAE,cAAc,SAAS,OAAO;AAC/B,UAAI,KAAK,aAAa,SAAS,MAAM,gBAAgB;AAAE;AAAA;AACvD,WAAK,kBAAkB,KAAK,wBAAwB,KAAK,oBAAoB;AAAA;AAG9E,MAAE,yBAAyB,WAAY;AACtC,WAAK,YAAY,KAAK,iBAAiB,WAAW;AAAA;AAGnD,MAAE,iBAAiB,WAAY;AAC9B,UAAI,KAAK,cAAc,KAAK,aAAa,SAAS,MAAM,gBAAgB;AACvE,aAAK,aAAa,KAAK,kBAAkB,KAAK;AAC9C,aAAK,kBAAkB,KAAK,kBAAkB,KAAK;AAAA;AAGpD,UAAI,KAAK,SAAS,mBAAmB,GAAG;AAAC,aAAK,SAAS,WAAW;AAAA;AAGlE,mBAAa,KAAK;AAElB,WAAK,qBAAqB;AAAA;AAW3B,MAAE,oBAAoB,SAAS,WAAW;AACzC,UAAG,WAAW;AACb,kBAAU,KAAK;AACf,kBAAU,WAAW;AAGrB,YAAK,SAAS,cAAc,OAAQ;AACnC,cAAI;AAAE,sBAAU,SAAS,GAAE;AAAA,mBAAwB,GAAN;AAAA;AAAA;AAE9C,oBAAY;AAAA;AAEb,aAAO;AAAA;AAGR,MAAE,oBAAoB,SAAU,OAAO;AACtC,WAAK,SAAS,QAAQ,GAAE;AAExB,UAAI,MAAM,KAAK,YAAY,MAC1B,MAAM,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,aAAa,MAAO;AACrD,WAAK,aAAa,KAAK,wBAAyB,GAAE,QAAQ,cAAc,KAAM;AAC9E,WAAK,qBAAqB,KAAK,WAAW,YAAY;AAEtD,WAAK,wBAAwB,WAAW,KAAK,eAAgB,OAAM,OAAO;AAE1E,UAAG,KAAK,SAAS,GAAG;AACnB,aAAK,kBAAkB,KAAK,wBAAwB,KAAK,oBAAoB;AAAA;AAAA;AAa/E,MAAE,0BAA0B,SAAS,WAAW,SAAQ;AACvD,UAAI,YAAY,GAAE,QAAQ;AAC1B,gBAAU,SAAS,KAAK;AACxB,gBAAU,QAAQ,KAAK;AACvB,UAAI,MAAM,KAAK,YAAY;AAC3B,gBAAU,YAAY,YAAY;AAClC,gBAAU,MAAM,UAAU,WAAW,UAAQ,KAAK,aAAW,MAAQ,MAAM;AAC3E,aAAO;AAAA;AAGR,MAAE,SAAS,WAAY;AACtB,WAAK,YAAa,IAAE,QAAQ,cAAc,KAAK,sBAAsB;AACrE,WAAK,aAAa,KAAK,kBAAkB,KAAK;AAC9C,WAAK,kBAAkB,KAAK,kBAAkB,KAAK;AAEnD,UAAI,KAAK,SAAS,mBAAmB,GAAG;AAAC,aAAK,SAAS,WAAW;AAAA;AAElE,mBAAa,KAAK;AAAA;AAGnB,MAAE,UAAU,WAAY;AACvB,WAAK;AAAA;AASN,MAAE,gBAAgB,WAAY;AAC7B,UAAI,YAAY,KAAK,SAAS,IAAI,KAAK;AACrC,UAAI,aAAa,KAAK,SAAS,KAAK,OAAO;AAC3C,aAAK,SAAS,KAAK,QAAQ;AAAA;AAAA;AAI9B,MAAE,4BAA4B,WAAY;AACzC,aAAS,IAAE,QAAQ,cAAc,KAAK,sBAAsB;AAAA;AAG7D,MAAE,kBAAkB,WAAY;AAC/B,WAAK,aAAa,KAAK,kBAAkB,KAAK;AAC9C,WAAK,kBAAkB,KAAK,kBAAkB,KAAK;AACnD,mBAAa,KAAK;AAElB,UAAI,CAAC,KAAK,SAAS;AAAC,aAAK;AAAA;AAAA;AAO1B,MAAE,cAAc,WAAY;AAC3B,WAAK,kBAAkB,KAAK;AAC5B,WAAK,aAAa,KAAK;AACvB,WAAK,qBAAqB,KAAK,WAAW;AAC1C,WAAK,kBAAkB,KAAK,wBAAwB,KAAK,oBAAoB;AAC7E,WAAK,wBAAwB,WAAW,KAAK,eAAe,KAAK;AAAA;AAGlE,MAAE,kBAAkB,WAAY;AAC/B,UAAG,KAAK,aAAa,SAAS,MAAM,gBAAgB;AACnD,aAAK;AACL,aAAK;AAAA;AAAA;AAIP,aAAS,wBAAwB,SAAS,QAAQ,uBAAuB;AAAA;AAO1E,EAAC,YAAY;AAEZ;AAsCA,8BAA0B;AACzB,WAAK;AAUL,WAAK,gBAAgB,GAAE;AAAc;AAQrC,WAAK,UAAU,GAAE;AAUjB,WAAK,yBAAyB,KAAK,QAAQ;AAC3C,WAAK,uBAAuB,QAAQ,KAAK,QAAQ;AASjD,WAAK,WAAW,KAAK,QAAQ;AAC7B,WAAK,SAAS,QAAQ,KAAK;AAC3B,eAAS,sBAAsB,kBAAkB,KAAK;AAEtD,WAAK,gBAAgB,GAAE;AAEvB,WAAK,eAAe,SAAS;AAC7B,WAAK,sBAAsB,SAAS;AAEpC,WAAK;AAAA;AAEN,QAAI,IAAI,SAAS,OAAO,gBAAgB,SAAS;AAGjD,QAAI,KAAI;AAUR,OAAE,gBAAgB;AASlB,OAAE,gBAAgB;AAalB,OAAE,UAAU;AAcX,OAAE,iBAAiB;AAUpB,OAAE,YAAY;AASd,OAAE,sBAAsB;AASxB,OAAE,cAAc,WAAY;AAE3B,UAAI,mBAAmB,SAAS,cAAc,SAAS,SAAS,cAAc,aAAa,SAAS,cAAc;AAElH,UAAI,SAAS,YAAY,WAAW,CAAC,oBAAoB,CAAC,KAAK,uBAAuB;AAAE,eAAO;AAAA;AAC/F,SAAE;AACF,UAAI,GAAE,WAAW,MAAM;AAAC,eAAO;AAAA;AAC/B,aAAO;AAAA;AAmBR,OAAE,iBAAiB,WAAW;AAC7B,UAAI,GAAE,WAAW,MAAM;AAAC;AAAA;AACxB,UAAI,SAAS,GAAE,QAAQ;AACvB,aAAO,SAAS,GAAE;AAClB,aAAO,QAAQ,GAAE,QAAQ;AACzB,aAAO,MAAM,GAAG,GAAG;AAAA;AAapB,OAAE,sBAAsB,WAAW;AAElC,UAAI,YAAY;AAEhB,UAAI,MAAM,IAAI;AACd,UAAI;AACH,YAAI,KAAK,OAAO,2BAA2B;AAAA,eACnC,QAAP;AAED,oBAAY;AACZ,eAAO;AAAA;AAER,UAAI,UAAU,WAAW;AAAE,oBAAY;AAAA;AAEvC,UAAI,SAAS,WAAW;AAAE,oBAAY,KAAK,UAAU,OAAQ,MAAK,UAAU,OAAQ,KAAK,UAAU,KAAK,KAAK,YAAY;AAAA;AACzH,UAAI;AACH,YAAI;AAAA,eACI,QAAP;AAED,oBAAY;AAAA;AAGb,aAAO;AAAA;AAUR,OAAE,wBAAwB,WAAY;AACrC,UAAI,GAAE,iBAAiB,MAAM;AAAC;AAAA;AAE9B,UAAI,IAAI,SAAS,cAAc;AAC/B,UAAI,EAAE,eAAe,MAAM;AAAC,eAAO;AAAA;AAEnC,UAAI,GAAE,WAAW,MAAM;AACtB,WAAE,UAAU,GAAE;AACd,YAAI,GAAE,WAAW,MAAM;AAAE,iBAAO;AAAA;AAAA;AAEjC,UAAI,GAAE,kBAAkB,MAAM;AAC7B,WAAE,iBAAiB,GAAE,QAAQ,aAAa,GAAG,GAAG;AAAA;AAGjD,SAAE;AAGF,UAAI,kBAAkB,UAAU,GAAE,QAAQ,SAAS,WAAW;AAC7D,WAAE;AACF,iBAAS,iBAAiB,aAAa,GAAE,SAAS;AAClD,iBAAS,iBAAiB,cAAc,GAAE,SAAS;AACnD,iBAAS,iBAAiB,YAAY,GAAE,SAAS;AAAA;AAGlD,SAAE,gBAAgB;AAAA,QACjB,SAAQ;AAAA,QACR,QAAO;AAAA,QACP,QAAO;AAAA;AAIR,UAAI,sBAAsB,SAAS,MAAM;AACzC,UAAI,eAAe,SAAS,MAAM;AAClC,eAAS,IAAI,GAAG,IAAI,oBAAoB,QAAQ,IAAI,GAAG,KAAK;AAC3D,YAAI,MAAM,oBAAoB;AAC9B,YAAI,WAAW,aAAa,QAAQ;AACpC,WAAE,cAAc,OAAQ,EAAE,YAAY,WAAW,QAAQ,QAAQ,EAAE,YAAY,WAAW,QAAQ,MAAQ,EAAE,YAAY,WAAW,aAAa,QAAQ,EAAE,YAAY,WAAW,aAAa;AAAA;AAK/L,UAAI,GAAE,QAAQ,YAAY,mBAAmB,GAAG;AAC/C,WAAE,cAAc,UAAU;AAAA;AAAA;AAgB5B,OAAE,sBAAsB,WAAW;AAGlC,UAAI,YAAa,OAAO,gBAAgB,OAAO;AAC/C,UAAI,aAAa,MAAM;AAAE,eAAO;AAAA;AAChC,UAAI,UAAU,IAAI;AAKlB,UAAI,iBAAiB,KAAK,UAAU,cAC/B,QAAQ,eAAe,GAAE,qBAAqB;AAClD,YAAI,SAAS,QAAQ,aAAa,GAAG,GAAG,GAAE,sBACxC,QAAQ,QAAQ;AAClB,cAAM,SAAS;AACf,cAAM,QAAQ,QAAQ;AACtB,cAAM,MAAM;AACZ,cAAM;AACN,gBAAQ;AAER,kBAAU,IAAI;AAAA;AAEf,aAAO;AAAA;AAcR,OAAE,sBAAsB,WAAW;AAClC,SAAE,gBAAgB;AAElB,UAAI,GAAE,QAAQ,YAAY;AAAE;AAAA;AAG5B,SAAE,QAAQ,aAAa,GAAE,QAAQ;AAGjC,UAAI,YAAY,GAAE,QAAQ;AAC1B,gBAAU,UAAU,QAAQ,UAAU,UAAU;AAChD,gBAAU,UAAU,OAAO,UAAU,UAAU;AAG/C,SAAE,gBAAgB;AAAA;AAenB,OAAE,UAAU,WAAW;AACtB,UAAI,GAAE,WAAW;AAAE;AAAA;AACnB,SAAE;AACF,UAAI,GAAE,QAAQ,SAAS,WAAW;AACjC,iBAAS,oBAAoB,aAAa,GAAE,SAAS;AACrD,iBAAS,oBAAoB,YAAY,GAAE,SAAS;AACpD,iBAAS,oBAAoB,cAAc,GAAE,SAAS;AACtD,WAAE,YAAY;AAAA;AAAA;AAMhB,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAYR,MAAE,qBAAqB,WAAW;AACjC,UAAI,IAAI,KAAK;AACb,QAAE,UAAU,KAAK;AACjB,QAAE,iBAAiB,GAAE;AACrB,QAAE,kBAAkB,KAAK;AACzB,QAAE,gBAAgB,KAAK;AAEvB,WAAK,aAAa,UAAU,KAAK;AAAA;AASlC,MAAE,gBAAgB,WAAY;AAC7B,UAAI,YAAY,SAAS,MAAM,cAAc,IAAI,KAAK;AACtD,UAAI,aAAa,KAAK,SAAS,KAAK,OAAO;AAC1C,aAAK,SAAS,KAAK,QAAQ;AAAA;AAAA;AAI7B,aAAS,iBAAiB,SAAS,QAAQ,gBAAgB;AAAA;AAO5D,EAAC,YAAY;AACZ;AAQA,gCAA4B;AAC1B,YAAM;AAAA;AAGR,QAAI,KAAI;AAUR,OAAE,QAAQ;AASV,OAAE,WAAW,IAAI;AASjB,OAAE,WAAW;AASZ,OAAE,MAAM,SAAU,KAAK;AACvB,UAAI,IAAI,GAAE,MAAM;AAChB,UAAI,KAAK,MAAM;AAEd,YAAI,GAAE,MAAM,OAAO,GAAE,SAAS;AAC9B,UAAE,MAAM;AAAA,aACF;AAEN,YAAI,GAAE,SAAS,MAAM;AACpB,cAAI,GAAE,SAAS;AACf,YAAE,MAAM;AAAA,eACF;AACN,aAAE,SAAS,OAAO;AAAA;AAAA;AAGpB,aAAO;AAAA;AAUP,OAAE,MAAM,SAAU,KAAK,KAAK;AAE3B,UAAG,OAAO,GAAE,MAAM,MAAM;AACvB,WAAE,SAAS,OAAO;AAAA,aACZ;AACN,WAAE,SAAS,IAAI;AAAA;AAAA;AAWlB,OAAE,SAAS,SAAU,KAAK;AACzB,UAAI,MAAM,GAAE,MAAM;AAClB,UAAI,OAAO,MAAM;AAAC,eAAO;AAAA;AACzB,SAAE,SAAS,IAAI;AACf,aAAO,GAAE,MAAM;AACf,aAAO,GAAE,SAAS;AAClB,aAAO;AAAA;AAUR,OAAE,cAAa,SAAU,KAAK;AAC7B,UAAI,IAAI,GAAE,MAAM;AAChB,UAAI,KAAK,QAAQ,CAAC,EAAE,UAAU;AAAC,eAAO;AAAA;AACtC,aAAO,EAAE,WAAW;AAAA;AAGrB,aAAS,mBAAmB;AAU5B,qBAAiB,KAAK;AASrB,WAAK,QAAQ;AAAA;AACb;AAED,QAAI,IAAI,QAAQ;AAChB,MAAE,cAAc;AAShB,MAAE,MAAM,WAAY;AACnB,UAAI;AACJ,UAAI,KAAK,MAAM,UAAU,GAAG;AAC3B,cAAM,KAAK;AAAA,aACL;AACN,cAAM,KAAK,MAAM;AAAA;AAElB,UAAI,IAAI,cAAc,MAAM;AAAC,iBAAS,KAAK,YAAY;AAAA;AACvD,aAAO;AAAA;AAQR,MAAE,MAAM,SAAU,KAAK;AAEtB,UAAI,QAAQ,SAAS,QAAQ,KAAK,OAAO;AACzC,UAAI,SAAS,IAAI;AAChB,aAAK,MAAM,MAAM;AACjB,aAAK,MAAM,KAAK;AAAA;AAAA;AAIlB,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAYR,MAAE,aAAa,WAAY;AAC1B,UAAI,MAAM,SAAS,cAAc;AACjC,UAAI,WAAW;AACf,UAAI,UAAU;AAEd,aAAO;AAAA;AAAA;AAST,EAAC,YAAY;AACZ;AAcA,oCAAgC,KAAK,WAAW,UAAU,kBAAkB;AAC3E,WAAK,kCAAkC,KAAK,WAAW,UAAU;AAIjE,WAAK,uBAAuB;AAC5B,WAAK,kBAAkB;AAGvB,WAAK,gBAAgB,SAAS,MAAM,KAAK,sBAAsB;AAC/D,WAAK,gBAAgB,SAAS,MAAM,KAAK,iBAAiB;AAC1D,WAAK,kBAAkB,SAAS,MAAM,KAAK,aAAa;AACxD,WAAK,yBAAyB,SAAS,MAAM,KAAK,wBAAwB;AAC1E,WAAK,eAAe,SAAS,MAAM,KAAK,sBAAsB;AAE9D,UAAI,UAAU;AACb,aAAK,uBAAwB,aAAY,YAAY;AAAA,aAC/C;AACN,aAAK,YAAY,SAAS,iBAAiB,YAAY,KAAK;AAAA;AAAA;AAG9D,QAAI,IAAI,SAAS,OAAO,wBAAwB,SAAS;AASzD,MAAE,kBAAkB,SAAU,OAAO;AACpC,WAAK;AAAA;AASN,MAAE,gBAAgB,SAAU,SAAS;AACpC,WAAK;AAAA;AAGN,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAIR,MAAE,iBAAiB,WAAW;AAC7B,UAAG,KAAK,qBAAqB,MAAM;AAAC;AAAA;AACpC,WAAK,kBAAkB,OAAO;AAC9B,WAAK,kBAAkB,oBAAoB,SAAS,gBAAgB,eAAe,KAAK,cAAc;AAAA;AAGvG,MAAE,cAAc,WAAW;AAC1B,UAAG,KAAK,qBAAqB,QAAS,KAAK,sBAAsB;AAAC;AAAA;AAClE,WAAK,kBAAkB,iBAAiB,SAAS,gBAAgB,eAAe,KAAK,cAAc;AACnG,WAAK,kBAAkB,OAAO;AAAA;AAG/B,MAAE,iBAAiB,WAAY;AAC9B,UAAI,MAAM,KAAK;AACf,UAAI,OAAO,MAAM;AAChB,YAAI;AACJ,YAAI,OAAO;AACX,YAAI,oBAAoB,SAAS,gBAAgB,cAAc,KAAK,eAAe;AACnF,YAAI,oBAAoB,SAAS,gBAAgB,cAAc,KAAK,eAAe;AACnF,YAAI,oBAAoB,SAAS,gBAAgB,gBAAgB,KAAK,iBAAiB;AACvF,YAAI,oBAAoB,SAAS,gBAAgB,eAAe,KAAK,cAAc;AACnF,YAAI,oBAAoB,SAAS,gBAAgB,cAAc,KAAK,wBAAwB;AAE5F,YAAI;AACH,cAAI,cAAc,KAAK;AAAA,iBACf,GAAP;AAAA;AAEF,iBAAS,iBAAiB,IAAI,KAAK,KAAK;AACxC,aAAK,oBAAoB;AAAA;AAAA;AAI3B,MAAE,gBAAgB,SAAU,WAAW;AACtC,WAAK,oBAAoB,SAAS,iBAAiB,IAAI,KAAK;AAC5D,aAAO,KAAK,oCAAoC;AAAA;AAGjD,MAAE,oBAAoB,SAAU,OAAO;AACtC,UAAI,KAAK,kBAAkB,eAAe,GAAG;AAC5C,YAAI,MAAM,KAAK;AACf,YAAI,iBAAiB,SAAS,gBAAgB,cAAc,KAAK,eAAe;AAChF,YAAI,iBAAiB,SAAS,gBAAgB,gBAAgB,KAAK,iBAAiB;AACpF,YAAI,UAAU;AACd,YAAI;AACJ;AAAA;AAGD,WAAK;AACL,WAAK,kBAAkB,cAAe,MAAK,aAAa,KAAK,aAAa;AAC1E,UAAI,KAAK,sBAAsB;AAC9B,aAAK,kBAAkB,iBAAiB,SAAS,gBAAgB,cAAc,KAAK,wBAAwB;AAAA,aACtG;AACN,aAAK,kBAAkB,iBAAiB,SAAS,gBAAgB,cAAc,KAAK,eAAe;AACnG,YAAG,KAAK,SAAS,GAAG;AACnB,eAAK,kBAAkB,iBAAiB,SAAS,gBAAgB,eAAe,KAAK,cAAc;AACnG,eAAK,kBAAkB,OAAO;AAAA;AAAA;AAIhC,WAAK,kBAAkB;AAAA;AASxB,MAAE,kBAAkB,SAAU,OAAO;AACpC,WAAK,kBAAkB,oBAAoB,SAAS,gBAAgB,cAAc,KAAK,eAAe;AACtG,WAAK,kBAAkB,oBAAoB,SAAS,gBAAgB,gBAAgB,KAAK,iBAAiB;AAE1G,WAAK;AAAA;AAGN,MAAE,SAAS,WAAY;AACtB,WAAK,kBAAkB;AAAA;AAGxB,MAAE,UAAU,WAAY;AACvB,WAAK,kBAAkB;AAAA;AAGxB,MAAE,gBAAgB,WAAY;AAC7B,UAAI,KAAK,qBAAqB,MAAM;AACnC,YAAI,YAAa,KAAK,UAAU,SAAS,MAAM,cAAe,IAAI,KAAK,UAAU,SAAS,MAAM;AAChG,YAAI,aAAa,KAAK,kBAAkB,QAAQ;AAAC,eAAK,kBAAkB,SAAS;AAAA;AAAA;AAAA;AAInF,MAAE,4BAA4B,WAAW;AACxC,aAAQ,KAAK,kBAAkB,cAAc,MAAQ,KAAK;AAAA;AAG3D,MAAE,kBAAkB,WAAW;AAC9B,WAAK,kBAAkB,oBAAoB,SAAS,gBAAgB,eAAe,KAAK,cAAc;AACtG,WAAK,kBAAkB,iBAAiB,SAAS,gBAAgB,eAAe,KAAK,wBAAwB;AAC7G,UAAI;AACH,aAAK,kBAAkB,cAAe,MAAK,YAAY,KAAK,cAAc;AAAA,eAClE,QAAP;AACD,aAAK,uBAAuB;AAAA;AAAA;AAU9B,MAAE,yBAAyB,SAAS,OAAO;AAC1C,UAAI,KAAK,qBAAqB,MAAM;AAAE;AAAA;AACtC,WAAK,kBAAkB,oBAAoB,SAAS,gBAAgB,eAAe,KAAK,wBAAwB;AAChH,WAAK,kBAAkB,iBAAiB,SAAS,gBAAgB,eAAe,KAAK,cAAc;AAAA;AAYpG,MAAE,yBAAyB,SAAU,OAAO;AAC3C,UAAG,KAAK,kBAAkB,eAAe,KAAK,sBAAsB;AAAC;AAAA;AACrE,WAAK,kBAAkB;AACvB,UAAG,KAAK,SAAS,GAAG;AACnB,aAAK,qBAAqB;AAAA,aACpB;AACN,aAAK,YAAY;AACjB,aAAK;AACL,aAAK,kBAAkB,cAAc,KAAK,aAAa;AACvD,YAAG,CAAC,KAAK,SAAS;AAAC,eAAK,kBAAkB;AAAA;AAC1C,aAAK,WAAW;AAAA;AAAA;AAMlB,MAAE,cAAc,SAAU,OAAO;AAChC,UAAG,KAAK,SAAS,GAAG;AACnB,aAAK,kBAAkB,OAAO;AAC9B,aAAK,kBAAkB,oBAAoB,SAAS,gBAAgB,eAAe,KAAK,cAAc;AAAA;AAAA;AAIxG,MAAE,mBAAmB,WAAY;AAChC,WAAK,uBAAwB,MAAK,aAAa,KAAK,aAAa;AAEjE,UAAG,KAAK,aAAa,SAAS,MAAM,gBAAgB;AACnD,aAAK,kBAAkB,oBAAoB,SAAS,gBAAgB,cAAc,KAAK,eAAe;AACtG,aAAK,kBAAkB,iBAAiB,SAAS,gBAAgB,cAAc,KAAK,wBAAwB;AAAA;AAAA;AAI9G,MAAE,kBAAkB,WAAY;AAC/B,WAAK,uBAAwB,MAAK,aAAa,KAAK,aAAa;AAEjE,UAAG,KAAK,aAAa,SAAS,MAAM,gBAAgB;AACnD,aAAK,kBAAkB,oBAAoB,SAAS,gBAAgB,cAAc,KAAK,eAAe;AACtG,aAAK,kBAAkB,iBAAiB,SAAS,gBAAgB,cAAc,KAAK,wBAAwB;AAAA;AAAA;AAI9G,MAAE,yBAAyB,WAAY;AACtC,WAAK,YAAY,SAAS,iBAAiB,YAAY,KAAK;AAC5D,WAAK,oBAAoB;AAAA;AAG1B,aAAS,yBAAyB,SAAS,QAAQ,wBAAwB;AAAA;AAO5E,EAAC,YAAY;AAEZ;AAoDA,+BAA2B;AAC1B,WAAK;AAIL,WAAK,gBAAgB,GAAE;AAEvB,WAAK,eAAe,SAAS;AAC7B,WAAK,sBAAsB,SAAS;AAAA;AAGrC,QAAI,IAAI,SAAS,OAAO,iBAAiB,SAAS;AAClD,QAAI,KAAI;AAYR,OAAE,gBAAgB;AAUlB,OAAE,eAAe;AAUjB,OAAE,eAAe;AAUjB,OAAE,gBAAgB;AAUlB,OAAE,iBAAiB;AAWnB,OAAE,eAAe;AAWjB,OAAE,gBAAgB;AAWlB,OAAE,cAAc,WAAY;AAC3B,SAAE;AACF,aAAQ,GAAE,iBAAiB;AAAA;AAU5B,OAAE,wBAAwB,WAAY;AACrC,UAAI,GAAE,iBAAiB,MAAM;AAAC;AAAA;AAC9B,UAAI,IAAI,SAAS,cAAc;AAC/B,UAAI,EAAE,eAAe,MAAM;AAAC,eAAO;AAAA;AAEnC,SAAE,gBAAgB;AAAA,QACjB,SAAQ;AAAA,QACR,QAAO;AAAA,QACP,QAAO;AAAA;AAIR,UAAI,sBAAsB,SAAS,MAAM;AACzC,UAAI,eAAe,SAAS,MAAM;AAClC,eAAS,IAAI,GAAG,IAAI,oBAAoB,QAAQ,IAAI,GAAG,KAAK;AAC3D,YAAI,MAAM,oBAAoB;AAC9B,YAAI,WAAW,aAAa,QAAQ;AACpC,WAAE,cAAc,OAAQ,EAAE,YAAY,WAAW,QAAQ,QAAQ,EAAE,YAAY,WAAW,QAAQ,MAAQ,EAAE,YAAY,WAAW,aAAa,QAAQ,EAAE,YAAY,WAAW,aAAa;AAAA;AAAA;AAMhM,MAAE,WAAW,SAAU,UAAU;AAChC,UAAI,MAAM,SAAS,iBAAiB,IAAI,SAAS;AACjD,UAAI,SAAS,KAAK,wBAAwB;AAC1C,aAAO,OAAO;AAEd,aAAO;AAAA;AAGR,MAAE,cAAc,SAAU,KAAK;AAC9B,WAAK,2BAA2B;AAChC,eAAS,iBAAiB,OAAO;AAAA;AAGlC,MAAE,SAAS,SAAU,KAAK,WAAW,UAAU;AAC9C,UAAI,KAAK,KAAK,sBAAsB,KAAK,WAAW;AACpD,SAAG,mBAAmB;AACtB,aAAO;AAAA;AAGR,MAAE,WAAW,WAAY;AACxB,aAAO;AAAA;AAIR,MAAE,YAAY,EAAE,YAAY,EAAE,UAAU;AAGxC,aAAS,kBAAkB,SAAS,QAAQ,iBAAiB;AAAA;AAO9D,EAAC,YAAW;AACX;AAqBA,2BAAuB,OAAO;AAC7B,WAAK;AAYL,WAAK,oBAAoB;AAWzB,WAAK,OAAO;AAUZ,WAAK,WAAW;AAQhB,WAAK,WAAW;AAUhB,WAAK,SAAS;AASd,WAAK,YAAY;AAWjB,WAAK,WAAW;AAUhB,WAAK,WAAW;AAShB,WAAK,cAAc;AAUnB,WAAK,UAAU;AAQf,WAAK,QAAQ;AAQb,WAAK,QAAQ;AAQb,WAAK,UAAU;AAOf,WAAK,UAAU;AAOf,WAAK,aAAa;AAElB,UAAI,OAAO;AACV,aAAK,WAAW,CAAC,CAAC,MAAM;AACxB,aAAK,oBAAoB,CAAC,CAAC,MAAM;AACjC,aAAK,OAAO,MAAM,SAAS,OAAO,KAAM,MAAM,QAAM;AACpD,aAAK,WAAW,CAAC,CAAC,MAAM;AACxB,aAAK,SAAS,CAAC,CAAC,MAAM;AACtB,aAAK,YAAY,MAAM,aAAW;AAClC,cAAM,YAAY,KAAK,iBAAiB,UAAU,MAAM;AACxD,cAAM,cAAc,KAAK,iBAAiB,YAAY,MAAM;AAAA;AAAA;AAI7D;AAED,QAAI,IAAI,SAAS,OAAO,eAAe,SAAS;AAyBhD,MAAE,aAAa,SAAS,OAAO;AAC9B,eAAS,MAAM,UAAU,MAAM;AAC/B,aAAO;AAAA;AAER,MAAE,YAAY,SAAS,UAAU,EAAE,YAAY;AAO/C,MAAE,aAAa,WAAW;AACzB,aAAO,KAAK;AAAA;AAEb,MAAE,YAAY,SAAS,UAAU,EAAE,YAAY;AAQ/C,MAAE,mBAAmB,SAAS,KAAK;AAClC,UAAI,SAAS,KAAK;AAClB,UAAI,OAAO,MAAM;AAAE,cAAM,KAAK;AAAA;AAC9B,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAE,GAAG,KAAK;AAAE,YAAI,MAAM,OAAO,GAAG,UAAU;AAAE;AAAA;AAAA;AAC/E,aAAQ,MAAI,IAAK,OAAO,OAAO,IAAE,GAAG;AAAA;AAErC,MAAE,kBAAkB,SAAS,UAAU,EAAE,kBAAkB;AAwB3D,QAAI;AACH,aAAO,iBAAiB,GAAG;AAAA,QAC1B,QAAQ,EAAE,KAAK,EAAE,YAAY,KAAK,EAAE;AAAA,QACpC,cAAc,EAAE,KAAK,EAAE;AAAA;AAAA,aAEhB,GAAP;AAAA;AASF,MAAE,UAAU,SAAS,OAAO,eAAe;AAC1C,WAAK,YAAY,KAAK,cAAY,QAAM,KAAK,WAAW;AAAA;AAWzD,MAAE,cAAc,SAAS,aAAa,eAAe,MAAM,UAAU;AACpE,UAAI,IAAE,KAAK,UAAU,YAAU,KAAK,MAAM,aAAa,KAAK;AAC5D,UAAI,OAAK,GAAG,IAAE,GAAG,OAAI;AAGrB,UAAI,cAAc,GAAG;AAAE,sBAAc;AAAA;AAErC,UAAI,MAAM,GAAG;AAEZ,eAAM;AACN,YAAI,eAAe,IAAI;AAAE,iBAAO;AAAA;AAAA,aAC1B;AACN,eAAO,cAAY,IAAE;AACrB,YAAI,cAAY,OAAK;AAErB,eAAO,cAAc,MAAM,eAAe,YAAU,IAAE;AACtD,YAAI,MAAK;AAAE,wBAAe,KAAE,KAAI,QAAK,aAAW;AAAA;AAChD,YAAI,gBAAgB,YAAY;AAAE,iBAAO;AAAA;AAEzC,YAAI,MAAM,CAAC,KAAK,aAAa,CAAE,MAAK,UAAU,OAAK;AACnD,YAAI,KAAK;AAAE,cAAI,IAAE;AAAA;AAAA;AAIlB,WAAK,WAAW;AAChB,WAAK,cAAc;AAEnB,WAAK,gBAAgB,MAAM;AAC3B,UAAI,MAAK;AAAE,aAAK,SAAS;AAAA;AAEzB,kBAAU,SAAS;AAEnB,UAAI,CAAC,eAAe;AAAE,aAAK,YAAY,YAAY,aAAa,MAAM,CAAC,QAAQ,eAAe;AAAA;AAE9F,WAAK,cAAc;AACnB,UAAI,MAAK;AAAE,aAAK,cAAc;AAAA;AAAA;AAS/B,MAAE,oBAAoB,SAAS,aAAa;AAE3C,UAAI,IAAE,KAAK,UAAU,YAAU,KAAK,MAAM,OAAK,GAAG,IAAE;AAEpD,UAAI,MAAI,GAAG;AAAE,eAAO;AAAA;AACpB,UAAI,cAAc,MAAM,eAAe,YAAU,IAAE,GAAG;AAAE,YAAI;AAAG,eAAO;AAAA,iBAC7D,cAAc,GAAG;AAAE,YAAI;AAAA,aAC3B;AAAE,eAAO,cAAY,IAAE;AAAG,YAAI,cAAY,OAAK;AAAA;AAEpD,UAAI,MAAM,CAAC,KAAK,aAAa,CAAE,MAAK,UAAU,OAAK;AACnD,aAAO,MAAM,IAAE,IAAI;AAAA;AAQpB,MAAE,YAAY,WAAW;AACxB,UAAI,OAAO,KAAK;AAChB,UAAI,CAAC,MAAM;AACV,eAAO,KAAK,aAAa;AACzB,YAAI,SAAS,KAAK;AAClB,iBAAS,KAAK,QAAQ;AACrB,eAAK,KAAK,EAAC,OAAM,GAAG,UAAS,OAAO;AAAA;AAErC,aAAK,KAAK,SAAU,GAAE,GAAG;AAAE,iBAAO,EAAE,WAAU,EAAE;AAAA;AAAA;AAEjD,aAAO;AAAA;AAUR,MAAE,YAAY,SAAS,QAAQ;AAC9B,WAAK,UAAU;AACf,WAAK,aAAa;AAAA;AASnB,MAAE,WAAW,SAAS,OAAO,UAAU;AACtC,UAAI,CAAC,KAAK,SAAS;AAAE,aAAK,UAAU;AAAA;AACpC,WAAK,QAAQ,SAAS;AACtB,UAAI,OAAO,KAAK;AAChB,UAAI,MAAM;AACT,iBAAS,IAAG,GAAE,IAAE,KAAK,QAAQ,IAAE,GAAG,KAAK;AAAE,cAAI,WAAW,KAAK,GAAG,UAAU;AAAE;AAAA;AAAA;AAC5E,aAAK,OAAO,GAAG,GAAG,EAAC,OAAa;AAAA;AAAA;AAUlC,MAAE,cAAc,SAAS,iBAAiB;AACzC,WAAK,SAAS;AACd,WAAK,MAAM;AAAA;AASZ,MAAE,cAAc,SAAS,iBAAiB;AACzC,WAAK,SAAS;AACd,WAAK,MAAM;AAAA;AASZ,MAAE,UAAU,SAAS,iBAAiB;AACrC,UAAI,MAAM,OAAO;AACjB,UAAI,MAAM,MAAM;AAAE,cAAM,KAAK,WAAW,KAAK,QAAQ;AAAA;AACrD,aAAO;AAAA;AASR,MAAE,WAAW,WAAW;AACvB,aAAO;AAAA;AAOR,MAAE,QAAQ,WAAW;AACpB,YAAM;AAAA;AAUP,MAAE,QAAQ,SAAS,OAAO;AACzB,UAAI,CAAC,SAAS,CAAC,MAAM,QAAQ;AAAE,aAAK,SAAS;AAAA;AAC7C,UAAI,SAAQ,MAAM,YAAU,MAAO;AAAE,aAAK,YAAY,MAAM;AAAA;AAAA;AAO7D,MAAE,kBAAkB,SAAS,MAAM,MAAK;AAAA;AAQxC,MAAE,QAAQ,SAAS,iBAAiB;AACnC,UAAI,MAAM,KAAK,QAAQ;AACvB,UAAI,OAAO,MAAM;AAAE,aAAK,YAAY,KAAK,OAAO;AAAA;AAAA;AAOjD,MAAE,cAAc,SAAS,aAAa,WAAW,MAAM,cAAc;AAOpE,UAAI,CAAC,KAAK,eAAe,CAAC,KAAK,QAAQ;AAAE;AAAA;AAEzC,UAAI,IAAE,KAAK,UAAU,WAAS,KAAK,UAAU,SAAO,KAAK,QAAQ,YAAU,KAAK;AAChF,UAAI,OAAO,OAAO,IAAI;AAEtB,UAAI,MAAM,GAAG;AAEZ,gBAAQ,QAAQ,KAAK,KAAK;AAC1B,mBAAW,SAAS;AAAA,aACd;AACN,gBAAM,cAAY,IAAE;AACpB,gBAAM,YAAU,IAAE;AAClB,aAAG,cAAY,QAAM;AACrB,aAAG,YAAU,QAAM;AAAA;AAIpB,UAAI,cAAc,IAAI;AACrB,YAAI,QAAQ,WAAW;AAAE,eAAG;AAAG,kBAAM;AAAA;AACrC,YAAI,QAAQ,WAAW;AAAE,eAAG;AAAG,kBAAM;AAAA;AAAA;AAItC,UAAI,MAAM;AAAE,eAAO,KAAK,iBAAiB,IAAI,IAAI,MAAM;AAAA,iBAC9C,UAAU,SAAS,OAAO,MAAM,CAAC,QAAQ,CAAC,cAAc;AAAE;AAAA,iBAC1D,UAAU,IAAI;AAAE,gBAAQ,KAAK;AAAA;AAEtC,UAAI,MAAO,eAAe,WAAY,OAAO;AAC7C,SAAG;AACF,YAAI,MAAM,CAAC,aAAa,CAAE,WAAU,OAAO;AAE3C,YAAI,SAAS,SAAS,QAAS,KAAK,MAAM,IAAI;AAC9C,YAAI,OAAO,SAAS,QAAS,KAAK,MAAM,IAAI;AAE5C,YAAI,KAAK;AACR,mBAAQ,IAAI;AACZ,iBAAM,IAAI;AAAA;AAGX,YAAI,UAAU,SAAS,SAAS,WAAU,MAAK;AAAA,mBACtC,KAAK,iBAAiB,QAAO,MAAK,MAAM,gBAAiB,SAAS,SAAS,CAAC,SAAU;AAAE,iBAAO;AAAA;AAExG,uBAAe;AAAA,eACN,OAAO,EAAE,QAAQ,SAAW,CAAC,OAAO,EAAE,QAAQ;AAAA;AAGzD,MAAE,mBAAmB,SAAS,UAAU,QAAQ,MAAM,cAAc;AAAA;AAIpE,aAAS,gBAAgB,SAAS,QAAQ,eAAe;AAAA;AAO1D,EAAC,YAAW;AACX;AAiDA,mBAAe,QAAQ,OAAO;AAC7B,WAAK,0BAA0B;AAqB/B,WAAK,aAAa;AAQlB,WAAK,SAAS;AASd,WAAK,UAAU;AAUf,WAAK,YAAY,IAAI,UAAU,MAAM,GAAG,GAAG,IAAI,MAAM;AAOrD,WAAK,YAAY,KAAK;AAStB,WAAK,gBAAgB;AAOrB,WAAK,cAAc;AAOnB,WAAK,cAAc;AASnB,WAAK,WAAW;AAShB,WAAK,aAAa;AASlB,WAAK,YAAY;AAEjB,UAAI,OAAO;AACV,aAAK,aAAa,MAAM;AACxB,YAAI,MAAM,UAAU;AAAE,gBAAM,aAAa;AAAA;AAAA;AAE1C,UAAI,CAAC,KAAK,YAAY;AAAE,aAAK,aAAa;AAAA;AAE1C,WAAK,MAAM;AAAA;AACX;AAED,QAAI,IAAI,SAAS,OAAO,OAAO,SAAS;AAUxC,UAAM,SAAS;AAQf,UAAM,UAAU;AAQhB,UAAM,WAAW;AAQjB,UAAM,aAAa;AAQnB,UAAM,aAAa;AAiCnB,UAAM,MAAM,SAAS,QAAQ,OAAO;AACnC,aAAO,IAAI,MAAM,QAAQ;AAAA;AAa1B,UAAM,OAAO,SAAS,OAAO,QAAQ;AACpC,UAAI,QAAQ,MAAM;AAClB,aAAO,OAAO;AACb,YAAI,OAAO,MAAM;AACjB,YAAK,UAAU,CAAC,MAAM,qBAAsB,MAAM,SAAS;AAAA,eACtD;AAAE,gBAAM,QAAQ,MAAM,WAAS,IAAE;AAAA;AACtC,gBAAQ;AAAA;AAAA;AAeV,UAAM,cAAc,SAAS,OAAO;AACnC,UAAI,MAAM,SAAS,QAAQ;AAC1B,aAAK,KAAK,MAAM,OAAO,MAAM;AAAA;AAAA;AAW/B,UAAM,eAAe,SAAS,QAAQ;AACrC,UAAI,CAAC,OAAO,eAAe;AAAE;AAAA;AAC7B,UAAI,QAAQ,MAAM;AAClB,aAAO,OAAO;AACb,YAAI,OAAO,MAAM;AACjB,YAAI,MAAM,WAAW,QAAQ;AAAE,gBAAM,UAAU,OAAO;AAAA;AACtD,gBAAQ;AAAA;AAET,aAAO,gBAAgB;AAAA;AASxB,UAAM,kBAAkB,WAAW;AAClC,UAAI,QAAQ,MAAM;AAClB,aAAO,OAAO;AACb,YAAI,OAAO,MAAM;AACjB,cAAM,UAAU;AAChB,cAAM,UAAS,OAAM,OAAO,gBAAgB;AAC5C,cAAM,QAAQ,MAAM,QAAQ;AAC5B,gBAAQ;AAAA;AAET,YAAM,aAAa,MAAM,aAAa;AAAA;AAWvC,UAAM,kBAAkB,SAAS,QAAQ;AACxC,UAAI,QAAQ;AAAE,eAAO,CAAC,CAAC,OAAO;AAAA;AAC9B,aAAO,CAAC,CAAC,MAAM;AAAA;AAYhB,UAAM,iBAAiB,SAAS,QAAQ;AACvC,UAAI,WAAY,OAAO,WAAW,OAAO,YAAU,GAAI,MAAO,MAAM,WAAW,MAAM,YAAY;AACjG,eAAS,IAAE,GAAE,IAAE,IAAI,QAAO,IAAE,GAAE,KAAK;AAClC,YAAI,WAAW,IAAI,GAAG,UAAU;AAAE;AAAA;AAAA;AAEnC,UAAI,OAAO,GAAE,GAAE;AAAA;AAWhB,UAAM,YAAY,SAAS,OAAO,QAAQ;AACzC,UAAI,SAAS,MAAM;AACnB,UAAI,CAAC,UAAU,MAAM,SAAS;AAE7B,YAAI,QAAQ;AAAE,iBAAO,gBAAgB,OAAO,gBAAgB,OAAO,gBAAc,IAAI;AAAA;AACrF,YAAI,OAAO,MAAM;AACjB,YAAI,CAAC,MAAM;AAAE,gBAAM,aAAa,MAAM,aAAa;AAAA,eAC9C;AACJ,gBAAM,aAAa,KAAK,QAAQ;AAChC,gBAAM,QAAQ;AAAA;AAEf,YAAI,CAAC,MAAM,WAAW,SAAS,QAAQ;AAAE,mBAAS,OAAO,iBAAiB,QAAQ;AAAQ,gBAAM,UAAU;AAAA;AAAA,iBAChG,UAAU,CAAC,MAAM,SAAS;AACpC,YAAI,QAAQ;AAAE,iBAAO;AAAA;AACrB,YAAI,OAAO,MAAM,OAAO,OAAO,MAAM;AAErC,YAAI,MAAM;AAAE,eAAK,QAAQ;AAAA,eACpB;AAAE,gBAAM,aAAa;AAAA;AAC1B,YAAI,MAAM;AAAE,eAAK,QAAQ;AAAA,eACpB;AAAE,gBAAM,aAAa;AAAA;AAE1B,cAAM,QAAQ,MAAM,QAAQ;AAAA;AAE7B,YAAM,UAAU;AAAA;AAsBjB,MAAE,OAAO,SAAS,UAAU,UAAS;AACpC,UAAI,WAAW,GAAG;AAAE,aAAK,SAAS,CAAC,UAAU,KAAK,UAAU,OAAO,MAAM;AAAA;AACzE,aAAO;AAAA;AAoBR,MAAE,KAAK,SAAS,OAAO,UAAU,MAAM;AACtC,UAAI,YAAY,QAAQ,WAAW,GAAG;AAAE,mBAAW;AAAA;AACnD,UAAI,OAAO,KAAK,SAAS,CAAC,UAAU,MAAM;AAC1C,WAAK,aAAa,OAAO;AACzB,aAAO;AAAA;AAmBR,MAAE,QAAQ,SAAS,MAAM;AACxB,WAAK,SAAS,MAAM,KAAK;AACzB,aAAO;AAAA;AAkBR,MAAE,OAAO,SAAS,UAAU,QAAQ,OAAO;AAC1C,aAAO,KAAK,WAAW,SAAO,KAAK,QAAQ,UAAU,UAAQ,CAAC;AAAA;AAiB/D,MAAE,MAAM,SAAS,OAAO,QAAQ;AAC/B,aAAO,KAAK,WAAW,UAAQ,KAAK,QAAQ,KAAK,MAAM,CAAC;AAAA;AAczD,MAAE,OAAO,SAAS,OAAO;AACxB,aAAO,KAAK,WAAW,SAAO,MAAM,KAAK,MAAM,CAAC,EAAC,QAAO;AAAA;AAqBzD,MAAE,QAAQ,SAAS,OAAO;AACzB,aAAO,KAAK,WAAW,SAAO,MAAM,KAAK,MAAM,CAAC,EAAC,QAAO;AAAA;AAIzD,MAAE,IAAI,EAAE;AACR,MAAE,IAAI,EAAE;AACR,MAAE,IAAI,EAAE;AACR,MAAE,IAAI,EAAE;AAOR,MAAE,WAAW,WAAW;AACvB,aAAO;AAAA;AAOR,MAAE,QAAQ,WAAW;AACpB,YAAM;AAAA;AAWP,MAAE,aAAa,SAAS,QAAQ;AAC/B,UAAI,MAAM,KAAK,cAAe,MAAK,aAAa,KAAK,KAAK,OAAO;AACjE,UAAI,CAAC,MAAM,IAAI,KAAK;AAAE;AAAA;AAEtB,UAAI,MAAM;AACV,UAAI,UAAU,KAAK,YAAa,MAAK,WAAW,KAAK,WAAW,OAAO,YAAY;AACnF,eAAS,IAAE,GAAE,IAAE,QAAQ,QAAQ,IAAE,GAAG,KAAK;AACxC,YAAI,WAAW,QAAQ,GAAG,UAAU;AACnC,kBAAQ,OAAO,GAAE,GAAE;AACnB;AAAA;AAAA;AAGF,cAAQ,KAAK;AAAA;AAId,MAAE,kBAAkB,SAAS,MAAM,MAAK;AACvC,UAAI,OAAO,KAAK,UAAU,MAAM,IAAE,KAAK,UAAU,IAAE,KAAK;AACxD,UAAI,KAAK,UAAU,MAAM;AAExB,YAAI,WAAW,KAAK;AACpB,eAAO,YAAY,SAAS,KAAK,GAAG;AAAE,iBAAO,KAAK;AAAM,qBAAW,KAAK;AAAA;AACxE,YAAI,QAAQ,OAAM,MAAM,IAAI,IAAI,IAAE,IAAK,KAAE,KAAK,KAAG,KAAK;AACtD,aAAK,mBAAmB,MAAM,OAAO;AAAA;AAEtC,WAAK,gBAAgB,OAAO,IAAE,KAAK,IAAI;AAAA;AAUxC,MAAE,qBAAqB,SAAS,MAAM,OAAO,MAAK;AACjD,UAAI,KAAK,UAAU,CAAC,CAAC,KAAK,SAAS;AAAE;AAAA;AAErC,UAAI,GAAG,IAAI,IAAI;AACf,UAAI,KAAK,KAAK,KAAK;AACnB,UAAI,KAAK,KAAK;AACd,UAAI,OAAO,KAAK,MAAM;AAAE,gBAAQ,KAAK,OAAM,GAAE,GAAE;AAAA;AAE/C,UAAI,UAAU,KAAK;AACnB;AAAW,iBAAS,KAAK,IAAI;AAC5B,eAAK,GAAG;AACR,eAAK,GAAG;AAGR,cAAI,OAAO,MAAO,OAAO,OAAQ,UAAW;AAC3C,gBAAI,KAAI,MAAG,MAAI;AAAA,iBACT;AACN,gBAAI,SAAS,IAAI,KAAK;AAAA;AAGvB,cAAI,SAAS;AACZ,qBAAS,IAAE,GAAE,IAAE,QAAQ,QAAO,IAAE,GAAE,KAAK;AACtC,kBAAI,QAAQ,QAAQ,GAAG,OAAO,MAAM,MAAM,GAAG,GAAG,OAAO;AACvD,kBAAI,UAAU,MAAM,QAAQ;AAAE;AAAA;AAC9B,kBAAI,UAAU,QAAW;AAAE,oBAAI;AAAA;AAAA;AAAA;AAGjC,eAAK,OAAO,KAAK;AAAA;AAAA;AAYnB,MAAE,mBAAmB,SAAS,UAAU,QAAQ,MAAM,cAAc;AACnE,UAAI,MAAM,WAAW;AACrB,UAAI,SAAS,MAAM,KAAK,cAAc,KAAK;AAC3C,UAAI,OAAO,QAAQ,OAAO;AAC1B,UAAI,KAAK;AAAE,eAAK;AAAU,eAAK;AAAA;AAC/B,UAAI,IAAI,KAAK;AACb,aAAO,QAAQ;AACd,YAAI,MAAM,OAAO;AACjB,YAAI,QAAQ,UAAW,MAAM,QAAQ,MAAM,QAAU,gBAAgB,QAAQ,UAAW;AACvF,iBAAO,MAAM,MAAM,OAAO,OAAO,OAAO;AACxC,cAAI,MAAM,KAAK,UAAU;AAAE,mBAAO;AAAA;AAAA;AAEnC,iBAAS,MAAM,OAAO,OAAO,OAAO;AAAA;AAAA;AAStC,MAAE,eAAe,SAAS,OAAO,MAAM,aAAa;AACnD,UAAI,YAAY,KAAK,UAAU,OAAO,SAAS,KAAK,QAAQ,UAAU,MAAM;AAC5E,UAAI,GAAG,GAAG,OAAO,WAAW;AAC5B,UAAI,UAAU,KAAK,MAAM,WAAW,QAAQ;AAC5C,UAAI,YAAY,KAAK,SAAU,MAAK,QAAQ,KAAK,YAAY;AAC7D,UAAI,aAAa;AAEjB,WAAK,KAAK,OAAO;AAChB,YAAI,CAAC,MAAM,eAAe,IAAI;AAAE;AAAA;AAChC,mBAAW,KAAK,UAAU,KAAK,MAAM;AAErC,YAAI,UAAU,OAAO,QAAW;AAAE;AAAA;AAElC,oBAAY;AACZ,YAAI,SAAS;AACZ,eAAK,IAAI,QAAQ,SAAO,GAAG,KAAK,GAAG,KAAK;AACvC,oBAAQ,QAAQ,GAAG,KAAK,MAAM,GAAG;AACjC,gBAAI,UAAU,QAAW;AAAE,0BAAY;AAAA;AACvC,gBAAI,cAAc,MAAM,QAAQ;AAC/B,qBAAO,UAAU;AACjB,qBAAO,WAAW;AAClB;AAAA;AAAA;AAAA;AAKH,YAAI,cAAc,MAAM,QAAQ;AAC/B,cAAI,cAAc,QAAW;AAAE,wBAAY,OAAO;AAAA;AAClD,mBAAS,KAAM,cAAc,SAAa,OAAO;AAAA;AAAA;AAInD,WAAK,KAAK,YAAY;AACrB,gBAAQ,MAAM;AAGd,YAAI,GAAG,OAAK;AACZ,eAAQ,KAAI,SAAU,QAAO,EAAE,OAAO;AACrC,cAAI,KAAK,UAAU,EAAE,OAAO;AAAE;AAAA;AAC9B,cAAI,KAAK,MAAM,OAAO,QAAW;AAAE;AAAA;AACnC,eAAK,MAAM,KAAK,SAAS;AAAA;AAAA;AAI3B,UAAI,gBAAgB,SAAU,WAAU,KAAK,WAAW;AACvD,aAAK,IAAI,QAAQ,SAAO,GAAG,KAAK,GAAG,KAAK;AACvC,kBAAQ,GAAG,KAAK,MAAM,MAAM;AAAA;AAAA;AAI9B,UAAI,SAAS,KAAK,WAAW;AAC5B,aAAK,YAAY;AACjB,aAAK,aAAa,QAAQ,MAAM;AAAA;AAAA;AAalC,MAAE,cAAc,SAAS,MAAM,OAAO;AACrC,UAAI,IAAI,KAAK,aAAc,MAAK,YAAY;AAC5C,QAAE,QAAQ;AAAA;AAWX,MAAE,WAAW,SAAS,UAAU,OAAO,MAAM,UAAS;AACrD,UAAI,OAAO,IAAI,UAAU,KAAK,WAAW,KAAK,UAAU,UAAU,OAAO,MAAM,YAAS;AACxF,WAAK,YAAY;AACjB,aAAO,KAAK,YAAa,KAAK,UAAU,OAAO;AAAA;AAUhD,MAAE,aAAa,SAAS,OAAO,OAAO,QAAQ;AAC7C,UAAI,SAAS,IAAI,YAAY,KAAK,aAAa,KAAK,UAAU,OAAO,OAAO;AAC5E,UAAI,KAAK,aAAa;AAAE,aAAK,YAAY,OAAO;AAAA,aAC3C;AAAE,aAAK,cAAc;AAAA;AAC1B,WAAK,cAAc;AACnB,aAAO;AAAA;AAQR,MAAE,OAAO,SAAS,OAAO;AACxB,eAAS,KAAK,OAAO;AACpB,aAAK,KAAK,MAAM;AAAA;AAAA;AASlB,MAAE,cAAc,SAAS,OAAO;AAC/B,UAAI,IAAI;AACR,eAAS,KAAK,OAAO;AAAE,UAAE,KAAK,MAAM;AAAA;AACpC,aAAO;AAAA;AAGR,aAAS,QAAQ,SAAS,QAAQ,OAAO;AAEzC,uBAAmB,MAAM,GAAG,GAAG,OAAO,MAAM,UAAS;AACpD,WAAK,OAAO;AACZ,WAAK,OAAO;AACZ,WAAK,IAAI;AACT,WAAK,IAAI;AACT,WAAK,QAAQ;AACb,WAAK,OAAO;AACZ,WAAK,UAAU;AACf,WAAK,QAAQ,OAAO,KAAK,QAAM,IAAI;AAAA;AACnC;AAED,yBAAqB,MAAM,GAAG,OAAO,OAAO,QAAQ;AACnD,WAAK,OAAO;AACZ,WAAK,OAAO;AACZ,WAAK,IAAI;AACT,WAAK,IAAI;AACT,WAAK,QAAQ;AACb,WAAK,QAAQ;AACb,WAAK,SAAS;AAAA;AACd;AAAA;AAOF,EAAC,YAAW;AACX;AA4BA,sBAAkB,OAAO;AACxB,UAAI,QAAQ;AAGZ,UAAI,iBAAiB,SAAU,SAAS,QAAQ,UAAU,SAAS,GAAI;AACtE,iBAAS;AACT,iBAAS,UAAU;AACnB,gBAAQ,UAAU;AAAA,iBACR,OAAO;AACjB,iBAAS,MAAM;AACf,iBAAS,MAAM;AAAA;AAGhB,WAAK,0BAA0B;AAU/B,WAAK,SAAS;AAEd,UAAI,QAAQ;AAAE,aAAK,SAAS,MAAM,MAAM;AAAA;AACxC,WAAK,UAAU;AAEf,WAAK,MAAM;AAAA;AACX;AAED,QAAI,IAAI,SAAS,OAAO,UAAU,SAAS;AAgB3C,MAAE,WAAW,SAAS,OAAO;AAC5B,UAAI,MAAM,SAAS;AAAE,cAAM,QAAQ,YAAY;AAAA;AAE/C,UAAI,IAAI,UAAU;AAClB,UAAI,IAAI,GAAG;AACV,iBAAS,IAAE,GAAG,IAAE,GAAG,KAAK;AAAE,eAAK,SAAS,UAAU;AAAA;AAClD,eAAO,UAAU,IAAE;AAAA,iBACT,MAAM,GAAG;AAAE,eAAO;AAAA;AAE7B,WAAK,OAAO,KAAK;AACjB,YAAM,UAAU;AAChB,YAAM,SAAS;AACf,UAAI,IAAI,MAAM;AACd,UAAI,MAAM,OAAO,GAAG;AAAE,aAAK,MAAM,OAAK;AAAA;AACtC,UAAI,IAAI,KAAK,UAAU;AAAE,aAAK,WAAW;AAAA;AAEzC,UAAI,KAAK,eAAe,GAAG;AAAE,cAAM,YAAY,KAAK;AAAA;AACpD,aAAO;AAAA;AASR,MAAE,cAAc,SAAS,OAAO;AAC/B,UAAI,IAAI,UAAU;AAClB,UAAI,IAAI,GAAG;AACV,YAAI,OAAO;AACX,iBAAS,IAAE,GAAG,IAAE,GAAG,KAAK;AAAE,iBAAO,QAAQ,KAAK,YAAY,UAAU;AAAA;AACpE,eAAO;AAAA,iBACG,MAAM,GAAG;AAAE,eAAO;AAAA;AAE7B,UAAI,SAAS,KAAK;AAClB,UAAI,IAAI,OAAO;AACf,aAAO,KAAK;AACX,YAAI,OAAO,OAAO,OAAO;AACxB,iBAAO,OAAO,GAAG;AACjB,gBAAM,UAAU;AAChB,cAAI,MAAM,YAAY,KAAK,UAAU;AAAE,iBAAK;AAAA;AAC5C,iBAAO;AAAA;AAAA;AAGT,aAAO;AAAA;AAQR,MAAE,iBAAiB,WAAW;AAC7B,WAAK,WAAW;AAChB,eAAS,IAAE,GAAE,IAAE,KAAK,OAAO,QAAQ,IAAE,GAAG,KAAK;AAC5C,YAAI,QAAQ,KAAK,OAAO;AACxB,YAAI,IAAI,MAAM;AACd,YAAI,MAAM,OAAO,GAAG;AAAE,eAAK,MAAM,OAAK;AAAA;AACtC,YAAI,IAAI,KAAK,UAAU;AAAE,eAAK,WAAW;AAAA;AAAA;AAAA;AAS3C,MAAE,WAAW,WAAW;AACvB,aAAO;AAAA;AAOR,MAAE,QAAQ,WAAW;AACpB,YAAM;AAAA;AAMP,MAAE,kBAAkB,SAAS,MAAM,MAAK;AACvC,UAAI,IAAI,KAAK;AACb,eAAS,IAAE,GAAG,IAAE,KAAK,OAAO,QAAQ,IAAE,GAAG,KAAK;AAC7C,aAAK,OAAO,GAAG,YAAY,GAAG,MAAM;AAAA;AAAA;AAKtC,MAAE,mBAAmB,SAAS,UAAU,QAAQ,MAAM,cAAc;AAEnE,UAAI,IAAI,KAAK;AACb,eAAS,IAAE,GAAG,IAAE,KAAK,OAAO,QAAQ,IAAE,GAAG,KAAK;AAC7C,aAAK,OAAO,GAAG,YAAY,UAAU,QAAQ,MAAM;AACnD,YAAI,MAAM,KAAK,UAAU;AAAE,iBAAO;AAAA;AAAA;AAAA;AAKpC,aAAS,WAAW,SAAS,QAAQ,UAAU;AAAA;AAQhD,EAAC,YAAW;AACX;AAqBA,oBAAgB;AACf,YAAM;AAAA;AAWP,SAAK,SAAS,SAAS,GAAG;AAAE,aAAO;AAAA;AASnC,SAAK,OAAO,KAAK;AASjB,SAAK,MAAM,SAAS,QAAQ;AAC3B,UAAI,SAAS,IAAI;AAAE,iBAAS;AAAA,iBACnB,SAAS,GAAG;AAAE,iBAAS;AAAA;AAChC,aAAO,SAAS,GAAG;AAClB,YAAI,UAAQ,GAAG;AAAE,iBAAO;AAAA;AACxB,YAAI,SAAO,GAAG;AAAE,iBAAO,IAAG,KAAE,CAAC,SAAO,IAAE;AAAA;AACtC,eAAO,IAAI,MAAE,KAAG,SAAQ,KAAE;AAAA;AAAA;AAW5B,SAAK,WAAW,SAAS,KAAK;AAC7B,aAAO,SAAS,GAAG;AAClB,eAAO,KAAK,IAAI,GAAE;AAAA;AAAA;AAWpB,SAAK,YAAY,SAAS,KAAK;AAC9B,aAAO,SAAS,GAAG;AAClB,eAAO,IAAE,KAAK,IAAI,IAAE,GAAE;AAAA;AAAA;AAWxB,SAAK,cAAc,SAAS,KAAK;AAChC,aAAO,SAAS,GAAG;AAClB,YAAK,MAAG,KAAG;AAAG,iBAAO,MAAI,KAAK,IAAI,GAAE;AACpC,eAAO,IAAE,MAAI,KAAK,IAAI,KAAK,IAAI,IAAE,GAAE;AAAA;AAAA;AAUrC,SAAK,SAAS,KAAK,SAAS;AAO5B,SAAK,UAAU,KAAK,UAAU;AAO9B,SAAK,YAAY,KAAK,YAAY;AAQlC,SAAK,UAAU,KAAK,SAAS;AAO7B,SAAK,WAAW,KAAK,UAAU;AAO/B,SAAK,aAAa,KAAK,YAAY;AAQnC,SAAK,UAAU,KAAK,SAAS;AAO7B,SAAK,WAAW,KAAK,UAAU;AAO/B,SAAK,aAAa,KAAK,YAAY;AAQnC,SAAK,UAAU,KAAK,SAAS;AAO7B,SAAK,WAAW,KAAK,UAAU;AAO/B,SAAK,aAAa,KAAK,YAAY;AAQnC,SAAK,SAAS,SAAS,GAAG;AACzB,aAAO,IAAE,KAAK,IAAI,IAAE,KAAK,KAAG;AAAA;AAS7B,SAAK,UAAU,SAAS,GAAG;AAC1B,aAAO,KAAK,IAAI,IAAE,KAAK,KAAG;AAAA;AAS3B,SAAK,YAAY,SAAS,GAAG;AAC5B,aAAO,OAAM,MAAK,IAAI,KAAK,KAAG,KAAK;AAAA;AAUpC,SAAK,YAAY,SAAS,QAAQ;AACjC,aAAO,SAAS,GAAG;AAClB,eAAO,IAAE,IAAI,WAAO,KAAG,IAAE;AAAA;AAAA;AAS3B,SAAK,SAAS,KAAK,UAAU;AAS7B,SAAK,aAAa,SAAS,QAAQ;AAClC,aAAO,SAAS,GAAG;AAClB,eAAQ,EAAE,IAAE,IAAI,WAAO,KAAG,IAAI,UAAU;AAAA;AAAA;AAS1C,SAAK,UAAU,KAAK,WAAW;AAS/B,SAAK,eAAe,SAAS,QAAQ;AACpC,gBAAQ;AACR,aAAO,SAAS,GAAG;AAClB,YAAK,MAAG,KAAG;AAAG,iBAAO,MAAK,KAAE,IAAI,WAAO,KAAG,IAAE;AAC5C,eAAO,MAAM,OAAG,KAAG,IAAI,WAAO,KAAG,IAAE,UAAQ;AAAA;AAAA;AAS7C,SAAK,YAAY,KAAK,aAAa;AAQnC,SAAK,SAAS,SAAS,GAAG;AACzB,aAAO,CAAE,MAAK,KAAK,IAAE,IAAE,KAAI;AAAA;AAS5B,SAAK,UAAU,SAAS,GAAG;AAC1B,aAAO,KAAK,KAAK,IAAG,EAAE,IAAG;AAAA;AAS1B,SAAK,YAAY,SAAS,GAAG;AAC5B,UAAK,MAAG,KAAK;AAAG,eAAO,OAAM,MAAK,KAAK,IAAE,IAAE,KAAG;AAC9C,aAAO,MAAK,MAAK,KAAK,IAAG,MAAG,KAAG,KAAG;AAAA;AASnC,SAAK,WAAW,SAAS,GAAG;AAC3B,aAAO,IAAE,KAAK,UAAU,IAAE;AAAA;AAS3B,SAAK,YAAY,SAAS,GAAG;AAC5B,UAAI,IAAI,IAAE,MAAM;AACf,eAAQ,SAAO,IAAE;AAAA,iBACP,IAAI,IAAE,MAAM;AACtB,eAAQ,SAAQ,MAAG,MAAI,QAAM,IAAE;AAAA,iBACrB,IAAI,MAAI,MAAM;AACxB,eAAQ,SAAQ,MAAG,OAAK,QAAM,IAAE;AAAA,aAC1B;AACN,eAAQ,SAAQ,MAAG,QAAM,QAAM,IAAG;AAAA;AAAA;AAUpC,SAAK,cAAc,SAAS,GAAG;AAC9B,UAAI,IAAE;AAAK,eAAO,KAAK,SAAU,IAAE,KAAK;AACxC,aAAO,KAAK,UAAU,IAAE,IAAE,KAAG,MAAI;AAAA;AAWlC,SAAK,eAAe,SAAS,WAAU,QAAQ;AAC9C,UAAI,MAAM,KAAK,KAAG;AAClB,aAAO,SAAS,GAAG;AAClB,YAAI,KAAG,KAAK,KAAG;AAAG,iBAAO;AACzB,YAAI,KAAI,SAAO,MAAI,KAAK,KAAK,IAAE;AAC/B,eAAO,CAAE,aAAU,KAAK,IAAI,GAAE,KAAI,MAAG,MAAI,KAAK,IAAK,KAAE,MAAG,MAAI;AAAA;AAAA;AAS9D,SAAK,YAAY,KAAK,aAAa,GAAE;AAUrC,SAAK,gBAAgB,SAAS,WAAU,QAAQ;AAC/C,UAAI,MAAM,KAAK,KAAG;AAClB,aAAO,SAAS,GAAG;AAClB,YAAI,KAAG,KAAK,KAAG;AAAG,iBAAO;AACzB,YAAI,KAAI,SAAO,MAAM,KAAK,KAAK,IAAE;AACjC,eAAQ,YAAU,KAAK,IAAI,GAAE,MAAI,KAAG,KAAK,IAAK,KAAE,MAAG,MAAI,UAAS;AAAA;AAAA;AASlE,SAAK,aAAa,KAAK,cAAc,GAAE;AAUvC,SAAK,kBAAkB,SAAS,WAAU,QAAQ;AACjD,UAAI,MAAM,KAAK,KAAG;AAClB,aAAO,SAAS,GAAG;AAClB,YAAI,KAAI,SAAO,MAAM,KAAK,KAAK,IAAE;AACjC,YAAK,MAAG,KAAG;AAAG,iBAAO,OAAM,aAAU,KAAK,IAAI,GAAE,KAAI,MAAG,MAAI,KAAK,IAAM,KAAE,MAAG,MAAI;AAC/E,eAAO,YAAU,KAAK,IAAI,GAAE,MAAK,MAAG,MAAI,KAAK,IAAK,KAAE,MAAG,MAAI,UAAQ,MAAI;AAAA;AAAA;AASzE,SAAK,eAAe,KAAK,gBAAgB,GAAE,MAAI;AAE/C,aAAS,OAAO;AAAA;AAQjB,EAAC,YAAW;AACX;AAmCA,iCAA6B;AAC5B,YAAM;AAAA;AAEP,QAAI,KAAI;AASR,OAAE,WAAW;AASb,OAAE,KAAK;AAQP,OAAE,UAAU,WAAW;AACtB,eAAS,MAAM,eAAe;AAC9B,aAAO,SAAS,MAAM;AAAA;AAavB,OAAE,OAAO,SAAS,OAAO,MAAM,OAAO;AACrC,UAAG,QAAQ,SAAS;AACnB,cAAM,WAAW;AAAA;AAAA;AAanB,OAAE,OAAO,SAAS,OAAO,MAAM,OAAO;AACrC,eAAS,KAAK,OAAO;AACpB,YAAG,MAAM,SAAS;AAAE;AAAA;AAEpB,YAAI,YAAY,KAAK,MAAM;AAC3B,YAAI,SAAQ,GAAE,gBAAgB,MAAM,OAAO;AAC3C,kBAAU,QAAQ,CAAC;AAEnB,YAAI,OAAM,UAAU;AACpB,cAAM,YAAY,KAAK,KAAI;AAC3B,cAAM,YAAY,KAAK,KAAI;AAE3B,YAAG,UAAS,CAAC,UAAU,QAAQ;AAAE;AAAA;AAEjC,YAAI,UAAU,KAAK,KAAK,MAAM,aAAa,SAAa,MAAM,OAAO,YAAY,IAAK,KAAK,KAAK,MAAM;AAEtG,kBAAU,iBAAiB,UAAU,UAAU,UAAU;AAEzD,YAAG,UAAU,UAAU,SAAS;AAE/B,oBAAU,YAAY,KAAI,WAAW,UAAU;AAC/C,oBAAU,gBAAgB;AAAA,eACpB;AAGN,cAAI,WAAW,MAAM,aAAa,SAAa,MAAM,OAAO,YAAY,IAAK,MAAM;AACnF,cAAI,WAAY,WAAW,UAAU,QAAQ,WAAY,UAAU;AACnE,cAAI,SAAS,WAAW;AAExB,oBAAU,YAAY;AAEtB,kBAAO,UAAU;AAAA,iBACX;AACJ,wBAAU,gBAAgB;AAC1B;AAAA,iBACI;AACJ,wBAAU,gBAAkB,UAAS,OAAO,MAAQ,MAAM,KAAK,IAAK,WAAS,MAAM;AACnF;AAAA,iBACI;AACJ,wBAAU,gBAAkB,UAAS,OAAO,MAAQ,OAAO,KAAK,IAAK,WAAS,MAAM;AACpF;AAAA;AAAA;AAIH,cAAM,YAAY,YAAY,UAAU;AAAA;AAAA;AAiB1C,OAAE,SAAS,SAAS,OAAO,MAAM,MAAM,OAAO,OAAO,MAAK;AACzD,UAAI,YAAY,KAAK,MAAM;AAE3B,UACE,CAAC,aACA,KAAK,UAAU,KAAK,KAAK,SACzB,cAAc,KAAK,KAAK,MAAM,OAC/B;AACD;AAAA;AAED,UACG,SAAS,WAAW,CAAC,UAAU,SAC/B,SAAQ,OAAO,QAAQ,QACvB,SAAS,cAAc,UAAU,QACnC;AACA,eAAO,SAAS,MAAM;AAAA;AAGvB,SAAE,qBAAqB,OAAO,WAAW,MAAM;AAAA;AAchD,OAAE,QAAQ,SAAS,WAAW,KAAK,UAAU;AAC5C,kBAAY,UAAU,SAAS;AAG/B,UAAI,MAAM,GAAE,kBAAkB;AAC9B,UAAG,KAAK;AACP,gBAAQ,MAAM,sCAAsC;AAAA;AAIrD,UAAG,CAAC,KAAI;AAAE,eAAO;AAAA;AAEjB,UAAI;AACJ,UAAI,OAAO,UAAU;AACrB,UAAI,aAAa,KAAK;AACtB,UAAI,QAAQ;AACZ,UAAI,SAAS;AAEb,UAAI;AAGJ,UAAI,UAAU;AACd,UAAI,WAAW;AACf,UAAI;AAGJ,UAAI,OAAO,KAAK,IAAI,KAAK;AACzB,WAAI,IAAE,GAAG,IAAI,YAAY,KAAG,GAAG;AAC9B,YAAI,iBACH,KAAK,IAAI,KAAK,IAAE,IAChB,KAAK,IAAE,IAAI,KAAK,IAAE;AAAA;AAIpB,UAAI,cAAc;AAClB,UAAI,YAAY,QAAM;AACtB,UAAI;AACJ,UAAI,cAAc;AAClB,UAAI,YAAY;AAChB,UAAI;AACJ,UAAI;AAGJ,UAAI,UAAU,SAAS;AACvB,UAAG,YAAY,SAAS;AACvB,YAAI,YAAY;AAChB,YAAI,WAAW;AACf,WAAE,gBAAgB,WAAW;AAE7B,iBAAQ,IAAE,GAAG,IAAE,SAAS,KAAI;AAC3B,oBAAU,SAAS;AACnB,aAAE,qBAAqB,SAAS,IAAI,WAAW;AAE/C,cAAI;AAEJ,cAAI,OAAO,SAAS,GAAG,SAAS;AAChC,cAAI,OACH,SAAS,IAAI,KAAK,IAAI,SAAS,WAAW,aAAa,QACvD,SAAS,IAAI,KAAK,IAAI,SAAS,WAAW,aAAa;AAGxD,cAAI,cAAc;AAClB,cAAI,YAAY,QAAM;AACtB,cAAI;AACJ,cAAI,cAAc;AAClB,cAAI,YAAY;AAChB,cAAI;AACJ,cAAI;AAAA;AAAA;AAKN,UAAI;AAEJ,aAAO;AAAA;AAWR,OAAE,kBAAkB,SAAS,QAAQ,SAAS;AAC7C,UAAI,MAAM;AACV,UAAG,MAAM,GAAE,MAAM,SAAS;AAAE,eAAO;AAAA;AAEnC,UAAI,OAAO,QAAQ,OAAO,OAAO;AACjC,UAAI,SAAS,QAAQ,SAAS,OAAO;AACrC,cAAQ,WAAW;AACnB,cAAQ,cAAc;AACtB,cAAQ,iBAAiB;AACzB,cAAQ,gBAAgB;AACxB,cAAQ,YAAY,EAAC,OAAO;AAC5B,cAAQ,UAAU,EAAC,OAAO;AAC1B,cAAQ,WAAW;AAEnB,UAAI,aAAa,KAAK;AAEtB,UAAI,YAAY;AAChB,UAAI,IAAG,IAAI,IAAG,IAAI,IAAG,IAAI,GAAE,GAAG,KAAK,OAAO;AAE1C,WAAK,KAAK;AAAK,WAAK,KAAK;AAGzB,WAAI,IAAE,GAAG,IAAI,YAAY,KAAG,GAAG;AAC9B,aAAK,KAAK;AAAM,aAAK,KAAK,IAAE;AAC5B,aAAK,KAAK,IAAE;AAAM,aAAK,KAAK,IAAE;AAE9B,YAAI,UAAU;AAAA,UACb,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,SAAS;AAAA;AAGV,YAAI,OAAO,IAAI,OAAO;AAEtB,aAAI,IAAE,GAAG,KAAK,WAAU,KAAK;AAC5B,aAAE,mBAAmB,IAAG,IAAI,IAAG,IAAI,IAAG,IAAI,IAAE,WAAW,OAAO;AAE9D,cAAI,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI;AACtC,gBAAM,KAAK,KAAK,KAAG,KAAK,KAAG;AAC3B,kBAAQ,WAAW,KAAK;AACxB,kBAAQ,aAAa;AAErB,iBAAO,KAAK;AACZ,iBAAO,KAAK;AAAA;AAIb,gBAAQ,eAAe,QAAQ;AAG/B,aAAI,IAAE,GAAG,IAAI,WAAW,KAAK;AAC5B,gBAAM,QAAQ;AACd,kBAAQ,WAAW,KAAK,QAAQ,WAAW,KAAK;AAAA;AAGjD,gBAAQ,SAAS,KAAK;AACtB,aAAK;AACL,aAAK;AAAA;AAIN,YAAM,QAAQ;AACd,UAAI,IAAI,QAAQ,SAAS;AACzB,WAAI,IAAE,GAAG,IAAE,GAAG,KAAK;AAClB,gBAAQ,SAAS,GAAG,UAAU,QAAQ,SAAS,GAAG,YAAY;AAAA;AAI/D,UAAI,aAAa,MAAM,OAAO,SAAS,IAAI,OAAO;AAClD,UAAI,WAAW,MAAM,OAAO,OAAO,IAAI,OAAO;AAC9C,SAAE,qBAAqB,YAAY,SAAS,QAAQ;AACpD,SAAE,qBAAqB,UAAU,SAAS,QAAQ;AAGlD,cAAQ,UAAU,QAAQ;AAC1B,cAAQ,QAAQ,QAAQ;AACxB,cAAQ,WAAW,QAAQ,QAAQ,QAAQ,QAAQ,UAAU;AAAA;AAW9D,OAAE,uBAAuB,SAAS,OAAO,WAAW,QAAQ;AAC3D,UAAI,eAAe,UAAU;AAE7B,UAAI,GAAE,GAAG,GAAG,MAAM;AAElB,UAAI,OAAO;AACX,UAAI,YAAY;AAChB,UAAI,WAAY,QAAQ,UAAU,WAAY,UAAU,UAAU;AAGlE,UAAI,aAAa;AACjB,WAAI,IAAE,GAAG,IAAE,GAAG,KAAK;AAClB,eAAO,aAAa,GAAG;AACvB,YAAG,OAAO,QAAQ,UAAS;AAAE,mBAAS;AAAG;AAAA;AACzC,gBAAQ;AAAA;AAET,UAAG,WAAW,QAAW;AAAE,iBAAS,IAAE;AAAI,gBAAQ;AAAA;AAGlD,UAAI,WAAW,aAAa,QAAQ;AACpC,UAAI,UAAU;AACd,UAAI,SAAS;AACb,WAAI,IAAE,GAAG,IAAE,GAAG,KAAK;AAClB,eAAO,SAAS,KAAK;AACrB,YAAG,OAAO,QAAQ,UAAS;AAAE;AAAA;AAC7B,gBAAQ;AAAA;AAIT,eAAU,SAAO,IAAK;AAEtB,UAAK,IAAE,YAAgB,YAAS,QAAQ,OAAS,KAAE;AAGnD,UAAI,WAAW,UAAU;AACzB,SAAE,mBACD,SAAS,SAAO,IAAM,SAAS,SAAO,IACtC,SAAS,SAAW,SAAS,SAAO,IACpC,SAAS,SAAO,IAAM,SAAS,SAAO,IACtC,GACA,UAAU,QACV;AAGD,UAAG,UAAU,QAAQ;AACpB,YAAG,SAAS,WAAW,SAAS,WAAW,UAAU,cAAc,QAAW;AAC7E,iBAAO,WAAW,UAAU;AAAA,eACtB;AACN,iBAAO,YAAY,UAAU,iBAAkB,QAAQ,UAAU;AAAA;AAAA;AAInE,aAAO;AAAA;AAgBR,OAAE,qBAAqB,SAAS,IAAG,IAAI,IAAG,IAAI,IAAG,IAAI,GAAG,QAAQ,QAAQ;AACvE,UAAI,MAAM,IAAI;AAGd,aAAO,IAAI,MAAI,MAAM,KAAK,IAAI,MAAM,IAAI,KAAK,IAAE,IAAI;AACnD,aAAO,IAAI,MAAI,MAAM,KAAK,IAAI,MAAM,IAAI,KAAK,IAAE,IAAI;AAGnD,UAAG,QAAQ;AAEV,eAAO,WAAW,aAAa,KAAK,MAClC,MAAK,MAAI,MAAO,MAAK,MAAI,GACzB,MAAK,MAAI,MAAO,MAAK,MAAI;AAAA;AAAA;AAW7B,OAAE,oBAAoB,SAAS,WAAW;AACzC,UAAI,OAAO,UAAU;AACrB,UAAI,aAAc,QAAQ,KAAK,UAAW;AAC1C,UAAG,aAAa,KAAM,cAAW,KAAK,GAAG;AACxC,YAAI,UAAU;AACd,mBAAY;AACZ,mBAAY;AACZ,mBAAY,YAAW,aAAY,gCAA+B,KAAK,IAAI,KAAK,KAAM,cAAW,KAAG,KAAG,IAAE,GAAG;AAC5G,eAAO;AAAA;AAGR,eAAQ,IAAE,GAAG,IAAE,YAAY,KAAK;AAC/B,YAAG,MAAM,KAAK,KAAI;AACjB,iBAAO;AAAA;AAAA;AAIT,UAAI,SAAQ,UAAU;AACtB,UAAG,MAAM,WAAU,CAAE,YAAU,SAA0C;AACxE,eAAO,kDAAiD;AAAA;AAEzD,UAAI,OAAM,UAAU;AACpB,UAAG,MAAM,SAAS,SAAQ,QAAsC;AAC/D,eAAO,gDAA+C;AAAA;AAGvD,UAAI,SAAS,UAAU;AACvB,UAAG,QAAQ;AACV,YAAG,UAAU,WAAW,UAAU,UAAU,UAAU,QAAQ,UAAU,OAAO;AAC9E,iBAAO,yFAAwF;AAAA;AAAA;AAIjG,aAAO;AAAA;AAGR,aAAS,oBAAoB;AAAA;AAQ9B,EAAC,YAAW;AACX;AAOA,QAAI,KAAI,SAAS,UAAU,SAAS,WAAW;AAQ/C,OAAE,UAAsB;AAQxB,OAAE,YAAqB;AAAA;;;ACh/7BxB,gDAA6B,WAAW;AAAA,IACtC,UAAU;AACR,UAAI,UAAU;AAEd,MAAC,UAAU,KAAK,IAAI;AAElB,YAAI;AACJ,YAAI,MAAM;AAAI,YAAI,KAAK;AAAI,YAAI,MAAM;AACrC,YAAI,aAAa;AAGjB,QAAC,KAAI,cAAc,WAAY;AAC7B,eAAK,eAAe;AACpB,eAAK,cAAc;AACnB,eAAK,cAAc,SAAU,iBAAiB;AAC5C,gBAAI,UAAU,UAAU,YAAY,KAAK,MAAM;AAAA;AAEjD,eAAK,OAAO,WAAY;AACtB,gBAAI,UAAU,UAAU,KAAK,KAAK;AAAA;AAEpC,eAAK,cAAc,SAAU,iBAAiB;AAC5C,gBAAI,UAAU,UAAU,YAAY,KAAK,MAAM;AAAA;AAEjD,eAAK,OAAO,WAAY;AACtB,gBAAI,UAAU,UAAU,KAAK,KAAK;AAAA;AAAA,WAEnC,YAAY,IAAI,IAAI,IAAI;AAI3B,mCAA2B;AACzB,cAAI,QAAQ,KAAK,YAAY,IAAI,KAAK,YAAY,KAAK,MAAM,KAAK,eAAe,KAAK,MAAM,KAAK;AACjG,gBAAM,YAAY,KAAK;AACvB,gBAAM,SAAS,KAAK;AACpB,gBAAM,YAAY,KAAK;AACvB,iBAAO;AAAA;AAGT,sCAA8B,QAAQ,eAAe,aAAa;AAChE,cAAI,YAAY,IAAI,OAAO,QAAQ,IAAI;AACvC,oBAAU,QAAQ;AAClB,oBAAU,gBAAgB;AAC1B,oBAAU,cAAc;AACxB,iBAAO;AAAA;AAIT,QAAC,KAAI,eAAe,SAAU,MAAM,eAAe,MAAM,UAAU;AACjE,cAAI,QAAQ,MAAM;AAAE,mBAAO;AAAA;AAC3B,cAAI,YAAY,MAAM;AAAE,uBAAW;AAAA;AACnC,cAAI,QAAQ,IAAI;AAChB,gBAAM,OAAO;AACb,gBAAM,gBAAgB;AACtB,gBAAM,SAAS;AACf,gBAAM,OAAO;AACb,gBAAM,WAAW;AACjB,cAAI,UAAU,MAAM,MAAM,CAAC;AAG3B,eAAK,QAAQ,IAAI,IAAI;AACrB,eAAK,MAAM,SAAS,EAAE,WAAW,IAAI,EAAE;AACvC,eAAK,MAAM,aAAa,QAAQ;AAEhC,eAAK,SAAS,SAAS,IAAI,MAAM,IAAI,KAAK,OAAO,KAAK;AAEtD,eAAK;AAAA,WAEJ,YAAY,IAAI,IAAI,IAAI;AAC3B,UAAE,gBAAgB,IAAI,IAAI,UAAU,KAAK,KAAK,MAAM;AAGpD,QAAC,KAAI,eAAe,SAAU,MAAM,eAAe,MAAM,UAAU;AACjE,cAAI,QAAQ,MAAM;AAAE,mBAAO;AAAA;AAC3B,cAAI,YAAY,MAAM;AAAE,uBAAW;AAAA;AACnC,cAAI,QAAQ,IAAI;AAChB,gBAAM,OAAO;AACb,gBAAM,gBAAgB;AACtB,gBAAM,SAAS;AACf,gBAAM,OAAO;AACb,gBAAM,WAAW;AACjB,cAAI,UAAU,MAAM,MAAM,CAAC;AAG3B,eAAK,QAAQ,IAAI,IAAI;AACrB,eAAK,MAAM,SAAS,EAAE,WAAW,IAAI,EAAE;AACvC,eAAK,MAAM,aAAa,QAAQ;AAEhC,eAAK,SAAS,SAAS,IAAI,MAAM,IAAI,KAAK,OAAO,KAAK;AAEtD,eAAK;AAAA,WAEJ,YAAY,IAAI,IAAI,IAAI;AAC3B,UAAE,gBAAgB,IAAI,IAAI,UAAU,KAAK,KAAK,MAAM;AAGpD,QAAC,KAAI,OAAO,SAAU,MAAM,eAAe,MAAM,UAAU;AACzD,cAAI,QAAQ,MAAM;AAAE,mBAAO;AAAA;AAC3B,cAAI,YAAY,MAAM;AAAE,uBAAW;AAAA;AACnC,cAAI,QAAQ,IAAI;AAChB,gBAAM,OAAO;AACb,gBAAM,gBAAgB;AACtB,gBAAM,SAAS;AACf,gBAAM,OAAO;AACb,gBAAM,WAAW;AACjB,cAAI,UAAU,MAAM,MAAM,CAAC;AAG3B,eAAK,QAAQ,IAAI,IAAI;AACrB,eAAK,MAAM,SAAS,EAAE,WAAW,IAAI,EAAE;AACvC,eAAK,MAAM,aAAa,SAAS;AAEjC,eAAK,SAAS,SAAS,IAAI,MAAM,IAAI,KAAK,OAAO,KAAK;AAEtD,eAAK;AAAA,WAEJ,YAAY,qBAAqB,IAAI,MAAM,IAAI,IAAI,UAAU,GAAG,KAAK,MAAM,qBAAqB;AAGnG,QAAC,KAAI,YAAY,SAAU,MAAM,eAAe,MAAM,UAAU;AAC9D,cAAI,QAAQ,MAAM;AAAE,mBAAO;AAAA;AAC3B,cAAI,YAAY,MAAM;AAAE,uBAAW;AAAA;AACnC,cAAI,QAAQ,IAAI;AAChB,gBAAM,OAAO;AACb,gBAAM,gBAAgB;AACtB,gBAAM,SAAS;AACf,gBAAM,OAAO;AACb,gBAAM,WAAW;AACjB,cAAI,UAAU,MAAM,MAAM,CAAC;AAG3B,eAAK,WAAW,IAAI,IAAI;AACxB,eAAK,SAAS,aAAa,KAAK,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM;AAC3D,eAAK,SAAS,QAAQ;AAEtB,eAAK,QAAQ,IAAI,IAAI;AACrB,eAAK,MAAM,SAAS,EAAE,WAAW,IAAI,EAAE;AACvC,eAAK,MAAM,aAAa,QAAQ;AAEhC,eAAK,UAAU,IAAI,IAAI;AACvB,eAAK,QAAQ,SAAS,EAAE,WAAW,IAAI,EAAE;AACzC,eAAK,QAAQ,aAAa,QAAQ;AAElC,eAAK,UAAU,IAAI,IAAI;AACvB,eAAK,QAAQ,SAAS,EAAE,WAAW,IAAI,EAAE;AACzC,eAAK,QAAQ,aAAa,QAAQ;AAElC,eAAK,UAAU,IAAI,IAAI;AACvB,eAAK,QAAQ,SAAS,EAAE,WAAW,IAAI,EAAE;AACzC,eAAK,QAAQ,aAAa,SAAS;AAEnC,eAAK,UAAU,IAAI,IAAI;AACvB,eAAK,QAAQ,SAAS,EAAE,WAAW,IAAI,EAAE;AACzC,eAAK,QAAQ,aAAa,SAAS;AAEnC,eAAK,UAAU,IAAI,IAAI;AACvB,eAAK,QAAQ,SAAS,EAAE,WAAW,IAAI,EAAE;AACzC,eAAK,QAAQ,aAAa,KAAK;AAE/B,eAAK,UAAU,IAAI,IAAI;AACvB,eAAK,QAAQ,SAAS,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,EAAE;AACnD,eAAK,QAAQ,aAAa,QAAQ;AAElC,eAAK,UAAU,IAAI,IAAI;AACvB,eAAK,QAAQ,SAAS,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,EAAE;AACnD,eAAK,QAAQ,aAAa,SAAS;AAEnC,eAAK,UAAU,IAAI,IAAI;AACvB,eAAK,QAAQ,SAAS,EAAE,WAAW,IAAI,EAAE;AACzC,eAAK,QAAQ,aAAa,SAAS;AAEnC,eAAK,UAAU,IAAI,IAAI;AACvB,eAAK,QAAQ,SAAS,EAAE,WAAW,IAAI,EAAE;AACzC,eAAK,QAAQ,aAAa,OAAO;AAEjC,eAAK,SAAS,SAAS,IAAI,MAAM,IAAI,IAAI,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,WAAW,EAAE,GAAG,KAAK,WAAW,EAAE,GAAG,KAAK,WAAW,EAAE,GAAG,KAAK,WAAW,EAAE,GAAG,KAAK,WAAW,EAAE,GAAG,KAAK,WAAW,EAAE,GAAG,KAAK,WAAW,EAAE,GAAG,KAAK,WAAW,EAAE,GAAG,KAAK,WAAW,EAAE,GAAG,KAAK,SAAS,EAAE,GAAG,KAAK,eAAe,KAAK;AAEpS,eAAK;AAAA,WAEJ,YAAY,IAAI,IAAI,IAAI;AAC3B,UAAE,gBAAgB,IAAI,IAAI,UAAU,GAAG,GAAG,OAAO;AAIjD,QAAC,KAAI,SAAS,SAAU,MAAM,eAAe,MAAM,UAAU;AAC3D,cAAI,QAAQ,MAAM;AAAE,mBAAO;AAAA;AAC3B,cAAI,YAAY,MAAM;AAAE,uBAAW;AAAA;AACnC,cAAI,QAAQ,IAAI;AAChB,gBAAM,OAAO;AACb,gBAAM,gBAAgB;AACtB,gBAAM,SAAS;AACf,gBAAM,OAAO;AACb,gBAAM,WAAW;AACjB,cAAI,UAAU,MAAM,MAAM,CAAC;AAG3B,eAAK,WAAW,IAAI,IAAI,aAAa,WAAW;AAChD,eAAK,SAAS,aAAa,OAAO,QAAQ,GAAG,GAAG,GAAG,GAAG,GAAG,QAAQ;AAEjE,eAAK,SAAS,SAAS,IAAI,MAAM,IAAI,KAAK,UAAU,GAAG,EAAE,GAAG,UAAU,KAAK,KAAK;AAGhF,eAAK,aAAa,IAAI,IAAI,UAAU,WAAW;AAC/C,eAAK,WAAW,aAAa,OAAO,KAAK,QAAQ,QAAQ,QAAQ,GAAG,GAAG,OAAO;AAE9E,eAAK,SAAS,SAAS,IAAI,MAAM,IAAI,KAAK,YAAY,KAAK,GAAG,GAAG,EAAE,MAAM,OAAO,MAAM,OAAO,UAAU,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,QAAQ,QAAQ,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG,EAAE,UAAU,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,KAA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",
  "names": []
}
