diff --git a/client/www/js/controller.purchase.js b/client/www/js/controller.purchase.js index 35b8619de..3ee8bc848 100644 --- a/client/www/js/controller.purchase.js +++ b/client/www/js/controller.purchase.js @@ -1,35 +1,475 @@ /** * https://github.com/WizardFactory/TodayWeather/issues/524 - * there is no inapp purchase * Created by aleckim on 2016. 4. 11.. */ angular.module('controller.purchase', []) - .factory('Purchase', function(TwAds) { + .factory('Purchase', function($http, $q, TwAds, TwStorage, Util) { var obj = {}; obj.ACCOUNT_LEVEL_FREE = 'free'; obj.ACCOUNT_LEVEL_PREMIUM = 'premium'; //for paid app without ads, in app purchase obj.ACCOUNT_LEVEL_PAID = 'paid'; - obj.accountLevel = obj.ACCOUNT_LEVEL_FREE; + obj.accountLevel = null; obj.productId = null; obj.expirationDate = null; - obj.loaded = true; + obj.loaded = false; obj.products = null; //for only ads app without in app purchase obj.hasInAppPurchase = false; obj.paidAppUrl=''; - obj.init = function() { - }; - if (twClientConfig.isPaidApp) { obj.accountLevel = obj.ACCOUNT_LEVEL_PAID; TwAds.setEnableAds(false); } + obj.setAccountLevel = function (accountLevel) { + var self = this; + if (self.accountLevel != accountLevel) { + console.log('set account level ='+accountLevel); + //update accountLevel + self.accountLevel = accountLevel; + if (accountLevel === self.ACCOUNT_LEVEL_FREE) { + TwAds.setEnableAds(true); + } + else if (accountLevel === self.ACCOUNT_LEVEL_PREMIUM) { + TwAds.setEnableAds(false); + } + } + else { + console.log('account level is already set level='+accountLevel); + } + }; + + obj.checkReceiptValidation = function(storeReceipt, callback) { + var url = twClientConfig.serverUrl + '/v000705' + '/check-purchase'; + $http({ + method: 'POST', + headers: {'Content-Type': 'application/json', 'Device-Id': Util.uuid}, + url: url, + data: storeReceipt, + timeout: 10000 + }) + .success(function (data) { + callback(undefined, data); + }) + .error(function (data, status) { + console.log(status +":"+data); + data = data || "Request failed"; + var err = new Error(data); + err.code = status; + + Util.ga.trackEvent('plugin', 'error', 'checkReceiptValidation'); + Util.ga.trackException(err, false); + callback(err); + }); + }; + + obj.saveStoreReceipt = function (storeReceipt) { + TwStorage.set("storeReceipt", storeReceipt); + }; + + obj.loadStoreReceipt = function () { + return TwStorage.get("storeReceipt"); + }; + + obj.loadPurchaseInfo = function () { + var self = this; + console.log('load purchase info'); + var purchaseInfo = TwStorage.get("purchaseInfo"); + + if (purchaseInfo != undefined) { + console.log('load purchaseInfo='+JSON.stringify(purchaseInfo)); + self.expirationDate = purchaseInfo.expirationDate; + //check account date + if ((new Date(purchaseInfo.expirationDate)).getTime() < Date.now()) { + console.log('account expired, please renewal or restore'); + Util.ga.trackEvent('purchase', 'expired', 'subscribeExpired '+purchaseInfo.expirationDate); + purchaseInfo.accountLevel = self.ACCOUNT_LEVEL_FREE; + } + self.setAccountLevel(purchaseInfo.accountLevel); + } + else { + self.setAccountLevel(self.ACCOUNT_LEVEL_FREE); + } + }; + + obj.savePurchaseInfo = function (accountLevel, expirationDate) { + var self = this; + var purchaseInfo = {accountLevel: accountLevel, expirationDate: expirationDate}; + TwStorage.set("purchaseInfo", purchaseInfo); + + if (purchaseInfo.accountLevel === self.ACCOUNT_LEVEL_PREMIUM) { + TwAds.saveTwAdsInfo(false); + } + else { + TwAds.saveTwAdsInfo(true); + } + }; + + obj.updatePurchaseInfo = function () { + var self = this; + var restoreFunc = function () { + if (ionic.Platform.isIOS()) { + return inAppPurchase.getReceipt().then(function (receipt) { + if (receipt == undefined) { + return undefined; + } + return {type: 'ios', id: self.productId, receipt: receipt}; + }); + } + else if (ionic.Platform.isAndroid()) { + return inAppPurchase.restorePurchases().then(function(data) { + console.log('Purchases INFO!!!'); + console.log(JSON.stringify(data)); + console.log('receipt count='+data.length); + data.forEach(function (purchase) { + var inReceipt = JSON.parse(purchase.receipt); + console.log('receipt: '+JSON.stringify(inReceipt)); + console.log('purchaseTime='+new Date(inReceipt.purchaseTime)); + }); + if (data.length == 0) { + return undefined; + } + //if you have many product find by product id + return {type: 'android', id: self.productId, receipt: data}; + }); + } + else { + throw new Error("Unknown platform"); + } + }; + + return restoreFunc() + .then(function (storeReceipt) { + if (storeReceipt == undefined) { + throw new Error("Can not find any purchase"); + } + self.saveStoreReceipt(storeReceipt); + var deferred = $q.defer(); + self.checkReceiptValidation(storeReceipt, function (err, receiptInfo) { + if (err) { + deferred.reject(new Error("Fail to connect validation server. Please restore after 1~2 minutes")); + return; + } + + deferred.resolve(receiptInfo); + }); + return deferred.promise; + }) + }; + + /** + * check validation receipt by saved data in local storage + */ + obj.checkPurchase = function () { + var self = this; + var storeReceipt; + var updatePurchaseInfo; + + storeReceipt = self.loadStoreReceipt(); + if (storeReceipt) { + + console.log('Purchases INFO!!!'); + console.log(JSON.stringify(storeReceipt)); + + updatePurchaseInfo = function () { + var deferred = $q.defer(); + self.checkReceiptValidation(storeReceipt, function (err, receiptInfo) { + if (err) { + deferred.reject(new Error("Fail to connect validation server. Please restore after 1~2 minutes")); + return; + } + + deferred.resolve(receiptInfo); + }); + return deferred.promise; + }; + } + else { + updatePurchaseInfo = self.updatePurchaseInfo; + } + + updatePurchaseInfo() + .then(function (receiptInfo) { + self.loaded = true; + if (!receiptInfo.ok) { + //downgrade by canceled, refund .. + console.log(JSON.stringify(receiptInfo.data)); + self.setAccountLevel(self.ACCOUNT_LEVEL_FREE); + self.savePurchaseInfo(self.accountLevel, self.expirationDate); + + Util.ga.trackEvent('purchase', 'invalid', 'subscribe', 2); + + //$ionicPopup.alert({ + // title: 'check purchase', + // template: receiptInfo.data.message + //}); + } + else { + console.log('welcome premium user'); + } + }) + .catch(function (err) { + //again to check purchase info + console.log('fail to check purchase info err='+err.message); + Util.ga.trackEvent('plugin', 'error', 'updatePurchaseInfo'); + Util.ga.trackException(err, false); + }); + }; + + obj.init = function() { + var self = this; + + if (self.accountLevel == self.ACCOUNT_LEVEL_PAID) { + return; + } + + if (ionic.Platform.isIOS()) { + self.paidAppUrl = twClientConfig.iOSPaidAppUrl; + } + else if (ionic.Platform.isAndroid()) { + self.paidAppUrl = twClientConfig.androidPaidAppUrl; + } + + if (!window.inAppPurchase) { + Util.ga.trackEvent('purchase', 'error', 'uninstalled'); + return; + } + + self.loadPurchaseInfo(); + + //check purchase state is canceled or refund + if (self.loaded) { + console.log('already check purchase info'); + return; + } + + self.productId = 'tw1year'; + console.log('productId='+Purchase.productId); + + self.hasInAppPurchase = true; + + inAppPurchase + .getProducts([self.productId]) + .then(function (products) { + console.log(JSON.stringify(products)); + self.products = products; + if (self.loaded === false) { + //It seems fail to check purchase info + //retry check purchase info + checkPurchase(); + } + }) + .catch(function (err) { + console.log('Fail to get products of id='+self.productId); + console.log(JSON.stringify(err)); + Util.ga.trackException(err, false); + }); + + //if saved accountLevel skip checkPurchase but, have to get products + if (self.accountLevel === self.ACCOUNT_LEVEL_FREE) { + console.log('account Level is '+self.accountLevel); + self.loaded = true; + return; + } + + //some times fail to get restorePurchases because inAppPurchase is not ready + self.checkPurchase(); + }; + return obj; }) - .controller('PurchaseCtrl', function() { - return; + .controller('PurchaseCtrl', function($scope, $ionicLoading, $ionicHistory, $ionicPopup, + Purchase, TwAds, $translate, Util) { + var spinner = '
'; + + var strPurchaseError = "Purchase error"; + var strFailToConnectServer = "Fail to connect validation server."; + var strPleaseRestoreAfter = "Please restore after 1~2 minutes"; + var strRestoringPurchases = "Restoring Purchases..."; + var strRestoreError = "Restore error"; + var strPurchasing = "Purchasing..."; + $translate(['LOC_PURCHASE_ERROR', 'LOC_FAIL_TO_CONNECT_VALIDATION_SERVER', 'LOC_PLEASE_RESTORE_AFTER_1_2_MINUTES', + 'LOC_RESTORING_PURCHASES', 'LOC_RESTORE_ERROR', 'LOC_PURCHASING']).then(function (translations) { + strPurchaseError = translations.LOC_PURCHASE_ERROR; + strFailToConnectServer = translations.LOC_FAIL_TO_CONNECT_VALIDATION_SERVER; + strPleaseRestoreAfter = translations.LOC_PLEASE_RESTORE_AFTER_1_2_MINUTES; + strRestoringPurchases = translations.LOC_RESTORING_PURCHASES; + strRestoreError = translations.LOC_RESTORE_ERROR; + strPurchasing = translations.LOC_PURCHASING; + }, function (translationIds) { + console.log("Fail to translations "+JSON.stringify(translationIds)); + }); + + $scope.order = function () { + $ionicLoading.show({ template: spinner + strPurchasing }); + console.log('subscribe product='+Purchase.productId); + inAppPurchase + .subscribe(Purchase.productId) + .then(function (data) { + console.log('subscribe ok!'); + console.log(JSON.stringify(data)); + //$ionicPopup.alert({ + // title: 'subscribe', + // template: JSON.stringify(data) + //}); + if (ionic.Platform.isIOS()) { + return {type: 'ios', id: Purchase.productId, receipt: data.receipt}; + } + else if (ionic.Platform.isAndroid()) { + return {type: 'android', id: Purchase.productId, receipt: [data]} + } + Util.ga.trackEvent('purchase', 'order', 'subscribe'); + }) + .then(function (storeReceipt) { + //$ionicLoading.hide(); + console.log(JSON.stringify(storeReceipt)); + Purchase.saveStoreReceipt(storeReceipt); + Purchase.checkReceiptValidation(storeReceipt, function (err, receiptInfo) { + $ionicLoading.hide(); + if (err) { + console.log(JSON.stringify(err)); + var msg = strFailToConnectServer + " " + strPleaseRestoreAfter; + throw new Error(msg); + } + console.log(JSON.stringify(receiptInfo)); + if (!receiptInfo.ok) { + Util.ga.trackEvent('purchase', 'invalid', 'subscribe', 0); + console.log(JSON.stringify(receiptInfo.data)); + throw new Error(receiptInfo.data.message); + } + + Purchase.setAccountLevel(Purchase.ACCOUNT_LEVEL_PREMIUM); + Purchase.expirationDate = receiptInfo.data.expires_date; + $scope.accountLevel = Purchase.ACCOUNT_LEVEL_PREMIUM; + $scope.expirationDate = (new Date(Purchase.expirationDate)).toLocaleDateString(); + console.log('set accountLevel='+$scope.accountLevel); + Purchase.savePurchaseInfo(Purchase.accountLevel, Purchase.expirationDate); + }); + }) + .catch(function (err) { + $ionicLoading.hide(); + console.log(strPurchaseError); + console.log(JSON.stringify(err)); + $ionicPopup.alert({ + title: strPurchaseError, + template: err.message + }); + if (err instanceof Error) { + if (err.code == -5) { + Util.ga.trackEvent('purchase', 'cancel', 'subscribe'); + } + else { + Util.ga.trackEvent('purchase', 'error', 'subscribe'); + Util.ga.trackException(err, false); + } + } + else { + Util.ga.trackException(err, false); + } + }); + }; + + $scope.restore = function () { + $ionicLoading.show({ template: spinner + strRestoringPurchases }); + + Purchase.updatePurchaseInfo() + .then(function (receiptInfo) { + $ionicLoading.hide(); + + if (!receiptInfo.ok) { + console.log(JSON.stringify(receiptInfo.data)); + Util.ga.trackEvent('purchase', 'invalid', 'subscribe', 1); + throw new Error(receiptInfo.data.message); + } + else { + Purchase.setAccountLevel(Purchase.ACCOUNT_LEVEL_PREMIUM); + Purchase.expirationDate = receiptInfo.data.expires_date; + $scope.accountLevel = Purchase.ACCOUNT_LEVEL_PREMIUM; + $scope.expirationDate = (new Date(Purchase.expirationDate)).toLocaleDateString(); + console.log('set accountLevel=' + $scope.accountLevel); + Purchase.savePurchaseInfo(Purchase.accountLevel, Purchase.expirationDate); + Util.ga.trackEvent('purchase', 'restore', 'subscribe'); + } + }) + .catch(function (err) { + $ionicLoading.hide(); + console.log(JSON.stringify(err)); + Util.ga.trackEvent('purchase', 'error', 'subscribe'); + Util.ga.trackException(err, false); + $ionicPopup.alert({ + title: strRestoreError, + template: err.message + }); + }); + }; + + $scope.onClose = function() { + if ($scope.accountLevel == Purchase.ACCOUNT_LEVEL_PREMIUM) { + TwAds.setShowAds(false); + } + else { + TwAds.setShowAds(true); + } + $ionicHistory.goBack(); + }; + + $scope.$on('$ionicView.leave', function() { + if ($scope.accountLevel == Purchase.ACCOUNT_LEVEL_PREMIUM) { + TwAds.setShowAds(false); + } + else { + TwAds.setShowAds(true); + } + }); + + $scope.$on('$ionicView.enter', function() { + TwAds.setShowAds(false); + if (window.StatusBar) { + StatusBar.backgroundColorByHexString('#0288D1'); + } + }); + + function init() { + var expirationDate = new Date(Purchase.expirationDate); + var showRenewDate = new Date(); + + //for fast close ads when first loading + TwAds.setShowAds(false); + $scope.accountLevel = Purchase.accountLevel; + $scope.expirationDate = expirationDate.toLocaleDateString(); + + //Todo: check expire date for ios, check autoRenewing and expire date for android + showRenewDate.setMonth(showRenewDate.getMonth()+3); + + $scope.showRenew = expirationDate.getTime() <= showRenewDate.getTime(); + + if (!window.inAppPurchase) { + //for develop mode + var title = "Premium"; + var description = "Subscribe to premium and use without Ads for 1 year"; + $translate(['LOC_PREMIUM', 'LOC_SUBSCRIBE_TO_PREMIUM_AND_USE_WITHOUT_ADS_FOR_1_YEAR']).then(function (translations) { + title = translations.LOC_PREMIUM; + description = translations.LOC_SUBSCRIBE_TO_PREMIUM_AND_USE_WITHOUT_ADS_FOR_1_YEAR; + }, function (translationIds) { + console.log("Fail to translations "+JSON.stringify(translationIds)); + }).finally(function () { + $scope.product = {title: title, price: '$1.09', description: description}; + }); + } + else { + if (Purchase.products && Purchase.products.length) { + $scope.product = Purchase.products[0]; + } + else { + console.log("Failed to get product info at start"); + } + } + + $scope.listWidth = window.innerWidth; + } + + init(); }); diff --git a/ios/TodayWeather.xcodeproj/project.pbxproj b/ios/TodayWeather.xcodeproj/project.pbxproj index 9d7edc495..256653a8e 100755 --- a/ios/TodayWeather.xcodeproj/project.pbxproj +++ b/ios/TodayWeather.xcodeproj/project.pbxproj @@ -5,6 +5,7 @@ }; objectVersion = 46; objects = { + /* Begin PBXBuildFile section */ 0207DA581B56EA530066E2B4 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0207DA571B56EA530066E2B4 /* Images.xcassets */; }; 0F1AA34448D543D79DA0BCDF /* WidgetConfig.h in Sources */ = {isa = PBXBuildFile; fileRef = D2A1B115D49B454C8F95941A /* WidgetConfig.h */; }; @@ -22,6 +23,23 @@ 501B5D63D6C3484D95B9B689 /* ko.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 7E0EC2E0AEEB4104A933D5DD /* ko.lproj */; }; 535E054C7BA343D78380C310 /* TodayWeatherUtil.h in Sources */ = {isa = PBXBuildFile; fileRef = A82482EEB75141C08E1386EF /* TodayWeatherUtil.h */; }; 5439BB1B64D24F1C9730BFFE /* zh-Hant.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B3DF8CCC99DD4BEFABDF916C /* zh-Hant.lproj */; }; + 5A1B63831FFA822A00906B3A /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5A1B63851FFA822A00906B3A /* Info.plist */; }; + 5AADD3511FE039CB00CDBBFC /* WatchTWeatherDraw.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AADD3501FE039CB00CDBBFC /* WatchTWeatherDraw.swift */; }; + 5AADD3531FE039F900CDBBFC /* WatchTWeatherRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AADD3521FE039F900CDBBFC /* WatchTWeatherRequest.swift */; }; + 5AADD3551FE03A1700CDBBFC /* WatchTWeatherUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AADD3541FE03A1700CDBBFC /* WatchTWeatherUtil.swift */; }; + 5AADD3571FE03A3700CDBBFC /* WatchTWeatherShowMore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AADD3561FE03A3700CDBBFC /* WatchTWeatherShowMore.swift */; }; + 5AADD3591FE03A7100CDBBFC /* CityInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AADD3581FE03A7100CDBBFC /* CityInfo.swift */; }; + 5AB39B551FE175BA00CE6FE7 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5AB39B571FE175BA00CE6FE7 /* Localizable.strings */; }; + 5ABD677420012F430088C36B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0207DA571B56EA530066E2B4 /* Images.xcassets */; }; + 5AE499771FDEBEDA00C1B0F8 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5AE499751FDEBEDA00C1B0F8 /* Interface.storyboard */; }; + 5AE499791FDEBEDA00C1B0F8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5AE499781FDEBEDA00C1B0F8 /* Assets.xcassets */; }; + 5AE499801FDEBEDA00C1B0F8 /* watch Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 5AE4997F1FDEBEDA00C1B0F8 /* watch Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 5AE499851FDEBEDA00C1B0F8 /* InterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AE499841FDEBEDA00C1B0F8 /* InterfaceController.swift */; }; + 5AE499871FDEBEDA00C1B0F8 /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AE499861FDEBEDA00C1B0F8 /* ExtensionDelegate.swift */; }; + 5AE499891FDEBEDA00C1B0F8 /* WatchTWeatherComplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AE499881FDEBEDA00C1B0F8 /* WatchTWeatherComplication.swift */; }; + 5AE4998B1FDEBEDA00C1B0F8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5AE4998A1FDEBEDA00C1B0F8 /* Assets.xcassets */; }; + 5AE4998F1FDEBEDA00C1B0F8 /* watch.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 5AE499731FDEBEDA00C1B0F8 /* watch.app */; }; + 65590C159638492B84125EA1 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = B5A987D07C7646DEBDD8D4A8 /* Settings.bundle */; }; 6AFF5BF91D6E424B00AB3073 /* CDVLaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6AFF5BF81D6E424B00AB3073 /* CDVLaunchScreen.storyboard */; }; 751D6E395BCA403F81C35BCD /* TodayViewController.h in Sources */ = {isa = PBXBuildFile; fileRef = BC44C4A97E5D48D58E7307B3 /* TodayViewController.h */; }; 7BAC1D2094DA4E929245516D /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1228418F21A1423CAAA77ABD /* NotificationCenter.framework */; }; @@ -30,7 +48,6 @@ 88BAFD211373452EA2F56EF0 /* LocalizationDefine.h in Sources */ = {isa = PBXBuildFile; fileRef = 8BABE3FF99E74F10ABB37707 /* LocalizationDefine.h */; }; 8B95AD50BE5D4C92B741A277 /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = A534E7EBD1F5430189CB635C /* zh-Hans.lproj */; }; 963317871F7148E18F84774F /* TodayWeatherShowMore.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F3DEF3938024A9FB04386EF /* TodayWeatherShowMore.m */; }; - C33EC32A1FD173130065E35A /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C33EC3291FD173130065E35A /* StoreKit.framework */; }; C33EC3321FD173930065E35A /* ja.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C33EC32B1FD173910065E35A /* ja.lproj */; }; C33EC3331FD173930065E35A /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C33EC32C1FD173910065E35A /* zh-Hans.lproj */; }; C33EC3341FD173930065E35A /* ko.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C33EC32D1FD173910065E35A /* ko.lproj */; }; @@ -41,6 +58,7 @@ CE331FBA2CED433989384EA8 /* TodayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F4CA446AF3042D6987E3BE6 /* TodayViewController.m */; }; CF4CFD112AE2467186941E9F /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 1B046CEC8AFE44529FD51CAB /* de.lproj */; }; E844F8C7445644B68A7F4720 /* TodayWeatherUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F9BCEEF4C243ECBD3C03A8 /* TodayWeatherUtil.m */; }; + F7D5E4B0E87D4A82AC3CCB2E /* AppPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 81EC111D125B400B96E0CB7D /* AppPreferences.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -58,6 +76,20 @@ remoteGlobalIDString = D2AAC07D0554694100DB518D; remoteInfo = CordovaLib; }; + 5AE499811FDEBEDA00C1B0F8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5AE4997E1FDEBEDA00C1B0F8; + remoteInfo = "watch Extension"; + }; + 5AE4998D1FDEBEDA00C1B0F8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5AE499721FDEBEDA00C1B0F8; + remoteInfo = watch; + }; 9FC91D9BBC4C49349AD2CBAA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -79,6 +111,28 @@ name = "Copy Files"; runOnlyForDeploymentPostprocessing = 0; }; + 5AE499951FDEBEDA00C1B0F8 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 5AE499801FDEBEDA00C1B0F8 /* watch Extension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; + 5AE499971FDEBEDA00C1B0F8 /* Embed Watch Content */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; + dstSubfolderSpec = 16; + files = ( + 5AE4998F1FDEBEDA00C1B0F8 /* watch.app in Embed Watch Content */, + ); + name = "Embed Watch Content"; + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -105,10 +159,42 @@ 32CA4F630368D1EE00C91783 /* TodayWeather-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "TodayWeather-Prefix.pch"; sourceTree = ""; }; 34F9BCEEF4C243ECBD3C03A8 /* TodayWeatherUtil.m */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.objc; path = TodayWeatherUtil.m; sourceTree = ""; }; 46D79271F0EF4D7290FB0F66 /* weatherIcon2-color */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; path = "weatherIcon2-color"; sourceTree = ""; }; + 474B2E29FF5249FFA8449878 /* AppPreferences.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = AppPreferences.h; path = "cordova-plugin-app-preferences/AppPreferences.h"; sourceTree = ""; }; + 5A1B63841FFA822A00906B3A /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Base; path = Base.lproj/Info.plist; sourceTree = ""; }; + 5A1B63861FFA822B00906B3A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/Info.plist; sourceTree = ""; }; + 5A1B63871FFA822D00906B3A /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = ko; path = ko.lproj/Info.plist; sourceTree = ""; }; + 5A1B63881FFA822E00906B3A /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = ja; path = ja.lproj/Info.plist; sourceTree = ""; }; + 5A1B63891FFA823000906B3A /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hans"; path = "zh-Hans.lproj/Info.plist"; sourceTree = ""; }; + 5A1B638A1FFA823100906B3A /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hant"; path = "zh-Hant.lproj/Info.plist"; sourceTree = ""; }; + 5A1B638B1FFA823200906B3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = de; path = de.lproj/Info.plist; sourceTree = ""; }; + 5AADD3501FE039CB00CDBBFC /* WatchTWeatherDraw.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchTWeatherDraw.swift; sourceTree = ""; }; + 5AADD3521FE039F900CDBBFC /* WatchTWeatherRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchTWeatherRequest.swift; sourceTree = ""; }; + 5AADD3541FE03A1700CDBBFC /* WatchTWeatherUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchTWeatherUtil.swift; sourceTree = ""; }; + 5AADD3561FE03A3700CDBBFC /* WatchTWeatherShowMore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchTWeatherShowMore.swift; sourceTree = ""; }; + 5AADD3581FE03A7100CDBBFC /* CityInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CityInfo.swift; sourceTree = ""; }; + 5AB39B561FE175BA00CE6FE7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + 5AB39B581FE175C500CE6FE7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + 5AB39B591FE176EC00CE6FE7 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; + 5AB39B5A1FE176FD00CE6FE7 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; + 5AB39B5B1FE1770B00CE6FE7 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + 5AB39B5C1FE1771300CE6FE7 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = ""; }; + 5AB39B5D1FE1771F00CE6FE7 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; + 5AB39B5E1FE180D700CE6FE7 /* watch.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = watch.entitlements; sourceTree = ""; }; + 5AB39B5F1FE1810400CE6FE7 /* watch Extension.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "watch Extension.entitlements"; sourceTree = ""; }; + 5AE499731FDEBEDA00C1B0F8 /* watch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = watch.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5AE499761FDEBEDA00C1B0F8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; + 5AE499781FDEBEDA00C1B0F8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 5AE4997F1FDEBEDA00C1B0F8 /* watch Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "watch Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 5AE499841FDEBEDA00C1B0F8 /* InterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterfaceController.swift; sourceTree = ""; }; + 5AE499861FDEBEDA00C1B0F8 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = ""; }; + 5AE499881FDEBEDA00C1B0F8 /* WatchTWeatherComplication.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchTWeatherComplication.swift; sourceTree = ""; }; + 5AE4998A1FDEBEDA00C1B0F8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 5AE4998C1FDEBEDA00C1B0F8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 6AEED57F06F44325936B9079 /* Base.lproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; path = Base.lproj; sourceTree = ""; }; 6AFF5BF81D6E424B00AB3073 /* CDVLaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = CDVLaunchScreen.storyboard; path = TodayWeather/CDVLaunchScreen.storyboard; sourceTree = SOURCE_ROOT; }; 7D4BC5F6FF97470B87EBF412 /* libCordova.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libCordova.a; sourceTree = ""; }; 7E0EC2E0AEEB4104A933D5DD /* ko.lproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; path = ko.lproj; sourceTree = ""; }; + 81EC111D125B400B96E0CB7D /* AppPreferences.m */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.objc; name = AppPreferences.m; path = "cordova-plugin-app-preferences/AppPreferences.m"; sourceTree = ""; }; 868E93D37533462C94696CE4 /* ja.lproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; path = ja.lproj; sourceTree = ""; }; 8BABE3FF99E74F10ABB37707 /* LocalizationDefine.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; path = LocalizationDefine.h; sourceTree = ""; }; 8D1107310486CEB800E47090 /* TodayWeather-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "TodayWeather-Info.plist"; path = "TodayWeather/TodayWeather-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = SOURCE_ROOT; }; @@ -116,9 +202,9 @@ A534E7EBD1F5430189CB635C /* zh-Hans.lproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; path = "zh-Hans.lproj"; sourceTree = ""; }; A82482EEB75141C08E1386EF /* TodayWeatherUtil.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; path = TodayWeatherUtil.h; sourceTree = ""; }; B3DF8CCC99DD4BEFABDF916C /* zh-Hant.lproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; path = "zh-Hant.lproj"; sourceTree = ""; }; + B5A987D07C7646DEBDD8D4A8 /* Settings.bundle */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = SOURCE_ROOT; }; BC44C4A97E5D48D58E7307B3 /* TodayViewController.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; path = TodayViewController.h; sourceTree = ""; }; C33EC3281FD1730F0065E35A /* TodayWeather.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = TodayWeather.entitlements; path = TodayWeather/TodayWeather.entitlements; sourceTree = ""; }; - C33EC3291FD173130065E35A /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; C33EC32B1FD173910065E35A /* ja.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ja.lproj; path = TodayWeather/ja.lproj; sourceTree = ""; }; C33EC32C1FD173910065E35A /* zh-Hans.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "zh-Hans.lproj"; path = "TodayWeather/zh-Hans.lproj"; sourceTree = ""; }; C33EC32D1FD173910065E35A /* ko.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ko.lproj; path = TodayWeather/ko.lproj; sourceTree = ""; }; @@ -141,7 +227,13 @@ buildActionMask = 2147483647; files = ( 301BF552109A68D80062928A /* libCordova.a in Frameworks */, - C33EC32A1FD173130065E35A /* StoreKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5AE4997C1FDEBEDA00C1B0F8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( ); runOnlyForDeploymentPostprocessing = 0; }; @@ -175,6 +267,8 @@ children = ( 1D6058910D05DD3D006BFB54 /* TodayWeather.app */, 1D610CD859C94D35AC0694DC /* widget.appex */, + 5AE499731FDEBEDA00C1B0F8 /* watch.app */, + 5AE4997F1FDEBEDA00C1B0F8 /* watch Extension.appex */, ); name = Products; sourceTree = ""; @@ -198,6 +292,8 @@ 307C750510C5A3420062BCA9 /* Plugins */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, + 5AE499741FDEBEDA00C1B0F8 /* watch */, + 5AE499831FDEBEDA00C1B0F8 /* watch Extension */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, 69D64D76312045078827F901 /* Widget */, @@ -223,6 +319,7 @@ 3047A50E1AB8057F00498E2A /* config */, 8D1107310486CEB800E47090 /* TodayWeather-Info.plist */, 6AFF5BF81D6E424B00AB3073 /* CDVLaunchScreen.storyboard */, + B5A987D07C7646DEBDD8D4A8 /* Settings.bundle */, ); name = Resources; path = TodayWeather/Resources; @@ -231,7 +328,6 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( - C33EC3291FD173130065E35A /* StoreKit.framework */, 1228418F21A1423CAAA77ABD /* NotificationCenter.framework */, 7D4BC5F6FF97470B87EBF412 /* libCordova.a */, ); @@ -259,11 +355,43 @@ 307C750510C5A3420062BCA9 /* Plugins */ = { isa = PBXGroup; children = ( + 81EC111D125B400B96E0CB7D /* AppPreferences.m */, + 474B2E29FF5249FFA8449878 /* AppPreferences.h */, ); name = Plugins; path = TodayWeather/Plugins; sourceTree = SOURCE_ROOT; }; + 5AE499741FDEBEDA00C1B0F8 /* watch */ = { + isa = PBXGroup; + children = ( + 5AB39B5E1FE180D700CE6FE7 /* watch.entitlements */, + 5AE499751FDEBEDA00C1B0F8 /* Interface.storyboard */, + 5AE499781FDEBEDA00C1B0F8 /* Assets.xcassets */, + 5A1B63851FFA822A00906B3A /* Info.plist */, + ); + path = watch; + sourceTree = ""; + }; + 5AE499831FDEBEDA00C1B0F8 /* watch Extension */ = { + isa = PBXGroup; + children = ( + 5AB39B5F1FE1810400CE6FE7 /* watch Extension.entitlements */, + 5AE499841FDEBEDA00C1B0F8 /* InterfaceController.swift */, + 5AE499861FDEBEDA00C1B0F8 /* ExtensionDelegate.swift */, + 5AADD3501FE039CB00CDBBFC /* WatchTWeatherDraw.swift */, + 5AADD3521FE039F900CDBBFC /* WatchTWeatherRequest.swift */, + 5AADD3541FE03A1700CDBBFC /* WatchTWeatherUtil.swift */, + 5AADD3561FE03A3700CDBBFC /* WatchTWeatherShowMore.swift */, + 5AADD3581FE03A7100CDBBFC /* CityInfo.swift */, + 5AE499881FDEBEDA00C1B0F8 /* WatchTWeatherComplication.swift */, + 5AE4998A1FDEBEDA00C1B0F8 /* Assets.xcassets */, + 5AE4998C1FDEBEDA00C1B0F8 /* Info.plist */, + 5AB39B571FE175BA00CE6FE7 /* Localizable.strings */, + ); + path = "watch Extension"; + sourceTree = ""; + }; 69D64D76312045078827F901 /* Widget */ = { isa = PBXGroup; children = ( @@ -312,18 +440,54 @@ 1D60588E0D05DD3D006BFB54 /* Sources */, 1D60588F0D05DD3D006BFB54 /* Frameworks */, 4E719B87BD6C4084AA25E8E7 /* Copy Files */, + 5AE499971FDEBEDA00C1B0F8 /* Embed Watch Content */, ); buildRules = ( ); dependencies = ( 301BF551109A68C00062928A /* PBXTargetDependency */, 9E019E67A368496EBD128DA4 /* PBXTargetDependency */, + 5AE4998E1FDEBEDA00C1B0F8 /* PBXTargetDependency */, ); name = TodayWeather; productName = TodayWeather; productReference = 1D6058910D05DD3D006BFB54 /* TodayWeather.app */; productType = "com.apple.product-type.application"; }; + 5AE499721FDEBEDA00C1B0F8 /* watch */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5AE499961FDEBEDA00C1B0F8 /* Build configuration list for PBXNativeTarget "watch" */; + buildPhases = ( + 5AE499711FDEBEDA00C1B0F8 /* Resources */, + 5AE499951FDEBEDA00C1B0F8 /* Embed App Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 5AE499821FDEBEDA00C1B0F8 /* PBXTargetDependency */, + ); + name = watch; + productName = watch; + productReference = 5AE499731FDEBEDA00C1B0F8 /* watch.app */; + productType = "com.apple.product-type.application.watchapp2"; + }; + 5AE4997E1FDEBEDA00C1B0F8 /* watch Extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5AE499941FDEBEDA00C1B0F8 /* Build configuration list for PBXNativeTarget "watch Extension" */; + buildPhases = ( + 5AE4997B1FDEBEDA00C1B0F8 /* Sources */, + 5AE4997C1FDEBEDA00C1B0F8 /* Frameworks */, + 5AE4997D1FDEBEDA00C1B0F8 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "watch Extension"; + productName = "watch Extension"; + productReference = 5AE4997F1FDEBEDA00C1B0F8 /* watch Extension.appex */; + productType = "com.apple.product-type.watchkit2-extension"; + }; 7F14ECE01259429E8AE80AA3 /* widget */ = { isa = PBXNativeTarget; buildConfigurationList = 371DD1DA17794EB998134B2D /* Build configuration list for PBXNativeTarget "widget" */; @@ -347,6 +511,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftUpdateCheck = 900; LastUpgradeCheck = 510; TargetAttributes = { 1D6058900D05DD3D006BFB54 = { @@ -369,6 +534,16 @@ }; }; }; + 5AE499721FDEBEDA00C1B0F8 = { + CreatedOnToolsVersion = 9.0.1; + DevelopmentTeam = T9X5DG29UJ; + ProvisioningStyle = Automatic; + }; + 5AE4997E1FDEBEDA00C1B0F8 = { + CreatedOnToolsVersion = 9.0.1; + DevelopmentTeam = T9X5DG29UJ; + ProvisioningStyle = Automatic; + }; 7F14ECE01259429E8AE80AA3 = { DevelopmentTeam = T9X5DG29UJ; SystemCapabilities = { @@ -385,6 +560,12 @@ hasScannedForEncodings = 1; knownRegions = ( en, + Base, + ko, + ja, + "zh-Hans", + "zh-Hant", + de, ); mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; projectDirPath = ""; @@ -398,6 +579,8 @@ targets = ( 1D6058900D05DD3D006BFB54 /* TodayWeather */, 7F14ECE01259429E8AE80AA3 /* widget */, + 5AE499721FDEBEDA00C1B0F8 /* watch */, + 5AE4997E1FDEBEDA00C1B0F8 /* watch Extension */, ); }; /* End PBXProject section */ @@ -427,6 +610,27 @@ C33EC3371FD173930065E35A /* en.lproj in Resources */, C33EC3381FD173930065E35A /* de.lproj in Resources */, C33EC3351FD173930065E35A /* zh-Hant.lproj in Resources */, + 65590C159638492B84125EA1 /* Settings.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5AE499711FDEBEDA00C1B0F8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5AE499791FDEBEDA00C1B0F8 /* Assets.xcassets in Resources */, + 5ABD677420012F430088C36B /* Images.xcassets in Resources */, + 5AE499771FDEBEDA00C1B0F8 /* Interface.storyboard in Resources */, + 5A1B63831FFA822A00906B3A /* Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5AE4997D1FDEBEDA00C1B0F8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5AE4998B1FDEBEDA00C1B0F8 /* Assets.xcassets in Resources */, + 5AB39B551FE175BA00CE6FE7 /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -474,6 +678,22 @@ 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 1D3623260D0F684500981E51 /* AppDelegate.m in Sources */, 302D95F114D2391D003F00A1 /* MainViewController.m in Sources */, + F7D5E4B0E87D4A82AC3CCB2E /* AppPreferences.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5AE4997B1FDEBEDA00C1B0F8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5AE499871FDEBEDA00C1B0F8 /* ExtensionDelegate.swift in Sources */, + 5AADD3571FE03A3700CDBBFC /* WatchTWeatherShowMore.swift in Sources */, + 5AADD3531FE039F900CDBBFC /* WatchTWeatherRequest.swift in Sources */, + 5AE499851FDEBEDA00C1B0F8 /* InterfaceController.swift in Sources */, + 5AE499891FDEBEDA00C1B0F8 /* WatchTWeatherComplication.swift in Sources */, + 5AADD3511FE039CB00CDBBFC /* WatchTWeatherDraw.swift in Sources */, + 5AADD3591FE03A7100CDBBFC /* CityInfo.swift in Sources */, + 5AADD3551FE03A1700CDBBFC /* WatchTWeatherUtil.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -500,6 +720,16 @@ name = CordovaLib; targetProxy = 301BF550109A68C00062928A /* PBXContainerItemProxy */; }; + 5AE499821FDEBEDA00C1B0F8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5AE4997E1FDEBEDA00C1B0F8 /* watch Extension */; + targetProxy = 5AE499811FDEBEDA00C1B0F8 /* PBXContainerItemProxy */; + }; + 5AE4998E1FDEBEDA00C1B0F8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5AE499721FDEBEDA00C1B0F8 /* watch */; + targetProxy = 5AE4998D1FDEBEDA00C1B0F8 /* PBXContainerItemProxy */; + }; 9E019E67A368496EBD128DA4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 7F14ECE01259429E8AE80AA3 /* widget */; @@ -507,6 +737,45 @@ }; /* End PBXTargetDependency section */ +/* Begin PBXVariantGroup section */ + 5A1B63851FFA822A00906B3A /* Info.plist */ = { + isa = PBXVariantGroup; + children = ( + 5A1B63841FFA822A00906B3A /* Base */, + 5A1B63861FFA822B00906B3A /* en */, + 5A1B63871FFA822D00906B3A /* ko */, + 5A1B63881FFA822E00906B3A /* ja */, + 5A1B63891FFA823000906B3A /* zh-Hans */, + 5A1B638A1FFA823100906B3A /* zh-Hant */, + 5A1B638B1FFA823200906B3A /* de */, + ); + name = Info.plist; + sourceTree = ""; + }; + 5AB39B571FE175BA00CE6FE7 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 5AB39B561FE175BA00CE6FE7 /* en */, + 5AB39B581FE175C500CE6FE7 /* Base */, + 5AB39B591FE176EC00CE6FE7 /* ko */, + 5AB39B5A1FE176FD00CE6FE7 /* ja */, + 5AB39B5B1FE1770B00CE6FE7 /* zh-Hans */, + 5AB39B5C1FE1771300CE6FE7 /* zh-Hant */, + 5AB39B5D1FE1771F00CE6FE7 /* de */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 5AE499751FDEBEDA00C1B0F8 /* Interface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5AE499761FDEBEDA00C1B0F8 /* Base */, + ); + name = Interface.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; @@ -520,6 +789,10 @@ CODE_SIGN_ENTITLEMENTS = TodayWeather/TodayWeather.entitlements; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = T9X5DG29UJ; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"TodayWeather/Plugins/cordova-admob\"", + ); GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -529,6 +802,7 @@ INFOPLIST_FILE = "TodayWeather/TodayWeather-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; PRODUCT_NAME = TodayWeather; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -546,6 +820,10 @@ CODE_SIGN_ENTITLEMENTS = TodayWeather/TodayWeather.entitlements; COPY_PHASE_STRIP = YES; DEVELOPMENT_TEAM = T9X5DG29UJ; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"TodayWeather/Plugins/cordova-admob\"", + ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "TodayWeather/TodayWeather-Prefix.pch"; GCC_THUMB_SUPPORT = NO; @@ -553,11 +831,220 @@ INFOPLIST_FILE = "TodayWeather/TodayWeather-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = "$(inherited)"; PRODUCT_NAME = TodayWeather; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; + 5AE499901FDEBEDA00C1B0F8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = T9X5DG29UJ; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + IBSC_MODULE = watch_Extension; + INFOPLIST_FILE = watch/Info.plist; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = net.wizardfactory.todayweather.watchkitapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 4.0; + }; + name = Debug; + }; + 5AE499911FDEBEDA00C1B0F8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = T9X5DG29UJ; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + IBSC_MODULE = watch_Extension; + INFOPLIST_FILE = watch/Info.plist; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = net.wizardfactory.todayweather.watchkitapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = 4; + VALIDATE_PRODUCT = YES; + WATCHOS_DEPLOYMENT_TARGET = 4.0; + }; + name = Release; + }; + 5AE499921FDEBEDA00C1B0F8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = T9X5DG29UJ; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "watch Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = net.wizardfactory.todayweather.watchkitapp.watchkitextension; + PRODUCT_NAME = "${TARGET_NAME}"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 4.0; + }; + name = Debug; + }; + 5AE499931FDEBEDA00C1B0F8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = T9X5DG29UJ; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "watch Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = net.wizardfactory.todayweather.watchkitapp.watchkitextension; + PRODUCT_NAME = "${TARGET_NAME}"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = 4; + VALIDATE_PRODUCT = YES; + WATCHOS_DEPLOYMENT_TARGET = 4.0; + }; + name = Release; + }; 5BE0F2EE6D204B318F63041C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -568,6 +1055,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_NAME = widget; SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; @@ -575,6 +1063,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 3047A5111AB8059700498E2A /* build.xcconfig */; buildSettings = { + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; @@ -602,6 +1091,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 3047A5111AB8059700498E2A /* build.xcconfig */; buildSettings = { + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; @@ -638,6 +1128,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_NAME = widget; SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; @@ -662,6 +1153,24 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 5AE499941FDEBEDA00C1B0F8 /* Build configuration list for PBXNativeTarget "watch Extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5AE499921FDEBEDA00C1B0F8 /* Debug */, + 5AE499931FDEBEDA00C1B0F8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5AE499961FDEBEDA00C1B0F8 /* Build configuration list for PBXNativeTarget "watch" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5AE499901FDEBEDA00C1B0F8 /* Debug */, + 5AE499911FDEBEDA00C1B0F8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "TodayWeather" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/Contents.json index 6a8f6b3c2..f4de26f89 100644 --- a/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/Contents.json @@ -149,6 +149,7 @@ { "size" : "24x24", "idiom" : "watch", + "filename" : "icon-24@2x.png", "scale" : "2x", "role" : "notificationCenter", "subtype" : "38mm" @@ -156,6 +157,7 @@ { "size" : "27.5x27.5", "idiom" : "watch", + "filename" : "icon-27-5@2x.png", "scale" : "2x", "role" : "notificationCenter", "subtype" : "42mm" @@ -163,18 +165,21 @@ { "size" : "29x29", "idiom" : "watch", + "filename" : "icon-29@2x.png", "role" : "companionSettings", "scale" : "2x" }, { "size" : "29x29", "idiom" : "watch", + "filename" : "icon-29@3x.png", "role" : "companionSettings", "scale" : "3x" }, { "size" : "40x40", "idiom" : "watch", + "filename" : "icon-40@2x-1.png", "scale" : "2x", "role" : "appLauncher", "subtype" : "38mm" @@ -182,6 +187,7 @@ { "size" : "44x44", "idiom" : "watch", + "filename" : "icon-44@2x.png", "scale" : "2x", "role" : "longLook", "subtype" : "42mm" @@ -189,6 +195,7 @@ { "size" : "86x86", "idiom" : "watch", + "filename" : "icon-86@2x.png", "scale" : "2x", "role" : "quickLook", "subtype" : "38mm" @@ -196,13 +203,15 @@ { "size" : "98x98", "idiom" : "watch", + "filename" : "icon-98@2x.png", "scale" : "2x", "role" : "quickLook", "subtype" : "42mm" }, { - "idiom" : "watch-marketing", "size" : "1024x1024", + "idiom" : "watch-marketing", + "filename" : "icon-1025.png", "scale" : "1x" } ], diff --git a/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-1025.png b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-1025.png new file mode 100644 index 000000000..b60bf3619 Binary files /dev/null and b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-1025.png differ diff --git a/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-24@2x.png b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-24@2x.png new file mode 100644 index 000000000..df50e7476 Binary files /dev/null and b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-24@2x.png differ diff --git a/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-27-5@2x.png b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-27-5@2x.png new file mode 100644 index 000000000..1da70422c Binary files /dev/null and b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-27-5@2x.png differ diff --git a/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-29@2x.png b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-29@2x.png new file mode 100644 index 000000000..c29746bb7 Binary files /dev/null and b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-29@2x.png differ diff --git a/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-29@3x.png b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-29@3x.png new file mode 100644 index 000000000..fcc829b08 Binary files /dev/null and b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-29@3x.png differ diff --git a/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-40@2x-1.png b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-40@2x-1.png new file mode 100644 index 000000000..056c5b653 Binary files /dev/null and b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-40@2x-1.png differ diff --git a/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-44@2x.png b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-44@2x.png new file mode 100644 index 000000000..b70bfd656 Binary files /dev/null and b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-44@2x.png differ diff --git a/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-86@2x.png b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-86@2x.png new file mode 100644 index 000000000..c8c0eec20 Binary files /dev/null and b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-86@2x.png differ diff --git a/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-98@2x.png b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-98@2x.png new file mode 100644 index 000000000..29c920ca0 Binary files /dev/null and b/ios/TodayWeather/Images.xcassets/AppIcon.appiconset/icon-98@2x.png differ diff --git a/ios/TodayWeather/TodayWeather-Info.plist b/ios/TodayWeather/TodayWeather-Info.plist index 8036b50d8..189bd7d40 100644 --- a/ios/TodayWeather/TodayWeather-Info.plist +++ b/ios/TodayWeather/TodayWeather-Info.plist @@ -1,62 +1,62 @@ - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIcons - - CFBundleIcons~ipad - - CFBundleIdentifier - net.wizardfactory.todayweather - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 0.9.62 - CFBundleSignature - ???? - CFBundleVersion - 0.9.62 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - - NSMainNibFile - - NSMainNibFile~ipad - - UIBackgroundModes - - remote-notification - - UILaunchStoryboardName - CDVLaunchScreen - UIRequiresFullScreen - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeRight - - - + + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIcons + + CFBundleIcons~ipad + + CFBundleIdentifier + net.wizardfactory.todayweather + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.9.62 + CFBundleSignature + ???? + CFBundleVersion + 0.9.62 + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSMainNibFile + + NSMainNibFile~ipad + + UIBackgroundModes + + remote-notification + + UILaunchStoryboardName + CDVLaunchScreen + UIRequiresFullScreen + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeRight + + CFBundleLocalizations + + + \ No newline at end of file diff --git a/ios/TodayWeather/config.xml b/ios/TodayWeather/config.xml index 89b5a564d..f50fc1ae2 100755 --- a/ios/TodayWeather/config.xml +++ b/ios/TodayWeather/config.xml @@ -15,6 +15,9 @@ + + + TodayWeather Inform how warm or cold it is today than yesterday. diff --git a/ios/cordova/build-extras.xcconfig b/ios/cordova/build-extras.xcconfig index 7e6311124..e69de29bb 100755 --- a/ios/cordova/build-extras.xcconfig +++ b/ios/cordova/build-extras.xcconfig @@ -1,22 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -// -// Auto-generated config file to override configuration files (build-release/build-debug). -// diff --git a/ios/ios.json b/ios/ios.json index 48da7f1c9..ecc780d0b 100644 --- a/ios/ios.json +++ b/ios/ios.json @@ -17,13 +17,48 @@ }, "config.xml": { "parents": { - "/*": [] + "/*": [ + { + "xml": "", + "count": 1 + } + ] + } + }, + "*-Info.plist": { + "parents": { + "NSLocationWhenInUseUsageDescription": [], + "NSPhotoLibraryAddUsageDescription": [], + "CFBundleURLTypes": [], + "NSLocationAlwaysUsageDescription": [], + "CFBundleDevelopmentRegion": [], + "CFBundleLocalizations": [], + "ITSAppUsesNonExemptEncryption": [], + "NSBluetoothPeripheralUsageDescription": [], + "NSCalendarsUsageDescription": [], + "NSMicrophoneUsageDescription": [], + "NSPhotoLibraryUsageDescription": [] } } } }, - "installed_plugins": {}, + "installed_plugins": { + "cordova-plugin-app-preferences": { + "PACKAGE_NAME": "net.wizardfactory.todayweather" + } + }, "dependent_plugins": {}, - "modules": [], - "plugin_metadata": {} + "modules": [ + { + "id": "cordova-plugin-app-preferences.apppreferences", + "file": "plugins/cordova-plugin-app-preferences/www/apppreferences.js", + "pluginId": "cordova-plugin-app-preferences", + "clobbers": [ + "plugins.appPreferences" + ] + } + ], + "plugin_metadata": { + "cordova-plugin-app-preferences": "0.99.3" + } } \ No newline at end of file diff --git a/ios/platform_www/cordova_plugins.js b/ios/platform_www/cordova_plugins.js index e27be4a35..cab5c426c 100644 --- a/ios/platform_www/cordova_plugins.js +++ b/ios/platform_www/cordova_plugins.js @@ -1,7 +1,18 @@ cordova.define('cordova/plugin_list', function(require, exports, module) { -module.exports = []; +module.exports = [ + { + "id": "cordova-plugin-app-preferences.apppreferences", + "file": "plugins/cordova-plugin-app-preferences/www/apppreferences.js", + "pluginId": "cordova-plugin-app-preferences", + "clobbers": [ + "plugins.appPreferences" + ] + } +]; module.exports.metadata = // TOP OF METADATA -{}; +{ + "cordova-plugin-app-preferences": "0.99.3" +}; // BOTTOM OF METADATA }); \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/AppIcon.imageset/AppIcon.png b/ios/watch Extension/Assets.xcassets/AppIcon.imageset/AppIcon.png new file mode 100644 index 000000000..c132c53ac Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/AppIcon.imageset/AppIcon.png differ diff --git a/ios/watch Extension/Assets.xcassets/AppIcon.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/AppIcon.imageset/Contents.json new file mode 100644 index 000000000..9cea9f4cf --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/AppIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "AppIcon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon-192@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon-192@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/AppIcon.imageset/icon-192@2x.png b/ios/watch Extension/Assets.xcassets/AppIcon.imageset/icon-192@2x.png new file mode 100644 index 000000000..1e1e8ea17 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/AppIcon.imageset/icon-192@2x.png differ diff --git a/ios/watch Extension/Assets.xcassets/AppIcon.imageset/icon-192@3x.png b/ios/watch Extension/Assets.xcassets/AppIcon.imageset/icon-192@3x.png new file mode 100644 index 000000000..4e0630cab Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/AppIcon.imageset/icon-192@3x.png differ diff --git a/ios/watch Extension/Assets.xcassets/Cloud.imageset/Cloud.png b/ios/watch Extension/Assets.xcassets/Cloud.imageset/Cloud.png new file mode 100644 index 000000000..beacfb6e6 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Cloud.imageset/Cloud.png differ diff --git a/ios/watch Extension/Assets.xcassets/Cloud.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Cloud.imageset/Contents.json new file mode 100644 index 000000000..73e166ec2 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Cloud.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Cloud.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/CloudLightning.imageset/CloudLightning.png b/ios/watch Extension/Assets.xcassets/CloudLightning.imageset/CloudLightning.png new file mode 100644 index 000000000..a52a3e884 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/CloudLightning.imageset/CloudLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/CloudLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/CloudLightning.imageset/Contents.json new file mode 100644 index 000000000..325c2f771 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/CloudLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "CloudLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/CloudRain.imageset/CloudRain.png b/ios/watch Extension/Assets.xcassets/CloudRain.imageset/CloudRain.png new file mode 100644 index 000000000..9d65d2cd4 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/CloudRain.imageset/CloudRain.png differ diff --git a/ios/watch Extension/Assets.xcassets/CloudRain.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/CloudRain.imageset/Contents.json new file mode 100644 index 000000000..4ac49622b --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/CloudRain.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "CloudRain.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/CloudRainLightning.imageset/CloudRainLightning.png b/ios/watch Extension/Assets.xcassets/CloudRainLightning.imageset/CloudRainLightning.png new file mode 100644 index 000000000..43e528116 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/CloudRainLightning.imageset/CloudRainLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/CloudRainLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/CloudRainLightning.imageset/Contents.json new file mode 100644 index 000000000..e54b418c9 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/CloudRainLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "CloudRainLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/CloudRainSnow.imageset/CloudRainSnow.png b/ios/watch Extension/Assets.xcassets/CloudRainSnow.imageset/CloudRainSnow.png new file mode 100644 index 000000000..155f6e3f2 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/CloudRainSnow.imageset/CloudRainSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/CloudRainSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/CloudRainSnow.imageset/Contents.json new file mode 100644 index 000000000..a6d01d0e5 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/CloudRainSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "CloudRainSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/CloudRainSnowLightning.imageset/CloudRainSnowLightning.png b/ios/watch Extension/Assets.xcassets/CloudRainSnowLightning.imageset/CloudRainSnowLightning.png new file mode 100644 index 000000000..c05c9532a Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/CloudRainSnowLightning.imageset/CloudRainSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/CloudRainSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/CloudRainSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..8edb064fc --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/CloudRainSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "CloudRainSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/CloudSnow.imageset/CloudSnow.png b/ios/watch Extension/Assets.xcassets/CloudSnow.imageset/CloudSnow.png new file mode 100644 index 000000000..09992160d Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/CloudSnow.imageset/CloudSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/CloudSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/CloudSnow.imageset/Contents.json new file mode 100644 index 000000000..bff052cc0 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/CloudSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "CloudSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/CloudSnowLightning.imageset/CloudSnowLightning.png b/ios/watch Extension/Assets.xcassets/CloudSnowLightning.imageset/CloudSnowLightning.png new file mode 100644 index 000000000..652aa03d1 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/CloudSnowLightning.imageset/CloudSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/CloudSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/CloudSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..7df567400 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/CloudSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "CloudSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json new file mode 100644 index 000000000..9be9adbf7 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "watch", + "screenWidth" : "{130,145}", + "scale" : "2x" + }, + { + "idiom" : "watch", + "screenWidth" : "{146,165}", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Complication.complicationset/Contents.json b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Contents.json new file mode 100644 index 000000000..2eca9a1f4 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Contents.json @@ -0,0 +1,28 @@ +{ + "assets" : [ + { + "idiom" : "watch", + "filename" : "Circular.imageset", + "role" : "circular" + }, + { + "idiom" : "watch", + "filename" : "Extra Large.imageset", + "role" : "extra-large" + }, + { + "idiom" : "watch", + "filename" : "Modular.imageset", + "role" : "modular" + }, + { + "idiom" : "watch", + "filename" : "Utilitarian.imageset", + "role" : "utilitarian" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/watch Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json new file mode 100644 index 000000000..9be9adbf7 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "watch", + "screenWidth" : "{130,145}", + "scale" : "2x" + }, + { + "idiom" : "watch", + "screenWidth" : "{146,165}", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json new file mode 100644 index 000000000..c7aa92574 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json @@ -0,0 +1,32 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + }, + { + "idiom" : "watch", + "filename" : "Star-52.pdf", + "screen-width" : "<=145", + "scale" : "2x" + }, + { + "idiom" : "watch", + "filename" : "Star-58.pdf", + "screen-width" : ">145", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Star-52.pdf b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Star-52.pdf new file mode 100644 index 000000000..b253a6758 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Star-52.pdf differ diff --git a/ios/watch Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Star-58.pdf b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Star-58.pdf new file mode 100644 index 000000000..1b77db5fe Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Star-58.pdf differ diff --git a/ios/watch Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json new file mode 100644 index 000000000..9be9adbf7 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "idiom" : "watch", + "screenWidth" : "{130,145}", + "scale" : "2x" + }, + { + "idiom" : "watch", + "screenWidth" : "{146,165}", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Contents.json b/ios/watch Extension/Assets.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/EastWind.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/EastWind.imageset/Contents.json new file mode 100644 index 000000000..934c06c6c --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/EastWind.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "EastWind.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/EastWind.imageset/EastWind.png b/ios/watch Extension/Assets.xcassets/EastWind.imageset/EastWind.png new file mode 100644 index 000000000..f82b052b4 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/EastWind.imageset/EastWind.png differ diff --git a/ios/watch Extension/Assets.xcassets/Humidity-0.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Humidity-0.imageset/Contents.json new file mode 100644 index 000000000..b8d1c6416 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Humidity-0.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Humidity-0.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Humidity-0.imageset/Humidity-0.png b/ios/watch Extension/Assets.xcassets/Humidity-0.imageset/Humidity-0.png new file mode 100644 index 000000000..19e995bee Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Humidity-0.imageset/Humidity-0.png differ diff --git a/ios/watch Extension/Assets.xcassets/Humidity-10.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Humidity-10.imageset/Contents.json new file mode 100644 index 000000000..7b308ee4b --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Humidity-10.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Humidity-10.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Humidity-10.imageset/Humidity-10.png b/ios/watch Extension/Assets.xcassets/Humidity-10.imageset/Humidity-10.png new file mode 100644 index 000000000..53843f88b Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Humidity-10.imageset/Humidity-10.png differ diff --git a/ios/watch Extension/Assets.xcassets/Humidity-100.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Humidity-100.imageset/Contents.json new file mode 100644 index 000000000..4edfdbe23 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Humidity-100.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Humidity-100.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Humidity-100.imageset/Humidity-100.png b/ios/watch Extension/Assets.xcassets/Humidity-100.imageset/Humidity-100.png new file mode 100644 index 000000000..79460c3ec Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Humidity-100.imageset/Humidity-100.png differ diff --git a/ios/watch Extension/Assets.xcassets/Humidity-20.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Humidity-20.imageset/Contents.json new file mode 100644 index 000000000..eb23d3867 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Humidity-20.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Humidity-20.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Humidity-20.imageset/Humidity-20.png b/ios/watch Extension/Assets.xcassets/Humidity-20.imageset/Humidity-20.png new file mode 100644 index 000000000..e8e73b752 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Humidity-20.imageset/Humidity-20.png differ diff --git a/ios/watch Extension/Assets.xcassets/Humidity-30.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Humidity-30.imageset/Contents.json new file mode 100644 index 000000000..bc4e79958 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Humidity-30.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Humidity-30.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Humidity-30.imageset/Humidity-30.png b/ios/watch Extension/Assets.xcassets/Humidity-30.imageset/Humidity-30.png new file mode 100644 index 000000000..a3d80f811 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Humidity-30.imageset/Humidity-30.png differ diff --git a/ios/watch Extension/Assets.xcassets/Humidity-40.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Humidity-40.imageset/Contents.json new file mode 100644 index 000000000..b81e42096 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Humidity-40.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Humidity-40.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Humidity-40.imageset/Humidity-40.png b/ios/watch Extension/Assets.xcassets/Humidity-40.imageset/Humidity-40.png new file mode 100644 index 000000000..9c72acd5a Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Humidity-40.imageset/Humidity-40.png differ diff --git a/ios/watch Extension/Assets.xcassets/Humidity-50.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Humidity-50.imageset/Contents.json new file mode 100644 index 000000000..26eb2ef58 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Humidity-50.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Humidity-50.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Humidity-50.imageset/Humidity-50.png b/ios/watch Extension/Assets.xcassets/Humidity-50.imageset/Humidity-50.png new file mode 100644 index 000000000..241df32bb Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Humidity-50.imageset/Humidity-50.png differ diff --git a/ios/watch Extension/Assets.xcassets/Humidity-60.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Humidity-60.imageset/Contents.json new file mode 100644 index 000000000..c0d6ffc5b --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Humidity-60.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Humidity-60.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Humidity-60.imageset/Humidity-60.png b/ios/watch Extension/Assets.xcassets/Humidity-60.imageset/Humidity-60.png new file mode 100644 index 000000000..4f143b245 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Humidity-60.imageset/Humidity-60.png differ diff --git a/ios/watch Extension/Assets.xcassets/Humidity-70.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Humidity-70.imageset/Contents.json new file mode 100644 index 000000000..3e0b46fc5 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Humidity-70.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Humidity-70.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Humidity-70.imageset/Humidity-70.png b/ios/watch Extension/Assets.xcassets/Humidity-70.imageset/Humidity-70.png new file mode 100644 index 000000000..3288223a0 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Humidity-70.imageset/Humidity-70.png differ diff --git a/ios/watch Extension/Assets.xcassets/Humidity-80.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Humidity-80.imageset/Contents.json new file mode 100644 index 000000000..625d4aee3 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Humidity-80.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Humidity-80.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Humidity-80.imageset/Humidity-80.png b/ios/watch Extension/Assets.xcassets/Humidity-80.imageset/Humidity-80.png new file mode 100644 index 000000000..9bc7d609d Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Humidity-80.imageset/Humidity-80.png differ diff --git a/ios/watch Extension/Assets.xcassets/Humidity-90.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Humidity-90.imageset/Contents.json new file mode 100644 index 000000000..486a2039e --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Humidity-90.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Humidity-90.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Humidity-90.imageset/Humidity-90.png b/ios/watch Extension/Assets.xcassets/Humidity-90.imageset/Humidity-90.png new file mode 100644 index 000000000..e00a10541 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Humidity-90.imageset/Humidity-90.png differ diff --git a/ios/watch Extension/Assets.xcassets/Moon.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Moon.imageset/Contents.json new file mode 100644 index 000000000..7d3a8e575 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Moon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Moon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Moon.imageset/Moon.png b/ios/watch Extension/Assets.xcassets/Moon.imageset/Moon.png new file mode 100644 index 000000000..7d3abf770 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Moon.imageset/Moon.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloud.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonBigCloud.imageset/Contents.json new file mode 100644 index 000000000..948a26d5a --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonBigCloud.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonBigCloud.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloud.imageset/MoonBigCloud.png b/ios/watch Extension/Assets.xcassets/MoonBigCloud.imageset/MoonBigCloud.png new file mode 100644 index 000000000..5846ce27b Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonBigCloud.imageset/MoonBigCloud.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonBigCloudLightning.imageset/Contents.json new file mode 100644 index 000000000..a5604e161 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonBigCloudLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonBigCloudLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudLightning.imageset/MoonBigCloudLightning.png b/ios/watch Extension/Assets.xcassets/MoonBigCloudLightning.imageset/MoonBigCloudLightning.png new file mode 100644 index 000000000..9101c79d8 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonBigCloudLightning.imageset/MoonBigCloudLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudRain.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonBigCloudRain.imageset/Contents.json new file mode 100644 index 000000000..cf363daa4 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonBigCloudRain.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonBigCloudRain.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudRain.imageset/MoonBigCloudRain.png b/ios/watch Extension/Assets.xcassets/MoonBigCloudRain.imageset/MoonBigCloudRain.png new file mode 100644 index 000000000..1aea43612 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonBigCloudRain.imageset/MoonBigCloudRain.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudRainLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonBigCloudRainLightning.imageset/Contents.json new file mode 100644 index 000000000..7f1dceb59 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonBigCloudRainLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonBigCloudRainLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudRainLightning.imageset/MoonBigCloudRainLightning.png b/ios/watch Extension/Assets.xcassets/MoonBigCloudRainLightning.imageset/MoonBigCloudRainLightning.png new file mode 100644 index 000000000..d5656cf49 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonBigCloudRainLightning.imageset/MoonBigCloudRainLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudRainSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonBigCloudRainSnow.imageset/Contents.json new file mode 100644 index 000000000..a25296bd0 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonBigCloudRainSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonBigCloudRainSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudRainSnow.imageset/MoonBigCloudRainSnow.png b/ios/watch Extension/Assets.xcassets/MoonBigCloudRainSnow.imageset/MoonBigCloudRainSnow.png new file mode 100644 index 000000000..3accc40b1 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonBigCloudRainSnow.imageset/MoonBigCloudRainSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudRainSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonBigCloudRainSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..2325f0090 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonBigCloudRainSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonBigCloudRainSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudRainSnowLightning.imageset/MoonBigCloudRainSnowLightning.png b/ios/watch Extension/Assets.xcassets/MoonBigCloudRainSnowLightning.imageset/MoonBigCloudRainSnowLightning.png new file mode 100644 index 000000000..fa0ebfe38 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonBigCloudRainSnowLightning.imageset/MoonBigCloudRainSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonBigCloudSnow.imageset/Contents.json new file mode 100644 index 000000000..1e6161e08 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonBigCloudSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonBigCloudSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudSnow.imageset/MoonBigCloudSnow.png b/ios/watch Extension/Assets.xcassets/MoonBigCloudSnow.imageset/MoonBigCloudSnow.png new file mode 100644 index 000000000..a8d8ec42b Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonBigCloudSnow.imageset/MoonBigCloudSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonBigCloudSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..a57b70657 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonBigCloudSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonBigCloudSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonBigCloudSnowLightning.imageset/MoonBigCloudSnowLightning.png b/ios/watch Extension/Assets.xcassets/MoonBigCloudSnowLightning.imageset/MoonBigCloudSnowLightning.png new file mode 100644 index 000000000..6ed879a75 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonBigCloudSnowLightning.imageset/MoonBigCloudSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonLightning.imageset/Contents.json new file mode 100644 index 000000000..d92fe5cc3 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonLightning.imageset/MoonLightning.png b/ios/watch Extension/Assets.xcassets/MoonLightning.imageset/MoonLightning.png new file mode 100644 index 000000000..67a5b22b8 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonLightning.imageset/MoonLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonRain.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonRain.imageset/Contents.json new file mode 100644 index 000000000..cdc09b3f0 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonRain.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonRain.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonRain.imageset/MoonRain.png b/ios/watch Extension/Assets.xcassets/MoonRain.imageset/MoonRain.png new file mode 100644 index 000000000..6a719c17e Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonRain.imageset/MoonRain.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonRainLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonRainLightning.imageset/Contents.json new file mode 100644 index 000000000..ed23c69c7 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonRainLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonRainLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonRainLightning.imageset/MoonRainLightning.png b/ios/watch Extension/Assets.xcassets/MoonRainLightning.imageset/MoonRainLightning.png new file mode 100644 index 000000000..60dcbf26b Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonRainLightning.imageset/MoonRainLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonRainSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonRainSnow.imageset/Contents.json new file mode 100644 index 000000000..00c017adf --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonRainSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonRainSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonRainSnow.imageset/MoonRainSnow.png b/ios/watch Extension/Assets.xcassets/MoonRainSnow.imageset/MoonRainSnow.png new file mode 100644 index 000000000..98b9fef47 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonRainSnow.imageset/MoonRainSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonRainSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonRainSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..53954002e --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonRainSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonRainSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonRainSnowLightning.imageset/MoonRainSnowLightning.png b/ios/watch Extension/Assets.xcassets/MoonRainSnowLightning.imageset/MoonRainSnowLightning.png new file mode 100644 index 000000000..65f6c0792 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonRainSnowLightning.imageset/MoonRainSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloud.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonSmallCloud.imageset/Contents.json new file mode 100644 index 000000000..1ffd12684 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonSmallCloud.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonSmallCloud.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloud.imageset/MoonSmallCloud.png b/ios/watch Extension/Assets.xcassets/MoonSmallCloud.imageset/MoonSmallCloud.png new file mode 100644 index 000000000..7cd260cc9 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonSmallCloud.imageset/MoonSmallCloud.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonSmallCloudLightning.imageset/Contents.json new file mode 100644 index 000000000..d32a536a6 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonSmallCloudLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonSmallCloudLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudLightning.imageset/MoonSmallCloudLightning.png b/ios/watch Extension/Assets.xcassets/MoonSmallCloudLightning.imageset/MoonSmallCloudLightning.png new file mode 100644 index 000000000..67a5b22b8 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonSmallCloudLightning.imageset/MoonSmallCloudLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudRain.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRain.imageset/Contents.json new file mode 100644 index 000000000..782007863 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRain.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonSmallCloudRain.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudRain.imageset/MoonSmallCloudRain.png b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRain.imageset/MoonSmallCloudRain.png new file mode 100644 index 000000000..6a719c17e Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRain.imageset/MoonSmallCloudRain.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainLightning.imageset/Contents.json new file mode 100644 index 000000000..595336df0 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonSmallCloudRainLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainLightning.imageset/MoonSmallCloudRainLightning.png b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainLightning.imageset/MoonSmallCloudRainLightning.png new file mode 100644 index 000000000..60dcbf26b Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainLightning.imageset/MoonSmallCloudRainLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainSnow.imageset/Contents.json new file mode 100644 index 000000000..d812bde5f --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonSmallCloudRainSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainSnow.imageset/MoonSmallCloudRainSnow.png b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainSnow.imageset/MoonSmallCloudRainSnow.png new file mode 100644 index 000000000..98b9fef47 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainSnow.imageset/MoonSmallCloudRainSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..9364d63f3 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonSmallCloudRainSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainSnowLightning.imageset/MoonSmallCloudRainSnowLightning.png b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainSnowLightning.imageset/MoonSmallCloudRainSnowLightning.png new file mode 100644 index 000000000..65f6c0792 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonSmallCloudRainSnowLightning.imageset/MoonSmallCloudRainSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonSmallCloudSnow.imageset/Contents.json new file mode 100644 index 000000000..0b1c11c1b --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonSmallCloudSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonSmallCloudSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudSnow.imageset/MoonSmallCloudSnow.png b/ios/watch Extension/Assets.xcassets/MoonSmallCloudSnow.imageset/MoonSmallCloudSnow.png new file mode 100644 index 000000000..2c3a7cd57 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonSmallCloudSnow.imageset/MoonSmallCloudSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonSmallCloudSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..680c8f7fe --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonSmallCloudSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonSmallCloudSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonSmallCloudSnowLightning.imageset/MoonSmallCloudSnowLightning.png b/ios/watch Extension/Assets.xcassets/MoonSmallCloudSnowLightning.imageset/MoonSmallCloudSnowLightning.png new file mode 100644 index 000000000..e60483cef Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonSmallCloudSnowLightning.imageset/MoonSmallCloudSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonSnow.imageset/Contents.json new file mode 100644 index 000000000..bc914f661 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonSnow.imageset/MoonSnow.png b/ios/watch Extension/Assets.xcassets/MoonSnow.imageset/MoonSnow.png new file mode 100644 index 000000000..2c3a7cd57 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonSnow.imageset/MoonSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/MoonSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/MoonSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..2484e3e7f --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/MoonSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "MoonSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/MoonSnowLightning.imageset/MoonSnowLightning.png b/ios/watch Extension/Assets.xcassets/MoonSnowLightning.imageset/MoonSnowLightning.png new file mode 100644 index 000000000..e60483cef Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/MoonSnowLightning.imageset/MoonSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/NorthEastWind.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/NorthEastWind.imageset/Contents.json new file mode 100644 index 000000000..1ea5f4b3b --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/NorthEastWind.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "NorthEastWind.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/NorthEastWind.imageset/NorthEastWind.png b/ios/watch Extension/Assets.xcassets/NorthEastWind.imageset/NorthEastWind.png new file mode 100644 index 000000000..7f881c698 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/NorthEastWind.imageset/NorthEastWind.png differ diff --git a/ios/watch Extension/Assets.xcassets/NorthWestWind.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/NorthWestWind.imageset/Contents.json new file mode 100644 index 000000000..fb9f02fb5 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/NorthWestWind.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "NorthWestWind.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/NorthWestWind.imageset/NorthWestWind.png b/ios/watch Extension/Assets.xcassets/NorthWestWind.imageset/NorthWestWind.png new file mode 100644 index 000000000..644085608 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/NorthWestWind.imageset/NorthWestWind.png differ diff --git a/ios/watch Extension/Assets.xcassets/NorthWind.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/NorthWind.imageset/Contents.json new file mode 100644 index 000000000..01c4e1fb1 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/NorthWind.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "NorthWind.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/NorthWind.imageset/NorthWind.png b/ios/watch Extension/Assets.xcassets/NorthWind.imageset/NorthWind.png new file mode 100644 index 000000000..201e04702 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/NorthWind.imageset/NorthWind.png differ diff --git a/ios/watch Extension/Assets.xcassets/PM10.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/PM10.imageset/Contents.json new file mode 100644 index 000000000..1347bda2b --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/PM10.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "PM10.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/PM10.imageset/PM10.png b/ios/watch Extension/Assets.xcassets/PM10.imageset/PM10.png new file mode 100644 index 000000000..f475d0c1d Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/PM10.imageset/PM10.png differ diff --git a/ios/watch Extension/Assets.xcassets/Search.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Search.imageset/Contents.json new file mode 100644 index 000000000..edb819e0f --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Search.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Search.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Search.imageset/Search.png b/ios/watch Extension/Assets.xcassets/Search.imageset/Search.png new file mode 100644 index 000000000..3e9ebcf74 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Search.imageset/Search.png differ diff --git a/ios/watch Extension/Assets.xcassets/SouthEastWind.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SouthEastWind.imageset/Contents.json new file mode 100644 index 000000000..35dc6905c --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SouthEastWind.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SouthEastWind.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SouthEastWind.imageset/SouthEastWind.png b/ios/watch Extension/Assets.xcassets/SouthEastWind.imageset/SouthEastWind.png new file mode 100644 index 000000000..294a2c18c Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SouthEastWind.imageset/SouthEastWind.png differ diff --git a/ios/watch Extension/Assets.xcassets/SouthWestWind.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SouthWestWind.imageset/Contents.json new file mode 100644 index 000000000..52138ce8a --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SouthWestWind.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SouthWestWind.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SouthWestWind.imageset/SouthWestWind.png b/ios/watch Extension/Assets.xcassets/SouthWestWind.imageset/SouthWestWind.png new file mode 100644 index 000000000..539c71acd Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SouthWestWind.imageset/SouthWestWind.png differ diff --git a/ios/watch Extension/Assets.xcassets/SouthWind.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SouthWind.imageset/Contents.json new file mode 100644 index 000000000..5418db563 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SouthWind.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SouthWind.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SouthWind.imageset/SouthWind.png b/ios/watch Extension/Assets.xcassets/SouthWind.imageset/SouthWind.png new file mode 100644 index 000000000..27dbef442 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SouthWind.imageset/SouthWind.png differ diff --git a/ios/watch Extension/Assets.xcassets/Sun.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Sun.imageset/Contents.json new file mode 100644 index 000000000..44b91eb3f --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Sun.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Sun.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Sun.imageset/Sun.png b/ios/watch Extension/Assets.xcassets/Sun.imageset/Sun.png new file mode 100644 index 000000000..1e7ec6dd4 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Sun.imageset/Sun.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloud.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunBigCloud.imageset/Contents.json new file mode 100644 index 000000000..1e5bd0b3e --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunBigCloud.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunBigCloud.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloud.imageset/SunBigCloud.png b/ios/watch Extension/Assets.xcassets/SunBigCloud.imageset/SunBigCloud.png new file mode 100644 index 000000000..bd75671eb Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunBigCloud.imageset/SunBigCloud.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunBigCloudLightning.imageset/Contents.json new file mode 100644 index 000000000..86ea6c13d --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunBigCloudLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunBigCloudLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudLightning.imageset/SunBigCloudLightning.png b/ios/watch Extension/Assets.xcassets/SunBigCloudLightning.imageset/SunBigCloudLightning.png new file mode 100644 index 000000000..e4672762a Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunBigCloudLightning.imageset/SunBigCloudLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudRain.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunBigCloudRain.imageset/Contents.json new file mode 100644 index 000000000..86260b4db --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunBigCloudRain.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunBigCloudRain.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudRain.imageset/SunBigCloudRain.png b/ios/watch Extension/Assets.xcassets/SunBigCloudRain.imageset/SunBigCloudRain.png new file mode 100644 index 000000000..daed26921 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunBigCloudRain.imageset/SunBigCloudRain.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudRainLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunBigCloudRainLightning.imageset/Contents.json new file mode 100644 index 000000000..9c88be5bd --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunBigCloudRainLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunBigCloudRainLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudRainLightning.imageset/SunBigCloudRainLightning.png b/ios/watch Extension/Assets.xcassets/SunBigCloudRainLightning.imageset/SunBigCloudRainLightning.png new file mode 100644 index 000000000..80f8d5a6d Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunBigCloudRainLightning.imageset/SunBigCloudRainLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudRainSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunBigCloudRainSnow.imageset/Contents.json new file mode 100644 index 000000000..79c8481e6 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunBigCloudRainSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunBigCloudRainSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudRainSnow.imageset/SunBigCloudRainSnow.png b/ios/watch Extension/Assets.xcassets/SunBigCloudRainSnow.imageset/SunBigCloudRainSnow.png new file mode 100644 index 000000000..36efe14ef Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunBigCloudRainSnow.imageset/SunBigCloudRainSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudRainSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunBigCloudRainSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..0fd0af434 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunBigCloudRainSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunBigCloudRainSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudRainSnowLightning.imageset/SunBigCloudRainSnowLightning.png b/ios/watch Extension/Assets.xcassets/SunBigCloudRainSnowLightning.imageset/SunBigCloudRainSnowLightning.png new file mode 100644 index 000000000..f581a181f Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunBigCloudRainSnowLightning.imageset/SunBigCloudRainSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunBigCloudSnow.imageset/Contents.json new file mode 100644 index 000000000..9074e980d --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunBigCloudSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunBigCloudSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudSnow.imageset/SunBigCloudSnow.png b/ios/watch Extension/Assets.xcassets/SunBigCloudSnow.imageset/SunBigCloudSnow.png new file mode 100644 index 000000000..5c4cdbf02 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunBigCloudSnow.imageset/SunBigCloudSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunBigCloudSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..7767faabf --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunBigCloudSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunBigCloudSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunBigCloudSnowLightning.imageset/SunBigCloudSnowLightning.png b/ios/watch Extension/Assets.xcassets/SunBigCloudSnowLightning.imageset/SunBigCloudSnowLightning.png new file mode 100644 index 000000000..f1ea5f0cc Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunBigCloudSnowLightning.imageset/SunBigCloudSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunLightning.imageset/Contents.json new file mode 100644 index 000000000..d741d6c02 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunLightning.imageset/SunLightning.png b/ios/watch Extension/Assets.xcassets/SunLightning.imageset/SunLightning.png new file mode 100644 index 000000000..9c3910d4e Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunLightning.imageset/SunLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunRain.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunRain.imageset/Contents.json new file mode 100644 index 000000000..cbdb783c3 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunRain.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunRain.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunRain.imageset/SunRain.png b/ios/watch Extension/Assets.xcassets/SunRain.imageset/SunRain.png new file mode 100644 index 000000000..a59bbdafe Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunRain.imageset/SunRain.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunRainLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunRainLightning.imageset/Contents.json new file mode 100644 index 000000000..245ab14c9 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunRainLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunRainLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunRainLightning.imageset/SunRainLightning.png b/ios/watch Extension/Assets.xcassets/SunRainLightning.imageset/SunRainLightning.png new file mode 100644 index 000000000..99ab07973 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunRainLightning.imageset/SunRainLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunRainSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunRainSnow.imageset/Contents.json new file mode 100644 index 000000000..125c36f32 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunRainSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunRainSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunRainSnow.imageset/SunRainSnow.png b/ios/watch Extension/Assets.xcassets/SunRainSnow.imageset/SunRainSnow.png new file mode 100644 index 000000000..2124d1116 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunRainSnow.imageset/SunRainSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunRainSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunRainSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..c9038c0b5 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunRainSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunRainSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunRainSnowLightning.imageset/SunRainSnowLightning.png b/ios/watch Extension/Assets.xcassets/SunRainSnowLightning.imageset/SunRainSnowLightning.png new file mode 100644 index 000000000..770dfbb1f Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunRainSnowLightning.imageset/SunRainSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunRising.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunRising.imageset/Contents.json new file mode 100644 index 000000000..f478cda41 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunRising.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunRising.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunRising.imageset/SunRising.png b/ios/watch Extension/Assets.xcassets/SunRising.imageset/SunRising.png new file mode 100644 index 000000000..c43f87c7a Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunRising.imageset/SunRising.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunSet.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunSet.imageset/Contents.json new file mode 100644 index 000000000..e95ec2868 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunSet.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunSet.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunSet.imageset/SunSet.png b/ios/watch Extension/Assets.xcassets/SunSet.imageset/SunSet.png new file mode 100644 index 000000000..366e4bb5f Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunSet.imageset/SunSet.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloud.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunSmallCloud.imageset/Contents.json new file mode 100644 index 000000000..22d3634cc --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunSmallCloud.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunSmallCloud.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloud.imageset/SunSmallCloud.png b/ios/watch Extension/Assets.xcassets/SunSmallCloud.imageset/SunSmallCloud.png new file mode 100644 index 000000000..607af3c02 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunSmallCloud.imageset/SunSmallCloud.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunSmallCloudLightning.imageset/Contents.json new file mode 100644 index 000000000..758c05f33 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunSmallCloudLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunSmallCloudLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudLightning.imageset/SunSmallCloudLightning.png b/ios/watch Extension/Assets.xcassets/SunSmallCloudLightning.imageset/SunSmallCloudLightning.png new file mode 100644 index 000000000..9c3910d4e Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunSmallCloudLightning.imageset/SunSmallCloudLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudRain.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunSmallCloudRain.imageset/Contents.json new file mode 100644 index 000000000..f57430913 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunSmallCloudRain.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunSmallCloudRain.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudRain.imageset/SunSmallCloudRain.png b/ios/watch Extension/Assets.xcassets/SunSmallCloudRain.imageset/SunSmallCloudRain.png new file mode 100644 index 000000000..a59bbdafe Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunSmallCloudRain.imageset/SunSmallCloudRain.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudRainLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunSmallCloudRainLightning.imageset/Contents.json new file mode 100644 index 000000000..06729ffd1 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunSmallCloudRainLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunSmallCloudRainLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudRainLightning.imageset/SunSmallCloudRainLightning.png b/ios/watch Extension/Assets.xcassets/SunSmallCloudRainLightning.imageset/SunSmallCloudRainLightning.png new file mode 100644 index 000000000..99ab07973 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunSmallCloudRainLightning.imageset/SunSmallCloudRainLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudRainSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunSmallCloudRainSnow.imageset/Contents.json new file mode 100644 index 000000000..2119d3c09 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunSmallCloudRainSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunSmallCloudRainSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudRainSnow.imageset/SunSmallCloudRainSnow.png b/ios/watch Extension/Assets.xcassets/SunSmallCloudRainSnow.imageset/SunSmallCloudRainSnow.png new file mode 100644 index 000000000..2124d1116 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunSmallCloudRainSnow.imageset/SunSmallCloudRainSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudRainSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunSmallCloudRainSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..302666e1e --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunSmallCloudRainSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunSmallCloudRainSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudRainSnowLightning.imageset/SunSmallCloudRainSnowLightning.png b/ios/watch Extension/Assets.xcassets/SunSmallCloudRainSnowLightning.imageset/SunSmallCloudRainSnowLightning.png new file mode 100644 index 000000000..770dfbb1f Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunSmallCloudRainSnowLightning.imageset/SunSmallCloudRainSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunSmallCloudSnow.imageset/Contents.json new file mode 100644 index 000000000..c9ac87d15 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunSmallCloudSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunSmallCloudSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudSnow.imageset/SunSmallCloudSnow.png b/ios/watch Extension/Assets.xcassets/SunSmallCloudSnow.imageset/SunSmallCloudSnow.png new file mode 100644 index 000000000..4673ffc83 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunSmallCloudSnow.imageset/SunSmallCloudSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunSmallCloudSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..07d24a8f5 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunSmallCloudSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunSmallCloudSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunSmallCloudSnowLightning.imageset/SunSmallCloudSnowLightning.png b/ios/watch Extension/Assets.xcassets/SunSmallCloudSnowLightning.imageset/SunSmallCloudSnowLightning.png new file mode 100644 index 000000000..c83d2a20a Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunSmallCloudSnowLightning.imageset/SunSmallCloudSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunSnow.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunSnow.imageset/Contents.json new file mode 100644 index 000000000..b54fa8f7b --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunSnow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunSnow.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunSnow.imageset/SunSnow.png b/ios/watch Extension/Assets.xcassets/SunSnow.imageset/SunSnow.png new file mode 100644 index 000000000..4673ffc83 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunSnow.imageset/SunSnow.png differ diff --git a/ios/watch Extension/Assets.xcassets/SunSnowLightning.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/SunSnowLightning.imageset/Contents.json new file mode 100644 index 000000000..b1f313979 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/SunSnowLightning.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "SunSnowLightning.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/SunSnowLightning.imageset/SunSnowLightning.png b/ios/watch Extension/Assets.xcassets/SunSnowLightning.imageset/SunSnowLightning.png new file mode 100644 index 000000000..c83d2a20a Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/SunSnowLightning.imageset/SunSnowLightning.png differ diff --git a/ios/watch Extension/Assets.xcassets/Temp-1.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Temp-1.imageset/Contents.json new file mode 100644 index 000000000..fe10b023b --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Temp-1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Temp-1.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Temp-1.imageset/Temp-1.png b/ios/watch Extension/Assets.xcassets/Temp-1.imageset/Temp-1.png new file mode 100644 index 000000000..1488b2d4a Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Temp-1.imageset/Temp-1.png differ diff --git a/ios/watch Extension/Assets.xcassets/Temp-10.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Temp-10.imageset/Contents.json new file mode 100644 index 000000000..7d2673935 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Temp-10.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Temp-10.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Temp-10.imageset/Temp-10.png b/ios/watch Extension/Assets.xcassets/Temp-10.imageset/Temp-10.png new file mode 100644 index 000000000..48bf20713 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Temp-10.imageset/Temp-10.png differ diff --git a/ios/watch Extension/Assets.xcassets/Temp-2.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Temp-2.imageset/Contents.json new file mode 100644 index 000000000..4e2d22dd2 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Temp-2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Temp-2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Temp-2.imageset/Temp-2.png b/ios/watch Extension/Assets.xcassets/Temp-2.imageset/Temp-2.png new file mode 100644 index 000000000..89450e09f Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Temp-2.imageset/Temp-2.png differ diff --git a/ios/watch Extension/Assets.xcassets/Temp-3.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Temp-3.imageset/Contents.json new file mode 100644 index 000000000..2fce1fc84 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Temp-3.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Temp-3.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Temp-3.imageset/Temp-3.png b/ios/watch Extension/Assets.xcassets/Temp-3.imageset/Temp-3.png new file mode 100644 index 000000000..c54f923c8 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Temp-3.imageset/Temp-3.png differ diff --git a/ios/watch Extension/Assets.xcassets/Temp-4.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Temp-4.imageset/Contents.json new file mode 100644 index 000000000..9ee21f694 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Temp-4.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Temp-4.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Temp-4.imageset/Temp-4.png b/ios/watch Extension/Assets.xcassets/Temp-4.imageset/Temp-4.png new file mode 100644 index 000000000..fd5715f8f Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Temp-4.imageset/Temp-4.png differ diff --git a/ios/watch Extension/Assets.xcassets/Temp-5.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Temp-5.imageset/Contents.json new file mode 100644 index 000000000..0d60bc151 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Temp-5.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Temp-5.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Temp-5.imageset/Temp-5.png b/ios/watch Extension/Assets.xcassets/Temp-5.imageset/Temp-5.png new file mode 100644 index 000000000..6cabb7f95 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Temp-5.imageset/Temp-5.png differ diff --git a/ios/watch Extension/Assets.xcassets/Temp-6.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Temp-6.imageset/Contents.json new file mode 100644 index 000000000..73b6a67e5 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Temp-6.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Temp-6.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Temp-6.imageset/Temp-6.png b/ios/watch Extension/Assets.xcassets/Temp-6.imageset/Temp-6.png new file mode 100644 index 000000000..4ad05e4d6 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Temp-6.imageset/Temp-6.png differ diff --git a/ios/watch Extension/Assets.xcassets/Temp-7.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Temp-7.imageset/Contents.json new file mode 100644 index 000000000..0c1861971 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Temp-7.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Temp-7.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Temp-7.imageset/Temp-7.png b/ios/watch Extension/Assets.xcassets/Temp-7.imageset/Temp-7.png new file mode 100644 index 000000000..0e05af568 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Temp-7.imageset/Temp-7.png differ diff --git a/ios/watch Extension/Assets.xcassets/Temp-8.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Temp-8.imageset/Contents.json new file mode 100644 index 000000000..7483ddd6e --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Temp-8.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Temp-8.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Temp-8.imageset/Temp-8.png b/ios/watch Extension/Assets.xcassets/Temp-8.imageset/Temp-8.png new file mode 100644 index 000000000..ccc3e0993 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Temp-8.imageset/Temp-8.png differ diff --git a/ios/watch Extension/Assets.xcassets/Temp-9.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Temp-9.imageset/Contents.json new file mode 100644 index 000000000..f08970484 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Temp-9.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Temp-9.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Temp-9.imageset/Temp-9.png b/ios/watch Extension/Assets.xcassets/Temp-9.imageset/Temp-9.png new file mode 100644 index 000000000..af49f5a68 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Temp-9.imageset/Temp-9.png differ diff --git a/ios/watch Extension/Assets.xcassets/Ultrv.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Ultrv.imageset/Contents.json new file mode 100644 index 000000000..37612bbb6 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Ultrv.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Ultrv.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Ultrv.imageset/Ultrv.png b/ios/watch Extension/Assets.xcassets/Ultrv.imageset/Ultrv.png new file mode 100644 index 000000000..bb65bce43 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Ultrv.imageset/Ultrv.png differ diff --git a/ios/watch Extension/Assets.xcassets/Umbrella.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Umbrella.imageset/Contents.json new file mode 100644 index 000000000..a298b294e --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Umbrella.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Umbrella.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Umbrella.imageset/Umbrella.png b/ios/watch Extension/Assets.xcassets/Umbrella.imageset/Umbrella.png new file mode 100644 index 000000000..9da8e66b7 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Umbrella.imageset/Umbrella.png differ diff --git a/ios/watch Extension/Assets.xcassets/WestWind.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/WestWind.imageset/Contents.json new file mode 100644 index 000000000..5b5237f0d --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/WestWind.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "WestWind.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/WestWind.imageset/WestWind.png b/ios/watch Extension/Assets.xcassets/WestWind.imageset/WestWind.png new file mode 100644 index 000000000..532538124 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/WestWind.imageset/WestWind.png differ diff --git a/ios/watch Extension/Assets.xcassets/Wind.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/Wind.imageset/Contents.json new file mode 100644 index 000000000..85fdb3ee7 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/Wind.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Wind.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/Wind.imageset/Wind.png b/ios/watch Extension/Assets.xcassets/Wind.imageset/Wind.png new file mode 100644 index 000000000..f90c7b4ac Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/Wind.imageset/Wind.png differ diff --git a/ios/watch Extension/Assets.xcassets/angry.dataset/Contents.json b/ios/watch Extension/Assets.xcassets/angry.dataset/Contents.json new file mode 100644 index 000000000..816baaff5 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/angry.dataset/Contents.json @@ -0,0 +1,12 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "data" : [ + { + "idiom" : "universal", + "filename" : "angry.svg" + } + ] +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/angry.dataset/angry.svg b/ios/watch Extension/Assets.xcassets/angry.dataset/angry.svg new file mode 100644 index 000000000..4c54dc766 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/angry.dataset/angry.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ios/watch Extension/Assets.xcassets/app-icon.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/app-icon.imageset/Contents.json new file mode 100644 index 000000000..df597e01b --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/app-icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "app-icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon-192@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon-192@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/app-icon.imageset/app-icon.png b/ios/watch Extension/Assets.xcassets/app-icon.imageset/app-icon.png new file mode 100644 index 000000000..c132c53ac Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/app-icon.imageset/app-icon.png differ diff --git a/ios/watch Extension/Assets.xcassets/app-icon.imageset/icon-192@2x.png b/ios/watch Extension/Assets.xcassets/app-icon.imageset/icon-192@2x.png new file mode 100644 index 000000000..1e1e8ea17 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/app-icon.imageset/icon-192@2x.png differ diff --git a/ios/watch Extension/Assets.xcassets/app-icon.imageset/icon-192@3x.png b/ios/watch Extension/Assets.xcassets/app-icon.imageset/icon-192@3x.png new file mode 100644 index 000000000..4e0630cab Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/app-icon.imageset/icon-192@3x.png differ diff --git a/ios/watch Extension/Assets.xcassets/fish.dataset/Contents.json b/ios/watch Extension/Assets.xcassets/fish.dataset/Contents.json new file mode 100644 index 000000000..88623386d --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/fish.dataset/Contents.json @@ -0,0 +1,12 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "data" : [ + { + "idiom" : "universal", + "filename" : "fish.svg" + } + ] +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/fish.dataset/fish.svg b/ios/watch Extension/Assets.xcassets/fish.dataset/fish.svg new file mode 100644 index 000000000..fb1806b8f --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/fish.dataset/fish.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/watch Extension/Assets.xcassets/glass-with-water.dataset/Contents.json b/ios/watch Extension/Assets.xcassets/glass-with-water.dataset/Contents.json new file mode 100644 index 000000000..ae4e81472 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/glass-with-water.dataset/Contents.json @@ -0,0 +1,12 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "data" : [ + { + "idiom" : "universal", + "filename" : "glass-with-water.svg" + } + ] +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/glass-with-water.dataset/glass-with-water.svg b/ios/watch Extension/Assets.xcassets/glass-with-water.dataset/glass-with-water.svg new file mode 100644 index 000000000..7ae8ede2c --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/glass-with-water.dataset/glass-with-water.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/watch Extension/Assets.xcassets/guide-1.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/guide-1.imageset/Contents.json new file mode 100644 index 000000000..a849a39e7 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/guide-1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "guide-1.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/guide-1.imageset/guide-1.png b/ios/watch Extension/Assets.xcassets/guide-1.imageset/guide-1.png new file mode 100644 index 000000000..8ffe1c3b9 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/guide-1.imageset/guide-1.png differ diff --git a/ios/watch Extension/Assets.xcassets/guide-2.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/guide-2.imageset/Contents.json new file mode 100644 index 000000000..05db3270e --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/guide-2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "guide-2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/guide-2.imageset/guide-2.png b/ios/watch Extension/Assets.xcassets/guide-2.imageset/guide-2.png new file mode 100644 index 000000000..ca3cbba6a Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/guide-2.imageset/guide-2.png differ diff --git a/ios/watch Extension/Assets.xcassets/guide-4.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/guide-4.imageset/Contents.json new file mode 100644 index 000000000..6d1c2c62b --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/guide-4.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "guide-4.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/guide-4.imageset/guide-4.png b/ios/watch Extension/Assets.xcassets/guide-4.imageset/guide-4.png new file mode 100644 index 000000000..7a84310c8 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/guide-4.imageset/guide-4.png differ diff --git a/ios/watch Extension/Assets.xcassets/guide_android_01.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/guide_android_01.imageset/Contents.json new file mode 100644 index 000000000..7dca704a5 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/guide_android_01.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "guide_android_01.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/guide_android_01.imageset/guide_android_01.png b/ios/watch Extension/Assets.xcassets/guide_android_01.imageset/guide_android_01.png new file mode 100644 index 000000000..51e6dbee6 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/guide_android_01.imageset/guide_android_01.png differ diff --git a/ios/watch Extension/Assets.xcassets/guide_android_02.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/guide_android_02.imageset/Contents.json new file mode 100644 index 000000000..904597ca7 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/guide_android_02.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "guide_android_02.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/guide_android_02.imageset/guide_android_02.png b/ios/watch Extension/Assets.xcassets/guide_android_02.imageset/guide_android_02.png new file mode 100644 index 000000000..a66df20d2 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/guide_android_02.imageset/guide_android_02.png differ diff --git a/ios/watch Extension/Assets.xcassets/guide_android_04.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/guide_android_04.imageset/Contents.json new file mode 100644 index 000000000..297a78379 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/guide_android_04.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "guide_android_04.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/guide_android_04.imageset/guide_android_04.png b/ios/watch Extension/Assets.xcassets/guide_android_04.imageset/guide_android_04.png new file mode 100644 index 000000000..61b519813 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/guide_android_04.imageset/guide_android_04.png differ diff --git a/ios/watch Extension/Assets.xcassets/powered_by_google_on_non_white.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/powered_by_google_on_non_white.imageset/Contents.json new file mode 100644 index 000000000..683592094 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/powered_by_google_on_non_white.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "powered_by_google_on_non_white.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/powered_by_google_on_non_white.imageset/powered_by_google_on_non_white.png b/ios/watch Extension/Assets.xcassets/powered_by_google_on_non_white.imageset/powered_by_google_on_non_white.png new file mode 100644 index 000000000..0245b1f25 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/powered_by_google_on_non_white.imageset/powered_by_google_on_non_white.png differ diff --git a/ios/watch Extension/Assets.xcassets/powered_by_google_on_white.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/powered_by_google_on_white.imageset/Contents.json new file mode 100644 index 000000000..22730f47e --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/powered_by_google_on_white.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "powered_by_google_on_white.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/powered_by_google_on_white.imageset/powered_by_google_on_white.png b/ios/watch Extension/Assets.xcassets/powered_by_google_on_white.imageset/powered_by_google_on_white.png new file mode 100644 index 000000000..4676cb59b Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/powered_by_google_on_white.imageset/powered_by_google_on_white.png differ diff --git a/ios/watch Extension/Assets.xcassets/poweredby_darksky.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/poweredby_darksky.imageset/Contents.json new file mode 100644 index 000000000..6242e571b --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/poweredby_darksky.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "poweredby_darksky.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/poweredby_darksky.imageset/poweredby_darksky.png b/ios/watch Extension/Assets.xcassets/poweredby_darksky.imageset/poweredby_darksky.png new file mode 100644 index 000000000..d308bc108 Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/poweredby_darksky.imageset/poweredby_darksky.png differ diff --git a/ios/watch Extension/Assets.xcassets/poweredby_darksky_darkbackground.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/poweredby_darksky_darkbackground.imageset/Contents.json new file mode 100644 index 000000000..f35fd4d01 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/poweredby_darksky_darkbackground.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "poweredby_darksky_darkbackground.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/poweredby_darksky_darkbackground.imageset/poweredby_darksky_darkbackground.png b/ios/watch Extension/Assets.xcassets/poweredby_darksky_darkbackground.imageset/poweredby_darksky_darkbackground.png new file mode 100644 index 000000000..7bc8524cc Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/poweredby_darksky_darkbackground.imageset/poweredby_darksky_darkbackground.png differ diff --git a/ios/watch Extension/Assets.xcassets/reddot.imageset/Contents.json b/ios/watch Extension/Assets.xcassets/reddot.imageset/Contents.json new file mode 100644 index 000000000..6cc692dc1 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/reddot.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "reddot.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/reddot.imageset/reddot.png b/ios/watch Extension/Assets.xcassets/reddot.imageset/reddot.png new file mode 100644 index 000000000..3ef05b64b Binary files /dev/null and b/ios/watch Extension/Assets.xcassets/reddot.imageset/reddot.png differ diff --git a/ios/watch Extension/Assets.xcassets/sunrise.dataset/Contents.json b/ios/watch Extension/Assets.xcassets/sunrise.dataset/Contents.json new file mode 100644 index 000000000..d033d38d3 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/sunrise.dataset/Contents.json @@ -0,0 +1,12 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "data" : [ + { + "idiom" : "universal", + "filename" : "sunrise.svg" + } + ] +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/sunrise.dataset/sunrise.svg b/ios/watch Extension/Assets.xcassets/sunrise.dataset/sunrise.svg new file mode 100644 index 000000000..cb28fda29 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/sunrise.dataset/sunrise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/sunset.dataset/Contents.json b/ios/watch Extension/Assets.xcassets/sunset.dataset/Contents.json new file mode 100644 index 000000000..54b491174 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/sunset.dataset/Contents.json @@ -0,0 +1,12 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "data" : [ + { + "idiom" : "universal", + "filename" : "sunset.svg" + } + ] +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/sunset.dataset/sunset.svg b/ios/watch Extension/Assets.xcassets/sunset.dataset/sunset.svg new file mode 100644 index 000000000..d3de9cd72 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/sunset.dataset/sunset.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/wind-and-cloud.dataset/Contents.json b/ios/watch Extension/Assets.xcassets/wind-and-cloud.dataset/Contents.json new file mode 100644 index 000000000..995b0286d --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/wind-and-cloud.dataset/Contents.json @@ -0,0 +1,12 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "data" : [ + { + "idiom" : "universal", + "filename" : "wind-and-cloud.svg" + } + ] +} \ No newline at end of file diff --git a/ios/watch Extension/Assets.xcassets/wind-and-cloud.dataset/wind-and-cloud.svg b/ios/watch Extension/Assets.xcassets/wind-and-cloud.dataset/wind-and-cloud.svg new file mode 100644 index 000000000..5815d3f10 --- /dev/null +++ b/ios/watch Extension/Assets.xcassets/wind-and-cloud.dataset/wind-and-cloud.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/watch Extension/Base.lproj/Localizable.strings b/ios/watch Extension/Base.lproj/Localizable.strings new file mode 100644 index 000000000..e447966d5 --- /dev/null +++ b/ios/watch Extension/Base.lproj/Localizable.strings @@ -0,0 +1,30 @@ +/* + Localizable.strings + TodayWeather + + Created by KwangHo Kim on 2017. 9. 24.. + + */ +// English + +// "Key" = "Value" + +// Watch +"LOC_UPDATE" = "Update"; + +"LOC_AQI" = "AQI"; +"LOC_PM10" = "PM10"; +"LOC_PM25" = "PM2.5"; + +"LOC_TODAYWEATHER" = "TodayWeather"; + +"LOC_HUMIDITY" = "Humidity"; + +// AQI +"LOC_GOOD" = "Good"; +"LOC_MODERATE" = "Moderate"; +"LOC_UNHEALTHY_FOR_SENSITIVE_GROUPS"= "Unhealthy for sensitive groups"; +"LOC_UNHEALTHY" = "Unhealthy"; +"LOC_VERY_UNHEALTHY" = "Very unhealthy"; +"LOC_HAZARDOUS" = "Hazardous"; + diff --git a/ios/watch Extension/CityInfo.swift b/ios/watch Extension/CityInfo.swift new file mode 100644 index 000000000..5e9ee2577 --- /dev/null +++ b/ios/watch Extension/CityInfo.swift @@ -0,0 +1,104 @@ +// +// CityInfo.swift +// watch Extension +// +// Created by KwangHo Kim on 2017. 11. 26.. +// + +import Foundation + +class CityInfo: NSObject , NSCoding +{ + //var identifier : String = ""; + var strAddress : String? = ""; + var currentPosition : Bool? = true; + var index : Int? = 0; + var weatherData : Dictionary? = [:]; + var name : String? = ""; + var country : String? = "KR"; + var dictLocation : Dictionary? = [:]; + + override init(){ + super.init(); + } + + func encode(with aCoder: NSCoder) { + print("encode"); + //aCoder.encode(self.identifier, forKey: "id"); + aCoder.encode(self.strAddress, forKey: "address"); + aCoder.encode(self.currentPosition, forKey: "current_position"); + aCoder.encode(self.index, forKey: "index"); + aCoder.encode(self.weatherData, forKey: "weather_data"); + aCoder.encode(self.name, forKey: "name"); + aCoder.encode(self.country, forKey: "country"); + aCoder.encode(self.dictLocation, forKey: "location"); + } + + required init?(coder aDecoder: NSCoder) { + super.init() + //self.identifier = aDecoder.decodeObject(forKey: "id") as! String; + self.strAddress = aDecoder.decodeObject(forKey: "address") as? String; + self.currentPosition = aDecoder.decodeObject(forKey: "current_position") as? Bool; + self.index = aDecoder.decodeObject(forKey: "index") as? Int; + self.weatherData = aDecoder.decodeObject(forKey: "weather_data") as? Dictionary; + self.name = aDecoder.decodeObject(forKey: "name") as? String + self.country = aDecoder.decodeObject(forKey: "country") as? String + self.dictLocation = aDecoder.decodeObject(forKey: "location") as? Dictionary; + + } + + init(data : [String: AnyObject]) { + print("222init(data :"); + super.init() + print("init(data : [String: AnyObject])"); + //self.identifier = String.numberValue(data["user_id"]).intValue; + self.strAddress = String(format:"%s", (data["address"] as? CVarArg)!); + self.currentPosition = Bool((data["current_position"] as? String)!)!; + self.index = Int((data["address"] as? String)!)!; + self.weatherData = data["address"] as? Dictionary; + self.name = data["name"] as? String; + self.country = data["country"] as? String; + self.dictLocation = data["location"] as? Dictionary; + } + + class func loadCurrentCity() -> CityInfo { + let defaults = UserDefaults(suiteName: "group.net.wizardfactory.todayweather") + //if let archivedObject : NSData? = defaults?.object(forKey:"currentCity") as? NSData{ + var archivedObject : NSData? = nil; + archivedObject = defaults?.object(forKey:"currentCity") as? NSData + + if(archivedObject == nil) + { + print("archivedObject is nil!!!"); + } + else { + //if let cityInfo = NSKeyedUnarchiver.unarchiveObject(with: archivedObject! as Data) as? CityInfo { + var cityInfo : CityInfo? = nil; + cityInfo = NSKeyedUnarchiver.unarchiveObject(with: archivedObject! as Data) as? CityInfo + + if(cityInfo != nil) { + return cityInfo!; + } else { + print("cityInfo is nil"); + } + } + //} + + return CityInfo() + } + + func saveCityInfo(){ + let defaults = UserDefaults(suiteName: "group.net.wizardfactory.todayweather") + let archivedObject : NSData = NSKeyedArchiver.archivedData(withRootObject: self) as NSData + + defaults?.set(archivedObject, forKey: "currentCity"); + defaults?.synchronize(); + } + + func deleteUser(){ + UserDefaults.standard.set(nil, forKey: "currentCity") + UserDefaults.standard.synchronize(); + } +} + + diff --git a/ios/watch Extension/ExtensionDelegate.swift b/ios/watch Extension/ExtensionDelegate.swift new file mode 100644 index 000000000..5b23c5c22 --- /dev/null +++ b/ios/watch Extension/ExtensionDelegate.swift @@ -0,0 +1,67 @@ +// +// ExtensionDelegate.swift +// watch Extension +// +// Created by KwangHo Kim on 2017. 4. 13.. +// +// + +import WatchKit +import WatchConnectivity + +class ExtensionDelegate: NSObject, WKExtensionDelegate { + + func applicationDidFinishLaunching() { + // Perform any final initialization of your application. + + + } + + func applicationDidBecomeActive() { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillResignActive() { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, etc. + } + + func handle(_ backgroundTasks: Set) { + // Sent when the system needs to launch the application in the background to process tasks. Tasks arrive in a set, so loop through and process each one. + for task in backgroundTasks { + // Use a switch statement to check the task type + switch task { + case let backgroundTask as WKApplicationRefreshBackgroundTask: + // Be sure to complete the background task once you’re done. + //backgroundTask.setTaskCompleted() + backgroundTask.setTaskCompletedWithSnapshot(false) + case let snapshotTask as WKSnapshotRefreshBackgroundTask: + // Snapshot tasks have a unique completion call, make sure to set your expiration date + snapshotTask.setTaskCompleted(restoredDefaultState: true, estimatedSnapshotExpiration: Date.distantFuture, userInfo: nil) + case let connectivityTask as WKWatchConnectivityRefreshBackgroundTask: + // Be sure to complete the connectivity task once you’re done. + //connectivityTask.setTaskCompleted() + connectivityTask.setTaskCompletedWithSnapshot(false) + case let urlSessionTask as WKURLSessionRefreshBackgroundTask: + // Be sure to complete the URL session task once you’re done. + //urlSessionTask.setTaskCompleted() + urlSessionTask.setTaskCompletedWithSnapshot(false) + default: + // make sure to complete unhandled task types + //task.setTaskCompleted() + task.setTaskCompletedWithSnapshot(false) + } + } + } + + func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) { + print("session!") + print("\(applicationContext)") + DispatchQueue.main.async(execute: { + //update UI here + }) + } + + +} + diff --git a/ios/watch Extension/Info.plist b/ios/watch Extension/Info.plist new file mode 100644 index 000000000..784a0fa93 --- /dev/null +++ b/ios/watch Extension/Info.plist @@ -0,0 +1,51 @@ + + + + + CFBundleDevelopmentRegion + kr + CFBundleDisplayName + watch Extension + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + 0.9.62 + CFBundleVersion + 0.9.62 + CLKComplicationPrincipalClass + $(PRODUCT_MODULE_NAME).WatchTWeatherComplication + CLKComplicationSupportedFamilies + + CLKComplicationFamilyModularSmall + CLKComplicationFamilyUtilitarianSmall + + NSExtension + + NSExtensionAttributes + + WKAppBundleIdentifier + net.wizardfactory.todayweather.watchkitapp + + NSExtensionPointIdentifier + com.apple.watchkit + + NSLocationAlwaysAndWhenInUseUsageDescription + Location Always and When In Use Usage Description + NSLocationAlwaysUsageDescription + Location Always Usage Description + NSLocationUsageDescription + Location Usage Description + NSLocationWhenInUseUsageDescription + Location When In Use Usage Description + WKExtensionDelegateClassName + $(PRODUCT_MODULE_NAME).ExtensionDelegate + + diff --git a/ios/watch Extension/InterfaceController.swift b/ios/watch Extension/InterfaceController.swift new file mode 100644 index 000000000..fff6861f9 --- /dev/null +++ b/ios/watch Extension/InterfaceController.swift @@ -0,0 +1,1325 @@ +// +// InterfaceController.swift +// watch Extension +// +// Created by KwangHo Kim on 2017. 4. 13.. +// +// + +import WatchKit +import WatchConnectivity +import Foundation + +let sharedInterCont = InterfaceController.sharedInstance + +let watchTWUtil = WatchTWeatherUtil.sharedInstance(); +let watchTWReq = WatchTWeatherRequest.sharedInstance(); +let watchTWSM = WatchTWeatherShowMore.sharedInstance(); +//let watchTWDraw = WatchTWeatherDraw.sharedInstance; + +class InterfaceController: WKInterfaceController, WCSessionDelegate, CLLocationManagerDelegate { + + @IBOutlet var updateDateLabel : WKInterfaceLabel! + @IBOutlet var currentPosImage: WKInterfaceImage! + @IBOutlet var addressLabel: WKInterfaceLabel! + @IBOutlet var curWeatherImage: WKInterfaceImage! + + @IBOutlet var curTempLabel: WKInterfaceLabel! + @IBOutlet var minMaxLabel: WKInterfaceLabel! + + @IBOutlet var precLabel: WKInterfaceLabel! + @IBOutlet var airAQILabel: WKInterfaceLabel! + + var curJsonDict : Dictionary? = nil; + + enum TYPE_REQUEST { + case NONE + case ADDR_DAUM + case ADDR_GOOGLE + case GEO_GOOGLE + case WEATHER_KR + case WEATHER_GLOBAL + // case WATCH_COMPLICATION_KR + // case WATCH_COMPLICATION_GLOBAL + case MAX + } + + var manager: CLLocationManager = CLLocationManager() + var curLatitude : Double = 0; + var curLongitude : Double = 0; + + var currentCity = CityInfo(); + + static let sharedInstance : InterfaceController = { + let instance = InterfaceController() + //setup code + return instance + }() + + // let watchTWUtil = WatchTWeatherUtil.sharedInstance(); + // let watchTWReq = WatchTWeatherRequest.sharedInstance(); + // let watchTWSM = WatchTWeatherShowMore.sharedInstance(); + // let watchTWDraw = WatchTWeatherDraw.sharedInstance(); + + override func awake(withContext context: Any?) { + super.awake(withContext: context) + + // Configure interface objects here. + let watchSession = WCSession.default + watchSession.delegate = self + watchSession.activate() + + //shared = InterfaceController(); + //initWidgetDatas() + + // watchTWUtil = WatchTWeatherUtil.sharedInstance(); + // watchTWReq = WatchTWeatherRequest.sharedInstance(); + // watchTWSM = WatchTWeatherShowMore.sharedInstance(); + // watchTWDraw = WatchTWeatherDraw.sharedInstance(); + } + + override func willActivate() { + // This method is called when watch view controller is about to be visible to user + super.willActivate() + + // 1. 이전 데이터 저장 + //[self processPrevData:nextCity.index]; + + // 2. 현재위치와 저장된 지역으로 분기 + let defaults = UserDefaults(suiteName: "group.net.wizardfactory.todayweather") + print("defaults : \(String(describing: defaults))") + + defaults?.synchronize() + + if defaults == nil { + print("defaults is nuil!") + } else { + print(defaults!) + } + + if let units = defaults?.string(forKey: "units") { + print("units : \(units)") + watchTWUtil.setTemperatureUnit(strUnits: units); + } + + if let daumKeys = defaults?.string(forKey: "daumServiceKeys") { + print("daumKeys : \(daumKeys)") + watchTWUtil.setDaumServiceKeys(strDaumKeys: daumKeys); + } + + // test - FIXME + var nextCity : CityInfo? = CityInfo(); + print("nextCity : \(String(describing: nextCity))"); + + currentCity = CityInfo.loadCurrentCity(); + #if false + nextCity?.currentPosition = true; + nextCity?.country = "KR"; + print("nextCity : \(String(describing: nextCity))"); + let archivedObject : NSData = NSKeyedArchiver.archivedData(withRootObject: nextCity!) as NSData; + print("archivedObject : \(String(describing: archivedObject))"); + defaults?.set(archivedObject, forKey: "currentCity") + defaults?.synchronize(); + + + if let archivedObject = defaults?.object(forKey: "currentCity") { + print("archivedObject : \(archivedObject)"); + //currentCity = (CityInfo *)[NSKeyedUnarchiver unarchiveObjectWithData:archivedObject]; + //currentCity = (NSKeyedUnarchiver.unarchiveObject(with: archivedObject as! Data) as? CityInfo)!; + currentCity = NSKeyedUnarchiver.unarchiveObject(with: (archivedObject as! Data)) as! WatchTWeatherComplication.CityInfo ; + if (currentCity == nil) { + print("UnarchiveObjectWithData is failed!!!") + } + else { + print("Current City : \(String(describing: currentCity))"); + } + + } else { + print("Current City is not existed!!!") + } + #endif + + + print("currentPosition : \(String(describing: currentCity.currentPosition))") + print("country : \(String(describing: currentCity.country))") + + if(currentCity.currentPosition == nil) { + print("currentPosition is nil, user didn't set favorite!!!"); + return + } + + #if true + if (currentCity.currentPosition == true){ + manager.delegate = self + manager.requestLocation() + } + else + { + if( (currentCity.country == "KR" ) || + (currentCity.country == "(null)" ) + // (currentCity.country == nil) + ) + { + print("strAddress : \(String(describing: currentCity.strAddress))") + if(currentCity.strAddress != nil) { + processKRAddress((currentCity.strAddress)!); + } + } + else + { + //let keys = ["lat", "lng"]; + //let values = [40.71, -74.00]; + //let dict = NSDictionary.init(objects: values, forKeys: keys as [NSCopying]) + processGlobalAddress(location: currentCity.dictLocation as NSDictionary?); + } + } + #endif + + let archivedObject : NSData = NSKeyedArchiver.archivedData(withRootObject: currentCity) as NSData; + print("archivedObject : \(String(describing: archivedObject))"); + defaults?.set(archivedObject, forKey: "currentCity") + defaults?.synchronize(); + + print("defaults : \(String(describing: defaults))") + } + + override func didDeactivate() { + // This method is called when watch view controller is no longer visible + super.didDeactivate() + } + + func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { + print("error:: \(error.localizedDescription)") + } + + func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + if status == .authorizedWhenInUse { + manager.requestLocation() + } + } + + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + print("location:: \(locations)") + if locations.first != nil { + print("location:: \(locations)") + + //if(fabs(howRecent) < 5.0) + //{ + //[locationManager stopUpdatingLocation]; + + curLatitude = (locations.last?.coordinate.latitude)!; + curLongitude = (locations.last?.coordinate.longitude)!; + + print("[locationManager] latitude : \(curLatitude), longitude : \(curLongitude)") + + getAddressFromGoogle(latitude: curLatitude, longitude: curLongitude); + } + } + + func getAddressFromGoogle(latitude:Double, longitude: Double) + { + //40.7127837, -74.0059413 <- New York + + #if false //GLOBAL_TEST + // FIXME - for emulator - delete me + let lat : Double = 40.7127837; + let longi : Double = -74.0059413; + + // 오사카 + //float lat = 34.678395; + //float longi = 135.4601303; + + // + //let lat : Double = 37.5665350; + //let longi : Double = 126.9779690; + + curLatitude = lat; + curLongitude = longi; + + //https://maps.googleapis.com/maps/api/geocode/json?latlng=40.7127837,-74.0059413 + + //let strURL : String = String(format:"%s%f,%f", watchTWReq.STR_GOOGLE_COORD2ADDR_URL, lat, longi); + let strURL : String = watchTWReq.STR_GOOGLE_COORD2ADDR_URL + String(format:"%f", lat) + "," + String(format:"%f", longi); + #else + let strURL : String = watchTWReq.STR_GOOGLE_COORD2ADDR_URL + String(format:"%f", latitude) + "," + String(format:"%f", longitude); + #endif + + print("[getAddressFromGoogle] url : \(strURL)"); + + requestAsyncByURLSession(url:strURL, reqType:InterfaceController.TYPE_REQUEST.ADDR_GOOGLE); + } + + + func processKRAddress( _ address : String) { + let array = address.characters.split(separator: " ").map(String.init) + var addr1 : String? = nil; + var addr2 : String? = nil; + var addr3 : String? = nil; + var lastChar : String? = nil; + + print("array.count => \(array.count)"); + + if(array.count == 0) { + print("address is empty!!!"); + return + } + + if (array.count == 2) { + addr1 = array[1] + } + else if (array.count == 5) { + addr1 = array[1]; + addr2 = array[2] + array[3]; + addr3 = array[4]; + } + else if (array.count == 4) { + let index : Int = array[3].characters.count - 1; + addr1 = array[1]; + lastChar = (array[3] as NSString).substring(from:index); + if ( lastChar == "구" ) { + addr2 = array[2] + array[3]; + } + else { + addr2 = array[2]; + addr3 = array[3]; + } + } + else if ( array.count == 3) { + let index : Int = array[2].characters.count - 1; + addr1 = array[1]; + lastChar = (array[2] as NSString).substring(from:index); + if ( lastChar == "읍" ) || ( lastChar == "면" ) || ( lastChar == "동" ) { + addr2 = array[1]; + addr3 = array[2]; + } + else { + addr2 = array[2]; + } + } + + dump(array); + print("[processKRAddress] => addr1:\(String(describing: addr1)), addr2:\(String(describing: addr2)), addr3:\(String(describing: addr3))"); + let URL = watchTWReq.makeRequestURL(addr1:addr1!, addr2:addr2!, addr3:addr3!, country:"KR"); + requestAsyncByURLSession(url:URL, reqType:TYPE_REQUEST.WEATHER_KR); + //print("nssURL : %s", nssURL); + } + + func processGlobalAddress(location : NSDictionary?) { + if let strURL : String = watchTWReq.makeGlobalRequestURL(locDict : location!) { + requestAsyncByURLSession(url:strURL, reqType:TYPE_REQUEST.WEATHER_GLOBAL); + + print("[processGlobalAddress] strURL : \(strURL)"); + } + } + + func initWidgetDatas() { + let defaults = UserDefaults(suiteName: "group.net.wizardfactory.todayweather") + if defaults == nil { + print("defaults is nuil!") + } else { + print(defaults!) + } + + if let cityList = defaults?.string(forKey: "cityList") { + print(cityList) + } + + if let units = defaults?.string(forKey: "units") { + print(units) + watchTWUtil.setTemperatureUnit(strUnits: units); + } + } + + func processWeatherResultsWithShowMore( jsonDict : Dictionary?) { + //var currentDict : Dictionary; + //var currentArpltnDict : Dictionary; + var todayDict : Dictionary; + + // Date + var strDateTime : String!; + //var strTime : String? = nil; + + // Image + //var strCurIcon : String? = nil; + var strCurImgName : String? = nil; + + // Temperature + var currentTemp : Float = 0; + var todayMinTemp : Int = 0; + var todayMaxTemp : Int = 0; + + // Dust + var strAirState : String = ""; + var attrStrAirState : NSAttributedString = NSAttributedString(); + //NSMutableAttributedString *nsmasAirState = nil; + + // Address + var strAddress : String? = nil; + + // Pop + var numberTodPop : NSNumber; + var todayPop : Int = 0; + + // current temperature + var numberT1h : NSNumber; + var numberTaMin : NSNumber; + var numberTaMax : NSNumber; + + if(jsonDict == nil) + { + print("jsonDict is nil!!!"); + return; + } + //print("processWeatherResultsWithShowMore : \(String(describing: jsonDict))"); + + setCurJsonDict( dict : jsonDict! ) ; + + // Address + if let strRegionName : String = jsonDict?["regionName"] as? String { + print("strRegionName is \(strRegionName).") + strAddress = strRegionName; + } else { + print("That strRegionName is not in the jsonDict dictionary.") + } + + if let strCityName : String = jsonDict?["cityName"] as? String { + print("strCityName is \(strCityName).") + strAddress = strCityName; + } else { + print("That strCityName is not in the jsonDict dictionary.") + } + + if let strTownName : String = jsonDict?["townName"] as? String { + print("strTownName is \(strTownName).") + strAddress = strTownName; + } else { + print("That strTownName is not in the jsonDict dictionary.") + } + + // if address is current position... add this emoji + //목격자 + //유니코드: U+1F441 U+200D U+1F5E8, UTF-8: F0 9F 91 81 E2 80 8D F0 9F 97 A8 + + print("strAddress \(String(describing: strAddress)))") + strAddress = NSString(format: "👁‍🗨%@˚", strAddress!) as String + + let tempUnit : TEMP_UNIT? = watchTWUtil.getTemperatureUnit(); + //#if KKH + // Current + if let currentDict : Dictionary = jsonDict?["current"] as? Dictionary{ + //print("currentDict is \(currentDict).") + + if let strCurIcon : String = currentDict["skyIcon"] as? String { + //strCurImgName = "weatherIcon2-color/\(strCurIcon).png"; + strCurImgName = strCurIcon; + } else { + print("That strCurIcon is not in the jsonDict dictionary.") + } + + if let strTime : String = currentDict["time"] as? String { + let index = strTime.index(strTime.startIndex, offsetBy: 2) + //let strHour = strTime.substring(to:index); + let strHour = strTime[.. \(strTime)") + print("strHour => \(strHour)") + print("strMinute => \(strMinute)") + + } else { + print("That strTime is not in the jsonDict dictionary.") + strDateTime = ""; + } + print("strDateTime => \(strDateTime)") + + if let currentArpltnDict : Dictionary = currentDict["arpltn"] as? Dictionary { + strAirState = watchTWSM.getAirState(currentArpltnDict); + + // Test + //nssAirState = [NSString stringWithFormat:@"통합대기 78 나쁨"]; + attrStrAirState = watchTWSM.getChangedColorAirState(strAirState:strAirState); + print("[processWeatherResultsWithShowMore] attrStrAirState : \(String(describing: attrStrAirState))"); + print("[processWeatherResultsWithShowMore] strAirState : \(String(describing: strAirState))"); + } else { + print("That currentArpltnDict is not in the jsonDict dictionary.") + } + + if (currentDict["t1h"] != nil) + { + numberT1h = currentDict["t1h"] as! NSNumber; + currentTemp = Float(numberT1h.doubleValue); + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) { + currentTemp = Float(watchTWUtil.convertFromCelsToFahr(cels: currentTemp)); + } + } + + } else { + print("That currentDict is not in the jsonDict dictionary.") + } + + //currentHum = [[currentDict valueForKey:@"reh"] intValue]; + + todayDict = watchTWUtil.getTodayDictionary(jsonDict: jsonDict!); + + // Today + if (todayDict["taMin"] != nil) { + numberTaMin = todayDict["taMin"] as! NSNumber; + todayMinTemp = Int(numberTaMin.intValue); + } else { + print("That idTaMin is not in the todayDict dictionary.") + } + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) + { + todayMinTemp = Int( watchTWUtil.convertFromCelsToFahr(cels: Float(todayMinTemp) ) ); + } + + if (todayDict["taMax"] != nil) { + numberTaMax = todayDict["taMax"] as! NSNumber; + todayMaxTemp = Int(numberTaMax.intValue); + } else { + print("That numberTaMax is not in the todayDict dictionary.") + } + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) + { + todayMaxTemp = Int(watchTWUtil.convertFromCelsToFahr(cels: Float(todayMaxTemp) )) ; + } + + if (todayDict["pop"] != nil) { + numberTodPop = todayDict["pop"] as! NSNumber; + todayPop = Int(numberTodPop.intValue); + } else { + print("That pop is not in the todayDict dictionary.") + } + + print("todayMinTemp: \(todayMinTemp), todayMaxTemp:\(todayMaxTemp)"); + print("todayPop: \(todayPop)"); + + DispatchQueue.global(qos: .background).async { + // Background Thread + + DispatchQueue.main.async { + + // Run UI Updates + if(strDateTime != nil) { + self.updateDateLabel.setText("\(strDateTime!)"); + } + + print("=======> date : \(strDateTime!)"); + + if( (strAddress == nil) || ( strAddress == "(null)" )) + { + self.addressLabel.setText(""); + } + else + { + self.addressLabel.setText("\(strAddress!)"); + } + + print("=======> strCurImgName : \(strCurImgName!)"); + + if(strCurImgName != nil) { + self.curWeatherImage.setImage ( UIImage(named:strCurImgName!) ); + } + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) { + self.curTempLabel.setText( NSString(format: "%d˚", currentTemp) as String ); + } else { + self.curTempLabel.setText( NSString(format: "%.01f˚", currentTemp) as String); + } + + + print("[processWeatherResultsWithShowMore] attrStrAirState2 : \(String(describing: attrStrAirState))"); + self.airAQILabel.setAttributedText( attrStrAirState ); + + self.minMaxLabel.setText(NSString(format: "%d˚/ %d˚", todayMinTemp, todayMaxTemp) as String ); + self.precLabel.setText(NSString(format: "%d%%", todayPop) as String ); + + + + //locationView.hidden = false; + } + } + //#endif + + // Draw ShowMore + //[todayWSM processDailyData:jsonDict type:TYPE_REQUEST_WEATHER_KR]; + } + + func processWeatherResultsAboutGlobal( jsonDict : Dictionary?) { + //let watchTWSM = WatchTWeatherShowMore(); + + var currentDict : Dictionary; + //var currentArpltnDict : Dictionary; + var todayDict : Dictionary? = nil; + + // Date + var strDateTime : String!; + //var strTime : String? = nil; + + // Image + //var strCurIcon : String? = nil; + var strCurImgName : String? = nil; + + // Temperature + var tempUnit : TEMP_UNIT? = TEMP_UNIT.CELSIUS; + var currentTemp : Float = 0; + var todayMinTemp : Int = 0; + var todayMaxTemp : Int = 0; + + // Dust + var strAirState : String = ""; + var attrStrAirState : NSAttributedString = NSAttributedString(); + //NSMutableAttributedString *nsmasAirState = nil; + + // Address + var strAddress : String? = nil; + + // Pop + var numberTodPop : NSNumber; + var todayPop : Int = 0; + + // Humid + var numberTodHumid : NSNumber; + var todayHumid = 0; + + if(jsonDict == nil) + { + print("jsonDict is nil!!!"); + return; + } + //print("processWeatherResultsWithShowMore : \(String(describing: jsonDict))"); + + setCurJsonDict( dict : jsonDict! ) ; + + // Address + + //NSLog(@"mCurrentCityIdx : %d", mCurrentCityIdx); + + //NSMutableDictionary* nsdCurCity = [mCityDictList objectAtIndex:mCurrentCityIdx]; + //NSLog(@"[processWeatherResultsAboutGlobal] nsdCurCity : %@", nsdCurCity); + // Address + //nssAddress = [nsdCurCity objectForKey:@"name"]; + //nssCountry = [nsdCurCity objectForKey:@"country"]; + //if(nssCountry == nil) + //{ + // nssCountry = @"KR"; + //} + + //NSLog(@"[Global]nssAddress : %@, nssCountry : %@", nssAddress, nssCountry); + + // if address is current position... add this emoji + //목격자 + //유니코드: U+1F441 U+200D U+1F5E8, UTF-8: F0 9F 91 81 E2 80 8D F0 9F 97 A8 + + //print("strAddress \(String(describing: strAddress)))") + //strAddress = NSString(format: "👁‍🗨%@˚", strAddress!) as String + + strAddress = NSString(format: "뉴욕") as String; + + // Current + if let thisTimeArr : NSArray = jsonDict?["thisTime"] as? NSArray { + + if(thisTimeArr.count == 2) { + currentDict = thisTimeArr[1] as! Dictionary; // Use second index; That is current weahter. + } else { + currentDict = thisTimeArr[0] as! Dictionary; // process about thisTime + } + + if let strCurIcon : String = currentDict["skyIcon"] as? String { + //strCurImgName = "weatherIcon2-color/\(strCurIcon).png"; + strCurImgName = strCurIcon; + } else { + print("That strCurIcon is not in the jsonDict dictionary.") + } + + tempUnit = watchTWUtil.getTemperatureUnit(); + + if let strTime : String = currentDict["date"] as? String { + let index = strTime.index(strTime.startIndex, offsetBy: 11) + let strHourMin = strTime[index...]; + strDateTime = NSLocalizedString("LOC_UPDATE", comment:"업데이트") + " " + strHourMin; + print("strTime => \(strHourMin)") + + todayDict = watchTWUtil.getTodayDictionaryInGlobal(jsonDict: jsonDict!, strTime:strTime); + if(todayDict != nil) { + if(tempUnit == TEMP_UNIT.FAHRENHEIT) + { + let idTaMin = todayDict!["tempMin_f"] as! NSNumber; + todayMinTemp = Int(truncating: idTaMin); + + let idTaMax = todayDict!["tempMax_f"] as! NSNumber; + todayMaxTemp = Int(truncating: idTaMax); + } + else + { + let idTaMin = todayDict!["tempMin_c"] as! NSNumber; + todayMinTemp = Int(truncating: idTaMin); + + let idTaMax = todayDict!["tempMax_c"] as! NSNumber; + todayMaxTemp = Int(truncating: idTaMax); + } + + // PROBABILITY_OF_PRECIPITATION + if (todayDict!["precProb"] != nil) { + numberTodPop = todayDict!["precProb"] as! NSNumber; + todayPop = Int(numberTodPop.intValue); + } else { + print("That precProb is not in the todayDict dictionary.") + } + + // HUMID + if (todayDict!["humid"] != nil) { + numberTodHumid = todayDict!["humid"] as! NSNumber; + todayHumid = Int(numberTodHumid.intValue); + } else { + print("That humid is not in the todayDict dictionary.") + } + + strAirState = NSLocalizedString("LOC_HUMIDITY", comment:"습도") + " \(todayHumid)% "; + } + } else { + print("That strTime is not in the jsonDict dictionary.") + let strHourMin = ""; + strDateTime = NSLocalizedString("LOC_UPDATE", comment:"업데이트") + " " + strHourMin; + } + print("strDateTime => \(strDateTime)") + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) + { + let idT1h = currentDict["temp_f"] as! NSNumber; + currentTemp = Float(Int(truncating: idT1h)); + } + else + { + let idT1h = currentDict["temp_c"] as! NSNumber; + currentTemp = Float(truncating: idT1h); + } + } + + print("todayMinTemp: \(todayMinTemp), todayMaxTemp:\(todayMaxTemp)"); + print("todayPop: \(todayPop)"); + + #if KKH + if let currentDict : Dictionary = jsonDict?["current"] as? Dictionary{ + //print("currentDict is \(currentDict).") + + if let currentArpltnDict : Dictionary = currentDict["arpltn"] as? Dictionary { + strAirState = watchTWSM.getAirState(currentArpltnDict); + + // Test + //nssAirState = [NSString stringWithFormat:@"통합대기 78 나쁨"]; + attrStrAirState = watchTWSM.getChangedColorAirState(strAirState:strAirState); + print("[processWeatherResultsWithShowMore] attrStrAirState : \(String(describing: attrStrAirState))"); + print("[processWeatherResultsWithShowMore] strAirState : \(String(describing: strAirState))"); + } else { + print("That currentArpltnDict is not in the jsonDict dictionary.") + } + } else { + print("That currentDict is not in the jsonDict dictionary.") + } + #endif + + DispatchQueue.global(qos: .background).async { + // Background Thread + + DispatchQueue.main.async { + + // Run UI Updates + if(strDateTime != nil) { + self.updateDateLabel.setText("\(strDateTime!)"); + } + + print("=======> date : \(strDateTime!)"); + + if( (strAddress == nil) || ( strAddress == "(null)" )) + { + self.addressLabel.setText(""); + } + else + { + self.addressLabel.setText("\(strAddress!)"); + } + + print("=======> strCurImgName : \(strCurImgName!)"); + strCurImgName = "MoonBigCloudRainLightning"; + if(strCurImgName != nil) { + self.curWeatherImage.setImage ( UIImage(named:"Moon"/*strCurImgName!*/) ); + print("111=======> strCurImgName : \(strCurImgName!)"); + } + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) { + self.curTempLabel.setText( NSString(format: "%d˚", currentTemp) as String ); + } else { + self.curTempLabel.setText( NSString(format: "%.01f˚", currentTemp) as String); + } + + + #if KKH + print("[processWeatherResultsWithShowMore] attrStrAirState2 : \(String(describing: attrStrAirState))"); + self.airAQILabel.setAttributedText( attrStrAirState ); + #endif + + self.minMaxLabel.setText(NSString(format: "%d˚/ %d˚", todayMinTemp, todayMaxTemp) as String ); + self.precLabel.setText(NSString(format: "%d%%", todayPop) as String ); + self.airAQILabel.setText(strAirState); + + //locationView.hidden = false; + } + } + //#endif + + // Draw ShowMore + //[todayWSM processDailyData:jsonDict type:TYPE_REQUEST_WEATHER_KR]; + } + + /******************************************************************** + * + * Name : setCurJsonDict + * Description : set current JSON dictionary + * Returns : void + * Side effects : + * Date : 2017. 07. 15 + * Author : SeanKim + * History : 20170715 SeanKim Create function + * + ********************************************************************/ + func setCurJsonDict( dict : Dictionary ) { + if(curJsonDict == nil) { + curJsonDict = [String : String] () + } else { + curJsonDict = dict; + } + } + + func requestAsyncByURLSession( url : String, reqType : TYPE_REQUEST) { + print("[requestAsyncByURLSession] url : \(url)"); + let strURL : URL! = URL(string: url); + + print("[requestAsyncByURLSession] url : \(strURL), request type : \(reqType)"); + + var request = URLRequest.init(url: strURL); + + if( reqType == TYPE_REQUEST.WEATHER_KR) { + request.setValue("ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3", forHTTPHeaderField: "Accept-Language"); + } + + let task = URLSession.shared.dataTask(with: request, completionHandler: {(data, response, error) -> Void in + if let data = data { + // Do stuff with the data + //print("data : \(data)"); + self.makeJSON( with : data, type : reqType); + } else { + print("Failed to fetch \(strURL) : \(String(describing: error))"); + } + }) + + task.resume(); + } + + func makeJSON( with jsonData : Data, type reqType : TYPE_REQUEST) { + do { + guard let parsedResult = try JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) as? NSDictionary else { + return + } + //print("Parsed Result: \(parsedResult)") + + if(reqType == InterfaceController.TYPE_REQUEST.ADDR_DAUM) { + parseKRAddress(jsonDict: (parsedResult as NSDictionary)); + } + else if(reqType == InterfaceController.TYPE_REQUEST.ADDR_GOOGLE) { + parseGoogleAddress(jsonDict: (parsedResult as? Dictionary)!); + } + else if(reqType == InterfaceController.TYPE_REQUEST.GEO_GOOGLE) { + parseGlobalGeocode(jsonDict: (parsedResult as NSDictionary)); + } + else if(reqType == TYPE_REQUEST.WEATHER_KR) + { + //watchTWDraw = WatchTWeatherDraw.sharedInstance(); + print("reqType == TYPE_REQUEST.WEATHER_KR"); + //[self saveWeatherInfo:jsonDict]; + //sharedInterCont.processWeatherResultsWithShowMore(jsonDict: parsedResult as? Dictionary) + //let interCont = InterfaceController(); + processWeatherResultsWithShowMore(jsonDict: parsedResult as? Dictionary) + //[self processRequestIndicator:TRUE]; + } + else if(reqType == TYPE_REQUEST.WEATHER_GLOBAL) + { + //watchTWDraw = WatchTWeatherDraw.sharedInstance(); + print("reqType == WEATHER_GLOBAL"); + //[self saveWeatherInfo:jsonDict]; + + processWeatherResultsAboutGlobal(jsonDict: parsedResult as? Dictionary) + //[self processRequestIndicator:TRUE]; + } + } catch { + print("Error: \(error.localizedDescription)") + } + } + + func parseGoogleAddress(jsonDict : Dictionary) + { + //print("\(jsonDict)"); + let strStatus : String = jsonDict["status"] as! String; + if(strStatus != "OK") { + print("strStatus[\(strStatus)] is not OK"); + return; + } + + let arrResults : NSArray = jsonDict["results"] as! NSArray; + + //print("\(arrResults)"); + + var arrSubLevel2Types : Array = ["political", "sublocality", "sublocality_level_2"]; + var arrSubLevel1Types : Array = ["political", "sublocality", "sublocality_level_1"]; + var arrLocalTypes : Array = ["locality", "political"]; + let strCountryTypes : String = String(format:"country"); + + var strSubLevel2Name : String? = nil; + var strSubLevel1Name : String? = nil; + var strLocalName : String? = nil; + var strCountryName : String? = nil; + + for i in 0 ..< arrResults.count { + let dictResult : NSDictionary? = arrResults[i] as? NSDictionary; + if(dictResult == nil) { + print("nsdResult is null!!!"); + continue; + } + + //print("\(i) \(String(describing: dictResult))"); + + let arrAddressComponents : NSArray = dictResult?.object(forKey:"address_components") as! NSArray; + for j in 0 ..< arrAddressComponents.count { + var strAddrCompType0 : String? = nil; + var strAddrCompType1 : String? = nil; + var strAddrCompType2 : String? = nil; + + let dictAddressComponent : NSDictionary = arrAddressComponents[j] as! NSDictionary; + let arrAddrCompTypes : NSArray = dictAddressComponent.object(forKey:"types") as! NSArray; + + for k in 0 ..< arrAddrCompTypes.count { + if(k == 0) { + strAddrCompType0 = arrAddrCompTypes[k] as? String; + } + + if(k == 1) { + strAddrCompType1 = arrAddrCompTypes[k] as? String; + } + + if(k == 2) { + strAddrCompType2 = arrAddrCompTypes[k] as? String; + } + } + + if(strAddrCompType0 == nil) { + strAddrCompType0 = String(format:"emptyType"); + } + + if(strAddrCompType1 == nil) { + strAddrCompType1 = String(format:"emptyType"); + } + + if(strAddrCompType2 == nil) { + strAddrCompType2 = String(format:"emptyType"); + } + + if ( ( strAddrCompType0 == arrSubLevel2Types[0] ) + && ( strAddrCompType1 == arrSubLevel2Types[1] ) + && ( strAddrCompType2 == arrSubLevel2Types[2] ) ) { + strSubLevel2Name = dictAddressComponent.object(forKey: "short_name") as? String; + } + + if ( (strAddrCompType0 == arrSubLevel1Types[0] ) + && ( strAddrCompType1 == arrSubLevel1Types[1] ) + && ( strAddrCompType2 == arrSubLevel1Types[2] ) ) { + strSubLevel1Name = dictAddressComponent.object(forKey: "short_name") as? String; + } + + if ( (strAddrCompType0 == arrLocalTypes[0] ) + && ( strAddrCompType1 == arrLocalTypes[1] ) ) { + strLocalName = dictAddressComponent.object(forKey: "short_name") as? String; + } + + if (strAddrCompType0 == strCountryTypes ) { + strCountryName = dictAddressComponent.object(forKey: "short_name") as? String; + } + + if ((strSubLevel2Name != nil) && (strSubLevel1Name != nil) + && (strLocalName != nil) && (strCountryName != nil) ) { + break; + } + } + + if ((strSubLevel2Name != nil) && (strSubLevel1Name != nil) + && (strLocalName != nil) && (strCountryName != nil) ) { + break; + } + } + + var strName : String? = nil; + var strAddress : String = String(format:""); + + print("strSubLevel2Name : \(String(describing: strSubLevel2Name))"); + print("strSubLevel1Name : \(String(describing: strSubLevel1Name))"); + print("strLocalName : \(String(describing: strLocalName))"); + print("strCountryName : \(String(describing: strCountryName))"); + + //국내는 동단위까지 표기해야 함. + if (strCountryName == "KR") { + if (strSubLevel2Name != nil) { + //strAddress = String(format:"%s", strSubLevel2Name!); + //strName = String(format:"%s", strSubLevel2Name!); + strAddress = strSubLevel2Name!; + strName = strSubLevel2Name!; + } + } + + print("[parseGlobalAddress] 1 strAddress : \(String(describing: strAddress))"); + + if (strSubLevel1Name != nil) { + //strAddress = String(format:"%s %s", strAddress, strSubLevel1Name!); + strAddress = strAddress + " " + strSubLevel1Name!; + if (strName == nil) + { + //strName = String(format:"%s", strSubLevel1Name!); + strName = strSubLevel1Name!; + } + } + + print("[parseGlobalAddress] 2 strAddress : \(String(describing: strAddress))"); + + if (strLocalName != nil) { + //strAddress = String(format:"%s %s", strAddress, strLocalName!); + strAddress = strAddress + " " + strLocalName!; + if (strName == nil) + { + //strName = String(format:"%s", strLocalName!); + strName = strLocalName!; + } + } + + print("[parseGlobalAddress] 3 strAddress : \(String(describing: strAddress))"); + + if (strCountryName != nil) { + //strAddress = String(format:"%s %s", strAddress, strCountryName!); + strAddress = strAddress + " " + strCountryName!; + if (strName == nil) { + //strName = String(format:"%s", strCountryName!); + strName = strCountryName!; + } + } + + print("[parseGlobalAddress] 4 strAddress : \(String(describing: strAddress))"); + + if ( (strName == nil) || (strName == strCountryName) ) { + print("Fail to find location address"); + } + + //[self updateCurCityInfo:nssName address:nssAddress country:nssCountryName]; + + print("[parseGlobalAddress] curLatitude : \(curLatitude), curLongitude : \(curLongitude)"); + + if( strCountryName == "KR" ) { + getAddressFromDaum(latitude: curLatitude, longitude: curLongitude, tryCount: 0); + } else { + print("[parseGlobalAddress] Get locations by using name!!! strAddress : \(String(describing: strAddress))"); + getGeocodeFromGoogle(strAddress: strAddress); + } + } + + func getGeocodeFromGoogle(strAddress:String) + { + //https://maps.googleapis.com/maps/api/geocode/json?address= + + #if false + //var set : CharacterSet = CharacterSet.urlHostAllowed(); + let urlSet = CharacterSet.urlFragmentAllowed + .union(.urlHostAllowed) + .union(.urlPasswordAllowed) + .union(.urlQueryAllowed) + .union(.urlUserAllowed) + + let urlAllowed = CharacterSet.urlFragmentAllowed + .union(.urlHostAllowed) + .union(.urlPasswordAllowed) + .union(.urlQueryAllowed) + .union(.urlUserAllowed) + #endif + + //var strEncAddress : String = strAddress.stringpe [nssAddress stringByAddingPercentEncodingWithAllowedCharacters:set]; + if let strEncAddress = strAddress.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) { + print(strEncAddress) // "http://www.mapquestapi.com/geocoding/v1/batch?key=YOUR_KEY_HERE&callback=renderBatch&location=Pottsville,PA&location=Red%20Lion&location=19036&location=1090%20N%20Charlotte%20St,%20Lancaster,%20PA" + + //let strURL : String = String(format:"%s%s", watchTWReq.STR_GOOGLE_ADDR2COORD_URL, strEncAddress); + let strURL : String = watchTWReq.STR_GOOGLE_ADDR2COORD_URL + strEncAddress; + print("[getGeocodeFromGoogle] Address : \(strAddress)" ); + print("[getGeocodeFromGoogle] EncAddress : \(strEncAddress)" ); + print("[getGeocodeFromGoogle] url : \(strURL)" ); + + requestAsyncByURLSession(url:strURL, reqType:InterfaceController.TYPE_REQUEST.GEO_GOOGLE); + } + } + + func getAddressFromDaum(latitude : Double, longitude : Double, tryCount : Int) { + //35.281741, 127.292345 <- 곡성군 에러 + // FIXME - for emulator - delete me + //latitude = 35.281741; + //longitude = 127.292345; + var strDaumKey : String? = nil; + var nextTryCount : Int = 0; + + #if false + if(tryCount == 0) { + print("111"); + let nsmaDaumKeys : NSMutableArray? = watchTWUtil.getDaumServiceKeys(); + //if let nsmaDaumKeys : NSMutableArray = watchTWUtil.getDaumServiceKeys() { + print("3333"); + let strFirstKey : String = nsmaDaumKeys!.object(at: 0) as! String + + if( (nsmaDaumKeys?.count == 0) || (strFirstKey == "0") ) { // 0, 1(Default)로 들어올때 처리 + print("[getAddressFromDaum] Keys of NSDefault is empty!!!"); + strDaumKey = String(format:"%s", watchTWReq.DAUM_SERVICE_KEY); + } else { + //shuffledDaumKeys = [[NSMutableArray alloc] init]; + shuffledDaumKeys = watchTWUtil.shuffleDatas(nsaDatas: nsmaDaumKeys!); + strDaumKey = String(format:"%s", shuffledDaumKeys[tryCount] as! CVarArg); + print("[getAddressFromDaum] shuffled first nssDaumKey : \(String(describing: strDaumKey))"); + } + // } else { + // print("222"); + // } + + } + else + { + if(tryCount >= shuffledDaumKeys.count) + { + print("We are used all keys. you have to ask more keys!!!"); + return; + } + + strDaumKey = String(format:"%s", shuffledDaumKeys[tryCount] as! CVarArg); + print("[getAddressFromDaum] tryCount:\(tryCount) shuffled next nssDaumKey : \(String(describing: strDaumKey))"); + } + #endif + + strDaumKey = watchTWReq.DAUM_SERVICE_KEY; + nextTryCount = tryCount + 1; + // let strURL : String = String(format:"%s%s%s%s%f%s%f%s%s", watchTWReq.STR_DAUM_COORD2ADDR_URL, watchTWReq.STR_APIKEY, strDaumKey!, watchTWReq.STR_LONGITUDE, longitude, watchTWReq.STR_LATITUDE, latitude, watchTWReq.STR_INPUT_COORD, watchTWReq.STR_OUTPUT_JSON); + let strURL : String = watchTWReq.STR_DAUM_COORD2ADDR_URL + watchTWReq.STR_APIKEY + strDaumKey! + watchTWReq.STR_LONGITUDE + String(format:"%f",longitude) + watchTWReq.STR_LATITUDE + String(format:"%f",latitude) + watchTWReq.STR_INPUT_COORD + watchTWReq.STR_OUTPUT_JSON; + + print("url : \(strURL)"); + + let dictRetryData : NSDictionary = [ Float(latitude): "latitude", + Float(longitude) : "longitude", + Int(nextTryCount) : "tryCount" ]; + + requestAsyncByURLSessionForRetry(url:strURL, reqType:InterfaceController.TYPE_REQUEST.ADDR_DAUM, nsdData: dictRetryData); + } + + func requestAsyncByURLSessionForRetry( url : String, reqType : InterfaceController.TYPE_REQUEST, nsdData:NSDictionary) { + let strURL : URL! = URL(string: url); + + print("[requestAsyncByURLSession] url : \(strURL), request type : \(reqType)"); + + var request = URLRequest.init(url: strURL); + if( reqType == InterfaceController.TYPE_REQUEST.WEATHER_KR) { + request.setValue("ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3", forHTTPHeaderField: "Accept-Language"); + } + + let task = URLSession.shared.dataTask(with: request, completionHandler: {(data, response, error) -> Void in + if let data = data { + // Do stuff with the data + //print("data : \(data)"); + let httpResponse :HTTPURLResponse = response as! HTTPURLResponse; + let code : Int = Int(httpResponse.statusCode); + if( (code == 401) || (code == 429) ) { + print("key is not authorized or keys is all used. retry!!! nsdData : \(nsdData)"); + let lat = Double(nsdData["latitude"] as! String); + let long = Double(nsdData["longitude"] as! String); + let count = Int(nsdData["tryCount"] as! String); + self.getAddressFromDaum(latitude: lat!, longitude:long!, tryCount:count!); + } else { + self.makeJSON( with : data, type : reqType); + } + } else { + print("Failed to fetch \(strURL) : \(String(describing: error))"); + } + }) + + task.resume(); + } + + func parseKRAddress(jsonDict : NSDictionary) { + var dict : NSDictionary? = nil; + var strFullName : String; + var strName : String; + var strName0 : String; + var strName1 : String; + var strName2 : String; + var strName3 : String; + var strURL : String? = nil; + + dict = jsonDict.object(forKey:"error") as? NSDictionary; + print("error dict : \(String(describing: dict))"); + + if(dict != nil) + { + print("error message : %s", dict?.object(forKey:"message") as! String); + } + else + { + print("I am valid json data!!!"); + + strFullName = jsonDict.object(forKey:"fullName") as! String; + strName = jsonDict.object(forKey:"name") as! String; + strName0 = jsonDict.object(forKey:"name0") as! String; + strName1 = jsonDict.object(forKey:"name1") as! String; + strName2 = jsonDict.object(forKey:"name2") as! String; + strName3 = jsonDict.object(forKey:"name3") as! String; + + var strName22 : String = strName2.replacingOccurrences(of: " ", with: ""); + + #if USE_DEBUG + print("nssFullName : %s", strFullName); + print("nssName : %s", strName); + print("nssName0 : %s", strName0); + print("nssName1 : %s", strName1); + print("nssName22 : %s", strName22); + print("nssName3 : %s", strName3); + #endif + + strURL = watchTWReq.makeRequestURL(addr1:strName1, addr2:strName22, addr3:strName3, country:"KR"); + + requestAsyncByURLSession(url:strURL!, reqType:InterfaceController.TYPE_REQUEST.WEATHER_KR); + } + } + + func parseGlobalGeocode(jsonDict : NSDictionary?) { + if(jsonDict == nil) { + print("[parseGlobalGeocode] jsonDict is nil!"); + return; + } + + let strStatus : String = jsonDict!.object(forKey:"status") as! String; + if(strStatus != "OK") { + print("strStatus[\(strStatus)] is not OK"); + return; + } + + //print("jsonDict : \(jsonDict)" ); + + if let arrResults : NSArray = jsonDict!.object(forKey:"results") as? NSArray{ + print("[parseGlobalGeocode] arrResults is \(arrResults)"); + if(arrResults.count <= 0) { + print("[parseGlobalGeocode] arrResults is 0 or less than 0!!!"); + return; + } + + let dictResults : NSDictionary = arrResults[0] as! NSDictionary; + + //print("dictResults : \(dictResults)"); + + let dictGeometry : NSDictionary? = dictResults.object(forKey: "geometry") as? NSDictionary; + if(dictGeometry == nil) { + print("[parseGlobalGeocode] dictGeometry is nil!"); + return; + } + + //print("nsdGeometry : \(nsdGeometry)"; + + let dictLocation : NSDictionary? = dictGeometry?.object(forKey:"location") as? NSDictionary; + if(dictLocation == nil) { + print("[parseGlobalGeocode] nsdLocation is nil!"); + return; + } + //[self updateCurLocation:nsdLocation]; + + print("dictLocation : \(String(describing: dictLocation))"); + + processGlobalAddressForWatch(location: dictLocation); + + + } else { + print("[parseGlobalGeocode] nsdResults is nil!"); + return; + } + + } + + func processGlobalAddressForWatch(location : NSDictionary?) { + if let strURL : String = watchTWReq.makeGlobalRequestURL(locDict : location!) { + requestAsyncByURLSession(url:strURL, reqType:InterfaceController.TYPE_REQUEST.WEATHER_GLOBAL); + + print("[processGlobalAddressForComplicaton] strURL : \(strURL)"); + } + } + + #if KKH + + func sessionDidBecomeInactive(_ session: WCSession) { + + } + + func sessionDidDeactivate(_ session: WCSession) { + + } + + #endif + + func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { + print("activationDidCompleteWith!") + if activationState == WCSessionActivationState.activated { + NSLog("Activated") + if(WCSession.default.isReachable){ + + // do { + // try session.updateApplicationContext( + //// [WatchRequestKey : "updateData"] + // ) + // } + // catch let error as NSError { + // print("\(error.localizedDescription)") + // } + } + } + + if activationState == WCSessionActivationState.inactive { + NSLog("Inactive") + } + + if activationState == WCSessionActivationState.notActivated { + NSLog("NotActivated") + } + } + + private func session(_ session: WCSession, + didReceiveMessage message: [String : AnyObject]) { + + print("didReceiveMessage!") + + } + + private func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) { + print("didReceiveApplicationContext!") + print("\(applicationContext)") + DispatchQueue.main.async(execute: { + //update UI here + }) + } + + #if KKH + func timeStringForLocale(date:NSDate) -> String { + let formatter = DateFormatter() + formatter.timeStyle = .ShortStyle + formatter.locale = NSLocale.currentLocale() + return formatter.stringFromDate(date) + } + #endif +} + diff --git a/ios/watch Extension/WatchTWeatherComplication.swift b/ios/watch Extension/WatchTWeatherComplication.swift new file mode 100644 index 000000000..415e6e6d5 --- /dev/null +++ b/ios/watch Extension/WatchTWeatherComplication.swift @@ -0,0 +1,1840 @@ +// +// WatchTWeatherComplication.swift +// watch Extension +// +// Created by KwangHo Kim on 2017. 10. 27.. +// + +import Foundation +import ClockKit +import WatchKit + + + + +class WatchTWeatherComplication: NSObject, CLKComplicationDataSource, CLLocationManagerDelegate { + var strCurImgName : String = "Sun"; // Current Weather status image + + var strAddress : String = ""; // Address + var currentTemp : Float = 0; // Current Temperature + + var strAirState : String = ""; // Air state or Huminity + var colorAirState : UIColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1) + var attrStrAirState : NSAttributedString = NSAttributedString(); + + + var todayPop : Int = 0; + var todayMinTemp : Int = 0; + var todayMaxTemp : Int = 0; + + var isTimeReloaded : Bool = false + var isWeatherRequested : Bool = false + + // Location Infomation + var manager: CLLocationManager = CLLocationManager() + var curLatitude : Double = 0; + var curLongitude : Double = 0; + + #if false + struct CityInfo { + var identifier : Any; + var strAddress : String; + var currentPosition : Bool; + var index : Int; + var weatherData : Dictionary; + var name : String; + var country : String; + var dictLocation : Dictionary; + + init() { + identifier = "cityInfoID" + strAddress = ""; + currentPosition = true; + index = 0; + weatherData = [:]; + name = "name" + country = "KR" + dictLocation = [:]; + } + } + #endif + + //var currentCity : CityInfo? = nil; + var currentCity = CityInfo(); + + //var shuffledDaumKeys : NSMutableArray = [String]() as! NSMutableArray; + var shuffledDaumKeys : NSMutableArray = NSMutableArray(); + //var nextDate: Date? + + + func getSupportedTimeTravelDirections(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimeTravelDirections) -> Void) { + print("getSupportedTimeTravelDirections"); + + handler([]) + } + + func getTimelineStartDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) { + print("getTimelineStartDate"); + + handler(nil) + } + + func getTimelineEndDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) { + print("getTimelineEndDate"); + + handler(nil) + } + + func getPrivacyBehavior(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationPrivacyBehavior) -> Void) { + print("getPrivacyBehavior"); + + handler(.showOnLockScreen) + } + + func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) { + print("getCurrentTimelineEntry") + + + var entry: CLKComplicationTimelineEntry? + //let timestamp = UserDefaults.standard.double(forKey: "timeStamp") + //let date = Date(timeIntervalSince1970: timestamp) + //nextDate = date + + // Call the handler with the current timeline entry + switch complication . family { + + case .modularSmall : + print("modularSmall") + let curImage = UIImage(named: "\(String(describing: strCurImgName))") + print("\(strCurImgName)") + #if false + let template = CLKComplicationTemplateModularSmallSimpleImage () + if(curImage != nil) { + print("current Image is existed!!!") + template.imageProvider = CLKImageProvider(onePieceImage: curImage!) + } + #endif + let template = CLKComplicationTemplateModularSmallStackImage() + if(curImage != nil) { + print("current Image is existed!!!") + template.line1ImageProvider = CLKImageProvider(onePieceImage: curImage!) + } + + print("country : \(currentCity.country)") + + if( (currentCity.country == "KR" ) || + (currentCity.country == "(null)" ) + // (currentCity.country == nil) + ) { + //template.line2TextProvider = CLKSimpleTextProvider(text: "\(currentTemp)˚ \(attrStrAirState)") + template.line2TextProvider = CLKSimpleTextProvider(text: "\(currentTemp)˚ \(strAirState)") + //template.tintColor = colorAirState; + } else { + template.line2TextProvider = CLKSimpleTextProvider(text: "\(currentTemp)˚") + } + + handler ( CLKComplicationTimelineEntry ( date : Date (), complicationTemplate : template )) + + case .modularLarge : + #if false + + print("modularLarge") + let template = CLKComplicationTemplateModularLargeStandardBody() + + print("\(String(describing: strAddress))") + + template.headerTextProvider = CLKSimpleTextProvider(text: "\(todayPop)% \(String(describing: strAddress)) \(currentTemp)˚") + template.body1TextProvider = CLKSimpleTextProvider(text: "\(String(describing:strAirState))") + template.body2TextProvider = CLKSimpleTextProvider(text: "\(todayMinTemp)˚ / \(todayMaxTemp)˚") + + let strUmbImgName : String = "Umbrella"; // Current Weather status image + let umbImage = UIImage(named: String(describing: strUmbImgName)) + if(umbImage != nil ) { + template.headerImageProvider = CLKImageProvider(onePieceImage: umbImage!) + } + + template.tintColor = colorAirState; + + entry = CLKComplicationTimelineEntry(date: Date(), complicationTemplate: template) + + handler(entry) + #endif + + case .utilitarianSmall : + let curImage = UIImage(named: "\(String(describing: strCurImgName))") + let template = CLKComplicationTemplateUtilitarianSmallFlat() + + if(curImage != nil) { + print("current Image is existed!!!") + template.imageProvider = CLKImageProvider(onePieceImage: curImage!) + } + + if( (currentCity.country == "KR" ) || + (currentCity.country == "(null)" ) + // (currentCity.country == nil) + ) { + //template.line2TextProvider = CLKSimpleTextProvider(text: "\(currentTemp)˚ \(attrStrAirState)") + template.textProvider = CLKSimpleTextProvider(text: "\(currentTemp)˚ \(strAirState)") + //template.tintColor = colorAirState; + } else { + template.textProvider = CLKSimpleTextProvider(text: "\(currentTemp)˚") + } + + handler ( CLKComplicationTimelineEntry ( date : Date (), complicationTemplate : template )) + + case .circularSmall : + let curImage = UIImage(named: "\(String(describing: strCurImgName))") + let template = CLKComplicationTemplateCircularSmallStackImage() + + if(curImage != nil) { + print("current Image is existed!!!") + template.line1ImageProvider = CLKImageProvider(onePieceImage: curImage!) + } + + if( (currentCity.country == "KR" ) || + (currentCity.country == "(null)" ) + // (currentCity.country == nil) + ) { + //template.line2TextProvider = CLKSimpleTextProvider(text: "\(currentTemp)˚ \(attrStrAirState)") + template.line2TextProvider = CLKSimpleTextProvider(text: "\(currentTemp)˚ \(strAirState)") + //template.tintColor = colorAirState; + } else { + template.line2TextProvider = CLKSimpleTextProvider(text: "\(currentTemp)˚") + } + + handler ( CLKComplicationTimelineEntry ( date : Date (), complicationTemplate : template )) + + case .extraLarge : + let curImage = UIImage(named: "\(String(describing: strCurImgName))") + let template = CLKComplicationTemplateExtraLargeStackImage() + + if(curImage != nil) { + print("current Image is existed!!!") + template.line1ImageProvider = CLKImageProvider(onePieceImage: curImage!) + } + + if( (currentCity.country == "KR" ) || + (currentCity.country == "(null)" ) + // (currentCity.country == nil) + ) { + //template.line2TextProvider = CLKSimpleTextProvider(text: "\(currentTemp)˚ \(attrStrAirState)") + template.line2TextProvider = CLKSimpleTextProvider(text: "\(currentTemp)˚ \(strAirState)") + //template.tintColor = colorAirState; + } else { + template.line2TextProvider = CLKSimpleTextProvider(text: "\(currentTemp)˚") + } + + + handler ( CLKComplicationTimelineEntry ( date : Date (), complicationTemplate : template )) + + + default : + print ( "Unknown complication type: \(complication.family) " ) + handler ( nil ) + } + } + + func getCurrentHealth() -> Int { + // This would be used to retrieve current Chairman Cow health data + // for display on the watch. For testing, this always returns a + // constant. + return 4 + } + + func getNextRequestedUpdateDateWithHandler(handler: (NSDate?) -> Void) { + // Update hourly + + handler(NSDate(timeIntervalSinceNow: 60*60)) + print("getNextRequestedUpdateDateWithHandler"); + } + + func getPlaceholderTemplateForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTemplate?) -> Void) { + print("getPlaceholderTemplateForComplication"); + #if false + var template: CLKComplicationTemplate? = nil + switch complication.family { + case .modularSmall: + let modularTemplate = CLKComplicationTemplateCircularSmallRingText() + modularTemplate.textProvider = CLKSimpleTextProvider(text: "abc--") + modularTemplate.fillFraction = 1 + modularTemplate.ringStyle = CLKComplicationRingStyle.closed + template = modularTemplate + print("modularSmall"); + case .modularLarge: + let modularTemplate = CLKComplicationTemplateCircularSmallRingText() + modularTemplate.textProvider = CLKSimpleTextProvider(text: "def--") + modularTemplate.fillFraction = 1 + modularTemplate.ringStyle = CLKComplicationRingStyle.closed + template = modularTemplate + print("modularLarge"); + case .utilitarianSmall: + let modularTemplate = CLKComplicationTemplateCircularSmallRingText() + modularTemplate.textProvider = CLKSimpleTextProvider(text: "------") + modularTemplate.fillFraction = 1 + modularTemplate.ringStyle = CLKComplicationRingStyle.closed + template = modularTemplate + print("utilitarianSmall"); + case .utilitarianSmallFlat: + let modularTemplate = CLKComplicationTemplateCircularSmallRingText() + modularTemplate.textProvider = CLKSimpleTextProvider(text: "------") + modularTemplate.fillFraction = 1 + modularTemplate.ringStyle = CLKComplicationRingStyle.closed + template = modularTemplate + print("utilitarianSmallFlat"); + case .utilitarianLarge: + let modularTemplate = CLKComplicationTemplateCircularSmallRingText() + modularTemplate.textProvider = CLKSimpleTextProvider(text: "------") + modularTemplate.fillFraction = 1 + modularTemplate.ringStyle = CLKComplicationRingStyle.closed + template = modularTemplate + print("utilitarianLarge"); + case .circularSmall: + let modularTemplate = CLKComplicationTemplateCircularSmallRingText() + modularTemplate.textProvider = CLKSimpleTextProvider(text: "------") + modularTemplate.fillFraction = 1 + modularTemplate.ringStyle = CLKComplicationRingStyle.closed + template = modularTemplate + print("circularSmall"); + case .extraLarge: + let modularTemplate = CLKComplicationTemplateCircularSmallRingText() + modularTemplate.textProvider = CLKSimpleTextProvider(text: "------") + modularTemplate.fillFraction = 1 + modularTemplate.ringStyle = CLKComplicationRingStyle.closed + template = modularTemplate + print("extraLarge"); + } + handler(template) + #endif + handler(defaultTemplate()) + } + + func defaultTemplate() -> CLKComplicationTemplateModularLargeStandardBody { + let placeholder = CLKComplicationTemplateModularLargeStandardBody(); + placeholder.headerTextProvider = CLKSimpleTextProvider(text: "Transit") + placeholder.body1TextProvider = CLKSimpleTextProvider(text: "Next bus in:") + placeholder.body2TextProvider = CLKSimpleTextProvider(text: "") + return placeholder + } + + func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimelineEntry?) -> Void) { + print("getCurrentTimelineEntryForComplication") + + if complication.family == .modularSmall { + let template = CLKComplicationTemplateCircularSmallRingText() + template.textProvider = CLKSimpleTextProvider(text: "modularSmall") + template.fillFraction = Float(getCurrentHealth()) / 10.0 + template.ringStyle = CLKComplicationRingStyle.closed + + let timelineEntry = CLKComplicationTimelineEntry(date: NSDate() as Date, complicationTemplate: template) + handler(timelineEntry) + } else if complication.family == .modularLarge { + + //CLKComplicationTemplateModularLargeStandardBody *t = [[CLKComplicationTemplateModularLargeStandardBody alloc] init]; + //t.headerTextProvider = [CLKSimpleTextProvider textProviderWithText:data[@"Waxing gibbous"]]; + //t.body1TextProvider = [CLKSimpleTextProvider textProviderWithText:data[@"Moonrise 5:27PM"]]; + //t.body2TextProvider = [CLKTimeIntervalTextProvider textProviderWithStartDate:[NSDate date] endDate:[NSDate dateWithTimeIntervalSinceNow:((6*60*60)+(18*60))]; + + let template = CLKComplicationTemplateCircularSmallRingText() + template.textProvider = CLKSimpleTextProvider(text: "modularLarge") + template.fillFraction = Float(getCurrentHealth()) / 10.0 + template.ringStyle = CLKComplicationRingStyle.closed + + let timelineEntry = CLKComplicationTimelineEntry(date: NSDate() as Date, complicationTemplate: template) + handler(timelineEntry) + + + } else if complication.family == .utilitarianSmall { + let template = CLKComplicationTemplateCircularSmallRingText() + template.textProvider = CLKSimpleTextProvider(text: "utilitarianSmall") + template.fillFraction = Float(getCurrentHealth()) / 10.0 + template.ringStyle = CLKComplicationRingStyle.closed + + let timelineEntry = CLKComplicationTimelineEntry(date: NSDate() as Date, complicationTemplate: template) + handler(timelineEntry) + } else if complication.family == .utilitarianSmallFlat { + let template = CLKComplicationTemplateCircularSmallRingText() + template.textProvider = CLKSimpleTextProvider(text: "utilitarianSmallFlat") + template.fillFraction = Float(getCurrentHealth()) / 10.0 + template.ringStyle = CLKComplicationRingStyle.closed + + let timelineEntry = CLKComplicationTimelineEntry(date: NSDate() as Date, complicationTemplate: template) + handler(timelineEntry) + } else if complication.family == .utilitarianLarge { + let template = CLKComplicationTemplateCircularSmallRingText() + template.textProvider = CLKSimpleTextProvider(text: "utilitarianLarge") + template.fillFraction = Float(getCurrentHealth()) / 10.0 + template.ringStyle = CLKComplicationRingStyle.closed + + let timelineEntry = CLKComplicationTimelineEntry(date: NSDate() as Date, complicationTemplate: template) + handler(timelineEntry) + } else if complication.family == .circularSmall { + let template = CLKComplicationTemplateCircularSmallRingText() + //template.textProvider = CLKSimpleTextProvider(text: "\(getCurrentHealth())") + template.textProvider = CLKSimpleTextProvider(text: "circularSmall") + template.fillFraction = Float(getCurrentHealth()) / 10.0 + template.ringStyle = CLKComplicationRingStyle.closed + + let timelineEntry = CLKComplicationTimelineEntry(date: NSDate() as Date, complicationTemplate: template) + handler(timelineEntry) + } else if complication.family == .extraLarge { + let template = CLKComplicationTemplateCircularSmallRingText() + template.textProvider = CLKSimpleTextProvider(text: "extraLarge") + template.fillFraction = Float(getCurrentHealth()) / 10.0 + template.ringStyle = CLKComplicationRingStyle.closed + + let timelineEntry = CLKComplicationTimelineEntry(date: NSDate() as Date, complicationTemplate: template) + handler(timelineEntry) + } else { + handler(nil) + } + } + + func getTimelineEntries(for complication: CLKComplication, before date: Date, limit: Int, withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void) { + // Call the handler with the timeline entries prior to the given date + print("getTimelineEntries before"); + + handler(nil) + } + + func getTimelineEntries(for complication: CLKComplication, after date: Date, limit: Int, withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void) { + // Call the handler with the timeline entries after to the given date + print("getTimelineEntries after date : \(date) limit : \(limit)"); + + if( isTimeReloaded == false) { + let defaults = UserDefaults(suiteName: "group.net.wizardfactory.todayweather") + defaults?.synchronize() + + if defaults == nil { + print("defaults is nuil!") + } else { + print(defaults!) + } + + if let units = defaults?.string(forKey: "units") { + print(units) + watchTWUtil.setTemperatureUnit(strUnits: units); + } + + if let daumKeys = defaults?.string(forKey: "daumServiceKeys") { + print(daumKeys) + watchTWUtil.setDaumServiceKeys(strDaumKeys: daumKeys); + } + + // test - FIXME + + var nextCity : CityInfo? = CityInfo(); + print("nextCity : \(String(describing: nextCity))"); + + currentCity = CityInfo.loadCurrentCity(); + + #if false + nextCity?.currentPosition = true; + nextCity?.country = "KR"; + print("nextCity : \(String(describing: nextCity))"); + let archivedObject : NSData = NSKeyedArchiver.archivedData(withRootObject: nextCity!) as NSData; + print("archivedObject : \(String(describing: archivedObject))"); + defaults?.set(archivedObject, forKey: "currentCity") + defaults?.synchronize(); + + + if let archivedObject = defaults?.object(forKey: "currentCity") { + print("archivedObject : \(archivedObject)"); + //currentCity = (CityInfo *)[NSKeyedUnarchiver unarchiveObjectWithData:archivedObject]; + //currentCity = (NSKeyedUnarchiver.unarchiveObject(with: archivedObject as! Data) as? CityInfo)!; + currentCity = NSKeyedUnarchiver.unarchiveObject(with: (archivedObject as! Data)) as! WatchTWeatherComplication.CityInfo ; + if (currentCity == nil) { + print("UnarchiveObjectWithData is failed!!!") + } + else { + print("Current City : \(String(describing: currentCity))"); + } + + } else { + print("Current City is not existed!!!") + } + #endif + + print("currentPosition : \(String(describing: currentCity.currentPosition))") + print("country : \(String(describing: currentCity.country))") + print("strAddress : \(String(describing: currentCity.strAddress))") + print("dictLocation : \(String(describing: currentCity.dictLocation))") + + #if true + if (currentCity.currentPosition == true){ + //manager.delegate = self + //manager.desiredAccuracy = kCLLocationAccuracyBest; + // Update if you move 200 meter + //manager.distanceFilter = 200; + //manager.allowsBackgroundLocationUpdates = true; + //manager.requestAlwaysAuthorization(); + //manager.requestWhenInUseAuthorization + //manager.startUpdatingLocation(); + //manager.requestLocation() + + // Temporally use loaded data. after request location successfully, we will change + if( (currentCity.country == "KR" ) || + (currentCity.country == "(null)" ) + // (currentCity.country == nil) + ) + { + print("strAddress : \(String(describing: currentCity.strAddress))") + processKRAddress((currentCity.strAddress)!); + } + else + { + //let keys = ["lat", "lng"]; + //let values = [40.71, -74.00]; + //let dict = NSDictionary.init(objects: values, forKeys: keys as [NSCopying]) + processGlobalAddressForComplicaton(location: currentCity.dictLocation as NSDictionary?); + } + } + else + { + if( (currentCity.country == "KR" ) || + (currentCity.country == "(null)" ) + // (currentCity.country == nil) + ) + { + print("strAddress : \(String(describing: currentCity.strAddress))") + processKRAddress((currentCity.strAddress)!); + } + else + { + //let keys = ["lat", "lng"]; + //let values = [40.71, -74.00]; + //let dict = NSDictionary.init(objects: values, forKeys: keys as [NSCopying]) + processGlobalAddressForComplicaton(location: currentCity.dictLocation as NSDictionary?); + } + } + #endif + + isTimeReloaded = true; + } + + handler(nil) + } + + func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { + print("error:: \(error.localizedDescription)") + } + + func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + if status == .authorizedWhenInUse { + manager.requestLocation() + } + } + + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + //NSDate* eventDate = newLocation.timestamp; + //NSTimeInterval howRecent = [eventDate timeIntervalSinceNow]; + print("location:: \(locations)") + if locations.first != nil { + print("location:: \(locations)") + + //if(fabs(howRecent) < 5.0) + //{ + //[locationManager stopUpdatingLocation]; + + curLatitude = (locations.last?.coordinate.latitude)!; + curLongitude = (locations.last?.coordinate.longitude)!; + + print("[locationManager] latitude : %f, longitude : %f", curLatitude, curLongitude) + + getAddressFromGoogle(latitude: curLatitude, longitude: curLongitude); + + //} + + #if false + self.lat = String(format:"%.4f", (locations.last?.coordinate.latitude)!) + self.lon = String(format:"%.4f", (locations.last?.coordinate.longitude)!) + let geoCoder = CLGeocoder() + geoCoder.reverseGeocodeLocation(locations.last!, completionHandler: { (placemarks, error) -> Void in + guard let placeMark: CLPlacemark = placemarks?[0] else { + return + } + guard let state = placeMark.administrativeArea as String! else { + return + } + self.state = state + }) + #endif + } + } + + #if false + func requestedUpdateDidBegin(){ + print("requestedUpdateDidBegin"); + manager.delegate = self + manager.requestLocation() + let server=CLKComplicationServer.sharedInstance() + for comp in (server.activeComplications)! { + server.reloadTimeline(for: comp) + } + } + #endif + + var backgroundUrlSession:URLSession? + var pendingBackgroundURLTask:WKURLSessionRefreshBackgroundTask? + + func handle(_ backgroundTasks: Set) { + print("#### WKRefreshBackgroundTask ####") + manager.delegate = self + manager.requestLocation() + + for task in backgroundTasks { + if let refreshTask = task as? WKApplicationRefreshBackgroundTask { + // this task is completed below, our app will then suspend while the download session runs + print("application task received, start URL session, WKApplicationRefreshBackgroundTask") + + manager.delegate = self + manager.requestLocation() + + + } + else if let urlTask = task as? WKURLSessionRefreshBackgroundTask + { + print("application task received, start URL session, WKURLSessionRefreshBackgroundTask") + + manager.delegate = self + manager.requestLocation() + } else { + print("else") + manager.delegate = self + manager.requestLocation() + } + } + } + + func getAddressFromGoogle(latitude:Double, longitude: Double) + { + //40.7127837, -74.0059413 <- New York + + #if false //GLOBAL_TEST + // FIXME - for emulator - delete me + //let lat : Double = 40.7127837; + //let longi : Double = -74.0059413; + + // 오사카 + //float lat = 34.678395; + //float longi = 135.4601303; + + // + let lat : Double = 37.5665350; + let longi : Double = 126.9779690; + + curLatitude = lat; + curLongitude = longi; + + //https://maps.googleapis.com/maps/api/geocode/json?latlng=40.7127837,-74.0059413 + + let strURL : String = String(format:"%@%f,%f", watchTWReq.STR_GOOGLE_COORD2ADDR_URL, lat, longi); + #else + let strURL : String = String(format:"%s%f,%f", watchTWReq.STR_GOOGLE_COORD2ADDR_URL, latitude, longitude); + #endif + + print("[getAddressFromGoogle]url : \(strURL)"); + + requestAsyncByURLSession(url:strURL, reqType:InterfaceController.TYPE_REQUEST.ADDR_GOOGLE); + } + + func processKRAddress( _ address : String) { + let array = address.characters.split(separator: " ").map(String.init) + var addr1 : String? = nil; + var addr2 : String? = nil; + var addr3 : String? = nil; + var lastChar : String? = nil; + + print("array.count => \(array.count)"); + + if(array.count == 0) { + print("address is empty!!!"); + return + } + + if (array.count == 2) { + addr1 = array[1] + } + else if (array.count == 5) { + addr1 = array[1]; + addr2 = array[2] + array[3]; + addr3 = array[4]; + } + else if (array.count == 4) { + let index : Int = array[3].characters.count - 1; + addr1 = array[1]; + lastChar = (array[3] as NSString).substring(from:index); + if ( lastChar == "구" ) { + addr2 = array[2] + array[3]; + } + else { + addr2 = array[2]; + addr3 = array[3]; + } + } + else if ( array.count == 3) { + let index : Int = array[2].characters.count - 1; + addr1 = array[1]; + lastChar = (array[2] as NSString).substring(from:index); + if ( lastChar == "읍" ) || ( lastChar == "면" ) || ( lastChar == "동" ) { + addr2 = array[1]; + addr3 = array[2]; + } + else { + addr2 = array[2]; + } + } + + dump(array); + print("[processKRAddress] => addr1:\(String(describing: addr1)), addr2:\(String(describing: addr2)), addr3:\(String(describing: addr3))"); + let URL = watchTWReq.makeRequestURL(addr1:addr1!, addr2:addr2!, addr3:addr3!, country:"KR"); + requestAsyncByURLSession(url:URL, reqType:InterfaceController.TYPE_REQUEST.WEATHER_KR); + //print("nssURL : %s", nssURL); + } + + + func processGlobalAddressForComplicaton(location : NSDictionary?) { + if let strURL : String = watchTWReq.makeGlobalRequestURL(locDict : location!) { + requestAsyncByURLSession(url:strURL, reqType:InterfaceController.TYPE_REQUEST.WEATHER_GLOBAL); + + print("[processGlobalAddressForComplicaton] strURL : \(strURL)"); + } + } + + func requestAsyncByURLSession( url : String, reqType : InterfaceController.TYPE_REQUEST) { + print("url : \(url)"); + let strURL : URL! = URL(string: url); + + print("[requestAsyncByURLSession] url : \(strURL), request type : \(reqType)"); + + var request = URLRequest.init(url: strURL); + if( reqType == InterfaceController.TYPE_REQUEST.WEATHER_KR) { + request.setValue("ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3", forHTTPHeaderField: "Accept-Language"); + } + + let task = URLSession.shared.dataTask(with: request, completionHandler: {(data, response, error) -> Void in + if let data = data { + // Do stuff with the data + //print("data : \(data)"); + self.makeJSON( with : data, type : reqType); + } else { + print("Failed to fetch \(strURL) : \(String(describing: error))"); + } + }) + + task.resume(); + } + + func requestAsyncByURLSessionForRetry( url : String, reqType : InterfaceController.TYPE_REQUEST, nsdData:NSDictionary) { + let strURL : URL! = URL(string: url); + + print("[requestAsyncByURLSession] url : \(strURL), request type : \(reqType)"); + + var request = URLRequest.init(url: strURL); + if( reqType == InterfaceController.TYPE_REQUEST.WEATHER_KR) { + request.setValue("ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3", forHTTPHeaderField: "Accept-Language"); + } + + let task = URLSession.shared.dataTask(with: request, completionHandler: {(data, response, error) -> Void in + if let data = data { + // Do stuff with the data + //print("data : \(data)"); + let httpResponse :HTTPURLResponse = response as! HTTPURLResponse; + let code : Int = Int(httpResponse.statusCode); + if( (code == 401) || (code == 429) ) { + print("key is not authorized or keys is all used. retry!!! nsdData : \(nsdData)"); + let lat = Double(nsdData["latitude"] as! String); + let long = Double(nsdData["longitude"] as! String); + let count = Int(nsdData["tryCount"] as! String); + self.getAddressFromDaum(latitude: lat!, longitude:long!, tryCount:count!); + } else { + self.makeJSON( with : data, type : reqType); + } + } else { + print("Failed to fetch \(strURL) : \(String(describing: error))"); + } + }) + + task.resume(); + } + + func parseKRAddress(jsonDict : NSDictionary) { + var dict : NSDictionary? = nil; + var strFullName : String; + var strName : String; + var strName0 : String; + var strName1 : String; + var strName2 : String; + var strName3 : String; + var strURL : String? = nil; + + dict = jsonDict.object(forKey:"error") as? NSDictionary; + print("error dict : \(String(describing: dict))"); + + if(dict != nil) + { + print("error message : %s", dict?.object(forKey:"message") as! String); + } + else + { + print("I am valid json data!!!"); + + strFullName = jsonDict.object(forKey:"fullName") as! String; + strName = jsonDict.object(forKey:"name") as! String; + strName0 = jsonDict.object(forKey:"name0") as! String; + strName1 = jsonDict.object(forKey:"name1") as! String; + strName2 = jsonDict.object(forKey:"name2") as! String; + strName3 = jsonDict.object(forKey:"name3") as! String; + + var strName22 : String = strName2.replacingOccurrences(of: " ", with: ""); + + #if USE_DEBUG + print("nssFullName : %s", strFullName); + print("nssName : %s", strName); + print("nssName0 : %s", strName0); + print("nssName1 : %s", strName1); + print("nssName22 : %s", strName22); + print("nssName3 : %s", strName3); + #endif + + strURL = watchTWReq.makeRequestURL(addr1:strName1, addr2:strName22, addr3:strName3, country:"KR"); + + requestAsyncByURLSession(url:strURL!, reqType:InterfaceController.TYPE_REQUEST.WEATHER_KR); + } + } + + func parseGlobalGeocode(jsonDict : NSDictionary?) { + if(jsonDict == nil) { + print("[parseGlobalGeocode] jsonDict is nil!"); + return; + } + + let strStatus : String = jsonDict!.object(forKey:"status") as! String; + if(strStatus != "OK") { + print("strStatus[\(strStatus)] is not OK"); + return; + } + + //print("jsonDict : \(jsonDict)" ); + + if let arrResults : NSArray = jsonDict!.object(forKey:"results") as? NSArray{ + print("[parseGlobalGeocode] arrResults is \(arrResults)"); + if(arrResults.count <= 0) { + print("[parseGlobalGeocode] arrResults is 0 or less than 0!!!"); + return; + } + + let dictResults : NSDictionary = arrResults[0] as! NSDictionary; + + //print("dictResults : \(dictResults)"); + + let dictGeometry : NSDictionary? = dictResults.object(forKey: "geometry") as? NSDictionary; + if(dictGeometry == nil) { + print("[parseGlobalGeocode] dictGeometry is nil!"); + return; + } + + //print("nsdGeometry : \(nsdGeometry)"; + + let dictLocation : NSDictionary? = dictGeometry?.object(forKey:"location") as? NSDictionary; + if(dictLocation == nil) { + print("[parseGlobalGeocode] nsdLocation is nil!"); + return; + } + //[self updateCurLocation:nsdLocation]; + + print("dictLocation : \(String(describing: dictLocation))"); + + processGlobalAddressForComplicaton(location: dictLocation); + + + } else { + print("[parseGlobalGeocode] nsdResults is nil!"); + return; + } + + } + + func makeJSON( with jsonData : Data, type reqType : InterfaceController.TYPE_REQUEST) { + do { + guard let parsedResult = try JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) as? NSDictionary else { + return + } + //print("Parsed Result: \(parsedResult)") + + if(reqType == InterfaceController.TYPE_REQUEST.ADDR_DAUM) { + parseKRAddress(jsonDict: (parsedResult as NSDictionary)); + } + else if(reqType == InterfaceController.TYPE_REQUEST.ADDR_GOOGLE) { + parseGoogleAddress(jsonDict: (parsedResult as? Dictionary)!); + } + else if(reqType == InterfaceController.TYPE_REQUEST.GEO_GOOGLE) { + parseGlobalGeocode(jsonDict: (parsedResult as NSDictionary)); + } + else if(reqType == InterfaceController.TYPE_REQUEST.WEATHER_GLOBAL) { + print("reqType == WATCH_COMPLICATION_GLOBAL"); + processWeatherResultsAboutCompGlobal(jsonDict: parsedResult as? Dictionary) + if(isWeatherRequested == false) { + refreshComplications(); + isWeatherRequested = true; + } + } + else if(reqType == InterfaceController.TYPE_REQUEST.WEATHER_KR) { + print("reqType == WEATHER_KR"); + processWeatherResultsWithCompKR(jsonDict: parsedResult as? Dictionary) + if(isWeatherRequested == false) { + refreshComplications(); + isWeatherRequested = true; + } + } + + + } catch { + print("Error: \(error.localizedDescription)") + } + } + + + + func parseGoogleAddress(jsonDict : Dictionary) + { + //print("\(jsonDict)"); + let strStatus : String = jsonDict["status"] as! String; + if(strStatus != "OK") { + print("strStatus[\(strStatus)] is not OK"); + return; + } + + let arrResults : NSArray = jsonDict["results"] as! NSArray; + + //print("\(arrResults)"); + + var arrSubLevel2Types : Array = ["political", "sublocality", "sublocality_level_2"]; + var arrSubLevel1Types : Array = ["political", "sublocality", "sublocality_level_1"]; + var arrLocalTypes : Array = ["locality", "political"]; + let strCountryTypes : String = String(format:"country"); + + var strSubLevel2Name : String? = nil; + var strSubLevel1Name : String? = nil; + var strLocalName : String? = nil; + var strCountryName : String? = nil; + + for i in 0 ..< arrResults.count { + let dictResult : NSDictionary? = arrResults[i] as? NSDictionary; + if(dictResult == nil) { + print("nsdResult is null!!!"); + continue; + } + + //print("\(i) \(String(describing: dictResult))"); + + let arrAddressComponents : NSArray = dictResult?.object(forKey:"address_components") as! NSArray; + for j in 0 ..< arrAddressComponents.count { + var strAddrCompType0 : String? = nil; + var strAddrCompType1 : String? = nil; + var strAddrCompType2 : String? = nil; + + let dictAddressComponent : NSDictionary = arrAddressComponents[j] as! NSDictionary; + let arrAddrCompTypes : NSArray = dictAddressComponent.object(forKey:"types") as! NSArray; + + for k in 0 ..< arrAddrCompTypes.count { + if(k == 0) { + strAddrCompType0 = arrAddrCompTypes[k] as? String; + } + + if(k == 1) { + strAddrCompType1 = arrAddrCompTypes[k] as? String; + } + + if(k == 2) { + strAddrCompType2 = arrAddrCompTypes[k] as? String; + } + } + + if(strAddrCompType0 == nil) { + strAddrCompType0 = String(format:"emptyType"); + } + + if(strAddrCompType1 == nil) { + strAddrCompType1 = String(format:"emptyType"); + } + + if(strAddrCompType2 == nil) { + strAddrCompType2 = String(format:"emptyType"); + } + + if ( ( strAddrCompType0 == arrSubLevel2Types[0] ) + && ( strAddrCompType1 == arrSubLevel2Types[1] ) + && ( strAddrCompType2 == arrSubLevel2Types[2] ) ) { + strSubLevel2Name = dictAddressComponent.object(forKey: "short_name") as? String; + } + + if ( (strAddrCompType0 == arrSubLevel1Types[0] ) + && ( strAddrCompType1 == arrSubLevel1Types[1] ) + && ( strAddrCompType2 == arrSubLevel1Types[2] ) ) { + strSubLevel1Name = dictAddressComponent.object(forKey: "short_name") as? String; + } + + if ( (strAddrCompType0 == arrLocalTypes[0] ) + && ( strAddrCompType1 == arrLocalTypes[1] ) ) { + strLocalName = dictAddressComponent.object(forKey: "short_name") as? String; + } + + if (strAddrCompType0 == strCountryTypes ) { + strCountryName = dictAddressComponent.object(forKey: "short_name") as? String; + } + + if ((strSubLevel2Name != nil) && (strSubLevel1Name != nil) + && (strLocalName != nil) && (strCountryName != nil) ) { + break; + } + } + + if ((strSubLevel2Name != nil) && (strSubLevel1Name != nil) + && (strLocalName != nil) && (strCountryName != nil) ) { + break; + } + } + + var strName : String? = nil; + var strAddress : String = String(format:""); + + print("strSubLevel2Name : \(String(describing: strSubLevel2Name))"); + print("strSubLevel1Name : \(String(describing: strSubLevel1Name))"); + print("strLocalName : \(String(describing: strLocalName))"); + print("strCountryName : \(String(describing: strCountryName))"); + + //국내는 동단위까지 표기해야 함. + if (strCountryName == "KR") { + if (strSubLevel2Name != nil) { + //strAddress = String(format:"%s", strSubLevel2Name!); + //strName = String(format:"%s", strSubLevel2Name!); + strAddress = strSubLevel2Name!; + strName = strSubLevel2Name!; + } + } + + print("[parseGlobalAddress] 1 strAddress : \(String(describing: strAddress))"); + + if (strSubLevel1Name != nil) { + //strAddress = String(format:"%s %s", strAddress, strSubLevel1Name!); + strAddress = strAddress + " " + strSubLevel1Name!; + if (strName == nil) + { + //strName = String(format:"%s", strSubLevel1Name!); + strName = strSubLevel1Name!; + } + } + + print("[parseGlobalAddress] 2 strAddress : \(String(describing: strAddress))"); + + if (strLocalName != nil) { + //strAddress = String(format:"%s %s", strAddress, strLocalName!); + strAddress = strAddress + " " + strLocalName!; + if (strName == nil) + { + //strName = String(format:"%s", strLocalName!); + strName = strLocalName!; + } + } + + print("[parseGlobalAddress] 3 strAddress : \(String(describing: strAddress))"); + + if (strCountryName != nil) { + //strAddress = String(format:"%s %s", strAddress, strCountryName!); + strAddress = strAddress + " " + strCountryName!; + if (strName == nil) { + //strName = String(format:"%s", strCountryName!); + strName = strCountryName!; + } + } + + print("[parseGlobalAddress] 4 strAddress : \(String(describing: strAddress))"); + + if ( (strName == nil) || (strName == strCountryName) ) { + print("Fail to find location address"); + } + + //[self updateCurCityInfo:nssName address:nssAddress country:nssCountryName]; + + print("[parseGlobalAddress] curLatitude : \(curLatitude), curLongitude : \(curLongitude)"); + + if( strCountryName == "KR" ) { + getAddressFromDaum(latitude: curLatitude, longitude: curLongitude, tryCount: 0); + } else { + print("[parseGlobalAddress] Get locations by using name!!! strAddress : \(String(describing: strAddress))"); + getGeocodeFromGoogle(strAddress: strAddress); + } + } + + func getGeocodeFromGoogle(strAddress:String) + { + //https://maps.googleapis.com/maps/api/geocode/json?address= + + #if false + //var set : CharacterSet = CharacterSet.urlHostAllowed(); + let urlSet = CharacterSet.urlFragmentAllowed + .union(.urlHostAllowed) + .union(.urlPasswordAllowed) + .union(.urlQueryAllowed) + .union(.urlUserAllowed) + + let urlAllowed = CharacterSet.urlFragmentAllowed + .union(.urlHostAllowed) + .union(.urlPasswordAllowed) + .union(.urlQueryAllowed) + .union(.urlUserAllowed) + #endif + + //var strEncAddress : String = strAddress.stringpe [nssAddress stringByAddingPercentEncodingWithAllowedCharacters:set]; + if let strEncAddress = strAddress.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) { + print(strEncAddress) // "http://www.mapquestapi.com/geocoding/v1/batch?key=YOUR_KEY_HERE&callback=renderBatch&location=Pottsville,PA&location=Red%20Lion&location=19036&location=1090%20N%20Charlotte%20St,%20Lancaster,%20PA" + + //let strURL : String = String(format:"%s%s", watchTWReq.STR_GOOGLE_ADDR2COORD_URL, strEncAddress); + let strURL : String = watchTWReq.STR_GOOGLE_ADDR2COORD_URL + strEncAddress; + print("[getGeocodeFromGoogle] Address : \(strAddress)" ); + print("[getGeocodeFromGoogle] EncAddress : \(strEncAddress)" ); + print("[getGeocodeFromGoogle] url : \(strURL)" ); + + requestAsyncByURLSession(url:strURL, reqType:InterfaceController.TYPE_REQUEST.GEO_GOOGLE); + } + } + + func getAddressFromDaum(latitude : Double, longitude : Double, tryCount : Int) { + //35.281741, 127.292345 <- 곡성군 에러 + // FIXME - for emulator - delete me + //latitude = 35.281741; + //longitude = 127.292345; + var strDaumKey : String? = nil; + var nextTryCount : Int = 0; + + #if false + if(tryCount == 0) { + let nsmaDaumKeys : NSMutableArray? = watchTWUtil.getDaumServiceKeys(); + //if let nsmaDaumKeys : NSMutableArray = watchTWUtil.getDaumServiceKeys() { + let strFirstKey : String = nsmaDaumKeys!.object(at: 0) as! String + + if( (nsmaDaumKeys?.count == 0) || (strFirstKey == "0") ) { // 0, 1(Default)로 들어올때 처리 + print("[getAddressFromDaum] Keys of NSDefault is empty!!!"); + strDaumKey = String(format:"%s", watchTWReq.DAUM_SERVICE_KEY); + } else { + //shuffledDaumKeys = [[NSMutableArray alloc] init]; + shuffledDaumKeys = watchTWUtil.shuffleDatas(nsaDatas: nsmaDaumKeys!); + strDaumKey = String(format:"%s", shuffledDaumKeys[tryCount] as! CVarArg); + print("[getAddressFromDaum] shuffled first nssDaumKey : \(String(describing: strDaumKey))"); + } + // } else { + // print("222"); + // } + + } + else + { + if(tryCount >= shuffledDaumKeys.count) + { + print("We are used all keys. you have to ask more keys!!!"); + return; + } + + strDaumKey = String(format:"%s", shuffledDaumKeys[tryCount] as! CVarArg); + print("[getAddressFromDaum] tryCount:\(tryCount) shuffled next nssDaumKey : \(String(describing: strDaumKey))"); + } + #endif + + strDaumKey = watchTWReq.DAUM_SERVICE_KEY; + nextTryCount = tryCount + 1; + + // let strURL : String = String(format:"%s%s%s%s%f%s%f%s%s", watchTWReq.STR_DAUM_COORD2ADDR_URL, watchTWReq.STR_APIKEY, strDaumKey!, watchTWReq.STR_LONGITUDE, longitude, watchTWReq.STR_LATITUDE, latitude, watchTWReq.STR_INPUT_COORD, watchTWReq.STR_OUTPUT_JSON); + let strURL : String = watchTWReq.STR_DAUM_COORD2ADDR_URL + watchTWReq.STR_APIKEY + strDaumKey! + watchTWReq.STR_LONGITUDE + String(format:"%f",longitude) + watchTWReq.STR_LATITUDE + String(format:"%f",latitude) + watchTWReq.STR_INPUT_COORD + watchTWReq.STR_OUTPUT_JSON; + + print("url : \(strURL)"); + + let dictRetryData : NSDictionary = [ Float(latitude): "latitude", + Float(longitude) : "longitude", + Int(nextTryCount) : "tryCount" ]; + + requestAsyncByURLSessionForRetry(url:strURL, reqType:InterfaceController.TYPE_REQUEST.ADDR_DAUM, nsdData: dictRetryData); + } + + func getChangedColorAirStateForComp( strAirState : String) -> NSMutableAttributedString { + var String : NSMutableAttributedString = NSMutableAttributedString(string:strAirState); + var sRange : NSRange? = nil; + + var stateColor : UIColor? = nil; + var font = UIFont.boldSystemFont(ofSize : 11.0); + let nssAirState = strAirState as NSString; + + let strGood = NSLocalizedString("LOC_GOOD", comment:"좋음"); + let strModerate = NSLocalizedString("LOC_MODERATE", comment:"보통"); + let strSensitive = NSLocalizedString("LOC_UNHEALTHY_FOR_SENSITIVE_GROUPS", comment:"민감군주의"); + let strUnhealthy = NSLocalizedString("LOC_UNHEALTHY", comment:"나쁨"); + let strVeryUnhealty = NSLocalizedString("LOC_VERY_UNHEALTHY", comment:"매우나쁨"); + let strHaz = NSLocalizedString("LOC_HAZARDOUS", comment:"위험"); + + #if false + if(watch.is42 == true) { + print("watch size is 42mm!!! "); + font = UIFont.boldSystemFont(ofSize : 13.0); + } else { + print("watch size is 32mm!!! "); + } + #endif + + if(strAirState.hasSuffix(strGood)) + { + sRange = nssAirState.range(of:strGood); + //NSMakeRange(firstBraceIndex.startIndex, firstClosingBraceIndex.endIndex) + stateColor = UIColor.init(argb:0xff32a1ff); + } + else if(strAirState.hasSuffix(strModerate)) + { + sRange = nssAirState.range(of:strModerate); //원하는 텍스트라는 글자의 위치가져오기 + stateColor = UIColor.init(argb:0xff7acf16); + } + else if(strAirState.hasSuffix(strSensitive)) + { + sRange = nssAirState.range(of:strSensitive); //원하는 텍스트라는 글자의 위치가져오기 + stateColor = UIColor.init(argb:0xfffd934c); // 나쁨과 동일 + } + else if(strAirState.hasSuffix(strVeryUnhealty)) + { + sRange = nssAirState.range(of:strVeryUnhealty); //원하는 텍스트라는 글자의 위치가져오기 + stateColor = UIColor.init(argb:0xffff7070); + } + else if(strAirState.hasSuffix(strUnhealthy)) + { + sRange = nssAirState.range(of:strUnhealthy); //원하는 텍스트라는 글자의 위치가져오기 + stateColor = UIColor.init(argb:0xfffd934c); + } + else if(strAirState.hasSuffix(strHaz)) + { + sRange = nssAirState.range(of:strHaz); //원하는 텍스트라는 글자의 위치가져오기 + stateColor = UIColor.init(argb:0xffff7070); // 매우나쁨과 동일 + } + else + { + //sRange = Foundation.NSNotFound; + stateColor = UIColor.black; + + return String; + } + + // chagnge "●" + String = NSMutableAttributedString(string:"●"); + sRange = NSMakeRange(0, 0); + colorAirState = stateColor!; + + String.addAttribute(NSAttributedStringKey.foregroundColor, value:stateColor!, range:sRange!); //attString의 Range위치에 있는 "Nice"의 글자의 + + String.addAttribute(NSAttributedStringKey.font, value:font, range:sRange!); //attString의 Range위치에 있는 "Nice"의 글자의 + + return String; + + } + + func getAirStateForComp( _ currentArpltnDict : Dictionary ) -> String { + let khaiGrade : Int32 = (currentArpltnDict["khaiGrade"] as AnyObject).int32Value // 통합대기 + let pm10Grade : Int32 = (currentArpltnDict["pm10Grade"] as AnyObject).int32Value // 미세먼지 + let pm25Grade : Int32 = (currentArpltnDict["pm25Grade"] as AnyObject).int32Value // 초미세먼지 + + let khaiValue : Int32 = (currentArpltnDict["khaiValue"] as AnyObject).int32Value // 통합대기 + let pm10Value : Int32 = (currentArpltnDict["pm10Value"] as AnyObject).int32Value // 미세먼지 + let pm25Value : Int32 = (currentArpltnDict["pm25Value"] as AnyObject).int32Value // 초미세먼지 + + let strKhaiStr : String = currentArpltnDict["khaiStr"] as! String // 통합대기 + //let strPm10Str : String = currentArpltnDict["pm10Str"] as! String // 통합대기 + //let strPm25Str : String = currentArpltnDict["pm25Str"] as! String // 통합대기 + + var strResults : String; + + print("All air state is same!!! khaiGrade : \(khaiGrade), pm10Grade : \(pm10Grade), pm25Grade : \(pm25Grade)"); + + + // Grade가 동일하면 통합대기 값을 전달, 동일할때 우선순위 통합대기 > 미세먼지 > 초미세먼지 + if( (khaiGrade == pm10Grade) && (pm10Grade == pm25Grade) ) + { + if( (khaiGrade == 0) && (pm10Grade == 0) && (pm25Grade == 0) ) + { + print("All air state is zero !!!"); + } + else + { + strResults = "\(khaiValue)"; + return strResults; + } + } + else + { + if( (khaiGrade > pm10Grade) && (khaiGrade > pm25Grade) ) + { + strResults = "\(khaiValue)"; + return strResults; + } + else if ( (khaiGrade == pm10Grade) && (khaiGrade > pm25Grade) ) + { + strResults = "\(khaiValue)"; + return strResults; + } + else if ( (khaiGrade < pm10Grade) && (khaiGrade > pm25Grade) ) + { + strResults = "\(pm10Value)㎍"; + return strResults; + } + else if ( (khaiGrade > pm10Grade) && (khaiGrade == pm25Grade) ) + { + strResults = "\(khaiValue)"; + return strResults; + } + else if ( (khaiGrade < pm10Grade) && (khaiGrade == pm25Grade) ) + { + strResults = "\(pm10Value)㎍"; + return strResults; + } + else if ( (khaiGrade > pm10Grade) && (khaiGrade < pm25Grade) ) + { + strResults = "\(pm25Value)㎍"; + return strResults; + } + else if ( (khaiGrade == pm10Grade) && (khaiGrade < pm25Grade) ) + { + strResults = "\(pm25Value)㎍"; + return strResults; + } + else if ( (khaiGrade < pm10Grade) && (khaiGrade < pm25Grade) ) + { + if ( pm10Grade > pm25Grade) + { + strResults = "\(pm10Value)㎍"; + return strResults; + } + else if ( pm10Grade == pm25Grade) + { + strResults = "\(pm10Value)㎍"; + return strResults; + } + else if ( pm10Grade < pm25Grade) + { + strResults = "\(pm25Value)㎍"; + return strResults; + } + } + } + + if( (strKhaiStr == "") || (strKhaiStr == "(null)") ) { + strResults = ""; + } else { + strResults = "\(khaiValue)"; + } + + return strResults; + } + + func processWeatherResultsWithCompKR( jsonDict : Dictionary?) { + var todayDict : Dictionary; + + // Date + var strDateTime : String!; + //var strTime : String? = nil; + + // Image + //var strCurIcon : String? = nil; + var strCurImgName : String? = nil; + + + // Address + var strAddress : String? = nil; + + // Pop + var numberTodPop : NSNumber; + var todayPop : Int = 0; + + // current temperature + var numberT1h : NSNumber; + var numberTaMin : NSNumber; + var numberTaMax : NSNumber; + + if(jsonDict == nil) + { + print("jsonDict is nil!!!"); + return; + } + //print("processWeatherResultsWithShowMore : \(String(describing: jsonDict))"); + + //setCurJsonDict( dict : jsonDict! ) ; + + // Address + if let strRegionName : String = jsonDict?["regionName"] as? String { + print("strRegionName is \(strRegionName).") + strAddress = strRegionName; + } else { + print("That strRegionName is not in the jsonDict dictionary.") + } + + if let strCityName : String = jsonDict?["cityName"] as? String { + print("strCityName is \(strCityName).") + strAddress = strCityName; + } else { + print("That strCityName is not in the jsonDict dictionary.") + } + + if let strTownName : String = jsonDict?["townName"] as? String { + print("strTownName is \(strTownName).") + strAddress = strTownName; + } else { + print("That strTownName is not in the jsonDict dictionary.") + } + + // if address is current position... add this emoji + //목격자 + //유니코드: U+1F441 U+200D U+1F5E8, UTF-8: F0 9F 91 81 E2 80 8D F0 9F 97 A8 + + print("strAddress \(String(describing: strAddress)))") + strAddress = NSString(format: "👁‍🗨%@˚", strAddress!) as String + + let tempUnit : TEMP_UNIT? = watchTWUtil.getTemperatureUnit(); + //#if KKH + // Current + if let currentDict : Dictionary = jsonDict?["current"] as? Dictionary{ + //print("currentDict is \(currentDict).") + + if let strCurIcon : String = currentDict["skyIcon"] as? String { + //strCurImgName = "weatherIcon2-color/\(strCurIcon).png"; + strCurImgName = strCurIcon; + } else { + print("That strCurIcon is not in the jsonDict dictionary.") + } + + if let strTime : String = currentDict["time"] as? String { + let index = strTime.index(strTime.startIndex, offsetBy: 2) + //let strHour = strTime.substring(to:index); + let strHour = strTime[.. \(strTime)") + print("strHour => \(strHour)") + print("strMinute => \(strMinute)") + + } else { + print("That strTime is not in the jsonDict dictionary.") + strDateTime = ""; + } + print("strDateTime => \(strDateTime)") + + if let currentArpltnDict : Dictionary = currentDict["arpltn"] as? Dictionary { + strAirState = getAirStateForComp(currentArpltnDict); + + + //"LOC_GOOD" = "Good"; + //"LOC_MODERATE" = "Moderate"; + //"LOC_UNHEALTHY_FOR_SENSITIVE_GROUPS"= "Unhealthy for sensitive groups"; + //"LOC_UNHEALTHY" = "Unhealthy"; + //"LOC_VERY_UNHEALTHY" = "Very unhealthy"; + //"LOC_HAZARDOUS" = "Hazardous"; + + // Test (Good, Moderate, Unhealthy for sensitive groups, Unhealthy, Very unhealthy, Hazardous) + //strAirState = "AQI 78 Hazardous"; + attrStrAirState = getChangedColorAirStateForComp(strAirState:strAirState); + print("[processWeatherResultsWithCompKR] attrStrAirState : \(String(describing: attrStrAirState))"); + print("[processWeatherResultsWithCompKR] strAirState : \(String(describing: strAirState))"); + } else { + print("That currentArpltnDict is not in the jsonDict dictionary.") + } + + if (currentDict["t1h"] != nil) + { + numberT1h = currentDict["t1h"] as! NSNumber; + currentTemp = Float(numberT1h.doubleValue); + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) { + currentTemp = Float(watchTWUtil.convertFromCelsToFahr(cels: currentTemp)); + } + + print("[processWeatherResultsWithCompKR] currentTemp : \(currentTemp)"); + } + + } else { + print("That currentDict is not in the jsonDict dictionary.") + } + + //currentHum = [[currentDict valueForKey:@"reh"] intValue]; + + todayDict = watchTWUtil.getTodayDictionary(jsonDict: jsonDict!); + + // Today + if (todayDict["taMin"] != nil) { + numberTaMin = todayDict["taMin"] as! NSNumber; + todayMinTemp = Int(numberTaMin.intValue); + } else { + print("That idTaMin is not in the todayDict dictionary.") + } + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) + { + todayMinTemp = Int( watchTWUtil.convertFromCelsToFahr(cels: Float(todayMinTemp) ) ); + } + + if (todayDict["taMax"] != nil) { + numberTaMax = todayDict["taMax"] as! NSNumber; + todayMaxTemp = Int(numberTaMax.intValue); + } else { + print("That numberTaMax is not in the todayDict dictionary.") + } + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) + { + todayMaxTemp = Int(watchTWUtil.convertFromCelsToFahr(cels: Float(todayMaxTemp) )) ; + } + + if (todayDict["pop"] != nil) { + numberTodPop = todayDict["pop"] as! NSNumber; + todayPop = Int(numberTodPop.intValue); + } else { + print("That pop is not in the todayDict dictionary.") + } + + print("todayMinTemp: \(todayMinTemp), todayMaxTemp:\(todayMaxTemp)"); + print("todayPop: \(todayPop)"); + + #if false + DispatchQueue.global(qos: .background).async { + // Background Thread + + DispatchQueue.main.async { + + // Run UI Updates + if(strDateTime != nil) { + self.updateDateLabel.setText("\(strDateTime!)"); + } + + print("=======> date : \(strDateTime!)"); + + if( (strAddress == nil) || ( strAddress == "(null)" )) + { + self.addressLabel.setText(""); + } + else + { + self.addressLabel.setText("\(strAddress!)"); + } + + print("=======> strCurImgName : \(strCurImgName!)"); + + if(strCurImgName != nil) { + self.curWeatherImage.setImage ( UIImage(named:strCurImgName!) ); + } + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) { + self.curTempLabel.setText( NSString(format: "%d˚", currentTemp) as String ); + } else { + self.curTempLabel.setText( NSString(format: "%.01f˚", currentTemp) as String); + } + + + print("[processWeatherResultsWithCompKR] attrStrAirState2 : \(String(describing: attrStrAirState))"); + self.airAQILabel.setAttributedText( attrStrAirState ); + + self.minMaxLabel.setText(NSString(format: "%d˚/ %d˚", todayMinTemp, todayMaxTemp) as String ); + self.precLabel.setText(NSString(format: "%d%%", todayPop) as String ); + } + } + #endif + } + + + func processWeatherResultsAboutCompGlobal( jsonDict : Dictionary?) { + var currentDict : Dictionary; + //var currentArpltnDict : Dictionary; + var todayDict : Dictionary? = nil; + + // Date + var strDateTime : String!; + //var strTime : String? = nil; + + // Temperature + var tempUnit : TEMP_UNIT? = TEMP_UNIT.CELSIUS; + + // Dust + + var attrStrAirState : NSAttributedString = NSAttributedString(); + //NSMutableAttributedString *nsmasAirState = nil; + + // Pop + var numberTodPop : NSNumber; + + // Humid + var numberTodHumid : NSNumber; + var todayHumid = 0; + + if(jsonDict == nil) + { + print("jsonDict is nil!!!"); + return; + } + //print("processWeatherResultsWithShowMore : \(String(describing: jsonDict))"); + + //setCurJsonDict( dict : jsonDict! ) ; + + // Address + + //NSLog(@"mCurrentCityIdx : %d", mCurrentCityIdx); + + //NSMutableDictionary* nsdCurCity = [mCityDictList objectAtIndex:mCurrentCityIdx]; + //NSLog(@"[processWeatherResultsAboutGlobal] nsdCurCity : %@", nsdCurCity); + // Address + //nssAddress = [nsdCurCity objectForKey:@"name"]; + //nssCountry = [nsdCurCity objectForKey:@"country"]; + //if(nssCountry == nil) + //{ + // nssCountry = @"KR"; + //} + + //NSLog(@"[Global]nssAddress : %@, nssCountry : %@", nssAddress, nssCountry); + + // if address is current position... add this emoji + //목격자 + //유니코드: U+1F441 U+200D U+1F5E8, UTF-8: F0 9F 91 81 E2 80 8D F0 9F 97 A8 + + //print("strAddress \(String(describing: strAddress)))") + //strAddress = NSString(format: "👁‍🗨%@˚", strAddress!) as String + + strAddress = NSString(format: "뉴욕") as String; + // Current + if let thisTimeArr : NSArray = jsonDict?["thisTime"] as? NSArray { + + if(thisTimeArr.count == 2) { + currentDict = thisTimeArr[1] as! Dictionary; // Use second index; That is current weahter. + } else { + currentDict = thisTimeArr[0] as! Dictionary; // process about thisTime + } + print("bbbb") + if let strCurIcon : String = currentDict["skyIcon"] as? String { + //strCurImgName = "weatherIcon2-color/\(strCurIcon).png"; + print("ccccc") + strCurImgName = strCurIcon; + print("strCurImgName : \(strCurImgName)") + } else { + print("That strCurIcon is not in the jsonDict dictionary.") + } + print("ddddd") + tempUnit = watchTWUtil.getTemperatureUnit(); + + if let strTime : String = currentDict["date"] as? String { + let index = strTime.index(strTime.startIndex, offsetBy: 11) + let strHourMin = strTime[index...]; + strDateTime = NSLocalizedString("LOC_UPDATE", comment:"업데이트") + " " + strHourMin; + print("strTime => \(strHourMin)") + + todayDict = watchTWUtil.getTodayDictionaryInGlobal(jsonDict: jsonDict!, strTime:strTime); + if(todayDict != nil) { + if(tempUnit == TEMP_UNIT.FAHRENHEIT) + { + let idTaMin = todayDict!["tempMin_f"] as! NSNumber; + todayMinTemp = Int(truncating: idTaMin); + + let idTaMax = todayDict!["tempMax_f"] as! NSNumber; + todayMaxTemp = Int(truncating: idTaMax); + } + else + { + let idTaMin = todayDict!["tempMin_c"] as! NSNumber; + todayMinTemp = Int(truncating: idTaMin); + + let idTaMax = todayDict!["tempMax_c"] as! NSNumber; + todayMaxTemp = Int(truncating: idTaMax); + } + + // PROBABILITY_OF_PRECIPITATION + if (todayDict!["precProb"] != nil) { + numberTodPop = todayDict!["precProb"] as! NSNumber; + todayPop = Int(numberTodPop.intValue); + } else { + print("That precProb is not in the todayDict dictionary.") + } + + // HUMID + if (todayDict!["humid"] != nil) { + numberTodHumid = todayDict!["humid"] as! NSNumber; + todayHumid = Int(numberTodHumid.intValue); + } else { + print("That humid is not in the todayDict dictionary.") + } + + strAirState = NSLocalizedString("LOC_HUMIDITY", comment:"습도") + " \(todayHumid)% "; + } + } else { + print("That strTime is not in the jsonDict dictionary.") + let strHourMin = ""; + strDateTime = NSLocalizedString("LOC_UPDATE", comment:"업데이트") + " " + strHourMin; + } + print("strDateTime => \(strDateTime)") + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) + { + let idT1h = currentDict["temp_f"] as! NSNumber; + currentTemp = Float(Int(truncating: idT1h)); + } + else + { + let idT1h = currentDict["temp_c"] as! NSNumber; + currentTemp = Float(truncating: idT1h); + } + } + + print("todayMinTemp: \(todayMinTemp), todayMaxTemp:\(todayMaxTemp)"); + print("todayPop: \(todayPop)"); + print("=======> strCurImgName : \(strCurImgName)"); + + if let currentDict : Dictionary = jsonDict?["current"] as? Dictionary{ + //print("currentDict is \(currentDict).") + + if let currentArpltnDict : Dictionary = currentDict["arpltn"] as? Dictionary { + strAirState = watchTWSM.getAirState(currentArpltnDict); + + // Test + //nssAirState = [NSString stringWithFormat:@"통합대기 78 나쁨"]; + attrStrAirState = watchTWSM.getChangedColorAirState(strAirState:strAirState); + print("[processWeatherResultsAboutCompGlobal] attrStrAirState : \(String(describing: attrStrAirState))"); + print("[processWeatherResultsAboutCompGlobal] strAirState : \(String(describing: strAirState))"); + } else { + print("That currentArpltnDict is not in the jsonDict dictionary.") + } + } else { + print("That currentDict is not in the jsonDict dictionary.") + } + + #if KKH + if let currentDict : Dictionary = jsonDict?["current"] as? Dictionary{ + //print("currentDict is \(currentDict).") + + if let currentArpltnDict : Dictionary = currentDict["arpltn"] as? Dictionary { + strAirState = watchTWSM.getAirState(currentArpltnDict); + + // Test + //nssAirState = [NSString stringWithFormat:@"통합대기 78 나쁨"]; + attrStrAirState = watchTWSM.getChangedColorAirState(strAirState:strAirState); + print("[processWeatherResultsWithShowMore] attrStrAirState : \(String(describing: attrStrAirState))"); + print("[processWeatherResultsWithShowMore] strAirState : \(String(describing: strAirState))"); + } else { + print("That currentArpltnDict is not in the jsonDict dictionary.") + } + } else { + print("That currentDict is not in the jsonDict dictionary.") + } + + + if(strDateTime != nil) { + self.updateDateLabel.setText("\(strDateTime!)"); + } + + print("=======> date : \(strDateTime!)"); + + if( (strAddress == nil) || ( strAddress == "(null)" )) + { + self.addressLabel.setText(""); + } + else + { + self.addressLabel.setText("\(strAddress!)"); + } + + print("=======> strCurImgName : \(strCurImgName!)"); + strCurImgName = "MoonBigCloudRainLightning"; + if(strCurImgName != nil) { + self.curWeatherImage.setImage ( UIImage(named:"Moon"/*strCurImgName!*/) ); + print("111=======> strCurImgName : \(strCurImgName!)"); + } + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) { + self.curTempLabel.setText( NSString(format: "%d˚", currentTemp) as String ); + } else { + self.curTempLabel.setText( NSString(format: "%.01f˚", currentTemp) as String); + } + + + #if KKH + print("[processWeatherResultsWithShowMore] attrStrAirState2 : \(String(describing: attrStrAirState))"); + self.airAQILabel.setAttributedText( attrStrAirState ); + #endif + + self.minMaxLabel.setText(NSString(format: "%d˚/ %d˚", todayMinTemp, todayMaxTemp) as String ); + self.precLabel.setText(NSString(format: "%d%%", todayPop) as String ); + self.airAQILabel.setText(strAirState); + + #endif + + } + + func refreshComplications() { + let server : CLKComplicationServer = CLKComplicationServer.sharedInstance(); + print("refreshComplications"); + for(complication) in server.activeComplications! { + print("\(complication)"); + server.reloadTimeline(for: complication) + } + } + + //internal func getNextRequestedUpdateDate ( handler : @ escaping ( Date?) -> Void ) { + // handler ( Date ( timeIntervalSinceNow : TimeInterval ( 10 * 60 ))) + //} + + // MARK: - Placeholder Templates + + func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) { + // This method will be called once per supported complication, and the results will be cached + if complication . family == . utilitarianSmall { + let template = CLKComplicationTemplateUtilitarianSmallRingText () + template . textProvider = CLKSimpleTextProvider ( text : "3" ) + template . fillFraction = self.dayFraction + handler ( template ) + } else { + handler ( nil ) + } + } + + var dayFraction : Float { + let retVal : Float + let now = Date () + let calendar = Calendar.current + //let componentFlags = Set ([.year, .month , .day , .WEEKOFYEAR, .hour, .minute ,.second ,.weekday, .weekdayOrdinal]) + let componentFlags = Set([.year, .month, .day, .weekOfYear, .hour, .minute, .second, .weekday, .weekdayOrdinal]) + var components = calendar . dateComponents (componentFlags , from : now ) + components . hour = 0 + components . minute = 0 + components . second = 0 + let startOfDay = calendar . date ( from : components ) + + retVal = Float( now . timeIntervalSince ( startOfDay! )) / Float( 24 * 60 * 60 ) + return retVal + } + + #if KKH + func getSupportedTimeTravelDirectionsForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimeTravelDirections) -> Void) { + //handler([CLKComplicationTimeTravelDirections.None]) + handler([]) + } + + func getTimelineEntriesForComplication(complication: CLKComplication, beforeDate date: NSDate, limit: Int, withHandler handler: ([CLKComplicationTimelineEntry]?) -> Void) { + handler(nil) + } + + func getTimelineEntriesForComplication(complication: CLKComplication, afterDate date: NSDate, limit: Int, withHandler handler: ([CLKComplicationTimelineEntry]?) -> Void) { + handler([]) + } + + func getTimelineStartDateForComplication(complication: CLKComplication, withHandler handler: (NSDate?) -> Void) { + handler(NSDate()) + } + + func getTimelineEndDateForComplication(complication: CLKComplication, withHandler handler: (NSDate?) -> Void) { + handler(NSDate()) + } + + func getPrivacyBehaviorForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationPrivacyBehavior) -> Void) { + handler(CLKComplicationPrivacyBehavior.showOnLockScreen) + } + + #endif +} + + diff --git a/ios/watch Extension/WatchTWeatherDraw.swift b/ios/watch Extension/WatchTWeatherDraw.swift new file mode 100644 index 000000000..9139f5c5c --- /dev/null +++ b/ios/watch Extension/WatchTWeatherDraw.swift @@ -0,0 +1,515 @@ +// +// WatchTWeatherDraw.swift +// watch Extension +// +// Created by KwangHo Kim on 2017. 11. 6.. +// + +import WatchKit +import WatchConnectivity +import Foundation + +//let watchTWUtil = WatchTWeatherUtil(); + +class WatchTWeatherDraw : WKInterfaceController{ + + // @IBOutlet var updateDateLabel: WKInterfaceLabel! + // @IBOutlet var currentPosImage: WKInterfaceImage! + // @IBOutlet var addressLabel: WKInterfaceLabel! + // @IBOutlet var curWeatherImage: WKInterfaceImage! + // + // @IBOutlet var curTempLabel: WKInterfaceLabel! + // @IBOutlet var minMaxLabel: WKInterfaceLabel! + // + // @IBOutlet var precLabel: WKInterfaceLabel! + // @IBOutlet var airAQILabel: WKInterfaceLabel! + + var curJsonDict : Dictionary? = nil; + + // Singleton + + static let sharedInstance : WatchTWeatherDraw = { + let instance = WatchTWeatherDraw() + //setup code + return instance + }() + + #if false + struct StaticInstance { + static var instance: WatchTWeatherDraw? + } + + class func sharedInstance() -> WatchTWeatherDraw { + if !(StaticInstance.instance != nil) { + StaticInstance.instance = WatchTWeatherDraw() + } + return StaticInstance.instance! + } + #endif + + // let watchTWUtil = WatchTWeatherUtil.sharedInstance(); + // let watchTWReq = WatchTWeatherRequest.sharedInstance(); + // let watchTWSM = WatchTWeatherShowMore.sharedInstance(); + + #if false + func processWeatherResultsWithShowMore( jsonDict : Dictionary?) { + + + + //var currentDict : Dictionary; + //var currentArpltnDict : Dictionary; + var todayDict : Dictionary; + + // Date + var strDateTime : String!; + //var strTime : String? = nil; + + // Image + //var strCurIcon : String? = nil; + var strCurImgName : String? = nil; + + // Temperature + var currentTemp : Float = 0; + var todayMinTemp : Int = 0; + var todayMaxTemp : Int = 0; + + // Dust + var strAirState : String = ""; + var attrStrAirState : NSAttributedString = NSAttributedString(); + //NSMutableAttributedString *nsmasAirState = nil; + + // Address + var strAddress : String? = nil; + + // Pop + var numberTodPop : NSNumber; + var todayPop : Int = 0; + + // current temperature + var numberT1h : NSNumber; + var numberTaMin : NSNumber; + var numberTaMax : NSNumber; + + if(jsonDict == nil) + { + print("jsonDict is nil!!!"); + return; + } + //print("processWeatherResultsWithShowMore : \(String(describing: jsonDict))"); + + setCurJsonDict( dict : jsonDict! ) ; + + // Address + if let strRegionName : String = jsonDict?["regionName"] as? String { + print("strRegionName is \(strRegionName).") + strAddress = strRegionName; + } else { + print("That strRegionName is not in the jsonDict dictionary.") + } + + if let strCityName : String = jsonDict?["cityName"] as? String { + print("strCityName is \(strCityName).") + strAddress = strCityName; + } else { + print("That strCityName is not in the jsonDict dictionary.") + } + + if let strTownName : String = jsonDict?["townName"] as? String { + print("strTownName is \(strTownName).") + strAddress = strTownName; + } else { + print("That strTownName is not in the jsonDict dictionary.") + } + + // if address is current position... add this emoji + //목격자 + //유니코드: U+1F441 U+200D U+1F5E8, UTF-8: F0 9F 91 81 E2 80 8D F0 9F 97 A8 + + print("strAddress \(String(describing: strAddress)))") + strAddress = NSString(format: "👁‍🗨%@˚", strAddress!) as String + + let tempUnit : TEMP_UNIT? = watchTWUtil.getTemperatureUnit(); + //#if KKH + // Current + if let currentDict : Dictionary = jsonDict?["current"] as? Dictionary{ + //print("currentDict is \(currentDict).") + + if let strCurIcon : String = currentDict["skyIcon"] as? String { + //strCurImgName = "weatherIcon2-color/\(strCurIcon).png"; + strCurImgName = strCurIcon; + } else { + print("That strCurIcon is not in the jsonDict dictionary.") + } + + if let strTime : String = currentDict["time"] as? String { + let index = strTime.index(strTime.startIndex, offsetBy: 2) + //let strHour = strTime.substring(to:index); + let strHour = strTime[.. \(strTime)") + print("strHour => \(strHour)") + print("strMinute => \(strMinute)") + + } else { + print("That strTime is not in the jsonDict dictionary.") + strDateTime = ""; + } + print("strDateTime => \(strDateTime)") + + if let currentArpltnDict : Dictionary = currentDict["arpltn"] as? Dictionary { + strAirState = watchTWSM.getAirState(currentArpltnDict); + + // Test + //nssAirState = [NSString stringWithFormat:@"통합대기 78 나쁨"]; + attrStrAirState = watchTWSM.getChangedColorAirState(strAirState:strAirState); + print("[processWeatherResultsWithShowMore] attrStrAirState : \(String(describing: attrStrAirState))"); + print("[processWeatherResultsWithShowMore] strAirState : \(String(describing: strAirState))"); + } else { + print("That currentArpltnDict is not in the jsonDict dictionary.") + } + + if (currentDict["t1h"] != nil) + { + numberT1h = currentDict["t1h"] as! NSNumber; + currentTemp = Float(numberT1h.doubleValue); + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) { + currentTemp = Float(watchTWUtil.convertFromCelsToFahr(cels: currentTemp)); + } + } + + } else { + print("That currentDict is not in the jsonDict dictionary.") + } + + //currentHum = [[currentDict valueForKey:@"reh"] intValue]; + + todayDict = watchTWUtil.getTodayDictionary(jsonDict: jsonDict!); + + // Today + if (todayDict["taMin"] != nil) { + numberTaMin = todayDict["taMin"] as! NSNumber; + todayMinTemp = Int(numberTaMin.intValue); + } else { + print("That idTaMin is not in the todayDict dictionary.") + } + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) + { + todayMinTemp = Int( watchTWUtil.convertFromCelsToFahr(cels: Float(todayMinTemp) ) ); + } + + if (todayDict["taMax"] != nil) { + numberTaMax = todayDict["taMax"] as! NSNumber; + todayMaxTemp = Int(numberTaMax.intValue); + } else { + print("That numberTaMax is not in the todayDict dictionary.") + } + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) + { + todayMaxTemp = Int(watchTWUtil.convertFromCelsToFahr(cels: Float(todayMaxTemp) )) ; + } + + if (todayDict["pop"] != nil) { + numberTodPop = todayDict["pop"] as! NSNumber; + todayPop = Int(numberTodPop.intValue); + } else { + print("That pop is not in the todayDict dictionary.") + } + + print("todayMinTemp: \(todayMinTemp), todayMaxTemp:\(todayMaxTemp)"); + print("todayPop: \(todayPop)"); + + DispatchQueue.global(qos: .background).async { + // Background Thread + + DispatchQueue.main.async { + + // Run UI Updates + if(strDateTime != nil) { + self.updateDateLabel.setText("\(strDateTime!)"); + } + + print("=======> date : \(strDateTime!)"); + + if( (strAddress == nil) || ( strAddress == "(null)" )) + { + self.addressLabel.setText(""); + } + else + { + self.addressLabel.setText("\(strAddress!)"); + } + + print("=======> strCurImgName : \(strCurImgName!)"); + + if(strCurImgName != nil) { + self.curWeatherImage.setImage ( UIImage(named:strCurImgName!) ); + } + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) { + self.curTempLabel.setText( NSString(format: "%d˚", currentTemp) as String ); + } else { + self.curTempLabel.setText( NSString(format: "%.01f˚", currentTemp) as String); + } + + + print("[processWeatherResultsWithShowMore] attrStrAirState2 : \(String(describing: attrStrAirState))"); + self.airAQILabel.setAttributedText( attrStrAirState ); + + self.minMaxLabel.setText(NSString(format: "%d˚/ %d˚", todayMinTemp, todayMaxTemp) as String ); + self.precLabel.setText(NSString(format: "%d%%", todayPop) as String ); + + + + //locationView.hidden = false; + } + } + //#endif + + // Draw ShowMore + //[todayWSM processDailyData:jsonDict type:TYPE_REQUEST_WEATHER_KR]; + } + + func processWeatherResultsAboutGlobal( jsonDict : Dictionary?) { + let watchTWSM = WatchTWeatherShowMore(); + + var currentDict : Dictionary; + //var currentArpltnDict : Dictionary; + var todayDict : Dictionary? = nil; + + // Date + var strDateTime : String!; + //var strTime : String? = nil; + + // Image + //var strCurIcon : String? = nil; + var strCurImgName : String? = nil; + + // Temperature + var tempUnit : TEMP_UNIT? = TEMP_UNIT.CELSIUS; + var currentTemp : Float = 0; + var todayMinTemp : Int = 0; + var todayMaxTemp : Int = 0; + + // Dust + var strAirState : String = ""; + var attrStrAirState : NSAttributedString = NSAttributedString(); + //NSMutableAttributedString *nsmasAirState = nil; + + // Address + var strAddress : String? = nil; + + // Pop + var numberTodPop : NSNumber; + var todayPop : Int = 0; + + // Humid + var numberTodHumid : NSNumber; + var todayHumid = 0; + + if(jsonDict == nil) + { + print("jsonDict is nil!!!"); + return; + } + //print("processWeatherResultsWithShowMore : \(String(describing: jsonDict))"); + + setCurJsonDict( dict : jsonDict! ) ; + + // Address + + //NSLog(@"mCurrentCityIdx : %d", mCurrentCityIdx); + + //NSMutableDictionary* nsdCurCity = [mCityDictList objectAtIndex:mCurrentCityIdx]; + //NSLog(@"[processWeatherResultsAboutGlobal] nsdCurCity : %@", nsdCurCity); + // Address + //nssAddress = [nsdCurCity objectForKey:@"name"]; + //nssCountry = [nsdCurCity objectForKey:@"country"]; + //if(nssCountry == nil) + //{ + // nssCountry = @"KR"; + //} + + //NSLog(@"[Global]nssAddress : %@, nssCountry : %@", nssAddress, nssCountry); + + // if address is current position... add this emoji + //목격자 + //유니코드: U+1F441 U+200D U+1F5E8, UTF-8: F0 9F 91 81 E2 80 8D F0 9F 97 A8 + + //print("strAddress \(String(describing: strAddress)))") + //strAddress = NSString(format: "👁‍🗨%@˚", strAddress!) as String + + strAddress = NSString(format: "뉴욕") as String; + + // Current + if let thisTimeArr : NSArray = jsonDict?["thisTime"] as? NSArray { + + if(thisTimeArr.count == 2) { + currentDict = thisTimeArr[1] as! Dictionary; // Use second index; That is current weahter. + } else { + currentDict = thisTimeArr[0] as! Dictionary; // process about thisTime + } + + if let strCurIcon : String = currentDict["skyIcon"] as? String { + //strCurImgName = "weatherIcon2-color/\(strCurIcon).png"; + strCurImgName = strCurIcon; + } else { + print("That strCurIcon is not in the jsonDict dictionary.") + } + + tempUnit = watchTWUtil.getTemperatureUnit(); + + if let strTime : String = currentDict["date"] as? String { + let index = strTime.index(strTime.startIndex, offsetBy: 11) + let strHourMin = strTime[index...]; + strDateTime = NSLocalizedString("LOC_UPDATE", comment:"업데이트") + " " + strHourMin; + print("strTime => \(strHourMin)") + + todayDict = watchTWUtil.getTodayDictionaryInGlobal(jsonDict: jsonDict!, strTime:strTime); + if(todayDict != nil) { + if(tempUnit == TEMP_UNIT.FAHRENHEIT) + { + let idTaMin = todayDict!["tempMin_f"] as! NSNumber; + todayMinTemp = Int(truncating: idTaMin); + + let idTaMax = todayDict!["tempMax_f"] as! NSNumber; + todayMaxTemp = Int(truncating: idTaMax); + } + else + { + let idTaMin = todayDict!["tempMin_c"] as! NSNumber; + todayMinTemp = Int(truncating: idTaMin); + + let idTaMax = todayDict!["tempMax_c"] as! NSNumber; + todayMaxTemp = Int(truncating: idTaMax); + } + + // PROBABILITY_OF_PRECIPITATION + if (todayDict!["precProb"] != nil) { + numberTodPop = todayDict!["precProb"] as! NSNumber; + todayPop = Int(numberTodPop.intValue); + } else { + print("That precProb is not in the todayDict dictionary.") + } + + // HUMID + if (todayDict!["humid"] != nil) { + numberTodHumid = todayDict!["humid"] as! NSNumber; + todayHumid = Int(numberTodHumid.intValue); + } else { + print("That humid is not in the todayDict dictionary.") + } + + strAirState = NSLocalizedString("LOC_HUMIDITY", comment:"습도") + " \(todayHumid)% "; + } + } else { + print("That strTime is not in the jsonDict dictionary.") + let strHourMin = ""; + strDateTime = NSLocalizedString("LOC_UPDATE", comment:"업데이트") + " " + strHourMin; + } + print("strDateTime => \(strDateTime)") + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) + { + let idT1h = currentDict["temp_f"] as! NSNumber; + currentTemp = Float(Int(truncating: idT1h)); + } + else + { + let idT1h = currentDict["temp_c"] as! NSNumber; + currentTemp = Float(truncating: idT1h); + } + } + + print("todayMinTemp: \(todayMinTemp), todayMaxTemp:\(todayMaxTemp)"); + print("todayPop: \(todayPop)"); + + #if KKH + if let currentDict : Dictionary = jsonDict?["current"] as? Dictionary{ + //print("currentDict is \(currentDict).") + + if let currentArpltnDict : Dictionary = currentDict["arpltn"] as? Dictionary { + strAirState = watchTWSM.getAirState(currentArpltnDict); + + // Test + //nssAirState = [NSString stringWithFormat:@"통합대기 78 나쁨"]; + attrStrAirState = watchTWSM.getChangedColorAirState(strAirState:strAirState); + print("[processWeatherResultsWithShowMore] attrStrAirState : \(String(describing: attrStrAirState))"); + print("[processWeatherResultsWithShowMore] strAirState : \(String(describing: strAirState))"); + } else { + print("That currentArpltnDict is not in the jsonDict dictionary.") + } + } else { + print("That currentDict is not in the jsonDict dictionary.") + } + #endif + + DispatchQueue.global(qos: .background).async { + // Background Thread + + DispatchQueue.main.async { + + // Run UI Updates + if(strDateTime != nil) { + self.updateDateLabel.setText("\(strDateTime!)"); + } + + print("=======> date : \(strDateTime!)"); + + if( (strAddress == nil) || ( strAddress == "(null)" )) + { + self.addressLabel.setText(""); + } + else + { + self.addressLabel.setText("\(strAddress!)"); + } + + print("=======> strCurImgName : \(strCurImgName!)"); + strCurImgName = "MoonBigCloudRainLightning"; + if(strCurImgName != nil) { + self.curWeatherImage.setImage ( UIImage(named:"Moon"/*strCurImgName!*/) ); + print("111=======> strCurImgName : \(strCurImgName!)"); + } + + if(tempUnit == TEMP_UNIT.FAHRENHEIT) { + self.curTempLabel.setText( NSString(format: "%d˚", currentTemp) as String ); + } else { + self.curTempLabel.setText( NSString(format: "%.01f˚", currentTemp) as String); + } + + + #if KKH + print("[processWeatherResultsWithShowMore] attrStrAirState2 : \(String(describing: attrStrAirState))"); + self.airAQILabel.setAttributedText( attrStrAirState ); + #endif + + self.minMaxLabel.setText(NSString(format: "%d˚/ %d˚", todayMinTemp, todayMaxTemp) as String ); + self.precLabel.setText(NSString(format: "%d%%", todayPop) as String ); + self.airAQILabel.setText(strAirState); + + //locationView.hidden = false; + } + } + //#endif + + // Draw ShowMore + //[todayWSM processDailyData:jsonDict type:TYPE_REQUEST_WEATHER_KR]; + } + #endif + + func setCurJsonDict( dict : Dictionary ) { + if(curJsonDict == nil) { + curJsonDict = [String : String] () + } else { + curJsonDict = dict; + } + } + +} + diff --git a/ios/watch Extension/WatchTWeatherRequest.swift b/ios/watch Extension/WatchTWeatherRequest.swift new file mode 100644 index 000000000..892f1973d --- /dev/null +++ b/ios/watch Extension/WatchTWeatherRequest.swift @@ -0,0 +1,242 @@ +// +// WatchTWeatherRequest.swift +// watch Extension +// +// Created by KwangHo Kim on 2017. 11. 6.. +// + +import Foundation + +class WatchTWeatherRequest { + + let TODAYWEATHER_URL : String! = "https://todayweather.wizardfactory.net" + + let STR_DAUM_COORD2ADDR_URL : String! = "https://apis.daum.net/local/geo/coord2addr" + let STR_GOOGLE_COORD2ADDR_URL : String! = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" + let STR_GOOGLE_ADDR2COORD_URL : String! = "https://maps.googleapis.com/maps/api/geocode/json?address=" + let STR_APIKEY : String! = "?apikey=" + let STR_LONGITUDE : String! = "&longitude=" + let STR_LATITUDE : String! = "&latitude=" + let STR_INPUT_COORD : String! = "&inputCoordSystem=WGS84" + let STR_OUTPUT_JSON : String! = "&output=json" + let API_JUST_TOWN : String! = "v000803/town" + let WORLD_API_URL : String! = "ww/010000/current/2?gcode=" + + let DAUM_SERVICE_KEY : String! = "6d0116e2c49361cb75eaf12f665e6360" + + #if false + enum TYPE_REQUEST { + case NONE + case ADDR_DAUM + case ADDR_GOOGLE + case GEO_GOOGLE + case WEATHER_KR + case WEATHER_GLOBAL + case WATCH_COMPLICATION + case MAX + } + static let sharedInstance : WatchTWeatherRequest = { + let instance = WatchTWeatherRequest() + //setup code + return instance + }() + + #endif + //let watchTWUtil = WatchTWeatherUtil(); + + + struct StaticInstance { + static var instance: WatchTWeatherRequest? + } + + class func sharedInstance() -> WatchTWeatherRequest { + if !(StaticInstance.instance != nil) { + StaticInstance.instance = WatchTWeatherRequest() + } + return StaticInstance.instance! + } + + + // let watchTWUtil = WatchTWeatherUtil.sharedInstance(); + // let watchTWSM = WatchTWeatherShowMore.sharedInstance(); + // let watchTWDraw = WatchTWeatherDraw.sharedInstance(); + + + func makeGlobalRequestURL(locDict : NSDictionary) -> String? { + var strURL : String? = nil; + var strLong : String? = nil; + var strLat : String? = nil; + var strProcessedLat : String? = nil; + var strProcessedLong : String? = nil; + var nsnLat : NSNumber; + var nsnLong : NSNumber; + + if (locDict["lat"] != nil) { + nsnLat = locDict["lat"] as! NSNumber; + strLat = NSString(format: "%@", nsnLat) as String + //todayMaxTemp = Int(numberTaMax.intValue); + print("[makeGlobalRequestURL] strLat : \(String(describing: strLat))"); + } else { + print("That nsnLat is not in the todayDict dictionary.") + } + + var arrLat : Array? = strLat?.components(separatedBy: "."); + var strLatTmp : String? = arrLat?[1]; + print("[makeGlobalRequestURL] nssLatTmp : \(String(describing: strLatTmp))"); + + if (locDict["long"] != nil) { + + nsnLong = locDict["long"] as! NSNumber; + strLong = NSString(format: "%@", nsnLong) as String + //todayMaxTemp = Int(numberTaMax.intValue); + print("(1)[makeGlobalRequestURL] strLong : \(String(describing: strLong))"); + } else { + print("(1)That strLong is not in the todayDict dictionary.") + } + + if(strLong == nil || strLong == "(null)") + { + if (locDict["lng"] != nil) { + nsnLong = locDict["lng"] as! NSNumber; + strLong = NSString(format: "%@", nsnLong) as String + //todayMaxTemp = Int(numberTaMax.intValue); + print("(2)[makeGlobalRequestURL] strLong : \(String(describing: strLong))"); + } else { + print("(2)That strLong is not in the todayDict dictionary.") + } + } + + print("strLat : \(String(describing: strLat))"); + print("strLong : \(String(describing: strLong))"); + + if( strLatTmp?.characters.count != 2) + { + strProcessedLat = watchTWUtil.processLocationStr(strSrcStr: strLat); + strProcessedLong = watchTWUtil.processLocationStr(strSrcStr: strLong); + } + else + { + strProcessedLat = strLat; + strProcessedLong = strLong; + } + + // Ex: https://todayweather.wizardfactory.net/ww/010000/current/2?gcode=40.71,-74.00 + //strURL = NSString(format: "%@/%@%@,%@", TODAYWEATHER_URL, WORLD_API_URL, strProcessedLat!, strProcessedLong!) as String; + //strURL = NSString(format: "%s/%s%s,%s", TODAYWEATHER_URL, WORLD_API_URL, strProcessedLat!, strProcessedLong!) as String; + strURL = TODAYWEATHER_URL + "/" + WORLD_API_URL + strProcessedLat! + "," + strProcessedLong!; + + if(strURL == nil) + { + print("nssURL is nil!!!"); + return nil; + } + + return strURL; + } + + func makeRequestURL(addr1 : String?, addr2 : String?, addr3 : String?, country : String ) -> String { + var URL : String = watchTWReq.TODAYWEATHER_URL + "/" + watchTWReq.API_JUST_TOWN; + let set : CharacterSet = CharacterSet.urlQueryAllowed; + + if (addr1 != nil) { + URL = URL + "/" + addr1!; + } + if (addr2 != nil) { + URL = URL + "/" + addr2!; + } + if (addr3 != nil) { + URL = URL + "/" + addr3!; + } + + #if USE_DEBUG + print("before URL => \(URL)"); + #endif + + URL = URL.addingPercentEncoding(withAllowedCharacters: set)!; + #if USE_DEBUG + print("after URL => \(URL)"); + #endif + + return URL; + } + + + + #if false + func requestAsyncByURLSession( url : String, reqType : TYPE_REQUEST) { + print("[requestAsyncByURLSession] url : \(url)"); + let strURL : URL! = URL(string: url); + + print("[requestAsyncByURLSession] url : \(strURL), request type : \(reqType)"); + + var request = URLRequest.init(url: strURL); + + if( reqType == TYPE_REQUEST.WEATHER_KR) { + request.setValue("ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3", forHTTPHeaderField: "Accept-Language"); + } + + let task = URLSession.shared.dataTask(with: request, completionHandler: {(data, response, error) -> Void in + if let data = data { + // Do stuff with the data + //print("data : \(data)"); + self.makeJSON( with : data, type : reqType); + } else { + print("Failed to fetch \(strURL) : \(String(describing: error))"); + } + }) + + task.resume(); + } + + + func makeJSON( with jsonData : Data, type reqType : TYPE_REQUEST) { + do { + guard let parsedResult = try JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) as? NSDictionary else { + return + } + //print("Parsed Result: \(parsedResult)") + + if(reqType == TYPE_REQUEST.ADDR_DAUM) + { + //[self parseKRAddress:jsonDict]; + } + else if(reqType == TYPE_REQUEST.ADDR_GOOGLE) + { + //[self parseGlobalAddress:jsonDict]; + } + else if(reqType == TYPE_REQUEST.GEO_GOOGLE) + { + //[self parseGlobalGeocode:jsonDict]; + } + else if(reqType == TYPE_REQUEST.WEATHER_KR) + { + //watchTWDraw = WatchTWeatherDraw.sharedInstance(); + print("reqType == TYPE_REQUEST.WEATHER_KR"); + //[self saveWeatherInfo:jsonDict]; + //sharedInterCont.processWeatherResultsWithShowMore(jsonDict: parsedResult as? Dictionary) + //let interCont = InterfaceController(); + sharedInterCont.processWeatherResultsWithShowMore(jsonDict: parsedResult as? Dictionary) + //[self processRequestIndicator:TRUE]; + } + else if(reqType == TYPE_REQUEST.WEATHER_GLOBAL) + { + //watchTWDraw = WatchTWeatherDraw.sharedInstance(); + print("reqType == WEATHER_GLOBAL"); + //[self saveWeatherInfo:jsonDict]; + + sharedInterCont.processWeatherResultsAboutGlobal(jsonDict: parsedResult as? Dictionary) + //[self processRequestIndicator:TRUE]; + } + else if(reqType == TYPE_REQUEST.WATCH_COMPLICATION) + { + print("reqType == WATCH_COMPLICATION"); + } + + } catch { + print("Error: \(error.localizedDescription)") + } + } + #endif + +} + diff --git a/ios/watch Extension/WatchTWeatherShowMore.swift b/ios/watch Extension/WatchTWeatherShowMore.swift new file mode 100644 index 000000000..a2ef47ee9 --- /dev/null +++ b/ios/watch Extension/WatchTWeatherShowMore.swift @@ -0,0 +1,235 @@ +// +// WatchTWeatherShowMore.swift +// TodayWeather +// +// Created by KwangHo Kim on 2017. 7. 18.. +// +// + +import Foundation +import UIKit +import WatchKit +import WatchConnectivity + +extension UIColor { + + convenience init(argb: UInt) { + self.init( + red: CGFloat((argb & 0xFF0000) >> 16) / 255.0, + green: CGFloat((argb & 0x00FF00) >> 8) / 255.0, + blue: CGFloat(argb & 0x0000FF) / 255.0, + alpha: CGFloat((argb & 0xFF000000) >> 24) / 255.0 + ) + } +} + +class WatchTWeatherShowMore { + + // Singleton + #if false + static let sharedInstance : WatchTWeatherShowMore = { + let instance = WatchTWeatherShowMore() + //setup code + return instance + }() + #endif + struct StaticInstance { + static var instance: WatchTWeatherShowMore? + } + + class func sharedInstance() -> WatchTWeatherShowMore { + if !(StaticInstance.instance != nil) { + StaticInstance.instance = WatchTWeatherShowMore() + } + return StaticInstance.instance! + } + + + // let watchTWUtil = WatchTWeatherUtil.sharedInstance(); + // let watchTWReq = WatchTWeatherRequest.sharedInstance(); + // let watchTWDraw = WatchTWeatherDraw.sharedInstance(); + + func getAirState( _ currentArpltnDict : Dictionary ) -> String { + let khaiGrade : Int32 = (currentArpltnDict["khaiGrade"] as AnyObject).int32Value // 통합대기 + let pm10Grade : Int32 = (currentArpltnDict["pm10Grade"] as AnyObject).int32Value // 미세먼지 + let pm25Grade : Int32 = (currentArpltnDict["pm25Grade"] as AnyObject).int32Value // 초미세먼지 + + let khaiValue : Int32 = (currentArpltnDict["khaiValue"] as AnyObject).int32Value // 통합대기 + let pm10Value : Int32 = (currentArpltnDict["pm10Value"] as AnyObject).int32Value // 미세먼지 + let pm25Value : Int32 = (currentArpltnDict["pm25Value"] as AnyObject).int32Value // 초미세먼지 + + let strKhaiStr : String = currentArpltnDict["khaiStr"] as! String // 통합대기 + let strPm10Str : String = currentArpltnDict["pm10Str"] as! String // 통합대기 + let strPm25Str : String = currentArpltnDict["pm25Str"] as! String // 통합대기 + + var strResults : String; + + print("All air state is same!!! khaiGrade : \(khaiGrade), pm10Grade : \(pm10Grade), pm25Grade : \(pm25Grade)"); + + + // Grade가 동일하면 통합대기 값을 전달, 동일할때 우선순위 통합대기 > 미세먼지 > 초미세먼지 + if( (khaiGrade == pm10Grade) && (pm10Grade == pm25Grade) ) + { + if( (khaiGrade == 0) && (pm10Grade == 0) && (pm25Grade == 0) ) + { + print("All air state is zero !!!"); + } + else + { + strResults = NSLocalizedString("LOC_AQI", comment:"통합대기") + " \(khaiValue) " + strKhaiStr; + return strResults; + } + } + else + { + if( (khaiGrade > pm10Grade) && (khaiGrade > pm25Grade) ) + { + strResults = NSLocalizedString("LOC_AQI", comment:"통합대기") + " \(khaiValue) " + strKhaiStr; + return strResults; + } + else if ( (khaiGrade == pm10Grade) && (khaiGrade > pm25Grade) ) + { + strResults = NSLocalizedString("LOC_AQI", comment:"통합대기") + " \(khaiValue) " + strKhaiStr; + return strResults; + } + else if ( (khaiGrade < pm10Grade) && (khaiGrade > pm25Grade) ) + { + strResults = NSLocalizedString("LOC_PM10", comment:"미세먼지") + " \(pm10Value) " + strPm10Str; + return strResults; + } + else if ( (khaiGrade > pm10Grade) && (khaiGrade == pm25Grade) ) + { + strResults = NSLocalizedString("LOC_AQI", comment:"통합대기") + " \(khaiValue) " + strKhaiStr; + return strResults; + } + else if ( (khaiGrade < pm10Grade) && (khaiGrade == pm25Grade) ) + { + strResults = NSLocalizedString("LOC_PM10", comment:"미세먼지") + " \(pm10Value) " + strPm10Str; + return strResults; + } + else if ( (khaiGrade > pm10Grade) && (khaiGrade < pm25Grade) ) + { + strResults = NSLocalizedString("LOC_PM25", comment:"초미세먼지") + " \(pm25Value) " + strPm25Str; + return strResults; + } + else if ( (khaiGrade == pm10Grade) && (khaiGrade < pm25Grade) ) + { + strResults = NSLocalizedString("LOC_PM25", comment:"초미세먼지") + " \(pm25Value) " + strPm25Str; + return strResults; + } + else if ( (khaiGrade < pm10Grade) && (khaiGrade < pm25Grade) ) + { + if ( pm10Grade > pm25Grade) + { + strResults = NSLocalizedString("LOC_PM10", comment:"미세먼지") + " \(pm10Value) " + strPm10Str; + return strResults; + } + else if ( pm10Grade == pm25Grade) + { + strResults = NSLocalizedString("LOC_PM10", comment:"미세먼지") + " \(pm10Value) " + strPm10Str; + return strResults; + } + else if ( pm10Grade < pm25Grade) + { + strResults = NSLocalizedString("LOC_PM25", comment:"초미세먼지") + " \(pm25Value) " + strPm25Str; + return strResults; + } + } + } + + if( (strKhaiStr == "") || (strKhaiStr == "(null)") ) { + strResults = ""; + } else { + strResults = NSLocalizedString("LOC_AQI", comment:"통합대기") + " \(khaiValue) " + strKhaiStr; + } + + return strResults; + } + + func getChangedColorAirState( strAirState : String) -> NSMutableAttributedString { + let String : NSMutableAttributedString = NSMutableAttributedString(string:strAirState); + var sRange : NSRange? = nil; + var stateColor : UIColor? = nil; + var font = UIFont.boldSystemFont(ofSize : 11.0); + let nssAirState = strAirState as NSString; + + let strGood = NSLocalizedString("LOC_GOOD", comment:"좋음"); + let strModerate = NSLocalizedString("LOC_MODERATE", comment:"보통"); + let strSensitive = NSLocalizedString("LOC_UNHEALTHY_FOR_SENSITIVE_GROUPS", comment:"민감군주의"); + let strUnhealthy = NSLocalizedString("LOC_UNHEALTHY", comment:"나쁨"); + let strVeryUnhealty = NSLocalizedString("LOC_VERY_UNHEALTHY", comment:"매우나쁨"); + let strHaz = NSLocalizedString("LOC_HAZARDOUS", comment:"위험"); + + if(watch.is42 == true) { + print("watch size is 42mm!!! "); + font = UIFont.boldSystemFont(ofSize : 13.0); + } else { + print("watch size is 32mm!!! "); + } + + if(strAirState.hasSuffix(strGood)) + { + sRange = nssAirState.range(of:strGood); + //NSMakeRange(firstBraceIndex.startIndex, firstClosingBraceIndex.endIndex) + stateColor = UIColor.init(argb:0xff32a1ff); + } + else if(strAirState.hasSuffix(strModerate)) + { + sRange = nssAirState.range(of:strModerate); //원하는 텍스트라는 글자의 위치가져오기 + stateColor = UIColor.init(argb:0xff7acf16); + } + else if(strAirState.hasSuffix(strSensitive)) + { + sRange = nssAirState.range(of:strSensitive); //원하는 텍스트라는 글자의 위치가져오기 + stateColor = UIColor.init(argb:0xfffd934c); // 나쁨과 동일 + } + else if(strAirState.hasSuffix(strVeryUnhealty)) + { + sRange = nssAirState.range(of:strVeryUnhealty); //원하는 텍스트라는 글자의 위치가져오기 + stateColor = UIColor.init(argb:0xffff7070); + } + else if(strAirState.hasSuffix(strUnhealthy)) + { + sRange = nssAirState.range(of:strUnhealthy); //원하는 텍스트라는 글자의 위치가져오기 + stateColor = UIColor.init(argb:0xfffd934c); + } + else if(strAirState.hasSuffix(strHaz)) + { + sRange = nssAirState.range(of:strHaz); //원하는 텍스트라는 글자의 위치가져오기 + stateColor = UIColor.init(argb:0xffff7070); // 매우나쁨과 동일 + } + else + { + //sRange = Foundation.NSNotFound; + stateColor = UIColor.black; + + return String; + } + + String.addAttribute(NSAttributedStringKey.foregroundColor, value:stateColor!, range:sRange!); //attString의 Range위치에 있는 "Nice"의 글자의 + + String.addAttribute(NSAttributedStringKey.font, value:font, range:sRange!); //attString의 Range위치에 있는 "Nice"의 글자의 + + return String; + + } + + public struct watch { + + public static var screenWidth: CGFloat { + return WKInterfaceDevice.current().screenBounds.width + } + + public static var is38: Bool { + return screenWidth == 136 + } + + public static var is42: Bool { + return screenWidth == 156 + } + } + + +} + + diff --git a/ios/watch Extension/WatchTWeatherUtil.swift b/ios/watch Extension/WatchTWeatherUtil.swift new file mode 100644 index 000000000..ef69f8c71 --- /dev/null +++ b/ios/watch Extension/WatchTWeatherUtil.swift @@ -0,0 +1,373 @@ +// +// WatchTWeatherUtil.swift +// TodayWeather +// +// Created by KwangHo Kim on 2017. 7. 23.. +// +// + +import Foundation + +enum TEMP_UNIT { + case NONE + case CELSIUS + case FAHRENHEIT + case MAX +} + +class WatchTWeatherUtil { + + var gTemperatureUnit : TEMP_UNIT? = nil; + var gArrDaumKeys = [String](); + + #if false + static let sharedInstance : WatchTWeatherUtil = { + let instance = WatchTWeatherUtil() + //setup code + return instance + }() + #endif + struct StaticInstance { + static var instance: WatchTWeatherUtil? + } + + class func sharedInstance() -> WatchTWeatherUtil { + if !(StaticInstance.instance != nil) { + StaticInstance.instance = WatchTWeatherUtil() + } + return StaticInstance.instance! + } + + // let watchTWReq = WatchTWeatherRequest.sharedInstance(); + // let watchTWSM = WatchTWeatherShowMore.sharedInstance(); + // let watchTWDraw = WatchTWeatherDraw.sharedInstance(); + + /******************************************************************** + * + * Name : getTemperatureUnit + * Description : get temperature unit by country + * Returns : TEMP_UNIT + * Side effects : + * Date : 2017. 3. 19 + * Author : SeanKim + * History : 20170219 SeanKim Create function + * + ********************************************************************/ + func getTemperatureUnit() -> TEMP_UNIT? { + print("gTemperatureUnit : \(String(describing: gTemperatureUnit))" ); + return gTemperatureUnit; + } + + /******************************************************************** + * + * Name : setTemperatureUnit + * Description : set temperature unit by NSDefaults + * Returns : TEMP_UNIT + * Side effects : + * Date : 2017. 3. 27 + * Author : SeanKim + * History : 20170327 SeanKim Create function + * + ********************************************************************/ + func setTemperatureUnit( strUnits : String? ) + { + if(strUnits == nil) { + print("strUnits is null!!!"); + return; + } + + let tmpUnitData = strUnits?.data(using: String.Encoding.utf8);// dataUsingEncoding:NSUTF8StringEncoding]; + do { + let jsonObject = try JSONSerialization.jsonObject(with: tmpUnitData!, options:JSONSerialization.ReadingOptions(rawValue: 0)) + guard let dictionary = jsonObject as? Dictionary else { + print("Not a Dictionary") + // put in functionåå√ + return + } + + let strTempUnit : String = dictionary["temperatureUnit"] as! String; + if(strTempUnit == "F") { + gTemperatureUnit = TEMP_UNIT.FAHRENHEIT; + } else { + gTemperatureUnit = TEMP_UNIT.CELSIUS; + } + + print("JSON Dictionary! \(dictionary)") + } + catch let error as NSError { + print("Found an error - \(error)") + } + + //FIXME + //gTemperatureUnit = TEMP_UNIT_FAHRENHEIT; + + return; + } + + func convertFromCelsToFahr ( cels : Float ) -> Float { + let fahr : Float = cels * 1.8 + 32; + + return fahr; + } + + + /******************************************************************** + * + * Name : getTodayDictionaryInGlobal + * Description : get today dictionary in global + * Returns : Dictionary + * Side effects : + * Date : 2017. 10. 13 + * Author : SeanKim + * History : 20171013 SeanKim Create function + * + ********************************************************************/ + func getTodayDictionaryInGlobal(jsonDict : Dictionary, strTime : String ) -> Dictionary? { + //var strCurrentDate : String? = nil; + var dailyDataArr : NSArray? = nil; + var todayDict : Dictionary? = nil; + + let index = strTime.index(strTime.startIndex, offsetBy: 10) + let strCurrentDate = strTime[..; + var dailyDataDict : Dictionary = dict as! Dictionary; + let strDailyDateTemp : String = dailyDataDict["date"]! as! String; + let strDailyDate = strDailyDateTemp[.. ) -> Dictionary { + var strCurrentDate : String? = nil; + var dailyDataArr : NSArray? = nil; + var todayDict : Dictionary? = nil; + + if let currentDict : Dictionary = jsonDict["current"] as? Dictionary { + strCurrentDate = currentDict["date"] as? String; + //print("currentDict : \(String(describing: currentDict))"); + print("getTodayArray strCurrentDate : \(String(describing: strCurrentDate))"); + } else { + print("That currentDict is not in the jsonDict dictionary.") + } + + if let midDict : Dictionary = jsonDict["midData"] as? Dictionary { + dailyDataArr = midDict["dailyData"] as? NSArray; + + //print("midDict : \(String(describing: midDict))"); + print("province : \(String(describing: midDict["province"]))"); + //print("dailyDataArr : \(String(describing: midDict["dailyData"]))"); + //print("dailyDataArr : \(String(describing: dailyDataArr))"); + for dict in dailyDataArr! { + //var dailyDataDict : Dictionary = dailyDataArr?.object(at: i as! Int) as! Dictionary; + var dailyDataDict : Dictionary = dict as! Dictionary; + let strDailyDate : String = dailyDataDict["date"]! as! String; + if(strCurrentDate == strDailyDate) + { + print("strCurrentDate : \(String(describing: strCurrentDate)), strDailyDate : \(String(describing: strDailyDate))"); + todayDict = dailyDataDict; + + break; + } + } + + } else { + print("That midDict is not in the jsonDict dictionary.") + } + + + print("todayDict: \(String(describing: todayDict))"); + + return todayDict!; + } + + /******************************************************************** + * + * Name : processLocationStr + * Description : processed locations 2 decimal places. + * Returns : NSString * + * Side effects : + * Date : 2017. 10. 7 + * Author : SeanKim + * History : 20171007 SeanKim Create function + * + ********************************************************************/ + func processLocationStr(strSrcStr : String? ) -> String? { + var strDstStr : String? = nil; + + if(strSrcStr == nil) { + print("[processLocationStr] nssSrcStr is nil!!!"); + return nil; + } + + //print("[processLocationStr] \(nssSrcStr)"); + + var arrSrc : Array? = strSrcStr?.components(separatedBy: "."); + let strFirst : String? = arrSrc?[0]; + let strTmp : String = arrSrc![1]; + + //let strSecond = strTmp.substring(to:strTmp.index(strTmp.startIndex, offsetBy:2)); + let index = strTmp.index(strTmp.startIndex, offsetBy: 2); + let strSecond = strTmp[.. String? { + let strURL : String? = "http://"; + print("[makeGlobalRequestURL] this is WatchTWeatherUtil!!!!"); + + return strURL; + } + + func getDaumServiceKeys() -> NSMutableArray { + + if(gArrDaumKeys.count == 0) { + + print("gArrDaumKeys.count is 0"); + //strDaumKey = String(format:"%s", watchTWReq.DAUM_SERVICE_KEY); + let strDefaultDaumKey : String = watchTWReq.DAUM_SERVICE_KEY; + setDaumServiceKeys(strDaumKeys: strDefaultDaumKey); + } + + return gArrDaumKeys as! NSMutableArray; + } + + #if false + func replace(searchString:String, pattern : String, replacementPattern:String)->String?{ + var error:NSError? = nil; + let regex = NSRegularExpression .regularExpressionWithPattern(pattern, options: NSRegularExpression.Options.DotMatchesLineSeparators, error: &error) + if (!error){ + let replacedString = regex.stringByReplacingMatchesInString(searchString, options: NSMatchingOptions.fromMask(0), range: NSMakeRange(0, countElements(searchString)), withTemplate: replacementPattern) + return replacedString + } + return nil + } + #endif + + /******************************************************************** + * + * Name : setDaumServiceKeys + * Description : set Daum Service Keys by NSDefaults + * Returns : void + * Side effects : + * Date : 2017. 5. 27 + * Author : SeanKim + * History : 20170527 SeanKim Create function + * + ********************************************************************/ + func setDaumServiceKeys(strDaumKeys : String?) { + var tmpData : Data? = nil; + var arrDaumKeys : NSMutableArray?; + //var error:NSError? = nil; + + if(strDaumKeys == nil) { + print("strDaumKeys is null!!!"); + return; + } + + print("nsmaDaumKeys : \(String(describing: strDaumKeys))" ); + tmpData = strDaumKeys?.data(using: String.Encoding.utf8); + print("tmpData : \(String(describing: tmpData))" ) + + #if false + // var regex : NSRegularExpression = NSRegularExpression.regul regularExpressionWithPattern:@"\\s+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/watch/Info.plist b/ios/watch/Info.plist new file mode 100644 index 000000000..c7baecaab --- /dev/null +++ b/ios/watch/Info.plist @@ -0,0 +1,33 @@ + + + + + CFBundleDevelopmentRegion + ko_KR + CFBundleDisplayName + TodayWeather + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.9.62 + CFBundleVersion + 0.9.62 + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + WKCompanionAppBundleIdentifier + net.wizardfactory.todayweather + WKWatchKitApp + + + diff --git a/ios/watch/de.lproj/Info.plist b/ios/watch/de.lproj/Info.plist new file mode 100644 index 000000000..611b6c9f8 --- /dev/null +++ b/ios/watch/de.lproj/Info.plist @@ -0,0 +1,33 @@ + + + + + CFBundleDevelopmentRegion + ko_KR + CFBundleDisplayName + HeuteWetter + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.9.62 + CFBundleVersion + 0.9.62 + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + WKCompanionAppBundleIdentifier + net.wizardfactory.todayweather + WKWatchKitApp + + + diff --git a/ios/watch/en.lproj/Info.plist b/ios/watch/en.lproj/Info.plist new file mode 100644 index 000000000..c7baecaab --- /dev/null +++ b/ios/watch/en.lproj/Info.plist @@ -0,0 +1,33 @@ + + + + + CFBundleDevelopmentRegion + ko_KR + CFBundleDisplayName + TodayWeather + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.9.62 + CFBundleVersion + 0.9.62 + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + WKCompanionAppBundleIdentifier + net.wizardfactory.todayweather + WKWatchKitApp + + + diff --git a/ios/watch/ja.lproj/Info.plist b/ios/watch/ja.lproj/Info.plist new file mode 100644 index 000000000..01072d127 --- /dev/null +++ b/ios/watch/ja.lproj/Info.plist @@ -0,0 +1,33 @@ + + + + + CFBundleDevelopmentRegion + ko_KR + CFBundleDisplayName + 今日天気 + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.9.62 + CFBundleVersion + 0.9.62 + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + WKCompanionAppBundleIdentifier + net.wizardfactory.todayweather + WKWatchKitApp + + + diff --git a/ios/watch/ko.lproj/Info.plist b/ios/watch/ko.lproj/Info.plist new file mode 100644 index 000000000..192643963 --- /dev/null +++ b/ios/watch/ko.lproj/Info.plist @@ -0,0 +1,33 @@ + + + + + CFBundleDevelopmentRegion + ko_KR + CFBundleDisplayName + 오늘날씨 + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.9.62 + CFBundleVersion + 0.9.62 + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + WKCompanionAppBundleIdentifier + net.wizardfactory.todayweather + WKWatchKitApp + + + diff --git a/ios/watch/watch.entitlements b/ios/watch/watch.entitlements new file mode 100644 index 000000000..a3d1b85b4 --- /dev/null +++ b/ios/watch/watch.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.net.wizardfactory.todayweather + + + diff --git a/ios/watch/zh-Hans.lproj/Info.plist b/ios/watch/zh-Hans.lproj/Info.plist new file mode 100644 index 000000000..2ca454bb0 --- /dev/null +++ b/ios/watch/zh-Hans.lproj/Info.plist @@ -0,0 +1,33 @@ + + + + + CFBundleDevelopmentRegion + ko_KR + CFBundleDisplayName + 今日天气 + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.9.62 + CFBundleVersion + 0.9.62 + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + WKCompanionAppBundleIdentifier + net.wizardfactory.todayweather + WKWatchKitApp + + + diff --git a/ios/watch/zh-Hant.lproj/Info.plist b/ios/watch/zh-Hant.lproj/Info.plist new file mode 100644 index 000000000..6c7bde57d --- /dev/null +++ b/ios/watch/zh-Hant.lproj/Info.plist @@ -0,0 +1,33 @@ + + + + + CFBundleDevelopmentRegion + ko_KR + CFBundleDisplayName + 今日天氣 + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.9.62 + CFBundleVersion + 0.9.62 + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + WKCompanionAppBundleIdentifier + net.wizardfactory.todayweather + WKWatchKitApp + + + diff --git a/ios/widget/TodayViewController.m b/ios/widget/TodayViewController.m index 1e2188726..71c4d657d 100644 --- a/ios/widget/TodayViewController.m +++ b/ios/widget/TodayViewController.m @@ -30,11 +30,8 @@ #define STR_LATITUDE @"&latitude=" #define STR_INPUT_COORD @"&inputCoordSystem=WGS84" #define STR_OUTPUT_JSON @"&output=json" -//#define API_JUST_TOWN @"v000803/town" +#define API_JUST_TOWN @"v000803/town" #define WORLD_API_URL @"ww/010000/current/2?gcode=" -//#define TEST_SERVER @"https://ry0b7u7o1b.execute-api.ap-northeast-2.amazonaws.com/dev" -#define COORD_2_WEATHER_API_URL @"weather/coord" -#define KMA_ADDR_API_URL @"v000901/kma/addr" #define WIDGET_COMPACT_HEIGHT 110.0 #define WIDGET_PADDING 215.0 @@ -317,10 +314,9 @@ - (void) initWidgetDatas NSString *nssDaumKeys = [sharedUserDefaults objectForKey:@"daumServiceKeys"]; [TodayWeatherUtil setTemperatureUnit:nssUnits]; - [todayUtil setUnits:nssUnits]; [todayUtil setDaumServiceKeys:nssDaumKeys]; - NSLog(@"cityList : %@", cityList); + //NSLog(@"cityList : %@", cityList); if (cityList == nil) { //You have to run todayweather for add citylist @@ -421,7 +417,7 @@ - (void) saveWeatherInfo:(NSDictionary *)dict NSString *nssName = nil; NSString *nssAddress = nil; bool bIsKR = false; - BOOL currentPosition = FALSE; + if(mCityDictList == nil) { @@ -451,79 +447,94 @@ - (void) saveWeatherInfo:(NSDictionary *)dict nssName = [dict objectForKey:@"name"]; nsdLocation = [dict objectForKey:@"location"]; } - else { - nssCountry = [nsdCurCity valueForKey:@"country"]; - if((nssCountry == nil) || [nssCountry isEqualToString:@"KR"]) + + nsdLocation = [nsdCurCity valueForKey:@"location"]; + if(nsdLocation == nil) + { + // Needs exception about "KR" and "Global" + if(bIsKR == TRUE) { - nssCountry = [NSString stringWithFormat:@"KR"]; - bIsKR = TRUE; + nsdLocation = [NSMutableDictionary dictionaryWithObjectsAndKeys: + @"0", @"lat", + @"0", @"long", + nil]; } - - nsdLocation = [nsdCurCity valueForKey:@"location"]; - if(nsdLocation == nil) + else // Global { - // Needs exception about "KR" and "Global" - if(bIsKR == TRUE) - { - nsdLocation = [NSMutableDictionary dictionaryWithObjectsAndKeys: - @"0", @"lat", - @"0", @"long", - nil]; - } - else // Global - { - nsdLocation = [NSMutableDictionary dictionaryWithObjectsAndKeys: - @"0", @"lat", - @"0", @"long", - nil]; - } + nsdLocation = [NSMutableDictionary dictionaryWithObjectsAndKeys: + @"0", @"lat", + @"0", @"long", + nil]; } - - nssAddress = [nsdCurCity valueForKey:@"address"]; - if(nssAddress == nil || [nssAddress isEqual:[NSNull null]]) + } +// else +// { +// NSNumber *nsnLat = [nsdLocation objectForKey:@"lat"]; +// NSString *nssLat = [NSString stringWithFormat:@"%@", nsnLat]; +// NSLog(@"nssLat : %@", nssLat); +// NSArray *arrLat = [nssLat componentsSeparatedByString:@"."]; +// NSString *nssLatTmp = [arrLat objectAtIndex:1]; +// NSLog(@"nssLatTmp : %@", nssLatTmp); +// +// if( [nssLatTmp length] != 2) +// { +// NSNumber *nsnLong = [nsdLocation objectForKey:@"long"]; +// NSString *nssLong = [NSString stringWithFormat:@"%@", nsnLong]; +// NSString *nssProcessedLat = [TodayWeatherUtil processLocationStr:nssLat]; +// NSString *nssProcessedLong = [TodayWeatherUtil processLocationStr:nssLong]; +// nsdLocation = [NSMutableDictionary dictionaryWithObjectsAndKeys: +// nssProcessedLat, @"lat", +// nssProcessedLong, @"long", +// nil]; +// NSLog(@"nsdLocation : %@", nsdLocation); +// } +// +// } + + nssAddress = [nsdCurCity valueForKey:@"address"]; + if(nssAddress == nil || [nssAddress isEqual:[NSNull null]]) + { + nssAddress = [NSString stringWithFormat:@"AddressEmpty"]; + } + else + { + if(bIsKR == TRUE) { - nssAddress = [NSString stringWithFormat:@"AddressEmpty"]; + NSLog(@"KR is not modified address(%@)!!!", nssAddress); } else { - if(bIsKR == TRUE) + NSLog(@"[saveWeatherInfo] the other country not KR nssAddress(%@)!!!", nssAddress); + nssAddress = [nssAddress stringByReplacingOccurrencesOfString:@" " withString:@""]; + + if(nssAddress != nil) { - NSLog(@"KR is not modified address(%@)!!!", nssAddress); + NSArray *chunks = [nssAddress componentsSeparatedByString: @","]; + nssAddress = [chunks objectAtIndex:0]; // New York or 맨해튼; } else { - NSLog(@"[svWeatherInfo] the other country not KR nssAddress(%@)!!!", nssAddress); - nssAddress = [nssAddress stringByReplacingOccurrencesOfString:@" " withString:@""]; - - if(nssAddress != nil) - { - NSArray *chunks = [nssAddress componentsSeparatedByString: @","]; - nssAddress = [chunks objectAtIndex:0]; // New York or 맨해튼; - } - else - { - nssAddress = [NSString stringWithFormat:@"AddressEmpty"]; - } + nssAddress = [NSString stringWithFormat:@"AddressEmpty"]; } } - - nssName = [nsdCurCity valueForKey:@"name"]; - if(nssName == nil) + } + + nssName = [nsdCurCity valueForKey:@"name"]; + if(nssName == nil) + { + if(bIsKR == TRUE) { - if(bIsKR == TRUE) - { - nssName = [NSString stringWithFormat:@"NameEmpty"]; - } - else // case Global and name is null - { - nssName = [NSString stringWithFormat:@"%@", nssAddress]; - } + nssName = [NSString stringWithFormat:@"NameEmpty"]; + } + else // case Global and name is null + { + nssName = [NSString stringWithFormat:@"%@", nssAddress]; } } - NSLog(@"[svWeatherInfo] nssAddress: %@", nssAddress); - NSLog(@"[svWeatherInfo] nssName: %@", nssName); - //NSLog(@"[svWeatherInfo] nsdCurCity: %@", nsdCurCity); + NSLog(@"[saveWeatherInfo] nssAddress: %@", nssAddress); + NSLog(@"[saveWeatherInfo] nssName: %@", nssName); + //NSLog(@"[saveWeatherInfo] nsdCurCity: %@", nsdCurCity); NSMutableDictionary* nsdTmpDict = [NSMutableDictionary dictionaryWithObjectsAndKeys: nssAddress, @"address", @@ -1094,13 +1105,13 @@ - (void) requestAsyncByURLSession:(NSString *)nssURL reqType:(NSUInteger)type #else NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; -// if(type == TYPE_REQUEST_WEATHER_KR) -// { -// //[request setValue:@"ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3" forHTTPHeaderField:@"Accept-Language"]; -// [request setValue:@"ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4" forHTTPHeaderField:@"Accept-Language"]; -// -// NSLog(@"[requestAsyncByURLSession] Accept-Language : ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4"); -// } + if(type == TYPE_REQUEST_WEATHER_KR) + { + //[request setValue:@"ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3" forHTTPHeaderField:@"Accept-Language"]; + [request setValue:@"ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4" forHTTPHeaderField:@"Accept-Language"]; + + NSLog(@"[requestAsyncByURLSession] Accept-Language : ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4"); + } NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler: @@ -1137,12 +1148,12 @@ - (void) requestAsyncByURLSessionForRetry:(NSString *)nssURL reqType:(NSUInteger NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; -// if(type == TYPE_REQUEST_WEATHER_KR) -// { -// [request setValue:@"ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4" forHTTPHeaderField:@"Accept-Language"]; -// -// NSLog(@"[requestAsyncByURLSession] Accept-Language : ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4"); -// } + if(type == TYPE_REQUEST_WEATHER_KR) + { + [request setValue:@"ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4" forHTTPHeaderField:@"Accept-Language"]; + + NSLog(@"[requestAsyncByURLSession] Accept-Language : ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4"); + } NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler: @@ -1226,6 +1237,7 @@ - (void) makeJSONWithData:(NSData *)jsonData reqType:(NSUInteger)type [self processWeatherResultsAboutGlobal:jsonDict]; [self processRequestIndicator:TRUE]; } +<<<<<<< Updated upstream else if (type == TYPE_REQUEST_WEATHER_BY_COORD || type == TYPE_REQUEST_WEATHER_KR) { @@ -1233,6 +1245,8 @@ - (void) makeJSONWithData:(NSData *)jsonData reqType:(NSUInteger)type [self processWeatherResultsByCoord:jsonDict]; [self processRequestIndicator:TRUE]; } +======= +>>>>>>> Stashed changes //NSLog(@"request weather result %@", jsonDict); } @@ -1553,7 +1567,7 @@ - (NSString *) makeRequestURL:(NSString *)nssAddr1 addr2:(NSString*)nssAddr2 add { NSString *nssURL = nil; NSCharacterSet *set = nil; - nssURL = [NSString stringWithFormat:@"%@/%@", TODAYWEATHER_URL, KMA_ADDR_API_URL]; + nssURL = [NSString stringWithFormat:@"%@/%@", TODAYWEATHER_URL, API_JUST_TOWN]; if (nssAddr1 != nil) { nssURL = [NSString stringWithFormat:@"%@/%@", nssURL, nssAddr1]; } @@ -2244,28 +2258,14 @@ - (void) locationManager:(CLLocationManager *)manager { [locationManager stopUpdatingLocation]; -#if 1 //GLOBAL_TEST - // FIXME - for emulator - delete me - //seoul - //latitude = 37.567; - //longitude = 126.978; - - //New York - //40.7127837, -74.0059413 <- New York - - // 오사카 - //latitude = 34.678395; - //longitude = 135.4601303; -#endif - gMylatitude = newLocation.coordinate.latitude; gMylongitude = newLocation.coordinate.longitude; - NSLog(@"[locationManager] latitude : %.3f, longitude : %.3f", + NSLog(@"[locationManager] latitude : %f, longitude : %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude); - [self getWeatherByCoord:gMylatitude longitude:gMylongitude]; + [self getAddressFromGoogle:gMylatitude longitude:gMylongitude]; } } @@ -2386,6 +2386,7 @@ - (BOOL) setCityInfo:(CityInfo *)nextCity } else { +<<<<<<< Updated upstream float lat = 0; float lng = 0; @@ -2398,6 +2399,9 @@ - (BOOL) setCityInfo:(CityInfo *)nextCity [self getWeatherByCoord:lat longitude:lng]; } else if([nextCity.country isEqualToString:@"KR"] || +======= + if([nextCity.country isEqualToString:@"KR"] || +>>>>>>> Stashed changes [nextCity.country isEqualToString:@"(null)"] || (nextCity.country == nil) ) @@ -2499,6 +2503,7 @@ - (void) processGlobalAddress:(NSDictionary *)nsdLocation NSLog(@"[processGlobalAddress] nssURL : %@", nssURL); } +<<<<<<< Updated upstream - (void) getWeatherByCoord:(float)latitude longitude:(float)longitude { NSDictionary *nssUnits = [todayUtil getUnits]; @@ -2753,4 +2758,6 @@ - (void) processWeatherResultsByCoord:(NSDictionary *)jsonDict } } +======= +>>>>>>> Stashed changes @end diff --git a/ios/widget/TodayWeatherShowMore.m b/ios/widget/TodayWeatherShowMore.m index fea40e48b..702ee20c0 100644 --- a/ios/widget/TodayWeatherShowMore.m +++ b/ios/widget/TodayWeatherShowMore.m @@ -49,8 +49,6 @@ - (void) processDailyData:(NSDictionary *)jsonDict type:(TYPE_REQUEST)reqType; TEMP_UNIT tempUnit = TEMP_UNIT_CELSIUS; NSString *nssCountry = nil; - NSLog(@"[proDailyData] reqType : %d", reqType); - TodayViewController *TVC = [TodayViewController sharedInstance]; arrDaysData = [TodayWeatherUtil getDaysArray:jsonDict type:reqType]; @@ -58,53 +56,45 @@ - (void) processDailyData:(NSDictionary *)jsonDict type:(TYPE_REQUEST)reqType; nssCountry = [self getCurCountry]; tempUnit = [TodayWeatherUtil getTemperatureUnit]; - NSLog(@"[proDailyData] country : %@", nssCountry); - for(int i = 0 ; i < [arrDaysData count]; i++) { + nssDate = [[arrDaysData objectAtIndex:i] objectForKey:@"date"]; + if(reqType == TYPE_REQUEST_WEATHER_KR) { - nssDate = [[arrDaysData objectAtIndex:i] objectForKey:@"date"]; nssMonth = [nssDate substringWithRange:NSMakeRange(4, 2)]; nssDay = [nssDate substringFromIndex:6]; - taMin = [[[arrDaysData objectAtIndex:i] objectForKey:@"tmn"] intValue]; - taMax = [[[arrDaysData objectAtIndex:i] objectForKey:@"tmx"] intValue]; + taMin = [[[arrDaysData objectAtIndex:i] objectForKey:@"taMin"] intValue]; + taMax = [[[arrDaysData objectAtIndex:i] objectForKey:@"taMax"] intValue]; -// if(tempUnit == TEMP_UNIT_FAHRENHEIT) -// { -// taMin = [TodayWeatherUtil convertFromCelsToFahr:taMin]; -// taMax = [TodayWeatherUtil convertFromCelsToFahr:taMax]; -// } + if(tempUnit == TEMP_UNIT_FAHRENHEIT) + { + taMin = [TodayWeatherUtil convertFromCelsToFahr:taMin]; + taMax = [TodayWeatherUtil convertFromCelsToFahr:taMax]; + } } - else if (reqType == TYPE_REQUEST_WEATHER_GLOBAL) + else { - nssDate = [[arrDaysData objectAtIndex:i] objectForKey:@"date"]; - nssMonth = [nssDate substringWithRange:NSMakeRange(4, 2)]; - nssDay = [nssDate substringFromIndex:6]; - taMin = [[[arrDaysData objectAtIndex:i] objectForKey:@"tmn"] intValue]; - taMax = [[[arrDaysData objectAtIndex:i] objectForKey:@"tmx"] intValue]; + nssMonth = [nssDate substringWithRange:NSMakeRange(5, 2)]; + nssDay = [nssDate substringWithRange:NSMakeRange(8, 2)]; -// nssDate = [[arrDaysData objectAtIndex:i] objectForKey:@"date"]; -// nssMonth = [nssDate substringWithRange:NSMakeRange(5, 2)]; -// nssDay = [nssDate substringWithRange:NSMakeRange(8, 2)]; -// -// if(tempUnit == TEMP_UNIT_CELSIUS) -// { -// taMin = [[[arrDaysData objectAtIndex:i] objectForKey:@"tempMin_c"] intValue]; -// taMax = [[[arrDaysData objectAtIndex:i] objectForKey:@"tempMax_c"] intValue]; -// } -// else -// { -// taMin = [[[arrDaysData objectAtIndex:i] objectForKey:@"tempMin_f"] intValue]; -// taMax = [[[arrDaysData objectAtIndex:i] objectForKey:@"tempMax_f"] intValue]; -// } + if(tempUnit == TEMP_UNIT_CELSIUS) + { + taMin = [[[arrDaysData objectAtIndex:i] objectForKey:@"tempMin_c"] intValue]; + taMax = [[[arrDaysData objectAtIndex:i] objectForKey:@"tempMax_c"] intValue]; + } + else + { + taMin = [[[arrDaysData objectAtIndex:i] objectForKey:@"tempMin_f"] intValue]; + taMax = [[[arrDaysData objectAtIndex:i] objectForKey:@"tempMax_f"] intValue]; + } } nssTempMaxMin = [NSString stringWithFormat:@"%d˚/%d˚", taMin, taMax]; nssSkyIcon = [[arrDaysData objectAtIndex:i] objectForKey:@"skyIcon"]; - NSLog(@"[proDailyData] nssTempMaxMin : %@", nssTempMaxMin); + //NSLog(@"nssTempMaxMin : %@", nssTempMaxMin); dispatch_async(dispatch_get_main_queue(), ^{ switch (i) { @@ -189,31 +179,56 @@ - (void) processByTimeData:(NSMutableDictionary *)dict type:(TYPE_REQUEST)reqTyp NSString *nssHour = nil; NSString *nssTempByTime = nil; - //TEMP_UNIT tempUnit = [TodayWeatherUtil getTemperatureUnit]; + TEMP_UNIT tempUnit = [TodayWeatherUtil getTemperatureUnit]; TodayViewController *TVC = [TodayViewController sharedInstance]; - NSLog(@"[proByTimeData] reqType : %d", reqType); + NSLog(@"reqType : %d", reqType); //NSLog(@"[processByTimeData] dict : %@", dict); arrTimeData = [TodayWeatherUtil getByTimeArray:dict type:reqType]; - NSLog(@"[proByTimeData] arrTimeData count : %lu", (unsigned long)[arrTimeData count]); + NSLog(@"[processByTimeData] arrTimeData count : %lu", (unsigned long)[arrTimeData count]); for(int i = 0 ; i < [arrTimeData count]; i++) { //NSLog(@"[processByTimeData] i : %d", i); - int temperature = 0; - - if(reqType == TYPE_REQUEST_WEATHER_KR) { - int time = 0; - time = [[[arrTimeData objectAtIndex:i] objectForKey:@"time"] intValue]; - nssHour = [NSString stringWithFormat:@"%d시", time]; + if(reqType == TYPE_REQUEST_WEATHER_KR) + { + int temperature = 0; + nssTime = [[arrTimeData objectAtIndex:i] objectForKey:@"time"]; + if([nssTime length] >= 2) + { + nssHour = [NSString stringWithFormat:@"%@시", [nssTime substringToIndex:2]]; + } + else + { + nssHour = [NSString stringWithFormat:@"시"]; + } + + temperature = [[[arrTimeData objectAtIndex:i] objectForKey:@"t3h"] intValue]; + if(tempUnit == TEMP_UNIT_FAHRENHEIT) + { + temperature = [TodayWeatherUtil convertFromCelsToFahr:temperature]; + } + + nssTempByTime = [NSString stringWithFormat:@"%d˚", temperature]; } - else { - nssTime = [[arrTimeData objectAtIndex:i] objectForKey:@"dateObj"]; + else + { + float temperature = 0; + nssTime = [[arrTimeData objectAtIndex:i] objectForKey:@"date"]; nssHour = [nssTime substringWithRange:NSMakeRange(11, 5)]; + + if(tempUnit == TEMP_UNIT_CELSIUS) + { + temperature = [[[arrTimeData objectAtIndex:i] objectForKey:@"temp_c"] floatValue]; + nssTempByTime = [NSString stringWithFormat:@"%.01f˚", temperature]; + } + else + { + temperature = [[[arrTimeData objectAtIndex:i] objectForKey:@"temp_f"] floatValue]; + nssTempByTime = [NSString stringWithFormat:@"%d˚", (int)temperature]; + } } - temperature = [[[arrTimeData objectAtIndex:i] objectForKey:@"t3h"] intValue]; - nssTempByTime = [NSString stringWithFormat:@"%d˚", (int)temperature]; nssSkyIcon = [[arrTimeData objectAtIndex:i] objectForKey:@"skyIcon"]; NSLog(@"nssTempMaxMin : %@", nssTempByTime); diff --git a/ios/widget/TodayWeatherUtil.h b/ios/widget/TodayWeatherUtil.h index 91cd56476..3f9c9932f 100644 --- a/ios/widget/TodayWeatherUtil.h +++ b/ios/widget/TodayWeatherUtil.h @@ -28,7 +28,6 @@ extern TEMP_UNIT gTemperatureUnit; @interface TodayWeatherUtil : NSObject { NSMutableArray *nsmaDaumKeys; - NSDictionary *jsonUnitsDict; } /******************************************************************** @@ -36,7 +35,7 @@ extern TEMP_UNIT gTemperatureUnit; ********************************************************************/ @property (retain, nonatomic) NSString *twuCountry; @property (retain, nonatomic) NSMutableArray *nsmaDaumKeys; -@property (retain, nonatomic) NSDictionary *jsonUnitsDict; + /******************************************************************** Declare Class functions @@ -61,11 +60,6 @@ extern TEMP_UNIT gTemperatureUnit; - (NSMutableArray *) getDaumServiceKeys; - (void) setDaumServiceKeys:(NSString *)nssDaumKeys; + (UIImage *)renderImageFromView:(UIView *)view withRect:(CGRect)frame transparentInsets:(UIEdgeInsets)insets; - -+ (NSMutableDictionary *) getTodayDictionaryByCoord:(NSDictionary *)jsonDict date:(NSString *)nssDate country:(NSString *)nssCountry; -- (void) setUnits:(NSString *)nssNewUnits; -- (NSDictionary *) getUnits; - @end #endif /* TodayWeatherUtil_h */ diff --git a/ios/widget/TodayWeatherUtil.m b/ios/widget/TodayWeatherUtil.m index 4ec116ee9..da0d9d179 100644 --- a/ios/widget/TodayWeatherUtil.m +++ b/ios/widget/TodayWeatherUtil.m @@ -13,7 +13,6 @@ @implementation TodayWeatherUtil @synthesize twuCountry; @synthesize nsmaDaumKeys; -@synthesize jsonUnitsDict; /******************************************************************** * @@ -191,7 +190,7 @@ + (NSArray *) getDaysArray:(NSDictionary *)jsonDict type:(TYPE_REQUEST)reqType } } } - else if(reqType == TYPE_REQUEST_WEATHER_GLOBAL) + else { arrDailyData = [jsonDict objectForKey:@"daily"]; cntArrDaily = (int)[arrDailyData count]; @@ -206,21 +205,7 @@ + (NSArray *) getDaysArray:(NSDictionary *)jsonDict type:(TYPE_REQUEST)reqType if(cntFounded == 6) break; } - } - else if (reqType == TYPE_REQUEST_WEATHER_BY_COORD) { - arrDailyData = [jsonDict objectForKey:@"daily"]; - cntArrDaily = (int)[arrDailyData count]; - - for(int i = 0; i < cntArrDaily; i++) - { - NSDictionary *nsdDailyData = [arrDailyData objectAtIndex:i]; - [arrDaysData addObject:nsdDailyData]; - - cntFounded++; - - if(cntFounded == 6) - break; - } + } //NSLog(@"arrDaysData : %@", arrDaysData); @@ -291,7 +276,7 @@ + (NSMutableArray *) getByTimeArray:(NSDictionary *)jsonDict type:(TYPE_REQUEST) else currentDict = [arrThisTime objectAtIndex:0]; // process about thisTime - NSString *nssTmpDate = [currentDict objectForKey:@"dateObj"]; // 2017.02.25 00:00 + NSString *nssTmpDate = [currentDict objectForKey:@"date"]; // 2017.02.25 00:00 NSArray *arrDate = [nssTmpDate componentsSeparatedByString:@" "]; // "2017.02.25", "00:00" NSString *nssSeparatedDate = [arrDate objectAtIndex:0]; // "2017.02.25" @@ -317,7 +302,7 @@ + (NSMutableArray *) getByTimeArray:(NSDictionary *)jsonDict type:(TYPE_REQUEST) { NSMutableDictionary *dictShort = [arrHourlyData objectAtIndex:i]; - NSString *nssDateTmpHourly = [dictShort objectForKey:@"dateObj"]; + NSString *nssDateTmpHourly = [dictShort objectForKey:@"date"]; NSArray *arrDateHourly = [nssDateTmpHourly componentsSeparatedByString:@" "]; // "2017.02.25", "00:00" NSString *nssSeparatedDateHourly = [arrDateHourly objectAtIndex:0]; // "2017.02.25" @@ -729,42 +714,4 @@ + (UIImage *)renderImageFromView:(UIView *)view withRect:(CGRect)frame transpare return renderedImage; } -+ (NSMutableDictionary *) getTodayDictionaryByCoord:(NSDictionary *)jsonDict date:(NSString *)nssDate country:(NSString *)nssCountry -{ - NSString *nssCurrentDate = nssDate; - - NSMutableArray *dailyDataArr = nil; - NSMutableDictionary *todayDict = [[NSMutableDictionary alloc] init]; - - if([nssCountry isEqualToString:@"KR"]) { - NSDictionary *midDict = [jsonDict objectForKey:@"midData"]; - dailyDataArr = [midDict objectForKey:@"dailyData"]; - } - else { - dailyDataArr = [jsonDict objectForKey:@"daily"]; - } - - //NSLog(@"[todayDictByCoord] nssCurrentDate : %@", nssCurrentDate); - - for(int i = 0; i < [dailyDataArr count]; i++) - { - NSDictionary *dailyDataDict = [dailyDataArr objectAtIndex:i]; - NSString *nssDate = [dailyDataDict objectForKey:@"date"]; - //NSString *nssDailyDate = [nssDate substringToIndex:10]; - - //NSLog(@"[todayDictByCoord] nssCurrentDate : %@, nssDailyDate : %@", nssCurrentDate, nssDailyDate); - if([nssDate isEqualToString:nssCurrentDate]) - { - //NSLog(@"[todayDictByCoord] nssCurrentDate : %@, nssDailyDate : %@", nssCurrentDate, nssDailyDate); - todayDict = [NSMutableDictionary dictionaryWithDictionary:dailyDataDict]; - - break; - } - } - - //NSLog(@"todayDictByCoord: %@", todayDict); - - return todayDict; -} - @end diff --git a/ios/widget/WidgetConfig.h b/ios/widget/WidgetConfig.h index 2058d2250..1eca4a77d 100644 --- a/ios/widget/WidgetConfig.h +++ b/ios/widget/WidgetConfig.h @@ -29,7 +29,6 @@ typedef enum _TYPE_REQUEST_ TYPE_REQUEST_GEO_GOOGLE, TYPE_REQUEST_WEATHER_KR, TYPE_REQUEST_WEATHER_GLOBAL, - TYPE_REQUEST_WEATHER_BY_COORD, TYPE_REQUEST_MAX, } TYPE_REQUEST; diff --git a/ios/www/cordova_plugins.js b/ios/www/cordova_plugins.js index e27be4a35..cab5c426c 100644 --- a/ios/www/cordova_plugins.js +++ b/ios/www/cordova_plugins.js @@ -1,7 +1,18 @@ cordova.define('cordova/plugin_list', function(require, exports, module) { -module.exports = []; +module.exports = [ + { + "id": "cordova-plugin-app-preferences.apppreferences", + "file": "plugins/cordova-plugin-app-preferences/www/apppreferences.js", + "pluginId": "cordova-plugin-app-preferences", + "clobbers": [ + "plugins.appPreferences" + ] + } +]; module.exports.metadata = // TOP OF METADATA -{}; +{ + "cordova-plugin-app-preferences": "0.99.3" +}; // BOTTOM OF METADATA }); \ No newline at end of file diff --git a/ios/www/css/ionic.app.min.css b/ios/www/css/ionic.app.min.css index 0177564c0..a5c4a7157 100644 --- a/ios/www/css/ionic.app.min.css +++ b/ios/www/css/ionic.app.min.css @@ -1 +1,11 @@ -@charset "UTF-8";@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(../fonts/MaterialIcons-Regular.eot);src:local("Material Icons"),local("MaterialIcons-Regular"),url(../fonts/MaterialIcons-Regular.woff2) format("woff2"),url(../fonts/MaterialIcons-Regular.woff) format("woff"),url(../fonts/MaterialIcons-Regular.ttf) format("truetype")}.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:'liga'}@font-face{font-family:Ionicons;src:url(../lib/ionic/fonts/ionicons.eot?v=2.0.1);src:url(../lib/ionic/fonts/ionicons.eot?v=2.0.1#iefix) format("embedded-opentype"),url(../lib/ionic/fonts/ionicons.ttf?v=2.0.1) format("truetype"),url(../lib/ionic/fonts/ionicons.woff?v=2.0.1) format("woff"),url(../lib/ionic/fonts/ionicons.woff) format("woff"),url(../lib/ionic/fonts/ionicons.svg?v=2.0.1#Ionicons) format("svg");font-weight:400;font-style:normal}.ion,.ion-alert-circled:before,.ion-alert:before,.ion-android-add-circle:before,.ion-android-add:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-cloud:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done-all:before,.ion-android-done:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite-outline:before,.ion-android-favorite:before,.ion-android-film:before,.ion-android-folder-open:before,.ion-android-folder:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone-off:before,.ion-android-microphone:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-notifications:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person-add:before,.ion-android-person:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove-circle:before,.ion-android-remove:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share-alt:before,.ion-android-share:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-star:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace-outline:before,.ion-backspace:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox-working:before,.ion-chatbox:before,.ion-chatboxes:before,.ion-chatbubble-working:before,.ion-chatbubble:before,.ion-chatbubbles:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-checkmark:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close-circled:before,.ion-close-round:before,.ion-close:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code-download:before,.ion-code-working:before,.ion-code:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document-text:before,.ion-document:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email-unread:before,.ion-email:before,.ion-erlenmeyer-flask-bubbles:before,.ion-erlenmeyer-flask:before,.ion-eye-disabled:before,.ion-eye:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash-off:before,.ion-flash:before,.ion-folder:before,.ion-fork-repo:before,.ion-fork:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy-outline:before,.ion-happy:before,.ion-headphone:before,.ion-heart-broken:before,.ion-heart:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-help:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information-circled:before,.ion-information:before,.ion-ionic:before,.ion-ios-alarm-outline:before,.ion-ios-alarm:before,.ion-ios-albums-outline:before,.ion-ios-albums:before,.ion-ios-americanfootball-outline:before,.ion-ios-americanfootball:before,.ion-ios-analytics-outline:before,.ion-ios-analytics:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at-outline:before,.ion-ios-at:before,.ion-ios-barcode-outline:before,.ion-ios-barcode:before,.ion-ios-baseball-outline:before,.ion-ios-baseball:before,.ion-ios-basketball-outline:before,.ion-ios-basketball:before,.ion-ios-bell-outline:before,.ion-ios-bell:before,.ion-ios-body-outline:before,.ion-ios-body:before,.ion-ios-bolt-outline:before,.ion-ios-bolt:before,.ion-ios-book-outline:before,.ion-ios-book:before,.ion-ios-bookmarks-outline:before,.ion-ios-bookmarks:before,.ion-ios-box-outline:before,.ion-ios-box:before,.ion-ios-briefcase-outline:before,.ion-ios-briefcase:before,.ion-ios-browsers-outline:before,.ion-ios-browsers:before,.ion-ios-calculator-outline:before,.ion-ios-calculator:before,.ion-ios-calendar-outline:before,.ion-ios-calendar:before,.ion-ios-camera-outline:before,.ion-ios-camera:before,.ion-ios-cart-outline:before,.ion-ios-cart:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatbubble-outline:before,.ion-ios-chatbubble:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-checkmark:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock-outline:before,.ion-ios-clock:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-close:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-download:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-outline:before,.ion-ios-cloudy:before,.ion-ios-cog-outline:before,.ion-ios-cog:before,.ion-ios-color-filter-outline:before,.ion-ios-color-filter:before,.ion-ios-color-wand-outline:before,.ion-ios-color-wand:before,.ion-ios-compose-outline:before,.ion-ios-compose:before,.ion-ios-contact-outline:before,.ion-ios-contact:before,.ion-ios-copy-outline:before,.ion-ios-copy:before,.ion-ios-crop-strong:before,.ion-ios-crop:before,.ion-ios-download-outline:before,.ion-ios-download:before,.ion-ios-drag:before,.ion-ios-email-outline:before,.ion-ios-email:before,.ion-ios-eye-outline:before,.ion-ios-eye:before,.ion-ios-fastforward-outline:before,.ion-ios-fastforward:before,.ion-ios-filing-outline:before,.ion-ios-filing:before,.ion-ios-film-outline:before,.ion-ios-film:before,.ion-ios-flag-outline:before,.ion-ios-flag:before,.ion-ios-flame-outline:before,.ion-ios-flame:before,.ion-ios-flask-outline:before,.ion-ios-flask:before,.ion-ios-flower-outline:before,.ion-ios-flower:before,.ion-ios-folder-outline:before,.ion-ios-folder:before,.ion-ios-football-outline:before,.ion-ios-football:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-b-outline:before,.ion-ios-game-controller-b:before,.ion-ios-gear-outline:before,.ion-ios-gear:before,.ion-ios-glasses-outline:before,.ion-ios-glasses:before,.ion-ios-grid-view-outline:before,.ion-ios-grid-view:before,.ion-ios-heart-outline:before,.ion-ios-heart:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-help:before,.ion-ios-home-outline:before,.ion-ios-home:before,.ion-ios-infinite-outline:before,.ion-ios-infinite:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-information:before,.ion-ios-ionic-outline:before,.ion-ios-keypad-outline:before,.ion-ios-keypad:before,.ion-ios-lightbulb-outline:before,.ion-ios-lightbulb:before,.ion-ios-list-outline:before,.ion-ios-list:before,.ion-ios-location-outline:before,.ion-ios-location:before,.ion-ios-locked-outline:before,.ion-ios-locked:before,.ion-ios-loop-strong:before,.ion-ios-loop:before,.ion-ios-medical-outline:before,.ion-ios-medical:before,.ion-ios-medkit-outline:before,.ion-ios-medkit:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-mic:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-minus:before,.ion-ios-monitor-outline:before,.ion-ios-monitor:before,.ion-ios-moon-outline:before,.ion-ios-moon:before,.ion-ios-more-outline:before,.ion-ios-more:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate-outline:before,.ion-ios-navigate:before,.ion-ios-nutrition-outline:before,.ion-ios-nutrition:before,.ion-ios-paper-outline:before,.ion-ios-paper:before,.ion-ios-paperplane-outline:before,.ion-ios-paperplane:before,.ion-ios-partlysunny-outline:before,.ion-ios-partlysunny:before,.ion-ios-pause-outline:before,.ion-ios-pause:before,.ion-ios-paw-outline:before,.ion-ios-paw:before,.ion-ios-people-outline:before,.ion-ios-people:before,.ion-ios-person-outline:before,.ion-ios-person:before,.ion-ios-personadd-outline:before,.ion-ios-personadd:before,.ion-ios-photos-outline:before,.ion-ios-photos:before,.ion-ios-pie-outline:before,.ion-ios-pie:before,.ion-ios-pint-outline:before,.ion-ios-pint:before,.ion-ios-play-outline:before,.ion-ios-play:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-plus:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetags-outline:before,.ion-ios-pricetags:before,.ion-ios-printer-outline:before,.ion-ios-printer:before,.ion-ios-pulse-strong:before,.ion-ios-pulse:before,.ion-ios-rainy-outline:before,.ion-ios-rainy:before,.ion-ios-recording-outline:before,.ion-ios-recording:before,.ion-ios-redo-outline:before,.ion-ios-redo:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-refresh:before,.ion-ios-reload:before,.ion-ios-reverse-camera-outline:before,.ion-ios-reverse-camera:before,.ion-ios-rewind-outline:before,.ion-ios-rewind:before,.ion-ios-rose-outline:before,.ion-ios-rose:before,.ion-ios-search-strong:before,.ion-ios-search:before,.ion-ios-settings-strong:before,.ion-ios-settings:before,.ion-ios-shuffle-strong:before,.ion-ios-shuffle:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipbackward:before,.ion-ios-skipforward-outline:before,.ion-ios-skipforward:before,.ion-ios-snowy:before,.ion-ios-speedometer-outline:before,.ion-ios-speedometer:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-star:before,.ion-ios-stopwatch-outline:before,.ion-ios-stopwatch:before,.ion-ios-sunny-outline:before,.ion-ios-sunny:before,.ion-ios-telephone-outline:before,.ion-ios-telephone:before,.ion-ios-tennisball-outline:before,.ion-ios-tennisball:before,.ion-ios-thunderstorm-outline:before,.ion-ios-thunderstorm:before,.ion-ios-time-outline:before,.ion-ios-time:before,.ion-ios-timer-outline:before,.ion-ios-timer:before,.ion-ios-toggle-outline:before,.ion-ios-toggle:before,.ion-ios-trash-outline:before,.ion-ios-trash:before,.ion-ios-undo-outline:before,.ion-ios-undo:before,.ion-ios-unlocked-outline:before,.ion-ios-unlocked:before,.ion-ios-upload-outline:before,.ion-ios-upload:before,.ion-ios-videocam-outline:before,.ion-ios-videocam:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass-outline:before,.ion-ios-wineglass:before,.ion-ios-world-outline:before,.ion-ios-world:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-minus:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon-round:before,.ion-navicon:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person-add:before,.ion-person-stalker:before,.ion-person:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-plus:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply-all:before,.ion-reply:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad-outline:before,.ion-sad:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android-outline:before,.ion-social-android:before,.ion-social-angular-outline:before,.ion-social-angular:before,.ion-social-apple-outline:before,.ion-social-apple:before,.ion-social-bitcoin-outline:before,.ion-social-bitcoin:before,.ion-social-buffer-outline:before,.ion-social-buffer:before,.ion-social-chrome-outline:before,.ion-social-chrome:before,.ion-social-codepen-outline:before,.ion-social-codepen:before,.ion-social-css3-outline:before,.ion-social-css3:before,.ion-social-designernews-outline:before,.ion-social-designernews:before,.ion-social-dribbble-outline:before,.ion-social-dribbble:before,.ion-social-dropbox-outline:before,.ion-social-dropbox:before,.ion-social-euro-outline:before,.ion-social-euro:before,.ion-social-facebook-outline:before,.ion-social-facebook:before,.ion-social-foursquare-outline:before,.ion-social-foursquare:before,.ion-social-freebsd-devil:before,.ion-social-github-outline:before,.ion-social-github:before,.ion-social-google-outline:before,.ion-social-google:before,.ion-social-googleplus-outline:before,.ion-social-googleplus:before,.ion-social-hackernews-outline:before,.ion-social-hackernews:before,.ion-social-html5-outline:before,.ion-social-html5:before,.ion-social-instagram-outline:before,.ion-social-instagram:before,.ion-social-javascript-outline:before,.ion-social-javascript:before,.ion-social-linkedin-outline:before,.ion-social-linkedin:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest-outline:before,.ion-social-pinterest:before,.ion-social-python:before,.ion-social-reddit-outline:before,.ion-social-reddit:before,.ion-social-rss-outline:before,.ion-social-rss:before,.ion-social-sass:before,.ion-social-skype-outline:before,.ion-social-skype:before,.ion-social-snapchat-outline:before,.ion-social-snapchat:before,.ion-social-tumblr-outline:before,.ion-social-tumblr:before,.ion-social-tux:before,.ion-social-twitch-outline:before,.ion-social-twitch:before,.ion-social-twitter-outline:before,.ion-social-twitter:before,.ion-social-usd-outline:before,.ion-social-usd:before,.ion-social-vimeo-outline:before,.ion-social-vimeo:before,.ion-social-whatsapp-outline:before,.ion-social-whatsapp:before,.ion-social-windows-outline:before,.ion-social-windows:before,.ion-social-wordpress-outline:before,.ion-social-wordpress:before,.ion-social-yahoo-outline:before,.ion-social-yahoo:before,.ion-social-yen-outline:before,.ion-social-yen:before,.ion-social-youtube-outline:before,.ion-social-youtube:before,.ion-soup-can-outline:before,.ion-soup-can:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle-filled:before,.ion-toggle:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt-outline:before,.ion-tshirt:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before,.ionicons{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:""}.ion-alert-circled:before{content:""}.ion-android-add:before{content:""}.ion-android-add-circle:before{content:""}.ion-android-alarm-clock:before{content:""}.ion-android-alert:before{content:""}.ion-android-apps:before{content:""}.ion-android-archive:before{content:""}.ion-android-arrow-back:before{content:""}.ion-android-arrow-down:before{content:""}.ion-android-arrow-dropdown:before{content:""}.ion-android-arrow-dropdown-circle:before{content:""}.ion-android-arrow-dropleft:before{content:""}.ion-android-arrow-dropleft-circle:before{content:""}.ion-android-arrow-dropright:before{content:""}.ion-android-arrow-dropright-circle:before{content:""}.ion-android-arrow-dropup:before{content:""}.ion-android-arrow-dropup-circle:before{content:""}.ion-android-arrow-forward:before{content:""}.ion-android-arrow-up:before{content:""}.ion-android-attach:before{content:""}.ion-android-bar:before{content:""}.ion-android-bicycle:before{content:""}.ion-android-boat:before{content:""}.ion-android-bookmark:before{content:""}.ion-android-bulb:before{content:""}.ion-android-bus:before{content:""}.ion-android-calendar:before{content:""}.ion-android-call:before{content:""}.ion-android-camera:before{content:""}.ion-android-cancel:before{content:""}.ion-android-car:before{content:""}.ion-android-cart:before{content:""}.ion-android-chat:before{content:""}.ion-android-checkbox:before{content:""}.ion-android-checkbox-blank:before{content:""}.ion-android-checkbox-outline:before{content:""}.ion-android-checkbox-outline-blank:before{content:""}.ion-android-checkmark-circle:before{content:""}.ion-android-clipboard:before{content:""}.ion-android-close:before{content:""}.ion-android-cloud:before{content:""}.ion-android-cloud-circle:before{content:""}.ion-android-cloud-done:before{content:""}.ion-android-cloud-outline:before{content:""}.ion-android-color-palette:before{content:""}.ion-android-compass:before{content:""}.ion-android-contact:before{content:""}.ion-android-contacts:before{content:""}.ion-android-contract:before{content:""}.ion-android-create:before{content:""}.ion-android-delete:before{content:""}.ion-android-desktop:before{content:""}.ion-android-document:before{content:""}.ion-android-done:before{content:""}.ion-android-done-all:before{content:""}.ion-android-download:before{content:""}.ion-android-drafts:before{content:""}.ion-android-exit:before{content:""}.ion-android-expand:before{content:""}.ion-android-favorite:before{content:""}.ion-android-favorite-outline:before{content:""}.ion-android-film:before{content:""}.ion-android-folder:before{content:""}.ion-android-folder-open:before{content:""}.ion-android-funnel:before{content:""}.ion-android-globe:before{content:""}.ion-android-hand:before{content:""}.ion-android-hangout:before{content:""}.ion-android-happy:before{content:""}.ion-android-home:before{content:""}.ion-android-image:before{content:""}.ion-android-laptop:before{content:""}.ion-android-list:before{content:""}.ion-android-locate:before{content:""}.ion-android-lock:before{content:""}.ion-android-mail:before{content:""}.ion-android-map:before{content:""}.ion-android-menu:before{content:""}.ion-android-microphone:before{content:""}.ion-android-microphone-off:before{content:""}.ion-android-more-horizontal:before{content:""}.ion-android-more-vertical:before{content:""}.ion-android-navigate:before{content:""}.ion-android-notifications:before{content:""}.ion-android-notifications-none:before{content:""}.ion-android-notifications-off:before{content:""}.ion-android-open:before{content:""}.ion-android-options:before{content:""}.ion-android-people:before{content:""}.ion-android-person:before{content:""}.ion-android-person-add:before{content:""}.ion-android-phone-landscape:before{content:""}.ion-android-phone-portrait:before{content:""}.ion-android-pin:before{content:""}.ion-android-plane:before{content:""}.ion-android-playstore:before{content:""}.ion-android-print:before{content:""}.ion-android-radio-button-off:before{content:""}.ion-android-radio-button-on:before{content:""}.ion-android-refresh:before{content:""}.ion-android-remove:before{content:""}.ion-android-remove-circle:before{content:""}.ion-android-restaurant:before{content:""}.ion-android-sad:before{content:""}.ion-android-search:before{content:""}.ion-android-send:before{content:""}.ion-android-settings:before{content:""}.ion-android-share:before{content:""}.ion-android-share-alt:before{content:""}.ion-android-star:before{content:""}.ion-android-star-half:before{content:""}.ion-android-star-outline:before{content:""}.ion-android-stopwatch:before{content:""}.ion-android-subway:before{content:""}.ion-android-sunny:before{content:""}.ion-android-sync:before{content:""}.ion-android-textsms:before{content:""}.ion-android-time:before{content:""}.ion-android-train:before{content:""}.ion-android-unlock:before{content:""}.ion-android-upload:before{content:""}.ion-android-volume-down:before{content:""}.ion-android-volume-mute:before{content:""}.ion-android-volume-off:before{content:""}.ion-android-volume-up:before{content:""}.ion-android-walk:before{content:""}.ion-android-warning:before{content:""}.ion-android-watch:before{content:""}.ion-android-wifi:before{content:""}.ion-aperture:before{content:""}.ion-archive:before{content:""}.ion-arrow-down-a:before{content:""}.ion-arrow-down-b:before{content:""}.ion-arrow-down-c:before{content:""}.ion-arrow-expand:before{content:""}.ion-arrow-graph-down-left:before{content:""}.ion-arrow-graph-down-right:before{content:""}.ion-arrow-graph-up-left:before{content:""}.ion-arrow-graph-up-right:before{content:""}.ion-arrow-left-a:before{content:""}.ion-arrow-left-b:before{content:""}.ion-arrow-left-c:before{content:""}.ion-arrow-move:before{content:""}.ion-arrow-resize:before{content:""}.ion-arrow-return-left:before{content:""}.ion-arrow-return-right:before{content:""}.ion-arrow-right-a:before{content:""}.ion-arrow-right-b:before{content:""}.ion-arrow-right-c:before{content:""}.ion-arrow-shrink:before{content:""}.ion-arrow-swap:before{content:""}.ion-arrow-up-a:before{content:""}.ion-arrow-up-b:before{content:""}.ion-arrow-up-c:before{content:""}.ion-asterisk:before{content:""}.ion-at:before{content:""}.ion-backspace:before{content:""}.ion-backspace-outline:before{content:""}.ion-bag:before{content:""}.ion-battery-charging:before{content:""}.ion-battery-empty:before{content:""}.ion-battery-full:before{content:""}.ion-battery-half:before{content:""}.ion-battery-low:before{content:""}.ion-beaker:before{content:""}.ion-beer:before{content:""}.ion-bluetooth:before{content:""}.ion-bonfire:before{content:""}.ion-bookmark:before{content:""}.ion-bowtie:before{content:""}.ion-briefcase:before{content:""}.ion-bug:before{content:""}.ion-calculator:before{content:""}.ion-calendar:before{content:""}.ion-camera:before{content:""}.ion-card:before{content:""}.ion-cash:before{content:""}.ion-chatbox:before{content:""}.ion-chatbox-working:before{content:""}.ion-chatboxes:before{content:""}.ion-chatbubble:before{content:""}.ion-chatbubble-working:before{content:""}.ion-chatbubbles:before{content:""}.ion-checkmark:before{content:""}.ion-checkmark-circled:before{content:""}.ion-checkmark-round:before{content:""}.ion-chevron-down:before{content:""}.ion-chevron-left:before{content:""}.ion-chevron-right:before{content:""}.ion-chevron-up:before{content:""}.ion-clipboard:before{content:""}.ion-clock:before{content:""}.ion-close:before{content:""}.ion-close-circled:before{content:""}.ion-close-round:before{content:""}.ion-closed-captioning:before{content:""}.ion-cloud:before{content:""}.ion-code:before{content:""}.ion-code-download:before{content:""}.ion-code-working:before{content:""}.ion-coffee:before{content:""}.ion-compass:before{content:""}.ion-compose:before{content:""}.ion-connection-bars:before{content:""}.ion-contrast:before{content:""}.ion-crop:before{content:""}.ion-cube:before{content:""}.ion-disc:before{content:""}.ion-document:before{content:""}.ion-document-text:before{content:""}.ion-drag:before{content:""}.ion-earth:before{content:""}.ion-easel:before{content:""}.ion-edit:before{content:""}.ion-egg:before{content:""}.ion-eject:before{content:""}.ion-email:before{content:""}.ion-email-unread:before{content:""}.ion-erlenmeyer-flask:before{content:""}.ion-erlenmeyer-flask-bubbles:before{content:""}.ion-eye:before{content:""}.ion-eye-disabled:before{content:""}.ion-female:before{content:""}.ion-filing:before{content:""}.ion-film-marker:before{content:""}.ion-fireball:before{content:""}.ion-flag:before{content:""}.ion-flame:before{content:""}.ion-flash:before{content:""}.ion-flash-off:before{content:""}.ion-folder:before{content:""}.ion-fork:before{content:""}.ion-fork-repo:before{content:""}.ion-forward:before{content:""}.ion-funnel:before{content:""}.ion-gear-a:before{content:""}.ion-gear-b:before{content:""}.ion-grid:before{content:""}.ion-hammer:before{content:""}.ion-happy:before{content:""}.ion-happy-outline:before{content:""}.ion-headphone:before{content:""}.ion-heart:before{content:""}.ion-heart-broken:before{content:""}.ion-help:before{content:""}.ion-help-buoy:before{content:""}.ion-help-circled:before{content:""}.ion-home:before{content:""}.ion-icecream:before{content:""}.ion-image:before{content:""}.ion-images:before{content:""}.ion-information:before{content:""}.ion-information-circled:before{content:""}.ion-ionic:before{content:""}.ion-ios-alarm:before{content:""}.ion-ios-alarm-outline:before{content:""}.ion-ios-albums:before{content:""}.ion-ios-albums-outline:before{content:""}.ion-ios-americanfootball:before{content:""}.ion-ios-americanfootball-outline:before{content:""}.ion-ios-analytics:before{content:""}.ion-ios-analytics-outline:before{content:""}.ion-ios-arrow-back:before{content:""}.ion-ios-arrow-down:before{content:""}.ion-ios-arrow-forward:before{content:""}.ion-ios-arrow-left:before{content:""}.ion-ios-arrow-right:before{content:""}.ion-ios-arrow-thin-down:before{content:""}.ion-ios-arrow-thin-left:before{content:""}.ion-ios-arrow-thin-right:before{content:""}.ion-ios-arrow-thin-up:before{content:""}.ion-ios-arrow-up:before{content:""}.ion-ios-at:before{content:""}.ion-ios-at-outline:before{content:""}.ion-ios-barcode:before{content:""}.ion-ios-barcode-outline:before{content:""}.ion-ios-baseball:before{content:""}.ion-ios-baseball-outline:before{content:""}.ion-ios-basketball:before{content:""}.ion-ios-basketball-outline:before{content:""}.ion-ios-bell:before{content:""}.ion-ios-bell-outline:before{content:""}.ion-ios-body:before{content:""}.ion-ios-body-outline:before{content:""}.ion-ios-bolt:before{content:""}.ion-ios-bolt-outline:before{content:""}.ion-ios-book:before{content:""}.ion-ios-book-outline:before{content:""}.ion-ios-bookmarks:before{content:""}.ion-ios-bookmarks-outline:before{content:""}.ion-ios-box:before{content:""}.ion-ios-box-outline:before{content:""}.ion-ios-briefcase:before{content:""}.ion-ios-briefcase-outline:before{content:""}.ion-ios-browsers:before{content:""}.ion-ios-browsers-outline:before{content:""}.ion-ios-calculator:before{content:""}.ion-ios-calculator-outline:before{content:""}.ion-ios-calendar:before{content:""}.ion-ios-calendar-outline:before{content:""}.ion-ios-camera:before{content:""}.ion-ios-camera-outline:before{content:""}.ion-ios-cart:before{content:""}.ion-ios-cart-outline:before{content:""}.ion-ios-chatboxes:before{content:""}.ion-ios-chatboxes-outline:before{content:""}.ion-ios-chatbubble:before{content:""}.ion-ios-chatbubble-outline:before{content:""}.ion-ios-checkmark:before{content:""}.ion-ios-checkmark-empty:before{content:""}.ion-ios-checkmark-outline:before{content:""}.ion-ios-circle-filled:before{content:""}.ion-ios-circle-outline:before{content:""}.ion-ios-clock:before{content:""}.ion-ios-clock-outline:before{content:""}.ion-ios-close:before{content:""}.ion-ios-close-empty:before{content:""}.ion-ios-close-outline:before{content:""}.ion-ios-cloud:before{content:""}.ion-ios-cloud-download:before{content:""}.ion-ios-cloud-download-outline:before{content:""}.ion-ios-cloud-outline:before{content:""}.ion-ios-cloud-upload:before{content:""}.ion-ios-cloud-upload-outline:before{content:""}.ion-ios-cloudy:before{content:""}.ion-ios-cloudy-night:before{content:""}.ion-ios-cloudy-night-outline:before{content:""}.ion-ios-cloudy-outline:before{content:""}.ion-ios-cog:before{content:""}.ion-ios-cog-outline:before{content:""}.ion-ios-color-filter:before{content:""}.ion-ios-color-filter-outline:before{content:""}.ion-ios-color-wand:before{content:""}.ion-ios-color-wand-outline:before{content:""}.ion-ios-compose:before{content:""}.ion-ios-compose-outline:before{content:""}.ion-ios-contact:before{content:""}.ion-ios-contact-outline:before{content:""}.ion-ios-copy:before{content:""}.ion-ios-copy-outline:before{content:""}.ion-ios-crop:before{content:""}.ion-ios-crop-strong:before{content:""}.ion-ios-download:before{content:""}.ion-ios-download-outline:before{content:""}.ion-ios-drag:before{content:""}.ion-ios-email:before{content:""}.ion-ios-email-outline:before{content:""}.ion-ios-eye:before{content:""}.ion-ios-eye-outline:before{content:""}.ion-ios-fastforward:before{content:""}.ion-ios-fastforward-outline:before{content:""}.ion-ios-filing:before{content:""}.ion-ios-filing-outline:before{content:""}.ion-ios-film:before{content:""}.ion-ios-film-outline:before{content:""}.ion-ios-flag:before{content:""}.ion-ios-flag-outline:before{content:""}.ion-ios-flame:before{content:""}.ion-ios-flame-outline:before{content:""}.ion-ios-flask:before{content:""}.ion-ios-flask-outline:before{content:""}.ion-ios-flower:before{content:""}.ion-ios-flower-outline:before{content:""}.ion-ios-folder:before{content:""}.ion-ios-folder-outline:before{content:""}.ion-ios-football:before{content:""}.ion-ios-football-outline:before{content:""}.ion-ios-game-controller-a:before{content:""}.ion-ios-game-controller-a-outline:before{content:""}.ion-ios-game-controller-b:before{content:""}.ion-ios-game-controller-b-outline:before{content:""}.ion-ios-gear:before{content:""}.ion-ios-gear-outline:before{content:""}.ion-ios-glasses:before{content:""}.ion-ios-glasses-outline:before{content:""}.ion-ios-grid-view:before{content:""}.ion-ios-grid-view-outline:before{content:""}.ion-ios-heart:before{content:""}.ion-ios-heart-outline:before{content:""}.ion-ios-help:before{content:""}.ion-ios-help-empty:before{content:""}.ion-ios-help-outline:before{content:""}.ion-ios-home:before{content:""}.ion-ios-home-outline:before{content:""}.ion-ios-infinite:before{content:""}.ion-ios-infinite-outline:before{content:""}.ion-ios-information:before{content:""}.ion-ios-information-empty:before{content:""}.ion-ios-information-outline:before{content:""}.ion-ios-ionic-outline:before{content:""}.ion-ios-keypad:before{content:""}.ion-ios-keypad-outline:before{content:""}.ion-ios-lightbulb:before{content:""}.ion-ios-lightbulb-outline:before{content:""}.ion-ios-list:before{content:""}.ion-ios-list-outline:before{content:""}.ion-ios-location:before{content:""}.ion-ios-location-outline:before{content:""}.ion-ios-locked:before{content:""}.ion-ios-locked-outline:before{content:""}.ion-ios-loop:before{content:""}.ion-ios-loop-strong:before{content:""}.ion-ios-medical:before{content:""}.ion-ios-medical-outline:before{content:""}.ion-ios-medkit:before{content:""}.ion-ios-medkit-outline:before{content:""}.ion-ios-mic:before{content:""}.ion-ios-mic-off:before{content:""}.ion-ios-mic-outline:before{content:""}.ion-ios-minus:before{content:""}.ion-ios-minus-empty:before{content:""}.ion-ios-minus-outline:before{content:""}.ion-ios-monitor:before{content:""}.ion-ios-monitor-outline:before{content:""}.ion-ios-moon:before{content:""}.ion-ios-moon-outline:before{content:""}.ion-ios-more:before{content:""}.ion-ios-more-outline:before{content:""}.ion-ios-musical-note:before{content:""}.ion-ios-musical-notes:before{content:""}.ion-ios-navigate:before{content:""}.ion-ios-navigate-outline:before{content:""}.ion-ios-nutrition:before{content:""}.ion-ios-nutrition-outline:before{content:""}.ion-ios-paper:before{content:""}.ion-ios-paper-outline:before{content:""}.ion-ios-paperplane:before{content:""}.ion-ios-paperplane-outline:before{content:""}.ion-ios-partlysunny:before{content:""}.ion-ios-partlysunny-outline:before{content:""}.ion-ios-pause:before{content:""}.ion-ios-pause-outline:before{content:""}.ion-ios-paw:before{content:""}.ion-ios-paw-outline:before{content:""}.ion-ios-people:before{content:""}.ion-ios-people-outline:before{content:""}.ion-ios-person:before{content:""}.ion-ios-person-outline:before{content:""}.ion-ios-personadd:before{content:""}.ion-ios-personadd-outline:before{content:""}.ion-ios-photos:before{content:""}.ion-ios-photos-outline:before{content:""}.ion-ios-pie:before{content:""}.ion-ios-pie-outline:before{content:""}.ion-ios-pint:before{content:""}.ion-ios-pint-outline:before{content:""}.ion-ios-play:before{content:""}.ion-ios-play-outline:before{content:""}.ion-ios-plus:before{content:""}.ion-ios-plus-empty:before{content:""}.ion-ios-plus-outline:before{content:""}.ion-ios-pricetag:before{content:""}.ion-ios-pricetag-outline:before{content:""}.ion-ios-pricetags:before{content:""}.ion-ios-pricetags-outline:before{content:""}.ion-ios-printer:before{content:""}.ion-ios-printer-outline:before{content:""}.ion-ios-pulse:before{content:""}.ion-ios-pulse-strong:before{content:""}.ion-ios-rainy:before{content:""}.ion-ios-rainy-outline:before{content:""}.ion-ios-recording:before{content:""}.ion-ios-recording-outline:before{content:""}.ion-ios-redo:before{content:""}.ion-ios-redo-outline:before{content:""}.ion-ios-refresh:before{content:""}.ion-ios-refresh-empty:before{content:""}.ion-ios-refresh-outline:before{content:""}.ion-ios-reload:before{content:""}.ion-ios-reverse-camera:before{content:""}.ion-ios-reverse-camera-outline:before{content:""}.ion-ios-rewind:before{content:""}.ion-ios-rewind-outline:before{content:""}.ion-ios-rose:before{content:""}.ion-ios-rose-outline:before{content:""}.ion-ios-search:before{content:""}.ion-ios-search-strong:before{content:""}.ion-ios-settings:before{content:""}.ion-ios-settings-strong:before{content:""}.ion-ios-shuffle:before{content:""}.ion-ios-shuffle-strong:before{content:""}.ion-ios-skipbackward:before{content:""}.ion-ios-skipbackward-outline:before{content:""}.ion-ios-skipforward:before{content:""}.ion-ios-skipforward-outline:before{content:""}.ion-ios-snowy:before{content:""}.ion-ios-speedometer:before{content:""}.ion-ios-speedometer-outline:before{content:""}.ion-ios-star:before{content:""}.ion-ios-star-half:before{content:""}.ion-ios-star-outline:before{content:""}.ion-ios-stopwatch:before{content:""}.ion-ios-stopwatch-outline:before{content:""}.ion-ios-sunny:before{content:""}.ion-ios-sunny-outline:before{content:""}.ion-ios-telephone:before{content:""}.ion-ios-telephone-outline:before{content:""}.ion-ios-tennisball:before{content:""}.ion-ios-tennisball-outline:before{content:""}.ion-ios-thunderstorm:before{content:""}.ion-ios-thunderstorm-outline:before{content:""}.ion-ios-time:before{content:""}.ion-ios-time-outline:before{content:""}.ion-ios-timer:before{content:""}.ion-ios-timer-outline:before{content:""}.ion-ios-toggle:before{content:""}.ion-ios-toggle-outline:before{content:""}.ion-ios-trash:before{content:""}.ion-ios-trash-outline:before{content:""}.ion-ios-undo:before{content:""}.ion-ios-undo-outline:before{content:""}.ion-ios-unlocked:before{content:""}.ion-ios-unlocked-outline:before{content:""}.ion-ios-upload:before{content:""}.ion-ios-upload-outline:before{content:""}.ion-ios-videocam:before{content:""}.ion-ios-videocam-outline:before{content:""}.ion-ios-volume-high:before{content:""}.ion-ios-volume-low:before{content:""}.ion-ios-wineglass:before{content:""}.ion-ios-wineglass-outline:before{content:""}.ion-ios-world:before{content:""}.ion-ios-world-outline:before{content:""}.ion-ipad:before{content:""}.ion-iphone:before{content:""}.ion-ipod:before{content:""}.ion-jet:before{content:""}.ion-key:before{content:""}.ion-knife:before{content:""}.ion-laptop:before{content:""}.ion-leaf:before{content:""}.ion-levels:before{content:""}.ion-lightbulb:before{content:""}.ion-link:before{content:""}.ion-load-a:before{content:""}.ion-load-b:before{content:""}.ion-load-c:before{content:""}.ion-load-d:before{content:""}.ion-location:before{content:""}.ion-lock-combination:before{content:""}.ion-locked:before{content:""}.ion-log-in:before{content:""}.ion-log-out:before{content:""}.ion-loop:before{content:""}.ion-magnet:before{content:""}.ion-male:before{content:""}.ion-man:before{content:""}.ion-map:before{content:""}.ion-medkit:before{content:""}.ion-merge:before{content:""}.ion-mic-a:before{content:""}.ion-mic-b:before{content:""}.ion-mic-c:before{content:""}.ion-minus:before{content:""}.ion-minus-circled:before{content:""}.ion-minus-round:before{content:""}.ion-model-s:before{content:""}.ion-monitor:before{content:""}.ion-more:before{content:""}.ion-mouse:before{content:""}.ion-music-note:before{content:""}.ion-navicon:before{content:""}.ion-navicon-round:before{content:""}.ion-navigate:before{content:""}.ion-network:before{content:""}.ion-no-smoking:before{content:""}.ion-nuclear:before{content:""}.ion-outlet:before{content:""}.ion-paintbrush:before{content:""}.ion-paintbucket:before{content:""}.ion-paper-airplane:before{content:""}.ion-paperclip:before{content:""}.ion-pause:before{content:""}.ion-person:before{content:""}.ion-person-add:before{content:""}.ion-person-stalker:before{content:""}.ion-pie-graph:before{content:""}.ion-pin:before{content:""}.ion-pinpoint:before{content:""}.ion-pizza:before{content:""}.ion-plane:before{content:""}.ion-planet:before{content:""}.ion-play:before{content:""}.ion-playstation:before{content:""}.ion-plus:before{content:""}.ion-plus-circled:before{content:""}.ion-plus-round:before{content:""}.ion-podium:before{content:""}.ion-pound:before{content:""}.ion-power:before{content:""}.ion-pricetag:before{content:""}.ion-pricetags:before{content:""}.ion-printer:before{content:""}.ion-pull-request:before{content:""}.ion-qr-scanner:before{content:""}.ion-quote:before{content:""}.ion-radio-waves:before{content:""}.ion-record:before{content:""}.ion-refresh:before{content:""}.ion-reply:before{content:""}.ion-reply-all:before{content:""}.ion-ribbon-a:before{content:""}.ion-ribbon-b:before{content:""}.ion-sad:before{content:""}.ion-sad-outline:before{content:""}.ion-scissors:before{content:""}.ion-search:before{content:""}.ion-settings:before{content:""}.ion-share:before{content:""}.ion-shuffle:before{content:""}.ion-skip-backward:before{content:""}.ion-skip-forward:before{content:""}.ion-social-android:before{content:""}.ion-social-android-outline:before{content:""}.ion-social-angular:before{content:""}.ion-social-angular-outline:before{content:""}.ion-social-apple:before{content:""}.ion-social-apple-outline:before{content:""}.ion-social-bitcoin:before{content:""}.ion-social-bitcoin-outline:before{content:""}.ion-social-buffer:before{content:""}.ion-social-buffer-outline:before{content:""}.ion-social-chrome:before{content:""}.ion-social-chrome-outline:before{content:""}.ion-social-codepen:before{content:""}.ion-social-codepen-outline:before{content:""}.ion-social-css3:before{content:""}.ion-social-css3-outline:before{content:""}.ion-social-designernews:before{content:""}.ion-social-designernews-outline:before{content:""}.ion-social-dribbble:before{content:""}.ion-social-dribbble-outline:before{content:""}.ion-social-dropbox:before{content:""}.ion-social-dropbox-outline:before{content:""}.ion-social-euro:before{content:""}.ion-social-euro-outline:before{content:""}.ion-social-facebook:before{content:""}.ion-social-facebook-outline:before{content:""}.ion-social-foursquare:before{content:""}.ion-social-foursquare-outline:before{content:""}.ion-social-freebsd-devil:before{content:""}.ion-social-github:before{content:""}.ion-social-github-outline:before{content:""}.ion-social-google:before{content:""}.ion-social-google-outline:before{content:""}.ion-social-googleplus:before{content:""}.ion-social-googleplus-outline:before{content:""}.ion-social-hackernews:before{content:""}.ion-social-hackernews-outline:before{content:""}.ion-social-html5:before{content:""}.ion-social-html5-outline:before{content:""}.ion-social-instagram:before{content:""}.ion-social-instagram-outline:before{content:""}.ion-social-javascript:before{content:""}.ion-social-javascript-outline:before{content:""}.ion-social-linkedin:before{content:""}.ion-social-linkedin-outline:before{content:""}.ion-social-markdown:before{content:""}.ion-social-nodejs:before{content:""}.ion-social-octocat:before{content:""}.ion-social-pinterest:before{content:""}.ion-social-pinterest-outline:before{content:""}.ion-social-python:before{content:""}.ion-social-reddit:before{content:""}.ion-social-reddit-outline:before{content:""}.ion-social-rss:before{content:""}.ion-social-rss-outline:before{content:""}.ion-social-sass:before{content:""}.ion-social-skype:before{content:""}.ion-social-skype-outline:before{content:""}.ion-social-snapchat:before{content:""}.ion-social-snapchat-outline:before{content:""}.ion-social-tumblr:before{content:""}.ion-social-tumblr-outline:before{content:""}.ion-social-tux:before{content:""}.ion-social-twitch:before{content:""}.ion-social-twitch-outline:before{content:""}.ion-social-twitter:before{content:""}.ion-social-twitter-outline:before{content:""}.ion-social-usd:before{content:""}.ion-social-usd-outline:before{content:""}.ion-social-vimeo:before{content:""}.ion-social-vimeo-outline:before{content:""}.ion-social-whatsapp:before{content:""}.ion-social-whatsapp-outline:before{content:""}.ion-social-windows:before{content:""}.ion-social-windows-outline:before{content:""}.ion-social-wordpress:before{content:""}.ion-social-wordpress-outline:before{content:""}.ion-social-yahoo:before{content:""}.ion-social-yahoo-outline:before{content:""}.ion-social-yen:before{content:""}.ion-social-yen-outline:before{content:""}.ion-social-youtube:before{content:""}.ion-social-youtube-outline:before{content:""}.ion-soup-can:before{content:""}.ion-soup-can-outline:before{content:""}.ion-speakerphone:before{content:""}.ion-speedometer:before{content:""}.ion-spoon:before{content:""}.ion-star:before{content:""}.ion-stats-bars:before{content:""}.ion-steam:before{content:""}.ion-stop:before{content:""}.ion-thermometer:before{content:""}.ion-thumbsdown:before{content:""}.ion-thumbsup:before{content:""}.ion-toggle:before{content:""}.ion-toggle-filled:before{content:""}.ion-transgender:before{content:""}.ion-trash-a:before{content:""}.ion-trash-b:before{content:""}.ion-trophy:before{content:""}.ion-tshirt:before{content:""}.ion-tshirt-outline:before{content:""}.ion-umbrella:before{content:""}.ion-university:before{content:""}.ion-unlocked:before{content:""}.ion-upload:before{content:""}.ion-usb:before{content:""}.ion-videocamera:before{content:""}.ion-volume-high:before{content:""}.ion-volume-low:before{content:""}.ion-volume-medium:before{content:""}.ion-volume-mute:before{content:""}.ion-wand:before{content:""}.ion-waterdrop:before{content:""}.ion-wifi:before{content:""}.ion-wineglass:before{content:""}.ion-woman:before{content:""}.ion-wrench:before{content:""}.ion-xbox:before{content:""}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;vertical-align:baseline;font:inherit;font-size:100%}ol,ul{list-style:none}blockquote,q{quotes:none}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none!important}html{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}:focus,a,a:active,a:focus,a:hover,button,button:focus{outline:0}a{-webkit-user-drag:none;-webkit-tap-highlight-color:transparent}a[href]:hover{cursor:pointer}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}code,kbd,pre,samp{font-size:1em;font-family:monospace,serif}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{position:relative;vertical-align:baseline;font-size:75%;line-height:0}sup{top:-.5em}sub{bottom:-.25em}fieldset{margin:0 2px;padding:.35em .625em .75em;border:1px solid silver}button,input,select,textarea{margin:0;outline-offset:0;outline-style:none;outline-width:0;-webkit-font-smoothing:inherit;background-image:none}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto}img{-webkit-user-drag:none}table{border-spacing:0;border-collapse:collapse}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{overflow:hidden;-ms-touch-action:pan-y;touch-action:pan-y}.ionic-body,body{-webkit-touch-callout:none;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0;padding:0;color:#000;word-wrap:break-word;font-size:14px;font-family:-apple-system;font-family:-apple-system,Roboto,Noto,"Helvetica Neue",sans-serif;line-height:20px;text-rendering:optimizeLegibility;-webkit-backface-visibility:hidden;-webkit-user-drag:none;-ms-content-zooming:none}body.grade-b,body.grade-c{text-rendering:auto}.content{position:relative}.scroll-content{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;margin-top:-1px;padding-top:1px;margin-bottom:-1px;width:auto;height:auto}.menu .scroll-content.scroll-content-false{z-index:11}.scroll-view{position:relative;display:block;overflow:hidden;margin-top:-1px}.scroll-view.overflow-scroll{position:relative}.scroll-view.scroll-x{overflow-x:scroll;overflow-y:hidden}.scroll-view.scroll-y{overflow-x:hidden;overflow-y:scroll}.scroll-view.scroll-xy{overflow-x:scroll;overflow-y:scroll}.scroll{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-transform-origin:left top;transform-origin:left top}@-ms-viewport{width:device-width}.scroll-bar{position:absolute;z-index:9999}.ng-animate .scroll-bar{visibility:hidden}.scroll-bar-h{right:2px;bottom:3px;left:2px;height:3px}.scroll-bar-h .scroll-bar-indicator{height:100%}.scroll-bar-v{top:2px;right:3px;bottom:2px;width:3px}.scroll-bar-v .scroll-bar-indicator{width:100%}.scroll-bar-indicator{position:absolute;border-radius:4px;background:rgba(0,0,0,.3);opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.scroll-bar-indicator.scroll-bar-fade-out{opacity:0}.platform-android .scroll-bar-indicator{border-radius:0}.grade-b .scroll-bar-indicator,.grade-c .scroll-bar-indicator{background:#aaa}.grade-b .scroll-bar-indicator.scroll-bar-fade-out,.grade-c .scroll-bar-indicator.scroll-bar-fade-out{-webkit-transition:none;transition:none}ion-infinite-scroll{height:60px;width:100%;display:block;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}ion-infinite-scroll .icon{font-size:30px;color:#666}ion-infinite-scroll:not(.active) .icon:before,ion-infinite-scroll:not(.active) .spinner{display:none}.overflow-scroll{overflow-x:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;top:0;right:0;bottom:0;left:0;position:absolute}.overflow-scroll.pane{overflow-x:hidden;overflow-y:scroll}.overflow-scroll .scroll{position:static;height:100%;-webkit-transform:translate3d(0,0,0)}.has-header{top:44px}.no-header{top:0}.has-subheader{top:88px}.has-tabs-top{top:93px}.has-header.has-subheader.has-tabs-top{top:137px}.has-footer{bottom:44px}.has-subfooter{bottom:88px}.bar-footer.has-tabs,.has-tabs{bottom:49px}.bar-footer.has-tabs.pane,.has-tabs.pane{bottom:49px;height:auto}.bar-subfooter.has-tabs,.has-footer.has-tabs{bottom:93px}.pane{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-duration:0;transition-duration:0;z-index:1}.view{z-index:1}.pane,.view{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;overflow:hidden}.view-container{position:absolute;display:block;width:100%;height:100%}p{margin:0 0 10px}small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:#000;font-weight:500;font-family:-apple-system,Roboto,Noto,"Helvetica Neue",sans-serif;line-height:1.2}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1:first-child,.h2:first-child,.h3:first-child,h1:first-child,h2:first-child,h3:first-child{margin-top:0}.h1+.h1,.h1+.h2,.h1+.h3,.h1+h1,.h1+h2,.h1+h3,.h2+.h1,.h2+.h2,.h2+.h3,.h2+h1,.h2+h2,.h2+h3,.h3+.h1,.h3+.h2,.h3+.h3,.h3+h1,.h3+h2,.h3+h3,h1+.h1,h1+.h2,h1+.h3,h1+h1,h1+h2,h1+h3,h2+.h1,h2+.h2,h2+.h3,h2+h1,h2+h2,h2+h3,h3+.h1,h3+.h2,h3+.h3,h3+h1,h3+h2,h3+h3{margin-top:10px}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.h1 small,h1 small{font-size:24px}.h2 small,h2 small{font-size:18px}.h3 small,.h4 small,h3 small,h4 small{font-size:14px}dl{margin-bottom:20px}dd,dt{line-height:1.42857}dt{font-weight:700}blockquote{margin:0 0 20px;padding:10px 20px;border-left:5px solid gray}blockquote p{font-weight:300;font-size:17.5px;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.42857}blockquote small:before{content:'\2014 \00A0'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.42857}a{color:#387ef5}a.subdued{padding-right:10px;color:#888;text-decoration:none}a.subdued:hover{text-decoration:none}a.subdued:last-child{padding-right:0}.action-sheet-backdrop{-webkit-transition:background-color 150ms ease-in-out;transition:background-color 150ms ease-in-out;position:fixed;top:0;left:0;z-index:11;width:100%;height:100%;background-color:transparent}.action-sheet-backdrop.active{background-color:rgba(0,0,0,.4)}.action-sheet-wrapper{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition:all cubic-bezier(.36,.66,.04,1) 500ms;transition:all cubic-bezier(.36,.66,.04,1) 500ms;position:absolute;bottom:0;left:0;right:0;width:100%;max-width:500px;margin:auto}.action-sheet-up{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.action-sheet{margin-left:8px;margin-right:8px;width:auto;z-index:11;overflow:hidden}.action-sheet .button{display:block;padding:1px;width:100%;border-radius:0;border-color:#d1d3d6;background-color:transparent;color:#007aff;font-size:21px}.action-sheet .button:hover{color:#007aff}.action-sheet .button.destructive,.action-sheet .button.destructive:hover{color:#ff3b30}.action-sheet .button.activated,.action-sheet .button.active{box-shadow:none;border-color:#d1d3d6;color:#007aff;background:#e4e5e7}.action-sheet-has-icons .icon{position:absolute;left:16px}.action-sheet-title{padding:16px;color:#8f8f8f;text-align:center;font-size:13px}.action-sheet-group{margin-bottom:8px;border-radius:4px;background-color:#fff;overflow:hidden}.action-sheet-group .button{border-width:1px 0 0}.action-sheet-group .button:first-child:last-child{border-width:0}.action-sheet-options{background:#f1f2f3}.action-sheet-cancel .button{font-weight:500}.action-sheet-open,.action-sheet-open.modal-open .modal{pointer-events:none}.action-sheet-open .action-sheet-backdrop{pointer-events:auto}.platform-android .action-sheet-backdrop.active{background-color:rgba(0,0,0,.2)}.platform-android .action-sheet{margin:0}.platform-android .action-sheet .action-sheet-title,.platform-android .action-sheet .button{text-align:left;border-color:transparent;font-size:16px;color:inherit}.platform-android .action-sheet .action-sheet-title{font-size:14px;padding:16px;color:#666}.platform-android .action-sheet .button.activated,.platform-android .action-sheet .button.active{background:#e8e8e8}.platform-android .action-sheet-group{margin:0;border-radius:0;background-color:#fafafa}.platform-android .action-sheet-cancel{display:none}.platform-android .action-sheet-has-icons .button{padding-left:56px}.backdrop{position:fixed;top:0;left:0;z-index:11;width:100%;height:100%;background-color:rgba(0,0,0,.4);visibility:hidden;opacity:0;-webkit-transition:.1s opacity linear;transition:.1s opacity linear}.backdrop.visible{visibility:visible}.backdrop.active{opacity:1}.bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;right:0;left:0;z-index:9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:5px;width:100%;height:44px;border-width:0;border-style:solid;border-top:1px solid transparent;border-bottom:1px solid #ddd;background-color:#fff;background-size:0}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.bar{border:none;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);background-position:bottom;background-size:100% 1px;background-repeat:no-repeat}}.bar.bar-clear{border:none;background:0 0;color:#fff}.bar.bar-clear .button,.bar.bar-clear .title{color:#fff}.bar.item-input-inset .item-input-wrapper{margin-top:-1px}.bar.item-input-inset .item-input-wrapper input{padding-left:8px;width:94%;height:28px;background:0 0}.bar.bar-light{border-color:#ddd;background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.bar.bar-light .title{color:#444}.bar.bar-light.bar-footer{background-image:linear-gradient(180deg,#ddd,#ddd 50%,transparent 50%)}.bar.bar-stable{border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.bar.bar-stable .title{color:#444}.bar.bar-stable.bar-footer{background-image:linear-gradient(180deg,#b2b2b2,#b2b2b2 50%,transparent 50%)}.bar.bar-positive{border-color:#0c60ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);color:#fff}.bar.bar-positive .title{color:#fff}.bar.bar-positive.bar-footer{background-image:linear-gradient(180deg,#0c60ee,#0c60ee 50%,transparent 50%)}.bar.bar-calm{border-color:#0a9dc7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);color:#fff}.bar.bar-calm .title{color:#fff}.bar.bar-calm.bar-footer{background-image:linear-gradient(180deg,#0a9dc7,#0a9dc7 50%,transparent 50%)}.bar.bar-assertive{border-color:#e42112;background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);color:#fff}.bar.bar-assertive .title{color:#fff}.bar.bar-assertive.bar-footer{background-image:linear-gradient(180deg,#e42112,#e42112 50%,transparent 50%)}.bar.bar-balanced{border-color:#28a54c;background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);color:#fff}.bar.bar-balanced .title{color:#fff}.bar.bar-balanced.bar-footer{background-image:linear-gradient(180deg,#28a54c,#28a54c 50%,transparent 50%)}.bar.bar-energized{border-color:#e6b500;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);color:#fff}.bar.bar-energized .title{color:#fff}.bar.bar-energized.bar-footer{background-image:linear-gradient(180deg,#e6b500,#e6b500 50%,transparent 50%)}.bar.bar-royal{border-color:#6b46e5;background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);color:#fff}.bar.bar-royal .title{color:#fff}.bar.bar-royal.bar-footer{background-image:linear-gradient(180deg,#6b46e5,#6b46e5 50%,transparent 50%)}.bar.bar-dark{border-color:#111;background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.bar.bar-dark .title{color:#fff}.bar.bar-dark.bar-footer{background-image:linear-gradient(180deg,#111,#111 50%,transparent 50%)}.bar .title{display:block;position:absolute;top:0;right:0;left:0;z-index:0;overflow:hidden;margin:0 10px;min-width:30px;height:43px;text-align:center;text-overflow:ellipsis;white-space:nowrap;font-size:17px;font-weight:500;line-height:44px}.bar .title.title-left{text-align:left}.bar .title.title-right{text-align:right}.bar .title a{color:inherit}.bar .button,.bar button{z-index:1;padding:0 8px;min-width:initial;min-height:31px;font-weight:400;font-size:13px;line-height:32px}.bar .button .icon:before,.bar .button.button-icon:before,.bar .button.icon-left:before,.bar .button.icon-right:before,.bar .button.icon:before,.bar button .icon:before,.bar button.button-icon:before,.bar button.icon-left:before,.bar button.icon-right:before,.bar button.icon:before{padding-right:2px;padding-left:2px;font-size:20px;line-height:32px}.bar .button.button-icon,.bar button.button-icon{font-size:17px}.bar .button.button-icon .icon:before,.bar .button.button-icon.icon-left:before,.bar .button.button-icon.icon-right:before,.bar .button.button-icon:before,.bar button.button-icon .icon:before,.bar button.button-icon.icon-left:before,.bar button.button-icon.icon-right:before,.bar button.button-icon:before{vertical-align:top;font-size:32px;line-height:32px}.bar .button.button-clear,.bar button.button-clear{padding-right:2px;padding-left:2px;font-weight:300;font-size:17px}.bar .button.button-clear .icon:before,.bar .button.button-clear.icon-left:before,.bar .button.button-clear.icon-right:before,.bar .button.button-clear.icon:before,.bar button.button-clear .icon:before,.bar button.button-clear.icon-left:before,.bar button.button-clear.icon-right:before,.bar button.button-clear.icon:before{font-size:32px;line-height:32px}.bar .button.back-button,.bar button.back-button{display:block;margin-right:5px;padding:0;white-space:nowrap;font-weight:400}.bar .button.back-button.activated,.bar .button.back-button.active,.bar button.back-button.activated,.bar button.back-button.active{opacity:.2}.bar .button-bar>.button,.bar .buttons>.button{min-height:31px;line-height:32px}.bar .button+.button-bar,.bar .button-bar+.button{margin-left:5px}.bar .buttons,.bar .buttons.primary-buttons,.bar .buttons.secondary-buttons{display:inherit}.bar .buttons span{display:inline-block}.bar .buttons-left span{margin-right:5px;display:inherit}.bar .buttons-right span{margin-left:5px;display:inherit}.bar .buttons.pull-right,.bar .title+.button:last-child,.bar .title+.buttons,.bar>.button+.button:last-child,.bar>.button.pull-right{position:absolute;top:5px;right:5px;bottom:5px}.platform-android .nav-bar-has-subheader .bar{background-image:none}.platform-android .bar .back-button .icon:before{font-size:24px}.platform-android .bar .title{font-size:19px;line-height:44px}.bar-light .button{border-color:#ddd;background-color:#fff;color:#444}.bar-light .button:hover{color:#444;text-decoration:none}.bar-light .button.activated,.bar-light .button.active{border-color:#ccc;background-color:#fafafa}.bar-light .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444;font-size:17px}.bar-light .button.button-icon{border-color:transparent;background:0 0}.bar-stable .button{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.bar-stable .button:hover{color:#444;text-decoration:none}.bar-stable .button.activated,.bar-stable .button.active{border-color:#a2a2a2;background-color:#e5e5e5}.bar-stable .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444;font-size:17px}.bar-stable .button.button-icon{border-color:transparent;background:0 0}.bar-positive .button{border-color:#0c60ee;background-color:#387ef5;color:#fff}.bar-positive .button:hover{color:#fff;text-decoration:none}.bar-positive .button.activated,.bar-positive .button.active{border-color:#0c60ee;background-color:#0c60ee}.bar-positive .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-positive .button.button-icon{border-color:transparent;background:0 0}.bar-calm .button{border-color:#0a9dc7;background-color:#11c1f3;color:#fff}.bar-calm .button:hover{color:#fff;text-decoration:none}.bar-calm .button.activated,.bar-calm .button.active{border-color:#0a9dc7;background-color:#0a9dc7}.bar-calm .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-calm .button.button-icon{border-color:transparent;background:0 0}.bar-assertive .button{border-color:#e42112;background-color:#ef473a;color:#fff}.bar-assertive .button:hover{color:#fff;text-decoration:none}.bar-assertive .button.activated,.bar-assertive .button.active{border-color:#e42112;background-color:#e42112}.bar-assertive .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-assertive .button.button-icon{border-color:transparent;background:0 0}.bar-balanced .button{border-color:#28a54c;background-color:#33cd5f;color:#fff}.bar-balanced .button:hover{color:#fff;text-decoration:none}.bar-balanced .button.activated,.bar-balanced .button.active{border-color:#28a54c;background-color:#28a54c}.bar-balanced .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-balanced .button.button-icon{border-color:transparent;background:0 0}.bar-energized .button{border-color:#e6b500;background-color:#ffc900;color:#fff}.bar-energized .button:hover{color:#fff;text-decoration:none}.bar-energized .button.activated,.bar-energized .button.active{border-color:#e6b500;background-color:#e6b500}.bar-energized .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-energized .button.button-icon{border-color:transparent;background:0 0}.bar-royal .button{border-color:#6b46e5;background-color:#886aea;color:#fff}.bar-royal .button:hover{color:#fff;text-decoration:none}.bar-royal .button.activated,.bar-royal .button.active{border-color:#6b46e5;background-color:#6b46e5}.bar-royal .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-royal .button.button-icon{border-color:transparent;background:0 0}.bar-dark .button{border-color:#111;background-color:#444;color:#fff}.bar-dark .button:hover{color:#fff;text-decoration:none}.bar-dark .button.activated,.bar-dark .button.active{border-color:#000;background-color:#262626}.bar-dark .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-dark .button.button-icon{border-color:transparent;background:0 0}.bar-header{top:0;border-top-width:0;border-bottom-width:1px}.bar-header.has-tabs-top,.tabs-top .bar-header{border-bottom-width:0;background-image:none}.bar-footer{bottom:0;border-top-width:1px;border-bottom-width:0;background-position:top;height:44px}.bar-footer.item-input-inset{position:absolute}.bar-footer .title{height:43px;line-height:44px}.bar-tabs{padding:0}.bar-subheader{top:44px;height:44px}.bar-subheader .title{height:43px;line-height:44px}.bar-subfooter{bottom:44px;height:44px}.bar-subfooter .title{height:43px;line-height:44px}.nav-bar-block{position:absolute;top:0;right:0;left:0;z-index:9}.bar .back-button.hide,.bar .buttons .hide{display:none}.nav-bar-tabs-top .bar{background-image:none}.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:horizontal;-moz-flex-direction:horizontal;-ms-flex-direction:horizontal;flex-direction:horizontal;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);border-color:#b2b2b2;position:absolute;bottom:0;z-index:5;width:100%;height:49px;border-style:solid;border-top-width:1px;background-size:0;line-height:49px}.tabs .tab-item .badge{background-color:#444;color:#f8f8f8}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.tabs{padding-top:2px;border-top:none!important;border-bottom:none;background-position:top;background-size:100% 1px;background-repeat:no-repeat}}.tabs-light>.tabs,.tabs.tabs-light{border-color:#ddd;background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.tabs-light>.tabs .tab-item .badge,.tabs.tabs-light .tab-item .badge{background-color:#444;color:#fff}.tabs-stable>.tabs,.tabs.tabs-stable{border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.tabs-stable>.tabs .tab-item .badge,.tabs.tabs-stable .tab-item .badge{background-color:#444;color:#f8f8f8}.tabs-positive>.tabs,.tabs.tabs-positive{border-color:#0c60ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);color:#fff}.tabs-positive>.tabs .tab-item .badge,.tabs.tabs-positive .tab-item .badge{background-color:#fff;color:#387ef5}.tabs-calm>.tabs,.tabs.tabs-calm{border-color:#0a9dc7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);color:#fff}.tabs-calm>.tabs .tab-item .badge,.tabs.tabs-calm .tab-item .badge{background-color:#fff;color:#11c1f3}.tabs-assertive>.tabs,.tabs.tabs-assertive{border-color:#e42112;background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);color:#fff}.tabs-assertive>.tabs .tab-item .badge,.tabs.tabs-assertive .tab-item .badge{background-color:#fff;color:#ef473a}.tabs-balanced>.tabs,.tabs.tabs-balanced{border-color:#28a54c;background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);color:#fff}.tabs-balanced>.tabs .tab-item .badge,.tabs.tabs-balanced .tab-item .badge{background-color:#fff;color:#33cd5f}.tabs-energized>.tabs,.tabs.tabs-energized{border-color:#e6b500;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);color:#fff}.tabs-energized>.tabs .tab-item .badge,.tabs.tabs-energized .tab-item .badge{background-color:#fff;color:#ffc900}.tabs-royal>.tabs,.tabs.tabs-royal{border-color:#6b46e5;background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);color:#fff}.tabs-royal>.tabs .tab-item .badge,.tabs.tabs-royal .tab-item .badge{background-color:#fff;color:#886aea}.tabs-dark>.tabs,.tabs.tabs-dark{border-color:#111;background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.tabs-dark>.tabs .tab-item .badge,.tabs.tabs-dark .tab-item .badge{background-color:#fff;color:#444}.tabs-striped .tabs{background-color:#fff;background-image:none;border:none;border-bottom:1px solid #ddd;padding-top:2px}.tabs-striped .tab-item.activated,.tabs-striped .tab-item.active,.tabs-striped .tab-item.tab-item-active{margin-top:-2px;border-style:solid;border-width:2px 0 0;border-color:#444}.tabs-striped .tab-item.activated .badge,.tabs-striped .tab-item.active .badge,.tabs-striped .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-light .tabs{background-color:#fff}.tabs-striped.tabs-light .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-light .tab-item .badge{opacity:.4}.tabs-striped.tabs-light .tab-item.activated,.tabs-striped.tabs-light .tab-item.active,.tabs-striped.tabs-light .tab-item.tab-item-active{margin-top:-2px;color:#444;border-style:solid;border-width:2px 0 0;border-color:#444}.tabs-striped.tabs-stable .tabs{background-color:#f8f8f8}.tabs-striped.tabs-stable .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-stable .tab-item .badge{opacity:.4}.tabs-striped.tabs-stable .tab-item.activated,.tabs-striped.tabs-stable .tab-item.active,.tabs-striped.tabs-stable .tab-item.tab-item-active{margin-top:-2px;color:#444;border-style:solid;border-width:2px 0 0;border-color:#444}.tabs-striped.tabs-positive .tabs{background-color:#387ef5}.tabs-striped.tabs-positive .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-positive .tab-item .badge{opacity:.4}.tabs-striped.tabs-positive .tab-item.activated,.tabs-striped.tabs-positive .tab-item.active,.tabs-striped.tabs-positive .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-calm .tabs{background-color:#11c1f3}.tabs-striped.tabs-calm .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-calm .tab-item .badge{opacity:.4}.tabs-striped.tabs-calm .tab-item.activated,.tabs-striped.tabs-calm .tab-item.active,.tabs-striped.tabs-calm .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-assertive .tabs{background-color:#ef473a}.tabs-striped.tabs-assertive .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-assertive .tab-item .badge{opacity:.4}.tabs-striped.tabs-assertive .tab-item.activated,.tabs-striped.tabs-assertive .tab-item.active,.tabs-striped.tabs-assertive .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-balanced .tabs{background-color:#33cd5f}.tabs-striped.tabs-balanced .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-balanced .tab-item .badge{opacity:.4}.tabs-striped.tabs-balanced .tab-item.activated,.tabs-striped.tabs-balanced .tab-item.active,.tabs-striped.tabs-balanced .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-energized .tabs{background-color:#ffc900}.tabs-striped.tabs-energized .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-energized .tab-item .badge{opacity:.4}.tabs-striped.tabs-energized .tab-item.activated,.tabs-striped.tabs-energized .tab-item.active,.tabs-striped.tabs-energized .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-royal .tabs{background-color:#886aea}.tabs-striped.tabs-royal .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-royal .tab-item .badge{opacity:.4}.tabs-striped.tabs-royal .tab-item.activated,.tabs-striped.tabs-royal .tab-item.active,.tabs-striped.tabs-royal .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-dark .tabs{background-color:#444}.tabs-striped.tabs-dark .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-dark .tab-item .badge{opacity:.4}.tabs-striped.tabs-dark .tab-item.activated,.tabs-striped.tabs-dark .tab-item.active,.tabs-striped.tabs-dark .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-background-light .tabs{background-color:#fff;background-image:none}.tabs-striped.tabs-background-stable .tabs{background-color:#f8f8f8;background-image:none}.tabs-striped.tabs-background-positive .tabs{background-color:#387ef5;background-image:none}.tabs-striped.tabs-background-calm .tabs{background-color:#11c1f3;background-image:none}.tabs-striped.tabs-background-assertive .tabs{background-color:#ef473a;background-image:none}.tabs-striped.tabs-background-balanced .tabs{background-color:#33cd5f;background-image:none}.tabs-striped.tabs-background-energized .tabs{background-color:#ffc900;background-image:none}.tabs-striped.tabs-background-royal .tabs{background-color:#886aea;background-image:none}.tabs-striped.tabs-background-dark .tabs{background-color:#444;background-image:none}.tabs-striped.tabs-color-light .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-color-light .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-light .tab-item.activated,.tabs-striped.tabs-color-light .tab-item.active,.tabs-striped.tabs-color-light .tab-item.tab-item-active{margin-top:-2px;color:#fff;border:0 solid #fff;border-top-width:2px}.tabs-striped.tabs-color-light .tab-item.activated .badge,.tabs-striped.tabs-color-light .tab-item.active .badge,.tabs-striped.tabs-color-light .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-stable .tab-item{color:rgba(248,248,248,.4);opacity:1}.tabs-striped.tabs-color-stable .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-stable .tab-item.activated,.tabs-striped.tabs-color-stable .tab-item.active,.tabs-striped.tabs-color-stable .tab-item.tab-item-active{margin-top:-2px;color:#f8f8f8;border:0 solid #f8f8f8;border-top-width:2px}.tabs-striped.tabs-color-stable .tab-item.activated .badge,.tabs-striped.tabs-color-stable .tab-item.active .badge,.tabs-striped.tabs-color-stable .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-positive .tab-item{color:rgba(56,126,245,.4);opacity:1}.tabs-striped.tabs-color-positive .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-positive .tab-item.activated,.tabs-striped.tabs-color-positive .tab-item.active,.tabs-striped.tabs-color-positive .tab-item.tab-item-active{margin-top:-2px;color:#387ef5;border:0 solid #387ef5;border-top-width:2px}.tabs-striped.tabs-color-positive .tab-item.activated .badge,.tabs-striped.tabs-color-positive .tab-item.active .badge,.tabs-striped.tabs-color-positive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-calm .tab-item{color:rgba(17,193,243,.4);opacity:1}.tabs-striped.tabs-color-calm .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-calm .tab-item.activated,.tabs-striped.tabs-color-calm .tab-item.active,.tabs-striped.tabs-color-calm .tab-item.tab-item-active{margin-top:-2px;color:#11c1f3;border:0 solid #11c1f3;border-top-width:2px}.tabs-striped.tabs-color-calm .tab-item.activated .badge,.tabs-striped.tabs-color-calm .tab-item.active .badge,.tabs-striped.tabs-color-calm .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-assertive .tab-item{color:rgba(239,71,58,.4);opacity:1}.tabs-striped.tabs-color-assertive .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-assertive .tab-item.activated,.tabs-striped.tabs-color-assertive .tab-item.active,.tabs-striped.tabs-color-assertive .tab-item.tab-item-active{margin-top:-2px;color:#ef473a;border:0 solid #ef473a;border-top-width:2px}.tabs-striped.tabs-color-assertive .tab-item.activated .badge,.tabs-striped.tabs-color-assertive .tab-item.active .badge,.tabs-striped.tabs-color-assertive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-balanced .tab-item{color:rgba(51,205,95,.4);opacity:1}.tabs-striped.tabs-color-balanced .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-balanced .tab-item.activated,.tabs-striped.tabs-color-balanced .tab-item.active,.tabs-striped.tabs-color-balanced .tab-item.tab-item-active{margin-top:-2px;color:#33cd5f;border:0 solid #33cd5f;border-top-width:2px}.tabs-striped.tabs-color-balanced .tab-item.activated .badge,.tabs-striped.tabs-color-balanced .tab-item.active .badge,.tabs-striped.tabs-color-balanced .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-energized .tab-item{color:rgba(255,201,0,.4);opacity:1}.tabs-striped.tabs-color-energized .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-energized .tab-item.activated,.tabs-striped.tabs-color-energized .tab-item.active,.tabs-striped.tabs-color-energized .tab-item.tab-item-active{margin-top:-2px;color:#ffc900;border:0 solid #ffc900;border-top-width:2px}.tabs-striped.tabs-color-energized .tab-item.activated .badge,.tabs-striped.tabs-color-energized .tab-item.active .badge,.tabs-striped.tabs-color-energized .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-royal .tab-item{color:rgba(136,106,234,.4);opacity:1}.tabs-striped.tabs-color-royal .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-royal .tab-item.activated,.tabs-striped.tabs-color-royal .tab-item.active,.tabs-striped.tabs-color-royal .tab-item.tab-item-active{margin-top:-2px;color:#886aea;border:0 solid #886aea;border-top-width:2px}.tabs-striped.tabs-color-royal .tab-item.activated .badge,.tabs-striped.tabs-color-royal .tab-item.active .badge,.tabs-striped.tabs-color-royal .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-dark .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-color-dark .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-dark .tab-item.activated,.tabs-striped.tabs-color-dark .tab-item.active,.tabs-striped.tabs-color-dark .tab-item.tab-item-active{margin-top:-2px;color:#444;border:0 solid #444;border-top-width:2px}.tabs-striped.tabs-color-dark .tab-item.activated .badge,.tabs-striped.tabs-color-dark .tab-item.active .badge,.tabs-striped.tabs-color-dark .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-background-light .tabs,.tabs-background-light>.tabs{background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);border-color:#ddd}.tabs-background-stable .tabs,.tabs-background-stable>.tabs{background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);border-color:#b2b2b2}.tabs-background-positive .tabs,.tabs-background-positive>.tabs{background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);border-color:#0c60ee}.tabs-background-calm .tabs,.tabs-background-calm>.tabs{background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);border-color:#0a9dc7}.tabs-background-assertive .tabs,.tabs-background-assertive>.tabs{background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);border-color:#e42112}.tabs-background-balanced .tabs,.tabs-background-balanced>.tabs{background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);border-color:#28a54c}.tabs-background-energized .tabs,.tabs-background-energized>.tabs{background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);border-color:#e6b500}.tabs-background-royal .tabs,.tabs-background-royal>.tabs{background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);border-color:#6b46e5}.tabs-background-dark .tabs,.tabs-background-dark>.tabs{background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);border-color:#111}.tabs-color-light .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-color-light .tab-item .badge{opacity:.4}.tabs-color-light .tab-item.activated,.tabs-color-light .tab-item.active,.tabs-color-light .tab-item.tab-item-active{color:#fff;border:0 solid #fff}.tabs-color-light .tab-item.activated .badge,.tabs-color-light .tab-item.active .badge,.tabs-color-light .tab-item.tab-item-active .badge{opacity:1}.tabs-color-stable .tab-item{color:rgba(248,248,248,.4);opacity:1}.tabs-color-stable .tab-item .badge{opacity:.4}.tabs-color-stable .tab-item.activated,.tabs-color-stable .tab-item.active,.tabs-color-stable .tab-item.tab-item-active{color:#f8f8f8;border:0 solid #f8f8f8}.tabs-color-stable .tab-item.activated .badge,.tabs-color-stable .tab-item.active .badge,.tabs-color-stable .tab-item.tab-item-active .badge{opacity:1}.tabs-color-positive .tab-item{color:rgba(56,126,245,.4);opacity:1}.tabs-color-positive .tab-item .badge{opacity:.4}.tabs-color-positive .tab-item.activated,.tabs-color-positive .tab-item.active,.tabs-color-positive .tab-item.tab-item-active{color:#387ef5;border:0 solid #387ef5}.tabs-color-positive .tab-item.activated .badge,.tabs-color-positive .tab-item.active .badge,.tabs-color-positive .tab-item.tab-item-active .badge{opacity:1}.tabs-color-calm .tab-item{color:rgba(17,193,243,.4);opacity:1}.tabs-color-calm .tab-item .badge{opacity:.4}.tabs-color-calm .tab-item.activated,.tabs-color-calm .tab-item.active,.tabs-color-calm .tab-item.tab-item-active{color:#11c1f3;border:0 solid #11c1f3}.tabs-color-calm .tab-item.activated .badge,.tabs-color-calm .tab-item.active .badge,.tabs-color-calm .tab-item.tab-item-active .badge{opacity:1}.tabs-color-assertive .tab-item{color:rgba(239,71,58,.4);opacity:1}.tabs-color-assertive .tab-item .badge{opacity:.4}.tabs-color-assertive .tab-item.activated,.tabs-color-assertive .tab-item.active,.tabs-color-assertive .tab-item.tab-item-active{color:#ef473a;border:0 solid #ef473a}.tabs-color-assertive .tab-item.activated .badge,.tabs-color-assertive .tab-item.active .badge,.tabs-color-assertive .tab-item.tab-item-active .badge{opacity:1}.tabs-color-balanced .tab-item{color:rgba(51,205,95,.4);opacity:1}.tabs-color-balanced .tab-item .badge{opacity:.4}.tabs-color-balanced .tab-item.activated,.tabs-color-balanced .tab-item.active,.tabs-color-balanced .tab-item.tab-item-active{color:#33cd5f;border:0 solid #33cd5f}.tabs-color-balanced .tab-item.activated .badge,.tabs-color-balanced .tab-item.active .badge,.tabs-color-balanced .tab-item.tab-item-active .badge{opacity:1}.tabs-color-energized .tab-item{color:rgba(255,201,0,.4);opacity:1}.tabs-color-energized .tab-item .badge{opacity:.4}.tabs-color-energized .tab-item.activated,.tabs-color-energized .tab-item.active,.tabs-color-energized .tab-item.tab-item-active{color:#ffc900;border:0 solid #ffc900}.tabs-color-energized .tab-item.activated .badge,.tabs-color-energized .tab-item.active .badge,.tabs-color-energized .tab-item.tab-item-active .badge{opacity:1}.tabs-color-royal .tab-item{color:rgba(136,106,234,.4);opacity:1}.tabs-color-royal .tab-item .badge{opacity:.4}.tabs-color-royal .tab-item.activated,.tabs-color-royal .tab-item.active,.tabs-color-royal .tab-item.tab-item-active{color:#886aea;border:0 solid #886aea}.tabs-color-royal .tab-item.activated .badge,.tabs-color-royal .tab-item.active .badge,.tabs-color-royal .tab-item.tab-item-active .badge{opacity:1}.tabs-color-dark .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-color-dark .tab-item .badge{opacity:.4}.tabs-color-dark .tab-item.activated,.tabs-color-dark .tab-item.active,.tabs-color-dark .tab-item.tab-item-active{color:#444;border:0 solid #444}.tabs-color-dark .tab-item.activated .badge,.tabs-color-dark .tab-item.active .badge,.tabs-color-dark .tab-item.tab-item-active .badge{opacity:1}ion-tabs.tabs-color-active-light .tab-item{color:#444}ion-tabs.tabs-color-active-light .tab-item.activated,ion-tabs.tabs-color-active-light .tab-item.active,ion-tabs.tabs-color-active-light .tab-item.tab-item-active{color:#fff}ion-tabs.tabs-striped.tabs-color-active-light .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-light .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-light .tab-item.tab-item-active{border-color:#fff;color:#fff}ion-tabs.tabs-color-active-stable .tab-item{color:#444}ion-tabs.tabs-color-active-stable .tab-item.activated,ion-tabs.tabs-color-active-stable .tab-item.active,ion-tabs.tabs-color-active-stable .tab-item.tab-item-active{color:#f8f8f8}ion-tabs.tabs-striped.tabs-color-active-stable .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-stable .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-stable .tab-item.tab-item-active{border-color:#f8f8f8;color:#f8f8f8}ion-tabs.tabs-color-active-positive .tab-item{color:#444}ion-tabs.tabs-color-active-positive .tab-item.activated,ion-tabs.tabs-color-active-positive .tab-item.active,ion-tabs.tabs-color-active-positive .tab-item.tab-item-active{color:#387ef5}ion-tabs.tabs-striped.tabs-color-active-positive .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-positive .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-positive .tab-item.tab-item-active{border-color:#387ef5;color:#387ef5}ion-tabs.tabs-color-active-calm .tab-item{color:#444}ion-tabs.tabs-color-active-calm .tab-item.activated,ion-tabs.tabs-color-active-calm .tab-item.active,ion-tabs.tabs-color-active-calm .tab-item.tab-item-active{color:#11c1f3}ion-tabs.tabs-striped.tabs-color-active-calm .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-calm .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-calm .tab-item.tab-item-active{border-color:#11c1f3;color:#11c1f3}ion-tabs.tabs-color-active-assertive .tab-item{color:#444}ion-tabs.tabs-color-active-assertive .tab-item.activated,ion-tabs.tabs-color-active-assertive .tab-item.active,ion-tabs.tabs-color-active-assertive .tab-item.tab-item-active{color:#ef473a}ion-tabs.tabs-striped.tabs-color-active-assertive .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-assertive .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-assertive .tab-item.tab-item-active{border-color:#ef473a;color:#ef473a}ion-tabs.tabs-color-active-balanced .tab-item{color:#444}ion-tabs.tabs-color-active-balanced .tab-item.activated,ion-tabs.tabs-color-active-balanced .tab-item.active,ion-tabs.tabs-color-active-balanced .tab-item.tab-item-active{color:#33cd5f}ion-tabs.tabs-striped.tabs-color-active-balanced .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-balanced .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-balanced .tab-item.tab-item-active{border-color:#33cd5f;color:#33cd5f}ion-tabs.tabs-color-active-energized .tab-item{color:#444}ion-tabs.tabs-color-active-energized .tab-item.activated,ion-tabs.tabs-color-active-energized .tab-item.active,ion-tabs.tabs-color-active-energized .tab-item.tab-item-active{color:#ffc900}ion-tabs.tabs-striped.tabs-color-active-energized .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-energized .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-energized .tab-item.tab-item-active{border-color:#ffc900;color:#ffc900}ion-tabs.tabs-color-active-royal .tab-item{color:#444}ion-tabs.tabs-color-active-royal .tab-item.activated,ion-tabs.tabs-color-active-royal .tab-item.active,ion-tabs.tabs-color-active-royal .tab-item.tab-item-active{color:#886aea}ion-tabs.tabs-striped.tabs-color-active-royal .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-royal .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-royal .tab-item.tab-item-active{border-color:#886aea;color:#886aea}ion-tabs.tabs-color-active-dark .tab-item{color:#fff}ion-tabs.tabs-color-active-dark .tab-item.activated,ion-tabs.tabs-color-active-dark .tab-item.active,ion-tabs.tabs-color-active-dark .tab-item.tab-item-active{color:#444}ion-tabs.tabs-striped.tabs-color-active-dark .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-dark .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-dark .tab-item.tab-item-active{border-color:#444;color:#444}.tabs-top.tabs-striped{padding-bottom:0}.tabs-top.tabs-striped .tab-item{background:0 0;-webkit-transition:color .1s ease;-moz-transition:color .1s ease;-ms-transition:color .1s ease;-o-transition:color .1s ease;transition:color .1s ease}.tabs-top.tabs-striped .tab-item.activated,.tabs-top.tabs-striped .tab-item.active,.tabs-top.tabs-striped .tab-item.tab-item-active{margin-top:1px;border-width:0 0 2px!important;border-style:solid}.tabs-top.tabs-striped .tab-item.activated>.badge,.tabs-top.tabs-striped .tab-item.activated>i,.tabs-top.tabs-striped .tab-item.active>.badge,.tabs-top.tabs-striped .tab-item.active>i,.tabs-top.tabs-striped .tab-item.tab-item-active>.badge,.tabs-top.tabs-striped .tab-item.tab-item-active>i{margin-top:-1px}.tabs-top.tabs-striped .tab-item .badge{-webkit-transition:color .2s ease;-moz-transition:color .2s ease;-ms-transition:color .2s ease;-o-transition:color .2s ease;transition:color .2s ease}.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated i,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active i,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active i{display:block;margin-top:-1px}.tabs-top.tabs-striped.tabs-icon-left .tab-item{margin-top:1px}.tabs-top.tabs-striped.tabs-icon-left .tab-item.activated .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.activated i,.tabs-top.tabs-striped.tabs-icon-left .tab-item.active .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.active i,.tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active i{margin-top:-.1em}.tabs-top>.tabs,.tabs.tabs-top{top:44px;padding-top:0;background-position:bottom;border-top-width:0;border-bottom-width:1px}.tabs-top>.tabs .tab-item.activated .badge,.tabs-top>.tabs .tab-item.active .badge,.tabs-top>.tabs .tab-item.tab-item-active .badge,.tabs.tabs-top .tab-item.activated .badge,.tabs.tabs-top .tab-item.active .badge,.tabs.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-top~.bar-header{border-bottom-width:0}.tab-item{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;max-width:150px;height:100%;color:inherit;text-align:center;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;font-weight:400;font-size:14px;font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif;opacity:.7}.tab-item:hover{cursor:pointer}.tab-item.tab-hidden,.tabs-item-hide>.tabs,.tabs.tabs-item-hide{display:none}.tabs-icon-bottom.tabs .tab-item,.tabs-icon-bottom>.tabs .tab-item,.tabs-icon-top.tabs .tab-item,.tabs-icon-top>.tabs .tab-item{font-size:10px;line-height:14px}.tab-item .icon{display:block;margin:0 auto;height:32px;font-size:32px}.tabs-icon-left.tabs .tab-item,.tabs-icon-left>.tabs .tab-item,.tabs-icon-right.tabs .tab-item,.tabs-icon-right>.tabs .tab-item{font-size:10px}.tabs-icon-left.tabs .tab-item .icon,.tabs-icon-left.tabs .tab-item .tab-title,.tabs-icon-left>.tabs .tab-item .icon,.tabs-icon-left>.tabs .tab-item .tab-title,.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right.tabs .tab-item .tab-title,.tabs-icon-right>.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .tab-title{display:inline-block;vertical-align:top;margin-top:-.1em}.tabs-icon-left.tabs .tab-item .icon:before,.tabs-icon-left.tabs .tab-item .tab-title:before,.tabs-icon-left>.tabs .tab-item .icon:before,.tabs-icon-left>.tabs .tab-item .tab-title:before,.tabs-icon-right.tabs .tab-item .icon:before,.tabs-icon-right.tabs .tab-item .tab-title:before,.tabs-icon-right>.tabs .tab-item .icon:before,.tabs-icon-right>.tabs .tab-item .tab-title:before{font-size:24px;line-height:49px}.tabs-icon-left.tabs .tab-item .icon,.tabs-icon-left>.tabs .tab-item .icon{padding-right:3px}.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .icon{padding-left:3px}.tabs-icon-only.tabs .icon,.tabs-icon-only>.tabs .icon{line-height:inherit}.tab-item.has-badge{position:relative}.tab-item .badge{position:absolute;top:4%;right:33%;right:calc(50% - 26px);padding:1px 6px;height:auto;font-size:12px;line-height:16px}.tab-item.activated,.tab-item.active,.tab-item.tab-item-active{opacity:1}.tab-item.activated.tab-item-light,.tab-item.active.tab-item-light,.tab-item.tab-item-active.tab-item-light{color:#fff}.tab-item.activated.tab-item-stable,.tab-item.active.tab-item-stable,.tab-item.tab-item-active.tab-item-stable{color:#f8f8f8}.tab-item.activated.tab-item-positive,.tab-item.active.tab-item-positive,.tab-item.tab-item-active.tab-item-positive{color:#387ef5}.tab-item.activated.tab-item-calm,.tab-item.active.tab-item-calm,.tab-item.tab-item-active.tab-item-calm{color:#11c1f3}.tab-item.activated.tab-item-assertive,.tab-item.active.tab-item-assertive,.tab-item.tab-item-active.tab-item-assertive{color:#ef473a}.tab-item.activated.tab-item-balanced,.tab-item.active.tab-item-balanced,.tab-item.tab-item-active.tab-item-balanced{color:#33cd5f}.tab-item.activated.tab-item-energized,.tab-item.active.tab-item-energized,.tab-item.tab-item-active.tab-item-energized{color:#ffc900}.tab-item.activated.tab-item-royal,.tab-item.active.tab-item-royal,.tab-item.tab-item-active.tab-item-royal{color:#886aea}.tab-item.activated.tab-item-dark,.tab-item.active.tab-item-dark,.tab-item.tab-item-active.tab-item-dark{color:#444}.item.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:0}.item.tabs .icon:before{position:relative}.tab-item.disabled,.tab-item[disabled]{opacity:.4;cursor:default;pointer-events:none}.nav-bar-tabs-top.hide~.view-container .tabs-top .tabs{top:0}.pane[hide-nav-bar=true] .has-tabs-top{top:49px}.menu{position:absolute;top:0;bottom:0;z-index:0;overflow:hidden;min-height:100%;max-height:100%;background-color:#fff}.menu .scroll-content{z-index:10}.menu .bar-header{z-index:11}.menu-content{-webkit-transform:none;transform:none;box-shadow:-1px 0 2px rgba(0,0,0,.2),1px 0 2px rgba(0,0,0,.2)}.menu-open .menu-content .pane,.menu-open .menu-content .scroll-content,.menu-open .menu-content .scroll-content .scroll{pointer-events:none}.menu-open .menu-content .scroll-content:not(.overflow-scroll){overflow:hidden}.grade-b .menu-content,.grade-c .menu-content{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;right:-1px;left:-1px;border-right:1px solid #ccc;border-left:1px solid #ccc;box-shadow:none}.menu-right{right:0}.aside-open.aside-resizing .menu-right{display:none}.menu-animated{-webkit-transition:-webkit-transform 200ms ease;transition:transform 200ms ease}.modal-backdrop,.modal-backdrop-bg{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%}.modal-backdrop-bg{pointer-events:none}.modal{display:block;position:absolute;top:0;z-index:10;overflow:hidden;min-height:100%;width:100%;background-color:#fff}@media (min-width:680px){.modal{top:20%;right:20%;bottom:20%;left:20%;min-height:240px;width:60%}.modal.ng-leave-active{bottom:0}.platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader){height:44px}.platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader)>*{margin-top:0}.platform-ios.platform-cordova .modal-wrapper .modal .bar-subheader,.platform-ios.platform-cordova .modal-wrapper .modal .has-header,.platform-ios.platform-cordova .modal-wrapper .modal .tabs-top>.tabs,.platform-ios.platform-cordova .modal-wrapper .modal .tabs.tabs-top{top:44px}.platform-ios.platform-cordova .modal-wrapper .modal .has-subheader{top:88px}.platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-tabs-top{top:93px}.platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-subheader.has-tabs-top{top:137px}.modal-backdrop-bg{-webkit-transition:opacity 300ms ease-in-out;transition:opacity 300ms ease-in-out;background-color:#000;opacity:0}.active .modal-backdrop-bg{opacity:.5}}.modal-open{pointer-events:none}.modal-open .modal,.modal-open .modal-backdrop{pointer-events:auto}.modal-open.loading-active .modal,.modal-open.loading-active .modal-backdrop{pointer-events:none}.popover-backdrop{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%;background-color:transparent}.popover-backdrop.active{background-color:rgba(0,0,0,.1)}.popover{position:absolute;top:25%;left:50%;z-index:10;display:block;margin-top:12px;margin-left:-110px;height:280px;width:220px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4);opacity:0}.popover .item:first-child{border-top:0}.popover .item:last-child{border-bottom:0}.popover.popover-bottom{margin-top:-12px}.popover,.popover .bar-header{border-radius:2px}.popover .scroll-content{z-index:1;margin:2px 0}.popover .bar-header{border-bottom-right-radius:0;border-bottom-left-radius:0}.popover .has-header{border-top-right-radius:0;border-top-left-radius:0}.popover-arrow{display:none}.platform-ios .popover{box-shadow:0 0 40px rgba(0,0,0,.08);border-radius:10px}.platform-ios .popover .bar-header{-webkit-border-top-right-radius:10px;border-top-right-radius:10px;-webkit-border-top-left-radius:10px;border-top-left-radius:10px}.platform-ios .popover .scroll-content{margin:8px 0;border-radius:10px}.platform-ios .popover .scroll-content.has-header{margin-top:0}.platform-ios .popover-arrow{position:absolute;display:block;top:-17px;width:30px;height:19px;overflow:hidden}.platform-ios .popover-arrow:after{position:absolute;top:12px;left:5px;width:20px;height:20px;background-color:#fff;border-radius:3px;content:'';-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.platform-ios .popover-bottom .popover-arrow{top:auto;bottom:-10px}.platform-ios .popover-bottom .popover-arrow:after{top:-6px}.platform-android .popover{margin-top:-32px;background-color:#fafafa;box-shadow:0 2px 6px rgba(0,0,0,.35)}.platform-android .popover .item{border-color:#fafafa;background-color:#fafafa;color:#4d4d4d}.platform-android .popover.popover-bottom{margin-top:32px}.platform-android .popover-backdrop,.platform-android .popover-backdrop.active{background-color:transparent}.popover-open{pointer-events:none}.popover-open .popover,.popover-open .popover-backdrop{pointer-events:auto}.popover-open.loading-active .popover,.popover-open.loading-active .popover-backdrop{pointer-events:none}@media (min-width:680px){.popover{width:360px;margin-left:-180px}}.popup-container{position:absolute;top:0;left:0;bottom:0;right:0;background:0 0;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;z-index:12;visibility:hidden}.popup-container.popup-showing{visibility:visible}.popup-container.popup-hidden .popup{-webkit-animation-name:scaleOut;animation-name:scaleOut;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.popup-container.active .popup{-webkit-animation-name:superScaleIn;animation-name:superScaleIn;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.popup-container .popup{width:250px;max-width:100%;max-height:90%;border-radius:0;background-color:rgba(255,255,255,.9);display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:vertical;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.popup-container input,.popup-container textarea{width:100%}.popup-head{padding:15px 10px;border-bottom:1px solid #eee;text-align:center}.popup-title{margin:0;padding:0;font-size:15px}.popup-sub-title{margin:5px 0 0;padding:0;font-weight:400;font-size:11px}.popup-body{padding:10px;overflow:auto}.popup-buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;flex-direction:row;padding:10px;min-height:65px}.popup-buttons .button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;min-height:45px;border-radius:2px;line-height:20px;margin-right:5px}.popup-buttons .button:last-child{margin-right:0}.popup-open,.popup-open.modal-open .modal{pointer-events:none}.popup-open .popup,.popup-open .popup-backdrop{pointer-events:auto}.loading-container{position:absolute;left:0;top:0;right:0;bottom:0;z-index:13;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-transition:.2s opacity linear;transition:.2s opacity linear;visibility:hidden;opacity:0}.loading-container:not(.visible) .icon,.loading-container:not(.visible) .spinner{display:none}.loading-container.visible{visibility:visible}.loading-container.active{opacity:1}.loading-container .loading{padding:20px;border-radius:5px;background-color:rgba(0,0,0,.7);color:#fff;text-align:center;text-overflow:ellipsis;font-size:15px}.loading-container .loading h1,.loading-container .loading h2,.loading-container .loading h3,.loading-container .loading h4,.loading-container .loading h5,.loading-container .loading h6{color:#fff}.item{border-color:#ddd;background-color:#fff;color:#444;position:relative;z-index:2;display:block;margin:-1px;padding:16px;border-width:1px;border-style:solid;font-size:16px}.item h2{margin:0 0 2px;font-size:16px;font-weight:400}.item h3{margin:0 0 4px;font-size:14px}.item h4{margin:0 0 4px;font-size:12px}.item h5,.item h6{margin:0 0 3px;font-size:10px}.item p{color:#666;font-size:14px;margin-bottom:2px}.item h1:last-child,.item h2:last-child,.item h3:last-child,.item h4:last-child,.item h5:last-child,.item h6:last-child,.item p:last-child{margin-bottom:0}.item .badge{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;position:absolute;top:16px;right:32px}.item.item-button-right .badge{right:67px}.item.item-divider .badge{top:8px}.item .badge+.badge{margin-right:5px}.item.item-light{border-color:#ddd;background-color:#fff;color:#444}.item.item-stable{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.item.item-positive{border-color:#0c60ee;background-color:#387ef5;color:#fff}.item.item-calm{border-color:#0a9dc7;background-color:#11c1f3;color:#fff}.item.item-assertive{border-color:#e42112;background-color:#ef473a;color:#fff}.item.item-balanced{border-color:#28a54c;background-color:#33cd5f;color:#fff}.item.item-energized{border-color:#e6b500;background-color:#ffc900;color:#fff}.item.item-royal{border-color:#6b46e5;background-color:#886aea;color:#fff}.item.item-dark{border-color:#111;background-color:#444;color:#fff}.item[ng-click]:hover{cursor:pointer}.item-borderless,.list-borderless .item{border-width:0}.item .item-content.activated,.item .item-content.activated.item-complex>.item-content,.item .item-content.active,.item .item-content.active.item-complex>.item-content,.item-complex.activated .item-content,.item-complex.activated .item-content.item-complex>.item-content,.item-complex.active .item-content,.item-complex.active .item-content.item-complex>.item-content,.item.activated,.item.activated.item-complex>.item-content,.item.active,.item.active.item-complex>.item-content{border-color:#ccc;background-color:#D9D9D9}.item .item-content.activated.item-light,.item .item-content.activated.item-light.item-complex>.item-content,.item .item-content.active.item-light,.item .item-content.active.item-light.item-complex>.item-content,.item-complex.activated .item-content.item-light,.item-complex.activated .item-content.item-light.item-complex>.item-content,.item-complex.active .item-content.item-light,.item-complex.active .item-content.item-light.item-complex>.item-content,.item.activated.item-light,.item.activated.item-light.item-complex>.item-content,.item.active.item-light,.item.active.item-light.item-complex>.item-content{border-color:#ccc;background-color:#fafafa}.item .item-content.activated.item-stable,.item .item-content.activated.item-stable.item-complex>.item-content,.item .item-content.active.item-stable,.item .item-content.active.item-stable.item-complex>.item-content,.item-complex.activated .item-content.item-stable,.item-complex.activated .item-content.item-stable.item-complex>.item-content,.item-complex.active .item-content.item-stable,.item-complex.active .item-content.item-stable.item-complex>.item-content,.item.activated.item-stable,.item.activated.item-stable.item-complex>.item-content,.item.active.item-stable,.item.active.item-stable.item-complex>.item-content{border-color:#a2a2a2;background-color:#e5e5e5}.item .item-content.activated.item-positive,.item .item-content.activated.item-positive.item-complex>.item-content,.item .item-content.active.item-positive,.item .item-content.active.item-positive.item-complex>.item-content,.item-complex.activated .item-content.item-positive,.item-complex.activated .item-content.item-positive.item-complex>.item-content,.item-complex.active .item-content.item-positive,.item-complex.active .item-content.item-positive.item-complex>.item-content,.item.activated.item-positive,.item.activated.item-positive.item-complex>.item-content,.item.active.item-positive,.item.active.item-positive.item-complex>.item-content{border-color:#0c60ee;background-color:#0c60ee}.item .item-content.activated.item-calm,.item .item-content.activated.item-calm.item-complex>.item-content,.item .item-content.active.item-calm,.item .item-content.active.item-calm.item-complex>.item-content,.item-complex.activated .item-content.item-calm,.item-complex.activated .item-content.item-calm.item-complex>.item-content,.item-complex.active .item-content.item-calm,.item-complex.active .item-content.item-calm.item-complex>.item-content,.item.activated.item-calm,.item.activated.item-calm.item-complex>.item-content,.item.active.item-calm,.item.active.item-calm.item-complex>.item-content{border-color:#0a9dc7;background-color:#0a9dc7}.item .item-content.activated.item-assertive,.item .item-content.activated.item-assertive.item-complex>.item-content,.item .item-content.active.item-assertive,.item .item-content.active.item-assertive.item-complex>.item-content,.item-complex.activated .item-content.item-assertive,.item-complex.activated .item-content.item-assertive.item-complex>.item-content,.item-complex.active .item-content.item-assertive,.item-complex.active .item-content.item-assertive.item-complex>.item-content,.item.activated.item-assertive,.item.activated.item-assertive.item-complex>.item-content,.item.active.item-assertive,.item.active.item-assertive.item-complex>.item-content{border-color:#e42112;background-color:#e42112}.item .item-content.activated.item-balanced,.item .item-content.activated.item-balanced.item-complex>.item-content,.item .item-content.active.item-balanced,.item .item-content.active.item-balanced.item-complex>.item-content,.item-complex.activated .item-content.item-balanced,.item-complex.activated .item-content.item-balanced.item-complex>.item-content,.item-complex.active .item-content.item-balanced,.item-complex.active .item-content.item-balanced.item-complex>.item-content,.item.activated.item-balanced,.item.activated.item-balanced.item-complex>.item-content,.item.active.item-balanced,.item.active.item-balanced.item-complex>.item-content{border-color:#28a54c;background-color:#28a54c}.item .item-content.activated.item-energized,.item .item-content.activated.item-energized.item-complex>.item-content,.item .item-content.active.item-energized,.item .item-content.active.item-energized.item-complex>.item-content,.item-complex.activated .item-content.item-energized,.item-complex.activated .item-content.item-energized.item-complex>.item-content,.item-complex.active .item-content.item-energized,.item-complex.active .item-content.item-energized.item-complex>.item-content,.item.activated.item-energized,.item.activated.item-energized.item-complex>.item-content,.item.active.item-energized,.item.active.item-energized.item-complex>.item-content{border-color:#e6b500;background-color:#e6b500}.item .item-content.activated.item-royal,.item .item-content.activated.item-royal.item-complex>.item-content,.item .item-content.active.item-royal,.item .item-content.active.item-royal.item-complex>.item-content,.item-complex.activated .item-content.item-royal,.item-complex.activated .item-content.item-royal.item-complex>.item-content,.item-complex.active .item-content.item-royal,.item-complex.active .item-content.item-royal.item-complex>.item-content,.item.activated.item-royal,.item.activated.item-royal.item-complex>.item-content,.item.active.item-royal,.item.active.item-royal.item-complex>.item-content{border-color:#6b46e5;background-color:#6b46e5}.item .item-content.activated.item-dark,.item .item-content.activated.item-dark.item-complex>.item-content,.item .item-content.active.item-dark,.item .item-content.active.item-dark.item-complex>.item-content,.item-complex.activated .item-content.item-dark,.item-complex.activated .item-content.item-dark.item-complex>.item-content,.item-complex.active .item-content.item-dark,.item-complex.active .item-content.item-dark.item-complex>.item-content,.item.activated.item-dark,.item.activated.item-dark.item-complex>.item-content,.item.active.item-dark,.item.active.item-dark.item-complex>.item-content{border-color:#000;background-color:#262626}.item,.item h1,.item h2,.item h3,.item h4,.item h5,.item h6,.item p,.item-content,.item-content h1,.item-content h2,.item-content h3,.item-content h4,.item-content h5,.item-content h6,.item-content p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}a.item{color:inherit;text-decoration:none}a.item:focus,a.item:hover{text-decoration:none}.item-complex,a.item.item-complex,button.item.item-complex{padding:0}.item-complex .item-content,.item-radio .item-content{position:relative;z-index:2;padding:16px 49px 16px 16px;border:none;background-color:#fff}a.item-content{display:block;color:inherit;text-decoration:none}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p,.item-complex.item-text-wrap,.item-complex.item-text-wrap .item-content,.item-complex.item-text-wrap h1,.item-complex.item-text-wrap h2,.item-complex.item-text-wrap h3,.item-complex.item-text-wrap h4,.item-complex.item-text-wrap h5,.item-complex.item-text-wrap h6,.item-complex.item-text-wrap p,.item-text-wrap,.item-text-wrap .item,.item-text-wrap .item-content,.item-text-wrap h1,.item-text-wrap h2,.item-text-wrap h3,.item-text-wrap h4,.item-text-wrap h5,.item-text-wrap h6,.item-text-wrap p{overflow:visible;white-space:normal}.item-complex.item-light>.item-content{border-color:#ddd;background-color:#fff;color:#444}.item-complex.item-light>.item-content.active,.item-complex.item-light>.item-content.active.item-complex>.item-content,.item-complex.item-light>.item-content:active,.item-complex.item-light>.item-content:active.item-complex>.item-content{border-color:#ccc;background-color:#fafafa}.item-complex.item-stable>.item-content{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.item-complex.item-stable>.item-content.active,.item-complex.item-stable>.item-content.active.item-complex>.item-content,.item-complex.item-stable>.item-content:active,.item-complex.item-stable>.item-content:active.item-complex>.item-content{border-color:#a2a2a2;background-color:#e5e5e5}.item-complex.item-positive>.item-content{border-color:#0c60ee;background-color:#387ef5;color:#fff}.item-complex.item-positive>.item-content.active,.item-complex.item-positive>.item-content.active.item-complex>.item-content,.item-complex.item-positive>.item-content:active,.item-complex.item-positive>.item-content:active.item-complex>.item-content{border-color:#0c60ee;background-color:#0c60ee}.item-complex.item-calm>.item-content{border-color:#0a9dc7;background-color:#11c1f3;color:#fff}.item-complex.item-calm>.item-content.active,.item-complex.item-calm>.item-content.active.item-complex>.item-content,.item-complex.item-calm>.item-content:active,.item-complex.item-calm>.item-content:active.item-complex>.item-content{border-color:#0a9dc7;background-color:#0a9dc7}.item-complex.item-assertive>.item-content{border-color:#e42112;background-color:#ef473a;color:#fff}.item-complex.item-assertive>.item-content.active,.item-complex.item-assertive>.item-content.active.item-complex>.item-content,.item-complex.item-assertive>.item-content:active,.item-complex.item-assertive>.item-content:active.item-complex>.item-content{border-color:#e42112;background-color:#e42112}.item-complex.item-balanced>.item-content{border-color:#28a54c;background-color:#33cd5f;color:#fff}.item-complex.item-balanced>.item-content.active,.item-complex.item-balanced>.item-content.active.item-complex>.item-content,.item-complex.item-balanced>.item-content:active,.item-complex.item-balanced>.item-content:active.item-complex>.item-content{border-color:#28a54c;background-color:#28a54c}.item-complex.item-energized>.item-content{border-color:#e6b500;background-color:#ffc900;color:#fff}.item-complex.item-energized>.item-content.active,.item-complex.item-energized>.item-content.active.item-complex>.item-content,.item-complex.item-energized>.item-content:active,.item-complex.item-energized>.item-content:active.item-complex>.item-content{border-color:#e6b500;background-color:#e6b500}.item-complex.item-royal>.item-content{border-color:#6b46e5;background-color:#886aea;color:#fff}.item-complex.item-royal>.item-content.active,.item-complex.item-royal>.item-content.active.item-complex>.item-content,.item-complex.item-royal>.item-content:active,.item-complex.item-royal>.item-content:active.item-complex>.item-content{border-color:#6b46e5;background-color:#6b46e5}.item-complex.item-dark>.item-content{border-color:#111;background-color:#444;color:#fff}.item-complex.item-dark>.item-content.active,.item-complex.item-dark>.item-content.active.item-complex>.item-content,.item-complex.item-dark>.item-content:active,.item-complex.item-dark>.item-content:active.item-complex>.item-content{border-color:#000;background-color:#262626}.item-icon-left .icon,.item-icon-right .icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-icon-left .icon:before,.item-icon-right .icon:before{display:block;width:32px;text-align:center}.item .fill-icon{min-width:30px;min-height:30px;font-size:28px}.item-icon-left{padding-left:54px}.item-icon-left .icon{left:11px}.item-complex.item-icon-left{padding-left:0}.item-complex.item-icon-left .item-content{padding-left:54px}.item-icon-right{padding-right:54px}.item-icon-right .icon{right:11px}.item-complex.item-icon-right{padding-right:0}.item-complex.item-icon-right .item-content{padding-right:54px}.item-icon-left.item-icon-right .icon:first-child{right:auto}.item-icon-left .item-delete .icon,.item-icon-left.item-icon-right .icon:last-child{left:auto}.item-icon-left .icon-accessory,.item-icon-right .icon-accessory{color:#ccc;font-size:16px}.item-icon-left .icon-accessory{left:3px}.item-icon-right .icon-accessory{right:3px}.item-button-left{padding-left:72px}.item-button-left .item-content>.button,.item-button-left>.button{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:8px;left:11px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-left .item-content>.button .icon:before,.item-button-left>.button .icon:before{position:relative;left:auto;width:auto;line-height:31px}.item-button-left .item-content>.button>.button,.item-button-left>.button>.button{margin:0 2px;min-height:34px;font-size:18px;line-height:32px}.item-button-right,a.item.item-button-right,button.item.item-button-right{padding-right:80px}.item-button-right .item-content>.button,.item-button-right .item-content>.buttons,.item-button-right>.button,.item-button-right>.buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:8px;right:16px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-right .item-content>.button .icon:before,.item-button-right .item-content>.buttons .icon:before,.item-button-right>.button .icon:before,.item-button-right>.buttons .icon:before{position:relative;left:auto;width:auto;line-height:31px}.item-button-right .item-content>.button>.button,.item-button-right .item-content>.buttons>.button,.item-button-right>.button>.button,.item-button-right>.buttons>.button{margin:0 2px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-left.item-button-right .button:first-child{right:auto}.item-button-left.item-button-right .button:last-child{left:auto}.item-avatar,.item-avatar .item-content,.item-avatar-left,.item-avatar-left .item-content{padding-left:72px;min-height:72px}.item-avatar .item-content .item-image,.item-avatar .item-content>img:first-child,.item-avatar .item-image,.item-avatar-left .item-content .item-image,.item-avatar-left .item-content>img:first-child,.item-avatar-left .item-image,.item-avatar-left>img:first-child,.item-avatar>img:first-child{position:absolute;top:16px;left:16px;max-width:40px;max-height:40px;width:100%;height:100%;border-radius:50%}.item-avatar-right,.item-avatar-right .item-content{padding-right:72px;min-height:72px}.item-avatar-right .item-content .item-image,.item-avatar-right .item-content>img:first-child,.item-avatar-right .item-image,.item-avatar-right>img:first-child{position:absolute;top:16px;right:16px;max-width:40px;max-height:40px;width:100%;height:100%;border-radius:50%}.item-thumbnail-left,.item-thumbnail-left .item-content{padding-top:8px;padding-left:106px;min-height:100px}.item-thumbnail-left .item-content .item-image,.item-thumbnail-left .item-content>img:first-child,.item-thumbnail-left .item-image,.item-thumbnail-left>img:first-child{position:absolute;top:10px;left:10px;max-width:80px;max-height:80px;width:100%;height:100%}.item-avatar-left.item-complex,.item-avatar.item-complex,.item-thumbnail-left.item-complex{padding-top:0;padding-left:0}.item-thumbnail-right,.item-thumbnail-right .item-content{padding-top:8px;padding-right:106px;min-height:100px}.item-thumbnail-right .item-content .item-image,.item-thumbnail-right .item-content>img:first-child,.item-thumbnail-right .item-image,.item-thumbnail-right>img:first-child{position:absolute;top:10px;right:10px;max-width:80px;max-height:80px;width:100%;height:100%}.item-avatar-right.item-complex,.item-thumbnail-right.item-complex{padding-top:0;padding-right:0}.item-image{padding:0;text-align:center}.item-image .list-img,.item-image img:first-child{width:100%;vertical-align:middle}.item-body{overflow:auto;padding:16px;text-overflow:inherit;white-space:normal}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p{margin-top:16px;margin-bottom:16px}.item-divider{padding-top:8px;padding-bottom:8px;min-height:30px;background-color:#f5f5f5;color:#222;font-weight:500}.item-divider-ios,.platform-ios .item-divider-platform{padding-top:26px;text-transform:uppercase;font-weight:300;font-size:13px;background-color:#efeff4;color:#555}.item-divider-android,.platform-android .item-divider-platform{font-weight:300;font-size:13px}.item-note{float:right;color:#aaa;font-size:14px}.item-left-editable .item-content,.item-right-editable .item-content{-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;transition-property:transform}.item-left-editing.item-left-editable .item-content,.list-left-editing .item-left-editable .item-content{-webkit-transform:translate3d(50px,0,0);transform:translate3d(50px,0,0)}.item-remove-animate.ng-leave{-webkit-transition-duration:300ms;transition-duration:300ms}.item-remove-animate.ng-leave .item-content,.item-remove-animate.ng-leave:last-of-type{-webkit-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-property:all;transition-property:all}.item-remove-animate.ng-leave.ng-leave-active .item-content{opacity:0;-webkit-transform:translate3d(-100%,0,0)!important;transform:translate3d(-100%,0,0)!important}.item-remove-animate.ng-leave.ng-leave-active:last-of-type{opacity:0}.item-remove-animate.ng-leave.ng-leave-active~ion-item:not(.ng-leave){-webkit-transform:translate3d(0,-webkit-calc(-100% + 1px),0);transform:translate3d(0,calc(-100% + 1px),0);-webkit-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(.25,.81,.24,1);transition-timing-function:cubic-bezier(.25,.81,.24,1);-webkit-transition-property:all;transition-property:all}.item-left-edit{-webkit-transition:all ease-in-out 125ms;transition:all ease-in-out 125ms;position:absolute;top:0;left:0;z-index:0;width:50px;height:100%;line-height:100%;display:none;opacity:0;-webkit-transform:translate3d(-21px,0,0);transform:translate3d(-21px,0,0)}.item-left-edit .button{height:100%}.item-left-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%}.item-left-edit.visible{display:block}.item-left-edit.visible.active{opacity:1;-webkit-transform:translate3d(8px,0,0);transform:translate3d(8px,0,0)}.list-left-editing .item-left-edit{-webkit-transition-delay:125ms;transition-delay:125ms}.item-delete .button.icon{color:#ef473a;font-size:24px}.item-delete .button.icon:hover{opacity:.7}.item-right-edit{-webkit-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:0;z-index:3;width:75px;height:100%;background:inherit;padding-left:20px;display:block;opacity:0;-webkit-transform:translate3d(75px,0,0);transform:translate3d(75px,0,0)}.item-right-edit .button{min-width:50px;height:100%}.item-right-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-right-edit.visible{display:block}.item-right-edit.visible.active{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.item-reorder .button.icon{color:#444;font-size:32px}.item-reordering{position:absolute;left:0;top:0;z-index:9;width:100%;box-shadow:0 0 10px 0 #aaa}.item-reordering .item-reorder{z-index:9}.item-placeholder{opacity:.7}.item-options{position:absolute;top:0;right:0;z-index:1;height:100%}.item-options .button{height:100%;border:none;border-radius:0;display:-webkit-inline-box;display:-webkit-inline-flex;display:-moz-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.item-options .button:before{margin:0 auto}.item-options ion-option-button:last-child{padding-right:calc(env(safe-area-inset-right) + 12px)}.list{position:relative;padding-top:1px;padding-bottom:1px;padding-left:0;margin-bottom:20px}.list:last-child{margin-bottom:0}.list:last-child.card{margin-bottom:40px}.list-header{margin-top:20px;padding:5px 15px;background-color:transparent;color:#222;font-weight:700}.card.list .list-item{padding-right:1px;padding-left:1px}.card,.list-inset{overflow:hidden;margin:20px 10px;border-radius:2px;background-color:#fff}.card{padding-top:1px;padding-bottom:1px;box-shadow:0 1px 3px rgba(0,0,0,.3)}.card .item{border-left:0;border-right:0}.card .item:first-child{border-top:0}.card .item:last-child{border-bottom:0}.padding .card,.padding .list-inset{margin-left:0;margin-right:0}.card .item:first-child,.card .item:first-child .item-content,.list-inset .item:first-child,.list-inset .item:first-child .item-content,.padding>.list .item:first-child,.padding>.list .item:first-child .item-content{border-top-left-radius:2px;border-top-right-radius:2px}.card .item:last-child,.card .item:last-child .item-content,.list-inset .item:last-child,.list-inset .item:last-child .item-content,.padding>.list .item:last-child,.padding>.list .item:last-child .item-content{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.card .item:last-child,.list-inset .item:last-child{margin-bottom:-1px}.card .item,.list-inset .item,.padding-horizontal>.list .item,.padding>.list .item{margin-right:0;margin-left:0}.card .item.item-input input,.list-inset .item.item-input input,.padding-horizontal>.list .item.item-input input,.padding>.list .item.item-input input{padding-right:44px}.padding-left>.list .item{margin-left:0}.padding-right>.list .item{margin-right:0}.badge{background-color:transparent;color:#AAA;z-index:1;display:inline-block;padding:3px 8px;min-width:10px;border-radius:10px;vertical-align:baseline;text-align:center;white-space:nowrap;font-weight:700;font-size:14px;line-height:16px}.badge:empty{display:none}.badge.badge-light,.tabs .tab-item .badge.badge-light{background-color:#fff;color:#444}.badge.badge-stable,.tabs .tab-item .badge.badge-stable{background-color:#f8f8f8;color:#444}.badge.badge-positive,.tabs .tab-item .badge.badge-positive{background-color:#387ef5;color:#fff}.badge.badge-calm,.tabs .tab-item .badge.badge-calm{background-color:#11c1f3;color:#fff}.badge.badge-assertive,.tabs .tab-item .badge.badge-assertive{background-color:#ef473a;color:#fff}.badge.badge-balanced,.tabs .tab-item .badge.badge-balanced{background-color:#33cd5f;color:#fff}.badge.badge-energized,.tabs .tab-item .badge.badge-energized{background-color:#ffc900;color:#fff}.badge.badge-royal,.tabs .tab-item .badge.badge-royal{background-color:#886aea;color:#fff}.badge.badge-dark,.tabs .tab-item .badge.badge-dark{background-color:#444;color:#fff}.button .badge{position:relative;top:-1px}.slider{position:relative;visibility:hidden;overflow:hidden}.slider-slides{position:relative;height:100%}.slider-slide{position:relative;display:block;float:left;width:100%;height:100%;vertical-align:top}.slider-slide-image>img{width:100%}.slider-pager{position:absolute;bottom:20px;z-index:1;width:100%;height:15px;text-align:center}.slider-pager .slider-pager-page{display:inline-block;margin:0 3px;width:15px;color:#000;text-decoration:none;opacity:.3}.slider-pager .slider-pager-page.active{-webkit-transition:opacity .4s ease-in;transition:opacity .4s ease-in;opacity:1}.slider-pager-page.ng-animate,.slider-pager-page.ng-enter,.slider-pager-page.ng-leave,.slider-slide.ng-animate,.slider-slide.ng-enter,.slider-slide.ng-leave{-webkit-transition:none!important;transition:none!important}.slider-pager-page.ng-animate,.slider-slide.ng-animate{-webkit-animation:none 0s;animation:none 0s}.swiper-container{margin:0 auto;position:relative;z-index:1}.swiper-container-no-flexbox .swiper-slide{float:left}.swiper-container-vertical>.swiper-wrapper{-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.swiper-wrapper{z-index:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate(0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.swiper-container-multirow>.swiper-wrapper{-webkit-box-lines:multiple;-moz-box-lines:multiple;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.swiper-container-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{display:block;-webkit-flex-shrink:0;-ms-flex:0 0 auto;flex-shrink:0;position:relative}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start;-webkit-transition-property:-webkit-transform,height;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform,height}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-wp8-horizontal{-ms-touch-action:pan-y;touch-action:pan-y}.swiper-wp8-vertical{-ms-touch-action:pan-x;touch-action:pan-x}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:27px;height:44px;margin-top:-22px;z-index:10;cursor:pointer;-moz-background-size:27px 44px;-webkit-background-size:27px 44px;background-size:27px 44px;background-position:center;background-repeat:no-repeat}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");left:10px;right:auto}.swiper-button-prev.swiper-button-black,.swiper-container-rtl .swiper-button-next.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-prev.swiper-button-white,.swiper-container-rtl .swiper-button-next.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");right:10px;left:auto}.swiper-button-next.swiper-button-black,.swiper-container-rtl .swiper-button-prev.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-white,.swiper-container-rtl .swiper-button-prev.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-pagination{position:absolute;text-align:center;-webkit-transition:300ms;-moz-transition:300ms;-o-transition:300ms;transition:300ms;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-white .swiper-pagination-bullet{background:#fff}.swiper-pagination-bullet-active{opacity:1}.swiper-pagination-white .swiper-pagination-bullet-active{background:#fff}.swiper-pagination-black .swiper-pagination-bullet-active{background:#000}.swiper-container-vertical>.swiper-pagination{right:10px;top:50%;-webkit-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-o-transform:translate(0,-50%);-ms-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination .swiper-pagination-bullet{margin:5px 0;display:block}.swiper-container-horizontal>.swiper-pagination{bottom:10px;left:0;width:100%}.swiper-container-horizontal>.swiper-pagination .swiper-pagination-bullet{margin:0 5px}.swiper-container-3d{-webkit-perspective:1200px;-moz-perspective:1200px;-o-perspective:1200px;perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to left,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-right{background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to right,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-top{background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to top,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to bottom,rgba(0,0,0,.5),transparent)}.swiper-container-coverflow .swiper-wrapper{-ms-perspective:1200px}.swiper-container-fade.swiper-container-free-mode .swiper-slide{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}.swiper-container-fade .swiper-slide,.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube{overflow:visible}.swiper-container-cube .swiper-slide{pointer-events:none;visibility:hidden;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;width:100%;height:100%;z-index:1}.swiper-container-cube.swiper-container-rtl .swiper-slide{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;-webkit-filter:blur(50px);filter:blur(50px);z-index:0}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;-webkit-transform-origin:50%;-moz-transform-origin:50%;transform-origin:50%;-webkit-animation:swiper-preloader-spin 1s steps(12,end) infinite;-moz-animation:swiper-preloader-spin 1s steps(12,end) infinite;animation:swiper-preloader-spin 1s steps(12,end) infinite}.swiper-lazy-preloader:after{display:block;content:"";width:100%;height:100%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:50%;-webkit-background-size:100%;background-size:100%;background-repeat:no-repeat}.swiper-lazy-preloader-white:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}@-webkit-keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes swiper-preloader-spin{100%{transform:rotate(360deg)}}ion-slides{width:100%;height:100%;display:block}.slide-zoom{display:block;width:100%;text-align:center}.swiper-container{width:100%;height:100%;padding:0;overflow:hidden}.swiper-wrapper{position:absolute;left:0;top:0;width:100%;height:100%;padding:0}.swiper-slide{width:100%;height:100%;box-sizing:border-box}.swiper-slide img{width:auto;height:auto;max-width:100%;max-height:100%}.scroll-refresher{position:absolute;top:-60px;right:0;left:0;overflow:hidden;margin:auto;height:60px}.scroll-refresher .ionic-refresher-content{position:absolute;bottom:15px;left:0;width:100%;color:#666;text-align:center;font-size:30px}.scroll-refresher .ionic-refresher-content .text-pulling,.scroll-refresher .ionic-refresher-content .text-refreshing{font-size:16px;line-height:16px}.scroll-refresher .ionic-refresher-content.ionic-refresher-with-text{bottom:10px}.scroll-refresher .icon-pulling,.scroll-refresher .icon-refreshing{width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.scroll-refresher .icon-pulling{-webkit-animation-name:refresh-spin-back;animation-name:refresh-spin-back;-webkit-animation-duration:200ms;animation-duration:200ms;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:none;animation-fill-mode:none;-webkit-transform:translate3d(0,0,0) rotate(0deg);transform:translate3d(0,0,0) rotate(0deg)}.scroll-refresher .icon-refreshing,.scroll-refresher .text-refreshing{display:none}.scroll-refresher .icon-refreshing{-webkit-animation-duration:1.5s;animation-duration:1.5s}.scroll-refresher.active .icon-pulling:not(.pulling-rotation-disabled){-webkit-animation-name:refresh-spin;animation-name:refresh-spin;-webkit-transform:translate3d(0,0,0) rotate(-180deg);transform:translate3d(0,0,0) rotate(-180deg)}.scroll-refresher.active.refreshing{-webkit-transition:transform .2s;transition:transform .2s;-webkit-transform:scale(1,1);transform:scale(1,1)}.scroll-refresher.active.refreshing .icon-pulling,.scroll-refresher.active.refreshing .text-pulling{display:none}.scroll-refresher.active.refreshing .icon-refreshing,.scroll-refresher.active.refreshing .text-refreshing{display:block}.scroll-refresher.active.refreshing.refreshing-tail{-webkit-transform:scale(0,0);transform:scale(0,0)}.overflow-scroll>.scroll{-webkit-overflow-scrolling:touch;width:100%}.overflow-scroll>.scroll.overscroll{position:fixed;right:0;left:0}.overflow-scroll.padding>.scroll.overscroll{padding:10px}@-webkit-keyframes refresh-spin{0%{-webkit-transform:translate3d(0,0,0) rotate(0)}100%{-webkit-transform:translate3d(0,0,0) rotate(180deg)}}@keyframes refresh-spin{0%{transform:translate3d(0,0,0) rotate(0)}100%{transform:translate3d(0,0,0) rotate(180deg)}}@-webkit-keyframes refresh-spin-back{0%{-webkit-transform:translate3d(0,0,0) rotate(180deg)}100%{-webkit-transform:translate3d(0,0,0) rotate(0)}}@keyframes refresh-spin-back{0%{transform:translate3d(0,0,0) rotate(180deg)}100%{transform:translate3d(0,0,0) rotate(0)}}.spinner{stroke:#444;fill:#444}.spinner svg{width:28px;height:28px}.spinner.spinner-light{stroke:#fff;fill:#fff}.spinner.spinner-stable{stroke:#f8f8f8;fill:#f8f8f8}.spinner.spinner-positive{stroke:#387ef5;fill:#387ef5}.spinner.spinner-calm{stroke:#11c1f3;fill:#11c1f3}.spinner.spinner-balanced{stroke:#33cd5f;fill:#33cd5f}.spinner.spinner-assertive{stroke:#ef473a;fill:#ef473a}.spinner.spinner-energized{stroke:#ffc900;fill:#ffc900}.spinner.spinner-royal{stroke:#886aea;fill:#886aea}.spinner.spinner-dark{stroke:#444;fill:#444}.spinner-android{stroke:#4b8bf4}.spinner-ios,.spinner-ios-small{stroke:#69717d}.spinner-spiral .stop1{stop-color:#fff;stop-opacity:0}.spinner-spiral.spinner-light .stop1{stop-color:#444}.spinner-spiral.spinner-light .stop2{stop-color:#fff}.spinner-spiral.spinner-stable .stop2{stop-color:#f8f8f8}.spinner-spiral.spinner-positive .stop2{stop-color:#387ef5}.spinner-spiral.spinner-calm .stop2{stop-color:#11c1f3}.spinner-spiral.spinner-balanced .stop2{stop-color:#33cd5f}.spinner-spiral.spinner-assertive .stop2{stop-color:#ef473a}.spinner-spiral.spinner-energized .stop2{stop-color:#ffc900}.spinner-spiral.spinner-royal .stop2{stop-color:#886aea}.spinner-spiral.spinner-dark .stop2{stop-color:#444}form{margin:0 0 1.42857}legend{display:block;margin-bottom:1.42857;padding:0;width:100%;border:1px solid #ddd;color:#444;font-size:21px;line-height:2.85714}legend small{color:#f8f8f8;font-size:1.07143}button,input,label,select,textarea{font-weight:400;font-size:14px;line-height:1.42857}button,input,select,textarea{font-family:-apple-system,Roboto,Noto,"Helvetica Neue",sans-serif}.item-input{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:6px 0 5px 16px}.item-input input{-webkit-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 220px;-moz-box-flex:1;-moz-flex:1 220px;-ms-flex:1 220px;flex:1 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;padding-right:24px;background-color:transparent}.item-input .button .icon{-webkit-box-flex:0;-webkit-flex:0 0 24px;-moz-box-flex:0;-moz-flex:0 0 24px;-ms-flex:0 0 24px;flex:0 0 24px;position:static;display:inline-block;height:auto;text-align:center;font-size:16px}.item-input .button-bar{-webkit-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 0 220px;-moz-box-flex:1;-moz-flex:1 0 220px;-ms-flex:1 0 220px;flex:1 0 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.item-input .icon{min-width:14px}.platform-windowsphone .item-input input{flex-shrink:1}.item-input-inset{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:10.67px}.item-input-wrapper{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0;-moz-box-flex:1;-moz-flex:1 0;-ms-flex:1 0;flex:1 0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-border-radius:4px;border-radius:4px;padding-right:8px;padding-left:8px;background:#eee}.item-input-inset .item-input-wrapper input{padding-left:4px;height:29px;background:0 0;line-height:18px}.item-input-wrapper~.button{margin-left:10.67px}.input-label{display:table;padding:7px 10px 7px 0;max-width:200px;width:35%;color:#444;font-size:16px}.placeholder-icon{color:#aaa}.placeholder-icon:first-child{padding-right:6px}.placeholder-icon:last-child{padding-left:6px}.item-stacked-label{display:block;background-color:transparent;box-shadow:none}.item-stacked-label .icon,.item-stacked-label .input-label{display:inline-block;padding:4px 0 0;vertical-align:middle}.item-stacked-label input,.item-stacked-label textarea{-webkit-border-radius:2px;border-radius:2px;padding:4px 8px 3px 0;border:none;background-color:#fff}.item-stacked-label input{overflow:hidden;height:46px}.item-select.item-stacked-label select{position:relative;padding:0;max-width:90%;direction:ltr;white-space:pre-wrap;margin:-3px}.item-floating-label{display:block;background-color:transparent;box-shadow:none}.item-floating-label .input-label{position:relative;padding:5px 0 0;opacity:0;top:10px;-webkit-transition:opacity .15s ease-in,top .2s linear;transition:opacity .15s ease-in,top .2s linear}.item-floating-label .input-label.has-input{opacity:1;top:0;-webkit-transition:opacity .15s ease-in,top .2s linear;transition:opacity .15s ease-in,top .2s linear}input[type=search],input[type=text],input[type=password],input[type=datetime],input[type=datetime-local],input[type=date],input[type=month],input[type=time],input[type=week],input[type=number],input[type=email],input[type=url],input[type=tel],input[type=color],textarea{display:block;padding-top:2px;padding-left:0;height:34px;color:#111;vertical-align:middle;font-size:14px;line-height:16px}.platform-android input[type=datetime-local],.platform-android input[type=date],.platform-android input[type=month],.platform-android input[type=time],.platform-android input[type=week],.platform-ios input[type=datetime-local],.platform-ios input[type=date],.platform-ios input[type=month],.platform-ios input[type=time],.platform-ios input[type=week]{padding-top:8px}.item-input input,.item-input textarea{width:100%}textarea{padding-left:0}textarea::-moz-placeholder{color:#aaa}textarea:-ms-input-placeholder{color:#aaa}textarea::-webkit-input-placeholder{color:#aaa;text-indent:-3px}textarea{height:auto}input[type=search],input[type=text],input[type=password],input[type=datetime],input[type=datetime-local],input[type=date],input[type=month],input[type=time],input[type=week],input[type=number],input[type=email],input[type=url],input[type=tel],input[type=color],textarea{border:0}input[type=radio],input[type=checkbox]{margin:0;line-height:normal}.item-input input[type=button],.item-input input[type=reset],.item-input input[type=submit],.item-input input[type=radio],.item-input input[type=checkbox],.item-input input[type=file],.item-input input[type=image]{width:auto}input[type=file]{line-height:34px}.cloned-text-input+input,.cloned-text-input+textarea,.previous-input-focus{position:absolute!important;left:-9999px;width:200px}input::-moz-placeholder,textarea::-moz-placeholder{color:#aaa}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#aaa}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#aaa;text-indent:0}input[disabled],input[readonly]:not(.cloned-text-input),select[disabled],select[readonly],textarea[disabled],textarea[readonly]:not(.cloned-text-input){background-color:#f8f8f8;cursor:not-allowed}input[type=radio][disabled],input[type=radio][readonly],input[type=checkbox][disabled],input[type=checkbox][readonly]{background-color:transparent}.checkbox{position:relative;display:inline-block;padding:7px;cursor:pointer}.checkbox .checkbox-icon:before,.checkbox input:before{border-color:#ddd}.checkbox input:checked+.checkbox-icon:before,.checkbox input:checked:before{background:#387ef5;border-color:#387ef5}.checkbox-light .checkbox-icon:before,.checkbox-light input:before{border-color:#ddd}.checkbox-light input:checked+.checkbox-icon:before,.checkbox-light input:checked:before{background:#ddd;border-color:#ddd}.checkbox-stable .checkbox-icon:before,.checkbox-stable input:before{border-color:#b2b2b2}.checkbox-stable input:checked+.checkbox-icon:before,.checkbox-stable input:checked:before{background:#b2b2b2;border-color:#b2b2b2}.checkbox-positive .checkbox-icon:before,.checkbox-positive input:before{border-color:#387ef5}.checkbox-positive input:checked+.checkbox-icon:before,.checkbox-positive input:checked:before{background:#387ef5;border-color:#387ef5}.checkbox-calm .checkbox-icon:before,.checkbox-calm input:before{border-color:#11c1f3}.checkbox-calm input:checked+.checkbox-icon:before,.checkbox-calm input:checked:before{background:#11c1f3;border-color:#11c1f3}.checkbox-assertive .checkbox-icon:before,.checkbox-assertive input:before{border-color:#ef473a}.checkbox-assertive input:checked+.checkbox-icon:before,.checkbox-assertive input:checked:before{background:#ef473a;border-color:#ef473a}.checkbox-balanced .checkbox-icon:before,.checkbox-balanced input:before{border-color:#33cd5f}.checkbox-balanced input:checked+.checkbox-icon:before,.checkbox-balanced input:checked:before{background:#33cd5f;border-color:#33cd5f}.checkbox-energized .checkbox-icon:before,.checkbox-energized input:before{border-color:#ffc900}.checkbox-energized input:checked+.checkbox-icon:before,.checkbox-energized input:checked:before{background:#ffc900;border-color:#ffc900}.checkbox-royal .checkbox-icon:before,.checkbox-royal input:before{border-color:#886aea}.checkbox-royal input:checked+.checkbox-icon:before,.checkbox-royal input:checked:before{background:#886aea;border-color:#886aea}.checkbox-dark .checkbox-icon:before,.checkbox-dark input:before{border-color:#444}.checkbox-dark input:checked+.checkbox-icon:before,.checkbox-dark input:checked:before{background:#444;border-color:#444}.checkbox input:disabled+.checkbox-icon:before,.checkbox input:disabled:before{border-color:#ddd}.checkbox input:disabled:checked+.checkbox-icon:before,.checkbox input:disabled:checked:before{background:#ddd}.checkbox.checkbox-input-hidden input{display:none!important}.checkbox input,.checkbox-icon{position:relative;width:28px;height:28px;display:block;border:0;background:0 0;cursor:pointer;-webkit-appearance:none}.checkbox input:before,.checkbox-icon:before{display:table;width:100%;height:100%;border-width:1px;border-style:solid;border-radius:28px;background:#fff;content:' ';-webkit-transition:background-color 20ms ease-in-out;transition:background-color 20ms ease-in-out}.checkbox input:checked:before,input:checked+.checkbox-icon:before{border-width:2px}.checkbox input:after,.checkbox-icon:after{-webkit-transition:opacity .05s ease-in-out;transition:opacity .05s ease-in-out;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);position:absolute;top:33%;left:25%;display:table;width:14px;height:6px;border:1px solid #fff;border-top:0;border-right:0;content:' ';opacity:0}.checkbox-square .checkbox-icon:before,.checkbox-square input:before,.platform-android .checkbox-platform .checkbox-icon:before,.platform-android .checkbox-platform input:before{border-radius:2px;width:72%;height:72%;margin-top:14%;margin-left:14%;border-width:2px}.checkbox-square .checkbox-icon:after,.checkbox-square input:after,.platform-android .checkbox-platform .checkbox-icon:after,.platform-android .checkbox-platform input:after{border-width:2px;top:19%;left:25%;width:13px;height:7px}.platform-android .item-checkbox-right .checkbox-square .checkbox-icon::after{top:31%}.grade-c .checkbox input:after,.grade-c .checkbox-icon:after{-webkit-transform:rotate(0);transform:rotate(0);top:3px;left:4px;border:none;color:#fff;content:'\2713';font-weight:700;font-size:20px}.checkbox input:checked:after,input:checked+.checkbox-icon:after{opacity:1}.item-checkbox{padding-left:60px}.item-checkbox.active{box-shadow:none}.item-checkbox .checkbox{position:absolute;top:50%;right:8px;left:8px;z-index:3;margin-top:-21px}.item-checkbox.item-checkbox-right{padding-right:60px;padding-left:16px}.item-checkbox-right .checkbox input,.item-checkbox-right .checkbox-icon{float:right}.item-toggle{pointer-events:none}.toggle{position:relative;display:inline-block;pointer-events:auto;margin:-5px;padding:5px}.toggle input:checked+.track{border-color:#4cd964;background-color:#4cd964}.toggle.dragging .handle{background-color:#f2f2f2!important}.toggle.toggle-light input:checked+.track{border-color:#ddd;background-color:#ddd}.toggle.toggle-stable input:checked+.track{border-color:#b2b2b2;background-color:#b2b2b2}.toggle.toggle-positive input:checked+.track{border-color:#387ef5;background-color:#387ef5}.toggle.toggle-calm input:checked+.track{border-color:#11c1f3;background-color:#11c1f3}.toggle.toggle-assertive input:checked+.track{border-color:#ef473a;background-color:#ef473a}.toggle.toggle-balanced input:checked+.track{border-color:#33cd5f;background-color:#33cd5f}.toggle.toggle-energized input:checked+.track{border-color:#ffc900;background-color:#ffc900}.toggle.toggle-royal input:checked+.track{border-color:#886aea;background-color:#886aea}.toggle.toggle-dark input:checked+.track{border-color:#444;background-color:#444}.toggle input{display:none}.toggle .track{-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-property:background-color,border;transition-property:background-color,border;display:inline-block;box-sizing:border-box;width:51px;height:31px;border:2px solid #e6e6e6;border-radius:20px;background-color:#fff;content:' ';cursor:pointer;pointer-events:none}.platform-android4_2 .toggle .track{-webkit-background-clip:padding-box}.toggle .handle{-webkit-transition:.3s cubic-bezier(0,1.1,1,1.1);transition:.3s cubic-bezier(0,1.1,1,1.1);-webkit-transition-property:background-color,transform;transition-property:background-color,transform;position:absolute;display:block;width:27px;height:27px;border-radius:27px;background-color:#fff;top:7px;left:7px;box-shadow:0 2px 7px rgba(0,0,0,.35),0 1px 1px rgba(0,0,0,.15)}.toggle .handle:before{position:absolute;top:-4px;left:-21.5px;padding:18.5px 34px;content:" "}.toggle input:checked+.track .handle{-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0);background-color:#fff}.item-toggle.active{box-shadow:none}.item-toggle,.item-toggle.item-complex .item-content{padding-right:99px}.item-toggle.item-complex{padding-right:0}.item-toggle .toggle{position:absolute;top:10px;right:16px;z-index:3}.toggle input:disabled+.track{opacity:.6}.toggle-small .track{border:0;width:34px;height:15px;background:#9e9e9e}.toggle-small input:checked+.track{background:rgba(0,150,137,.5)}.toggle-small .handle{top:2px;left:4px;width:21px;height:21px;box-shadow:0 2px 5px rgba(0,0,0,.25)}.toggle-small input:checked+.track .handle{-webkit-transform:translate3d(16px,0,0);transform:translate3d(16px,0,0);background:#009689}.toggle-small.item-toggle .toggle{top:19px}.toggle-small .toggle-light input:checked+.track{background-color:rgba(221,221,221,.5)}.toggle-small .toggle-light input:checked+.track .handle{background-color:#ddd}.toggle-small .toggle-stable input:checked+.track{background-color:rgba(178,178,178,.5)}.toggle-small .toggle-stable input:checked+.track .handle{background-color:#b2b2b2}.toggle-small .toggle-positive input:checked+.track{background-color:rgba(56,126,245,.5)}.toggle-small .toggle-positive input:checked+.track .handle{background-color:#387ef5}.toggle-small .toggle-calm input:checked+.track{background-color:rgba(17,193,243,.5)}.toggle-small .toggle-calm input:checked+.track .handle{background-color:#11c1f3}.toggle-small .toggle-assertive input:checked+.track{background-color:rgba(239,71,58,.5)}.toggle-small .toggle-assertive input:checked+.track .handle{background-color:#ef473a}.toggle-small .toggle-balanced input:checked+.track{background-color:rgba(51,205,95,.5)}.toggle-small .toggle-balanced input:checked+.track .handle{background-color:#33cd5f}.toggle-small .toggle-energized input:checked+.track{background-color:rgba(255,201,0,.5)}.toggle-small .toggle-energized input:checked+.track .handle{background-color:#ffc900}.toggle-small .toggle-royal input:checked+.track{background-color:rgba(136,106,234,.5)}.toggle-small .toggle-royal input:checked+.track .handle{background-color:#886aea}.toggle-small .toggle-dark input:checked+.track{background-color:rgba(68,68,68,.5)}.toggle-small .toggle-dark input:checked+.track .handle{background-color:#444}.item-radio{padding:0}.item-radio:hover{cursor:pointer}.item-radio .item-content{padding-right:64px}.item-radio .radio-icon{position:absolute;top:0;right:0;z-index:3;visibility:hidden;padding:14px;height:100%;font-size:24px}.item-radio input{position:absolute;left:-9999px}.item-radio input:checked+.radio-content .item-content{background:#f7f7f7}.item-radio input:checked+.radio-content .radio-icon{visibility:visible}.range input{overflow:hidden;margin-top:5px;margin-bottom:5px;padding-right:2px;padding-left:1px;width:auto;height:43px;outline:0;background:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0,#ccc),color-stop(100%,#ccc)) center no-repeat;background:linear-gradient(to right,#ccc 0,#ccc 100%) center no-repeat;background-size:99% 2px;-webkit-appearance:none}.range input::-moz-focus-outer{border:0}.range input::-webkit-slider-thumb{position:relative;width:28px;height:28px;border-radius:50%;background-color:#fff;box-shadow:0 0 2px rgba(0,0,0,.3),0 3px 5px rgba(0,0,0,.2);cursor:pointer;-webkit-appearance:none;border:0}.range input::-webkit-slider-thumb:before{position:absolute;top:13px;left:-2001px;width:2000px;height:2px;background:#444;content:' '}.range input::-webkit-slider-thumb:after{position:absolute;top:-15px;left:-15px;padding:30px;content:' '}.range input::-ms-fill-lower{height:2px;background:#444}.range{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;padding:2px 11px}.range.range-light input::-webkit-slider-thumb:before{background:#ddd}.range.range-light input::-ms-fill-lower{background:#ddd}.range.range-stable input::-webkit-slider-thumb:before{background:#b2b2b2}.range.range-stable input::-ms-fill-lower{background:#b2b2b2}.range.range-positive input::-webkit-slider-thumb:before{background:#387ef5}.range.range-positive input::-ms-fill-lower{background:#387ef5}.range.range-calm input::-webkit-slider-thumb:before{background:#11c1f3}.range.range-calm input::-ms-fill-lower{background:#11c1f3}.range.range-balanced input::-webkit-slider-thumb:before{background:#33cd5f}.range.range-balanced input::-ms-fill-lower{background:#33cd5f}.range.range-assertive input::-webkit-slider-thumb:before{background:#ef473a}.range.range-assertive input::-ms-fill-lower{background:#ef473a}.range.range-energized input::-webkit-slider-thumb:before{background:#ffc900}.range.range-energized input::-ms-fill-lower{background:#ffc900}.range.range-royal input::-webkit-slider-thumb:before{background:#886aea}.range.range-royal input::-ms-fill-lower{background:#886aea}.range.range-dark input::-webkit-slider-thumb:before{background:#444}.range.range-dark input::-ms-fill-lower{background:#444}.range .icon{-webkit-box-flex:0;-webkit-flex:0;-moz-box-flex:0;-moz-flex:0;-ms-flex:0;flex:0;display:block;min-width:24px;text-align:center;font-size:24px}.range input{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;margin-right:10px;margin-left:10px}.range-label{-webkit-box-flex:0;-webkit-flex:0 0 auto;-moz-box-flex:0;-moz-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;display:block;white-space:nowrap}.range-label:first-child{padding-left:5px}.range input+.range-label{padding-right:5px;padding-left:0}.platform-windowsphone .range input{height:auto}.item-select{position:relative}.item-select select{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;top:0;bottom:0;right:0;padding:0 48px 0 16px;max-width:65%;border:none;background:#fff;color:#333;text-indent:.01px;text-overflow:'';white-space:nowrap;font-size:14px;cursor:pointer;direction:rtl}.item-select select::-ms-expand{display:none}.item-select option{direction:ltr}.item-select:after{position:absolute;top:50%;right:16px;margin-top:-3px;width:0;height:0;border-top:5px solid;border-right:5px solid transparent;border-left:5px solid transparent;content:"";pointer-events:none}.item-select.item-light select{background:#fff;color:#444}.item-select.item-stable select{background:#f8f8f8;color:#444}.item-select.item-stable .input-label,.item-select.item-stable:after{color:#666}.item-select.item-positive select{background:#387ef5;color:#fff}.item-select.item-positive .input-label,.item-select.item-positive:after{color:#fff}.item-select.item-calm select{background:#11c1f3;color:#fff}.item-select.item-calm .input-label,.item-select.item-calm:after{color:#fff}.item-select.item-assertive select{background:#ef473a;color:#fff}.item-select.item-assertive .input-label,.item-select.item-assertive:after{color:#fff}.item-select.item-balanced select{background:#33cd5f;color:#fff}.item-select.item-balanced .input-label,.item-select.item-balanced:after{color:#fff}.item-select.item-energized select{background:#ffc900;color:#fff}.item-select.item-energized .input-label,.item-select.item-energized:after{color:#fff}.item-select.item-royal select{background:#886aea;color:#fff}.item-select.item-royal .input-label,.item-select.item-royal:after{color:#fff}.item-select.item-dark select{background:#444;color:#fff}.item-select.item-dark .input-label,.item-select.item-dark:after{color:#fff}select[multiple],select[size]{height:auto}progress{display:block;margin:15px auto;width:100%}.button{border-color:transparent;background-color:#f8f8f8;color:#444;position:relative;display:inline-block;margin:0;padding:0 12px;min-width:52px;min-height:47px;border-width:1px;border-style:solid;border-radius:4px;vertical-align:top;text-align:center;text-overflow:ellipsis;line-height:42px;cursor:pointer}.button:hover{color:#444;text-decoration:none}.button.activated,.button.active{border-color:#a2a2a2;background-color:#e5e5e5}.button:after{position:absolute;top:-6px;right:-6px;bottom:-6px;left:-6px;content:' '}.button .icon{vertical-align:top;pointer-events:none}.button .icon:before,.button.icon-left:before,.button.icon-right:before,.button.icon:before{display:inline-block;padding:0 0 1px;vertical-align:inherit;font-size:24px;line-height:41px;pointer-events:none}.button.icon-left:before{float:left;padding-right:.2em;padding-left:0}.button.icon-right:before{float:right;padding-right:0;padding-left:.2em}.button.button-block,.button.button-full{margin-top:10px;margin-bottom:10px}.button.button-light{border-color:transparent;background-color:#fff;color:#444}.button.button-light:hover{color:#444;text-decoration:none}.button.button-light.activated,.button.button-light.active{border-color:#a2a2a2;background-color:#fafafa}.button.button-light.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ddd}.button.button-light.button-icon{border-color:transparent;background:0 0}.button.button-light.button-outline{border-color:#ddd;background:0 0;color:#ddd}.button.button-light.button-outline.activated,.button.button-light.button-outline.active{background-color:#ddd;box-shadow:none;color:#fff}.button.button-stable{border-color:transparent;background-color:#f8f8f8;color:#444}.button.button-stable:hover{color:#444;text-decoration:none}.button.button-stable.activated,.button.button-stable.active{border-color:#a2a2a2;background-color:#e5e5e5}.button.button-stable.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#b2b2b2}.button.button-stable.button-icon{border-color:transparent;background:0 0}.button.button-stable.button-outline{border-color:#b2b2b2;background:0 0;color:#b2b2b2}.button.button-stable.button-outline.activated,.button.button-stable.button-outline.active{background-color:#b2b2b2;box-shadow:none;color:#fff}.button.button-positive{border-color:transparent;background-color:#387ef5;color:#fff}.button.button-positive:hover{color:#fff;text-decoration:none}.button.button-positive.activated,.button.button-positive.active{border-color:#a2a2a2;background-color:#0c60ee}.button.button-positive.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#387ef5}.button.button-positive.button-icon{border-color:transparent;background:0 0}.button.button-positive.button-outline{border-color:#387ef5;background:0 0;color:#387ef5}.button.button-positive.button-outline.activated,.button.button-positive.button-outline.active{background-color:#387ef5;box-shadow:none;color:#fff}.button.button-calm{border-color:transparent;background-color:#11c1f3;color:#fff}.button.button-calm:hover{color:#fff;text-decoration:none}.button.button-calm.activated,.button.button-calm.active{border-color:#a2a2a2;background-color:#0a9dc7}.button.button-calm.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#11c1f3}.button.button-calm.button-icon{border-color:transparent;background:0 0}.button.button-calm.button-outline{border-color:#11c1f3;background:0 0;color:#11c1f3}.button.button-calm.button-outline.activated,.button.button-calm.button-outline.active{background-color:#11c1f3;box-shadow:none;color:#fff}.button.button-assertive{border-color:transparent;background-color:#ef473a;color:#fff}.button.button-assertive:hover{color:#fff;text-decoration:none}.button.button-assertive.activated,.button.button-assertive.active{border-color:#a2a2a2;background-color:#e42112}.button.button-assertive.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ef473a}.button.button-assertive.button-icon{border-color:transparent;background:0 0}.button.button-assertive.button-outline{border-color:#ef473a;background:0 0;color:#ef473a}.button.button-assertive.button-outline.activated,.button.button-assertive.button-outline.active{background-color:#ef473a;box-shadow:none;color:#fff}.button.button-balanced{border-color:transparent;background-color:#33cd5f;color:#fff}.button.button-balanced:hover{color:#fff;text-decoration:none}.button.button-balanced.activated,.button.button-balanced.active{border-color:#a2a2a2;background-color:#28a54c}.button.button-balanced.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#33cd5f}.button.button-balanced.button-icon{border-color:transparent;background:0 0}.button.button-balanced.button-outline{border-color:#33cd5f;background:0 0;color:#33cd5f}.button.button-balanced.button-outline.activated,.button.button-balanced.button-outline.active{background-color:#33cd5f;box-shadow:none;color:#fff}.button.button-energized{border-color:transparent;background-color:#ffc900;color:#fff}.button.button-energized:hover{color:#fff;text-decoration:none}.button.button-energized.activated,.button.button-energized.active{border-color:#a2a2a2;background-color:#e6b500}.button.button-energized.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ffc900}.button.button-energized.button-icon{border-color:transparent;background:0 0}.button.button-energized.button-outline{border-color:#ffc900;background:0 0;color:#ffc900}.button.button-energized.button-outline.activated,.button.button-energized.button-outline.active{background-color:#ffc900;box-shadow:none;color:#fff}.button.button-royal{border-color:transparent;background-color:#886aea;color:#fff}.button.button-royal:hover{color:#fff;text-decoration:none}.button.button-royal.activated,.button.button-royal.active{border-color:#a2a2a2;background-color:#6b46e5}.button.button-royal.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#886aea}.button.button-royal.button-icon{border-color:transparent;background:0 0}.button.button-royal.button-outline{border-color:#886aea;background:0 0;color:#886aea}.button.button-royal.button-outline.activated,.button.button-royal.button-outline.active{background-color:#886aea;box-shadow:none;color:#fff}.button.button-dark{border-color:transparent;background-color:#444;color:#fff}.button.button-dark:hover{color:#fff;text-decoration:none}.button.button-dark.activated,.button.button-dark.active{border-color:#a2a2a2;background-color:#262626}.button.button-dark.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444}.button.button-dark.button-icon{border-color:transparent;background:0 0}.button.button-dark.button-outline{border-color:#444;background:0 0;color:#444}.button.button-dark.button-outline.activated,.button.button-dark.button-outline.active{background-color:#444;box-shadow:none;color:#fff}.button-small{padding:2px 4px 1px;min-width:28px;min-height:30px;font-size:12px;line-height:26px}.button-small .icon:before,.button-small.icon-left:before,.button-small.icon-right:before,.button-small.icon:before{font-size:16px;line-height:19px;margin-top:3px}.button-large{padding:0 16px;min-width:68px;min-height:59px;font-size:20px;line-height:53px}.button-large .icon:before,.button-large.icon-left:before,.button-large.icon-right:before,.button-large.icon:before{padding-bottom:2px;font-size:32px;line-height:51px}.button-icon{-webkit-transition:opacity .1s;transition:opacity .1s;padding:0 6px;min-width:initial;border-color:transparent;background:0 0}.button-icon.button.activated,.button-icon.button.active{border-color:transparent;background:0 0;box-shadow:none;opacity:.3}.button-icon .icon:before,.button-icon.icon:before{font-size:32px}.button-clear{-webkit-transition:opacity .1s;transition:opacity .1s;padding:0 6px;max-height:42px;border-color:transparent;background:0 0;box-shadow:none}.button-clear.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:transparent}.button-clear.button-icon{border-color:transparent;background:0 0}.button-clear.activated,.button-clear.active{opacity:.3}.button-outline{-webkit-transition:opacity .1s;transition:opacity .1s;background:0 0;box-shadow:none}.button-outline.button-outline{border-color:transparent;background:0 0;color:transparent}.button-outline.button-outline.activated,.button-outline.button-outline.active{background-color:transparent;box-shadow:none;color:#fff}.padding>.button.button-block:first-child{margin-top:0}.button-block{display:block;clear:both}.button-block:after{clear:both}.button-full,.button-full>.button{display:block;margin-right:0;margin-left:0;border-right-width:0;border-left-width:0;border-radius:0}.button-full>button.button,button.button-block,button.button-full,input.button.button-block{width:100%}a.button{text-decoration:none}a.button .icon:before,a.button.icon-left:before,a.button.icon-right:before,a.button.icon:before{margin-top:2px}.button.disabled,.button[disabled]{opacity:.4;cursor:default!important;pointer-events:none}.button-bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;width:100%}.button-bar.button-bar-inline{display:block;width:auto}.button-bar.button-bar-inline:after,.button-bar.button-bar-inline:before{display:table;content:"";line-height:0}.button-bar.button-bar-inline:after{clear:both}.button-bar.button-bar-inline>.button{width:auto;display:inline-block;float:left}.button-bar.bar-light>.button{border-color:#ddd}.button-bar.bar-stable>.button{border-color:#b2b2b2}.button-bar.bar-positive>.button{border-color:#0c60ee}.button-bar.bar-calm>.button{border-color:#0a9dc7}.button-bar.bar-assertive>.button{border-color:#e42112}.button-bar.bar-balanced>.button{border-color:#28a54c}.button-bar.bar-energized>.button{border-color:#e6b500}.button-bar.bar-royal>.button{border-color:#6b46e5}.button-bar.bar-dark>.button{border-color:#111}.button-bar>.button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;padding:0 16px;width:0;border-width:1px 0 1px 1px;border-radius:0;text-align:center;text-overflow:ellipsis;white-space:nowrap}.button-bar>.button .icon:before,.button-bar>.button:before{line-height:44px}.button-bar>.button:first-child{border-radius:4px 0 0 4px}.button-bar>.button:last-child{border-right-width:1px;border-radius:0 4px 4px 0}.button-bar>.button:only-child{border-radius:4px}.button-bar>.button-small .icon:before,.button-bar>.button-small:before{line-height:28px}.row{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:5px;width:100%}.row-wrap{-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.row-no-padding,.row-no-padding>.col{padding:0}.row+.row{padding-top:0}.col{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;padding:5px;width:100%}.row-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;-moz-align-items:flex-start;align-items:flex-start}.row-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;-moz-align-items:flex-end;align-items:flex-end}.row-center{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.row-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;align-items:stretch}.row-baseline{-webkit-box-align:baseline;-ms-flex-align:baseline;-webkit-align-items:baseline;-moz-align-items:baseline;align-items:baseline}.col-top{-webkit-align-self:flex-start;-moz-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.col-bottom{-webkit-align-self:flex-end;-moz-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.col-center{-webkit-align-self:center;-moz-align-self:center;-ms-flex-item-align:center;align-self:center}.col-offset-10{margin-left:10%}.col-offset-20{margin-left:20%}.col-offset-25{margin-left:25%}.col-offset-33,.col-offset-34{margin-left:33.3333%}.col-offset-50{margin-left:50%}.col-offset-66,.col-offset-67{margin-left:66.6666%}.col-offset-75{margin-left:75%}.col-offset-80{margin-left:80%}.col-offset-90{margin-left:90%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 10%;-moz-box-flex:0;-moz-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%;max-width:10%}.col-20{-webkit-box-flex:0;-webkit-flex:0 0 20%;-moz-box-flex:0;-moz-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.col-25{-webkit-box-flex:0;-webkit-flex:0 0 25%;-moz-box-flex:0;-moz-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-33,.col-34{-webkit-box-flex:0;-webkit-flex:0 0 33.3333%;-moz-box-flex:0;-moz-flex:0 0 33.3333%;-ms-flex:0 0 33.3333%;flex:0 0 33.3333%;max-width:33.3333%}.col-40{-webkit-box-flex:0;-webkit-flex:0 0 40%;-moz-box-flex:0;-moz-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%;max-width:40%}.col-50{-webkit-box-flex:0;-webkit-flex:0 0 50%;-moz-box-flex:0;-moz-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-60{-webkit-box-flex:0;-webkit-flex:0 0 60%;-moz-box-flex:0;-moz-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%;max-width:60%}.col-66,.col-67{-webkit-box-flex:0;-webkit-flex:0 0 66.6666%;-moz-box-flex:0;-moz-flex:0 0 66.6666%;-ms-flex:0 0 66.6666%;flex:0 0 66.6666%;max-width:66.6666%}.col-75{-webkit-box-flex:0;-webkit-flex:0 0 75%;-moz-box-flex:0;-moz-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-80{-webkit-box-flex:0;-webkit-flex:0 0 80%;-moz-box-flex:0;-moz-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%;max-width:80%}.col-90{-webkit-box-flex:0;-webkit-flex:0 0 90%;-moz-box-flex:0;-moz-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%;max-width:90%}@media (max-width:567px){.responsive-sm{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-sm .col,.responsive-sm .col-10,.responsive-sm .col-20,.responsive-sm .col-25,.responsive-sm .col-33,.responsive-sm .col-34,.responsive-sm .col-50,.responsive-sm .col-66,.responsive-sm .col-67,.responsive-sm .col-75,.responsive-sm .col-80,.responsive-sm .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}@media (max-width:767px){.responsive-md{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-md .col,.responsive-md .col-10,.responsive-md .col-20,.responsive-md .col-25,.responsive-md .col-33,.responsive-md .col-34,.responsive-md .col-50,.responsive-md .col-66,.responsive-md .col-67,.responsive-md .col-75,.responsive-md .col-80,.responsive-md .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}@media (max-width:1023px){.responsive-lg{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-lg .col,.responsive-lg .col-10,.responsive-lg .col-20,.responsive-lg .col-25,.responsive-lg .col-33,.responsive-lg .col-34,.responsive-lg .col-50,.responsive-lg .col-66,.responsive-lg .col-67,.responsive-lg .col-75,.responsive-lg .col-80,.responsive-lg .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}.hide{display:none}.opacity-hide{opacity:0}.grade-b .opacity-hide,.grade-c .opacity-hide{opacity:1;display:none}.show{display:block}.opacity-show{opacity:1}.invisible{visibility:hidden}.keyboard-open .hide-on-keyboard-open{display:none}.keyboard-open .bar-footer.hide-on-keyboard-open+.pane .has-footer,.keyboard-open .tabs.hide-on-keyboard-open+.pane .has-tabs{bottom:0}.inline{display:inline-block}.disable-pointer-events{pointer-events:none}.enable-pointer-events{pointer-events:auto}.disable-user-behavior{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-drag:none;-ms-touch-action:none;-ms-content-zooming:none}.click-block{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;z-index:99999;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);overflow:hidden}.click-block-hide{-webkit-transform:translate3d(-9999px,0,0);transform:translate3d(-9999px,0,0)}.no-resize{resize:none}.block{display:block;clear:both}.block:after{display:block;visibility:hidden;clear:both;height:0;content:"."}.full-image{width:100%}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}.padding{padding:10px}.padding-top,.padding-vertical{padding-top:10px}.padding-horizontal,.padding-right{padding-right:10px}.padding-bottom,.padding-vertical{padding-bottom:10px}.padding-horizontal,.padding-left{padding-left:10px}.iframe-wrapper{position:fixed;-webkit-overflow-scrolling:touch;overflow:scroll}.iframe-wrapper iframe{height:100%;width:100%}.rounded{border-radius:4px}.light,a.light{color:#fff}.light-bg{background-color:#fff}.light-border{border-color:#ddd}.stable,a.stable{color:#f8f8f8}.stable-bg{background-color:#f8f8f8}.stable-border{border-color:#b2b2b2}.positive,a.positive{color:#387ef5}.positive-bg{background-color:#387ef5}.positive-border{border-color:#0c60ee}.calm,a.calm{color:#11c1f3}.calm-bg{background-color:#11c1f3}.calm-border{border-color:#0a9dc7}.assertive,a.assertive{color:#ef473a}.assertive-bg{background-color:#ef473a}.assertive-border{border-color:#e42112}.balanced,a.balanced{color:#33cd5f}.balanced-bg{background-color:#33cd5f}.balanced-border{border-color:#28a54c}.energized,a.energized{color:#ffc900}.energized-bg{background-color:#ffc900}.energized-border{border-color:#e6b500}.royal,a.royal{color:#886aea}.royal-bg{background-color:#886aea}.royal-border{border-color:#6b46e5}.dark,a.dark{color:#444}.dark-bg{background-color:#444}.dark-border{border-color:#111}[collection-repeat]{left:0!important;top:0!important;position:absolute!important;z-index:1}.collection-repeat-container{position:relative;z-index:1}.collection-repeat-after-container{z-index:0;display:block}.collection-repeat-after-container.horizontal{display:inline-block}.ng-cloak,.ng-hide:not(.ng-hide-animate),.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader){height:64px;height:calc(constant(safe-area-inset-top) + 44px);height:calc(env(safe-area-inset-top) + 44px)}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper{margin-top:19px!important}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader)>*{margin-top:20px;margin-top:env(safe-area-inset-top)}.platform-ios.platform-cordova:not(.fullscreen) .bar-header{padding-left:calc(env(safe-area-inset-left) + 5px);padding-right:calc(env(safe-area-inset-right) + 5px)}.platform-ios.platform-cordova:not(.fullscreen) .bar-header .buttons:last-child{right:calc(constant(safe-area-inset-right) + 5px);right:calc(env(safe-area-inset-right) + 5px)}.platform-ios.platform-cordova:not(.fullscreen) .bar-footer.has-tabs,.platform-ios.platform-cordova:not(.fullscreen) .has-tabs{bottom:calc(constant(safe-area-inset-bottom) + 49px);bottom:calc(env(safe-area-inset-bottom) + 49px)}.platform-ios.platform-cordova:not(.fullscreen) .tabs-top>.tabs,.platform-ios.platform-cordova:not(.fullscreen) .tabs.tabs-top{top:64px}.platform-ios.platform-cordova:not(.fullscreen) .tabs{padding-bottom:env(safe-area-inset-bottom);height:calc(constant(safe-area-inset-bottom) + 49px);height:calc(env(safe-area-inset-bottom) + 49px)}.platform-ios.platform-cordova:not(.fullscreen) .bar-subheader,.platform-ios.platform-cordova:not(.fullscreen) .has-header{top:64px;top:calc(constant(safe-area-inset-top) + 44px);top:calc(env(safe-area-inset-top) + 44px)}.platform-ios.platform-cordova:not(.fullscreen) .has-subheader{top:108px;top:calc(constant(safe-area-inset-top) + 88px);top:calc(env(safe-area-inset-top) + 88px)}.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-tabs-top{top:113px;top:calc(93px + constant(safe-area-inset-top));top:calc(93px + env(safe-area-inset-top))}.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-subheader.has-tabs-top{top:157px;top:calc(137px + constant(safe-area-inset-right));top:calc(137px + env(safe-area-inset-right))}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader){height:44px}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper{margin-top:-1px}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader)>*{margin-top:0}.platform-ios.platform-cordova .popover .bar-subheader,.platform-ios.platform-cordova .popover .has-header{top:44px}.platform-ios.platform-cordova .popover .has-subheader{top:88px}.platform-ios.platform-cordova.status-bar-hide{margin-bottom:20px}@media (orientation:landscape){.item{padding:16px calc(constant(safe-area-inset-right) + 16px)}.item .badge{right:calc(constant(safe-area-inset-right) + 32px)}.item-icon-left{padding-left:calc(constant(safe-area-inset-left) + 54px)}.item-icon-left .icon{left:calc(constant(safe-area-inset-left) + 11px)}.item-icon-right{padding-right:calc(constant(safe-area-inset-right) + 54px)}.item-icon-right .icon{right:calc(constant(safe-area-inset-right) + 11px)}.item-complex,a.item.item-complex,button.item.item-complex{padding:0}.item-complex .item-content,a.item.item-complex .item-content,button.item.item-complex .item-content{padding:16px calc(constant(safe-area-inset-right) + 49px) 16px calc(constant(safe-area-inset-left) + 16px)}.item-left-edit.visible.active{-webkit-transform:translate3d(calc(constant(safe-area-inset-left) + 8px),0,0);transform:translate3d(calc(constant(safe-area-inset-left) + 8px),0,0)}.item-left-editing.item-left-editable .item-content,.list-left-editing .item-left-editable .item-content{-webkit-transform:translate3d(calc(constant(safe-area-inset-left) + 50px),0,0);transform:translate3d(calc(constant(safe-area-inset-left) + 50px),0,0)}.item-right-edit{right:constant(safe-area-inset-right);right:env(safe-area-inset-right)}.platform-ios.platform-browser.platform-ipad{position:fixed}}.platform-c:not(.enable-transitions) *{-webkit-transition:none!important;transition:none!important}.slide-in-up{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.slide-in-up.ng-enter,.slide-in-up>.ng-enter{-webkit-transition:all cubic-bezier(.1,.7,.1,1) 400ms;transition:all cubic-bezier(.1,.7,.1,1) 400ms}.slide-in-up.ng-enter-active,.slide-in-up>.ng-enter-active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-in-up.ng-leave,.slide-in-up>.ng-leave{-webkit-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms}@-webkit-keyframes scaleOut{from{-webkit-transform:scale(1);opacity:1}to{-webkit-transform:scale(.8);opacity:0}}@keyframes scaleOut{from{transform:scale(1);opacity:1}to{transform:scale(.8);opacity:0}}@-webkit-keyframes superScaleIn{from{-webkit-transform:scale(1.2);opacity:0}to{-webkit-transform:scale(1);opacity:1}}@keyframes superScaleIn{from{transform:scale(1.2);opacity:0}to{transform:scale(1);opacity:1}}[nav-view-transition=ios] [nav-view=entering],[nav-view-transition=ios] [nav-view=leaving]{-webkit-transition-duration:500ms;transition-duration:500ms;-webkit-transition-timing-function:cubic-bezier(.36,.66,.04,1);transition-timing-function:cubic-bezier(.36,.66,.04,1);-webkit-transition-property:opacity,-webkit-transform,box-shadow;transition-property:opacity,transform,box-shadow}[nav-view-transition=ios][nav-view-direction=forward],[nav-view-transition=ios][nav-view-direction=back]{background-color:#000}[nav-view-transition=ios] [nav-view=active],[nav-view-transition=ios][nav-view-direction=forward] [nav-view=entering],[nav-view-transition=ios][nav-view-direction=back] [nav-view=leaving]{z-index:3}[nav-view-transition=ios][nav-view-direction=forward] [nav-view=leaving],[nav-view-transition=ios][nav-view-direction=back] [nav-view=entering]{z-index:2}[nav-bar-transition=ios] .back-text,[nav-bar-transition=ios] .buttons,[nav-bar-transition=ios] .title{-webkit-transition-duration:500ms;transition-duration:500ms;-webkit-transition-timing-function:cubic-bezier(.36,.66,.04,1);transition-timing-function:cubic-bezier(.36,.66,.04,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,transform}[nav-bar-transition=ios] [nav-bar=entering],[nav-bar-transition=ios] [nav-bar=active]{z-index:10}[nav-bar-transition=ios] [nav-bar=entering] .bar,[nav-bar-transition=ios] [nav-bar=active] .bar{background:0 0}[nav-bar-transition=ios] [nav-bar=cached]{display:block}[nav-bar-transition=ios] [nav-bar=cached] .header-item{display:none}[nav-view-transition=android] [nav-view=entering],[nav-view-transition=android] [nav-view=leaving]{-webkit-transition-duration:200ms;transition-duration:200ms;-webkit-transition-timing-function:cubic-bezier(.4,.6,.2,1);transition-timing-function:cubic-bezier(.4,.6,.2,1);-webkit-transition-property:-webkit-transform;transition-property:transform}[nav-view-transition=android] [nav-view=active],[nav-view-transition=android][nav-view-direction=forward] [nav-view=entering],[nav-view-transition=android][nav-view-direction=back] [nav-view=leaving]{z-index:3}[nav-view-transition=android][nav-view-direction=forward] [nav-view=leaving],[nav-view-transition=android][nav-view-direction=back] [nav-view=entering]{z-index:2}[nav-bar-transition=android] .buttons,[nav-bar-transition=android] .title{-webkit-transition-timing-function:cubic-bezier(.4,.6,.2,1);transition-timing-function:cubic-bezier(.4,.6,.2,1)}[nav-bar-transition=android] [nav-bar=entering],[nav-bar-transition=android] [nav-bar=active]{z-index:10}[nav-bar-transition=android] [nav-bar=entering] .bar,[nav-bar-transition=android] [nav-bar=active] .bar{background:0 0}[nav-bar-transition=android] [nav-bar=cached]{display:block}[nav-bar-transition=android] [nav-bar=cached] .header-item{display:none}[nav-swipe=fast] .back-text,[nav-swipe=fast] .buttons,[nav-swipe=fast] .title,[nav-swipe=fast] [nav-view]{-webkit-transition-duration:50ms;transition-duration:50ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}[nav-swipe=slow] .back-text,[nav-swipe=slow] .buttons,[nav-swipe=slow] .title,[nav-swipe=slow] [nav-view]{-webkit-transition-duration:160ms;transition-duration:160ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}[nav-bar=cached],[nav-view=cached]{display:none}[nav-view=stage]{opacity:0;-webkit-transition-duration:0;transition-duration:0}[nav-bar=stage] .back-text,[nav-bar=stage] .buttons,[nav-bar=stage] .title{position:absolute;opacity:0;-webkit-transition-duration:0s;transition-duration:0s}.dark-text-primary{color:#000;opacity:.87}.dark-text-secondary{color:#000;opacity:.54}.dark-text-disabled{color:#000;opacity:.38}.dark-text-dividers{color:#000;opacity:.12}.light-text-primary{color:#FFF;opacity:1}.light-text-secondary{color:#FFF;opacity:.7}.light-text-disabled{color:#FFF;opacity:.5}.light-text-dividers{color:#FFF;opacity:.12}.popup-body{line-height:20px}.scroll{height:100%}.overflow-scroll{margin-bottom:0}.col{font-weight:300}.row+.row{margin-top:0}.textFont{font-weight:400}.digitFont{font-weight:300}.cityArrow{width:10%;padding-bottom:7%;padding-top:7%;margin:auto;text-align:center}.topMainBox{width:80%;margin:auto;text-align:center}.timeChart{width:1716px}.weeklyChart{width:936px}.guide-content{position:absolute;left:0;top:0;right:0;bottom:55px;overflow:hidden;background-repeat:no-repeat;background-position:center;background-size:contain}.guide-content-head{width:100%;margin:0 0 10px;text-align:center;color:inherit}.guide-content-text{width:100%;margin:0 0 5px;text-align:center;color:inherit}.guide-pager{width:100%;height:56px;position:absolute;bottom:0;border-top:1px #d3d3d3 solid;z-index:2}.guide-pager-left{width:30%;padding:20px 5px;float:left;text-align:right}.guide-pager-right{width:30%;padding:20px 5px;float:right;text-align:left}.guide-close{font-size:28px;padding:10px;position:absolute;right:0;color:inherit}.line-today{stroke:#fff;stroke-width:2px;fill:none}.line-yesterday{stroke:#d0d0d0;stroke-width:1px;fill:none}.circle-today{stroke:#fff;stroke-width:1px;fill:#fff}.circle-yesterday{stroke:#d0d0d0;stroke-width:1px;fill:#d0d0d0}.circle-today-current{stroke:#fff;stroke-width:2px;fill:#FF5252}.circle-yesterday-current{stroke:#d0d0d0;stroke-width:2px;fill:#d0d0d0}.text-today{fill:#fff;opacity:.87;font-weight:300;font-size:15px}.text-yesterday{fill:#90A4AE;opacity:.54;font-weight:300;font-size:15px}.circle-hidden,.text-hidden{visibility:hidden}.axis .minor line{stroke:#777;stroke-dasharray:2,2}.x.axis line{stroke:#fff}.label{background:rgba(0,0,0,.4);border-radius:5%;position:absolute;bottom:10px;padding:5px;font-size:10px}.label-today{background-color:#fff;width:10px;height:10px;display:inline-block}.label-yesterday{background-color:#9E9E9E;width:10px;height:10px;display:inline-block}.day-title-list{position:relative;height:14px}.day-title{position:absolute;top:0;width:120px}.rect{fill:#fff}.detail-item-p{margin:auto 0 auto 8px;width:200px}.row-detail-aqi{padding:0 16px 5px}.col-detail-aqi{margin:auto 0;padding:0}.img-detail-aqi{font-size:24px;vertical-align:middle;margin:0 8px}.main-content{width:100%;color:#fff}.extend-content{width:100%}.chart-content{width:100%;margin:0 0 5px}.chartBox{padding:0;display:flex;flex-direction:column}.table-content{flex:1;width:100%;padding:0;display:flex;flex-direction:column}.table-border{box-shadow:1px 0 0 0 rgba(254,254,254,.1) inset}.table-items{height:inherit;display:flex;flex-direction:column;text-align:center}.tabs{color:#fff;background-image:linear-gradient(0deg,#fff,#fff 60%,transparent 60%);background-color:transparent}.tabs-search .tabs{color:#000;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 70%);background-color:#FFF}.pane,.view{background-color:transparent}.tab-item.tab-item-active{line-height:14px}.purchase-content{background-color:#F5F5F5}.item-center{display:block;margin:auto}.menu-left .menu-content i{padding-right:16px;padding-top:10px;position:absolute;right:0;color:#333;font-size:14px}.menu-content .item-select:after{content:none!important}.menu-content select{padding-right:16px;background:0 0}.start-content .item-input{padding-right:16px;display:flex!important;flex:1 0}.start-content .item-input button{min-height:unset;line-height:unset}.search-header{margin-left:40px!important;margin-right:0!important;padding:5px 0;background-color:#444;background-image:none;display:flex!important;flex:1 0}.search-header .icon{color:#444;padding-right:6px;font-size:17px}.search-header input{background-color:transparent;width:100%;font-size:17px;line-height:normal}.search-content .button{width:100%;border-color:#ddd;background-color:#fff;font-size:17px}.search-item{margin:auto;text-align:left;font-weight:500;font-size:17px}.search-item.search-name{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.search-item .material-icons{font-size:inherit;position:relative;top:2px;right:3px;letter-spacing:-4px}.search-item.last-item{width:48px;text-align:center;font-size:28px;margin:auto 0}.search-item img{display:block;margin:auto;width:48px}.search-item a{color:#444}.search-item .toggle,.search-item .track{width:100%}.search-item .ion-ios-close-outline:before{font-weight:700}.toggle.toggle-search{margin:0}.toggle.toggle-search .track{height:14px;border:0;border-radius:8px;margin:auto 0;background-color:rgba(158,158,158,.8)}.toggle.toggle-search input:checked+.track{background-color:#444}.toggle.toggle-search .track .handle{width:20px;height:20px;border-radius:50%;left:5px;top:auto;bottom:auto;margin-top:-3px;background-color:#fff}.toggle.toggle-search input:checked+.track .handle{background-color:#fff;left:auto;right:25px}.bar.bar-search{border-color:#444;background-color:#444;background-image:linear-gradient(0deg,#444,#444 50%,transparent 50%);color:#fff}.bar.bar-forecast{border-color:#0288D1;background-color:#03A9F4;background-image:linear-gradient(0deg,#0288D1,#0288D1 50%,transparent 50%);color:#fff}.bar.bar-dailyforecast{border-color:#0097A7;background-color:#00BCD4;background-image:linear-gradient(0deg,#0097A7,#0097A7 50%,transparent 50%);color:#fff}.menu{width:100%!important}.menu-content{-webkit-transform:none!important;transform:none!important}.menu-content.menu-open{z-index:-1}.menu-left{z-index:auto!important;left:-100%;-webkit-transition:left 200ms ease;transition:left 200ms ease}.menu-left.menu-open{left:0}[nav-bar-transition=android] .buttons,[nav-bar-transition=android] .title{-webkit-transition-duration:0ms;transition-duration:0ms;-webkit-transition-property:none;transition-property:none;opacity:1}[nav-bar-transition=android] [nav-bar=leaving] .buttons-right,[nav-bar-transition=android] [nav-bar=leaving] .search-header{display:none}[nav-bar-transition=android] [nav-bar=entering] .header-item{opacity:1}.bar.bar-dailyforecast .search-header,.bar.bar-forecast .search-header,.bar.bar-search .dailyforecast-header,.bar.bar-search .forecast-header{display:none!important}.menu-content.overflow-scroll{overflow-y:auto!important;-webkit-overflow-scrolling:auto!important}.ionic_popup .popup{background-color:#fff;width:280px}.ionic_popup .popup-head{display:none}.ionic_popup .popup-body{padding:0}.ionic_popup .popup-buttons{padding:0;min-height:44px;height:44px}.ionic_popup .popup-buttons .button:not(:last-child){margin-right:1px}.ionic_popup .button_cancel,.ionic_popup .button_close{background-color:#03A9F4;color:#fff}.display4{font-size:112px;opacity:.54;font-weight:300;letter-spacing:-10px}.display3{font-size:56px;opacity:.54;font-weight:400;letter-spacing:-5px}.display2{font-size:45px;opacity:.54;font-weight:400}.display1{font-size:34px;opacity:.54;font-weight:400}.headline{font-size:24px;opacity:.87;font-weight:400}.title{left:0!important;right:0!important}.setting-title-light{background-color:inherit;color:inherit;font-size:20px;opacity:.87}.setting-subheading-light{background-color:inherit;color:inherit;font-size:17px;opacity:.87}.item-select:after{color:#fff}p small{font-size:10px}.subheading{font-size:17px;opacity:.87;font-weight:400}.body2{font-size:15px;opacity:.87;font-weight:700}.body1{font-size:15px;opacity:.87;font-weight:400}.caption{font-size:13px;opacity:.54;font-weight:400}.button{font-size:15px;opacity:.87;font-weight:700}[md-page-header]{padding:0;color:#fff;background-color:initial;margin:auto}[md-header-picture]{background-position:50% 50%}.good{color:#448AFF;opacity:.87}.moderate{color:#00E676;opacity:.87}.unhealthy-for-sensitive{color:#FFD600;opacity:.87}.unhealthy{color:#FF6D00;opacity:.87}.very-unhealthy{color:#FF1744;opacity:.87}.hazardous{color:#795548;opacity:.87}@media only screen and (min-device-width:320px) and (max-device-width:480px) and (-webkit-min-device-pixel-ratio:2) and (device-aspect-ratio:320 / 480){.timeChart{width:1749px}.weeklyChart{width:954px}}@media only screen and (min-device-width:320px) and (max-device-width:568px) and (-webkit-min-device-pixel-ratio:2) and (device-aspect-ratio:320 / 568){.timeChart{width:1749px}.weeklyChart{width:954px}}@media only screen and (min-device-width:375px) and (max-device-width:667px) and (-webkit-min-device-pixel-ratio:2) and (device-aspect-ratio:375 / 667){.timeChart{width:1749px}.weeklyChart{width:954px}}@media only screen and (min-device-width:414px) and (max-device-width:736px) and (-webkit-min-device-pixel-ratio:3) and (device-aspect-ratio:414 / 736){.timeChart{width:1947px}.weeklyChart{width:1062px}}@media screen and (device-width:412px) and (device-height:732px) and (device-aspect-ratio:412 / 732){.timeChart{width:1942px}.weeklyChart{width:1059px}} \ No newline at end of file +@charset "UTF-8";@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(../fonts/MaterialIcons-Regular.eot);src:local("Material Icons"),local("MaterialIcons-Regular"),url(../fonts/MaterialIcons-Regular.woff2) format("woff2"),url(../fonts/MaterialIcons-Regular.woff) format("woff"),url(../fonts/MaterialIcons-Regular.ttf) format("truetype")}.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:'liga'}/*! + Ionicons, v2.0.1 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/ionic-team/ionicons + + Android-style icons originally built by Google’s + Material Design Icons: https://github.com/google/material-design-icons + used under CC BY http://creativecommons.org/licenses/by/4.0/ + Modified icons to fit ionicon’s grid from original. +*/@font-face{font-family:Ionicons;src:url(../lib/ionic/fonts/ionicons.eot?v=2.0.1);src:url(../lib/ionic/fonts/ionicons.eot?v=2.0.1#iefix) format("embedded-opentype"),url(../lib/ionic/fonts/ionicons.ttf?v=2.0.1) format("truetype"),url(../lib/ionic/fonts/ionicons.woff?v=2.0.1) format("woff"),url(../lib/ionic/fonts/ionicons.woff) format("woff"),url(../lib/ionic/fonts/ionicons.svg?v=2.0.1#Ionicons) format("svg");font-weight:400;font-style:normal}.ion,.ion-alert-circled:before,.ion-alert:before,.ion-android-add-circle:before,.ion-android-add:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-cloud:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done-all:before,.ion-android-done:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite-outline:before,.ion-android-favorite:before,.ion-android-film:before,.ion-android-folder-open:before,.ion-android-folder:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone-off:before,.ion-android-microphone:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-notifications:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person-add:before,.ion-android-person:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove-circle:before,.ion-android-remove:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share-alt:before,.ion-android-share:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-star:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace-outline:before,.ion-backspace:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox-working:before,.ion-chatbox:before,.ion-chatboxes:before,.ion-chatbubble-working:before,.ion-chatbubble:before,.ion-chatbubbles:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-checkmark:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close-circled:before,.ion-close-round:before,.ion-close:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code-download:before,.ion-code-working:before,.ion-code:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document-text:before,.ion-document:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email-unread:before,.ion-email:before,.ion-erlenmeyer-flask-bubbles:before,.ion-erlenmeyer-flask:before,.ion-eye-disabled:before,.ion-eye:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash-off:before,.ion-flash:before,.ion-folder:before,.ion-fork-repo:before,.ion-fork:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy-outline:before,.ion-happy:before,.ion-headphone:before,.ion-heart-broken:before,.ion-heart:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-help:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information-circled:before,.ion-information:before,.ion-ionic:before,.ion-ios-alarm-outline:before,.ion-ios-alarm:before,.ion-ios-albums-outline:before,.ion-ios-albums:before,.ion-ios-americanfootball-outline:before,.ion-ios-americanfootball:before,.ion-ios-analytics-outline:before,.ion-ios-analytics:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at-outline:before,.ion-ios-at:before,.ion-ios-barcode-outline:before,.ion-ios-barcode:before,.ion-ios-baseball-outline:before,.ion-ios-baseball:before,.ion-ios-basketball-outline:before,.ion-ios-basketball:before,.ion-ios-bell-outline:before,.ion-ios-bell:before,.ion-ios-body-outline:before,.ion-ios-body:before,.ion-ios-bolt-outline:before,.ion-ios-bolt:before,.ion-ios-book-outline:before,.ion-ios-book:before,.ion-ios-bookmarks-outline:before,.ion-ios-bookmarks:before,.ion-ios-box-outline:before,.ion-ios-box:before,.ion-ios-briefcase-outline:before,.ion-ios-briefcase:before,.ion-ios-browsers-outline:before,.ion-ios-browsers:before,.ion-ios-calculator-outline:before,.ion-ios-calculator:before,.ion-ios-calendar-outline:before,.ion-ios-calendar:before,.ion-ios-camera-outline:before,.ion-ios-camera:before,.ion-ios-cart-outline:before,.ion-ios-cart:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatbubble-outline:before,.ion-ios-chatbubble:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-checkmark:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock-outline:before,.ion-ios-clock:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-close:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-download:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-outline:before,.ion-ios-cloudy:before,.ion-ios-cog-outline:before,.ion-ios-cog:before,.ion-ios-color-filter-outline:before,.ion-ios-color-filter:before,.ion-ios-color-wand-outline:before,.ion-ios-color-wand:before,.ion-ios-compose-outline:before,.ion-ios-compose:before,.ion-ios-contact-outline:before,.ion-ios-contact:before,.ion-ios-copy-outline:before,.ion-ios-copy:before,.ion-ios-crop-strong:before,.ion-ios-crop:before,.ion-ios-download-outline:before,.ion-ios-download:before,.ion-ios-drag:before,.ion-ios-email-outline:before,.ion-ios-email:before,.ion-ios-eye-outline:before,.ion-ios-eye:before,.ion-ios-fastforward-outline:before,.ion-ios-fastforward:before,.ion-ios-filing-outline:before,.ion-ios-filing:before,.ion-ios-film-outline:before,.ion-ios-film:before,.ion-ios-flag-outline:before,.ion-ios-flag:before,.ion-ios-flame-outline:before,.ion-ios-flame:before,.ion-ios-flask-outline:before,.ion-ios-flask:before,.ion-ios-flower-outline:before,.ion-ios-flower:before,.ion-ios-folder-outline:before,.ion-ios-folder:before,.ion-ios-football-outline:before,.ion-ios-football:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-b-outline:before,.ion-ios-game-controller-b:before,.ion-ios-gear-outline:before,.ion-ios-gear:before,.ion-ios-glasses-outline:before,.ion-ios-glasses:before,.ion-ios-grid-view-outline:before,.ion-ios-grid-view:before,.ion-ios-heart-outline:before,.ion-ios-heart:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-help:before,.ion-ios-home-outline:before,.ion-ios-home:before,.ion-ios-infinite-outline:before,.ion-ios-infinite:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-information:before,.ion-ios-ionic-outline:before,.ion-ios-keypad-outline:before,.ion-ios-keypad:before,.ion-ios-lightbulb-outline:before,.ion-ios-lightbulb:before,.ion-ios-list-outline:before,.ion-ios-list:before,.ion-ios-location-outline:before,.ion-ios-location:before,.ion-ios-locked-outline:before,.ion-ios-locked:before,.ion-ios-loop-strong:before,.ion-ios-loop:before,.ion-ios-medical-outline:before,.ion-ios-medical:before,.ion-ios-medkit-outline:before,.ion-ios-medkit:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-mic:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-minus:before,.ion-ios-monitor-outline:before,.ion-ios-monitor:before,.ion-ios-moon-outline:before,.ion-ios-moon:before,.ion-ios-more-outline:before,.ion-ios-more:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate-outline:before,.ion-ios-navigate:before,.ion-ios-nutrition-outline:before,.ion-ios-nutrition:before,.ion-ios-paper-outline:before,.ion-ios-paper:before,.ion-ios-paperplane-outline:before,.ion-ios-paperplane:before,.ion-ios-partlysunny-outline:before,.ion-ios-partlysunny:before,.ion-ios-pause-outline:before,.ion-ios-pause:before,.ion-ios-paw-outline:before,.ion-ios-paw:before,.ion-ios-people-outline:before,.ion-ios-people:before,.ion-ios-person-outline:before,.ion-ios-person:before,.ion-ios-personadd-outline:before,.ion-ios-personadd:before,.ion-ios-photos-outline:before,.ion-ios-photos:before,.ion-ios-pie-outline:before,.ion-ios-pie:before,.ion-ios-pint-outline:before,.ion-ios-pint:before,.ion-ios-play-outline:before,.ion-ios-play:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-plus:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetags-outline:before,.ion-ios-pricetags:before,.ion-ios-printer-outline:before,.ion-ios-printer:before,.ion-ios-pulse-strong:before,.ion-ios-pulse:before,.ion-ios-rainy-outline:before,.ion-ios-rainy:before,.ion-ios-recording-outline:before,.ion-ios-recording:before,.ion-ios-redo-outline:before,.ion-ios-redo:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-refresh:before,.ion-ios-reload:before,.ion-ios-reverse-camera-outline:before,.ion-ios-reverse-camera:before,.ion-ios-rewind-outline:before,.ion-ios-rewind:before,.ion-ios-rose-outline:before,.ion-ios-rose:before,.ion-ios-search-strong:before,.ion-ios-search:before,.ion-ios-settings-strong:before,.ion-ios-settings:before,.ion-ios-shuffle-strong:before,.ion-ios-shuffle:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipbackward:before,.ion-ios-skipforward-outline:before,.ion-ios-skipforward:before,.ion-ios-snowy:before,.ion-ios-speedometer-outline:before,.ion-ios-speedometer:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-star:before,.ion-ios-stopwatch-outline:before,.ion-ios-stopwatch:before,.ion-ios-sunny-outline:before,.ion-ios-sunny:before,.ion-ios-telephone-outline:before,.ion-ios-telephone:before,.ion-ios-tennisball-outline:before,.ion-ios-tennisball:before,.ion-ios-thunderstorm-outline:before,.ion-ios-thunderstorm:before,.ion-ios-time-outline:before,.ion-ios-time:before,.ion-ios-timer-outline:before,.ion-ios-timer:before,.ion-ios-toggle-outline:before,.ion-ios-toggle:before,.ion-ios-trash-outline:before,.ion-ios-trash:before,.ion-ios-undo-outline:before,.ion-ios-undo:before,.ion-ios-unlocked-outline:before,.ion-ios-unlocked:before,.ion-ios-upload-outline:before,.ion-ios-upload:before,.ion-ios-videocam-outline:before,.ion-ios-videocam:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass-outline:before,.ion-ios-wineglass:before,.ion-ios-world-outline:before,.ion-ios-world:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-minus:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon-round:before,.ion-navicon:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person-add:before,.ion-person-stalker:before,.ion-person:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-plus:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply-all:before,.ion-reply:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad-outline:before,.ion-sad:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android-outline:before,.ion-social-android:before,.ion-social-angular-outline:before,.ion-social-angular:before,.ion-social-apple-outline:before,.ion-social-apple:before,.ion-social-bitcoin-outline:before,.ion-social-bitcoin:before,.ion-social-buffer-outline:before,.ion-social-buffer:before,.ion-social-chrome-outline:before,.ion-social-chrome:before,.ion-social-codepen-outline:before,.ion-social-codepen:before,.ion-social-css3-outline:before,.ion-social-css3:before,.ion-social-designernews-outline:before,.ion-social-designernews:before,.ion-social-dribbble-outline:before,.ion-social-dribbble:before,.ion-social-dropbox-outline:before,.ion-social-dropbox:before,.ion-social-euro-outline:before,.ion-social-euro:before,.ion-social-facebook-outline:before,.ion-social-facebook:before,.ion-social-foursquare-outline:before,.ion-social-foursquare:before,.ion-social-freebsd-devil:before,.ion-social-github-outline:before,.ion-social-github:before,.ion-social-google-outline:before,.ion-social-google:before,.ion-social-googleplus-outline:before,.ion-social-googleplus:before,.ion-social-hackernews-outline:before,.ion-social-hackernews:before,.ion-social-html5-outline:before,.ion-social-html5:before,.ion-social-instagram-outline:before,.ion-social-instagram:before,.ion-social-javascript-outline:before,.ion-social-javascript:before,.ion-social-linkedin-outline:before,.ion-social-linkedin:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest-outline:before,.ion-social-pinterest:before,.ion-social-python:before,.ion-social-reddit-outline:before,.ion-social-reddit:before,.ion-social-rss-outline:before,.ion-social-rss:before,.ion-social-sass:before,.ion-social-skype-outline:before,.ion-social-skype:before,.ion-social-snapchat-outline:before,.ion-social-snapchat:before,.ion-social-tumblr-outline:before,.ion-social-tumblr:before,.ion-social-tux:before,.ion-social-twitch-outline:before,.ion-social-twitch:before,.ion-social-twitter-outline:before,.ion-social-twitter:before,.ion-social-usd-outline:before,.ion-social-usd:before,.ion-social-vimeo-outline:before,.ion-social-vimeo:before,.ion-social-whatsapp-outline:before,.ion-social-whatsapp:before,.ion-social-windows-outline:before,.ion-social-windows:before,.ion-social-wordpress-outline:before,.ion-social-wordpress:before,.ion-social-yahoo-outline:before,.ion-social-yahoo:before,.ion-social-yen-outline:before,.ion-social-yen:before,.ion-social-youtube-outline:before,.ion-social-youtube:before,.ion-soup-can-outline:before,.ion-soup-can:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle-filled:before,.ion-toggle:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt-outline:before,.ion-tshirt:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before,.ionicons{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:""}.ion-alert-circled:before{content:""}.ion-android-add:before{content:""}.ion-android-add-circle:before{content:""}.ion-android-alarm-clock:before{content:""}.ion-android-alert:before{content:""}.ion-android-apps:before{content:""}.ion-android-archive:before{content:""}.ion-android-arrow-back:before{content:""}.ion-android-arrow-down:before{content:""}.ion-android-arrow-dropdown:before{content:""}.ion-android-arrow-dropdown-circle:before{content:""}.ion-android-arrow-dropleft:before{content:""}.ion-android-arrow-dropleft-circle:before{content:""}.ion-android-arrow-dropright:before{content:""}.ion-android-arrow-dropright-circle:before{content:""}.ion-android-arrow-dropup:before{content:""}.ion-android-arrow-dropup-circle:before{content:""}.ion-android-arrow-forward:before{content:""}.ion-android-arrow-up:before{content:""}.ion-android-attach:before{content:""}.ion-android-bar:before{content:""}.ion-android-bicycle:before{content:""}.ion-android-boat:before{content:""}.ion-android-bookmark:before{content:""}.ion-android-bulb:before{content:""}.ion-android-bus:before{content:""}.ion-android-calendar:before{content:""}.ion-android-call:before{content:""}.ion-android-camera:before{content:""}.ion-android-cancel:before{content:""}.ion-android-car:before{content:""}.ion-android-cart:before{content:""}.ion-android-chat:before{content:""}.ion-android-checkbox:before{content:""}.ion-android-checkbox-blank:before{content:""}.ion-android-checkbox-outline:before{content:""}.ion-android-checkbox-outline-blank:before{content:""}.ion-android-checkmark-circle:before{content:""}.ion-android-clipboard:before{content:""}.ion-android-close:before{content:""}.ion-android-cloud:before{content:""}.ion-android-cloud-circle:before{content:""}.ion-android-cloud-done:before{content:""}.ion-android-cloud-outline:before{content:""}.ion-android-color-palette:before{content:""}.ion-android-compass:before{content:""}.ion-android-contact:before{content:""}.ion-android-contacts:before{content:""}.ion-android-contract:before{content:""}.ion-android-create:before{content:""}.ion-android-delete:before{content:""}.ion-android-desktop:before{content:""}.ion-android-document:before{content:""}.ion-android-done:before{content:""}.ion-android-done-all:before{content:""}.ion-android-download:before{content:""}.ion-android-drafts:before{content:""}.ion-android-exit:before{content:""}.ion-android-expand:before{content:""}.ion-android-favorite:before{content:""}.ion-android-favorite-outline:before{content:""}.ion-android-film:before{content:""}.ion-android-folder:before{content:""}.ion-android-folder-open:before{content:""}.ion-android-funnel:before{content:""}.ion-android-globe:before{content:""}.ion-android-hand:before{content:""}.ion-android-hangout:before{content:""}.ion-android-happy:before{content:""}.ion-android-home:before{content:""}.ion-android-image:before{content:""}.ion-android-laptop:before{content:""}.ion-android-list:before{content:""}.ion-android-locate:before{content:""}.ion-android-lock:before{content:""}.ion-android-mail:before{content:""}.ion-android-map:before{content:""}.ion-android-menu:before{content:""}.ion-android-microphone:before{content:""}.ion-android-microphone-off:before{content:""}.ion-android-more-horizontal:before{content:""}.ion-android-more-vertical:before{content:""}.ion-android-navigate:before{content:""}.ion-android-notifications:before{content:""}.ion-android-notifications-none:before{content:""}.ion-android-notifications-off:before{content:""}.ion-android-open:before{content:""}.ion-android-options:before{content:""}.ion-android-people:before{content:""}.ion-android-person:before{content:""}.ion-android-person-add:before{content:""}.ion-android-phone-landscape:before{content:""}.ion-android-phone-portrait:before{content:""}.ion-android-pin:before{content:""}.ion-android-plane:before{content:""}.ion-android-playstore:before{content:""}.ion-android-print:before{content:""}.ion-android-radio-button-off:before{content:""}.ion-android-radio-button-on:before{content:""}.ion-android-refresh:before{content:""}.ion-android-remove:before{content:""}.ion-android-remove-circle:before{content:""}.ion-android-restaurant:before{content:""}.ion-android-sad:before{content:""}.ion-android-search:before{content:""}.ion-android-send:before{content:""}.ion-android-settings:before{content:""}.ion-android-share:before{content:""}.ion-android-share-alt:before{content:""}.ion-android-star:before{content:""}.ion-android-star-half:before{content:""}.ion-android-star-outline:before{content:""}.ion-android-stopwatch:before{content:""}.ion-android-subway:before{content:""}.ion-android-sunny:before{content:""}.ion-android-sync:before{content:""}.ion-android-textsms:before{content:""}.ion-android-time:before{content:""}.ion-android-train:before{content:""}.ion-android-unlock:before{content:""}.ion-android-upload:before{content:""}.ion-android-volume-down:before{content:""}.ion-android-volume-mute:before{content:""}.ion-android-volume-off:before{content:""}.ion-android-volume-up:before{content:""}.ion-android-walk:before{content:""}.ion-android-warning:before{content:""}.ion-android-watch:before{content:""}.ion-android-wifi:before{content:""}.ion-aperture:before{content:""}.ion-archive:before{content:""}.ion-arrow-down-a:before{content:""}.ion-arrow-down-b:before{content:""}.ion-arrow-down-c:before{content:""}.ion-arrow-expand:before{content:""}.ion-arrow-graph-down-left:before{content:""}.ion-arrow-graph-down-right:before{content:""}.ion-arrow-graph-up-left:before{content:""}.ion-arrow-graph-up-right:before{content:""}.ion-arrow-left-a:before{content:""}.ion-arrow-left-b:before{content:""}.ion-arrow-left-c:before{content:""}.ion-arrow-move:before{content:""}.ion-arrow-resize:before{content:""}.ion-arrow-return-left:before{content:""}.ion-arrow-return-right:before{content:""}.ion-arrow-right-a:before{content:""}.ion-arrow-right-b:before{content:""}.ion-arrow-right-c:before{content:""}.ion-arrow-shrink:before{content:""}.ion-arrow-swap:before{content:""}.ion-arrow-up-a:before{content:""}.ion-arrow-up-b:before{content:""}.ion-arrow-up-c:before{content:""}.ion-asterisk:before{content:""}.ion-at:before{content:""}.ion-backspace:before{content:""}.ion-backspace-outline:before{content:""}.ion-bag:before{content:""}.ion-battery-charging:before{content:""}.ion-battery-empty:before{content:""}.ion-battery-full:before{content:""}.ion-battery-half:before{content:""}.ion-battery-low:before{content:""}.ion-beaker:before{content:""}.ion-beer:before{content:""}.ion-bluetooth:before{content:""}.ion-bonfire:before{content:""}.ion-bookmark:before{content:""}.ion-bowtie:before{content:""}.ion-briefcase:before{content:""}.ion-bug:before{content:""}.ion-calculator:before{content:""}.ion-calendar:before{content:""}.ion-camera:before{content:""}.ion-card:before{content:""}.ion-cash:before{content:""}.ion-chatbox:before{content:""}.ion-chatbox-working:before{content:""}.ion-chatboxes:before{content:""}.ion-chatbubble:before{content:""}.ion-chatbubble-working:before{content:""}.ion-chatbubbles:before{content:""}.ion-checkmark:before{content:""}.ion-checkmark-circled:before{content:""}.ion-checkmark-round:before{content:""}.ion-chevron-down:before{content:""}.ion-chevron-left:before{content:""}.ion-chevron-right:before{content:""}.ion-chevron-up:before{content:""}.ion-clipboard:before{content:""}.ion-clock:before{content:""}.ion-close:before{content:""}.ion-close-circled:before{content:""}.ion-close-round:before{content:""}.ion-closed-captioning:before{content:""}.ion-cloud:before{content:""}.ion-code:before{content:""}.ion-code-download:before{content:""}.ion-code-working:before{content:""}.ion-coffee:before{content:""}.ion-compass:before{content:""}.ion-compose:before{content:""}.ion-connection-bars:before{content:""}.ion-contrast:before{content:""}.ion-crop:before{content:""}.ion-cube:before{content:""}.ion-disc:before{content:""}.ion-document:before{content:""}.ion-document-text:before{content:""}.ion-drag:before{content:""}.ion-earth:before{content:""}.ion-easel:before{content:""}.ion-edit:before{content:""}.ion-egg:before{content:""}.ion-eject:before{content:""}.ion-email:before{content:""}.ion-email-unread:before{content:""}.ion-erlenmeyer-flask:before{content:""}.ion-erlenmeyer-flask-bubbles:before{content:""}.ion-eye:before{content:""}.ion-eye-disabled:before{content:""}.ion-female:before{content:""}.ion-filing:before{content:""}.ion-film-marker:before{content:""}.ion-fireball:before{content:""}.ion-flag:before{content:""}.ion-flame:before{content:""}.ion-flash:before{content:""}.ion-flash-off:before{content:""}.ion-folder:before{content:""}.ion-fork:before{content:""}.ion-fork-repo:before{content:""}.ion-forward:before{content:""}.ion-funnel:before{content:""}.ion-gear-a:before{content:""}.ion-gear-b:before{content:""}.ion-grid:before{content:""}.ion-hammer:before{content:""}.ion-happy:before{content:""}.ion-happy-outline:before{content:""}.ion-headphone:before{content:""}.ion-heart:before{content:""}.ion-heart-broken:before{content:""}.ion-help:before{content:""}.ion-help-buoy:before{content:""}.ion-help-circled:before{content:""}.ion-home:before{content:""}.ion-icecream:before{content:""}.ion-image:before{content:""}.ion-images:before{content:""}.ion-information:before{content:""}.ion-information-circled:before{content:""}.ion-ionic:before{content:""}.ion-ios-alarm:before{content:""}.ion-ios-alarm-outline:before{content:""}.ion-ios-albums:before{content:""}.ion-ios-albums-outline:before{content:""}.ion-ios-americanfootball:before{content:""}.ion-ios-americanfootball-outline:before{content:""}.ion-ios-analytics:before{content:""}.ion-ios-analytics-outline:before{content:""}.ion-ios-arrow-back:before{content:""}.ion-ios-arrow-down:before{content:""}.ion-ios-arrow-forward:before{content:""}.ion-ios-arrow-left:before{content:""}.ion-ios-arrow-right:before{content:""}.ion-ios-arrow-thin-down:before{content:""}.ion-ios-arrow-thin-left:before{content:""}.ion-ios-arrow-thin-right:before{content:""}.ion-ios-arrow-thin-up:before{content:""}.ion-ios-arrow-up:before{content:""}.ion-ios-at:before{content:""}.ion-ios-at-outline:before{content:""}.ion-ios-barcode:before{content:""}.ion-ios-barcode-outline:before{content:""}.ion-ios-baseball:before{content:""}.ion-ios-baseball-outline:before{content:""}.ion-ios-basketball:before{content:""}.ion-ios-basketball-outline:before{content:""}.ion-ios-bell:before{content:""}.ion-ios-bell-outline:before{content:""}.ion-ios-body:before{content:""}.ion-ios-body-outline:before{content:""}.ion-ios-bolt:before{content:""}.ion-ios-bolt-outline:before{content:""}.ion-ios-book:before{content:""}.ion-ios-book-outline:before{content:""}.ion-ios-bookmarks:before{content:""}.ion-ios-bookmarks-outline:before{content:""}.ion-ios-box:before{content:""}.ion-ios-box-outline:before{content:""}.ion-ios-briefcase:before{content:""}.ion-ios-briefcase-outline:before{content:""}.ion-ios-browsers:before{content:""}.ion-ios-browsers-outline:before{content:""}.ion-ios-calculator:before{content:""}.ion-ios-calculator-outline:before{content:""}.ion-ios-calendar:before{content:""}.ion-ios-calendar-outline:before{content:""}.ion-ios-camera:before{content:""}.ion-ios-camera-outline:before{content:""}.ion-ios-cart:before{content:""}.ion-ios-cart-outline:before{content:""}.ion-ios-chatboxes:before{content:""}.ion-ios-chatboxes-outline:before{content:""}.ion-ios-chatbubble:before{content:""}.ion-ios-chatbubble-outline:before{content:""}.ion-ios-checkmark:before{content:""}.ion-ios-checkmark-empty:before{content:""}.ion-ios-checkmark-outline:before{content:""}.ion-ios-circle-filled:before{content:""}.ion-ios-circle-outline:before{content:""}.ion-ios-clock:before{content:""}.ion-ios-clock-outline:before{content:""}.ion-ios-close:before{content:""}.ion-ios-close-empty:before{content:""}.ion-ios-close-outline:before{content:""}.ion-ios-cloud:before{content:""}.ion-ios-cloud-download:before{content:""}.ion-ios-cloud-download-outline:before{content:""}.ion-ios-cloud-outline:before{content:""}.ion-ios-cloud-upload:before{content:""}.ion-ios-cloud-upload-outline:before{content:""}.ion-ios-cloudy:before{content:""}.ion-ios-cloudy-night:before{content:""}.ion-ios-cloudy-night-outline:before{content:""}.ion-ios-cloudy-outline:before{content:""}.ion-ios-cog:before{content:""}.ion-ios-cog-outline:before{content:""}.ion-ios-color-filter:before{content:""}.ion-ios-color-filter-outline:before{content:""}.ion-ios-color-wand:before{content:""}.ion-ios-color-wand-outline:before{content:""}.ion-ios-compose:before{content:""}.ion-ios-compose-outline:before{content:""}.ion-ios-contact:before{content:""}.ion-ios-contact-outline:before{content:""}.ion-ios-copy:before{content:""}.ion-ios-copy-outline:before{content:""}.ion-ios-crop:before{content:""}.ion-ios-crop-strong:before{content:""}.ion-ios-download:before{content:""}.ion-ios-download-outline:before{content:""}.ion-ios-drag:before{content:""}.ion-ios-email:before{content:""}.ion-ios-email-outline:before{content:""}.ion-ios-eye:before{content:""}.ion-ios-eye-outline:before{content:""}.ion-ios-fastforward:before{content:""}.ion-ios-fastforward-outline:before{content:""}.ion-ios-filing:before{content:""}.ion-ios-filing-outline:before{content:""}.ion-ios-film:before{content:""}.ion-ios-film-outline:before{content:""}.ion-ios-flag:before{content:""}.ion-ios-flag-outline:before{content:""}.ion-ios-flame:before{content:""}.ion-ios-flame-outline:before{content:""}.ion-ios-flask:before{content:""}.ion-ios-flask-outline:before{content:""}.ion-ios-flower:before{content:""}.ion-ios-flower-outline:before{content:""}.ion-ios-folder:before{content:""}.ion-ios-folder-outline:before{content:""}.ion-ios-football:before{content:""}.ion-ios-football-outline:before{content:""}.ion-ios-game-controller-a:before{content:""}.ion-ios-game-controller-a-outline:before{content:""}.ion-ios-game-controller-b:before{content:""}.ion-ios-game-controller-b-outline:before{content:""}.ion-ios-gear:before{content:""}.ion-ios-gear-outline:before{content:""}.ion-ios-glasses:before{content:""}.ion-ios-glasses-outline:before{content:""}.ion-ios-grid-view:before{content:""}.ion-ios-grid-view-outline:before{content:""}.ion-ios-heart:before{content:""}.ion-ios-heart-outline:before{content:""}.ion-ios-help:before{content:""}.ion-ios-help-empty:before{content:""}.ion-ios-help-outline:before{content:""}.ion-ios-home:before{content:""}.ion-ios-home-outline:before{content:""}.ion-ios-infinite:before{content:""}.ion-ios-infinite-outline:before{content:""}.ion-ios-information:before{content:""}.ion-ios-information-empty:before{content:""}.ion-ios-information-outline:before{content:""}.ion-ios-ionic-outline:before{content:""}.ion-ios-keypad:before{content:""}.ion-ios-keypad-outline:before{content:""}.ion-ios-lightbulb:before{content:""}.ion-ios-lightbulb-outline:before{content:""}.ion-ios-list:before{content:""}.ion-ios-list-outline:before{content:""}.ion-ios-location:before{content:""}.ion-ios-location-outline:before{content:""}.ion-ios-locked:before{content:""}.ion-ios-locked-outline:before{content:""}.ion-ios-loop:before{content:""}.ion-ios-loop-strong:before{content:""}.ion-ios-medical:before{content:""}.ion-ios-medical-outline:before{content:""}.ion-ios-medkit:before{content:""}.ion-ios-medkit-outline:before{content:""}.ion-ios-mic:before{content:""}.ion-ios-mic-off:before{content:""}.ion-ios-mic-outline:before{content:""}.ion-ios-minus:before{content:""}.ion-ios-minus-empty:before{content:""}.ion-ios-minus-outline:before{content:""}.ion-ios-monitor:before{content:""}.ion-ios-monitor-outline:before{content:""}.ion-ios-moon:before{content:""}.ion-ios-moon-outline:before{content:""}.ion-ios-more:before{content:""}.ion-ios-more-outline:before{content:""}.ion-ios-musical-note:before{content:""}.ion-ios-musical-notes:before{content:""}.ion-ios-navigate:before{content:""}.ion-ios-navigate-outline:before{content:""}.ion-ios-nutrition:before{content:""}.ion-ios-nutrition-outline:before{content:""}.ion-ios-paper:before{content:""}.ion-ios-paper-outline:before{content:""}.ion-ios-paperplane:before{content:""}.ion-ios-paperplane-outline:before{content:""}.ion-ios-partlysunny:before{content:""}.ion-ios-partlysunny-outline:before{content:""}.ion-ios-pause:before{content:""}.ion-ios-pause-outline:before{content:""}.ion-ios-paw:before{content:""}.ion-ios-paw-outline:before{content:""}.ion-ios-people:before{content:""}.ion-ios-people-outline:before{content:""}.ion-ios-person:before{content:""}.ion-ios-person-outline:before{content:""}.ion-ios-personadd:before{content:""}.ion-ios-personadd-outline:before{content:""}.ion-ios-photos:before{content:""}.ion-ios-photos-outline:before{content:""}.ion-ios-pie:before{content:""}.ion-ios-pie-outline:before{content:""}.ion-ios-pint:before{content:""}.ion-ios-pint-outline:before{content:""}.ion-ios-play:before{content:""}.ion-ios-play-outline:before{content:""}.ion-ios-plus:before{content:""}.ion-ios-plus-empty:before{content:""}.ion-ios-plus-outline:before{content:""}.ion-ios-pricetag:before{content:""}.ion-ios-pricetag-outline:before{content:""}.ion-ios-pricetags:before{content:""}.ion-ios-pricetags-outline:before{content:""}.ion-ios-printer:before{content:""}.ion-ios-printer-outline:before{content:""}.ion-ios-pulse:before{content:""}.ion-ios-pulse-strong:before{content:""}.ion-ios-rainy:before{content:""}.ion-ios-rainy-outline:before{content:""}.ion-ios-recording:before{content:""}.ion-ios-recording-outline:before{content:""}.ion-ios-redo:before{content:""}.ion-ios-redo-outline:before{content:""}.ion-ios-refresh:before{content:""}.ion-ios-refresh-empty:before{content:""}.ion-ios-refresh-outline:before{content:""}.ion-ios-reload:before{content:""}.ion-ios-reverse-camera:before{content:""}.ion-ios-reverse-camera-outline:before{content:""}.ion-ios-rewind:before{content:""}.ion-ios-rewind-outline:before{content:""}.ion-ios-rose:before{content:""}.ion-ios-rose-outline:before{content:""}.ion-ios-search:before{content:""}.ion-ios-search-strong:before{content:""}.ion-ios-settings:before{content:""}.ion-ios-settings-strong:before{content:""}.ion-ios-shuffle:before{content:""}.ion-ios-shuffle-strong:before{content:""}.ion-ios-skipbackward:before{content:""}.ion-ios-skipbackward-outline:before{content:""}.ion-ios-skipforward:before{content:""}.ion-ios-skipforward-outline:before{content:""}.ion-ios-snowy:before{content:""}.ion-ios-speedometer:before{content:""}.ion-ios-speedometer-outline:before{content:""}.ion-ios-star:before{content:""}.ion-ios-star-half:before{content:""}.ion-ios-star-outline:before{content:""}.ion-ios-stopwatch:before{content:""}.ion-ios-stopwatch-outline:before{content:""}.ion-ios-sunny:before{content:""}.ion-ios-sunny-outline:before{content:""}.ion-ios-telephone:before{content:""}.ion-ios-telephone-outline:before{content:""}.ion-ios-tennisball:before{content:""}.ion-ios-tennisball-outline:before{content:""}.ion-ios-thunderstorm:before{content:""}.ion-ios-thunderstorm-outline:before{content:""}.ion-ios-time:before{content:""}.ion-ios-time-outline:before{content:""}.ion-ios-timer:before{content:""}.ion-ios-timer-outline:before{content:""}.ion-ios-toggle:before{content:""}.ion-ios-toggle-outline:before{content:""}.ion-ios-trash:before{content:""}.ion-ios-trash-outline:before{content:""}.ion-ios-undo:before{content:""}.ion-ios-undo-outline:before{content:""}.ion-ios-unlocked:before{content:""}.ion-ios-unlocked-outline:before{content:""}.ion-ios-upload:before{content:""}.ion-ios-upload-outline:before{content:""}.ion-ios-videocam:before{content:""}.ion-ios-videocam-outline:before{content:""}.ion-ios-volume-high:before{content:""}.ion-ios-volume-low:before{content:""}.ion-ios-wineglass:before{content:""}.ion-ios-wineglass-outline:before{content:""}.ion-ios-world:before{content:""}.ion-ios-world-outline:before{content:""}.ion-ipad:before{content:""}.ion-iphone:before{content:""}.ion-ipod:before{content:""}.ion-jet:before{content:""}.ion-key:before{content:""}.ion-knife:before{content:""}.ion-laptop:before{content:""}.ion-leaf:before{content:""}.ion-levels:before{content:""}.ion-lightbulb:before{content:""}.ion-link:before{content:""}.ion-load-a:before{content:""}.ion-load-b:before{content:""}.ion-load-c:before{content:""}.ion-load-d:before{content:""}.ion-location:before{content:""}.ion-lock-combination:before{content:""}.ion-locked:before{content:""}.ion-log-in:before{content:""}.ion-log-out:before{content:""}.ion-loop:before{content:""}.ion-magnet:before{content:""}.ion-male:before{content:""}.ion-man:before{content:""}.ion-map:before{content:""}.ion-medkit:before{content:""}.ion-merge:before{content:""}.ion-mic-a:before{content:""}.ion-mic-b:before{content:""}.ion-mic-c:before{content:""}.ion-minus:before{content:""}.ion-minus-circled:before{content:""}.ion-minus-round:before{content:""}.ion-model-s:before{content:""}.ion-monitor:before{content:""}.ion-more:before{content:""}.ion-mouse:before{content:""}.ion-music-note:before{content:""}.ion-navicon:before{content:""}.ion-navicon-round:before{content:""}.ion-navigate:before{content:""}.ion-network:before{content:""}.ion-no-smoking:before{content:""}.ion-nuclear:before{content:""}.ion-outlet:before{content:""}.ion-paintbrush:before{content:""}.ion-paintbucket:before{content:""}.ion-paper-airplane:before{content:""}.ion-paperclip:before{content:""}.ion-pause:before{content:""}.ion-person:before{content:""}.ion-person-add:before{content:""}.ion-person-stalker:before{content:""}.ion-pie-graph:before{content:""}.ion-pin:before{content:""}.ion-pinpoint:before{content:""}.ion-pizza:before{content:""}.ion-plane:before{content:""}.ion-planet:before{content:""}.ion-play:before{content:""}.ion-playstation:before{content:""}.ion-plus:before{content:""}.ion-plus-circled:before{content:""}.ion-plus-round:before{content:""}.ion-podium:before{content:""}.ion-pound:before{content:""}.ion-power:before{content:""}.ion-pricetag:before{content:""}.ion-pricetags:before{content:""}.ion-printer:before{content:""}.ion-pull-request:before{content:""}.ion-qr-scanner:before{content:""}.ion-quote:before{content:""}.ion-radio-waves:before{content:""}.ion-record:before{content:""}.ion-refresh:before{content:""}.ion-reply:before{content:""}.ion-reply-all:before{content:""}.ion-ribbon-a:before{content:""}.ion-ribbon-b:before{content:""}.ion-sad:before{content:""}.ion-sad-outline:before{content:""}.ion-scissors:before{content:""}.ion-search:before{content:""}.ion-settings:before{content:""}.ion-share:before{content:""}.ion-shuffle:before{content:""}.ion-skip-backward:before{content:""}.ion-skip-forward:before{content:""}.ion-social-android:before{content:""}.ion-social-android-outline:before{content:""}.ion-social-angular:before{content:""}.ion-social-angular-outline:before{content:""}.ion-social-apple:before{content:""}.ion-social-apple-outline:before{content:""}.ion-social-bitcoin:before{content:""}.ion-social-bitcoin-outline:before{content:""}.ion-social-buffer:before{content:""}.ion-social-buffer-outline:before{content:""}.ion-social-chrome:before{content:""}.ion-social-chrome-outline:before{content:""}.ion-social-codepen:before{content:""}.ion-social-codepen-outline:before{content:""}.ion-social-css3:before{content:""}.ion-social-css3-outline:before{content:""}.ion-social-designernews:before{content:""}.ion-social-designernews-outline:before{content:""}.ion-social-dribbble:before{content:""}.ion-social-dribbble-outline:before{content:""}.ion-social-dropbox:before{content:""}.ion-social-dropbox-outline:before{content:""}.ion-social-euro:before{content:""}.ion-social-euro-outline:before{content:""}.ion-social-facebook:before{content:""}.ion-social-facebook-outline:before{content:""}.ion-social-foursquare:before{content:""}.ion-social-foursquare-outline:before{content:""}.ion-social-freebsd-devil:before{content:""}.ion-social-github:before{content:""}.ion-social-github-outline:before{content:""}.ion-social-google:before{content:""}.ion-social-google-outline:before{content:""}.ion-social-googleplus:before{content:""}.ion-social-googleplus-outline:before{content:""}.ion-social-hackernews:before{content:""}.ion-social-hackernews-outline:before{content:""}.ion-social-html5:before{content:""}.ion-social-html5-outline:before{content:""}.ion-social-instagram:before{content:""}.ion-social-instagram-outline:before{content:""}.ion-social-javascript:before{content:""}.ion-social-javascript-outline:before{content:""}.ion-social-linkedin:before{content:""}.ion-social-linkedin-outline:before{content:""}.ion-social-markdown:before{content:""}.ion-social-nodejs:before{content:""}.ion-social-octocat:before{content:""}.ion-social-pinterest:before{content:""}.ion-social-pinterest-outline:before{content:""}.ion-social-python:before{content:""}.ion-social-reddit:before{content:""}.ion-social-reddit-outline:before{content:""}.ion-social-rss:before{content:""}.ion-social-rss-outline:before{content:""}.ion-social-sass:before{content:""}.ion-social-skype:before{content:""}.ion-social-skype-outline:before{content:""}.ion-social-snapchat:before{content:""}.ion-social-snapchat-outline:before{content:""}.ion-social-tumblr:before{content:""}.ion-social-tumblr-outline:before{content:""}.ion-social-tux:before{content:""}.ion-social-twitch:before{content:""}.ion-social-twitch-outline:before{content:""}.ion-social-twitter:before{content:""}.ion-social-twitter-outline:before{content:""}.ion-social-usd:before{content:""}.ion-social-usd-outline:before{content:""}.ion-social-vimeo:before{content:""}.ion-social-vimeo-outline:before{content:""}.ion-social-whatsapp:before{content:""}.ion-social-whatsapp-outline:before{content:""}.ion-social-windows:before{content:""}.ion-social-windows-outline:before{content:""}.ion-social-wordpress:before{content:""}.ion-social-wordpress-outline:before{content:""}.ion-social-yahoo:before{content:""}.ion-social-yahoo-outline:before{content:""}.ion-social-yen:before{content:""}.ion-social-yen-outline:before{content:""}.ion-social-youtube:before{content:""}.ion-social-youtube-outline:before{content:""}.ion-soup-can:before{content:""}.ion-soup-can-outline:before{content:""}.ion-speakerphone:before{content:""}.ion-speedometer:before{content:""}.ion-spoon:before{content:""}.ion-star:before{content:""}.ion-stats-bars:before{content:""}.ion-steam:before{content:""}.ion-stop:before{content:""}.ion-thermometer:before{content:""}.ion-thumbsdown:before{content:""}.ion-thumbsup:before{content:""}.ion-toggle:before{content:""}.ion-toggle-filled:before{content:""}.ion-transgender:before{content:""}.ion-trash-a:before{content:""}.ion-trash-b:before{content:""}.ion-trophy:before{content:""}.ion-tshirt:before{content:""}.ion-tshirt-outline:before{content:""}.ion-umbrella:before{content:""}.ion-university:before{content:""}.ion-unlocked:before{content:""}.ion-upload:before{content:""}.ion-usb:before{content:""}.ion-videocamera:before{content:""}.ion-volume-high:before{content:""}.ion-volume-low:before{content:""}.ion-volume-medium:before{content:""}.ion-volume-mute:before{content:""}.ion-wand:before{content:""}.ion-waterdrop:before{content:""}.ion-wifi:before{content:""}.ion-wineglass:before{content:""}.ion-woman:before{content:""}.ion-wrench:before{content:""}.ion-xbox:before{content:""}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;vertical-align:baseline;font:inherit;font-size:100%}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:'';content:none}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none!important}html{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0;line-height:1}:focus,a,a:active,a:focus,a:hover,button,button:focus{outline:0}a{-webkit-user-drag:none;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent}a[href]:hover{cursor:pointer}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}code,kbd,pre,samp{font-size:1em;font-family:monospace,serif}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;vertical-align:baseline;font-size:75%;line-height:0}sup{top:-.5em}sub{bottom:-.25em}fieldset{margin:0 2px;padding:.35em .625em .75em;border:1px solid silver}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-size:100%;font-family:inherit;outline-offset:0;outline-style:none;outline-width:0;-webkit-font-smoothing:inherit;background-image:none}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}img{-webkit-user-drag:none}table{border-spacing:0;border-collapse:collapse}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{overflow:hidden;-ms-touch-action:pan-y;touch-action:pan-y}.ionic-body,body{-webkit-touch-callout:none;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0;padding:0;color:#000;word-wrap:break-word;font-size:14px;font-family:-apple-system;font-family:-apple-system,Roboto,Noto,"Helvetica Neue",sans-serif;line-height:20px;text-rendering:optimizeLegibility;-webkit-backface-visibility:hidden;-webkit-user-drag:none;-ms-content-zooming:none}body.grade-b,body.grade-c{text-rendering:auto}.content{position:relative}.scroll-content{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;margin-top:-1px;padding-top:1px;margin-bottom:-1px;width:auto;height:auto}.menu .scroll-content.scroll-content-false{z-index:11}.scroll-view{position:relative;display:block;overflow:hidden;margin-top:-1px}.scroll-view.overflow-scroll{position:relative}.scroll-view.scroll-x{overflow-x:scroll;overflow-y:hidden}.scroll-view.scroll-y{overflow-x:hidden;overflow-y:scroll}.scroll-view.scroll-xy{overflow-x:scroll;overflow-y:scroll}.scroll{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-transform-origin:left top;transform-origin:left top}@-ms-viewport{width:device-width}.scroll-bar{position:absolute;z-index:9999}.ng-animate .scroll-bar{visibility:hidden}.scroll-bar-h{right:2px;bottom:3px;left:2px;height:3px}.scroll-bar-h .scroll-bar-indicator{height:100%}.scroll-bar-v{top:2px;right:3px;bottom:2px;width:3px}.scroll-bar-v .scroll-bar-indicator{width:100%}.scroll-bar-indicator{position:absolute;border-radius:4px;background:rgba(0,0,0,.3);opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.scroll-bar-indicator.scroll-bar-fade-out{opacity:0}.platform-android .scroll-bar-indicator{border-radius:0}.grade-b .scroll-bar-indicator,.grade-c .scroll-bar-indicator{background:#aaa}.grade-b .scroll-bar-indicator.scroll-bar-fade-out,.grade-c .scroll-bar-indicator.scroll-bar-fade-out{-webkit-transition:none;transition:none}ion-infinite-scroll{height:60px;width:100%;display:block;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}ion-infinite-scroll .icon{color:#666;font-size:30px;color:#666}ion-infinite-scroll:not(.active) .icon:before,ion-infinite-scroll:not(.active) .spinner{display:none}.overflow-scroll{overflow-x:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;top:0;right:0;bottom:0;left:0;position:absolute}.overflow-scroll.pane{overflow-x:hidden;overflow-y:scroll}.overflow-scroll .scroll{position:static;height:100%;-webkit-transform:translate3d(0,0,0)}.has-header{top:44px}.no-header{top:0}.has-subheader{top:88px}.has-tabs-top{top:93px}.has-header.has-subheader.has-tabs-top{top:137px}.has-footer{bottom:44px}.has-subfooter{bottom:88px}.bar-footer.has-tabs,.has-tabs{bottom:49px}.bar-footer.has-tabs.pane,.has-tabs.pane{bottom:49px;height:auto}.bar-subfooter.has-tabs{bottom:93px}.has-footer.has-tabs{bottom:93px}.pane{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-duration:0;transition-duration:0;z-index:1}.view{z-index:1}.pane,.view{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background-color:#fff;overflow:hidden}.view-container{position:absolute;display:block;width:100%;height:100%}p{margin:0 0 10px}small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:#000;font-weight:500;font-family:-apple-system,Roboto,Noto,"Helvetica Neue",sans-serif;line-height:1.2}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1:first-child,.h2:first-child,.h3:first-child,h1:first-child,h2:first-child,h3:first-child{margin-top:0}.h1+.h1,.h1+.h2,.h1+.h3,.h1+h1,.h1+h2,.h1+h3,.h2+.h1,.h2+.h2,.h2+.h3,.h2+h1,.h2+h2,.h2+h3,.h3+.h1,.h3+.h2,.h3+.h3,.h3+h1,.h3+h2,.h3+h3,h1+.h1,h1+.h2,h1+.h3,h1+h1,h1+h2,h1+h3,h2+.h1,h2+.h2,h2+.h3,h2+h1,h2+h2,h2+h3,h3+.h1,h3+.h2,h3+.h3,h3+h1,h3+h2,h3+h3{margin-top:10px}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.h1 small,h1 small{font-size:24px}.h2 small,h2 small{font-size:18px}.h3 small,.h4 small,h3 small,h4 small{font-size:14px}dl{margin-bottom:20px}dd,dt{line-height:1.42857}dt{font-weight:700}blockquote{margin:0 0 20px;padding:10px 20px;border-left:5px solid gray}blockquote p{font-weight:300;font-size:17.5px;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.42857}blockquote small:before{content:'\2014 \00A0'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.42857}a{color:#387ef5}a.subdued{padding-right:10px;color:#888;text-decoration:none}a.subdued:hover{text-decoration:none}a.subdued:last-child{padding-right:0}.action-sheet-backdrop{-webkit-transition:background-color 150ms ease-in-out;transition:background-color 150ms ease-in-out;position:fixed;top:0;left:0;z-index:11;width:100%;height:100%;background-color:transparent}.action-sheet-backdrop.active{background-color:rgba(0,0,0,.4)}.action-sheet-wrapper{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition:all cubic-bezier(.36,.66,.04,1) .5s;transition:all cubic-bezier(.36,.66,.04,1) .5s;position:absolute;bottom:0;left:0;right:0;width:100%;max-width:500px;margin:auto}.action-sheet-up{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.action-sheet{margin-left:8px;margin-right:8px;width:auto;z-index:11;overflow:hidden}.action-sheet .button{display:block;padding:1px;width:100%;border-radius:0;border-color:#d1d3d6;background-color:transparent;color:#007aff;font-size:21px}.action-sheet .button:hover{color:#007aff}.action-sheet .button.destructive{color:#ff3b30}.action-sheet .button.destructive:hover{color:#ff3b30}.action-sheet .button.activated,.action-sheet .button.active{box-shadow:none;border-color:#d1d3d6;color:#007aff;background:#e4e5e7}.action-sheet-has-icons .icon{position:absolute;left:16px}.action-sheet-title{padding:16px;color:#8f8f8f;text-align:center;font-size:13px}.action-sheet-group{margin-bottom:8px;border-radius:4px;background-color:#fff;overflow:hidden}.action-sheet-group .button{border-width:1px 0 0 0}.action-sheet-group .button:first-child:last-child{border-width:0}.action-sheet-options{background:#f1f2f3}.action-sheet-cancel .button{font-weight:500}.action-sheet-open{pointer-events:none}.action-sheet-open.modal-open .modal{pointer-events:none}.action-sheet-open .action-sheet-backdrop{pointer-events:auto}.platform-android .action-sheet-backdrop.active{background-color:rgba(0,0,0,.2)}.platform-android .action-sheet{margin:0}.platform-android .action-sheet .action-sheet-title,.platform-android .action-sheet .button{text-align:left;border-color:transparent;font-size:16px;color:inherit}.platform-android .action-sheet .action-sheet-title{font-size:14px;padding:16px;color:#666}.platform-android .action-sheet .button.activated,.platform-android .action-sheet .button.active{background:#e8e8e8}.platform-android .action-sheet-group{margin:0;border-radius:0;background-color:#fafafa}.platform-android .action-sheet-cancel{display:none}.platform-android .action-sheet-has-icons .button{padding-left:56px}.backdrop{position:fixed;top:0;left:0;z-index:11;width:100%;height:100%;background-color:rgba(0,0,0,.4);visibility:hidden;opacity:0;-webkit-transition:.1s opacity linear;transition:.1s opacity linear}.backdrop.visible{visibility:visible}.backdrop.active{opacity:1}.bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;right:0;left:0;z-index:9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:5px;width:100%;height:44px;border-width:0;border-style:solid;border-top:1px solid transparent;border-bottom:1px solid #ddd;background-color:#fff;background-size:0}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.bar{border:none;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);background-position:bottom;background-size:100% 1px;background-repeat:no-repeat}}.bar.bar-clear{border:none;background:0 0;color:#fff}.bar.bar-clear .button{color:#fff}.bar.bar-clear .title{color:#fff}.bar.item-input-inset .item-input-wrapper{margin-top:-1px}.bar.item-input-inset .item-input-wrapper input{padding-left:8px;width:94%;height:28px;background:0 0}.bar.bar-light{border-color:#ddd;background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.bar.bar-light .title{color:#444}.bar.bar-light.bar-footer{background-image:linear-gradient(180deg,#ddd,#ddd 50%,transparent 50%)}.bar.bar-stable{border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.bar.bar-stable .title{color:#444}.bar.bar-stable.bar-footer{background-image:linear-gradient(180deg,#b2b2b2,#b2b2b2 50%,transparent 50%)}.bar.bar-positive{border-color:#0c60ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);color:#fff}.bar.bar-positive .title{color:#fff}.bar.bar-positive.bar-footer{background-image:linear-gradient(180deg,#0c60ee,#0c60ee 50%,transparent 50%)}.bar.bar-calm{border-color:#0a9dc7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);color:#fff}.bar.bar-calm .title{color:#fff}.bar.bar-calm.bar-footer{background-image:linear-gradient(180deg,#0a9dc7,#0a9dc7 50%,transparent 50%)}.bar.bar-assertive{border-color:#e42112;background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);color:#fff}.bar.bar-assertive .title{color:#fff}.bar.bar-assertive.bar-footer{background-image:linear-gradient(180deg,#e42112,#e42112 50%,transparent 50%)}.bar.bar-balanced{border-color:#28a54c;background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);color:#fff}.bar.bar-balanced .title{color:#fff}.bar.bar-balanced.bar-footer{background-image:linear-gradient(180deg,#28a54c,#28a54c 50%,transparent 50%)}.bar.bar-energized{border-color:#e6b500;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);color:#fff}.bar.bar-energized .title{color:#fff}.bar.bar-energized.bar-footer{background-image:linear-gradient(180deg,#e6b500,#e6b500 50%,transparent 50%)}.bar.bar-royal{border-color:#6b46e5;background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);color:#fff}.bar.bar-royal .title{color:#fff}.bar.bar-royal.bar-footer{background-image:linear-gradient(180deg,#6b46e5,#6b46e5 50%,transparent 50%)}.bar.bar-dark{border-color:#111;background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.bar.bar-dark .title{color:#fff}.bar.bar-dark.bar-footer{background-image:linear-gradient(180deg,#111,#111 50%,transparent 50%)}.bar .title{display:block;position:absolute;top:0;right:0;left:0;z-index:0;overflow:hidden;margin:0 10px;min-width:30px;height:43px;text-align:center;text-overflow:ellipsis;white-space:nowrap;font-size:17px;font-weight:500;line-height:44px}.bar .title.title-left{text-align:left}.bar .title.title-right{text-align:right}.bar .title a{color:inherit}.bar .button,.bar button{z-index:1;padding:0 8px;min-width:initial;min-height:31px;font-weight:400;font-size:13px;line-height:32px}.bar .button .icon:before,.bar .button.button-icon:before,.bar .button.icon-left:before,.bar .button.icon-right:before,.bar .button.icon:before,.bar button .icon:before,.bar button.button-icon:before,.bar button.icon-left:before,.bar button.icon-right:before,.bar button.icon:before{padding-right:2px;padding-left:2px;font-size:20px;line-height:32px}.bar .button.button-icon,.bar button.button-icon{font-size:17px}.bar .button.button-icon .icon:before,.bar .button.button-icon.icon-left:before,.bar .button.button-icon.icon-right:before,.bar .button.button-icon:before,.bar button.button-icon .icon:before,.bar button.button-icon.icon-left:before,.bar button.button-icon.icon-right:before,.bar button.button-icon:before{vertical-align:top;font-size:32px;line-height:32px}.bar .button.button-clear,.bar button.button-clear{padding-right:2px;padding-left:2px;font-weight:300;font-size:17px}.bar .button.button-clear .icon:before,.bar .button.button-clear.icon-left:before,.bar .button.button-clear.icon-right:before,.bar .button.button-clear.icon:before,.bar button.button-clear .icon:before,.bar button.button-clear.icon-left:before,.bar button.button-clear.icon-right:before,.bar button.button-clear.icon:before{font-size:32px;line-height:32px}.bar .button.back-button,.bar button.back-button{display:block;margin-right:5px;padding:0;white-space:nowrap;font-weight:400}.bar .button.back-button.activated,.bar .button.back-button.active,.bar button.back-button.activated,.bar button.back-button.active{opacity:.2}.bar .button-bar>.button,.bar .buttons>.button{min-height:31px;line-height:32px}.bar .button+.button-bar,.bar .button-bar+.button{margin-left:5px}.bar .buttons,.bar .buttons.primary-buttons,.bar .buttons.secondary-buttons{display:inherit}.bar .buttons span{display:inline-block}.bar .buttons-left span{margin-right:5px;display:inherit}.bar .buttons-right span{margin-left:5px;display:inherit}.bar .buttons.pull-right,.bar .title+.button:last-child,.bar .title+.buttons,.bar>.button+.button:last-child,.bar>.button.pull-right{position:absolute;top:5px;right:5px;bottom:5px}.platform-android .nav-bar-has-subheader .bar{background-image:none}.platform-android .bar .back-button .icon:before{font-size:24px}.platform-android .bar .title{font-size:19px;line-height:44px}.bar-light .button{border-color:#ddd;background-color:#fff;color:#444}.bar-light .button:hover{color:#444;text-decoration:none}.bar-light .button.activated,.bar-light .button.active{border-color:#ccc;background-color:#fafafa}.bar-light .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444;font-size:17px}.bar-light .button.button-icon{border-color:transparent;background:0 0}.bar-stable .button{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.bar-stable .button:hover{color:#444;text-decoration:none}.bar-stable .button.activated,.bar-stable .button.active{border-color:#a2a2a2;background-color:#e5e5e5}.bar-stable .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444;font-size:17px}.bar-stable .button.button-icon{border-color:transparent;background:0 0}.bar-positive .button{border-color:#0c60ee;background-color:#387ef5;color:#fff}.bar-positive .button:hover{color:#fff;text-decoration:none}.bar-positive .button.activated,.bar-positive .button.active{border-color:#0c60ee;background-color:#0c60ee}.bar-positive .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-positive .button.button-icon{border-color:transparent;background:0 0}.bar-calm .button{border-color:#0a9dc7;background-color:#11c1f3;color:#fff}.bar-calm .button:hover{color:#fff;text-decoration:none}.bar-calm .button.activated,.bar-calm .button.active{border-color:#0a9dc7;background-color:#0a9dc7}.bar-calm .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-calm .button.button-icon{border-color:transparent;background:0 0}.bar-assertive .button{border-color:#e42112;background-color:#ef473a;color:#fff}.bar-assertive .button:hover{color:#fff;text-decoration:none}.bar-assertive .button.activated,.bar-assertive .button.active{border-color:#e42112;background-color:#e42112}.bar-assertive .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-assertive .button.button-icon{border-color:transparent;background:0 0}.bar-balanced .button{border-color:#28a54c;background-color:#33cd5f;color:#fff}.bar-balanced .button:hover{color:#fff;text-decoration:none}.bar-balanced .button.activated,.bar-balanced .button.active{border-color:#28a54c;background-color:#28a54c}.bar-balanced .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-balanced .button.button-icon{border-color:transparent;background:0 0}.bar-energized .button{border-color:#e6b500;background-color:#ffc900;color:#fff}.bar-energized .button:hover{color:#fff;text-decoration:none}.bar-energized .button.activated,.bar-energized .button.active{border-color:#e6b500;background-color:#e6b500}.bar-energized .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-energized .button.button-icon{border-color:transparent;background:0 0}.bar-royal .button{border-color:#6b46e5;background-color:#886aea;color:#fff}.bar-royal .button:hover{color:#fff;text-decoration:none}.bar-royal .button.activated,.bar-royal .button.active{border-color:#6b46e5;background-color:#6b46e5}.bar-royal .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-royal .button.button-icon{border-color:transparent;background:0 0}.bar-dark .button{border-color:#111;background-color:#444;color:#fff}.bar-dark .button:hover{color:#fff;text-decoration:none}.bar-dark .button.activated,.bar-dark .button.active{border-color:#000;background-color:#262626}.bar-dark .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-dark .button.button-icon{border-color:transparent;background:0 0}.bar-header{top:0;border-top-width:0;border-bottom-width:1px}.bar-header.has-tabs-top{border-bottom-width:0;background-image:none}.tabs-top .bar-header{border-bottom-width:0;background-image:none}.bar-footer{bottom:0;border-top-width:1px;border-bottom-width:0;background-position:top;height:44px}.bar-footer.item-input-inset{position:absolute}.bar-footer .title{height:43px;line-height:44px}.bar-tabs{padding:0}.bar-subheader{top:44px;height:44px}.bar-subheader .title{height:43px;line-height:44px}.bar-subfooter{bottom:44px;height:44px}.bar-subfooter .title{height:43px;line-height:44px}.nav-bar-block{position:absolute;top:0;right:0;left:0;z-index:9}.bar .back-button.hide,.bar .buttons .hide{display:none}.nav-bar-tabs-top .bar{background-image:none}.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:horizontal;-moz-flex-direction:horizontal;-ms-flex-direction:horizontal;flex-direction:horizontal;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444;position:absolute;bottom:0;z-index:5;width:100%;height:49px;border-style:solid;border-top-width:1px;background-size:0;line-height:49px}.tabs .tab-item .badge{background-color:#444;color:#f8f8f8}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.tabs{padding-top:2px;border-top:none!important;border-bottom:none;background-position:top;background-size:100% 1px;background-repeat:no-repeat}}.tabs-light>.tabs,.tabs.tabs-light{border-color:#ddd;background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.tabs-light>.tabs .tab-item .badge,.tabs.tabs-light .tab-item .badge{background-color:#444;color:#fff}.tabs-stable>.tabs,.tabs.tabs-stable{border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.tabs-stable>.tabs .tab-item .badge,.tabs.tabs-stable .tab-item .badge{background-color:#444;color:#f8f8f8}.tabs-positive>.tabs,.tabs.tabs-positive{border-color:#0c60ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);color:#fff}.tabs-positive>.tabs .tab-item .badge,.tabs.tabs-positive .tab-item .badge{background-color:#fff;color:#387ef5}.tabs-calm>.tabs,.tabs.tabs-calm{border-color:#0a9dc7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);color:#fff}.tabs-calm>.tabs .tab-item .badge,.tabs.tabs-calm .tab-item .badge{background-color:#fff;color:#11c1f3}.tabs-assertive>.tabs,.tabs.tabs-assertive{border-color:#e42112;background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);color:#fff}.tabs-assertive>.tabs .tab-item .badge,.tabs.tabs-assertive .tab-item .badge{background-color:#fff;color:#ef473a}.tabs-balanced>.tabs,.tabs.tabs-balanced{border-color:#28a54c;background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);color:#fff}.tabs-balanced>.tabs .tab-item .badge,.tabs.tabs-balanced .tab-item .badge{background-color:#fff;color:#33cd5f}.tabs-energized>.tabs,.tabs.tabs-energized{border-color:#e6b500;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);color:#fff}.tabs-energized>.tabs .tab-item .badge,.tabs.tabs-energized .tab-item .badge{background-color:#fff;color:#ffc900}.tabs-royal>.tabs,.tabs.tabs-royal{border-color:#6b46e5;background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);color:#fff}.tabs-royal>.tabs .tab-item .badge,.tabs.tabs-royal .tab-item .badge{background-color:#fff;color:#886aea}.tabs-dark>.tabs,.tabs.tabs-dark{border-color:#111;background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.tabs-dark>.tabs .tab-item .badge,.tabs.tabs-dark .tab-item .badge{background-color:#fff;color:#444}.tabs-striped .tabs{background-color:#fff;background-image:none;border:none;border-bottom:1px solid #ddd;padding-top:2px}.tabs-striped .tab-item.activated,.tabs-striped .tab-item.active,.tabs-striped .tab-item.tab-item-active{margin-top:-2px;border-style:solid;border-width:2px 0 0 0;border-color:#444}.tabs-striped .tab-item.activated .badge,.tabs-striped .tab-item.active .badge,.tabs-striped .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-light .tabs{background-color:#fff}.tabs-striped.tabs-light .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-light .tab-item .badge{opacity:.4}.tabs-striped.tabs-light .tab-item.activated,.tabs-striped.tabs-light .tab-item.active,.tabs-striped.tabs-light .tab-item.tab-item-active{margin-top:-2px;color:#444;border-style:solid;border-width:2px 0 0 0;border-color:#444}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-stable .tabs{background-color:#f8f8f8}.tabs-striped.tabs-stable .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-stable .tab-item .badge{opacity:.4}.tabs-striped.tabs-stable .tab-item.activated,.tabs-striped.tabs-stable .tab-item.active,.tabs-striped.tabs-stable .tab-item.tab-item-active{margin-top:-2px;color:#444;border-style:solid;border-width:2px 0 0 0;border-color:#444}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-positive .tabs{background-color:#387ef5}.tabs-striped.tabs-positive .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-positive .tab-item .badge{opacity:.4}.tabs-striped.tabs-positive .tab-item.activated,.tabs-striped.tabs-positive .tab-item.active,.tabs-striped.tabs-positive .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-calm .tabs{background-color:#11c1f3}.tabs-striped.tabs-calm .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-calm .tab-item .badge{opacity:.4}.tabs-striped.tabs-calm .tab-item.activated,.tabs-striped.tabs-calm .tab-item.active,.tabs-striped.tabs-calm .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-assertive .tabs{background-color:#ef473a}.tabs-striped.tabs-assertive .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-assertive .tab-item .badge{opacity:.4}.tabs-striped.tabs-assertive .tab-item.activated,.tabs-striped.tabs-assertive .tab-item.active,.tabs-striped.tabs-assertive .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-balanced .tabs{background-color:#33cd5f}.tabs-striped.tabs-balanced .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-balanced .tab-item .badge{opacity:.4}.tabs-striped.tabs-balanced .tab-item.activated,.tabs-striped.tabs-balanced .tab-item.active,.tabs-striped.tabs-balanced .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-energized .tabs{background-color:#ffc900}.tabs-striped.tabs-energized .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-energized .tab-item .badge{opacity:.4}.tabs-striped.tabs-energized .tab-item.activated,.tabs-striped.tabs-energized .tab-item.active,.tabs-striped.tabs-energized .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-royal .tabs{background-color:#886aea}.tabs-striped.tabs-royal .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-royal .tab-item .badge{opacity:.4}.tabs-striped.tabs-royal .tab-item.activated,.tabs-striped.tabs-royal .tab-item.active,.tabs-striped.tabs-royal .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-dark .tabs{background-color:#444}.tabs-striped.tabs-dark .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-dark .tab-item .badge{opacity:.4}.tabs-striped.tabs-dark .tab-item.activated,.tabs-striped.tabs-dark .tab-item.active,.tabs-striped.tabs-dark .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0 0;border-color:#fff}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-background-light .tabs{background-color:#fff;background-image:none}.tabs-striped.tabs-background-stable .tabs{background-color:#f8f8f8;background-image:none}.tabs-striped.tabs-background-positive .tabs{background-color:#387ef5;background-image:none}.tabs-striped.tabs-background-calm .tabs{background-color:#11c1f3;background-image:none}.tabs-striped.tabs-background-assertive .tabs{background-color:#ef473a;background-image:none}.tabs-striped.tabs-background-balanced .tabs{background-color:#33cd5f;background-image:none}.tabs-striped.tabs-background-energized .tabs{background-color:#ffc900;background-image:none}.tabs-striped.tabs-background-royal .tabs{background-color:#886aea;background-image:none}.tabs-striped.tabs-background-dark .tabs{background-color:#444;background-image:none}.tabs-striped.tabs-color-light .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-color-light .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-light .tab-item.activated,.tabs-striped.tabs-color-light .tab-item.active,.tabs-striped.tabs-color-light .tab-item.tab-item-active{margin-top:-2px;color:#fff;border:0 solid #fff;border-top-width:2px}.tabs-striped.tabs-color-light .tab-item.activated .badge,.tabs-striped.tabs-color-light .tab-item.active .badge,.tabs-striped.tabs-color-light .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-stable .tab-item{color:rgba(248,248,248,.4);opacity:1}.tabs-striped.tabs-color-stable .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-stable .tab-item.activated,.tabs-striped.tabs-color-stable .tab-item.active,.tabs-striped.tabs-color-stable .tab-item.tab-item-active{margin-top:-2px;color:#f8f8f8;border:0 solid #f8f8f8;border-top-width:2px}.tabs-striped.tabs-color-stable .tab-item.activated .badge,.tabs-striped.tabs-color-stable .tab-item.active .badge,.tabs-striped.tabs-color-stable .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-positive .tab-item{color:rgba(56,126,245,.4);opacity:1}.tabs-striped.tabs-color-positive .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-positive .tab-item.activated,.tabs-striped.tabs-color-positive .tab-item.active,.tabs-striped.tabs-color-positive .tab-item.tab-item-active{margin-top:-2px;color:#387ef5;border:0 solid #387ef5;border-top-width:2px}.tabs-striped.tabs-color-positive .tab-item.activated .badge,.tabs-striped.tabs-color-positive .tab-item.active .badge,.tabs-striped.tabs-color-positive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-calm .tab-item{color:rgba(17,193,243,.4);opacity:1}.tabs-striped.tabs-color-calm .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-calm .tab-item.activated,.tabs-striped.tabs-color-calm .tab-item.active,.tabs-striped.tabs-color-calm .tab-item.tab-item-active{margin-top:-2px;color:#11c1f3;border:0 solid #11c1f3;border-top-width:2px}.tabs-striped.tabs-color-calm .tab-item.activated .badge,.tabs-striped.tabs-color-calm .tab-item.active .badge,.tabs-striped.tabs-color-calm .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-assertive .tab-item{color:rgba(239,71,58,.4);opacity:1}.tabs-striped.tabs-color-assertive .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-assertive .tab-item.activated,.tabs-striped.tabs-color-assertive .tab-item.active,.tabs-striped.tabs-color-assertive .tab-item.tab-item-active{margin-top:-2px;color:#ef473a;border:0 solid #ef473a;border-top-width:2px}.tabs-striped.tabs-color-assertive .tab-item.activated .badge,.tabs-striped.tabs-color-assertive .tab-item.active .badge,.tabs-striped.tabs-color-assertive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-balanced .tab-item{color:rgba(51,205,95,.4);opacity:1}.tabs-striped.tabs-color-balanced .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-balanced .tab-item.activated,.tabs-striped.tabs-color-balanced .tab-item.active,.tabs-striped.tabs-color-balanced .tab-item.tab-item-active{margin-top:-2px;color:#33cd5f;border:0 solid #33cd5f;border-top-width:2px}.tabs-striped.tabs-color-balanced .tab-item.activated .badge,.tabs-striped.tabs-color-balanced .tab-item.active .badge,.tabs-striped.tabs-color-balanced .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-energized .tab-item{color:rgba(255,201,0,.4);opacity:1}.tabs-striped.tabs-color-energized .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-energized .tab-item.activated,.tabs-striped.tabs-color-energized .tab-item.active,.tabs-striped.tabs-color-energized .tab-item.tab-item-active{margin-top:-2px;color:#ffc900;border:0 solid #ffc900;border-top-width:2px}.tabs-striped.tabs-color-energized .tab-item.activated .badge,.tabs-striped.tabs-color-energized .tab-item.active .badge,.tabs-striped.tabs-color-energized .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-royal .tab-item{color:rgba(136,106,234,.4);opacity:1}.tabs-striped.tabs-color-royal .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-royal .tab-item.activated,.tabs-striped.tabs-color-royal .tab-item.active,.tabs-striped.tabs-color-royal .tab-item.tab-item-active{margin-top:-2px;color:#886aea;border:0 solid #886aea;border-top-width:2px}.tabs-striped.tabs-color-royal .tab-item.activated .badge,.tabs-striped.tabs-color-royal .tab-item.active .badge,.tabs-striped.tabs-color-royal .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-dark .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-color-dark .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-dark .tab-item.activated,.tabs-striped.tabs-color-dark .tab-item.active,.tabs-striped.tabs-color-dark .tab-item.tab-item-active{margin-top:-2px;color:#444;border:0 solid #444;border-top-width:2px}.tabs-striped.tabs-color-dark .tab-item.activated .badge,.tabs-striped.tabs-color-dark .tab-item.active .badge,.tabs-striped.tabs-color-dark .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-background-light .tabs,.tabs-background-light>.tabs{background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);border-color:#ddd}.tabs-background-stable .tabs,.tabs-background-stable>.tabs{background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);border-color:#b2b2b2}.tabs-background-positive .tabs,.tabs-background-positive>.tabs{background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);border-color:#0c60ee}.tabs-background-calm .tabs,.tabs-background-calm>.tabs{background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);border-color:#0a9dc7}.tabs-background-assertive .tabs,.tabs-background-assertive>.tabs{background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);border-color:#e42112}.tabs-background-balanced .tabs,.tabs-background-balanced>.tabs{background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);border-color:#28a54c}.tabs-background-energized .tabs,.tabs-background-energized>.tabs{background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);border-color:#e6b500}.tabs-background-royal .tabs,.tabs-background-royal>.tabs{background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);border-color:#6b46e5}.tabs-background-dark .tabs,.tabs-background-dark>.tabs{background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);border-color:#111}.tabs-color-light .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-color-light .tab-item .badge{opacity:.4}.tabs-color-light .tab-item.activated,.tabs-color-light .tab-item.active,.tabs-color-light .tab-item.tab-item-active{color:#fff;border:0 solid #fff}.tabs-color-light .tab-item.activated .badge,.tabs-color-light .tab-item.active .badge,.tabs-color-light .tab-item.tab-item-active .badge{opacity:1}.tabs-color-stable .tab-item{color:rgba(248,248,248,.4);opacity:1}.tabs-color-stable .tab-item .badge{opacity:.4}.tabs-color-stable .tab-item.activated,.tabs-color-stable .tab-item.active,.tabs-color-stable .tab-item.tab-item-active{color:#f8f8f8;border:0 solid #f8f8f8}.tabs-color-stable .tab-item.activated .badge,.tabs-color-stable .tab-item.active .badge,.tabs-color-stable .tab-item.tab-item-active .badge{opacity:1}.tabs-color-positive .tab-item{color:rgba(56,126,245,.4);opacity:1}.tabs-color-positive .tab-item .badge{opacity:.4}.tabs-color-positive .tab-item.activated,.tabs-color-positive .tab-item.active,.tabs-color-positive .tab-item.tab-item-active{color:#387ef5;border:0 solid #387ef5}.tabs-color-positive .tab-item.activated .badge,.tabs-color-positive .tab-item.active .badge,.tabs-color-positive .tab-item.tab-item-active .badge{opacity:1}.tabs-color-calm .tab-item{color:rgba(17,193,243,.4);opacity:1}.tabs-color-calm .tab-item .badge{opacity:.4}.tabs-color-calm .tab-item.activated,.tabs-color-calm .tab-item.active,.tabs-color-calm .tab-item.tab-item-active{color:#11c1f3;border:0 solid #11c1f3}.tabs-color-calm .tab-item.activated .badge,.tabs-color-calm .tab-item.active .badge,.tabs-color-calm .tab-item.tab-item-active .badge{opacity:1}.tabs-color-assertive .tab-item{color:rgba(239,71,58,.4);opacity:1}.tabs-color-assertive .tab-item .badge{opacity:.4}.tabs-color-assertive .tab-item.activated,.tabs-color-assertive .tab-item.active,.tabs-color-assertive .tab-item.tab-item-active{color:#ef473a;border:0 solid #ef473a}.tabs-color-assertive .tab-item.activated .badge,.tabs-color-assertive .tab-item.active .badge,.tabs-color-assertive .tab-item.tab-item-active .badge{opacity:1}.tabs-color-balanced .tab-item{color:rgba(51,205,95,.4);opacity:1}.tabs-color-balanced .tab-item .badge{opacity:.4}.tabs-color-balanced .tab-item.activated,.tabs-color-balanced .tab-item.active,.tabs-color-balanced .tab-item.tab-item-active{color:#33cd5f;border:0 solid #33cd5f}.tabs-color-balanced .tab-item.activated .badge,.tabs-color-balanced .tab-item.active .badge,.tabs-color-balanced .tab-item.tab-item-active .badge{opacity:1}.tabs-color-energized .tab-item{color:rgba(255,201,0,.4);opacity:1}.tabs-color-energized .tab-item .badge{opacity:.4}.tabs-color-energized .tab-item.activated,.tabs-color-energized .tab-item.active,.tabs-color-energized .tab-item.tab-item-active{color:#ffc900;border:0 solid #ffc900}.tabs-color-energized .tab-item.activated .badge,.tabs-color-energized .tab-item.active .badge,.tabs-color-energized .tab-item.tab-item-active .badge{opacity:1}.tabs-color-royal .tab-item{color:rgba(136,106,234,.4);opacity:1}.tabs-color-royal .tab-item .badge{opacity:.4}.tabs-color-royal .tab-item.activated,.tabs-color-royal .tab-item.active,.tabs-color-royal .tab-item.tab-item-active{color:#886aea;border:0 solid #886aea}.tabs-color-royal .tab-item.activated .badge,.tabs-color-royal .tab-item.active .badge,.tabs-color-royal .tab-item.tab-item-active .badge{opacity:1}.tabs-color-dark .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-color-dark .tab-item .badge{opacity:.4}.tabs-color-dark .tab-item.activated,.tabs-color-dark .tab-item.active,.tabs-color-dark .tab-item.tab-item-active{color:#444;border:0 solid #444}.tabs-color-dark .tab-item.activated .badge,.tabs-color-dark .tab-item.active .badge,.tabs-color-dark .tab-item.tab-item-active .badge{opacity:1}ion-tabs.tabs-color-active-light .tab-item{color:#444}ion-tabs.tabs-color-active-light .tab-item.activated,ion-tabs.tabs-color-active-light .tab-item.active,ion-tabs.tabs-color-active-light .tab-item.tab-item-active{color:#fff}ion-tabs.tabs-striped.tabs-color-active-light .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-light .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-light .tab-item.tab-item-active{border-color:#fff;color:#fff}ion-tabs.tabs-color-active-stable .tab-item{color:#444}ion-tabs.tabs-color-active-stable .tab-item.activated,ion-tabs.tabs-color-active-stable .tab-item.active,ion-tabs.tabs-color-active-stable .tab-item.tab-item-active{color:#f8f8f8}ion-tabs.tabs-striped.tabs-color-active-stable .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-stable .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-stable .tab-item.tab-item-active{border-color:#f8f8f8;color:#f8f8f8}ion-tabs.tabs-color-active-positive .tab-item{color:#444}ion-tabs.tabs-color-active-positive .tab-item.activated,ion-tabs.tabs-color-active-positive .tab-item.active,ion-tabs.tabs-color-active-positive .tab-item.tab-item-active{color:#387ef5}ion-tabs.tabs-striped.tabs-color-active-positive .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-positive .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-positive .tab-item.tab-item-active{border-color:#387ef5;color:#387ef5}ion-tabs.tabs-color-active-calm .tab-item{color:#444}ion-tabs.tabs-color-active-calm .tab-item.activated,ion-tabs.tabs-color-active-calm .tab-item.active,ion-tabs.tabs-color-active-calm .tab-item.tab-item-active{color:#11c1f3}ion-tabs.tabs-striped.tabs-color-active-calm .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-calm .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-calm .tab-item.tab-item-active{border-color:#11c1f3;color:#11c1f3}ion-tabs.tabs-color-active-assertive .tab-item{color:#444}ion-tabs.tabs-color-active-assertive .tab-item.activated,ion-tabs.tabs-color-active-assertive .tab-item.active,ion-tabs.tabs-color-active-assertive .tab-item.tab-item-active{color:#ef473a}ion-tabs.tabs-striped.tabs-color-active-assertive .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-assertive .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-assertive .tab-item.tab-item-active{border-color:#ef473a;color:#ef473a}ion-tabs.tabs-color-active-balanced .tab-item{color:#444}ion-tabs.tabs-color-active-balanced .tab-item.activated,ion-tabs.tabs-color-active-balanced .tab-item.active,ion-tabs.tabs-color-active-balanced .tab-item.tab-item-active{color:#33cd5f}ion-tabs.tabs-striped.tabs-color-active-balanced .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-balanced .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-balanced .tab-item.tab-item-active{border-color:#33cd5f;color:#33cd5f}ion-tabs.tabs-color-active-energized .tab-item{color:#444}ion-tabs.tabs-color-active-energized .tab-item.activated,ion-tabs.tabs-color-active-energized .tab-item.active,ion-tabs.tabs-color-active-energized .tab-item.tab-item-active{color:#ffc900}ion-tabs.tabs-striped.tabs-color-active-energized .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-energized .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-energized .tab-item.tab-item-active{border-color:#ffc900;color:#ffc900}ion-tabs.tabs-color-active-royal .tab-item{color:#444}ion-tabs.tabs-color-active-royal .tab-item.activated,ion-tabs.tabs-color-active-royal .tab-item.active,ion-tabs.tabs-color-active-royal .tab-item.tab-item-active{color:#886aea}ion-tabs.tabs-striped.tabs-color-active-royal .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-royal .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-royal .tab-item.tab-item-active{border-color:#886aea;color:#886aea}ion-tabs.tabs-color-active-dark .tab-item{color:#fff}ion-tabs.tabs-color-active-dark .tab-item.activated,ion-tabs.tabs-color-active-dark .tab-item.active,ion-tabs.tabs-color-active-dark .tab-item.tab-item-active{color:#444}ion-tabs.tabs-striped.tabs-color-active-dark .tab-item.activated,ion-tabs.tabs-striped.tabs-color-active-dark .tab-item.active,ion-tabs.tabs-striped.tabs-color-active-dark .tab-item.tab-item-active{border-color:#444;color:#444}.tabs-top.tabs-striped{padding-bottom:0}.tabs-top.tabs-striped .tab-item{background:0 0;-webkit-transition:color .1s ease;-moz-transition:color .1s ease;-ms-transition:color .1s ease;-o-transition:color .1s ease;transition:color .1s ease}.tabs-top.tabs-striped .tab-item.activated,.tabs-top.tabs-striped .tab-item.active,.tabs-top.tabs-striped .tab-item.tab-item-active{margin-top:1px;border-width:0 0 2px 0!important;border-style:solid}.tabs-top.tabs-striped .tab-item.activated>.badge,.tabs-top.tabs-striped .tab-item.activated>i,.tabs-top.tabs-striped .tab-item.active>.badge,.tabs-top.tabs-striped .tab-item.active>i,.tabs-top.tabs-striped .tab-item.tab-item-active>.badge,.tabs-top.tabs-striped .tab-item.tab-item-active>i{margin-top:-1px}.tabs-top.tabs-striped .tab-item .badge{-webkit-transition:color .2s ease;-moz-transition:color .2s ease;-ms-transition:color .2s ease;-o-transition:color .2s ease;transition:color .2s ease}.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated i,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active i,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active i{display:block;margin-top:-1px}.tabs-top.tabs-striped.tabs-icon-left .tab-item{margin-top:1px}.tabs-top.tabs-striped.tabs-icon-left .tab-item.activated .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.activated i,.tabs-top.tabs-striped.tabs-icon-left .tab-item.active .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.active i,.tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active i{margin-top:-.1em}.tabs-top>.tabs,.tabs.tabs-top{top:44px;padding-top:0;background-position:bottom;border-top-width:0;border-bottom-width:1px}.tabs-top>.tabs .tab-item.activated .badge,.tabs-top>.tabs .tab-item.active .badge,.tabs-top>.tabs .tab-item.tab-item-active .badge,.tabs.tabs-top .tab-item.activated .badge,.tabs.tabs-top .tab-item.active .badge,.tabs.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-top~.bar-header{border-bottom-width:0}.tab-item{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;max-width:150px;height:100%;color:inherit;text-align:center;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;font-weight:400;font-size:14px;font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif;opacity:.7}.tab-item:hover{cursor:pointer}.tab-item.tab-hidden{display:none}.tabs-item-hide>.tabs,.tabs.tabs-item-hide{display:none}.tabs-icon-bottom.tabs .tab-item,.tabs-icon-bottom>.tabs .tab-item,.tabs-icon-top.tabs .tab-item,.tabs-icon-top>.tabs .tab-item{font-size:10px;line-height:14px}.tab-item .icon{display:block;margin:0 auto;height:32px;font-size:32px}.tabs-icon-left.tabs .tab-item,.tabs-icon-left>.tabs .tab-item,.tabs-icon-right.tabs .tab-item,.tabs-icon-right>.tabs .tab-item{font-size:10px}.tabs-icon-left.tabs .tab-item .icon,.tabs-icon-left.tabs .tab-item .tab-title,.tabs-icon-left>.tabs .tab-item .icon,.tabs-icon-left>.tabs .tab-item .tab-title,.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right.tabs .tab-item .tab-title,.tabs-icon-right>.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .tab-title{display:inline-block;vertical-align:top;margin-top:-.1em}.tabs-icon-left.tabs .tab-item .icon:before,.tabs-icon-left.tabs .tab-item .tab-title:before,.tabs-icon-left>.tabs .tab-item .icon:before,.tabs-icon-left>.tabs .tab-item .tab-title:before,.tabs-icon-right.tabs .tab-item .icon:before,.tabs-icon-right.tabs .tab-item .tab-title:before,.tabs-icon-right>.tabs .tab-item .icon:before,.tabs-icon-right>.tabs .tab-item .tab-title:before{font-size:24px;line-height:49px}.tabs-icon-left.tabs .tab-item .icon,.tabs-icon-left>.tabs .tab-item .icon{padding-right:3px}.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .icon{padding-left:3px}.tabs-icon-only.tabs .icon,.tabs-icon-only>.tabs .icon{line-height:inherit}.tab-item.has-badge{position:relative}.tab-item .badge{position:absolute;top:4%;right:33%;right:calc(50% - 26px);padding:1px 6px;height:auto;font-size:12px;line-height:16px}.tab-item.activated,.tab-item.active,.tab-item.tab-item-active{opacity:1}.tab-item.activated.tab-item-light,.tab-item.active.tab-item-light,.tab-item.tab-item-active.tab-item-light{color:#fff}.tab-item.activated.tab-item-stable,.tab-item.active.tab-item-stable,.tab-item.tab-item-active.tab-item-stable{color:#f8f8f8}.tab-item.activated.tab-item-positive,.tab-item.active.tab-item-positive,.tab-item.tab-item-active.tab-item-positive{color:#387ef5}.tab-item.activated.tab-item-calm,.tab-item.active.tab-item-calm,.tab-item.tab-item-active.tab-item-calm{color:#11c1f3}.tab-item.activated.tab-item-assertive,.tab-item.active.tab-item-assertive,.tab-item.tab-item-active.tab-item-assertive{color:#ef473a}.tab-item.activated.tab-item-balanced,.tab-item.active.tab-item-balanced,.tab-item.tab-item-active.tab-item-balanced{color:#33cd5f}.tab-item.activated.tab-item-energized,.tab-item.active.tab-item-energized,.tab-item.tab-item-active.tab-item-energized{color:#ffc900}.tab-item.activated.tab-item-royal,.tab-item.active.tab-item-royal,.tab-item.tab-item-active.tab-item-royal{color:#886aea}.tab-item.activated.tab-item-dark,.tab-item.active.tab-item-dark,.tab-item.tab-item-active.tab-item-dark{color:#444}.item.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:0}.item.tabs .icon:before{position:relative}.tab-item.disabled,.tab-item[disabled]{opacity:.4;cursor:default;pointer-events:none}.nav-bar-tabs-top.hide~.view-container .tabs-top .tabs{top:0}.pane[hide-nav-bar=true] .has-tabs-top{top:49px}.menu{position:absolute;top:0;bottom:0;z-index:0;overflow:hidden;min-height:100%;max-height:100%;width:275px;background-color:#fff}.menu .scroll-content{z-index:10}.menu .bar-header{z-index:11}.menu-content{-webkit-transform:none;transform:none;box-shadow:-1px 0 2px rgba(0,0,0,.2),1px 0 2px rgba(0,0,0,.2)}.menu-open .menu-content .pane,.menu-open .menu-content .scroll-content{pointer-events:none}.menu-open .menu-content .scroll-content .scroll{pointer-events:none}.menu-open .menu-content .scroll-content:not(.overflow-scroll){overflow:hidden}.grade-b .menu-content,.grade-c .menu-content{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;right:-1px;left:-1px;border-right:1px solid #ccc;border-left:1px solid #ccc;box-shadow:none}.menu-left{left:0}.menu-right{right:0}.aside-open.aside-resizing .menu-right{display:none}.menu-animated{-webkit-transition:-webkit-transform .2s ease;transition:transform .2s ease}.modal-backdrop,.modal-backdrop-bg{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%}.modal-backdrop-bg{pointer-events:none}.modal{display:block;position:absolute;top:0;z-index:10;overflow:hidden;min-height:100%;width:100%;background-color:#fff}@media (min-width:680px){.modal{top:20%;right:20%;bottom:20%;left:20%;min-height:240px;width:60%}.modal.ng-leave-active{bottom:0}.platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader){height:44px}.platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader)>*{margin-top:0}.platform-ios.platform-cordova .modal-wrapper .modal .tabs-top>.tabs,.platform-ios.platform-cordova .modal-wrapper .modal .tabs.tabs-top{top:44px}.platform-ios.platform-cordova .modal-wrapper .modal .bar-subheader,.platform-ios.platform-cordova .modal-wrapper .modal .has-header{top:44px}.platform-ios.platform-cordova .modal-wrapper .modal .has-subheader{top:88px}.platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-tabs-top{top:93px}.platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-subheader.has-tabs-top{top:137px}.modal-backdrop-bg{-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;background-color:#000;opacity:0}.active .modal-backdrop-bg{opacity:.5}}.modal-open{pointer-events:none}.modal-open .modal,.modal-open .modal-backdrop{pointer-events:auto}.modal-open.loading-active .modal,.modal-open.loading-active .modal-backdrop{pointer-events:none}.popover-backdrop{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%;background-color:transparent}.popover-backdrop.active{background-color:rgba(0,0,0,.1)}.popover{position:absolute;top:25%;left:50%;z-index:10;display:block;margin-top:12px;margin-left:-110px;height:280px;width:220px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4);opacity:0}.popover .item:first-child{border-top:0}.popover .item:last-child{border-bottom:0}.popover.popover-bottom{margin-top:-12px}.popover,.popover .bar-header{border-radius:2px}.popover .scroll-content{z-index:1;margin:2px 0}.popover .bar-header{border-bottom-right-radius:0;border-bottom-left-radius:0}.popover .has-header{border-top-right-radius:0;border-top-left-radius:0}.popover-arrow{display:none}.platform-ios .popover{box-shadow:0 0 40px rgba(0,0,0,.08);border-radius:10px}.platform-ios .popover .bar-header{-webkit-border-top-right-radius:10px;border-top-right-radius:10px;-webkit-border-top-left-radius:10px;border-top-left-radius:10px}.platform-ios .popover .scroll-content{margin:8px 0;border-radius:10px}.platform-ios .popover .scroll-content.has-header{margin-top:0}.platform-ios .popover-arrow{position:absolute;display:block;top:-17px;width:30px;height:19px;overflow:hidden}.platform-ios .popover-arrow:after{position:absolute;top:12px;left:5px;width:20px;height:20px;background-color:#fff;border-radius:3px;content:'';-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.platform-ios .popover-bottom .popover-arrow{top:auto;bottom:-10px}.platform-ios .popover-bottom .popover-arrow:after{top:-6px}.platform-android .popover{margin-top:-32px;background-color:#fafafa;box-shadow:0 2px 6px rgba(0,0,0,.35)}.platform-android .popover .item{border-color:#fafafa;background-color:#fafafa;color:#4d4d4d}.platform-android .popover.popover-bottom{margin-top:32px}.platform-android .popover-backdrop,.platform-android .popover-backdrop.active{background-color:transparent}.popover-open{pointer-events:none}.popover-open .popover,.popover-open .popover-backdrop{pointer-events:auto}.popover-open.loading-active .popover,.popover-open.loading-active .popover-backdrop{pointer-events:none}@media (min-width:680px){.popover{width:360px;margin-left:-180px}}.popup-container{position:absolute;top:0;left:0;bottom:0;right:0;background:0 0;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;z-index:12;visibility:hidden}.popup-container.popup-showing{visibility:visible}.popup-container.popup-hidden .popup{-webkit-animation-name:scaleOut;animation-name:scaleOut;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.popup-container.active .popup{-webkit-animation-name:superScaleIn;animation-name:superScaleIn;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.popup-container .popup{width:250px;max-width:100%;max-height:90%;border-radius:0;background-color:rgba(255,255,255,.9);display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:vertical;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.popup-container input,.popup-container textarea{width:100%}.popup-head{padding:15px 10px;border-bottom:1px solid #eee;text-align:center}.popup-title{margin:0;padding:0;font-size:15px}.popup-sub-title{margin:5px 0 0 0;padding:0;font-weight:400;font-size:11px}.popup-body{padding:10px;overflow:auto}.popup-buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;flex-direction:row;padding:10px;min-height:65px}.popup-buttons .button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;min-height:45px;border-radius:2px;line-height:20px;margin-right:5px}.popup-buttons .button:last-child{margin-right:0}.popup-open{pointer-events:none}.popup-open.modal-open .modal{pointer-events:none}.popup-open .popup,.popup-open .popup-backdrop{pointer-events:auto}.loading-container{position:absolute;left:0;top:0;right:0;bottom:0;z-index:13;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-transition:.2s opacity linear;transition:.2s opacity linear;visibility:hidden;opacity:0}.loading-container:not(.visible) .icon,.loading-container:not(.visible) .spinner{display:none}.loading-container.visible{visibility:visible}.loading-container.active{opacity:1}.loading-container .loading{padding:20px;border-radius:5px;background-color:rgba(0,0,0,.7);color:#fff;text-align:center;text-overflow:ellipsis;font-size:15px}.loading-container .loading h1,.loading-container .loading h2,.loading-container .loading h3,.loading-container .loading h4,.loading-container .loading h5,.loading-container .loading h6{color:#fff}.item{border-color:#ddd;background-color:#fff;color:#444;position:relative;z-index:2;display:block;margin:-1px;padding:16px;border-width:1px;border-style:solid;font-size:16px}.item h2{margin:0 0 2px 0;font-size:16px;font-weight:400}.item h3{margin:0 0 4px 0;font-size:14px}.item h4{margin:0 0 4px 0;font-size:12px}.item h5,.item h6{margin:0 0 3px 0;font-size:10px}.item p{color:#666;font-size:14px;margin-bottom:2px}.item h1:last-child,.item h2:last-child,.item h3:last-child,.item h4:last-child,.item h5:last-child,.item h6:last-child,.item p:last-child{margin-bottom:0}.item .badge{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;position:absolute;top:16px;right:32px}.item.item-button-right .badge{right:67px}.item.item-divider .badge{top:8px}.item .badge+.badge{margin-right:5px}.item.item-light{border-color:#ddd;background-color:#fff;color:#444}.item.item-stable{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.item.item-positive{border-color:#0c60ee;background-color:#387ef5;color:#fff}.item.item-calm{border-color:#0a9dc7;background-color:#11c1f3;color:#fff}.item.item-assertive{border-color:#e42112;background-color:#ef473a;color:#fff}.item.item-balanced{border-color:#28a54c;background-color:#33cd5f;color:#fff}.item.item-energized{border-color:#e6b500;background-color:#ffc900;color:#fff}.item.item-royal{border-color:#6b46e5;background-color:#886aea;color:#fff}.item.item-dark{border-color:#111;background-color:#444;color:#fff}.item[ng-click]:hover{cursor:pointer}.item-borderless,.list-borderless .item{border-width:0}.item .item-content.activated,.item .item-content.active,.item-complex.activated .item-content,.item-complex.active .item-content,.item.activated,.item.active{border-color:#ccc;background-color:#d9d9d9}.item .item-content.activated.item-complex>.item-content,.item .item-content.active.item-complex>.item-content,.item-complex.activated .item-content.item-complex>.item-content,.item-complex.active .item-content.item-complex>.item-content,.item.activated.item-complex>.item-content,.item.active.item-complex>.item-content{border-color:#ccc;background-color:#d9d9d9}.item .item-content.activated.item-light,.item .item-content.active.item-light,.item-complex.activated .item-content.item-light,.item-complex.active .item-content.item-light,.item.activated.item-light,.item.active.item-light{border-color:#ccc;background-color:#fafafa}.item .item-content.activated.item-light.item-complex>.item-content,.item .item-content.active.item-light.item-complex>.item-content,.item-complex.activated .item-content.item-light.item-complex>.item-content,.item-complex.active .item-content.item-light.item-complex>.item-content,.item.activated.item-light.item-complex>.item-content,.item.active.item-light.item-complex>.item-content{border-color:#ccc;background-color:#fafafa}.item .item-content.activated.item-stable,.item .item-content.active.item-stable,.item-complex.activated .item-content.item-stable,.item-complex.active .item-content.item-stable,.item.activated.item-stable,.item.active.item-stable{border-color:#a2a2a2;background-color:#e5e5e5}.item .item-content.activated.item-stable.item-complex>.item-content,.item .item-content.active.item-stable.item-complex>.item-content,.item-complex.activated .item-content.item-stable.item-complex>.item-content,.item-complex.active .item-content.item-stable.item-complex>.item-content,.item.activated.item-stable.item-complex>.item-content,.item.active.item-stable.item-complex>.item-content{border-color:#a2a2a2;background-color:#e5e5e5}.item .item-content.activated.item-positive,.item .item-content.active.item-positive,.item-complex.activated .item-content.item-positive,.item-complex.active .item-content.item-positive,.item.activated.item-positive,.item.active.item-positive{border-color:#0c60ee;background-color:#0c60ee}.item .item-content.activated.item-positive.item-complex>.item-content,.item .item-content.active.item-positive.item-complex>.item-content,.item-complex.activated .item-content.item-positive.item-complex>.item-content,.item-complex.active .item-content.item-positive.item-complex>.item-content,.item.activated.item-positive.item-complex>.item-content,.item.active.item-positive.item-complex>.item-content{border-color:#0c60ee;background-color:#0c60ee}.item .item-content.activated.item-calm,.item .item-content.active.item-calm,.item-complex.activated .item-content.item-calm,.item-complex.active .item-content.item-calm,.item.activated.item-calm,.item.active.item-calm{border-color:#0a9dc7;background-color:#0a9dc7}.item .item-content.activated.item-calm.item-complex>.item-content,.item .item-content.active.item-calm.item-complex>.item-content,.item-complex.activated .item-content.item-calm.item-complex>.item-content,.item-complex.active .item-content.item-calm.item-complex>.item-content,.item.activated.item-calm.item-complex>.item-content,.item.active.item-calm.item-complex>.item-content{border-color:#0a9dc7;background-color:#0a9dc7}.item .item-content.activated.item-assertive,.item .item-content.active.item-assertive,.item-complex.activated .item-content.item-assertive,.item-complex.active .item-content.item-assertive,.item.activated.item-assertive,.item.active.item-assertive{border-color:#e42112;background-color:#e42112}.item .item-content.activated.item-assertive.item-complex>.item-content,.item .item-content.active.item-assertive.item-complex>.item-content,.item-complex.activated .item-content.item-assertive.item-complex>.item-content,.item-complex.active .item-content.item-assertive.item-complex>.item-content,.item.activated.item-assertive.item-complex>.item-content,.item.active.item-assertive.item-complex>.item-content{border-color:#e42112;background-color:#e42112}.item .item-content.activated.item-balanced,.item .item-content.active.item-balanced,.item-complex.activated .item-content.item-balanced,.item-complex.active .item-content.item-balanced,.item.activated.item-balanced,.item.active.item-balanced{border-color:#28a54c;background-color:#28a54c}.item .item-content.activated.item-balanced.item-complex>.item-content,.item .item-content.active.item-balanced.item-complex>.item-content,.item-complex.activated .item-content.item-balanced.item-complex>.item-content,.item-complex.active .item-content.item-balanced.item-complex>.item-content,.item.activated.item-balanced.item-complex>.item-content,.item.active.item-balanced.item-complex>.item-content{border-color:#28a54c;background-color:#28a54c}.item .item-content.activated.item-energized,.item .item-content.active.item-energized,.item-complex.activated .item-content.item-energized,.item-complex.active .item-content.item-energized,.item.activated.item-energized,.item.active.item-energized{border-color:#e6b500;background-color:#e6b500}.item .item-content.activated.item-energized.item-complex>.item-content,.item .item-content.active.item-energized.item-complex>.item-content,.item-complex.activated .item-content.item-energized.item-complex>.item-content,.item-complex.active .item-content.item-energized.item-complex>.item-content,.item.activated.item-energized.item-complex>.item-content,.item.active.item-energized.item-complex>.item-content{border-color:#e6b500;background-color:#e6b500}.item .item-content.activated.item-royal,.item .item-content.active.item-royal,.item-complex.activated .item-content.item-royal,.item-complex.active .item-content.item-royal,.item.activated.item-royal,.item.active.item-royal{border-color:#6b46e5;background-color:#6b46e5}.item .item-content.activated.item-royal.item-complex>.item-content,.item .item-content.active.item-royal.item-complex>.item-content,.item-complex.activated .item-content.item-royal.item-complex>.item-content,.item-complex.active .item-content.item-royal.item-complex>.item-content,.item.activated.item-royal.item-complex>.item-content,.item.active.item-royal.item-complex>.item-content{border-color:#6b46e5;background-color:#6b46e5}.item .item-content.activated.item-dark,.item .item-content.active.item-dark,.item-complex.activated .item-content.item-dark,.item-complex.active .item-content.item-dark,.item.activated.item-dark,.item.active.item-dark{border-color:#000;background-color:#262626}.item .item-content.activated.item-dark.item-complex>.item-content,.item .item-content.active.item-dark.item-complex>.item-content,.item-complex.activated .item-content.item-dark.item-complex>.item-content,.item-complex.active .item-content.item-dark.item-complex>.item-content,.item.activated.item-dark.item-complex>.item-content,.item.active.item-dark.item-complex>.item-content{border-color:#000;background-color:#262626}.item,.item h1,.item h2,.item h3,.item h4,.item h5,.item h6,.item p,.item-content,.item-content h1,.item-content h2,.item-content h3,.item-content h4,.item-content h5,.item-content h6,.item-content p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}a.item{color:inherit;text-decoration:none}a.item:focus,a.item:hover{text-decoration:none}.item-complex,a.item.item-complex,button.item.item-complex{padding:0}.item-complex .item-content,.item-radio .item-content{position:relative;z-index:2;padding:16px 49px 16px 16px;border:none;background-color:#fff}a.item-content{display:block;color:inherit;text-decoration:none}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p,.item-complex.item-text-wrap .item-content,.item-text-wrap,.item-text-wrap .item,.item-text-wrap .item-content,.item-text-wrap h1,.item-text-wrap h2,.item-text-wrap h3,.item-text-wrap h4,.item-text-wrap h5,.item-text-wrap h6,.item-text-wrap p{overflow:visible;white-space:normal}.item-complex.item-text-wrap,.item-complex.item-text-wrap h1,.item-complex.item-text-wrap h2,.item-complex.item-text-wrap h3,.item-complex.item-text-wrap h4,.item-complex.item-text-wrap h5,.item-complex.item-text-wrap h6,.item-complex.item-text-wrap p{overflow:visible;white-space:normal}.item-complex.item-light>.item-content{border-color:#ddd;background-color:#fff;color:#444}.item-complex.item-light>.item-content.active,.item-complex.item-light>.item-content:active{border-color:#ccc;background-color:#fafafa}.item-complex.item-light>.item-content.active.item-complex>.item-content,.item-complex.item-light>.item-content:active.item-complex>.item-content{border-color:#ccc;background-color:#fafafa}.item-complex.item-stable>.item-content{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.item-complex.item-stable>.item-content.active,.item-complex.item-stable>.item-content:active{border-color:#a2a2a2;background-color:#e5e5e5}.item-complex.item-stable>.item-content.active.item-complex>.item-content,.item-complex.item-stable>.item-content:active.item-complex>.item-content{border-color:#a2a2a2;background-color:#e5e5e5}.item-complex.item-positive>.item-content{border-color:#0c60ee;background-color:#387ef5;color:#fff}.item-complex.item-positive>.item-content.active,.item-complex.item-positive>.item-content:active{border-color:#0c60ee;background-color:#0c60ee}.item-complex.item-positive>.item-content.active.item-complex>.item-content,.item-complex.item-positive>.item-content:active.item-complex>.item-content{border-color:#0c60ee;background-color:#0c60ee}.item-complex.item-calm>.item-content{border-color:#0a9dc7;background-color:#11c1f3;color:#fff}.item-complex.item-calm>.item-content.active,.item-complex.item-calm>.item-content:active{border-color:#0a9dc7;background-color:#0a9dc7}.item-complex.item-calm>.item-content.active.item-complex>.item-content,.item-complex.item-calm>.item-content:active.item-complex>.item-content{border-color:#0a9dc7;background-color:#0a9dc7}.item-complex.item-assertive>.item-content{border-color:#e42112;background-color:#ef473a;color:#fff}.item-complex.item-assertive>.item-content.active,.item-complex.item-assertive>.item-content:active{border-color:#e42112;background-color:#e42112}.item-complex.item-assertive>.item-content.active.item-complex>.item-content,.item-complex.item-assertive>.item-content:active.item-complex>.item-content{border-color:#e42112;background-color:#e42112}.item-complex.item-balanced>.item-content{border-color:#28a54c;background-color:#33cd5f;color:#fff}.item-complex.item-balanced>.item-content.active,.item-complex.item-balanced>.item-content:active{border-color:#28a54c;background-color:#28a54c}.item-complex.item-balanced>.item-content.active.item-complex>.item-content,.item-complex.item-balanced>.item-content:active.item-complex>.item-content{border-color:#28a54c;background-color:#28a54c}.item-complex.item-energized>.item-content{border-color:#e6b500;background-color:#ffc900;color:#fff}.item-complex.item-energized>.item-content.active,.item-complex.item-energized>.item-content:active{border-color:#e6b500;background-color:#e6b500}.item-complex.item-energized>.item-content.active.item-complex>.item-content,.item-complex.item-energized>.item-content:active.item-complex>.item-content{border-color:#e6b500;background-color:#e6b500}.item-complex.item-royal>.item-content{border-color:#6b46e5;background-color:#886aea;color:#fff}.item-complex.item-royal>.item-content.active,.item-complex.item-royal>.item-content:active{border-color:#6b46e5;background-color:#6b46e5}.item-complex.item-royal>.item-content.active.item-complex>.item-content,.item-complex.item-royal>.item-content:active.item-complex>.item-content{border-color:#6b46e5;background-color:#6b46e5}.item-complex.item-dark>.item-content{border-color:#111;background-color:#444;color:#fff}.item-complex.item-dark>.item-content.active,.item-complex.item-dark>.item-content:active{border-color:#000;background-color:#262626}.item-complex.item-dark>.item-content.active.item-complex>.item-content,.item-complex.item-dark>.item-content:active.item-complex>.item-content{border-color:#000;background-color:#262626}.item-icon-left .icon,.item-icon-right .icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-icon-left .icon:before,.item-icon-right .icon:before{display:block;width:32px;text-align:center}.item .fill-icon{min-width:30px;min-height:30px;font-size:28px}.item-icon-left{padding-left:54px}.item-icon-left .icon{left:11px}.item-complex.item-icon-left{padding-left:0}.item-complex.item-icon-left .item-content{padding-left:54px}.item-icon-right{padding-right:54px}.item-icon-right .icon{right:11px}.item-complex.item-icon-right{padding-right:0}.item-complex.item-icon-right .item-content{padding-right:54px}.item-icon-left.item-icon-right .icon:first-child{right:auto}.item-icon-left .item-delete .icon,.item-icon-left.item-icon-right .icon:last-child{left:auto}.item-icon-left .icon-accessory,.item-icon-right .icon-accessory{color:#ccc;font-size:16px}.item-icon-left .icon-accessory{left:3px}.item-icon-right .icon-accessory{right:3px}.item-button-left{padding-left:72px}.item-button-left .item-content>.button,.item-button-left>.button{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:8px;left:11px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-left .item-content>.button .icon:before,.item-button-left>.button .icon:before{position:relative;left:auto;width:auto;line-height:31px}.item-button-left .item-content>.button>.button,.item-button-left>.button>.button{margin:0 2px;min-height:34px;font-size:18px;line-height:32px}.item-button-right,a.item.item-button-right,button.item.item-button-right{padding-right:80px}.item-button-right .item-content>.button,.item-button-right .item-content>.buttons,.item-button-right>.button,.item-button-right>.buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:8px;right:16px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-right .item-content>.button .icon:before,.item-button-right .item-content>.buttons .icon:before,.item-button-right>.button .icon:before,.item-button-right>.buttons .icon:before{position:relative;left:auto;width:auto;line-height:31px}.item-button-right .item-content>.button>.button,.item-button-right .item-content>.buttons>.button,.item-button-right>.button>.button,.item-button-right>.buttons>.button{margin:0 2px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-left.item-button-right .button:first-child{right:auto}.item-button-left.item-button-right .button:last-child{left:auto}.item-avatar,.item-avatar .item-content,.item-avatar-left,.item-avatar-left .item-content{padding-left:72px;min-height:72px}.item-avatar .item-content .item-image,.item-avatar .item-content>img:first-child,.item-avatar .item-image,.item-avatar-left .item-content .item-image,.item-avatar-left .item-content>img:first-child,.item-avatar-left .item-image,.item-avatar-left>img:first-child,.item-avatar>img:first-child{position:absolute;top:16px;left:16px;max-width:40px;max-height:40px;width:100%;height:100%;border-radius:50%}.item-avatar-right,.item-avatar-right .item-content{padding-right:72px;min-height:72px}.item-avatar-right .item-content .item-image,.item-avatar-right .item-content>img:first-child,.item-avatar-right .item-image,.item-avatar-right>img:first-child{position:absolute;top:16px;right:16px;max-width:40px;max-height:40px;width:100%;height:100%;border-radius:50%}.item-thumbnail-left,.item-thumbnail-left .item-content{padding-top:8px;padding-left:106px;min-height:100px}.item-thumbnail-left .item-content .item-image,.item-thumbnail-left .item-content>img:first-child,.item-thumbnail-left .item-image,.item-thumbnail-left>img:first-child{position:absolute;top:10px;left:10px;max-width:80px;max-height:80px;width:100%;height:100%}.item-avatar-left.item-complex,.item-avatar.item-complex,.item-thumbnail-left.item-complex{padding-top:0;padding-left:0}.item-thumbnail-right,.item-thumbnail-right .item-content{padding-top:8px;padding-right:106px;min-height:100px}.item-thumbnail-right .item-content .item-image,.item-thumbnail-right .item-content>img:first-child,.item-thumbnail-right .item-image,.item-thumbnail-right>img:first-child{position:absolute;top:10px;right:10px;max-width:80px;max-height:80px;width:100%;height:100%}.item-avatar-right.item-complex,.item-thumbnail-right.item-complex{padding-top:0;padding-right:0}.item-image{padding:0;text-align:center}.item-image .list-img,.item-image img:first-child{width:100%;vertical-align:middle}.item-body{overflow:auto;padding:16px;text-overflow:inherit;white-space:normal}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p{margin-top:16px;margin-bottom:16px}.item-divider{padding-top:8px;padding-bottom:8px;min-height:30px;background-color:#f5f5f5;color:#222;font-weight:500}.item-divider-ios,.platform-ios .item-divider-platform{padding-top:26px;text-transform:uppercase;font-weight:300;font-size:13px;background-color:#efeff4;color:#555}.item-divider-android,.platform-android .item-divider-platform{font-weight:300;font-size:13px}.item-note{float:right;color:#aaa;font-size:14px}.item-left-editable .item-content,.item-right-editable .item-content{-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;transition-property:transform}.item-left-editing.item-left-editable .item-content,.list-left-editing .item-left-editable .item-content{-webkit-transform:translate3d(50px,0,0);transform:translate3d(50px,0,0)}.item-remove-animate.ng-leave{-webkit-transition-duration:.3s;transition-duration:.3s}.item-remove-animate.ng-leave .item-content,.item-remove-animate.ng-leave:last-of-type{-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-property:all;transition-property:all}.item-remove-animate.ng-leave.ng-leave-active .item-content{opacity:0;-webkit-transform:translate3d(-100%,0,0)!important;transform:translate3d(-100%,0,0)!important}.item-remove-animate.ng-leave.ng-leave-active:last-of-type{opacity:0}.item-remove-animate.ng-leave.ng-leave-active~ion-item:not(.ng-leave){-webkit-transform:translate3d(0,-webkit-calc(-100% + 1px),0);transform:translate3d(0,calc(-100% + 1px),0);-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-timing-function:cubic-bezier(.25,.81,.24,1);transition-timing-function:cubic-bezier(.25,.81,.24,1);-webkit-transition-property:all;transition-property:all}.item-left-edit{-webkit-transition:all ease-in-out 125ms;transition:all ease-in-out 125ms;position:absolute;top:0;left:0;z-index:0;width:50px;height:100%;line-height:100%;display:none;opacity:0;-webkit-transform:translate3d(-21px,0,0);transform:translate3d(-21px,0,0)}.item-left-edit .button{height:100%}.item-left-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%}.item-left-edit.visible{display:block}.item-left-edit.visible.active{opacity:1;-webkit-transform:translate3d(8px,0,0);transform:translate3d(8px,0,0)}.list-left-editing .item-left-edit{-webkit-transition-delay:125ms;transition-delay:125ms}.item-delete .button.icon{color:#ef473a;font-size:24px}.item-delete .button.icon:hover{opacity:.7}.item-right-edit{-webkit-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:0;z-index:3;width:75px;height:100%;background:inherit;padding-left:20px;display:block;opacity:0;-webkit-transform:translate3d(75px,0,0);transform:translate3d(75px,0,0)}.item-right-edit .button{min-width:50px;height:100%}.item-right-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-right-edit.visible{display:block}.item-right-edit.visible.active{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.item-reorder .button.icon{color:#444;font-size:32px}.item-reordering{position:absolute;left:0;top:0;z-index:9;width:100%;box-shadow:0 0 10px 0 #aaa}.item-reordering .item-reorder{z-index:9}.item-placeholder{opacity:.7}.item-options{position:absolute;top:0;right:0;z-index:1;height:100%}.item-options .button{height:100%;border:none;border-radius:0;display:-webkit-inline-box;display:-webkit-inline-flex;display:-moz-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.item-options .button:before{margin:0 auto}.item-options ion-option-button:last-child{padding-right:calc(constant(safe-area-inset-right) + 12px);padding-right:calc(env(safe-area-inset-right) + 12px)}.list{position:relative;padding-top:1px;padding-bottom:1px;padding-left:0;margin-bottom:20px}.list:last-child{margin-bottom:0}.list:last-child.card{margin-bottom:40px}.list-header{margin-top:20px;padding:5px 15px;background-color:transparent;color:#222;font-weight:700}.card.list .list-item{padding-right:1px;padding-left:1px}.card,.list-inset{overflow:hidden;margin:20px 10px;border-radius:2px;background-color:#fff}.card{padding-top:1px;padding-bottom:1px;box-shadow:0 1px 3px rgba(0,0,0,.3)}.card .item{border-left:0;border-right:0}.card .item:first-child{border-top:0}.card .item:last-child{border-bottom:0}.padding .card,.padding .list-inset{margin-left:0;margin-right:0}.card .item:first-child,.list-inset .item:first-child,.padding>.list .item:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.card .item:first-child .item-content,.list-inset .item:first-child .item-content,.padding>.list .item:first-child .item-content{border-top-left-radius:2px;border-top-right-radius:2px}.card .item:last-child,.list-inset .item:last-child,.padding>.list .item:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.card .item:last-child .item-content,.list-inset .item:last-child .item-content,.padding>.list .item:last-child .item-content{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.card .item:last-child,.list-inset .item:last-child{margin-bottom:-1px}.card .item,.list-inset .item,.padding-horizontal>.list .item,.padding>.list .item{margin-right:0;margin-left:0}.card .item.item-input input,.list-inset .item.item-input input,.padding-horizontal>.list .item.item-input input,.padding>.list .item.item-input input{padding-right:44px}.padding-left>.list .item{margin-left:0}.padding-right>.list .item{margin-right:0}.badge{background-color:transparent;color:#aaa;z-index:1;display:inline-block;padding:3px 8px;min-width:10px;border-radius:10px;vertical-align:baseline;text-align:center;white-space:nowrap;font-weight:700;font-size:14px;line-height:16px}.badge:empty{display:none}.badge.badge-light,.tabs .tab-item .badge.badge-light{background-color:#fff;color:#444}.badge.badge-stable,.tabs .tab-item .badge.badge-stable{background-color:#f8f8f8;color:#444}.badge.badge-positive,.tabs .tab-item .badge.badge-positive{background-color:#387ef5;color:#fff}.badge.badge-calm,.tabs .tab-item .badge.badge-calm{background-color:#11c1f3;color:#fff}.badge.badge-assertive,.tabs .tab-item .badge.badge-assertive{background-color:#ef473a;color:#fff}.badge.badge-balanced,.tabs .tab-item .badge.badge-balanced{background-color:#33cd5f;color:#fff}.badge.badge-energized,.tabs .tab-item .badge.badge-energized{background-color:#ffc900;color:#fff}.badge.badge-royal,.tabs .tab-item .badge.badge-royal{background-color:#886aea;color:#fff}.badge.badge-dark,.tabs .tab-item .badge.badge-dark{background-color:#444;color:#fff}.button .badge{position:relative;top:-1px}.slider{position:relative;visibility:hidden;overflow:hidden}.slider-slides{position:relative;height:100%}.slider-slide{position:relative;display:block;float:left;width:100%;height:100%;vertical-align:top}.slider-slide-image>img{width:100%}.slider-pager{position:absolute;bottom:20px;z-index:1;width:100%;height:15px;text-align:center}.slider-pager .slider-pager-page{display:inline-block;margin:0 3px;width:15px;color:#000;text-decoration:none;opacity:.3}.slider-pager .slider-pager-page.active{-webkit-transition:opacity .4s ease-in;transition:opacity .4s ease-in;opacity:1}.slider-pager-page.ng-animate,.slider-pager-page.ng-enter,.slider-pager-page.ng-leave,.slider-slide.ng-animate,.slider-slide.ng-enter,.slider-slide.ng-leave{-webkit-transition:none!important;transition:none!important}.slider-pager-page.ng-animate,.slider-slide.ng-animate{-webkit-animation:none 0s;animation:none 0s}.swiper-container{margin:0 auto;position:relative;overflow:hidden;z-index:1}.swiper-container-no-flexbox .swiper-slide{float:left}.swiper-container-vertical>.swiper-wrapper{-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate(0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.swiper-container-multirow>.swiper-wrapper{-webkit-box-lines:multiple;-moz-box-lines:multiple;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.swiper-container-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{display:block;-webkit-flex-shrink:0;-ms-flex:0 0 auto;flex-shrink:0;width:100%;height:100%;position:relative}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start;-webkit-transition-property:-webkit-transform,height;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform,height}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-wp8-horizontal{-ms-touch-action:pan-y;touch-action:pan-y}.swiper-wp8-vertical{-ms-touch-action:pan-x;touch-action:pan-x}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:27px;height:44px;margin-top:-22px;z-index:10;cursor:pointer;-moz-background-size:27px 44px;-webkit-background-size:27px 44px;background-size:27px 44px;background-position:center;background-repeat:no-repeat}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");left:10px;right:auto}.swiper-button-prev.swiper-button-black,.swiper-container-rtl .swiper-button-next.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-prev.swiper-button-white,.swiper-container-rtl .swiper-button-next.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");right:10px;left:auto}.swiper-button-next.swiper-button-black,.swiper-container-rtl .swiper-button-prev.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-white,.swiper-container-rtl .swiper-button-prev.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-pagination{position:absolute;text-align:center;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;transition:.3s;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-white .swiper-pagination-bullet{background:#fff}.swiper-pagination-bullet-active{opacity:1}.swiper-pagination-white .swiper-pagination-bullet-active{background:#fff}.swiper-pagination-black .swiper-pagination-bullet-active{background:#000}.swiper-container-vertical>.swiper-pagination{right:10px;top:50%;-webkit-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-o-transform:translate(0,-50%);-ms-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination .swiper-pagination-bullet{margin:5px 0;display:block}.swiper-container-horizontal>.swiper-pagination{bottom:10px;left:0;width:100%}.swiper-container-horizontal>.swiper-pagination .swiper-pagination-bullet{margin:0 5px}.swiper-container-3d{-webkit-perspective:1200px;-moz-perspective:1200px;-o-perspective:1200px;perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to left,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-right{background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to right,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-top{background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to top,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to bottom,rgba(0,0,0,.5),transparent)}.swiper-container-coverflow .swiper-wrapper{-ms-perspective:1200px}.swiper-container-fade.swiper-container-free-mode .swiper-slide{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}.swiper-container-fade .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube{overflow:visible}.swiper-container-cube .swiper-slide{pointer-events:none;visibility:hidden;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;width:100%;height:100%;z-index:1}.swiper-container-cube.swiper-container-rtl .swiper-slide{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;-webkit-filter:blur(50px);filter:blur(50px);z-index:0}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;-webkit-transform-origin:50%;-moz-transform-origin:50%;transform-origin:50%;-webkit-animation:swiper-preloader-spin 1s steps(12,end) infinite;-moz-animation:swiper-preloader-spin 1s steps(12,end) infinite;animation:swiper-preloader-spin 1s steps(12,end) infinite}.swiper-lazy-preloader:after{display:block;content:"";width:100%;height:100%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:50%;-webkit-background-size:100%;background-size:100%;background-repeat:no-repeat}.swiper-lazy-preloader-white:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}@-webkit-keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes swiper-preloader-spin{100%{transform:rotate(360deg)}}ion-slides{width:100%;height:100%;display:block}.slide-zoom{display:block;width:100%;text-align:center}.swiper-container{width:100%;height:100%;padding:0;overflow:hidden}.swiper-wrapper{position:absolute;left:0;top:0;width:100%;height:100%;padding:0}.swiper-slide{width:100%;height:100%;box-sizing:border-box}.swiper-slide img{width:auto;height:auto;max-width:100%;max-height:100%}.scroll-refresher{position:absolute;top:-60px;right:0;left:0;overflow:hidden;margin:auto;height:60px}.scroll-refresher .ionic-refresher-content{position:absolute;bottom:15px;left:0;width:100%;color:#666;text-align:center;font-size:30px}.scroll-refresher .ionic-refresher-content .text-pulling,.scroll-refresher .ionic-refresher-content .text-refreshing{font-size:16px;line-height:16px}.scroll-refresher .ionic-refresher-content.ionic-refresher-with-text{bottom:10px}.scroll-refresher .icon-pulling,.scroll-refresher .icon-refreshing{width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.scroll-refresher .icon-pulling{-webkit-animation-name:refresh-spin-back;animation-name:refresh-spin-back;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:none;animation-fill-mode:none;-webkit-transform:translate3d(0,0,0) rotate(0);transform:translate3d(0,0,0) rotate(0)}.scroll-refresher .icon-refreshing,.scroll-refresher .text-refreshing{display:none}.scroll-refresher .icon-refreshing{-webkit-animation-duration:1.5s;animation-duration:1.5s}.scroll-refresher.active .icon-pulling:not(.pulling-rotation-disabled){-webkit-animation-name:refresh-spin;animation-name:refresh-spin;-webkit-transform:translate3d(0,0,0) rotate(-180deg);transform:translate3d(0,0,0) rotate(-180deg)}.scroll-refresher.active.refreshing{-webkit-transition:-webkit-transform .2s;transition:-webkit-transform .2s;-webkit-transition:transform .2s;transition:transform .2s;-webkit-transform:scale(1,1);transform:scale(1,1)}.scroll-refresher.active.refreshing .icon-pulling,.scroll-refresher.active.refreshing .text-pulling{display:none}.scroll-refresher.active.refreshing .icon-refreshing,.scroll-refresher.active.refreshing .text-refreshing{display:block}.scroll-refresher.active.refreshing.refreshing-tail{-webkit-transform:scale(0,0);transform:scale(0,0)}.overflow-scroll>.scroll{-webkit-overflow-scrolling:touch;width:100%}.overflow-scroll>.scroll.overscroll{position:fixed;right:0;left:0}.overflow-scroll.padding>.scroll.overscroll{padding:10px}@-webkit-keyframes refresh-spin{0%{-webkit-transform:translate3d(0,0,0) rotate(0)}100%{-webkit-transform:translate3d(0,0,0) rotate(180deg)}}@keyframes refresh-spin{0%{transform:translate3d(0,0,0) rotate(0)}100%{transform:translate3d(0,0,0) rotate(180deg)}}@-webkit-keyframes refresh-spin-back{0%{-webkit-transform:translate3d(0,0,0) rotate(180deg)}100%{-webkit-transform:translate3d(0,0,0) rotate(0)}}@keyframes refresh-spin-back{0%{transform:translate3d(0,0,0) rotate(180deg)}100%{transform:translate3d(0,0,0) rotate(0)}}.spinner{stroke:#444;fill:#444}.spinner svg{width:28px;height:28px}.spinner.spinner-light{stroke:#fff;fill:#fff}.spinner.spinner-stable{stroke:#f8f8f8;fill:#f8f8f8}.spinner.spinner-positive{stroke:#387ef5;fill:#387ef5}.spinner.spinner-calm{stroke:#11c1f3;fill:#11c1f3}.spinner.spinner-balanced{stroke:#33cd5f;fill:#33cd5f}.spinner.spinner-assertive{stroke:#ef473a;fill:#ef473a}.spinner.spinner-energized{stroke:#ffc900;fill:#ffc900}.spinner.spinner-royal{stroke:#886aea;fill:#886aea}.spinner.spinner-dark{stroke:#444;fill:#444}.spinner-android{stroke:#4b8bf4}.spinner-ios,.spinner-ios-small{stroke:#69717d}.spinner-spiral .stop1{stop-color:#fff;stop-opacity:0}.spinner-spiral.spinner-light .stop1{stop-color:#444}.spinner-spiral.spinner-light .stop2{stop-color:#fff}.spinner-spiral.spinner-stable .stop2{stop-color:#f8f8f8}.spinner-spiral.spinner-positive .stop2{stop-color:#387ef5}.spinner-spiral.spinner-calm .stop2{stop-color:#11c1f3}.spinner-spiral.spinner-balanced .stop2{stop-color:#33cd5f}.spinner-spiral.spinner-assertive .stop2{stop-color:#ef473a}.spinner-spiral.spinner-energized .stop2{stop-color:#ffc900}.spinner-spiral.spinner-royal .stop2{stop-color:#886aea}.spinner-spiral.spinner-dark .stop2{stop-color:#444}form{margin:0 0 1.42857}legend{display:block;margin-bottom:1.42857;padding:0;width:100%;border:1px solid #ddd;color:#444;font-size:21px;line-height:2.85714}legend small{color:#f8f8f8;font-size:1.07143}button,input,label,select,textarea{font-weight:400;font-size:14px;line-height:1.42857}button,input,select,textarea{font-family:-apple-system,Roboto,Noto,"Helvetica Neue",sans-serif}.item-input{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:6px 0 5px 16px}.item-input input{-webkit-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 220px;-moz-box-flex:1;-moz-flex:1 220px;-ms-flex:1 220px;flex:1 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;padding-right:24px;background-color:transparent}.item-input .button .icon{-webkit-box-flex:0;-webkit-flex:0 0 24px;-moz-box-flex:0;-moz-flex:0 0 24px;-ms-flex:0 0 24px;flex:0 0 24px;position:static;display:inline-block;height:auto;text-align:center;font-size:16px}.item-input .button-bar{-webkit-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 0 220px;-moz-box-flex:1;-moz-flex:1 0 220px;-ms-flex:1 0 220px;flex:1 0 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.item-input .icon{min-width:14px}.platform-windowsphone .item-input input{flex-shrink:1}.item-input-inset{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:10.66667px}.item-input-wrapper{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0;-moz-box-flex:1;-moz-flex:1 0;-ms-flex:1 0;flex:1 0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-border-radius:4px;border-radius:4px;padding-right:8px;padding-left:8px;background:#eee}.item-input-inset .item-input-wrapper input{padding-left:4px;height:29px;background:0 0;line-height:18px}.item-input-wrapper~.button{margin-left:10.66667px}.input-label{display:table;padding:7px 10px 7px 0;max-width:200px;width:35%;color:#444;font-size:16px}.placeholder-icon{color:#aaa}.placeholder-icon:first-child{padding-right:6px}.placeholder-icon:last-child{padding-left:6px}.item-stacked-label{display:block;background-color:transparent;box-shadow:none}.item-stacked-label .icon,.item-stacked-label .input-label{display:inline-block;padding:4px 0 0 0;vertical-align:middle}.item-stacked-label input,.item-stacked-label textarea{-webkit-border-radius:2px;border-radius:2px;padding:4px 8px 3px 0;border:none;background-color:#fff}.item-stacked-label input{overflow:hidden;height:46px}.item-select.item-stacked-label select{position:relative;padding:0;max-width:90%;direction:ltr;white-space:pre-wrap;margin:-3px}.item-floating-label{display:block;background-color:transparent;box-shadow:none}.item-floating-label .input-label{position:relative;padding:5px 0 0 0;opacity:0;top:10px;-webkit-transition:opacity .15s ease-in,top .2s linear;transition:opacity .15s ease-in,top .2s linear}.item-floating-label .input-label.has-input{opacity:1;top:0;-webkit-transition:opacity .15s ease-in,top .2s linear;transition:opacity .15s ease-in,top .2s linear}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{display:block;padding-top:2px;padding-left:0;height:34px;color:#111;vertical-align:middle;font-size:14px;line-height:16px}.platform-android input[type=date],.platform-android input[type=datetime-local],.platform-android input[type=month],.platform-android input[type=time],.platform-android input[type=week],.platform-ios input[type=date],.platform-ios input[type=datetime-local],.platform-ios input[type=month],.platform-ios input[type=time],.platform-ios input[type=week]{padding-top:8px}.item-input input,.item-input textarea{width:100%}textarea{padding-left:0}textarea::-moz-placeholder{color:#aaa}textarea:-ms-input-placeholder{color:#aaa}textarea::-webkit-input-placeholder{color:#aaa;text-indent:-3px}textarea{height:auto}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{border:0}input[type=checkbox],input[type=radio]{margin:0;line-height:normal}.item-input input[type=button],.item-input input[type=checkbox],.item-input input[type=file],.item-input input[type=image],.item-input input[type=radio],.item-input input[type=reset],.item-input input[type=submit]{width:auto}input[type=file]{line-height:34px}.cloned-text-input+input,.cloned-text-input+textarea,.previous-input-focus{position:absolute!important;left:-9999px;width:200px}input::-moz-placeholder,textarea::-moz-placeholder{color:#aaa}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#aaa}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#aaa;text-indent:0}input[disabled],input[readonly]:not(.cloned-text-input),select[disabled],select[readonly],textarea[disabled],textarea[readonly]:not(.cloned-text-input){background-color:#f8f8f8;cursor:not-allowed}input[type=checkbox][disabled],input[type=checkbox][readonly],input[type=radio][disabled],input[type=radio][readonly]{background-color:transparent}.checkbox{position:relative;display:inline-block;padding:7px 7px;cursor:pointer}.checkbox .checkbox-icon:before,.checkbox input:before{border-color:#ddd}.checkbox input:checked+.checkbox-icon:before,.checkbox input:checked:before{background:#387ef5;border-color:#387ef5}.checkbox-light .checkbox-icon:before,.checkbox-light input:before{border-color:#ddd}.checkbox-light input:checked+.checkbox-icon:before,.checkbox-light input:checked:before{background:#ddd;border-color:#ddd}.checkbox-stable .checkbox-icon:before,.checkbox-stable input:before{border-color:#b2b2b2}.checkbox-stable input:checked+.checkbox-icon:before,.checkbox-stable input:checked:before{background:#b2b2b2;border-color:#b2b2b2}.checkbox-positive .checkbox-icon:before,.checkbox-positive input:before{border-color:#387ef5}.checkbox-positive input:checked+.checkbox-icon:before,.checkbox-positive input:checked:before{background:#387ef5;border-color:#387ef5}.checkbox-calm .checkbox-icon:before,.checkbox-calm input:before{border-color:#11c1f3}.checkbox-calm input:checked+.checkbox-icon:before,.checkbox-calm input:checked:before{background:#11c1f3;border-color:#11c1f3}.checkbox-assertive .checkbox-icon:before,.checkbox-assertive input:before{border-color:#ef473a}.checkbox-assertive input:checked+.checkbox-icon:before,.checkbox-assertive input:checked:before{background:#ef473a;border-color:#ef473a}.checkbox-balanced .checkbox-icon:before,.checkbox-balanced input:before{border-color:#33cd5f}.checkbox-balanced input:checked+.checkbox-icon:before,.checkbox-balanced input:checked:before{background:#33cd5f;border-color:#33cd5f}.checkbox-energized .checkbox-icon:before,.checkbox-energized input:before{border-color:#ffc900}.checkbox-energized input:checked+.checkbox-icon:before,.checkbox-energized input:checked:before{background:#ffc900;border-color:#ffc900}.checkbox-royal .checkbox-icon:before,.checkbox-royal input:before{border-color:#886aea}.checkbox-royal input:checked+.checkbox-icon:before,.checkbox-royal input:checked:before{background:#886aea;border-color:#886aea}.checkbox-dark .checkbox-icon:before,.checkbox-dark input:before{border-color:#444}.checkbox-dark input:checked+.checkbox-icon:before,.checkbox-dark input:checked:before{background:#444;border-color:#444}.checkbox input:disabled+.checkbox-icon:before,.checkbox input:disabled:before{border-color:#ddd}.checkbox input:disabled:checked+.checkbox-icon:before,.checkbox input:disabled:checked:before{background:#ddd}.checkbox.checkbox-input-hidden input{display:none!important}.checkbox input,.checkbox-icon{position:relative;width:28px;height:28px;display:block;border:0;background:0 0;cursor:pointer;-webkit-appearance:none}.checkbox input:before,.checkbox-icon:before{display:table;width:100%;height:100%;border-width:1px;border-style:solid;border-radius:28px;background:#fff;content:' ';-webkit-transition:background-color 20ms ease-in-out;transition:background-color 20ms ease-in-out}.checkbox input:checked:before,input:checked+.checkbox-icon:before{border-width:2px}.checkbox input:after,.checkbox-icon:after{-webkit-transition:opacity 50ms ease-in-out;transition:opacity 50ms ease-in-out;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);position:absolute;top:33%;left:25%;display:table;width:14px;height:6px;border:1px solid #fff;border-top:0;border-right:0;content:' ';opacity:0}.checkbox-square .checkbox-icon:before,.checkbox-square input:before,.platform-android .checkbox-platform .checkbox-icon:before,.platform-android .checkbox-platform input:before{border-radius:2px;width:72%;height:72%;margin-top:14%;margin-left:14%;border-width:2px}.checkbox-square .checkbox-icon:after,.checkbox-square input:after,.platform-android .checkbox-platform .checkbox-icon:after,.platform-android .checkbox-platform input:after{border-width:2px;top:19%;left:25%;width:13px;height:7px}.platform-android .item-checkbox-right .checkbox-square .checkbox-icon::after{top:31%}.grade-c .checkbox input:after,.grade-c .checkbox-icon:after{-webkit-transform:rotate(0);transform:rotate(0);top:3px;left:4px;border:none;color:#fff;content:'\2713';font-weight:700;font-size:20px}.checkbox input:checked:after,input:checked+.checkbox-icon:after{opacity:1}.item-checkbox{padding-left:60px}.item-checkbox.active{box-shadow:none}.item-checkbox .checkbox{position:absolute;top:50%;right:8px;left:8px;z-index:3;margin-top:-21px}.item-checkbox.item-checkbox-right{padding-right:60px;padding-left:16px}.item-checkbox-right .checkbox input,.item-checkbox-right .checkbox-icon{float:right}.item-toggle{pointer-events:none}.toggle{position:relative;display:inline-block;pointer-events:auto;margin:-5px;padding:5px}.toggle input:checked+.track{border-color:#4cd964;background-color:#4cd964}.toggle.dragging .handle{background-color:#f2f2f2!important}.toggle.toggle-light input:checked+.track{border-color:#ddd;background-color:#ddd}.toggle.toggle-stable input:checked+.track{border-color:#b2b2b2;background-color:#b2b2b2}.toggle.toggle-positive input:checked+.track{border-color:#387ef5;background-color:#387ef5}.toggle.toggle-calm input:checked+.track{border-color:#11c1f3;background-color:#11c1f3}.toggle.toggle-assertive input:checked+.track{border-color:#ef473a;background-color:#ef473a}.toggle.toggle-balanced input:checked+.track{border-color:#33cd5f;background-color:#33cd5f}.toggle.toggle-energized input:checked+.track{border-color:#ffc900;background-color:#ffc900}.toggle.toggle-royal input:checked+.track{border-color:#886aea;background-color:#886aea}.toggle.toggle-dark input:checked+.track{border-color:#444;background-color:#444}.toggle input{display:none}.toggle .track{-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-property:background-color,border;transition-property:background-color,border;display:inline-block;box-sizing:border-box;width:51px;height:31px;border:solid 2px #e6e6e6;border-radius:20px;background-color:#fff;content:' ';cursor:pointer;pointer-events:none}.platform-android4_2 .toggle .track{-webkit-background-clip:padding-box}.toggle .handle{-webkit-transition:.3s cubic-bezier(0,1.1,1,1.1);transition:.3s cubic-bezier(0,1.1,1,1.1);-webkit-transition-property:background-color,transform;transition-property:background-color,transform;position:absolute;display:block;width:27px;height:27px;border-radius:27px;background-color:#fff;top:7px;left:7px;box-shadow:0 2px 7px rgba(0,0,0,.35),0 1px 1px rgba(0,0,0,.15)}.toggle .handle:before{position:absolute;top:-4px;left:-21.5px;padding:18.5px 34px;content:" "}.toggle input:checked+.track .handle{-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0);background-color:#fff}.item-toggle.active{box-shadow:none}.item-toggle,.item-toggle.item-complex .item-content{padding-right:99px}.item-toggle.item-complex{padding-right:0}.item-toggle .toggle{position:absolute;top:10px;right:16px;z-index:3}.toggle input:disabled+.track{opacity:.6}.toggle-small .track{border:0;width:34px;height:15px;background:#9e9e9e}.toggle-small input:checked+.track{background:rgba(0,150,137,.5)}.toggle-small .handle{top:2px;left:4px;width:21px;height:21px;box-shadow:0 2px 5px rgba(0,0,0,.25)}.toggle-small input:checked+.track .handle{-webkit-transform:translate3d(16px,0,0);transform:translate3d(16px,0,0);background:#009689}.toggle-small.item-toggle .toggle{top:19px}.toggle-small .toggle-light input:checked+.track{background-color:rgba(221,221,221,.5)}.toggle-small .toggle-light input:checked+.track .handle{background-color:#ddd}.toggle-small .toggle-stable input:checked+.track{background-color:rgba(178,178,178,.5)}.toggle-small .toggle-stable input:checked+.track .handle{background-color:#b2b2b2}.toggle-small .toggle-positive input:checked+.track{background-color:rgba(56,126,245,.5)}.toggle-small .toggle-positive input:checked+.track .handle{background-color:#387ef5}.toggle-small .toggle-calm input:checked+.track{background-color:rgba(17,193,243,.5)}.toggle-small .toggle-calm input:checked+.track .handle{background-color:#11c1f3}.toggle-small .toggle-assertive input:checked+.track{background-color:rgba(239,71,58,.5)}.toggle-small .toggle-assertive input:checked+.track .handle{background-color:#ef473a}.toggle-small .toggle-balanced input:checked+.track{background-color:rgba(51,205,95,.5)}.toggle-small .toggle-balanced input:checked+.track .handle{background-color:#33cd5f}.toggle-small .toggle-energized input:checked+.track{background-color:rgba(255,201,0,.5)}.toggle-small .toggle-energized input:checked+.track .handle{background-color:#ffc900}.toggle-small .toggle-royal input:checked+.track{background-color:rgba(136,106,234,.5)}.toggle-small .toggle-royal input:checked+.track .handle{background-color:#886aea}.toggle-small .toggle-dark input:checked+.track{background-color:rgba(68,68,68,.5)}.toggle-small .toggle-dark input:checked+.track .handle{background-color:#444}.item-radio{padding:0}.item-radio:hover{cursor:pointer}.item-radio .item-content{padding-right:64px}.item-radio .radio-icon{position:absolute;top:0;right:0;z-index:3;visibility:hidden;padding:14px;height:100%;font-size:24px}.item-radio input{position:absolute;left:-9999px}.item-radio input:checked+.radio-content .item-content{background:#f7f7f7}.item-radio input:checked+.radio-content .radio-icon{visibility:visible}.range input{display:inline-block;overflow:hidden;margin-top:5px;margin-bottom:5px;padding-right:2px;padding-left:1px;width:auto;height:43px;outline:0;background:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0,#ccc),color-stop(100%,#ccc));background:linear-gradient(to right,#ccc 0,#ccc 100%);background-position:center;background-size:99% 2px;background-repeat:no-repeat;-webkit-appearance:none}.range input::-moz-focus-outer{border:0}.range input::-webkit-slider-thumb{position:relative;width:28px;height:28px;border-radius:50%;background-color:#fff;box-shadow:0 0 2px rgba(0,0,0,.3),0 3px 5px rgba(0,0,0,.2);cursor:pointer;-webkit-appearance:none;border:0}.range input::-webkit-slider-thumb:before{position:absolute;top:13px;left:-2001px;width:2000px;height:2px;background:#444;content:' '}.range input::-webkit-slider-thumb:after{position:absolute;top:-15px;left:-15px;padding:30px;content:' '}.range input::-ms-fill-lower{height:2px;background:#444}.range{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;padding:2px 11px}.range.range-light input::-webkit-slider-thumb:before{background:#ddd}.range.range-light input::-ms-fill-lower{background:#ddd}.range.range-stable input::-webkit-slider-thumb:before{background:#b2b2b2}.range.range-stable input::-ms-fill-lower{background:#b2b2b2}.range.range-positive input::-webkit-slider-thumb:before{background:#387ef5}.range.range-positive input::-ms-fill-lower{background:#387ef5}.range.range-calm input::-webkit-slider-thumb:before{background:#11c1f3}.range.range-calm input::-ms-fill-lower{background:#11c1f3}.range.range-balanced input::-webkit-slider-thumb:before{background:#33cd5f}.range.range-balanced input::-ms-fill-lower{background:#33cd5f}.range.range-assertive input::-webkit-slider-thumb:before{background:#ef473a}.range.range-assertive input::-ms-fill-lower{background:#ef473a}.range.range-energized input::-webkit-slider-thumb:before{background:#ffc900}.range.range-energized input::-ms-fill-lower{background:#ffc900}.range.range-royal input::-webkit-slider-thumb:before{background:#886aea}.range.range-royal input::-ms-fill-lower{background:#886aea}.range.range-dark input::-webkit-slider-thumb:before{background:#444}.range.range-dark input::-ms-fill-lower{background:#444}.range .icon{-webkit-box-flex:0;-webkit-flex:0;-moz-box-flex:0;-moz-flex:0;-ms-flex:0;flex:0;display:block;min-width:24px;text-align:center;font-size:24px}.range input{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;margin-right:10px;margin-left:10px}.range-label{-webkit-box-flex:0;-webkit-flex:0 0 auto;-moz-box-flex:0;-moz-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;display:block;white-space:nowrap}.range-label:first-child{padding-left:5px}.range input+.range-label{padding-right:5px;padding-left:0}.platform-windowsphone .range input{height:auto}.item-select{position:relative}.item-select select{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;top:0;bottom:0;right:0;padding:0 48px 0 16px;max-width:65%;border:none;background:#fff;color:#333;text-indent:.01px;text-overflow:'';white-space:nowrap;font-size:14px;cursor:pointer;direction:rtl}.item-select select::-ms-expand{display:none}.item-select option{direction:ltr}.item-select:after{position:absolute;top:50%;right:16px;margin-top:-3px;width:0;height:0;border-top:5px solid;border-right:5px solid transparent;border-left:5px solid transparent;color:#999;content:"";pointer-events:none}.item-select.item-light select{background:#fff;color:#444}.item-select.item-stable select{background:#f8f8f8;color:#444}.item-select.item-stable .input-label,.item-select.item-stable:after{color:#666}.item-select.item-positive select{background:#387ef5;color:#fff}.item-select.item-positive .input-label,.item-select.item-positive:after{color:#fff}.item-select.item-calm select{background:#11c1f3;color:#fff}.item-select.item-calm .input-label,.item-select.item-calm:after{color:#fff}.item-select.item-assertive select{background:#ef473a;color:#fff}.item-select.item-assertive .input-label,.item-select.item-assertive:after{color:#fff}.item-select.item-balanced select{background:#33cd5f;color:#fff}.item-select.item-balanced .input-label,.item-select.item-balanced:after{color:#fff}.item-select.item-energized select{background:#ffc900;color:#fff}.item-select.item-energized .input-label,.item-select.item-energized:after{color:#fff}.item-select.item-royal select{background:#886aea;color:#fff}.item-select.item-royal .input-label,.item-select.item-royal:after{color:#fff}.item-select.item-dark select{background:#444;color:#fff}.item-select.item-dark .input-label,.item-select.item-dark:after{color:#fff}select[multiple],select[size]{height:auto}progress{display:block;margin:15px auto;width:100%}.button{border-color:transparent;background-color:#f8f8f8;color:#444;position:relative;display:inline-block;margin:0;padding:0 12px;min-width:52px;min-height:47px;border-width:1px;border-style:solid;border-radius:4px;vertical-align:top;text-align:center;text-overflow:ellipsis;font-size:16px;line-height:42px;cursor:pointer}.button:hover{color:#444;text-decoration:none}.button.activated,.button.active{border-color:#a2a2a2;background-color:#e5e5e5}.button:after{position:absolute;top:-6px;right:-6px;bottom:-6px;left:-6px;content:' '}.button .icon{vertical-align:top;pointer-events:none}.button .icon:before,.button.icon-left:before,.button.icon-right:before,.button.icon:before{display:inline-block;padding:0 0 1px 0;vertical-align:inherit;font-size:24px;line-height:41px;pointer-events:none}.button.icon-left:before{float:left;padding-right:.2em;padding-left:0}.button.icon-right:before{float:right;padding-right:0;padding-left:.2em}.button.button-block,.button.button-full{margin-top:10px;margin-bottom:10px}.button.button-light{border-color:transparent;background-color:#fff;color:#444}.button.button-light:hover{color:#444;text-decoration:none}.button.button-light.activated,.button.button-light.active{border-color:#a2a2a2;background-color:#fafafa}.button.button-light.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ddd}.button.button-light.button-icon{border-color:transparent;background:0 0}.button.button-light.button-outline{border-color:#ddd;background:0 0;color:#ddd}.button.button-light.button-outline.activated,.button.button-light.button-outline.active{background-color:#ddd;box-shadow:none;color:#fff}.button.button-stable{border-color:transparent;background-color:#f8f8f8;color:#444}.button.button-stable:hover{color:#444;text-decoration:none}.button.button-stable.activated,.button.button-stable.active{border-color:#a2a2a2;background-color:#e5e5e5}.button.button-stable.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#b2b2b2}.button.button-stable.button-icon{border-color:transparent;background:0 0}.button.button-stable.button-outline{border-color:#b2b2b2;background:0 0;color:#b2b2b2}.button.button-stable.button-outline.activated,.button.button-stable.button-outline.active{background-color:#b2b2b2;box-shadow:none;color:#fff}.button.button-positive{border-color:transparent;background-color:#387ef5;color:#fff}.button.button-positive:hover{color:#fff;text-decoration:none}.button.button-positive.activated,.button.button-positive.active{border-color:#a2a2a2;background-color:#0c60ee}.button.button-positive.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#387ef5}.button.button-positive.button-icon{border-color:transparent;background:0 0}.button.button-positive.button-outline{border-color:#387ef5;background:0 0;color:#387ef5}.button.button-positive.button-outline.activated,.button.button-positive.button-outline.active{background-color:#387ef5;box-shadow:none;color:#fff}.button.button-calm{border-color:transparent;background-color:#11c1f3;color:#fff}.button.button-calm:hover{color:#fff;text-decoration:none}.button.button-calm.activated,.button.button-calm.active{border-color:#a2a2a2;background-color:#0a9dc7}.button.button-calm.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#11c1f3}.button.button-calm.button-icon{border-color:transparent;background:0 0}.button.button-calm.button-outline{border-color:#11c1f3;background:0 0;color:#11c1f3}.button.button-calm.button-outline.activated,.button.button-calm.button-outline.active{background-color:#11c1f3;box-shadow:none;color:#fff}.button.button-assertive{border-color:transparent;background-color:#ef473a;color:#fff}.button.button-assertive:hover{color:#fff;text-decoration:none}.button.button-assertive.activated,.button.button-assertive.active{border-color:#a2a2a2;background-color:#e42112}.button.button-assertive.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ef473a}.button.button-assertive.button-icon{border-color:transparent;background:0 0}.button.button-assertive.button-outline{border-color:#ef473a;background:0 0;color:#ef473a}.button.button-assertive.button-outline.activated,.button.button-assertive.button-outline.active{background-color:#ef473a;box-shadow:none;color:#fff}.button.button-balanced{border-color:transparent;background-color:#33cd5f;color:#fff}.button.button-balanced:hover{color:#fff;text-decoration:none}.button.button-balanced.activated,.button.button-balanced.active{border-color:#a2a2a2;background-color:#28a54c}.button.button-balanced.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#33cd5f}.button.button-balanced.button-icon{border-color:transparent;background:0 0}.button.button-balanced.button-outline{border-color:#33cd5f;background:0 0;color:#33cd5f}.button.button-balanced.button-outline.activated,.button.button-balanced.button-outline.active{background-color:#33cd5f;box-shadow:none;color:#fff}.button.button-energized{border-color:transparent;background-color:#ffc900;color:#fff}.button.button-energized:hover{color:#fff;text-decoration:none}.button.button-energized.activated,.button.button-energized.active{border-color:#a2a2a2;background-color:#e6b500}.button.button-energized.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ffc900}.button.button-energized.button-icon{border-color:transparent;background:0 0}.button.button-energized.button-outline{border-color:#ffc900;background:0 0;color:#ffc900}.button.button-energized.button-outline.activated,.button.button-energized.button-outline.active{background-color:#ffc900;box-shadow:none;color:#fff}.button.button-royal{border-color:transparent;background-color:#886aea;color:#fff}.button.button-royal:hover{color:#fff;text-decoration:none}.button.button-royal.activated,.button.button-royal.active{border-color:#a2a2a2;background-color:#6b46e5}.button.button-royal.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#886aea}.button.button-royal.button-icon{border-color:transparent;background:0 0}.button.button-royal.button-outline{border-color:#886aea;background:0 0;color:#886aea}.button.button-royal.button-outline.activated,.button.button-royal.button-outline.active{background-color:#886aea;box-shadow:none;color:#fff}.button.button-dark{border-color:transparent;background-color:#444;color:#fff}.button.button-dark:hover{color:#fff;text-decoration:none}.button.button-dark.activated,.button.button-dark.active{border-color:#a2a2a2;background-color:#262626}.button.button-dark.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444}.button.button-dark.button-icon{border-color:transparent;background:0 0}.button.button-dark.button-outline{border-color:#444;background:0 0;color:#444}.button.button-dark.button-outline.activated,.button.button-dark.button-outline.active{background-color:#444;box-shadow:none;color:#fff}.button-small{padding:2px 4px 1px;min-width:28px;min-height:30px;font-size:12px;line-height:26px}.button-small .icon:before,.button-small.icon-left:before,.button-small.icon-right:before,.button-small.icon:before{font-size:16px;line-height:19px;margin-top:3px}.button-large{padding:0 16px;min-width:68px;min-height:59px;font-size:20px;line-height:53px}.button-large .icon:before,.button-large.icon-left:before,.button-large.icon-right:before,.button-large.icon:before{padding-bottom:2px;font-size:32px;line-height:51px}.button-icon{-webkit-transition:opacity .1s;transition:opacity .1s;padding:0 6px;min-width:initial;border-color:transparent;background:0 0}.button-icon.button.activated,.button-icon.button.active{border-color:transparent;background:0 0;box-shadow:none;opacity:.3}.button-icon .icon:before,.button-icon.icon:before{font-size:32px}.button-clear{-webkit-transition:opacity .1s;transition:opacity .1s;padding:0 6px;max-height:42px;border-color:transparent;background:0 0;box-shadow:none}.button-clear.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:transparent}.button-clear.button-icon{border-color:transparent;background:0 0}.button-clear.activated,.button-clear.active{opacity:.3}.button-outline{-webkit-transition:opacity .1s;transition:opacity .1s;background:0 0;box-shadow:none}.button-outline.button-outline{border-color:transparent;background:0 0;color:transparent}.button-outline.button-outline.activated,.button-outline.button-outline.active{background-color:transparent;box-shadow:none;color:#fff}.padding>.button.button-block:first-child{margin-top:0}.button-block{display:block;clear:both}.button-block:after{clear:both}.button-full,.button-full>.button{display:block;margin-right:0;margin-left:0;border-right-width:0;border-left-width:0;border-radius:0}.button-full>button.button,button.button-block,button.button-full,input.button.button-block{width:100%}a.button{text-decoration:none}a.button .icon:before,a.button.icon-left:before,a.button.icon-right:before,a.button.icon:before{margin-top:2px}.button.disabled,.button[disabled]{opacity:.4;cursor:default!important;pointer-events:none}.button-bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;width:100%}.button-bar.button-bar-inline{display:block;width:auto}.button-bar.button-bar-inline:after,.button-bar.button-bar-inline:before{display:table;content:"";line-height:0}.button-bar.button-bar-inline:after{clear:both}.button-bar.button-bar-inline>.button{width:auto;display:inline-block;float:left}.button-bar.bar-light>.button{border-color:#ddd}.button-bar.bar-stable>.button{border-color:#b2b2b2}.button-bar.bar-positive>.button{border-color:#0c60ee}.button-bar.bar-calm>.button{border-color:#0a9dc7}.button-bar.bar-assertive>.button{border-color:#e42112}.button-bar.bar-balanced>.button{border-color:#28a54c}.button-bar.bar-energized>.button{border-color:#e6b500}.button-bar.bar-royal>.button{border-color:#6b46e5}.button-bar.bar-dark>.button{border-color:#111}.button-bar>.button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;padding:0 16px;width:0;border-width:1px 0 1px 1px;border-radius:0;text-align:center;text-overflow:ellipsis;white-space:nowrap}.button-bar>.button .icon:before,.button-bar>.button:before{line-height:44px}.button-bar>.button:first-child{border-radius:4px 0 0 4px}.button-bar>.button:last-child{border-right-width:1px;border-radius:0 4px 4px 0}.button-bar>.button:only-child{border-radius:4px}.button-bar>.button-small .icon:before,.button-bar>.button-small:before{line-height:28px}.row{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:5px;width:100%}.row-wrap{-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.row-no-padding{padding:0}.row-no-padding>.col{padding:0}.row+.row{margin-top:-5px;padding-top:0}.col{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;padding:5px;width:100%}.row-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;-moz-align-items:flex-start;align-items:flex-start}.row-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;-moz-align-items:flex-end;align-items:flex-end}.row-center{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.row-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;align-items:stretch}.row-baseline{-webkit-box-align:baseline;-ms-flex-align:baseline;-webkit-align-items:baseline;-moz-align-items:baseline;align-items:baseline}.col-top{-webkit-align-self:flex-start;-moz-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.col-bottom{-webkit-align-self:flex-end;-moz-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.col-center{-webkit-align-self:center;-moz-align-self:center;-ms-flex-item-align:center;align-self:center}.col-offset-10{margin-left:10%}.col-offset-20{margin-left:20%}.col-offset-25{margin-left:25%}.col-offset-33,.col-offset-34{margin-left:33.3333%}.col-offset-50{margin-left:50%}.col-offset-66,.col-offset-67{margin-left:66.6666%}.col-offset-75{margin-left:75%}.col-offset-80{margin-left:80%}.col-offset-90{margin-left:90%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 10%;-moz-box-flex:0;-moz-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%;max-width:10%}.col-20{-webkit-box-flex:0;-webkit-flex:0 0 20%;-moz-box-flex:0;-moz-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.col-25{-webkit-box-flex:0;-webkit-flex:0 0 25%;-moz-box-flex:0;-moz-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-33,.col-34{-webkit-box-flex:0;-webkit-flex:0 0 33.3333%;-moz-box-flex:0;-moz-flex:0 0 33.3333%;-ms-flex:0 0 33.3333%;flex:0 0 33.3333%;max-width:33.3333%}.col-40{-webkit-box-flex:0;-webkit-flex:0 0 40%;-moz-box-flex:0;-moz-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%;max-width:40%}.col-50{-webkit-box-flex:0;-webkit-flex:0 0 50%;-moz-box-flex:0;-moz-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-60{-webkit-box-flex:0;-webkit-flex:0 0 60%;-moz-box-flex:0;-moz-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%;max-width:60%}.col-66,.col-67{-webkit-box-flex:0;-webkit-flex:0 0 66.6666%;-moz-box-flex:0;-moz-flex:0 0 66.6666%;-ms-flex:0 0 66.6666%;flex:0 0 66.6666%;max-width:66.6666%}.col-75{-webkit-box-flex:0;-webkit-flex:0 0 75%;-moz-box-flex:0;-moz-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-80{-webkit-box-flex:0;-webkit-flex:0 0 80%;-moz-box-flex:0;-moz-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%;max-width:80%}.col-90{-webkit-box-flex:0;-webkit-flex:0 0 90%;-moz-box-flex:0;-moz-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%;max-width:90%}@media (max-width:567px){.responsive-sm{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-sm .col,.responsive-sm .col-10,.responsive-sm .col-20,.responsive-sm .col-25,.responsive-sm .col-33,.responsive-sm .col-34,.responsive-sm .col-50,.responsive-sm .col-66,.responsive-sm .col-67,.responsive-sm .col-75,.responsive-sm .col-80,.responsive-sm .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}@media (max-width:767px){.responsive-md{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-md .col,.responsive-md .col-10,.responsive-md .col-20,.responsive-md .col-25,.responsive-md .col-33,.responsive-md .col-34,.responsive-md .col-50,.responsive-md .col-66,.responsive-md .col-67,.responsive-md .col-75,.responsive-md .col-80,.responsive-md .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}@media (max-width:1023px){.responsive-lg{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-lg .col,.responsive-lg .col-10,.responsive-lg .col-20,.responsive-lg .col-25,.responsive-lg .col-33,.responsive-lg .col-34,.responsive-lg .col-50,.responsive-lg .col-66,.responsive-lg .col-67,.responsive-lg .col-75,.responsive-lg .col-80,.responsive-lg .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}.hide{display:none}.opacity-hide{opacity:0}.grade-b .opacity-hide,.grade-c .opacity-hide{opacity:1;display:none}.show{display:block}.opacity-show{opacity:1}.invisible{visibility:hidden}.keyboard-open .hide-on-keyboard-open{display:none}.keyboard-open .bar-footer.hide-on-keyboard-open+.pane .has-footer,.keyboard-open .tabs.hide-on-keyboard-open+.pane .has-tabs{bottom:0}.inline{display:inline-block}.disable-pointer-events{pointer-events:none}.enable-pointer-events{pointer-events:auto}.disable-user-behavior{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent;-webkit-user-drag:none;-ms-touch-action:none;-ms-content-zooming:none}.click-block{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;z-index:99999;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);overflow:hidden}.click-block-hide{-webkit-transform:translate3d(-9999px,0,0);transform:translate3d(-9999px,0,0)}.no-resize{resize:none}.block{display:block;clear:both}.block:after{display:block;visibility:hidden;clear:both;height:0;content:"."}.full-image{width:100%}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}.padding{padding:10px}.padding-top,.padding-vertical{padding-top:10px}.padding-horizontal,.padding-right{padding-right:10px}.padding-bottom,.padding-vertical{padding-bottom:10px}.padding-horizontal,.padding-left{padding-left:10px}.iframe-wrapper{position:fixed;-webkit-overflow-scrolling:touch;overflow:scroll}.iframe-wrapper iframe{height:100%;width:100%}.rounded{border-radius:4px}.light,a.light{color:#fff}.light-bg{background-color:#fff}.light-border{border-color:#ddd}.stable,a.stable{color:#f8f8f8}.stable-bg{background-color:#f8f8f8}.stable-border{border-color:#b2b2b2}.positive,a.positive{color:#387ef5}.positive-bg{background-color:#387ef5}.positive-border{border-color:#0c60ee}.calm,a.calm{color:#11c1f3}.calm-bg{background-color:#11c1f3}.calm-border{border-color:#0a9dc7}.assertive,a.assertive{color:#ef473a}.assertive-bg{background-color:#ef473a}.assertive-border{border-color:#e42112}.balanced,a.balanced{color:#33cd5f}.balanced-bg{background-color:#33cd5f}.balanced-border{border-color:#28a54c}.energized,a.energized{color:#ffc900}.energized-bg{background-color:#ffc900}.energized-border{border-color:#e6b500}.royal,a.royal{color:#886aea}.royal-bg{background-color:#886aea}.royal-border{border-color:#6b46e5}.dark,a.dark{color:#444}.dark-bg{background-color:#444}.dark-border{border-color:#111}[collection-repeat]{left:0!important;top:0!important;position:absolute!important;z-index:1}.collection-repeat-container{position:relative;z-index:1}.collection-repeat-after-container{z-index:0;display:block}.collection-repeat-after-container.horizontal{display:inline-block}.ng-cloak,.ng-hide:not(.ng-hide-animate),.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader){height:64px;height:calc(constant(safe-area-inset-top) + 44px);height:calc(env(safe-area-inset-top) + 44px)}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper{margin-top:19px!important}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader)>*{margin-top:20px;margin-top:constant(safe-area-inset-top);margin-top:env(safe-area-inset-top)}.platform-ios.platform-cordova:not(.fullscreen) .bar-header{padding-left:calc(constant(safe-area-inset-left) + 5px);padding-left:calc(env(safe-area-inset-left) + 5px);padding-right:calc(constant(safe-area-inset-right) + 5px);padding-right:calc(env(safe-area-inset-right) + 5px)}.platform-ios.platform-cordova:not(.fullscreen) .bar-header .buttons:last-child{right:calc(constant(safe-area-inset-right) + 5px);right:calc(env(safe-area-inset-right) + 5px)}.platform-ios.platform-cordova:not(.fullscreen) .bar-footer.has-tabs,.platform-ios.platform-cordova:not(.fullscreen) .has-tabs{bottom:calc(constant(safe-area-inset-bottom) + 49px);bottom:calc(env(safe-area-inset-bottom) + 49px)}.platform-ios.platform-cordova:not(.fullscreen) .tabs-top>.tabs,.platform-ios.platform-cordova:not(.fullscreen) .tabs.tabs-top{top:64px}.platform-ios.platform-cordova:not(.fullscreen) .tabs{padding-bottom:constant(safe-area-inset-bottom);padding-bottom:env(safe-area-inset-bottom);height:calc(constant(safe-area-inset-bottom) + 49px);height:calc(env(safe-area-inset-bottom) + 49px)}.platform-ios.platform-cordova:not(.fullscreen) .bar-subheader,.platform-ios.platform-cordova:not(.fullscreen) .has-header{top:64px;top:calc(constant(safe-area-inset-top) + 44px);top:calc(env(safe-area-inset-top) + 44px)}.platform-ios.platform-cordova:not(.fullscreen) .has-subheader{top:108px;top:calc(constant(safe-area-inset-top) + 88px);top:calc(env(safe-area-inset-top) + 88px)}.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-tabs-top{top:113px;top:calc(93px + constant(safe-area-inset-top));top:calc(93px + env(safe-area-inset-top))}.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-subheader.has-tabs-top{top:157px;top:calc(137px + constant(safe-area-inset-right));top:calc(137px + env(safe-area-inset-right))}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader){height:44px}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper{margin-top:-1px}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader)>*{margin-top:0}.platform-ios.platform-cordova .popover .bar-subheader,.platform-ios.platform-cordova .popover .has-header{top:44px}.platform-ios.platform-cordova .popover .has-subheader{top:88px}.platform-ios.platform-cordova.status-bar-hide{margin-bottom:20px}@media (orientation:landscape){.item{padding:16px calc(constant(safe-area-inset-right) + 16px)}.item .badge{right:calc(constant(safe-area-inset-right) + 32px)}.item-icon-left{padding-left:calc(constant(safe-area-inset-left) + 54px)}.item-icon-left .icon{left:calc(constant(safe-area-inset-left) + 11px)}.item-icon-right{padding-right:calc(constant(safe-area-inset-right) + 54px)}.item-icon-right .icon{right:calc(constant(safe-area-inset-right) + 11px)}.item-complex,a.item.item-complex,button.item.item-complex{padding:0}.item-complex .item-content,a.item.item-complex .item-content,button.item.item-complex .item-content{padding:16px calc(constant(safe-area-inset-right) + 49px) 16px calc(constant(safe-area-inset-left) + 16px)}.item-left-edit.visible.active{-webkit-transform:translate3d(calc(constant(safe-area-inset-left) + 8px),0,0);transform:translate3d(calc(constant(safe-area-inset-left) + 8px),0,0)}.item-left-editing.item-left-editable .item-content,.list-left-editing .item-left-editable .item-content{-webkit-transform:translate3d(calc(constant(safe-area-inset-left) + 50px),0,0);transform:translate3d(calc(constant(safe-area-inset-left) + 50px),0,0)}.item-right-edit{right:constant(safe-area-inset-right);right:env(safe-area-inset-right)}.platform-ios.platform-browser.platform-ipad{position:fixed}}.platform-c:not(.enable-transitions) *{-webkit-transition:none!important;transition:none!important}.slide-in-up{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.slide-in-up.ng-enter,.slide-in-up>.ng-enter{-webkit-transition:all cubic-bezier(.1,.7,.1,1) .4s;transition:all cubic-bezier(.1,.7,.1,1) .4s}.slide-in-up.ng-enter-active,.slide-in-up>.ng-enter-active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-in-up.ng-leave,.slide-in-up>.ng-leave{-webkit-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms}@-webkit-keyframes scaleOut{from{-webkit-transform:scale(1);opacity:1}to{-webkit-transform:scale(.8);opacity:0}}@keyframes scaleOut{from{transform:scale(1);opacity:1}to{transform:scale(.8);opacity:0}}@-webkit-keyframes superScaleIn{from{-webkit-transform:scale(1.2);opacity:0}to{-webkit-transform:scale(1);opacity:1}}@keyframes superScaleIn{from{transform:scale(1.2);opacity:0}to{transform:scale(1);opacity:1}}[nav-view-transition=ios] [nav-view=entering],[nav-view-transition=ios] [nav-view=leaving]{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-timing-function:cubic-bezier(.36,.66,.04,1);transition-timing-function:cubic-bezier(.36,.66,.04,1);-webkit-transition-property:opacity,-webkit-transform,box-shadow;transition-property:opacity,transform,box-shadow}[nav-view-transition=ios][nav-view-direction=back],[nav-view-transition=ios][nav-view-direction=forward]{background-color:#000}[nav-view-transition=ios] [nav-view=active],[nav-view-transition=ios][nav-view-direction=back] [nav-view=leaving],[nav-view-transition=ios][nav-view-direction=forward] [nav-view=entering]{z-index:3}[nav-view-transition=ios][nav-view-direction=back] [nav-view=entering],[nav-view-transition=ios][nav-view-direction=forward] [nav-view=leaving]{z-index:2}[nav-bar-transition=ios] .back-text,[nav-bar-transition=ios] .buttons,[nav-bar-transition=ios] .title{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-timing-function:cubic-bezier(.36,.66,.04,1);transition-timing-function:cubic-bezier(.36,.66,.04,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,transform}[nav-bar-transition=ios] [nav-bar=active],[nav-bar-transition=ios] [nav-bar=entering]{z-index:10}[nav-bar-transition=ios] [nav-bar=active] .bar,[nav-bar-transition=ios] [nav-bar=entering] .bar{background:0 0}[nav-bar-transition=ios] [nav-bar=cached]{display:block}[nav-bar-transition=ios] [nav-bar=cached] .header-item{display:none}[nav-view-transition=android] [nav-view=entering],[nav-view-transition=android] [nav-view=leaving]{-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,.6,.2,1);transition-timing-function:cubic-bezier(.4,.6,.2,1);-webkit-transition-property:-webkit-transform;transition-property:transform}[nav-view-transition=android] [nav-view=active],[nav-view-transition=android][nav-view-direction=back] [nav-view=leaving],[nav-view-transition=android][nav-view-direction=forward] [nav-view=entering]{z-index:3}[nav-view-transition=android][nav-view-direction=back] [nav-view=entering],[nav-view-transition=android][nav-view-direction=forward] [nav-view=leaving]{z-index:2}[nav-bar-transition=android] .buttons,[nav-bar-transition=android] .title{-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,.6,.2,1);transition-timing-function:cubic-bezier(.4,.6,.2,1);-webkit-transition-property:opacity;transition-property:opacity}[nav-bar-transition=android] [nav-bar=active],[nav-bar-transition=android] [nav-bar=entering]{z-index:10}[nav-bar-transition=android] [nav-bar=active] .bar,[nav-bar-transition=android] [nav-bar=entering] .bar{background:0 0}[nav-bar-transition=android] [nav-bar=cached]{display:block}[nav-bar-transition=android] [nav-bar=cached] .header-item{display:none}[nav-swipe=fast] .back-text,[nav-swipe=fast] .buttons,[nav-swipe=fast] .title,[nav-swipe=fast] [nav-view]{-webkit-transition-duration:50ms;transition-duration:50ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}[nav-swipe=slow] .back-text,[nav-swipe=slow] .buttons,[nav-swipe=slow] .title,[nav-swipe=slow] [nav-view]{-webkit-transition-duration:160ms;transition-duration:160ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}[nav-bar=cached],[nav-view=cached]{display:none}[nav-view=stage]{opacity:0;-webkit-transition-duration:0;transition-duration:0}[nav-bar=stage] .back-text,[nav-bar=stage] .buttons,[nav-bar=stage] .title{position:absolute;opacity:0;-webkit-transition-duration:0s;transition-duration:0s}.dark-text-primary{color:#000;opacity:.87}.dark-text-secondary{color:#000;opacity:.54}.dark-text-disabled{color:#000;opacity:.38}.dark-text-dividers{color:#000;opacity:.12}.light-text-primary{color:#fff;opacity:1}.light-text-secondary{color:#fff;opacity:.7}.light-text-disabled{color:#fff;opacity:.5}.light-text-dividers{color:#fff;opacity:.12}.popup-body{line-height:20px}.scroll{height:100%}.overflow-scroll{margin-bottom:0}.col{font-weight:300}.row+.row{margin-top:0}.textFont{font-weight:400}.digitFont{font-weight:300}.cityArrow{width:10%;padding-bottom:7%;padding-top:7%;margin:auto;text-align:center}.topMainBox{width:80%;margin:auto;text-align:center}.timeChart{width:1716px}.weeklyChart{width:936px}.guide-content{position:absolute;left:0;top:0;right:0;bottom:55px;overflow:hidden;background-repeat:no-repeat;background-position:center;background-size:contain}.guide-content-head{width:100%;margin:0 0 10px;text-align:center;color:inherit}.guide-content-text{width:100%;margin:0 0 5px;text-align:center;color:inherit}.guide-pager{width:100%;height:56px;position:absolute;bottom:0;border-top:1px #d3d3d3 solid;z-index:2}.guide-pager-left{width:30%;padding:20px 5px;float:left;text-align:right}.guide-pager-right{width:30%;padding:20px 5px;float:right;text-align:left}.guide-close{font-size:28px;padding:10px;position:absolute;right:0;color:inherit}.line-today{stroke:#fff;stroke-width:2px;fill:none}.line-yesterday{stroke:#d0d0d0;stroke-width:1px;fill:none}.circle-today{stroke:#fff;stroke-width:1px;fill:#fff}.circle-yesterday{stroke:#d0d0d0;stroke-width:1px;fill:#d0d0d0}.circle-today-current{stroke:#fff;stroke-width:2px;fill:#ff5252}.circle-yesterday-current{stroke:#d0d0d0;stroke-width:2px;fill:#d0d0d0}.text-today{fill:#fff;opacity:.87;font-weight:300;font-size:15px}.text-yesterday{fill:#90a4ae;opacity:.54;font-weight:300;font-size:15px}.circle-hidden,.text-hidden{visibility:hidden}.axis .minor line{stroke:#777;stroke-dasharray:2,2}.x.axis line{stroke:#fff}.label{background:rgba(0,0,0,.4);border-radius:5%;position:absolute;bottom:10px;padding:5px;font-size:10px}.label-today{background-color:#fff;width:10px;height:10px;display:inline-block}.label-yesterday{background-color:#9e9e9e;width:10px;height:10px;display:inline-block}.day-title-list{position:relative;height:14px}.day-title{position:absolute;top:0;width:120px}.rect{fill:#fff}.detail-item-p{margin:auto 0 auto 8px;width:200px}.row-detail-aqi{padding:0 16px 5px 16px}.col-detail-aqi{margin:auto 0;padding:0}.img-detail-aqi{font-size:24px;vertical-align:middle;margin:0 8px}.main-content{width:100%;color:#fff}.extend-content{width:100%}.chart-content{width:100%;margin:0 0 5px}.chartBox{padding:0;display:flex;flex-direction:column}.table-content{flex:1;width:100%;padding:0;display:flex;flex-direction:column}.table-border{box-shadow:1px 0 0 0 rgba(254,254,254,.1) inset}.table-items{height:inherit;display:flex;flex-direction:column;text-align:center}.tabs{color:#fff;background-image:linear-gradient(0deg,#fff,#fff 60%,transparent 60%);background-color:transparent}.tabs-search .tabs{color:#000;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 70%);background-color:#fff}.pane,.view{background-color:transparent}.tab-item.tab-item-active{line-height:14px}.purchase-content{background-color:#f5f5f5}.item-center{display:block;margin:auto}.menu-left .menu-content i{padding-right:16px;padding-top:10px;position:absolute;right:0;color:#333;font-size:14px}.menu-content .item-select:after{content:none!important}.menu-content select{padding-right:16px;background:0 0}.start-content .item-input{padding-right:16px;display:flex!important;flex:1 0}.start-content .item-input button{min-height:unset;line-height:unset}.search-header{margin-left:40px!important;margin-right:0!important;padding:5px 0 5px 0;background-color:#444;background-image:none;display:flex!important;flex:1 0}.search-header .icon{color:#444;padding-right:6px;font-size:17px}.search-header input{background-color:transparent;width:100%;font-size:17px;line-height:normal}.search-content .button{width:100%;border-color:#ddd;background-color:#fff;font-size:17px}.search-item{margin:auto;text-align:left;font-weight:500;font-size:17px}.search-item.search-name{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.search-item .material-icons{font-size:inherit;position:relative;top:2px;right:3px;letter-spacing:-4px}.search-item.last-item{width:48px;text-align:center;font-size:28px;margin:auto 0}.search-item img{display:block;margin:auto;width:48px}.search-item a{color:#444}.search-item .toggle,.search-item .track{width:100%}.search-item .ion-ios-close-outline:before{font-weight:700}.toggle.toggle-search{margin:0}.toggle.toggle-search .track{height:14px;border:0;border-radius:8px;margin:auto 0;background-color:rgba(158,158,158,.8)}.toggle.toggle-search input:checked+.track{background-color:#444}.toggle.toggle-search .track .handle{width:20px;height:20px;border-radius:50%;left:5px;top:auto;bottom:auto;margin-top:-3px;background-color:#fff}.toggle.toggle-search input:checked+.track .handle{background-color:#fff;left:auto;right:25px}.bar.bar-search{border-color:#444;background-color:#444;background-image:linear-gradient(0deg,#444,#444 50%,transparent 50%);color:#fff}.bar.bar-forecast{border-color:#0288d1;background-color:#03a9f4;background-image:linear-gradient(0deg,#0288d1,#0288d1 50%,transparent 50%);color:#fff}.bar.bar-dailyforecast{border-color:#0097a7;background-color:#00bcd4;background-image:linear-gradient(0deg,#0097a7,#0097a7 50%,transparent 50%);color:#fff}.menu{width:100%!important}.menu-content{-webkit-transform:none!important;transform:none!important}.menu-content.menu-open{z-index:-1}.menu-left{z-index:auto!important;left:-100%;-webkit-transition:left .2s ease;transition:left .2s ease}.menu-left.menu-open{left:0}[nav-bar-transition=android] .buttons,[nav-bar-transition=android] .title{-webkit-transition-duration:0s;transition-duration:0s;-webkit-transition-property:none;transition-property:none;opacity:1}[nav-bar-transition=android] [nav-bar=leaving] .buttons-right,[nav-bar-transition=android] [nav-bar=leaving] .search-header{display:none}[nav-bar-transition=android] [nav-bar=entering] .header-item{opacity:1}.bar.bar-dailyforecast .search-header,.bar.bar-forecast .search-header,.bar.bar-search .dailyforecast-header,.bar.bar-search .forecast-header{display:none!important}.menu-content.overflow-scroll{overflow-y:auto!important;-webkit-overflow-scrolling:auto!important}.ionic_popup .popup{background-color:#fff;width:280px}.ionic_popup .popup-head{display:none}.ionic_popup .popup-body{padding:0}.ionic_popup .popup-buttons{padding:0;min-height:44px;height:44px}.ionic_popup .popup-buttons .button:not(:last-child){margin-right:1px}.ionic_popup .button_cancel,.ionic_popup .button_close{background-color:#03a9f4;color:#fff}.display4{font-size:112px;opacity:.54;font-weight:300;letter-spacing:-10px}.display3{font-size:56px;opacity:.54;font-weight:400;letter-spacing:-5px}.display2{font-size:45px;opacity:.54;font-weight:400}.display1{font-size:34px;opacity:.54;font-weight:400}.headline{font-size:24px;opacity:.87;font-weight:400}.title{left:0!important;right:0!important}.setting-title-light{background-color:inherit;color:inherit;font-size:20px;opacity:.87}.setting-subheading-light{background-color:inherit;color:inherit;font-size:17px;opacity:.87}.item-select:after{color:#fff}p small{font-size:10px}.subheading{font-size:17px;opacity:.87;font-weight:400}.body2{font-size:15px;opacity:.87;font-weight:700}.body1{font-size:15px;opacity:.87;font-weight:400}.caption{font-size:13px;opacity:.54;font-weight:400}.button{font-size:15px;opacity:.87;font-weight:700}[md-page-header]{padding:0;color:#fff;background-color:initial;margin:auto}[md-header-picture]{background-position:50% 50%}.good{color:#448aff;opacity:.87}.moderate{color:#00e676;opacity:.87}.unhealthy-for-sensitive{color:#ffd600;opacity:.87}.unhealthy{color:#ff6d00;opacity:.87}.very-unhealthy{color:#ff1744;opacity:.87}.hazardous{color:#795548;opacity:.87}@media only screen and (min-device-width:320px) and (max-device-width:480px) and (-webkit-min-device-pixel-ratio:2) and (device-aspect-ratio:320 / 480){.timeChart{width:1749px}.weeklyChart{width:954px}}@media only screen and (min-device-width:320px) and (max-device-width:568px) and (-webkit-min-device-pixel-ratio:2) and (device-aspect-ratio:320 / 568){.timeChart{width:1749px}.weeklyChart{width:954px}}@media only screen and (min-device-width:375px) and (max-device-width:667px) and (-webkit-min-device-pixel-ratio:2) and (device-aspect-ratio:375 / 667){.timeChart{width:1749px}.weeklyChart{width:954px}}@media only screen and (min-device-width:414px) and (max-device-width:736px) and (-webkit-min-device-pixel-ratio:3) and (device-aspect-ratio:414 / 736){.timeChart{width:1947px}.weeklyChart{width:1062px}}@media screen and (device-width:412px) and (device-height:732px) and (device-aspect-ratio:412 / 732){.timeChart{width:1942px}.weeklyChart{width:1059px}} \ No newline at end of file diff --git a/ios/www/fonts/MaterialIcons-Regular.svg b/ios/www/fonts/MaterialIcons-Regular.svg index 488c729ec..a449327e2 100644 --- a/ios/www/fonts/MaterialIcons-Regular.svg +++ b/ios/www/fonts/MaterialIcons-Regular.svg @@ -3,7 +3,7 @@ - + Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016 By shyndman diff --git a/ios/www/img/angry.svg b/ios/www/img/angry.svg index cb1c684f9..4c54dc766 100755 --- a/ios/www/img/angry.svg +++ b/ios/www/img/angry.svg @@ -1,6 +1,6 @@ - + diff --git a/ios/www/img/fish.svg b/ios/www/img/fish.svg index 964cb2e17..fb1806b8f 100644 --- a/ios/www/img/fish.svg +++ b/ios/www/img/fish.svg @@ -1,6 +1,6 @@ - + diff --git a/ios/www/img/glass-with-water.svg b/ios/www/img/glass-with-water.svg index 303abac76..7ae8ede2c 100644 --- a/ios/www/img/glass-with-water.svg +++ b/ios/www/img/glass-with-water.svg @@ -1,7 +1,7 @@ - + diff --git a/ios/www/img/sunrise.svg b/ios/www/img/sunrise.svg index 54f546c18..cb28fda29 100644 --- a/ios/www/img/sunrise.svg +++ b/ios/www/img/sunrise.svg @@ -1,3 +1 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/ios/www/img/sunset.svg b/ios/www/img/sunset.svg index f55f5a885..d3de9cd72 100644 --- a/ios/www/img/sunset.svg +++ b/ios/www/img/sunset.svg @@ -1,3 +1 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/ios/www/img/wind-and-cloud.svg b/ios/www/img/wind-and-cloud.svg index 21702521f..5815d3f10 100644 --- a/ios/www/img/wind-and-cloud.svg +++ b/ios/www/img/wind-and-cloud.svg @@ -1,7 +1,7 @@ - + diff --git a/ios/www/index.html b/ios/www/index.html index be49d1aad..42045eaa4 100644 --- a/ios/www/index.html +++ b/ios/www/index.html @@ -37,8 +37,8 @@ - + diff --git a/ios/www/js/app.js b/ios/www/js/app.js index 07667368c..333ea9f1d 100644 --- a/ios/www/js/app.js +++ b/ios/www/js/app.js @@ -15,6 +15,7 @@ angular.module('starter', [ 'service.util', 'service.twads', 'service.push', + 'service.storage', 'controller.tabctrl', 'controller.forecastctrl', 'controller.searchctrl', @@ -22,36 +23,155 @@ angular.module('starter', [ 'controller.guidectrl', 'controller.purchase', 'controller.units', - 'controller.start', - 'service.run' + 'controller.start' ]) .factory('$exceptionHandler', function (Util) { - return function (exception, cause) { - console.log(exception, cause); - if (Util && Util.ga) { - if (exception) { - Util.ga.trackEvent('angular', 'error', exception.message); - Util.ga.trackException(exception.stack, true); - } - else { - Util.ga.trackEvent('angular', 'error', 'execption is null'); - } - } - else { - console.log('util or util.ga is undefined'); - } - if (twClientConfig && twClientConfig.debug) { - alert("ERROR in " + exception); - } - } + return function (exception, cause) { + console.log(exception, cause); + if (Util && Util.ga) { + if (exception) { + Util.ga.trackEvent('angular', 'error', exception.message); + Util.ga.trackException(exception.stack, true); + } + else { + Util.ga.trackEvent('angular', 'error', 'execption is null'); + } + } + else { + console.log('util or util.ga is undefined'); + } + if (twClientConfig && twClientConfig.debug) { + alert("ERROR in " + exception); + } + } }) - .run(function(Util, Purchase, $rootScope, $location, WeatherInfo, $state, Units) { - //$translate.use('ja'); - //splash screen을 빠르게 닫기 위해 event 분리 - //차후 device ready이후 순차적으로 실행할 부분 넣어야 함. - if (navigator.splashscreen) { - console.log('splash screen hide!!!'); - navigator.splashscreen.hide(); + .run(function($rootScope, $ionicPlatform, $location, $state, TwStorage, WeatherInfo, Units, Util, Push, Purchase) { + if (twClientConfig.debug) { + Util.ga.debugMode(); + } + + if (ionic.Platform.isIOS()) { + Util.ga.startTrackerWithId(twClientConfig.gaIOSKey); + + // isLocationEnabled 요청해야 registerLocationStateChangeHandler가 호출됨 + if (window.cordova && window.cordova.plugins && window.cordova.plugins.diagnostic) { + cordova.plugins.diagnostic.isLocationEnabled(function (enabled) { + console.log("Location setting is " + (enabled ? "enabled" : "disabled")); + }, function (error) { + console.error("Error getting for location enabled status: " + error); + }); + } + } else if (ionic.Platform.isAndroid()) { + Util.ga.startTrackerWithId(twClientConfig.gaAndroidKey, 30); + + // android는 실행 시 registerLocationStateChangeHandler 호출되지 않으므로 직접 locationMode를 가져와서 설정함 + if (window.cordova && window.cordova.plugins && window.cordova.plugins.diagnostic) { + cordova.plugins.diagnostic.getLocationMode(function(locationMode) { + Util.locationStatus = locationMode; + }, function(error) { + console.error("Error getting for location mode: " + error); + }); + } + } + else { + console.log("Error : Unknown platform"); + } + Util.ga.platformReady(); + + Util.ga.enableUncaughtExceptionReporting(true); + Util.ga.setAllowIDFACollection(true); + + Util.language = navigator.userLanguage || navigator.language; + if (navigator.globalization) { + navigator.globalization.getLocaleName( + function (locale) { + Util.region = locale.value.split('-')[1]; + console.log('region: ' + Util.region + '\n'); + }, + function () { + console.log('Error getting locale\n'); + } + ); + } + + Util.ga.trackEvent('app', 'language', Util.language); + + if (window.hasOwnProperty("device")) { + Util.uuid = window.device.uuid; + console.log("UUID:"+window.device.uuid); + } + + console.log("UA:"+ionic.Platform.ua); + console.log("Height:" + window.innerHeight + ", Width:" + window.innerWidth + ", PixelRatio:" + window.devicePixelRatio); + console.log("OuterHeight:" + window.outerHeight + ", OuterWidth:" + window.outerWidth); + console.log("ScreenHeight:"+window.screen.height+", ScreenWidth:"+window.screen.width); + + if (window.screen) { + Util.ga.trackEvent('app', 'screen width', window.screen.width); + Util.ga.trackEvent('app', 'screen height', window.screen.height); + } + else if (window.outerHeight) { + Util.ga.trackEvent('app', 'outer width', window.outerWidth); + Util.ga.trackEvent('app', 'outer height', window.outerHeight); + } + + if (window.hasOwnProperty("device")) { + Util.ga.trackEvent('app', 'uuid', window.device.uuid); + } + Util.ga.trackEvent('app', 'ua', ionic.Platform.ua); + if (window.cordova && cordova.getAppVersion) { + cordova.getAppVersion.getVersionNumber().then(function (version) { + $rootScope.version = version; + Util.version = version; + Util.ga.trackEvent('app', 'version', Util.version); + }); + } + + window.onerror = function(msg, url, line) { + var idx = url.lastIndexOf("/"); + if(idx > -1) {url = url.substring(idx+1);} + var errorMsg = "ERROR in " + url + " (line #" + line + "): " + msg; + Util.ga.trackEvent('window', 'error', errorMsg); + Util.ga.trackException(errorMsg, true); + console.log(errorMsg); + if (twClientConfig.debug) { + alert("ERROR in " + url + " (line #" + line + "): " + msg); + } + return false; //suppress Error Alert; + }; + + document.addEventListener("resume", function() { + Util.ga.trackEvent('app', 'status', 'resume'); + }, false); + document.addEventListener("pause", function() { + Util.ga.trackEvent('app', 'status', 'pause'); + }, false); + + WeatherInfo.loadTowns(); + $ionicPlatform.on('resume', function(){ + $rootScope.$broadcast('reloadEvent', 'resume'); + }); + + if (window.cordova && window.cordova.plugins && window.cordova.plugins.diagnostic) { + // ios는 실행 시 registerLocationStateChangeHandler 호출되어 locationStatus가 설정됨 + cordova.plugins.diagnostic.registerLocationStateChangeHandler(function (state) { + var oldLocationEnabled = Util.isLocationEnabled(); + + console.log("Location state changed to: " + state); + Util.locationStatus = state; + + Util.ga.trackEvent('position', 'status', state); + + if (oldLocationEnabled === false && Util.isLocationEnabled()) { + $rootScope.$broadcast('reloadEvent', 'locationOn'); + } + }, function (error) { + console.error("Error registering for location state changes: " + error); + Util.ga.trackEvent('position', 'error', 'registerLocationStateChange'); + }); + } + else { + Util.ga.trackEvent('plugin', 'error', 'loadDiagnostic') } if (ionic.Platform.isIOS()) { @@ -70,25 +190,12 @@ angular.module('starter', [ cordova.plugins.Keyboard.disableScroll(true); } - //localStorage2Pre가 끝나면 j3k0랑 기존 inapp같이 진행 - //Purchase.init(); - - Units.loadUnits(); - Util.saveServiceKeys(); - - //For backward compatibility - console.log(localStorage.getItem('startVersion')); - if (localStorage.getItem('startVersion') == null) { - if (localStorage.getItem('guideVersion') != null) { - localStorage.setItem('startVersion', localStorage.getItem('guideVersion')); - } - } - $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState) { var headerbar = angular.element(document.querySelectorAll('ion-header-bar')); headerbar.removeClass('bar-search'); headerbar.removeClass('bar-forecast'); headerbar.removeClass('bar-dailyforecast'); + headerbar.removeClass('bar-clear'); headerbar.removeClass('bar-dark'); var tabs = angular.element(document.querySelectorAll('ion-side-menu-content')); @@ -102,14 +209,6 @@ angular.module('starter', [ StatusBar.backgroundColorByHexString('#111'); } } else if (toState.name === 'tab.forecast') { - if (fromState.name === '') { - var startVersion = localStorage.getItem('startVersion'); - if (startVersion === null || Util.startVersion > Number(startVersion)) { - $location.path('/start'); - return; - } - } - $rootScope.viewColor = '#03A9F4'; headerbar.addClass('bar-forecast'); if (window.StatusBar) { @@ -121,6 +220,12 @@ angular.module('starter', [ if (window.StatusBar) { StatusBar.backgroundColorByHexString('#0097A7'); } + } else if (toState.name === 'start') { + $rootScope.viewColor = '#fff'; + headerbar.addClass('bar-clear'); + if (window.StatusBar) { + StatusBar.backgroundColorByHexString('#111'); + } } else { $rootScope.viewColor = '#444'; headerbar.addClass('bar-dark'); @@ -151,8 +256,39 @@ angular.module('starter', [ console.log('Fail to find ionic deep link plugin'); Util.ga.trackException('Fail to find ionic deep link plugin', false); } - }) + TwStorage.init().finally(function() { + if (navigator.splashscreen) { + console.log('splash screen hide!!!'); + navigator.splashscreen.hide(); + } + + WeatherInfo.loadCities(); + Push.init(); + Purchase.init(); + Units.loadUnits(); + + var daumServiceKeys = TwStorage.get("daumServiceKeys"); + if (daumServiceKeys == undefined || daumServiceKeys.length != twClientConfig.daumServiceKeys.length) { + TwStorage.set("daumServiceKeys", twClientConfig.daumServiceKeys); + } + + var startVersion = TwStorage.get("startVersion"); + if (startVersion === null || Util.startVersion > Number(startVersion)) { + $location.path('/start'); + return; + } + + var startupPage = TwStorage.get("startupPage"); + if (startupPage === "1") { //일별날씨 + $state.go('tab.dailyforecast'); + } else if (startupPage === "2") { //즐겨찾기 + $state.go('tab.search'); + } else { //시간별날씨 + $state.go('tab.forecast'); + } + }); + }) .config(function($stateProvider, $urlRouterProvider, $ionicConfigProvider, $compileProvider, ionicTimePickerProvider, $translateProvider) { @@ -1267,16 +1403,6 @@ angular.module('starter', [ } }); - // if none of the above states are matched, use this as the fallback - var startupPage = localStorage.getItem("startupPage"); - if (startupPage === "1") { //일별날씨 - $urlRouterProvider.otherwise('tab/dailyforecast'); - } else if (startupPage === "2") { //즐겨찾기 - $urlRouterProvider.otherwise('tab/search'); - } else { //시간별날씨 - $urlRouterProvider.otherwise('tab/forecast'); - } - $ionicConfigProvider.tabs.style('standard'); $ionicConfigProvider.tabs.position('bottom'); diff --git a/ios/www/js/controller.forecastctrl.js b/ios/www/js/controller.forecastctrl.js index f9deccfd2..aa062f577 100644 --- a/ios/www/js/controller.forecastctrl.js +++ b/ios/www/js/controller.forecastctrl.js @@ -2,13 +2,12 @@ angular.module('controller.forecastctrl', []) .controller('ForecastCtrl', function ($scope, $rootScope, $ionicScrollDelegate, $ionicNavBarDelegate, $q, $timeout, WeatherInfo, WeatherUtil, Util, Purchase, $stateParams, $location, $ionicHistory, $sce, $ionicLoading, - $ionicPopup, $translate, Units) { + $ionicPopup, $translate, Units, TwStorage) { var TABLET_WIDTH = 720; var ASPECT_RATIO_16_9 = 1.7; var bodyWidth; var bodyHeight; var colWidth; - var cityData = null; var refreshTimer = null; $scope.showDetailWeather = false; @@ -583,7 +582,7 @@ angular.module('controller.forecastctrl', []) var dayTable; console.log('apply weather data'); - cityData = WeatherInfo.getCityOfIndex(WeatherInfo.getCityIndex()); + var cityData = WeatherInfo.getCityOfIndex(WeatherInfo.getCityIndex()); if (cityData === null || cityData.address === null) { console.log("fail to getCityOfIndex"); return; @@ -673,33 +672,34 @@ angular.module('controller.forecastctrl', []) var chartMidHeight = mainHeight - (136+padding); $scope.chartMidHeight = chartMidHeight < 300 ? chartMidHeight : 300; } - /** - * loading을 분산시켜서 탭 전환을 빠르게 보이도록 함. - */ - setTimeout(function () { - $scope.showDetailWeather = true; - _diffTodayYesterday($scope.currentWeather, $scope.currentWeather.yesterday); - _makeSummary($scope.currentWeather, $scope.currentWeather.yesterday); - if($scope.forecastType == 'short') { - $scope.timeTable = cityData.timeTable; - $scope.timeChart = cityData.timeChart; - - // ios에서 ionic native scroll 사용시에 화면이 제대로 안그려지는 경우가 있어서 animation 필수. - // ios에서 scroll 할때 scroll freeze되는 현상 있음. - // iOS 10.2.1에서 animation 없어도 화면이 제대로 안그려지는 이슈 발생하지 않음. + + $scope.showDetailWeather = true; + _diffTodayYesterday($scope.currentWeather, $scope.currentWeather.yesterday); + _makeSummary($scope.currentWeather, $scope.currentWeather.yesterday); + if($scope.forecastType == 'short') { + $scope.timeTable = cityData.timeTable; + $scope.timeChart = cityData.timeChart; + + // ios에서 ionic native scroll 사용시에 화면이 제대로 안그려지는 경우가 있어서 animation 필수. + // ios에서 scroll 할때 scroll freeze되는 현상 있음. + // iOS 10.2.1에서 animation 없어도 화면이 제대로 안그려지는 이슈 발생하지 않음. + // data binding이 늦어 scroll이 무시되는 경우가 있음 + setTimeout(function () { if (ionic.Platform.isAndroid()) { $ionicScrollDelegate.$getByHandle("timeChart").scrollTo(getTodayPosition(), 0, false); } else { $ionicScrollDelegate.$getByHandle("timeChart").scrollTo(getTodayPosition(), 0, false); //$ionicScrollDelegate.$getByHandle("timeChart").scrollTo(getTodayPosition(), 0, true); } - } - else { - $scope.dayChart = cityData.dayChart; + }, 0); + } + else { + $scope.dayChart = cityData.dayChart; - /** - * iOS에서 short -> mid 로 변경할때, animation이 없으면 매끄럽게 스크롤되지 않음. - */ + /** + * iOS에서 short -> mid 로 변경할때, animation이 없으면 매끄럽게 스크롤되지 않음. + */ + setTimeout(function () { if (ionic.Platform.isAndroid()) { $ionicScrollDelegate.$getByHandle("weeklyChart").scrollTo(getTodayPosition(), 0, false); $ionicScrollDelegate.$getByHandle("weeklyTable").scrollTo(300, 0, false); @@ -707,8 +707,8 @@ angular.module('controller.forecastctrl', []) $ionicScrollDelegate.$getByHandle("weeklyChart").scrollTo(getTodayPosition(), 0, true); $ionicScrollDelegate.$getByHandle("weeklyTable").scrollTo(300, 0, true); } - } - }, 0); + }, 0); + } } function showLoadingIndicator() { @@ -730,8 +730,8 @@ angular.module('controller.forecastctrl', []) function setRefreshTimer() { clearTimeout(refreshTimer); - var refreshInterval = localStorage.getItem("refreshInterval"); - if (refreshInterval != null && refreshInterval !== "0") { + var settingsInfo = TwStorage.get("settingsInfo"); + if (settingsInfo != null && settingsInfo.refreshInterval !== "0") { refreshTimer = setTimeout(function () { $scope.$broadcast('reloadEvent'); }, parseInt(refreshInterval)*60*1000); @@ -741,37 +741,89 @@ angular.module('controller.forecastctrl', []) function loadWeatherData() { setRefreshTimer(); - if (cityData.address === null || WeatherInfo.canLoadCity(WeatherInfo.getCityIndex()) === true) { + var cityIndex = WeatherInfo.getCityIndex(); + if (WeatherInfo.canLoadCity(cityIndex) === true) { showLoadingIndicator(); - updateCurrentPosition().then(function() { - updateWeatherData().then(function () { - setTimeout(function () { - hideLoadingIndicator(); - }, ionic.Platform.isAndroid()?0:300); - }, function (msg) { + var weatherInfo = WeatherInfo.getCityOfIndex(cityIndex); + if (!weatherInfo) { + hideLoadingIndicator(); + + Util.ga.trackEvent('weather', 'error', 'failToGetCityIndex', cityIndex); + return; + } + + updateWeatherData(weatherInfo).then(function () { + applyWeatherData(); + setTimeout(function () { hideLoadingIndicator(); - $scope.showRetryConfirm(strError, msg, 'weather'); - }); - }, function(msg) { + }, ionic.Platform.isAndroid()?0:300); + }, function (msg) { + applyWeatherData(); hideLoadingIndicator(); - if (msg !== null) { - $scope.showRetryConfirm(strError, msg, 'forecast'); - } - else { - //pass for reload - } + $scope.showRetryConfirm(strError, msg, 'weather'); }); + + if (weatherInfo.currentPosition === true) { + /** + * one more update when finished position is updated + */ + updateCurrentPosition(weatherInfo).then(function(geoInfo) { + if (geoInfo) { + console.log("current position is updated !!"); + try { + var savedLocation = WeatherInfo.getCityOfIndex(0).location; + if (geoInfo.location.lat === savedLocation.lat && + geoInfo.location.long === savedLocation.long) { + console.log("already updated this location"); + return; + } + + if (WeatherInfo.getCityIndex() != 0) { + console.log("already changed to new location"); + return; + } + } + catch(e) { + Util.ga.trackEvent('position', 'error', 'failToParseGeoInfo'); + Util.ga.trackException(e, false); + } + + updateWeatherData(geoInfo).then(function () { + applyWeatherData(); + }, function (msg) { + console.log(msg); + }); + } + else { + Util.ga.trackEvent('position', 'error', 'failToGetGeoInfo'); + } + }, function(msg) { + if (msg) { + $scope.showRetryConfirm(strError, msg, 'forecast'); + } + else { + //pass + } + }); + } + return; } + else { + console.log("Already updated weather data so just apply"); + showLoadingIndicator(); + applyWeatherData(); + } + //permission 조정할때, resume발생하기 때문에 그런 끊어지는 경우를 위해 있음. hideLoadingIndicator(); } - function updateCurrentPosition() { + function updateCurrentPosition(cityInfo) { var deferred = $q.defer(); - if (cityData.currentPosition === false) { + if (cityInfo.currentPosition === false) { deferred.resolve(); return deferred.promise; } @@ -780,12 +832,12 @@ angular.module('controller.forecastctrl', []) if (ionic.Platform.isIOS()) { if (Util.isLocationEnabled()) { - _getCurrentPosition(deferred, true, true); + _getCurrentPosition(deferred, cityInfo, true, true); } else if (Util.locationStatus === cordova.plugins.diagnostic.permissionStatus.NOT_REQUESTED) { // location service가 off 상태로 시작한 경우에는 denied로 설정되어 있음. on 상태인 경우에 not_requested로 들어옴 - _getCurrentPosition(deferred, true, undefined); + _getCurrentPosition(deferred, cityInfo, true, undefined); } else { - _getCurrentPosition(deferred, false, undefined); + _getCurrentPosition(deferred, cityInfo, false, undefined); } } else if (ionic.Platform.isAndroid()) { @@ -794,29 +846,29 @@ angular.module('controller.forecastctrl', []) console.log('status='+status); $scope.setLocationAuthorizationStatus(status); if (status === cordova.plugins.diagnostic.permissionStatus.GRANTED) { - _getCurrentPosition(deferred, true, true); + _getCurrentPosition(deferred, cityInfo, true, true); } else if (status === cordova.plugins.diagnostic.permissionStatus.DENIED_ALWAYS) { - _getCurrentPosition(deferred, true, false); + _getCurrentPosition(deferred, cityInfo, true, false); } else if (status === cordova.plugins.diagnostic.permissionStatus.NOT_REQUESTED || status === cordova.plugins.diagnostic.permissionStatus.DENIED) { - _getCurrentPosition(deferred, true, undefined); + _getCurrentPosition(deferred, cityInfo, true, undefined); } }, function (error) { console.error("Error getting for location authorization status: " + error); }); } else { - _getCurrentPosition(deferred, false, undefined); + _getCurrentPosition(deferred, cityInfo, false, undefined); } } } else { - _getCurrentPosition(deferred, true, true); + _getCurrentPosition(deferred, cityInfo, true, true); } return deferred.promise; } - function _getCurrentPosition(deferred, isLocationEnabled, isLocationAuthorized) { + function _getCurrentPosition(deferred, cityInfo, isLocationEnabled, isLocationAuthorized) { var msg; Util.ga.trackEvent('position', 'status', 'enabled', isLocationEnabled?1:0); Util.ga.trackEvent('position', 'status', 'authorized', isLocationAuthorized?1:0); @@ -826,23 +878,16 @@ angular.module('controller.forecastctrl', []) Util.ga.trackEvent('position', 'done', data.provider); var coords = data.coords; WeatherUtil.getGeoInfoFromGeolocation(coords.latitude, coords.longitude).then(function (geoInfo) { - cityData.name = geoInfo.name; - cityData.country = geoInfo.country; - cityData.address = geoInfo.address; - //device location을 사용하기 위해서는 아래 코드 사용하면 됨. - //cityData.location = WeatherUtil.geolocationNormalize({"lat": coords.latitude, "long": coords.longitude}); - cityData.location = geoInfo.location; - if (geoInfo.country === "KR") { - cityData.source = "KMA"; - } else { - cityData.source = "DSF"; // default source로 설정해야 함 - } - WeatherInfo.updateCity(WeatherInfo.getCityIndex(), cityData); - deferred.resolve(); + deferred.resolve(geoInfo); }, function () { deferred.reject(strFailToGetAddressInfo); }); - }, function () { + }, function (errMsg) { + if (errMsg === 'alreadyCalled') { + Util.ga.trackEvent('position', 'warning', 'already called'); + return deferred.reject(); + } + Util.ga.trackEvent('position', 'error', 'all'); msg = strFailToGetCurrentPosition; if (ionic.Platform.isAndroid()) { @@ -893,7 +938,7 @@ angular.module('controller.forecastctrl', []) } } else if (isLocationEnabled === false) { - if (cityData.address === null && cityData.location === null) { // 현재 위치 정보가 없는 경우 에러 팝업 표시 + if (cityInfo.address === null && cityInfo.location === null) { // 현재 위치 정보가 없는 경우 에러 팝업 표시 if (window.cordova && cordova.plugins.locationAccuracy) { cordova.plugins.locationAccuracy.request( function (success) { @@ -921,14 +966,14 @@ angular.module('controller.forecastctrl', []) } } - function updateWeatherData() { + function updateWeatherData(geoInfo) { var deferred = $q.defer(); var startTime = new Date().getTime(); - WeatherUtil.getWorldWeatherInfo(cityData).then(function (weatherData) { + WeatherUtil.getWorldWeatherInfo(geoInfo).then(function (weatherData) { var endTime = new Date().getTime(); Util.ga.trackTiming('weather', endTime - startTime, 'get', 'info'); - Util.ga.trackEvent('weather', 'get', WeatherUtil.getShortenAddress(cityData.address) + + Util.ga.trackEvent('weather', 'get', geoInfo.address + '(' + WeatherInfo.getCityIndex() + ')', endTime - startTime); var city = WeatherUtil.convertWeatherData(weatherData); @@ -937,16 +982,15 @@ angular.module('controller.forecastctrl', []) return; } WeatherInfo.updateCity(WeatherInfo.getCityIndex(), city); - applyWeatherData(); deferred.resolve(); }, function (error) { var endTime = new Date().getTime(); Util.ga.trackTiming('weather', endTime - startTime, 'error', 'info'); if (error instanceof Error) { - Util.ga.trackEvent('weather', 'error', WeatherUtil.getShortenAddress(cityData.address) + + Util.ga.trackEvent('weather', 'error', geoInfo.address + '(' + WeatherInfo.getCityIndex() + ', message:' + error.message + ', code:' + error.code + ')', endTime - startTime); } else { - Util.ga.trackEvent('weather', 'error', WeatherUtil.getShortenAddress(cityData.address) + + Util.ga.trackEvent('weather', 'error', geoInfo.address + '(' + WeatherInfo.getCityIndex() + ', ' + error + ')', endTime - startTime); } @@ -1025,7 +1069,7 @@ angular.module('controller.forecastctrl', []) } WeatherInfo.setNextCityIndex(); - applyWeatherData(); + //applyWeatherData(); loadWeatherData(); }; @@ -1035,7 +1079,7 @@ angular.module('controller.forecastctrl', []) } WeatherInfo.setPrevCityIndex(); - applyWeatherData(); + //applyWeatherData(); loadWeatherData(); }; @@ -1239,6 +1283,7 @@ angular.module('controller.forecastctrl', []) return; } } else if (sender === 'locationOn') { + var cityData = WeatherInfo.getCityOfIndex(WeatherInfo.getCityIndex()); if (cityData && cityData.currentPosition === false) { Util.ga.trackEvent('reload', 'skip', 'currentPosition', 0); return; @@ -1247,11 +1292,6 @@ angular.module('controller.forecastctrl', []) setRefreshTimer(); return; } - else { - if (cityData == null) { - applyWeatherData(); - } - } console.log('called by update weather event'); WeatherInfo.reloadCity(WeatherInfo.getCityIndex()); diff --git a/ios/www/js/controller.purchase.alexdisler.js b/ios/www/js/controller.purchase.alexdisler.js index 326850535..3ee8bc848 100644 --- a/ios/www/js/controller.purchase.alexdisler.js +++ b/ios/www/js/controller.purchase.alexdisler.js @@ -4,7 +4,7 @@ */ angular.module('controller.purchase', []) - .factory('Purchase', function($rootScope, $http, $q, TwAds, Util) { + .factory('Purchase', function($http, $q, TwAds, TwStorage, Util) { var obj = {}; obj.ACCOUNT_LEVEL_FREE = 'free'; obj.ACCOUNT_LEVEL_PREMIUM = 'premium'; @@ -67,17 +67,17 @@ angular.module('controller.purchase', []) }; obj.saveStoreReceipt = function (storeReceipt) { - localStorage.setItem("storeReceipt", JSON.stringify(storeReceipt)); + TwStorage.set("storeReceipt", storeReceipt); }; obj.loadStoreReceipt = function () { - return JSON.parse(localStorage.getItem("storeReceipt")); + return TwStorage.get("storeReceipt"); }; obj.loadPurchaseInfo = function () { var self = this; console.log('load purchase info'); - var purchaseInfo = JSON.parse(localStorage.getItem("purchaseInfo")); + var purchaseInfo = TwStorage.get("purchaseInfo"); if (purchaseInfo != undefined) { console.log('load purchaseInfo='+JSON.stringify(purchaseInfo)); @@ -98,7 +98,7 @@ angular.module('controller.purchase', []) obj.savePurchaseInfo = function (accountLevel, expirationDate) { var self = this; var purchaseInfo = {accountLevel: accountLevel, expirationDate: expirationDate}; - localStorage.setItem("purchaseInfo", JSON.stringify(purchaseInfo)); + TwStorage.set("purchaseInfo", purchaseInfo); if (purchaseInfo.accountLevel === self.ACCOUNT_LEVEL_PREMIUM) { TwAds.saveTwAdsInfo(false); @@ -160,34 +160,15 @@ angular.module('controller.purchase', []) }) }; - return obj; - }) - .run(function($ionicPopup, $q, Purchase, $rootScope, $location, $translate, Util) { - - if (Purchase.accountLevel == Purchase.ACCOUNT_LEVEL_PAID) { - return; - } - - if (ionic.Platform.isIOS()) { - Purchase.paidAppUrl = twClientConfig.iOSPaidAppUrl; - } - else if (ionic.Platform.isAndroid()) { - Purchase.paidAppUrl = twClientConfig.androidPaidAppUrl; - } - - if (!window.inAppPurchase) { - Util.ga.trackEvent('purchase', 'error', 'uninstalled'); - return; - } - /** * check validation receipt by saved data in local storage */ - function checkPurchase() { + obj.checkPurchase = function () { + var self = this; var storeReceipt; var updatePurchaseInfo; - storeReceipt = Purchase.loadStoreReceipt(); + storeReceipt = self.loadStoreReceipt(); if (storeReceipt) { console.log('Purchases INFO!!!'); @@ -195,7 +176,7 @@ angular.module('controller.purchase', []) updatePurchaseInfo = function () { var deferred = $q.defer(); - Purchase.checkReceiptValidation(storeReceipt, function (err, receiptInfo) { + self.checkReceiptValidation(storeReceipt, function (err, receiptInfo) { if (err) { deferred.reject(new Error("Fail to connect validation server. Please restore after 1~2 minutes")); return; @@ -207,17 +188,17 @@ angular.module('controller.purchase', []) }; } else { - updatePurchaseInfo = Purchase.updatePurchaseInfo; + updatePurchaseInfo = self.updatePurchaseInfo; } updatePurchaseInfo() .then(function (receiptInfo) { - Purchase.loaded = true; + self.loaded = true; if (!receiptInfo.ok) { //downgrade by canceled, refund .. console.log(JSON.stringify(receiptInfo.data)); - Purchase.setAccountLevel(Purchase.ACCOUNT_LEVEL_FREE); - Purchase.savePurchaseInfo(Purchase.accountLevel, Purchase.expirationDate); + self.setAccountLevel(self.ACCOUNT_LEVEL_FREE); + self.savePurchaseInfo(self.accountLevel, self.expirationDate); Util.ga.trackEvent('purchase', 'invalid', 'subscribe', 2); @@ -236,51 +217,72 @@ angular.module('controller.purchase', []) Util.ga.trackEvent('plugin', 'error', 'updatePurchaseInfo'); Util.ga.trackException(err, false); }); - } + }; - Purchase.loadPurchaseInfo(); + obj.init = function() { + var self = this; - //check purchase state is canceled or refund - if (Purchase.loaded) { - console.log('already check purchase info'); - return; - } + if (self.accountLevel == self.ACCOUNT_LEVEL_PAID) { + return; + } + + if (ionic.Platform.isIOS()) { + self.paidAppUrl = twClientConfig.iOSPaidAppUrl; + } + else if (ionic.Platform.isAndroid()) { + self.paidAppUrl = twClientConfig.androidPaidAppUrl; + } - Purchase.productId = 'tw1year'; - console.log('productId='+Purchase.productId); + if (!window.inAppPurchase) { + Util.ga.trackEvent('purchase', 'error', 'uninstalled'); + return; + } - Purchase.hasInAppPurchase = true; + self.loadPurchaseInfo(); - inAppPurchase - .getProducts([Purchase.productId]) - .then(function (products) { - console.log(JSON.stringify(products)); - Purchase.products = products; - if (Purchase.loaded === false) { - //It seems fail to check purchase info - //retry check purchase info - checkPurchase(); - } - }) - .catch(function (err) { - console.log('Fail to get products of id='+Purchase.productId); - console.log(JSON.stringify(err)); - Util.ga.trackException(err, false); - }); - - //if saved accountLevel skip checkPurchase but, have to get products - if (Purchase.accountLevel === Purchase.ACCOUNT_LEVEL_FREE) { - console.log('account Level is '+Purchase.accountLevel); - Purchase.loaded = true; - return; - } + //check purchase state is canceled or refund + if (self.loaded) { + console.log('already check purchase info'); + return; + } + + self.productId = 'tw1year'; + console.log('productId='+Purchase.productId); + + self.hasInAppPurchase = true; + + inAppPurchase + .getProducts([self.productId]) + .then(function (products) { + console.log(JSON.stringify(products)); + self.products = products; + if (self.loaded === false) { + //It seems fail to check purchase info + //retry check purchase info + checkPurchase(); + } + }) + .catch(function (err) { + console.log('Fail to get products of id='+self.productId); + console.log(JSON.stringify(err)); + Util.ga.trackException(err, false); + }); - //some times fail to get restorePurchases because inAppPurchase is not ready - checkPurchase(); + //if saved accountLevel skip checkPurchase but, have to get products + if (self.accountLevel === self.ACCOUNT_LEVEL_FREE) { + console.log('account Level is '+self.accountLevel); + self.loaded = true; + return; + } + + //some times fail to get restorePurchases because inAppPurchase is not ready + self.checkPurchase(); + }; + + return obj; }) .controller('PurchaseCtrl', function($scope, $ionicLoading, $ionicHistory, $ionicPopup, Purchase, TwAds, $translate, Util) { - var spinner = '
'; var strPurchaseError = "Purchase error"; diff --git a/ios/www/js/controller.purchase.j3k0.js b/ios/www/js/controller.purchase.j3k0.js index 5fd5c5e73..4e0b9b46f 100644 --- a/ios/www/js/controller.purchase.j3k0.js +++ b/ios/www/js/controller.purchase.j3k0.js @@ -4,7 +4,7 @@ */ angular.module('controller.purchase', []) - .factory('Purchase', function($rootScope, $http, $q, TwAds, Util, $translate) { + .factory('Purchase', function($http, $q, TwAds, TwStorage, Util) { var obj = {}; obj.ACCOUNT_LEVEL_FREE = 'free'; obj.ACCOUNT_LEVEL_PREMIUM = 'premium'; @@ -57,42 +57,19 @@ angular.module('controller.purchase', []) }; obj.loadPurchaseInfo = function (callback) { - var purchaseInfo; var self = this; if (callback == undefined) { console.log('callback is undefined'); return; } - if (window.plugins == undefined || plugins.appPreferences == undefined) { - console.log('load purchase info'); - purchaseInfo = JSON.parse(localStorage.getItem("purchaseInfo")); - self._loadPurchaseInfo(purchaseInfo); - return callback(); - } - - var suitePrefs = plugins.appPreferences.suite(Util.suiteName); - - suitePrefs.fetch( - function (value) { - console.log("fetch preference Success: " + value); - try { - self._loadPurchaseInfo.call(self, JSON.parse(value)); - callback(null, value); - } - catch(e) { - callback(e); - } - }, - function (error) { - console.log("fetch preference Error: " + error); - callback(error); - }, - "purchaseInfo"); + console.log('load purchase info'); + var purchaseInfo = TwStorage.get("purchaseInfo"); + self._loadPurchaseInfo(purchaseInfo); + return callback(); }; obj.savePurchaseInfo = function (accountLevel, expirationDate, callback) { - callback = callback || function() {}; var purchaseInfo = {accountLevel: accountLevel, expirationDate: expirationDate}; @@ -103,20 +80,8 @@ angular.module('controller.purchase', []) TwAds.saveTwAdsInfo(true); } - if (window.plugins == undefined || plugins.appPreferences == undefined) { - localStorage.setItem("purchaseInfo", JSON.stringify(purchaseInfo)); - return callback(); - } - - var suitePrefs = plugins.appPreferences.suite(Util.suiteName); - - suitePrefs.store(function (value) { - console.log("save preference Success: " + value); - callback(); - }, function (error) { - console.log("save preference Error: " + error); - callback(error); - }, 'purchaseInfo', JSON.stringify(purchaseInfo)); + TwStorage.set("purchaseInfo", purchaseInfo); + return callback(); }; obj.restore = function () { @@ -195,11 +160,7 @@ angular.module('controller.purchase', []) return obj; }) - .run(function(Purchase) { - Purchase.init(); - }) - .controller('PurchaseCtrl', function($scope, $ionicHistory, $ionicLoading, Util, Purchase, TwAds, $translate) { - + .controller('PurchaseCtrl', function($scope, $ionicHistory, Util, Purchase, TwAds) { if (ionic.Platform.isIOS()) { Util.ga.trackEvent('plugin', 'error', 'PurchaseCtrlOnIOS'); return; diff --git a/ios/www/js/controller.purchase.js b/ios/www/js/controller.purchase.js index 326850535..3ee8bc848 100644 --- a/ios/www/js/controller.purchase.js +++ b/ios/www/js/controller.purchase.js @@ -4,7 +4,7 @@ */ angular.module('controller.purchase', []) - .factory('Purchase', function($rootScope, $http, $q, TwAds, Util) { + .factory('Purchase', function($http, $q, TwAds, TwStorage, Util) { var obj = {}; obj.ACCOUNT_LEVEL_FREE = 'free'; obj.ACCOUNT_LEVEL_PREMIUM = 'premium'; @@ -67,17 +67,17 @@ angular.module('controller.purchase', []) }; obj.saveStoreReceipt = function (storeReceipt) { - localStorage.setItem("storeReceipt", JSON.stringify(storeReceipt)); + TwStorage.set("storeReceipt", storeReceipt); }; obj.loadStoreReceipt = function () { - return JSON.parse(localStorage.getItem("storeReceipt")); + return TwStorage.get("storeReceipt"); }; obj.loadPurchaseInfo = function () { var self = this; console.log('load purchase info'); - var purchaseInfo = JSON.parse(localStorage.getItem("purchaseInfo")); + var purchaseInfo = TwStorage.get("purchaseInfo"); if (purchaseInfo != undefined) { console.log('load purchaseInfo='+JSON.stringify(purchaseInfo)); @@ -98,7 +98,7 @@ angular.module('controller.purchase', []) obj.savePurchaseInfo = function (accountLevel, expirationDate) { var self = this; var purchaseInfo = {accountLevel: accountLevel, expirationDate: expirationDate}; - localStorage.setItem("purchaseInfo", JSON.stringify(purchaseInfo)); + TwStorage.set("purchaseInfo", purchaseInfo); if (purchaseInfo.accountLevel === self.ACCOUNT_LEVEL_PREMIUM) { TwAds.saveTwAdsInfo(false); @@ -160,34 +160,15 @@ angular.module('controller.purchase', []) }) }; - return obj; - }) - .run(function($ionicPopup, $q, Purchase, $rootScope, $location, $translate, Util) { - - if (Purchase.accountLevel == Purchase.ACCOUNT_LEVEL_PAID) { - return; - } - - if (ionic.Platform.isIOS()) { - Purchase.paidAppUrl = twClientConfig.iOSPaidAppUrl; - } - else if (ionic.Platform.isAndroid()) { - Purchase.paidAppUrl = twClientConfig.androidPaidAppUrl; - } - - if (!window.inAppPurchase) { - Util.ga.trackEvent('purchase', 'error', 'uninstalled'); - return; - } - /** * check validation receipt by saved data in local storage */ - function checkPurchase() { + obj.checkPurchase = function () { + var self = this; var storeReceipt; var updatePurchaseInfo; - storeReceipt = Purchase.loadStoreReceipt(); + storeReceipt = self.loadStoreReceipt(); if (storeReceipt) { console.log('Purchases INFO!!!'); @@ -195,7 +176,7 @@ angular.module('controller.purchase', []) updatePurchaseInfo = function () { var deferred = $q.defer(); - Purchase.checkReceiptValidation(storeReceipt, function (err, receiptInfo) { + self.checkReceiptValidation(storeReceipt, function (err, receiptInfo) { if (err) { deferred.reject(new Error("Fail to connect validation server. Please restore after 1~2 minutes")); return; @@ -207,17 +188,17 @@ angular.module('controller.purchase', []) }; } else { - updatePurchaseInfo = Purchase.updatePurchaseInfo; + updatePurchaseInfo = self.updatePurchaseInfo; } updatePurchaseInfo() .then(function (receiptInfo) { - Purchase.loaded = true; + self.loaded = true; if (!receiptInfo.ok) { //downgrade by canceled, refund .. console.log(JSON.stringify(receiptInfo.data)); - Purchase.setAccountLevel(Purchase.ACCOUNT_LEVEL_FREE); - Purchase.savePurchaseInfo(Purchase.accountLevel, Purchase.expirationDate); + self.setAccountLevel(self.ACCOUNT_LEVEL_FREE); + self.savePurchaseInfo(self.accountLevel, self.expirationDate); Util.ga.trackEvent('purchase', 'invalid', 'subscribe', 2); @@ -236,51 +217,72 @@ angular.module('controller.purchase', []) Util.ga.trackEvent('plugin', 'error', 'updatePurchaseInfo'); Util.ga.trackException(err, false); }); - } + }; - Purchase.loadPurchaseInfo(); + obj.init = function() { + var self = this; - //check purchase state is canceled or refund - if (Purchase.loaded) { - console.log('already check purchase info'); - return; - } + if (self.accountLevel == self.ACCOUNT_LEVEL_PAID) { + return; + } + + if (ionic.Platform.isIOS()) { + self.paidAppUrl = twClientConfig.iOSPaidAppUrl; + } + else if (ionic.Platform.isAndroid()) { + self.paidAppUrl = twClientConfig.androidPaidAppUrl; + } - Purchase.productId = 'tw1year'; - console.log('productId='+Purchase.productId); + if (!window.inAppPurchase) { + Util.ga.trackEvent('purchase', 'error', 'uninstalled'); + return; + } - Purchase.hasInAppPurchase = true; + self.loadPurchaseInfo(); - inAppPurchase - .getProducts([Purchase.productId]) - .then(function (products) { - console.log(JSON.stringify(products)); - Purchase.products = products; - if (Purchase.loaded === false) { - //It seems fail to check purchase info - //retry check purchase info - checkPurchase(); - } - }) - .catch(function (err) { - console.log('Fail to get products of id='+Purchase.productId); - console.log(JSON.stringify(err)); - Util.ga.trackException(err, false); - }); - - //if saved accountLevel skip checkPurchase but, have to get products - if (Purchase.accountLevel === Purchase.ACCOUNT_LEVEL_FREE) { - console.log('account Level is '+Purchase.accountLevel); - Purchase.loaded = true; - return; - } + //check purchase state is canceled or refund + if (self.loaded) { + console.log('already check purchase info'); + return; + } + + self.productId = 'tw1year'; + console.log('productId='+Purchase.productId); + + self.hasInAppPurchase = true; + + inAppPurchase + .getProducts([self.productId]) + .then(function (products) { + console.log(JSON.stringify(products)); + self.products = products; + if (self.loaded === false) { + //It seems fail to check purchase info + //retry check purchase info + checkPurchase(); + } + }) + .catch(function (err) { + console.log('Fail to get products of id='+self.productId); + console.log(JSON.stringify(err)); + Util.ga.trackException(err, false); + }); - //some times fail to get restorePurchases because inAppPurchase is not ready - checkPurchase(); + //if saved accountLevel skip checkPurchase but, have to get products + if (self.accountLevel === self.ACCOUNT_LEVEL_FREE) { + console.log('account Level is '+self.accountLevel); + self.loaded = true; + return; + } + + //some times fail to get restorePurchases because inAppPurchase is not ready + self.checkPurchase(); + }; + + return obj; }) .controller('PurchaseCtrl', function($scope, $ionicLoading, $ionicHistory, $ionicPopup, Purchase, TwAds, $translate, Util) { - var spinner = '
'; var strPurchaseError = "Purchase error"; diff --git a/ios/www/js/controller.settingctrl.js b/ios/www/js/controller.settingctrl.js index 6be15aa17..5f06a581d 100644 --- a/ios/www/js/controller.settingctrl.js +++ b/ios/www/js/controller.settingctrl.js @@ -1,8 +1,9 @@ angular.module('controller.settingctrl', []) .controller('SettingCtrl', function($scope, $rootScope, Util, Purchase, $ionicHistory, $translate, - $ionicSideMenuDelegate, $ionicPopup, $location) { + $ionicSideMenuDelegate, $ionicPopup, $location, TwStorage) { var menuContent = null; + var settingsInfo = null; var strOkay = "OK"; var strCancel = "Cancel"; $translate(['LOC_OK', 'LOC_CANCEL']).then(function (translations) { @@ -17,14 +18,16 @@ angular.module('controller.settingctrl', []) menuContent = angular.element(document.getElementsByClassName('menu-content')[0]); } - $scope.startupPage = localStorage.getItem("startupPage"); - if ($scope.startupPage === null) { - $scope.startupPage = "0"; //시간별날씨 - } - $scope.refreshInterval = localStorage.getItem("refreshInterval"); - if ($scope.refreshInterval === null) { - $scope.refreshInterval = "0"; //수동 + settingsInfo = TwStorage.get("settingsInfo"); + if (settingsInfo === null) { + settingsInfo = { + startupPage: "0", //시간별날씨 + refreshInterval: "0" //수동 + }; + TwStorage.set("settingsInfo", settingsInfo); } + $scope.startupPage = settingsInfo.startupPage; + $scope.refreshInterval = settingsInfo.refreshInterval; } $scope.clickMenu = function (menu) { @@ -49,11 +52,13 @@ angular.module('controller.settingctrl', []) }; $scope.setStartupPage = function(startupPage) { - localStorage.setItem("startupPage", startupPage); + settingsInfo.startupPage = startupPage; + TwStorage.set("settingsInfo", settingsInfo); }; $scope.setRefreshInterval = function(refreshInterval) { - localStorage.setItem("refreshInterval", refreshInterval); + settingsInfo.refreshInterval = refreshInterval; + TwStorage.set("settingsInfo", settingsInfo); $rootScope.$broadcast('reloadEvent', 'setRefreshInterval'); }; diff --git a/ios/www/js/controller.start.js b/ios/www/js/controller.start.js index a9b94a36a..c37f11e01 100644 --- a/ios/www/js/controller.start.js +++ b/ios/www/js/controller.start.js @@ -5,7 +5,7 @@ var start = angular.module('controller.start', []); start.controller('StartCtrl', function($scope, $rootScope, $location, TwAds, Purchase, $ocLazyLoad, Util, $ionicLoading, - $q, WeatherUtil, WeatherInfo, $translate, $ionicPopup ) { + $q, WeatherUtil, WeatherInfo, $translate, $ionicPopup, TwStorage) { var strError = "Error"; var strAddLocation = "Add locations"; var strOkay = "OK"; @@ -41,7 +41,6 @@ start.controller('StartCtrl', function($scope, $rootScope, $location, TwAds, Pur console.log("Fail to translate : " + JSON.stringify(translationIds)); }); - var startVersion = null; var service; if (window.google == undefined) { @@ -129,7 +128,8 @@ start.controller('StartCtrl', function($scope, $rootScope, $location, TwAds, Pur }; function close() { - localStorage.setItem("startVersion", Util.startVersion.toString()); + + TwStorage.set("startVersion", Util.startVersion); _setShowAds(true); WeatherInfo.setCityIndex(WeatherInfo.getCityCount() - 1); $location.path('/tab/forecast'); @@ -195,7 +195,6 @@ start.controller('StartCtrl', function($scope, $rootScope, $location, TwAds, Pur function init() { _setShowAds(false); _makeFavoriteList(); - startVersion = localStorage.getItem("startVersion"); } $scope.OnSelectResult = function(result) { diff --git a/ios/www/js/controller.units.js b/ios/www/js/controller.units.js index e734d727f..72b6c7129 100644 --- a/ios/www/js/controller.units.js +++ b/ios/www/js/controller.units.js @@ -3,7 +3,7 @@ */ angular.module('controller.units', []) - .factory('Units', function(Util) { + .factory('Units', function(TwStorage, Util) { var obj = {}; obj.temperatureUnit; obj.windSpeedUnit; @@ -89,64 +89,24 @@ angular.module('controller.units', []) obj.loadUnits = function () { var self = this; - var units; - var key; - if (window.plugins == undefined || plugins.appPreferences == undefined) { - console.log('appPreferences is undefined, so load local st'); - units = JSON.parse(localStorage.getItem("units")); - if (units == undefined) { - self._initUnits(); - self.saveUnits(); - } - else { - for (key in units) { - self[key] = units[key]; - } - } - return; - } - - var suitePrefs = plugins.appPreferences.suite(Util.suiteName); - suitePrefs.fetch(function (value) { - console.log("fetch preference Success: " + value); - if (value == undefined || value == '') { - self._initUnits(); - self.saveUnits(); - return; - } - - units = JSON.parse(value); - if (units == undefined) { - self._initUnits(); - self.saveUnits(); - return; - } - for (key in units) { - self[key] = units[key]; - } - }, function (error) { - console.log("fetch preference Error: " + error); + var units = TwStorage.get("units"); + if (units == undefined) { self._initUnits(); self.saveUnits(); - }, 'units'); + return; + } + + for (var key in units) { + self[key] = units[key]; + } }; //saveUnits obj.saveUnits = function () { var self = this; - if (window.plugins == undefined || plugins.appPreferences == undefined) { - console.log('appPreferences is undefined, so save local st'); - localStorage.setItem("units", JSON.stringify(self)); - return; - } - var suitePrefs = plugins.appPreferences.suite(Util.suiteName); - suitePrefs.store(function (value) { - console.log("save preference Success: " + value); - }, function (error) { - console.log("save preference Error: " + error); - }, 'units', JSON.stringify(self)); + TwStorage.set("units", self); }; obj.setUnit = function (unit, value) { diff --git a/ios/www/js/service.push.js b/ios/www/js/service.push.js index 1b7488b4d..7aaf75d15 100644 --- a/ios/www/js/service.push.js +++ b/ios/www/js/service.push.js @@ -5,7 +5,7 @@ */ angular.module('service.push', []) - .factory('Push', function($http, Util, WeatherUtil, WeatherInfo, $location, Units) { + .factory('Push', function($http, TwStorage, Util, WeatherUtil, WeatherInfo, $location, Units) { var obj = {}; obj.config = { "android": { @@ -36,7 +36,7 @@ angular.module('service.push', []) obj.loadPushInfo = function () { var self = this; - var pushData = JSON.parse(localStorage.getItem("pushData")); + var pushData = TwStorage.get("pushData"); if (pushData != null) { self.pushData.registrationId = pushData.registrationId; self.pushData.type = pushData.type; @@ -61,7 +61,7 @@ angular.module('service.push', []) obj.savePushInfo = function () { var self = this; console.log('save push data'); - localStorage.setItem("pushData", JSON.stringify(self.pushData)); + TwStorage.set("pushData", self.pushData); }; /** @@ -357,10 +357,10 @@ angular.module('service.push', []) console.log('fail to find cityIndex='+cityIndex); }; - return obj; - }) - .run(function(Push, Util) { - Push.loadPushInfo(); + obj.init = function () { + var self = this; + + self.loadPushInfo(); if (!window.PushNotification) { console.log("push notification plugin is not set"); @@ -369,14 +369,14 @@ angular.module('service.push', []) } if (ionic.Platform.isIOS()) { - Push.pushData.type = 'ios'; + self.pushData.type = 'ios'; } else if (ionic.Platform.isAndroid()) { - Push.pushData.type = 'android'; + self.pushData.type = 'android'; } //if push is on, call register - if (Push.pushData.alarmList.length > 0) { + if (self.pushData.alarmList.length > 0) { PushNotification.hasPermission(function(data) { if (data.isEnabled) { console.log('isEnabled'); @@ -391,9 +391,12 @@ angular.module('service.push', []) console.log('Already set push notification'); return; } - Push.register(function (registrationId) { - console.log('start push registrationId='+registrationId); + self.register(function (registrationId) { + console.log('start push registrationId='+registrationId); }); } + }; + + return obj; }); diff --git a/ios/www/js/service.twads.js b/ios/www/js/service.twads.js index 7b6ab532b..54518386a 100644 --- a/ios/www/js/service.twads.js +++ b/ios/www/js/service.twads.js @@ -3,7 +3,7 @@ */ angular.module('service.twads', []) - .factory('TwAds', function($rootScope, Util) { + .factory('TwAds', function(TwStorage, Util) { var obj = {}; obj.enableAds = null; obj.showAds = null; @@ -15,7 +15,7 @@ angular.module('service.twads', []) obj.loadTwAdsInfo = function () { var self = this; - var twAdsInfo = JSON.parse(localStorage.getItem("twAdsInfo")); + var twAdsInfo = TwStorage.get("twAdsInfo"); console.log('load TwAdsInfo='+JSON.stringify(twAdsInfo)+ ' request enable='+self.requestEnable+' show='+self.requestShow); @@ -36,7 +36,7 @@ angular.module('service.twads', []) obj.saveTwAdsInfo = function (enable) { var twAdsInfo = {enable: enable}; - localStorage.setItem("twAdsInfo", JSON.stringify(twAdsInfo)); + TwStorage.set("twAdsInfo", twAdsInfo); }; obj._admobCreateBanner = function() { diff --git a/ios/www/js/service.util.js b/ios/www/js/service.util.js index 84a608e9b..feb573955 100644 --- a/ios/www/js/service.util.js +++ b/ios/www/js/service.util.js @@ -196,15 +196,6 @@ angular.module('service.util', []) obj.imgPath = 'img/weatherIcon2-color'; obj.version = ''; obj.startVersion = 1.0; - if (window.ionic && ionic.Platform.isAndroid()) { - /** - * 기존 버전 호환성이슈로 Android는 유지. - */ - obj.suiteName = "net.wizardfactory.todayweather_preferences"; - } - else { - obj.suiteName = "group.net.wizardfactory.todayweather"; - } obj.language; obj.region; obj.uuid = ''; @@ -241,49 +232,6 @@ angular.module('service.util', []) } }; - obj._saveServiceKeys = function () { - var self = this; - var suitePrefs = plugins.appPreferences.suite(self.suiteName); - suitePrefs.store( - function (value) { - console.log("save preference Success: " + value); - }, - function (error) { - self.ga.trackEvent('plugin', 'error', 'storeAppPreferences'); - console.error("save preference Error: " + error); - }, - 'daumServiceKeys', - JSON.stringify(twClientConfig.daumServiceKeys)); - }; - - obj.saveServiceKeys = function () { - var self = this; - if (window.plugins == undefined || plugins.appPreferences == undefined) { - console.log('appPreferences is undefined, so load local st'); - } - else { - var suitePrefs = plugins.appPreferences.suite(self.suiteName); - suitePrefs.fetch( - function (value) { - if (value == undefined || value == '') { - self._saveServiceKeys(); - } - else { - if (JSON.parse(value).length != twClientConfig.daumServiceKeys.length) { - self._saveServiceKeys(); - } - else { - console.log("fetch preference Success: " + value); - } - } - }, - function (error) { - self.ga.trackEvent('plugin', 'error', 'fetchAppPreferences'); - }, - 'daumServiceKeys'); - } - }; - obj.placesUrl = 'js!https://maps.googleapis.com/maps/api/js?libraries=places'; if (twClientConfig.googleapikey) { obj.placesUrl += '&key='+twClientConfig.googleapikey; diff --git a/ios/www/js/service.weatherinfo.js b/ios/www/js/service.weatherinfo.js index 6c0e590ea..af1b43dd2 100644 --- a/ios/www/js/service.weatherinfo.js +++ b/ios/www/js/service.weatherinfo.js @@ -1,5 +1,5 @@ angular.module('service.weatherinfo', []) - .factory('WeatherInfo', function ($rootScope, WeatherUtil, Util) { + .factory('WeatherInfo', function (WeatherUtil, TwStorage, Util) { var cities = []; var cityIndex = -1; var obj = { @@ -85,7 +85,7 @@ angular.module('service.weatherinfo', []) if (index >= -1 && index < cities.length) { cityIndex = index; // save current cityIndex - localStorage.setItem("cityIndex", JSON.stringify(cityIndex)); + TwStorage.set("cityIndex", cityIndex); console.log("cityIndex = " + cityIndex); } }; @@ -234,7 +234,7 @@ angular.module('service.weatherinfo', []) obj.loadCities = function() { var that = this; - var items = JSON.parse(localStorage.getItem("cities")); + var items = TwStorage.get("cities"); if (items === null) { createCity(); @@ -253,7 +253,7 @@ angular.module('service.weatherinfo', []) } // load last cityIndex - cityIndex = JSON.parse(localStorage.getItem("cityIndex")); + cityIndex = TwStorage.get("cityIndex"); if (cityIndex === null) { that.setFirstCityIndex(); } @@ -280,44 +280,20 @@ angular.module('service.weatherinfo', []) }); console.log('save preference plist='+JSON.stringify(pList)); - - if (window.plugins == undefined || plugins.appPreferences == undefined) { - console.log('appPreferences is undefined'); - Util.ga.trackEvent('plugin', 'error', 'loadAppPreferences'); - return; - } - - var suitePrefs = plugins.appPreferences.suite(Util.suiteName); - suitePrefs.store(function (value) { - console.log("save preference Success: " + value); - }, function (error) { - console.log("save preference Error: " + error); - Util.ga.trackEvent('plugin', 'error', 'saveAppPreferences'); - Util.ga.trackException(error, false); - }, 'cityList', JSON.stringify(pList)); + TwStorage.set("cityList", pList); }; obj._loadCitiesPreference = function (callback) { - if (window.plugins == undefined || plugins.appPreferences == undefined) { - console.log('appPreferences is undefined'); - Util.ga.trackEvent('plugin', 'error', 'loadAppPreferences'); - return; + var cityList = TwStorage.get("cityList"); + if (cityList == undefined) { + callback(new Error("Can not find cityList")); + } else { + callback(undefined, cityList); } - - var suitePrefs = plugins.appPreferences.suite(Util.suiteName); - suitePrefs.fetch(function (value) { - console.log("fetch preference Success: " + value); - callback(undefined, value); - }, function (error) { - console.log("fetch preference Error: " + error); - Util.ga.trackEvent('plugin', 'error', 'fetchAppPreferences'); - Util.ga.trackException(error, false); - callback(error); - }, 'cityList'); }; obj.saveCities = function() { - localStorage.setItem("cities", JSON.stringify(cities)); + TwStorage.set("cities", cities); this._saveCitiesPreference(cities); }; diff --git a/ios/www/js/service.weatherutil.js b/ios/www/js/service.weatherutil.js index 89137e424..55a1b95fb 100644 --- a/ios/www/js/service.weatherutil.js +++ b/ios/www/js/service.weatherutil.js @@ -814,7 +814,7 @@ angular.module('service.weatherutil', []) } console.log(url); - $http({method: 'GET', url: url, timeout: 3000}) + $http({method: 'GET', url: url, timeout: 3000, cache: true}) .success(function (data) { if (data.status === 'OK') { try { @@ -944,7 +944,7 @@ angular.module('service.weatherutil', []) '&output=json'; console.log(url); - $http({method: 'GET', url: url, timeout: 3000}) + $http({method: 'GET', url: url, timeout: 3000, cache:true}) .success(function (data, status, headers, config, statusText) { console.log("s="+status+" h="+headers+" c="+config+" sT="+statusText); if (data.fullName && data.name0 === '대한민국') { @@ -1049,7 +1049,7 @@ angular.module('service.weatherutil', []) } console.log(url); - $http({method: 'GET', url: url, timeout: 3000}) + $http({method: 'GET', url: url, timeout: 3000, cache:true}) .success(function (data) { var err; if (data.status === "OK") { @@ -1291,105 +1291,58 @@ angular.module('service.weatherutil', []) return deferred.promise; }; - function _navigatorRetryGetCurrentPosition(retryCount, callback) { - var maximumAge; - var timeout; - var enableHighAccuracy; - if (retryCount == 3) { - maximumAge = 3000; - timeout = 5000; - enableHighAccuracy = false; - } - else if (retryCount == 2) { - maximumAge = 30000; - timeout = 5000; - enableHighAccuracy = true; - } - else if (retryCount == 1) { - maximumAge = 300000; - timeout = 5000; - enableHighAccuracy = false; - } - - navigator.geolocation.getCurrentPosition(function (position) { - //경기도,광주시,오포읍,37.36340556,127.2307667 - //deferred.resolve({latitude: 37.363, longitude: 127.230}); - //세종특별자치시,도담동 - //position = {coords: {latitude: 36.517338, longitude: 127.259247}}; - //경상남도/거제시옥포2동 "lng":128.6875, "lat":34.8966 - //deferred.resolve({latitude: 34.8966, longitude: 128.6875}); - //서울특별시 - //deferred.resolve({latitude: 37.5635694, longitude: 126.9800083}); - //경기 수원시 영통구 광교1동 - //deferred.resolve({latitude: 37.298876, longitude: 127.047527}); - - // Tokyo 35.6894875,139.6917064 - // position = {coords: {latitude: 35.6894875, longitude: 139.6917064}}; - // Shanghai 31.227797,121.475194 - //position = {coords: {latitude: 31.227797, longitude: 121.475194}}; - // NY 40.663527,-73.960852 - //position = {coords: {latitude: 40.663527, longitude: -73.960852}}; - // Berlin 52.516407,13.403322 - //position = {coords: {latitude: 52.516407, longitude: 13.403322}}; - // Hochinminh 10.779001,106.662796 - //position = {coords: {latitude: 10.779001, longitude: 106.662796}}; - //경상북도/영천시/대전동 - //position = {coords: {latitude: 35.9859147103, longitude: 128.9122925322}}; - //경기도,성남시분당구,,62,123,127.12101944444444,37.37996944444445 - //position = {coords: {latitude: 37.37996944444445, longitude: 127.12101944444444}}; - //인천광역시,연수구,,55,123,126.68044166666667,37.40712222222222 - //position = {coords: {latitude: 37.40712222222222, longitude: 126.68044166666667}}; - - console.log('navigator geolocation'); - console.log(position); - - callback(undefined, position, retryCount); - }, function (error) { - console.log("Fail to get current position from navigator"); - console.log("retry:"+retryCount+" code:"+error.code+" message:"+error.message); - - retryCount--; - if (retryCount <= 0) { - return callback(error, undefined, retryCount); - } - else { - //간격을 주지 않으면 계속 실패해버림. - setTimeout(function () { - _navigatorRetryGetCurrentPosition(retryCount, callback); - }, 500); - } - }, { maximumAge: maximumAge, timeout: timeout, enableHighAccuracy: enableHighAccuracy }); - } - + var watchID; obj.getCurrentPosition = function () { var deferred = $q.defer(); var startTime = new Date().getTime(); var endTime; - var watchID = navigator.geolocation.watchPosition(function (position) { + console.log('watchID : '+watchID); + if (watchID) { + deferred.reject("alreadyCalled"); + return deferred.promise; + } + + //경기도,광주시,오포읍 + //position = {coords: {latitude: 37.36340556, longitude: 127.2307667}}; + //세종특별자치시,,도담동 + //position = {coords: {latitude: 36.517338, longitude: 127.259247}}; + //경기도 부천시 소사본동 + //position = {coords: {latitude: 37.472595, longitude: 126.795249}}; + //경상남도/거제시옥포2동 "lng":128.6875, "lat":34.8966 + //deferred.resolve({latitude: 34.8966, longitude: 128.6875}); + //서울특별시 + //deferred.resolve({latitude: 37.5635694, longitude: 126.9800083}); + //경기 수원시 영통구 광교1동 + //deferred.resolve({latitude: 37.298876, longitude: 127.047527}); + // Tokyo 35.6894875,139.6917064 + // position = {coords: {latitude: 35.6894875, longitude: 139.6917064}}; + // Shanghai 31.227797,121.475194 + //position = {coords: {latitude: 31.227797, longitude: 121.475194}}; + // NY 40.663527,-73.960852 + //position = {coords: {latitude: 40.663527, longitude: -73.960852}}; + // Berlin 52.516407,13.403322 + //position = {coords: {latitude: 52.516407, longitude: 13.403322}}; + // Hochinminh 10.779001,106.662796 + //position = {coords: {latitude: 10.779001, longitude: 106.662796}}; + //경상북도/영천시/대전동 + //position = {coords: {latitude: 35.9859147103, longitude: 128.9122925322}}; + //경기도,성남시분당구,,62,123,127.12101944444444,37.37996944444445 + //position = {coords: {latitude: 37.37996944444445, longitude: 127.12101944444444}}; + //인천광역시,연수구,,55,123,126.68044166666667,37.40712222222222 + //position = {coords: {latitude: 37.40712222222222, longitude: 126.68044166666667}}; + + watchID = navigator.geolocation.watchPosition(function (position) { endTime = new Date().getTime(); Util.ga.trackTiming('position', endTime - startTime, 'get', 'watch'); Util.ga.trackEvent('position', 'get', 'watch', endTime - startTime); navigator.geolocation.clearWatch(watchID); + watchID = null; deferred.resolve({coords: position.coords, provider: 'watchPosition'}); }, function (error) { Util.ga.trackEvent('position', 'warn', 'watch(message: ' + error.message + ', code:' + error.code + ')', endTime - startTime); return deferred.reject(); - }, { timeout: 30000 }); - - _navigatorRetryGetCurrentPosition(3, function (error, position, retryCount) { - //navigator.geolocation.clearWatch(watchID); - endTime = new Date().getTime(); - if (error) { - Util.ga.trackTiming('position', endTime - startTime, 'error', 'default'); - Util.ga.trackEvent('position', 'warn', 'default(retry:' + retryCount + ', message: ' + error.message + ', code:' + error.code + ')', endTime - startTime); - return deferred.reject(); - } - - Util.ga.trackTiming('position', endTime - startTime, 'get', 'default'); - Util.ga.trackEvent('position', 'get', 'default(retry:' + retryCount + ')', endTime - startTime); - deferred.resolve({coords: position.coords, provider: 'getCurrentPosition'}); - }); + }, { timeout: 60000, maximumAge: 60000, enableHighAccuracy: true}); return deferred.promise; }; diff --git a/ios/www/lib/angular-translate/.bower.json b/ios/www/lib/angular-translate/.bower.json index 92548f6c5..5033a36f3 100644 --- a/ios/www/lib/angular-translate/.bower.json +++ b/ios/www/lib/angular-translate/.bower.json @@ -17,6 +17,6 @@ "commit": "4e6c7fdcef6362e95a9faa615e72822a4290a03e" }, "_source": "https://github.com/PascalPrecht/bower-angular-translate.git", - "_target": "~2.16.0", + "_target": "^2.13.0", "_originalSource": "angular-translate" } \ No newline at end of file diff --git a/ios/www/lib/sprintf/dist/.gitattributes b/ios/www/lib/sprintf/dist/.gitattributes index a837fd384..d35bca01c 100644 --- a/ios/www/lib/sprintf/dist/.gitattributes +++ b/ios/www/lib/sprintf/dist/.gitattributes @@ -1,4 +1,4 @@ -#ignore all generated files from diff -#also skip line ending check -*.js -diff -text -*.map -diff -text +#ignore all generated files from diff +#also skip line ending check +*.js -diff -text +*.map -diff -text diff --git a/ios/www/templates/guide.html b/ios/www/templates/guide.html index a66939ecf..4971c201d 100644 --- a/ios/www/templates/guide.html +++ b/ios/www/templates/guide.html @@ -3,7 +3,7 @@ Each tab's child directive will have its own navigation history that also transitions its views in and out. --> - + diff --git a/ios/www/tw.client.config.js b/ios/www/tw.client.config.js index e57f480f7..d35c1c39f 100644 --- a/ios/www/tw.client.config.js +++ b/ios/www/tw.client.config.js @@ -6,21 +6,20 @@ window.twClientConfig = { admobIOSInterstitialAdUnit : 'ca-app-pub-3300619349648096/3066392962', admobAndroidBannerAdUnit : 'ca-app-pub-3300619349648096/9569086167', admobAndroidInterstitialAdUnit : 'ca-app-pub-3300619349648096/2045819361', - googleSenderId : '362303467798', - gaIOSKey : 'UA-70746703-3', - gaAndroidKey : 'UA-70746703-2', - daumServiceKeys : ['d5d85c5bf0204ae7dbc36ea9a29a9759','6d0116e2c49361cb75eaf12f665e6360', '61a15abc7d78498ae9a4b7dc328a4a0b', - 'a23e48a514055f7c29bf65268118718b', 'a6a019155359447836d9a8288f268b7f', 'e5b4639cad24254807eb26ab6cc473b9', - '6ae2a9ffc50d0c71eb4165f82ab8d1cc', '99fe0e2c1cead707b89e3525c84e7d3d', '37f7830a7c6ef2eaf7151a12555f9f70', - '18c788cd2f09f9217520b7a1547a07cd', '65e0aacada12c166c6ee9ee76844164e', '86e652d0b17f7675933915147b8d0190'], - iOSStoreUrl : 'https://itunes.apple.com/app/todayweather/id1041700694', - androidStoreUrl : 'market://details?id=net.wizardfactory.todayweather', - iOSPaidAppUrl : '', - androidPaidAppUrl : '', - etcUrl : 'https://todayweather.wizardfactory.net', - serverUrl : 'http://tw-test.wizardfactory.net', + googleSenderId : '', + gaIOSKey : '', + gaAndroidKey : '', + daumServiceKeys : ['0','1'], + airBridgeToken : '', + airBridgeAppId : '', + iOSStoreUrl : 'https://itunes.apple.com/', + androidStoreUrl : 'market://', + iOSPaidAppUrl : 'https://itunes.apple.com/', + androidPaidAppUrl : 'market://', + etcUrl : 'https://', + serverUrl : 'https://tw-test.wizardfactory.net', mailTo : 'todayweather@wizardfactory.net', isPaidApp : false, debug : true, - googleapikey : 'AIzaSyDfQ4BC-bqyJrAXAulOVCp9u4FpFDu8SN0' + googleapikey : 'GOOGLE_API_KEY' };