PageSourceSearch

https://aast.edu/template/en/main/js/webflow.js

js aast.edu collected 2026-10-01 11:29:01 UTC 155,790 bytes, 4,669 lines download raw bytes

1/*!
2 * Webflow: Front-end site library
3 * @license MIT
4 * Inline scripts may access the api using an async handler:
5 *   var Webflow = Webflow || [];
6 *   Webflow.push(readyFunction);
7 */
8/******/ (function(modules) { // webpackBootstrap
9/******/ 	// The module cache
10/******/ 	var installedModules = {};
11
12/******/ 	// The require function
13/******/ 	function __webpack_require__(moduleId) {
14
15/******/ 		// Check if module is in cache
16/******/ 		if(installedModules[moduleId])
17/******/ 			return installedModules[moduleId].exports;
18
19/******/ 		// Create a new module (and put it into the cache)
20/******/ 		var module = installedModules[moduleId] = {
21/******/ 			exports: {},
22/******/ 			id: moduleId,
23/******/ 			loaded: false
24/******/ 		};
25
26/******/ 		// Execute the module function
27/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
28
29/******/ 		// Flag the module as loaded
30/******/ 		module.loaded = true;
31
32/******/ 		// Return the exports of the module
33/******/ 		return module.exports;
34/******/ 	}
35
36
37/******/ 	// expose the modules object (__webpack_modules__)
38/******/ 	__webpack_require__.m = modules;
39
40/******/ 	// expose the module cache
41/******/ 	__webpack_require__.c = installedModules;
42
43/******/ 	// __webpack_public_path__
44/******/ 	__webpack_require__.p = "/";
45
46/******/ 	// Load entry module and return exports
47/******/ 	return __webpack_require__(0);
48/******/ })
49/************************************************************************/
50/******/ ([
51/* 0 */
52/***/ function(module, exports, __webpack_require__) {
53
54	__webpack_require__(5);
55	__webpack_require__(6);
56	__webpack_require__(7);
57	__webpack_require__(8);
58	__webpack_require__(9);
59	__webpack_require__(10);
60	__webpack_require__(11);
61	__webpack_require__(12);
62	__webpack_require__(1);
63	__webpack_require__(13);
64	__webpack_require__(14);
65	__webpack_require__(15);
66	__webpack_require__(16);
67	__webpack_require__(17);
68	__webpack_require__(18);
69	__webpack_require__(19);
70	module.exports = __webpack_require__(20);
71
72
73/***/ },
74/* 1 */
75/***/ function(module, exports, __webpack_require__) {
76
77	/* WEBPACK VAR INJECTION */(function(process) {'use strict';
78
79	/**
80	 * Webflow: Core site library
81	 */
82
83	var Webflow = {};
84	var modules = {};
85	var primary = [];
86	var secondary = window.Webflow || [];
87	var $ = window.jQuery;
88	var $win = $(window);
89	var $doc = $(document);
90	var isFunction = $.isFunction;
91	var _ = Webflow._ = __webpack_require__(21);
92	var tram = __webpack_require__(3) && $.tram;
93	var domready = false;
94	var destroyed = false;
95	var Modernizr = window.Modernizr;
96	tram.config.hideBackface = false;
97	tram.config.keepInherited = true;
98
99	/**
100	 * Webflow.define - Define a named module
101	 * @param  {string} name
102	 * @param  {function} factory
103	 * @param  {object} options
104	 * @return {object}
105	 */
106	Webflow.define = function(name, factory, options) {
107	  if (modules[name]) unbindModule(modules[name]);
108	  var instance = modules[name] = factory($, _, options) || {};
109	  bindModule(instance);
110	  return instance;
111	};
112
113	/**
114	 * Webflow.require - Require a named module
115	 * @param  {string} name
116	 * @return {object}
117	 */
118	Webflow.require = function(name) {
119	  return modules[name];
120	};
121
122	function bindModule(module) {
123	  // If running in Webflow app, subscribe to design/preview events
124	  if (Webflow.env()) {
125	    isFunction(module.design) && $win.on('__wf_design', module.design);
126	    isFunction(module.preview) && $win.on('__wf_preview', module.preview);
127	  }
128	  // Subscribe to front-end destroy event
129	  isFunction(module.destroy) && $win.on('__wf_destroy', module.destroy);
130	  // Look for ready method on module
131	  if (module.ready && isFunction(module.ready)) {
132	    addReady(module);
133	  }
134	}
135
136	function addReady(module) {
137	  // If domready has already happened, run ready method
138	  if (domready) {
139	    module.ready();
140	    return;
141	  }
142	  // Otherwise add ready method to the primary queue (only once)
143	  if (_.contains(primary, module.ready)) return;
144	  primary.push(module.ready);
145	}
146
147	function unbindModule(module) {
148	  // Unsubscribe module from window events
149	  isFunction(module.design) && $win.off('__wf_design', module.design);
150	  isFunction(module.preview) && $win.off('__wf_preview', module.preview);
151	  isFunction(module.destroy) && $win.off('__wf_destroy', module.destroy);
152	  // Remove ready method from primary queue
153	  if (module.ready && isFunction(module.ready)) {
154	    removeReady(module);
155	  }
156	}
157
158	function removeReady(module) {
159	  primary = _.filter(primary, function(readyFn) {
160	    return readyFn !== module.ready;
161	  });
162	}
163
164	/**
165	 * Webflow.push - Add a ready handler into secondary queue
166	 * @param {function} ready  Callback to invoke on domready
167	 */
168	Webflow.push = function(ready) {
169	  // If domready has already happened, invoke handler
170	  if (domready) {
171	    isFunction(ready) && ready();
172	    return;
173	  }
174	  // Otherwise push into secondary queue
175	  secondary.push(ready);
176	};
177
178	/**
179	 * Webflow.env - Get the state of the Webflow app
180	 * @param {string} mode [optional]
181	 * @return {boolean}
182	 */
183	Webflow.env = function(mode) {
184	  var designFlag = window.__wf_design;
185	  var inApp = typeof designFlag !== 'undefined';
186	  if (!mode) return inApp;
187	  if (mode === 'design') return inApp && designFlag;
188	  if (mode === 'preview') return inApp && !designFlag;
189	  if (mode === 'slug') return inApp && window.__wf_slug;
190	  if (mode === 'editor') return window.WebflowEditor;
191	  if (mode === 'test') return process.env.NODE_ENV === 'test' || window.__wf_test;
192	  if (mode === 'frame') return window !== window.top;
193	};
194
195	// Feature detects + browser sniffs  � _� 
196	var userAgent = navigator.userAgent.toLowerCase();
197	var appVersion = navigator.appVersion.toLowerCase();
198	var touch = Webflow.env.touch = ('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch;
199	var chrome = Webflow.env.chrome = /chrome/.test(userAgent) && /Google/.test(navigator.vendor) && parseInt(appVersion.match(/chrome\/(\d+)\./)[1], 10);
200	var ios = Webflow.env.ios = Modernizr && Modernizr.ios;
201	Webflow.env.safari = /safari/.test(userAgent) && !chrome && !ios;
202
203	// Maintain current touch target to prevent late clicks on touch devices
204	var touchTarget;
205	// Listen for both events to support touch/mouse hybrid devices
206	touch && $doc.on('touchstart mousedown', function(evt) {
207	  touchTarget = evt.target;
208	});
209
210	/**
211	 * Webflow.validClick - validate click target against current touch target
212	 * @param  {HTMLElement} clickTarget  Element being clicked
213	 * @return {Boolean}  True if click target is valid (always true on non-touch)
214	 */
215	Webflow.validClick = touch ? function(clickTarget) {
216	  return clickTarget === touchTarget || $.contains(clickTarget, touchTarget);
217	} : function() { return true; };
218
219	/**
220	 * Webflow.resize, Webflow.scroll - throttled event proxies
221	 */
222	var resizeEvents = 'resize.webflow orientationchange.webflow load.webflow';
223	var scrollEvents = 'scroll.webflow ' + resizeEvents;
224	Webflow.resize = eventProxy($win, resizeEvents);
225	Webflow.scroll = eventProxy($win, scrollEvents);
226	Webflow.redraw = eventProxy();
227
228	// Create a proxy instance for throttled events
229	function eventProxy(target, types) {
230
231	  // Set up throttled method (using custom frame-based _.throttle)
232	  var handlers = [];
233	  var proxy = {};
234	  proxy.up = _.throttle(function(evt) {
235	    _.each(handlers, function(h) { h(evt); });
236	  });
237
238	  // Bind events to target
239	  if (target && types) target.on(types, proxy.up);
240
241	  /**
242	   * Add an event handler
243	   * @param  {function} handler
244	   */
245	  proxy.on = function(handler) {
246	    if (typeof handler !== 'function') return;
247	    if (_.contains(handlers, handler)) return;
248	    handlers.push(handler);
249	  };
250
251	  /**
252	   * Remove an event handler
253	   * @param  {function} handler
254	   */
255	  proxy.off = function(handler) {
256	    // If no arguments supplied, clear all handlers
257	    if (!arguments.length) {
258	      handlers = [];
259	      return;
260	    }
261	    // Otherwise, remove handler from the list
262	    handlers = _.filter(handlers, function(h) {
263	      return h !== handler;
264	    });
265	  };
266
267	  return proxy;
268	}
269
270	// Webflow.location - Wrap window.location in api
271	Webflow.location = function(url) {
272	  window.location = url;
273	};
274
275	// Webflow.app - Designer-specific methods
276	Webflow.app = Webflow.env() ? {} : null;
277	if (Webflow.app) {
278
279	  // Trigger redraw for specific elements
280	  var redraw = new Event('__wf_redraw');
281	  Webflow.app.redrawElement = function(i, el) { el.dispatchEvent(redraw); };
282
283	  // Webflow.location - Re-route location change to trigger an event
284	  Webflow.location = function(url) {
285	    window.dispatchEvent(new CustomEvent('__wf_location', { detail: url }));
286	  };
287	}
288
289	// Webflow.ready - Call primary and secondary handlers
290	Webflow.ready = function() {
291	  domready = true;
292
293	  // Restore modules after destroy
294	  if (destroyed) {
295	    restoreModules();
296
297	  // Otherwise run primary ready methods
298	  } else {
299	    _.each(primary, callReady);
300	  }
301
302	  // Run secondary ready methods
303	  _.each(secondary, callReady);
304
305	  // Trigger resize
306	  Webflow.resize.up();
307	};
308
309	function callReady(readyFn) {
310	  isFunction(readyFn) && readyFn();
311	}
312
313	function restoreModules() {
314	  destroyed = false;
315	  _.each(modules, bindModule);
316	}
317
318	/**
319	 * Webflow.load - Add a window load handler that will run even if load event has already happened
320	 * @param  {function} handler
321	 */
322	var deferLoad;
323	Webflow.load = function(handler) {
324	  deferLoad.then(handler);
325	};
326
327	function bindLoad() {
328	  // Reject any previous deferred (to support destroy)
329	  if (deferLoad) {
330	    deferLoad.reject();
331	    $win.off('load', deferLoad.resolve);
332	  }
333	  // Create deferred and bind window load event
334	  deferLoad = new $.Deferred();
335	  $win.on('load', deferLoad.resolve);
336	}
337
338	// Webflow.destroy - Trigger a destroy event for all modules
339	Webflow.destroy = function(options) {
340	  options = options || {};
341	  destroyed = true;
342	  $win.triggerHandler('__wf_destroy');
343
344	  // Allow domready reset for tests
345	  if (options.domready != null) {
346	    domready = options.domready;
347	  }
348
349	  // Unbind modules
350	  _.each(modules, unbindModule);
351
352	  // Clear any proxy event handlers
353	  Webflow.resize.off();
354	  Webflow.scroll.off();
355	  Webflow.redraw.off();
356
357	  // Clear any queued ready methods
358	  primary = [];
359	  secondary = [];
360
361	  // If load event has not yet fired, replace the deferred
362	  if (deferLoad.state() === 'pending') bindLoad();
363	};
364
365	// Listen for domready
366	$(Webflow.ready);
367
368	// Listen for window.onload and resolve deferred
369	bindLoad();
370
371	// Export commonjs module
372	module.exports = window.Webflow = Webflow;
373
374	/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
375
376/***/ },
377/* 2 */
378/***/ function(module, exports) {
379
380	'use strict';
381
382	/**
383	 * Webflow: IX Event triggers for other modules
384	 */
385
386	var $ = window.jQuery;
387	var api = {};
388	var eventQueue = [];
389	var namespace = '.w-ix';
390
391	var eventTriggers = {
392	  reset: function(i, el) {
393	    el.__wf_intro = null;
394	  },
395	  intro: function(i, el) {
396	    if (el.__wf_intro) return;
397	    el.__wf_intro = true;
398	    $(el).triggerHandler(api.types.INTRO);
399	  },
400	  outro: function(i, el) {
401	    if (!el.__wf_intro) return;
402	    el.__wf_intro = null;
403	    $(el).triggerHandler(api.types.OUTRO);
404	  }
405	};
406
407	api.triggers = {};
408
409	api.types = {
410	  INTRO: 'w-ix-intro' + namespace,
411	  OUTRO: 'w-ix-outro' + namespace
412	};
413
414	// Trigger any events in queue + restore trigger methods
415	api.init = function() {
416	  var count = eventQueue.length;
417	  for (var i = 0; i < count; i++) {
418	    var memo = eventQueue[i];
419	    memo[0](0, memo[1]);
420	  }
421	  eventQueue = [];
422	  $.extend(api.triggers, eventTriggers);
423	};
424
425	// Replace all triggers with async wrapper to queue events until init
426	api.async = function() {
427	  for (var key in eventTriggers) {
428	    var func = eventTriggers[key];
429	    if (!eventTriggers.hasOwnProperty(key)) continue;
430
431	    // Replace trigger method with async wrapper
432	    api.triggers[key] = function(i, el) {
433	      eventQueue.push([func, el]);
434	    };
435	  }
436	};
437
438	// Default triggers to async queue
439	api.async();
440
441	module.exports = api;
442
443
444/***/ },
445/* 3 */
446/***/ function(module, exports) {
447
448	/*!
449	 * tram.js v0.8.1-global
450	 * Cross-browser CSS3 transitions in JavaScript
451	 * https://github.com/bkwld/tram
452	 * MIT License
453	 */
454	window.tram=function(a){function b(a,b){var c=new L.Bare;return c.init(a,b)}function c(a){return a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function d(a){var b=parseInt(a.slice(1),16),c=b>>16&255,d=b>>8&255,e=255&b;return[c,d,e]}function e(a,b,c){return"#"+(1<<24|a<<16|b<<8|c).toString(16).slice(1)}function f(){}function g(a,b){_("Type warning: Expected: ["+a+"] Got: ["+typeof b+"] "+b)}function h(a,b,c){_("Units do not match ["+a+"]: "+b+", "+c)}function i(a,b,c){if(void 0!==b&&(c=b),void 0===a)return c;var d=c;return Z.test(a)||!$.test(a)?d=parseInt(a,10):$.test(a)&&(d=1e3*parseFloat(a)),0>d&&(d=0),d===d?d:c}function j(a){for(var b=-1,c=a?a.length:0,d=[];++b<c;){var e=a[b];e&&d.push(e)}return d}var k=function(a,b,c){function d(a){return"object"==typeof a}function e(a){return"function"==typeof a}function f(){}function g(h,i){function j(){var a=new k;return e(a.init)&&a.init.apply(a,arguments),a}function k(){}i===c&&(i=h,h=Object),j.Bare=k;var l,m=f[a]=h[a],n=k[a]=j[a]=new f;return n.constructor=j,j.mixin=function(b){return k[a]=j[a]=g(j,b)[a],j},j.open=function(a){if(l={}
454,e(a)?l=a.call(j,n,m,j,h):d(a)&&(l=a),d(l))for(var c in l)b.call(l,c)&&(n[c]=l[c]);return e(n.init)||(n.init=h),j},j.open(i)}return g}("prototype",{}.hasOwnProperty),l={ease:["ease",function(a,b,c,d){var e=(a/=d)*a,f=e*a;return b+c*(-2.75*f*e+11*e*e+-15.5*f+8*e+.25*a)}],"ease-in":["ease-in",function(a,b,c,d){var e=(a/=d)*a,f=e*a;return b+c*(-1*f*e+3*e*e+-3*f+2*e)}],"ease-out":["ease-out",function(a,b,c,d){var e=(a/=d)*a,f=e*a;return b+c*(.3*f*e+-1.6*e*e+2.2*f+-1.8*e+1.9*a)}],"ease-in-out":["ease-in-out",function(a,b,c,d){var e=(a/=d)*a,f=e*a;return b+c*(2*f*e+-5*e*e+2*f+2*e)}],linear:["linear",function(a,b,c,d){return c*a/d+b}],"ease-in-quad":["cubic-bezier(0.550, 0.085, 0.680, 0.530)",function(a,b,c,d){return c*(a/=d)*a+b}],"ease-out-quad":["cubic-bezier(0.250, 0.460, 0.450, 0.940)",function(a,b,c,d){return-c*(a/=d)*(a-2)+b}],"ease-in-out-quad":["cubic-bezier(0.455, 0.030, 0.515, 0.955)",function(a,b,c,d){return(a/=d/2)<1?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b}],"ease-in-cubic":["cubic-bezier(0.550, 0.055, 0.675, 0.190)",function(a,b,c,d){return c*(a/=d)*a*a+b}],"ease-out-cubic":["cubic-bezier(0.215, 0.610, 0.355, 1)",function(a,b,c,d){return c*((a=a/d-1)*a*a+1)+b}],"ease-in-out-cubic":["cubic-bezier(0.645, 0.045, 0.355, 1)",function(a,b,c,d){return(a/=d/2)<1?c/2*a*a*a+b:c/2*((a-=2)*a*a+2)+b}],"ease-in-quart":["cubic-bezier(0.895, 0.030, 0.685, 0.220)",function(a,b,c,d){return c*(a/=d)*a*a*a+b}],"ease-out-quart":["cubic-bezier(0.165, 0.840, 0.440, 1)",function(a,b,c,d){return-c*((a=a/d-1)*a*a*a-1)+b}],"ease-in-out-quart":["cubic-bezier(0.770, 0, 0.175, 1)",function(a,b,c,d){return(a/=d/2)<1?c/2*a*a*a*a+b:-c/2*((a-=2)*a*a*a-2)+b}],"ease-in-quint":["cubic-bezier(0.755, 0.050, 0.855, 0.060)",function(a,b,c,d){return c*(a/=d)*a*a*a*a+b}],"ease-out-quint":["cubic-bezier(0.230, 1, 0.320, 1)",function(a,b,c,d){return c*((a=a/d-1)*a*a*a*a+1)+b}],"ease-in-out-quint":["cubic-bezier(0.860, 0, 0.070, 1)",function(a,b,c,d){return(a/=d/2)<1?c/2*a*a*a*a*a+b:c/2*((a-=2)*a*a*a*a+2)+b}],"ease-in-sine":["cubic-bezier(0.470, 0, 0.745, 0.715)",function(a,b,c,d){return-c*Math.cos(a/d*(Math.PI/2))+c+b}],"ease-out-sine":["cubic-bezier(0.390, 0.575, 0.565, 1)",function(a,b,c,d){return c*Math.sin(a/d*(Math.PI/2))+b}],"ease-in-out-sine":["cubic-bezier(0.445, 0.050, 0.550, 0.950)",function(a,b,c,d){return-c/2*(Math.cos(Math.PI*a/d)-1)+b}],"ease-in-expo":["cubic-bezier(0.950, 0.050, 0.795, 0.035)",function(a,b,c,d){return 0===a?b:c*Math.pow(2,10*(a/d-1))+b}],"ease-out-expo":["cubic-bezier(0.190, 1, 0.220, 1)",function(a,b,c,d){return a===d?b+c:c*(-Math.pow(2,-10*a/d)+1)+b}],"ease-in-out-expo":["cubic-bezier(1, 0, 0, 1)",function(a,b,c,d){return 0===a?b:a===d?b+c:(a/=d/2)<1?c/2*Math.pow(2,10*(a-1))+b:c/2*(-Math.pow(2,-10*--a)+2)+b}],"ease-in-circ":["cubic-bezier(0.600, 0.040, 0.980, 0.335)",function(a,b,c,d){return-c*(Math.sqrt(1-(a/=d)*a)-1)+b}],"ease-out-circ":["cubic-bezier(0.075, 0.820, 0.165, 1)",function(a,b,c,d){return c*Math.sqrt(1-(a=a/d-1)*a)+b}],"ease-in-out-circ":["cubic-bezier(0.785, 0.135, 0.150, 0.860)",function(a,b,c,d){return(a/=d/2)<1?-c/2*(Math.sqrt(1-a*a)-1)+b:c/2*(Math.sqrt(1-(a-=2)*a)+1)+b}],"ease-in-back":["cubic-bezier(0.600, -0.280, 0.735, 0.045)",function(a,b,c,d,e){return void 0===e&&(e=1.70158),c*(a/=d)*a*((e+1)*a-e)+b}],"ease-out-back":["cubic-bezier(0.175, 0.885, 0.320, 1.275)",function(a,b,c,d,e){return void 0===e&&(e=1.70158),c*((a=a/d-1)*a*((e+1)*a+e)+1)+b}],"ease-in-out-back":["cubic-bezier(0.680, -0.550, 0.265, 1.550)",function(a,b,c,d,e){return void 0===e&&(e=1.70158),(a/=d/2)<1?c/2*a*a*(((e*=1.525)+1)*a-e)+b:c/2*((a-=2)*a*(((e*=1.525)+1)*a+e)+2)+b}]},m={"ease-in-back":"cubic-bezier(0.600, 0, 0.735, 0.045)","ease-out-back":"cubic-bezier(0.175, 0.885, 0.320, 1)","ease-in-out-back":"cubic-bezier(0.680, 0, 0.265, 1)"},n=document,o=window,p="bkwld-tram",q=/[\-\.0-9]/g,r=/[A-Z]/,s="number",t=/^(rgb|#)/,u=/(em|cm|mm|in|pt|pc|px)$/,v=/(em|cm|mm|in|pt|pc|px|%)$/,w=/(deg|rad|turn)$/,x="unitless",y=/(all|none) 0s ease 0s/,z=/^(width|height)$/,A=" ",B=n.createElement("a"),C=["Webkit","Moz","O","ms"],D=["-webkit-","-moz-","-o-","-ms-"],E=function(a){if
454(a in B.style)return{dom:a,css:a};var b,c,d="",e=a.split("-");for(b=0;b<e.length;b++)d+=e[b].charAt(0).toUpperCase()+e[b].slice(1);for(b=0;b<C.length;b++)if(c=C[b]+d,c in B.style)return{dom:c,css:D[b]+a}},F=b.support={bind:Function.prototype.bind,transform:E("transform"),transition:E("transition"),backface:E("backface-visibility"),timing:E("transition-timing-function")};if(F.transition){var G=F.timing.dom;if(B.style[G]=l["ease-in-back"][0],!B.style[G])for(var H in m)l[H][0]=m[H]}var I=b.frame=function(){var a=o.requestAnimationFrame||o.webkitRequestAnimationFrame||o.mozRequestAnimationFrame||o.oRequestAnimationFrame||o.msRequestAnimationFrame;return a&&F.bind?a.bind(o):function(a){o.setTimeout(a,16)}}(),J=b.now=function(){var a=o.performance,b=a&&(a.now||a.webkitNow||a.msNow||a.mozNow);return b&&F.bind?b.bind(a):Date.now||function(){return+new Date}}(),K=k(function(b){function d(a,b){var c=j((""+a).split(A)),d=c[0];b=b||{};var e=X[d];if(!e)return _("Unsupported property: "+d);if(!b.weak||!this.props[d]){var f=e[0],g=this.props[d];return g||(g=this.props[d]=new f.Bare),g.init(this.$el,c,e,b),g}}function e(a,b,c){if(a){var e=typeof a;if(b||(this.timer&&this.timer.destroy(),this.queue=[],this.active=!1),"number"==e&&b)return this.timer=new R({duration:a,context:this,complete:h}),void(this.active=!0);if("string"==e&&b){switch(a){case"hide":n.call(this);break;case"stop":k.call(this);break;case"redraw":o.call(this);break;default:d.call(this,a,c&&c[1])}return h.call(this)}if("function"==e)return void a.call(this,this);if("object"==e){var f=0;t.call(this,a,function(a,b){a.span>f&&(f=a.span),a.stop(),a.animate(b)},function(a){"wait"in a&&(f=i(a.wait,0))}),s.call(this),f>0&&(this.timer=new R({duration:f,context:this}),this.active=!0,b&&(this.timer.complete=h));var g=this,j=!1,l={};I(function(){t.call(g,a,function(a){a.active&&(j=!0,l[a.name]=a.nextStyle)}),j&&g.$el.css(l)})}}}function f(a){a=i(a,0),this.active?this.queue.push({options:a}):(this.timer=new R({duration:a,context:this,complete:h}),this.active=!0)}function g(a){return this.active?(this.queue.push({options:a,args:arguments}),void(this.timer.complete=h)):_("No active transition timer. Use start() or wait() before then().")}function h(){if(this.timer&&this.timer.destroy(),this.active=!1,this.queue.length){var a=this.queue.shift();e.call(this,a.options,!0,a.args)}}function k(a){this.timer&&this.timer.destroy(),this.queue=[],this.active=!1;var b;"string"==typeof a?(b={},b[a]=1):b="object"==typeof a&&null!=a?a:this.props,t.call(this,b,u),s.call(this)}function l(a){k.call(this,a),t.call(this,a,v,w)}function m(a){"string"!=typeof a&&(a="block"),this.el.style.display=a}function n(){k.call(this),this.el.style.display="none"}function o(){this.el.offsetHeight}function q(){k.call(this),a.removeData(this.el,p),this.$el=this.el=null}function s(){var a,b,c=[];this.upstream&&c.push(this.upstream);for(a in this.props)b=this.props[a],b.active&&c.push(b.string);c=c.join(","),this.style!==c&&(this.style=c,this.el.style[F.transition.dom]=c)}function t(a,b,e){var f,g,h,i,j=b!==u,k={};for(f in a)h=a[f],f in Y?(k.transform||(k.transform={}),k.transform[f]=h):(r.test(f)&&(f=c(f)),f in X?k[f]=h:(i||(i={}),i[f]=h));for(f in k){if(h=k[f],g=this.props[f],!g){if(!j)continue;g=d.call(this,f)}b.call(this,g,h)}e&&i&&e.call(this,i)}function u(a){a.stop()}function v(a,b){a.set(b)}function w(a){this.$el.css(a)}function x(a,c){b[a]=function(){return this.children?z.call(this,c,arguments):(this.el&&c.apply(this,arguments),this)}}function z(a,b){var c,d=this.children.length;for(c=0;d>c;c++)a.apply(this.children[c],b);return this}b.init=function(b){if(this.$el=a(b),this.el=this.$el[0],this.props={},this.queue=[],this.style="",this.active=!1,T.keepInherited&&!T.fallback){var c=V(this.el,"transition");c&&!y.test(c)&&(this.upstream=c)}F.backface&&T.hideBackface&&U(this.el,F.backface.css,"hidden")},x("add",d),x("start",e),x("wait",f),x("then",g),x("next",h),x("stop",k),x("set",l),x("show",m),x("hide",n),x("redraw",o),x("destroy",q)}),L=k(K,function(b){function c(b,c){var d=a.data(b,p)||a.data(b,p,new K.Bare);return d.el||d.init(b),c?d.start(c):d}b.init=function(b,d){var e=a(b);if(!e.length)return this;if(1===e.length)return c(e[0],d);var f=[];return e.each(function(a,b){f.push(c(b,d))}),this.children=f,this}}),M=k(function(a){function b(){var a=this.get();this.update("auto");var b=this.get();return this.update(a),b}function c(a,b,c){return void 0!==b&&(c=b),a in l?a:c}function d(a){var b=/rgba?\((\d+),\s*(\d+),\s*(\d+)/.exec(a);return(b?e(b[1],b[2],b[3]):a).replace(/#(\w)(\w)(\w)$/,"#$1$1$2$2$3$3")}var f={duration:500,ease:"ease",delay:0};a.init=function(a,b,d,e){this.$el=a,this.el=a[0];var g=b[0];d[2]&&(g=d[2]),W[g]&&(g=W[g]),this.name=g,this.type=d[1],this.duration=i(b[1],this.duration,f.duration),this.ease=c(b[2],this.ease,f.ease),this.delay=i(b[3],this.delay,f.delay),this.span=this.duration+this.delay,this.active=!1,this.nextStyle=null,this.auto=z.test(this.name),this.unit=e.unit||this.unit||T.defaultUnit,this.angle=e.angle||this.angle||T.defaultAngle,T.fallback||e.fallback?this.animate=this.fallback:(this.animate=this.transition,this.string=this.name+A+this.duration+"ms"+("ease"!=this.ease?A+l[this.ease][0]:"")+(this.delay?A+this.delay+"ms":""))},a.set=function(a){a=this.convert(a,this.type),this.update(a),this.redraw()},a.transition=function(a){this.active=!0,a=this.convert(a,this.type),this.auto&&("auto"==this.el.style[this.name]&&(this.update(this.get()),this.redraw()),"auto"==a&&(a=b.call(this))),this.nextStyle=a},a.fallback=function(a){var c=this.el.style[this.name]||this.convert(this.get(),this.type);a=this.convert(a,this.type),this.auto&&("auto"==c&&(c=this.convert(this.get(),this.type)),"auto"==a&&(a=b.call(this))),this.tween=new Q({from:c,to:a,duration:this.duration,delay:this.delay,ease:this.ease,update:this.update,context:this})},a.get=function(){return V(this.el,this.name)},a.update=function(a){U(this.el,this.name,a)},a.stop=function(){(this.active||this.nextStyle)&&(this.active=!1,this.nextStyle=null,U(this.el,this.name,this.get()));var a=this.tween;a&&a.context&&a.destroy()},a.convert=function(a,b){if("auto"==a&&this.auto)return a;var c,e="number"==typeof a,f="string"==typeof a;switch(b){case s:if(e)return a;
454if(f&&""===a.replace(q,""))return+a;c="number(unitless)";break;case t:if(f){if(""===a&&this.original)return this.original;if(b.test(a))return"#"==a.charAt(0)&&7==a.length?a:d(a)}c="hex or rgb string";break;case u:if(e)return a+this.unit;if(f&&b.test(a))return a;c="number(px) or string(unit)";break;case v:if(e)return a+this.unit;if(f&&b.test(a))return a;c="number(px) or string(unit or %)";break;case w:if(e)return a+this.angle;if(f&&b.test(a))return a;c="number(deg) or string(angle)";break;case x:if(e)return a;if(f&&v.test(a))return a;c="number(unitless) or string(unit or %)"}return g(c,a),a},a.redraw=function(){this.el.offsetHeight}}),N=k(M,function(a,b){a.init=function(){b.init.apply(this,arguments),this.original||(this.original=this.convert(this.get(),t))}}),O=k(M,function(a,b){a.init=function(){b.init.apply(this,arguments),this.animate=this.fallback},a.get=function(){return this.$el[this.name]()},a.update=function(a){this.$el[this.name](a)}}),P=k(M,function(a,b){function c(a,b){var c,d,e,f,g;for(c in a)f=Y[c],e=f[0],d=f[1]||c,g=this.convert(a[c],e),b.call(this,d,g,e)}a.init=function(){b.init.apply(this,arguments),this.current||(this.current={},Y.perspective&&T.perspective&&(this.current.perspective=T.perspective,U(this.el,this.name,this.style(this.current)),this.redraw()))},a.set=function(a){c.call(this,a,function(a,b){this.current[a]=b}),U(this.el,this.name,this.style(this.current)),this.redraw()},a.transition=function(a){var b=this.values(a);this.tween=new S({current:this.current,values:b,duration:this.duration,delay:this.delay,ease:this.ease});var c,d={};for(c in this.current)d[c]=c in b?b[c]:this.current[c];this.active=!0,this.nextStyle=this.style(d)},a.fallback=function(a){var b=this.values(a);this.tween=new S({current:this.current,values:b,duration:this.duration,delay:this.delay,ease:this.ease,update:this.update,context:this})},a.update=function(){U(this.el,this.name,this.style(this.current))},a.style=function(a){var b,c="";for(b in a)c+=b+"("+a[b]+") ";return c},a.values=function(a){var b,d={};return c.call(this,a,function(a,c,e){d[a]=c,void 0===this.current[a]&&(b=0,~a.indexOf("scale")&&(b=1),this.current[a]=this.convert(b,e))}),d}}),Q=k(function(b){function c(a){1===n.push(a)&&I(g)}function g(){var a,b,c,d=n.length;if(d)for(I(g),b=J(),a=d;a--;)c=n[a],c&&c.render(b)}function i(b){var c,d=a.inArray(b,n);d>=0&&(c=n.slice(d+1),n.length=d,c.length&&(n=n.concat(c)))}function j(a){return Math.round(a*o)/o}function k(a,b,c){return e(a[0]+c*(b[0]-a[0]),a[1]+c*(b[1]-a[1]),a[2]+c*(b[2]-a[2]))}var m={ease:l.ease[1],from:0,to:1};b.init=function(a){this.duration=a.duration||0,this.delay=a.delay||0;var b=a.ease||m.ease;l[b]&&(b=l[b][1]),"function"!=typeof b&&(b=m.ease),this.ease=b,this.update=a.update||f,this.complete=a.complete||f,this.context=a.context||this,this.name=a.name;var c=a.from,d=a.to;void 0===c&&(c=m.from),void 0===d&&(d=m.to),this.unit=a.unit||"","number"==typeof c&&"number"==typeof d?(this.begin=c,this.change=d-c):this.format(d,c),this.value=this.begin+this.unit,this.start=J(),a.autoplay!==!1&&this.play()},b.play=function(){this.active||(this.start||(this.start=J()),this.active=!0,c(this))},b.stop=function(){this.active&&(this.active=!1,i(this))},b.render=function(a){var b,c=a-this.start;if(this.delay){if(c<=this.delay)return;c-=this.delay}if(c<this.duration){var d=this.ease(c,0,1,this.duration);return b=this.startRGB?k(this.startRGB,this.endRGB,d):j(this.begin+d*this.change),this.value=b+this.unit,void this.update.call(this.context,this.value)}b=this.endHex||this.begin+this.change,this.value=b+this.unit,this.update.call(this.context,this.value),this.complete.call(this.context),this.destroy()},b.format=function(a,b){if(b+="",a+="","#"==a.charAt(0))return this.startRGB=d(b),this.endRGB=d(a),this.endHex=a,this.begin=0,void(this.change=1);if(!this.unit){var c=b.replace(q,""),e=a.replace(q,"");c!==e&&h("tween",b,a),this.unit=c}b=parseFloat(b),a=parseFloat(a),this.begin=this.value=b,this.change=a-b},b.destroy=function(){this.stop(),this.context=null,this.ease=this.update=this.complete=f};var n=[],o=1e3}),R=k(Q,function(a){a.init=function(a){this.duration=a.duration||0,this.complete=a.complete||f,this.context=a.context,this.play()},a.render=function(a){var b=a-this.start;b<this.duration||(this.complete.call(this.context),this.destroy())}}),S=k(Q,function(a,b){a.init=function(a){this.context=a.context,this.update=a.update,this.tweens=[],this.current=a.current;var b,c;for(b in a.values)c=a.values[b],this.current[b]!==c&&this.tweens.push(new Q({name:b,from:this.current[b],to:c,duration:a.duration,delay:a.delay,ease:a.ease,autoplay:!1}));this.play()},a.render=function(a){var b,c,d=this.tweens.length,e=!1;for(b=d;b--;)c=this.tweens[b],c.context&&(c.render(a),this.current[c.name]=c.value,e=!0);return e?void(this.update&&this.update.call(this.context)):this.destroy()},a.destroy=function(){if(b.destroy.call(this),this.tweens){var a,c=this.tweens.length;for(a=c;a--;)this.tweens[a].destroy();this.tweens=null,this.current=null}}}),T=b.config={defaultUnit:"px",defaultAngle:"deg",keepInherited:!1,hideBackface:!1,perspective:"",fallback:!F.transition,agentTests:[]};
454b.fallback=function(a){if(!F.transition)return T.fallback=!0;T.agentTests.push("("+a+")");var b=new RegExp(T.agentTests.join("|"),"i");T.fallback=b.test(navigator.userAgent)},b.fallback("6.0.[2-5] Safari"),b.tween=function(a){return new Q(a)},b.delay=function(a,b,c){return new R({complete:b,duration:a,context:c})},a.fn.tram=function(a){return b.call(null,this,a)};var U=a.style,V=a.css,W={transform:F.transform&&F.transform.css},X={color:[N,t],background:[N,t,"background-color"],"outline-color":[N,t],"border-color":[N,t],"border-top-color":[N,t],"border-right-color":[N,t],"border-bottom-color":[N,t],"border-left-color":[N,t],"border-width":[M,u],"border-top-width":[M,u],"border-right-width":[M,u],"border-bottom-width":[M,u],"border-left-width":[M,u],"border-spacing":[M,u],"letter-spacing":[M,u],margin:[M,u],"margin-top":[M,u],"margin-right":[M,u],"margin-bottom":[M,u],"margin-left":[M,u],padding:[M,u],"padding-top":[M,u],"padding-right":[M,u],"padding-bottom":[M,u],"padding-left":[M,u],"outline-width":[M,u],opacity:[M,s],top:[M,v],right:[M,v],bottom:[M,v],left:[M,v],"font-size":[M,v],"text-indent":[M,v],"word-spacing":[M,v],width:[M,v],"min-width":[M,v],"max-width":[M,v],height:[M,v],"min-height":[M,v],"max-height":[M,v],"line-height":[M,x],"scroll-top":[O,s,"scrollTop"],"scroll-left":[O,s,"scrollLeft"]},Y={};F.transform&&(X.transform=[P],Y={x:[v,"translateX"],y:[v,"translateY"],rotate:[w],rotateX:[w],rotateY:[w],scale:[s],scaleX:[s],scaleY:[s],skew:[w],skewX:[w],skewY:[w]}),F.transform&&F.backface&&(Y.z=[v,"translateZ"],Y.rotateZ=[w],Y.scaleZ=[s],Y.perspective=[u]);var Z=/ms/,$=/s|\./,_=function(){var a="warn",b=window.console;return b&&b[a]?function(c){b[a](c)}:f}();return a.tram=b}(window.jQuery);
455
456
457/***/ },
458/* 4 */
459/***/ function(module, exports) {
460
461	// shim for using process in browser
462	var process = module.exports = {};
463
464	// cached from whatever global is present so that test runners that stub it
465	// don't break things.  But we need to wrap it in a try catch in case it is
466	// wrapped in strict mode code which doesn't define any globals.  It's inside a
467	// function because try/catches deoptimize in certain engines.
468
469	var cachedSetTimeout;
470	var cachedClearTimeout;
471
472	(function () {
473	    try {
474	        cachedSetTimeout = setTimeout;
475	    } catch (e) {
476	        cachedSetTimeout = function () {
477	            throw new Error('setTimeout is not defined');
478	        }
479	    }
480	    try {
481	        cachedClearTimeout = clearTimeout;
482	    } catch (e) {
483	        cachedClearTimeout = function () {
484	            throw new Error('clearTimeout is not defined');
485	        }
486	    }
487	} ())
488	function runTimeout(fun) {
489	    if (cachedSetTimeout === setTimeout) {
490	        //normal enviroments in sane situations
491	        return setTimeout(fun, 0);
492	    }
493	    try {
494	        // when when somebody has screwed with setTimeout but no I.E. maddness
495	        return cachedSetTimeout(fun, 0);
496	    } catch(e){
497	        try {
498	            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
499	            return cachedSetTimeout.call(null, fun, 0);
500	        } catch(e){
501	            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
502	            return cachedSetTimeout.call(this, fun, 0);
503	        }
504	    }
505
506
507	}
508	function runClearTimeout(marker) {
509	    if (cachedClearTimeout === clearTimeout) {
510	        //normal enviroments in sane situations
511	        return clearTimeout(marker);
512	    }
513	    try {
514	        // when when somebody has screwed with setTimeout but no I.E. maddness
515	        return cachedClearTimeout(marker);
516	    } catch (e){
517	        try {
518	            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
519	            return cachedClearTimeout.call(null, marker);
520	        } catch (e){
521	            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
522	            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
523	            return cachedClearTimeout.call(this, marker);
524	        }
525	    }
526
527
528
529	}
530	var queue = [];
531	var draining = false;
532	var currentQueue;
533	var queueIndex = -1;
534
535	function cleanUpNextTick() {
536	    if (!draining || !currentQueue) {
537	        return;
538	    }
539	    draining = false;
540	    if (currentQueue.length) {
541	        queue = currentQueue.concat(queue);
542	    } else {
543	        queueIndex = -1;
544	    }
545	    if (queue.length) {
546	        drainQueue();
547	    }
548	}
549
550	function drainQueue() {
551	    if (draining) {
552	        return;
553	    }
554	    var timeout = runTimeout(cleanUpNextTick);
555	    draining = true;
556
557	    var len = queue.length;
558	    while(len) {
559	        currentQueue = queue;
560	        queue = [];
561	        while (++queueIndex < len) {
562	            if (currentQueue) {
563	                currentQueue[queueIndex].run();
564	            }
565	        }
566	        queueIndex = -1;
567	        len = queue.length;
568	    }
569	    currentQueue = null;
570	    draining = false;
571	    runClearTimeout(timeout);
572	}
573
574	process.nextTick = function (fun) {
575	    var args = new Array(arguments.length - 1);
576	    if (arguments.length > 1) {
577	        for (var i = 1; i < arguments.length; i++) {
578	            args[i - 1] = arguments[i];
579	        }
580	    }
581	    queue.push(new Item(fun, args));
582	    if (queue.length === 1 && !draining) {
583	        runTimeout(drainQueue);
584	    }
585	};
586
587	// v8 likes predictible objects
588	function Item(fun, array) {
589	    this.fun = fun;
590	    this.array = array;
591	}
592	Item.prototype.run = function () {
593	    this.fun.apply(null, this.array);
594	};
595	process.title = 'browser';
596	process.browser = true;
597	process.env = {};
598	process.argv = [];
599	process.version = ''; // empty string to avoid regexp issues
600	process.versions = {};
601
602	function noop() {}
603
604	process.on = noop;
605	process.addListener = noop;
606	process.once = noop;
607	process.off = noop;
608	process.removeListener = noop;
609	process.removeAllListeners = noop;
610	process.emit = noop;
611
612	process.binding = function (name) {
613	    throw new Error('process.binding is not supported');
614	};
615
616	process.cwd = function () { return '/' };
617	process.chdir = function (dir) {
618	    throw new Error('process.chdir is not supported');
619	};
620	process.umask = function() { return 0; };
621
622
623/***/ },
624/* 5 */
625/***/ function(module, exports, __webpack_require__) {
626
627	'use strict';
628
629	/**
630	 * Webflow: Background Video component
631	 */
632
633	var Webflow = __webpack_require__(1);
634
635	Webflow.define('backgroundVideo', module.exports = function ($, _) {
636	  var namespace = '.w-background-video';
637	  var doc = $(document);
638
639	  function ready () {
640	    var backgroundVideoNodes = $(document).find('.w-background-video');
641	    if (backgroundVideoNodes.length === 0) {
642	      return;
643	    }
644
645	    backgroundVideoNodes.each(function (_, node) {
646	      $(node).prepend(createVideoNode(node));
647	    });
648	  }
649
650	  function createVideoNode (nativeNode) {
651	    var nodeData = nativeNode.dataset;
652
653	    if (!nodeData.videoUrls) {
654	      return $('<video />');
655	    }
656
657	    // Prevent loading the videos on mobile browsers as its likely that they
658	    // are on low-bandwidth connections.
659	    if (Webflow.isMobile()) {
660	      return $('<video />').css('background-image', 'url(' + nodeData.posterUrl + ')');
661	    }
662
663	    var videoURLs = nodeData.videoUrls.split(',');
664	    var sourceNodes = videoURLs.map(function (url) {
665	      return $('<source />').attr({
666	        src: url,
667	        'data-wf-ignore': '',
668	      });
669	    });
670
671	    var videoNode = $('<video />').attr({
672	      autoplay: nodeData.autoplay,
673	      loop: nodeData.loop,
674	    })
675	    .css('background-image', 'url(' + nodeData.posterUrl + ')');
676
677	    videoNode.append(sourceNodes);
678
679	    return videoNode;
680	  }
681
682	  return { ready: ready };
683	});
684
685
686/***/ },
687/* 6 */
688/***/ function(module, exports, __webpack_require__) {
689
690	'use strict';
691
692	/**
693	 * Webflow: Brand pages on the subdomain
694	 */
695
696	var Webflow = __webpack_require__(1);
697
698	Webflow.define('brand', module.exports = function($, _) {
699	  var api = {};
700	  var $html = $('html');
701	  var $body = $('body');
702	  var location = window.location;
703	  var inApp = Webflow.env();
704
705	  // -----------------------------------
706	  // Module methods
707
708	  api.ready = function() {
709	    var doBranding = $html.attr('data-wf-status');
710	    var publishedDomain = $html.attr('data-wf-domain') || '';
711
712	    if (/\.webflow\.io$/i.test(publishedDomain) && location.hostname !== publishedDomain) {
713	      doBranding = true;
714	    }
715
716	    if (doBranding) {
717	      var $branding = $('<div></div>');
718	      var $link = $('<a></a>');
719	      $link.attr('href', 'http://webflow.com?utm_campaign=brandjs');
720
721	      $branding.css({
722	        position: 'fixed',
723	        bottom: 0,
724	        right: 0,
725	        zIndex: 2147483647,
726	        borderTopLeftRadius: '5px',
727	        backgroundColor: '#2b3239',
728	        padding: '8px 12px 5px 15px',
729	        fontFamily: 'Arial',
730	        fontSize: '10px',
731	        textTransform: 'uppercase',
732	        opacity: '0',
733	        transition: 'opacity 0.50s ease-in-out'
734	      });
735
736	      $link.css({
737	        color: '#AAADB0',
738	        textDecoration: 'none'
739	      });
740
741	      var $webflowLogo = $('<img>');
742	      $webflowLogo.attr('src', 'https://daks2k3a4ib2z.cloudfront.net/54153e6a3d25f2755b1f14ed/5445a4b1944ecdaa4df86d3e_subdomain-brand.svg');
743	      $webflowLogo.css({
744	        opacity: 0.9,
745	        width: '57px',
746	        verticalAlign: 'middle',
747	        paddingLeft: '4px',
748	        paddingBottom: '3px'
749	      });
750
751	      $branding.text('Built with');
752	      $branding.append($webflowLogo);
753	      $link.append($branding);
754
755	      $body.append($link);
756
757	      if (/PhantomJS/.test(window.navigator.userAgent)) {
758	        return;
759	      }
760
761	      $branding.css({
762	        opacity: '1.0'
763	      });
764	    }
765	  };
766
767	  // Export module
768	  return api;
769	});
770
771
772/***/ },
773/* 7 */
774/***/ function(module, exports, __webpack_require__) {
775
776	'use strict';
777
778	/**
779	 * Webflow: Dropdown component
780	 */
781
782	var Webflow = __webpack_require__(1);
783	var IXEvents = __webpack_require__(2);
784
785	Webflow.define('dropdown', module.exports = function($, _) {
786	  var api = {};
787	  var $doc = $(document);
788	  var $dropdowns;
789	  var designer;
790	  var inApp = Webflow.env();
791	  var touch = Webflow.env.touch;
792	  var namespace = '.w-dropdown';
793	  var stateOpen = 'w--open';
794	  var closeEvent = 'w-close' + namespace;
795	  var ix = IXEvents.triggers;
796
797	  // -----------------------------------
798	  // Module methods
799
800	  api.ready = api.design = api.preview = init;
801
802	  // -----------------------------------
803	  // Private methods
804
805	  function init() {
806	    designer = inApp && Webflow.env('design');
807
808	    // Find all instances on the page
809	    $dropdowns = $doc.find(namespace);
810	    $dropdowns.each(build);
811	  }
812
813	  function build(i, el) {
814	    var $el = $(el);
815
816	    // Store state in data
817	    var data = $.data(el, namespace);
818	    if (!data) data = $.data(el, namespace, { open: false, el: $el, config: {} });
819	    data.list = $el.children('.w-dropdown-list');
820	    data.toggle = $el.children('.w-dropdown-toggle');
821	    data.links = data.list.children('.w-dropdown-link');
822	    data.outside = outside(data);
823	    data.complete = complete(data);
824	    data.leave = leave(data);
825
826	    // Remove old events
827	    $el.off(namespace);
828	    data.toggle.off(namespace);
829
830	    // Set config from data attributes
831	    configure(data);
832
833	    if (data.nav) data.nav.off(namespace);
834	    data.nav = $el.closest('.w-nav');
835	    data.nav.on(closeEvent, handler(data));
836
837	    // Add events based on mode
838	    if (designer) {
839	      $el.on('setting' + namespace, handler(data));
840	    } else {
841	      data.toggle.on('tap' + namespace, toggle(data));
842	      if (data.config.hover) {
843	        data.toggle.on('mouseenter' + namespace, enter(data));
844	      }
845	      $el.on(closeEvent, handler(data));
846	      // Close in preview mode
847	      inApp && close(data);
848	    }
849	  }
850
851	  function configure(data) {
852	    data.config = {
853	      hover: Boolean(data.el.attr('data-hover')) && !touch,
854	      delay: Number(data.el.attr('data-delay')) || 0
855	    };
856	  }
857
858	  function handler(data) {
859	    return function(evt, options) {
860	      options = options || {};
861
862	      if (evt.type === 'w-close') {
863	        return close(data);
864	      }
865
866	      if (evt.type === 'setting') {
867	        configure(data);
868	        options.open === true && open(data, true);
869	        options.open === false && close(data, true);
870	        return;
871	      }
872	    };
873	  }
874
875	  function toggle(data) {
876	    return _.debounce(function() {
877	      data.open ? close(data) : open(data);
878	    });
879	  }
880
881	  function open(data) {
882	    if (data.open) return;
883	    closeOthers(data);
884	    data.open = true;
885	    data.list.addClass(stateOpen);
886	    data.toggle.addClass(stateOpen);
887	    ix.intro(0, data.el[0]);
888	    Webflow.redraw.up();
889
890	    // Listen for tap outside events
891	    if (!designer) $doc.on('tap' + namespace, data.outside);
892	    if (data.hovering) data.el.on('mouseleave' + namespace, data.leave);
893
894	    // Clear previous delay
895	    window.clearTimeout(data.delayId);
896	  }
897
898	  function close(data, immediate) {
899	    if (!data.open) return;
900
901	    // Do not close hover-based menus if currently hovering
902	    if (data.config.hover && data.hovering) return;
903
904	    data.open = false;
905	    var config = data.config;
906	    ix.outro(0, data.el[0]);
907
908	    // Stop listening for tap outside events
909	    $doc.off('tap' + namespace, data.outside);
910	    data.el.off('mouseleave' + namespace, data.leave);
911
912	    // Clear previous delay
913	    window.clearTimeout(data.delayId);
914
915	    // Skip delay during immediate
916	    if (!config.delay || immediate) return data.complete();
917
918	    // Optionally wait for delay before close
919	    data.delayId = window.setTimeout(data.complete, config.delay);
920	  }
921
922	  function closeOthers(data) {
923	    var self = data.el[0];
924	    $dropdowns.each(function(i, other) {
925	      var $other = $(other);
926	      if ($other.is(self) || $other.has(self).length) return;
927	      $other.triggerHandler(closeEvent);
928	    });
929	  }
930
931	  function outside(data) {
932	    // Unbind previous tap handler if it exists
933	    if (data.outside) $doc.off('tap' + namespace, data.outside);
934
935	    // Close menu when tapped outside
936	    return _.debounce(function(evt) {
937	      if (!data.open) return;
938	      var $target = $(evt.target);
939	      if ($target.closest('.w-dropdown-toggle').length) return;
940	      if (!data.el.is($target.closest(namespace))) {
941	        close(data);
942	      }
943	    });
944	  }
945
946	  function complete(data) {
947	    return function() {
948	      data.list.removeClass(stateOpen);
949	      data.toggle.removeClass(stateOpen);
950	    };
951	  }
952
953	  function enter(data) {
954	    return function() {
955	      data.hovering = true;
956	      open(data);
957	    };
958	  }
959
960	  function leave(data) {
961	    return function() {
962	      data.hovering = false;
963	      close(data);
964	    };
965	  }
966
967	  // Export module
968	  return api;
969	});
970
971
972/***/ },
973/* 8 */
974/***/ function(module, exports, __webpack_require__) {
975
976	'use strict';
977
978	/**
979	 * Webflow: Editor loader
980	 */
981
982	var Webflow = __webpack_require__(1);
983
984	Webflow.define('edit', module.exports = function($, _, options) {
985	  options = options || {};
986
987	  // Exit early in test env or when inside an iframe
988	  if (Webflow.env('test') || Webflow.env('frame')) {
989	    // Allow test fixtures to continue
990	    if (!options.fixture) {
991	      return {exit: 1};
992	    }
993	  }
994
995	  var api = {};
996	  var $win = $(window);
997	  var $html = $(document.documentElement);
998	  var location = document.location;
999	  var hashchange = 'hashchange';
1000	  var loaded;
1001	  var loadEditor = options.load || load;
1002	  var hasLocalStorage = false;
1003
1004	  try {
1005	    // Check localStorage for editor data
1006	    hasLocalStorage = localStorage && localStorage.getItem && localStorage.getItem('WebflowEditor');
1007	  } catch (e) {
1008	    // SecurityError: browser storage has been disabled
1009	  }
1010
1011	  if (hasLocalStorage) {
1012	    loadEditor();
1013
1014	  } else if (location.search) {
1015	    // Check url query for `edit` parameter or any url ending in `?edit`
1016	    if (/[?&](edit)(?:[=&?]|$)/.test(location.search) || /\?edit$/.test(location.href)) {
1017	      loadEditor();
1018	    }
1019
1020	  } else {
1021	    // Check hash fragment to support `#hash?edit`
1022	    $win.on(hashchange, checkHash).triggerHandler(hashchange);
1023	  }
1024
1025	  function checkHash() {
1026	    if (loaded) return;
1027	    // Load editor when hash contains `?edit`
1028	    if (/\?edit/.test(location.hash)) loadEditor();
1029	  }
1030
1031	  function load() {
1032	    loaded = true;
1033	    // Predefine global immediately to benefit Webflow.env
1034	    window.WebflowEditor = true;
1035	    $win.off(hashchange, checkHash);
1036	    $.ajax({
1037	      url: cleanSlashes(("https://editor-api.webflow.com") + '/api/editor/view'),
1038	      data: { siteId: $html.attr('data-wf-site') },
1039	      xhrFields: { withCredentials: true },
1040	      dataType: 'json',
1041	      crossDomain: true,
1042	      success: success
1043	    });
1044	  }
1045
1046	  function success(data) {
1047	    if (!data) {
1048	      console.error('Could not load editor data');
1049	      return;
1050	    }
1051	    getScript(prefix(data.scriptPath), function () {
1052	      window.WebflowEditor(data);
1053	    });
1054	  }
1055
1056	  function getScript(url, done) {
1057	    $.ajax({ type: 'GET', url: url, dataType: 'script', cache: true }).then(done, error);
1058	  }
1059
1060	  function error(jqXHR, textStatus, errorThrown) {
1061	    console.error('Could not load editor script: ' + textStatus);
1062	    throw errorThrown;
1063	  }
1064
1065	  function prefix(url) {
1066	    return (url.indexOf('//') >= 0) ? url : cleanSlashes(("https://editor-api.webflow.com") + url);
1067	  }
1068
1069	  function cleanSlashes(url) {
1070	    return url.replace(/([^:])\/\//g, '$1/');
1071	  }
1072
1073	  // Export module
1074	  return api;
1075	});
1076
1077
1078/***/ },
1079/* 9 */
1080/***/ function(module, exports) {
1081
1082	/**
1083	 * Returns a Boolean representing whether or not the client is a mobile browser.
1084	 *
1085	 * NOTE: Many thanks to detectmobilebrowsers.com for this user agent detection
1086	 * regex, without which the mobile internet probably wouldn't exist.
1087	 */
1088	Webflow.isMobile = function () {
1089	  var userAgent = navigator.userAgent || navigator.vendor || window.opera;
1090	  return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i
1091	         .test(userAgent) ||
1092	         /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|
1092sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i
1093	         .test(userAgent.substr(0, 4));
1094	}
1095
1096
1097/***/ },
1098/* 10 */
1099/***/ function(module, exports, __webpack_require__) {
1100
1101	/**
1102	 * Webflow: Forms
1103	 */
1104
1105	var Webflow = __webpack_require__(1);
1106
1107	Webflow.define('forms', module.exports = function($, _) {
1108	  var api = {};
1109
1110	  // Cross-Domain AJAX for IE8
1111	  __webpack_require__(22);
1112
1113	  var $doc = $(document);
1114	  var $forms;
1115	  var loc = window.location;
1116	  var retro = window.XDomainRequest && !window.atob;
1117	  var namespace = '.w-form';
1118	  var siteId;
1119	  var emailField = /e(\-)?mail/i;
1120	  var emailValue = /^\S+@\S+$/;
1121	  var alert = window.alert;
1122	  var listening;
1123
1124	  // MailChimp domains: list-manage.com + mirrors
1125	  var chimpRegex = /list-manage[1-9]?.com/i;
1126
1127	  var disconnected = _.debounce(function() {
1128	    alert('Oops! This page has improperly configured forms. Please contact your website administrator to fix this issue.');
1129	  }, 100);
1130
1131	  api.ready = function() {
1132	    // Init forms
1133	    init();
1134
1135	    // Wire document events once
1136	    if (!listening) addListeners();
1137	  };
1138
1139	  api.preview = api.design = function() {
1140	    init();
1141	  };
1142
1143	  function init() {
1144	    siteId = $('html').attr('data-wf-site');
1145
1146	    $forms = $(namespace + ' form');
1147	    if (!$forms.length) return;
1148	    $forms.each(build);
1149	  }
1150
1151	  function build(i, el) {
1152	    // Store form state using namespace
1153	    var $el = $(el);
1154	    var data = $.data(el, namespace);
1155	    if (!data) data = $.data(el, namespace, { form: $el }); // data.form
1156
1157	    reset(data);
1158	    var wrap = $el.closest('div.w-form');
1159	    data.done = wrap.find('> .w-form-done');
1160	    data.fail = wrap.find('> .w-form-fail');
1161
1162	    var action = data.action = $el.attr('action');
1163	    data.handler = null;
1164	    data.redirect = $el.attr('data-redirect');
1165
1166	    // MailChimp form
1167	    if (chimpRegex.test(action)) { data.handler = submitMailChimp; return; }
1168
1169	    // Custom form action
1170	    if (action) return;
1171
1172	    // Webflow form
1173	    if (siteId) { data.handler = submitWebflow; return; }
1174
1175	    // Alert for disconnected Webflow forms
1176	    disconnected();
1177	  }
1178
1179	  function addListeners() {
1180	    listening = true;
1181
1182	    // Handle form submission for Webflow forms
1183	    $doc.on('submit', namespace + ' form', function(evt) {
1184	      var data = $.data(this, namespace);
1185	      if (data.handler) {
1186	        data.evt = evt;
1187	        data.handler(data);
1188	      }
1189	    });
1190	  }
1191
1192	  // Reset data common to all submit handlers
1193	  function reset(data) {
1194	    var btn = data.btn = data.form.find(':input[type="submit"]');
1195	    data.wait = data.btn.attr('data-wait') || null;
1196	    data.success = false;
1197	    btn.prop('disabled', false);
1198	    data.label && btn.val(data.label);
1199	  }
1200
1201	  // Disable submit button
1202	  function disableBtn(data) {
1203	    var btn = data.btn;
1204	    var wait = data.wait;
1205	    btn.prop('disabled', true);
1206	    // Show wait text and store previous label
1207	    if (wait) {
1208	      data.label = btn.val();
1209	      btn.val(wait);
1210	    }
1211	  }
1212
1213	  // Find form fields, validate, and set value pairs
1214	  function findFields(form, result) {
1215	    var status = null;
1216	    result = result || {};
1217
1218	    // The ":input" selector is a jQuery shortcut to select all inputs, selects, textareas
1219	    form.find(':input:not([type="submit"])').each(function(i, el) {
1220	      var field = $(el);
1221	      var type = field.attr('type');
1222	      var name = field.attr('data-name') || field.attr('name') || ('Field ' + (i + 1));
1223	      var value = field.val();
1224
1225	      if (type === 'checkbox') {
1226	        value = field.is(':checked');
1227	      } if (type === 'radio') {
1228	        // Radio group value already processed
1229	        if (result[name] === null || typeof result[name] === 'string') {
1230	          return;
1231	        }
1232
1233	        value = form.find('input[name="' + field.attr('name') + '"]:checked').val() || null;
1234	      }
1235
1236	      if (typeof value === 'string') value = $.trim(value);
1237	      result[name] = value;
1238	      status = status || getStatus(field, type, name, value);
1239	    });
1240
1241	    return status;
1242	  }
1243
1244	  function getStatus(field, type, name, value) {
1245	    var status = null;
1246
1247	    if (type === 'password') {
1248	      status = 'Passwords cannot be submitted.';
1249	    } else if (field.attr('required')) {
1250	      if (!value) {
1251	        status = 'Please fill out the required field: ' + name;
1252	      } else if (emailField.test(name) || emailField.test(field.attr('type'))) {
1253	        if (!emailValue.test(value)) status = 'Please enter a valid email address for: ' + name;
1254	      }
1255	    }
1256
1257	    return status;
1258	  }
1259
1260	  // Submit form to Webflow
1261	  function submitWebflow(data) {
1262	    reset(data);
1263
1264	    var form = data.form;
1265	    var payload = {
1266	      name: form.attr('data-name') || form.attr('name') || 'Untitled Form',
1267	      source: loc.href,
1268	      test: Webflow.env(),
1269	      fields: {},
1270	      dolphin: /pass[\s-_]?(word|code)|secret|login|credentials/i.test(form.html())
1271	    };
1272
1273	    preventDefault(data);
1274
1275	    // Find & populate all fields
1276	    var status = findFields(form, payload.fields);
1277	    if (status) return alert(status);
1278
1279	    // Disable submit button
1280	    disableBtn(data);
1281
1282	    // Read site ID
1283	    // NOTE: If this site is exported, the HTML tag must retain the data-wf-site attribute for forms to work
1284	    if (!siteId) { afterSubmit(data); return; }
1285	    var url = ("https://webflow.com") + '/api/v1/form/' + siteId;
1286
1287	    // Work around same-protocol IE XDR limitation - without this IE9 and below forms won't submit
1288	    if (retro && url.indexOf(("https://webflow.com")) >= 0) {
1289	      url = url.replace(("https://webflow.com"), ("http://formdata.webflow.com"));
1290	    }
1291
1292	    $.ajax({
1293	      url: url,
1294	      type: 'POST',
1295	      data: payload,
1296	      dataType: 'json',
1297	      crossDomain: true
1298	    }).done(function() {
1299	      data.success = true;
1300	      afterSubmit(data);
1301	    }).fail(function(response, textStatus, jqXHR) {
1302	      afterSubmit(data);
1303	    });
1304	  }
1305
1306	  // Submit form to MailChimp
1307	  function submitMailChimp(data) {
1308	    reset(data);
1309
1310	    var form = data.form;
1311	    var payload = {};
1312
1313	    // Skip Ajax submission if http/s mismatch, fallback to POST instead
1314	    if (/^https/.test(loc.href) && !/^https/.test(data.action)) {
1315	      form.attr('method', 'post');
1316	      return;
1317	    }
1318
1319	    preventDefault(data);
1320
1321	    // Find & populate all fields
1322	    var status = findFields(form, payload);
1323	    if (status) return alert(status);
1324
1325	    // Disable submit button
1326	    disableBtn(data);
1327
1328	    // Use special format for MailChimp params
1329	    var fullName;
1330	    _.each(payload, function(value, key) {
1331	      if (emailField.test(key)) payload.EMAIL = value;
1332	      if (/^((full[ _-]?)?name)$/i.test(key)) fullName = value;
1333	      if (/^(first[ _-]?name)$/i.test(key)) payload.FNAME = value;
1334	      if (/^(last[ _-]?name)$/i.test(key)) payload.LNAME = value;
1335	    });
1336
1337	    if (fullName && !payload.FNAME) {
1338	      fullName = fullName.split(' ');
1339	      payload.FNAME = fullName[0];
1340	      payload.LNAME = payload.LNAME || fullName[1];
1341	    }
1342
1343	    // Use the (undocumented) MailChimp jsonp api
1344	    var url = data.action.replace('/post?', '/post-json?') + '&c=?';
1345	    // Add special param to prevent bot signups
1346	    var userId = url.indexOf('u=') + 2;
1347	    userId = url.substring(userId, url.indexOf('&', userId));
1348	    var listId = url.indexOf('id=') + 3;
1349	    listId = url.substring(listId, url.indexOf('&', listId));
1350	    payload['b_' + userId + '_' + listId] = '';
1351
1352	    $.ajax({
1353	      url: url,
1354	      data: payload,
1355	      dataType: 'jsonp'
1356	    }).done(function(resp) {
1357	      data.success = (resp.result === 'success' || /already/.test(resp.msg));
1358	      if (!data.success) console.info('MailChimp error: ' + resp.msg);
1359	      afterSubmit(data);
1360	    }).fail(function(response, textStatus, jqXHR) {
1361	      afterSubmit(data);
1362	    });
1363	  }
1364
1365	  // Common callback which runs after all Ajax submissions
1366	  function afterSubmit(data) {
1367	    var form = data.form;
1368	    var wrap = form.closest('div.w-form');
1369	    var redirect = data.redirect;
1370	    var success = data.success;
1371
1372	    // Redirect to a success url if defined
1373	    if (success && redirect) {
1374	      Webflow.location(redirect);
1375	      return;
1376	    }
1377
1378	    // Show or hide status divs
1379	    data.done.toggle(success);
1380	    data.fail.toggle(!success);
1381
1382	    // Hide form on success
1383	    form.toggle(!success);
1384
1385	    // Reset data and enable submit button
1386	    reset(data);
1387	  }
1388
1389	  function preventDefault(data) {
1390	    data.evt && data.evt.preventDefault();
1391	    data.evt = null;
1392	  }
1393
1394	  // Export module
1395	  return api;
1396	});
1397
1398
1399/***/ },
1400/* 11 */
1401/***/ function(module, exports, __webpack_require__) {
1402
1403	'use strict';
1404
1405	/**
1406	 * Webflow: Google+ widget
1407	 */
1408
1409	var Webflow = __webpack_require__(1);
1410
1411	Webflow.define('gplus', module.exports = function($, _) {
1412	  var $doc = $(document);
1413	  var api = {};
1414	  var loaded;
1415
1416	  api.ready = function() {
1417	    // Load Google+ API on the front-end
1418	    if (!Webflow.env() && !loaded) init();
1419	  };
1420
1421	  function init() {
1422	    $doc.find('.w-widget-gplus').length && load();
1423	  }
1424
1425	  function load() {
1426	    loaded = true;
1427	    $.getScript('https://apis.google.com/js/plusone.js');
1428	  }
1429
1430	  // Export module
1431	  return api;
1432	});
1433
1434
1435/***/ },
1436/* 12 */
1437/***/ function(module, exports, __webpack_require__) {
1438
1439	'use strict';
1440	/*eslint no-self-compare:0 */
1441
1442	/**
1443	 * Webflow: Interactions
1444	 */
1445
1446	var Webflow = __webpack_require__(1);
1447	var IXEvents = __webpack_require__(2);
1448
1449	Webflow.define('ix', module.exports = function($, _) {
1450	  var api = {};
1451	  var designer;
1452	  var $win = $(window);
1453	  var namespace = '.w-ix';
1454	  var tram = $.tram;
1455	  var env = Webflow.env;
1456	  var inApp = env();
1457	  var emptyFix = env.chrome && env.chrome < 35;
1458	  var transNone = 'none 0s ease 0s';
1459	  var $subs = $();
1460	  var config = {};
1461	  var anchors = [];
1462	  var loads = [];
1463	  var readys = [];
1464	  var destroyed;
1465	  var readyDelay = 1;
1466
1467	  // Component types and proxy selectors
1468	  var components = {
1469	    tabs: '.w-tab-link, .w-tab-pane',
1470	    dropdown: '.w-dropdown',
1471	    slider: '.w-slide',
1472	    navbar: '.w-nav'
1473	  };
1474
1475	  // -----------------------------------
1476	  // Module methods
1477
1478	  api.init = function(list) {
1479	    setTimeout(function() { configure(list); }, 1);
1480	  };
1481
1482	  api.preview = function() {
1483	    designer = false;
1484	    readyDelay = 100;
1485	    setTimeout(function() { configure(window.__wf_ix); }, 1);
1486	  };
1487
1488	  api.design = function() {
1489	    designer = true;
1490	    api.destroy();
1491	  };
1492
1493	  api.destroy = function() {
1494	    destroyed = true;
1495	    $subs.each(teardown);
1496	    Webflow.scroll.off(scroll);
1497	    IXEvents.async();
1498	    anchors = [];
1499	    loads = [];
1500	    readys = [];
1501	  };
1502
1503	  api.ready = function() {
1504	    // Ready should only be used after destroy, as a way to re-init
1505	    if (config && destroyed) {
1506	      destroyed = false;
1507	      init();
1508	    }
1509	  };
1510
1511	  api.run = run;
1512	  api.style = inApp ? styleApp : stylePub;
1513
1514	  // -----------------------------------
1515	  // Private methods
1516
1517	  function configure(list) {
1518	    if (!list) return;
1519
1520	    // Map all interactions by slug
1521	    config = {};
1522	    _.each(list, function(item) {
1523	      config[item.slug] = item.value;
1524	    });
1525
1526	    // Init ix after config
1527	    init();
1528	  }
1529
1530	  function init() {
1531	    // Build each element's interaction keying from data attribute
1532	    var els = $('[data-ix]');
1533	    if (!els.length) return;
1534	    els.each(teardown);
1535	    els.each(build);
1536
1537	    // Listen for scroll events if any anchors exist
1538	    if (anchors.length) {
1539	      Webflow.scroll.on(scroll);
1540	      setTimeout(scroll, 1);
1541	    }
1542
1543	    // Handle loads or readys if they exist
1544	    if (loads.length) Webflow.load(runLoads);
1545	    if (readys.length) setTimeout(runReadys, readyDelay);
1546
1547	    // Trigger queued events, must happen after init
1548	    IXEvents.init();
1549
1550	    // Trigger a redraw to ensure all IX intros play
1551	    Webflow.redraw.up();
1552	  }
1553
1554	  function build(i, el) {
1555	    var $el = $(el);
1556	    var id = $el.attr('data-ix');
1557	    var ix = config[id];
1558	    if (!ix) return;
1559	    var triggers = ix.triggers;
1560	    if (!triggers) return;
1561
1562	    // Set styles immediately to provide tram with starting transform values
1563	    api.style($el, ix.style);
1564
1565	    _.each(triggers, function(trigger) {
1566	      var state = {};
1567	      var type = trigger.type;
1568	      var stepsB = trigger.stepsB && trigger.stepsB.length;
1569
1570	      function runA() { run(trigger, $el, { group: 'A' }); }
1571	      function runB() { run(trigger, $el, { group: 'B' }); }
1572
1573	      if (type === 'load') {
1574	        (trigger.preload && !inApp) ? loads.push(runA) : readys.push(runA);
1575	        return;
1576	      }
1577
1578	      if (type === 'click') {
1579	        $el.on('click' + namespace, function(evt) {
1580	          // Avoid late clicks on touch devices
1581	          if (!Webflow.validClick(evt.currentTarget)) return;
1582
1583	          // Prevent default on empty hash urls
1584	          if ($el.attr('href') === '#') evt.preventDefault();
1585
1586	          run(trigger, $el, { group: state.clicked ? 'B' : 'A' });
1587	          if (stepsB) state.clicked = !state.clicked;
1588	        });
1589	        $subs = $subs.add($el);
1590	        return;
1591	      }
1592
1593	      if (type === 'hover') {
1594	        $el.on('mouseenter' + namespace, runA);
1595	        $el.on('mouseleave' + namespace, runB);
1596	        $subs = $subs.add($el);
1597	        return;
1598	      }
1599
1600	      if (type === 'scroll') {
1601	        anchors.push({
1602	          el: $el, trigger: trigger, state: { active: false },
1603	          offsetTop: convert(trigger.offsetTop),
1604	          offsetBot: convert(trigger.offsetBot)
1605	        });
1606	        return;
1607	      }
1608
1609	      // Check for a proxy component selector
1610	      // type == [tabs, dropdown, slider, navbar]
1611	      var proxy = components[type];
1612	      if (proxy) {
1613	        var $proxy = $el.closest(proxy);
1614	        $proxy.on(IXEvents.types.INTRO, runA).on(IXEvents.types.OUTRO, runB);
1615	        $subs = $subs.add($proxy);
1616	        return;
1617	      }
1618	    });
1619	  }
1620
1621	  function convert(offset) {
1622	    if (!offset) return 0;
1623	    offset = String(offset);
1624	    var result = parseInt(offset, 10);
1625	    if (result !== result) return 0;
1626	    if (offset.indexOf('%') > 0) {
1627	      result /= 100;
1628	      if (result >= 1) result = 0.999;
1629	    }
1630	    return result;
1631	  }
1632
1633	  function teardown(i, el) {
1634	    $(el).off(namespace);
1635	  }
1636
1637	  function scroll() {
1638	    var viewTop = $win.scrollTop();
1639	    var viewHeight = $win.height();
1640
1641	    // Check each anchor for a valid scroll trigger
1642	    var count = anchors.length;
1643	    for (var i = 0; i < count; i++) {
1644	      var anchor = anchors[i];
1645	      var $el = anchor.el;
1646	      var trigger = anchor.trigger;
1647	      var stepsB = trigger.stepsB && trigger.stepsB.length;
1648	      var state = anchor.state;
1649	      var top = $el.offset().top;
1650	      var height = $el.outerHeight();
1651	      var offsetTop = anchor.offsetTop;
1652	      var offsetBot = anchor.offsetBot;
1653	      if (offsetTop < 1 && offsetTop > 0) offsetTop *= viewHeight;
1654	      if (offsetBot < 1 && offsetBot > 0) offsetBot *= viewHeight;
1655	      var active = (top + height - offsetTop >= viewTop && top + offsetBot <= viewTop + viewHeight);
1656	      if (active === state.active) continue;
1657	      if (active === false && !stepsB) continue;
1658	      state.active = active;
1659	      run(trigger, $el, { group: active ? 'A' : 'B' });
1660	    }
1661	  }
1662
1663	  function runLoads() {
1664	    var count = loads.length;
1665	    for (var i = 0; i < count; i++) {
1666	      loads[i]();
1667	    }
1668	  }
1669
1670	  function runReadys() {
1671	    var count = readys.length;
1672	    for (var i = 0; i < count; i++) {
1673	      readys[i]();
1674	    }
1675	  }
1676
1677	  function run(trigger, $el, opts, replay) {
1678	    opts = opts || {};
1679	    var done = opts.done;
1680
1681	    // Do not run in designer unless forced
1682	    if (designer && !opts.force) return;
1683
1684	    // Operate on a set of grouped steps
1685	    var group = opts.group || 'A';
1686	    var loop = trigger['loop' + group];
1687	    var steps = trigger['steps' + group];
1688	    if (!steps || !steps.length) return;
1689	    if (steps.length < 2) loop = false;
1690
1691	    // One-time init before any loops
1692	    if (!replay) {
1693
1694	      // Find selector within element descendants, siblings, or query whole document
1695	      var selector = trigger.selector;
1696	      if (selector) {
1697	        if (trigger.descend) {
1698	          $el = $el.find(selector);
1699	        } else if (trigger.siblings) {
1700	          $el = $el.siblings(selector);
1701	        } else {
1702	          $el = $(selector);
1703	        }
1704	        if (inApp) $el.attr('data-ix-affect', 1);
1705	      }
1706
1707	      // Apply empty fix for certain Chrome versions
1708	      if (emptyFix) $el.addClass('w-ix-emptyfix');
1709
1710	      // Set preserve3d for triggers with transforms
1711	      if (trigger.preserve3d) $el.css('transform-style', 'preserve-3d');
1712	    }
1713
1714	    var _tram = tram($el);
1715
1716	    // Add steps
1717	    var meta = {};
1718	    for (var i = 0; i < steps.length; i++) {
1719	      addStep(_tram, steps[i], meta);
1720	    }
1721
1722	    function fin() {
1723	      // Run trigger again if looped
1724	      if (loop) return run(trigger, $el, opts, true);
1725
1726	      // Reset any 'auto' values
1727	      if (meta.width === 'auto') _tram.set({ width: 'auto' });
1728	      if (meta.height === 'auto') _tram.set({ height: 'auto' });
1729
1730	      // Run callback
1731	      done && done();
1732	    }
1733
1734	    // Add final step to queue if tram has started
1735	    meta.start ? _tram.then(fin) : fin();
1736	  }
1737
1738	  function addStep(_tram, step, meta) {
1739	    var addMethod = 'add';
1740	    var startMethod = 'start';
1741
1742	    // Once the transition has started, we will always use then() to add to the queue.
1743	    if (meta.start) addMethod = startMethod = 'then';
1744
1745	    // Parse transitions string on the current step
1746	    var transitions = step.transition;
1747	    if (transitions) {
1748	      transitions = transitions.split(',');
1749	      for (var i = 0; i < transitions.length; i++) {
1750	        var transition = transitions[i];
1751	        _tram[addMethod](transition);
1752	      }
1753	    }
1754
1755	    // Build a clean object to pass to the tram method
1756	    var clean = tramify(step) || {};
1757
1758	    // Store last width and height values
1759	    if (clean.width != null) meta.width = clean.width;
1760	    if (clean.height != null) meta.height = clean.height;
1761
1762	    // When transitions are not present, set values immediately and continue queue.
1763	    if (transitions == null) {
1764
1765	      // If we have started, wrap set() in then() and reset queue
1766	      if (meta.start) {
1767	        _tram.then(function() {
1768	          var queue = this.queue;
1769	          this.set(clean);
1770	          if (clean.display) {
1771	            _tram.redraw();
1772	            Webflow.redraw.up();
1773	          }
1774	          this.queue = queue;
1775	          this.next();
1776	        });
1777	      } else {
1778	        _tram.set(clean);
1779
1780	        // Always redraw after setting display
1781	        if (clean.display) {
1782	          _tram.redraw();
1783	          Webflow.redraw.up();
1784	        }
1785	      }
1786
1787	      // Use the wait() method to kick off queue in absence of transitions.
1788	      var wait = clean.wait;
1789	      if (wait != null) {
1790	        _tram.wait(wait);
1791	        meta.start = true;
1792	      }
1793
1794	    // Otherwise, when transitions are present
1795	    } else {
1796
1797	      // If display is present, handle it separately
1798	      if (clean.display) {
1799	        var display = clean.display;
1800	        delete clean.display;
1801
1802	        // If we've already started, we need to wrap it in a then()
1803	        if (meta.start) {
1804	          _tram.then(function() {
1805	            var queue = this.queue;
1806	            this.set({ display: display }).redraw();
1807	            Webflow.redraw.up();
1808	            this.queue = queue;
1809	            this.next();
1810	          });
1811	        } else {
1812	          _tram.set({ display: display }).redraw();
1813	          Webflow.redraw.up();
1814	        }
1815	      }
1816
1817	      // Otherwise, start a transition using the current start method.
1818	      _tram[startMethod](clean);
1819	      meta.start = true;
1820	    }
1821	  }
1822
1823	  // (In app) Set styles immediately and manage upstream transition
1824	  function styleApp(el, data) {
1825	    var _tram = tram(el);
1826
1827	    // Get computed transition value
1828	    el.css('transition', '');
1829	    var computed = el.css('transition');
1830
1831	    // If computed is set to none, clear upstream
1832	    if (computed === transNone) computed = _tram.upstream = null;
1833
1834	    // Set upstream transition to none temporarily
1835	    _tram.upstream = transNone;
1836
1837	    // Set values immediately
1838	    _tram.set(tramify(data));
1839
1840	    // Only restore upstream in preview mode
1841	    _tram.upstream = computed;
1842	  }
1843
1844	  // (Published) Set styles immediately on specified jquery element
1845	  function stylePub(el, data) {
1846	    tram(el).set(tramify(data));
1847	  }
1848
1849	  // Build a clean object for tram
1850	  function tramify(obj) {
1851	    var result = {};
1852	    var found = false;
1853	    for (var x in obj) {
1854	      if (x === 'transition') continue;
1855	      result[x] = obj[x];
1856	      found = true;
1857	    }
1858	    // If empty, return null for tram.set/stop compliance
1859	    return found ? result : null;
1860	  }
1861
1862	  // Export module
1863	  return api;
1864	});
1865
1866
1867/***/ },
1868/* 13 */
1869/***/ function(module, exports, __webpack_require__) {
1870
1871	'use strict';
1872	/*eslint
1873	  no-use-before-define: 0,
1874	  no-shadow: 0
1875	*/
1876
1877	/**
1878	 * Webflow: Lightbox component
1879	 */
1880
1881	var Webflow = __webpack_require__(1);
1882
1883	function createLightbox(window, document, $) {
1884	  var tram = $.tram;
1885	  var isArray = Array.isArray;
1886	  var namespace = 'w-lightbox';
1887	  var prefix = namespace + '-';
1888	  var prefixRegex = /(^|\s+)/g;
1889
1890	  // Array of objects describing items to be displayed.
1891	  var items = [];
1892
1893	  // Index of the currently displayed item.
1894	  var currentIndex;
1895
1896	  // Object holding references to jQuery wrapped nodes.
1897	  var $refs;
1898
1899	  // Instance of Spinner
1900	  var spinner;
1901
1902	  function lightbox(thing, index) {
1903	    items = isArray(thing) ? thing : [thing];
1904
1905	    if (!$refs) {
1906	      lightbox.build();
1907	    }
1908
1909	    if (items.length > 1) {
1910	      $refs.items = $refs.empty;
1911
1912	      items.forEach(function (item) {
1913	        var $thumbnail = dom('thumbnail');
1914	        var $item = dom('item').append($thumbnail);
1915
1916	        $refs.items = $refs.items.add($item);
1917
1918	        loadImage(item.thumbnailUrl || item.url, function ($image) {
1919	          if ($image.prop('width') > $image.prop('height')) {
1920	            addClass($image, 'wide');
1921	          } else {
1922	            addClass($image, 'tall');
1923	          }
1924	          $thumbnail.append(addClass($image, 'thumbnail-image'));
1925	        });
1926	      });
1927
1928	      $refs.strip.empty().append($refs.items);
1929	      addClass($refs.content, 'group');
1930	    }
1931
1932	    tram(
1933	      // Focus the lightbox to receive keyboard events.
1934	      removeClass($refs.lightbox, 'hide').focus()
1935	    )
1936	      .add('opacity .3s')
1937	      .start({opacity: 1});
1938
1939	    // Prevent document from scrolling while lightbox is active.
1940	    addClass($refs.html, 'noscroll');
1941
1942	    return lightbox.show(index || 0);
1943	  }
1944
1945	  /**
1946	   * Creates the DOM structure required by the lightbox.
1947	   */
1948	  lightbox.build = function () {
1949	    // In case `build` is called more than once.
1950	    lightbox.destroy();
1951
1952	    $refs = {
1953	      html: $(document.documentElement),
1954	      // Empty jQuery object can be used to build new ones using `.add`.
1955	      empty: $()
1956	    };
1957
1958	    $refs.arrowLeft = dom('control left inactive');
1959	    $refs.arrowRight = dom('control right inactive');
1960	    $refs.close = dom('control close');
1961
1962	    $refs.spinner = dom('spinner');
1963	    $refs.strip = dom('strip');
1964
1965	    spinner = new Spinner($refs.spinner, prefixed('hide'));
1966
1967	    $refs.content = dom('content')
1968	      .append($refs.spinner, $refs.arrowLeft, $refs.arrowRight, $refs.close);
1969
1970	    $refs.container = dom('container')
1971	      .append($refs.content, $refs.strip);
1972
1973	    $refs.lightbox = dom('backdrop hide')
1974	      .append($refs.container);
1975
1976	    // We are delegating events for performance reasons and also
1977	    // to not have to reattach handlers when images change.
1978	    $refs.strip.on('tap', selector('item'), itemTapHandler);
1979	    $refs.content
1980	      .on('swipe', swipeHandler)
1981	      .on('tap', selector('left'), handlerPrev)
1982	      .on('tap', selector('right'), handlerNext)
1983	      .on('tap', selector('close'), handlerHide)
1984	      .on('tap', selector('image, caption'), handlerNext);
1985	    $refs.container
1986	      .on('tap', selector('view, strip'), handlerHide)
1987	      // Prevent images from being dragged around.
1988	      .on('dragstart', selector('img'), preventDefault);
1989	    $refs.lightbox
1990	      .on('keydown', keyHandler)
1991	      // IE loses focus to inner nodes without letting us know.
1992	      .on('focusin', focusThis);
1993
1994	    // The `tabindex` attribute is needed to enable non-input elements
1995	    // to receive keyboard events.
1996	    $('body').append($refs.lightbox.prop('tabIndex', 0));
1997
1998	    return lightbox;
1999	  };
2000
2001	  /**
2002	   * Dispose of DOM nodes created by the lightbox.
2003	   */
2004	  lightbox.destroy = function () {
2005	    if (!$refs) {
2006	      return;
2007	    }
2008
2009	    // Event handlers are also removed.
2010	    removeClass($refs.html, 'noscroll');
2011	    $refs.lightbox.remove();
2012	    $refs = undefined;
2013	  };
2014
2015	  /**
2016	   * Show a specific item.
2017	   */
2018	  lightbox.show = function (index) {
2019	    // Bail if we are already showing this item.
2020	    if (index === currentIndex) {
2021	      return;
2022	    }
2023
2024	    var item = items[index];
2025	    if (!item) { return lightbox.hide(); }
2026
2027	    var previousIndex = currentIndex;
2028	    currentIndex = index;
2029	    spinner.show();
2030
2031	    // For videos, load an empty SVG with the video dimensions to preserve
2032	    // the video’s aspect ratio while being responsive.
2033	    var url = item.html && svgDataUri(item.width, item.height) || item.url;
2034	    loadImage(url, function ($image) {
2035	      // Make sure this is the last item requested to be shown since
2036	      // images can finish loading in a different order than they were
2037	      // requested in.
2038	      if (index !== currentIndex) {
2039	        return;
2040	      }
2041
2042	      var $figure = dom('figure', 'figure').append(addClass($image, 'image'));
2043	      var $frame = dom('frame').append($figure);
2044	      var $newView = dom('view').append($frame);
2045	      var $html, isIframe;
2046
2047	      if (item.html) {
2048	        $html = $(item.html);
2049	        isIframe = $html.is('iframe');
2050
2051	        if (isIframe) {
2052	          $html.on('load', transitionToNewView);
2053	        }
2054
2055	        $figure.append(addClass($html, 'embed'));
2056	      }
2057
2058	      if (item.caption) {
2059	        $figure.append(dom('caption', 'figcaption').text(item.caption));
2060	      }
2061
2062	      $refs.spinner.before($newView);
2063
2064	      if (!isIframe) {
2065	        transitionToNewView();
2066	      }
2067
2068	      function transitionToNewView() {
2069	        spinner.hide();
2070
2071	        if (index !== currentIndex) {
2072	          $newView.remove();
2073	          return;
2074	        }
2075
2076
2077	        toggleClass($refs.arrowLeft, 'inactive', index <= 0);
2078	        toggleClass($refs.arrowRight, 'inactive', index >= items.length - 1);
2079
2080	        if ($refs.view) {
2081	          tram($refs.view)
2082	            .add('opacity .3s')
2083	            .start({opacity: 0})
2084	            .then(remover($refs.view));
2085
2086	          tram($newView)
2087	            .add('opacity .3s')
2088	            .add('transform .3s')
2089	            .set({x: index > previousIndex ? '80px' : '-80px'})
2090	            .start({opacity: 1, x: 0});
2091	        } else {
2092	          $newView.css('opacity', 1);
2093	        }
2094
2095	        $refs.view = $newView;
2096
2097	        if ($refs.items) {
2098	          // Mark proper thumbnail as active
2099	          addClass(removeClass($refs.items, 'active').eq(index), 'active');
2100	        }
2101	      }
2102	    });
2103
2104	    return lightbox;
2105	  };
2106
2107	  /**
2108	   * Hides the lightbox.
2109	   */
2110	  lightbox.hide = function () {
2111	    tram($refs.lightbox)
2112	      .add('opacity .3s')
2113	      .start({opacity: 0})
2114	      .then(hideLightbox);
2115
2116	    return lightbox;
2117	  };
2118
2119	  lightbox.prev = function () {
2120	    if (currentIndex > 0) {
2121	      lightbox.show(currentIndex - 1);
2122	    }
2123	  };
2124
2125	  lightbox.next = function () {
2126	    if (currentIndex < items.length - 1) {
2127	      lightbox.show(currentIndex + 1);
2128	    }
2129	  };
2130
2131	  function createHandler(action) {
2132	    return function (event) {
2133	      // We only care about events triggered directly on the bound selectors.
2134	      if (this !== event.target) {
2135	        return;
2136	      }
2137
2138	      event.stopPropagation();
2139	      event.preventDefault();
2140
2141	      action();
2142	    };
2143	  }
2144
2145	  var handlerPrev = createHandler(lightbox.prev);
2146	  var handlerNext = createHandler(lightbox.next);
2147	  var handlerHide = createHandler(lightbox.hide);
2148
2149	  var itemTapHandler = function(event) {
2150	    var index = $(this).index();
2151
2152	    event.preventDefault();
2153	    lightbox.show(index);
2154	  };
2155
2156	  var swipeHandler = function (event, data) {
2157	    // Prevent scrolling.
2158	    event.preventDefault();
2159
2160	    if (data.direction === 'left') {
2161	      lightbox.next();
2162	    } else if (data.direction === 'right') {
2163	      lightbox.prev();
2164	    }
2165	  };
2166
2167	  var focusThis = function () {
2168	    this.focus();
2169	  };
2170
2171	  function preventDefault(event) {
2172	    event.preventDefault();
2173	  }
2174
2175	  function keyHandler(event) {
2176	    var keyCode = event.keyCode;
2177
2178	    // [esc]
2179	    if (keyCode === 27) {
2180	      lightbox.hide();
2181	    }
2182
2183	    // [◀]
2184	    else if (keyCode === 37) {
2185	      lightbox.prev();
2186	    }
2187
2188	    // [▶]
2189	    else if (keyCode === 39) {
2190	      lightbox.next();
2191	    }
2192	  }
2193
2194	  function hideLightbox() {
2195	    // If the lightbox hasn't been destroyed already
2196	    if ($refs) {
2197	      removeClass($refs.html, 'noscroll');
2198	      addClass($refs.lightbox, 'hide');
2199	      $refs.strip.empty();
2200	      $refs.view && $refs.view.remove();
2201
2202	      // Reset some stuff
2203	      removeClass($refs.content, 'group');
2204	      addClass($refs.arrowLeft, 'inactive');
2205	      addClass($refs.arrowRight, 'inactive');
2206
2207	      currentIndex = $refs.view = undefined;
2208	    }
2209	  }
2210
2211	  function loadImage(url, callback) {
2212	    var $image = dom('img', 'img');
2213
2214	    $image.one('load', function () {
2215	      callback($image);
2216	    });
2217
2218	    // Start loading image.
2219	    $image.attr('src', url);
2220
2221	    return $image;
2222	  }
2223
2224	  function remover($element) {
2225	    return function () {
2226	      $element.remove();
2227	    };
2228	  }
2229
2230	  /**
2231	   * Spinner
2232	   */
2233	  function Spinner($spinner, className, delay) {
2234	    this.$element = $spinner;
2235	    this.className = className;
2236	    this.delay = delay || 200;
2237	    this.hide();
2238	  }
2239
2240	  Spinner.prototype.show = function () {
2241	    var spinner = this;
2242
2243	    // Bail if we are already showing the spinner.
2244	    if (spinner.timeoutId) {
2245	      return;
2246	    }
2247
2248	    spinner.timeoutId = setTimeout(function () {
2249	      spinner.$element.removeClass(spinner.className);
2250	      delete spinner.timeoutId;
2251	    }, spinner.delay);
2252	  };
2253
2254	  Spinner.prototype.hide = function () {
2255	    var spinner = this;
2256	    if (spinner.timeoutId) {
2257	      clearTimeout(spinner.timeoutId);
2258	      delete spinner.timeoutId;
2259	      return;
2260	    }
2261
2262	    spinner.$element.addClass(spinner.className);
2263	  };
2264
2265	  function prefixed(string, isSelector) {
2266	    return string.replace(prefixRegex, (isSelector ? ' .' : ' ') + prefix);
2267	  }
2268
2269	  function selector(string) {
2270	    return prefixed(string, true);
2271	  }
2272
2273	  /**
2274	   * jQuery.addClass with auto-prefixing
2275	   * @param  {jQuery} Element to add class to
2276	   * @param  {string}
2276 Class name that will be prefixed and added to element
2277	   * @return {jQuery}
2278	   */
2279	  function addClass($element, className) {
2280	    return $element.addClass(prefixed(className));
2281	  }
2282
2283	  /**
2284	   * jQuery.removeClass with auto-prefixing
2285	   * @param  {jQuery} Element to remove class from
2286	   * @param  {string} Class name that will be prefixed and removed from element
2287	   * @return {jQuery}
2288	   */
2289	  function removeClass($element, className) {
2290	    return $element.removeClass(prefixed(className));
2291	  }
2292
2293	  /**
2294	   * jQuery.toggleClass with auto-prefixing
2295	   * @param  {jQuery}  Element where class will be toggled
2296	   * @param  {string}  Class name that will be prefixed and toggled
2297	   * @param  {boolean} Optional boolean that determines if class will be added or removed
2298	   * @return {jQuery}
2299	   */
2300	  function toggleClass($element, className, shouldAdd) {
2301	    return $element.toggleClass(prefixed(className), shouldAdd);
2302	  }
2303
2304	  /**
2305	   * Create a new DOM element wrapped in a jQuery object,
2306	   * decorated with our custom methods.
2307	   * @param  {string} className
2308	   * @param  {string} [tag]
2309	   * @return {jQuery}
2310	   */
2311	  function dom(className, tag) {
2312	    return addClass($(document.createElement(tag || 'div')), className);
2313	  }
2314
2315	  function isObject(value) {
2316	    return typeof value === 'object' && value != null && !isArray(value);
2317	  }
2318
2319	  function svgDataUri(width, height) {
2320	    var svg = '<svg xmlns="http://www.w3.org/2000/svg" width="' + width + '" height="' + height + '"/>';
2321	    return 'data:image/svg+xml;charset=utf-8,' + encodeURI(svg);
2322	  }
2323
2324	  // Compute some dimensions manually for iOS < 8, because of buggy support for VH.
2325	  // Also, Android built-in browser does not support viewport units.
2326	  (function () {
2327	    var ua = window.navigator.userAgent;
2328	    var iOSRegex = /(iPhone|iPad|iPod);[^OS]*OS (\d)/;
2329	    var iOSMatches = ua.match(iOSRegex);
2330	    var android = ua.indexOf('Android ') > -1 && ua.indexOf('Chrome') === -1;
2331
2332	    if (!android && (!iOSMatches || iOSMatches[2] > 7)) {
2333	      return;
2334	    }
2335
2336	    var styleNode = document.createElement('style');
2337	    document.head.appendChild(styleNode);
2338	    window.addEventListener('orientationchange', refresh, true);
2339
2340	    function refresh() {
2341	      var vh = window.innerHeight;
2342	      var vw = window.innerWidth;
2343	      var content =
2344	        '.w-lightbox-content, .w-lightbox-view, .w-lightbox-view:before {' +
2345	          'height:' + vh + 'px' +
2346	        '}' +
2347	        '.w-lightbox-view {' +
2348	          'width:' + vw + 'px' +
2349	        '}' +
2350	        '.w-lightbox-group, .w-lightbox-group .w-lightbox-view, .w-lightbox-group .w-lightbox-view:before {' +
2351	          'height:' + (0.86 * vh) + 'px' +
2352	        '}' +
2353	        '.w-lightbox-image {' +
2354	          'max-width:' + vw + 'px;' +
2355	          'max-height:' + vh + 'px' +
2356	        '}' +
2357	        '.w-lightbox-group .w-lightbox-image {' +
2358	          'max-height:' + (0.86 * vh) + 'px' +
2359	        '}' +
2360	        '.w-lightbox-strip {' +
2361	          'padding: 0 ' + (0.01 * vh) + 'px' +
2362	        '}' +
2363	        '.w-lightbox-item {' +
2364	          'width:' + (0.1 * vh) + 'px;' +
2365	          'padding:' + (0.02 * vh) + 'px ' + (0.01 * vh) + 'px' +
2366	        '}' +
2367	        '.w-lightbox-thumbnail {' +
2368	          'height:' + (0.1 * vh) + 'px' +
2369	        '}' +
2370	        '@media (min-width: 768px) {' +
2371	          '.w-lightbox-content, .w-lightbox-view, .w-lightbox-view:before {' +
2372	            'height:' + (0.96 * vh) + 'px' +
2373	          '}' +
2374	          '.w-lightbox-content {' +
2375	            'margin-top:' + (0.02 * vh) + 'px' +
2376	          '}' +
2377	          '.w-lightbox-group, .w-lightbox-group .w-lightbox-view, .w-lightbox-group .w-lightbox-view:before {' +
2378	            'height:' + (0.84 * vh) + 'px' +
2379	          '}' +
2380	          '.w-lightbox-image {' +
2381	            'max-width:' + (0.96 * vw) + 'px;' +
2382	            'max-height:' + (0.96 * vh) + 'px' +
2383	          '}' +
2384	          '.w-lightbox-group .w-lightbox-image {' +
2385	            'max-width:' + (0.823 * vw) + 'px;' +
2386	            'max-height:' + (0.84 * vh) + 'px' +
2387	          '}' +
2388	        '}';
2389
2390	      styleNode.textContent = content;
2391	    }
2392
2393	    refresh();
2394	  })();
2395
2396	  return lightbox;
2397	}
2398
2399	Webflow.define('lightbox', module.exports = function($, _) {
2400	  var api = {};
2401	  var lightbox = createLightbox(window, document, $);
2402	  var $doc = $(document);
2403	  var $body;
2404	  var $lightboxes;
2405	  var designer;
2406	  var inApp = Webflow.env();
2407	  var namespace = '.w-lightbox';
2408	  var groups;
2409
2410	  // -----------------------------------
2411	  // Module methods
2412
2413	  api.ready = api.design = api.preview = init;
2414
2415	  // -----------------------------------
2416	  // Private methods
2417
2418	  function init() {
2419	    designer = inApp && Webflow.env('design');
2420	    $body = $(document.body);
2421
2422	    // Reset Lightbox
2423	    lightbox.destroy();
2424
2425	    // Reset groups
2426	    groups = {};
2427
2428	    // Find all instances on the page
2429	    $lightboxes = $doc.find(namespace);
2430
2431	    // Instantiate all lighboxes
2432	    $lightboxes.webflowLightBox();
2433	  }
2434
2435	  jQuery.fn.extend({
2436	    webflowLightBox: function() {
2437	      var $el = this;
2438	      $.each($el, function(i, el) {
2439	        // Store state in data
2440	        var data = $.data(el, namespace);
2441	        if (!data) {
2442	          data = $.data(el, namespace, {
2443	            el: $(el),
2444	            mode: 'images',
2445	            images: [],
2446	            embed: ''
2447	          });
2448	        }
2449
2450	        // Remove old events
2451	        data.el.off(namespace);
2452
2453	        // Set config from json script tag
2454	        configure(data);
2455
2456	        // Add events based on mode
2457	        if (designer) {
2458	          data.el.on('setting' + namespace, configure.bind(null, data));
2459	        } else {
2460	          data.el
2461	            .on('tap' + namespace, tapHandler(data))
2462	            // Prevent page scrolling to top when clicking on lightbox triggers.
2463	            .on('click' + namespace, function (e) { e.preventDefault(); });
2464	        }
2465	      });
2466	    }
2467	  });
2468
2469	  function configure(data) {
2470	    var json = data.el.children('.w-json').html();
2471	    var groupName, groupItems;
2472
2473	    if (!json) {
2474	      data.items = [];
2475	      return;
2476	    }
2477
2478	    try {
2479	      json = JSON.parse(json);
2480	    } catch(e) {
2481	      console.error('Malformed lightbox JSON configuration.', e);
2482	    }
2483
2484	    supportOldLightboxJson(json);
2485
2486	    groupName = json.group;
2487
2488	    if (groupName) {
2489	      groupItems = groups[groupName];
2490	      if (!groupItems) {
2491	        groupItems = groups[groupName] = [];
2492	      }
2493
2494	      data.items = groupItems;
2495
2496	      if (json.items.length) {
2497	        data.index = groupItems.length;
2498	        groupItems.push.apply(groupItems, json.items);
2499	      }
2500	    } else {
2501	      data.items = json.items;
2502	    }
2503	  }
2504
2505	  function tapHandler(data) {
2506	    return function () {
2507	      data.items.length && lightbox(data.items, data.index || 0);
2508	    };
2509	  }
2510
2511	  function supportOldLightboxJson(data) {
2512	    if (data.images) {
2513	      data.images.forEach(function (item) {
2514	        item.type = 'image';
2515	      });
2516	      data.items = data.images;
2517	    }
2518
2519	    if (data.embed) {
2520	      data.embed.type = 'video';
2521	      data.items = [data.embed];
2522	    }
2523
2524	    if (data.groupId) {
2525	      data.group = data.groupId;
2526	    }
2527	  }
2528
2529	  // Export module
2530	  return api;
2531	});
2532
2533
2534/***/ },
2535/* 14 */
2536/***/ function(module, exports, __webpack_require__) {
2537
2538	'use strict';
2539
2540	/**
2541	 * Webflow: Auto-select links to current page or section
2542	 */
2543
2544	var Webflow = __webpack_require__(1);
2545
2546	Webflow.define('links', module.exports = function($, _) {
2547	  var api = {};
2548	  var $win = $(window);
2549	  var designer;
2550	  var inApp = Webflow.env();
2551	  var location = window.location;
2552	  var tempLink = document.createElement('a');
2553	  var linkCurrent = 'w--current';
2554	  var validHash = /^#[a-zA-Z][\w:.-]*$/;
2555	  var indexPage = /index\.(html|php)$/;
2556	  var dirList = /\/$/;
2557	  var anchors;
2558	  var slug;
2559
2560	  // -----------------------------------
2561	  // Module methods
2562
2563	  api.ready = api.design = api.preview = init;
2564
2565	  // -----------------------------------
2566	  // Private methods
2567
2568	  function init() {
2569	    designer = inApp && Webflow.env('design');
2570	    slug = Webflow.env('slug') || location.pathname || '';
2571
2572	    // Reset scroll listener, init anchors
2573	    Webflow.scroll.off(scroll);
2574	    anchors = [];
2575
2576	    // Test all links for a selectable href
2577	    var links = document.links;
2578	    for (var i = 0; i < links.length; ++i) {
2579	      select(links[i]);
2580	    }
2581
2582	    // Listen for scroll if any anchors exist
2583	    if (anchors.length) {
2584	      Webflow.scroll.on(scroll);
2585	      scroll();
2586	    }
2587	  }
2588
2589	  function select(link) {
2590	    var href = (designer && link.getAttribute('href-disabled')) || link.getAttribute('href');
2591	    tempLink.href = href;
2592
2593	    // Ignore any hrefs with a colon to safely avoid all uri schemes
2594	    if (href.indexOf(':') >= 0) return;
2595
2596	    var $link = $(link);
2597
2598	    // Check for valid hash links w/ sections and use scroll anchor
2599	    if (href.indexOf('#') === 0 && validHash.test(href)) {
2600	      var $section = $(href);
2601	      $section.length && anchors.push({ link: $link, sec: $section, active: false });
2602	      return;
2603	    }
2604
2605	    // Ignore empty # links
2606	    if (href === '#') return;
2607
2608	    // Determine whether the link should be selected
2609	    var match = (tempLink.href === location.href) || (href === slug) || (indexPage.test(href) && dirList.test(slug));
2610	    setClass($link, linkCurrent, match);
2611	  }
2612
2613	  function scroll() {
2614	    var viewTop = $win.scrollTop();
2615	    var viewHeight = $win.height();
2616
2617	    // Check each anchor for a section in view
2618	    _.each(anchors, function(anchor) {
2619	      var $link = anchor.link;
2620	      var $section = anchor.sec;
2621	      var top = $section.offset().top;
2622	      var height = $section.outerHeight();
2623	      var offset = viewHeight * 0.5;
2624	      var active = ($section.is(':visible') &&
2625	        top + height - offset >= viewTop &&
2626	        top + offset <= viewTop + viewHeight);
2627	      if (anchor.active === active) return;
2628	      anchor.active = active;
2629	      setClass($link, linkCurrent, active);
2630	      if (designer) $link[0].__wf_current = active;
2631	    });
2632	  }
2633
2634	  function setClass($elem, className, add) {
2635	    var exists = $elem.hasClass(className);
2636	    if (add && exists) return;
2637	    if (!add && !exists) return;
2638	    add ? $elem.addClass(className) : $elem.removeClass(className);
2639	  }
2640
2641	  // Export module
2642	  return api;
2643	});
2644
2645
2646/***/ },
2647/* 15 */
2648/***/ function(module, exports, __webpack_require__) {
2649
2650	'use strict';
2651
2652	/**
2653	 * Webflow: Maps widget
2654	 */
2655
2656	var Webflow = __webpack_require__(1);
2657
2658	Webflow.define('maps', module.exports = function($, _) {
2659	  var api = {};
2660	  var $doc = $(document);
2661	  var google = null;
2662	  var $maps;
2663	  var namespace = '.w-widget-map';
2664	  var apiKey = 'AIzaSyBks0W0NawnPju70JQS5XXPOTTrguDQjWE';
2665
2666	  // -----------------------------------
2667	  // Module methods
2668
2669	  api.ready = function() {
2670	    // Init Maps on the front-end
2671	    if (!Webflow.env()) initMaps();
2672	  };
2673
2674	  api.preview = function() {
2675	    // Update active map nodes
2676	    $maps = $doc.find(namespace);
2677	    // Listen for resize events
2678	    Webflow.resize.off(triggerRedraw);
2679	    if ($maps.length) {
2680	      Webflow.resize.on(triggerRedraw);
2681	      triggerRedraw();
2682	    }
2683	  };
2684
2685	  api.design = function(evt) {
2686	    // Update active map nodes
2687	    $maps = $doc.find(namespace);
2688	    // Stop listening for resize events
2689	    Webflow.resize.off(triggerRedraw);
2690	    // Redraw to account for page changes
2691	    $maps.length && _.defer(triggerRedraw);
2692	  };
2693
2694	  api.destroy = removeListeners;
2695
2696	  // -----------------------------------
2697	  // Private methods
2698
2699	  // Trigger redraw in designer or preview mode
2700	  function triggerRedraw() {
2701	    if ($maps.length && Webflow.app) {
2702	      $maps.each(Webflow.app.redrawElement);
2703	    }
2704	  }
2705
2706	  function initMaps() {
2707	    $maps = $doc.find(namespace);
2708	    if (!$maps.length) return;
2709
2710	    if (google === null) {
2711	      $.getScript('https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=_wf_maps_loaded&key=' + apiKey);
2712	      window._wf_maps_loaded = mapsLoaded;
2713	    } else {
2714	      mapsLoaded();
2715	    }
2716
2717	    function mapsLoaded() {
2718	      window._wf_maps_loaded = function() {};
2719	      google = window.google;
2720	      $maps.each(renderMap);
2721	      removeListeners();
2722	      addListeners();
2723	    }
2724	  }
2725
2726	  function removeListeners() {
2727	    Webflow.resize.off(resizeMaps);
2728	    Webflow.redraw.off(resizeMaps);
2729	  }
2730
2731	  function addListeners() {
2732	    Webflow.resize.on(resizeMaps);
2733	    Webflow.redraw.on(resizeMaps);
2734	  }
2735
2736	  // Render map onto each element
2737	  function renderMap(i, el) {
2738	    var data = $(el).data();
2739	    getState(el, data);
2740	  }
2741
2742	  function resizeMaps() {
2743	    $maps.each(resizeMap);
2744	  }
2745
2746	  // Resize map when window changes
2747	  function resizeMap(i, el) {
2748	    var state = getState(el);
2749	    google.maps.event.trigger(state.map, 'resize');
2750	    state.setMapPosition();
2751	  }
2752
2753	  // Store state on element data
2754	  var store = 'w-widget-map';
2755	  function getState(el, data) {
2756
2757	    var state = $.data(el, store);
2758	    if (state) return state;
2759
2760	    var $el = $(el);
2761	    state = $.data(el, store, {
2762	      // Default options
2763	      latLng: '51.511214,-0.119824',
2764	      tooltip: '',
2765	      style: 'roadmap',
2766	      zoom: 12,
2767
2768	      // Marker
2769	      marker: new google.maps.Marker({
2770	        draggable: false
2771	      }),
2772
2773	      // Tooltip infowindow
2774	      infowindow: new google.maps.InfoWindow({
2775	        disableAutoPan: true
2776	      })
2777	    });
2778
2779	    // LatLng center point
2780	    var latLng = data.widgetLatlng || state.latLng;
2781	    state.latLng = latLng;
2782	    var coords = latLng.split(',');
2783	    var latLngObj = new google.maps.LatLng(coords[0], coords[1]);
2784	    state.latLngObj = latLngObj;
2785
2786	    // Disable touch events
2787	    var mapDraggable = (Webflow.env.touch && data.disableTouch) ? false : true;
2788
2789	    // Map instance
2790	    state.map = new google.maps.Map(el, {
2791	      center: state.latLngObj,
2792	      zoom: state.zoom,
2793	      maxZoom: 18,
2794	      mapTypeControl: false,
2795	      panControl: false,
2796	      streetViewControl: false,
2797	      scrollwheel: !data.disableScroll,
2798	      draggable: mapDraggable,
2799	      zoomControl: true,
2800	      zoomControlOptions: {
2801	        style: google.maps.ZoomControlStyle.SMALL
2802	      },
2803	      mapTypeId: state.style
2804	    });
2805	    state.marker.setMap(state.map);
2806
2807	    // Set map position and offset
2808	    state.setMapPosition = function() {
2809	      state.map.setCenter(state.latLngObj);
2810	      var offsetX = 0;
2811	      var offsetY = 0;
2812	      var padding = $el.css(['paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft']);
2813	      offsetX -= parseInt(padding.paddingLeft, 10);
2814	      offsetX += parseInt(padding.paddingRight, 10);
2815	      offsetY -= parseInt(padding.paddingTop, 10);
2816	      offsetY += parseInt(padding.paddingBottom, 10);
2817	      if (offsetX || offsetY) {
2818	        state.map.panBy(offsetX, offsetY);
2819	      }
2820	      $el.css('position', ''); // Remove injected position
2821	    };
2822
2823	    // Fix position after first tiles have loaded
2824	    google.maps.event.addListener(state.map, 'tilesloaded', function() {
2825	      google.maps.event.clearListeners(state.map, 'tilesloaded');
2826	      state.setMapPosition();
2827	    });
2828
2829	    // Set initial position
2830	    state.setMapPosition();
2831	    state.marker.setPosition(state.latLngObj);
2832	    state.infowindow.setPosition(state.latLngObj);
2833
2834	    // Draw tooltip
2835	    var tooltip = data.widgetTooltip;
2836	    if (tooltip) {
2837	      state.tooltip = tooltip;
2838	      state.infowindow.setContent(tooltip);
2839	      if (!state.infowindowOpen) {
2840	        state.infowindow.open(state.map, state.marker);
2841	        state.infowindowOpen = true;
2842	      }
2843	    }
2844
2845	    // Map style - options.style
2846	    var style = data.widgetStyle;
2847	    if (style) {
2848	      state.map.setMapTypeId(style);
2849	    }
2850
2851	    // Zoom - options.zoom
2852	    var zoom = data.widgetZoom;
2853	    if (zoom != null) {
2854	      state.zoom = zoom;
2855	      state.map.setZoom(+zoom);
2856	    }
2857
2858	    // Click marker to open in google maps
2859	    google.maps.event.addListener(state.marker, 'click', function() {
2860	      window.open('https://maps.google.com/?z=' + state.zoom + '&daddr=' + state.latLng);
2861	    });
2862
2863	    return state;
2864	  }
2865
2866	  // Export module
2867	  return api;
2868	});
2869
2870
2871/***/ },
2872/* 16 */
2873/***/ function(module, exports, __webpack_require__) {
2874
2875	'use strict';
2876
2877	/**
2878	 * Webflow: Navbar component
2879	 */
2880
2881	var Webflow = __webpack_require__(1);
2882	var IXEvents = __webpack_require__(2);
2883
2884	Webflow.define('navbar', module.exports = function($, _) {
2885	  var api = {};
2886	  var tram = $.tram;
2887	  var $win = $(window);
2888	  var $doc = $(document);
2889	  var $body;
2890	  var $navbars;
2891	  var designer;
2892	  var inApp = Webflow.env();
2893	  var overlay = '<div class="w-nav-overlay" data-wf-ignore />';
2894	  var namespace = '.w-nav';
2895	  var buttonOpen = 'w--open';
2896	  var menuOpen = 'w--nav-menu-open';
2897	  var linkOpen = 'w--nav-link-open';
2898	  var ix = IXEvents.triggers;
2899	  var menuSibling = $();
2900
2901	  // -----------------------------------
2902	  // Module methods
2903
2904	  api.ready = api.design = api.preview = init;
2905
2906	  api.destroy = function() {
2907	    menuSibling = $();
2908	    removeListeners();
2909	    if ($navbars && $navbars.length) {
2910	      $navbars.each(teardown);
2911	    }
2912	  };
2913
2914	  // -----------------------------------
2915	  // Private methods
2916
2917	  function init() {
2918	    designer = inApp && Webflow.env('design');
2919	    $body = $(document.body);
2920
2921	    // Find all instances on the page
2922	    $navbars = $doc.find(namespace);
2923	    if (!$navbars.length) return;
2924	    $navbars.each(build);
2925
2926	    // Wire events
2927	    removeListeners();
2928	    addListeners();
2929	  }
2930
2931	  function removeListeners() {
2932	    Webflow.resize.off(resizeAll);
2933	  }
2934
2935	  function addListeners() {
2936	    Webflow.resize.on(resizeAll);
2937	  }
2938
2939	  function resizeAll() {
2940	    $navbars.each(resize);
2941	  }
2942
2943	  function build(i, el) {
2944	    var $el = $(el);
2945
2946	    // Store state in data
2947	    var data = $.data(el, namespace);
2948	    if (!data) data = $.data(el, namespace, { open: false, el: $el, config: {} });
2949	    data.menu = $el.find('.w-nav-menu');
2950	    data.links = data.menu.find('.w-nav-link');
2951	    data.dropdowns = data.menu.find('.w-dropdown');
2952	    data.button = $el.find('.w-nav-button');
2953	    data.container = $el.find('.w-container');
2954	    data.outside = outside(data);
2955
2956	    // Remove old events
2957	    data.el.off(namespace);
2958	    data.button.off(namespace);
2959	    data.menu.off(namespace);
2960
2961	    // Set config from data attributes
2962	    configure(data);
2963
2964	    // Add events based on mode
2965	    if (designer) {
2966	      removeOverlay(data);
2967	      data.el.on('setting' + namespace, handler(data));
2968	    } else {
2969	      addOverlay(data);
2970	      data.button.on('tap' + namespace, toggle(data));
2971	      data.menu.on('click' + namespace, 'a', navigate(data));
2972	    }
2973
2974	    // Trigger initial resize
2975	    resize(i, el);
2976	  }
2977
2978	  function teardown(i, el) {
2979	    var data = $.data(el, namespace);
2980	    if (data) {
2981	      removeOverlay(data);
2982	      $.removeData(el, namespace);
2983	    }
2984	  }
2985
2986	  function removeOverlay(data) {
2987	    if (!data.overlay) return;
2988	    close(data, true);
2989	    data.overlay.remove();
2990	    data.overlay = null;
2991	  }
2992
2993	  function addOverlay(data) {
2994	    if (data.overlay) return;
2995	    data.overlay = $(overlay).appendTo(data.el);
2996	    data.parent = data.menu.parent();
2997	    close(data, true);
2998	  }
2999
3000	  function configure(data) {
3001	    var config = {};
3002	    var old = data.config || {};
3003
3004	    // Set config options from data attributes
3005	    var animation = config.animation = data.el.attr('data-animation') || 'default';
3006	    config.animOver = /^over/.test(animation);
3007	    config.animDirect = /left$/.test(animation) ? -1 : 1;
3008
3009	    // Re-open menu if the animation type changed
3010	    if (old.animation !== animation) {
3011	      data.open && _.defer(reopen, data);
3012	    }
3013
3014	    config.easing = data.el.attr('data-easing') || 'ease';
3015	    config.easing2 = data.el.attr('data-easing2') || 'ease';
3016
3017	    var duration = data.el.attr('data-duration');
3018	    config.duration = duration != null ? Number(duration) : 400;
3019
3020	    config.docHeight = data.el.attr('data-doc-height');
3021
3022	    // Store config in data
3023	    data.config = config;
3024	  }
3025
3026	  function handler(data) {
3027	    return function(evt, options) {
3028	      options = options || {};
3029	      var winWidth = $win.width();
3030	      configure(data);
3031	      options.open === true && open(data, true);
3032	      options.open === false && close(data, true);
3033	      // Reopen if media query changed after setting
3034	      data.open && _.defer(function() {
3035	        if (winWidth !== $win.width()) reopen(data);
3036	      });
3037	    };
3038	  }
3039
3040	  function reopen(data) {
3041	    if (!data.open) return;
3042	    close(data, true);
3043	    open(data, true);
3044	  }
3045
3046	  function toggle(data) {
3047	    // Debounce toggle to wait for accurate open state
3048	    return _.debounce(function() {
3049	      data.open ? close(data) : open(data);
3050	    });
3051	  }
3052
3053	  function navigate(data) {
3054	    return function(evt) {
3055	      var link = $(this);
3056	      var href = link.attr('href');
3057
3058	      // Avoid late clicks on touch devices
3059	      if (!Webflow.validClick(evt.currentTarget)) {
3060	        evt.preventDefault();
3061	        return;
3062	      }
3063
3064	      // Close when navigating to an in-page anchor
3065	      if (href && href.indexOf('#') === 0 && data.open) {
3066	        close(data);
3067	      }
3068	    };
3069	  }
3070
3071	  function outside(data) {
3072	    // Unbind previous tap handler if it exists
3073	    if (data.outside) $doc.off('tap' + namespace, data.outside);
3074
3075	    // Close menu when tapped outside, debounced to wait for state
3076	    return _.debounce(function(evt) {
3077	      if (!data.open) return;
3078	      var menu = $(evt.target).closest('.w-nav-menu');
3079	      if (!data.menu.is(menu)) {
3080	        close(data);
3081	      }
3082	    });
3083	  }
3084
3085	  function resize(i, el) {
3086	    var data = $.data(el, namespace);
3087	    // Check for collapsed state based on button display
3088	    var collapsed = data.collapsed = data.button.css('display') !== 'none';
3089	    // Close menu if button is no longer visible (and not in designer)
3090	    if (data.open && !collapsed && !designer) close(data, true);
3091	    // Set max-width of links + dropdowns to match container
3092	    if (data.container.length) {
3093	      var updateEachMax = updateMax(data);
3094	      data.links.each(updateEachMax);
3095	      data.dropdowns.each(updateEachMax);
3096	    }
3097	    // If currently open, update height to match body
3098	    if (data.open) {
3099	      setOverlayHeight(data);
3100	    }
3101	  }
3102
3103	  var maxWidth = 'max-width';
3104	  function updateMax(data) {
3105	    // Set max-width of each element to match container
3106	    var containMax = data.container.css(maxWidth);
3107	    if (containMax === 'none') containMax = '';
3108	    return function(i, link) {
3109	      link = $(link);
3110	      link.css(maxWidth, '');
3111	      // Don't set the max-width if an upstream value exists
3112	      if (link.css(maxWidth) === 'none') link.css(maxWidth, containMax);
3113	    };
3114	  }
3115
3116	  function open(data, immediate) {
3117	    if (data.open) return;
3118	    data.open = true;
3119	    data.menu.addClass(menuOpen);
3120	    data.links.addClass(linkOpen);
3121	    data.button.addClass(buttonOpen);
3122	    var config = data.config;
3123	    var animation = config.animation;
3124	    if (animation === 'none' || !tram.support.transform) immediate = true;
3125	    var bodyHeight = setOverlayHeight(data);
3126	    var menuHeight = data.menu.outerHeight(true);
3127	    var menuWidth = data.menu.outerWidth(true);
3128	    var navHeight = data.el.height();
3129	    var navbarEl = data.el[0];
3130	    resize(0, navbarEl);
3131	    ix.intro(0, navbarEl);
3132	    Webflow.redraw.up();
3133
3134	    // Listen for tap outside events
3135	    if (!designer) $doc.on('tap' + namespace, data.outside);
3136
3137	    // No transition for immediate
3138	    if (immediate) return;
3139
3140	    var transConfig = 'transform ' + config.duration + 'ms ' + config.easing;
3141
3142	    // Add menu to overlay
3143	    if (data.overlay) {
3144	      menuSibling = data.menu.prev();
3145	      data.overlay.show().append(data.menu);
3146	    }
3147
3148	    // Over left/right
3149	    if (config.animOver) {
3150	      tram(data.menu)
3151	      .add(transConfig)
3152	      .set({ x: config.animDirect * menuWidth, height: bodyHeight }).start({ x: 0 });
3153	      data.overlay && data.overlay.width(menuWidth);
3154	      return;
3155	    }
3156
3157	    // Drop Down
3158	    var offsetY = navHeight + menuHeight;
3159	    tram(data.menu)
3160	      .add(transConfig)
3161	      .set({ y: -offsetY }).start({ y: 0 });
3162	  }
3163
3164	  function setOverlayHeight(data) {
3165	    var config = data.config;
3166	    var bodyHeight = config.docHeight ? $doc.height() : $body.height();
3167	    if (config.animOver) {
3168	      data.menu.height(bodyHeight);
3169	    } else if (data.el.css('position') !== 'fixed') {
3170	      bodyHeight -= data.el.height();
3171	    }
3172	    data.overlay && data.overlay.height(bodyHeight);
3173	    return bodyHeight;
3174	  }
3175
3176	  function close(data, immediate) {
3177	    if (!data.open) return;
3178	    data.open = false;
3179	    data.button.removeClass(buttonOpen);
3180	    var config = data.config;
3181	    if (config.animation === 'none' || !tram.support.transform || config.duration <= 0) immediate = true;
3182	    ix.outro(0, data.el[0]);
3183
3184	    // Stop listening for tap outside events
3185	    $doc.off('tap' + namespace, data.outside);
3186
3187	    if (immediate) {
3188	      tram(data.menu).stop();
3189	      complete();
3190	      return;
3191	    }
3192
3193	    var transConfig = 'transform ' + config.duration + 'ms ' + config.easing2;
3194	    var menuHeight = data.menu.outerHeight(true);
3195	    var menuWidth = data.menu.outerWidth(true);
3196	    var navHeight = data.el.height();
3197
3198	    // Over left/right
3199	    if (config.animOver) {
3200	      tram(data.menu)
3201	        .add(transConfig)
3202	        .start({ x: menuWidth * config.animDirect }).then(complete);
3203	      return;
3204	    }
3205
3206	    // Drop Down
3207	    var offsetY = navHeight + menuHeight;
3208	    tram(data.menu)
3209	      .add(transConfig)
3210	      .start({ y: -offsetY }).then(complete);
3211
3212	    function complete() {
3213	      data.menu.height('');
3214	      tram(data.menu).set({ x: 0, y: 0 });
3215	      data.menu.removeClass(menuOpen);
3216	      data.links.removeClass(linkOpen);
3217	      if (data.overlay && data.overlay.children().length) {
3218	        // Move menu back to parent at the original location
3219	        menuSibling.length ? data.menu.insertAfter(menuSibling) : data.menu.prependTo(data.parent);
3220	        data.overlay.attr('style', '').hide();
3221	      }
3222
3223	      // Trigger event so other components can hook in (dropdown)
3224	      data.el.triggerHandler('w-close');
3225	    }
3226	  }
3227
3228	  // Export module
3229	  return api;
3230	});
3231
3232
3233/***/ },
3234/* 17 */
3235/***/ function(module, exports, __webpack_require__) {
3236
3237	'use strict';
3238
3239	/**
3240	 * Webflow: Smooth scroll
3241	 */
3242
3243	var Webflow = __webpack_require__(1);
3244
3245	Webflow.define('scroll', module.exports = function($, _) {
3246	  var $doc = $(document);
3247	  var win = window;
3248	  var loc = win.location;
3249	  var history = inIframe() ? null : win.history;
3250	  var validHash = /^[a-zA-Z0-9][\w:.-]*$/;
3251
3252	  function inIframe() {
3253	    try {
3254	      return !!win.frameElement;
3255	    } catch (e) {
3256	      return true;
3257	    }
3258	  }
3259
3260	  function ready() {
3261	    // If hash is already present on page load, scroll to it right away
3262	    if (loc.hash) {
3263	      findEl(loc.hash.substring(1));
3264	    }
3265
3266	    // The current page url without the hash part.
3267	    var locHref = loc.href.split('#')[0];
3268
3269	    // When clicking on a link, check if it links to another part of the page
3270	    $doc.on('click', 'a', function(e) {
3271	   
3272			if (Webflow.env('design')) {
3273	        return;
3274		
3275	      }
3276
3277	      // Ignore links being used by jQuery mobile
3278	      if (window.$.mobile && $(e.currentTarget).hasClass('ui-link')) return;
3279
3280	      // Ignore empty # links  #liton_tab error
3281	      if (this.getAttribute('href') === '#') {
3282	        e.preventDefault();
3283	        return;
3284	      }
3285			//Ignore error #liton_tab_3_1 -- Main Page (Essam 6-6-2022)
3286		  if (this.getAttribute('href') === '#liton_tab_3_1' ||this.getAttribute('href') === '#liton_tab_3_2'||this.getAttribute('href') === '#liton_tab_3_3'||this.getAttribute('href') === '#liton_tab_3_4')||this.getAttribute('href') === '#liton_tab_4_2') {
3287	        e.preventDefault();
3288	        return;
3289	      }
3290
3291	      // The href property always contains the full url so we can compare
3292	      // with the document’s location to only target links on this page.
3293	      var parts = this.href.split('#');
3294	      var hash = parts[0] === locHref ? parts[1] : null;
3295	      if (hash) {
3296	        findEl(hash, e);
3297	      }
3298	    });
3299	  }
3300
3301	  function findEl(hash, e) {
3302	    if (!validHash.test(hash)) return;
3303
3304	    var el = $('#' + hash);
3305	    if (!el.length) {
3306	      return;
3307	    }
3308
3309	    if (e) {
3310	      e.preventDefault();
3311	      e.stopPropagation();
3312	    }
3313
3314	    // Push new history state
3315	    if (
3316	      loc.hash !== hash &&
3317	      history && history.pushState &&
3318	      // Navigation breaks Chrome when the protocol is `file:`.
3319	      !(Webflow.env.chrome && loc.protocol === 'file:')
3320	    ) {
3321	      var oldHash = history.state && history.state.hash;
3322	      if (oldHash !== hash) {
3323	        history.pushState({ hash: hash }, '', '#' + hash);
3324	      }
3325	    }
3326
3327	    // If a fixed header exists, offset for the height
3328	    var rootTag = Webflow.env('editor') ? '.w-editor-body' : 'body';
3329	    var header = $('header, ' + rootTag + ' > .header, ' + rootTag + ' > .w-nav:not([data-no-scroll])');
3330	    var offset = header.css('position') === 'fixed' ? header.outerHeight() : 0;
3331
3332	    win.setTimeout(function() {
3333	      scroll(el, offset);
3334	    }, e ? 0 : 300);
3335	  }
3336
3337	  function scroll(el, offset){
3338	    var start = $(win).scrollTop();
3339	    var end = el.offset().top - offset;
3340
3341	    // If specified, scroll so that the element ends up in the middle of the viewport
3342	    if (el.data('scroll') === 'mid') {
3343	      var available = $(win).height() - offset;
3344	      var elHeight = el.outerHeight();
3345	      if (elHeight < available) {
3346	        end -= Math.round((available - elHeight) / 2);
3347	      }
3348	    }
3349
3350	    var mult = 1;
3351
3352	    // Check for custom time multiplier on the body and the element
3353	    $('body').add(el).each(function(i) {
3354	      var time = parseFloat($(this).attr('data-scroll-time'), 10);
3355	      if (!isNaN(time) && (time === 0 || time > 0)) {
3356	        mult = time;
3357	      }
3358	    });
3359
3360	    // Shim for IE8 and below
3361	    if (!Date.now) {
3362	      Date.now = function() { return new Date().getTime(); };
3363	    }
3364
3365	    var clock = Date.now();
3366	    var animate = win.requestAnimationFrame || win.mozRequestAnimationFrame || win.webkitRequestAnimationFrame || function(fn) { win.setTimeout(fn, 15); };
3367	    var duration = (472.143 * Math.log(Math.abs(start - end) +125) - 2000) * mult;
3368
3369	    var step = function() {
3370	      var elapsed = Date.now() - clock;
3371	      win.scroll(0, getY(start, end, elapsed, duration));
3372
3373	      if (elapsed <= duration) {
3374	        animate(step);
3375	      }
3376	    };
3377
3378	    step();
3379	  }
3380
3381	  function getY(start, end, elapsed, duration) {
3382	    if (elapsed > duration) {
3383	      return end;
3384	    }
3385
3386	    return start + (end - start) * ease(elapsed / duration);
3387	  }
3388
3389	  function ease(t) {
3390	    return t<0.5 ? 4 * t * t * t : (t-1) * (2 * t-2) * (2 * t-2)+1;
3391	  }
3392
3393	  // Export module
3394	  return { ready: ready };
3395	});
3396
3397
3398/***/ },
3399/* 18 */
3400/***/ function(module, exports, __webpack_require__) {
3401
3402	'use strict';
3403
3404	/**
3405	 * Webflow: Slider component
3406	 */
3407
3408	var Webflow = __webpack_require__(1);
3409	var IXEvents = __webpack_require__(2);
3410
3411	Webflow.define('slider', module.exports = function($, _) {
3412	  var api = {};
3413	  var tram = $.tram;
3414	  var $doc = $(document);
3415	  var $sliders;
3416	  var designer;
3417	  var inApp = Webflow.env();
3418	  var namespace = '.w-slider';
3419	  var dot = '<div class="w-slider-dot" data-wf-ignore />';
3420	  var ix = IXEvents.triggers;
3421	  var fallback;
3422	  var inRedraw;
3423
3424	  // -----------------------------------
3425	  // Module methods
3426
3427	  api.ready = function() {
3428	    init();
3429	  };
3430
3431	  api.design = function() {
3432	    designer = true;
3433	    init();
3434	  };
3435
3436	  api.preview = function() {
3437	    designer = false;
3438	    init();
3439	  };
3440
3441	  api.redraw = function() {
3442	    inRedraw = true;
3443	    init();
3444	  };
3445
3446	  api.destroy = removeListeners;
3447
3448	  // -----------------------------------
3449	  // Private methods
3450
3451	  function init() {
3452	    // Find all sliders on the page
3453	    $sliders = $doc.find(namespace);
3454	    if (!$sliders.length) return;
3455	    $sliders.filter(':visible').each(build);
3456	    inRedraw = null;
3457	    if (fallback) return;
3458
3459	    removeListeners();
3460	    addListeners();
3461	  }
3462
3463	  function removeListeners() {
3464	    Webflow.resize.off(renderAll);
3465	    Webflow.redraw.off(api.redraw);
3466	  }
3467
3468	  function addListeners() {
3469	    Webflow.resize.on(renderAll);
3470	    Webflow.redraw.on(api.redraw);
3471	  }
3472
3473	  function renderAll() {
3474	    $sliders.filter(':visible').each(render);
3475	  }
3476
3477	  function build(i, el) {
3478	    var $el = $(el);
3479
3480	    // Store slider state in data
3481	    var data = $.data(el, namespace);
3482	    if (!data) {
3483	      data = $.data(el, namespace, {
3484	        index: 0,
3485	        depth: 1,
3486	        el: $el,
3487	        config: {}
3488	      });
3489	    }
3490	    data.mask = $el.children('.w-slider-mask');
3491	    data.left = $el.children('.w-slider-arrow-left');
3492	    data.right = $el.children('.w-slider-arrow-right');
3493	    data.nav = $el.children('.w-slider-nav');
3494	    data.slides = data.mask.children('.w-slide');
3495	    data.slides.each(ix.reset);
3496	    if (inRedraw) data.maskWidth = 0;
3497
3498	    // Disable in old browsers
3499	    if (!tram.support.transform) {
3500	      data.left.hide();
3501	      data.right.hide();
3502	      data.nav.hide();
3503	      fallback = true;
3504	      return;
3505	    }
3506
3507	    // Remove old events
3508	    data.el.off(namespace);
3509	    data.left.off(namespace);
3510	    data.right.off(namespace);
3511	    data.nav.off(namespace);
3512
3513	    // Set config from data attributes
3514	    configure(data);
3515
3516	    // Add events based on mode
3517	    if (designer) {
3518	      data.el.on('setting' + namespace, handler(data));
3519	      stopTimer(data);
3520	      data.hasTimer = false;
3521	    } else {
3522	      data.el.on('swipe' + namespace, handler(data));
3523	      data.left.on('tap' + namespace, previousFunction(data));
3524	      data.right.on('tap' + namespace, next(data));
3525
3526	      // Start timer if autoplay is true, only once
3527	      if (data.config.autoplay && !data.hasTimer) {
3528	        data.hasTimer = true;
3529	        data.timerCount = 1;
3530	        startTimer(data);
3531	      }
3532	    }
3533
3534	    // Listen to nav events
3535	    data.nav.on('tap' + namespace, '> div', handler(data));
3536
3537	    // Remove gaps from formatted html (for inline-blocks)
3538	    if (!inApp) {
3539	      data.mask.contents().filter(function() {
3540	        return this.nodeType === 3;
3541	      }).remove();
3542	    }
3543
3544	    // Run first render
3545	    render(i, el);
3546	  }
3547
3548	  function configure(data) {
3549	    var config = {};
3550
3551	    config.crossOver = 0;
3552
3553	    // Set config options from data attributes
3554	    config.animation = data.el.attr('data-animation') || 'slide';
3555	    if (config.animation === 'outin') {
3556	      config.animation = 'cross';
3557	      config.crossOver = 0.5;
3558	    }
3559	    config.easing = data.el.attr('data-easing') || 'ease';
3560
3561	    var duration = data.el.attr('data-duration');
3562	    config.duration = duration != null ? +duration : 500;
3563
3564	    if (+data.el.attr('data-infinite')) config.infinite = true;
3565	    if (+data.el.attr('data-disable-swipe')) config.disableSwipe = true;
3566
3567	    if (+data.el.attr('data-hide-arrows')) {
3568	      config.hideArrows = true;
3569	    } else if (data.config.hideArrows) {
3570	      data.left.show();
3571	      data.right.show();
3572	    }
3573
3574	    if (+data.el.attr('data-autoplay')) {
3575	      config.autoplay = true;
3576	      config.delay = +data.el.attr('data-delay') || 2000;
3577	      config.timerMax = +data.el.attr('data-autoplay-limit');
3578	      // Disable timer on first touch or mouse down
3579	      var touchEvents = 'mousedown' + namespace + ' touchstart' + namespace;
3580	      if (!designer) {
3581	        data.el.off(touchEvents).one(touchEvents, function() {
3582	          stopTimer(data);
3583	        });
3584	      }
3585	    }
3586
3587	    // Use edge buffer to help calculate page count
3588	    var arrowWidth = data.right.width();
3589	    config.edge = arrowWidth ? arrowWidth + 40 : 100;
3590
3591	    // Store config in data
3592	    data.config = config;
3593	  }
3594
3595	  function previousFunction(data) {
3596	    return function(evt) {
3597	      change(data, { index: data.index - 1, vector: -1 });
3598	    };
3599	  }
3600
3601	  function next(data) {
3602	    return function(evt) {
3603	      change(data, { index: data.index + 1, vector: 1 });
3604	    };
3605	  }
3606
3607	  function select(data, value) {
3608	    // Select page based on slide element index
3609	    var found = null;
3610	    if (value === data.slides.length) {
3611	      init(); layout(data); // Rebuild and find new slides
3612	    }
3613	    _.each(data.anchors, function(anchor, index) {
3614	      $(anchor.els).each(function(i, el) {
3615	        if ($(el).index() === value) found = index;
3616	      });
3617	    });
3618	    if (found != null) change(data, { index: found, immediate: true });
3619	  }
3620
3621	  function startTimer(data) {
3622	    stopTimer(data);
3623	    var config = data.config;
3624	    var timerMax = config.timerMax;
3625	    if (timerMax && data.timerCount++ > timerMax) return;
3626	    data.timerId = window.setTimeout(function() {
3627	      if (data.timerId == null || designer) return;
3628	      next(data)();
3629	      startTimer(data);
3630	    }, config.delay);
3631	  }
3632
3633	  function stopTimer(data) {
3634	    window.clearTimeout(data.timerId);
3635	    data.timerId = null;
3636	  }
3637
3638	  function handler(data) {
3639	    return function(evt, options) {
3640	      options = options || {};
3641	      var config = data.config;
3642
3643	      // Designer settings
3644	      if (designer && evt.type === 'setting') {
3645	        if (options.select === 'prev') return previousFunction(data)();
3646	        if (options.select === 'next') return next(data)();
3647	        configure(data);
3648	        layout(data);
3649	        if (options.select == null) return;
3650	        select(data, options.select);
3651	        return;
3652	      }
3653
3654	      // Swipe event
3655	      if (evt.type === 'swipe') {
3656	        if (config.disableSwipe) return;
3657	        if (Webflow.env('editor')) return;
3658	        if (options.direction === 'left') return next(data)();
3659	        if (options.direction === 'right') return previousFunction(data)();
3660	        return;
3661	      }
3662
3663	      // Page buttons
3664	      if (data.nav.has(evt.target).length) {
3665	        change(data, { index: $(evt.target).index() });
3666	      }
3667	    };
3668	  }
3669
3670	  function change(data, options) {
3671	    options = options || {};
3672	    var config = data.config;
3673	    var anchors = data.anchors;
3674
3675	    // Set new index
3676	    data.previous = data.index;
3677	    var index = options.index;
3678	    var shift = {};
3679	    if (index < 0) {
3680	      index = anchors.length - 1;
3681	      if (config.infinite) {
3682	        // Shift first slide to the end
3683	        shift.x = -data.endX;
3684	        shift.from = 0;
3685	        shift.to = anchors[0].width;
3686	      }
3687	    } else if (index >= anchors.length) {
3688	      index = 0;
3689	      if (config.infinite) {
3690	        // Shift last slide to the start
3691	        shift.x = anchors[anchors.length - 1].width;
3692	        shift.from = -anchors[anchors.length - 1].x;
3693	        shift.to = shift.from - shift.x;
3694	      }
3695	    }
3696	    data.index = index;
3697
3698	    // Select page nav
3699	    var active = data.nav.children().eq(data.index).addClass('w-active');
3700	    data.nav.children().not(active).removeClass('w-active');
3701
3702	    // Hide arrows
3703	    if (config.hideArrows) {
3704	      data.index === anchors.length - 1 ? data.right.hide() : data.right.show();
3705	      data.index === 0 ? data.left.hide() : data.left.show();
3706	    }
3707
3708	    // Get page offset from anchors
3709	    var lastOffsetX = data.offsetX || 0;
3710	    var offsetX = data.offsetX = -anchors[data.index].x;
3711	    var resetConfig = { x: offsetX, opacity: 1, visibility: '' };
3712
3713	    // Transition slides
3714	    var targets = $(anchors[data.index].els);
3715	    var prevTargs = $(anchors[data.previous] && anchors[data.previous].els);
3716	    var others = data.slides.not(targets);
3717	    var animation = config.animation;
3718	    var easing = config.easing;
3719	    var duration = Math.round(config.duration);
3720	    var vector = options.vector || (data.index > data.previous ? 1 : -1);
3721	    var fadeRule = 'opacity ' + duration + 'ms ' + easing;
3722	    var slideRule = 'transform ' + duration + 'ms ' + easing;
3723
3724	    // Trigger IX events
3725	    if (!designer) {
3726	      targets.each(ix.intro);
3727	      others.each(ix.outro);
3728	    }
3729
3730	    // Set immediately after layout changes (but not during redraw)
3731	    if (options.immediate && !inRedraw) {
3732	      tram(targets).set(resetConfig);
3733	      resetOthers();
3734	      return;
3735	    }
3736
3737	    // Exit early if index is unchanged
3738	    if (data.index === data.previous) return;
3739
3740	    // Cross Fade / Out-In
3741	    if (animation === 'cross') {
3742	      var reduced = Math.round(duration - duration * config.crossOver);
3743	      var wait = Math.round(duration - reduced);
3744	      fadeRule = 'opacity ' + reduced + 'ms ' + easing;
3745	      tram(prevTargs)
3746	        .set({ visibility: '' })
3747	        .add(fadeRule)
3748	        .start({ opacity: 0 });
3749	      tram(targets)
3750	        .set({ visibility: '', x: offsetX, opacity: 0, zIndex: data.depth++ })
3751	        .add(fadeRule)
3752	        .wait(wait)
3753	        .then({ opacity: 1 })
3754	        .then(resetOthers);
3755	      return;
3756	    }
3757
3758	    // Fade Over
3759	    if (animation === 'fade') {
3760	      tram(prevTargs)
3761	        .set({ visibility: '' })
3762	        .stop();
3763	      tram(targets)
3764	        .set({ visibility: '', x: offsetX, opacity: 0, zIndex: data.depth++ })
3765	        .add(fadeRule)
3766	        .start({ opacity: 1 })
3767	        .then(resetOthers);
3768	      return;
3769	    }
3770
3771	    // Slide Over
3772	    if (animation === 'over') {
3773	      resetConfig = { x: data.endX };
3774	      tram(prevTargs)
3775	        .set({ visibility: '' })
3776	        .stop();
3777	      tram(targets)
3778	        .set({ visibility: '', zIndex: data.depth++, x: offsetX + anchors[data.index].width * vector })
3779	        .add(slideRule)
3780	        .start({ x: offsetX })
3781	        .then(resetOthers);
3782	      return;
3783	    }
3784
3785	    // Slide - infinite scroll
3786	    if (config.infinite && shift.x) {
3787	      tram(data.slides.not(prevTargs))
3788	        .set({ visibility: '', x: shift.x })
3789	        .add(slideRule)
3790	        .start({ x: offsetX });
3791	      tram(prevTargs)
3792	        .set({ visibility: '', x: shift.from })
3793	        .add(slideRule)
3794	        .start({ x: shift.to });
3795	      data.shifted = prevTargs;
3796
3797	    } else {
3798	      if (config.infinite && data.shifted) {
3799	        tram(data.shifted).set({ visibility: '', x: lastOffsetX });
3800	        data.shifted = null;
3801	      }
3802
3803	      // Slide - basic scroll
3804	      tram(data.slides)
3805	        .set({ visibility: '' })
3806	        .add(slideRule)
3807	        .start({ x: offsetX });
3808	    }
3809
3810	    // Helper to move others out of view
3811	    function resetOthers() {
3812	      targets = $(anchors[data.index].els);
3813	      others = data.slides.not(targets);
3814	      if (animation !== 'slide') resetConfig.visibility = 'hidden';
3815	      tram(others).set(resetConfig);
3816	    }
3817	  }
3818
3819	  function render(i, el) {
3820	    var data = $.data(el, namespace);
3821	    if (maskChanged(data)) return layout(data);
3822	    if (designer && slidesChanged(data)) layout(data);
3823	  }
3824
3825	  function layout(data) {
3826	    // Determine page count from width of slides
3827	    var pages = 1;
3828	    var offset = 0;
3829	    var anchor = 0;
3830	    var width = 0;
3831	    var maskWidth = data.maskWidth;
3832	    var threshold = maskWidth - data.config.edge;
3833	    if (threshold < 0) threshold = 0;
3834	    data.anchors = [{ els: [], x: 0, width: 0 }];
3835	    data.slides.each(function(i, el) {
3836	      if (anchor - offset > threshold) {
3837	        pages++;
3838	        offset += maskWidth;
3839	        // Store page anchor for transition
3840	        data.anchors[pages - 1] = { els: [], x: anchor, width: 0 };
3841	      }
3842	      // Set next anchor using current width + margin
3843	      width = $(el).outerWidth(true);
3844	      anchor += width;
3845	      data.anchors[pages - 1].width += width;
3846	      data.anchors[pages - 1].els.push(el);
3847	    });
3848	    data.endX = anchor;
3849
3850	    // Build dots if nav exists and needs updating
3851	    if (designer) data.pages = null;
3852	    if (data.nav.length && data.pages !== pages){
3853	      data.pages = pages;
3854	      buildNav(data);
3855	    }
3856
3857	    // Make sure index is still within range and call change handler
3858	    var index = data.index;
3859	    if (index >= pages) index = pages - 1;
3860	    change(data, { immediate: true, index: index });
3861	  }
3862
3863	  function buildNav(data) {
3864	    var dots = [];
3865	    var $dot;
3866	    var spacing = data.el.attr('data-nav-spacing');
3867	    if (spacing) spacing = parseFloat(spacing) + 'px';
3868	    for (var i = 0; i < data.pages; i++) {
3869	      $dot = $(dot);
3870	      if (data.nav.hasClass('w-num')) $dot.text(i + 1);
3871	      if (spacing != null) {
3872	        $dot.css({
3873	          'margin-left': spacing,
3874	          'margin-right': spacing
3875	        });
3876	      }
3877	      dots.push($dot);
3878	    }
3879	    data.nav.empty().append(dots);
3880	  }
3881
3882	  function maskChanged(data) {
3883	    var maskWidth = data.mask.width();
3884	    if (data.maskWidth !== maskWidth) {
3885	      data.maskWidth = maskWidth;
3886	      return true;
3887	    }
3888	    return false;
3889	  }
3890
3891	  function slidesChanged(data) {
3892	    var slidesWidth = 0;
3893	    data.slides.each(function(i, el) {
3894	      slidesWidth += $(el).outerWidth(true);
3895	    });
3896	    if (data.slidesWidth !== slidesWidth) {
3897	      data.slidesWidth = slidesWidth;
3898	      return true;
3899	    }
3900	    return false;
3901	  }
3902
3903	  // Export module
3904	  return api;
3905	});
3906
3907
3908/***/ },
3909/* 19 */
3910/***/ function(module, exports, __webpack_require__) {
3911
3912	'use strict';
3913
3914	/**
3915	 * Webflow: Tabs component
3916	 */
3917
3918	var Webflow = __webpack_require__(1);
3919	var IXEvents = __webpack_require__(2);
3920
3921	Webflow.define('tabs', module.exports = function($, _) {
3922	  var api = {};
3923	  var tram = $.tram;
3924	  var $win = $(window);
3925	  var $doc = $(document);
3926	  var $tabs;
3927	  var design;
3928	  var env = Webflow.env;
3929	  var safari = env.safari;
3930	  var inApp = env();
3931	  var tabAttr = 'data-w-tab';
3932	  var namespace = '.w-tabs';
3933	  var linkCurrent = 'w--current';
3934	  var tabActive = 'w--tab-active';
3935	  var ix = IXEvents.triggers;
3936	  var inRedraw;
3937
3938	  // -----------------------------------
3939	  // Module methods
3940
3941	  api.ready = api.design = api.preview = init;
3942
3943	  api.redraw = function() {
3944	    inRedraw = true;
3945	    init();
3946	  };
3947
3948	  api.destroy = function() {
3949	    $tabs = $doc.find(namespace);
3950	    if (!$tabs.length) return;
3951	    $tabs.each(resetIX);
3952	    removeListeners();
3953	  };
3954
3955	  // -----------------------------------
3956	  // Private methods
3957
3958	  function init() {
3959	    design = inApp && Webflow.env('design');
3960
3961	    // Find all instances on the page
3962	    $tabs = $doc.find(namespace);
3963	    if (!$tabs.length) return;
3964	    $tabs.each(build);
3965	    Webflow.env('preview') && $tabs.each(resetIX);
3966	    inRedraw = null;
3967
3968	    removeListeners();
3969	    addListeners();
3970	  }
3971
3972	  function removeListeners() {
3973	    Webflow.redraw.off(api.redraw);
3974	  }
3975
3976	  function addListeners() {
3977	    Webflow.redraw.on(api.redraw);
3978	  }
3979
3980	  function resetIX(i, el) {
3981	    var $el = $(el);
3982	    var data = $.data(el, namespace);
3983	    if (!data) return;
3984	    data.links && data.links.each(ix.reset);
3985	    data.panes && data.panes.each(ix.reset);
3986	  }
3987
3988	  function build(i, el) {
3989	    var $el = $(el);
3990
3991	    // Store state in data
3992	    var data = $.data(el, namespace);
3993	    if (!data) data = $.data(el, namespace, { el: $el, config: {} });
3994	    data.current = null;
3995	    data.menu = $el.children('.w-tab-menu');
3996	    data.links = data.menu.children('.w-tab-link');
3997	    data.content = $el.children('.w-tab-content');
3998	    data.panes = data.content.children('.w-tab-pane');
3999
4000	    // Remove old events
4001	    data.el.off(namespace);
4002	    data.links.off(namespace);
4003
4004	    // Set config from data attributes
4005	    configure(data);
4006
4007	    // Wire up events when not in design mode
4008	    if (!design) {
4009	      data.links.on('click' + namespace, linkSelect(data));
4010
4011	      // Trigger first intro event from current tab
4012	      var $link = data.links.filter('.' + linkCurrent);
4013	      var tab = $link.attr(tabAttr);
4014	      tab && changeTab(data, { tab: tab, immediate: true });
4015	    }
4016	  }
4017
4018	  function configure(data) {
4019	    var config = {};
4020	    var old = data.config || {};
4021
4022	    // Set config options from data attributes
4023	    config.easing = data.el.attr('data-easing') || 'ease';
4024
4025	    var intro = +data.el.attr('data-duration-in');
4026	    intro = config.intro = intro === intro ? intro : 0;
4027
4028	    var outro = +data.el.attr('data-duration-out');
4029	    outro = config.outro = outro === outro ? outro : 0;
4030
4031	    config.immediate = !intro && !outro;
4032
4033	    // Store config in data
4034	    data.config = config;
4035	  }
4036
4037	  function linkSelect(data) {
4038	    return function(evt) {
4039	      var tab = evt.currentTarget.getAttribute(tabAttr);
4040	      tab && changeTab(data, { tab: tab });
4041	    };
4042	  }
4043
4044	  function changeTab(data, options) {
4045	    options = options || {};
4046
4047	    var config = data.config;
4048	    var easing = config.easing;
4049	    var tab = options.tab;
4050
4051	    // Don't select the same tab twice
4052	    if (tab === data.current) return;
4053	    data.current = tab;
4054
4055	    // Select the current link
4056	    data.links.each(function(i, el) {
4057	      var $el = $(el);
4058	      if (el.getAttribute(tabAttr) === tab) $el.addClass(linkCurrent).each(ix.intro);
4059	      else if ($el.hasClass(linkCurrent)) $el.removeClass(linkCurrent).each(ix.outro);
4060	    });
4061
4062	    // Find the new tab panes and keep track of previous
4063	    var targets = [];
4064	    var previous = [];
4065	    data.panes.each(function(i, el) {
4066	      var $el = $(el);
4067	      if (el.getAttribute(tabAttr) === tab) {
4068	        targets.push(el);
4069	      } else if ($el.hasClass(tabActive)) {
4070	        previous.push(el);
4071	      }
4072	    });
4073
4074	    var $targets = $(targets);
4075	    var $previous = $(previous);
4076
4077	    // Switch tabs immediately and bypass transitions
4078	    if (options.immediate || config.immediate) {
4079	      $targets.addClass(tabActive).each(ix.intro);
4080	      $previous.removeClass(tabActive);
4081	      // Redraw to benefit components in the hidden tab pane
4082	      // But only if not currently in the middle of a redraw
4083	      if (!inRedraw) Webflow.redraw.up();
4084	      return;
4085	    }
4086
4087	    // Fade out the currently active tab before intro
4088	    if ($previous.length && config.outro) {
4089	      $previous.each(ix.outro);
4090	      tram($previous)
4091	        .add('opacity ' + config.outro + 'ms ' + easing, { fallback: safari })
4092	        .start({ opacity: 0 })
4093	        .then(intro);
4094	    } else {
4095	      // Skip the outro and play intro
4096	      intro();
4097	    }
4098
4099	    // Fade in the new target
4100	    function intro() {
4101	      // Clear previous active class + styles touched by tram
4102	      // We cannot remove the whole inline style because it could be dynamically bound
4103	      $previous.removeClass(tabActive).css({
4104	        opacity: '',
4105	        transition: '',
4106	        transform: '',
4107	        width: '',
4108	        height: ''
4109	      });
4110
4111	      // Add active class to new target
4112	      $targets.addClass(tabActive).each(ix.intro);
4113	      Webflow.redraw.up();
4114
4115	      // Set opacity immediately if intro is zero
4116	      if (!config.intro) return tram($targets).set({ opacity: 1 });
4117
4118	      // Otherwise fade in opacity
4119	      tram($targets)
4120	        .set({ opacity: 0 })
4121	        .redraw()
4122	        .add('opacity ' + config.intro + 'ms ' + easing, { fallback: safari })
4123	        .start({ opacity: 1 });
4124	    }
4125	  }
4126
4127	  // Export module
4128	  return api;
4129	});
4130
4131
4132/***/ },
4133/* 20 */
4134/***/ function(module, exports, __webpack_require__) {
4135
4136	'use strict';
4137
4138	/**
4139	 * Webflow: Touch events
4140	 */
4141
4142	var Webflow = __webpack_require__(1);
4143
4144	Webflow.define('touch', module.exports = function($, _) {
4145	  var api = {};
4146	  var fallback = !document.addEventListener;
4147	  var getSelection = window.getSelection;
4148
4149	  // Fallback to click events in old IE
4150	  if (fallback) {
4151	    $.event.special.tap = { bindType: 'click', delegateType: 'click' };
4152	  }
4153
4154	  api.init = function(el) {
4155	    if (fallback) return null;
4156	    el = typeof el === 'string' ? $(el).get(0) : el;
4157	    return el ? new Touch(el) : null;
4158	  };
4159
4160	  function Touch(el) {
4161	    var active = false;
4162	    var dirty = false;
4163	    var useTouch = false;
4164	    var thresholdX = Math.min(Math.round(window.innerWidth * 0.04), 40);
4165	    var startX, startY, lastX;
4166
4167	    el.addEventListener('touchstart', start, false);
4168	    el.addEventListener('touchmove', move, false);
4169	    el.addEventListener('touchend', end, false);
4170	    el.addEventListener('touchcancel', cancel, false);
4171	    el.addEventListener('mousedown', start, false);
4172	    el.addEventListener('mousemove', move, false);
4173	    el.addEventListener('mouseup', end, false);
4174	    el.addEventListener('mouseout', cancel, false);
4175
4176	    function start(evt) {
4177	      // We don’t handle multi-touch events yet.
4178	      var touches = evt.touches;
4179	      if (touches && touches.length > 1) {
4180	        return;
4181	      }
4182
4183	      active = true;
4184	      dirty = false;
4185
4186	      if (touches) {
4187	        useTouch = true;
4188	        startX = touches[0].clientX;
4189	        startY = touches[0].clientY;
4190	      } else {
4191	        startX = evt.clientX;
4192	        startY = evt.clientY;
4193	      }
4194
4195	      lastX = startX;
4196	    }
4197
4198	    function move(evt) {
4199	      if (!active) return;
4200
4201	      if (useTouch && evt.type === 'mousemove') {
4202	        evt.preventDefault();
4203	        evt.stopPropagation();
4204	        return;
4205	      }
4206
4207	      var touches = evt.touches;
4208	      var x = touches ? touches[0].clientX : evt.clientX;
4209	      var y = touches ? touches[0].clientY : evt.clientY;
4210
4211	      var velocityX = x - lastX;
4212	      lastX = x;
4213
4214	      // Allow swipes while pointer is down, but prevent them during text selection
4215	      if (Math.abs(velocityX) > thresholdX && getSelection && getSelection() + '' === '') {
4216	        triggerEvent('swipe', evt, { direction: velocityX > 0 ? 'right' : 'left' });
4217	        cancel();
4218	      }
4219
4220	      // If pointer moves more than 10px flag to cancel tap
4221	      if (Math.abs(x - startX) > 10 || Math.abs(y - startY) > 10) {
4222	        dirty = true;
4223	      }
4224	    }
4225
4226	    function end(evt) {
4227	      if (!active) return;
4228	      active = false;
4229
4230	      if (useTouch && evt.type === 'mouseup') {
4231	        evt.preventDefault();
4232	        evt.stopPropagation();
4233	        useTouch = false;
4234	        return;
4235	      }
4236
4237	      if (!dirty) triggerEvent('tap', evt);
4238	    }
4239
4240	    function cancel(evt) {
4241	      active = false;
4242	    }
4243
4244	    function destroy() {
4245	      el.removeEventListener('touchstart', start, false);
4246	      el.removeEventListener('touchmove', move, false);
4247	      el.removeEventListener('touchend', end, false);
4248	      el.removeEventListener('touchcancel', cancel, false);
4249	      el.removeEventListener('mousedown', start, false);
4250	      el.removeEventListener('mousemove', move, false);
4251	      el.removeEventListener('mouseup', end, false);
4252	      el.removeEventListener('mouseout', cancel, false);
4253	      el = null;
4254	    }
4255
4256	    // Public instance methods
4257	    this.destroy = destroy;
4258	  }
4259
4260	  // Wrap native event to supoprt preventdefault + stopPropagation
4261	  function triggerEvent(type, evt, data) {
4262	    var newEvent = $.Event(type, { originalEvent: evt });
4263	    $(evt.target).trigger(newEvent, data);
4264	  }
4265
4266	  // Listen for touch events on all nodes by default.
4267	  api.instance = api.init(document);
4268
4269	  // Export module
4270	  return api;
4271	});
4272
4273
4274/***/ },
4275/* 21 */
4276/***/ function(module, exports, __webpack_require__) {
4277
4278	'use strict';
4279
4280	/*jshint -W054 */
4281
4282	// Include tram for frame-throttling
4283	var $ = window.$;
4284	var tram = __webpack_require__(3) && $.tram;
4285
4286	/*!
4287	 * Webflow._ (aka) Underscore.js 1.6.0 (custom build)
4288	 * _.each
4289	 * _.map
4290	 * _.find
4291	 * _.filter
4292	 * _.any
4293	 * _.contains
4294	 * _.delay
4295	 * _.defer
4296	 * _.throttle (webflow)
4297	 * _.debounce
4298	 * _.keys
4299	 * _.has
4300	 * _.now
4301	 *
4302	 * http://underscorejs.org
4303	 * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
4304	 * Underscore may be freely distributed under the MIT license.
4305	 * @license MIT
4306	 */
4307	module.exports = (function() {
4308	  var _ = {};
4309
4310	  // Current version.
4311	  _.VERSION = '1.6.0-Webflow';
4312
4313	  // Establish the object that gets returned to break out of a loop iteration.
4314	  var breaker = {};
4315
4316	  // Save bytes in the minified (but not gzipped) version:
4317	  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
4318
4319	  // Create quick reference variables for speed access to core prototypes.
4320	  var
4321	    push             = ArrayProto.push,
4322	    slice            = ArrayProto.slice,
4323	    concat           = ArrayProto.concat,
4324	    toString         = ObjProto.toString,
4325	    hasOwnProperty   = ObjProto.hasOwnProperty;
4326
4327	  // All **ECMAScript 5** native function implementations that we hope to use
4328	  // are declared here.
4329	  var
4330	    nativeForEach      = ArrayProto.forEach,
4331	    nativeMap          = ArrayProto.map,
4332	    nativeReduce       = ArrayProto.reduce,
4333	    nativeReduceRight  = ArrayProto.reduceRight,
4334	    nativeFilter       = ArrayProto.filter,
4335	    nativeEvery        = ArrayProto.every,
4336	    nativeSome         = ArrayProto.some,
4337	    nativeIndexOf      = ArrayProto.indexOf,
4338	    nativeLastIndexOf  = ArrayProto.lastIndexOf,
4339	    nativeIsArray      = Array.isArray,
4340	    nativeKeys         = Object.keys,
4341	    nativeBind         = FuncProto.bind;
4342
4343	  // Collection Functions
4344	  // --------------------
4345
4346	  // The cornerstone, an `each` implementation, aka `forEach`.
4347	  // Handles objects with the built-in `forEach`, arrays, and raw objects.
4348	  // Delegates to **ECMAScript 5**'s native `forEach` if available.
4349	  var each = _.each = _.forEach = function(obj, iterator, context) {
4350	    /* jshint shadow:true */
4351	    if (obj == null) return obj;
4352	    if (nativeForEach && obj.forEach === nativeForEach) {
4353	      obj.forEach(iterator, context);
4354	    } else if (obj.length === +obj.length) {
4355	      for (var i = 0, length = obj.length; i < length; i++) {
4356	        if (iterator.call(context, obj[i], i, obj) === breaker) return;
4357	      }
4358	    } else {
4359	      var keys = _.keys(obj);
4360	      for (var i = 0, length = keys.length; i < length; i++) {
4361	        if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
4362	      }
4363	    }
4364	    return obj;
4365	  };
4366
4367	  // Return the results of applying the iterator to each element.
4368	  // Delegates to **ECMAScript 5**'s native `map` if available.
4369	  _.map = _.collect = function(obj, iterator, context) {
4370	    var results = [];
4371	    if (obj == null) return results;
4372	    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
4373	    each(obj, function(value, index, list) {
4374	      results.push(iterator.call(context, value, index, list));
4375	    });
4376	    return results;
4377	  };
4378
4379	  // Return the first value which passes a truth test. Aliased as `detect`.
4380	  _.find = _.detect = function(obj, predicate, context) {
4381	    var result;
4382	    any(obj, function(value, index, list) {
4383	      if (predicate.call(context, value, index, list)) {
4384	        result = value;
4385	        return true;
4386	      }
4387	    });
4388	    return result;
4389	  };
4390
4391	  // Return all the elements that pass a truth test.
4392	  // Delegates to **ECMAScript 5**'s native `filter` if available.
4393	  // Aliased as `select`.
4394	  _.filter = _.select = function(obj, predicate, context) {
4395	    var results = [];
4396	    if (obj == null) return results;
4397	    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context);
4398	    each(obj, function(value, index, list) {
4399	      if (predicate.call(context, value, index, list)) results.push(value);
4400	    });
4401	    return results;
4402	  };
4403
4404	  // Determine if at least one element in the object matches a truth test.
4405	  // Delegates to **ECMAScript 5**'s native `some` if available.
4406	  // Aliased as `any`.
4407	  var any = _.some = _.any = function(obj, predicate, context) {
4408	    predicate || (predicate = _.identity);
4409	    var result = false;
4410	    if (obj == null) return result;
4411	    if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context);
4412	    each(obj, function(value, index, list) {
4413	      if (result || (result = predicate.call(context, value, index, list))) return breaker;
4414	    });
4415	    return !!result;
4416	  };
4417
4418	  // Determine if the array or object contains a given value (using `===`).
4419	  // Aliased as `include`.
4420	  _.contains = _.include = function(obj, target) {
4421	    if (obj == null) return false;
4422	    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
4423	    return any(obj, function(value) {
4424	      return value === target;
4425	    });
4426	  };
4427
4428	  // Function (ahem) Functions
4429	  // --------------------
4430
4431	  // Delays a function for the given number of milliseconds, and then calls
4432	  // it with the arguments supplied.
4433	  _.delay = function(func, wait) {
4434	    var args = slice.call(arguments, 2);
4435	    return setTimeout(function(){ return func.apply(null, args); }, wait);
4436	  };
4437
4438	  // Defers a function, scheduling it to run after the current call stack has
4439	  // cleared.
4440	  _.defer = function(func) {
4441	    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
4442	  };
4443
4444	  // Returns a function, that, when invoked, will only be triggered once every
4445	  // browser animation frame - using tram's requestAnimationFrame polyfill.
4446	  _.throttle = function(func) {
4447	    var wait, args, context;
4448	    return function() {
4449	      if (wait) return;
4450	      wait = true;
4451	      args = arguments;
4452	      context = this;
4453	      tram.frame(function() {
4454	        wait = false;
4455	        func.apply(context, args);
4456	      });
4457	    };
4458	  };
4459
4460	  // Returns a function, that, as long as it continues to be invoked, will not
4461	  // be triggered. The function will be called after it stops being called for
4462	  // N milliseconds. If `immediate` is passed, trigger the function on the
4463	  // leading edge, instead of the trailing.
4464	  _.debounce = function(func, wait, immediate) {
4465	    var timeout, args, context, timestamp, result;
4466
4467	    var later = function() {
4468	      var last = _.now() - timestamp;
4469	      if (last < wait) {
4470	        timeout = setTimeout(later, wait - last);
4471	      } else {
4472	        timeout = null;
4473	        if (!immediate) {
4474	          result = func.apply(context, args);
4475	          context = args = null;
4476	        }
4477	      }
4478	    };
4479
4480	    return function() {
4481	      context = this;
4482	      args = arguments;
4483	      timestamp = _.now();
4484	      var callNow = immediate && !timeout;
4485	      if (!timeout) {
4486	        timeout = setTimeout(later, wait);
4487	      }
4488	      if (callNow) {
4489	        result = func.apply(context, args);
4490	        context = args = null;
4491	      }
4492
4493	      return result;
4494	    };
4495	  };
4496
4497	  // Object Functions
4498	  // ----------------
4499
4500	  // Fill in a given object with default properties.
4501	  _.defaults = function(obj) {
4502	    if (!_.isObject(obj)) return obj;
4503	    for (var i = 1, length = arguments.length; i < length; i++) {
4504	      var source = arguments[i];
4505	      for (var prop in source) {
4506	        if (obj[prop] === void 0) obj[prop] = source[prop];
4507	      }
4508	    }
4509	    return obj;
4510	  };
4511
4512	  // Retrieve the names of an object's properties.
4513	  // Delegates to **ECMAScript 5**'s native `Object.keys`
4514	  _.keys = function(obj) {
4515	    if (!_.isObject(obj)) return [];
4516	    if (nativeKeys) return nativeKeys(obj);
4517	    var keys = [];
4518	    for (var key in obj) if (_.has(obj, key)) keys.push(key);
4519	    return keys;
4520	  };
4521
4522	  // Shortcut function for checking if an object has a given property directly
4523	  // on itself (in other words, not on a prototype).
4524	  _.has = function(obj, key) {
4525	    return hasOwnProperty.call(obj, key);
4526	  };
4527
4528	  // Is a given variable an object?
4529	  _.isObject = function(obj) {
4530	    return obj === Object(obj);
4531	  };
4532
4533	  // Utility Functions
4534	  // -----------------
4535
4536	  // A (possibly faster) way to get the current timestamp as an integer.
4537	  _.now = Date.now || function() { return new Date().getTime(); };
4538
4539	  // By default, Underscore uses ERB-style template delimiters, change the
4540	  // following template settings to use alternative delimiters.
4541	  _.templateSettings = {
4542	    evaluate    : /<%([\s\S]+?)%>/g,
4543	    interpolate : /<%=([\s\S]+?)%>/g,
4544	    escape      : /<%-([\s\S]+?)%>/g
4545	  };
4546
4547	  // When customizing `templateSettings`, if you don't want to define an
4548	  // interpolation, evaluation or escaping regex, we need one that is
4549	  // guaranteed not to match.
4550	  var noMatch = /(.)^/;
4551
4552	  // Certain characters need to be escaped so that they can be put into a
4553	  // string literal.
4554	  var escapes = {
4555	    "'":      "'",
4556	    '\\':     '\\',
4557	    '\r':     'r',
4558	    '\n':     'n',
4559	    '\u2028': 'u2028',
4560	    '\u2029': 'u2029'
4561	  };
4562
4563	  var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
4564
4565	  var escapeChar = function(match) {
4566	    return '\\' + escapes[match];
4567	  };
4568
4569	  // JavaScript micro-templating, similar to John Resig's implementation.
4570	  // Underscore templating handles arbitrary delimiters, preserves whitespace,
4571	  // and correctly escapes quotes within interpolated code.
4572	  // NB: `oldSettings` only exists for backwards compatibility.
4573	  _.template = function(text, settings, oldSettings) {
4574	    if (!settings && oldSettings) settings = oldSettings;
4575	    settings = _.defaults({}, settings, _.templateSettings);
4576
4577	    // Combine delimiters into one regular expression via alternation.
4578	    var matcher = RegExp([
4579	      (settings.escape || noMatch).source,
4580	      (settings.interpolate || noMatch).source,
4581	      (settings.evaluate || noMatch).source
4582	    ].join('|') + '|$', 'g');
4583
4584	    // Compile the template source, escaping string literals appropriately.
4585	    var index = 0;
4586	    var source = "__p+='";
4587	    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
4588	      source += text.slice(index, offset).replace(escaper, escapeChar);
4589	      index = offset + match.length;
4590
4591	      if (escape) {
4592	        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
4593	      } else if (interpolate) {
4594	        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
4595	      } else if (evaluate) {
4596	        source += "';\n" + evaluate + "\n__p+='";
4597	      }
4598
4599	      // Adobe VMs need the match returned to produce the correct offest.
4600	      return match;
4601	    });
4602	    source += "';\n";
4603
4604	    // If a variable is not specified, place data values in local scope.
4605	    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
4606
4607	    source = "var __t,__p='',__j=Array.prototype.join," +
4608	      "print=function(){__p+=__j.call(arguments,'');};\n" +
4609	      source + 'return __p;\n';
4610
4611	    try {
4612	      var render = new Function(settings.variable || 'obj', '_', source);
4613	    } catch (e) {
4614	      e.source = source;
4615	      throw e;
4616	    }
4617
4618	    var template = function(data) {
4619	      return render.call(this, data, _);
4620	    };
4621
4622	    // Provide the compiled source as a convenience for precompilation.
4623	    var argument = settings.variable || 'obj';
4624	    template.source = 'function(' + argument + '){\n' + source + '}';
4625
4626	    return template;
4627	  };
4628
4629	  // Export underscore
4630	  return _;
4631	}());
4632
4633
4634/***/ },
4635/* 22 */
4636/***/ function(module, exports) {
4637
4638	/*!
4639	 * jQuery-ajaxTransport-XDomainRequest - v1.0.3
4640	 * 2014-12-16 WEBFLOW - Removed UMD wrapper
4641	 * https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest
4642	 * Copyright (c) 2014 Jason Moon (@JSONMOON)
4643	 * @license MIT (/blob/master/LICENSE.txt)
4644	 */
4645	module.exports=function($){if($.support.cors||!$.ajaxTransport||!window.XDomainRequest){return}var httpRegEx=/^https?:\/\//i;var getOrPostRegEx=/^get|post$/i;var sameSchemeRegEx=new RegExp("^"+location.protocol,"i");$.ajaxTransport("* text html xml json",function(options,userOptions,jqXHR){if(!options.crossDomain||!options.async||!getOrPostRegEx.test(options.type)||!httpRegEx.test(options.url)||!sameSchemeRegEx.test(options.url)){return}var xdr=null;return{send:function(headers,complete){var postData="";var userType=(userOptions.dataType||"").toLowerCase();xdr=new XDomainRequest;if(/^\d+$/.test(userOptions.timeout)){xdr.timeout=userOptions.timeout}xdr.ontimeout=function(){complete(500,"timeout")};xdr.onload=function(){var allResponseHeaders="Content-Length: "+xdr.responseText.length+"\r\nContent-Type: "+xdr.contentType;var status={code:200,message:"success"};var responses={text:xdr.responseText};try{if(userType==="html"||/text\/html/i.test(xdr.contentType)){responses.html=xdr.responseText}else if(userType==="json"||userType!=="text"&&/\/json/i.test(xdr.contentType)){try{responses.json=$.parseJSON(xdr.responseText)}catch(e){status.code=500;status.message="parseerror"}}else if(userType==="xml"||userType!=="text"&&/\/xml/i.test(xdr.contentType)){var doc=new ActiveXObject("Microsoft.XMLDOM");doc.async=false;try{doc.loadXML(xdr.responseText)}catch(e){doc=undefined}if(!doc||!doc.documentElement||doc.getElementsByTagName("parsererror").length){status.code=500;status.message="parseerror";throw"Invalid XML: "+xdr.responseText}responses.xml=doc}}catch(parseMessage){throw parseMessage}finally{complete(status.code,status.message,responses,allResponseHeaders)}};xdr.onprogress=function(){};xdr.onerror=function(){complete(500,"error",{text:xdr.responseText})};if(userOptions.data){postData=$.type(userOptions.data)==="string"?userOptions.data:$.param(userOptions.data)}xdr.open(options.type,options.url);xdr.send(postData)},abort:function(){if(xdr){xdr.abort()}}}})}(window.jQuery);
4646
4647/***/ }
4648/******/ ]);/**
4649 * ----------------------------------------------------------------------
4650 * Webflow: Interactions: Init
4651 */
4652Webflow.require('ix').init([
4653  {"slug":"hide-speaker-overlay","name":"Hide speaker overlay","value":{"style":{"display":"none","opacity":0},"triggers":[]}},
4654  {"slug":"hide-speaker-element","name":"Hide speaker element","value":{"style":{"opacity":0,"x":"0px","y":"20px","z":"0px"},"triggers":[]}},
4655  {"slug":"show-speaker-overlay","name":"Show speaker overlay","value":{"style":{},"triggers":[{"type":"hover","selector":".speaker-overlay","descend":true,"stepsA":[{"display":"block","opacity":1,"transition":"opacity 400ms ease 0ms"}],"stepsB":[{"opacity":0,"transition":"opacity 200ms ease 0ms"}
4655,{"display":"none"}]},{"type":"hover","selector":".speaker-name","descend":true,"stepsA":[{"wait":200},{"opacity":1,"transition":"transform 400ms ease 0ms, opacity 400ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 400ms ease 0ms, opacity 200ms ease 0ms","x":"0px","y":"20px","z":"0px"}]},{"type":"hover","selector":".section-divider","descend":true,"stepsA":[{"opacity":1,"transition":"transform 400ms ease 0ms, opacity 400ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"0px","y":"20px","z":"0px"}]},{"type":"hover","selector":".speaker-title","descend":true,"stepsA":[{"wait":200},{"opacity":1,"transition":"transform 400ms ease 0ms, opacity 400ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"0px","y":"20px","z":"0px"}]},{"type":"hover","selector":".paragraph","descend":true,"stepsA":[{"wait":300},{"opacity":1,"transition":"transform 400ms ease 0ms, opacity 400ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"0px","y":"20px","z":"0px"}]},{"type":"hover","selector":".speaker-social-icons-wrapper","descend":true,"stepsA":[{"wait":500},{"opacity":1,"transition":"transform 400ms ease 0ms, opacity 400ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"0px","y":"20px","z":"0px"}]}]}},
4656  {"slug":"show-program-info","name":"Show program info","value":{"style":{},"triggers":[{"type":"click","selector":".program-hidden-info","siblings":true,"stepsA":[{"display":"block","opacity":1,"height":"auto","transition":"opacity 300ms ease 0ms, height 300ms ease 0ms"}],"stepsB":[{"opacity":0,"height":"0px","transition":"opacity 200ms ease 0ms, height 200ms ease 0ms"},{"display":"none"}]}]}},
4657  {"slug":"hide-program-info","name":"Hide program info","value":{"style":{"display":"none","opacity":0,"height":"0px"},"triggers":[]}},
4658  {"slug":"page-header-fade-in","name":"Page header fade in","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"load","preload":true,"stepsA":[{"wait":200},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}},
4659  {"slug":"page-header-fade-in-2","name":"Page header fade in 2","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"load","preload":true,"stepsA":[{"wait":400},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}},
4660  {"slug":"page-header-fade-in-3","name":"Page header fade in 3","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"load","preload":true,"stepsA":[{"wait":600},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}},
4661  {"slug":"fade-in-on-scroll","name":"Fade in on scroll","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"scroll","offsetBot":"15%","stepsA":[{"wait":500},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}},
4662  {"slug":"fade-in-on-scroll-2","name":"Fade in on scroll 2","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"scroll","offsetBot":"15%","stepsA":[{"wait":700},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}},
4663  {"slug":"fade-in-on-scroll-divider","name":"Fade in on scroll (divider)","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"scroll","offsetBot":"15%","stepsA":[{"wait":700},{"opacity":0.2,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}},
4664  {"slug":"fade-in-on-scroll-3","name":"Fade in on scroll 3","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"scroll","offsetBot":"15%","stepsA":[{"wait":900},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}},
4665  {"slug":"fade-in-on-scroll-4","name":"Fade in on scroll 4","value":{"style":{"opacity":0,"x":"0px","y":"30px","z":"0px"},"triggers":[{"type":"scroll","offsetBot":"15%","stepsA":[{"wait":1100},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}},
4666  {"slug":"slider-title","name":"Slider title","value":{"style":{"opacity":0,"x":"30px","y":"0px","z":"0px"},"triggers":[{"type":"slider","stepsA":[{"wait":400},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"30px","y":"0px","z":"0px"}]}]}},
4667  {"slug":"slider-title-2","name":"Slider title 2","value":{"style":{"opacity":0,"x":"30px","y":"0px","z":"0px"},"triggers":[{"type":"slider","stepsA":[{"wait":600},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"30px","y":"0px","z":"0px"}]}]}},
4668  {"slug":"slider-title-3","name":"Slider title 3","value":{"style":{"opacity":0,"x":"30px","y":"0px","z":"0px"},"triggers":[{"type":"slider","stepsA":[{"wait":800},{"opacity":1,"transition":"transform 500ms ease 0ms, opacity 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}],"stepsB":[{"opacity":0,"transition":"transform 200ms ease 0ms, opacity 200ms ease 0ms","x":"30px","y":"0px","z":"0px"}]}]}}
4669]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.