'), this.$element.append(this.$stage.parent()), this.replace(this.$element.children().not(this.$stage.parent())), this._width = this.$element.width(), this.refresh(), this.$element.removeClass("owl-loading").addClass("owl-loaded"), this.eventsCall(), this.internalEvents(), this.addTriggerableEvents(), this.trigger("initialized")
+ }, e.prototype.setup = function() {
+ var b = this.viewport(),
+ c = this.options.responsive,
+ d = -1,
+ e = null;
+ c ? (a.each(c, function(a) {
+ b >= a && a > d && (d = Number(a))
+ }), e = a.extend({}, this.options, c[d]), delete e.responsive, e.responsiveClass && this.$element.attr("class", function(a, b) {
+ return b.replace(/\b owl-responsive-\S+/g, "")
+ }).addClass("owl-responsive-" + d)) : e = a.extend({}, this.options), (null === this.settings || this._breakpoint !== d) && (this.trigger("change", {
+ property: {
+ name: "settings",
+ value: e
+ }
+ }), this._breakpoint = d, this.settings = e, this.invalidate("settings"), this.trigger("changed", {
+ property: {
+ name: "settings",
+ value: this.settings
+ }
+ }))
+ }, e.prototype.optionsLogic = function() {
+ this.$element.toggleClass("owl-center", this.settings.center), this.settings.loop && this._items.length < this.settings.items && (this.settings.loop = !1), this.settings.autoWidth && (this.settings.stagePadding = !1, this.settings.merge = !1)
+ }, e.prototype.prepare = function(b) {
+ var c = this.trigger("prepare", {
+ content: b
+ });
+ return c.data || (c.data = a("<" + this.settings.itemElement + "/>").addClass(this.settings.itemClass).append(b)), this.trigger("prepared", {
+ content: c.data
+ }), c.data
+ }, e.prototype.update = function() {
+ for (var b = 0, c = this._pipe.length, d = a.proxy(function(a) {
+ return this[a]
+ }, this._invalidated), e = {}; c > b;)(this._invalidated.all || a.grep(this._pipe[b].filter, d).length > 0) && this._pipe[b].run(e), b++;
+ this._invalidated = {}
+ }, e.prototype.width = function(a) {
+ switch (a = a || e.Width.Default) {
+ case e.Width.Inner:
+ case e.Width.Outer:
+ return this._width;
+ default:
+ return this._width - 2 * this.settings.stagePadding + this.settings.margin
+ }
+ }, e.prototype.refresh = function() {
+ if (0 === this._items.length) return !1;
+ (new Date).getTime();
+ this.trigger("refresh"), this.setup(), this.optionsLogic(), this.$stage.addClass("owl-refresh"), this.update(), this.$stage.removeClass("owl-refresh"), this.state.orientation = b.orientation, this.watchVisibility(), this.trigger("refreshed")
+ }, e.prototype.eventsCall = function() {
+ this.e._onDragStart = a.proxy(function(a) {
+ this.onDragStart(a)
+ }, this), this.e._onDragMove = a.proxy(function(a) {
+ this.onDragMove(a)
+ }, this), this.e._onDragEnd = a.proxy(function(a) {
+ this.onDragEnd(a)
+ }, this), this.e._onResize = a.proxy(function(a) {
+ this.onResize(a)
+ }, this), this.e._transitionEnd = a.proxy(function(a) {
+ this.transitionEnd(a)
+ }, this), this.e._preventClick = a.proxy(function(a) {
+ this.preventClick(a)
+ }, this)
+ }, e.prototype.onThrottledResize = function() {
+ b.clearTimeout(this.resizeTimer), this.resizeTimer = b.setTimeout(this.e._onResize, this.settings.responsiveRefreshRate)
+ }, e.prototype.onResize = function() {
+ return this._items.length ? this._width === this.$element.width() ? !1 : this.trigger("resize").isDefaultPrevented() ? !1 : (this._width = this.$element.width(), this.invalidate("width"), this.refresh(), void this.trigger("resized")) : !1
+ }, e.prototype.eventsRouter = function(a) {
+ var b = a.type;
+ "mousedown" === b || "touchstart" === b ? this.onDragStart(a) : "mousemove" === b || "touchmove" === b ? this.onDragMove(a) : "mouseup" === b || "touchend" === b ? this.onDragEnd(a) : "touchcancel" === b && this.onDragEnd(a)
+ }, e.prototype.internalEvents = function() {
+ var c = (k(), l());
+ this.settings.mouseDrag ? (this.$stage.on("mousedown", a.proxy(function(a) {
+ this.eventsRouter(a)
+ }, this)), this.$stage.on("dragstart", function() {
+ return !1
+ }), this.$stage.get(0).onselectstart = function() {
+ return !1
+ }) : this.$element.addClass("owl-text-select-on"), this.settings.touchDrag && !c && this.$stage.on("touchstart touchcancel", a.proxy(function(a) {
+ this.eventsRouter(a)
+ }, this)), this.transitionEndVendor && this.on(this.$stage.get(0), this.transitionEndVendor, this.e._transitionEnd, !1), this.settings.responsive !== !1 && this.on(b, "resize", a.proxy(this.onThrottledResize, this))
+ }, e.prototype.onDragStart = function(d) {
+ var e, g, h, i;
+ if (e = d.originalEvent || d || b.event, 3 === e.which || this.state.isTouch) return !1;
+ if ("mousedown" === e.type && this.$stage.addClass("owl-grab"), this.trigger("drag"), this.drag.startTime = (new Date).getTime(), this.speed(0), this.state.isTouch = !0, this.state.isScrolling = !1, this.state.isSwiping = !1, this.drag.distance = 0, g = f(e).x, h = f(e).y, this.drag.offsetX = this.$stage.position().left, this.drag.offsetY = this.$stage.position().top, this.settings.rtl && (this.drag.offsetX = this.$stage.position().left + this.$stage.width() - this.width() + this.settings.margin), this.state.inMotion && this.support3d) i = this.getTransformProperty(), this.drag.offsetX = i, this.animate(i), this.state.inMotion = !0;
+ else if (this.state.inMotion && !this.support3d) return this.state.inMotion = !1, !1;
+ this.drag.startX = g - this.drag.offsetX, this.drag.startY = h - this.drag.offsetY, this.drag.start = g - this.drag.startX, this.drag.targetEl = e.target || e.srcElement, this.drag.updatedX = this.drag.start, ("IMG" === this.drag.targetEl.tagName || "A" === this.drag.targetEl.tagName) && (this.drag.targetEl.draggable = !1), a(c).on("mousemove.owl.dragEvents mouseup.owl.dragEvents touchmove.owl.dragEvents touchend.owl.dragEvents", a.proxy(function(a) {
+ this.eventsRouter(a)
+ }, this))
+ }, e.prototype.onDragMove = function(a) {
+ var c, e, g, h, i, j;
+ this.state.isTouch && (this.state.isScrolling || (c = a.originalEvent || a || b.event, e = f(c).x, g = f(c).y, this.drag.currentX = e - this.drag.startX, this.drag.currentY = g - this.drag.startY, this.drag.distance = this.drag.currentX - this.drag.offsetX, this.drag.distance < 0 ? this.state.direction = this.settings.rtl ? "right" : "left" : this.drag.distance > 0 && (this.state.direction = this.settings.rtl ? "left" : "right"), this.settings.loop ? this.op(this.drag.currentX, ">", this.coordinates(this.minimum())) && "right" === this.state.direction ? this.drag.currentX -= (this.settings.center && this.coordinates(0)) - this.coordinates(this._items.length) : this.op(this.drag.currentX, "<", this.coordinates(this.maximum())) && "left" === this.state.direction && (this.drag.currentX += (this.settings.center && this.coordinates(0)) - this.coordinates(this._items.length)) : (h = this.coordinates(this.settings.rtl ? this.maximum() : this.minimum()), i = this.coordinates(this.settings.rtl ? this.minimum() : this.maximum()), j = this.settings.pullDrag ? this.drag.distance / 5 : 0, this.drag.currentX = Math.max(Math.min(this.drag.currentX, h + j), i + j)), (this.drag.distance > 8 || this.drag.distance < -8) && (c.preventDefault !== d ? c.preventDefault() : c.returnValue = !1, this.state.isSwiping = !0), this.drag.updatedX = this.drag.currentX, (this.drag.currentY > 16 || this.drag.currentY < -16) && this.state.isSwiping === !1 && (this.state.isScrolling = !0, this.drag.updatedX = this.drag.start), this.animate(this.drag.updatedX)))
+ }, e.prototype.onDragEnd = function(b) {
+ var d, e, f;
+ if (this.state.isTouch) {
+ if ("mouseup" === b.type && this.$stage.removeClass("owl-grab"), this.trigger("dragged"), this.drag.targetEl.removeAttribute("draggable"), this.state.isTouch = !1, this.state.isScrolling = !1, this.state.isSwiping = !1, 0 === this.drag.distance && this.state.inMotion !== !0) return this.state.inMotion = !1, !1;
+ this.drag.endTime = (new Date).getTime(), d = this.drag.endTime - this.drag.startTime, e = Math.abs(this.drag.distance), (e > 3 || d > 300) && this.removeClick(this.drag.targetEl), f = this.closest(this.drag.updatedX), this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed), this.current(f), this.invalidate("position"), this.update(), this.settings.pullDrag || this.drag.updatedX !== this.coordinates(f) || this.transitionEnd(), this.drag.distance = 0, a(c).off(".owl.dragEvents")
+ }
+ }, e.prototype.removeClick = function(c) {
+ this.drag.targetEl = c, a(c).on("click.preventClick", this.e._preventClick), b.setTimeout(function() {
+ a(c).off("click.preventClick")
+ }, 300)
+ }, e.prototype.preventClick = function(b) {
+ b.preventDefault ? b.preventDefault() : b.returnValue = !1, b.stopPropagation && b.stopPropagation(), a(b.target).off("click.preventClick")
+ }, e.prototype.getTransformProperty = function() {
+ var a, c;
+ return a = b.getComputedStyle(this.$stage.get(0), null).getPropertyValue(this.vendorName + "transform"), a = a.replace(/matrix(3d)?\(|\)/g, "").split(","), c = 16 === a.length, c !== !0 ? a[4] : a[12]
+ }, e.prototype.closest = function(b) {
+ var c = -1,
+ d = 30,
+ e = this.width(),
+ f = this.coordinates();
+ return this.settings.freeDrag || a.each(f, a.proxy(function(a, g) {
+ return b > g - d && g + d > b ? c = a : this.op(b, "<", g) && this.op(b, ">", f[a + 1] || g - e) && (c = "left" === this.state.direction ? a + 1 : a), -1 === c
+ }, this)), this.settings.loop || (this.op(b, ">", f[this.minimum()]) ? c = b = this.minimum() : this.op(b, "<", f[this.maximum()]) && (c = b = this.maximum())), c
+ }, e.prototype.animate = function(b) {
+ this.trigger("translate"), this.state.inMotion = this.speed() > 0, this.support3d ? this.$stage.css({
+ transform: "translate3d(" + b + "px,0px, 0px)",
+ transition: this.speed() / 1e3 + "s"
+ }) : this.state.isTouch ? this.$stage.css({
+ left: b + "px"
+ }) : this.$stage.animate({
+ left: b
+ }, this.speed() / 1e3, this.settings.fallbackEasing, a.proxy(function() {
+ this.state.inMotion && this.transitionEnd()
+ }, this))
+ }, e.prototype.current = function(a) {
+ if (a === d) return this._current;
+ if (0 === this._items.length) return d;
+ if (a = this.normalize(a), this._current !== a) {
+ var b = this.trigger("change", {
+ property: {
+ name: "position",
+ value: a
+ }
+ });
+ b.data !== d && (a = this.normalize(b.data)), this._current = a, this.invalidate("position"), this.trigger("changed", {
+ property: {
+ name: "position",
+ value: this._current
+ }
+ })
+ }
+ return this._current
+ }, e.prototype.invalidate = function(a) {
+ this._invalidated[a] = !0
+ }, e.prototype.reset = function(a) {
+ a = this.normalize(a), a !== d && (this._speed = 0, this._current = a, this.suppress(["translate", "translated"]), this.animate(this.coordinates(a)), this.release(["translate", "translated"]))
+ }, e.prototype.normalize = function(b, c) {
+ var e = c ? this._items.length : this._items.length + this._clones.length;
+ return !a.isNumeric(b) || 1 > e ? d : b = this._clones.length ? (b % e + e) % e : Math.max(this.minimum(c), Math.min(this.maximum(c), b))
+ }, e.prototype.relative = function(a) {
+ return a = this.normalize(a), a -= this._clones.length / 2, this.normalize(a, !0)
+ }, e.prototype.maximum = function(a) {
+ var b, c, d, e = 0,
+ f = this.settings;
+ if (a) return this._items.length - 1;
+ if (!f.loop && f.center) b = this._items.length - 1;
+ else if (f.loop || f.center)
+ if (f.loop || f.center) b = this._items.length + f.items;
+ else {
+ if (!f.autoWidth && !f.merge) throw "Can not detect maximum absolute position.";
+ for (revert = f.rtl ? 1 : -1, c = this.$stage.width() - this.$element.width();
+ (d = this.coordinates(e)) && !(d * revert >= c);) b = ++e
+ } else b = this._items.length - f.items;
+ return b
+ }, e.prototype.minimum = function(a) {
+ return a ? 0 : this._clones.length / 2
+ }, e.prototype.items = function(a) {
+ return a === d ? this._items.slice() : (a = this.normalize(a, !0), this._items[a])
+ }, e.prototype.mergers = function(a) {
+ return a === d ? this._mergers.slice() : (a = this.normalize(a, !0), this._mergers[a])
+ }, e.prototype.clones = function(b) {
+ var c = this._clones.length / 2,
+ e = c + this._items.length,
+ f = function(a) {
+ return a % 2 === 0 ? e + a / 2 : c - (a + 1) / 2
+ };
+ return b === d ? a.map(this._clones, function(a, b) {
+ return f(b)
+ }) : a.map(this._clones, function(a, c) {
+ return a === b ? f(c) : null
+ })
+ }, e.prototype.speed = function(a) {
+ return a !== d && (this._speed = a), this._speed
+ }, e.prototype.coordinates = function(b) {
+ var c = null;
+ return b === d ? a.map(this._coordinates, a.proxy(function(a, b) {
+ return this.coordinates(b)
+ }, this)) : (this.settings.center ? (c = this._coordinates[b], c += (this.width() - c + (this._coordinates[b - 1] || 0)) / 2 * (this.settings.rtl ? -1 : 1)) : c = this._coordinates[b - 1] || 0, c)
+ }, e.prototype.duration = function(a, b, c) {
+ return Math.min(Math.max(Math.abs(b - a), 1), 6) * Math.abs(c || this.settings.smartSpeed)
+ }, e.prototype.to = function(c, d) {
+ if (this.settings.loop) {
+ var e = c - this.relative(this.current()),
+ f = this.current(),
+ g = this.current(),
+ h = this.current() + e,
+ i = 0 > g - h ? !0 : !1,
+ j = this._clones.length + this._items.length;
+ h < this.settings.items && i === !1 ? (f = g + this._items.length, this.reset(f)) : h >= j - this.settings.items && i === !0 && (f = g - this._items.length, this.reset(f)), b.clearTimeout(this.e._goToLoop), this.e._goToLoop = b.setTimeout(a.proxy(function() {
+ this.speed(this.duration(this.current(), f + e, d)), this.current(f + e), this.update()
+ }, this), 30)
+ } else this.speed(this.duration(this.current(), c, d)), this.current(c), this.update()
+ }, e.prototype.next = function(a) {
+ a = a || !1, this.to(this.relative(this.current()) + 1, a)
+ }, e.prototype.prev = function(a) {
+ a = a || !1, this.to(this.relative(this.current()) - 1, a)
+ }, e.prototype.transitionEnd = function(a) {
+ return a !== d && (a.stopPropagation(), (a.target || a.srcElement || a.originalTarget) !== this.$stage.get(0)) ? !1 : (this.state.inMotion = !1, void this.trigger("translated"))
+ }, e.prototype.viewport = function() {
+ var d;
+ if (this.options.responsiveBaseElement !== b) d = a(this.options.responsiveBaseElement).width();
+ else if (b.innerWidth) d = b.innerWidth;
+ else {
+ if (!c.documentElement || !c.documentElement.clientWidth) throw "Can not detect viewport width.";
+ d = c.documentElement.clientWidth
+ }
+ return d
+ }, e.prototype.replace = function(b) {
+ this.$stage.empty(), this._items = [], b && (b = b instanceof jQuery ? b : a(b)), this.settings.nestedItemSelector && (b = b.find("." + this.settings.nestedItemSelector)), b.filter(function() {
+ return 1 === this.nodeType
+ }).each(a.proxy(function(a, b) {
+ b = this.prepare(b), this.$stage.append(b), this._items.push(b), this._mergers.push(1 * b.find("[data-merge]").andSelf("[data-merge]").attr("data-merge") || 1)
+ }, this)), this.reset(a.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0), this.invalidate("items")
+ }, e.prototype.add = function(a, b) {
+ b = b === d ? this._items.length : this.normalize(b, !0), this.trigger("add", {
+ content: a,
+ position: b
+ }), 0 === this._items.length || b === this._items.length ? (this.$stage.append(a), this._items.push(a), this._mergers.push(1 * a.find("[data-merge]").andSelf("[data-merge]").attr("data-merge") || 1)) : (this._items[b].before(a), this._items.splice(b, 0, a), this._mergers.splice(b, 0, 1 * a.find("[data-merge]").andSelf("[data-merge]").attr("data-merge") || 1)), this.invalidate("items"), this.trigger("added", {
+ content: a,
+ position: b
+ })
+ }, e.prototype.remove = function(a) {
+ a = this.normalize(a, !0), a !== d && (this.trigger("remove", {
+ content: this._items[a],
+ position: a
+ }), this._items[a].remove(), this._items.splice(a, 1), this._mergers.splice(a, 1), this.invalidate("items"), this.trigger("removed", {
+ content: null,
+ position: a
+ }))
+ }, e.prototype.addTriggerableEvents = function() {
+ var b = a.proxy(function(b, c) {
+ return a.proxy(function(a) {
+ a.relatedTarget !== this && (this.suppress([c]), b.apply(this, [].slice.call(arguments, 1)), this.release([c]))
+ }, this)
+ }, this);
+ a.each({
+ next: this.next,
+ prev: this.prev,
+ to: this.to,
+ destroy: this.destroy,
+ refresh: this.refresh,
+ replace: this.replace,
+ add: this.add,
+ remove: this.remove
+ }, a.proxy(function(a, c) {
+ this.$element.on(a + ".owl.carousel", b(c, a + ".owl.carousel"))
+ }, this))
+ }, e.prototype.watchVisibility = function() {
+ function c(a) {
+ return a.offsetWidth > 0 && a.offsetHeight > 0
+ }
+
+ function d() {
+ c(this.$element.get(0)) && (this.$element.removeClass("owl-hidden"), this.refresh(), b.clearInterval(this.e._checkVisibile))
+ }
+ c(this.$element.get(0)) || (this.$element.addClass("owl-hidden"), b.clearInterval(this.e._checkVisibile), this.e._checkVisibile = b.setInterval(a.proxy(d, this), 500))
+ }, e.prototype.preloadAutoWidthImages = function(b) {
+ var c, d, e, f;
+ c = 0, d = this, b.each(function(g, h) {
+ e = a(h), f = new Image, f.onload = function() {
+ c++, e.attr("src", f.src), e.css("opacity", 1), c >= b.length && (d.state.imagesLoaded = !0, d.initialize())
+ }, f.src = e.attr("src") || e.attr("data-src") || e.attr("data-src-retina")
+ })
+ }, e.prototype.destroy = function() {
+ this.$element.hasClass(this.settings.themeClass) && this.$element.removeClass(this.settings.themeClass), this.settings.responsive !== !1 && a(b).off("resize.owl.carousel"), this.transitionEndVendor && this.off(this.$stage.get(0), this.transitionEndVendor, this.e._transitionEnd);
+ for (var d in this._plugins) this._plugins[d].destroy();
+ (this.settings.mouseDrag || this.settings.touchDrag) && (this.$stage.off("mousedown touchstart touchcancel"), a(c).off(".owl.dragEvents"), this.$stage.get(0).onselectstart = function() {}, this.$stage.off("dragstart", function() {
+ return !1
+ })), this.$element.off(".owl"), this.$stage.children(".cloned").remove(), this.e = null, this.$element.removeData("owlCarousel"), this.$stage.children().contents().unwrap(), this.$stage.children().unwrap(), this.$stage.unwrap()
+ }, e.prototype.op = function(a, b, c) {
+ var d = this.settings.rtl;
+ switch (b) {
+ case "<":
+ return d ? a > c : c > a;
+ case ">":
+ return d ? c > a : a > c;
+ case ">=":
+ return d ? c >= a : a >= c;
+ case "<=":
+ return d ? a >= c : c >= a
+ }
+ }, e.prototype.on = function(a, b, c, d) {
+ a.addEventListener ? a.addEventListener(b, c, d) : a.attachEvent && a.attachEvent("on" + b, c)
+ }, e.prototype.off = function(a, b, c, d) {
+ a.removeEventListener ? a.removeEventListener(b, c, d) : a.detachEvent && a.detachEvent("on" + b, c)
+ }, e.prototype.trigger = function(b, c, d) {
+ var e = {
+ item: {
+ count: this._items.length,
+ index: this.current()
+ }
+ },
+ f = a.camelCase(a.grep(["on", b, d], function(a) {
+ return a
+ }).join("-").toLowerCase()),
+ g = a.Event([b, "owl", d || "carousel"].join(".").toLowerCase(), a.extend({
+ relatedTarget: this
+ }, e, c));
+ return this._supress[b] || (a.each(this._plugins, function(a, b) {
+ b.onTrigger && b.onTrigger(g)
+ }), this.$element.trigger(g), this.settings && "function" == typeof this.settings[f] && this.settings[f].apply(this, g)), g
+ }, e.prototype.suppress = function(b) {
+ a.each(b, a.proxy(function(a, b) {
+ this._supress[b] = !0
+ }, this))
+ }, e.prototype.release = function(b) {
+ a.each(b, a.proxy(function(a, b) {
+ delete this._supress[b]
+ }, this))
+ }, e.prototype.browserSupport = function() {
+ if (this.support3d = j(), this.support3d) {
+ this.transformVendor = i();
+ var a = ["transitionend", "webkitTransitionEnd", "transitionend", "oTransitionEnd"];
+ this.transitionEndVendor = a[h()], this.vendorName = this.transformVendor.replace(/Transform/i, ""), this.vendorName = "" !== this.vendorName ? "-" + this.vendorName.toLowerCase() + "-" : ""
+ }
+ this.state.orientation = b.orientation
+ }, a.fn.owlCarousel = function(b) {
+ return this.each(function() {
+ a(this).data("owlCarousel") || a(this).data("owlCarousel", new e(this, b))
+ })
+ }, a.fn.owlCarousel.Constructor = e
+}(window.Zepto || window.jQuery, window, document),
+function(a, b) {
+ var c = function(b) {
+ this._core = b, this._loaded = [], this._handlers = {
+ "initialized.owl.carousel change.owl.carousel": a.proxy(function(b) {
+ if (b.namespace && this._core.settings && this._core.settings.lazyLoad && (b.property && "position" == b.property.name || "initialized" == b.type))
+ for (var c = this._core.settings, d = c.center && Math.ceil(c.items / 2) || c.items, e = c.center && -1 * d || 0, f = (b.property && b.property.value || this._core.current()) + e, g = this._core.clones().length, h = a.proxy(function(a, b) {
+ this.load(b)
+ }, this); e++ < d;) this.load(g / 2 + this._core.relative(f)), g && a.each(this._core.clones(this._core.relative(f++)), h)
+ }, this)
+ }, this._core.options = a.extend({}, c.Defaults, this._core.options), this._core.$element.on(this._handlers)
+ };
+ c.Defaults = {
+ lazyLoad: !1
+ }, c.prototype.load = function(c) {
+ var d = this._core.$stage.children().eq(c),
+ e = d && d.find(".owl-lazy");
+ !e || a.inArray(d.get(0), this._loaded) > -1 || (e.each(a.proxy(function(c, d) {
+ var e, f = a(d),
+ g = b.devicePixelRatio > 1 && f.attr("data-src-retina") || f.attr("data-src");
+ this._core.trigger("load", {
+ element: f,
+ url: g
+ }, "lazy"), f.is("img") ? f.one("load.owl.lazy", a.proxy(function() {
+ f.css("opacity", 1), this._core.trigger("loaded", {
+ element: f,
+ url: g
+ }, "lazy")
+ }, this)).attr("src", g) : (e = new Image, e.onload = a.proxy(function() {
+ f.css({
+ "background-image": "url(" + g + ")",
+ opacity: "1"
+ }), this._core.trigger("loaded", {
+ element: f,
+ url: g
+ }, "lazy")
+ }, this), e.src = g)
+ }, this)), this._loaded.push(d.get(0)))
+ }, c.prototype.destroy = function() {
+ var a, b;
+ for (a in this.handlers) this._core.$element.off(a, this.handlers[a]);
+ for (b in Object.getOwnPropertyNames(this)) "function" != typeof this[b] && (this[b] = null)
+ }, a.fn.owlCarousel.Constructor.Plugins.Lazy = c
+}(window.Zepto || window.jQuery, window, document),
+function(a) {
+ var b = function(c) {
+ this._core = c, this._handlers = {
+ "initialized.owl.carousel": a.proxy(function() {
+ this._core.settings.autoHeight && this.update()
+ }, this),
+ "changed.owl.carousel": a.proxy(function(a) {
+ this._core.settings.autoHeight && "position" == a.property.name && this.update()
+ }, this),
+ "loaded.owl.lazy": a.proxy(function(a) {
+ this._core.settings.autoHeight && a.element.closest("." + this._core.settings.itemClass) === this._core.$stage.children().eq(this._core.current()) && this.update()
+ }, this)
+ }, this._core.options = a.extend({}, b.Defaults, this._core.options), this._core.$element.on(this._handlers)
+ };
+ b.Defaults = {
+ autoHeight: !1,
+ autoHeightClass: "owl-height"
+ }, b.prototype.update = function() {
+ this._core.$stage.parent().height(this._core.$stage.children().eq(this._core.current()).height()).addClass(this._core.settings.autoHeightClass)
+ }, b.prototype.destroy = function() {
+ var a, b;
+ for (a in this._handlers) this._core.$element.off(a, this._handlers[a]);
+ for (b in Object.getOwnPropertyNames(this)) "function" != typeof this[b] && (this[b] = null)
+ }, a.fn.owlCarousel.Constructor.Plugins.AutoHeight = b
+}(window.Zepto || window.jQuery, window, document),
+function(a, b, c) {
+ var d = function(b) {
+ this._core = b, this._videos = {}, this._playing = null, this._fullscreen = !1, this._handlers = {
+ "resize.owl.carousel": a.proxy(function(a) {
+ this._core.settings.video && !this.isInFullScreen() && a.preventDefault()
+ }, this),
+ "refresh.owl.carousel changed.owl.carousel": a.proxy(function() {
+ this._playing && this.stop()
+ }, this),
+ "prepared.owl.carousel": a.proxy(function(b) {
+ var c = a(b.content).find(".owl-video");
+ c.length && (c.css("display", "none"), this.fetch(c, a(b.content)))
+ }, this)
+ }, this._core.options = a.extend({}, d.Defaults, this._core.options), this._core.$element.on(this._handlers), this._core.$element.on("click.owl.video", ".owl-video-play-icon", a.proxy(function(a) {
+ this.play(a)
+ }, this))
+ };
+ d.Defaults = {
+ video: !1,
+ videoHeight: !1,
+ videoWidth: !1
+ }, d.prototype.fetch = function(a, b) {
+ var c = a.attr("data-vimeo-id") ? "vimeo" : "youtube",
+ d = a.attr("data-vimeo-id") || a.attr("data-youtube-id"),
+ e = a.attr("data-width") || this._core.settings.videoWidth,
+ f = a.attr("data-height") || this._core.settings.videoHeight,
+ g = a.attr("href");
+ if (!g) throw new Error("Missing video URL.");
+ if (d = g.match(/(http:|https:|)\/\/(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(video\/|embed\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/), d[3].indexOf("youtu") > -1) c = "youtube";
+ else {
+ if (!(d[3].indexOf("vimeo") > -1)) throw new Error("Video URL not supported.");
+ c = "vimeo"
+ }
+ d = d[6], this._videos[g] = {
+ type: c,
+ id: d,
+ width: e,
+ height: f
+ }, b.attr("data-video", g), this.thumbnail(a, this._videos[g])
+ }, d.prototype.thumbnail = function(b, c) {
+ var d, e, f, g = c.width && c.height ? 'style="width:' + c.width + "px;height:" + c.height + 'px;"' : "",
+ h = b.find("img"),
+ i = "src",
+ j = "",
+ k = this._core.settings,
+ l = function(a) {
+ e = '
', d = k.lazyLoad ? '
' : '
', b.after(d), b.after(e)
+ };
+ return b.wrap('
"), this._core.settings.lazyLoad && (i = "data-src", j = "owl-lazy"), h.length ? (l(h.attr(i)), h.remove(), !1) : void("youtube" === c.type ? (f = "http://img.youtube.com/vi/" + c.id + "/hqdefault.jpg", l(f)) : "vimeo" === c.type && a.ajax({
+ type: "GET",
+ url: "http://vimeo.com/api/v2/video/" + c.id + ".json",
+ jsonp: "callback",
+ dataType: "jsonp",
+ success: function(a) {
+ f = a[0].thumbnail_large, l(f)
+ }
+ }))
+ }, d.prototype.stop = function() {
+ this._core.trigger("stop", null, "video"), this._playing.find(".owl-video-frame").remove(), this._playing.removeClass("owl-video-playing"), this._playing = null
+ }, d.prototype.play = function(b) {
+ this._core.trigger("play", null, "video"), this._playing && this.stop();
+ var c, d, e = a(b.target || b.srcElement),
+ f = e.closest("." + this._core.settings.itemClass),
+ g = this._videos[f.attr("data-video")],
+ h = g.width || "100%",
+ i = g.height || this._core.$stage.height();
+ "youtube" === g.type ? c = '
' : "vimeo" === g.type && (c = '
'), f.addClass("owl-video-playing"), this._playing = f, d = a('
' + c + "
"), e.after(d)
+ }, d.prototype.isInFullScreen = function() {
+ var d = c.fullscreenElement || c.mozFullScreenElement || c.webkitFullscreenElement;
+ return d && a(d).parent().hasClass("owl-video-frame") && (this._core.speed(0), this._fullscreen = !0), d && this._fullscreen && this._playing ? !1 : this._fullscreen ? (this._fullscreen = !1, !1) : this._playing && this._core.state.orientation !== b.orientation ? (this._core.state.orientation = b.orientation, !1) : !0
+ }, d.prototype.destroy = function() {
+ var a, b;
+ this._core.$element.off("click.owl.video");
+ for (a in this._handlers) this._core.$element.off(a, this._handlers[a]);
+ for (b in Object.getOwnPropertyNames(this)) "function" != typeof this[b] && (this[b] = null)
+ }, a.fn.owlCarousel.Constructor.Plugins.Video = d
+}(window.Zepto || window.jQuery, window, document),
+function(a, b, c, d) {
+ var e = function(b) {
+ this.core = b, this.core.options = a.extend({}, e.Defaults, this.core.options), this.swapping = !0, this.previous = d, this.next = d, this.handlers = {
+ "change.owl.carousel": a.proxy(function(a) {
+ "position" == a.property.name && (this.previous = this.core.current(), this.next = a.property.value)
+ }, this),
+ "drag.owl.carousel dragged.owl.carousel translated.owl.carousel": a.proxy(function(a) {
+ this.swapping = "translated" == a.type
+ }, this),
+ "translate.owl.carousel": a.proxy(function() {
+ this.swapping && (this.core.options.animateOut || this.core.options.animateIn) && this.swap()
+ }, this)
+ }, this.core.$element.on(this.handlers)
+ };
+ e.Defaults = {
+ animateOut: !1,
+ animateIn: !1
+ }, e.prototype.swap = function() {
+ if (1 === this.core.settings.items && this.core.support3d) {
+ this.core.speed(0);
+ var b, c = a.proxy(this.clear, this),
+ d = this.core.$stage.children().eq(this.previous),
+ e = this.core.$stage.children().eq(this.next),
+ f = this.core.settings.animateIn,
+ g = this.core.settings.animateOut;
+ this.core.current() !== this.previous && (g && (b = this.core.coordinates(this.previous) - this.core.coordinates(this.next), d.css({
+ left: b + "px"
+ }).addClass("animated owl-animated-out").addClass(g).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend", c)), f && e.addClass("animated owl-animated-in").addClass(f).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend", c))
+ }
+ }, e.prototype.clear = function(b) {
+ a(b.target).css({
+ left: ""
+ }).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut), this.core.transitionEnd()
+ }, e.prototype.destroy = function() {
+ var a, b;
+ for (a in this.handlers) this.core.$element.off(a, this.handlers[a]);
+ for (b in Object.getOwnPropertyNames(this)) "function" != typeof this[b] && (this[b] = null)
+ }, a.fn.owlCarousel.Constructor.Plugins.Animate = e
+}(window.Zepto || window.jQuery, window, document),
+function(a, b, c) {
+ var d = function(b) {
+ this.core = b, this.core.options = a.extend({}, d.Defaults, this.core.options), this.handlers = {
+ "translated.owl.carousel refreshed.owl.carousel": a.proxy(function() {
+ this.autoplay()
+ }, this),
+ "play.owl.autoplay": a.proxy(function(a, b, c) {
+ this.play(b, c)
+ }, this),
+ "stop.owl.autoplay": a.proxy(function() {
+ this.stop()
+ }, this),
+ "mouseover.owl.autoplay": a.proxy(function() {
+ this.core.settings.autoplayHoverPause && this.pause()
+ }, this),
+ "mouseleave.owl.autoplay": a.proxy(function() {
+ this.core.settings.autoplayHoverPause && this.autoplay()
+ }, this)
+ }, this.core.$element.on(this.handlers)
+ };
+ d.Defaults = {
+ autoplay: !1,
+ autoplayTimeout: 5e3,
+ autoplayHoverPause: !1,
+ autoplaySpeed: !1
+ }, d.prototype.autoplay = function() {
+ this.core.settings.autoplay && !this.core.state.videoPlay ? (b.clearInterval(this.interval), this.interval = b.setInterval(a.proxy(function() {
+ this.play()
+ }, this), this.core.settings.autoplayTimeout)) : b.clearInterval(this.interval)
+ }, d.prototype.play = function() {
+ return c.hidden === !0 || this.core.state.isTouch || this.core.state.isScrolling || this.core.state.isSwiping || this.core.state.inMotion ? void 0 : this.core.settings.autoplay === !1 ? void b.clearInterval(this.interval) : void this.core.next(this.core.settings.autoplaySpeed)
+ }, d.prototype.stop = function() {
+ b.clearInterval(this.interval)
+ }, d.prototype.pause = function() {
+ b.clearInterval(this.interval)
+ }, d.prototype.destroy = function() {
+ var a, c;
+ b.clearInterval(this.interval);
+ for (a in this.handlers) this.core.$element.off(a, this.handlers[a]);
+ for (c in Object.getOwnPropertyNames(this)) "function" != typeof this[c] && (this[c] = null)
+ }, a.fn.owlCarousel.Constructor.Plugins.autoplay = d
+}(window.Zepto || window.jQuery, window, document),
+function(a) {
+ "use strict";
+ var b = function(c) {
+ this._core = c, this._initialized = !1, this._pages = [], this._controls = {}, this._templates = [], this.$element = this._core.$element, this._overrides = {
+ next: this._core.next,
+ prev: this._core.prev,
+ to: this._core.to
+ }, this._handlers = {
+ "prepared.owl.carousel": a.proxy(function(b) {
+ this._core.settings.dotsData && this._templates.push(a(b.content).find("[data-dot]").andSelf("[data-dot]").attr("data-dot"))
+ }, this),
+ "add.owl.carousel": a.proxy(function(b) {
+ this._core.settings.dotsData && this._templates.splice(b.position, 0, a(b.content).find("[data-dot]").andSelf("[data-dot]").attr("data-dot"))
+ }, this),
+ "remove.owl.carousel prepared.owl.carousel": a.proxy(function(a) {
+ this._core.settings.dotsData && this._templates.splice(a.position, 1)
+ }, this),
+ "change.owl.carousel": a.proxy(function(a) {
+ if ("position" == a.property.name && !this._core.state.revert && !this._core.settings.loop && this._core.settings.navRewind) {
+ var b = this._core.current(),
+ c = this._core.maximum(),
+ d = this._core.minimum();
+ a.data = a.property.value > c ? b >= c ? d : c : a.property.value < d ? c : a.property.value
+ }
+ }, this),
+ "changed.owl.carousel": a.proxy(function(a) {
+ "position" == a.property.name && this.draw()
+ }, this),
+ "refreshed.owl.carousel": a.proxy(function() {
+ this._initialized || (this.initialize(), this._initialized = !0), this._core.trigger("refresh", null, "navigation"), this.update(), this.draw(), this._core.trigger("refreshed", null, "navigation")
+ }, this)
+ }, this._core.options = a.extend({}, b.Defaults, this._core.options), this.$element.on(this._handlers)
+ };
+ b.Defaults = {
+ nav: !1,
+ navRewind: !0,
+ navText: ["prev", "next"],
+ navSpeed: !1,
+ navElement: "div",
+ navContainer: !1,
+ navContainerClass: "owl-nav",
+ navClass: ["owl-prev", "owl-next"],
+ slideBy: 1,
+ dotClass: "owl-dot",
+ dotsClass: "owl-dots",
+ dots: !0,
+ dotsEach: !1,
+ dotData: !1,
+ dotsSpeed: !1,
+ dotsContainer: !1,
+ controlsClass: "owl-controls"
+ }, b.prototype.initialize = function() {
+ var b, c, d = this._core.settings;
+ d.dotsData || (this._templates = [a("
").addClass(d.dotClass).append(a("
")).prop("outerHTML")]), d.navContainer && d.dotsContainer || (this._controls.$container = a("").addClass(d.controlsClass).appendTo(this.$element)), this._controls.$indicators = d.dotsContainer ? a(d.dotsContainer) : a("
").hide().addClass(d.dotsClass).appendTo(this._controls.$container), this._controls.$indicators.on("click", "div", a.proxy(function(b) {
+ var c = a(b.target).parent().is(this._controls.$indicators) ? a(b.target).index() : a(b.target).parent().index();
+ b.preventDefault(), this.to(c, d.dotsSpeed)
+ }, this)), b = d.navContainer ? a(d.navContainer) : a("
").addClass(d.navContainerClass).prependTo(this._controls.$container), this._controls.$next = a("<" + d.navElement + ">"), this._controls.$previous = this._controls.$next.clone(), this._controls.$previous.addClass(d.navClass[0]).html(d.navText[0]).hide().prependTo(b).on("click", a.proxy(function() {
+ this.prev(d.navSpeed)
+ }, this)), this._controls.$next.addClass(d.navClass[1]).html(d.navText[1]).hide().appendTo(b).on("click", a.proxy(function() {
+ this.next(d.navSpeed)
+ }, this));
+ for (c in this._overrides) this._core[c] = a.proxy(this[c], this)
+ }, b.prototype.destroy = function() {
+ var a, b, c, d;
+ for (a in this._handlers) this.$element.off(a, this._handlers[a]);
+ for (b in this._controls) this._controls[b].remove();
+ for (d in this.overides) this._core[d] = this._overrides[d];
+ for (c in Object.getOwnPropertyNames(this)) "function" != typeof this[c] && (this[c] = null)
+ }, b.prototype.update = function() {
+ var a, b, c, d = this._core.settings,
+ e = this._core.clones().length / 2,
+ f = e + this._core.items().length,
+ g = d.center || d.autoWidth || d.dotData ? 1 : d.dotsEach || d.items;
+ if ("page" !== d.slideBy && (d.slideBy = Math.min(d.slideBy, d.items)), d.dots || "page" == d.slideBy)
+ for (this._pages = [], a = e, b = 0, c = 0; f > a; a++)(b >= g || 0 === b) && (this._pages.push({
+ start: a - e,
+ end: a - e + g - 1
+ }), b = 0, ++c), b += this._core.mergers(this._core.relative(a))
+ }, b.prototype.draw = function() {
+ var b, c, d = "",
+ e = this._core.settings,
+ f = (this._core.$stage.children(), this._core.relative(this._core.current()));
+ if (!e.nav || e.loop || e.navRewind || (this._controls.$previous.toggleClass("disabled", 0 >= f), this._controls.$next.toggleClass("disabled", f >= this._core.maximum())), this._controls.$previous.toggle(e.nav), this._controls.$next.toggle(e.nav), e.dots) {
+ if (b = this._pages.length - this._controls.$indicators.children().length, e.dotData && 0 !== b) {
+ for (c = 0; c < this._controls.$indicators.children().length; c++) d += this._templates[this._core.relative(c)];
+ this._controls.$indicators.html(d)
+ } else b > 0 ? (d = new Array(b + 1).join(this._templates[0]), this._controls.$indicators.append(d)) : 0 > b && this._controls.$indicators.children().slice(b).remove();
+ this._controls.$indicators.find(".active").removeClass("active"), this._controls.$indicators.children().eq(a.inArray(this.current(), this._pages)).addClass("active")
+ }
+ this._controls.$indicators.toggle(e.dots)
+ }, b.prototype.onTrigger = function(b) {
+ var c = this._core.settings;
+ b.page = {
+ index: a.inArray(this.current(), this._pages),
+ count: this._pages.length,
+ size: c && (c.center || c.autoWidth || c.dotData ? 1 : c.dotsEach || c.items)
+ }
+ }, b.prototype.current = function() {
+ var b = this._core.relative(this._core.current());
+ return a.grep(this._pages, function(a) {
+ return a.start <= b && a.end >= b
+ }).pop()
+ }, b.prototype.getPosition = function(b) {
+ var c, d, e = this._core.settings;
+ return "page" == e.slideBy ? (c = a.inArray(this.current(), this._pages), d = this._pages.length, b ? ++c : --c, c = this._pages[(c % d + d) % d].start) : (c = this._core.relative(this._core.current()), d = this._core.items().length, b ? c += e.slideBy : c -= e.slideBy), c
+ }, b.prototype.next = function(b) {
+ a.proxy(this._overrides.to, this._core)(this.getPosition(!0), b)
+ }, b.prototype.prev = function(b) {
+ a.proxy(this._overrides.to, this._core)(this.getPosition(!1), b)
+ }, b.prototype.to = function(b, c, d) {
+ var e;
+ d ? a.proxy(this._overrides.to, this._core)(b, c) : (e = this._pages.length, a.proxy(this._overrides.to, this._core)(this._pages[(b % e + e) % e].start, c))
+ }, a.fn.owlCarousel.Constructor.Plugins.Navigation = b
+}(window.Zepto || window.jQuery, window, document),
+function(a, b) {
+ "use strict";
+ var c = function(d) {
+ this._core = d, this._hashes = {}, this.$element = this._core.$element, this._handlers = {
+ "initialized.owl.carousel": a.proxy(function() {
+ "URLHash" == this._core.settings.startPosition && a(b).trigger("hashchange.owl.navigation")
+ }, this),
+ "prepared.owl.carousel": a.proxy(function(b) {
+ var c = a(b.content).find("[data-hash]").andSelf("[data-hash]").attr("data-hash");
+ this._hashes[c] = b.content
+ }, this)
+ }, this._core.options = a.extend({}, c.Defaults, this._core.options), this.$element.on(this._handlers), a(b).on("hashchange.owl.navigation", a.proxy(function() {
+ var a = b.location.hash.substring(1),
+ c = this._core.$stage.children(),
+ d = this._hashes[a] && c.index(this._hashes[a]) || 0;
+ return a ? void this._core.to(d, !1, !0) : !1
+ }, this))
+ };
+ c.Defaults = {
+ URLhashListener: !1
+ }, c.prototype.destroy = function() {
+ var c, d;
+ a(b).off("hashchange.owl.navigation");
+ for (c in this._handlers) this._core.$element.off(c, this._handlers[c]);
+ for (d in Object.getOwnPropertyNames(this)) "function" != typeof this[d] && (this[d] = null)
+ }, a.fn.owlCarousel.Constructor.Plugins.Hash = c
+}(window.Zepto || window.jQuery, window, document);
\ No newline at end of file
diff --git a/frontend/src/assets/js/popper.min.js b/frontend/src/assets/js/popper.min.js
new file mode 100644
index 0000000..4553f65
--- /dev/null
+++ b/frontend/src/assets/js/popper.min.js
@@ -0,0 +1,5 @@
+/*
+ Copyright (C) Federico Zivolo 2017
+ Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT).
+ */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=window.getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e||-1!==['HTML','BODY','#document'].indexOf(e.nodeName))return window.document.body;var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:window.document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return window.document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var l=a.commonAncestorContainer;if(e!==l&&t!==l||i.contains(n))return p(l)?l:r(l);var f=s(e);return f.host?d(f.host,t):d(e,s(t).host)}function a(e){var t=1
=o.clientWidth&&i>=o.clientHeight}),l=0i[e]&&!t.escapeWithReference&&(n=V(p[o],i[e]-('right'===e?p.width:p.height))),se({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=de({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=_,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var n=e.placement.split('-')[0],r=e.offsets,p=r.popper,s=r.reference,d=-1!==['left','right'].indexOf(n),a=d?'height':'width',l=d?'Top':'Left',f=l.toLowerCase(),m=d?'left':'top',c=d?'bottom':'right',g=O(i)[a];s[c]-gp[c]&&(e.offsets.popper[f]+=s[f]+g-p[c]);var u=s[f]+s[a]/2-g/2,b=t(e.instance.popper,'margin'+l).replace('px',''),y=u-h(e.offsets.popper)[f]-b;return y=X(V(p[a]-g,y),0),e.arrowElement=i,e.offsets.arrow={},e.offsets.arrow[f]=Math.round(y),e.offsets.arrow[m]='',e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=w(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=L(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case fe.FLIP:p=[i,n];break;case fe.CLOCKWISE:p=K(i);break;case fe.COUNTERCLOCKWISE:p=K(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=L(i);var a=e.offsets.popper,l=e.offsets.reference,f=_,m='left'===i&&f(a.right)>f(l.left)||'right'===i&&f(a.left)f(l.top)||'bottom'===i&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===i&&c||'right'===i&&h||'top'===i&&g||'bottom'===i&&u,y=-1!==['top','bottom'].indexOf(i),w=!!t.flipVariations&&(y&&'start'===r&&c||y&&'end'===r&&h||!y&&'start'===r&&g||!y&&'end'===r&&u);(m||b||w)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),w&&(r=j(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=de({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=N(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[o]-(s?n[p?'width':'height']:0),e.placement=L(t),e.offsets.popper=h(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.right",{id:p.scrollName,href:"#top"}),p.scrollTitle&&d.attr("title",p.scrollTitle),d.appendTo("body"),p.scrollImg||p.scrollTrigger||d.html(p.scrollText),d.css({display:"none",position:"fixed",zIndex:p.zIndex}),p.activeOverlay&&l("",{id:p.scrollName+"-active"}).css({position:"absolute",top:p.scrollDistance+"px",width:"100%",borderTop:"1px dotted"+p.activeOverlay,zIndex:p.zIndex}).appendTo("body"),p.animation){case"fade":s="fadeIn",t="fadeOut",c=p.animationSpeed;break;case"slide":s="slideDown",t="slideUp",c=p.animationSpeed;break;default:s="show",t="hide",c=0}i="top"===p.scrollFrom?p.scrollDistance:l(e).height()-l(o).height()-p.scrollDistance,n=l(o).scroll(function(){l(o).scrollTop()>i?f||(d[s](c),f=!0):f&&(d[t](c),f=!1)}),p.scrollTarget?"number"==typeof p.scrollTarget?a=p.scrollTarget:"string"==typeof p.scrollTarget&&(a=Math.floor(l(p.scrollTarget).offset().top)):a=0,d.click(function(o){o.preventDefault(),l("html, body").animate({scrollTop:a},p.scrollSpeed,p.easingType)})},l.fn.scrollUp.defaults={scrollName:"scrollUp",scrollDistance:300,scrollFrom:"top",scrollSpeed:300,easingType:"linear",animation:"fade",animationSpeed:200,scrollTrigger:!1,scrollTarget:!1,scrollText:"Scroll to top",scrollTitle:!1,scrollImg:!1,activeOverlay:!1,zIndex:2147483647},l.fn.scrollUp.destroy=function(r){l.removeData(e.body,"scrollUp"),l("#"+l.fn.scrollUp.settings.scrollName).remove(),l("#"+l.fn.scrollUp.settings.scrollName+"-active").remove(),l.fn.jquery.split(".")[1]>=7?l(o).off("scroll",r):l(o).unbind("scroll",r)},l.scrollUp=l.fn.scrollUp}(jQuery,window,document);
+
+
diff --git a/frontend/src/assets/js/slicknav.min.js b/frontend/src/assets/js/slicknav.min.js
new file mode 100644
index 0000000..8ef3820
--- /dev/null
+++ b/frontend/src/assets/js/slicknav.min.js
@@ -0,0 +1,6 @@
+/*!
+ * SlickNav Responsive Mobile Menu v1.0.10
+ * (c) 2016 Josh Cope
+ * licensed under MIT
+ */
+!function(e,t,n){function a(t,n){this.element=t,this.settings=e.extend({},i,n),this.settings.duplicate||n.hasOwnProperty("removeIds")||(this.settings.removeIds=!1),this._defaults=i,this._name=s,this.init()}var i={label:"",duplicate:!0,duration:200,easingOpen:"swing",easingClose:"swing",closedSymbol:"►",openedSymbol:"▼",prependTo:"body",appendTo:"",parentTag:"a",closeOnClick:!1,allowParentLinks:!1,nestedParentLinks:!0,showChildren:!1,removeIds:!0,removeClasses:!1,removeStyles:!1,brand:"",animations:"jquery",init:function(){},beforeOpen:function(){},beforeClose:function(){},afterOpen:function(){},afterClose:function(){}},s="slicknav",o="slicknav",l={DOWN:40,ENTER:13,ESCAPE:27,LEFT:37,RIGHT:39,SPACE:32,TAB:9,UP:38};a.prototype.init=function(){var n,a,i=this,s=e(this.element),r=this.settings;if(r.duplicate?i.mobileNav=s.clone():i.mobileNav=s,r.removeIds&&(i.mobileNav.removeAttr("id"),i.mobileNav.find("*").each(function(t,n){e(n).removeAttr("id")})),r.removeClasses&&(i.mobileNav.removeAttr("class"),i.mobileNav.find("*").each(function(t,n){e(n).removeAttr("class")})),r.removeStyles&&(i.mobileNav.removeAttr("style"),i.mobileNav.find("*").each(function(t,n){e(n).removeAttr("style")})),n=o+"_icon",""===r.label&&(n+=" "+o+"_no-text"),"a"==r.parentTag&&(r.parentTag='a href="#"'),i.mobileNav.attr("class",o+"_nav"),a=e(''),""!==r.brand){var c=e(''+r.brand+"
");e(a).append(c)}i.btn=e(["<"+r.parentTag+' aria-haspopup="true" role="button" tabindex="0" class="'+o+"_btn "+o+'_collapsed">','",'','','','',"",""+r.parentTag+">"].join("")),e(a).append(i.btn),""!==r.appendTo?e(r.appendTo).append(a):e(r.prependTo).prepend(a),a.append(i.mobileNav);var p=i.mobileNav.find("li");e(p).each(function(){var t=e(this),n={};if(n.children=t.children("ul").attr("role","menu"),t.data("menu",n),n.children.length>0){var a=t.contents(),s=!1,l=[];e(a).each(function(){return e(this).is("ul")?!1:(l.push(this),void(e(this).is("a")&&(s=!0)))});var c=e("<"+r.parentTag+' role="menuitem" aria-haspopup="true" tabindex="-1" class="'+o+'_item"/>');if(r.allowParentLinks&&!r.nestedParentLinks&&s)e(l).wrapAll('').parent();else{var p=e(l).wrapAll(c).parent();p.addClass(o+"_row")}r.showChildren?t.addClass(o+"_open"):t.addClass(o+"_collapsed"),t.addClass(o+"_parent");var d=e(''+(r.showChildren?r.openedSymbol:r.closedSymbol)+"");r.allowParentLinks&&!r.nestedParentLinks&&s&&(d=d.wrap(c).parent()),e(l).last().after(d)}else 0===t.children().length&&t.addClass(o+"_txtnode");t.children("a").attr("role","menuitem").click(function(t){r.closeOnClick&&!e(t.target).parent().closest("li").hasClass(o+"_parent")&&e(i.btn).click()}),r.closeOnClick&&r.allowParentLinks&&(t.children("a").children("a").click(function(t){e(i.btn).click()}),t.find("."+o+"_parent-link a:not(."+o+"_item)").click(function(t){e(i.btn).click()}))}),e(p).each(function(){var t=e(this).data("menu");r.showChildren||i._visibilityToggle(t.children,null,!1,null,!0)}),i._visibilityToggle(i.mobileNav,null,!1,"init",!0),i.mobileNav.attr("role","menu"),e(t).mousedown(function(){i._outlines(!1)}),e(t).keyup(function(){i._outlines(!0)}),e(i.btn).click(function(e){e.preventDefault(),i._menuToggle()}),i.mobileNav.on("click","."+o+"_item",function(t){t.preventDefault(),i._itemClick(e(this))}),e(i.btn).keydown(function(t){var n=t||event;switch(n.keyCode){case l.ENTER:case l.SPACE:case l.DOWN:t.preventDefault(),n.keyCode===l.DOWN&&e(i.btn).hasClass(o+"_open")||i._menuToggle(),e(i.btn).next().find('[role="menuitem"]').first().focus()}}),i.mobileNav.on("keydown","."+o+"_item",function(t){var n=t||event;switch(n.keyCode){case l.ENTER:t.preventDefault(),i._itemClick(e(t.target));break;case l.RIGHT:t.preventDefault(),e(t.target).parent().hasClass(o+"_collapsed")&&i._itemClick(e(t.target)),e(t.target).next().find('[role="menuitem"]').first().focus()}}),i.mobileNav.on("keydown",'[role="menuitem"]',function(t){var n=t||event;switch(n.keyCode){case l.DOWN:t.preventDefault();var a=e(t.target).parent().parent().children().children('[role="menuitem"]:visible'),s=a.index(t.target),r=s+1;a.length<=r&&(r=0);var c=a.eq(r);c.focus();break;case l.UP:t.preventDefault();var a=e(t.target).parent().parent().children().children('[role="menuitem"]:visible'),s=a.index(t.target),c=a.eq(s-1);c.focus();break;case l.LEFT:if(t.preventDefault(),e(t.target).parent().parent().parent().hasClass(o+"_open")){var p=e(t.target).parent().parent().prev();p.focus(),i._itemClick(p)}else e(t.target).parent().parent().hasClass(o+"_nav")&&(i._menuToggle(),e(i.btn).focus());break;case l.ESCAPE:t.preventDefault(),i._menuToggle(),e(i.btn).focus()}}),r.allowParentLinks&&r.nestedParentLinks&&e("."+o+"_item a").click(function(e){e.stopImmediatePropagation()})},a.prototype._menuToggle=function(e){var t=this,n=t.btn,a=t.mobileNav;n.hasClass(o+"_collapsed")?(n.removeClass(o+"_collapsed"),n.addClass(o+"_open")):(n.removeClass(o+"_open"),n.addClass(o+"_collapsed")),n.addClass(o+"_animating"),t._visibilityToggle(a,n.parent(),!0,n)},a.prototype._itemClick=function(e){var t=this,n=t.settings,a=e.data("menu");a||(a={},a.arrow=e.children("."+o+"_arrow"),a.ul=e.next("ul"),a.parent=e.parent(),a.parent.hasClass(o+"_parent-link")&&(a.parent=e.parent().parent(),a.ul=e.parent().next("ul")),e.data("menu",a)),a.parent.hasClass(o+"_collapsed")?(a.arrow.html(n.openedSymbol),a.parent.removeClass(o+"_collapsed"),a.parent.addClass(o+"_open"),a.parent.addClass(o+"_animating"),t._visibilityToggle(a.ul,a.parent,!0,e)):(a.arrow.html(n.closedSymbol),a.parent.addClass(o+"_collapsed"),a.parent.removeClass(o+"_open"),a.parent.addClass(o+"_animating"),t._visibilityToggle(a.ul,a.parent,!0,e))},a.prototype._visibilityToggle=function(t,n,a,i,s){function l(t,n){e(t).removeClass(o+"_animating"),e(n).removeClass(o+"_animating"),s||p.afterOpen(t)}function r(n,a){t.attr("aria-hidden","true"),d.attr("tabindex","-1"),c._setVisAttr(t,!0),t.hide(),e(n).removeClass(o+"_animating"),e(a).removeClass(o+"_animating"),s?"init"==n&&p.init():p.afterClose(n)}var c=this,p=c.settings,d=c._getActionItems(t),u=0;a&&(u=p.duration),t.hasClass(o+"_hidden")?(t.removeClass(o+"_hidden"),s||p.beforeOpen(i),"jquery"===p.animations?t.stop(!0,!0).slideDown(u,p.easingOpen,function(){l(i,n)}):"velocity"===p.animations&&t.velocity("finish").velocity("slideDown",{duration:u,easing:p.easingOpen,complete:function(){l(i,n)}}),t.attr("aria-hidden","false"),d.attr("tabindex","0"),c._setVisAttr(t,!1)):(t.addClass(o+"_hidden"),s||p.beforeClose(i),"jquery"===p.animations?t.stop(!0,!0).slideUp(u,this.settings.easingClose,function(){r(i,n)}):"velocity"===p.animations&&t.velocity("finish").velocity("slideUp",{duration:u,easing:p.easingClose,complete:function(){r(i,n)}}))},a.prototype._setVisAttr=function(t,n){var a=this,i=t.children("li").children("ul").not("."+o+"_hidden");n?i.each(function(){var t=e(this);t.attr("aria-hidden","true");var i=a._getActionItems(t);i.attr("tabindex","-1"),a._setVisAttr(t,n)}):i.each(function(){var t=e(this);t.attr("aria-hidden","false");var i=a._getActionItems(t);i.attr("tabindex","0"),a._setVisAttr(t,n)})},a.prototype._getActionItems=function(e){var t=e.data("menu");if(!t){t={};var n=e.children("li"),a=n.find("a");t.links=a.add(n.find("."+o+"_item")),e.data("menu",t)}return t.links},a.prototype._outlines=function(t){t?e("."+o+"_item, ."+o+"_btn").css("outline",""):e("."+o+"_item, ."+o+"_btn").css("outline","none")},a.prototype.toggle=function(){var e=this;e._menuToggle()},a.prototype.open=function(){var e=this;e.btn.hasClass(o+"_collapsed")&&e._menuToggle()},a.prototype.close=function(){var e=this;e.btn.hasClass(o+"_open")&&e._menuToggle()},e.fn[s]=function(t){var n=arguments;if(void 0===t||"object"==typeof t)return this.each(function(){e.data(this,"plugin_"+s)||e.data(this,"plugin_"+s,new a(this,t))});if("string"==typeof t&&"_"!==t[0]&&"init"!==t){var i;return this.each(function(){var o=e.data(this,"plugin_"+s);o instanceof a&&"function"==typeof o[t]&&(i=o[t].apply(o,Array.prototype.slice.call(n,1)))}),void 0!==i?i:this}}}(jQuery,document,window);
\ No newline at end of file
diff --git a/frontend/src/assets/js/waypoints.min.js b/frontend/src/assets/js/waypoints.min.js
new file mode 100644
index 0000000..2470db4
--- /dev/null
+++ b/frontend/src/assets/js/waypoints.min.js
@@ -0,0 +1,8 @@
+// Generated by CoffeeScript 1.6.2
+/*
+jQuery Waypoints - v2.0.3
+Copyright (c) 2011-2013 Caleb Troughton
+Dual licensed under the MIT license and GPL license.
+https://github.com/imakewebthings/jquery-waypoints/blob/master/licenses.txt
+*/
+(function(){var t=[].indexOf||function(t){for(var e=0,n=this.length;e=0;s={horizontal:{},vertical:{}};f=1;a={};u="waypoints-context-id";p="resize.waypoints";y="scroll.waypoints";v=1;w="waypoints-waypoint-ids";g="waypoint";m="waypoints";o=function(){function t(t){var e=this;this.$element=t;this.element=t[0];this.didResize=false;this.didScroll=false;this.id="context"+f++;this.oldScroll={x:t.scrollLeft(),y:t.scrollTop()};this.waypoints={horizontal:{},vertical:{}};t.data(u,this.id);a[this.id]=this;t.bind(y,function(){var t;if(!(e.didScroll||c)){e.didScroll=true;t=function(){e.doScroll();return e.didScroll=false};return r.setTimeout(t,n[m].settings.scrollThrottle)}});t.bind(p,function(){var t;if(!e.didResize){e.didResize=true;t=function(){n[m]("refresh");return e.didResize=false};return r.setTimeout(t,n[m].settings.resizeThrottle)}})}t.prototype.doScroll=function(){var t,e=this;t={horizontal:{newScroll:this.$element.scrollLeft(),oldScroll:this.oldScroll.x,forward:"right",backward:"left"},vertical:{newScroll:this.$element.scrollTop(),oldScroll:this.oldScroll.y,forward:"down",backward:"up"}};if(c&&(!t.vertical.oldScroll||!t.vertical.newScroll)){n[m]("refresh")}n.each(t,function(t,r){var i,o,l;l=[];o=r.newScroll>r.oldScroll;i=o?r.forward:r.backward;n.each(e.waypoints[t],function(t,e){var n,i;if(r.oldScroll<(n=e.offset)&&n<=r.newScroll){return l.push(e)}else if(r.newScroll<(i=e.offset)&&i<=r.oldScroll){return l.push(e)}});l.sort(function(t,e){return t.offset-e.offset});if(!o){l.reverse()}return n.each(l,function(t,e){if(e.options.continuous||t===l.length-1){return e.trigger([i])}})});return this.oldScroll={x:t.horizontal.newScroll,y:t.vertical.newScroll}};t.prototype.refresh=function(){var t,e,r,i=this;r=n.isWindow(this.element);e=this.$element.offset();this.doScroll();t={horizontal:{contextOffset:r?0:e.left,contextScroll:r?0:this.oldScroll.x,contextDimension:this.$element.width(),oldScroll:this.oldScroll.x,forward:"right",backward:"left",offsetProp:"left"},vertical:{contextOffset:r?0:e.top,contextScroll:r?0:this.oldScroll.y,contextDimension:r?n[m]("viewportHeight"):this.$element.height(),oldScroll:this.oldScroll.y,forward:"down",backward:"up",offsetProp:"top"}};return n.each(t,function(t,e){return n.each(i.waypoints[t],function(t,r){var i,o,l,s,f;i=r.options.offset;l=r.offset;o=n.isWindow(r.element)?0:r.$element.offset()[e.offsetProp];if(n.isFunction(i)){i=i.apply(r.element)}else if(typeof i==="string"){i=parseFloat(i);if(r.options.offset.indexOf("%")>-1){i=Math.ceil(e.contextDimension*i/100)}}r.offset=o-e.contextOffset+e.contextScroll-i;if(r.options.onlyOnScroll&&l!=null||!r.enabled){return}if(l!==null&&l<(s=e.oldScroll)&&s<=r.offset){return r.trigger([e.backward])}else if(l!==null&&l>(f=e.oldScroll)&&f>=r.offset){return r.trigger([e.forward])}else if(l===null&&e.oldScroll>=r.offset){return r.trigger([e.forward])}})})};t.prototype.checkEmpty=function(){if(n.isEmptyObject(this.waypoints.horizontal)&&n.isEmptyObject(this.waypoints.vertical)){this.$element.unbind([p,y].join(" "));return delete a[this.id]}};return t}();l=function(){function t(t,e,r){var i,o;r=n.extend({},n.fn[g].defaults,r);if(r.offset==="bottom-in-view"){r.offset=function(){var t;t=n[m]("viewportHeight");if(!n.isWindow(e.element)){t=e.$element.height()}return t-n(this).outerHeight()}}this.$element=t;this.element=t[0];this.axis=r.horizontal?"horizontal":"vertical";this.callback=r.handler;this.context=e;this.enabled=r.enabled;this.id="waypoints"+v++;this.offset=null;this.options=r;e.waypoints[this.axis][this.id]=this;s[this.axis][this.id]=this;i=(o=t.data(w))!=null?o:[];i.push(this.id);t.data(w,i)}t.prototype.trigger=function(t){if(!this.enabled){return}if(this.callback!=null){this.callback.apply(this.element,t)}if(this.options.triggerOnce){return this.destroy()}};t.prototype.disable=function(){return this.enabled=false};t.prototype.enable=function(){this.context.refresh();return this.enabled=true};t.prototype.destroy=function(){delete s[this.axis][this.id];delete this.context.waypoints[this.axis][this.id];return this.context.checkEmpty()};t.getWaypointsByElement=function(t){var e,r;r=n(t).data(w);if(!r){return[]}e=n.extend({},s.horizontal,s.vertical);return n.map(r,function(t){return e[t]})};return t}();d={init:function(t,e){var r;if(e==null){e={}}if((r=e.handler)==null){e.handler=t}this.each(function(){var t,r,i,s;t=n(this);i=(s=e.context)!=null?s:n.fn[g].defaults.context;if(!n.isWindow(i)){i=t.closest(i)}i=n(i);r=a[i.data(u)];if(!r){r=new o(i)}return new l(t,r,e)});n[m]("refresh");return this},disable:function(){return d._invoke(this,"disable")},enable:function(){return d._invoke(this,"enable")},destroy:function(){return d._invoke(this,"destroy")},prev:function(t,e){return d._traverse.call(this,t,e,function(t,e,n){if(e>0){return t.push(n[e-1])}})},next:function(t,e){return d._traverse.call(this,t,e,function(t,e,n){if(et.oldScroll.y})},left:function(t){if(t==null){t=r}return h._filter(t,"horizontal",function(t,e){return e.offset<=t.oldScroll.x})},right:function(t){if(t==null){t=r}return h._filter(t,"horizontal",function(t,e){return e.offset>t.oldScroll.x})},enable:function(){return h._invoke("enable")},disable:function(){return h._invoke("disable")},destroy:function(){return h._invoke("destroy")},extendFn:function(t,e){return d[t]=e},_invoke:function(t){var e;e=n.extend({},s.vertical,s.horizontal);return n.each(e,function(e,n){n[t]();return true})},_filter:function(t,e,r){var i,o;i=a[n(t).data(u)];if(!i){return[]}o=[];n.each(i.waypoints[e],function(t,e){if(r(i,e)){return o.push(e)}});o.sort(function(t,e){return t.offset-e.offset});return n.map(o,function(t){return t.element})}};n[m]=function(){var t,n;n=arguments[0],t=2<=arguments.length?e.call(arguments,1):[];if(h[n]){return h[n].apply(null,t)}else{return h.aggregate.call(null,n)}};n[m].settings={resizeThrottle:100,scrollThrottle:30};return i.load(function(){return n[m]("refresh")})})}).call(this);
\ No newline at end of file
diff --git a/frontend/src/assets/webfonts/fa-brands-400.ttf b/frontend/src/assets/webfonts/fa-brands-400.ttf
new file mode 100644
index 0000000..8836d9f
Binary files /dev/null and b/frontend/src/assets/webfonts/fa-brands-400.ttf differ
diff --git a/frontend/src/assets/webfonts/fa-brands-400.woff b/frontend/src/assets/webfonts/fa-brands-400.woff
new file mode 100644
index 0000000..d65148d
Binary files /dev/null and b/frontend/src/assets/webfonts/fa-brands-400.woff differ
diff --git a/frontend/src/assets/webfonts/fa-brands-400.woff2 b/frontend/src/assets/webfonts/fa-brands-400.woff2
new file mode 100644
index 0000000..e2bfe66
Binary files /dev/null and b/frontend/src/assets/webfonts/fa-brands-400.woff2 differ
diff --git a/frontend/src/assets/webfonts/fa-solid-900.ttf b/frontend/src/assets/webfonts/fa-solid-900.ttf
new file mode 100644
index 0000000..9821bea
Binary files /dev/null and b/frontend/src/assets/webfonts/fa-solid-900.ttf differ
diff --git a/frontend/src/assets/webfonts/fa-solid-900.woff b/frontend/src/assets/webfonts/fa-solid-900.woff
new file mode 100644
index 0000000..4932553
Binary files /dev/null and b/frontend/src/assets/webfonts/fa-solid-900.woff differ
diff --git a/frontend/src/assets/webfonts/fa-solid-900.woff2 b/frontend/src/assets/webfonts/fa-solid-900.woff2
new file mode 100644
index 0000000..92c4d57
Binary files /dev/null and b/frontend/src/assets/webfonts/fa-solid-900.woff2 differ
diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts
new file mode 100644
index 0000000..3612073
--- /dev/null
+++ b/frontend/src/environments/environment.prod.ts
@@ -0,0 +1,3 @@
+export const environment = {
+ production: true
+};
diff --git a/frontend/src/environments/environment.ts b/frontend/src/environments/environment.ts
new file mode 100644
index 0000000..f56ff47
--- /dev/null
+++ b/frontend/src/environments/environment.ts
@@ -0,0 +1,16 @@
+// This file can be replaced during build by using the `fileReplacements` array.
+// `ng build` replaces `environment.ts` with `environment.prod.ts`.
+// The list of file replacements can be found in `angular.json`.
+
+export const environment = {
+ production: false
+};
+
+/*
+ * For easier debugging in development mode, you can import the following file
+ * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
+ *
+ * This import should be commented out in production mode because it will have a negative impact
+ * on performance if an error is thrown.
+ */
+// import 'zone.js/plugins/zone-error'; // Included with Angular CLI.
diff --git a/frontend/src/favicon.ico b/frontend/src/favicon.ico
new file mode 100644
index 0000000..997406a
Binary files /dev/null and b/frontend/src/favicon.ico differ
diff --git a/frontend/src/index.html b/frontend/src/index.html
new file mode 100644
index 0000000..4d46671
--- /dev/null
+++ b/frontend/src/index.html
@@ -0,0 +1,77 @@
+
+
+
+
+ Prod
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/main.ts b/frontend/src/main.ts
new file mode 100644
index 0000000..c7b673c
--- /dev/null
+++ b/frontend/src/main.ts
@@ -0,0 +1,12 @@
+import { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app/app.module';
+import { environment } from './environments/environment';
+
+if (environment.production) {
+ enableProdMode();
+}
+
+platformBrowserDynamic().bootstrapModule(AppModule)
+ .catch(err => console.error(err));
diff --git a/frontend/src/polyfills.ts b/frontend/src/polyfills.ts
new file mode 100644
index 0000000..373f538
--- /dev/null
+++ b/frontend/src/polyfills.ts
@@ -0,0 +1,65 @@
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
+ * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
+ * file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/guide/browser-support
+ */
+
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+
+/**
+ * IE11 requires the following for NgClass support on SVG elements
+ */
+// import 'classlist.js'; // Run `npm install --save classlist.js`.
+
+/**
+ * Web Animations `@angular/platform-browser/animations`
+ * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari.
+ * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0).
+ */
+// import 'web-animations-js'; // Run `npm install --save web-animations-js`.
+
+/**
+ * By default, zone.js will patch all possible macroTask and DomEvents
+ * user can disable parts of macroTask/DomEvents patch by setting following flags
+ * because those flags need to be set before `zone.js` being loaded, and webpack
+ * will put import in the top of bundle, so user need to create a separate file
+ * in this directory (for example: zone-flags.ts), and put the following flags
+ * into that file, and then add the following code before importing zone.js.
+ * import './zone-flags';
+ *
+ * The flags allowed in zone-flags.ts are listed here.
+ *
+ * The following flags will work for all browsers.
+ *
+ * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
+ * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
+ * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
+ *
+ * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
+ * with the following flag, it will bypass `zone.js` patch for IE/Edge
+ *
+ * (window as any).__Zone_enable_cross_context_check = true;
+ *
+ */
+
+/***************************************************************************************************
+ * Zone JS is required by default for Angular itself.
+ */
+import 'zone.js'; // Included with Angular CLI.
+
+
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
diff --git a/frontend/src/styles.css b/frontend/src/styles.css
new file mode 100644
index 0000000..90d4ee0
--- /dev/null
+++ b/frontend/src/styles.css
@@ -0,0 +1 @@
+/* You can add global styles to this file, and also import other style files */
diff --git a/frontend/src/test.ts b/frontend/src/test.ts
new file mode 100644
index 0000000..2042356
--- /dev/null
+++ b/frontend/src/test.ts
@@ -0,0 +1,25 @@
+// This file is required by karma.conf.js and loads recursively all the .spec and framework files
+
+import 'zone.js/testing';
+import { getTestBed } from '@angular/core/testing';
+import {
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+declare const require: {
+ context(path: string, deep?: boolean, filter?: RegExp): {
+ keys(): string[];
+ (id: string): T;
+ };
+};
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting()
+);
+// Then we find all the tests.
+const context = require.context('./', true, /\.spec\.ts$/);
+// And load the modules.
+context.keys().map(context);
diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json
new file mode 100644
index 0000000..82d91dc
--- /dev/null
+++ b/frontend/tsconfig.app.json
@@ -0,0 +1,15 @@
+/* To learn more about this file see: https://angular.io/config/tsconfig. */
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./out-tsc/app",
+ "types": []
+ },
+ "files": [
+ "src/main.ts",
+ "src/polyfills.ts"
+ ],
+ "include": [
+ "src/**/*.d.ts"
+ ]
+}
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
new file mode 100644
index 0000000..605ef83
--- /dev/null
+++ b/frontend/tsconfig.json
@@ -0,0 +1,32 @@
+/* To learn more about this file see: https://angular.io/config/tsconfig. */
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "baseUrl": "./",
+ "outDir": "./dist/out-tsc",
+ "forceConsistentCasingInFileNames": true,
+ "strict": true,
+ "strictPropertyInitialization": false,
+ "strictNullChecks":false,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true,
+ "sourceMap": true,
+ "declaration": false,
+ "downlevelIteration": true,
+ "experimentalDecorators": true,
+ "moduleResolution": "node",
+ "importHelpers": true,
+ "target": "es2017",
+ "module": "es2020",
+ "lib": [
+ "es2018",
+ "dom"
+ ]
+ },
+ "angularCompilerOptions": {
+ "enableI18nLegacyMessageIdFormat": false,
+ "strictInjectionParameters": true,
+ "strictInputAccessModifiers": true,
+ "strictTemplates": true
+ }
+}
diff --git a/frontend/tsconfig.spec.json b/frontend/tsconfig.spec.json
new file mode 100644
index 0000000..092345b
--- /dev/null
+++ b/frontend/tsconfig.spec.json
@@ -0,0 +1,18 @@
+/* To learn more about this file see: https://angular.io/config/tsconfig. */
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./out-tsc/spec",
+ "types": [
+ "jasmine"
+ ]
+ },
+ "files": [
+ "src/test.ts",
+ "src/polyfills.ts"
+ ],
+ "include": [
+ "src/**/*.spec.ts",
+ "src/**/*.d.ts"
+ ]
+}