{"version":3,"sources":["webpack:///./node_modules/ngx-pinch-zoom/fesm2015/ngx-pinch-zoom.js","webpack:///./src/app/views/sustainability/containers/sustainability.page.html","webpack:///./src/app/views/sustainability/containers/sustainability.page.scss","webpack:///./src/app/views/sustainability/containers/sustainability.page.ts","webpack:///./src/app/views/sustainability/store/sustainability.actions.ts","webpack:///./src/app/views/sustainability/store/sustainability.effects.ts","webpack:///./src/app/views/sustainability/store/sustainability.reducer.ts","webpack:///./src/app/views/sustainability/store/sustainability.selectors.ts","webpack:///./src/app/views/sustainability/store/sustainability.state.ts","webpack:///./src/app/views/sustainability/sustainability-routing.module.ts","webpack:///./src/app/views/sustainability/sustainability.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAoF;AACrC;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA,KAAK,OAAO,uDAAS;AACrB;AACA;AACA;AACA,gCAAgC,cAAc,gBAAgB,kBAAkB,oBAAoB,eAAe,aAAa,kBAAkB,gBAAgB,yBAAyB,gCAAgC,wCAAwC,g2BAAg2B,6sBAA6sB,gCAAgC,sCAAsC,qBAAqB,kBAAkB,WAAW,eAAe,YAAY,WAAW,kBAAkB,uBAAuB,iBAAiB,WAAW,aAAa,oBAAoB,gCAAgC,sBAAsB,WAAW,+CAA+C,iBAAiB,WAAW,QAAQ,sDAAsD,YAAY,WAAW,gDAAgD,YAAY,SAAS,kBAAkB,iBAAiB,gCAAgC,kBAAkB,gBAAgB,kBAAkB,gDAAgD,iBAAiB,WAAW,QAAQ,uDAAuD,YAAY,WAAW,iDAAiD,YAAY,SAAS,kBAAkB,yBAA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","file":"views-sustainability-sustainability-module.js","sourcesContent":["import { Component, ElementRef, Input, HostBinding, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nconst defaultProperties = {\r\n transitionDuration: 200,\r\n doubleTap: true,\r\n doubleTapScale: 2,\r\n limitZoom: \"original image size\",\r\n autoZoomOut: false,\r\n zoomControlScale: 1,\r\n minPanScale: 1.0001,\r\n minScale: 0,\r\n listeners: \"mouse and touch\",\r\n wheel: true,\r\n wheelZoomFactor: 0.2,\r\n draggableImage: false\r\n};\r\nconst backwardCompatibilityProperties = {\r\n \"transition-duration\": \"transitionDuration\",\r\n \"transitionDurationBackwardCompatibility\": \"transitionDuration\",\r\n \"double-tap\": \"doubleTap\",\r\n \"doubleTapBackwardCompatibility\": \"doubleTap\",\r\n \"double-tap-scale\": \"doubleTapScale\",\r\n \"doubleTapScaleBackwardCompatibility\": \"doubleTapScale\",\r\n \"auto-zoom-out\": \"autoZoomOut\",\r\n \"autoZoomOutBackwardCompatibility\": \"autoZoomOut\",\r\n \"limit-zoom\": \"limitZoom\",\r\n \"limitZoomBackwardCompatibility\": \"limitZoom\"\r\n};\n\nclass Touches {\r\n constructor(properties) {\r\n this.eventType = undefined;\r\n this.handlers = {};\r\n this.startX = 0;\r\n this.startY = 0;\r\n this.lastTap = 0;\r\n this.doubleTapMinTimeout = 300;\r\n this.tapMinTimeout = 200;\r\n this.touchstartTime = 0;\r\n this.i = 0;\r\n this.isMousedown = false;\r\n this._touchListeners = {\r\n \"touchstart\": \"handleTouchstart\",\r\n \"touchmove\": \"handleTouchmove\",\r\n \"touchend\": \"handleTouchend\"\r\n };\r\n this._mouseListeners = {\r\n \"mousedown\": \"handleMousedown\",\r\n \"mousemove\": \"handleMousemove\",\r\n \"mouseup\": \"handleMouseup\",\r\n \"wheel\": \"handleWheel\"\r\n };\r\n this._otherListeners = {\r\n \"resize\": \"handleResize\"\r\n };\r\n /*\r\n * Listeners\r\n */\r\n /* Touchstart */\r\n this.handleTouchstart = (event) => {\r\n this.elementPosition = this.getElementPosition();\r\n this.touchstartTime = new Date().getTime();\r\n if (this.eventType === undefined) {\r\n this.getTouchstartPosition(event);\r\n }\r\n this.runHandler(\"touchstart\", event);\r\n };\r\n /* Touchmove */\r\n this.handleTouchmove = (event) => {\r\n const touches = event.touches;\r\n // Pan\r\n if (this.detectPan(touches)) {\r\n this.runHandler(\"pan\", event);\r\n }\r\n // Pinch\r\n if (this.detectPinch(event)) {\r\n this.runHandler(\"pinch\", event);\r\n }\r\n };\r\n /* Touchend */\r\n this.handleTouchend = (event) => {\r\n const touches = event.touches;\r\n // Double Tap\r\n if (this.detectDoubleTap()) {\r\n this.runHandler(\"double-tap\", event);\r\n }\r\n // Tap\r\n this.detectTap();\r\n this.runHandler(\"touchend\", event);\r\n this.eventType = 'touchend';\r\n if (touches && touches.length === 0) {\r\n this.eventType = undefined;\r\n this.i = 0;\r\n }\r\n };\r\n /* Mousedown */\r\n this.handleMousedown = (event) => {\r\n this.isMousedown = true;\r\n this.elementPosition = this.getElementPosition();\r\n this.touchstartTime = new Date().getTime();\r\n if (this.eventType === undefined) {\r\n this.getMousedownPosition(event);\r\n }\r\n this.runHandler(\"mousedown\", event);\r\n };\r\n /* Mousemove */\r\n this.handleMousemove = (event) => {\r\n //event.preventDefault();\r\n if (!this.isMousedown) {\r\n return;\r\n }\r\n // Pan\r\n this.runHandler(\"pan\", event);\r\n // Linear swipe\r\n switch (this.detectLinearSwipe(event)) {\r\n case \"horizontal-swipe\":\r\n event.swipeType = \"horizontal-swipe\";\r\n this.runHandler(\"horizontal-swipe\", event);\r\n break;\r\n case \"vertical-swipe\":\r\n event.swipeType = \"vertical-swipe\";\r\n this.runHandler(\"vertical-swipe\", event);\r\n break;\r\n }\r\n // Linear swipe\r\n if (this.detectLinearSwipe(event) ||\r\n this.eventType === 'horizontal-swipe' ||\r\n this.eventType === 'vertical-swipe') {\r\n this.handleLinearSwipe(event);\r\n }\r\n };\r\n /* Mouseup */\r\n this.handleMouseup = (event) => {\r\n // Tap\r\n this.detectTap();\r\n this.isMousedown = false;\r\n this.runHandler(\"mouseup\", event);\r\n this.eventType = undefined;\r\n this.i = 0;\r\n };\r\n /* Wheel */\r\n this.handleWheel = (event) => {\r\n this.runHandler(\"wheel\", event);\r\n };\r\n /* Resize */\r\n this.handleResize = (event) => {\r\n this.runHandler(\"resize\", event);\r\n };\r\n this.properties = properties;\r\n this.element = this.properties.element;\r\n this.elementPosition = this.getElementPosition();\r\n this.toggleEventListeners('addEventListener');\r\n }\r\n get touchListeners() {\r\n return this.properties.touchListeners ? this.properties.touchListeners : this._touchListeners;\r\n }\r\n get mouseListeners() {\r\n return this.properties.mouseListeners ? this.properties.mouseListeners : this._mouseListeners;\r\n }\r\n get otherListeners() {\r\n return this.properties.otherListeners ? this.properties.otherListeners : this._otherListeners;\r\n }\r\n destroy() {\r\n this.toggleEventListeners('removeEventListener');\r\n }\r\n toggleEventListeners(action) {\r\n let listeners;\r\n if (this.properties.listeners === 'mouse and touch') {\r\n listeners = Object.assign(this.touchListeners, this.mouseListeners);\r\n }\r\n else {\r\n listeners = this.detectTouchScreen() ? this.touchListeners : this.mouseListeners;\r\n }\r\n if (this.properties.resize) {\r\n listeners = Object.assign(listeners, this.otherListeners);\r\n }\r\n for (var listener in listeners) {\r\n const handler = listeners[listener];\r\n // Window\r\n if (listener === \"resize\") {\r\n if (action === 'addEventListener') {\r\n window.addEventListener(listener, this[handler], false);\r\n }\r\n if (action === 'removeEventListener') {\r\n window.removeEventListener(listener, this[handler], false);\r\n }\r\n // Document\r\n }\r\n else if (listener === 'mouseup' || listener === \"mousemove\") {\r\n if (action === 'addEventListener') {\r\n document.addEventListener(listener, this[handler], false);\r\n }\r\n if (action === 'removeEventListener') {\r\n document.removeEventListener(listener, this[handler], false);\r\n }\r\n // Element\r\n }\r\n else {\r\n if (action === 'addEventListener') {\r\n this.element.addEventListener(listener, this[handler], false);\r\n }\r\n if (action === 'removeEventListener') {\r\n this.element.removeEventListener(listener, this[handler], false);\r\n }\r\n }\r\n }\r\n }\r\n addEventListeners(listener) {\r\n const handler = this._mouseListeners[listener];\r\n window.addEventListener(listener, this[handler], false);\r\n }\r\n removeEventListeners(listener) {\r\n const handler = this._mouseListeners[listener];\r\n window.removeEventListener(listener, this[handler], false);\r\n }\r\n handleLinearSwipe(event) {\r\n //event.preventDefault();\r\n this.i++;\r\n if (this.i > 3) {\r\n this.eventType = this.getLinearSwipeType(event);\r\n }\r\n if (this.eventType === 'horizontal-swipe') {\r\n this.runHandler('horizontal-swipe', event);\r\n }\r\n if (this.eventType === 'vertical-swipe') {\r\n this.runHandler('vertical-swipe', event);\r\n }\r\n }\r\n runHandler(eventName, response) {\r\n if (this.handlers[eventName]) {\r\n this.handlers[eventName](response);\r\n }\r\n }\r\n /*\r\n * Detection\r\n */\r\n detectPan(touches) {\r\n return touches.length === 1 && !this.eventType || this.eventType === 'pan';\r\n }\r\n detectDoubleTap() {\r\n if (this.eventType != undefined) {\r\n return;\r\n }\r\n const currentTime = new Date().getTime();\r\n const tapLength = currentTime - this.lastTap;\r\n clearTimeout(this.doubleTapTimeout);\r\n if (tapLength < this.doubleTapMinTimeout && tapLength > 0) {\r\n return true;\r\n }\r\n else {\r\n this.doubleTapTimeout = setTimeout(() => {\r\n clearTimeout(this.doubleTapTimeout);\r\n }, this.doubleTapMinTimeout);\r\n }\r\n this.lastTap = currentTime;\r\n return undefined;\r\n }\r\n detectTap() {\r\n if (this.eventType != undefined) {\r\n return;\r\n }\r\n const currentTime = new Date().getTime();\r\n const tapLength = currentTime - this.touchstartTime;\r\n if (tapLength > 0) {\r\n if (tapLength < this.tapMinTimeout) {\r\n this.runHandler(\"tap\", {});\r\n }\r\n else {\r\n this.runHandler(\"longtap\", {});\r\n }\r\n }\r\n }\r\n detectPinch(event) {\r\n const touches = event.touches;\r\n return (touches.length === 2 && this.eventType === undefined) || this.eventType === 'pinch';\r\n }\r\n detectLinearSwipe(event) {\r\n const touches = event.touches;\r\n if (touches) {\r\n if (touches.length === 1 && !this.eventType || this.eventType === 'horizontal-swipe' || this.eventType === 'vertical-swipe') {\r\n return this.getLinearSwipeType(event);\r\n }\r\n }\r\n else {\r\n if (!this.eventType || this.eventType === 'horizontal-swipe' || this.eventType === 'vertical-swipe') {\r\n return this.getLinearSwipeType(event);\r\n }\r\n }\r\n return undefined;\r\n }\r\n getLinearSwipeType(event) {\r\n if (this.eventType !== 'horizontal-swipe' && this.eventType !== 'vertical-swipe') {\r\n const movementX = Math.abs(this.moveLeft(0, event) - this.startX);\r\n const movementY = Math.abs(this.moveTop(0, event) - this.startY);\r\n if ((movementY * 3) > movementX) {\r\n return 'vertical-swipe';\r\n }\r\n else {\r\n return 'horizontal-swipe';\r\n }\r\n }\r\n else {\r\n return this.eventType;\r\n }\r\n }\r\n getElementPosition() {\r\n return this.element.getBoundingClientRect();\r\n }\r\n getTouchstartPosition(event) {\r\n this.startX = event.touches[0].clientX - this.elementPosition.left;\r\n this.startY = event.touches[0].clientY - this.elementPosition.top;\r\n }\r\n getMousedownPosition(event) {\r\n this.startX = event.clientX - this.elementPosition.left;\r\n this.startY = event.clientY - this.elementPosition.top;\r\n }\r\n moveLeft(index, event) {\r\n const touches = event.touches;\r\n if (touches) {\r\n return touches[index].clientX - this.elementPosition.left;\r\n }\r\n else {\r\n return event.clientX - this.elementPosition.left;\r\n }\r\n }\r\n moveTop(index, event) {\r\n const touches = event.touches;\r\n if (touches) {\r\n return touches[index].clientY - this.elementPosition.top;\r\n }\r\n else {\r\n return event.clientY - this.elementPosition.top;\r\n }\r\n }\r\n detectTouchScreen() {\r\n var prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');\r\n var mq = function (query) {\r\n return window.matchMedia(query).matches;\r\n };\r\n if (('ontouchstart' in window)) {\r\n return true;\r\n }\r\n // include the 'heartz' as a way to have a non matching MQ to help terminate the join\r\n // https://git.io/vznFH\r\n var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');\r\n return mq(query);\r\n }\r\n /* Public properties and methods */\r\n on(event, handler) {\r\n if (event) {\r\n this.handlers[event] = handler;\r\n }\r\n }\r\n}\n\nclass IvyPinch {\r\n constructor(properties) {\r\n this.properties = defaultProperties;\r\n this.i = 0;\r\n this.scale = 1;\r\n this.initialScale = 1;\r\n this.startX = 0;\r\n this.startY = 0;\r\n this.moveX = 0;\r\n this.moveY = 0;\r\n this.initialMoveX = 0;\r\n this.initialMoveY = 0;\r\n this.moveXC = 0;\r\n this.moveYC = 0;\r\n this.lastTap = 0;\r\n this.draggingMode = false;\r\n this.distance = 0;\r\n this.doubleTapTimeout = 0;\r\n this.initialDistance = 0;\r\n this.events = {};\r\n this.defaultMaxScale = 3;\r\n /* Touchstart */\r\n this.handleTouchstart = (event) => {\r\n this.touches.addEventListeners(\"mousemove\", \"handleMousemove\");\r\n this.getElementPosition();\r\n if (this.eventType === undefined) {\r\n this.getTouchstartPosition(event);\r\n }\r\n };\r\n /* Touchend */\r\n this.handleTouchend = (event) => {\r\n /* touchend */\r\n if (event.type === \"touchend\") {\r\n this.i = 0;\r\n this.draggingMode = false;\r\n const touches = event.touches;\r\n // Min scale\r\n if (this.scale < 1) {\r\n this.scale = 1;\r\n }\r\n // Auto Zoom Out\r\n if (this.properties.autoZoomOut && this.eventType === 'pinch') {\r\n this.scale = 1;\r\n }\r\n // Align image\r\n if (this.eventType === 'pinch' ||\r\n this.eventType === 'pan' && this.scale > this.minPanScale) {\r\n this.alignImage();\r\n }\r\n // Update initial values\r\n if (this.eventType === 'pinch' ||\r\n this.eventType === 'pan' ||\r\n this.eventType === 'horizontal-swipe' ||\r\n this.eventType === 'vertical-swipe') {\r\n this.updateInitialValues();\r\n }\r\n this.eventType = 'touchend';\r\n if (touches && touches.length === 0) {\r\n this.eventType = undefined;\r\n }\r\n }\r\n /* mouseup */\r\n if (event.type === \"mouseup\") {\r\n this.draggingMode = false;\r\n this.updateInitialValues();\r\n this.eventType = undefined;\r\n }\r\n this.touches.removeEventListeners(\"mousemove\", \"handleMousemove\");\r\n };\r\n /*\r\n * Handlers\r\n */\r\n this.handlePan = (event) => {\r\n if (this.scale < this.minPanScale || this.properties.disablePan) {\r\n return;\r\n }\r\n event.preventDefault();\r\n const { clientX, clientY } = this.getClientPosition(event);\r\n if (!this.eventType) {\r\n this.startX = clientX - this.elementPosition.left;\r\n this.startY = clientY - this.elementPosition.top;\r\n }\r\n this.eventType = 'pan';\r\n this.moveX = this.initialMoveX + (this.moveLeft(event, 0) - this.startX);\r\n this.moveY = this.initialMoveY + (this.moveTop(event, 0) - this.startY);\r\n if (this.properties.limitPan) {\r\n this.limitPanY();\r\n this.limitPanX();\r\n }\r\n /* mousemove */\r\n if (event.type === \"mousemove\" && this.scale > this.minPanScale) {\r\n this.centeringImage();\r\n }\r\n this.transformElement(0);\r\n };\r\n this.handleDoubleTap = (event) => {\r\n this.toggleZoom(event);\r\n return;\r\n };\r\n this.handlePinch = (event) => {\r\n event.preventDefault();\r\n if (this.eventType === undefined || this.eventType === 'pinch') {\r\n const touches = event.touches;\r\n if (!this.eventType) {\r\n this.initialDistance = this.getDistance(touches);\r\n const moveLeft0 = this.moveLeft(event, 0);\r\n const moveLeft1 = this.moveLeft(event, 1);\r\n const moveTop0 = this.moveTop(event, 0);\r\n const moveTop1 = this.moveTop(event, 1);\r\n this.moveXC = ((moveLeft0 + moveLeft1) / 2) - this.initialMoveX;\r\n this.moveYC = ((moveTop0 + moveTop1) / 2) - this.initialMoveY;\r\n }\r\n this.eventType = 'pinch';\r\n this.distance = this.getDistance(touches);\r\n this.scale = this.initialScale * (this.distance / this.initialDistance);\r\n this.moveX = this.initialMoveX - (((this.distance / this.initialDistance) * this.moveXC) - this.moveXC);\r\n this.moveY = this.initialMoveY - (((this.distance / this.initialDistance) * this.moveYC) - this.moveYC);\r\n this.handleLimitZoom();\r\n if (this.properties.limitPan) {\r\n this.limitPanY();\r\n this.limitPanX();\r\n }\r\n this.transformElement(0);\r\n }\r\n };\r\n this.handleWheel = (event) => {\r\n event.preventDefault();\r\n let wheelZoomFactor = this.properties.wheelZoomFactor || 0;\r\n let zoomFactor = event.deltaY < 0 ? (wheelZoomFactor) : (-wheelZoomFactor);\r\n let newScale = this.initialScale + zoomFactor;\r\n /* Round value */\r\n if (newScale < (1 + wheelZoomFactor)) {\r\n newScale = 1;\r\n }\r\n else if (newScale < this.maxScale && newScale > this.maxScale - wheelZoomFactor) {\r\n newScale = this.maxScale;\r\n }\r\n if (newScale < 1 || newScale > this.maxScale) {\r\n return;\r\n }\r\n if (newScale === this.scale) {\r\n return;\r\n }\r\n this.getElementPosition();\r\n this.scale = newScale;\r\n /* Get cursor position over image */\r\n let xCenter = (event.clientX - this.elementPosition.left) - this.initialMoveX;\r\n let yCenter = (event.clientY - this.elementPosition.top) - this.initialMoveY;\r\n this.setZoom({\r\n scale: newScale,\r\n center: [xCenter, yCenter]\r\n });\r\n };\r\n this.handleResize = (_event) => {\r\n this.setAutoHeight();\r\n };\r\n this.element = properties.element;\r\n if (!this.element) {\r\n return;\r\n }\r\n this.elementTarget = this.element.querySelector('*').tagName;\r\n this.parentElement = this.element.parentElement;\r\n this.properties = Object.assign({}, defaultProperties, properties);\r\n this.detectLimitZoom();\r\n this.touches = new Touches({\r\n element: properties.element,\r\n listeners: properties.listeners,\r\n resize: properties.autoHeight,\r\n mouseListeners: {\r\n \"mousedown\": \"handleMousedown\",\r\n \"mouseup\": \"handleMouseup\",\r\n \"wheel\": \"handleWheel\"\r\n }\r\n });\r\n /* Init */\r\n this.setBasicStyles();\r\n /*\r\n * Listeners\r\n */\r\n this.touches.on('touchstart', this.handleTouchstart);\r\n this.touches.on('touchend', this.handleTouchend);\r\n this.touches.on('mousedown', this.handleTouchstart);\r\n this.touches.on('mouseup', this.handleTouchend);\r\n this.touches.on('pan', this.handlePan);\r\n this.touches.on('mousemove', this.handlePan);\r\n this.touches.on('pinch', this.handlePinch);\r\n if (this.properties.wheel) {\r\n this.touches.on('wheel', this.handleWheel);\r\n }\r\n if (this.properties.doubleTap) {\r\n this.touches.on('double-tap', this.handleDoubleTap);\r\n }\r\n if (this.properties.autoHeight) {\r\n this.touches.on('resize', this.handleResize);\r\n }\r\n }\r\n // Minimum scale at which panning works\r\n get minPanScale() {\r\n return this.getPropertiesValue(\"minPanScale\");\r\n }\r\n get fullImage() {\r\n return this.properties.fullImage;\r\n }\r\n handleLimitZoom() {\r\n const limitZoom = this.maxScale;\r\n const minScale = this.properties.minScale || 0;\r\n if (this.scale > limitZoom || this.scale <= minScale) {\r\n const imageWidth = this.getImageWidth();\r\n const imageHeight = this.getImageHeight();\r\n const enlargedImageWidth = imageWidth * this.scale;\r\n const enlargedImageHeight = imageHeight * this.scale;\r\n const moveXRatio = this.moveX / (enlargedImageWidth - imageWidth);\r\n const moveYRatio = this.moveY / (enlargedImageHeight - imageHeight);\r\n if (this.scale > limitZoom) {\r\n this.scale = limitZoom;\r\n }\r\n if (this.scale <= minScale) {\r\n this.scale = minScale;\r\n }\r\n const newImageWidth = imageWidth * this.scale;\r\n const newImageHeight = imageHeight * this.scale;\r\n this.moveX = -Math.abs((moveXRatio * (newImageWidth - imageWidth)));\r\n this.moveY = -Math.abs((-moveYRatio * (newImageHeight - imageHeight)));\r\n }\r\n }\r\n moveLeft(event, index = 0) {\r\n const clientX = this.getClientPosition(event, index).clientX;\r\n return clientX - this.elementPosition.left;\r\n }\r\n moveTop(event, index = 0) {\r\n const clientY = this.getClientPosition(event, index).clientY;\r\n return clientY - this.elementPosition.top;\r\n }\r\n /*\r\n * Detection\r\n */\r\n centeringImage() {\r\n const img = this.element.getElementsByTagName(this.elementTarget)[0];\r\n const initialMoveX = this.moveX;\r\n const initialMoveY = this.moveY;\r\n if (this.moveY > 0) {\r\n this.moveY = 0;\r\n }\r\n if (this.moveX > 0) {\r\n this.moveX = 0;\r\n }\r\n if (img) {\r\n this.limitPanY();\r\n this.limitPanX();\r\n }\r\n if (img && this.scale < 1) {\r\n if (this.moveX < this.element.offsetWidth * (1 - this.scale)) {\r\n this.moveX = this.element.offsetWidth * (1 - this.scale);\r\n }\r\n }\r\n return initialMoveX !== this.moveX || initialMoveY !== this.moveY;\r\n }\r\n limitPanY() {\r\n const imgHeight = this.getImageHeight();\r\n const scaledImgHeight = imgHeight * this.scale;\r\n const parentHeight = this.parentElement.offsetHeight;\r\n const elementHeight = this.element.offsetHeight;\r\n if (scaledImgHeight < parentHeight) {\r\n this.moveY = (parentHeight - elementHeight * this.scale) / 2;\r\n }\r\n else {\r\n const imgOffsetTop = ((imgHeight - elementHeight) * this.scale) / 2;\r\n if (this.moveY > imgOffsetTop) {\r\n this.moveY = imgOffsetTop;\r\n }\r\n else if ((scaledImgHeight + Math.abs(imgOffsetTop) - parentHeight) + this.moveY < 0) {\r\n this.moveY = -(scaledImgHeight + Math.abs(imgOffsetTop) - parentHeight);\r\n }\r\n }\r\n }\r\n limitPanX() {\r\n const imgWidth = this.getImageWidth();\r\n const scaledImgWidth = imgWidth * this.scale;\r\n const parentWidth = this.parentElement.offsetWidth;\r\n const elementWidth = this.element.offsetWidth;\r\n if (scaledImgWidth < parentWidth) {\r\n this.moveX = (parentWidth - elementWidth * this.scale) / 2;\r\n }\r\n else {\r\n const imgOffsetLeft = ((imgWidth - elementWidth) * this.scale) / 2;\r\n if (this.moveX > imgOffsetLeft) {\r\n this.moveX = imgOffsetLeft;\r\n }\r\n else if ((scaledImgWidth + Math.abs(imgOffsetLeft) - parentWidth) + this.moveX < 0) {\r\n this.moveX = -(imgWidth * this.scale + Math.abs(imgOffsetLeft) - parentWidth);\r\n }\r\n }\r\n }\r\n setBasicStyles() {\r\n this.element.style.display = 'flex';\r\n this.element.style.alignItems = 'center';\r\n this.element.style.justifyContent = 'center';\r\n this.element.style.transformOrigin = '0 0';\r\n this.setImageSize();\r\n this.setDraggableImage();\r\n }\r\n removeBasicStyles() {\r\n this.element.style.display = '';\r\n this.element.style.alignItems = '';\r\n this.element.style.justifyContent = '';\r\n this.element.style.transformOrigin = '';\r\n this.removeImageSize();\r\n this.removeDraggableImage();\r\n }\r\n setDraggableImage() {\r\n const imgElement = this.getImageElement();\r\n if (imgElement) {\r\n imgElement.draggable = this.properties.draggableImage;\r\n }\r\n }\r\n removeDraggableImage() {\r\n const imgElement = this.getImageElement();\r\n if (imgElement) {\r\n imgElement.draggable = true;\r\n }\r\n }\r\n setImageSize() {\r\n const imgElement = this.element.getElementsByTagName(this.elementTarget);\r\n if (imgElement.length) {\r\n imgElement[0].style.maxWidth = '100%';\r\n imgElement[0].style.maxHeight = '100%';\r\n this.setAutoHeight();\r\n }\r\n }\r\n setAutoHeight() {\r\n const imgElement = this.element.getElementsByTagName(this.elementTarget);\r\n if (!this.properties.autoHeight || !imgElement.length) {\r\n return;\r\n }\r\n const imgNaturalWidth = imgElement[0].getAttribute(\"width\");\r\n const imgNaturalHeight = imgElement[0].getAttribute(\"height\");\r\n const sizeRatio = imgNaturalWidth / imgNaturalHeight;\r\n const parentWidth = this.parentElement.offsetWidth;\r\n imgElement[0].style.maxHeight = parentWidth / sizeRatio + \"px\";\r\n }\r\n removeImageSize() {\r\n const imgElement = this.element.getElementsByTagName(this.elementTarget);\r\n if (imgElement.length) {\r\n imgElement[0].style.maxWidth = '';\r\n imgElement[0].style.maxHeight = '';\r\n }\r\n }\r\n getElementPosition() {\r\n this.elementPosition = this.element.parentElement.getBoundingClientRect();\r\n }\r\n getTouchstartPosition(event) {\r\n const { clientX, clientY } = this.getClientPosition(event);\r\n this.startX = clientX - this.elementPosition.left;\r\n this.startY = clientY - this.elementPosition.top;\r\n }\r\n getClientPosition(event, index = 0) {\r\n let clientX;\r\n let clientY;\r\n if (event.type === \"touchstart\" || event.type === \"touchmove\") {\r\n clientX = event.touches[index].clientX;\r\n clientY = event.touches[index].clientY;\r\n }\r\n if (event.type === \"mousedown\" || event.type === \"mousemove\") {\r\n clientX = event.clientX;\r\n clientY = event.clientY;\r\n }\r\n return {\r\n clientX,\r\n clientY\r\n };\r\n }\r\n resetScale() {\r\n this.scale = 1;\r\n this.moveX = 0;\r\n this.moveY = 0;\r\n this.updateInitialValues();\r\n this.transformElement(this.properties.transitionDuration);\r\n }\r\n updateInitialValues() {\r\n this.initialScale = this.scale;\r\n this.initialMoveX = this.moveX;\r\n this.initialMoveY = this.moveY;\r\n }\r\n getDistance(touches) {\r\n return Math.sqrt(Math.pow(touches[0].pageX - touches[1].pageX, 2) + Math.pow(touches[0].pageY - touches[1].pageY, 2));\r\n }\r\n getImageHeight() {\r\n const img = this.element.getElementsByTagName(this.elementTarget)[0];\r\n return img.offsetHeight;\r\n }\r\n getImageWidth() {\r\n const img = this.element.getElementsByTagName(this.elementTarget)[0];\r\n return img.offsetWidth;\r\n }\r\n transformElement(duration) {\r\n this.element.style.transition = \"all \" + duration + \"ms\";\r\n this.element.style.transform = \"matrix(\" + Number(this.scale) + \", 0, 0, \" + Number(this.scale) + \", \" + Number(this.moveX) + \", \" + Number(this.moveY) + \")\";\r\n }\r\n isTouchScreen() {\r\n const prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');\r\n if (('ontouchstart' in window)) {\r\n return true;\r\n }\r\n // include the 'heartz' as a way to have a non matching MQ to help terminate the join\r\n // https://git.io/vznFH\r\n const query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');\r\n return this.getMatchMedia(query);\r\n }\r\n getMatchMedia(query) {\r\n return window.matchMedia(query).matches;\r\n }\r\n isDragging() {\r\n if (this.properties.disablePan) {\r\n return false;\r\n }\r\n const imgHeight = this.getImageHeight();\r\n const imgWidth = this.getImageWidth();\r\n if (this.scale > 1) {\r\n return imgHeight * this.scale > this.parentElement.offsetHeight ||\r\n imgWidth * this.scale > this.parentElement.offsetWidth;\r\n }\r\n if (this.scale === 1) {\r\n return imgHeight > this.parentElement.offsetHeight ||\r\n imgWidth > this.parentElement.offsetWidth;\r\n }\r\n return undefined;\r\n }\r\n detectLimitZoom() {\r\n this.maxScale = this.defaultMaxScale;\r\n if (this.properties.limitZoom === \"original image size\" &&\r\n this.elementTarget === \"IMG\") {\r\n // We are waiting for the element with the image to be available\r\n this.pollLimitZoomForOriginalImage();\r\n }\r\n }\r\n pollLimitZoomForOriginalImage() {\r\n let poll = setInterval(() => {\r\n let maxScaleForOriginalImage = this.getMaxScaleForOriginalImage();\r\n if (typeof maxScaleForOriginalImage === 'number') {\r\n this.maxScale = maxScaleForOriginalImage;\r\n clearInterval(poll);\r\n }\r\n }, 10);\r\n }\r\n getMaxScaleForOriginalImage() {\r\n let maxScale;\r\n let img = this.element.getElementsByTagName(\"img\")[0];\r\n if (img.naturalWidth && img.offsetWidth) {\r\n maxScale = img.naturalWidth / img.offsetWidth;\r\n }\r\n return maxScale;\r\n }\r\n getImageElement() {\r\n const imgElement = this.element.getElementsByTagName(this.elementTarget);\r\n if (imgElement.length) {\r\n return imgElement[0];\r\n }\r\n }\r\n toggleZoom(event = false) {\r\n if (this.initialScale === 1) {\r\n if (event && event.changedTouches) {\r\n if (this.properties.doubleTapScale === undefined) {\r\n return;\r\n }\r\n const changedTouches = event.changedTouches;\r\n this.scale = this.initialScale * this.properties.doubleTapScale;\r\n this.moveX = this.initialMoveX - (changedTouches[0].clientX - this.elementPosition.left) * (this.properties.doubleTapScale - 1);\r\n this.moveY = this.initialMoveY - (changedTouches[0].clientY - this.elementPosition.top) * (this.properties.doubleTapScale - 1);\r\n }\r\n else {\r\n let zoomControlScale = this.properties.zoomControlScale || 0;\r\n this.scale = this.initialScale * (zoomControlScale + 1);\r\n this.moveX = this.initialMoveX - this.element.offsetWidth * (this.scale - 1) / 2;\r\n this.moveY = this.initialMoveY - this.element.offsetHeight * (this.scale - 1) / 2;\r\n }\r\n this.centeringImage();\r\n this.updateInitialValues();\r\n this.transformElement(this.properties.transitionDuration);\r\n }\r\n else {\r\n this.resetScale();\r\n }\r\n }\r\n setZoom(properties) {\r\n this.scale = properties.scale;\r\n let xCenter;\r\n let yCenter;\r\n let visibleAreaWidth = this.element.offsetWidth;\r\n let visibleAreaHeight = this.element.offsetHeight;\r\n let scalingPercent = (visibleAreaWidth * this.scale) / (visibleAreaWidth * this.initialScale);\r\n if (properties.center) {\r\n xCenter = properties.center[0];\r\n yCenter = properties.center[1];\r\n }\r\n else {\r\n xCenter = visibleAreaWidth / 2 - this.initialMoveX;\r\n yCenter = visibleAreaHeight / 2 - this.initialMoveY;\r\n }\r\n this.moveX = this.initialMoveX - ((scalingPercent * xCenter) - xCenter);\r\n this.moveY = this.initialMoveY - ((scalingPercent * yCenter) - yCenter);\r\n this.centeringImage();\r\n this.updateInitialValues();\r\n this.transformElement(this.properties.transitionDuration);\r\n }\r\n alignImage() {\r\n const isMoveChanged = this.centeringImage();\r\n if (isMoveChanged) {\r\n this.updateInitialValues();\r\n this.transformElement(this.properties.transitionDuration);\r\n }\r\n }\r\n destroy() {\r\n this.removeBasicStyles();\r\n this.touches.destroy();\r\n }\r\n getPropertiesValue(propertyName) {\r\n if (this.properties && this.properties[propertyName]) {\r\n return this.properties[propertyName];\r\n }\r\n else {\r\n return defaultProperties[propertyName];\r\n }\r\n }\r\n}\n\nconst _defaultComponentProperties = {\r\n overflow: \"hidden\",\r\n disableZoomControl: \"auto\",\r\n backgroundColor: \"rgba(0,0,0,0.85)\"\r\n};\r\nclass PinchZoomComponent {\r\n constructor(elementRef) {\r\n this.elementRef = elementRef;\r\n this.defaultComponentProperties = this.getDefaultComponentProperties();\r\n this.applyPropertiesDefault(this.defaultComponentProperties, {});\r\n }\r\n set properties(value) {\r\n if (value) {\r\n this._properties = value;\r\n }\r\n }\r\n get properties() {\r\n return this._properties;\r\n }\r\n // transitionDuration\r\n set transitionDurationBackwardCompatibility(value) {\r\n if (value) {\r\n this._transitionDuration = value;\r\n }\r\n }\r\n set transitionDuration(value) {\r\n if (value) {\r\n this._transitionDuration = value;\r\n }\r\n }\r\n get transitionDuration() {\r\n return this._transitionDuration;\r\n }\r\n // doubleTap\r\n set doubleTapBackwardCompatibility(value) {\r\n if (value) {\r\n this._doubleTap = value;\r\n }\r\n }\r\n set doubleTap(value) {\r\n if (value) {\r\n this._doubleTap = value;\r\n }\r\n }\r\n get doubleTap() {\r\n return this._doubleTap;\r\n }\r\n // doubleTapScale\r\n set doubleTapScaleBackwardCompatibility(value) {\r\n if (value) {\r\n this._doubleTapScale = value;\r\n }\r\n }\r\n set doubleTapScale(value) {\r\n if (value) {\r\n this._doubleTapScale = value;\r\n }\r\n }\r\n get doubleTapScale() {\r\n return this._doubleTapScale;\r\n }\r\n // autoZoomOut\r\n set autoZoomOutBackwardCompatibility(value) {\r\n if (value) {\r\n this._autoZoomOut = value;\r\n }\r\n }\r\n set autoZoomOut(value) {\r\n if (value) {\r\n this._autoZoomOut = value;\r\n }\r\n }\r\n get autoZoomOut() {\r\n return this._autoZoomOut;\r\n }\r\n // limitZoom\r\n set limitZoomBackwardCompatibility(value) {\r\n if (value) {\r\n this._limitZoom = value;\r\n }\r\n }\r\n set limitZoom(value) {\r\n if (value) {\r\n this._limitZoom = value;\r\n }\r\n }\r\n get limitZoom() {\r\n return this._limitZoom;\r\n }\r\n get hostOverflow() {\r\n return this.properties['overflow'];\r\n }\r\n get hostBackgroundColor() {\r\n return this.properties['backgroundColor'];\r\n }\r\n get isTouchScreen() {\r\n var prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');\r\n var mq = function (query) {\r\n return window.matchMedia(query).matches;\r\n };\r\n if (('ontouchstart' in window)) {\r\n return true;\r\n }\r\n // include the 'heartz' as a way to have a non matching MQ to help terminate the join\r\n // https://git.io/vznFH\r\n var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');\r\n return mq(query);\r\n }\r\n get isDragging() {\r\n return this.pinchZoom ? this.pinchZoom.isDragging() : undefined;\r\n }\r\n get isDisabled() {\r\n return this.properties['disabled'];\r\n }\r\n get scale() {\r\n return this.pinchZoom.scale;\r\n }\r\n get isZoomedIn() {\r\n return this.scale > 1;\r\n }\r\n get scaleLevel() {\r\n return Math.round(this.scale / this._zoomControlScale);\r\n }\r\n get maxScale() {\r\n return this.pinchZoom.maxScale;\r\n }\r\n get isZoomLimitReached() {\r\n return this.scale >= this.maxScale;\r\n }\r\n get _zoomControlScale() {\r\n return this.getPropertiesValue('zoomControlScale');\r\n }\r\n ngOnInit() {\r\n this.initPinchZoom();\r\n /* Calls the method until the image size is available */\r\n this.detectLimitZoom();\r\n }\r\n ngOnChanges(changes) {\r\n let changedProperties = this.getProperties(changes);\r\n changedProperties = this.renameProperties(changedProperties);\r\n this.applyPropertiesDefault(this.defaultComponentProperties, changedProperties);\r\n }\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n initPinchZoom() {\r\n if (this.properties['disabled']) {\r\n return;\r\n }\r\n this.properties['element'] = this.elementRef.nativeElement.querySelector('.pinch-zoom-content');\r\n this.pinchZoom = new IvyPinch(this.properties);\r\n }\r\n getProperties(changes) {\r\n let properties = {};\r\n for (var prop in changes) {\r\n if (prop !== 'properties') {\r\n properties[prop] = changes[prop].currentValue;\r\n }\r\n if (prop === 'properties') {\r\n properties = changes[prop].currentValue;\r\n }\r\n }\r\n return properties;\r\n }\r\n renameProperties(properties) {\r\n for (var prop in properties) {\r\n if (backwardCompatibilityProperties[prop]) {\r\n properties[backwardCompatibilityProperties[prop]] = properties[prop];\r\n delete properties[prop];\r\n }\r\n }\r\n return properties;\r\n }\r\n applyPropertiesDefault(defaultProperties, properties) {\r\n this.properties = Object.assign({}, defaultProperties, properties);\r\n }\r\n toggleZoom() {\r\n this.pinchZoom.toggleZoom();\r\n }\r\n isControl() {\r\n if (this.isDisabled) {\r\n return false;\r\n }\r\n if (this.properties['disableZoomControl'] === \"disable\") {\r\n return false;\r\n }\r\n if (this.isTouchScreen && this.properties['disableZoomControl'] === \"auto\") {\r\n return false;\r\n }\r\n return true;\r\n }\r\n detectLimitZoom() {\r\n if (this.pinchZoom) {\r\n this.pinchZoom.detectLimitZoom();\r\n }\r\n }\r\n destroy() {\r\n this.pinchZoom.destroy();\r\n }\r\n getPropertiesValue(propertyName) {\r\n if (this.properties && this.properties[propertyName]) {\r\n return this.properties[propertyName];\r\n }\r\n else {\r\n return this.defaultComponentProperties[propertyName];\r\n }\r\n }\r\n getDefaultComponentProperties() {\r\n return Object.assign(Object.assign({}, defaultProperties), _defaultComponentProperties);\r\n }\r\n}\r\nPinchZoomComponent.decorators = [\r\n { type: Component, args: [{\r\n selector: 'pinch-zoom, [pinch-zoom]',\r\n exportAs: 'pinchZoom',\r\n template: \"
\\n\\t\\n
\\n\\n\\n
\",\r\n styles: [\":host{display:block;overflow:hidden;position:relative}.pinch-zoom-content{height:inherit}.pz-dragging{cursor:all-scroll}.pz-zoom-button{-webkit-user-select:none;background-color:rgba(0,0,0,.8);background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgc3R5bGU9IiI+PHJlY3QgaWQ9ImJhY2tncm91bmRyZWN0IiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB4PSIwIiB5PSIwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiLz48ZyBjbGFzcz0iY3VycmVudExheWVyIiBzdHlsZT0iIj48dGl0bGU+TGF5ZXIgMTwvdGl0bGU+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6IiBpZD0ic3ZnXzEiIGNsYXNzPSIiIGZpbGw9IiNmZmZmZmYiIGZpbGwtb3BhY2l0eT0iMSIvPjxwYXRoIGQ9Ik0xMiAxMGgtMnYySDl2LTJIN1Y5aDJWN2gxdjJoMnYxeiIgaWQ9InN2Z18zIiBjbGFzcz0iIiBmaWxsPSIjZmZmZmZmIiBmaWxsLW9wYWNpdHk9IjEiLz48L2c+PC9zdmc+),url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PHJlY3QgaWQ9ImJhY2tncm91bmRyZWN0IiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB4PSIwIiB5PSIwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiLz48ZyBjbGFzcz0iY3VycmVudExheWVyIiBzdHlsZT0iIj48dGl0bGU+TGF5ZXIgMTwvdGl0bGU+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6TTcgOWg1djFIN3oiIGlkPSJzdmdfMiIgY2xhc3M9IiIgZmlsbD0iI2ZmZmZmZiIgZmlsbC1vcGFjaXR5PSIxIi8+PC9nPjwvc3ZnPg==);background-position:50%,-1000px;background-repeat:no-repeat,no-repeat;background-size:40px;border-radius:4px;color:#fff;cursor:pointer;height:56px;opacity:.5;position:absolute;transition:opacity .1s;user-select:none;width:56px;z-index:1000}.pz-zoom-button-out{background-position:-1000px,50%}.pz-zoom-button:hover{opacity:.7}.pz-zoom-button.pz-zoom-control-position-right{margin-top:-28px;right:16px;top:50%}.pz-zoom-button.pz-zoom-control-position-right-bottom{bottom:32px;right:16px}.pz-zoom-button.pz-zoom-control-position-bottom{bottom:16px;left:50%;margin-left:-28px}.pz-zoom-control{background-color:rgba(0,0,0,.8);border-radius:4px;overflow:hidden;position:absolute}.pz-zoom-control.pz-zoom-control-position-right{margin-top:-48px;right:16px;top:50%}.pz-zoom-control.pz-zoom-control-position-right-bottom{bottom:32px;right:16px}.pz-zoom-control.pz-zoom-control-position-bottom{bottom:16px;left:50%;margin-left:-48px}.pz-zoom-in,.pz-zoom-out{background-position:50%;background-repeat:no-repeat;cursor:pointer;height:48px;opacity:1;width:48px}.pz-zoom-in:hover,.pz-zoom-out:hover{background-color:hsla(0,0%,100%,.2)}.pz-zoom-control-position-bottom .pz-zoom-in,.pz-zoom-control-position-bottom .pz-zoom-out{float:right}.pz-disabled{cursor:default;opacity:.5}.pz-disabled:hover{background-color:hsla(0,0%,100%,0)}.pz-zoom-in{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgc3R5bGU9IiI+PHJlY3QgaWQ9ImJhY2tncm91bmRyZWN0IiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB4PSIwIiB5PSIwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiLz48ZyBjbGFzcz0iY3VycmVudExheWVyIiBzdHlsZT0iIj48dGl0bGU+TGF5ZXIgMTwvdGl0bGU+PHBhdGggZD0iTTE5IDEzaC02djZoLTJ2LTZINXYtMmg2VjVoMnY2aDZ2MnoiIGlkPSJzdmdfMSIgY2xhc3M9IiIgc3Ryb2tlPSJub25lIiBmaWxsPSIjZmZmZmZmIiBmaWxsLW9wYWNpdHk9IjEiLz48cGF0aCBkPSJNLTE1LjgzNjczNDQyMDQ2MTY1Myw0NC41MzU0MDkzMDY3MTAxOCBoNTguMjA0MDgwODI3NTkzMDkgdi02LjU3NjIyNjcyMzM2OTIyMTUgSC0xNS44MzY3MzQ0MjA0NjE2NTMgeiIgZmlsbD0ibm9uZSIgaWQ9InN2Z18yIiBjbGFzcz0iIiBzdHJva2U9Im5vbmUiLz48L2c+PC9zdmc+)}.pz-zoom-out{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PHJlY3QgaWQ9ImJhY2tncm91bmRyZWN0IiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB4PSIwIiB5PSIwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiLz48ZyBjbGFzcz0iY3VycmVudExheWVyIiBzdHlsZT0iIj48dGl0bGU+TGF5ZXIgMTwvdGl0bGU+PHBhdGggZD0iTTE5IDEzSDV2LTJoMTR2MnoiIGlkPSJzdmdfMSIgY2xhc3M9IiIgZmlsbD0iI2ZmZmZmZiIgZmlsbC1vcGFjaXR5PSIxIi8+PC9nPjwvc3ZnPg==)}\"]\r\n },] }\r\n];\r\nPinchZoomComponent.ctorParameters = () => [\r\n { type: ElementRef }\r\n];\r\nPinchZoomComponent.propDecorators = {\r\n properties: [{ type: Input, args: ['properties',] }],\r\n transitionDurationBackwardCompatibility: [{ type: Input, args: ['transition-duration',] }],\r\n transitionDuration: [{ type: Input, args: ['transitionDuration',] }],\r\n doubleTapBackwardCompatibility: [{ type: Input, args: ['double-tap',] }],\r\n doubleTap: [{ type: Input, args: ['doubleTap',] }],\r\n doubleTapScaleBackwardCompatibility: [{ type: Input, args: ['double-tap-scale',] }],\r\n doubleTapScale: [{ type: Input, args: ['doubleTapScale',] }],\r\n autoZoomOutBackwardCompatibility: [{ type: Input, args: ['auto-zoom-out',] }],\r\n autoZoomOut: [{ type: Input, args: ['autoZoomOut',] }],\r\n limitZoomBackwardCompatibility: [{ type: Input, args: ['limit-zoom',] }],\r\n limitZoom: [{ type: Input, args: ['limitZoom',] }],\r\n disabled: [{ type: Input }],\r\n disablePan: [{ type: Input }],\r\n overflow: [{ type: Input }],\r\n zoomControlScale: [{ type: Input }],\r\n disableZoomControl: [{ type: Input }],\r\n backgroundColor: [{ type: Input }],\r\n limitPan: [{ type: Input }],\r\n minPanScale: [{ type: Input }],\r\n minScale: [{ type: Input }],\r\n listeners: [{ type: Input }],\r\n wheel: [{ type: Input }],\r\n autoHeight: [{ type: Input }],\r\n wheelZoomFactor: [{ type: Input }],\r\n draggableImage: [{ type: Input }],\r\n hostOverflow: [{ type: HostBinding, args: ['style.overflow',] }],\r\n hostBackgroundColor: [{ type: HostBinding, args: ['style.background-color',] }]\r\n};\n\nclass PinchZoomModule {\r\n}\r\nPinchZoomModule.decorators = [\r\n { type: NgModule, args: [{\r\n declarations: [\r\n PinchZoomComponent\r\n ],\r\n imports: [\r\n CommonModule\r\n ],\r\n exports: [\r\n PinchZoomComponent\r\n ],\r\n providers: [],\r\n bootstrap: [],\r\n entryComponents: [\r\n PinchZoomComponent\r\n ]\r\n },] }\r\n];\n\n/*\r\n * Public API Surface of ngx-pinch-zoom\r\n */\n\n/**\r\n * Generated bundle index. Do not edit.\r\n */\n\nexport { PinchZoomComponent, PinchZoomModule, _defaultComponentProperties };\n//# sourceMappingURL=ngx-pinch-zoom.js.map\n","module.exports = \"\\n
\\n
\\n
\\n
\\n

BCA GREEN MARK PLATINUM SUPER LOW ENERGY AWARD

\\n

\\n Green is no longer an option but an imperative. No longer just a token of corporate social responsibility, going green drives revenue and increases overall productivity, for the betterment of humanity and the planet we live on.

\\n Talents of tomorrow value wellness and sustainability. Purpose lies at the heart of what they do, and the ethos behind Keppel South Central is one that champions environmental consciousness, where individuals thrive in a space that endorses the very same values they have.\\n

\\n
\\n
\\n \\n \\n
\\n \\n \\n \\n \\n \\n \\n
\\n
\\n

Pinch to zoom

\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n

AT THE HEART OF
GOOD BUSINESS,
IS A BETTER PLANET

\\n \\n
\\n
\\n
\\n
\\n \\n

\\n Energy savings equivalent to the amount needed to power about
\\n 1,300 homes in Singapore annually\\n

\\n
\\n
\\n \\n

\\n Water savings that can fill
\\n 10 Olympic-sized swimming pools\\n

\\n
\\n
\\n \\n \\n
\\n
\\n

Other notable features:

\\n
    \\n
  • smart HVAC system
  • \\n
  • solar fins
  • \\n
  • provision for EV chargers
  • \\n
  • rain water harvesting
  • \\n
  • renewable energy with onsite photovoltaic (PV) panels
  • \\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n \\n

Copyright © 2023 Keppel Land Limited (Co. Reg No 189000001G). All rights reserved.

\\n
\\n
\\n
\\n
\"","module.exports = \"ion-slide span {\\n position: absolute;\\n bottom: 4%;\\n right: 6%;\\n color: #ffffff;\\n z-index: 1;\\n font-size: 0.8em;\\n text-transform: uppercase;\\n letter-spacing: 0.3em;\\n}\\n\\n.bca > img {\\n width: 16vw;\\n float: left;\\n margin-right: 4vw;\\n margin-bottom: 12vw;\\n}\\n\\n.leftline {\\n top: 8vw;\\n}\\n\\n.normalline {\\n top: 3vw;\\n}\\n\\n.column-reverse {\\n flex-direction: column-reverse;\\n}\\n\\n.showonmobile {\\n opacity: 1;\\n font-size: 2.8vw;\\n}\\n\\n.overlay {\\n position: absolute;\\n left: 0;\\n top: 0;\\n z-index: 2;\\n width: 100%;\\n height: 100%;\\n}\\n\\n.overlay img {\\n position: absolute;\\n z-index: 1;\\n opacity: 0;\\n transition: 1s opacity ease;\\n}\\n\\n.overlay img:nth-child(1) {\\n left: 10.1%;\\n top: 5.7%;\\n width: 25%;\\n}\\n\\n.overlay img:nth-child(2) {\\n left: 30%;\\n top: 4%;\\n width: 27%;\\n transition-delay: 2s !important;\\n}\\n\\n.overlay img:nth-child(3) {\\n left: 25.2%;\\n top: 33.5%;\\n width: 41.4%;\\n transition-delay: 4s !important;\\n}\\n\\n.overlay img:nth-child(4) {\\n right: 16.4%;\\n top: 5.8%;\\n width: 33%;\\n transition-delay: 6s !important;\\n}\\n\\n.overlay img:nth-child(5) {\\n left: 3.4%;\\n bottom: 8%;\\n width: 42%;\\n transition-delay: 8s !important;\\n}\\n\\n.overlay img:nth-child(6) {\\n right: 2.6%;\\n bottom: 1%;\\n width: 48%;\\n transition-delay: 10s !important;\\n}\\n\\n.overlay.shown img {\\n opacity: 1;\\n transition: 1s opacity ease;\\n}\\n\\n.locationmap {\\n height: 25vw;\\n}\\n\\n.border {\\n position: absolute;\\n height: 100%;\\n}\\n\\n.border .leftborder {\\n position: absolute;\\n}\\n\\n.border .bottomborder {\\n position: absolute;\\n}\\n\\n.innerblock {\\n margin-top: 26vw;\\n}\\n\\n.section.h-screen {\\n height: auto;\\n}\\n\\n.w-60 {\\n width: 100%;\\n}\\n\\n.column-reverse2 img {\\n height: initial;\\n}\\n\\n.column-reverse2 p {\\n margin: 0;\\n}\\n\\n.column-reverse2 p span {\\n font-weight: bold;\\n color: #003476;\\n font-size: 5vw;\\n line-height: 7vw;\\n font-family: \\\"Gotham\\\";\\n line-height: 7vw;\\n}\\n\\n.gap-16 {\\n gap: 1rem;\\n}\\n\\n.cars .w-60 {\\n width: 60% !important;\\n}\\n\\n.cars .w-40 {\\n width: 40% !important;\\n}\\n\\n.smalltext {\\n margin-top: 4vw;\\n margin-bottom: 4vw;\\n}\\n\\n.smalltext p {\\n font-size: 3vw;\\n line-height: 5vw;\\n}\\n\\n.smalltext ul {\\n font-size: 3vw;\\n padding-left: 10px;\\n margin: 0;\\n}\\n\\n.nomargintopmobile {\\n margin-top: 0vw;\\n}\\n\\n@media (min-width: 568px) {\\n .innerblock {\\n margin-top: 0 !important;\\n }\\n\\n .showonmobile {\\n opacity: 0;\\n }\\n\\n ion-content .innerblock {\\n padding-bottom: 0vw;\\n }\\n\\n .normalline {\\n top: 1vw !important;\\n }\\n\\n .bca > img {\\n width: 5vw;\\n float: left;\\n margin-right: 1vw;\\n margin-bottom: 5vw;\\n }\\n\\n .leftline {\\n top: 2.4vw;\\n }\\n\\n .column-reverse {\\n flex-direction: row;\\n padding-top: 10vw;\\n }\\n\\n .column-reverse2 {\\n padding-top: 6vw;\\n }\\n .column-reverse2 img {\\n height: -moz-max-content;\\n height: max-content;\\n }\\n .column-reverse2 p span {\\n font-size: 1.2vw;\\n line-height: 1.4vw;\\n }\\n\\n .w-60 {\\n width: 60%;\\n }\\n\\n .gap-16 {\\n gap: 4rem;\\n }\\n\\n .section.h-screen {\\n height: 100vh;\\n }\\n\\n .smalltext {\\n margin-top: 0vw;\\n margin-bottom: 0vw;\\n }\\n .smalltext p {\\n font-size: 0.8vw;\\n line-height: 1.2vw;\\n }\\n .smalltext ul {\\n font-size: 0.8vw;\\n }\\n}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9ibGFuY3QvRG9jdW1lbnRzL1Byb2plY3RzL0tlcHBlbCBTb3V0aCBDZW50cmFsL1dlYnNpdGUvc3JjL2FwcC92aWV3cy9zdXN0YWluYWJpbGl0eS9jb250YWluZXJzL3N1c3RhaW5hYmlsaXR5LnBhZ2Uuc2NzcyIsInNyYy9hcHAvdmlld3Mvc3VzdGFpbmFiaWxpdHkvY29udGFpbmVycy9zdXN0YWluYWJpbGl0eS5wYWdlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDSSxrQkFBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0VBQ0EsY0FBQTtFQUNBLFVBQUE7RUFDQSxnQkFBQTtFQUNBLHlCQUFBO0VBQ0EscUJBQUE7QUNDSjs7QURFQTtFQUNFLFdBQUE7RUFDQSxXQUFBO0VBQ0EsaUJBQUE7RUFDQSxtQkFBQTtBQ0NGOztBREVBO0VBQ0UsUUFBQTtBQ0NGOztBREVBO0VBQ0UsUUFBQTtBQ0NGOztBREVBO0VBQ0UsOEJBQUE7QUNDRjs7QURFQTtFQUNFLFVBQUE7RUFDQSxnQkFBQTtBQ0NGOztBREVBO0VBQ0Usa0JBQUE7RUFDQSxPQUFBO0VBQ0EsTUFBQTtFQUNBLFVBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtBQ0NGOztBRENFO0VBQ0Usa0JBQUE7RUFDQSxVQUFBO0VBQ0EsVUFBQTtFQUNBLDJCQUFBO0FDQ0o7O0FEQ0k7RUFDRSxXQUFBO0VBQ0EsU0FBQTtFQUNBLFVBQUE7QUNDTjs7QURDSTtFQUNFLFNBQUE7RUFDQSxPQUFBO0VBQ0EsVUFBQTtFQUNBLCtCQUFBO0FDQ047O0FEQ0k7RUFDRSxXQUFBO0VBQ0EsVUFBQTtFQUNBLFlBQUE7RUFDQSwrQkFBQTtBQ0NOOztBRENJO0VBQ0UsWUFBQTtFQUNBLFNBQUE7RUFDQSxVQUFBO0VBQ0EsK0JBQUE7QUNDTjs7QURDSTtFQUNFLFVBQUE7RUFDQSxVQUFBO0VBQ0EsVUFBQTtFQUNBLCtCQUFBO0FDQ047O0FEQ0k7RUFDRSxXQUFBO0VBQ0EsVUFBQTtFQUNBLFVBQUE7RUFDQSxnQ0FBQTtBQ0NOOztBRElJO0VBQ0UsVUFBQTtFQUNBLDJCQUFBO0FDRk47O0FET0E7RUFDRSxZQUFBO0FDSkY7O0FET0E7RUFDRSxrQkFBQTtFQUNBLFlBQUE7QUNKRjs7QURPQTtFQUNFLGtCQUFBO0FDSkY7O0FET0E7RUFDRSxrQkFBQTtBQ0pGOztBRE9BO0VBQ0UsZ0JBQUE7QUNKRjs7QURPQTtFQUNFLFlBQUE7QUNKRjs7QURPQTtFQUNFLFdBQUE7QUNKRjs7QURRRTtFQUNFLGVBQUE7QUNMSjs7QURRRTtFQUNFLFNBQUE7QUNOSjs7QURRSTtFQUNFLGlCQUFBO0VBQ0EsY0FBQTtFQUNBLGNBQUE7RUFDQSxnQkFBQTtFQUNBLHFCQUFBO0VBQ0EsZ0JBQUE7QUNOTjs7QURXQTtFQUNFLFNBQUE7QUNSRjs7QURZRTtFQUNFLHFCQUFBO0FDVEo7O0FEWUU7RUFDRSxxQkFBQTtBQ1ZKOztBRGNBO0VBQ0UsZUFBQTtFQUNBLGtCQUFBO0FDWEY7O0FEYUU7RUFDRSxjQUFBO0VBQ0EsZ0JBQUE7QUNYSjs7QURjRTtFQUNFLGNBQUE7RUFDQSxrQkFBQTtFQUNBLFNBQUE7QUNaSjs7QURnQkE7RUFDRSxlQUFBO0FDYkY7O0FEZ0JBO0VBQ0U7SUFDRSx3QkFBQTtFQ2JGOztFRGdCQTtJQUNFLFVBQUE7RUNiRjs7RURnQkE7SUFDRSxtQkFBQTtFQ2JGOztFRGdCQTtJQUNFLG1CQUFBO0VDYkY7O0VEZ0JBO0lBQ0UsVUFBQTtJQUNBLFdBQUE7SUFDQSxpQkFBQTtJQUNBLGtCQUFBO0VDYkY7O0VEZ0JBO0lBQ0UsVUFBQTtFQ2JGOztFRGdCQTtJQUNFLG1CQUFBO0lBQ0EsaUJBQUE7RUNiRjs7RURnQkE7SUFDRSxnQkFBQTtFQ2JGO0VEZUU7SUFDRSx3QkFBQTtJQUFBLG1CQUFBO0VDYko7RURpQkk7SUFDRSxnQkFBQTtJQUNBLGtCQUFBO0VDZk47O0VEb0JBO0lBQ0UsVUFBQTtFQ2pCRjs7RURvQkE7SUFDRSxTQUFBO0VDakJGOztFRG9CQTtJQUNFLGFBQUE7RUNqQkY7O0VEb0JBO0lBRUUsZUFBQTtJQUNBLGtCQUFBO0VDbEJGO0VEb0JFO0lBQ0UsZ0JBQUE7SUFDQSxrQkFBQTtFQ2xCSjtFRHFCRTtJQUNFLGdCQUFBO0VDbkJKO0FBQ0YiLCJmaWxlIjoic3JjL2FwcC92aWV3cy9zdXN0YWluYWJpbGl0eS9jb250YWluZXJzL3N1c3RhaW5hYmlsaXR5LnBhZ2Uuc2NzcyIsInNvdXJjZXNDb250ZW50IjpbImlvbi1zbGlkZSBzcGFuIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGJvdHRvbTogNCU7XHJcbiAgICByaWdodDogNiU7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBmb250LXNpemU6IC44ZW07XHJcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xyXG4gICAgbGV0dGVyLXNwYWNpbmc6IC4zZW07XHJcbn1cclxuXHJcbi5iY2EgPiBpbWcge1xyXG4gIHdpZHRoOiAxNnZ3O1xyXG4gIGZsb2F0OiBsZWZ0O1xyXG4gIG1hcmdpbi1yaWdodDogNHZ3O1xyXG4gIG1hcmdpbi1ib3R0b206IDEydnc7XHJcbn1cclxuXHJcbi5sZWZ0bGluZSB7XHJcbiAgdG9wOiA4dnc7XHJcbn1cclxuXHJcbi5ub3JtYWxsaW5lIHtcclxuICB0b3A6IDN2dztcclxufVxyXG5cclxuLmNvbHVtbi1yZXZlcnNlIHtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XHJcbn1cclxuXHJcbi5zaG93b25tb2JpbGUge1xyXG4gIG9wYWNpdHk6IDE7XHJcbiAgZm9udC1zaXplOiAyLjh2dztcclxufVxyXG5cclxuLm92ZXJsYXkge1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICBsZWZ0OiAwO1xyXG4gIHRvcDogMDtcclxuICB6LWluZGV4OiAyO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGhlaWdodDogMTAwJTtcclxuXHJcbiAgaW1nIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBvcGFjaXR5OiAwO1xyXG4gICAgdHJhbnNpdGlvbjogMXMgb3BhY2l0eSBlYXNlO1xyXG5cclxuICAgICY6bnRoLWNoaWxkKDEpIHtcclxuICAgICAgbGVmdDogMTAuMSU7XHJcbiAgICAgIHRvcDogNS43JTtcclxuICAgICAgd2lkdGg6IDI1JTtcclxuICAgIH1cclxuICAgICY6bnRoLWNoaWxkKDIpIHtcclxuICAgICAgbGVmdDogMzAlO1xyXG4gICAgICB0b3A6IDQlO1xyXG4gICAgICB3aWR0aDogMjclO1xyXG4gICAgICB0cmFuc2l0aW9uLWRlbGF5OiAycyAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG4gICAgJjpudGgtY2hpbGQoMykge1xyXG4gICAgICBsZWZ0OiAyNS4yJTtcclxuICAgICAgdG9wOiAzMy41JTtcclxuICAgICAgd2lkdGg6IDQxLjQlO1xyXG4gICAgICB0cmFuc2l0aW9uLWRlbGF5OiA0cyAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG4gICAgJjpudGgtY2hpbGQoNCkge1xyXG4gICAgICByaWdodDogMTYuNCU7XHJcbiAgICAgIHRvcDogNS44JTtcclxuICAgICAgd2lkdGg6IDMzJTtcclxuICAgICAgdHJhbnNpdGlvbi1kZWxheTogNnMgIWltcG9ydGFudDtcclxuICAgIH1cclxuICAgICY6bnRoLWNoaWxkKDUpIHtcclxuICAgICAgbGVmdDogMy40JTtcclxuICAgICAgYm90dG9tOiA4JTtcclxuICAgICAgd2lkdGg6IDQyJTtcclxuICAgICAgdHJhbnNpdGlvbi1kZWxheTogOHMgIWltcG9ydGFudDtcclxuICAgIH1cclxuICAgICY6bnRoLWNoaWxkKDYpIHtcclxuICAgICAgcmlnaHQ6IDIuNiU7XHJcbiAgICAgIGJvdHRvbTogMSU7XHJcbiAgICAgIHdpZHRoOiA0OCU7XHJcbiAgICAgIHRyYW5zaXRpb24tZGVsYXk6IDEwcyAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJi5zaG93biB7XHJcbiAgICBpbWcge1xyXG4gICAgICBvcGFjaXR5OiAxO1xyXG4gICAgICB0cmFuc2l0aW9uOiAxcyBvcGFjaXR5IGVhc2U7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4ubG9jYXRpb25tYXAge1xyXG4gIGhlaWdodDogMjV2dztcclxufVxyXG5cclxuLmJvcmRlciB7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIGhlaWdodDogMTAwJTtcclxufVxyXG5cclxuLmJvcmRlciAubGVmdGJvcmRlciB7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG59XHJcblxyXG4uYm9yZGVyIC5ib3R0b21ib3JkZXIge1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxufVxyXG5cclxuLmlubmVyYmxvY2sge1xyXG4gIG1hcmdpbi10b3A6IDI2dnc7XHJcbn1cclxuXHJcbi5zZWN0aW9uLmgtc2NyZWVuIHtcclxuICBoZWlnaHQ6IGF1dG87XHJcbn1cclxuXHJcbi53LTYwIHtcclxuICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLmNvbHVtbi1yZXZlcnNlMiB7XHJcbiAgaW1nIHtcclxuICAgIGhlaWdodDogaW5pdGlhbDtcclxuICB9XHJcblxyXG4gIHAge1xyXG4gICAgbWFyZ2luOiAwO1xyXG5cclxuICAgIHNwYW4ge1xyXG4gICAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgICAgY29sb3I6ICMwMDM0NzY7XHJcbiAgICAgIGZvbnQtc2l6ZTogNXZ3O1xyXG4gICAgICBsaW5lLWhlaWdodDogN3Z3O1xyXG4gICAgICBmb250LWZhbWlseTogXCJHb3RoYW1cIjtcclxuICAgICAgbGluZS1oZWlnaHQ6IDd2dztcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi5nYXAtMTYge1xyXG4gIGdhcDogMXJlbTtcclxufVxyXG5cclxuLmNhcnMge1xyXG4gIC53LTYwIHtcclxuICAgIHdpZHRoOiA2MCUgIWltcG9ydGFudDtcclxuICB9XHJcblxyXG4gIC53LTQwIHtcclxuICAgIHdpZHRoOiA0MCUgIWltcG9ydGFudDtcclxuICB9XHJcbn1cclxuXHJcbi5zbWFsbHRleHQge1xyXG4gIG1hcmdpbi10b3A6IDR2dztcclxuICBtYXJnaW4tYm90dG9tOiA0dnc7XHJcblxyXG4gIHAge1xyXG4gICAgZm9udC1zaXplOiAzdnc7XHJcbiAgICBsaW5lLWhlaWdodDogNXZ3O1xyXG4gIH1cclxuXHJcbiAgdWwge1xyXG4gICAgZm9udC1zaXplOiAzdnc7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgfVxyXG59XHJcblxyXG4ubm9tYXJnaW50b3Btb2JpbGUge1xyXG4gIG1hcmdpbi10b3A6IDB2dztcclxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDU2OHB4KSB7XHJcbiAgLmlubmVyYmxvY2sge1xyXG4gICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50O1xyXG4gIH1cclxuXHJcbiAgLnNob3dvbm1vYmlsZSB7XHJcbiAgICBvcGFjaXR5OiAwO1xyXG4gIH1cclxuXHJcbiAgaW9uLWNvbnRlbnQgLmlubmVyYmxvY2sge1xyXG4gICAgcGFkZGluZy1ib3R0b206IDB2dztcclxuICB9XHJcblxyXG4gIC5ub3JtYWxsaW5lIHtcclxuICAgIHRvcDogMXZ3ICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG5cclxuICAuYmNhID4gaW1nIHtcclxuICAgIHdpZHRoOiA1dnc7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIG1hcmdpbi1yaWdodDogMXZ3O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogNXZ3O1xyXG4gIH1cclxuXHJcbiAgLmxlZnRsaW5lIHtcclxuICAgIHRvcDogMi40dnc7XHJcbiAgfVxyXG5cclxuICAuY29sdW1uLXJldmVyc2Uge1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIHBhZGRpbmctdG9wOiAxMHZ3O1xyXG4gIH1cclxuXHJcbiAgLmNvbHVtbi1yZXZlcnNlMiB7XHJcbiAgICBwYWRkaW5nLXRvcDogNnZ3O1xyXG5cclxuICAgIGltZyB7XHJcbiAgICAgIGhlaWdodDogbWF4LWNvbnRlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcCB7XHJcbiAgICAgIHNwYW4ge1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMS4ydnc7XHJcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNHZ3O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAudy02MCB7XHJcbiAgICB3aWR0aDogNjAlO1xyXG4gIH1cclxuXHJcbiAgLmdhcC0xNiB7XHJcbiAgICBnYXA6IDRyZW07XHJcbiAgfVxyXG5cclxuICAuc2VjdGlvbi5oLXNjcmVlbiB7XHJcbiAgICBoZWlnaHQ6IDEwMHZoO1xyXG4gIH1cclxuXHJcbiAgLnNtYWxsdGV4dCB7XHJcblxyXG4gICAgbWFyZ2luLXRvcDogMHZ3O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMHZ3O1xyXG5cclxuICAgIHAge1xyXG4gICAgICBmb250LXNpemU6IDAuOHZ3O1xyXG4gICAgICBsaW5lLWhlaWdodDogMS4ydnc7XHJcbiAgICB9XHJcblxyXG4gICAgdWwge1xyXG4gICAgICBmb250LXNpemU6IDAuOHZ3O1xyXG4gICAgfVxyXG4gIH1cclxufSIsImlvbi1zbGlkZSBzcGFuIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDQlO1xuICByaWdodDogNiU7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICB6LWluZGV4OiAxO1xuICBmb250LXNpemU6IDAuOGVtO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICBsZXR0ZXItc3BhY2luZzogMC4zZW07XG59XG5cbi5iY2EgPiBpbWcge1xuICB3aWR0aDogMTZ2dztcbiAgZmxvYXQ6IGxlZnQ7XG4gIG1hcmdpbi1yaWdodDogNHZ3O1xuICBtYXJnaW4tYm90dG9tOiAxMnZ3O1xufVxuXG4ubGVmdGxpbmUge1xuICB0b3A6IDh2dztcbn1cblxuLm5vcm1hbGxpbmUge1xuICB0b3A6IDN2dztcbn1cblxuLmNvbHVtbi1yZXZlcnNlIHtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xufVxuXG4uc2hvd29ubW9iaWxlIHtcbiAgb3BhY2l0eTogMTtcbiAgZm9udC1zaXplOiAyLjh2dztcbn1cblxuLm92ZXJsYXkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbiAgei1pbmRleDogMjtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbn1cbi5vdmVybGF5IGltZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMTtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogMXMgb3BhY2l0eSBlYXNlO1xufVxuLm92ZXJsYXkgaW1nOm50aC1jaGlsZCgxKSB7XG4gIGxlZnQ6IDEwLjElO1xuICB0b3A6IDUuNyU7XG4gIHdpZHRoOiAyNSU7XG59XG4ub3ZlcmxheSBpbWc6bnRoLWNoaWxkKDIpIHtcbiAgbGVmdDogMzAlO1xuICB0b3A6IDQlO1xuICB3aWR0aDogMjclO1xuICB0cmFuc2l0aW9uLWRlbGF5OiAycyAhaW1wb3J0YW50O1xufVxuLm92ZXJsYXkgaW1nOm50aC1jaGlsZCgzKSB7XG4gIGxlZnQ6IDI1LjIlO1xuICB0b3A6IDMzLjUlO1xuICB3aWR0aDogNDEuNCU7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDRzICFpbXBvcnRhbnQ7XG59XG4ub3ZlcmxheSBpbWc6bnRoLWNoaWxkKDQpIHtcbiAgcmlnaHQ6IDE2LjQlO1xuICB0b3A6IDUuOCU7XG4gIHdpZHRoOiAzMyU7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDZzICFpbXBvcnRhbnQ7XG59XG4ub3ZlcmxheSBpbWc6bnRoLWNoaWxkKDUpIHtcbiAgbGVmdDogMy40JTtcbiAgYm90dG9tOiA4JTtcbiAgd2lkdGg6IDQyJTtcbiAgdHJhbnNpdGlvbi1kZWxheTogOHMgIWltcG9ydGFudDtcbn1cbi5vdmVybGF5IGltZzpudGgtY2hpbGQoNikge1xuICByaWdodDogMi42JTtcbiAgYm90dG9tOiAxJTtcbiAgd2lkdGg6IDQ4JTtcbiAgdHJhbnNpdGlvbi1kZWxheTogMTBzICFpbXBvcnRhbnQ7XG59XG4ub3ZlcmxheS5zaG93biBpbWcge1xuICBvcGFjaXR5OiAxO1xuICB0cmFuc2l0aW9uOiAxcyBvcGFjaXR5IGVhc2U7XG59XG5cbi5sb2NhdGlvbm1hcCB7XG4gIGhlaWdodDogMjV2dztcbn1cblxuLmJvcmRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uYm9yZGVyIC5sZWZ0Ym9yZGVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4uYm9yZGVyIC5ib3R0b21ib3JkZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi5pbm5lcmJsb2NrIHtcbiAgbWFyZ2luLXRvcDogMjZ2dztcbn1cblxuLnNlY3Rpb24uaC1zY3JlZW4ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi53LTYwIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5jb2x1bW4tcmV2ZXJzZTIgaW1nIHtcbiAgaGVpZ2h0OiBpbml0aWFsO1xufVxuLmNvbHVtbi1yZXZlcnNlMiBwIHtcbiAgbWFyZ2luOiAwO1xufVxuLmNvbHVtbi1yZXZlcnNlMiBwIHNwYW4ge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6ICMwMDM0NzY7XG4gIGZvbnQtc2l6ZTogNXZ3O1xuICBsaW5lLWhlaWdodDogN3Z3O1xuICBmb250LWZhbWlseTogXCJHb3RoYW1cIjtcbiAgbGluZS1oZWlnaHQ6IDd2dztcbn1cblxuLmdhcC0xNiB7XG4gIGdhcDogMXJlbTtcbn1cblxuLmNhcnMgLnctNjAge1xuICB3aWR0aDogNjAlICFpbXBvcnRhbnQ7XG59XG4uY2FycyAudy00MCB7XG4gIHdpZHRoOiA0MCUgIWltcG9ydGFudDtcbn1cblxuLnNtYWxsdGV4dCB7XG4gIG1hcmdpbi10b3A6IDR2dztcbiAgbWFyZ2luLWJvdHRvbTogNHZ3O1xufVxuLnNtYWxsdGV4dCBwIHtcbiAgZm9udC1zaXplOiAzdnc7XG4gIGxpbmUtaGVpZ2h0OiA1dnc7XG59XG4uc21hbGx0ZXh0IHVsIHtcbiAgZm9udC1zaXplOiAzdnc7XG4gIHBhZGRpbmctbGVmdDogMTBweDtcbiAgbWFyZ2luOiAwO1xufVxuXG4ubm9tYXJnaW50b3Btb2JpbGUge1xuICBtYXJnaW4tdG9wOiAwdnc7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA1NjhweCkge1xuICAuaW5uZXJibG9jayB7XG4gICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50O1xuICB9XG5cbiAgLnNob3dvbm1vYmlsZSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuXG4gIGlvbi1jb250ZW50IC5pbm5lcmJsb2NrIHtcbiAgICBwYWRkaW5nLWJvdHRvbTogMHZ3O1xuICB9XG5cbiAgLm5vcm1hbGxpbmUge1xuICAgIHRvcDogMXZ3ICFpbXBvcnRhbnQ7XG4gIH1cblxuICAuYmNhID4gaW1nIHtcbiAgICB3aWR0aDogNXZ3O1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbi1yaWdodDogMXZ3O1xuICAgIG1hcmdpbi1ib3R0b206IDV2dztcbiAgfVxuXG4gIC5sZWZ0bGluZSB7XG4gICAgdG9wOiAyLjR2dztcbiAgfVxuXG4gIC5jb2x1bW4tcmV2ZXJzZSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBwYWRkaW5nLXRvcDogMTB2dztcbiAgfVxuXG4gIC5jb2x1bW4tcmV2ZXJzZTIge1xuICAgIHBhZGRpbmctdG9wOiA2dnc7XG4gIH1cbiAgLmNvbHVtbi1yZXZlcnNlMiBpbWcge1xuICAgIGhlaWdodDogbWF4LWNvbnRlbnQ7XG4gIH1cbiAgLmNvbHVtbi1yZXZlcnNlMiBwIHNwYW4ge1xuICAgIGZvbnQtc2l6ZTogMS4ydnc7XG4gICAgbGluZS1oZWlnaHQ6IDEuNHZ3O1xuICB9XG5cbiAgLnctNjAge1xuICAgIHdpZHRoOiA2MCU7XG4gIH1cblxuICAuZ2FwLTE2IHtcbiAgICBnYXA6IDRyZW07XG4gIH1cblxuICAuc2VjdGlvbi5oLXNjcmVlbiB7XG4gICAgaGVpZ2h0OiAxMDB2aDtcbiAgfVxuXG4gIC5zbWFsbHRleHQge1xuICAgIG1hcmdpbi10b3A6IDB2dztcbiAgICBtYXJnaW4tYm90dG9tOiAwdnc7XG4gIH1cbiAgLnNtYWxsdGV4dCBwIHtcbiAgICBmb250LXNpemU6IDAuOHZ3O1xuICAgIGxpbmUtaGVpZ2h0OiAxLjJ2dztcbiAgfVxuICAuc21hbGx0ZXh0IHVsIHtcbiAgICBmb250LXNpemU6IDAuOHZ3O1xuICB9XG59Il19 */\"","import { Component, ElementRef, HostBinding, OnInit, Renderer2, ViewChild } from '@angular/core';\nimport { IonSlides, ModalController } from '@ionic/angular';\nimport { Observable } from 'rxjs';\nimport { Store, select } from '@ngrx/store';\nimport * as fromDesign from '../store/sustainability.actions';\nimport { AppState } from 'src/app/reducers';\nimport { map, concatMap } from 'rxjs/operators';\n\nimport { selectSustainability } from '../store/sustainability.selectors';\nimport { ModalComponent } from 'src/app/shared/components/modal/modal.component';\nimport { animate, query, stagger, style, transition, trigger } from '@angular/animations';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\n\n@Component({\n selector: 'app-pg-sustainability',\n templateUrl: './sustainability.page.html',\n styleUrls: ['./sustainability.page.scss'],\n /* animations: [\n trigger('pageAnimations', [\n transition(':enter', [\n query('.heading *', [\n style({opacity: 0, transform: 'translateY(100px)'}),\n stagger(100, [\n animate('800ms cubic-bezier(0.35, 0, 0.25, 1)', style({ opacity: 1, transform: 'none' }))\n ])\n ])\n ]),\n transition(':leave', [\n query('.heading *', [\n style({opacity: 0, transform: 'translateY(-100px)'}),\n stagger(-100, [\n animate('800ms cubic-bezier(0.35, 0, 0.25, 1)', style({ opacity: 1, transform: 'none' }))\n ])\n ])\n ]),\n ]),\n ] */\n})\n\nexport class SustainabilityPage implements OnInit {\n\n @ViewChild('terms', {static: false, read: ElementRef}) terms: ElementRef;\n @ViewChild('privacy', {static: false, read: ElementRef}) privacy: ElementRef;\n @ViewChild('disclaimer', {static: false, read: ElementRef}) disclaimer: ElementRef;\n @ViewChild('overlay', {static: false, read: ElementRef}) overlay: ElementRef;\n\n constructor(private store: Store, private renderer: Renderer2, public modalController: ModalController, public http: HttpClient) {}\n\n ngAfterViewInit() {\n this.renderer.listen(this.terms.nativeElement, 'click', (event) => {\n window.open(\"https://www.keppelland.com/sg/Terms-and-Conditions\", \"_blank\");\n });\n this.renderer.listen(this.privacy.nativeElement, 'click', (event) => {\n window.open(\"https://www.keppelland.com/sg/Privacy-Policy\", \"_blank\");\n });\n this.renderer.listen(this.disclaimer.nativeElement, 'click', (event) => {\n this.presentModal('disclaimer');\n });\n }\n\n ionViewDidLeave() {\n this.overlay.nativeElement.classList.remove('shown');\n }\n\n ionViewDidEnter() {\n setTimeout(() => {\n this.overlay.nativeElement.classList.add('shown');\n }, 1000);\n }\n\n ngOnInit() {\n }\n\n async presentModal(mediatype) {\n const modal = await this.modalController.create({\n component: ModalComponent,\n cssClass: 'modal-fullscreen-'+mediatype,\n componentProps: {\n 'mediatype': mediatype,\n }\n });\n return await modal.present();\n }\n}","import { Action } from '@ngrx/store';\n\nexport enum SustainabilityActionTypes {\n SustainabilityContentRequested = '[Sustainability] Content Requested',\n SustainabilityContentLoaded = '[Sustainability] Content Loaded',\n SustainabilityFetchError = '[Sustainability] Fetch Error'\n}\n\nexport class SustainabilityContentsRequestedAction implements Action {\n readonly type = SustainabilityActionTypes.SustainabilityContentRequested;\n}\n\nexport class SustainabilityContentsLoadedAction implements Action {\n readonly type = SustainabilityActionTypes.SustainabilityContentLoaded;\n constructor(public payload: { data }) {}\n}\n\nexport class SustainabilityFetchErrorAction implements Action {\n readonly type = SustainabilityActionTypes.SustainabilityFetchError;\n constructor(public payload: { error: any }) {}\n}\n\nexport type SustainabilityActions =\n | SustainabilityContentsRequestedAction\n | SustainabilityContentsLoadedAction\n | SustainabilityFetchErrorAction;","import { Injectable } from '@angular/core';\nimport { Actions, Effect, ofType } from '@ngrx/effects';\nimport { DataService } from '../../../shared/services/data.service';\nimport { SustainabilityActionTypes, SustainabilityContentsRequestedAction, SustainabilityContentsLoadedAction, } from './sustainability.actions';\nimport { filter, map, mergeMap, withLatestFrom} from \"rxjs/operators\";\nimport { Store, select } from '@ngrx/store';\nimport { AppState } from '../../../reducers/index';\nimport { sustainabilityContentsLoaded } from './sustainability.selectors';\n\n\n@Injectable()\nexport class SustainabilityEffects {\n\n constructor(private actions$: Actions, private sustainabilityService: DataService, private store: Store) {}\n\n @Effect()\n selectCoreContents$ = this.actions$\n .pipe(\n ofType(SustainabilityActionTypes.SustainabilityContentRequested),\n withLatestFrom(this.store.pipe(select(sustainabilityContentsLoaded))),\n filter(([action, sustainabilityContentsLoaded]) => !sustainabilityContentsLoaded),\n mergeMap(() => this.sustainabilityService.getData('sustainability')),\n map(sustainability => new SustainabilityContentsLoadedAction(sustainability))\n );\n}","import { sustainabilityInitialState, SustainabilityState } from './sustainability.state';\nimport { SustainabilityActions, SustainabilityActionTypes } from './sustainability.actions';\n\nexport function sustainabilityReducer(state = sustainabilityInitialState, action: SustainabilityActions): SustainabilityState {\n switch (action.type) {\n\n case SustainabilityActionTypes.SustainabilityContentRequested:\n return {...state, isLoading:true};\n\n case SustainabilityActionTypes.SustainabilityContentLoaded:\n return {...state, data: action.payload, isLoading:false, sustainabilityContentsLoaded:true};\n\n case SustainabilityActionTypes.SustainabilityFetchError:\n return {...state, isLoading:false};\n\n default:{\n return state;\n }\n }\n}","import { createSelector, createFeatureSelector } from '@ngrx/store';\nimport { SustainabilityState } from './sustainability.state';\n\nexport const selectSustainabilityState = createFeatureSelector('sustainability');\n\nexport const selectSustainability = createSelector(\n selectSustainabilityState,\n SustainabilityState => SustainabilityState.data\n);\n\nexport const sustainabilityContentsLoaded = createSelector(\n selectSustainabilityState,\n SustainabilityState => SustainabilityState.sustainabilityContentsLoaded\n);\n\nexport const getIsLoading = createSelector(\n selectSustainabilityState,\n SustainabilityState => SustainabilityState.isLoading\n);\n\nexport const getError = createSelector(\n selectSustainabilityState,\n SustainabilityState => SustainabilityState.error\n);","export interface SustainabilityState {\n data: any | null;\n isLoading: boolean;\n sustainabilityContentsLoaded:boolean;\n error: any;\n}\n\nexport const sustainabilityInitialState: SustainabilityState = {\n data: null,\n isLoading: true,\n sustainabilityContentsLoaded: false,\n error: null,\n};","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { SustainabilityPage } from './containers/sustainability.page';\n\nconst routes: Routes = [\n { path: '', component: SustainabilityPage }\n];\n\n@NgModule({\n imports: [\n RouterModule.forChild(routes)\n ],\n exports: [RouterModule]\n})\nexport class SustainabilityRoutingModule {}","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { StoreModule } from '@ngrx/store';\nimport { SustainabilityRoutingModule } from './sustainability-routing.module';\nimport { IonicModule } from '@ionic/angular';\n\nimport { SustainabilityPage } from './containers/sustainability.page';\nimport { SharedModule } from '../../shared/shared.module';\nimport * as fromSustainability from './store/sustainability.reducer';\nimport { EffectsModule } from '@ngrx/effects';\nimport { SustainabilityEffects } from './store/sustainability.effects';\nimport { PinchZoomModule } from 'ngx-pinch-zoom';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n SustainabilityRoutingModule,\n IonicModule,\n SharedModule,\n PinchZoomModule,\n StoreModule.forFeature('sustainability', fromSustainability.sustainabilityReducer),\n EffectsModule.forFeature([SustainabilityEffects])\n ],\n declarations: [SustainabilityPage],\n exports: [SustainabilityPage],\n})\nexport class SustainabilityPageModule {}"],"sourceRoot":""}