{"version":3,"sources":["webpack:///./src/js/modules/breakToLines.js","webpack:///./src/js/modules/caseStudiesTabItems.js","webpack:///./node_modules/splitting/dist/splitting.js"],"names":["Module","this","dom","overlay","el","querySelector","text","link","svg","image","lineSplit","target","by","handleResize","addEventListener","handleHover","bind","handleMouseOut","window","isMobile","matchMedia","matches","visible","timeOverlay","offsetWidth","showTime","style","visibility","showSequence","lines","reduce","sequence","line","index","lineSequence","opacity","transform","at","duration","delay","push","lineSplitEnd","length","svgSequence","animate","timeline","dissappearTime","hideSequence","finished","then","Component","caseStudiesTabButton","grid","items","CASE_STUDIES","limit","Number","dataset","loadMoreLimit","loadMoreItem","loadAll","lastIndex","initGrid","handleClick","handleHoverIn","handleHoverOut","color","getElements","showLoadFullButton","getNextItems","nextItems","minHeight","max","appendChild","getCardTemplate","querySelectorAll","forEach","card","classList","contains","breakToLines","add","display","item","shortTeaser","trim","title","technology","url","imageMobile","description","article","document","createElement","hoverText","hasTeaser","innerHTML","join","module","exports","root","createText","createTextNode","setProperty","varName","value","child","parent","key","whitespace","className","setAttribute","textContent","getData","getAttribute","$","e","nodeName","slice","call","Array2D","len","a","each","fn","some","selectFrom","obj","plugins","createPlugin","depends","split","resolve","resolvePlugins","deps","indexOf","unshift","p","indexOfParent","splice","map","opts","splitText","splitOn","includePrevious","preserveWhitespace","normalize","elements","F","createDocumentFragment","previousSibling","allElements","childNodes","next","tagName","hasChildNodes","apply","wholeText","contents","i","splitEl","wordPlugin","charPlugin","options","ctx","results","word","Splitting","force","opts2","dest","src","k","copy","plugin","pluginBy","key2","element","prefix","cssVar","Array","isArray","detectGrid","side","matching","children","c","w","val","Math","round","Object","keys","sort","byNumber","b","html","content","outerHTML","linePlugin","itemPlugin","rowPlugin","columnPlugin","gridPlugin","layoutPlugin","rows","columns","currentSrc","img","totalCells","container","cell","cellRowPlugin","rowCount","result","floor","cellColumnPlugin","columnCount","cellPlugin","opt","factory"],"mappings":"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","file":"26.3f15b47b264528c36ab0.js","sourcesContent":["import { animate, timeline } from 'motion';\n\nimport { Component } from '@verndale/core';\nimport Splitting from 'splitting';\n\nclass Module extends Component {\n setupDefaults() {\n this.dom = {\n overlay: this.el.querySelector('.card__overlay'),\n text: this.el.querySelector('.card__text'),\n link: this.el.querySelector('a'),\n svg: this.el.querySelector('svg'),\n image: this.el.querySelector('img')\n };\n\n this.dom.text.lineSplit = Splitting({\n target: this.dom.text,\n by: 'lines'\n });\n this.handleResize();\n }\n\n addListeners() {\n this.dom.link.addEventListener('mouseover', this.handleHover.bind(this));\n this.dom.link.addEventListener('mouseout', this.handleMouseOut.bind(this));\n window.addEventListener('resize', this.handleResize.bind(this));\n }\n\n handleResize() {\n this.isMobile = window.matchMedia('(max-width: 1025px)').matches;\n if (this.visible && this.isMobile) {\n this.handleMouseOut();\n }\n }\n\n handleHover() {\n if (!this.isMobile) {\n this.timeOverlay = 0.35 + this.el.offsetWidth * 0.0003;\n\n this.showTime = this.timeOverlay * 0.12;\n this.dom.text.style.visibility = 'visible';\n\n const showSequence = this.dom.text.lineSplit[0].lines.reduce(\n (sequence, line, index) => {\n const lineSequence = [\n line,\n {\n opacity: [0, 1],\n transform: ['translate(-50px, 0)', 'translate(0, 0)']\n },\n { at: this.showTime * index },\n { duration: this.showTime, delay: this.timeOverlay * 0.6 }\n ];\n sequence.push(lineSequence);\n return sequence;\n },\n []\n );\n\n const lineSplitEnd = this.dom.text.lineSplit[0].lines.length;\n\n const svgSequence = [\n this.dom.svg,\n {\n opacity: [0, 1],\n transform: ['translate(-50px, 0)', 'translate(0, 0)']\n },\n { at: this.showTime * lineSplitEnd },\n { duration: this.showTime, delay: this.timeOverlay * 0.6 }\n ];\n showSequence.push(svgSequence);\n\n animate(\n this.dom.overlay,\n { transform: 'skew(-30deg) scale(2.1, 1)' },\n { duration: this.timeOverlay }\n );\n\n timeline(showSequence);\n\n if (this.dom.image)\n animate(this.dom.image, { transform: 'scale(1.25)' }, { duration: 1 });\n }\n this.visible = true;\n }\n\n handleMouseOut() {\n this.visible = false;\n this.dissappearTime = this.showTime * 0.85;\n const hideSequence = this.dom.text.lineSplit[0].lines.reduce(\n (sequence, line, index) => {\n const lineSequence = [\n line,\n {\n opacity: 0,\n transform: ['translate(0, 0)', 'translate(-50px, 0)']\n },\n { at: this.dissappearTime * index },\n { duration: this.dissappearTime }\n ];\n sequence.push(lineSequence);\n return sequence;\n },\n []\n );\n\n const lineSplitEnd = this.dom.text.lineSplit[0].lines.length;\n\n const lineSequence = [\n this.dom.svg,\n {\n opacity: 0,\n transform: ['translate(0, 0)', 'translate(-50px, 0)']\n },\n { at: this.dissappearTime * lineSplitEnd },\n { duration: this.dissappearTime }\n ];\n\n hideSequence.push(lineSequence);\n\n timeline(hideSequence).finished.then(() => {\n if (!this.visible) {\n this.dom.text.style.visibility = 'hidden';\n }\n });\n\n animate(\n this.dom.overlay,\n { transform: 'skew(-30deg) scale(0, 1)' },\n { duration: this.timeOverlay, delay: lineSplitEnd * this.dissappearTime }\n );\n\n if (this.dom.image)\n animate(\n this.dom.image,\n { transform: 'scale(1)' },\n { duration: this.timeOverlay * 2.6, delay: this.timeOverlay * 0.3 }\n );\n }\n}\n\nexport default Module;\n","import { animate, timeline } from 'motion';\n\nimport { Component } from '@verndale/core';\nimport breakToLines from './breakToLines';\n\nclass Module extends Component {\n setupDefaults() {\n this.dom = {\n caseStudiesTabButton: this.el.querySelector('.case-studies-tab__button'),\n grid: this.el.querySelector('.case-studies-tab__grid'),\n overlay: this.el.querySelector('.overlay'),\n text: this.el.querySelector('.case-studies-tab__button .text')\n };\n\n this.items = window.CASE_STUDIES.items;\n this.limit = Number(this.el.dataset.loadMoreLimit);\n this.loadMoreItem =\n this.items.length < this.limit ? this.items.length : this.limit;\n this.loadAll = this.el.dataset.loadAll === 'true';\n this.lastIndex = 0;\n this.initGrid();\n }\n\n addListeners() {\n this.dom.caseStudiesTabButton.addEventListener('click', ::this.handleClick);\n this.dom.caseStudiesTabButton.addEventListener(\n 'mouseenter',\n this.handleHoverIn.bind(this)\n );\n this.dom.caseStudiesTabButton.addEventListener(\n 'mouseleave',\n this.handleHoverOut.bind(this)\n );\n }\n\n handleHoverIn() {\n const sequence = [\n [\n this.dom.text,\n {\n opacity: [1, 0],\n transform: ['translate(0, 0)', 'translate(100px, 0)'],\n color: '#fff'\n },\n { duration: 0.15, delay: 0.05 }\n ],\n [\n this.dom.text,\n {\n opacity: [0, 1],\n transform: ['translate(-100px, 0)', 'translate(0, 0)']\n },\n { at: 0.17 + 0.05 },\n { duration: 0.15, delay: 0.05 }\n ]\n ];\n\n timeline(sequence);\n\n animate(\n this.dom.overlay,\n { transform: 'scale(2, 1)' },\n { duration: 0.7 }\n ).finished.then(() => {});\n }\n\n handleHoverOut() {\n const sequence = [\n [\n this.dom.text,\n {\n opacity: [1, 0],\n transform: ['translate(0, 0)', 'translate(-100px, 0)'],\n color: '#000'\n },\n { duration: 0.15, delay: 0.05 }\n ],\n [\n this.dom.text,\n {\n opacity: [0, 1],\n transform: ['translate(100px, 0)', 'translate(0, 0)']\n },\n { at: 0.17 + 0.05 },\n { duration: 0.15, delay: 0.05 }\n ]\n ];\n\n timeline(sequence);\n\n animate(\n this.dom.overlay,\n { transform: 'scale(0, 1)' },\n { duration: 0.7 }\n ).finished.then(() => {});\n }\n\n handleClick() {\n if (this.loadAll) {\n this.getElements(this.lastIndex, this.items.length);\n return this.showLoadFullButton();\n }\n\n this.getElements(this.lastIndex, this.getNextItems());\n this.showLoadFullButton();\n }\n\n getNextItems() {\n const nextItems = this.lastIndex + this.loadMoreItem;\n\n return nextItems > this.items.length ? this.items.length : nextItems;\n }\n\n initGrid() {\n this.getElements();\n this.showLoadFullButton();\n this.dom.grid.style.minHeight = 'auto';\n }\n\n getElements(index = 0, max = this.loadMoreItem) {\n for (; index < max; index++) {\n this.dom.grid.appendChild(this.getCardTemplate(this.items[index]));\n this.lastIndex = index + 1;\n }\n\n [...this.dom.grid.querySelectorAll('.case-studies-tab__card')].forEach(\n card => {\n if (!card.classList.contains('loaded')) {\n new breakToLines(card);\n }\n\n card.classList.add('loaded');\n }\n );\n }\n\n showLoadFullButton() {\n if (this.lastIndex < this.items.length) {\n return (this.dom.caseStudiesTabButton.style.display = 'block');\n }\n\n if (this.lastIndex === this.items.length) {\n this.dom.caseStudiesTabButton.style.display = 'none';\n }\n }\n\n hasTeaser(item) {\n const { shortTeaser } = item;\n if (shortTeaser !== null) {\n if (!shortTeaser !== '' || shortTeaser.trim() !== '') {\n return true;\n }\n }\n return false;\n }\n\n getCardTemplate(item) {\n const {\n title,\n technology,\n url,\n image,\n imageMobile,\n shortTeaser,\n description\n } = item;\n const article = document.createElement('article');\n const hoverText = this.hasTeaser(item) ? shortTeaser : description;\n article.classList.add('case-studies-tab__card');\n article.innerHTML = `\n <a href=\"${url}\" aria-label=\"Click to Open ${title}\"></a>\n <div class=\"case-studies-tab-card__image-wrapper\">\n <div class=\"image-v2--rounded card\">\n <div class=\"card__overlay\"></div>\n <picture class=\"image-v2__wrapper\">\n ${\n imageMobile\n ? `<source media=\"(max-width:677px)\" srcset=\"${imageMobile}\">`\n : ''\n }\n <img src=\"${image}\" alt=\"${title}\" class=\"image-v2 image-v2--rounded\">\n </picture>\n <div class=\"case-studies-tab__card-text card__text\">\n ${hoverText} \n <p class=\"svg__wrapper\">\n <svg viewBox=\"0 0 320 147\">\n <use xlink:href=\"#arrow-right-v2\" />\n </svg>\n </p>\n </div>\n </div>\n </div>\n <div class=\"case-studies-tab-card__header\">\n <h3>\n <a href=\"${url}\">\n ${title}\n </a>\n </h3>\n <p>\n <strong>${technology.join('|')}</strong>\n </p>\n </div>\n `;\n\n return article;\n }\n}\n\nexport default Module;\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.Splitting = factory());\n}(this, (function () { 'use strict';\n\nvar root = document;\nvar createText = root.createTextNode.bind(root);\n\n/**\n * # setProperty\n * Apply a CSS var\n * @param el{HTMLElement} \n * @param varName {string} \n * @param value {string|number} \n */\nfunction setProperty(el, varName, value) {\n el.style.setProperty(varName, value);\n} \n\n/**\n * \n * @param {Node} el \n * @param {Node} child \n */\nfunction appendChild(el, child) {\n return el.appendChild(child);\n}\n\nfunction createElement(parent, key, text, whitespace) {\n var el = root.createElement('span');\n key && (el.className = key); \n if (text) { \n !whitespace && el.setAttribute(\"data-\" + key, text);\n el.textContent = text; \n }\n return (parent && appendChild(parent, el)) || el;\n}\n\nfunction getData(el, key) {\n return el.getAttribute(\"data-\" + key)\n}\n\n/**\n * \n * @param e {import('../types').Target} \n * @param parent {HTMLElement}\n * @returns {HTMLElement[]}\n */\nfunction $(e, parent) {\n return !e || e.length == 0\n ? // null or empty string returns empty array\n []\n : e.nodeName\n ? // a single element is wrapped in an array\n [e]\n : // selector and NodeList are converted to Element[]\n [].slice.call(e[0].nodeName ? e : (parent || root).querySelectorAll(e));\n}\n\n/**\n * Creates and fills an array with the value provided\n * @template {T}\n * @param {number} len\n * @param {() => T} valueProvider\n * @return {T}\n */\nfunction Array2D(len) {\n var a = [];\n for (; len--; ) {\n a[len] = [];\n }\n return a;\n}\n\nfunction each(items, fn) {\n items && items.some(fn);\n}\n\nfunction selectFrom(obj) {\n return function (key) {\n return obj[key];\n }\n}\n\n/**\n * # Splitting.index\n * Index split elements and add them to a Splitting instance.\n *\n * @param element {HTMLElement}\n * @param key {string}\n * @param items {HTMLElement[] | HTMLElement[][]}\n */\nfunction index(element, key, items) {\n var prefix = '--' + key;\n var cssVar = prefix + \"-index\";\n\n each(items, function (items, i) {\n if (Array.isArray(items)) {\n each(items, function(item) {\n setProperty(item, cssVar, i);\n });\n } else {\n setProperty(items, cssVar, i);\n }\n });\n\n setProperty(element, prefix + \"-total\", items.length);\n}\n\n/**\n * @type {Record<string, import('./types').ISplittingPlugin>}\n */\nvar plugins = {};\n\n/**\n * @param by {string}\n * @param parent {string}\n * @param deps {string[]}\n * @return {string[]}\n */\nfunction resolvePlugins(by, parent, deps) {\n // skip if already visited this dependency\n var index = deps.indexOf(by);\n if (index == -1) {\n // if new to dependency array, add to the beginning\n deps.unshift(by);\n\n // recursively call this function for all dependencies\n each(plugins[by].depends, function(p) {\n resolvePlugins(p, by, deps);\n });\n } else {\n // if this dependency was added already move to the left of\n // the parent dependency so it gets loaded in order\n var indexOfParent = deps.indexOf(parent);\n deps.splice(index, 1);\n deps.splice(indexOfParent, 0, by);\n }\n return deps;\n}\n\n/**\n * Internal utility for creating plugins... essentially to reduce\n * the size of the library\n * @param {string} by \n * @param {string} key \n * @param {string[]} depends \n * @param {Function} split \n * @returns {import('./types').ISplittingPlugin}\n */\nfunction createPlugin(by, depends, key, split) {\n return {\n by: by,\n depends: depends,\n key: key,\n split: split\n }\n}\n\n/**\n *\n * @param by {string}\n * @returns {import('./types').ISplittingPlugin[]}\n */\nfunction resolve(by) {\n return resolvePlugins(by, 0, []).map(selectFrom(plugins));\n}\n\n/**\n * Adds a new plugin to splitting\n * @param opts {import('./types').ISplittingPlugin}\n */\nfunction add(opts) {\n plugins[opts.by] = opts;\n}\n\n/**\n * # Splitting.split\n * Split an element's textContent into individual elements\n * @param el {Node} Element to split\n * @param key {string}\n * @param splitOn {string}\n * @param includeSpace {boolean}\n * @returns {HTMLElement[]}\n */\nfunction splitText(el, key, splitOn, includePrevious, preserveWhitespace) {\n // Combine any strange text nodes or empty whitespace.\n el.normalize();\n\n // Use fragment to prevent unnecessary DOM thrashing.\n var elements = [];\n var F = document.createDocumentFragment();\n\n if (includePrevious) {\n elements.push(el.previousSibling);\n }\n\n var allElements = [];\n $(el.childNodes).some(function(next) {\n if (next.tagName && !next.hasChildNodes()) {\n // keep elements without child nodes (no text and no children)\n allElements.push(next);\n return;\n }\n // Recursively run through child nodes\n if (next.childNodes && next.childNodes.length) {\n allElements.push(next);\n elements.push.apply(elements, splitText(next, key, splitOn, includePrevious, preserveWhitespace));\n return;\n }\n\n // Get the text to split, trimming out the whitespace\n /** @type {string} */\n var wholeText = next.wholeText || '';\n var contents = wholeText.trim();\n\n // If there's no text left after trimming whitespace, continue the loop\n if (contents.length) {\n // insert leading space if there was one\n if (wholeText[0] === ' ') {\n allElements.push(createText(' '));\n }\n // Concatenate the split text children back into the full array\n each(contents.split(splitOn), function(splitText, i) {\n if (i && preserveWhitespace) {\n allElements.push(createElement(F, \"whitespace\", \" \", preserveWhitespace));\n }\n var splitEl = createElement(F, key, splitText);\n elements.push(splitEl);\n allElements.push(splitEl);\n }); \n // insert trailing space if there was one\n if (wholeText[wholeText.length - 1] === ' ') {\n allElements.push(createText(' '));\n }\n }\n });\n\n each(allElements, function(el) {\n appendChild(F, el);\n });\n\n // Clear out the existing element\n el.innerHTML = \"\";\n appendChild(el, F);\n return elements;\n}\n\n/** an empty value */\nvar _ = 0;\n\nfunction copy(dest, src) {\n for (var k in src) {\n dest[k] = src[k];\n }\n return dest;\n}\n\nvar WORDS = 'words';\n\nvar wordPlugin = createPlugin(\n /*by: */ WORDS,\n /*depends: */ _,\n /*key: */ 'word', \n /*split: */ function(el) {\n return splitText(el, 'word', /\\s+/, 0, 1)\n }\n);\n\nvar CHARS = \"chars\";\n\nvar charPlugin = createPlugin(\n /*by: */ CHARS,\n /*depends: */ [WORDS],\n /*key: */ \"char\", \n /*split: */ function(el, options, ctx) {\n var results = [];\n\n each(ctx[WORDS], function(word, i) {\n results.push.apply(results, splitText(word, \"char\", \"\", options.whitespace && i));\n });\n\n return results;\n }\n);\n\n/**\n * # Splitting\n * \n * @param opts {import('./types').ISplittingOptions} \n */\nfunction Splitting (opts) {\n opts = opts || {};\n var key = opts.key;\n\n return $(opts.target || '[data-splitting]').map(function(el) {\n var ctx = el['ðŸŒ']; \n if (!opts.force && ctx) {\n return ctx;\n }\n\n ctx = el['ðŸŒ'] = { el: el };\n var items = resolve(opts.by || getData(el, 'splitting') || CHARS);\n var opts2 = copy({}, opts);\n each(items, function(plugin) {\n if (plugin.split) {\n var pluginBy = plugin.by;\n var key2 = (key ? '-' + key : '') + plugin.key;\n var results = plugin.split(el, opts2, ctx);\n key2 && index(el, key2, results);\n ctx[pluginBy] = results;\n el.classList.add(pluginBy);\n } \n });\n\n el.classList.add('splitting');\n return ctx;\n })\n}\n\n/**\n * # Splitting.html\n * \n * @param opts {import('./types').ISplittingOptions}\n */\nfunction html(opts) {\n opts = opts || {};\n var parent = opts.target = createElement();\n parent.innerHTML = opts.content;\n Splitting(opts);\n return parent.outerHTML\n}\n\nSplitting.html = html;\nSplitting.add = add;\n\nfunction detectGrid(el, options, side) {\n var items = $(options.matching || el.children, el);\n var c = {};\n\n each(items, function(w) {\n var val = Math.round(w[side]);\n (c[val] || (c[val] = [])).push(w);\n });\n\n return Object.keys(c).map(Number).sort(byNumber).map(selectFrom(c));\n}\n\nfunction byNumber(a, b) {\n return a - b;\n}\n\nvar linePlugin = createPlugin(\n /*by: */ 'lines',\n /*depends: */ [WORDS],\n /*key: */ 'line',\n /*split: */ function(el, options, ctx) {\n return detectGrid(el, { matching: ctx[WORDS] }, 'offsetTop')\n }\n);\n\nvar itemPlugin = createPlugin(\n /*by: */ 'items',\n /*depends: */ _,\n /*key: */ 'item', \n /*split: */ function(el, options) {\n return $(options.matching || el.children, el)\n }\n);\n\nvar rowPlugin = createPlugin(\n /*by: */ 'rows',\n /*depends: */ _,\n /*key: */ 'row', \n /*split: */ function(el, options) {\n return detectGrid(el, options, \"offsetTop\");\n }\n);\n\nvar columnPlugin = createPlugin(\n /*by: */ 'cols',\n /*depends: */ _,\n /*key: */ \"col\", \n /*split: */ function(el, options) {\n return detectGrid(el, options, \"offsetLeft\");\n }\n);\n\nvar gridPlugin = createPlugin(\n /*by: */ 'grid',\n /*depends: */ ['rows', 'cols']\n);\n\nvar LAYOUT = \"layout\";\n\nvar layoutPlugin = createPlugin(\n /*by: */ LAYOUT,\n /*depends: */ _,\n /*key: */ _,\n /*split: */ function(el, opts) {\n // detect and set options\n var rows = opts.rows = +(opts.rows || getData(el, 'rows') || 1);\n var columns = opts.columns = +(opts.columns || getData(el, 'columns') || 1);\n\n // Seek out the first <img> if the value is true \n opts.image = opts.image || getData(el, 'image') || el.currentSrc || el.src;\n if (opts.image) {\n var img = $(\"img\", el)[0];\n opts.image = img && (img.currentSrc || img.src);\n }\n\n // add optional image to background\n if (opts.image) {\n setProperty(el, \"background-image\", \"url(\" + opts.image + \")\");\n }\n\n var totalCells = rows * columns;\n var elements = [];\n\n var container = createElement(_, \"cell-grid\");\n while (totalCells--) {\n // Create a span\n var cell = createElement(container, \"cell\");\n createElement(cell, \"cell-inner\");\n elements.push(cell);\n }\n\n // Append elements back into the parent\n appendChild(el, container);\n\n return elements;\n }\n);\n\nvar cellRowPlugin = createPlugin(\n /*by: */ \"cellRows\",\n /*depends: */ [LAYOUT],\n /*key: */ \"row\",\n /*split: */ function(el, opts, ctx) {\n var rowCount = opts.rows;\n var result = Array2D(rowCount);\n\n each(ctx[LAYOUT], function(cell, i, src) {\n result[Math.floor(i / (src.length / rowCount))].push(cell);\n });\n\n return result;\n }\n);\n\nvar cellColumnPlugin = createPlugin(\n /*by: */ \"cellColumns\",\n /*depends: */ [LAYOUT],\n /*key: */ \"col\",\n /*split: */ function(el, opts, ctx) {\n var columnCount = opts.columns;\n var result = Array2D(columnCount);\n\n each(ctx[LAYOUT], function(cell, i) {\n result[i % columnCount].push(cell);\n });\n\n return result;\n }\n);\n\nvar cellPlugin = createPlugin(\n /*by: */ \"cells\",\n /*depends: */ ['cellRows', 'cellColumns'],\n /*key: */ \"cell\", \n /*split: */ function(el, opt, ctx) { \n // re-index the layout as the cells\n return ctx[LAYOUT];\n }\n);\n\n// install plugins\n// word/char plugins\nadd(wordPlugin);\nadd(charPlugin);\nadd(linePlugin);\n// grid plugins\nadd(itemPlugin);\nadd(rowPlugin);\nadd(columnPlugin);\nadd(gridPlugin);\n// cell-layout plugins\nadd(layoutPlugin);\nadd(cellRowPlugin);\nadd(cellColumnPlugin);\nadd(cellPlugin);\n\nreturn Splitting;\n\n})));\n"],"sourceRoot":""}